diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index c01cbfe0954f..bd456631d245 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -16,19 +16,19 @@ /.github @TimWolla /build/gen_stub.php @kocsismate -/ext/bcmath @ndossche @SakiTakamachi +/ext/bcmath @SakiTakamachi /ext/curl @adoy /ext/date @derickr /ext/dba @Girgias -/ext/dom @ndossche +/ext/dom @devnexen /ext/ffi @dstogov /ext/gd @devnexen /ext/gettext @devnexen /ext/gmp @Girgias -/ext/intl @devnexen +/ext/intl @devnexen @LamentXU123 +/ext/libxml @devnexen /ext/json @bukka -/ext/lexbor @kocsismate @ndossche -/ext/libxml @ndossche +/ext/lexbor @kocsismate /ext/mbstring @alexdowad @youkidearitai /ext/mysqli @bukka @kamil-tekiela /ext/mysqlnd @bukka @kamil-tekiela @SakiTakamachi @@ -47,17 +47,16 @@ /ext/random @TimWolla @zeriyoshi /ext/reflection @DanielEScherzer /ext/session @Girgias -/ext/simplexml @ndossche -/ext/soap @ndossche +/ext/simplexml @devnexen +/ext/soap @devnexen /ext/sockets @devnexen /ext/spl @Girgias /ext/standard @bukka -/ext/tidy @ndossche /ext/uri @kocsismate @TimWolla -/ext/xml @ndossche -/ext/xmlreader @ndossche -/ext/xmlwriter @ndossche -/ext/xsl @ndossche +/ext/xml @devnexen +/ext/xmlreader @devnexen +/ext/xmlwriter @devnexen +/ext/xsl @devnexen /main @bukka /sapi/fpm @bukka /Zend/Optimizer @dstogov diff --git a/.github/ISSUE_TEMPLATE/bug_report.yml b/.github/ISSUE_TEMPLATE/bug_report.yml index 4f5bef65ed1f..296835e02e0d 100644 --- a/.github/ISSUE_TEMPLATE/bug_report.yml +++ b/.github/ISSUE_TEMPLATE/bug_report.yml @@ -31,10 +31,10 @@ body: Please make sure that the used PHP version [is a supported version](https://www.php.net/supported-versions.php). placeholder: | PHP 8.5.2 (cli) (built: Jan 21 2026 17:35:28) (NTS) - Copyright (c) The PHP Group + Copyright © The PHP Group and Contributors Built by Ubuntu - Zend Engine v4.5.2, Copyright (c) Zend Technologies - with Zend OPcache v8.5.2, Copyright (c), by Zend Technologies + Zend Engine v4.5.2, Copyright © Zend by Perforce + with Zend OPcache v8.5.2, Copyright ©, Zend by Perforce render: plain validations: required: true diff --git a/.github/actions/freebsd/action.yml b/.github/actions/freebsd/action.yml index 3b6d0c4e8617..197362d9f52b 100644 --- a/.github/actions/freebsd/action.yml +++ b/.github/actions/freebsd/action.yml @@ -46,7 +46,7 @@ runs: pkgconf \ webp \ libavif \ - `#sqlite3` \ + sqlite3 \ curl \ $OPCACHE_TLS_TESTS_DEPS @@ -57,9 +57,7 @@ runs: --enable-debug \ --enable-option-checking=fatal \ --enable-fpm \ - `#--with-pdo-sqlite` \ - --without-sqlite3 \ - --without-pdo-sqlite \ + --with-pdo-sqlite \ --without-pear \ --with-bz2 \ --with-avif \ diff --git a/.github/actions/setup-windows/action.yml b/.github/actions/setup-windows/action.yml index e0a3fd4e7d31..a5fa4cdddcb1 100644 --- a/.github/actions/setup-windows/action.yml +++ b/.github/actions/setup-windows/action.yml @@ -16,5 +16,6 @@ runs: - name: Setup PostgreSQL shell: pwsh run: | - Set-Service -Name "postgresql-x64-14" -StartupType manual -Status Running + $postgresService = if ($env:PHP_BUILD_CRT -eq "vs18") { "postgresql-x64-17" } else { "postgresql-x64-14" } + Set-Service -Name $postgresService -StartupType manual -Status Running pwsh -Command { $env:PGPASSWORD="root"; & "$env:PGBIN\psql" -U postgres -c "ALTER USER postgres WITH PASSWORD 'Password12!';" } diff --git a/.github/labeler.yml b/.github/labeler.yml index b9f0f36e147d..e9731352c8cc 100644 --- a/.github/labeler.yml +++ b/.github/labeler.yml @@ -20,6 +20,18 @@ - scripts/**/* - win32/build/**/* +"Category: CI": + - changed-files: + - any-glob-to-any-file: + - .circleci/* + - .github/actions/**/* + - .github/scripts/**/* + - .github/workflows/* + - .github/CODEOWNERS + - .github/labeler.yml + - .github/setup_hmailserver.php + - .github/matrix.php + "Extension: bcmath": - changed-files: - any-glob-to-any-file: diff --git a/.github/matrix.php b/.github/matrix.php index 2ce59cb657b5..7970442d7050 100644 --- a/.github/matrix.php +++ b/.github/matrix.php @@ -61,7 +61,6 @@ function select_jobs($repository, $trigger, $nightly, $labels, $php_version, $re $test_macos = in_array('CI: macOS', $labels, true); $test_msan = in_array('CI: MSAN', $labels, true); $test_opcache_variation = in_array('CI: Opcache Variation', $labels, true); - $test_pecl = in_array('CI: PECL', $labels, true); $test_solaris = in_array('CI: Solaris', $labels, true); $test_windows = in_array('CI: Windows', $labels, true); @@ -80,7 +79,14 @@ function select_jobs($repository, $trigger, $nightly, $labels, $php_version, $re $jobs['COMMUNITY']['matrix'] = version_compare($php_version, '8.4', '>=') ? ['type' => ['asan', 'verify_type_inference']] : ['type' => ['asan']]; - $jobs['COMMUNITY']['config']['symfony_version'] = version_compare($php_version, '8.4', '>=') ? '8.1' : '7.4'; + $jobs['COMMUNITY']['config']['symfony_version'] = match (true) { + version_compare($php_version, '8.3', '<=') => '7.4', + default => '', + }; + $jobs['COMMUNITY']['config']['laravel_version'] = match (true) { + version_compare($php_version, '8.2', '<=') => '12.x', + default => '', + }; } if (($all_jobs && $ref === 'master') || $test_coverage) { $jobs['COVERAGE'] = true; @@ -130,22 +136,24 @@ function select_jobs($repository, $trigger, $nightly, $labels, $php_version, $re if ($all_jobs || $test_opcache_variation) { $jobs['OPCACHE_VARIATION'] = true; } - if (($all_jobs && $ref === 'master') || $test_pecl) { - $jobs['PECL'] = true; - } if (version_compare($php_version, '8.6', '>=') && ($all_jobs || $test_solaris)) { $jobs['SOLARIS'] = true; } if ($all_jobs || !$no_jobs || $test_windows) { - $jobs['WINDOWS']['matrix'] = $all_variations - ? ['include' => [ - ['asan' => true, 'opcache' => true, 'x64' => true, 'zts' => true], - ['asan' => false, 'opcache' => false, 'x64' => false, 'zts' => false], - ]] - : ['include' => [['asan' => false, 'opcache' => true, 'x64' => true, 'zts' => true]]]; - $jobs['WINDOWS']['config'] = version_compare($php_version, '8.4', '>=') - ? ['vs_crt_version' => 'vs17'] - : ['vs_crt_version' => 'vs16']; + $matrix = [['asan' => false, 'opcache' => true, 'x64' => true, 'zts' => true]]; + if ($all_variations) { + $matrix[] = ['asan' => true, 'opcache' => true, 'x64' => true, 'zts' => true]; + $matrix[] = ['asan' => false, 'opcache' => false, 'x64' => false, 'zts' => false]; + if (version_compare($php_version, '8.6', '>=')) { + $matrix[] = ['asan' => false, 'opcache' => true, 'x64' => true, 'zts' => true, 'clang' => true]; + } + } + $jobs['WINDOWS']['matrix'] = ['include' => $matrix]; + $jobs['WINDOWS']['config'] = match (true) { + version_compare($php_version, '8.6', '>=') => ['vs_crt_version' => 'vs18', 'runs_on' => 'windows-2025-vs2026'], + version_compare($php_version, '8.4', '>=') => ['vs_crt_version' => 'vs17', 'runs_on' => 'windows-2022'], + default => ['vs_crt_version' => 'vs16', 'runs_on' => 'windows-2022'], + }; } if ($all_jobs || !$no_jobs || $test_freebsd) { $jobs['FREEBSD']['matrix'] = $all_variations && version_compare($php_version, '8.3', '>=') diff --git a/.github/scripts/download-bundled/uriparser.sh b/.github/scripts/download-bundled/uriparser.sh index 8820a67333f0..2b8d61a2d56f 100755 --- a/.github/scripts/download-bundled/uriparser.sh +++ b/.github/scripts/download-bundled/uriparser.sh @@ -5,7 +5,7 @@ cd "$(dirname "$0")/../../.." tmp_dir=/tmp/php-src-download-bundled/uriparser rm -rf "$tmp_dir" -revision=refs/tags/uriparser-1.0.0 +revision=refs/tags/uriparser-1.0.2 git clone --depth 1 --revision="$revision" https://github.com/uriparser/uriparser.git "$tmp_dir" diff --git a/.github/scripts/windows/build_task.bat b/.github/scripts/windows/build_task.bat index b65479451849..1177cef3be4d 100644 --- a/.github/scripts/windows/build_task.bat +++ b/.github/scripts/windows/build_task.bat @@ -26,12 +26,18 @@ if %errorlevel% neq 0 exit /b 3 if "%THREAD_SAFE%" equ "0" set ADD_CONF=%ADD_CONF% --disable-zts if "%INTRINSICS%" neq "" set ADD_CONF=%ADD_CONF% --enable-native-intrinsics=%INTRINSICS% if "%ASAN%" equ "1" set ADD_CONF=%ADD_CONF% --enable-sanitizer --enable-debug-pack +if "%CLANG_TOOLSET%" equ "1" set ADD_CONF=%ADD_CONF% --with-toolset=clang rem C4018: comparison: signed/unsigned mismatch rem C4146: unary minus operator applied to unsigned type rem C4244: type conversion, possible loss of data rem C4267: 'size_t' type conversion, possible loss of data -set CFLAGS=/W3 /WX /wd4018 /wd4146 /wd4244 /wd4267 +if "%CLANG_TOOLSET%" equ "1" ( + rem Clang is much stricter than MSVC, produces too many warnings that would fail the build with /WX + set CFLAGS=/W3 /wd4018 /wd4146 /wd4244 /wd4267 +) else ( + set CFLAGS=/W3 /WX /wd4018 /wd4146 /wd4244 /wd4267 +) cmd /c configure.bat ^ --enable-snapshot-build ^ diff --git a/.github/scripts/windows/find-vs-toolset.bat b/.github/scripts/windows/find-vs-toolset.bat index 2d9e68e73031..ecaca6775b07 100644 --- a/.github/scripts/windows/find-vs-toolset.bat +++ b/.github/scripts/windows/find-vs-toolset.bat @@ -3,7 +3,7 @@ setlocal enabledelayedexpansion if "%~1"=="" ( - echo ERROR: Usage: %~nx0 [vc14^|vc15^|vs16^|vs17] + echo ERROR: Usage: %~nx0 [vc14^|vc15^|vs16^|vs17^|vs18] exit /b 1 ) @@ -11,6 +11,7 @@ set "toolsets_vc14=14.0" set "toolsets_vc15=" set "toolsets_vs16=" set "toolsets_vs17=" +set "toolsets_vs18=" for /f "usebackq tokens=*" %%I in (`vswhere.exe -latest -find "VC\Tools\MSVC"`) do set "MSVCDIR=%%I" @@ -30,8 +31,10 @@ for /f "delims=" %%D in ('dir /b /ad "%MSVCDIR%"') do ( set "toolsets_vc15=%%D" ) else if !min! LEQ 29 ( set "toolsets_vs16=%%D" - ) else ( + ) else if !min! LEQ 49 ( set "toolsets_vs17=%%D" + ) else ( + set "toolsets_vs18=%%D" ) ) ) diff --git a/.github/workflows/test-suite.yml b/.github/workflows/test-suite.yml index 83aae655a3c3..7b1850aa1075 100644 --- a/.github/workflows/test-suite.yml +++ b/.github/workflows/test-suite.yml @@ -413,10 +413,15 @@ jobs: with: enableOpcache: true jitType: tracing - - uses: codecov/codecov-action@v5 + - name: Generate coverage report + if: ${{ !cancelled() }} + run: make gcovr-xml + - uses: codecov/codecov-action@v6 if: ${{ !cancelled() }} with: + disable_search: true fail_ci_if_error: true + files: gcovr.xml token: ${{ secrets.CODECOV_TOKEN }} verbose: true COMMUNITY: @@ -506,7 +511,8 @@ jobs: - name: Test Laravel if: ${{ !cancelled() }} run: | - git clone https://github.com/laravel/framework.git --depth=1 + branch=${{ fromJson(inputs.branch).jobs.COMMUNITY.config.laravel_version }} + git clone https://github.com/laravel/framework.git --depth=1 ${branch:+--branch="$branch"} cd framework git rev-parse HEAD php /usr/bin/composer install --no-progress --ignore-platform-req=php+ @@ -551,7 +557,8 @@ jobs: - name: Test Symfony if: ${{ !cancelled() }} run: | - git clone https://github.com/symfony/symfony.git --depth=1 --branch="${{ fromJson(inputs.branch).jobs.COMMUNITY.config.symfony_version }}" + branch=${{ fromJson(inputs.branch).jobs.COMMUNITY.config.symfony_version }} + git clone https://github.com/symfony/symfony.git --depth=1 ${branch:+--branch="$branch"} cd symfony git rev-parse HEAD php /usr/bin/composer install --no-progress --ignore-platform-req=php+ @@ -820,126 +827,18 @@ jobs: uses: ./.github/actions/test-libmysqlclient - name: Verify generated files are up to date uses: ./.github/actions/verify-generated-files - PECL: - if: ${{ fromJson(inputs.branch).jobs.PECL }} - runs-on: ubuntu-24.04 - steps: - - name: git checkout PHP - uses: actions/checkout@v6 - with: - path: php - ref: ${{ fromJson(inputs.branch).ref }} - # Used for ccache action - - name: Move .github - run: mv php/.github . - - name: git checkout apcu - uses: actions/checkout@v6 - with: - repository: krakjoe/apcu - path: apcu - - name: git checkout imagick - uses: actions/checkout@v6 - with: - repository: Imagick/imagick - path: imagick - - name: git checkout memcached - uses: actions/checkout@v6 - with: - repository: php-memcached-dev/php-memcached - path: memcached - - name: git checkout redis - if: ${{ false }} - uses: actions/checkout@v6 - with: - repository: phpredis/phpredis - path: redis - - name: git checkout xdebug - uses: actions/checkout@v6 - with: - repository: xdebug/xdebug - path: xdebug - - name: git checkout yaml - uses: actions/checkout@v6 - with: - repository: php/pecl-file_formats-yaml - path: yaml - - name: apt - run: | - sudo apt-get update - sudo apt-get install -y --no-install-recommends \ - ccache \ - libmemcached-dev \ - imagemagick \ - libmagickwand-dev \ - bison \ - re2c - - name: ccache - uses: ./.github/actions/ccache - with: - name: "${{ github.job }}" - php_directory: php - - name: build PHP - run: | - cd php - ./buildconf --force - ./configure \ - --enable-option-checking=fatal \ - --prefix=/opt/php \ - --enable-cli \ - --disable-all \ - --enable-session \ - --enable-werror - make -j$(/usr/bin/nproc) - sudo make install - - name: build apcu - run: | - cd apcu - /opt/php/bin/phpize - ./configure --prefix=/opt/php --with-php-config=/opt/php/bin/php-config - make -j$(/usr/bin/nproc) - - name: build imagick - run: | - cd imagick - /opt/php/bin/phpize - ./configure --prefix=/opt/php --with-php-config=/opt/php/bin/php-config - make -j$(/usr/bin/nproc) - - name: build memcached - run: | - cd memcached - /opt/php/bin/phpize - ./configure --prefix=/opt/php --with-php-config=/opt/php/bin/php-config - make -j$(/usr/bin/nproc) - - name: build redis - if: ${{ false }} - run: | - cd redis - /opt/php/bin/phpize - ./configure --prefix=/opt/php --with-php-config=/opt/php/bin/php-config - make -j$(/usr/bin/nproc) - - name: build xdebug - run: | - cd xdebug - /opt/php/bin/phpize - ./configure --prefix=/opt/php --with-php-config=/opt/php/bin/php-config - make -j$(/usr/bin/nproc) - - name: build yaml - run: | - cd yaml - /opt/php/bin/phpize - ./configure --prefix=/opt/php --with-php-config=/opt/php/bin/php-config - make -j$(/usr/bin/nproc) WINDOWS: if: ${{ fromJson(inputs.branch).jobs.WINDOWS }} strategy: fail-fast: false matrix: ${{ fromJson(inputs.branch).jobs.WINDOWS.matrix }} - name: "WINDOWS_${{ matrix.x64 && 'X64' || 'X86' }}_${{ matrix.zts && 'ZTS' || 'NTS' }}${{ matrix.asan && '_ASAN' || ''}}" - runs-on: windows-2022 + name: "WINDOWS_${{ matrix.x64 && 'X64' || 'X86' }}_${{ matrix.zts && 'ZTS' || 'NTS' }}${{ matrix.asan && '_ASAN' || ''}}${{ matrix.clang && '_CLANG' || ''}}" + runs-on: ${{ fromJson(inputs.branch).jobs.WINDOWS.config.runs_on }} env: PHP_BUILD_CACHE_BASE_DIR: C:\build-cache PHP_BUILD_OBJ_DIR: C:\obj PHP_BUILD_CACHE_SDK_DIR: C:\build-cache\sdk - PHP_BUILD_SDK_BRANCH: php-sdk-2.5.0 + PHP_BUILD_SDK_BRANCH: php-sdk-2.7.1 PHP_BUILD_CRT: ${{ fromJson(inputs.branch).jobs.WINDOWS.config.vs_crt_version }} PLATFORM: ${{ matrix.x64 && 'x64' || 'x86' }} THREAD_SAFE: "${{ matrix.zts && '1' || '0' }}" @@ -947,6 +846,7 @@ jobs: PARALLEL: -j2 OPCACHE: "${{ matrix.opcache && '1' || '0' }}" ASAN: "${{ matrix.asan && '1' || '0' }}" + CLANG_TOOLSET: "${{ matrix.clang && '1' || '0' }}" steps: - name: git config run: git config --global core.autocrlf false && git config --global core.eol lf diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 69ba4c0e4865..eafedec5eafa 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -2,15 +2,17 @@ name: Test on: push: paths-ignore: &ignore_paths + - .circleci/** + - .github/CODEOWNERS + - .github/ISSUE_TEMPLATE/** + - '**/*.md' + - '**/*.rst' - docs/** + - EXTENSIONS + - LICENSE - NEWS - UPGRADING - UPGRADING.INTERNALS - - '**/README.*' - - CONTRIBUTING.md - - CODING_STANDARDS.md - - .cirrus.yml - - .circleci/** branches: - PHP-8.2 - PHP-8.3 diff --git a/CODING_STANDARDS.md b/CODING_STANDARDS.md index 47b76717c839..3a53d0e258ca 100644 --- a/CODING_STANDARDS.md +++ b/CODING_STANDARDS.md @@ -79,6 +79,16 @@ rewritten to comply with these rules. return value for functions that perform some operation that may succeed or fail. +1. When throwing a `ValueError` or emitting a warning, use consistent + phrasing for error messages. Common patterns are: + + * Type errors: `must be of type int` (use the type name, not e.g. `must be an integer`) + * Range/boundary: `must be between X and Y` / `must be greater than [or equal to] X` / `must be less than X` / `must be finite` + * String constraints: `must not contain any null bytes` / `must not be empty` / `must be a single character` + * Valid value: `must be a valid X` (e.g. `must be a valid encoding`, `must be a valid calendar ID`) + * Enum-like: `must be one of X, Y, or Z` + * Structural: `must have X` / `must have key X` / `must have N elements` + ## User functions/methods naming conventions 1. Function names for user-level functions should be enclosed with in the diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 0f797df1e97a..aabd945ad385 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -27,6 +27,7 @@ had several contributions accepted, commit privileges are often quickly granted. * [Git commit rules](#git-commit-rules) * [Copyright and license headers](#copyright-and-license-headers) * [NEWS file](#news) +* [LLM usage in GitHub comments](#llm-usage-in-github-comments) ## Pull requests @@ -36,8 +37,8 @@ implement RFCs. Please be sure to include tests as appropriate! By submitting a pull request, you certify that you have the necessary rights to submit the work, that the work does not violate any third-party rights (including those of your employer, if applicable), and that you license your -contribution under the PHP License or under another license if explicitly -accepted by the PHP project maintainers. +contribution under the [Modified BSD License](LICENSE) or under another license +if explicitly accepted by the PHP project maintainers. If you are fixing a bug, then please submit your PR against the lowest actively supported branch of PHP that the bug affects (only green branches on @@ -90,7 +91,7 @@ repository. Mailing list subscription is explained on the [mailing lists page](https://www.php.net/mailing-lists.php). You may also want to read -[The Mysterious PHP RFC Process](https://blogs.oracle.com/opal/post/the-mysterious-php-rfc-process-and-how-you-can-change-the-web) +[The Mysterious PHP RFC Process](https://web.archive.org/web/20210621140006/https://blogs.oracle.com/opal/the-mysterious-php-rfc-process-and-how-you-can-change-the-web) for additional notes on the best way to approach submitting an RFC. ## Technical resources @@ -151,9 +152,8 @@ about what you're working on, you can contact us via the issues. Although not a formal channel, you can also find a number of core developers on -the #php.pecl channel on [EFnet](http://www.efnet.org/). Similarly, many -documentation writers can be found on #php.doc. Windows development IRC channel -is available at #winphp-dev on FreeNode. +the [php community discord server](https://phpc.chat/) (`#php-internals` channel) +where many people are eager to help. ## PHP source code directory structure @@ -355,30 +355,21 @@ Having said that, here are the organizational rules: `--enable-zts` switch to ensure your code handles TSRM correctly and doesn't break for those who need that. -Currently, we have the following branches in use: - -| Branch | | -| --------- | --------- | -| master | Active development branch for PHP 8.6, which is open for backwards incompatible changes and major internal API changes. | -| PHP-8.5 | Is used to release the PHP 8.5.x series. This is a current stable version and is open for bugfixes only. | -| PHP-8.4 | Is used to release the PHP 8.4.x series. This is a current stable version and is open for bugfixes only. | -| PHP-8.3 | Is used to release the PHP 8.3.x series. This is a current stable version and is open for bugfixes only. | -| PHP-8.2 | Is used to release the PHP 8.2.x series. This is an old stable version and is open for security fixes only. | -| PHP-8.1 | Is used to release the PHP 8.1.x series. This is an old stable version and is open for security fixes only. | -| PHP-8.0 | This branch is closed. | -| PHP-7.4 | This branch is closed. | -| PHP-7.3 | This branch is closed. | -| PHP-7.2 | This branch is closed. | -| PHP-7.1 | This branch is closed. | -| PHP-7.0 | This branch is closed. | -| PHP-5.6 | This branch is closed. | -| PHP-5.5 | This branch is closed. | -| PHP-5.4 | This branch is closed. | -| PHP-5.3 | This branch is closed. | -| PHP-5.2 | This branch is closed. | -| PHP-5.1 | This branch is closed. | -| PHP-4.4 | This branch is closed. | -| PHP-X.Y.Z | These branches are used for the release managers for tagging the releases, hence they are closed to the general public. | +The master branch is an active development branch for the newest version of PHP, +which is open for backwards incompatible changes and major internal API changes. + +For PHP-X.Y branches, they are used to release the PHP X.Y.z series. Please see +the [supported versions page](https://www.php.net/supported-versions.php) to get +the status of each version. + +If a version is described as "Active support", the corresponding branch is a +current stable version and is open for bugfixes only. If a version is described +as "Security fixes only", the corresponding branch is an old stable version +and is open for security fixes only. If a version is described as "End of life", +the corresponding branch is closed. + +Note that PHP-X.Y.Z branches are used for the release managers for tagging the +releases, hence they are closed to the general public. The next few rules are more of a technical nature: @@ -438,15 +429,13 @@ New source code files should include the following header block: ```c /* +----------------------------------------------------------------------+ - | Copyright (c) The PHP Group | + | Copyright © The PHP Group and Contributors. | +----------------------------------------------------------------------+ - | This source file is subject to version 3.01 of the PHP license, | - | that is bundled with this package in the file LICENSE, and is | - | available through the world-wide-web at the following url: | - | https://www.php.net/license/3_01.txt | - | If you did not receive a copy of the PHP license and are unable to | - | obtain it through the world-wide-web, please send a note to | - | license@php.net so we can mail you a copy immediately. | + | This source file is subject to the Modified BSD License that is | + | bundled with this package in the file LICENSE, and is available | + | through the World Wide Web at . | + | | + | SPDX-License-Identifier: BSD-3-Clause | +----------------------------------------------------------------------+ | Author: | +----------------------------------------------------------------------+ @@ -537,6 +526,12 @@ If for some reason a feature is introduced in a branch lower than master, although this is strictly prohibited by other policies, then the entry must also be in master. +## LLM usage in GitHub comments + +When using LLMs to generate comments to maintainers for any purpose other than +direct translation, we would highly appreciate it if you disclosed the relevant +paragraphs as such via markdown quote. + ## Thanks Thank you for contributing to PHP! diff --git a/EXTENSIONS b/EXTENSIONS index 8da09aed5392..20d7679d8281 100644 --- a/EXTENSIONS +++ b/EXTENSIONS @@ -171,28 +171,28 @@ PRIMARY MAINTAINER: Christian Stocker (2003 - 2011) Rob Richards (2003 - 2012) Marcus Börger (2003 - 2006) Nora Dossche (2023 - 2026) -MAINTENANCE: Odd fixes +MAINTENANCE: Orphan STATUS: Working SINCE: 5.0 ------------------------------------------------------------------------------- EXTENSION: simplexml PRIMARY MAINTAINER: Marcus Börger (2003 - 2008) Nora Dossche (2023 - 2026) -MAINTENANCE: Odd fixes +MAINTENANCE: Orphan STATUS: Working SINCE: 5.0 ------------------------------------------------------------------------------- EXTENSION: soap PRIMARY MAINTAINER: Dmitry Stogov (2004 - 2018) Nora Dossche (2024 - 2026) -MAINTENANCE: Odd fixes +MAINTENANCE: Orphan STATUS: Working ------------------------------------------------------------------------------- EXTENSION: xml PRIMARY MAINTAINER: Thies C. Arntzen (1999 - 2002) Rob Richards (2003 - 2013) Nora Dossche (2023 - 2026) -MAINTENANCE: Odd fixes +MAINTENANCE: Orphan STATUS: Working ------------------------------------------------------------------------------- EXTENSION: lexbor @@ -206,28 +206,28 @@ EXTENSION: libxml PRIMARY MAINTAINER: Rob Richards (2003 - 2009) Christian Stocker (2004 - 2011) Nora Dossche (2023 - 2026) -MAINTENANCE: Odd fixes +MAINTENANCE: Orphan STATUS: Working ------------------------------------------------------------------------------- EXTENSION: xmlreader PRIMARY MAINTAINER: Rob Richards (2004 - 2010) Christian Stocker (2004 - 2004) Nora Dossche (2023 - 2026) -MAINTENANCE: Odd fixes +MAINTENANCE: Orphan STATUS: Working ------------------------------------------------------------------------------- EXTENSION: xmlwriter PRIMARY MAINTAINER: Rob Richards (2004 - 2010) Pierre-Alain Joye (2005-2009) Nora Dossche (2023 - 2026) -MAINTENANCE: Odd fixes +MAINTENANCE: Orphan STATUS: Working ------------------------------------------------------------------------------- EXTENSION: xsl PRIMARY MAINTAINER: Christian Stocker (2003 - 2011) Rob Richards (2003 - 2010) Nora Dossche (2023 - 2026) -MAINTENANCE: Odd fixes +MAINTENANCE: Orphan STATUS: Working SINCE: 5.0 ------------------------------------------------------------------------------- @@ -351,6 +351,7 @@ STATUS: Working EXTENSION: intl PRIMARY MAINTAINER: Stanislav Malyshev (2008 - 2019) Anatol Belski (2017 - 2018) + Weilin Du (2026 - 2026) MAINTENANCE: Maintained STATUS: Working SINCE: 5.3 @@ -496,7 +497,7 @@ PRIMARY MAINTAINER: John Coggeshall (2003 - 2006) Ilia Alshanetsky (2003 - 2009) Nuno Lopes (2006 - 2012) Nora Dossche (2025 - 2026) -MAINTENANCE: Odd fixes +MAINTENANCE: Orphan STATUS: Working ------------------------------------------------------------------------------- EXTENSION: tokenizer diff --git a/LICENSE b/LICENSE index b155a18c2fb7..ee42a57fffbb 100644 --- a/LICENSE +++ b/LICENSE @@ -1,68 +1,27 @@ --------------------------------------------------------------------- - The PHP License, version 3.01 -Copyright (c) 1999 - 2025 The PHP Group. All rights reserved. --------------------------------------------------------------------- +Copyright © 1999–2026, The PHP Group and Contributors. +Copyright © 1999–2026, Zend Technologies Ltd., a subsidiary company of Perforce Software, Inc. Redistribution and use in source and binary forms, with or without -modification, is permitted provided that the following conditions -are met: - - 1. Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - - 2. Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in - the documentation and/or other materials provided with the - distribution. - - 3. The name "PHP" must not be used to endorse or promote products - derived from this software without prior written permission. For - written permission, please contact group@php.net. - - 4. Products derived from this software may not be called "PHP", nor - may "PHP" appear in their name, without prior written permission - from group@php.net. You may indicate that your software works in - conjunction with PHP by saying "Foo for PHP" instead of calling - it "PHP Foo" or "phpfoo" - - 5. The PHP Group may publish revised and/or new versions of the - license from time to time. Each version will be given a - distinguishing version number. - Once covered code has been published under a particular version - of the license, you may always continue to use it under the terms - of that version. You may also choose to use such covered code - under the terms of any subsequent version of the license - published by the PHP Group. No one other than the PHP Group has - the right to modify the terms applicable to covered code created - under this License. - - 6. Redistributions of any form whatsoever must retain the following - acknowledgment: - "This product includes PHP software, freely available from - ". - -THIS SOFTWARE IS PROVIDED BY THE PHP DEVELOPMENT TEAM ``AS IS'' AND -ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, -THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A -PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE PHP -DEVELOPMENT TEAM OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, -INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR -SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) -HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, -STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED -OF THE POSSIBILITY OF SUCH DAMAGE. - --------------------------------------------------------------------- - -This software consists of voluntary contributions made by many -individuals on behalf of the PHP Group. - -The PHP Group can be contacted via Email at group@php.net. - -For more information on the PHP Group and the PHP project, -please see . - -PHP includes the Zend Engine, freely available at -. +modification, are permitted provided that the following conditions are met: + +1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + +3. Neither the name of the copyright holder nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE +FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/NEWS b/NEWS index ca6b431d70cd..858ca396189a 100644 --- a/NEWS +++ b/NEWS @@ -16,6 +16,26 @@ PHP NEWS . Fixed bug GH-20174 (Assertion failure in ReflectionProperty::skipLazyInitialization after failed LazyProxy initialization). (Arnaud) + . Enabled the TAILCALL VM on Windows when compiling with Clang >= 19 x86_64. + (henderkes) + . Deprecate specifying a nullable return type for __debugInfo(). (timwolla) + . Fixed bug GH-22142 (Assertion failure in zendi_try_get_long() on IS_UNDEF). + (David Carlier) + . Fixed bug GH-22046 (The unserialize function can lead to segfault when + non-Serializable internal classes are serialized back with the C format). + (kocsismate) + . Fixed bug GH-22292 (AST pretty printing does not correctly handle + invalid variable names). (timwolla) + . Fixed bug GH-22291 (AST pretty printing does not correctly handle braces + in string interpolation). (timwolla) + . Fixed bug GH-22373 (AST pretty-printing drops meaningful parentheses + surrounding property access). (timwolla) + +- BCMath: + . Added NUL-byte validation to BCMath functions. (jorgsowa) + +- BZ2: + . Reject oversized input in bzdecompress(). (arshidkv12) - Date: . Update timelib to 2022.16. (Derick) @@ -23,21 +43,65 @@ PHP NEWS - DOM: . Removed LIBXML_XINCLUDE from valid options for XMLDocument, as it was a no-op. (ndossche) + . Readonly DOM properties are now declared with asymmetric visibility + (public private(set)). ReflectionProperty::isWritable() reports them + correctly, and external writes raise "Cannot modify private(set) + property" instead of the previous readonly modification error. + (David Carlier) + . Fixed Dom\Notation nodes missing tree connection, so that + ownerDocument, parentNode, isConnected and baseURI now return correct + values, and textContent returns NULL per the DOM specification. + (jordikroon) + +- EXIF: + . Added support for reading EXIF metadata from WebP images (GH-19904). + (iliaal) - Fileinfo: . Fixed bug GH-20679 (finfo_file() doesn't work on remote resources). (ndossche) + . Fixed bug #66095 (Hide libmagic dynamic symbols). (orlitzky) + +- GD: + . imagesetstyle()/imagefilter()/imagecrop() check array argument entries + types. (David Carlier) + +- GMP: + . gmp_fact() reject values larger than unsigned long. (David Carlier) + . gmp_pow/binomial/root/rootrem and shift/pow operators reject values + larger than unsigned long. (David Carlier) + . GMP exponentiation and shift operators now emit a deprecation warning + when converting a float right operand to int loses precision. (Weilin Du) - Hash: . Upgrade xxHash to 0.8.2. (timwolla) - Intl: + . Fixed malformed ResourceBundle::get() error message when fallback is + disabled. (Weilin Du) + . Fix incorrect argument positions for invalid start/end arguments in + transliterator_transliterate(). (Weilin Du) + . Fixed IntlTimeZone::getDisplayName() to synchronize object error state + for invalid display types. (Weilin Du) + . Fixed Locale::lookup() and locale_lookup() to return NULL instead of the + fallback locale when a language tag cannot be canonicalized. (Weilin Du) . Added IntlNumberRangeFormatter class to format an interval of two numbers with a given skeleton, locale, collapse type and identity fallback. (BogdanUngureanu) . Fixed bug GH-20426 (Spoofchecker::setRestrictionLevel() error message suggests missing constants). (DanielEScherzer) . Added grapheme_strrev (Yuya Hamada) + . Passing a non-stringable object as a time zone to Intl time zone + argument handling now raises TypeError instead of Error. (Weilin Du) + . IntlBreakIterator::getLocale() now raises ValueError for invalid locale + types. (Weilin Du) + . Fixed MessageFormatter::parse() and parseMessage() returning PHP_INT_MIN + as float rather than int on 64-bit platforms. (Weilin Du) + . Fixed UConverter::transcode() silently truncating from_subst and to_subst + option lengths greater than 127 bytes. (Weilin Du) + +- IO: + . Added new polling API. (Jakub Zelenka) - JSON: . Enriched JSON last error / exception message with error location. @@ -48,7 +112,7 @@ PHP NEWS small value). (David Carlier) - Mail: - . Fixed bug GH-20862 (null pointer dereference in + . Fixed bug GH-20862 (null pointer dereference in php_mail_detect_multiple_crlf via error_log (jordikroon) - Mbstring: @@ -59,14 +123,32 @@ PHP NEWS recursive array references). (alexandre-daubois) . Fixed bug GH-21223; mb_guess_encoding no longer crashes when passed huge list of candidate encodings (with 200,000+ entries). (Jordi Kroon) + . mbregex has been deprecated. (youkidearitai) + +- Mysqli: + . Added mysqli_quote_string() and mysqli::quote_string(). (Kamil Tekiela) - Opcache: . Fixed bug GH-20051 (apache2 shutdowns when restart is requested during preloading). (Arnaud, welcomycozyhom) - OpenSSL: + . Added AES-SIV support. (jordikroon) . Implemented GH-20310 (No critical extension indication in openssl_x509_parse() output). (StephenWall) + . Added TLS session resumption support for streams with new context options + and Openssl\Session class. (Jakub Zelenka) + . Added TLS external PSK support for streams with new context options and + Openssl\Psk class. (Jakub Zelenka) + . Added stream crypto status for exposing OpenSSL WANT_READ / WANT_WRITE. + (Jakub Zelenka) + +- PCNTL: + . pcntl_exec() now throws a ValueError if the $args array is not a list + array. (Weilin Du) + +- PDO_DBLIB; + . Added dblib_handle_check_liveness handler. (freddy77) - PDO_PGSQL: . Clear session-local state disconnect-equivalent processing. @@ -75,11 +157,20 @@ PHP NEWS - PGSQL: . Enabled 64 bits support for pg_lo_truncate()/pg_lo_tell() if the server supports it. (KentarouTakeda) + . pg_fetch_object() now surfaces non-instantiable class errors + before fetching, resolves the constructor via the get_constructor + handler, and reports the empty-constructor ValueError on the + $constructor_args argument. (David Carlier) - Phar: . Support reference values in Phar::mungServer(). (ndossche) . Invalid values now throw in Phar::mungServer() instead of being silently ignored. (ndossche) + . Fixed a bypass of the magic ".phar" directory protection in + Phar::addEmptyDir() for paths starting with "/.phar". (Weilin Du) + . Fixed an integer underflow when parsing ZIP extra fields. (Weilin Du) + . Phar::addEmptyDir() now allows non-magic directory names that merely + share the ".phar" prefix. (Weilin Du) . Support overridden methods in SplFileInfo for getMTime() and getPathname() when building a phar. (ndossche) . Mark Phar::buildFromIterator() base directory argument as a path. @@ -96,14 +187,30 @@ PHP NEWS (ilutov) . Fixed bug GH-21362 (ReflectionMethod::invoke/invokeArgs() did not verify Closure instance identity for Closure::__invoke()). (Ilia Alshanetsky) + . Added ReflectionParameter::getDocComment(). (chschneider) - Session: . Fixed bug 71162 (updateTimestamp never called when session data is empty). (Girgias) + . Null bytes in session.cookie_path, session.cookie_domain, and + session.cache_limiter are now rejected with a warning. (jorgsowa) + . session.cookie_samesite now rejects invalid values with a warning; only + "Strict", "Lax", "None", or "" are accepted. (jorgsowa) + . session.cookie_lifetime now rejects non-integer and out-of-range values + with a warning. (jorgsowa) + . Session file GC now recursively cleans nested subdirectories when + session.save_path uses the dirdepth prefix. (jorgsowa) + . Changed defaults of session.use_strict_mode (now 1), session.cookie_httponly + (now 1) and session.cookie_samesite (now "Lax"). (jorgsowa) - Soap: . Soap::__setCookie() when cookie name is a digit is now not stored and represented as a string anymore but a int. (David Carlier) + . Fixed bug GH-21421 (SoapClient typemap property breaks engine assumptions). + (ndossche) + . WSDL/XML Schema parsing now rejects out-of-range integer values for + occurrence constraints and integer restriction facets. Negative minOccurs + and maxOccurs values are rejected as well. (Weilin Du) - Sockets: . Added the TCP_USER_TIMEOUT constant for Linux to set the maximum time in @@ -119,6 +226,12 @@ PHP NEWS - SPL: . DirectoryIterator key can now work better with filesystem supporting larger directory indexing. (David Carlier) + . Fixed bug GH-21831 (SplObjectStorage::removeAllExcept() use-after-free + with re-entrant getHash()). (Pratik Bhujel) + . Fix bugs GH-8561, GH-8562, GH-8563, and GH-8564 (Fixing various + SplFileObject iterator desync bugs). (iliaal) + . Fix bug GH-22062 (SplDoublyLinkedList iterator UAF + via destructor releasing next node). (David Carlier) - Sqlite3: . Fix NUL byte truncation in sqlite3 TEXT column handling. (ndossche) @@ -134,18 +247,55 @@ PHP NEWS null destination). (David Carlier) . Fixed bug GH-13204 (glob() fails if square bracket is in current directory). (ndossche) + . Add array size maximum to array_diff(). (ndossche) + . Add enum SortDirection. (timwolla) + . pathinfo() raises a ValueError with an invalid $flags argument. + (David Carlier) + . Passing an invalid flag value to the second argument of scandir() will now + throw a ValueError. (alexandre-daubois) + . array_change_key_case() now raises a ValueError when an invalid $case + argument value is passed. (Girgias) + . linkinfo() now raises a ValueError when the argument is an empty string. + (Weilin Du) + . getenv() and putenv() now raises a ValueError when the first argument + contains null bytes. (Weilin Du) + . dl() now raises a ValueError when the $extension_filename argument + contains null bytes. (Weilin Du) + . openlog() now raises a ValueError when the $prefix argument contains + null bytes. (Weilin Du) + . parse_str() now raises a ValueError when the $string argument contains + null bytes. (Weilin Du) + . proc_open() now raises a ValueError when the $cwd argument contains + null bytes. (Weilin Du) + . ini_get_all() now includes the built-in default value in the details. + (sebastian) + . Fixed bug GH-22171 (Invalid auth header generation in + http(s) stream wrapper). (David Carlier) - Streams: + . Added new stream errors API including new StreamException, StreamError + classes, StreamErrorStore, StreamErrorMode, StreamErrorCode enums, + stream_last_errors() and stream_clear_errors() functions, error_mode, + error_store and error_handler stream context options and extending some + stream functions with context param. (Jakub Zelenka) . Added so_keepalive, tcp_keepidle, tcp_keepintvl and tcp_keepcnt stream - socket context options. + socket context options. (Jakub Zelenka) . Added so_reuseaddr streams context socket option that allows disabling - address resuse. + address reuse. (Jakub Zelenka) . Fixed bug GH-20370 (User stream filters could violate typed property constraints). (alexandre-daubois) . Allowed filtered streams to be casted as fd for select. (Jakub Zelenka) . Fixed bug GH-21221 (Prevent closing of innerstream of php://temp stream). (ilutov) . Improved stream_socket_server() bind failure error reporting. (ilutov) + . Fixed bug #49874 (ftell() and fseek() inconsistency when using stream + filters). (Jakub Zelenka) + +- URI: + . Added Uri\Rfc3986\Uri:getUriType() and Uri\WhatWg\Url:isSpecialScheme(). + (kocsismate) + . Added Uri\Rfc3986\Uri:getHostType() and Uri\WhatWg\Url:getHostType(). + (kocsismate) - Zip: . Fixed ZipArchive callback being called after executor has shut down. @@ -155,4 +305,11 @@ PHP NEWS . Added ZipArchive::openString() method. (Tim Starling, Soner Sayakci, Ghaith Olabi) +- Zlib: + . deflate_init() now raises a TypeError when the value for option + "level", "memory", "window", or "strategy" is not of type int. + (Weilin Du) + . inflate_init() now raises a TypeError when the value for option + "window" is not of type int. (Weilin Du) + <<< NOTE: Insert NEWS from last stable release here prior to actual release! >>> diff --git a/README.md b/README.md index 9a058bb942e2..3f4e0534ede2 100644 --- a/README.md +++ b/README.md @@ -11,10 +11,12 @@ PHP is a popular general-purpose scripting language that is especially suited to web development. Fast, flexible and pragmatic, PHP powers everything from your -blog to the most popular websites in the world. PHP is distributed under the -[PHP License v3.01](LICENSE). +blog to the most popular websites in the world. -[![Push](https://github.com/php/php-src/actions/workflows/push.yml/badge.svg)](https://github.com/php/php-src/actions/workflows/push.yml) +PHP is distributed under the [Modified BSD License](LICENSE) +(SPDX-License-Identifier: `BSD-3-Clause`). + +[![Test](https://github.com/php/php-src/actions/workflows/test.yml/badge.svg)](https://github.com/php/php-src/actions/workflows/test.yml) [![Fuzzing Status](https://oss-fuzz-build-logs.storage.googleapis.com/badges/php.svg)](https://issues.oss-fuzz.com/issues?q=project:php) ## Documentation diff --git a/SECURITY.md b/SECURITY.md index deb5a7a950a4..24801b3b4e43 100644 --- a/SECURITY.md +++ b/SECURITY.md @@ -11,6 +11,31 @@ Vulnerability reports remain private until published. When published, you will be credited as a contributor, and your contribution will reflect the MITRE Credit System. +# Classification + +Issues commonly reported that are _not_ considered security issues include (but +are not limited to): + +- Invocation of specially crafted, malicious code intended to cause memory + violations. This commonly includes malicious error handlers, destructors or + `__toString()` functions. PHP does not offer sandboxing, and the execution of + untrusted code is always considered unsafe. Such issues are bugs, but not + security issues. They may still be reported, though please avoid reporting + the known issues. + +- Passing malicious arguments to functions clearly not intended to receive + unsanitized values, e.g. `mysqli_query()`. `escapeshellarg()` on the other + hand should clearly be hardened against unsafe inputs. + +- The use of legacy APIs or settings known to be insecure, particularly those + documented as such, or those with a secure alternative. + +- The use of FFI. + +- `open_basedir` or `disable_functions` bypasses. + +- Malicious `unserialize()` inputs. + # Vulnerability Policy Our full policy is described at diff --git a/TSRM/TSRM.h b/TSRM/TSRM.h index 80d6cbad0443..ea13552c8374 100644 --- a/TSRM/TSRM.h +++ b/TSRM/TSRM.h @@ -175,9 +175,14 @@ TSRM_API bool tsrm_is_managed_thread(void); #define TSRMG_BULK_STATIC(id, type) ((type) (*((void ***) TSRMLS_CACHE))[TSRM_UNSHUFFLE_RSRC_ID(id)]) #define TSRMG_FAST_STATIC(offset, type, element) (TSRMG_FAST_BULK_STATIC(offset, type)->element) #define TSRMG_FAST_BULK_STATIC(offset, type) ((type) (((char*) TSRMLS_CACHE)+(offset))) +#ifdef __cplusplus +#define TSRMLS_MAIN_CACHE_EXTERN() extern "C" { extern TSRM_TLS void *TSRMLS_CACHE TSRM_TLS_MODEL_ATTR; } +#define TSRMLS_CACHE_EXTERN() extern "C" { extern TSRM_TLS void *TSRMLS_CACHE; } +#else #define TSRMLS_MAIN_CACHE_EXTERN() extern TSRM_TLS void *TSRMLS_CACHE TSRM_TLS_MODEL_ATTR; -#define TSRMLS_MAIN_CACHE_DEFINE() TSRM_TLS void *TSRMLS_CACHE TSRM_TLS_MODEL_ATTR = NULL; #define TSRMLS_CACHE_EXTERN() extern TSRM_TLS void *TSRMLS_CACHE; +#endif +#define TSRMLS_MAIN_CACHE_DEFINE() TSRM_TLS void *TSRMLS_CACHE TSRM_TLS_MODEL_ATTR = NULL; #define TSRMLS_CACHE_DEFINE() TSRM_TLS void *TSRMLS_CACHE = NULL; #define TSRMLS_CACHE_UPDATE() TSRMLS_CACHE = tsrm_get_ls_cache() #define TSRMLS_CACHE _tsrm_ls_cache diff --git a/TSRM/tsrm_win32.c b/TSRM/tsrm_win32.c index 4c8fc9d19aa9..90317ab64b19 100644 --- a/TSRM/tsrm_win32.c +++ b/TSRM/tsrm_win32.c @@ -1,14 +1,12 @@ /* +----------------------------------------------------------------------+ - | Copyright (c) The PHP Group | + | Copyright © The PHP Group and Contributors. | +----------------------------------------------------------------------+ - | This source file is subject to version 3.01 of the PHP license, | - | that is bundled with this package in the file LICENSE, and is | - | available through the world-wide-web at the following url: | - | https://www.php.net/license/3_01.txt | - | If you did not receive a copy of the PHP license and are unable to | - | obtain it through the world-wide-web, please send a note to | - | license@php.net so we can mail you a copy immediately. | + | This source file is subject to the Modified BSD License that is | + | bundled with this package in the file LICENSE, and is available | + | through the World Wide Web at . | + | | + | SPDX-License-Identifier: BSD-3-Clause | +----------------------------------------------------------------------+ | Authors: Daniel Beulshausen | +----------------------------------------------------------------------+ diff --git a/TSRM/tsrm_win32.h b/TSRM/tsrm_win32.h index c5bdc492be1b..9c16bd7c654b 100644 --- a/TSRM/tsrm_win32.h +++ b/TSRM/tsrm_win32.h @@ -1,14 +1,12 @@ /* +----------------------------------------------------------------------+ - | Copyright (c) The PHP Group | + | Copyright © The PHP Group and Contributors. | +----------------------------------------------------------------------+ - | This source file is subject to version 3.01 of the PHP license, | - | that is bundled with this package in the file LICENSE, and is | - | available through the world-wide-web at the following url: | - | https://www.php.net/license/3_01.txt | - | If you did not receive a copy of the PHP license and are unable to | - | obtain it through the world-wide-web, please send a note to | - | license@php.net so we can mail you a copy immediately. | + | This source file is subject to the Modified BSD License that is | + | bundled with this package in the file LICENSE, and is available | + | through the World Wide Web at . | + | | + | SPDX-License-Identifier: BSD-3-Clause | +----------------------------------------------------------------------+ | Authors: Daniel Beulshausen | +----------------------------------------------------------------------+ diff --git a/UPGRADING b/UPGRADING index 113258ebbd3e..9f7917301b59 100644 --- a/UPGRADING +++ b/UPGRADING @@ -19,16 +19,77 @@ PHP 8.6 UPGRADE NOTES 1. Backward Incompatible Changes ======================================== +- DOM: + . Properties previously documented as @readonly (e.g. DOMNode::$nodeType, + DOMDocument::$xmlEncoding, DOMEntity::$actualEncoding, ::$encoding, + ::$version) are now declared with asymmetric visibility + (public private(set)). Attempts to write to them from outside the + class now raise "Cannot modify private(set) property ::$ + from global scope" instead of the prior readonly modification error. + ReflectionProperty::isWritable() also reports these properties + accurately. + +- GD: + . imagesetstyle(), imagefilter() and imagecrop() filter their + array arguments types/values and raise a TypeError/ValueError + accordingly. + +- Intl: + . Passing a non-stringable object as a time zone to Intl APIs that accept + time zone objects or strings now raises a TypeError instead of an Error. + . IntlBreakIterator::getLocale() now raises a ValueError when the type is + neither Locale::ACTUAL_LOCALE nor Locale::VALID_LOCALE instead of + returning false. + . MessageFormatter::parse() and parseMessage() now return PHP_INT_MIN as + int, rather than float, on 64-bit platforms when parsing integer values. + . The $type parameter of IntlBreakIterator::getPartsIterator() has been + changed from string to int to match the underlying implementation. + . UConverter::transcode() now rejects from_subst and to_subst option values + longer than 127 bytes instead of silently truncating the length before + passing it to ICU. + . ResourceBundle::get() and resourcebundle_get() now report fallback-disabled + resource lookups with "without fallback to " instead of the + malformed "without fallback from to ". + +- PCNTL: + . pcntl_alarm() now raises a ValueError if the seconds argument is + lower than zero or greater than platform's UINT_MAX. + . pcntl_exec() now raises a ValueError if the $args argument is not a list + array. + - PCRE: . preg_grep() now returns false instead of a partial array when a PCRE execution error occurs (e.g. malformed UTF-8 input with the /u modifier). This is consistent with other preg_* functions. - Phar: - . Invalid values now throw in Phar::mungServer() instead of being silently - ignored. + . Phar::mungServer() now raises a ValueError when an invalid + argument value is passed instead of being silently ignored. + . Phar::addEmptyDir() now rejects `/.phar` paths in addition to `.phar` + paths, and raises the same BadMethodCallException for attempts to create + the reserved magic ".phar" directory through that form. + . Phar::addEmptyDir() now treats non-magic names that merely share the + `.phar` prefix as ordinary directories. + +- PGSQL: + . pg_fetch_object() now reports the ValueError for a non-empty + $constructor_args on a class without a constructor on the + $constructor_args argument instead of $class. Errors raised when + the requested class is not instantiable (abstract, interface, enum) + now surface before the row is fetched. + +- Posix: + . posix_access() now raises a ValueError when an invalid $flags + argument value is passed. + . posix_mkfifo() now raises a ValueError when an invalid $permissions + argument value is passed. - Session: + . Setting session.cookie_path, session.cookie_domain, or session.cache_limiter + to a value containing null bytes now emits a warning and leaves the setting + unchanged. Previously, null bytes were silently accepted: for cookie_path and + cookie_domain this caused the SAPI to drop the Set-Cookie header; for + cache_limiter the value was silently truncated at the null byte. . A ValueError is not thrown if $name is a string containing null bytes in session_module_name(). . session_encode() now returns an empty string instead of false for empty @@ -43,12 +104,77 @@ PHP 8.6 UPGRADE NOTES comparison. Custom session handlers that rely on write() being called with empty data (e.g. to destroy the session) should implement the same logic in their updateTimestamp() method. + . The defaults of three session INI settings have changed to provide secure + behavior out of the box: + - session.use_strict_mode is now 1 (was 0). Strict mode rejects + uninitialized session IDs, mitigating session fixation. Custom session + handlers that previously relied on accepting externally supplied IDs + without a corresponding storage entry must either implement + validateId() / create_sid() or explicitly set this to 0. + - session.cookie_httponly is now 1 (was 0). Session cookies are no + longer accessible to JavaScript via document.cookie. Applications + that read the session cookie from JavaScript must explicitly set + this to 0. + - session.cookie_samesite is now "Lax" (was unset). Session cookies + are no longer sent on cross-site requests other than top-level + navigations using safe HTTP methods. Applications that depend on + session cookies being sent on cross-site POST submissions must + explicitly set this to "None" (and also set session.cookie_secure + to 1). + RFC: https://wiki.php.net/rfc/session_security_defaults + +- SOAP: + . WSDL/XML Schema parsing now rejects out-of-range integer values for + occurrence constraints and integer restriction facets. Negative minOccurs + and maxOccurs values are rejected as well. + +- SPL: + . SplObjectStorage::getHash() implementations may no longer mutate any + SplObjectStorage instance. Attempting to do so now throws an Error. + . SplFileObject::next() now advances the stream when no prior current() + call has cached a line. A subsequent current() call returns the new + line rather than the previous one. + . SplFileObject::fgets() no longer caches the returned line for + subsequent current() calls. current() now re-reads from the current + stream position instead of returning the line fgets() just returned. + . SplFileObject::next() past EOF no longer increments key() without + bound. SplFileObject::seek() past EOF now produces the same key() + value as SplTempFileObject; the two previously returned different + values. - Standard: - . Invalid mode values now throw in array_filter() instead of being silently - defaulted to 0. . Form feed (\f) is now added in the default trimmed characters of trim(), rtrim() and ltrim(). RFC: https://wiki.php.net/rfc/trim_form_feed + . array_filter() now raises a ValueError when an invalid $mode + argument value is passed. + . array_change_key_case() now raises a ValueError when an invalid $case + argument value is passed. + . getenv() and putenv() now raises a ValueError when the first argument + contains null bytes. + . dl() now raises a ValueError when the $extension_filename argument + contains null bytes. + . openlog() now raises a ValueError when the $prefix argument contains + null bytes. + . parse_str() now raises a ValueError when the $string argument contains + null bytes. + . linkinfo() now raises a ValueError when the $path argument is empty. + . pathinfo() now raises a ValueError when an invalid $flag + argument value is passed. + . scandir() now raises a ValueError when an invalid $sorting_order + argument value is passed. + . proc_open() now raises a ValueError when the $cwd argument contains + null bytes. + +- Zip: + . ZipArchive::extractTo now raises a TypeError for the + files argument if one or more of the entries is not + a string. + +- Zlib: + . deflate_init() now raises a TypeError when the value for option + "level", "memory", "window", or "strategy" is not of type int. + . inflate_init() now raises a TypeError when the value for option + "window" is not of type int. ======================================== 2. New Features @@ -57,6 +183,8 @@ PHP 8.6 UPGRADE NOTES - Core: . It is now possible to use reference assign on WeakMap without the key needing to be present beforehand. + . It is now possible to define the `__debugInfo()` magic method on enums. + RFC: https://wiki.php.net/rfc/debugable-enums - Fileinfo: . finfo_file() now works with remote streams. @@ -73,16 +201,35 @@ PHP 8.6 UPGRADE NOTES IntlNumberRangeFormatter::IDENTITY_FALLBACK_RANGE identity fallbacks. It is supported from icu 63. +- IO: + . Added new polling API. + RFC: https://wiki.php.net/rfc/poll_api + - JSON: . Added extra info about error location to the JSON error messages returned from json_last_error_msg() and JsonException message. +- OpenSSL: + . Added TLS session resumption support for streams with new stream context + options: session_data, session_new_cb, session_cache, session_cache_size, + session_timeout, session_id_context, session_get_cb, session_remove_cb, + and num_tickets. This allows saving and restoring client sessions across + requests, implementing custom server-side session storage, and controlling + session cache behavior. + RFC: https://wiki.php.net/rfc/tls_session_resumption + . Added TLS external PSK support for streams with new strem context options: + psk_client_cb and psk_server_cb. This allows setting and receiving PSK. + - Phar: . Overriding the getMTime() and getPathname() methods of SplFileInfo now influences the result of the phar buildFrom family of functions. This makes it possible to override the timestamp and names of files. - Streams: + . Added new stream errors API including new classes, enums, functions and + internal API. It is controlled using error_mode, error_store and + error_handler stream context options. + RFC: https://wiki.php.net/rfc/stream_errors . Added stream socket context option so_reuseaddr that allows disabling address reuse (SO_REUSEADDR) and explicitly uses SO_EXCLUSIVEADDRUSE on Windows. @@ -90,6 +237,16 @@ PHP 8.6 UPGRADE NOTES tcp_keepintvl and tcp_keepcnt that allow setting socket keepalive options. . Allowed casting casting filtered streams as file descriptor for select. + . Added the "write_seek_mode stream" filter parameter for the bz2, iconv, + zlib, and string stream filters. This parameter must be set via an + associative array where the key is "write_seek_mode stream" and the + value is one of the following strings "preserve", "reset", or "strict". + +- URI: + . Added Uri\Rfc3986\Uri:getUriType() and Uri\WhatWg\Url:isSpecialScheme(). + RFC: https://wiki.php.net/rfc/uri_followup#uri_type_detection + . Added Uri\Rfc3986\Uri:getHostType() and Uri\WhatWg\Url:getHostType(). + RFC: https://wiki.php.net/rfc/uri_followup#host_type_detection ======================================== 3. Changes in SAPI modules @@ -99,10 +256,35 @@ PHP 8.6 UPGRADE NOTES 4. Deprecated Functionality ======================================== +- Core: + . Specifying a return type of array|null / ?array for __debugInfo() is now + deprecated. Specify array instead. + +- GMP + . The shift (<<, >>) and exponentiation (**) operators on GMP objects now + emit a deprecation warning when converting a float right operand to int + loses precision. + +- Mbstring: + . Mbregex has been deprecated, because the underlying Oniguruma library + is no longer maintained. + RFC: https://wiki.php.net/rfc/eol-oniguruma + ======================================== 5. Changed Functions ======================================== +- GMP: + . gmp_fact() now throws a ValueError() if $num does not fit into + a unsigned long. + . gmp_pow(), gmp_binomial(), gmp_root() and gmp_rootrem() now throw a + ValueError if their second argument does not fit into an unsigned long. + . The shift (<<, >>) and exponentiation (**) operators on GMP objects + now throw a ValueError if the right operand does not fit into an + unsigned long. + . gmp_powm() modulo-by-zero now raises a DivisionByZeroError whose + message includes the function name and argument index ($modulus). + - mysqli: . The return structure of mysqli_get_charset() no longer contains the undocumented "comment" element. The value of "charsetnr" is @@ -113,28 +295,23 @@ PHP 8.6 UPGRADE NOTES . Output of openssl_x509_parse() contains criticalExtensions listing all critical certificate extensions. -- PCNTL: - . pcntl_alarm() now throws a ValueError if the seconds argument is - lower than zero or greater than platform's UINT_MAX. +- PDO_DBLIB: + . When using persistent connections, there is now a liveness check in the + constructor. - Phar: . Phar::mungServer() now supports reference values. -- Posix: - . posix_access() now throws a ValueError exception if the flags - argument is invalid. - . posix_mkfifo() now throws a ValueError exception if the permissions - argument is invalid. - - Sockets: . socket_addrinfo_lookup() now has an additional optional argument $error when not null, and on failure, gives the error code (one of the EAI_* constants). -- Zip: - . ZipArchive::extractTo now raises a TypeError for the - files argument if one or more of the entries is not - a string. +- Standard: + . ini_get_all() now includes a "builtin_default_value" element for each + directive when $details is true. It holds the built-in default value of + the directive (or null if it has none), independent of values set in + php.ini, on the command line, or at runtime. ======================================== 6. New Functions @@ -144,23 +321,66 @@ PHP 8.6 UPGRADE NOTES . ReflectionConstant::inNamespace() . Added ReflectionProperty::isReadable() and ReflectionProperty::isWritable(). RFC: https://wiki.php.net/rfc/isreadable-iswriteable + . Added ReflectionParameter::getDocComment(). + RFC: https://wiki.php.net/rfc/parameter-doccomments - Intl: . `grapheme_strrev()` returns strrev for grapheme cluster unit. RFC: https://wiki.php.net/rfc/grapheme_strrev +- mysqli: + . Added `mysqli::quote_string()` and `mysqli_quote_string()`. + RFC: https://wiki.php.net/rfc/mysqli_quote_string + - Standard: . `clamp()` returns the given value if in range, else return the nearest bound. RFC: https://wiki.php.net/rfc/clamp_v2 + . `stream_last_errors()` and `stream_clear_errors()`. + RFC: https://wiki.php.net/rfc/stream_errors + . stream_socket_get_crypto_status() - Zip: . Added ZipArchive::openString() method. + . Added ZipArchive::closeString() method. ======================================== 7. New Classes and Interfaces ======================================== +- OpenSSL: + . Openssl\OpensslException + . Openssl\Session + RFC: https://wiki.php.net/rfc/tls_session_resumption + . Openssl\Psk + +- Standard: + . enum SortDirection + RFC: https://wiki.php.net/rfc/sort_direction_enum + . StreamError + . StreamException + . enum StreamErrorStore + . enum StreamErrorMode + . enum StreamErrorCode + RFC: https://wiki.php.net/rfc/stream_errors + . Io\Poll\Context + . Io\Poll\Watcher + . enum Io\Poll\Backend + . enum Io\Poll\Event + . interface Io\Poll\Handle + . Io\IoException + . Io\Poll\PollException + . Io\Poll\FailedPollOperationException + . Io\Poll\FailedContextInitializationException + . Io\Poll\FailedHandleAddException + . Io\Poll\FailedWatcherModificationException + . Io\Poll\FailedPollWaitException + . Io\Poll\BackendUnavailableException + . Io\Poll\InactiveWatcherException + . Io\Poll\HandleAlreadyWatchedException + . Io\Poll\InvalidHandleException + . StreamPollHandle + ======================================== 8. Removed Extensions and SAPIs ======================================== @@ -201,12 +421,22 @@ PHP 8.6 UPGRADE NOTES . EAI_IDN_ENCODE. - Standard - . ARRAY_FILTER_USE_KEY. + . ARRAY_FILTER_USE_VALUE. + . STREAM_CRYPTO_STATUS_NONE + . STREAM_CRYPTO_STATUS_WANT_READ + . STREAM_CRYPTO_STATUS_WANT_WRITE ======================================== 11. Changes to INI File Handling ======================================== +- Mbstring: + . The mbstring.detect_order INI directive now updates the internal detection + order when changed at runtime via ini_set(). Previously, runtime changes + using ini_set() did not take effect for mb_detect_order(). Setting the + directive to NULL or an empty string at runtime now leaves the previously + configured detection order unchanged. + - Mysqli: . mysqli.default_port now checks the validity of the value which should be between 0 and 65535 included. @@ -216,13 +446,6 @@ PHP 8.6 UPGRADE NOTES When used along with ZEND_JIT_DEBUG_TRACE_EXIT_INFO, the source of exit points is printed in exit info output, in debug builds. -- Mbstring: - . The mbstring.detect_order INI directive now updates the internal detection - order when changed at runtime via ini_set(). Previously, runtime changes - using ini_set() did not take effect for mb_detect_order(). Setting the - directive to NULL or an empty string at runtime now leaves the previously - configured detection order unchanged. - ======================================== 12. Windows Support ======================================== @@ -246,20 +469,36 @@ PHP 8.6 UPGRADE NOTES creation of intermediate Closures, the overhead of calling userland callbacks from internal functions and providing for better insight for the JIT. + . The performance of the TAILCALL VM has been improved. + . The TAILCALL VM is now enabled on Windows when compiling with Clang >= 19 + x86_64. - DOM: . Made splitText() faster and consume less memory. - JSON: . Improve performance of encoding arrays and objects. + . Improved performance of indentation generation in json_encode() + when using PHP_JSON_PRETTY_PRINT. + +- Phar: + . Reduced temporary allocations when iterating Phar directories. - Standard: . Improved performance of array_fill_keys(). . Improved performance of array_map() with multiple arrays passed. + . Improved performance of array_sum() and array_product() for + integer-only arrays. . Improved performance of array_unshift(). . Improved performance of array_walk(). . Improved performance of intval('+0b...', 2) and intval('0b...', 2). . Improved performance of str_split(). +- URI: + . Reduced allocations when reading IPv6/IPFuture hosts and paths with + Uri\Rfc3986\Uri. + . Improved performance and memory consumption when using normalizing + (non-raw) getters on already-normalized URIs with Uri\Rfc3986\Uri. + - Zip: . Avoid string copies in ZipArchive::addFromString(). diff --git a/UPGRADING.INTERNALS b/UPGRADING.INTERNALS index 57bef65c25ee..1f24fb82fcf9 100644 --- a/UPGRADING.INTERNALS +++ b/UPGRADING.INTERNALS @@ -17,6 +17,7 @@ PHP 8.6 INTERNALS UPGRADE NOTES . ZSTR_INIT_LITERAL(), zend_string_starts_with_literal(), and zend_string_starts_with_literal_ci() now support strings containing NUL bytes. Passing non-literal char* is no longer supported. + . Added zend_string_equals_cstr_ci(). . The misnamed ZVAL_IS_NULL() has been removed. Use Z_ISNULL() instead. . New zend_class_entry.ce_flags2 and zend_function.fn_flags2 fields were added, given the primary flags were running out of bits. @@ -74,6 +75,48 @@ PHP 8.6 INTERNALS UPGRADE NOTES longer is a pointer, but a directly embedded HashTable struct. . Added a C23_ENUM() helper macro to define forward-compatible fixed-size enums. + . Extended php_stream_filter_ops with seek method. + . The INI_STR(), INI_INT(), INI_FLT(), and INI_BOOL() macros have been + removed. Instead new zend_ini_{bool|long|double|str|string}_literal() + macros have been added. This fixes an internal naming inconsistency as + "str" usually means zend_string*, and "string" means char*. + However INI_STR() returned a char* + . The INI_ORIG_{INT|STR|FLT|BOOL}() macros have been removed as they are + unused. If this behaviour is required fall back to the zend_ini_* + functions. + . The unused ZEND_AST_PARENT_PROPERTY_HOOK_CALL has been removed. + . ZEND_AST_METHOD_REFERENCE has been renamed to + ZEND_AST_TRAIT_METHOD_REFERENCE. + . The EMPTY_SWITCH_DEFAULT_CASE() macro has been removed. Use + default: ZEND_UNREACHABLE(); instead. + . Functions using zend_forbid_dynamic_call() *must* be flagged with + ZEND_ACC2_FORBID_DYN_CALLS (@forbid-dynamic-calls in stubs). In debug + builds, failing to include that flag will lead to assertion failures. + . The ZEND_RESULT_CODE type has been removed. Use zend_result directly. + . The zend_parse_parameters_none_throw(), zend_parse_parameters_throw(), + and ZEND_PARSE_PARAMS_THROW have been removed due to being misleading, + since ZPP always throws, unless ZEND_PARSE_PARAMS_QUIET is given. Use + the non-throw versions. + . The XtOffsetOf() alias of C’s offsetof() macro has been removed. Use + offsetof() directly. + . The deprecated Z_COPYABLE(), Z_COPYABLE_P(), Z_OPT_COPYABLE(), and + Z_OPT_COPYABLE_P() macros have been removed. Check for IS_ARRAY directly. + . The deprecated Z_IMMUTABLE(), Z_IMMUTABLE_P(), Z_OPT_IMMUTABLE(), and + Z_OPT_IMMUTABLE_P() macros have been removed. Check for + IS_ARRAY && !REFCOUNTED directly. + . The unused Z_GC_*() macros have been removed. Use the corresponding + GC_*() macro on the result of Z_COUNTED(). + . The zend_binary_zval_strcmp() and zend_binary_zval_strncmp() functions + have been removed, because they are unsafe by relying on the zvals + having a specific type. Use zend_binary_strcmp() / zend_binary_strncmp(), + string_compare_function() or similar instead. + . Added zend_fcall_info.consumed_args together with + zend_fci_consumed_arg(), which allows moving a selected callback argument + instead of copying it in zend_call_function(). Currently only a single + consumed argument is supported. + . Added ZEND_CONTAINER_OF(). + . The OPENBASEDIR_CHECKPATH() compatibility macro has been removed, instead + use php_check_open_basedir() directly. ======================== 2. Build system changes @@ -99,6 +142,8 @@ PHP 8.6 INTERNALS UPGRADE NOTES . --with-pic is now --enable-pic. The old flag will result in an error. . Symbol HAVE_ST_BLOCKS has been removed from php_config.h (use HAVE_STRUCT_STAT_ST_BLOCKS). + . Added a new configure option --disable-apache2-conf to prevent apxs from + editing httpd.conf during installation. - Windows build system changes: . Function SETUP_OPENSSL() doesn't accept 6th argument anymore and doesn't @@ -119,6 +164,7 @@ PHP 8.6 INTERNALS UPGRADE NOTES . Dropped session_options parameter from all methods in mysqlnd_auth. The same information is present in conn->options and should be used instead. + . Removed charsets plugin. - ext/session: . php_session_flush() now returns a bool rather than a zend_result. @@ -143,6 +189,11 @@ PHP 8.6 INTERNALS UPGRADE NOTES . _php_error_log_ex() has been removed. . php_mail()'s extra_cmd parameter is now a zend_string*. +- ext/uri: + . The value parameter of the php_uri_property_handler_write callback is now + const zval * instead of zval *, reflecting that write handlers must + not modify the input zval. + - ext/xml: . Removed the XML_ExpatVersion() libxml compatibility wrapper, as it was unused. diff --git a/Zend/LICENSE b/Zend/LICENSE deleted file mode 100644 index 51f5cccde950..000000000000 --- a/Zend/LICENSE +++ /dev/null @@ -1,56 +0,0 @@ --------------------------------------------------------------------- - The Zend Engine License, Version 2.00 -Copyright (c) 1999-2006 Zend Technologies Ltd. All rights reserved. --------------------------------------------------------------------- - -Redistribution and use in source and binary forms, with or without -modification, is permitted provided that the following conditions -are met: - - 1. Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - - 2. Redistributions in binary form must reproduce the above - copyright notice, this list of conditions and the following - disclaimer in the documentation and/or other materials provided - with the distribution. - - 3. The names "Zend" and "Zend Engine" must not be used to endorse - or promote products derived from this software without prior - permission from Zend Technologies Ltd. For written permission, - please contact license@zend.com. - - 4. Zend Technologies Ltd. may publish revised and/or new versions - of the license from time to time. Each version will be given a - distinguishing version number. - Once covered code has been published under a particular version - of the license, you may always continue to use it under the - terms of that version. You may also choose to use such covered - code under the terms of any subsequent version of the license - published by Zend Technologies Ltd. No one other than Zend - Technologies Ltd. has the right to modify the terms applicable - to covered code created under this License. - - 5. Redistributions of any form whatsoever must retain the following - acknowledgment: - "This product includes the Zend Engine, freely available at - http://www.zend.com" - - 6. All advertising materials mentioning features or use of this - software must display the following acknowledgment: - "The Zend Engine is freely available at http://www.zend.com" - -THIS SOFTWARE IS PROVIDED BY ZEND TECHNOLOGIES LTD. ``AS IS'' AND -ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, -THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A -PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL ZEND -TECHNOLOGIES LTD. BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF -USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND -ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, -OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT -OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF -SUCH DAMAGE. - --------------------------------------------------------------------- diff --git a/Zend/Optimizer/block_pass.c b/Zend/Optimizer/block_pass.c index 5a0af2630391..02c28ead33e1 100644 --- a/Zend/Optimizer/block_pass.c +++ b/Zend/Optimizer/block_pass.c @@ -2,15 +2,13 @@ +----------------------------------------------------------------------+ | Zend OPcache | +----------------------------------------------------------------------+ - | Copyright (c) The PHP Group | + | Copyright © The PHP Group and Contributors. | +----------------------------------------------------------------------+ - | This source file is subject to version 3.01 of the PHP license, | - | that is bundled with this package in the file LICENSE, and is | - | available through the world-wide-web at the following url: | - | https://www.php.net/license/3_01.txt | - | If you did not receive a copy of the PHP license and are unable to | - | obtain it through the world-wide-web, please send a note to | - | license@php.net so we can mail you a copy immediately. | + | This source file is subject to the Modified BSD License that is | + | bundled with this package in the file LICENSE, and is available | + | through the World Wide Web at . | + | | + | SPDX-License-Identifier: BSD-3-Clause | +----------------------------------------------------------------------+ | Authors: Andi Gutmans | | Zeev Suraski | @@ -346,59 +344,6 @@ static void zend_optimize_block(zend_basic_block *block, zend_op_array *op_array } break; -#if 0 - /* pre-evaluate functions: - constant(x) - function_exists(x) - extension_loaded(x) - BAD: interacts badly with Accelerator - */ - if((opline->op1_type & IS_VAR) && - VAR_SOURCE(opline->op1) && VAR_SOURCE(opline->op1)->opcode == ZEND_DO_CF_FCALL && - VAR_SOURCE(opline->op1)->extended_value == 1) { - zend_op *fcall = VAR_SOURCE(opline->op1); - zend_op *sv = fcall-1; - if(sv >= block->start_opline && sv->opcode == ZEND_SEND_VAL && - sv->op1_type == IS_CONST && Z_TYPE(OPLINE_OP1_LITERAL(sv)) == IS_STRING && - Z_LVAL(OPLINE_OP2_LITERAL(sv)) == 1 - ) { - zval *arg = &OPLINE_OP1_LITERAL(sv); - char *fname = FUNCTION_CACHE->funcs[Z_LVAL(ZEND_OP1_LITERAL(fcall))].function_name; - size_t flen = FUNCTION_CACHE->funcs[Z_LVAL(ZEND_OP1_LITERAL(fcall))].name_len; - if((flen == sizeof("function_exists")-1 && zend_binary_strcasecmp(fname, flen, "function_exists", sizeof("function_exists")-1) == 0) || - (flen == sizeof("is_callable")-1 && zend_binary_strcasecmp(fname, flen, "is_callable", sizeof("is_callable")-1) == 0) - ) { - zend_function *function; - if((function = zend_hash_find_ptr(EG(function_table), Z_STR_P(arg))) != NULL) { - literal_dtor(arg); - MAKE_NOP(sv); - MAKE_NOP(fcall); - LITERAL_BOOL(opline->op1, 1); - opline->op1_type = IS_CONST; - } - } else if(flen == sizeof("constant")-1 && zend_binary_strcasecmp(fname, flen, "constant", sizeof("constant")-1) == 0) { - zval c; - if (zend_optimizer_get_persistent_constant(Z_STR_P(arg), &c, true ELS_CC)) { - literal_dtor(arg); - MAKE_NOP(sv); - MAKE_NOP(fcall); - ZEND_OP1_LITERAL(opline) = zend_optimizer_add_literal(op_array, &c); - /* no copy ctor - get already copied it */ - opline->op1_type = IS_CONST; - } - } else if(flen == sizeof("extension_loaded")-1 && zend_binary_strcasecmp(fname, flen, "extension_loaded", sizeof("extension_loaded")-1) == 0) { - if(zend_hash_exists(&module_registry, Z_STR_P(arg))) { - literal_dtor(arg); - MAKE_NOP(sv); - MAKE_NOP(fcall); - LITERAL_BOOL(opline->op1, 1); - opline->op1_type = IS_CONST; - } - } - } - } -#endif - case ZEND_FETCH_LIST_R: case ZEND_FETCH_LIST_W: if (opline->op1_type & (IS_TMP_VAR|IS_VAR)) { @@ -1185,7 +1130,7 @@ static void assemble_code_blocks(const zend_cfg *cfg, zend_op_array *op_array, z /* rebuild map (just for printing) */ memset(cfg->map, -1, sizeof(int) * op_array->last); - for (int n = 0; n < cfg->blocks_count; n++) { + for (uint32_t n = 0; n < cfg->blocks_count; n++) { if (cfg->blocks[n].flags & (ZEND_BB_REACHABLE|ZEND_BB_UNREACHABLE_FREE)) { cfg->map[cfg->blocks[n].start] = n; } @@ -1493,7 +1438,7 @@ static void zend_jmp_optimization(zend_basic_block *block, zend_op_array *op_arr * defined. We won't apply some optimization patterns for such variables. */ static void zend_t_usage(const zend_cfg *cfg, const zend_op_array *op_array, zend_bitset used_ext, zend_optimizer_ctx *ctx) { - int n; + uint32_t n; zend_basic_block *block, *next_block; uint32_t var_num; uint32_t bitset_len; @@ -1697,11 +1642,10 @@ static void zend_t_usage(const zend_cfg *cfg, const zend_op_array *op_array, zen static void zend_merge_blocks(const zend_op_array *op_array, const zend_cfg *cfg, uint32_t *opt_count) { - int i; zend_basic_block *b, *bb; zend_basic_block *prev = NULL; - for (i = 0; i < cfg->blocks_count; i++) { + for (uint32_t i = 0; i < cfg->blocks_count; i++) { b = cfg->blocks + i; if (b->flags & ZEND_BB_REACHABLE) { if ((b->flags & ZEND_BB_FOLLOW) && diff --git a/Zend/Optimizer/compact_literals.c b/Zend/Optimizer/compact_literals.c index 447a034530e1..cf74dd8fc147 100644 --- a/Zend/Optimizer/compact_literals.c +++ b/Zend/Optimizer/compact_literals.c @@ -2,15 +2,13 @@ +----------------------------------------------------------------------+ | Zend OPcache | +----------------------------------------------------------------------+ - | Copyright (c) The PHP Group | + | Copyright © The PHP Group and Contributors. | +----------------------------------------------------------------------+ - | This source file is subject to version 3.01 of the PHP license, | - | that is bundled with this package in the file LICENSE, and is | - | available through the world-wide-web at the following url: | - | https://www.php.net/license/3_01.txt | - | If you did not receive a copy of the PHP license and are unable to | - | obtain it through the world-wide-web, please send a note to | - | license@php.net so we can mail you a copy immediately. | + | This source file is subject to the Modified BSD License that is | + | bundled with this package in the file LICENSE, and is available | + | through the World Wide Web at . | + | | + | SPDX-License-Identifier: BSD-3-Clause | +----------------------------------------------------------------------+ | Authors: Dmitry Stogov | | Xinchen Hui | diff --git a/Zend/Optimizer/compact_vars.c b/Zend/Optimizer/compact_vars.c index 9898714a17c5..b4a861d3595c 100644 --- a/Zend/Optimizer/compact_vars.c +++ b/Zend/Optimizer/compact_vars.c @@ -2,15 +2,13 @@ +----------------------------------------------------------------------+ | Zend Engine, Removing unused variables | +----------------------------------------------------------------------+ - | Copyright (c) The PHP Group | + | Copyright © The PHP Group and Contributors. | +----------------------------------------------------------------------+ - | This source file is subject to version 3.01 of the PHP license, | - | that is bundled with this package in the file LICENSE, and is | - | available through the world-wide-web at the following url: | - | https://www.php.net/license/3_01.txt | - | If you did not receive a copy of the PHP license and are unable to | - | obtain it through the world-wide-web, please send a note to | - | license@php.net so we can mail you a copy immediately. | + | This source file is subject to the Modified BSD License that is | + | bundled with this package in the file LICENSE, and is available | + | through the World Wide Web at . | + | | + | SPDX-License-Identifier: BSD-3-Clause | +----------------------------------------------------------------------+ | Authors: Nikita Popov | +----------------------------------------------------------------------+ diff --git a/Zend/Optimizer/dce.c b/Zend/Optimizer/dce.c index 6c5a885fba40..0780ac190cdd 100644 --- a/Zend/Optimizer/dce.c +++ b/Zend/Optimizer/dce.c @@ -2,15 +2,13 @@ +----------------------------------------------------------------------+ | Zend Engine, DCE - Dead Code Elimination | +----------------------------------------------------------------------+ - | Copyright (c) The PHP Group | + | Copyright © The PHP Group and Contributors. | +----------------------------------------------------------------------+ - | This source file is subject to version 3.01 of the PHP license, | - | that is bundled with this package in the file LICENSE, and is | - | available through the world-wide-web at the following url: | - | https://www.php.net/license/3_01.txt | - | If you did not receive a copy of the PHP license and are unable to | - | obtain it through the world-wide-web, please send a note to | - | license@php.net so we can mail you a copy immediately. | + | This source file is subject to the Modified BSD License that is | + | bundled with this package in the file LICENSE, and is available | + | through the World Wide Web at . | + | | + | SPDX-License-Identifier: BSD-3-Clause | +----------------------------------------------------------------------+ | Authors: Nikita Popov | | Dmitry Stogov | @@ -571,7 +569,7 @@ int dce_optimize_op_array(zend_op_array *op_array, zend_optimizer_ctx *optimizer } FOREACH_PHI_END(); /* Mark reachable instruction without side effects as dead */ - int b = ssa->cfg.blocks_count; + uint32_t b = ssa->cfg.blocks_count; while (b > 0) { int op_data = -1; diff --git a/Zend/Optimizer/dfa_pass.c b/Zend/Optimizer/dfa_pass.c index 796e998493d7..77dc322fbdec 100644 --- a/Zend/Optimizer/dfa_pass.c +++ b/Zend/Optimizer/dfa_pass.c @@ -2,15 +2,13 @@ +----------------------------------------------------------------------+ | Zend OPcache | +----------------------------------------------------------------------+ - | Copyright (c) The PHP Group | + | Copyright © The PHP Group and Contributors. | +----------------------------------------------------------------------+ - | This source file is subject to version 3.01 of the PHP license, | - | that is bundled with this package in the file LICENSE, and is | - | available through the world-wide-web at the following url: | - | https://www.php.net/license/3_01.txt | - | If you did not receive a copy of the PHP license and are unable to | - | obtain it through the world-wide-web, please send a note to | - | license@php.net so we can mail you a copy immediately. | + | This source file is subject to the Modified BSD License that is | + | bundled with this package in the file LICENSE, and is available | + | through the World Wide Web at . | + | | + | SPDX-License-Identifier: BSD-3-Clause | +----------------------------------------------------------------------+ | Authors: Dmitry Stogov | +----------------------------------------------------------------------+ @@ -398,13 +396,13 @@ static bool variable_defined_or_used_in_range(zend_ssa *ssa, int var, int start, return false; } -int zend_dfa_optimize_calls(zend_op_array *op_array, zend_ssa *ssa) +static uint32_t zend_dfa_optimize_calls(zend_op_array *op_array, zend_ssa *ssa) { - zend_func_info *func_info = ZEND_FUNC_INFO(op_array); - int removed_ops = 0; + const zend_func_info *func_info = ZEND_FUNC_INFO(op_array); + uint32_t removed_ops = 0; if (func_info->callee_info) { - zend_call_info *call_info = func_info->callee_info; + const zend_call_info *call_info = func_info->callee_info; do { zend_op *op = call_info->caller_init_opline; @@ -413,7 +411,6 @@ int zend_dfa_optimize_calls(zend_op_array *op_array, zend_ssa *ssa) || (op->opcode == ZEND_FRAMELESS_ICALL_3 && (op + 1)->op1_type == IS_CONST)) && call_info->callee_func && zend_string_equals_literal_ci(call_info->callee_func->common.function_name, "in_array")) { - bool strict = false; bool has_opdata = op->opcode == ZEND_FRAMELESS_ICALL_3; ZEND_ASSERT(!call_info->is_prototype); @@ -428,7 +425,7 @@ int zend_dfa_optimize_calls(zend_op_array *op_array, zend_ssa *ssa) && Z_TYPE_P(CT_CONSTANT_EX(op_array, op->op2.constant)) == IS_ARRAY) { bool ok = true; - HashTable *src = Z_ARRVAL_P(CT_CONSTANT_EX(op_array, op->op2.constant)); + const HashTable *src = Z_ARRVAL_P(CT_CONSTANT_EX(op_array, op->op2.constant)); HashTable *dst; zval *val, tmp; zend_ulong idx; @@ -479,7 +476,7 @@ int zend_dfa_optimize_calls(zend_op_array *op_array, zend_ssa *ssa) return removed_ops; } -static zend_always_inline void take_successor_0(zend_ssa *ssa, int block_num, zend_basic_block *block) +static zend_always_inline void take_successor_0(zend_ssa *ssa, uint32_t block_num, zend_basic_block *block) { if (block->successors_count == 2) { if (block->successors[1] != block->successors[0]) { @@ -489,7 +486,7 @@ static zend_always_inline void take_successor_0(zend_ssa *ssa, int block_num, ze } } -static zend_always_inline void take_successor_1(zend_ssa *ssa, int block_num, zend_basic_block *block) +static zend_always_inline void take_successor_1(zend_ssa *ssa, uint32_t block_num, zend_basic_block *block) { if (block->successors_count == 2) { if (block->successors[1] != block->successors[0]) { @@ -500,11 +497,9 @@ static zend_always_inline void take_successor_1(zend_ssa *ssa, int block_num, ze } } -static zend_always_inline void take_successor_ex(zend_ssa *ssa, int block_num, zend_basic_block *block, int target_block) +static zend_always_inline void take_successor_ex(zend_ssa *ssa, uint32_t block_num, zend_basic_block *block, int target_block) { - int i; - - for (i = 0; i < block->successors_count; i++) { + for (uint32_t i = 0; i < block->successors_count; i++) { if (block->successors[i] != target_block) { zend_ssa_remove_predecessor(ssa, block_num, block->successors[i]); } @@ -531,10 +526,9 @@ static void replace_predecessor(zend_ssa *ssa, int block_id, int old_pred, int n int *predecessors = &ssa->cfg.predecessors[block->predecessor_offset]; zend_ssa_phi *phi; - int i; int old_pred_idx = -1; int new_pred_idx = -1; - for (i = 0; i < block->predecessors_count; i++) { + for (uint32_t i = 0; i < block->predecessors_count; i++) { if (predecessors[i] == old_pred) { old_pred_idx = i; } @@ -582,10 +576,9 @@ static void zend_ssa_replace_control_link(zend_op_array *op_array, zend_ssa *ssa zend_basic_block *src = &ssa->cfg.blocks[from]; zend_basic_block *old = &ssa->cfg.blocks[to]; zend_basic_block *dst = &ssa->cfg.blocks[new_to]; - int i; zend_op *opline; - for (i = 0; i < src->successors_count; i++) { + for (uint32_t i = 0; i < src->successors_count; i++) { if (src->successors[i] == to) { src->successors[i] = new_to; } @@ -650,10 +643,10 @@ static void zend_ssa_replace_control_link(zend_op_array *op_array, zend_ssa *ssa replace_predecessor(ssa, new_to, to, from); } -static void zend_ssa_unlink_block(zend_op_array *op_array, zend_ssa *ssa, zend_basic_block *block, int block_num) +static void zend_ssa_unlink_block(zend_op_array *op_array, zend_ssa *ssa, zend_basic_block *block, uint32_t block_num) { if (block->predecessors_count == 1 && ssa->blocks[block_num].phis == NULL) { - int *predecessors, i; + int *predecessors; zend_basic_block *fe_fetch_block = NULL; ZEND_ASSERT(block->successors_count == 1); @@ -669,7 +662,7 @@ static void zend_ssa_unlink_block(zend_op_array *op_array, zend_ssa *ssa, zend_b } } } - for (i = 0; i < block->predecessors_count; i++) { + for (uint32_t i = 0; i < block->predecessors_count; i++) { zend_ssa_replace_control_link(op_array, ssa, predecessors[i], block_num, block->successors[0]); } zend_ssa_remove_block(op_array, ssa, block_num); @@ -686,7 +679,7 @@ static void zend_ssa_unlink_block(zend_op_array *op_array, zend_ssa *ssa, zend_b static int zend_dfa_optimize_jmps(zend_op_array *op_array, zend_ssa *ssa) { int removed_ops = 0; - int block_num = 0; + uint32_t block_num = 0; for (block_num = 1; block_num < ssa->cfg.blocks_count; block_num++) { zend_basic_block *block = &ssa->cfg.blocks[block_num]; @@ -706,7 +699,7 @@ static int zend_dfa_optimize_jmps(zend_op_array *op_array, zend_ssa *ssa) block_num++; } while (block_num < ssa->cfg.blocks_count) { - int next_block_num = block_num + 1; + uint32_t next_block_num = block_num + 1; zend_basic_block *block = &ssa->cfg.blocks[block_num]; uint32_t op_num; zend_op *opline; @@ -941,11 +934,13 @@ static int zend_dfa_optimize_jmps(zend_op_array *op_array, zend_ssa *ssa) if (block_num > 0) { zend_ssa_unlink_block(op_array, ssa, block, block_num); /* backtrack to previous basic block */ + int backtracking_block_num = block_num; do { - block_num--; - } while (block_num >= 0 - && !(ssa->cfg.blocks[block_num].flags & ZEND_BB_REACHABLE)); - if (block_num >= 0) { + backtracking_block_num--; + } while (backtracking_block_num >= 0 + && !(ssa->cfg.blocks[backtracking_block_num].flags & ZEND_BB_REACHABLE)); + if (backtracking_block_num >= 0) { + block_num = backtracking_block_num; continue; } } diff --git a/Zend/Optimizer/escape_analysis.c b/Zend/Optimizer/escape_analysis.c index 00ee32984502..8dbd6855d68d 100644 --- a/Zend/Optimizer/escape_analysis.c +++ b/Zend/Optimizer/escape_analysis.c @@ -2,15 +2,13 @@ +----------------------------------------------------------------------+ | Zend OPcache, Escape Analysis | +----------------------------------------------------------------------+ - | Copyright (c) The PHP Group | + | Copyright © The PHP Group and Contributors. | +----------------------------------------------------------------------+ - | This source file is subject to version 3.01 of the PHP license, | - | that is bundled with this package in the file LICENSE, and is | - | available through the world-wide-web at the following url: | - | https://www.php.net/license/3_01.txt | - | If you did not receive a copy of the PHP license and are unable to | - | obtain it through the world-wide-web, please send a note to | - | license@php.net so we can mail you a copy immediately. | + | This source file is subject to the Modified BSD License that is | + | bundled with this package in the file LICENSE, and is available | + | through the World Wide Web at . | + | | + | SPDX-License-Identifier: BSD-3-Clause | +----------------------------------------------------------------------+ | Authors: Dmitry Stogov | +----------------------------------------------------------------------+ @@ -78,7 +76,7 @@ static zend_result zend_build_equi_escape_sets(int *parent, zend_op_array *op_ar zend_ssa_var *ssa_vars = ssa->vars; int ssa_vars_count = ssa->vars_count; zend_ssa_phi *p; - int i, j; + int i; int *size; ALLOCA_FLAG(use_heap) @@ -94,7 +92,7 @@ static zend_result zend_build_equi_escape_sets(int *parent, zend_op_array *op_ar if (p->pi >= 0) { union_find_unite(parent, size, i, p->sources[0]); } else { - for (j = 0; j < ssa->cfg.blocks[p->block].predecessors_count; j++) { + for (uint32_t j = 0; j < ssa->cfg.blocks[p->block].predecessors_count; j++) { union_find_unite(parent, size, i, p->sources[j]); } } diff --git a/Zend/Optimizer/nop_removal.c b/Zend/Optimizer/nop_removal.c index 7de3919ee8cb..0a6a04fc4a9b 100644 --- a/Zend/Optimizer/nop_removal.c +++ b/Zend/Optimizer/nop_removal.c @@ -2,15 +2,13 @@ +----------------------------------------------------------------------+ | Zend OPcache | +----------------------------------------------------------------------+ - | Copyright (c) The PHP Group | + | Copyright © The PHP Group and Contributors. | +----------------------------------------------------------------------+ - | This source file is subject to version 3.01 of the PHP license, | - | that is bundled with this package in the file LICENSE, and is | - | available through the world-wide-web at the following url: | - | https://www.php.net/license/3_01.txt | - | If you did not receive a copy of the PHP license and are unable to | - | obtain it through the world-wide-web, please send a note to | - | license@php.net so we can mail you a copy immediately. | + | This source file is subject to the Modified BSD License that is | + | bundled with this package in the file LICENSE, and is available | + | through the World Wide Web at . | + | | + | SPDX-License-Identifier: BSD-3-Clause | +----------------------------------------------------------------------+ | Authors: Andi Gutmans | | Zeev Suraski | diff --git a/Zend/Optimizer/optimize_func_calls.c b/Zend/Optimizer/optimize_func_calls.c index 62b50464e87b..69c371207ddc 100644 --- a/Zend/Optimizer/optimize_func_calls.c +++ b/Zend/Optimizer/optimize_func_calls.c @@ -2,15 +2,13 @@ +----------------------------------------------------------------------+ | Zend OPcache | +----------------------------------------------------------------------+ - | Copyright (c) The PHP Group | + | Copyright © The PHP Group and Contributors. | +----------------------------------------------------------------------+ - | This source file is subject to version 3.01 of the PHP license, | - | that is bundled with this package in the file LICENSE, and is | - | available through the world-wide-web at the following url: | - | https://www.php.net/license/3_01.txt | - | If you did not receive a copy of the PHP license and are unable to | - | obtain it through the world-wide-web, please send a note to | - | license@php.net so we can mail you a copy immediately. | + | This source file is subject to the Modified BSD License that is | + | bundled with this package in the file LICENSE, and is available | + | through the World Wide Web at . | + | | + | SPDX-License-Identifier: BSD-3-Clause | +----------------------------------------------------------------------+ | Authors: Dmitry Stogov | | Xinchen Hui | diff --git a/Zend/Optimizer/optimize_temp_vars_5.c b/Zend/Optimizer/optimize_temp_vars_5.c index de0b189d5dca..6a5c99f4755b 100644 --- a/Zend/Optimizer/optimize_temp_vars_5.c +++ b/Zend/Optimizer/optimize_temp_vars_5.c @@ -2,15 +2,13 @@ +----------------------------------------------------------------------+ | Zend OPcache | +----------------------------------------------------------------------+ - | Copyright (c) The PHP Group | + | Copyright © The PHP Group and Contributors. | +----------------------------------------------------------------------+ - | This source file is subject to version 3.01 of the PHP license, | - | that is bundled with this package in the file LICENSE, and is | - | available through the world-wide-web at the following url: | - | https://www.php.net/license/3_01.txt | - | If you did not receive a copy of the PHP license and are unable to | - | obtain it through the world-wide-web, please send a note to | - | license@php.net so we can mail you a copy immediately. | + | This source file is subject to the Modified BSD License that is | + | bundled with this package in the file LICENSE, and is available | + | through the World Wide Web at . | + | | + | SPDX-License-Identifier: BSD-3-Clause | +----------------------------------------------------------------------+ | Authors: Andi Gutmans | | Zeev Suraski | diff --git a/Zend/Optimizer/pass1.c b/Zend/Optimizer/pass1.c index 4be966c25d89..962bdb6e4be3 100644 --- a/Zend/Optimizer/pass1.c +++ b/Zend/Optimizer/pass1.c @@ -2,15 +2,13 @@ +----------------------------------------------------------------------+ | Zend OPcache | +----------------------------------------------------------------------+ - | Copyright (c) The PHP Group | + | Copyright © The PHP Group and Contributors. | +----------------------------------------------------------------------+ - | This source file is subject to version 3.01 of the PHP license, | - | that is bundled with this package in the file LICENSE, and is | - | available through the world-wide-web at the following url: | - | https://www.php.net/license/3_01.txt | - | If you did not receive a copy of the PHP license and are unable to | - | obtain it through the world-wide-web, please send a note to | - | license@php.net so we can mail you a copy immediately. | + | This source file is subject to the Modified BSD License that is | + | bundled with this package in the file LICENSE, and is available | + | through the World Wide Web at . | + | | + | SPDX-License-Identifier: BSD-3-Clause | +----------------------------------------------------------------------+ | Authors: Andi Gutmans | | Zeev Suraski | diff --git a/Zend/Optimizer/pass3.c b/Zend/Optimizer/pass3.c index 5c31de7bc49c..2d2a44685226 100644 --- a/Zend/Optimizer/pass3.c +++ b/Zend/Optimizer/pass3.c @@ -2,15 +2,13 @@ +----------------------------------------------------------------------+ | Zend OPcache | +----------------------------------------------------------------------+ - | Copyright (c) The PHP Group | + | Copyright © The PHP Group and Contributors. | +----------------------------------------------------------------------+ - | This source file is subject to version 3.01 of the PHP license, | - | that is bundled with this package in the file LICENSE, and is | - | available through the world-wide-web at the following url: | - | https://www.php.net/license/3_01.txt | - | If you did not receive a copy of the PHP license and are unable to | - | obtain it through the world-wide-web, please send a note to | - | license@php.net so we can mail you a copy immediately. | + | This source file is subject to the Modified BSD License that is | + | bundled with this package in the file LICENSE, and is available | + | through the World Wide Web at . | + | | + | SPDX-License-Identifier: BSD-3-Clause | +----------------------------------------------------------------------+ | Authors: Andi Gutmans | | Zeev Suraski | diff --git a/Zend/Optimizer/sccp.c b/Zend/Optimizer/sccp.c index 60afe3165f77..ba94e9b7b91f 100644 --- a/Zend/Optimizer/sccp.c +++ b/Zend/Optimizer/sccp.c @@ -2,15 +2,13 @@ +----------------------------------------------------------------------+ | Zend Engine, SCCP - Sparse Conditional Constant Propagation | +----------------------------------------------------------------------+ - | Copyright (c) The PHP Group | + | Copyright © The PHP Group and Contributors. | +----------------------------------------------------------------------+ - | This source file is subject to version 3.01 of the PHP license, | - | that is bundled with this package in the file LICENSE, and is | - | available through the world-wide-web at the following url: | - | https://www.php.net/license/3_01.txt | - | If you did not receive a copy of the PHP license and are unable to | - | obtain it through the world-wide-web, please send a note to | - | license@php.net so we can mail you a copy immediately. | + | This source file is subject to the Modified BSD License that is | + | bundled with this package in the file LICENSE, and is available | + | through the World Wide Web at . | + | | + | SPDX-License-Identifier: BSD-3-Clause | +----------------------------------------------------------------------+ | Authors: Nikita Popov | | Dmitry Stogov | @@ -1596,7 +1594,7 @@ static void sccp_visit_instr(scdf_ctx *scdf, zend_op *opline, zend_ssa_op *ssa_o case ZEND_SHORT_CIRCUITING_CHAIN_EMPTY: ZVAL_TRUE(&zv); break; - EMPTY_SWITCH_DEFAULT_CASE() + default: ZEND_UNREACHABLE(); } SET_RESULT(result, &zv); break; @@ -1832,7 +1830,7 @@ static void sccp_mark_feasible_successors( zend_op *opline, zend_ssa_op *ssa_op) { sccp_ctx *ctx = (sccp_ctx *) scdf; zval *op1, zv; - int s; + uint32_t s; /* We can't determine the branch target at compile-time for these */ switch (opline->opcode) { @@ -2049,7 +2047,6 @@ static void sccp_visit_phi(scdf_ctx *scdf, const zend_ssa_phi *phi) { zend_basic_block *block = &ssa->cfg.blocks[phi->block]; int *predecessors = &ssa->cfg.predecessors[block->predecessor_offset]; - int i; zval result; MAKE_TOP(&result); #if SCP_DEBUG @@ -2061,7 +2058,7 @@ static void sccp_visit_phi(scdf_ctx *scdf, const zend_ssa_phi *phi) { join_phi_values(&result, &ctx->values[phi->sources[0]], ssa->vars[phi->ssa_var].escape_state != ESCAPE_STATE_NO_ESCAPE); } } else { - for (i = 0; i < block->predecessors_count; i++) { + for (uint32_t i = 0; i < block->predecessors_count; i++) { ZEND_ASSERT(phi->sources[i] >= 0); if (scdf_is_edge_feasible(scdf, predecessors[i], phi->block)) { #if SCP_DEBUG diff --git a/Zend/Optimizer/scdf.c b/Zend/Optimizer/scdf.c index e5c40b8c90cf..31f40a7ed9f9 100644 --- a/Zend/Optimizer/scdf.c +++ b/Zend/Optimizer/scdf.c @@ -2,15 +2,13 @@ +----------------------------------------------------------------------+ | Zend Engine, Sparse Conditional Data Flow Propagation Framework | +----------------------------------------------------------------------+ - | Copyright (c) The PHP Group | + | Copyright © The PHP Group and Contributors. | +----------------------------------------------------------------------+ - | This source file is subject to version 3.01 of the PHP license, | - | that is bundled with this package in the file LICENSE, and is | - | available through the world-wide-web at the following url: | - | https://www.php.net/license/3_01.txt | - | If you did not receive a copy of the PHP license and are unable to | - | obtain it through the world-wide-web, please send a note to | - | license@php.net so we can mail you a copy immediately. | + | This source file is subject to the Modified BSD License that is | + | bundled with this package in the file LICENSE, and is available | + | through the World Wide Web at . | + | | + | SPDX-License-Identifier: BSD-3-Clause | +----------------------------------------------------------------------+ | Authors: Nikita Popov | +----------------------------------------------------------------------+ @@ -254,9 +252,8 @@ static uint32_t cleanup_loop_var_free_block(const scdf_ctx *scdf, const zend_bas * unreachable. Blocks already marked unreachable are not removed. */ uint32_t scdf_remove_unreachable_blocks(const scdf_ctx *scdf) { zend_ssa *ssa = scdf->ssa; - int i; uint32_t removed_ops = 0; - for (i = 0; i < ssa->cfg.blocks_count; i++) { + for (uint32_t i = 0; i < ssa->cfg.blocks_count; i++) { const zend_basic_block *block = &ssa->cfg.blocks[i]; if (!zend_bitset_in(scdf->executable_blocks, i) && (block->flags & ZEND_BB_REACHABLE)) { if (!kept_alive_by_loop_var_free(scdf, block)) { diff --git a/Zend/Optimizer/scdf.h b/Zend/Optimizer/scdf.h index 49222880f22b..d7bee4b73816 100644 --- a/Zend/Optimizer/scdf.h +++ b/Zend/Optimizer/scdf.h @@ -2,15 +2,13 @@ +----------------------------------------------------------------------+ | Zend Engine, Call Graph | +----------------------------------------------------------------------+ - | Copyright (c) The PHP Group | + | Copyright © The PHP Group and Contributors. | +----------------------------------------------------------------------+ - | This source file is subject to version 3.01 of the PHP license, | - | that is bundled with this package in the file LICENSE, and is | - | available through the world-wide-web at the following url: | - | https://www.php.net/license/3_01.txt | - | If you did not receive a copy of the PHP license and are unable to | - | obtain it through the world-wide-web, please send a note to | - | license@php.net so we can mail you a copy immediately. | + | This source file is subject to the Modified BSD License that is | + | bundled with this package in the file LICENSE, and is available | + | through the World Wide Web at . | + | | + | SPDX-License-Identifier: BSD-3-Clause | +----------------------------------------------------------------------+ | Authors: Nikita Popov | +----------------------------------------------------------------------+ @@ -75,11 +73,10 @@ static inline void scdf_add_def_to_worklist(const scdf_ctx *scdf, int var_num) { } } -static inline uint32_t scdf_edge(const zend_cfg *cfg, int from, int to) { +static inline uint32_t scdf_edge(const zend_cfg *cfg, int from, uint32_t to) { const zend_basic_block *to_block = cfg->blocks + to; - int i; - for (i = 0; i < to_block->predecessors_count; i++) { + for (uint32_t i = 0; i < to_block->predecessors_count; i++) { uint32_t edge = to_block->predecessor_offset + i; if (cfg->predecessors[edge] == from) { @@ -89,7 +86,7 @@ static inline uint32_t scdf_edge(const zend_cfg *cfg, int from, int to) { ZEND_UNREACHABLE(); } -static inline bool scdf_is_edge_feasible(const scdf_ctx *scdf, int from, int to) { +static inline bool scdf_is_edge_feasible(const scdf_ctx *scdf, int from, uint32_t to) { uint32_t edge = scdf_edge(&scdf->ssa->cfg, from, to); return zend_bitset_in(scdf->feasible_edges, edge); } diff --git a/Zend/Optimizer/ssa_integrity.c b/Zend/Optimizer/ssa_integrity.c index 793fb1c06c8b..34a2b3a9ef64 100644 --- a/Zend/Optimizer/ssa_integrity.c +++ b/Zend/Optimizer/ssa_integrity.c @@ -2,15 +2,13 @@ +----------------------------------------------------------------------+ | Zend Engine, SSA validation | +----------------------------------------------------------------------+ - | Copyright (c) The PHP Group | + | Copyright © The PHP Group and Contributors. | +----------------------------------------------------------------------+ - | This source file is subject to version 3.01 of the PHP license, | - | that is bundled with this package in the file LICENSE, and is | - | available through the world-wide-web at the following url: | - | https://www.php.net/license/3_01.txt | - | If you did not receive a copy of the PHP license and are unable to | - | obtain it through the world-wide-web, please send a note to | - | license@php.net so we can mail you a copy immediately. | + | This source file is subject to the Modified BSD License that is | + | bundled with this package in the file LICENSE, and is available | + | through the World Wide Web at . | + | | + | SPDX-License-Identifier: BSD-3-Clause | +----------------------------------------------------------------------+ | Authors: Nikita Popov | +----------------------------------------------------------------------+ @@ -66,8 +64,8 @@ static inline bool is_in_phi_sources(zend_ssa *ssa, zend_ssa_phi *phi, int check } static inline bool is_in_predecessors(zend_cfg *cfg, zend_basic_block *block, int check) { - int i, *predecessors = &cfg->predecessors[block->predecessor_offset]; - for (i = 0; i < block->predecessors_count; i++) { + int *predecessors = &cfg->predecessors[block->predecessor_offset]; + for (uint32_t i = 0; i < block->predecessors_count; i++) { if (predecessors[i] == check) { return true; } @@ -76,8 +74,7 @@ static inline bool is_in_predecessors(zend_cfg *cfg, zend_basic_block *block, in } static inline bool is_in_successors(zend_basic_block *block, int check) { - int s; - for (s = 0; s < block->successors_count; s++) { + for (uint32_t s = 0; s < block->successors_count; s++) { if (block->successors[s] == check) { return true; } @@ -329,7 +326,7 @@ void ssa_verify_integrity(zend_op_array *op_array, zend_ssa *ssa, const char *ex /* Phis */ FOREACH_PHI(phi) { - unsigned num_sources = NUM_PHI_SOURCES(phi); + uint32_t num_sources = NUM_PHI_SOURCES(phi); for (i = 0; i < num_sources; i++) { int source = phi->sources[i]; if (source < 0) { @@ -360,7 +357,7 @@ void ssa_verify_integrity(zend_op_array *op_array, zend_ssa *ssa, const char *ex for (i = 0; i < cfg->blocks_count; i++) { zend_basic_block *block = &cfg->blocks[i]; int *predecessors = &cfg->predecessors[block->predecessor_offset]; - int s, j; + uint32_t j; if (i != 0 && block->start < (block-1)->start + (block-1)->len) { FAIL("Block %d start %d smaller previous end %d\n", @@ -384,7 +381,7 @@ void ssa_verify_integrity(zend_op_array *op_array, zend_ssa *ssa, const char *ex continue; } - for (s = 0; s < block->successors_count; s++) { + for (uint32_t s = 0; s < block->successors_count; s++) { zend_basic_block *next_block; if (block->successors[s] < 0) { FAIL("Successor number %d of %d negative", s, i); @@ -400,7 +397,6 @@ void ssa_verify_integrity(zend_op_array *op_array, zend_ssa *ssa, const char *ex for (j = 0; j < block->predecessors_count; j++) { if (predecessors[j] >= 0) { - int k; zend_basic_block *prev_block = &cfg->blocks[predecessors[j]]; if (!(prev_block->flags & ZEND_BB_REACHABLE)) { FAIL("Predecessor %d of %d not reachable\n", predecessors[j], i); @@ -408,7 +404,7 @@ void ssa_verify_integrity(zend_op_array *op_array, zend_ssa *ssa, const char *ex if (!is_in_successors(prev_block, i)) { FAIL("Block %d successors missing %d\n", predecessors[j], i); } - for (k = 0; k < block->predecessors_count; k++) { + for (uint32_t k = 0; k < block->predecessors_count; k++) { if (k != j && predecessors[k] == predecessors[j]) { FAIL("Block %d has duplicate predecessor %d\n", i, predecessors[j]); } diff --git a/Zend/Optimizer/zend_call_graph.c b/Zend/Optimizer/zend_call_graph.c index 884b481aceb8..bb80e21a2465 100644 --- a/Zend/Optimizer/zend_call_graph.c +++ b/Zend/Optimizer/zend_call_graph.c @@ -2,15 +2,13 @@ +----------------------------------------------------------------------+ | Zend Engine, Call Graph | +----------------------------------------------------------------------+ - | Copyright (c) The PHP Group | + | Copyright © The PHP Group and Contributors. | +----------------------------------------------------------------------+ - | This source file is subject to version 3.01 of the PHP license, | - | that is bundled with this package in the file LICENSE, and is | - | available through the world-wide-web at the following url: | - | https://www.php.net/license/3_01.txt | - | If you did not receive a copy of the PHP license and are unable to | - | obtain it through the world-wide-web, please send a note to | - | license@php.net so we can mail you a copy immediately. | + | This source file is subject to the Modified BSD License that is | + | bundled with this package in the file LICENSE, and is available | + | through the World Wide Web at . | + | | + | SPDX-License-Identifier: BSD-3-Clause | +----------------------------------------------------------------------+ | Authors: Dmitry Stogov | +----------------------------------------------------------------------+ diff --git a/Zend/Optimizer/zend_call_graph.h b/Zend/Optimizer/zend_call_graph.h index 8810dc1a560e..57c6bdffe998 100644 --- a/Zend/Optimizer/zend_call_graph.h +++ b/Zend/Optimizer/zend_call_graph.h @@ -2,15 +2,13 @@ +----------------------------------------------------------------------+ | Zend Engine, Call Graph | +----------------------------------------------------------------------+ - | Copyright (c) The PHP Group | + | Copyright © The PHP Group and Contributors. | +----------------------------------------------------------------------+ - | This source file is subject to version 3.01 of the PHP license, | - | that is bundled with this package in the file LICENSE, and is | - | available through the world-wide-web at the following url: | - | https://www.php.net/license/3_01.txt | - | If you did not receive a copy of the PHP license and are unable to | - | obtain it through the world-wide-web, please send a note to | - | license@php.net so we can mail you a copy immediately. | + | This source file is subject to the Modified BSD License that is | + | bundled with this package in the file LICENSE, and is available | + | through the World Wide Web at . | + | | + | SPDX-License-Identifier: BSD-3-Clause | +----------------------------------------------------------------------+ | Authors: Dmitry Stogov | +----------------------------------------------------------------------+ diff --git a/Zend/Optimizer/zend_cfg.c b/Zend/Optimizer/zend_cfg.c index 32d5f49ef7df..837515169d70 100644 --- a/Zend/Optimizer/zend_cfg.c +++ b/Zend/Optimizer/zend_cfg.c @@ -2,15 +2,13 @@ +----------------------------------------------------------------------+ | Zend Engine, CFG - Control Flow Graph | +----------------------------------------------------------------------+ - | Copyright (c) The PHP Group | + | Copyright © The PHP Group and Contributors. | +----------------------------------------------------------------------+ - | This source file is subject to version 3.01 of the PHP license, | - | that is bundled with this package in the file LICENSE, and is | - | available through the world-wide-web at the following url: | - | https://www.php.net/license/3_01.txt | - | If you did not receive a copy of the PHP license and are unable to | - | obtain it through the world-wide-web, please send a note to | - | license@php.net so we can mail you a copy immediately. | + | This source file is subject to the Modified BSD License that is | + | bundled with this package in the file LICENSE, and is available | + | through the World Wide Web at . | + | | + | SPDX-License-Identifier: BSD-3-Clause | +----------------------------------------------------------------------+ | Authors: Dmitry Stogov | +----------------------------------------------------------------------+ @@ -35,7 +33,6 @@ static void zend_mark_reachable(zend_op *opcodes, zend_cfg *cfg, zend_basic_bloc zend_worklist_push(&work, b - cfg->blocks); while (zend_worklist_len(&work)) { - int i; b = cfg->blocks + zend_worklist_pop(&work); b->flags |= ZEND_BB_REACHABLE; @@ -44,7 +41,7 @@ static void zend_mark_reachable(zend_op *opcodes, zend_cfg *cfg, zend_basic_bloc continue; } - for (i = 0; i < b->successors_count; i++) { + for (uint32_t i = 0; i < b->successors_count; i++) { zend_basic_block *succ = blocks + b->successors[i]; if (b->len != 0) { @@ -104,7 +101,7 @@ static void zend_mark_reachable(zend_op *opcodes, zend_cfg *cfg, zend_basic_bloc } /* }}} */ -static void zend_mark_reachable_blocks(const zend_op_array *op_array, zend_cfg *cfg, int start) /* {{{ */ +static void zend_mark_reachable_blocks(const zend_op_array *op_array, zend_cfg *cfg, uint32_t start) /* {{{ */ { zend_basic_block *blocks = cfg->blocks; @@ -113,14 +110,14 @@ static void zend_mark_reachable_blocks(const zend_op_array *op_array, zend_cfg * if (op_array->last_try_catch) { zend_basic_block *b; - int j, changed; + int changed; uint32_t *block_map = cfg->map; do { changed = 0; /* Add exception paths */ - for (j = 0; j < op_array->last_try_catch; j++) { + for (uint32_t j = 0; j < op_array->last_try_catch; j++) { /* check for jumps into the middle of try block */ b = blocks + block_map[op_array->try_catch_array[j].try_op]; @@ -202,7 +199,6 @@ static void zend_mark_reachable_blocks(const zend_op_array *op_array, zend_cfg * if (cfg->flags & ZEND_FUNC_FREE_LOOP_VAR) { zend_basic_block *b; - int j; uint32_t *block_map = cfg->map; /* Mark blocks that are unreachable, but free a loop var created in a reachable block. */ @@ -211,7 +207,7 @@ static void zend_mark_reachable_blocks(const zend_op_array *op_array, zend_cfg * continue; } - for (j = b->start; j < b->start + b->len; j++) { + for (uint32_t j = b->start; j < b->start + b->len; j++) { zend_op *opline = &op_array->opcodes[j]; if (zend_optimizer_is_loop_var_free(opline)) { zend_op *def_opline = zend_optimizer_get_loop_var_def(op_array, opline); @@ -232,8 +228,8 @@ static void zend_mark_reachable_blocks(const zend_op_array *op_array, zend_cfg * void zend_cfg_remark_reachable_blocks(const zend_op_array *op_array, zend_cfg *cfg) /* {{{ */ { zend_basic_block *blocks = cfg->blocks; - int i; - int start = 0; + uint32_t i; + uint32_t start = 0; for (i = 0; i < cfg->blocks_count; i++) { if (blocks[i].flags & ZEND_BB_REACHABLE) { @@ -593,13 +589,12 @@ ZEND_API void zend_build_cfg(zend_arena **arena, const zend_op_array *op_array, ZEND_API void zend_cfg_build_predecessors(zend_arena **arena, zend_cfg *cfg) /* {{{ */ { - int j, s, edges; zend_basic_block *b; zend_basic_block *blocks = cfg->blocks; zend_basic_block *end = blocks + cfg->blocks_count; + uint32_t edges = 0; int *predecessors; - edges = 0; for (b = blocks; b < end; b++) { b->predecessors_count = 0; } @@ -608,7 +603,7 @@ ZEND_API void zend_cfg_build_predecessors(zend_arena **arena, zend_cfg *cfg) /* b->successors_count = 0; b->predecessors_count = 0; } else { - for (s = 0; s < b->successors_count; s++) { + for (uint32_t s = 0; s < b->successors_count; s++) { edges++; blocks[b->successors[s]].predecessors_count++; } @@ -627,14 +622,13 @@ ZEND_API void zend_cfg_build_predecessors(zend_arena **arena, zend_cfg *cfg) /* } } - for (j = 0; j < cfg->blocks_count; j++) { + for (uint32_t j = 0; j < cfg->blocks_count; j++) { if (blocks[j].flags & ZEND_BB_REACHABLE) { /* SWITCH_STRING/LONG may have few identical successors */ - for (s = 0; s < blocks[j].successors_count; s++) { + for (uint32_t s = 0; s < blocks[j].successors_count; s++) { int duplicate = 0; - int p; - for (p = 0; p < s; p++) { + for (uint32_t p = 0; p < s; p++) { if (blocks[j].successors[p] == blocks[j].successors[s]) { duplicate = 1; break; @@ -654,16 +648,15 @@ ZEND_API void zend_cfg_build_predecessors(zend_arena **arena, zend_cfg *cfg) /* /* Computes a postorder numbering of the CFG */ static void compute_postnum_recursive( - int *postnum, int *cur, const zend_cfg *cfg, int block_num) /* {{{ */ + int *postnum, uint32_t *cur, const zend_cfg *cfg, int block_num) /* {{{ */ { - int s; zend_basic_block *block = &cfg->blocks[block_num]; if (postnum[block_num] != -1) { return; } postnum[block_num] = -2; /* Marker for "currently visiting" */ - for (s = 0; s < block->successors_count; s++) { + for (uint32_t s = 0; s < block->successors_count; s++) { compute_postnum_recursive(postnum, cur, cfg, block->successors[s]); } postnum[block_num] = (*cur)++; @@ -675,8 +668,9 @@ static void compute_postnum_recursive( ZEND_API void zend_cfg_compute_dominators_tree(const zend_op_array *op_array, zend_cfg *cfg) /* {{{ */ { zend_basic_block *blocks = cfg->blocks; - int blocks_count = cfg->blocks_count; - int j, k, changed; + uint32_t blocks_count = cfg->blocks_count; + uint32_t j; + int changed; if (cfg->blocks_count == 1) { blocks[0].level = 0; @@ -700,7 +694,7 @@ ZEND_API void zend_cfg_compute_dominators_tree(const zend_op_array *op_array, ze if ((blocks[j].flags & ZEND_BB_REACHABLE) == 0) { continue; } - for (k = 0; k < blocks[j].predecessors_count; k++) { + for (uint32_t k = 0; k < blocks[j].predecessors_count; k++) { int pred = cfg->predecessors[blocks[j].predecessor_offset + k]; if (blocks[pred].idom >= 0) { @@ -776,7 +770,7 @@ static bool dominates(zend_basic_block *blocks, int a, int b) /* {{{ */ ZEND_API void zend_cfg_identify_loops(const zend_op_array *op_array, zend_cfg *cfg) /* {{{ */ { - int i, j, k, n; + int i, j, n; int time; zend_basic_block *blocks = cfg->blocks; int *entry_times, *exit_times; @@ -890,7 +884,7 @@ ZEND_API void zend_cfg_identify_loops(const zend_op_array *op_array, zend_cfg *c continue; } blocks[j].loop_header = i; - for (k = 0; k < blocks[j].predecessors_count; k++) { + for (uint32_t k = 0; k < blocks[j].predecessors_count; k++) { zend_worklist_push(&work, cfg->predecessors[blocks[j].predecessor_offset + k]); } } diff --git a/Zend/Optimizer/zend_cfg.h b/Zend/Optimizer/zend_cfg.h index 1f3885f511f5..3ed635ecdedc 100644 --- a/Zend/Optimizer/zend_cfg.h +++ b/Zend/Optimizer/zend_cfg.h @@ -2,15 +2,13 @@ +----------------------------------------------------------------------+ | Zend Engine, CFG - Control Flow Graph | +----------------------------------------------------------------------+ - | Copyright (c) The PHP Group | + | Copyright © The PHP Group and Contributors. | +----------------------------------------------------------------------+ - | This source file is subject to version 3.01 of the PHP license, | - | that is bundled with this package in the file LICENSE, and is | - | available through the world-wide-web at the following url: | - | https://www.php.net/license/3_01.txt | - | If you did not receive a copy of the PHP license and are unable to | - | obtain it through the world-wide-web, please send a note to | - | license@php.net so we can mail you a copy immediately. | + | This source file is subject to the Modified BSD License that is | + | bundled with this package in the file LICENSE, and is available | + | through the World Wide Web at . | + | | + | SPDX-License-Identifier: BSD-3-Clause | +----------------------------------------------------------------------+ | Authors: Dmitry Stogov | +----------------------------------------------------------------------+ @@ -44,8 +42,8 @@ typedef struct _zend_basic_block { uint32_t flags; uint32_t start; /* first opcode number */ uint32_t len; /* number of opcodes */ - int successors_count; /* number of successors */ - int predecessors_count; /* number of predecessors */ + uint32_t successors_count; /* number of successors */ + uint32_t predecessors_count; /* number of predecessors */ int predecessor_offset; /* offset of 1-st predecessor, or -1 */ int idom; /* immediate dominator block, or -1 */ int loop_header; /* closest loop header, or -1 */ @@ -82,8 +80,8 @@ typedef struct _zend_basic_block { */ typedef struct _zend_cfg { - int blocks_count; /* number of basic blocks */ - int edges_count; /* number of edges */ + uint32_t blocks_count; /* number of basic blocks */ + uint32_t edges_count; /* number of edges */ zend_basic_block *blocks; /* array of basic blocks */ int *predecessors; uint32_t *map; diff --git a/Zend/Optimizer/zend_dfg.c b/Zend/Optimizer/zend_dfg.c index c14d67e873a2..72e15693a844 100644 --- a/Zend/Optimizer/zend_dfg.c +++ b/Zend/Optimizer/zend_dfg.c @@ -2,15 +2,13 @@ +----------------------------------------------------------------------+ | Zend Engine, DFG - Data Flow Graph | +----------------------------------------------------------------------+ - | Copyright (c) The PHP Group | + | Copyright © The PHP Group and Contributors. | +----------------------------------------------------------------------+ - | This source file is subject to version 3.01 of the PHP license, | - | that is bundled with this package in the file LICENSE, and is | - | available through the world-wide-web at the following url: | - | https://www.php.net/license/3_01.txt | - | If you did not receive a copy of the PHP license and are unable to | - | obtain it through the world-wide-web, please send a note to | - | license@php.net so we can mail you a copy immediately. | + | This source file is subject to the Modified BSD License that is | + | bundled with this package in the file LICENSE, and is available | + | through the World Wide Web at . | + | | + | SPDX-License-Identifier: BSD-3-Clause | +----------------------------------------------------------------------+ | Authors: Dmitry Stogov | +----------------------------------------------------------------------+ @@ -253,10 +251,9 @@ void zend_build_dfg(const zend_op_array *op_array, const zend_cfg *cfg, const ze { uint32_t set_size = dfg->size; zend_basic_block *blocks = cfg->blocks; - int blocks_count = cfg->blocks_count; + uint32_t blocks_count = cfg->blocks_count; zend_bitset tmp, def, use, in, out; - int k; - int j; + uint32_t j; tmp = dfg->tmp; def = dfg->def; @@ -305,7 +302,7 @@ void zend_build_dfg(const zend_op_array *op_array, const zend_cfg *cfg, const ze } if (blocks[j].successors_count != 0) { zend_bitset_copy(DFG_BITSET(out, set_size, j), DFG_BITSET(in, set_size, blocks[j].successors[0]), set_size); - for (k = 1; k < blocks[j].successors_count; k++) { + for (uint32_t k = 1; k < blocks[j].successors_count; k++) { zend_bitset_union(DFG_BITSET(out, set_size, j), DFG_BITSET(in, set_size, blocks[j].successors[k]), set_size); } } else { @@ -318,7 +315,7 @@ void zend_build_dfg(const zend_op_array *op_array, const zend_cfg *cfg, const ze /* Add predecessors of changed block to worklist */ { const int *predecessors = &cfg->predecessors[blocks[j].predecessor_offset]; - for (k = 0; k < blocks[j].predecessors_count; k++) { + for (uint32_t k = 0; k < blocks[j].predecessors_count; k++) { zend_bitset_incl(worklist, predecessors[k]); } } diff --git a/Zend/Optimizer/zend_dfg.h b/Zend/Optimizer/zend_dfg.h index af3d761ba29f..464ea6bb2ebe 100644 --- a/Zend/Optimizer/zend_dfg.h +++ b/Zend/Optimizer/zend_dfg.h @@ -2,15 +2,13 @@ +----------------------------------------------------------------------+ | Zend Engine, DFG - Data Flow Graph | +----------------------------------------------------------------------+ - | Copyright (c) The PHP Group | + | Copyright © The PHP Group and Contributors. | +----------------------------------------------------------------------+ - | This source file is subject to version 3.01 of the PHP license, | - | that is bundled with this package in the file LICENSE, and is | - | available through the world-wide-web at the following url: | - | https://www.php.net/license/3_01.txt | - | If you did not receive a copy of the PHP license and are unable to | - | obtain it through the world-wide-web, please send a note to | - | license@php.net so we can mail you a copy immediately. | + | This source file is subject to the Modified BSD License that is | + | bundled with this package in the file LICENSE, and is available | + | through the World Wide Web at . | + | | + | SPDX-License-Identifier: BSD-3-Clause | +----------------------------------------------------------------------+ | Authors: Dmitry Stogov | +----------------------------------------------------------------------+ diff --git a/Zend/Optimizer/zend_dump.c b/Zend/Optimizer/zend_dump.c index 16cb75188242..c6cc5193b2dc 100644 --- a/Zend/Optimizer/zend_dump.c +++ b/Zend/Optimizer/zend_dump.c @@ -2,15 +2,13 @@ +----------------------------------------------------------------------+ | Zend Engine, Bytecode Visualisation | +----------------------------------------------------------------------+ - | Copyright (c) The PHP Group | + | Copyright © The PHP Group and Contributors. | +----------------------------------------------------------------------+ - | This source file is subject to version 3.01 of the PHP license, | - | that is bundled with this package in the file LICENSE, and is | - | available through the world-wide-web at the following url: | - | https://www.php.net/license/3_01.txt | - | If you did not receive a copy of the PHP license and are unable to | - | obtain it through the world-wide-web, please send a note to | - | license@php.net so we can mail you a copy immediately. | + | This source file is subject to the Modified BSD License that is | + | bundled with this package in the file LICENSE, and is available | + | through the World Wide Web at . | + | | + | SPDX-License-Identifier: BSD-3-Clause | +----------------------------------------------------------------------+ | Authors: Dmitry Stogov | +----------------------------------------------------------------------+ @@ -25,7 +23,7 @@ #include "zend_dump.h" #include "zend_smart_str.h" -void zend_dump_ht(HashTable *ht) +void zend_dump_ht(const HashTable *ht) { zend_ulong index; zend_string *key; @@ -190,7 +188,7 @@ static void zend_dump_range(const zend_ssa_range *r) } } -static void zend_dump_type_info(uint32_t info, zend_class_entry *ce, int is_instanceof, uint32_t dump_flags) +static void zend_dump_type_info(uint32_t info, const zend_class_entry *ce, bool is_instanceof, uint32_t dump_flags) { bool first = true; @@ -482,7 +480,7 @@ ZEND_API void zend_dump_op(const zend_op_array *op_array, const zend_basic_block } if (ZEND_OP_IS_FRAMELESS_ICALL(opline->opcode)) { - zend_function *func = ZEND_FLF_FUNC(opline); + const zend_function *func = ZEND_FLF_FUNC(opline); fprintf(stderr, "(%s)", ZSTR_VAL(func->common.function_name)); } @@ -674,13 +672,13 @@ ZEND_API void zend_dump_op(const zend_op_array *op_array, const zend_basic_block } if (opline->op2_type == IS_CONST) { - zval *op = CRT_CONSTANT(opline->op2); + const zval *op = CRT_CONSTANT(opline->op2); if ( opline->opcode == ZEND_SWITCH_LONG || opline->opcode == ZEND_SWITCH_STRING || opline->opcode == ZEND_MATCH ) { - HashTable *jumptable = Z_ARRVAL_P(op); + const HashTable *jumptable = Z_ARRVAL_P(op); zend_string *key; zend_ulong num_key; zval *zv; @@ -778,7 +776,7 @@ ZEND_API void zend_dump_op_line(const zend_op_array *op_array, const zend_basic_ { int len = 0; const zend_ssa *ssa = NULL; - zend_ssa_op *ssa_op = NULL; + const zend_ssa_op *ssa_op = NULL; if (dump_flags & ZEND_DUMP_LINE_NUMBERS) { fprintf(stderr, "L%04u ", opline->lineno); @@ -800,7 +798,7 @@ ZEND_API void zend_dump_op_line(const zend_op_array *op_array, const zend_basic_ static void zend_dump_block_info(const zend_cfg *cfg, int n, uint32_t dump_flags) { - zend_basic_block *b = cfg->blocks + n; + const zend_basic_block *b = cfg->blocks + n; if (n > 0) { fprintf(stderr, "\n"); @@ -856,8 +854,8 @@ static void zend_dump_block_info(const zend_cfg *cfg, int n, uint32_t dump_flags fprintf(stderr, "\n"); if (b->predecessors_count) { - int *p = cfg->predecessors + b->predecessor_offset; - int *end = p + b->predecessors_count; + const int *p = cfg->predecessors + b->predecessor_offset; + const int *end = p + b->predecessors_count; fprintf(stderr, " ; from=(BB%d", *p); for (p++; p < end; p++) { @@ -867,9 +865,8 @@ static void zend_dump_block_info(const zend_cfg *cfg, int n, uint32_t dump_flags } if (b->successors_count > 0) { - int s; fprintf(stderr, " ; to=(BB%d", b->successors[0]); - for (s = 1; s < b->successors_count; s++) { + for (uint32_t s = 1; s < b->successors_count; s++) { fprintf(stderr, ", BB%d", b->successors[s]); } fprintf(stderr, ")\n"); @@ -900,16 +897,14 @@ static void zend_dump_block_header(const zend_cfg *cfg, const zend_op_array *op_ { zend_dump_block_info(cfg, n, dump_flags); if (ssa && ssa->blocks && ssa->blocks[n].phis) { - zend_ssa_phi *p = ssa->blocks[n].phis; + const zend_ssa_phi *p = ssa->blocks[n].phis; do { - int j; - fprintf(stderr, " "); zend_dump_ssa_var(op_array, ssa, p->ssa_var, 0, p->var, dump_flags); if (p->pi < 0) { fprintf(stderr, " = Phi("); - for (j = 0; j < cfg->blocks[n].predecessors_count; j++) { + for (uint32_t j = 0; j < cfg->blocks[n].predecessors_count; j++) { if (j > 0) { fprintf(stderr, ", "); } @@ -949,7 +944,7 @@ ZEND_API void zend_dump_op_array(const zend_op_array *op_array, uint32_t dump_fl { const zend_cfg *cfg = NULL; const zend_ssa *ssa = NULL; - zend_func_info *func_info = NULL; + const zend_func_info *func_info = NULL; uint32_t func_flags = 0; if (dump_flags & (ZEND_DUMP_CFG|ZEND_DUMP_SSA)) { @@ -1040,11 +1035,8 @@ ZEND_API void zend_dump_op_array(const zend_op_array *op_array, uint32_t dump_fl } if (cfg) { - int n; - zend_basic_block *b; - - for (n = 0; n < cfg->blocks_count; n++) { - b = cfg->blocks + n; + for (uint32_t n = 0; n < cfg->blocks_count; n++) { + const zend_basic_block *b = cfg->blocks + n; if (!(dump_flags & ZEND_DUMP_HIDE_UNREACHABLE) || (b->flags & ZEND_BB_REACHABLE)) { const zend_op *opline; const zend_op *end; @@ -1180,13 +1172,11 @@ ZEND_API void zend_dump_op_array(const zend_op_array *op_array, uint32_t dump_fl void zend_dump_dominators(const zend_op_array *op_array, const zend_cfg *cfg) { - int j; - fprintf(stderr, "\nDOMINATORS-TREE for \""); zend_dump_op_array_name(op_array); fprintf(stderr, "\"\n"); - for (j = 0; j < cfg->blocks_count; j++) { - zend_basic_block *b = cfg->blocks + j; + for (uint32_t j = 0; j < cfg->blocks_count; j++) { + const zend_basic_block *b = cfg->blocks + j; if (b->flags & ZEND_BB_REACHABLE) { zend_dump_block_info(cfg, j, 0); } @@ -1195,14 +1185,12 @@ void zend_dump_dominators(const zend_op_array *op_array, const zend_cfg *cfg) void zend_dump_ssa_variables(const zend_op_array *op_array, const zend_ssa *ssa, uint32_t dump_flags) { - int j; - if (ssa->vars) { fprintf(stderr, "\nSSA Variable for \""); zend_dump_op_array_name(op_array); fprintf(stderr, "\"\n"); - for (j = 0; j < ssa->vars_count; j++) { + for (int j = 0; j < ssa->vars_count; j++) { fprintf(stderr, " "); zend_dump_ssa_var(op_array, ssa, j, IS_CV, ssa->vars[j].var, dump_flags); if (ssa->vars[j].scc >= 0) { @@ -1221,10 +1209,9 @@ void zend_dump_ssa_variables(const zend_op_array *op_array, const zend_ssa *ssa, static void zend_dump_var_set(const zend_op_array *op_array, const char *name, zend_bitset set) { bool first = true; - uint32_t i; fprintf(stderr, " ; %s = {", name); - for (i = 0; i < op_array->last_var + op_array->T; i++) { + for (uint32_t i = 0; i < op_array->last_var + op_array->T; i++) { if (zend_bitset_in(set, i)) { if (first) { first = false; @@ -1239,12 +1226,11 @@ static void zend_dump_var_set(const zend_op_array *op_array, const char *name, z void zend_dump_dfg(const zend_op_array *op_array, const zend_cfg *cfg, const zend_dfg *dfg) { - int j; fprintf(stderr, "\nVariable Liveness for \""); zend_dump_op_array_name(op_array); fprintf(stderr, "\"\n"); - for (j = 0; j < cfg->blocks_count; j++) { + for (uint32_t j = 0; j < cfg->blocks_count; j++) { fprintf(stderr, " BB%d:\n", j); zend_dump_var_set(op_array, "def", DFG_BITSET(dfg->def, dfg->size, j)); zend_dump_var_set(op_array, "use", DFG_BITSET(dfg->use, dfg->size, j)); @@ -1255,17 +1241,16 @@ void zend_dump_dfg(const zend_op_array *op_array, const zend_cfg *cfg, const zen void zend_dump_phi_placement(const zend_op_array *op_array, const zend_ssa *ssa) { - int j; - zend_ssa_block *ssa_blocks = ssa->blocks; - int blocks_count = ssa->cfg.blocks_count; + const zend_ssa_block *ssa_blocks = ssa->blocks; + uint32_t blocks_count = ssa->cfg.blocks_count; fprintf(stderr, "\nSSA Phi() Placement for \""); zend_dump_op_array_name(op_array); fprintf(stderr, "\"\n"); - for (j = 0; j < blocks_count; j++) { + for (uint32_t j = 0; j < blocks_count; j++) { if (ssa_blocks && ssa_blocks[j].phis) { - zend_ssa_phi *p = ssa_blocks[j].phis; - int first = 1; + const zend_ssa_phi *p = ssa_blocks[j].phis; + bool first = true; fprintf(stderr, " BB%d:\n", j); if (p->pi >= 0) { @@ -1275,7 +1260,7 @@ void zend_dump_phi_placement(const zend_op_array *op_array, const zend_ssa *ssa) } do { if (first) { - first = 0; + first = false; } else { fprintf(stderr, ", "); } diff --git a/Zend/Optimizer/zend_dump.h b/Zend/Optimizer/zend_dump.h index db8f762bfc49..45740d9609cb 100644 --- a/Zend/Optimizer/zend_dump.h +++ b/Zend/Optimizer/zend_dump.h @@ -2,15 +2,13 @@ +----------------------------------------------------------------------+ | Zend Engine, Bytecode Visualisation | +----------------------------------------------------------------------+ - | Copyright (c) The PHP Group | + | Copyright © The PHP Group and Contributors. | +----------------------------------------------------------------------+ - | This source file is subject to version 3.01 of the PHP license, | - | that is bundled with this package in the file LICENSE, and is | - | available through the world-wide-web at the following url: | - | https://www.php.net/license/3_01.txt | - | If you did not receive a copy of the PHP license and are unable to | - | obtain it through the world-wide-web, please send a note to | - | license@php.net so we can mail you a copy immediately. | + | This source file is subject to the Modified BSD License that is | + | bundled with this package in the file LICENSE, and is available | + | through the World Wide Web at . | + | | + | SPDX-License-Identifier: BSD-3-Clause | +----------------------------------------------------------------------+ | Authors: Dmitry Stogov | +----------------------------------------------------------------------+ @@ -44,7 +42,7 @@ ZEND_API void zend_dump_ssa_var(const zend_op_array *op_array, const zend_ssa *s ZEND_API void zend_dump_var(const zend_op_array *op_array, uint8_t var_type, uint32_t var_num); void zend_dump_op_array_name(const zend_op_array *op_array); void zend_dump_const(const zval *zv); -void zend_dump_ht(HashTable *ht); +void zend_dump_ht(const HashTable *ht); END_EXTERN_C() diff --git a/Zend/Optimizer/zend_func_info.c b/Zend/Optimizer/zend_func_info.c index cec52f7e9860..185fcc40be67 100644 --- a/Zend/Optimizer/zend_func_info.c +++ b/Zend/Optimizer/zend_func_info.c @@ -2,15 +2,13 @@ +----------------------------------------------------------------------+ | Zend Engine, Func Info | +----------------------------------------------------------------------+ - | Copyright (c) The PHP Group | + | Copyright © The PHP Group and Contributors. | +----------------------------------------------------------------------+ - | This source file is subject to version 3.01 of the PHP license, | - | that is bundled with this package in the file LICENSE, and is | - | available through the world-wide-web at the following url: | - | https://www.php.net/license/3_01.txt | - | If you did not receive a copy of the PHP license and are unable to | - | obtain it through the world-wide-web, please send a note to | - | license@php.net so we can mail you a copy immediately. | + | This source file is subject to the Modified BSD License that is | + | bundled with this package in the file LICENSE, and is available | + | through the World Wide Web at . | + | | + | SPDX-License-Identifier: BSD-3-Clause | +----------------------------------------------------------------------+ | Authors: Dmitry Stogov | | Xinchen Hui | diff --git a/Zend/Optimizer/zend_func_info.h b/Zend/Optimizer/zend_func_info.h index db00d843ee10..6b5b51cac58b 100644 --- a/Zend/Optimizer/zend_func_info.h +++ b/Zend/Optimizer/zend_func_info.h @@ -2,15 +2,13 @@ +----------------------------------------------------------------------+ | Zend Engine, Func Info | +----------------------------------------------------------------------+ - | Copyright (c) The PHP Group | + | Copyright © The PHP Group and Contributors. | +----------------------------------------------------------------------+ - | This source file is subject to version 3.01 of the PHP license, | - | that is bundled with this package in the file LICENSE, and is | - | available through the world-wide-web at the following url: | - | https://www.php.net/license/3_01.txt | - | If you did not receive a copy of the PHP license and are unable to | - | obtain it through the world-wide-web, please send a note to | - | license@php.net so we can mail you a copy immediately. | + | This source file is subject to the Modified BSD License that is | + | bundled with this package in the file LICENSE, and is available | + | through the World Wide Web at . | + | | + | SPDX-License-Identifier: BSD-3-Clause | +----------------------------------------------------------------------+ | Authors: Dmitry Stogov | +----------------------------------------------------------------------+ diff --git a/Zend/Optimizer/zend_func_infos.h b/Zend/Optimizer/zend_func_infos.h index b7b118c710c5..2a9353c9b86e 100644 --- a/Zend/Optimizer/zend_func_infos.h +++ b/Zend/Optimizer/zend_func_infos.h @@ -596,6 +596,7 @@ static const func_info_t func_infos[] = { F1("stream_get_line", MAY_BE_STRING|MAY_BE_FALSE), F1("stream_resolve_include_path", MAY_BE_STRING|MAY_BE_FALSE), F1("stream_get_wrappers", MAY_BE_ARRAY|MAY_BE_ARRAY_KEY_LONG|MAY_BE_ARRAY_OF_STRING), + FN("stream_last_errors", MAY_BE_ARRAY|MAY_BE_ARRAY_KEY_LONG|MAY_BE_ARRAY_OF_OBJECT), F1("stream_get_transports", MAY_BE_ARRAY|MAY_BE_ARRAY_KEY_LONG|MAY_BE_ARRAY_OF_STRING), #if defined(HAVE_GETTIMEOFDAY) F1("uniqid", MAY_BE_STRING), diff --git a/Zend/Optimizer/zend_inference.c b/Zend/Optimizer/zend_inference.c index 6963fc63dd15..05d33d3d75fb 100644 --- a/Zend/Optimizer/zend_inference.c +++ b/Zend/Optimizer/zend_inference.c @@ -2,15 +2,13 @@ +----------------------------------------------------------------------+ | Zend Engine, e-SSA based Type & Range Inference | +----------------------------------------------------------------------+ - | Copyright (c) The PHP Group | + | Copyright © The PHP Group and Contributors. | +----------------------------------------------------------------------+ - | This source file is subject to version 3.01 of the PHP license, | - | that is bundled with this package in the file LICENSE, and is | - | available through the world-wide-web at the following url: | - | https://www.php.net/license/3_01.txt | - | If you did not receive a copy of the PHP license and are unable to | - | obtain it through the world-wide-web, please send a note to | - | license@php.net so we can mail you a copy immediately. | + | This source file is subject to the Modified BSD License that is | + | bundled with this package in the file LICENSE, and is available | + | through the World Wide Web at . | + | | + | SPDX-License-Identifier: BSD-3-Clause | +----------------------------------------------------------------------+ | Authors: Dmitry Stogov | +----------------------------------------------------------------------+ @@ -493,7 +491,7 @@ ZEND_API void zend_ssa_find_false_dependencies(const zend_op_array *op_array, co const zend_ssa_op *ssa_ops = ssa->ops; int ssa_vars_count = ssa->vars_count; zend_bitset worklist; - int i, j, use; + int i, use; const zend_ssa_phi *p; ALLOCA_FLAG(use_heap); @@ -527,7 +525,7 @@ ZEND_API void zend_ssa_find_false_dependencies(const zend_op_array *op_array, co zend_bitset_incl(worklist, p->sources[0]); } } else { - for (j = 0; j < ssa->cfg.blocks[p->block].predecessors_count; j++) { + for (uint32_t j = 0; j < ssa->cfg.blocks[p->block].predecessors_count; j++) { ZEND_ASSERT(p->sources[j] >= 0); if (ssa->vars[p->sources[j]].no_val) { ssa_vars[p->sources[j]].no_val = 0; /* used indirectly */ @@ -1063,7 +1061,7 @@ static bool zend_inference_calc_binary_op_range( case ZEND_BW_XOR: // TODO break; - EMPTY_SWITCH_DEFAULT_CASE() + default: ZEND_UNREACHABLE(); } return 0; } @@ -1076,7 +1074,6 @@ static bool zend_inference_calc_range(const zend_op_array *op_array, const zend_ if (ssa->vars[var].definition_phi) { const zend_ssa_phi *p = ssa->vars[var].definition_phi; - int i; tmp->underflow = 0; tmp->min = ZEND_LONG_MAX; @@ -1222,7 +1219,7 @@ static bool zend_inference_calc_range(const zend_op_array *op_array, const zend_ } } } else { - for (i = 0; i < ssa->cfg.blocks[p->block].predecessors_count; i++) { + for (uint32_t i = 0; i < ssa->cfg.blocks[p->block].predecessors_count; i++) { ZEND_ASSERT(p->sources[i] >= 0); if (ssa->var_info[p->sources[i]].has_range) { /* union */ @@ -2351,7 +2348,7 @@ static uint32_t binary_op_result_type( /* TODO: +MAY_BE_OBJECT ??? */ tmp = MAY_BE_STRING | MAY_BE_RC1 | MAY_BE_RCN; break; - EMPTY_SWITCH_DEFAULT_CASE() + default: ZEND_UNREACHABLE(); } return tmp; } @@ -3709,7 +3706,7 @@ static zend_always_inline zend_result _zend_update_type_info( case ZEND_FREE: /* This may happen if the using opcode is DCEd. */ break; - EMPTY_SWITCH_DEFAULT_CASE() + default: ZEND_UNREACHABLE(); } j = zend_ssa_next_use(ssa->ops, ssa_op->result_def, j); if (j >= 0) { @@ -4192,7 +4189,7 @@ static zend_result zend_infer_types_ex(const zend_op_array *op_array, const zend zend_ssa_var *ssa_vars = ssa->vars; zend_ssa_var_info *ssa_var_info = ssa->var_info; int ssa_vars_count = ssa->vars_count; - int i, j; + int j; uint32_t tmp, worklist_len = zend_bitset_len(ssa_vars_count); bool update_worklist = 1; const zend_op **ssa_opcodes = NULL; @@ -4236,6 +4233,7 @@ static zend_result zend_infer_types_ex(const zend_op_array *op_array, const zend bool first = true; bool is_instanceof = false; zend_class_entry *ce = NULL; + uint32_t i; tmp = 0; for (i = 0; i < blocks[p->block].predecessors_count; i++) { @@ -4261,7 +4259,7 @@ static zend_result zend_infer_types_ex(const zend_op_array *op_array, const zend UPDATE_SSA_OBJ_TYPE(ce, ce ? is_instanceof : 0, j); } } else if (ssa_vars[j].definition >= 0) { - i = ssa_vars[j].definition; + int i = ssa_vars[j].definition; if (_zend_update_type_info(op_array, ssa, script, worklist, op_array->opcodes + i, ssa->ops + i, NULL, optimization_level, true) == FAILURE) { return FAILURE; } @@ -4562,9 +4560,8 @@ static void zend_func_return_info(const zend_op_array *op_array, { const zend_func_info *info = ZEND_FUNC_INFO(op_array); const zend_ssa *ssa = &info->ssa; - int blocks_count = info->ssa.cfg.blocks_count; + uint32_t blocks_count = info->ssa.cfg.blocks_count; const zend_basic_block *blocks = info->ssa.cfg.blocks; - int j; uint32_t t1; uint32_t tmp = 0; zend_class_entry *tmp_ce = NULL; @@ -4589,7 +4586,7 @@ static void zend_func_return_info(const zend_op_array *op_array, | MAY_BE_RC1 | MAY_BE_RCN | MAY_BE_REF; } - for (j = 0; j < blocks_count; j++) { + for (uint32_t j = 0; j < blocks_count; j++) { if ((blocks[j].flags & ZEND_BB_REACHABLE) && blocks[j].len != 0) { zend_op *opline = op_array->opcodes + blocks[j].start + blocks[j].len - 1; @@ -5295,10 +5292,10 @@ ZEND_API bool zend_may_throw_ex(const zend_op *opline, const zend_ssa_op *ssa_op return (t1 & MAY_BE_OBJECT); case IS_OBJECT: return 0; - EMPTY_SWITCH_DEFAULT_CASE() + default: ZEND_UNREACHABLE(); } /* GCC is getting confused here for the Wimplicit-fallthrough warning with - * EMPTY_SWITCH_DEFAULT_CASE() macro */ + * default: ZEND_UNREACHABLE(); macro */ return 0; case ZEND_ARRAY_KEY_EXISTS: if ((t2 & MAY_BE_ANY) != MAY_BE_ARRAY) { diff --git a/Zend/Optimizer/zend_inference.h b/Zend/Optimizer/zend_inference.h index 1b626fa2ee22..e6b4207c7494 100644 --- a/Zend/Optimizer/zend_inference.h +++ b/Zend/Optimizer/zend_inference.h @@ -2,15 +2,13 @@ +----------------------------------------------------------------------+ | Zend Engine, e-SSA based Type & Range Inference | +----------------------------------------------------------------------+ - | Copyright (c) The PHP Group | + | Copyright © The PHP Group and Contributors. | +----------------------------------------------------------------------+ - | This source file is subject to version 3.01 of the PHP license, | - | that is bundled with this package in the file LICENSE, and is | - | available through the world-wide-web at the following url: | - | https://www.php.net/license/3_01.txt | - | If you did not receive a copy of the PHP license and are unable to | - | obtain it through the world-wide-web, please send a note to | - | license@php.net so we can mail you a copy immediately. | + | This source file is subject to the Modified BSD License that is | + | bundled with this package in the file LICENSE, and is available | + | through the World Wide Web at . | + | | + | SPDX-License-Identifier: BSD-3-Clause | +----------------------------------------------------------------------+ | Authors: Dmitry Stogov | +----------------------------------------------------------------------+ diff --git a/Zend/Optimizer/zend_optimizer.c b/Zend/Optimizer/zend_optimizer.c index f8cbefdaaf2b..d10b4d83fc3e 100644 --- a/Zend/Optimizer/zend_optimizer.c +++ b/Zend/Optimizer/zend_optimizer.c @@ -2,15 +2,13 @@ +----------------------------------------------------------------------+ | Zend OPcache | +----------------------------------------------------------------------+ - | Copyright (c) The PHP Group | + | Copyright © The PHP Group and Contributors. | +----------------------------------------------------------------------+ - | This source file is subject to version 3.01 of the PHP license, | - | that is bundled with this package in the file LICENSE, and is | - | available through the world-wide-web at the following url: | - | https://www.php.net/license/3_01.txt | - | If you did not receive a copy of the PHP license and are unable to | - | obtain it through the world-wide-web, please send a note to | - | license@php.net so we can mail you a copy immediately. | + | This source file is subject to the Modified BSD License that is | + | bundled with this package in the file LICENSE, and is available | + | through the World Wide Web at . | + | | + | SPDX-License-Identifier: BSD-3-Clause | +----------------------------------------------------------------------+ | Authors: Andi Gutmans | | Zeev Suraski | @@ -782,7 +780,7 @@ static bool zend_optimizer_ignore_class(zval *ce_zv, const zend_string *filename if (CG(compiler_options) & ZEND_COMPILE_WITH_FILE_CACHE) { return true; } - const Bucket *ce_bucket = (const Bucket*)((uintptr_t)ce_zv - XtOffsetOf(Bucket, val)); + const Bucket *ce_bucket = ZEND_CONTAINER_OF(ce_zv, Bucket, val); size_t offset = ce_bucket - EG(class_table)->arData; if (offset < EG(persistent_classes_count)) { return false; @@ -803,7 +801,7 @@ static bool zend_optimizer_ignore_function(zval *fbc_zv, const zend_string *file if (CG(compiler_options) & ZEND_COMPILE_WITH_FILE_CACHE) { return true; } - const Bucket *fbc_bucket = (const Bucket*)((uintptr_t)fbc_zv - XtOffsetOf(Bucket, val)); + const Bucket *fbc_bucket = ZEND_CONTAINER_OF(fbc_zv, Bucket, val); size_t offset = fbc_bucket - EG(function_table)->arData; if (offset < EG(persistent_functions_count)) { return false; @@ -945,7 +943,7 @@ zend_function *zend_optimizer_get_called_func( if (ce) { zend_string *func_name = Z_STR_P(CRT_CONSTANT(opline->op2) + 1); zend_function *fbc = zend_hash_find_ptr(&ce->function_table, func_name); - if (fbc) { + if (fbc && !(fbc->common.fn_flags & ZEND_ACC_ABSTRACT)) { bool is_public = (fbc->common.fn_flags & ZEND_ACC_PUBLIC) != 0; bool same_scope = fbc->common.scope == op_array->scope; if (is_public || same_scope) { diff --git a/Zend/Optimizer/zend_optimizer.h b/Zend/Optimizer/zend_optimizer.h index 43a0f60a2321..d2847c92869c 100644 --- a/Zend/Optimizer/zend_optimizer.h +++ b/Zend/Optimizer/zend_optimizer.h @@ -2,15 +2,13 @@ +----------------------------------------------------------------------+ | Zend OPcache | +----------------------------------------------------------------------+ - | Copyright (c) The PHP Group | + | Copyright © The PHP Group and Contributors. | +----------------------------------------------------------------------+ - | This source file is subject to version 3.01 of the PHP license, | - | that is bundled with this package in the file LICENSE, and is | - | available through the world-wide-web at the following url: | - | https://www.php.net/license/3_01.txt | - | If you did not receive a copy of the PHP license and are unable to | - | obtain it through the world-wide-web, please send a note to | - | license@php.net so we can mail you a copy immediately. | + | This source file is subject to the Modified BSD License that is | + | bundled with this package in the file LICENSE, and is available | + | through the World Wide Web at . | + | | + | SPDX-License-Identifier: BSD-3-Clause | +----------------------------------------------------------------------+ | Authors: Andi Gutmans | | Zeev Suraski | diff --git a/Zend/Optimizer/zend_optimizer_internal.h b/Zend/Optimizer/zend_optimizer_internal.h index 869275811e3d..d01df56260bc 100644 --- a/Zend/Optimizer/zend_optimizer_internal.h +++ b/Zend/Optimizer/zend_optimizer_internal.h @@ -2,15 +2,13 @@ +----------------------------------------------------------------------+ | Zend OPcache | +----------------------------------------------------------------------+ - | Copyright (c) The PHP Group | + | Copyright © The PHP Group and Contributors. | +----------------------------------------------------------------------+ - | This source file is subject to version 3.01 of the PHP license, | - | that is bundled with this package in the file LICENSE, and is | - | available through the world-wide-web at the following url: | - | https://www.php.net/license/3_01.txt | - | If you did not receive a copy of the PHP license and are unable to | - | obtain it through the world-wide-web, please send a note to | - | license@php.net so we can mail you a copy immediately. | + | This source file is subject to the Modified BSD License that is | + | bundled with this package in the file LICENSE, and is available | + | through the World Wide Web at . | + | | + | SPDX-License-Identifier: BSD-3-Clause | +----------------------------------------------------------------------+ | Authors: Andi Gutmans | | Zeev Suraski | diff --git a/Zend/Optimizer/zend_ssa.c b/Zend/Optimizer/zend_ssa.c index 99978da9d7e8..fa2901b89421 100644 --- a/Zend/Optimizer/zend_ssa.c +++ b/Zend/Optimizer/zend_ssa.c @@ -2,15 +2,13 @@ +----------------------------------------------------------------------+ | Zend Engine, SSA - Static Single Assignment Form | +----------------------------------------------------------------------+ - | Copyright (c) The PHP Group | + | Copyright © The PHP Group and Contributors. | +----------------------------------------------------------------------+ - | This source file is subject to version 3.01 of the PHP license, | - | that is bundled with this package in the file LICENSE, and is | - | available through the world-wide-web at the following url: | - | https://www.php.net/license/3_01.txt | - | If you did not receive a copy of the PHP license and are unable to | - | obtain it through the world-wide-web, please send a note to | - | license@php.net so we can mail you a copy immediately. | + | This source file is subject to the Modified BSD License that is | + | bundled with this package in the file LICENSE, and is available | + | through the World Wide Web at . | + | | + | SPDX-License-Identifier: BSD-3-Clause | +----------------------------------------------------------------------+ | Authors: Dmitry Stogov | | Nikita Popov | @@ -35,8 +33,7 @@ static bool dominates(const zend_basic_block *blocks, int a, int b) { static bool will_rejoin( const zend_cfg *cfg, const zend_dfg *dfg, const zend_basic_block *block, int other_successor, int exclude, int var) { - int i; - for (i = 0; i < block->predecessors_count; i++) { + for (uint32_t i = 0; i < block->predecessors_count; i++) { int predecessor = cfg->predecessors[block->predecessor_offset + i]; if (predecessor == exclude) { continue; @@ -243,8 +240,8 @@ static void place_essa_pis( zend_arena **arena, const zend_script *script, const zend_op_array *op_array, uint32_t build_flags, const zend_ssa *ssa, const zend_dfg *dfg) /* {{{ */ { const zend_basic_block *blocks = ssa->cfg.blocks; - int j, blocks_count = ssa->cfg.blocks_count; - for (j = 0; j < blocks_count; j++) { + uint32_t blocks_count = ssa->cfg.blocks_count; + for (uint32_t j = 0; j < blocks_count; j++) { zend_ssa_phi *pi; zend_op *opline = op_array->opcodes + blocks[j].start + blocks[j].len - 1; int bt; /* successor block number if a condition is true */ @@ -823,7 +820,6 @@ static void zend_ssa_rename_in_block(const zend_op_array *op_array, uint32_t bui const zend_ssa_block *ssa_blocks = ssa->blocks; zend_ssa_op *ssa_ops = ssa->ops; int ssa_vars_count = ssa->vars_count; - int i, j; const zend_op *opline, *end; if (ssa_blocks[n].phis) { @@ -853,7 +849,7 @@ static void zend_ssa_rename_in_block(const zend_op_array *op_array, uint32_t bui && ((end-1)->opcode == ZEND_FE_FETCH_R || (end-1)->opcode == ZEND_FE_FETCH_RW) && (end-1)->op2_type == IS_CV ? &ssa_ops[blocks[n].start + blocks[n].len - 1] : NULL; - for (i = 0; i < blocks[n].successors_count; i++) { + for (uint32_t i = 0; i < blocks[n].successors_count; i++) { int succ = blocks[n].successors[i]; zend_ssa_phi *p; for (p = ssa_blocks[succ].phis; p; p = p->next) { @@ -867,7 +863,7 @@ static void zend_ssa_rename_in_block(const zend_op_array *op_array, uint32_t bui p->constraint.range.max_ssa_var = var[p->constraint.range.max_var]; } } - for (j = 0; j < blocks[succ].predecessors_count; j++) { + for (uint32_t j = 0; j < blocks[succ].predecessors_count; j++) { p->sources[j] = var[p->var]; } if (p->ssa_var < 0) { @@ -876,6 +872,7 @@ static void zend_ssa_rename_in_block(const zend_op_array *op_array, uint32_t bui } } else if (p->pi < 0) { /* Normal Phi */ + uint32_t j; for (j = 0; j < blocks[succ].predecessors_count; j++) if (ssa->cfg.predecessors[blocks[succ].predecessor_offset + j] == n) { break; @@ -893,6 +890,7 @@ static void zend_ssa_rename_in_block(const zend_op_array *op_array, uint32_t bui zend_ssa_phi *q = p->next; while (q) { if (q->pi < 0 && q->var == p->var) { + uint32_t j; for (j = 0; j < blocks[succ].predecessors_count; j++) { if (ssa->cfg.predecessors[blocks[succ].predecessor_offset + j] == n) { break; @@ -997,11 +995,11 @@ ZEND_API zend_result zend_build_ssa(zend_arena **arena, const zend_script *scrip { const zend_basic_block *blocks = ssa->cfg.blocks; zend_ssa_block *ssa_blocks; - int blocks_count = ssa->cfg.blocks_count; + uint32_t blocks_count = ssa->cfg.blocks_count; uint32_t set_size; zend_bitset def, in, phi; int *var = NULL; - int i, j, k, changed; + int i, j, changed; zend_dfg dfg; ALLOCA_FLAG(dfg_use_heap) ALLOCA_FLAG(var_use_heap) @@ -1056,7 +1054,7 @@ ZEND_API zend_result zend_build_ssa(zend_arena **arena, const zend_script *scrip register allocator depends on this property. */ zend_bitset_union(phi_j, in + (j * set_size), set_size); } else { - for (k = 0; k < blocks[j].predecessors_count; k++) { + for (uint32_t k = 0; k < blocks[j].predecessors_count; k++) { i = ssa->cfg.predecessors[blocks[j].predecessor_offset + k]; while (i != -1 && i != blocks[j].idom) { zend_bitset_union_with_intersection( @@ -1223,9 +1221,7 @@ ZEND_API void zend_ssa_compute_use_def_chains(zend_arena **arena, const zend_op_ } } } else { - int j; - - for (j = 0; j < ssa->cfg.blocks[i].predecessors_count; j++) { + for (uint32_t j = 0; j < ssa->cfg.blocks[i].predecessors_count; j++) { zend_ssa_phi *p; ZEND_ASSERT(phi->sources[j] >= 0); @@ -1374,8 +1370,7 @@ static inline zend_ssa_phi **zend_ssa_next_use_phi_ptr(const zend_ssa *ssa, int if (p->pi >= 0) { return &p->use_chains[0]; } else { - int j; - for (j = 0; j < ssa->cfg.blocks[p->block].predecessors_count; j++) { + for (uint32_t j = 0; j < ssa->cfg.blocks[p->block].predecessors_count; j++) { if (p->sources[j] == var) { return &p->use_chains[j]; } @@ -1438,9 +1433,9 @@ void zend_ssa_remove_defs_of_instr(zend_ssa *ssa, zend_ssa_op *ssa_op) /* {{{ */ } /* }}} */ -static inline void zend_ssa_remove_phi_source(const zend_ssa *ssa, const zend_ssa_phi *phi, int pred_offset, int predecessors_count) /* {{{ */ +static inline void zend_ssa_remove_phi_source(const zend_ssa *ssa, const zend_ssa_phi *phi, int pred_offset, uint32_t predecessors_count) /* {{{ */ { - int j, var_num = phi->sources[pred_offset]; + int var_num = phi->sources[pred_offset]; zend_ssa_phi *next_phi = phi->use_chains[pred_offset]; predecessors_count--; @@ -1451,7 +1446,7 @@ static inline void zend_ssa_remove_phi_source(const zend_ssa *ssa, const zend_ss /* Check if they same var is used in a different phi operand as well, in this case we don't * need to adjust the use chain (but may have to move the next pointer). */ - for (j = 0; j < predecessors_count; j++) { + for (uint32_t j = 0; j < predecessors_count; j++) { if (phi->sources[j] == var_num) { if (j < pred_offset) { ZEND_ASSERT(next_phi == NULL); @@ -1485,8 +1480,8 @@ void zend_ssa_remove_uses_of_var(const zend_ssa *ssa, int var_num) /* {{{ */ zend_ssa_phi *phi; int use; FOREACH_PHI_USE(var, phi) { - int i, end = NUM_PHI_SOURCES(phi); - for (i = 0; i < end; i++) { + uint32_t end = NUM_PHI_SOURCES(phi); + for (uint32_t i = 0; i < end; i++) { if (phi->sources[i] == var_num) { phi->use_chains[i] = NULL; } @@ -1517,13 +1512,12 @@ void zend_ssa_remove_predecessor(zend_ssa *ssa, int from, int to) /* {{{ */ zend_basic_block *next_block = &ssa->cfg.blocks[to]; const zend_ssa_block *next_ssa_block = &ssa->blocks[to]; zend_ssa_phi *phi; - int j; /* Find at which predecessor offset this block is referenced */ int pred_offset = -1; int *predecessors = &ssa->cfg.predecessors[next_block->predecessor_offset]; - for (j = 0; j < next_block->predecessors_count; j++) { + for (uint32_t j = 0; j < next_block->predecessors_count; j++) { if (predecessors[j] == from) { pred_offset = j; break; @@ -1558,7 +1552,7 @@ void zend_ssa_remove_predecessor(zend_ssa *ssa, int from, int to) /* {{{ */ } /* }}} */ -void zend_ssa_remove_block(const zend_op_array *op_array, zend_ssa *ssa, int i) /* {{{ */ +void zend_ssa_remove_block(const zend_op_array *op_array, zend_ssa *ssa, uint32_t i) /* {{{ */ { zend_basic_block *block = &ssa->cfg.blocks[i]; const zend_ssa_block *ssa_block = &ssa->blocks[i]; @@ -1591,7 +1585,8 @@ void zend_ssa_remove_block_from_cfg(zend_ssa *ssa, int i) /* {{{ */ { zend_basic_block *block = &ssa->cfg.blocks[i]; int *predecessors; - int j, s; + int j; + uint32_t s; for (s = 0; s < block->successors_count; s++) { zend_ssa_remove_predecessor(ssa, i, block->successors[s]); @@ -1722,7 +1717,7 @@ void zend_ssa_rename_var_uses(zend_ssa *ssa, int old, int new, bool update_types /* Update phi use chains */ FOREACH_PHI_USE(old_var, phi) { - int j; + uint32_t j; bool after_first_new_source = false; /* If the phi already uses the new var, find its use chain, as we may diff --git a/Zend/Optimizer/zend_ssa.h b/Zend/Optimizer/zend_ssa.h index 0696d2bba867..ee9faf9bfd23 100644 --- a/Zend/Optimizer/zend_ssa.h +++ b/Zend/Optimizer/zend_ssa.h @@ -2,15 +2,13 @@ +----------------------------------------------------------------------+ | Zend Engine, SSA - Static Single Assignment Form | +----------------------------------------------------------------------+ - | Copyright (c) The PHP Group | + | Copyright © The PHP Group and Contributors. | +----------------------------------------------------------------------+ - | This source file is subject to version 3.01 of the PHP license, | - | that is bundled with this package in the file LICENSE, and is | - | available through the world-wide-web at the following url: | - | https://www.php.net/license/3_01.txt | - | If you did not receive a copy of the PHP license and are unable to | - | obtain it through the world-wide-web, please send a note to | - | license@php.net so we can mail you a copy immediately. | + | This source file is subject to the Modified BSD License that is | + | bundled with this package in the file LICENSE, and is available | + | through the World Wide Web at . | + | | + | SPDX-License-Identifier: BSD-3-Clause | +----------------------------------------------------------------------+ | Authors: Dmitry Stogov | +----------------------------------------------------------------------+ @@ -66,7 +64,7 @@ struct _zend_ssa_phi { zend_ssa_pi_constraint constraint; /* e-SSA Pi constraint */ int var; /* Original CV, VAR or TMP variable index */ int ssa_var; /* SSA variable index */ - int block; /* current BB index */ + uint32_t block; /* current BB index */ bool has_range_constraint; zend_ssa_phi **use_chains; zend_ssa_phi *sym_use_chain; @@ -155,7 +153,7 @@ void zend_ssa_remove_defs_of_instr(zend_ssa *ssa, zend_ssa_op *ssa_op); void zend_ssa_remove_instr(const zend_ssa *ssa, zend_op *opline, zend_ssa_op *ssa_op); void zend_ssa_remove_phi(const zend_ssa *ssa, zend_ssa_phi *phi); void zend_ssa_remove_uses_of_var(const zend_ssa *ssa, int var_num); -void zend_ssa_remove_block(const zend_op_array *op_array, zend_ssa *ssa, int b); +void zend_ssa_remove_block(const zend_op_array *op_array, zend_ssa *ssa, uint32_t b); void zend_ssa_rename_var_uses(zend_ssa *ssa, int old_var, int new_var, bool update_types); void zend_ssa_remove_block_from_cfg(zend_ssa *ssa, int b); @@ -207,8 +205,7 @@ static zend_always_inline zend_ssa_phi* zend_ssa_next_use_phi(const zend_ssa *ss if (p->pi >= 0) { return p->use_chains[0]; } else { - int j; - for (j = 0; j < ssa->cfg.blocks[p->block].predecessors_count; j++) { + for (uint32_t j = 0; j < ssa->cfg.blocks[p->block].predecessors_count; j++) { if (p->sources[j] == var) { return p->use_chains[j]; } @@ -285,7 +282,7 @@ static zend_always_inline void zend_ssa_rename_defs_of_instr(zend_ssa *ssa, zend #define FOREACH_PHI_SOURCE(phi, source) do { \ zend_ssa_phi *_phi = (phi); \ - int _i, _end = NUM_PHI_SOURCES(phi); \ + uint32_t _i, _end = NUM_PHI_SOURCES(phi); \ for (_i = 0; _i < _end; _i++) { \ ZEND_ASSERT(_phi->sources[_i] >= 0); \ source = _phi->sources[_i]; @@ -294,8 +291,7 @@ static zend_always_inline void zend_ssa_rename_defs_of_instr(zend_ssa *ssa, zend } while (0) #define FOREACH_PHI(phi) do { \ - int _i; \ - for (_i = 0; _i < ssa->cfg.blocks_count; _i++) { \ + for (uint32_t _i = 0; _i < ssa->cfg.blocks_count; _i++) { \ phi = ssa->blocks[_i].phis; \ for (; phi; phi = phi->next) { #define FOREACH_PHI_END() \ @@ -304,8 +300,7 @@ static zend_always_inline void zend_ssa_rename_defs_of_instr(zend_ssa *ssa, zend } while (0) #define FOREACH_BLOCK(block) do { \ - int _i; \ - for (_i = 0; _i < ssa->cfg.blocks_count; _i++) { \ + for (uint32_t _i = 0; _i < ssa->cfg.blocks_count; _i++) { \ (block) = &ssa->cfg.blocks[_i]; \ if (!((block)->flags & ZEND_BB_REACHABLE)) { \ continue; \ diff --git a/Zend/Optimizer/zend_worklist.h b/Zend/Optimizer/zend_worklist.h index 85e7b111d5c9..ea03048e9756 100644 --- a/Zend/Optimizer/zend_worklist.h +++ b/Zend/Optimizer/zend_worklist.h @@ -2,15 +2,13 @@ +----------------------------------------------------------------------+ | Zend Engine | +----------------------------------------------------------------------+ - | Copyright (c) The PHP Group | + | Copyright © The PHP Group and Contributors. | +----------------------------------------------------------------------+ - | This source file is subject to version 3.01 of the PHP license, | - | that is bundled with this package in the file LICENSE, and is | - | available through the world-wide-web at the following url: | - | https://www.php.net/license/3_01.txt | - | If you did not receive a copy of the PHP license and are unable to | - | obtain it through the world-wide-web, please send a note to | - | license@php.net so we can mail you a copy immediately. | + | This source file is subject to the Modified BSD License that is | + | bundled with this package in the file LICENSE, and is available | + | through the World Wide Web at . | + | | + | SPDX-License-Identifier: BSD-3-Clause | +----------------------------------------------------------------------+ | Authors: Andy Wingo | +----------------------------------------------------------------------+ diff --git a/Zend/Zend.m4 b/Zend/Zend.m4 index d0c682e8e659..5e69a97db197 100644 --- a/Zend/Zend.m4 +++ b/Zend/Zend.m4 @@ -317,6 +317,7 @@ int emu(const opcode_handler_t *ip, void *fp) { while ((*ip)()); FP = orig_fp; IP = orig_ip; + return 0; }], [])], [php_cv_have_global_register_vars=yes], [php_cv_have_global_register_vars=no]) diff --git a/Zend/asm/save_xmm_x86_64_ms_masm.asm b/Zend/asm/save_xmm_x86_64_ms_masm.asm index 1569d6bdb0e8..0af7c346095d 100644 --- a/Zend/asm/save_xmm_x86_64_ms_masm.asm +++ b/Zend/asm/save_xmm_x86_64_ms_masm.asm @@ -9,34 +9,34 @@ EXTERN execute_ex_real:PROC ; save the preserved registers when re-entering the VM from JIT code. ; See GH-18136. execute_ex PROC EXPORT FRAME - ; 10 floating points numbers + ; 10 XMM registers ; 32 bytes shadow space ; 8 bytes to align after the return address - sub rsp, 8*10 + 32 + 8 - .allocstack 8*10 + 32 + 8 + sub rsp, 16*10 + 32 + 8 + .allocstack 16*10 + 32 + 8 .endprolog - movsd qword ptr [rsp + 32 + 8*0], xmm6 - movsd qword ptr [rsp + 32 + 8*1], xmm7 - movsd qword ptr [rsp + 32 + 8*2], xmm8 - movsd qword ptr [rsp + 32 + 8*3], xmm9 - movsd qword ptr [rsp + 32 + 8*4], xmm10 - movsd qword ptr [rsp + 32 + 8*5], xmm11 - movsd qword ptr [rsp + 32 + 8*6], xmm12 - movsd qword ptr [rsp + 32 + 8*7], xmm13 - movsd qword ptr [rsp + 32 + 8*8], xmm14 - movsd qword ptr [rsp + 32 + 8*9], xmm15 + movaps xmmword ptr [rsp + 32 + 16*0], xmm6 + movaps xmmword ptr [rsp + 32 + 16*1], xmm7 + movaps xmmword ptr [rsp + 32 + 16*2], xmm8 + movaps xmmword ptr [rsp + 32 + 16*3], xmm9 + movaps xmmword ptr [rsp + 32 + 16*4], xmm10 + movaps xmmword ptr [rsp + 32 + 16*5], xmm11 + movaps xmmword ptr [rsp + 32 + 16*6], xmm12 + movaps xmmword ptr [rsp + 32 + 16*7], xmm13 + movaps xmmword ptr [rsp + 32 + 16*8], xmm14 + movaps xmmword ptr [rsp + 32 + 16*9], xmm15 call execute_ex_real - movsd xmm6, qword ptr [rsp + 32 + 8*0] - movsd xmm7, qword ptr [rsp + 32 + 8*1] - movsd xmm8, qword ptr [rsp + 32 + 8*2] - movsd xmm9, qword ptr [rsp + 32 + 8*3] - movsd xmm10, qword ptr [rsp + 32 + 8*4] - movsd xmm11, qword ptr [rsp + 32 + 8*5] - movsd xmm12, qword ptr [rsp + 32 + 8*6] - movsd xmm13, qword ptr [rsp + 32 + 8*7] - movsd xmm14, qword ptr [rsp + 32 + 8*8] - movsd xmm15, qword ptr [rsp + 32 + 8*9] - add rsp, 8*10 + 32 + 8 + movaps xmm6, xmmword ptr [rsp + 32 + 16*0] + movaps xmm7, xmmword ptr [rsp + 32 + 16*1] + movaps xmm8, xmmword ptr [rsp + 32 + 16*2] + movaps xmm9, xmmword ptr [rsp + 32 + 16*3] + movaps xmm10, xmmword ptr [rsp + 32 + 16*4] + movaps xmm11, xmmword ptr [rsp + 32 + 16*5] + movaps xmm12, xmmword ptr [rsp + 32 + 16*6] + movaps xmm13, xmmword ptr [rsp + 32 + 16*7] + movaps xmm14, xmmword ptr [rsp + 32 + 16*8] + movaps xmm15, xmmword ptr [rsp + 32 + 16*9] + add rsp, 16*10 + 32 + 8 ret execute_ex ENDP diff --git a/Zend/tests/GHSA-wm6j-2649-pv75.phpt b/Zend/tests/GHSA-wm6j-2649-pv75.phpt new file mode 100644 index 000000000000..c1035938bd7b --- /dev/null +++ b/Zend/tests/GHSA-wm6j-2649-pv75.phpt @@ -0,0 +1,24 @@ +--TEST-- +GHSA-wm6j-2649-pv75: Null pointer dereference in php_mb_check_encoding() via mb_ereg_search_init() +--CREDITS-- +vi3tL0u1s +--EXTENSIONS-- +mbstring +--SKIPIF-- + +--FILE-- + +--EXPECTF-- +Deprecated: Function mb_regex_encoding() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d + +Fatal error: Uncaught ValueError: mb_regex_encoding(): Argument #1 ($encoding) must be a valid encoding, "iso-8859-11" given in %s:%d +Stack trace: +#0 %s(%d): mb_regex_encoding('iso-8859-11') +#1 {main} + thrown in %s on line %d diff --git a/Zend/tests/assert/expect_015.phpt b/Zend/tests/assert/expect_015.phpt index 9f8e9b77003b..3bb08504f581 100644 --- a/Zend/tests/assert/expect_015.phpt +++ b/Zend/tests/assert/expect_015.phpt @@ -201,7 +201,7 @@ assert(0 && ($a = function &(array &$a, ?X $b = null) use($c, &$d): ?X { $s[$i] = $a[$j]; } foreach ($a as $key => &$val) { - print "$key => $val\n"; + print "{$key} => {$val}\n"; } while ($s[$i]) { $i++; @@ -299,12 +299,12 @@ assert(0 && ($a = function (): ?static { echo 1; } $x = '\'"`$a'; - $x = "'\"`$a"; - $x = `'"\`$a`; + $x = "'\"`{$a}"; + $x = `'"\`{$a}`; $x = "{$a}b"; $x = "{$a}b"; $x = " {$foo->bar} {${$foo->bar}} "; - $x = " ${---} "; + $x = " {${'---'}} "; foo(); \foo(); namespace\foo(); diff --git a/Zend/tests/assert/expect_020.phpt b/Zend/tests/assert/expect_020.phpt index d305667a28d7..2146abc96045 100644 --- a/Zend/tests/assert/expect_020.phpt +++ b/Zend/tests/assert/expect_020.phpt @@ -16,5 +16,5 @@ assert(0 && ($a = function () { --EXPECT-- assert(): assert(0 && ($a = function () { $var = 'test'; - $str = "$var, {$var[1]}, {$var}[], {$var[1]}[], {$var}[], {$var[1]}[]"; + $str = "{$var}, {$var[1]}, {$var}[], {$var[1]}[], {$var}[], {$var[1]}[]"; })) failed diff --git a/Zend/tests/bug74093.phpt b/Zend/tests/bug74093.phpt index d9adfeefa50e..d38d6e5109c4 100644 --- a/Zend/tests/bug74093.phpt +++ b/Zend/tests/bug74093.phpt @@ -1,5 +1,6 @@ --TEST-- Bug #74093 (Maximum execution time of n+2 seconds exceed not written in error_log) +--FLAKY-- --SKIPIF-- --EXPECTF-- diff --git a/Zend/tests/debug_info/debug_info-error-0.0.phpt b/Zend/tests/debug_info/debug_info-error-0.0.phpt index ab41b440fc88..4df25c4c95af 100644 --- a/Zend/tests/debug_info/debug_info-error-0.0.phpt +++ b/Zend/tests/debug_info/debug_info-error-0.0.phpt @@ -17,4 +17,4 @@ $c = new C(0.0); var_dump($c); ?> --EXPECTF-- -Fatal error: __debuginfo() must return an array in %s on line %d +Fatal error: __debugInfo() must return an array in %s on line %d diff --git a/Zend/tests/debug_info/debug_info-error-0.phpt b/Zend/tests/debug_info/debug_info-error-0.phpt index 37289c6468ff..c0cedf3b88e5 100644 --- a/Zend/tests/debug_info/debug_info-error-0.phpt +++ b/Zend/tests/debug_info/debug_info-error-0.phpt @@ -17,4 +17,4 @@ $c = new C(0); var_dump($c); ?> --EXPECTF-- -Fatal error: __debuginfo() must return an array in %s on line %d +Fatal error: __debugInfo() must return an array in %s on line %d diff --git a/Zend/tests/debug_info/debug_info-error-1.0.phpt b/Zend/tests/debug_info/debug_info-error-1.0.phpt index 9b168621b5ef..6af945cb0e37 100644 --- a/Zend/tests/debug_info/debug_info-error-1.0.phpt +++ b/Zend/tests/debug_info/debug_info-error-1.0.phpt @@ -17,4 +17,4 @@ $c = new C(1.0); var_dump($c); ?> --EXPECTF-- -Fatal error: __debuginfo() must return an array in %s on line %d +Fatal error: __debugInfo() must return an array in %s on line %d diff --git a/Zend/tests/debug_info/debug_info-error-1.phpt b/Zend/tests/debug_info/debug_info-error-1.phpt index ae01a6055c00..7cadd485118d 100644 --- a/Zend/tests/debug_info/debug_info-error-1.phpt +++ b/Zend/tests/debug_info/debug_info-error-1.phpt @@ -17,4 +17,4 @@ $c = new C(1); var_dump($c); ?> --EXPECTF-- -Fatal error: __debuginfo() must return an array in %s on line %d +Fatal error: __debugInfo() must return an array in %s on line %d diff --git a/Zend/tests/debug_info/debug_info-error-case-insensitive.phpt b/Zend/tests/debug_info/debug_info-error-case-insensitive.phpt new file mode 100644 index 000000000000..c2a6f4357a5c --- /dev/null +++ b/Zend/tests/debug_info/debug_info-error-case-insensitive.phpt @@ -0,0 +1,20 @@ +--TEST-- +Testing __debugInfo() magic method declared with non-canonical case +--FILE-- +val; + } + public function __construct($val) { + $this->val = $val; + } +} + +$c = new C(1); +var_dump($c); +?> +--EXPECTF-- +Fatal error: __debugInfo() must return an array in %s on line %d diff --git a/Zend/tests/debug_info/debug_info-error-empty_str.phpt b/Zend/tests/debug_info/debug_info-error-empty_str.phpt index bbab78cd8202..21611cc9bde5 100644 --- a/Zend/tests/debug_info/debug_info-error-empty_str.phpt +++ b/Zend/tests/debug_info/debug_info-error-empty_str.phpt @@ -17,4 +17,4 @@ $c = new C(""); var_dump($c); ?> --EXPECTF-- -Fatal error: __debuginfo() must return an array in %s on line %d +Fatal error: __debugInfo() must return an array in %s on line %d diff --git a/Zend/tests/debug_info/debug_info-error-false.phpt b/Zend/tests/debug_info/debug_info-error-false.phpt index 3e48372c420c..fb5a35c2d1e3 100644 --- a/Zend/tests/debug_info/debug_info-error-false.phpt +++ b/Zend/tests/debug_info/debug_info-error-false.phpt @@ -17,4 +17,4 @@ $c = new C(false); var_dump($c); ?> --EXPECTF-- -Fatal error: __debuginfo() must return an array in %s on line %d +Fatal error: __debugInfo() must return an array in %s on line %d diff --git a/Zend/tests/debug_info/debug_info-error-object.phpt b/Zend/tests/debug_info/debug_info-error-object.phpt index 42e073999908..5cdc6b289e62 100644 --- a/Zend/tests/debug_info/debug_info-error-object.phpt +++ b/Zend/tests/debug_info/debug_info-error-object.phpt @@ -17,4 +17,4 @@ $c = new C(new stdClass); var_dump($c); ?> --EXPECTF-- -Fatal error: __debuginfo() must return an array in %s on line %d +Fatal error: __debugInfo() must return an array in %s on line %d diff --git a/Zend/tests/debug_info/debug_info-error-resource.phpt b/Zend/tests/debug_info/debug_info-error-resource.phpt index ccacce7a74b4..1fc84fe83d87 100644 --- a/Zend/tests/debug_info/debug_info-error-resource.phpt +++ b/Zend/tests/debug_info/debug_info-error-resource.phpt @@ -19,4 +19,4 @@ $c = new C(fopen("data:text/plain,Foo", 'r')); var_dump($c); ?> --EXPECTF-- -Fatal error: __debuginfo() must return an array in %s on line %d +Fatal error: __debugInfo() must return an array in %s on line %d diff --git a/Zend/tests/debug_info/debug_info-error-str.phpt b/Zend/tests/debug_info/debug_info-error-str.phpt index 85d3f63b97e0..fe4201de1c9f 100644 --- a/Zend/tests/debug_info/debug_info-error-str.phpt +++ b/Zend/tests/debug_info/debug_info-error-str.phpt @@ -17,4 +17,4 @@ $c = new C("foo"); var_dump($c); ?> --EXPECTF-- -Fatal error: __debuginfo() must return an array in %s on line %d +Fatal error: __debugInfo() must return an array in %s on line %d diff --git a/Zend/tests/debug_info/debug_info-error-true.phpt b/Zend/tests/debug_info/debug_info-error-true.phpt index 3843c6a7a14a..12bb7329a856 100644 --- a/Zend/tests/debug_info/debug_info-error-true.phpt +++ b/Zend/tests/debug_info/debug_info-error-true.phpt @@ -17,4 +17,4 @@ $c = new C(true); var_dump($c); ?> --EXPECTF-- -Fatal error: __debuginfo() must return an array in %s on line %d +Fatal error: __debugInfo() must return an array in %s on line %d diff --git a/Zend/tests/debug_info/debug_info.phpt b/Zend/tests/debug_info/debug_info.phpt index bff5876777ba..e7bb4d48aec6 100644 --- a/Zend/tests/debug_info/debug_info.phpt +++ b/Zend/tests/debug_info/debug_info.phpt @@ -21,6 +21,12 @@ class Bar { } } +class Baz { + public function __debugInfo(): ?array { + return null; + } +} + $f = new Foo; var_dump($f); @@ -28,6 +34,7 @@ $b = new Bar; var_dump($b); ?> --EXPECTF-- +Deprecated: Returning null from Baz::__debugInfo() is deprecated, make the return type non-nullable and return an empty array instead in %s on line %d object(Foo)#%d (3) { ["a"]=> int(1) diff --git a/Zend/tests/display_error_function_args.phpt b/Zend/tests/display_error_function_args.phpt new file mode 100644 index 000000000000..c28a4a2808b4 --- /dev/null +++ b/Zend/tests/display_error_function_args.phpt @@ -0,0 +1,30 @@ +--TEST-- +Displaying function arguments in errors +--INI-- +error_include_args=On +--FILE-- + "123456789012345678901" . chr(0), "cost" => 4]; +password_hash("test", PASSWORD_BCRYPT, $flags); + +ini_set("error_include_args", "Off"); + +unlink('/'); +password_hash("test", PASSWORD_BCRYPT, $flags); + +?> +--EXPECTF-- +Warning: unlink('/'): %s in %s on line %d + +Warning: password_hash(Object(SensitiveParameterValue), '2y', Array): The "salt" option has been ignored, since providing a custom salt is no longer supported in %s on line %d + +Warning: unlink(/): %s in %s on line %d + +Warning: password_hash(): The "salt" option has been ignored, since providing a custom salt is no longer supported in %s on line %d diff --git a/Zend/tests/enum/__debugInfo.phpt b/Zend/tests/enum/__debugInfo.phpt deleted file mode 100644 index 33e0f49851f9..000000000000 --- a/Zend/tests/enum/__debugInfo.phpt +++ /dev/null @@ -1,16 +0,0 @@ ---TEST-- -Enum __debugInfo ---FILE-- -cases(); - } -} - -?> ---EXPECTF-- -Fatal error: Enum Foo cannot include magic method __debugInfo in %s on line %d diff --git a/Zend/tests/enum/debugInfo/backed_enum_value.phpt b/Zend/tests/enum/debugInfo/backed_enum_value.phpt new file mode 100644 index 000000000000..2bf56eb3a59e --- /dev/null +++ b/Zend/tests/enum/debugInfo/backed_enum_value.phpt @@ -0,0 +1,21 @@ +--TEST-- +Enum with __debugInfo() magic method - backed enum value accessible +--FILE-- +name . ' = ' . $this->value]; + } +} + +var_dump(Foo::Bar); + +?> +--EXPECT-- +enum(Foo::Bar) (1) { + [0]=> + string(14) "Foo::Bar = Baz" +} diff --git a/Zend/tests/enum/debugInfo/magic_method.phpt b/Zend/tests/enum/debugInfo/magic_method.phpt new file mode 100644 index 000000000000..4c5963f73b26 --- /dev/null +++ b/Zend/tests/enum/debugInfo/magic_method.phpt @@ -0,0 +1,21 @@ +--TEST-- +Enum supports __debugInfo() magic method +--FILE-- +name . ' is a case of the ' . __CLASS__ . ' enum']; + } +} + +var_dump(Foo::Bar); + +?> +--EXPECT-- +enum(Foo::Bar) (1) { + [0]=> + string(29) "Bar is a case of the Foo enum" +} diff --git a/Zend/tests/enum/debugInfo/missing_magic.phpt b/Zend/tests/enum/debugInfo/missing_magic.phpt new file mode 100644 index 000000000000..9cb5b0c69e52 --- /dev/null +++ b/Zend/tests/enum/debugInfo/missing_magic.phpt @@ -0,0 +1,14 @@ +--TEST-- +When an enum does not have __debugInfo() it is printed nicely +--FILE-- + +--EXPECT-- +enum(Foo::Bar) diff --git a/Zend/tests/enum/debugInfo/param_validation.phpt b/Zend/tests/enum/debugInfo/param_validation.phpt new file mode 100644 index 000000000000..84c60730822e --- /dev/null +++ b/Zend/tests/enum/debugInfo/param_validation.phpt @@ -0,0 +1,18 @@ +--TEST-- +Enum with __debugInfo() magic method - param validation +--FILE-- + +--EXPECTF-- +Fatal error: Method Foo::__debugInfo() cannot take arguments in %s on line %d diff --git a/Zend/tests/enum/debugInfo/return_validation.phpt b/Zend/tests/enum/debugInfo/return_validation.phpt new file mode 100644 index 000000000000..5583dcadf409 --- /dev/null +++ b/Zend/tests/enum/debugInfo/return_validation.phpt @@ -0,0 +1,18 @@ +--TEST-- +Enum with __debugInfo() magic method - return validation +--FILE-- + +--EXPECTF-- +Fatal error: Foo::__debugInfo(): Return type must be ?array when declared in %s on line %d diff --git a/Zend/tests/enum/debugInfo/visibility_validation.phpt b/Zend/tests/enum/debugInfo/visibility_validation.phpt new file mode 100644 index 000000000000..97e2f2c7456b --- /dev/null +++ b/Zend/tests/enum/debugInfo/visibility_validation.phpt @@ -0,0 +1,20 @@ +--TEST-- +Enum with __debugInfo() magic method - visibility validation +--FILE-- + +--EXPECTF-- +Warning: The magic method Foo::__debugInfo() must have public visibility in %s on line %d +enum(Foo::Bar) (0) { +} diff --git a/Zend/tests/enum/gh21760.phpt b/Zend/tests/enum/gh21760.phpt new file mode 100644 index 000000000000..0835e3ca937d --- /dev/null +++ b/Zend/tests/enum/gh21760.phpt @@ -0,0 +1,19 @@ +--TEST-- +GH-21760 (Trait with class constant name conflict against enum case causes SEGV) +--FILE-- + +--EXPECTF-- +Fatal error: Cannot use trait X, because X::Up conflicts with enum case Direction::Up in %s on line %d diff --git a/Zend/tests/fibers/gh19983.phpt b/Zend/tests/fibers/gh19983.phpt new file mode 100644 index 000000000000..554a7c8bf8ef --- /dev/null +++ b/Zend/tests/fibers/gh19983.phpt @@ -0,0 +1,32 @@ +--TEST-- +GH-19983 (GC Assertion Failure with fibers, generators and destructors) +--SKIPIF-- + +--INI-- +memory_limit=16M +--FILE-- +current(); + }); + $fiber->start(); + } +} +new a; +?> +--EXPECTF-- +Fatal error: Allowed memory size of %d bytes exhausted%s diff --git a/Zend/tests/gh16799.phpt b/Zend/tests/gh16799.phpt index ce1dbd5b1655..d31d1a5705c6 100644 --- a/Zend/tests/gh16799.phpt +++ b/Zend/tests/gh16799.phpt @@ -15,7 +15,12 @@ Test::test(); --EXPECTF-- Fatal error: Uncaught Exception: Use of "static" in callables is deprecated in %s:%d Stack trace: -#0 %s(%d): {closure:%s:%d}(8192, 'Use of "static"...', %s, %d) +#0 %s(%d): {closure:%s}(8192, 'Use of "static"%s', '%s', %d) #1 %s(%d): Test::test() #2 {main} + +Next TypeError: call_user_func(): Argument #1 ($callback) must be a valid callback, (null) in %s:%d +Stack trace: +#0 %s(%d): Test::test() +#1 {main} thrown in %s on line %d diff --git a/Zend/tests/gh21504.inc b/Zend/tests/gh21504.inc new file mode 100644 index 000000000000..71dc5c2e61f6 --- /dev/null +++ b/Zend/tests/gh21504.inc @@ -0,0 +1,3 @@ + var_dump(...); diff --git a/Zend/tests/gh21504.phpt b/Zend/tests/gh21504.phpt new file mode 100644 index 000000000000..5fd9eaff91ab --- /dev/null +++ b/Zend/tests/gh21504.phpt @@ -0,0 +1,12 @@ +--TEST-- +GH-21504: Incorrect RC-handling for ZEND_EXT_STMT op1 +--FILE-- + +--EXPECT-- +string(4) "1234" diff --git a/Zend/tests/gh21603.phpt b/Zend/tests/gh21603.phpt new file mode 100644 index 000000000000..ab2fbc44e797 --- /dev/null +++ b/Zend/tests/gh21603.phpt @@ -0,0 +1,22 @@ +--TEST-- +GH-21603: Missing addref for __unset +--CREDITS-- +cnwangjihe +--FILE-- +prop); + +?> +--EXPECTF-- +object(C)#%d (0) { +} diff --git a/Zend/tests/gh21605.phpt b/Zend/tests/gh21605.phpt new file mode 100644 index 000000000000..973339ad3bb9 --- /dev/null +++ b/Zend/tests/gh21605.phpt @@ -0,0 +1,24 @@ +--TEST-- +GH-21605: Missing addref for Countable::count() +--CREDITS-- +cnwangjihe +--FILE-- + +--EXPECTF-- +object(C)#%d (0) { +} +int(42) diff --git a/Zend/tests/gh_21699.phpt b/Zend/tests/gh_21699.phpt new file mode 100644 index 000000000000..49b58365dabf --- /dev/null +++ b/Zend/tests/gh_21699.phpt @@ -0,0 +1,31 @@ +--TEST-- +GH-21699: Assertion failure in shutdown_executor when error handler throws during self:: callable resolution +--FILE-- +test(); +?> +--EXPECTF-- +Fatal error: Uncaught Exception in %s:%d +Stack trace: +#0 %s(%d): {closure:%s}(%d, 'Use of "self" i%s', '%s', %d) +#1 %s(%d): bar->test() +#2 {main} + +Next TypeError: call_user_func(): Argument #1 ($callback) must be a valid callback, (null) in %s:%d +Stack trace: +#0 %s(%d): bar->test() +#1 {main} + thrown in %s on line %d diff --git a/Zend/tests/gh_21699_parent.phpt b/Zend/tests/gh_21699_parent.phpt new file mode 100644 index 000000000000..73cae41f3f5b --- /dev/null +++ b/Zend/tests/gh_21699_parent.phpt @@ -0,0 +1,32 @@ +--TEST-- +GH-21699 (parent::): no shutdown_executor trampoline assertion when error handler throws during parent:: callable resolution +--FILE-- +test(); +?> +--EXPECTF-- +Fatal error: Uncaught Exception in %s:%d +Stack trace: +#0 %s(%d): {closure:%s}(%d, 'Use of "parent"%s', '%s', %d) +#1 %s(%d): Child->test() +#2 {main} + +Next TypeError: call_user_func(): Argument #1 ($callback) must be a valid callback, (null) in %s:%d +Stack trace: +#0 %s(%d): Child->test() +#1 {main} + thrown in %s on line %d diff --git a/Zend/tests/gh_21699_static.phpt b/Zend/tests/gh_21699_static.phpt new file mode 100644 index 000000000000..4d9604ebe77b --- /dev/null +++ b/Zend/tests/gh_21699_static.phpt @@ -0,0 +1,31 @@ +--TEST-- +GH-21699 (static::): no shutdown_executor trampoline assertion when error handler throws during static:: callable resolution +--FILE-- +test(); +?> +--EXPECTF-- +Fatal error: Uncaught Exception in %s:%d +Stack trace: +#0 %s(%d): {closure:%s}(%d, 'Use of "static"%s', '%s', %d) +#1 %s(%d): bar->test() +#2 {main} + +Next TypeError: call_user_func(): Argument #1 ($callback) must be a valid callback, (null) in %s:%d +Stack trace: +#0 %s(%d): bar->test() +#1 {main} + thrown in %s on line %d diff --git a/Zend/tests/lazy_objects/gh18038-002.phpt b/Zend/tests/lazy_objects/gh18038-002.phpt index 4c12f21de811..d363731c62a0 100644 --- a/Zend/tests/lazy_objects/gh18038-002.phpt +++ b/Zend/tests/lazy_objects/gh18038-002.phpt @@ -34,5 +34,4 @@ var_dump($obj->prop); --EXPECT-- init string(19) "RealInstance::__set" -string(12) "Proxy::__set" int(2) diff --git a/Zend/tests/lazy_objects/gh18038-004.phpt b/Zend/tests/lazy_objects/gh18038-004.phpt index 8810efb6bec2..c1495c5a6d8d 100644 --- a/Zend/tests/lazy_objects/gh18038-004.phpt +++ b/Zend/tests/lazy_objects/gh18038-004.phpt @@ -36,7 +36,6 @@ var_dump($real->prop); --EXPECTF-- init string(19) "RealInstance::__get" -string(12) "Proxy::__get" Warning: Undefined property: RealInstance::$prop in %s on line %d NULL diff --git a/Zend/tests/lazy_objects/gh18038-007.phpt b/Zend/tests/lazy_objects/gh18038-007.phpt index 9925190a1980..4c7c0d0b4b0a 100644 --- a/Zend/tests/lazy_objects/gh18038-007.phpt +++ b/Zend/tests/lazy_objects/gh18038-007.phpt @@ -36,6 +36,5 @@ var_dump(isset($real->prop[''])); --EXPECT-- init string(21) "RealInstance::__isset" -string(14) "Proxy::__isset" bool(false) bool(false) diff --git a/Zend/tests/lazy_objects/gh18038-009.phpt b/Zend/tests/lazy_objects/gh18038-009.phpt index 3c165a71ccff..11067cdb970b 100644 --- a/Zend/tests/lazy_objects/gh18038-009.phpt +++ b/Zend/tests/lazy_objects/gh18038-009.phpt @@ -36,6 +36,5 @@ var_dump(isset($real->prop)); --EXPECT-- init string(21) "RealInstance::__isset" -string(14) "Proxy::__isset" bool(false) bool(false) diff --git a/Zend/tests/lazy_objects/gh20854.phpt b/Zend/tests/lazy_objects/gh20854.phpt new file mode 100644 index 000000000000..26a69cfcbbf5 --- /dev/null +++ b/Zend/tests/lazy_objects/gh20854.phpt @@ -0,0 +1,22 @@ +--TEST-- +GH-20854 (Assertion in ZEND_RETURN_BY_REF with lazy proxy and return-by-ref __get) +--FILE-- +x; + } +} + +$rc = new ReflectionClass(C::class); +$obj = $rc->newLazyProxy(function () { + return new C; +}); +$obj->x; +echo "Done\n"; +?> +--EXPECTF-- +Deprecated: Creation of dynamic property C::$x is deprecated in %s on line %d +Done diff --git a/Zend/tests/lazy_objects/gh20873.phpt b/Zend/tests/lazy_objects/gh20873.phpt new file mode 100644 index 000000000000..e5b8c31e9130 --- /dev/null +++ b/Zend/tests/lazy_objects/gh20873.phpt @@ -0,0 +1,30 @@ +--TEST-- +GH-20873 (Assertion failure in _zendi_try_convert_scalar_to_number with lazy proxy) +--FILE-- +x =& $this->_; + static $a = $a; + $e =& $this->_ - $a; + } +} +$rc = new ReflectionClass(A::class); +$obj = $rc->newLazyProxy(fn() => new A); +$rc->initializeLazyObject($obj); +var_dump($obj->p); +?> +--EXPECTF-- +Deprecated: Creation of dynamic property A::$x is deprecated in %s on line %d + +Warning: Undefined variable $a in %s on line %d + +Notice: Indirect modification of overloaded property A::$x has no effect in %s on line %d + +Fatal error: Uncaught Error: Cannot assign by reference to overloaded object in %s:%d +Stack trace: +#0 %s(%d): A->__get('p') +#1 {main} + thrown in %s on line %d diff --git a/Zend/tests/lazy_objects/gh20875.phpt b/Zend/tests/lazy_objects/gh20875.phpt new file mode 100644 index 000000000000..ff036edabd59 --- /dev/null +++ b/Zend/tests/lazy_objects/gh20875.phpt @@ -0,0 +1,41 @@ +--TEST-- +GH-20875 (Assertion failure in _get_zval_ptr_tmp with lazy proxy) +--FILE-- +f =& $this->b - $x > $y = new StdClass; + static $a = $a; + $t = 'x'; + foreach (get_defined_vars() as $key => $e) {} + if ($v ==!1) $x = $a ?: $t = "ok"; + } +} +$rc = new ReflectionClass(A::class); +$obj = $rc->newLazyProxy(function () { return new A; }); +$real = $rc->initializeLazyObject($obj); +var_dump($real->prop); +?> +--EXPECTF-- +Deprecated: Creation of dynamic property A::$b is deprecated in %s on line %d + +Deprecated: Creation of dynamic property A::$f is deprecated in %s on line %d + +Warning: Undefined variable $x in %s on line %d + +Notice: Object of class stdClass could not be converted to int in %s on line %d + +Warning: Undefined variable $a in %s on line %d + +Warning: Undefined variable $v in %s on line %d + +Notice: Indirect modification of overloaded property A::$f has no effect in %s on line %d + +Fatal error: Uncaught Error: Cannot assign by reference to overloaded object in %s:%d +Stack trace: +#0 %s(%d): A->__get('b') +#1 %s(%d): A->__get('prop') +#2 {main} + thrown in %s on line %d diff --git a/Zend/tests/lazy_objects/gh20875_proxy_get_no_init.phpt b/Zend/tests/lazy_objects/gh20875_proxy_get_no_init.phpt new file mode 100644 index 000000000000..d5d9754864b4 --- /dev/null +++ b/Zend/tests/lazy_objects/gh20875_proxy_get_no_init.phpt @@ -0,0 +1,23 @@ +--TEST-- +GH-20875 (Lazy proxy should not initialize when __get handles dynamic property access) +--FILE-- +newLazyProxy(function () { + echo "init\n"; + return new Foo(); +}); +$x = &$proxy->x; + +?> +--EXPECT-- +__get diff --git a/Zend/tests/lazy_objects/gh21478-isset.phpt b/Zend/tests/lazy_objects/gh21478-isset.phpt new file mode 100644 index 000000000000..9138984af01b --- /dev/null +++ b/Zend/tests/lazy_objects/gh21478-isset.phpt @@ -0,0 +1,30 @@ +--TEST-- +GH-21478: __isset on lazy proxy should not double-invoke when real instance guard is set +--FILE-- +{$name}); + } +} + +class Bar extends Foo {} + +$rc = new ReflectionClass(Bar::class); +$proxy = $rc->newLazyProxy(function () { + echo "Init\n"; + return new Foo(); +}); + +$real = $rc->initializeLazyObject($proxy); +isset($real->x); + +?> +--EXPECT-- +Init +__isset($x) on Foo diff --git a/Zend/tests/lazy_objects/gh21478-proxy-get-override.phpt b/Zend/tests/lazy_objects/gh21478-proxy-get-override.phpt new file mode 100644 index 000000000000..520c8f662353 --- /dev/null +++ b/Zend/tests/lazy_objects/gh21478-proxy-get-override.phpt @@ -0,0 +1,30 @@ +--TEST-- +GH-21478: Proxy's own __get runs when accessed directly (not from real instance) +--FILE-- +newLazyProxy(function () { + return new Foo(); +}); +$rc->initializeLazyObject($proxy); + +$proxy->x; + +?> +--EXPECT-- +Bar x diff --git a/Zend/tests/lazy_objects/gh21478-proxy-get-ref-forward.phpt b/Zend/tests/lazy_objects/gh21478-proxy-get-ref-forward.phpt new file mode 100644 index 000000000000..fa737cf18f2e --- /dev/null +++ b/Zend/tests/lazy_objects/gh21478-proxy-get-ref-forward.phpt @@ -0,0 +1,32 @@ +--TEST-- +GH-21478: No assertion failure when &__get forwards through initialized lazy proxy +--FILE-- +{$name}; + } +} + +class Bar extends Foo {} + +$rc = new ReflectionClass(Bar::class); +$proxy = $rc->newLazyProxy(function () { + echo "Init\n"; + return new Foo(); +}); + +$real = $rc->initializeLazyObject($proxy); +$a = &$real->x; +var_dump($a); +?> +--EXPECTF-- +Init +Foo::__get($x) on Foo + +Warning: Undefined property: Foo::$x in %s on line %d +NULL diff --git a/Zend/tests/lazy_objects/gh21478-set.phpt b/Zend/tests/lazy_objects/gh21478-set.phpt new file mode 100644 index 000000000000..0b2f872de11a --- /dev/null +++ b/Zend/tests/lazy_objects/gh21478-set.phpt @@ -0,0 +1,32 @@ +--TEST-- +GH-21478: __set on lazy proxy should not double-invoke when real instance guard is set +--FILE-- +{$name} = $value; + } +} + +#[AllowDynamicProperties] +class Bar extends Foo {} + +$rc = new ReflectionClass(Bar::class); +$proxy = $rc->newLazyProxy(function () { + echo "Init\n"; + return new Foo(); +}); + +$real = $rc->initializeLazyObject($proxy); +$real->x = 1; + +?> +--EXPECT-- +Init +__set($x) on Foo diff --git a/Zend/tests/lazy_objects/gh21478-unset.phpt b/Zend/tests/lazy_objects/gh21478-unset.phpt new file mode 100644 index 000000000000..5febbd235d82 --- /dev/null +++ b/Zend/tests/lazy_objects/gh21478-unset.phpt @@ -0,0 +1,30 @@ +--TEST-- +GH-21478: __unset on lazy proxy should not double-invoke when real instance guard is set +--FILE-- +{$name}); + } +} + +class Bar extends Foo {} + +$rc = new ReflectionClass(Bar::class); +$proxy = $rc->newLazyProxy(function () { + echo "Init\n"; + return new Foo(); +}); + +$real = $rc->initializeLazyObject($proxy); +unset($real->x); + +?> +--EXPECT-- +Init +__unset($x) on Foo diff --git a/Zend/tests/lazy_objects/gh21478.phpt b/Zend/tests/lazy_objects/gh21478.phpt new file mode 100644 index 000000000000..aaa226a9a09a --- /dev/null +++ b/Zend/tests/lazy_objects/gh21478.phpt @@ -0,0 +1,32 @@ +--TEST-- +GH-21478 (Property access on lazy proxy may invoke magic method despite real instance guards) +--FILE-- +{$name}; + } +} + +class Bar extends Foo {} + +$rc = new ReflectionClass(Bar::class); +$proxy = $rc->newLazyProxy(function () { + echo "Init\n"; + return new Foo(); +}); + +$real = $rc->initializeLazyObject($proxy); +$real->x; + +?> +--EXPECTF-- +Init +__get($x) on Foo + +Warning: Undefined property: Foo::$x in %s on line %d diff --git a/Zend/tests/magic_methods/magic_methods_inheritance_rules.phpt b/Zend/tests/magic_methods/magic_methods_inheritance_rules.phpt index 6bdcafb1bfb5..a4076ee00ce2 100644 --- a/Zend/tests/magic_methods/magic_methods_inheritance_rules.phpt +++ b/Zend/tests/magic_methods/magic_methods_inheritance_rules.phpt @@ -66,5 +66,6 @@ class WidenedArgumentType extends NarrowedReturnType { echo 'No problems!'; ?> ---EXPECT-- +--EXPECTF-- +Deprecated: Returning null from ValidMagicMethods::__debugInfo() is deprecated, make the return type non-nullable and return an empty array instead in %s on line %d No problems! diff --git a/Zend/tests/magic_methods/stringable_automatic_implementation_case_insensitive.phpt b/Zend/tests/magic_methods/stringable_automatic_implementation_case_insensitive.phpt new file mode 100644 index 000000000000..7f4564794452 --- /dev/null +++ b/Zend/tests/magic_methods/stringable_automatic_implementation_case_insensitive.phpt @@ -0,0 +1,23 @@ +--TEST-- +Stringable is automatically implemented for __toString() declared with non-canonical case +--FILE-- +getInterfaceNames()); +var_dump((string) new Test); + +?> +--EXPECT-- +bool(true) +array(1) { + [0]=> + string(10) "Stringable" +} +string(3) "foo" diff --git a/Zend/tests/return_types/042.phpt b/Zend/tests/return_types/042.phpt index 069e0228ff99..21483047d4f2 100644 --- a/Zend/tests/return_types/042.phpt +++ b/Zend/tests/return_types/042.phpt @@ -20,5 +20,10 @@ class JustAnArray { echo 'No problems!'; ?> ---EXPECT-- +--EXPECTF-- +Deprecated: Returning null from UnionType::__debugInfo() is deprecated, make the return type non-nullable and return an empty array instead in %s on line %d + +Deprecated: Returning null from UnionType2::__debugInfo() is deprecated, make the return type non-nullable and return an empty array instead in %s on line %d + +Deprecated: Returning null from UnionTypeOldStyle::__debugInfo() is deprecated, make the return type non-nullable and return an empty array instead in %s on line %d No problems! diff --git a/Zend/tests/try/gh22280.phpt b/Zend/tests/try/gh22280.phpt new file mode 100644 index 000000000000..30944aff59a6 --- /dev/null +++ b/Zend/tests/try/gh22280.phpt @@ -0,0 +1,19 @@ +--TEST-- +GH-22280: goto to label before try/finally after try/catch +--FILE-- + +--EXPECT-- +try +finally +done diff --git a/Zend/tests/type_coercion/gh22112.phpt b/Zend/tests/type_coercion/gh22112.phpt new file mode 100644 index 000000000000..84fdc393a828 --- /dev/null +++ b/Zend/tests/type_coercion/gh22112.phpt @@ -0,0 +1,35 @@ +--TEST-- +GH-22112 (Assertion failure when error handler throws during NaN to bool/string coercion at function entry) +--FILE-- +getMessage(), "\n"; +} + +try { + take_string($nan); +} catch (Exception $e) { + echo "string: ", $e->getMessage(), "\n"; +} + +?> +--EXPECT-- +bool: unexpected NAN value was coerced to bool +string: unexpected NAN value was coerced to string diff --git a/Zend/tests/vm_kind_tailcall_clang_windows.phpt b/Zend/tests/vm_kind_tailcall_clang_windows.phpt new file mode 100644 index 000000000000..f66a17ae0daf --- /dev/null +++ b/Zend/tests/vm_kind_tailcall_clang_windows.phpt @@ -0,0 +1,25 @@ +--TEST-- +Tailcall VM is selected when compiled with Clang >= 19 on Windows x64 +--SKIPIF-- + clang version (\d+)/', $info, $m)) { + die('skip not compiled with clang'); +} + +if ((int)$m[1] < 19) { + die('skip requires clang >= 19'); +} +?> +--FILE-- + +--EXPECT-- +string(21) "ZEND_VM_KIND_TAILCALL" diff --git a/Zend/zend.c b/Zend/zend.c index bce1faede8fb..f16b1a30dbbc 100644 --- a/Zend/zend.c +++ b/Zend/zend.c @@ -2,15 +2,14 @@ +----------------------------------------------------------------------+ | Zend Engine | +----------------------------------------------------------------------+ - | Copyright (c) Zend Technologies Ltd. (http://www.zend.com) | + | Copyright © Zend Technologies Ltd., a subsidiary company of | + | Perforce Software, Inc., and Contributors. | +----------------------------------------------------------------------+ - | This source file is subject to version 2.00 of the Zend license, | - | that is bundled with this package in the file LICENSE, and is | - | available through the world-wide-web at the following url: | - | http://www.zend.com/license/2_00.txt. | - | If you did not receive a copy of the Zend license and are unable to | - | obtain it through the world-wide-web, please send a note to | - | license@zend.com so we can mail you a copy immediately. | + | This source file is subject to the Modified BSD License that is | + | bundled with this package in the file LICENSE, and is available | + | through the World Wide Web at . | + | | + | SPDX-License-Identifier: BSD-3-Clause | +----------------------------------------------------------------------+ | Authors: Andi Gutmans | | Zeev Suraski | @@ -78,7 +77,7 @@ ZEND_API bool zend_dtrace_enabled; /* version information */ static char *zend_version_info; static uint32_t zend_version_info_length; -#define ZEND_CORE_VERSION_INFO "Zend Engine v" ZEND_VERSION ", Copyright (c) Zend Technologies\n" +#define ZEND_CORE_VERSION_INFO "Zend Engine v" ZEND_VERSION ", Copyright © Zend by Perforce\n" #define PRINT_ZVAL_INDENT 4 /* true multithread-shared globals */ @@ -565,6 +564,7 @@ static void zend_print_zval_r_to_buf(smart_str *buf, zval *expr, int indent) /* zend_object *zobj = Z_OBJ_P(expr); uint32_t *guard = zend_get_recursion_guard(zobj); zend_string *class_name = Z_OBJ_HANDLER_P(expr, get_class_name)(zobj); + /* cut off on NULL byte ... class@anonymous */ smart_str_appends(buf, ZSTR_VAL(class_name)); zend_string_release_ex(class_name, 0); @@ -811,6 +811,7 @@ static void executor_globals_ctor(zend_executor_globals *executor_globals) /* {{ executor_globals->user_error_handler_error_reporting = 0; ZVAL_UNDEF(&executor_globals->user_error_handler); ZVAL_UNDEF(&executor_globals->user_exception_handler); + ZVAL_UNDEF(&executor_globals->last_fatal_error_backtrace); executor_globals->current_execute_data = NULL; executor_globals->current_module = NULL; executor_globals->exit_status = 0; @@ -832,8 +833,7 @@ static void executor_globals_ctor(zend_executor_globals *executor_globals) /* {{ #endif executor_globals->flags = EG_FLAGS_INITIAL; executor_globals->record_errors = false; - executor_globals->num_errors = 0; - executor_globals->errors = NULL; + memset(&executor_globals->errors, 0, sizeof(executor_globals->errors)); executor_globals->filename_override = NULL; executor_globals->lineno_override = -1; #ifdef ZEND_CHECK_STACK_LIMIT @@ -1304,7 +1304,7 @@ ZEND_API void zend_append_version_info(const zend_extension *extension) /* {{{ * snprintf(new_info, new_info_length, " with %s v%s, %s, by %s\n", extension->name, extension->version, extension->copyright, extension->author); - zend_version_info = (char *) realloc(zend_version_info, zend_version_info_length+new_info_length + 1); + zend_version_info = (char *) perealloc(zend_version_info, zend_version_info_length+new_info_length + 1, true); strncat(zend_version_info, new_info, new_info_length); zend_version_info_length += new_info_length; free(new_info); @@ -1445,8 +1445,7 @@ ZEND_API ZEND_COLD void zend_error_zstr_at( zend_stack delayed_oplines_stack; int type = orig_type & E_ALL; bool orig_record_errors; - uint32_t orig_num_errors; - zend_error_info **orig_errors; + zend_err_buf orig_errors_buf; zend_result res; /* If we're executing a function during SCCP, count any warnings that may be emitted, @@ -1458,11 +1457,9 @@ ZEND_API ZEND_COLD void zend_error_zstr_at( } /* Emit any delayed error before handling fatal error */ - if ((type & E_FATAL_ERRORS) && !(type & E_DONT_BAIL) && EG(num_errors)) { - uint32_t num_errors = EG(num_errors); - zend_error_info **errors = EG(errors); - EG(num_errors) = 0; - EG(errors) = NULL; + if ((type & E_FATAL_ERRORS) && !(type & E_DONT_BAIL) && EG(errors).size) { + zend_err_buf errors_buf = EG(errors); + EG(errors).size = 0; bool orig_record_errors = EG(record_errors); EG(record_errors) = false; @@ -1472,12 +1469,11 @@ ZEND_API ZEND_COLD void zend_error_zstr_at( int orig_user_error_handler_error_reporting = EG(user_error_handler_error_reporting); EG(user_error_handler_error_reporting) = 0; - zend_emit_recorded_errors_ex(num_errors, errors); + zend_emit_recorded_errors_ex(errors_buf.size, errors_buf.errors); EG(user_error_handler_error_reporting) = orig_user_error_handler_error_reporting; EG(record_errors) = orig_record_errors; - EG(num_errors) = num_errors; - EG(errors) = errors; + EG(errors) = errors_buf; } if (EG(record_errors)) { @@ -1486,12 +1482,13 @@ ZEND_API ZEND_COLD void zend_error_zstr_at( info->lineno = error_lineno; info->filename = zend_string_copy(error_filename); info->message = zend_string_copy(message); - - /* This is very inefficient for a large number of errors. - * Use pow2 realloc if it becomes a problem. */ - EG(num_errors)++; - EG(errors) = erealloc(EG(errors), sizeof(zend_error_info*) * EG(num_errors)); - EG(errors)[EG(num_errors)-1] = info; + EG(errors).size++; + if (EG(errors).size > EG(errors).capacity) { + uint32_t capacity = EG(errors).capacity ? EG(errors).capacity + (EG(errors).capacity >> 1) : 2; + EG(errors).errors = erealloc(EG(errors).errors, sizeof(zend_error_info *) * capacity); + EG(errors).capacity = capacity; + } + EG(errors).errors[EG(errors).size - 1] = info; /* Do not process non-fatal recorded error */ if (!(type & E_FATAL_ERRORS) || (type & E_DONT_BAIL)) { @@ -1574,17 +1571,15 @@ ZEND_API ZEND_COLD void zend_error_zstr_at( } orig_record_errors = EG(record_errors); - orig_num_errors = EG(num_errors); - orig_errors = EG(errors); EG(record_errors) = false; - EG(num_errors) = 0; - EG(errors) = NULL; + + orig_errors_buf = EG(errors); + memset(&EG(errors), 0, sizeof(EG(errors))); res = call_user_function(CG(function_table), NULL, &orig_user_error_handler, &retval, 4, params); EG(record_errors) = orig_record_errors; - EG(num_errors) = orig_num_errors; - EG(errors) = orig_errors; + EG(errors) = orig_errors_buf; if (res == SUCCESS) { if (Z_TYPE(retval) != IS_UNDEF) { @@ -1779,8 +1774,7 @@ ZEND_API void zend_begin_record_errors(void) { ZEND_ASSERT(!EG(record_errors) && "Error recording already enabled"); EG(record_errors) = true; - EG(num_errors) = 0; - EG(errors) = NULL; + EG(errors).size = 0; } ZEND_API void zend_emit_recorded_errors_ex(uint32_t num_errors, zend_error_info **errors) @@ -1794,24 +1788,23 @@ ZEND_API void zend_emit_recorded_errors_ex(uint32_t num_errors, zend_error_info ZEND_API void zend_emit_recorded_errors(void) { EG(record_errors) = false; - zend_emit_recorded_errors_ex(EG(num_errors), EG(errors)); + zend_emit_recorded_errors_ex(EG(errors).size, EG(errors).errors); } ZEND_API void zend_free_recorded_errors(void) { - if (!EG(num_errors)) { + if (!EG(errors).size) { return; } - for (uint32_t i = 0; i < EG(num_errors); i++) { - zend_error_info *info = EG(errors)[i]; + for (uint32_t i = 0; i < EG(errors).size; i++) { + zend_error_info *info = EG(errors).errors[i]; zend_string_release(info->filename); zend_string_release(info->message); - efree(info); + efree_size(info, sizeof(zend_error_info)); } - efree(EG(errors)); - EG(errors) = NULL; - EG(num_errors) = 0; + efree(EG(errors).errors); + memset(&EG(errors), 0, sizeof(EG(errors))); } ZEND_API ZEND_COLD void zend_throw_error(zend_class_entry *exception_ce, const char *format, ...) /* {{{ */ diff --git a/Zend/zend.h b/Zend/zend.h index ebb7d2391955..0d5303192b57 100644 --- a/Zend/zend.h +++ b/Zend/zend.h @@ -2,15 +2,14 @@ +----------------------------------------------------------------------+ | Zend Engine | +----------------------------------------------------------------------+ - | Copyright (c) Zend Technologies Ltd. (http://www.zend.com) | + | Copyright © Zend Technologies Ltd., a subsidiary company of | + | Perforce Software, Inc., and Contributors. | +----------------------------------------------------------------------+ - | This source file is subject to version 2.00 of the Zend license, | - | that is bundled with this package in the file LICENSE, and is | - | available through the world-wide-web at the following url: | - | http://www.zend.com/license/2_00.txt. | - | If you did not receive a copy of the Zend license and are unable to | - | obtain it through the world-wide-web, please send a note to | - | license@zend.com so we can mail you a copy immediately. | + | This source file is subject to the Modified BSD License that is | + | bundled with this package in the file LICENSE, and is available | + | through the World Wide Web at . | + | | + | SPDX-License-Identifier: BSD-3-Clause | +----------------------------------------------------------------------+ | Authors: Andi Gutmans | | Zeev Suraski | @@ -281,7 +280,9 @@ typedef size_t (*zend_write_func_t)(const char *str, size_t str_length); EG(bailout) = &__bailout; \ if (SETJMP(__bailout)==0) { #define zend_catch \ + ZEND_ASSERT(EG(bailout) == &__bailout); \ } else { \ + ZEND_ASSERT(EG(bailout) == &__bailout); \ EG(bailout) = __orig_bailout; #define zend_end_try() \ } \ diff --git a/Zend/zend_API.c b/Zend/zend_API.c index 211a5d14e6c3..e334b18fe1a4 100644 --- a/Zend/zend_API.c +++ b/Zend/zend_API.c @@ -2,15 +2,14 @@ +----------------------------------------------------------------------+ | Zend Engine | +----------------------------------------------------------------------+ - | Copyright (c) Zend Technologies Ltd. (http://www.zend.com) | + | Copyright © Zend Technologies Ltd., a subsidiary company of | + | Perforce Software, Inc., and Contributors. | +----------------------------------------------------------------------+ - | This source file is subject to version 2.00 of the Zend license, | - | that is bundled with this package in the file LICENSE, and is | - | available through the world-wide-web at the following url: | - | http://www.zend.com/license/2_00.txt. | - | If you did not receive a copy of the Zend license and are unable to | - | obtain it through the world-wide-web, please send a note to | - | license@zend.com so we can mail you a copy immediately. | + | This source file is subject to the Modified BSD License that is | + | bundled with this package in the file LICENSE, and is available | + | through the World Wide Web at . | + | | + | SPDX-License-Identifier: BSD-3-Clause | +----------------------------------------------------------------------+ | Authors: Andi Gutmans | | Zeev Suraski | @@ -126,7 +125,7 @@ ZEND_API const char *zend_get_type_by_const(int type) /* {{{ */ return "mixed"; case _IS_NUMBER: return "int|float"; - EMPTY_SWITCH_DEFAULT_CASE() + default: ZEND_UNREACHABLE(); } } /* }}} */ @@ -262,7 +261,7 @@ ZEND_API ZEND_COLD void ZEND_FASTCALL zend_wrong_parameter_error(int error_code, case ZPP_ERROR_FAILURE: ZEND_ASSERT(EG(exception) && "Should have produced an error already"); break; - EMPTY_SWITCH_DEFAULT_CASE() + default: ZEND_UNREACHABLE(); } } /* }}} */ @@ -510,35 +509,37 @@ static ZEND_COLD bool zend_null_arg_deprecated(const char *fallback_type, uint32 return !EG(exception); } -ZEND_API bool ZEND_FASTCALL zend_parse_arg_bool_weak(const zval *arg, bool *dest, uint32_t arg_num) /* {{{ */ +ZEND_API zpp_parse_bool_status ZEND_FASTCALL zend_parse_arg_bool_weak(const zval *arg, uint32_t arg_num) /* {{{ */ { if (EXPECTED(Z_TYPE_P(arg) <= IS_STRING)) { if (UNEXPECTED(Z_TYPE_P(arg) == IS_NULL) && !zend_null_arg_deprecated("bool", arg_num)) { - return 0; + return ZPP_PARSE_BOOL_STATUS_ERROR; } - *dest = zend_is_true(arg); - } else { - return 0; + bool result = zend_is_true(arg); + if (UNEXPECTED(EG(exception))) { + return ZPP_PARSE_BOOL_STATUS_ERROR; + } + return result; } - return 1; + return ZPP_PARSE_BOOL_STATUS_ERROR; } /* }}} */ -ZEND_API bool ZEND_FASTCALL zend_parse_arg_bool_slow(const zval *arg, bool *dest, uint32_t arg_num) /* {{{ */ +ZEND_API zpp_parse_bool_status ZEND_FASTCALL zend_parse_arg_bool_slow(const zval *arg, uint32_t arg_num) /* {{{ */ { if (UNEXPECTED(ZEND_ARG_USES_STRICT_TYPES())) { - return 0; + return ZPP_PARSE_BOOL_STATUS_ERROR; } - return zend_parse_arg_bool_weak(arg, dest, arg_num); + return zend_parse_arg_bool_weak(arg, arg_num); } /* }}} */ -ZEND_API bool ZEND_FASTCALL zend_flf_parse_arg_bool_slow(const zval *arg, bool *dest, uint32_t arg_num) +ZEND_API zpp_parse_bool_status ZEND_FASTCALL zend_flf_parse_arg_bool_slow(const zval *arg, uint32_t arg_num) { if (UNEXPECTED(ZEND_FLF_ARG_USES_STRICT_TYPES())) { - return 0; + return ZPP_PARSE_BOOL_STATUS_ERROR; } - return zend_parse_arg_bool_weak(arg, dest, arg_num); + return zend_parse_arg_bool_weak(arg, arg_num); } ZEND_API bool ZEND_FASTCALL zend_parse_arg_long_weak(const zval *arg, zend_long *dest, uint32_t arg_num) /* {{{ */ @@ -625,44 +626,46 @@ ZEND_API bool ZEND_FASTCALL zend_flf_parse_arg_long_slow(const zval *arg, zend_l return zend_parse_arg_long_weak(arg, dest, arg_num); } -ZEND_API bool ZEND_FASTCALL zend_parse_arg_double_weak(const zval *arg, double *dest, uint32_t arg_num) /* {{{ */ +ZEND_API double ZEND_FASTCALL zend_parse_arg_double_weak(const zval *arg, uint32_t arg_num) /* {{{ */ { if (EXPECTED(Z_TYPE_P(arg) == IS_LONG)) { - *dest = (double)Z_LVAL_P(arg); + return (double)Z_LVAL_P(arg); } else if (EXPECTED(Z_TYPE_P(arg) == IS_STRING)) { zend_long l; + double dval; uint8_t type; - if (UNEXPECTED((type = is_numeric_str_function(Z_STR_P(arg), &l, dest)) != IS_DOUBLE)) { + if (UNEXPECTED((type = is_numeric_str_function(Z_STR_P(arg), &l, &dval)) != IS_DOUBLE)) { if (EXPECTED(type != 0)) { - *dest = (double)(l); + return (double)(l); } else { - return 0; + return NAN; } + } else { + return dval; } } else if (EXPECTED(Z_TYPE_P(arg) < IS_TRUE)) { if (UNEXPECTED(Z_TYPE_P(arg) == IS_NULL) && !zend_null_arg_deprecated("float", arg_num)) { - return 0; + return NAN; } - *dest = 0.0; + return 0.0; } else if (EXPECTED(Z_TYPE_P(arg) == IS_TRUE)) { - *dest = 1.0; + return 1.0; } else { - return 0; + return NAN; } - return 1; } /* }}} */ -ZEND_API bool ZEND_FASTCALL zend_parse_arg_double_slow(const zval *arg, double *dest, uint32_t arg_num) /* {{{ */ +ZEND_API double ZEND_FASTCALL zend_parse_arg_double_slow(const zval *arg, uint32_t arg_num) /* {{{ */ { if (EXPECTED(Z_TYPE_P(arg) == IS_LONG)) { /* SSTH Exception: IS_LONG may be accepted instead as IS_DOUBLE */ - *dest = (double)Z_LVAL_P(arg); + return (double)Z_LVAL_P(arg); } else if (UNEXPECTED(ZEND_ARG_USES_STRICT_TYPES())) { - return 0; + return NAN; } - return zend_parse_arg_double_weak(arg, dest, arg_num); + return zend_parse_arg_double_weak(arg, arg_num); } /* }}} */ @@ -729,58 +732,61 @@ ZEND_API bool ZEND_FASTCALL zend_parse_arg_number_or_str_slow(zval *arg, zval ** return true; } -ZEND_API bool ZEND_FASTCALL zend_parse_arg_str_weak(zval *arg, zend_string **dest, uint32_t arg_num) /* {{{ */ +ZEND_API zend_string* ZEND_FASTCALL zend_parse_arg_str_weak(zval *arg, uint32_t arg_num) /* {{{ */ { if (EXPECTED(Z_TYPE_P(arg) < IS_STRING)) { if (UNEXPECTED(Z_TYPE_P(arg) == IS_NULL) && !zend_null_arg_deprecated("string", arg_num)) { - return 0; + return NULL; } convert_to_string(arg); - *dest = Z_STR_P(arg); + if (UNEXPECTED(EG(exception))) { + return NULL; + } + return Z_STR_P(arg); } else if (UNEXPECTED(Z_TYPE_P(arg) == IS_OBJECT)) { zend_object *zobj = Z_OBJ_P(arg); zval obj; if (zobj->handlers->cast_object(zobj, &obj, IS_STRING) == SUCCESS) { OBJ_RELEASE(zobj); ZVAL_COPY_VALUE(arg, &obj); - *dest = Z_STR_P(arg); - return 1; + return Z_STR_P(arg); } - return 0; + return NULL; } else { - return 0; + return NULL; } - return 1; } /* }}} */ -ZEND_API bool ZEND_FASTCALL zend_parse_arg_str_slow(zval *arg, zend_string **dest, uint32_t arg_num) /* {{{ */ +ZEND_API zend_string* ZEND_FASTCALL zend_parse_arg_str_slow(zval *arg, uint32_t arg_num) /* {{{ */ { if (UNEXPECTED(ZEND_ARG_USES_STRICT_TYPES())) { - return 0; + return NULL; } - return zend_parse_arg_str_weak(arg, dest, arg_num); + return zend_parse_arg_str_weak(arg, arg_num); } /* }}} */ -ZEND_API bool ZEND_FASTCALL zend_flf_parse_arg_str_slow(zval *arg, zend_string **dest, uint32_t arg_num) +ZEND_API zend_string* ZEND_FASTCALL zend_flf_parse_arg_str_slow(zval *arg, uint32_t arg_num) { if (UNEXPECTED(ZEND_FLF_ARG_USES_STRICT_TYPES())) { - return 0; + return NULL; } - return zend_parse_arg_str_weak(arg, dest, arg_num); + return zend_parse_arg_str_weak(arg, arg_num); } ZEND_API bool ZEND_FASTCALL zend_parse_arg_str_or_long_slow(zval *arg, zend_string **dest_str, zend_long *dest_long, uint32_t arg_num) /* {{{ */ { + zend_string *str; if (UNEXPECTED(ZEND_ARG_USES_STRICT_TYPES())) { return 0; } if (zend_parse_arg_long_weak(arg, dest_long, arg_num)) { *dest_str = NULL; return 1; - } else if (zend_parse_arg_str_weak(arg, dest_str, arg_num)) { + } else if ((str = zend_parse_arg_str_weak(arg, arg_num)) != NULL) { *dest_long = 0; + *dest_str = str; return 1; } else { return 0; @@ -2505,19 +2511,19 @@ ZEND_API void zend_collect_module_handlers(void) /* {{{ */ dl_loaded_count++; } } ZEND_HASH_FOREACH_END(); - module_request_startup_handlers = (zend_module_entry**)realloc( + module_request_startup_handlers = (zend_module_entry**)perealloc( module_request_startup_handlers, sizeof(zend_module_entry*) * (startup_count + 1 + shutdown_count + 1 + - post_deactivate_count + 1)); + post_deactivate_count + 1), true); module_request_startup_handlers[startup_count] = NULL; module_request_shutdown_handlers = module_request_startup_handlers + startup_count + 1; module_request_shutdown_handlers[shutdown_count] = NULL; module_post_deactivate_handlers = module_request_shutdown_handlers + shutdown_count + 1; module_post_deactivate_handlers[post_deactivate_count] = NULL; /* Cannot reuse module_request_startup_handlers because it is freed in zend_destroy_modules, which happens before zend_unload_modules. */ - modules_dl_loaded = realloc(modules_dl_loaded, sizeof(zend_module_entry*) * (dl_loaded_count + 1)); + modules_dl_loaded = perealloc(modules_dl_loaded, sizeof(zend_module_entry*) * (dl_loaded_count + 1), true); modules_dl_loaded[dl_loaded_count] = NULL; startup_count = 0; @@ -2544,10 +2550,10 @@ ZEND_API void zend_collect_module_handlers(void) /* {{{ */ } } ZEND_HASH_FOREACH_END(); - class_cleanup_handlers = (zend_class_entry**)realloc( + class_cleanup_handlers = (zend_class_entry**)perealloc( class_cleanup_handlers, sizeof(zend_class_entry*) * - (class_count + 1)); + (class_count + 1), true); class_cleanup_handlers[class_count] = NULL; if (class_count) { @@ -2810,34 +2816,38 @@ ZEND_API void zend_check_magic_method_implementation(const zend_class_entry *ce, zend_check_magic_method_public(ce, fptr); zend_check_magic_method_arg_type(0, ce, fptr, error_type, MAY_BE_STRING); zend_check_magic_method_arg_type(1, ce, fptr, error_type, MAY_BE_ARRAY); - } else if (zend_string_equals_literal(lcname, ZEND_CALLSTATIC_FUNC_NAME)) { + } else if (zend_string_equals_literal(lcname, ZEND_CALLSTATIC_FUNC_LCNAME)) { zend_check_magic_method_args(2, ce, fptr, error_type); zend_check_magic_method_static(ce, fptr, error_type); zend_check_magic_method_public(ce, fptr); zend_check_magic_method_arg_type(0, ce, fptr, error_type, MAY_BE_STRING); zend_check_magic_method_arg_type(1, ce, fptr, error_type, MAY_BE_ARRAY); - } else if (zend_string_equals_literal(lcname, ZEND_TOSTRING_FUNC_NAME)) { + } else if (zend_string_equals_literal(lcname, ZEND_TOSTRING_FUNC_LCNAME)) { zend_check_magic_method_args(0, ce, fptr, error_type); zend_check_magic_method_non_static(ce, fptr, error_type); zend_check_magic_method_public(ce, fptr); zend_check_magic_method_return_type(ce, fptr, error_type, MAY_BE_STRING); - } else if (zend_string_equals_literal(lcname, ZEND_DEBUGINFO_FUNC_NAME)) { + } else if (zend_string_equals_literal(lcname, ZEND_DEBUGINFO_FUNC_LCNAME)) { zend_check_magic_method_args(0, ce, fptr, error_type); zend_check_magic_method_non_static(ce, fptr, error_type); zend_check_magic_method_public(ce, fptr); zend_check_magic_method_return_type(ce, fptr, error_type, (MAY_BE_ARRAY | MAY_BE_NULL)); - } else if (zend_string_equals_literal(lcname, "__serialize")) { + if ((fptr->common.fn_flags & ZEND_ACC_HAS_RETURN_TYPE) && ZEND_TYPE_PURE_MASK(fptr->common.arg_info[-1].type) & MAY_BE_NULL) { + zend_error(E_DEPRECATED, "Returning null from %s::__debugInfo() is deprecated, make the return type non-nullable and return an empty array instead", + ZSTR_VAL(ce->name)); + } + } else if (zend_string_equals_literal(lcname, ZEND_SERIALIZE_FUNC_NAME)) { zend_check_magic_method_args(0, ce, fptr, error_type); zend_check_magic_method_non_static(ce, fptr, error_type); zend_check_magic_method_public(ce, fptr); zend_check_magic_method_return_type(ce, fptr, error_type, MAY_BE_ARRAY); - } else if (zend_string_equals_literal(lcname, "__unserialize")) { + } else if (zend_string_equals_literal(lcname, ZEND_UNSERIALIZE_FUNC_NAME)) { zend_check_magic_method_args(1, ce, fptr, error_type); zend_check_magic_method_non_static(ce, fptr, error_type); zend_check_magic_method_public(ce, fptr); zend_check_magic_method_arg_type(0, ce, fptr, error_type, MAY_BE_ARRAY); zend_check_magic_method_return_type(ce, fptr, error_type, MAY_BE_VOID); - } else if (zend_string_equals_literal(lcname, "__set_state")) { + } else if (zend_string_equals_literal(lcname, ZEND_SET_STATE_FUNC_NAME)) { zend_check_magic_method_args(1, ce, fptr, error_type); zend_check_magic_method_static(ce, fptr, error_type); zend_check_magic_method_public(ce, fptr); @@ -2885,16 +2895,16 @@ ZEND_API void zend_add_magic_method(zend_class_entry *ce, zend_function *fptr, c } else if (zend_string_equals_literal(lcname, ZEND_ISSET_FUNC_NAME)) { ce->__isset = fptr; ce->ce_flags |= ZEND_ACC_USE_GUARDS; - } else if (zend_string_equals_literal(lcname, ZEND_CALLSTATIC_FUNC_NAME)) { + } else if (zend_string_equals_literal(lcname, ZEND_CALLSTATIC_FUNC_LCNAME)) { ce->__callstatic = fptr; - } else if (zend_string_equals_literal(lcname, ZEND_TOSTRING_FUNC_NAME)) { + } else if (zend_string_equals_literal(lcname, ZEND_TOSTRING_FUNC_LCNAME)) { ce->__tostring = fptr; - } else if (zend_string_equals_literal(lcname, ZEND_DEBUGINFO_FUNC_NAME)) { + } else if (zend_string_equals_literal(lcname, ZEND_DEBUGINFO_FUNC_LCNAME)) { ce->__debugInfo = fptr; ce->ce_flags |= ZEND_ACC_USE_GUARDS; - } else if (zend_string_equals_literal(lcname, "__serialize")) { + } else if (zend_string_equals_literal(lcname, ZEND_SERIALIZE_FUNC_NAME)) { ce->__serialize = fptr; - } else if (zend_string_equals_literal(lcname, "__unserialize")) { + } else if (zend_string_equals_literal(lcname, ZEND_UNSERIALIZE_FUNC_NAME)) { ce->__unserialize = fptr; } } @@ -2997,6 +3007,7 @@ ZEND_API void zend_convert_internal_arg_info(zend_arg_info *new_arg_info, const new_arg_info->name = NULL; new_arg_info->default_value = NULL; } + new_arg_info->doc_comment = NULL; new_arg_info->type = arg_info->type; zend_convert_internal_arg_info_type(&new_arg_info->type, persistent); } @@ -3045,7 +3056,6 @@ ZEND_API zend_result zend_register_functions(zend_class_entry *scope, const zend internal_function->prop_info = NULL; internal_function->attributes = NULL; internal_function->frameless_function_infos = ptr->frameless_function_infos; - internal_function->fn_flags2 = 0; if (EG(active)) { // at run-time: this ought to only happen if registered with dl() or somehow temporarily at runtime ZEND_MAP_PTR_INIT(internal_function->run_time_cache, zend_arena_calloc(&CG(arena), 1, zend_internal_run_time_cache_reserved_size())); } else { @@ -3055,7 +3065,7 @@ ZEND_API zend_result zend_register_functions(zend_class_entry *scope, const zend ZEND_MAP_PTR_INIT(internal_function->run_time_cache, NULL); #endif } - if (ptr->flags) { + if (ptr->flags & UINT32_MAX) { if (!(ptr->flags & ZEND_ACC_PPP_MASK)) { if (ptr->flags != ZEND_ACC_DEPRECATED && scope) { zend_error(error_type, "Invalid access level for %s::%s() - access must be exactly one of public, protected or private", ZSTR_VAL(scope->name), ptr->fname); @@ -3067,6 +3077,7 @@ ZEND_API zend_result zend_register_functions(zend_class_entry *scope, const zend } else { internal_function->fn_flags = ZEND_ACC_PUBLIC; } + internal_function->fn_flags2 = ptr->flags >> 32; if (ptr->arg_info) { zend_internal_function_info *info = (zend_internal_function_info*)ptr->arg_info; @@ -3107,7 +3118,7 @@ ZEND_API zend_result zend_register_functions(zend_class_entry *scope, const zend /* If not specified, add __toString() return type for compatibility with Stringable * interface. */ - if (scope && zend_string_equals_literal_ci(internal_function->function_name, "__tostring") && + if (scope && zend_string_equals_literal_ci(internal_function->function_name, ZEND_TOSTRING_FUNC_LCNAME) && !(internal_function->fn_flags & ZEND_ACC_HAS_RETURN_TYPE)) { zend_error(E_CORE_WARNING, "%s::__toString() implemented without string return type", ZSTR_VAL(scope->name)); @@ -3143,7 +3154,7 @@ ZEND_API zend_result zend_register_functions(zend_class_entry *scope, const zend } lowercase_name = zend_string_tolower_ex(internal_function->function_name, type == MODULE_PERSISTENT); lowercase_name = zend_new_interned_string(lowercase_name); - reg_function = malloc(sizeof(zend_internal_function)); + reg_function = pemalloc(sizeof(zend_internal_function), true); memcpy(reg_function, &function, sizeof(zend_internal_function)); if (zend_hash_add_ptr(target_function_table, lowercase_name, reg_function) == NULL) { unload=1; @@ -3161,8 +3172,8 @@ ZEND_API zend_result zend_register_functions(zend_class_entry *scope, const zend zend_flf_capacity *= 2; } /* +1 for NULL terminator */ - zend_flf_handlers = realloc(zend_flf_handlers, (zend_flf_capacity + 1) * sizeof(void *)); - zend_flf_functions = realloc(zend_flf_functions, (zend_flf_capacity + 1) * sizeof(zend_function *)); + zend_flf_handlers = perealloc(zend_flf_handlers, (zend_flf_capacity + 1) * sizeof(void *), true); + zend_flf_functions = perealloc(zend_flf_functions, (zend_flf_capacity + 1) * sizeof(zend_function *), true); } zend_flf_handlers[zend_flf_count] = flf_info->handler; zend_flf_functions[zend_flf_count] = (zend_function *)reg_function; @@ -3208,7 +3219,7 @@ ZEND_API zend_result zend_register_functions(zend_class_entry *scope, const zend /* Treat return type as an extra argument */ num_args++; - new_arg_info = malloc(sizeof(zend_arg_info) * num_args); + new_arg_info = pemalloc(sizeof(zend_arg_info) * num_args, true); reg_function->arg_info = new_arg_info + 1; for (i = 0; i < num_args; i++) { zend_convert_internal_arg_info(&new_arg_info[i], &arg_info[i], @@ -3493,7 +3504,7 @@ ZEND_API int zend_next_free_module(void) /* {{{ */ static zend_class_entry *do_register_internal_class(const zend_class_entry *orig_class_entry, uint32_t ce_flags) /* {{{ */ { - zend_class_entry *class_entry = malloc(sizeof(zend_class_entry)); + zend_class_entry *class_entry = pemalloc(sizeof(zend_class_entry), true); zend_string *lowercase_name; *class_entry = *orig_class_entry; @@ -3769,6 +3780,10 @@ static bool zend_is_callable_check_class(zend_string *name, zend_class_entry *sc if (error) zend_spprintf(error, 0, "class \"%.*s\" not found", (int)name_len, ZSTR_VAL(name)); } ZSTR_ALLOCA_FREE(lcname, use_heap); + /* User error handlers may throw from deprecations above; do not report callable as valid. */ + if (UNEXPECTED(EG(exception))) { + return false; + } return ret; } /* }}} */ @@ -4030,7 +4045,7 @@ static zend_always_inline bool zend_is_callable_check_func(const zval *callable, } /* }}} */ -ZEND_API zend_string *zend_get_callable_name_ex(zval *callable, const zend_object *object) /* {{{ */ +ZEND_API zend_string *zend_get_callable_name_ex(const zval *callable, const zend_object *object) /* {{{ */ { try_again: switch (Z_TYPE_P(callable)) { @@ -4088,7 +4103,53 @@ ZEND_API zend_string *zend_get_callable_name_ex(zval *callable, const zend_objec } /* }}} */ -ZEND_API zend_string *zend_get_callable_name(zval *callable) /* {{{ */ +static bool zend_fcc_function_handler_equals(const zend_function *func1, const zend_function *func2) /* {{{ */ +{ + if (func1 == func2) { + return true; + } + + const bool fake_closure1 = (func1->common.fn_flags & ZEND_ACC_FAKE_CLOSURE) != 0; + const bool fake_closure2 = (func2->common.fn_flags & ZEND_ACC_FAKE_CLOSURE) != 0; + + if (!fake_closure1 && !fake_closure2) { + return false; + } + if (((func1->common.fn_flags & ZEND_ACC_CLOSURE) && !fake_closure1) || + ((func2->common.fn_flags & ZEND_ACC_CLOSURE) && !fake_closure2)) { + return false; + } + if (func1->type != func2->type || + func1->common.scope != func2->common.scope || + !zend_string_equals(func1->common.function_name, func2->common.function_name)) { + return false; + } + + if (func1->type == ZEND_USER_FUNCTION) { + return func1->op_array.opcodes == func2->op_array.opcodes; + } + + return func1->internal_function.handler == func2->internal_function.handler; +} +/* }}} */ + +ZEND_API bool zend_fcc_closure_equals_ex(const zend_fcall_info_cache* a, const zend_fcall_info_cache* b) /* {{{ */ +{ + const zend_function *func1 = a->function_handler; + const zend_function *func2 = b->function_handler; + + if (a->closure && a->closure->ce == zend_ce_closure) { + func1 = zend_get_closure_method_def(a->closure); + } + if (b->closure && b->closure->ce == zend_ce_closure) { + func2 = zend_get_closure_method_def(b->closure); + } + + return zend_fcc_function_handler_equals(func1, func2); +} +/* }}} */ + +ZEND_API zend_string *zend_get_callable_name(const zval *callable) /* {{{ */ { return zend_get_callable_name_ex(callable, NULL); } @@ -4205,7 +4266,7 @@ ZEND_API bool zend_is_callable_at_frame( } /* }}} */ -ZEND_API bool zend_is_callable_ex(zval *callable, zend_object *object, uint32_t check_flags, zend_string **callable_name, zend_fcall_info_cache *fcc, char **error) /* {{{ */ +ZEND_API bool zend_is_callable_ex(const zval *callable, zend_object *object, uint32_t check_flags, zend_string **callable_name, zend_fcall_info_cache *fcc, char **error) /* {{{ */ { /* Determine callability at the first parent user frame. */ const zend_execute_data *frame = EG(current_execute_data); @@ -4220,13 +4281,13 @@ ZEND_API bool zend_is_callable_ex(zval *callable, zend_object *object, uint32_t return ret; } -ZEND_API bool zend_is_callable(zval *callable, uint32_t check_flags, zend_string **callable_name) /* {{{ */ +ZEND_API bool zend_is_callable(const zval *callable, uint32_t check_flags, zend_string **callable_name) /* {{{ */ { return zend_is_callable_ex(callable, NULL, check_flags, callable_name, NULL, NULL); } /* }}} */ -ZEND_API zend_result zend_fcall_info_init(zval *callable, uint32_t check_flags, zend_fcall_info *fci, zend_fcall_info_cache *fcc, zend_string **callable_name, char **error) /* {{{ */ +ZEND_API zend_result zend_fcall_info_init(const zval *callable, uint32_t check_flags, zend_fcall_info *fci, zend_fcall_info_cache *fcc, zend_string **callable_name, char **error) /* {{{ */ { if (!zend_is_callable_ex(callable, NULL, check_flags, callable_name, fcc, error)) { return FAILURE; @@ -4239,6 +4300,7 @@ ZEND_API zend_result zend_fcall_info_init(zval *callable, uint32_t check_flags, fci->param_count = 0; fci->params = NULL; fci->named_params = NULL; + fci->consumed_args = 0; return SUCCESS; } diff --git a/Zend/zend_API.h b/Zend/zend_API.h index d78ee6604e34..593be26788d7 100644 --- a/Zend/zend_API.h +++ b/Zend/zend_API.h @@ -2,15 +2,14 @@ +----------------------------------------------------------------------+ | Zend Engine | +----------------------------------------------------------------------+ - | Copyright (c) Zend Technologies Ltd. (http://www.zend.com) | + | Copyright © Zend Technologies Ltd., a subsidiary company of | + | Perforce Software, Inc., and Contributors. | +----------------------------------------------------------------------+ - | This source file is subject to version 2.00 of the Zend license, | - | that is bundled with this package in the file LICENSE, and is | - | available through the world-wide-web at the following url: | - | http://www.zend.com/license/2_00.txt. | - | If you did not receive a copy of the Zend license and are unable to | - | obtain it through the world-wide-web, please send a note to | - | license@zend.com so we can mail you a copy immediately. | + | This source file is subject to the Modified BSD License that is | + | bundled with this package in the file LICENSE, and is available | + | through the World Wide Web at . | + | | + | SPDX-License-Identifier: BSD-3-Clause | +----------------------------------------------------------------------+ | Authors: Andi Gutmans | | Zeev Suraski | @@ -37,7 +36,7 @@ typedef struct _zend_function_entry { zif_handler handler; const struct _zend_internal_arg_info *arg_info; uint32_t num_args; - uint32_t flags; + uint64_t flags; const zend_frameless_function_info *frameless_function_infos; const char *doc_comment; } zend_function_entry; @@ -49,6 +48,7 @@ typedef struct _zend_fcall_info { zval *params; zend_object *object; uint32_t param_count; + uint32_t consumed_args; /* This hashtable can also contain positional arguments (with integer keys), * which will be appended to the normal params[]. This makes it easier to * integrate APIs like call_user_func_array(). The usual restriction that @@ -75,6 +75,8 @@ typedef struct _zend_fcall_info_cache { #define ZEND_FUNCTION(name) ZEND_NAMED_FUNCTION(zif_##name) #define ZEND_METHOD(classname, name) ZEND_NAMED_FUNCTION(zim_##classname##_##name) +#define ZEND_FENTRY_FLAGS(flags, flags2) (((uint64_t)flags) | ((uint64_t)flags2 << 32)) + #define ZEND_FENTRY(zend_name, name, arg_info, flags) { #zend_name, name, arg_info, (uint32_t) (sizeof(arg_info)/sizeof(struct _zend_internal_arg_info)-1), flags, NULL, NULL }, #define ZEND_RAW_FENTRY(zend_name, name, arg_info, flags, frameless_function_infos, doc_comment) { zend_name, name, arg_info, (uint32_t) (sizeof(arg_info)/sizeof(struct _zend_internal_arg_info)-1), flags, frameless_function_infos, doc_comment }, @@ -340,6 +342,13 @@ typedef struct _zend_fcall_info_cache { #define ZEND_FCI_INITIALIZED(fci) ((fci).size != 0) #define ZEND_FCC_INITIALIZED(fcc) ((fcc).function_handler != NULL) +static zend_always_inline uint32_t zend_fci_consumed_arg(uint32_t arg_index) { + return arg_index < 32 ? (UINT32_C(1) << arg_index) : UINT32_C(0); +} +static zend_always_inline bool zend_fci_is_consumed_arg(uint32_t consumed_args, uint32_t arg_index) { + return arg_index < 32 && (consumed_args & (UINT32_C(1) << arg_index)); +} + ZEND_API int zend_next_free_module(void); BEGIN_EXTERN_C() @@ -351,18 +360,12 @@ ZEND_API zend_result zend_get_parameters_array_ex(uint32_t param_count, zval *ar zend_get_parameters_array_ex(param_count, argument_array) #define zend_parse_parameters_none() \ (EXPECTED(ZEND_NUM_ARGS() == 0) ? SUCCESS : (zend_wrong_parameters_none_error(), FAILURE)) -#define zend_parse_parameters_none_throw() \ - zend_parse_parameters_none() /* Parameter parsing API -- andrei */ -#define ZEND_PARSE_PARAMS_THROW 0 /* No longer used, zpp always uses exceptions */ #define ZEND_PARSE_PARAMS_QUIET (1<<1) ZEND_API zend_result zend_parse_parameters(uint32_t num_args, const char *type_spec, ...); ZEND_API zend_result zend_parse_parameters_ex(int flags, uint32_t num_args, const char *type_spec, ...); -/* NOTE: This must have at least one value in __VA_ARGS__ for the expression to be valid */ -#define zend_parse_parameters_throw(num_args, ...) \ - zend_parse_parameters(num_args, __VA_ARGS__) ZEND_API const char *zend_zval_type_name(const zval *arg); ZEND_API const char *zend_zval_value_name(const zval *arg); ZEND_API zend_string *zend_zval_get_legacy_type(const zval *arg); @@ -410,13 +413,13 @@ ZEND_API ZEND_COLD void zend_wrong_property_read(const zval *object, zval *prope #define IS_CALLABLE_SUPPRESS_DEPRECATIONS (1<<1) ZEND_API void zend_release_fcall_info_cache(zend_fcall_info_cache *fcc); -ZEND_API zend_string *zend_get_callable_name_ex(zval *callable, const zend_object *object); -ZEND_API zend_string *zend_get_callable_name(zval *callable); +ZEND_API zend_string *zend_get_callable_name_ex(const zval *callable, const zend_object *object); +ZEND_API zend_string *zend_get_callable_name(const zval *callable); ZEND_API bool zend_is_callable_at_frame( const zval *callable, zend_object *object, const zend_execute_data *frame, uint32_t check_flags, zend_fcall_info_cache *fcc, char **error); -ZEND_API bool zend_is_callable_ex(zval *callable, zend_object *object, uint32_t check_flags, zend_string **callable_name, zend_fcall_info_cache *fcc, char **error); -ZEND_API bool zend_is_callable(zval *callable, uint32_t check_flags, zend_string **callable_name); +ZEND_API bool zend_is_callable_ex(const zval *callable, zend_object *object, uint32_t check_flags, zend_string **callable_name, zend_fcall_info_cache *fcc, char **error); +ZEND_API bool zend_is_callable(const zval *callable, uint32_t check_flags, zend_string **callable_name); ZEND_API const char *zend_get_module_version(const char *module_name); ZEND_API zend_result zend_get_module_started(const char *module_name); @@ -445,10 +448,10 @@ ZEND_API zend_result zend_update_class_constant(zend_class_constant *c, const ze ZEND_API zend_result zend_update_class_constants(zend_class_entry *class_type); ZEND_API HashTable *zend_separate_class_constants_table(const zend_class_entry *class_type); -static zend_always_inline HashTable *zend_class_constants_table(zend_class_entry *ce) { +static zend_always_inline const HashTable *zend_class_constants_table(const zend_class_entry *ce) { if ((ce->ce_flags & ZEND_ACC_HAS_AST_CONSTANTS) && ZEND_MAP_PTR(ce->mutable_data)) { - zend_class_mutable_data *mutable_data = - (zend_class_mutable_data*)ZEND_MAP_PTR_GET_IMM(ce->mutable_data); + const zend_class_mutable_data *mutable_data = + (const zend_class_mutable_data*)ZEND_MAP_PTR_GET_IMM(ce->mutable_data); if (mutable_data && mutable_data->constants_table) { return mutable_data->constants_table; } else { @@ -459,10 +462,10 @@ static zend_always_inline HashTable *zend_class_constants_table(zend_class_entry } } -static zend_always_inline zval *zend_class_default_properties_table(zend_class_entry *ce) { +static zend_always_inline zval *zend_class_default_properties_table(const zend_class_entry *ce) { if ((ce->ce_flags & ZEND_ACC_HAS_AST_PROPERTIES) && ZEND_MAP_PTR(ce->mutable_data)) { - zend_class_mutable_data *mutable_data = - (zend_class_mutable_data*)ZEND_MAP_PTR_GET_IMM(ce->mutable_data); + const zend_class_mutable_data *mutable_data = + (const zend_class_mutable_data*)ZEND_MAP_PTR_GET_IMM(ce->mutable_data); return mutable_data->default_properties_table; } else { return ce->default_properties_table; @@ -479,10 +482,10 @@ static zend_always_inline void zend_class_set_backed_enum_table(zend_class_entry } } -static zend_always_inline HashTable *zend_class_backed_enum_table(zend_class_entry *ce) +static zend_always_inline HashTable *zend_class_backed_enum_table(const zend_class_entry *ce) { if (ZEND_MAP_PTR(ce->mutable_data) && ce->type == ZEND_USER_CLASS) { - zend_class_mutable_data *mutable_data = (zend_class_mutable_data*)ZEND_MAP_PTR_GET_IMM(ce->mutable_data); + const zend_class_mutable_data *mutable_data = (const zend_class_mutable_data*)ZEND_MAP_PTR_GET_IMM(ce->mutable_data); return mutable_data->backed_enum_table; } else { return ce->backed_enum_table; @@ -529,8 +532,16 @@ ZEND_API const char *zend_get_type_by_const(int type); #define DLEXPORT #endif -#define array_init(arg) ZVAL_ARR((arg), zend_new_array(0)) -#define array_init_size(arg, size) ZVAL_ARR((arg), zend_new_array(size)) +static zend_always_inline void array_init_size(zval *arg, uint32_t size) +{ + ZVAL_ARR(arg, zend_new_array(size)); +} + +static zend_always_inline void array_init(zval *arg) +{ + array_init_size(arg, 0); +} + ZEND_API void object_init(zval *arg); ZEND_API zend_result object_init_ex(zval *arg, zend_class_entry *ce); ZEND_API zend_result object_init_with_constructor(zval *arg, zend_class_entry *class_type, uint32_t param_count, zval *params, HashTable *named_params); @@ -701,7 +712,7 @@ ZEND_API zend_result _call_user_function_impl(zval *object, zval *function_name, * fci->params = NULL; * The callable_name argument may be NULL. */ -ZEND_API zend_result zend_fcall_info_init(zval *callable, uint32_t check_flags, zend_fcall_info *fci, zend_fcall_info_cache *fcc, zend_string **callable_name, char **error); +ZEND_API zend_result zend_fcall_info_init(const zval *callable, uint32_t check_flags, zend_fcall_info *fci, zend_fcall_info_cache *fcc, zend_string **callable_name, char **error); /** Clear arguments connected with zend_fcall_info *fci * If free_mem is not zero then the params array gets free'd as well @@ -747,20 +758,27 @@ ZEND_API void zend_fcall_info_argn(zend_fcall_info *fci, uint32_t argc, ...); ZEND_API zend_result zend_fcall_info_call(zend_fcall_info *fci, zend_fcall_info_cache *fcc, zval *retval, zval *args); /* Zend FCC API to store and handle PHP userland functions */ +ZEND_API bool zend_fcc_closure_equals_ex(const zend_fcall_info_cache* a, const zend_fcall_info_cache* b); + static zend_always_inline bool zend_fcc_equals(const zend_fcall_info_cache* a, const zend_fcall_info_cache* b) { + if (a->closure || b->closure) { + return a->object == b->object + && a->calling_scope == b->calling_scope + && a->called_scope == b->called_scope + && (a->closure == b->closure || zend_fcc_closure_equals_ex(a, b)) + ; + } if (UNEXPECTED((a->function_handler->common.fn_flags & ZEND_ACC_CALL_VIA_TRAMPOLINE) && (b->function_handler->common.fn_flags & ZEND_ACC_CALL_VIA_TRAMPOLINE))) { return a->object == b->object && a->calling_scope == b->calling_scope - && a->closure == b->closure && zend_string_equals(a->function_handler->common.function_name, b->function_handler->common.function_name) ; } return a->function_handler == b->function_handler && a->object == b->object && a->calling_scope == b->calling_scope - && a->closure == b->closure ; } @@ -895,6 +913,8 @@ static zend_always_inline zend_result zend_forbid_dynamic_call(void) const zend_execute_data *ex = EG(current_execute_data); ZEND_ASSERT(ex != NULL && ex->func != NULL); + ZEND_ASSERT(ex->func->common.fn_flags2 & ZEND_ACC2_FORBID_DYN_CALLS); + if (ZEND_CALL_INFO(ex) & ZEND_CALL_DYNAMIC) { zend_string *function_or_method_name = get_active_function_or_method_name(); zend_throw_error(NULL, "Cannot call %.*s() dynamically", @@ -2174,21 +2194,27 @@ ZEND_API ZEND_COLD void zend_class_redeclaration_error_ex(int type, zend_string /* Inlined implementations shared by new and old parameter parsing APIs */ +typedef enum zpp_parse_bool_status { + ZPP_PARSE_BOOL_STATUS_FALSE = 0, + ZPP_PARSE_BOOL_STATUS_TRUE = 1, + ZPP_PARSE_BOOL_STATUS_ERROR = 2, +} zpp_parse_bool_status; + ZEND_API bool ZEND_FASTCALL zend_parse_arg_class(zval *arg, zend_class_entry **pce, uint32_t num, bool check_null); -ZEND_API bool ZEND_FASTCALL zend_parse_arg_bool_slow(const zval *arg, bool *dest, uint32_t arg_num); -ZEND_API bool ZEND_FASTCALL zend_parse_arg_bool_weak(const zval *arg, bool *dest, uint32_t arg_num); +ZEND_API zpp_parse_bool_status ZEND_FASTCALL zend_parse_arg_bool_slow(const zval *arg, uint32_t arg_num); +ZEND_API zpp_parse_bool_status ZEND_FASTCALL zend_parse_arg_bool_weak(const zval *arg, uint32_t arg_num); ZEND_API bool ZEND_FASTCALL zend_parse_arg_long_slow(const zval *arg, zend_long *dest, uint32_t arg_num); ZEND_API bool ZEND_FASTCALL zend_parse_arg_long_weak(const zval *arg, zend_long *dest, uint32_t arg_num); -ZEND_API bool ZEND_FASTCALL zend_parse_arg_double_slow(const zval *arg, double *dest, uint32_t arg_num); -ZEND_API bool ZEND_FASTCALL zend_parse_arg_double_weak(const zval *arg, double *dest, uint32_t arg_num); -ZEND_API bool ZEND_FASTCALL zend_parse_arg_str_slow(zval *arg, zend_string **dest, uint32_t arg_num); -ZEND_API bool ZEND_FASTCALL zend_parse_arg_str_weak(zval *arg, zend_string **dest, uint32_t arg_num); +ZEND_API double ZEND_FASTCALL zend_parse_arg_double_slow(const zval *arg, uint32_t arg_num); +ZEND_API double ZEND_FASTCALL zend_parse_arg_double_weak(const zval *arg, uint32_t arg_num); +ZEND_API zend_string* ZEND_FASTCALL zend_parse_arg_str_slow(zval *arg, uint32_t arg_num); +ZEND_API zend_string* ZEND_FASTCALL zend_parse_arg_str_weak(zval *arg, uint32_t arg_num); ZEND_API bool ZEND_FASTCALL zend_parse_arg_number_slow(zval *arg, zval **dest, uint32_t arg_num); ZEND_API bool ZEND_FASTCALL zend_parse_arg_number_or_str_slow(zval *arg, zval **dest, uint32_t arg_num); ZEND_API bool ZEND_FASTCALL zend_parse_arg_str_or_long_slow(zval *arg, zend_string **dest_str, zend_long *dest_long, uint32_t arg_num); -ZEND_API bool ZEND_FASTCALL zend_flf_parse_arg_bool_slow(const zval *arg, bool *dest, uint32_t arg_num); -ZEND_API bool ZEND_FASTCALL zend_flf_parse_arg_str_slow(zval *arg, zend_string **dest, uint32_t arg_num); +ZEND_API zpp_parse_bool_status ZEND_FASTCALL zend_flf_parse_arg_bool_slow(const zval *arg, uint32_t arg_num); +ZEND_API zend_string* ZEND_FASTCALL zend_flf_parse_arg_str_slow(zval *arg, uint32_t arg_num); ZEND_API bool ZEND_FASTCALL zend_flf_parse_arg_long_slow(const zval *arg, zend_long *dest, uint32_t arg_num); static zend_always_inline bool zend_parse_arg_bool_ex(const zval *arg, bool *dest, bool *is_null, bool check_null, uint32_t arg_num, bool frameless) @@ -2204,11 +2230,16 @@ static zend_always_inline bool zend_parse_arg_bool_ex(const zval *arg, bool *des *is_null = 1; *dest = 0; } else { + zpp_parse_bool_status result; if (frameless) { - return zend_flf_parse_arg_bool_slow(arg, dest, arg_num); + result = zend_flf_parse_arg_bool_slow(arg, arg_num); } else { - return zend_parse_arg_bool_slow(arg, dest, arg_num); + result = zend_parse_arg_bool_slow(arg, arg_num); + } + if (UNEXPECTED(result == ZPP_PARSE_BOOL_STATUS_ERROR)) { + return false; } + *dest = result; } return 1; } @@ -2254,7 +2285,8 @@ static zend_always_inline bool zend_parse_arg_double(const zval *arg, double *de *is_null = 1; *dest = 0.0; } else { - return zend_parse_arg_double_slow(arg, dest, arg_num); + *dest = zend_parse_arg_double_slow(arg, arg_num); + return !zend_isnan(*dest); } return 1; } @@ -2291,12 +2323,13 @@ static zend_always_inline bool zend_parse_arg_str_ex(zval *arg, zend_string **de *dest = NULL; } else { if (frameless) { - return zend_flf_parse_arg_str_slow(arg, dest, arg_num); + *dest = zend_flf_parse_arg_str_slow(arg, arg_num); } else { - return zend_parse_arg_str_slow(arg, dest, arg_num); + *dest = zend_parse_arg_str_slow(arg, arg_num); } + return *dest != NULL; } - return 1; + return true; } static zend_always_inline bool zend_parse_arg_str(zval *arg, zend_string **dest, bool check_null, uint32_t arg_num) @@ -2482,7 +2515,7 @@ static zend_always_inline bool zend_parse_arg_resource(zval *arg, zval **dest, b return 1; } -static zend_always_inline bool zend_parse_arg_func(zval *arg, zend_fcall_info *dest_fci, zend_fcall_info_cache *dest_fcc, bool check_null, char **error, bool free_trampoline) +static zend_always_inline bool zend_parse_arg_func(const zval *arg, zend_fcall_info *dest_fci, zend_fcall_info_cache *dest_fcc, bool check_null, char **error, bool free_trampoline) { if (check_null && UNEXPECTED(Z_TYPE_P(arg) == IS_NULL)) { dest_fci->size = 0; @@ -2527,7 +2560,8 @@ static zend_always_inline bool zend_parse_arg_array_ht_or_str( *dest_str = NULL; } else { *dest_ht = NULL; - return zend_parse_arg_str_slow(arg, dest_str, arg_num); + *dest_str = zend_parse_arg_str_slow(arg, arg_num); + return *dest_str != NULL; } return 1; } diff --git a/Zend/zend_alloc.c b/Zend/zend_alloc.c index bca2190976c7..942a8b8e1309 100644 --- a/Zend/zend_alloc.c +++ b/Zend/zend_alloc.c @@ -2,15 +2,14 @@ +----------------------------------------------------------------------+ | Zend Engine | +----------------------------------------------------------------------+ - | Copyright (c) Zend Technologies Ltd. (http://www.zend.com) | + | Copyright © Zend Technologies Ltd., a subsidiary company of | + | Perforce Software, Inc., and Contributors. | +----------------------------------------------------------------------+ - | This source file is subject to version 2.00 of the Zend license, | - | that is bundled with this package in the file LICENSE, and is | - | available through the world-wide-web at the following url: | - | http://www.zend.com/license/2_00.txt. | - | If you did not receive a copy of the Zend license and are unable to | - | obtain it through the world-wide-web, please send a note to | - | license@zend.com so we can mail you a copy immediately. | + | This source file is subject to the Modified BSD License that is | + | bundled with this package in the file LICENSE, and is available | + | through the World Wide Web at . | + | | + | SPDX-License-Identifier: BSD-3-Clause | +----------------------------------------------------------------------+ | Authors: Andi Gutmans | | Zeev Suraski | diff --git a/Zend/zend_alloc.h b/Zend/zend_alloc.h index 264e13848d1b..ff51c4fe8652 100644 --- a/Zend/zend_alloc.h +++ b/Zend/zend_alloc.h @@ -2,15 +2,14 @@ +----------------------------------------------------------------------+ | Zend Engine | +----------------------------------------------------------------------+ - | Copyright (c) Zend Technologies Ltd. (http://www.zend.com) | + | Copyright © Zend Technologies Ltd., a subsidiary company of | + | Perforce Software, Inc., and Contributors. | +----------------------------------------------------------------------+ - | This source file is subject to version 2.00 of the Zend license, | - | that is bundled with this package in the file LICENSE, and is | - | available through the world-wide-web at the following url: | - | http://www.zend.com/license/2_00.txt. | - | If you did not receive a copy of the Zend license and are unable to | - | obtain it through the world-wide-web, please send a note to | - | license@zend.com so we can mail you a copy immediately. | + | This source file is subject to the Modified BSD License that is | + | bundled with this package in the file LICENSE, and is available | + | through the World Wide Web at . | + | | + | SPDX-License-Identifier: BSD-3-Clause | +----------------------------------------------------------------------+ | Authors: Andi Gutmans | | Zeev Suraski | diff --git a/Zend/zend_alloc_sizes.h b/Zend/zend_alloc_sizes.h index 502b982a5052..f806056ad9d3 100644 --- a/Zend/zend_alloc_sizes.h +++ b/Zend/zend_alloc_sizes.h @@ -2,15 +2,14 @@ +----------------------------------------------------------------------+ | Zend Engine | +----------------------------------------------------------------------+ - | Copyright (c) Zend Technologies Ltd. (http://www.zend.com) | + | Copyright © Zend Technologies Ltd., a subsidiary company of | + | Perforce Software, Inc., and Contributors. | +----------------------------------------------------------------------+ - | This source file is subject to version 2.00 of the Zend license, | - | that is bundled with this package in the file LICENSE, and is | - | available through the world-wide-web at the following url: | - | http://www.zend.com/license/2_00.txt. | - | If you did not receive a copy of the Zend license and are unable to | - | obtain it through the world-wide-web, please send a note to | - | license@zend.com so we can mail you a copy immediately. | + | This source file is subject to the Modified BSD License that is | + | bundled with this package in the file LICENSE, and is available | + | through the World Wide Web at . | + | | + | SPDX-License-Identifier: BSD-3-Clause | +----------------------------------------------------------------------+ | Authors: Dmitry Stogov | +----------------------------------------------------------------------+ diff --git a/Zend/zend_arena.h b/Zend/zend_arena.h index 37cda28f29db..9b917a47e927 100644 --- a/Zend/zend_arena.h +++ b/Zend/zend_arena.h @@ -2,15 +2,14 @@ +----------------------------------------------------------------------+ | Zend Engine | +----------------------------------------------------------------------+ - | Copyright (c) Zend Technologies Ltd. (http://www.zend.com) | + | Copyright © Zend Technologies Ltd., a subsidiary company of | + | Perforce Software, Inc., and Contributors. | +----------------------------------------------------------------------+ - | This source file is subject to version 2.00 of the Zend license, | - | that is bundled with this package in the file LICENSE, and is | - | available through the world-wide-web at the following url: | - | http://www.zend.com/license/2_00.txt. | - | If you did not receive a copy of the Zend license and are unable to | - | obtain it through the world-wide-web, please send a note to | - | license@zend.com so we can mail you a copy immediately. | + | This source file is subject to the Modified BSD License that is | + | bundled with this package in the file LICENSE, and is available | + | through the World Wide Web at . | + | | + | SPDX-License-Identifier: BSD-3-Clause | +----------------------------------------------------------------------+ | Authors: Dmitry Stogov | +----------------------------------------------------------------------+ diff --git a/Zend/zend_ast.c b/Zend/zend_ast.c index 9d93c4d22251..d3ce419c737e 100644 --- a/Zend/zend_ast.c +++ b/Zend/zend_ast.c @@ -2,15 +2,14 @@ +----------------------------------------------------------------------+ | Zend Engine | +----------------------------------------------------------------------+ - | Copyright (c) Zend Technologies Ltd. (http://www.zend.com) | + | Copyright © Zend Technologies Ltd., a subsidiary company of | + | Perforce Software, Inc., and Contributors. | +----------------------------------------------------------------------+ - | This source file is subject to version 2.00 of the Zend license, | - | that is bundled with this package in the file LICENSE, and is | - | available through the world-wide-web at the following url: | - | http://www.zend.com/license/2_00.txt. | - | If you did not receive a copy of the Zend license and are unable to | - | obtain it through the world-wide-web, please send a note to | - | license@zend.com so we can mail you a copy immediately. | + | This source file is subject to the Modified BSD License that is | + | bundled with this package in the file LICENSE, and is available | + | through the World Wide Web at . | + | | + | SPDX-License-Identifier: BSD-3-Clause | +----------------------------------------------------------------------+ | Authors: Bob Weinand | | Dmitry Stogov | @@ -814,7 +813,7 @@ static zend_result ZEND_FASTCALL zend_ast_evaluate_inner( case IS_OBJECT: zend_cast_zval_to_object(result, &op1, IS_VAR); break; - EMPTY_SWITCH_DEFAULT_CASE(); + default: ZEND_UNREACHABLE(); } zval_ptr_dtor_nogc(&op1); if (UNEXPECTED(EG(exception))) { @@ -1240,7 +1239,7 @@ static zend_result ZEND_FASTCALL zend_ast_evaluate_inner( break; } - EMPTY_SWITCH_DEFAULT_CASE() + default: ZEND_UNREACHABLE(); } zend_create_fake_closure(result, fptr, fptr->common.scope, called_scope, NULL); @@ -1579,9 +1578,7 @@ static ZEND_COLD void zend_ast_export_ex(smart_str *str, zend_ast *ast, int prio static ZEND_COLD void zend_ast_export_str(smart_str *str, const zend_string *s) { - size_t i; - - for (i = 0; i < ZSTR_LEN(s); i++) { + for (size_t i = 0; i < ZSTR_LEN(s); i++) { unsigned char c = ZSTR_VAL(s)[i]; if (c == '\'' || c == '\\') { smart_str_appendc(str, '\\'); @@ -1594,9 +1591,7 @@ static ZEND_COLD void zend_ast_export_str(smart_str *str, const zend_string *s) static ZEND_COLD void zend_ast_export_qstr(smart_str *str, char quote, const zend_string *s) { - size_t i; - - for (i = 0; i < ZSTR_LEN(s); i++) { + for (size_t i = 0; i < ZSTR_LEN(s); i++) { unsigned char c = ZSTR_VAL(s)[i]; if (c < ' ') { switch (c) { @@ -1637,6 +1632,22 @@ static ZEND_COLD void zend_ast_export_qstr(smart_str *str, char quote, const zen } } +static ZEND_COLD void zend_ast_export_quoted_str(smart_str *str, const zend_string *s) +{ + for (size_t i = 0; i < ZSTR_LEN(s); i++) { + unsigned char c = ZSTR_VAL(s)[i]; + if (c < ' ') { + smart_str_appendc(str, '"'); + zend_ast_export_qstr(str, '"', s); + smart_str_appendc(str, '"'); + return; + } + } + smart_str_appendc(str, '\''); + zend_ast_export_str(str, s); + smart_str_appendc(str, '\''); +} + static ZEND_COLD void zend_ast_export_indent(smart_str *str, int indent) { while (indent > 0) { @@ -1676,19 +1687,6 @@ static ZEND_COLD void zend_ast_export_ns_name(smart_str *str, zend_ast *ast, int zend_ast_export_ex(str, ast, priority, indent); } -static ZEND_COLD bool zend_ast_valid_var_char(char ch) -{ - unsigned char c = (unsigned char)ch; - - if (c != '_' && c < 127 && - (c < '0' || c > '9') && - (c < 'A' || c > 'Z') && - (c < 'a' || c > 'z')) { - return false; - } - return true; -} - static ZEND_COLD bool zend_ast_valid_var_name(const char *s, size_t len) { unsigned char c; @@ -1715,18 +1713,18 @@ static ZEND_COLD bool zend_ast_valid_var_name(const char *s, size_t len) return true; } -static ZEND_COLD bool zend_ast_var_needs_braces(char ch) -{ - return ch == '[' || zend_ast_valid_var_char(ch); -} - static ZEND_COLD void zend_ast_export_var(smart_str *str, zend_ast *ast, int indent) { if (ast->kind == ZEND_AST_ZVAL) { zval *zv = zend_ast_get_zval(ast); - if (Z_TYPE_P(zv) == IS_STRING && - zend_ast_valid_var_name(Z_STRVAL_P(zv), Z_STRLEN_P(zv))) { - smart_str_append(str, Z_STR_P(zv)); + if (Z_TYPE_P(zv) == IS_STRING) { + if (zend_ast_valid_var_name(Z_STRVAL_P(zv), Z_STRLEN_P(zv))) { + smart_str_append(str, Z_STR_P(zv)); + } else { + smart_str_appends(str, "{'"); + zend_ast_export_str(str, Z_STR_P(zv)); + smart_str_appends(str, "'}"); + } return; } } else if (ast->kind == ZEND_AST_VAR) { @@ -1771,14 +1769,6 @@ static ZEND_COLD void zend_ast_export_encaps_list(smart_str *str, char quote, co ZEND_ASSERT(Z_TYPE_P(zv) == IS_STRING); zend_ast_export_qstr(str, quote, Z_STR_P(zv)); - } else if (ast->kind == ZEND_AST_VAR && - ast->child[0]->kind == ZEND_AST_ZVAL && - (i + 1 == list->children || - list->child[i + 1]->kind != ZEND_AST_ZVAL || - !zend_ast_var_needs_braces( - *Z_STRVAL_P( - zend_ast_get_zval(list->child[i + 1]))))) { - zend_ast_export_ex(str, ast, 0, indent); } else { smart_str_appendc(str, '{'); zend_ast_export_ex(str, ast, 0, indent); @@ -1929,9 +1919,7 @@ static ZEND_COLD void zend_ast_export_zval(smart_str *str, const zval *zv, int p str, Z_DVAL_P(zv), (int) EG(precision), /* zero_fraction */ true); break; case IS_STRING: - smart_str_appendc(str, '\''); - zend_ast_export_str(str, Z_STR_P(zv)); - smart_str_appendc(str, '\''); + zend_ast_export_quoted_str(str, Z_STR_P(zv)); break; case IS_ARRAY: { zend_long idx; @@ -1946,13 +1934,11 @@ static ZEND_COLD void zend_ast_export_zval(smart_str *str, const zval *zv, int p smart_str_appends(str, ", "); } if (key) { - smart_str_appendc(str, '\''); - zend_ast_export_str(str, key); - smart_str_appends(str, "' => "); + zend_ast_export_quoted_str(str, key); } else { smart_str_append_long(str, idx); - smart_str_appends(str, " => "); } + smart_str_appends(str, " => "); zend_ast_export_zval(str, val, 0, indent); } ZEND_HASH_FOREACH_END(); smart_str_appendc(str, ']'); @@ -1961,7 +1947,7 @@ static ZEND_COLD void zend_ast_export_zval(smart_str *str, const zval *zv, int p case IS_CONSTANT_AST: zend_ast_export_ex(str, Z_ASTVAL_P(zv), priority, indent); break; - EMPTY_SWITCH_DEFAULT_CASE(); + default: ZEND_UNREACHABLE(); } } @@ -2160,7 +2146,7 @@ static ZEND_COLD void zend_ast_export_ex(smart_str *str, zend_ast *ast, int prio break; case ZEND_AST_CONSTANT: { zend_string *name = zend_ast_get_constant_name(ast); - smart_str_appendl(str, ZSTR_VAL(name), ZSTR_LEN(name)); + smart_str_append(str, name); break; } case ZEND_AST_OP_ARRAY: @@ -2210,7 +2196,7 @@ static ZEND_COLD void zend_ast_export_ex(smart_str *str, zend_ast *ast, int prio smart_str_appendc(str, '&'); } if (ast->kind != ZEND_AST_CLOSURE && ast->kind != ZEND_AST_ARROW_FUNC) { - smart_str_appendl(str, ZSTR_VAL(decl->name), ZSTR_LEN(decl->name)); + smart_str_append(str, decl->name); } smart_str_appendc(str, '('); zend_ast_export_ex(str, decl->child[0], 0, indent); @@ -2268,7 +2254,7 @@ static ZEND_COLD void zend_ast_export_ex(smart_str *str, zend_ast *ast, int prio } smart_str_appends(str, "class "); } - smart_str_appendl(str, ZSTR_VAL(decl->name), ZSTR_LEN(decl->name)); + smart_str_append(str, decl->name); if (decl->flags & ZEND_ACC_ENUM && decl->child[4]) { smart_str_appends(str, ": "); zend_ast_export_type(str, decl->child[4], indent); @@ -2396,7 +2382,7 @@ static ZEND_COLD void zend_ast_export_ex(smart_str *str, zend_ast *ast, int prio case T_PROPERTY_C: APPEND_STR("__PROPERTY__"); case T_NS_C: APPEND_STR("__NAMESPACE__"); case T_CLASS_C: APPEND_STR("__CLASS__"); - EMPTY_SWITCH_DEFAULT_CASE(); + default: ZEND_UNREACHABLE(); } break; case ZEND_AST_TYPE: @@ -2405,7 +2391,7 @@ static ZEND_COLD void zend_ast_export_ex(smart_str *str, zend_ast *ast, int prio case IS_CALLABLE: APPEND_STR("callable"); case IS_STATIC: APPEND_STR("static"); case IS_MIXED: APPEND_STR("mixed"); - EMPTY_SWITCH_DEFAULT_CASE(); + default: ZEND_UNREACHABLE(); } break; case ZEND_AST_PLACEHOLDER_ARG: @@ -2439,7 +2425,7 @@ static ZEND_COLD void zend_ast_export_ex(smart_str *str, zend_ast *ast, int prio case IS_STRING: PREFIX_OP("(string)", 240, 241); case IS_ARRAY: PREFIX_OP("(array)", 240, 241); case IS_OBJECT: PREFIX_OP("(object)", 240, 241); - EMPTY_SWITCH_DEFAULT_CASE(); + default: ZEND_UNREACHABLE(); } break; case ZEND_AST_CAST_VOID: @@ -2473,14 +2459,14 @@ static ZEND_COLD void zend_ast_export_ex(smart_str *str, zend_ast *ast, int prio case ZEND_REQUIRE_ONCE: FUNC_OP("require_once"); case ZEND_REQUIRE: FUNC_OP("require"); case ZEND_EVAL: FUNC_OP("eval"); - EMPTY_SWITCH_DEFAULT_CASE(); + default: ZEND_UNREACHABLE(); } break; case ZEND_AST_UNARY_OP: switch (ast->attr) { case ZEND_BW_NOT: PREFIX_OP("~", 240, 241); case ZEND_BOOL_NOT: PREFIX_OP("!", 240, 241); - EMPTY_SWITCH_DEFAULT_CASE(); + default: ZEND_UNREACHABLE(); } break; case ZEND_AST_PRE_INC: @@ -2543,24 +2529,24 @@ static ZEND_COLD void zend_ast_export_ex(smart_str *str, zend_ast *ast, int prio break; case ZEND_AST_CALL: { zend_ast *left = ast->child[0]; - if (left->kind == ZEND_AST_ARROW_FUNC || left->kind == ZEND_AST_CLOSURE) { - smart_str_appendc(str, '('); - zend_ast_export_ns_name(str, left, 0, indent); - smart_str_appendc(str, ')'); - } else { - zend_ast_export_ns_name(str, left, 0, indent); + switch (left->kind) { + /* ZEND_AST_ZVAL is a regular function call. */ + case ZEND_AST_ZVAL: + /* ZEND_AST_VAR ($foo()) is unambiguous without parens. */ + case ZEND_AST_VAR: + zend_ast_export_ns_name(str, left, 0, indent); + break; + default: + smart_str_appendc(str, '('); + zend_ast_export_ex(str, left, 0, indent); + smart_str_appendc(str, ')'); + break; } smart_str_appendc(str, '('); zend_ast_export_ex(str, ast->child[1], 0, indent); smart_str_appendc(str, ')'); break; } - case ZEND_AST_PARENT_PROPERTY_HOOK_CALL: - smart_str_append(str, Z_STR_P(zend_ast_get_zval(ast->child[0]))); - smart_str_appendc(str, '('); - zend_ast_export_ex(str, ast->child[1], 0, indent); - smart_str_appendc(str, ')'); - break; case ZEND_AST_CALLABLE_CONVERT: { zend_ast_fcc *fcc_ast = (zend_ast_fcc*)ast; ast = fcc_ast->args; @@ -2581,7 +2567,7 @@ static ZEND_COLD void zend_ast_export_ex(smart_str *str, zend_ast *ast, int prio case ZEND_FETCH_CLASS_PARENT: smart_str_append(str, ZSTR_KNOWN(ZEND_STR_PARENT)); break; - EMPTY_SWITCH_DEFAULT_CASE() + default: ZEND_UNREACHABLE(); } } else { zend_ast_export_ns_name(str, ast->child[0], 0, indent); @@ -2604,7 +2590,7 @@ static ZEND_COLD void zend_ast_export_ex(smart_str *str, zend_ast *ast, int prio case ZEND_BW_AND: BINARY_OP(" &= ", 90, 91, 90); case ZEND_BW_XOR: BINARY_OP(" ^= ", 90, 91, 90); case ZEND_POW: BINARY_OP(" **= ", 90, 91, 90); - EMPTY_SWITCH_DEFAULT_CASE(); + default: ZEND_UNREACHABLE(); } break; case ZEND_AST_ASSIGN_COALESCE: BINARY_OP(" \?\?= ", 90, 91, 90); @@ -2630,7 +2616,7 @@ static ZEND_COLD void zend_ast_export_ex(smart_str *str, zend_ast *ast, int prio case ZEND_POW: BINARY_OP(" ** ", 250, 251, 250); case ZEND_BOOL_XOR: BINARY_OP(" xor ", 40, 40, 41); case ZEND_SPACESHIP: BINARY_OP(" <=> ", 180, 181, 181); - EMPTY_SWITCH_DEFAULT_CASE(); + default: ZEND_UNREACHABLE(); } break; case ZEND_AST_GREATER: BINARY_OP(" > ", 180, 181, 181); @@ -2809,7 +2795,7 @@ static ZEND_COLD void zend_ast_export_ex(smart_str *str, zend_ast *ast, int prio smart_str_appends(str, " insteadof "); zend_ast_export_ex(str, ast->child[1], 0, indent); break; - case ZEND_AST_METHOD_REFERENCE: + case ZEND_AST_TRAIT_METHOD_REFERENCE: if (ast->child[0]) { zend_ast_export_name(str, ast->child[0], 0, indent); smart_str_appends(str, "::"); @@ -2982,7 +2968,7 @@ static ZEND_COLD void zend_ast_export_ex(smart_str *str, zend_ast *ast, int prio zend_ast_export_indent(str, indent); smart_str_appendc(str, '}'); break; - EMPTY_SWITCH_DEFAULT_CASE(); + default: ZEND_UNREACHABLE(); } return; @@ -3079,7 +3065,7 @@ zend_ast * ZEND_FASTCALL zend_ast_with_attributes(zend_ast *ast, zend_ast *attr) * zend_compile_const_decl() checks the kind of the list elements. */ ast = zend_ast_list_add(ast, attr); break; - EMPTY_SWITCH_DEFAULT_CASE() + default: ZEND_UNREACHABLE(); } return ast; diff --git a/Zend/zend_ast.h b/Zend/zend_ast.h index a88efefd85b2..24b77d7d3493 100644 --- a/Zend/zend_ast.h +++ b/Zend/zend_ast.h @@ -2,15 +2,14 @@ +----------------------------------------------------------------------+ | Zend Engine | +----------------------------------------------------------------------+ - | Copyright (c) Zend Technologies Ltd. (http://www.zend.com) | + | Copyright © Zend Technologies Ltd., a subsidiary company of | + | Perforce Software, Inc., and Contributors. | +----------------------------------------------------------------------+ - | This source file is subject to version 2.00 of the Zend license, | - | that is bundled with this package in the file LICENSE, and is | - | available through the world-wide-web at the following url: | - | http://www.zend.com/license/2_00.txt. | - | If you did not receive a copy of the Zend license and are unable to | - | obtain it through the world-wide-web, please send a note to | - | license@zend.com so we can mail you a copy immediately. | + | This source file is subject to the Modified BSD License that is | + | bundled with this package in the file LICENSE, and is available | + | through the World Wide Web at . | + | | + | SPDX-License-Identifier: BSD-3-Clause | +----------------------------------------------------------------------+ | Authors: Bob Weinand | | Dmitry Stogov | @@ -144,7 +143,7 @@ enum _zend_ast_kind { ZEND_AST_DECLARE, ZEND_AST_USE_TRAIT, ZEND_AST_TRAIT_PRECEDENCE, - ZEND_AST_METHOD_REFERENCE, + ZEND_AST_TRAIT_METHOD_REFERENCE, ZEND_AST_NAMESPACE, ZEND_AST_USE_ELEM, ZEND_AST_TRAIT_ALIAS, @@ -153,7 +152,6 @@ enum _zend_ast_kind { ZEND_AST_MATCH, ZEND_AST_MATCH_ARM, ZEND_AST_NAMED_ARG, - ZEND_AST_PARENT_PROPERTY_HOOK_CALL, ZEND_AST_PIPE, /* 3 child nodes */ @@ -360,7 +358,7 @@ typedef void (*zend_ast_apply_func)(zend_ast **ast_ptr, void *context); ZEND_API void zend_ast_apply(zend_ast *ast, zend_ast_apply_func fn, void *context); static zend_always_inline size_t zend_ast_size(uint32_t children) { - return XtOffsetOf(zend_ast, child) + (sizeof(zend_ast *) * children); + return offsetof(zend_ast, child) + (sizeof(zend_ast *) * children); } static zend_always_inline bool zend_ast_is_special(const zend_ast *ast) { diff --git a/Zend/zend_atomic.c b/Zend/zend_atomic.c index 5f6a7793beea..98a39c583437 100644 --- a/Zend/zend_atomic.c +++ b/Zend/zend_atomic.c @@ -1,12 +1,12 @@ /* +----------------------------------------------------------------------+ - | This source file is subject to version 3.01 of the PHP license, | - | that is bundled with this package in the file LICENSE, and is | - | available through the world-wide-web at the following url: | - | https://www.php.net/license/3_01.txt | - | If you did not receive a copy of the PHP license and are unable to | - | obtain it through the world-wide-web, please send a note to | - | license@php.net so we can mail you a copy immediately. | + | Copyright © The PHP Group and Contributors. | + +----------------------------------------------------------------------+ + | This source file is subject to the Modified BSD License that is | + | bundled with this package in the file LICENSE, and is available | + | through the World Wide Web at . | + | | + | SPDX-License-Identifier: BSD-3-Clause | +----------------------------------------------------------------------+ | Authors: Levi Morrison | +----------------------------------------------------------------------+ @@ -57,7 +57,7 @@ ZEND_API void zend_atomic_int_store(zend_atomic_int *obj, int desired) { zend_atomic_int_store_ex(obj, desired); } -#if defined(ZEND_WIN32) || defined(HAVE_SYNC_ATOMICS) +#if (defined(ZEND_WIN32) || defined(HAVE_SYNC_ATOMICS)) && !defined(HAVE_C11_ATOMICS) /* On these platforms it is non-const due to underlying APIs. */ ZEND_API bool zend_atomic_bool_load(zend_atomic_bool *obj) { return zend_atomic_bool_load_ex(obj); diff --git a/Zend/zend_atomic.h b/Zend/zend_atomic.h index 56422a721fdb..31558996c3c3 100644 --- a/Zend/zend_atomic.h +++ b/Zend/zend_atomic.h @@ -1,12 +1,12 @@ /* +----------------------------------------------------------------------+ - | This source file is subject to version 3.01 of the PHP license, | - | that is bundled with this package in the file LICENSE, and is | - | available through the world-wide-web at the following url: | - | https://www.php.net/license/3_01.txt | - | If you did not receive a copy of the PHP license and are unable to | - | obtain it through the world-wide-web, please send a note to | - | license@php.net so we can mail you a copy immediately. | + | Copyright © The PHP Group and Contributors. | + +----------------------------------------------------------------------+ + | This source file is subject to the Modified BSD License that is | + | bundled with this package in the file LICENSE, and is available | + | through the World Wide Web at . | + | | + | SPDX-License-Identifier: BSD-3-Clause | +----------------------------------------------------------------------+ | Authors: Levi Morrison | +----------------------------------------------------------------------+ @@ -39,7 +39,7 @@ * and alignment purposes. */ -#if defined(ZEND_WIN32) || defined(HAVE_SYNC_ATOMICS) +#if (defined(ZEND_WIN32) || defined(HAVE_SYNC_ATOMICS)) && !defined(HAVE_C11_ATOMICS) typedef struct zend_atomic_bool_s { volatile char value; } zend_atomic_bool; @@ -68,7 +68,7 @@ typedef struct zend_atomic_int_s { BEGIN_EXTERN_C() -#ifdef ZEND_WIN32 +#if defined(ZEND_WIN32) && !defined(HAVE_C11_ATOMICS) #ifndef InterlockedExchange8 #define InterlockedExchange8 _InterlockedExchange8 @@ -123,7 +123,7 @@ static zend_always_inline bool zend_atomic_int_compare_exchange_ex(zend_atomic_i } } -/* On this platform it is non-const due to Iterlocked API*/ +/* On this platform it is non-const due to Interlocked API */ static zend_always_inline bool zend_atomic_bool_load_ex(zend_atomic_bool *obj) { /* Or'ing with false won't change the value. */ return InterlockedOr8(&obj->value, false); @@ -376,7 +376,7 @@ ZEND_API bool zend_atomic_int_compare_exchange(zend_atomic_int *obj, int *expect ZEND_API void zend_atomic_bool_store(zend_atomic_bool *obj, bool desired); ZEND_API void zend_atomic_int_store(zend_atomic_int *obj, int desired); -#if defined(ZEND_WIN32) || defined(HAVE_SYNC_ATOMICS) +#if (defined(ZEND_WIN32) && !defined(HAVE_C11_ATOMICS)) || defined(HAVE_SYNC_ATOMICS) /* On these platforms it is non-const due to underlying APIs. */ ZEND_API bool zend_atomic_bool_load(zend_atomic_bool *obj); ZEND_API int zend_atomic_int_load(zend_atomic_int *obj); diff --git a/Zend/zend_attributes.c b/Zend/zend_attributes.c index cba95810ba49..71f0d788e921 100644 --- a/Zend/zend_attributes.c +++ b/Zend/zend_attributes.c @@ -2,15 +2,14 @@ +----------------------------------------------------------------------+ | Zend Engine | +----------------------------------------------------------------------+ - | Copyright (c) Zend Technologies Ltd. (http://www.zend.com) | + | Copyright © Zend Technologies Ltd., a subsidiary company of | + | Perforce Software, Inc., and Contributors. | +----------------------------------------------------------------------+ - | This source file is subject to version 2.00 of the Zend license, | - | that is bundled with this package in the file LICENSE, and is | - | available through the world-wide-web at the following url: | - | http://www.zend.com/license/2_00.txt. | - | If you did not receive a copy of the Zend license and are unable to | - | obtain it through the world-wide-web, please send a note to | - | license@zend.com so we can mail you a copy immediately. | + | This source file is subject to the Modified BSD License that is | + | bundled with this package in the file LICENSE, and is available | + | through the World Wide Web at . | + | | + | SPDX-License-Identifier: BSD-3-Clause | +----------------------------------------------------------------------+ | Authors: Benjamin Eberlei | | Martin Schröder | diff --git a/Zend/zend_attributes.h b/Zend/zend_attributes.h index f8b61ac9d166..c044ef073cc8 100644 --- a/Zend/zend_attributes.h +++ b/Zend/zend_attributes.h @@ -2,15 +2,14 @@ +----------------------------------------------------------------------+ | Zend Engine | +----------------------------------------------------------------------+ - | Copyright (c) Zend Technologies Ltd. (http://www.zend.com) | + | Copyright © Zend Technologies Ltd., a subsidiary company of | + | Perforce Software, Inc., and Contributors. | +----------------------------------------------------------------------+ - | This source file is subject to version 2.00 of the Zend license, | - | that is bundled with this package in the file LICENSE, and is | - | available through the world-wide-web at the following url: | - | http://www.zend.com/license/2_00.txt. | - | If you did not receive a copy of the Zend license and are unable to | - | obtain it through the world-wide-web, please send a note to | - | license@zend.com so we can mail you a copy immediately. | + | This source file is subject to the Modified BSD License that is | + | bundled with this package in the file LICENSE, and is available | + | through the World Wide Web at . | + | | + | SPDX-License-Identifier: BSD-3-Clause | +----------------------------------------------------------------------+ | Authors: Benjamin Eberlei | | Martin Schröder | diff --git a/Zend/zend_autoload.c b/Zend/zend_autoload.c index bc74efa1afda..2ca3d7eea022 100644 --- a/Zend/zend_autoload.c +++ b/Zend/zend_autoload.c @@ -2,15 +2,14 @@ +----------------------------------------------------------------------+ | Zend Engine | +----------------------------------------------------------------------+ - | Copyright (c) Zend Technologies Ltd. (http://www.zend.com) | + | Copyright © Zend Technologies Ltd., a subsidiary company of | + | Perforce Software, Inc., and Contributors. | +----------------------------------------------------------------------+ - | This source file is subject to version 2.00 of the Zend license, | - | that is bundled with this package in the file LICENSE, and is | - | available through the world-wide-web at the following url: | - | http://www.zend.com/license/2_00.txt. | - | If you did not receive a copy of the Zend license and are unable to | - | obtain it through the world-wide-web, please send a note to | - | license@zend.com so we can mail you a copy immediately. | + | This source file is subject to the Modified BSD License that is | + | bundled with this package in the file LICENSE, and is available | + | through the World Wide Web at . | + | | + | SPDX-License-Identifier: BSD-3-Clause | +----------------------------------------------------------------------+ | Authors: Gina Peter Banyard | +----------------------------------------------------------------------+ diff --git a/Zend/zend_autoload.h b/Zend/zend_autoload.h index fde4a4a82e9a..84e6ab80b5af 100644 --- a/Zend/zend_autoload.h +++ b/Zend/zend_autoload.h @@ -2,15 +2,14 @@ +----------------------------------------------------------------------+ | Zend Engine | +----------------------------------------------------------------------+ - | Copyright (c) Zend Technologies Ltd. (http://www.zend.com) | + | Copyright © Zend Technologies Ltd., a subsidiary company of | + | Perforce Software, Inc., and Contributors. | +----------------------------------------------------------------------+ - | This source file is subject to version 2.00 of the Zend license, | - | that is bundled with this package in the file LICENSE, and is | - | available through the world-wide-web at the following url: | - | http://www.zend.com/license/2_00.txt. | - | If you did not receive a copy of the Zend license and are unable to | - | obtain it through the world-wide-web, please send a note to | - | license@zend.com so we can mail you a copy immediately. | + | This source file is subject to the Modified BSD License that is | + | bundled with this package in the file LICENSE, and is available | + | through the World Wide Web at . | + | | + | SPDX-License-Identifier: BSD-3-Clause | +----------------------------------------------------------------------+ | Authors: Gina Peter Banyard | +----------------------------------------------------------------------+ diff --git a/Zend/zend_bitset.h b/Zend/zend_bitset.h index d990b6a2a871..877f2aaabc05 100644 --- a/Zend/zend_bitset.h +++ b/Zend/zend_bitset.h @@ -2,15 +2,13 @@ +----------------------------------------------------------------------+ | Zend OPcache JIT | +----------------------------------------------------------------------+ - | Copyright (c) The PHP Group | + | Copyright © The PHP Group and Contributors. | +----------------------------------------------------------------------+ - | This source file is subject to version 3.01 of the PHP license, | - | that is bundled with this package in the file LICENSE, and is | - | available through the world-wide-web at the following url: | - | https://www.php.net/license/3_01.txt | - | If you did not receive a copy of the PHP license and are unable to | - | obtain it through the world-wide-web, please send a note to | - | license@php.net so we can mail you a copy immediately. | + | This source file is subject to the Modified BSD License that is | + | bundled with this package in the file LICENSE, and is available | + | through the World Wide Web at . | + | | + | SPDX-License-Identifier: BSD-3-Clause | +----------------------------------------------------------------------+ | Authors: Dmitry Stogov | +----------------------------------------------------------------------+ diff --git a/Zend/zend_build.h b/Zend/zend_build.h index c604fb311a74..8ba7064042e3 100644 --- a/Zend/zend_build.h +++ b/Zend/zend_build.h @@ -2,15 +2,14 @@ +----------------------------------------------------------------------+ | Zend Engine | +----------------------------------------------------------------------+ - | Copyright (c) Zend Technologies Ltd. (http://www.zend.com) | + | Copyright © Zend Technologies Ltd., a subsidiary company of | + | Perforce Software, Inc., and Contributors. | +----------------------------------------------------------------------+ - | This source file is subject to version 2.00 of the Zend license, | - | that is bundled with this package in the file LICENSE, and is | - | available through the world-wide-web at the following url: | - | http://www.zend.com/license/2_00.txt. | - | If you did not receive a copy of the Zend license and are unable to | - | obtain it through the world-wide-web, please send a note to | - | license@zend.com so we can mail you a copy immediately. | + | This source file is subject to the Modified BSD License that is | + | bundled with this package in the file LICENSE, and is available | + | through the World Wide Web at . | + | | + | SPDX-License-Identifier: BSD-3-Clause | +----------------------------------------------------------------------+ | Authors: Stanislav Malyshev | +----------------------------------------------------------------------+ diff --git a/Zend/zend_builtin_functions.c b/Zend/zend_builtin_functions.c index c16d8e74f2bd..2dceac2512db 100644 --- a/Zend/zend_builtin_functions.c +++ b/Zend/zend_builtin_functions.c @@ -2,21 +2,21 @@ +----------------------------------------------------------------------+ | Zend Engine | +----------------------------------------------------------------------+ - | Copyright (c) Zend Technologies Ltd. (http://www.zend.com) | + | Copyright © Zend Technologies Ltd., a subsidiary company of | + | Perforce Software, Inc., and Contributors. | +----------------------------------------------------------------------+ - | This source file is subject to version 2.00 of the Zend license, | - | that is bundled with this package in the file LICENSE, and is | - | available through the world-wide-web at the following url: | - | http://www.zend.com/license/2_00.txt. | - | If you did not receive a copy of the Zend license and are unable to | - | obtain it through the world-wide-web, please send a note to | - | license@zend.com so we can mail you a copy immediately. | + | This source file is subject to the Modified BSD License that is | + | bundled with this package in the file LICENSE, and is available | + | through the World Wide Web at . | + | | + | SPDX-License-Identifier: BSD-3-Clause | +----------------------------------------------------------------------+ | Authors: Andi Gutmans | | Zeev Suraski | +----------------------------------------------------------------------+ */ +#include "php_version.h" #include "zend.h" #include "zend_API.h" #include "zend_attributes.h" @@ -84,10 +84,10 @@ ZEND_FUNCTION(clone) /* clone() also exists as the ZEND_CLONE OPcode and both implementations must be kept in sync. */ - zend_class_entry *scope = zend_get_executed_scope(); + const zend_class_entry *scope = zend_get_executed_scope(); - zend_class_entry *ce = zobj->ce; - zend_function *clone = ce->clone; + const zend_class_entry *ce = zobj->ce; + const zend_function *clone = ce->clone; if (UNEXPECTED(zobj->handlers->clone_obj == NULL)) { zend_throw_error(NULL, "Trying to clone an uncloneable object of class %s", ZSTR_VAL(ce->name)); @@ -239,7 +239,7 @@ ZEND_FUNCTION(gc_status) /* {{{ Get the number of arguments that were passed to the function */ ZEND_FUNCTION(func_num_args) { - zend_execute_data *ex = EX(prev_execute_data); + const zend_execute_data *ex = EX(prev_execute_data); ZEND_PARSE_PARAMETERS_NONE(); @@ -249,7 +249,7 @@ ZEND_FUNCTION(func_num_args) } if (zend_forbid_dynamic_call() == FAILURE) { - RETURN_LONG(-1); + RETURN_THROWS(); } RETURN_LONG(ZEND_CALL_NUM_ARGS(ex)); @@ -503,7 +503,7 @@ ZEND_FUNCTION(error_reporting) } /* }}} */ -static bool validate_constant_array_argument(HashTable *ht, int argument_number) /* {{{ */ +static bool validate_constant_array_argument(HashTable *ht, uint32_t argument_number) /* {{{ */ { bool ret = true; zval *val; @@ -527,7 +527,7 @@ static bool validate_constant_array_argument(HashTable *ht, int argument_number) } /* }}} */ -static void copy_constant_array(zval *dst, zval *src) /* {{{ */ +static void copy_constant_array(zval *dst, const zval *src) /* {{{ */ { zend_string *key; zend_ulong idx; @@ -590,11 +590,7 @@ ZEND_FUNCTION(define) /* non persistent */ ZEND_CONSTANT_SET_FLAGS(&c, 0, PHP_USER_CONSTANT); c.name = zend_string_copy(name); - if (zend_register_constant(&c) != NULL) { - RETURN_TRUE; - } else { - RETURN_FALSE; - } + RETURN_BOOL(zend_register_constant(&c) != NULL); } /* }}} */ @@ -608,11 +604,7 @@ ZEND_FUNCTION(defined) Z_PARAM_STR(name) ZEND_PARSE_PARAMETERS_END(); - if (zend_get_constant_ex(name, zend_get_executed_scope(), ZEND_FETCH_CLASS_SILENT)) { - RETURN_TRUE; - } else { - RETURN_FALSE; - } + RETURN_BOOL(zend_get_constant_ex(name, zend_get_executed_scope(), ZEND_FETCH_CLASS_SILENT)); } /* }}} */ @@ -626,7 +618,7 @@ ZEND_FUNCTION(get_class) } if (!obj) { - zend_class_entry *scope = zend_get_executed_scope(); + const zend_class_entry *scope = zend_get_executed_scope(); if (scope) { zend_error(E_DEPRECATED, "Calling get_class() without arguments is deprecated"); @@ -647,11 +639,9 @@ ZEND_FUNCTION(get_class) /* {{{ Retrieves the "Late Static Binding" class name */ ZEND_FUNCTION(get_called_class) { - zend_class_entry *called_scope; - ZEND_PARSE_PARAMETERS_NONE(); - called_scope = zend_get_called_scope(execute_data); + const zend_class_entry *called_scope = zend_get_called_scope(execute_data); if (!called_scope) { zend_throw_error(NULL, "get_called_class() must be called from within a class"); RETURN_THROWS(); @@ -691,10 +681,8 @@ static void is_a_impl(INTERNAL_FUNCTION_PARAMETERS, bool only_subclass) /* {{{ * { zval *obj; zend_string *class_name; - zend_class_entry *instance_ce; - zend_class_entry *ce; + const zend_class_entry *instance_ce; bool allow_string = only_subclass; - bool retval; ZEND_PARSE_PARAMETERS_START(2, 3) Z_PARAM_ZVAL(obj) @@ -721,21 +709,19 @@ static void is_a_impl(INTERNAL_FUNCTION_PARAMETERS, bool only_subclass) /* {{{ * } if (!only_subclass && EXPECTED(zend_string_equals(instance_ce->name, class_name))) { - retval = 1; - } else { - ce = zend_lookup_class_ex(class_name, NULL, ZEND_FETCH_CLASS_NO_AUTOLOAD); - if (!ce) { - retval = 0; - } else { - if (only_subclass && instance_ce == ce) { - retval = 0; - } else { - retval = instanceof_function(instance_ce, ce); - } - } + RETURN_TRUE; } - RETURN_BOOL(retval); + const zend_class_entry *ce = zend_lookup_class_ex(class_name, NULL, ZEND_FETCH_CLASS_NO_AUTOLOAD); + if (!ce) { + RETURN_FALSE; + } + + if (only_subclass && instance_ce == ce) { + RETURN_FALSE; + } + + RETURN_BOOL(instanceof_function(instance_ce, ce)); } /* }}} */ @@ -754,7 +740,7 @@ ZEND_FUNCTION(is_a) /* }}} */ /* {{{ add_class_vars */ -static void add_class_vars(zend_class_entry *scope, zend_class_entry *ce, bool statics, zval *return_value) +static void add_class_vars(const zend_class_entry *scope, zend_class_entry *ce, bool statics, const zval *return_value) { zend_property_info *prop_info; zval *prop, prop_copy; @@ -805,7 +791,7 @@ static void add_class_vars(zend_class_entry *scope, zend_class_entry *ce, bool s /* {{{ Returns an array of default properties of the class. */ ZEND_FUNCTION(get_class_vars) { - zend_class_entry *ce = NULL, *scope; + zend_class_entry *ce = NULL; if (zend_parse_parameters(ZEND_NUM_ARGS(), "C", &ce) == FAILURE) { RETURN_THROWS(); @@ -818,7 +804,7 @@ ZEND_FUNCTION(get_class_vars) } } - scope = zend_get_executed_scope(); + const zend_class_entry *scope = zend_get_executed_scope(); add_class_vars(scope, ce, false, return_value); add_class_vars(scope, ce, true, return_value); } @@ -944,7 +930,6 @@ ZEND_FUNCTION(get_class_methods) { zval method_name; zend_class_entry *ce = NULL; - zend_class_entry *scope; zend_function *mptr; ZEND_PARSE_PARAMETERS_START(1, 1) @@ -952,7 +937,7 @@ ZEND_FUNCTION(get_class_methods) ZEND_PARSE_PARAMETERS_END(); array_init(return_value); - scope = zend_get_executed_scope(); + const zend_class_entry *scope = zend_get_executed_scope(); ZEND_HASH_MAP_FOREACH_PTR(&ce->function_table, mptr) { if (zend_check_method_accessible(mptr, scope)) { @@ -985,7 +970,7 @@ ZEND_FUNCTION(method_exists) RETURN_FALSE; } } else { - zend_argument_type_error(1, "must be of type object|string, %s given", zend_zval_value_name(klass)); + zend_wrong_parameter_type_error(1, Z_EXPECTED_OBJECT_OR_STRING, klass); RETURN_THROWS(); } @@ -1027,10 +1012,9 @@ ZEND_FUNCTION(method_exists) } /* }}} */ -static void _property_exists(zval *return_value, zval *object, zend_string *property) +static void _property_exists(zval *return_value, const zval *object, zend_string *property) { zend_class_entry *ce; - zend_property_info *property_info; if (Z_TYPE_P(object) == IS_STRING) { ce = zend_lookup_class(Z_STR_P(object)); @@ -1040,22 +1024,21 @@ static void _property_exists(zval *return_value, zval *object, zend_string *prop } else if (Z_TYPE_P(object) == IS_OBJECT) { ce = Z_OBJCE_P(object); } else { - zend_argument_type_error(1, "must be of type object|string, %s given", zend_zval_value_name(object)); + zend_wrong_parameter_type_error(1, Z_EXPECTED_OBJECT_OR_STRING, object); RETURN_THROWS(); } - property_info = zend_hash_find_ptr(&ce->properties_info, property); + const zend_property_info *property_info = zend_hash_find_ptr(&ce->properties_info, property); if (property_info != NULL && (!(property_info->flags & ZEND_ACC_PRIVATE) || property_info->ce == ce)) { RETURN_TRUE; } - if (Z_TYPE_P(object) == IS_OBJECT && - Z_OBJ_HANDLER_P(object, has_property)(Z_OBJ_P(object), property, ZEND_PROPERTY_EXISTS, NULL)) { - RETURN_TRUE; - } - RETURN_FALSE; + RETURN_BOOL( + Z_TYPE_P(object) == IS_OBJECT && + Z_OBJ_HANDLER_P(object, has_property)(Z_OBJ_P(object), property, ZEND_PROPERTY_EXISTS, NULL) + ); } /* {{{ Checks if the object or class has a property */ @@ -1091,7 +1074,7 @@ flf_clean:; static zend_always_inline void _class_exists_impl(zval *return_value, zend_string *name, bool autoload, int flags, int skip_flags) /* {{{ */ { zend_string *lcname; - zend_class_entry *ce; + const zend_class_entry *ce; if (ZSTR_HAS_CE_CACHE(name)) { ce = ZSTR_GET_CE_CACHE(name); @@ -1115,11 +1098,7 @@ static zend_always_inline void _class_exists_impl(zval *return_value, zend_strin ce = zend_lookup_class(name); } - if (ce) { - RETURN_BOOL(((ce->ce_flags & flags) == flags) && !(ce->ce_flags & skip_flags)); - } else { - RETURN_FALSE; - } + RETURN_BOOL(ce && ((ce->ce_flags & flags) == flags) && !(ce->ce_flags & skip_flags)); } /* {{{ */ @@ -1425,7 +1404,6 @@ static inline void get_declared_class_impl(INTERNAL_FUNCTION_PARAMETERS, int fla { zend_string *key; zval *zv; - zend_class_entry *ce; ZEND_PARSE_PARAMETERS_NONE(); @@ -1433,7 +1411,7 @@ static inline void get_declared_class_impl(INTERNAL_FUNCTION_PARAMETERS, int fla zend_hash_real_init_packed(Z_ARRVAL_P(return_value)); ZEND_HASH_FILL_PACKED(Z_ARRVAL_P(return_value)) { ZEND_HASH_MAP_FOREACH_STR_KEY_VAL(EG(class_table), key, zv) { - ce = Z_PTR_P(zv); + const zend_class_entry *ce = Z_PTR_P(zv); if ((ce->ce_flags & (ZEND_ACC_LINKED|ZEND_ACC_INTERFACE|ZEND_ACC_TRAIT)) == flags && key && ZSTR_VAL(key)[0] != 0) { @@ -1551,7 +1529,7 @@ ZEND_FUNCTION(get_resource_type) if (resource_type) { RETURN_STRING(resource_type); } else { - RETURN_STRING("Unknown"); + RETURN_INTERNED_STR(ZSTR_KNOWN(ZEND_STR_UNKNOWN_CAPITALIZED)); } } /* }}} */ @@ -1616,7 +1594,7 @@ ZEND_FUNCTION(get_resources) } /* }}} */ -static void add_zendext_info(zend_extension *ext, void *arg) /* {{{ */ +static void add_zendext_info(const zend_extension *ext, void *arg) /* {{{ */ { zval *name_array = (zval *)arg; add_next_index_string(name_array, ext->name); @@ -1719,7 +1697,7 @@ ZEND_FUNCTION(get_defined_constants) static bool backtrace_is_arg_sensitive(const zend_execute_data *call, uint32_t offset) { - zend_attribute *attribute = zend_get_parameter_attribute_str( + const zend_attribute *attribute = zend_get_parameter_attribute_str( call->func->common.attributes, "sensitiveparameter", sizeof("sensitiveparameter") - 1, @@ -1891,7 +1869,7 @@ ZEND_API void zend_fetch_debug_backtrace(zval *return_value, int skip_last, int zend_execute_data *call, *last_call = NULL; zend_object *object; bool fake_frame = false; - int lineno, frameno = 0; + int frameno = 0; zend_function *func; zend_string *filename; zend_string *include_filename = NULL; @@ -1912,12 +1890,12 @@ ZEND_API void zend_fetch_debug_backtrace(zval *return_value, int skip_last, int EG(filename_override) = NULL; EG(lineno_override) = -1; - zend_string *filename = zend_get_executed_filename_ex(); - zend_long lineno = zend_get_executed_lineno(); - if (filename && (!zend_string_equals(filename, filename_override) || lineno != lineno_override)) { + zend_string *executed_filename = zend_get_executed_filename_ex(); + uint32_t lineno = zend_get_executed_lineno(); + if (executed_filename && (!zend_string_equals(executed_filename, filename_override) || lineno != lineno_override)) { stack_frame = zend_new_array(8); zend_hash_real_init_mixed(stack_frame); - ZVAL_STR_COPY(&tmp, filename); + ZVAL_STR_COPY(&tmp, executed_filename); _zend_hash_append_ex(stack_frame, ZSTR_KNOWN(ZEND_STR_FILE), &tmp, 1); ZVAL_LONG(&tmp, lineno); _zend_hash_append_ex(stack_frame, ZSTR_KNOWN(ZEND_STR_LINE), &tmp, 1); @@ -1980,19 +1958,21 @@ ZEND_API void zend_fetch_debug_backtrace(zval *return_value, int skip_last, int zval *arg = zend_get_zval_ptr(op_data, op_data->op1_type, &op_data->op1, call); if (Z_TYPE_P(arg) == IS_UNDEF) goto not_frameless_call; } - zend_function *func = ZEND_FLF_FUNC(opline); + zend_function *frameless_func = ZEND_FLF_FUNC(opline); /* Assume frameless functions are not recursive with themselves. * This condition may be true when observers are enabled: * Observers will put a call frame on top of the frameless opcode. */ - if (last_call && last_call->func == func) { + if (last_call && last_call->func == frameless_func) { goto not_frameless_call; } stack_frame = zend_new_array(8); zend_hash_real_init_mixed(stack_frame); - ZVAL_STR_COPY(&tmp, func->common.function_name); + ZVAL_STR_COPY(&tmp, frameless_func->common.function_name); _zend_hash_append_ex(stack_frame, ZSTR_KNOWN(ZEND_STR_FUNCTION), &tmp, 1); /* Steal file and line from the previous frame. */ if (call->func && ZEND_USER_CODE(call->func->common.type)) { + uint32_t lineno; + filename = call->func->op_array.filename; if (call->opline->opcode == ZEND_HANDLE_EXCEPTION) { if (EG(opline_before_exception)) { @@ -2044,6 +2024,8 @@ ZEND_API void zend_fetch_debug_backtrace(zval *return_value, int skip_last, int zend_hash_real_init_mixed(stack_frame); if (prev && prev->func && ZEND_USER_CODE(prev->func->common.type)) { + uint32_t lineno; + filename = prev->func->op_array.filename; if (prev->opline->opcode == ZEND_HANDLE_EXCEPTION) { if (EG(opline_before_exception)) { diff --git a/Zend/zend_builtin_functions.h b/Zend/zend_builtin_functions.h index 237b34b2927b..018d0cdb1c1d 100644 --- a/Zend/zend_builtin_functions.h +++ b/Zend/zend_builtin_functions.h @@ -2,15 +2,14 @@ +----------------------------------------------------------------------+ | Zend Engine | +----------------------------------------------------------------------+ - | Copyright (c) Zend Technologies Ltd. (http://www.zend.com) | + | Copyright © Zend Technologies Ltd., a subsidiary company of | + | Perforce Software, Inc., and Contributors. | +----------------------------------------------------------------------+ - | This source file is subject to version 2.00 of the Zend license, | - | that is bundled with this package in the file LICENSE, and is | - | available through the world-wide-web at the following url: | - | http://www.zend.com/license/2_00.txt. | - | If you did not receive a copy of the Zend license and are unable to | - | obtain it through the world-wide-web, please send a note to | - | license@zend.com so we can mail you a copy immediately. | + | This source file is subject to the Modified BSD License that is | + | bundled with this package in the file LICENSE, and is available | + | through the World Wide Web at . | + | | + | SPDX-License-Identifier: BSD-3-Clause | +----------------------------------------------------------------------+ | Authors: Andi Gutmans | | Zeev Suraski | diff --git a/Zend/zend_builtin_functions.stub.php b/Zend/zend_builtin_functions.stub.php index 9b2267b531eb..1d405587145d 100644 --- a/Zend/zend_builtin_functions.stub.php +++ b/Zend/zend_builtin_functions.stub.php @@ -18,11 +18,16 @@ function die(string|int $status = 0): never {} /** @refcount 1 */ function zend_version(): string {} +/** @forbid-dynamic-calls */ function func_num_args(): int {} +/** @forbid-dynamic-calls */ function func_get_arg(int $position): mixed {} -/** @return array */ +/** + * @return array + * @forbid-dynamic-calls + */ function func_get_args(): array {} function strlen(string $string): int {} @@ -156,6 +161,7 @@ function get_defined_functions(bool $exclude_disabled = true): array {} /** * @return array * @refcount 1 + * @forbid-dynamic-calls */ function get_defined_vars(): array {} diff --git a/Zend/zend_builtin_functions_arginfo.h b/Zend/zend_builtin_functions_arginfo.h index cb626ff430e6..b3af43fef340 100644 --- a/Zend/zend_builtin_functions_arginfo.h +++ b/Zend/zend_builtin_functions_arginfo.h @@ -1,5 +1,5 @@ /* This is a generated file, edit zend_builtin_functions.stub.php instead. - * Stub hash: 9b49f527064695c812cd204d9efc63c13681d942 */ + * Stub hash: 64c61862de86d9968930893bf21b516119724064 */ ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_clone, 0, 1, IS_OBJECT, 0) ZEND_ARG_TYPE_INFO(0, object, IS_OBJECT, 0) @@ -316,9 +316,21 @@ static const zend_function_entry ext_functions[] = { ZEND_FE(exit, arginfo_exit) ZEND_RAW_FENTRY("die", zif_exit, arginfo_die, 0, NULL, NULL) ZEND_FE(zend_version, arginfo_zend_version) - ZEND_FE(func_num_args, arginfo_func_num_args) - ZEND_FE(func_get_arg, arginfo_func_get_arg) - ZEND_FE(func_get_args, arginfo_func_get_args) +#if (PHP_VERSION_ID >= 80600) + ZEND_RAW_FENTRY("func_num_args", zif_func_num_args, arginfo_func_num_args, ZEND_FENTRY_FLAGS(0, ZEND_ACC2_FORBID_DYN_CALLS), NULL, NULL) +#elif (PHP_VERSION_ID >= 80400) + ZEND_RAW_FENTRY("func_num_args", zif_func_num_args, arginfo_func_num_args, 0, NULL, NULL) +#endif +#if (PHP_VERSION_ID >= 80600) + ZEND_RAW_FENTRY("func_get_arg", zif_func_get_arg, arginfo_func_get_arg, ZEND_FENTRY_FLAGS(0, ZEND_ACC2_FORBID_DYN_CALLS), NULL, NULL) +#elif (PHP_VERSION_ID >= 80400) + ZEND_RAW_FENTRY("func_get_arg", zif_func_get_arg, arginfo_func_get_arg, 0, NULL, NULL) +#endif +#if (PHP_VERSION_ID >= 80600) + ZEND_RAW_FENTRY("func_get_args", zif_func_get_args, arginfo_func_get_args, ZEND_FENTRY_FLAGS(0, ZEND_ACC2_FORBID_DYN_CALLS), NULL, NULL) +#elif (PHP_VERSION_ID >= 80400) + ZEND_RAW_FENTRY("func_get_args", zif_func_get_args, arginfo_func_get_args, 0, NULL, NULL) +#endif ZEND_FE(strlen, arginfo_strlen) ZEND_RAW_FENTRY("strcmp", zif_strcmp, arginfo_strcmp, ZEND_ACC_COMPILE_TIME_EVAL, NULL, NULL) ZEND_RAW_FENTRY("strncmp", zif_strncmp, arginfo_strncmp, ZEND_ACC_COMPILE_TIME_EVAL, NULL, NULL) @@ -358,7 +370,11 @@ static const zend_function_entry ext_functions[] = { ZEND_FE(get_declared_traits, arginfo_get_declared_traits) ZEND_FE(get_declared_interfaces, arginfo_get_declared_interfaces) ZEND_FE(get_defined_functions, arginfo_get_defined_functions) - ZEND_FE(get_defined_vars, arginfo_get_defined_vars) +#if (PHP_VERSION_ID >= 80600) + ZEND_RAW_FENTRY("get_defined_vars", zif_get_defined_vars, arginfo_get_defined_vars, ZEND_FENTRY_FLAGS(0, ZEND_ACC2_FORBID_DYN_CALLS), NULL, NULL) +#elif (PHP_VERSION_ID >= 80400) + ZEND_RAW_FENTRY("get_defined_vars", zif_get_defined_vars, arginfo_get_defined_vars, 0, NULL, NULL) +#endif ZEND_FE(get_resource_type, arginfo_get_resource_type) ZEND_FE(get_resource_id, arginfo_get_resource_id) ZEND_FE(get_resources, arginfo_get_resources) diff --git a/Zend/zend_call_stack.c b/Zend/zend_call_stack.c index ed86ecc74a23..aa23c2e3e2fa 100644 --- a/Zend/zend_call_stack.c +++ b/Zend/zend_call_stack.c @@ -2,15 +2,14 @@ +----------------------------------------------------------------------+ | Zend Engine | +----------------------------------------------------------------------+ - | Copyright (c) Zend Technologies Ltd. (http://www.zend.com) | + | Copyright © Zend Technologies Ltd., a subsidiary company of | + | Perforce Software, Inc., and Contributors. | +----------------------------------------------------------------------+ - | This source file is subject to version 2.00 of the Zend license, | - | that is bundled with this package in the file LICENSE, and is | - | available through the world-wide-web at the following url: | - | http://www.zend.com/license/2_00.txt. | - | If you did not receive a copy of the Zend license and are unable to | - | obtain it through the world-wide-web, please send a note to | - | license@zend.com so we can mail you a copy immediately. | + | This source file is subject to the Modified BSD License that is | + | bundled with this package in the file LICENSE, and is available | + | through the World Wide Web at . | + | | + | SPDX-License-Identifier: BSD-3-Clause | +----------------------------------------------------------------------+ | Authors: Arnaud Le Blanc | +----------------------------------------------------------------------+ diff --git a/Zend/zend_call_stack.h b/Zend/zend_call_stack.h index 58e91694f93f..c0b84334239d 100644 --- a/Zend/zend_call_stack.h +++ b/Zend/zend_call_stack.h @@ -2,15 +2,14 @@ +----------------------------------------------------------------------+ | Zend Engine | +----------------------------------------------------------------------+ - | Copyright (c) Zend Technologies Ltd. (http://www.zend.com) | + | Copyright © Zend Technologies Ltd., a subsidiary company of | + | Perforce Software, Inc., and Contributors. | +----------------------------------------------------------------------+ - | This source file is subject to version 2.00 of the Zend license, | - | that is bundled with this package in the file LICENSE, and is | - | available through the world-wide-web at the following url: | - | http://www.zend.com/license/2_00.txt. | - | If you did not receive a copy of the Zend license and are unable to | - | obtain it through the world-wide-web, please send a note to | - | license@zend.com so we can mail you a copy immediately. | + | This source file is subject to the Modified BSD License that is | + | bundled with this package in the file LICENSE, and is available | + | through the World Wide Web at . | + | | + | SPDX-License-Identifier: BSD-3-Clause | +----------------------------------------------------------------------+ | Authors: Arnaud Le Blanc | +----------------------------------------------------------------------+ diff --git a/Zend/zend_closures.c b/Zend/zend_closures.c index cca69985a0df..840d2dbe32e1 100644 --- a/Zend/zend_closures.c +++ b/Zend/zend_closures.c @@ -2,15 +2,14 @@ +----------------------------------------------------------------------+ | Zend Engine | +----------------------------------------------------------------------+ - | Copyright (c) Zend Technologies Ltd. (http://www.zend.com) | + | Copyright © Zend Technologies Ltd., a subsidiary company of | + | Perforce Software, Inc., and Contributors. | +----------------------------------------------------------------------+ - | This source file is subject to version 2.00 of the Zend license, | - | that is bundled with this package in the file LICENSE, and is | - | available through the world-wide-web at the following url: | - | http://www.zend.com/license/2_00.txt. | - | If you did not receive a copy of the Zend license and are unable to | - | obtain it through the world-wide-web, please send a note to | - | license@zend.com so we can mail you a copy immediately. | + | This source file is subject to the Modified BSD License that is | + | bundled with this package in the file LICENSE, and is available | + | through the World Wide Web at . | + | | + | SPDX-License-Identifier: BSD-3-Clause | +----------------------------------------------------------------------+ | Authors: Christian Seiler | | Dmitry Stogov | @@ -155,6 +154,7 @@ ZEND_METHOD(Closure, call) fci_cache.object = fci.object = newobj; fci.size = sizeof(fci); + fci.consumed_args = 0; ZVAL_OBJ(&fci.function_name, &closure->std); ZVAL_UNDEF(&closure_result); fci.retval = &closure_result; @@ -750,6 +750,7 @@ static ZEND_NAMED_FUNCTION(zend_closure_internal_handler) /* {{{ */ { zend_closure *closure = (zend_closure*)ZEND_CLOSURE_OBJECT(EX(func)); closure->orig_internal_handler(INTERNAL_FUNCTION_PARAM_PASSTHRU); + ZEND_ASSERT(!(closure->func.common.fn_flags2 & ZEND_ACC2_FORBID_DYN_CALLS) || EG(exception)); // Assign to EX(this) so that it is released after observer checks etc. ZEND_ADD_CALL_FLAG(execute_data, ZEND_CALL_RELEASE_THIS); Z_OBJ(EX(This)) = &closure->std; @@ -829,7 +830,7 @@ static void zend_create_closure_ex(zval *res, zend_function *func, zend_class_en /* wrap internal function handler to avoid memory leak */ if (UNEXPECTED(closure->func.internal_function.handler == zend_closure_internal_handler)) { /* avoid infinity recursion, by taking handler from nested closure */ - zend_closure *nested = (zend_closure*)((char*)func - XtOffsetOf(zend_closure, func)); + zend_closure *nested = ZEND_CONTAINER_OF(func, zend_closure, func); ZEND_ASSERT(nested->std.ce == zend_ce_closure); closure->orig_internal_handler = nested->orig_internal_handler; } else { diff --git a/Zend/zend_closures.h b/Zend/zend_closures.h index 8bea4ffb051e..2ff4934f2a3a 100644 --- a/Zend/zend_closures.h +++ b/Zend/zend_closures.h @@ -2,15 +2,14 @@ +----------------------------------------------------------------------+ | Zend Engine | +----------------------------------------------------------------------+ - | Copyright (c) Zend Technologies Ltd. (http://www.zend.com) | + | Copyright © Zend Technologies Ltd., a subsidiary company of | + | Perforce Software, Inc., and Contributors. | +----------------------------------------------------------------------+ - | This source file is subject to version 2.00 of the Zend license, | - | that is bundled with this package in the file LICENSE, and is | - | available through the world-wide-web at the following url: | - | http://www.zend.com/license/2_00.txt. | - | If you did not receive a copy of the Zend license and are unable to | - | obtain it through the world-wide-web, please send a note to | - | license@zend.com so we can mail you a copy immediately. | + | This source file is subject to the Modified BSD License that is | + | bundled with this package in the file LICENSE, and is available | + | through the World Wide Web at . | + | | + | SPDX-License-Identifier: BSD-3-Clause | +----------------------------------------------------------------------+ | Authors: Christian Seiler | | Dmitry Stogov | diff --git a/Zend/zend_compile.c b/Zend/zend_compile.c index ee83ee75ff6e..7e9f7ceac8db 100644 --- a/Zend/zend_compile.c +++ b/Zend/zend_compile.c @@ -2,15 +2,14 @@ +----------------------------------------------------------------------+ | Zend Engine | +----------------------------------------------------------------------+ - | Copyright (c) Zend Technologies Ltd. (http://www.zend.com) | + | Copyright © Zend Technologies Ltd., a subsidiary company of | + | Perforce Software, Inc., and Contributors. | +----------------------------------------------------------------------+ - | This source file is subject to version 2.00 of the Zend license, | - | that is bundled with this package in the file LICENSE, and is | - | available through the world-wide-web at the following url: | - | http://www.zend.com/license/2_00.txt. | - | If you did not receive a copy of the Zend license and are unable to | - | obtain it through the world-wide-web, please send a note to | - | license@zend.com so we can mail you a copy immediately. | + | This source file is subject to the Modified BSD License that is | + | bundled with this package in the file LICENSE, and is available | + | through the World Wide Web at . | + | | + | SPDX-License-Identifier: BSD-3-Clause | +----------------------------------------------------------------------+ | Authors: Andi Gutmans | | Zeev Suraski | @@ -188,10 +187,10 @@ static bool zend_get_unqualified_name(const zend_string *name, const char **resu if (ns_separator != NULL) { *result = ns_separator + 1; *result_len = ZSTR_VAL(name) + ZSTR_LEN(name) - *result; - return 1; + return true; } - return 0; + return false; } /* }}} */ @@ -234,11 +233,11 @@ static bool zend_is_reserved_class_name(const zend_string *name) /* {{{ */ if (uqname_len == reserved->len && zend_binary_strcasecmp(uqname, uqname_len, reserved->name, reserved->len) == 0 ) { - return 1; + return true; } } - return 0; + return false; } /* }}} */ @@ -891,7 +890,7 @@ static const char *zend_modifier_token_to_string(uint32_t token) return "protected(set)"; case T_PRIVATE_SET: return "private(set)"; - EMPTY_SWITCH_DEFAULT_CASE() + default: ZEND_UNREACHABLE(); } } @@ -1665,13 +1664,13 @@ static bool array_is_const(const zend_array *array) static bool can_ct_eval_const(const zend_constant *c) { if (ZEND_CONSTANT_FLAGS(c) & CONST_DEPRECATED) { - return 0; + return false; } if ((ZEND_CONSTANT_FLAGS(c) & CONST_PERSISTENT) && !(CG(compiler_options) & ZEND_COMPILE_NO_PERSISTENT_CONSTANT_SUBSTITUTION) && !((ZEND_CONSTANT_FLAGS(c) & CONST_NO_FILE_CACHE) && (CG(compiler_options) & ZEND_COMPILE_WITH_FILE_CACHE))) { - return 1; + return true; } if (Z_TYPE(c->value) < IS_ARRAY && !(CG(compiler_options) & ZEND_COMPILE_NO_CONSTANT_SUBSTITUTION)) { @@ -1681,7 +1680,7 @@ static bool can_ct_eval_const(const zend_constant *c) { && array_is_const(Z_ARR(c->value))) { return 1; } - return 0; + return false; } static bool zend_try_ct_eval_const(zval *zv, zend_string *name, bool is_fully_qualified) /* {{{ */ @@ -1698,14 +1697,14 @@ static bool zend_try_ct_eval_const(zval *zv, zend_string *name, bool is_fully_qu zend_constant *c; if ((c = zend_get_special_const(lookup_name, lookup_len))) { ZVAL_COPY_VALUE(zv, &c->value); - return 1; + return true; } c = zend_hash_find_ptr(EG(zend_constants), name); if (c && can_ct_eval_const(c)) { ZVAL_COPY_OR_DUP(zv, &c->value); - return 1; + return true; } - return 0; + return false; } /* }}} */ @@ -1713,12 +1712,12 @@ static inline bool zend_is_scope_known(void) /* {{{ */ { if (!CG(active_op_array)) { /* This can only happen when evaluating a default value string. */ - return 0; + return false; } if (CG(active_op_array)->fn_flags & ZEND_ACC_CLOSURE) { /* Closures can be rebound to a different scope */ - return 0; + return false; } if (!CG(active_class_entry)) { @@ -1735,10 +1734,10 @@ static inline bool zend_is_scope_known(void) /* {{{ */ static inline bool class_name_refers_to_active_ce(const zend_string *class_name, uint32_t fetch_type) /* {{{ */ { if (!CG(active_class_entry)) { - return 0; + return false; } if (fetch_type == ZEND_FETCH_CLASS_SELF && zend_is_scope_known()) { - return 1; + return true; } return fetch_type == ZEND_FETCH_CLASS_DEFAULT && zend_string_equals_ci(class_name, CG(active_class_entry)->name); @@ -1803,7 +1802,7 @@ static bool zend_try_compile_const_expr_resolve_class_name(zval *zv, zend_ast *c const zval *class_name; if (class_ast->kind != ZEND_AST_ZVAL) { - return 0; + return false; } class_name = zend_ast_get_zval(class_ast); @@ -1819,22 +1818,22 @@ static bool zend_try_compile_const_expr_resolve_class_name(zval *zv, zend_ast *c case ZEND_FETCH_CLASS_SELF: if (CG(active_class_entry) && zend_is_scope_known()) { ZVAL_STR_COPY(zv, CG(active_class_entry)->name); - return 1; + return true; } - return 0; + return false; case ZEND_FETCH_CLASS_PARENT: if (CG(active_class_entry) && CG(active_class_entry)->parent_name && zend_is_scope_known()) { ZVAL_STR_COPY(zv, CG(active_class_entry)->parent_name); - return 1; + return true; } - return 0; + return false; case ZEND_FETCH_CLASS_STATIC: - return 0; + return false; case ZEND_FETCH_CLASS_DEFAULT: ZVAL_STR(zv, zend_resolve_class_name_ast(class_ast)); - return 1; - EMPTY_SWITCH_DEFAULT_CASE() + return true; + default: ZEND_UNREACHABLE(); } } /* }}} */ @@ -1896,11 +1895,11 @@ static bool zend_try_ct_eval_class_const(zval *zv, zend_string *class_name, zend } if (CG(compiler_options) & ZEND_COMPILE_NO_PERSISTENT_CONSTANT_SUBSTITUTION) { - return 0; + return false; } if (!cc || !zend_verify_ct_const_access(cc, CG(active_class_entry))) { - return 0; + return false; } c = &cc->value; @@ -1914,7 +1913,7 @@ static bool zend_try_ct_eval_class_const(zval *zv, zend_string *class_name, zend return 1; } - return 0; + return false; } /* }}} */ @@ -1950,6 +1949,9 @@ static void zend_do_extended_stmt(znode* result) /* {{{ */ opline->opcode = ZEND_EXT_STMT; if (result) { + if (result->op_type == IS_CONST) { + Z_TRY_ADDREF(result->u.constant); + } SET_NODE(opline->op1, result); } } @@ -2196,7 +2198,7 @@ ZEND_API size_t zend_dirname(char *path, size_t len) /* Note that on Win32 CWD is per drive (heritage from CP/M). * This means dirname("c:foo") maps to "c:." or "c:" - which means CWD on C: drive. */ - if ((2 <= len) && isalpha((int)((unsigned char *)path)[0]) && (':' == path[1])) { + if ((2 <= len) && isalpha((unsigned char)path[0]) && (':' == path[1])) { /* Skip over the drive spec (if any) so as not to change */ path += 2; len_adjust += 2; @@ -2278,7 +2280,7 @@ static void zend_adjust_for_fetch_type(zend_op *opline, znode *result, uint32_t case BP_VAR_UNSET: opline->opcode += 5 * factor; return; - EMPTY_SWITCH_DEFAULT_CASE() + default: ZEND_UNREACHABLE(); } } /* }}} */ @@ -2441,7 +2443,7 @@ static inline void zend_update_jump_target(uint32_t opnum_jump, uint32_t opnum_t case ZEND_JMP_FRAMELESS: opline->op2.opline_num = opnum_target; break; - EMPTY_SWITCH_DEFAULT_CASE() + default: ZEND_UNREACHABLE(); } } /* }}} */ @@ -2510,9 +2512,9 @@ static bool zend_ast_kind_is_short_circuited(zend_ast_kind ast_kind) case ZEND_AST_METHOD_CALL: case ZEND_AST_NULLSAFE_METHOD_CALL: case ZEND_AST_STATIC_CALL: - return 1; + return true; default: - return 0; + return false; } } @@ -2527,9 +2529,9 @@ static bool zend_ast_is_short_circuited(const zend_ast *ast) return zend_ast_is_short_circuited(ast->child[0]); case ZEND_AST_NULLSAFE_PROP: case ZEND_AST_NULLSAFE_METHOD_CALL: - return 1; + return true; default: - return 0; + return false; } } @@ -2799,7 +2801,7 @@ static inline bool zend_can_write_to_variable(const zend_ast *ast) /* {{{ */ static inline bool zend_is_const_default_class_ref(zend_ast *name_ast) /* {{{ */ { if (name_ast->kind != ZEND_AST_ZVAL) { - return 0; + return false; } return ZEND_FETCH_CLASS_DEFAULT == zend_get_class_fetch_type_ast(name_ast); @@ -2968,7 +2970,6 @@ static zend_op *zend_compile_simple_var_no_cv(znode *result, const zend_ast *ast opline->extended_value = ZEND_FETCH_GLOBAL; } else { - // TODO: Have a test case for this? if (name_node.op_type == IS_CONST && type == BP_VAR_R && zend_string_equals_literal(Z_STR(name_node.u.constant), "http_response_header")) { @@ -2991,7 +2992,7 @@ static bool is_this_fetch(const zend_ast *ast) /* {{{ */ return Z_TYPE_P(name) == IS_STRING && zend_string_equals(Z_STR_P(name), ZSTR_KNOWN(ZEND_STR_THIS)); } - return 0; + return false; } /* }}} */ @@ -3002,7 +3003,7 @@ static bool is_globals_fetch(const zend_ast *ast) return Z_TYPE_P(name) == IS_STRING && zend_string_equals_literal(Z_STR_P(name), "GLOBALS"); } - return 0; + return false; } static bool is_global_var_fetch(const zend_ast *ast) @@ -3458,7 +3459,7 @@ static void zend_ensure_writable_variable(const zend_ast *ast) /* {{{ */ static bool zend_is_assign_to_self(const zend_ast *var_ast, const zend_ast *expr_ast) /* {{{ */ { if (expr_ast->kind != ZEND_AST_VAR || expr_ast->child[0]->kind != ZEND_AST_ZVAL) { - return 0; + return false; } while (zend_is_variable(var_ast) && var_ast->kind != ZEND_AST_VAR) { @@ -3466,7 +3467,7 @@ static bool zend_is_assign_to_self(const zend_ast *var_ast, const zend_ast *expr } if (var_ast->kind != ZEND_AST_VAR || var_ast->child[0]->kind != ZEND_AST_ZVAL) { - return 0; + return false; } { @@ -3591,7 +3592,7 @@ static void zend_compile_assign(znode *result, zend_ast *ast, bool stmt, uint32_ result->op_type = IS_UNUSED; } return; - EMPTY_SWITCH_DEFAULT_CASE(); + default: ZEND_UNREACHABLE(); } } /* }}} */ @@ -3747,7 +3748,7 @@ static void zend_compile_compound_assign(znode *result, zend_ast *ast) /* {{{ */ opline = zend_emit_op_data(&expr_node); opline->extended_value = cache_slot; return; - EMPTY_SWITCH_DEFAULT_CASE() + default: ZEND_UNREACHABLE(); } } /* }}} */ @@ -4129,10 +4130,10 @@ static inline bool zend_args_contain_unpack_or_named(const zend_ast_list *args) for (i = 0; i < args->children; ++i) { const zend_ast *arg = args->child[i]; if (arg->kind == ZEND_AST_UNPACK || arg->kind == ZEND_AST_NAMED_ARG) { - return 1; + return true; } } - return 0; + return false; } /* }}} */ @@ -5009,7 +5010,7 @@ static zend_result zend_compile_func_sprintf(znode *result, zend_ast_list *args) case 'd': zend_emit_op_tmp(&elements[placeholder_count], ZEND_CAST, &elements[placeholder_count], NULL)->extended_value = IS_LONG; break; - EMPTY_SWITCH_DEFAULT_CASE(); + default: ZEND_UNREACHABLE(); } if (rope_elements == 0) { @@ -5174,7 +5175,7 @@ static zend_result zend_compile_func_array_map(znode *result, zend_ast_list *arg opline->lineno = lineno; opline->extended_value = (2 << 16) | IS_ARRAY; const zval *fbc_zv = zend_hash_find(CG(function_table), lcname); - const Bucket *fbc_bucket = (const Bucket*)((uintptr_t)fbc_zv - XtOffsetOf(Bucket, val)); + const Bucket *fbc_bucket = ZEND_CONTAINER_OF(fbc_zv, Bucket, val); Z_EXTRA_P(CT_CONSTANT(opline->op1)) = fbc_bucket - CG(function_table)->arData; /* Initialize the result array. */ @@ -5326,7 +5327,7 @@ static const char *zend_get_cstring_from_property_hook_kind(zend_property_hook_k return "get"; case ZEND_PROPERTY_HOOK_SET: return "set"; - EMPTY_SWITCH_DEFAULT_CASE() + default: ZEND_UNREACHABLE(); } } @@ -5464,14 +5465,14 @@ static void zend_compile_call(znode *result, const zend_ast *ast, uint32_t type) } zval_ptr_dtor(&name_node.u.constant); - ZVAL_NEW_STR(&name_node.u.constant, lcname); + ZVAL_STR(&name_node.u.constant, lcname); opline = zend_emit_op(NULL, ZEND_INIT_FCALL, NULL, &name_node); opline->result.num = zend_alloc_cache_slot(); /* Store offset to function from symbol table in op2.extra. */ if (fbc->type == ZEND_INTERNAL_FUNCTION) { - const Bucket *fbc_bucket = (const Bucket*)((uintptr_t)fbc_zv - XtOffsetOf(Bucket, val)); + const Bucket *fbc_bucket = ZEND_CONTAINER_OF(fbc_zv, Bucket, val); Z_EXTRA_P(CT_CONSTANT(opline->op2)) = fbc_bucket - CG(function_table)->arData; } @@ -5876,7 +5877,7 @@ static void zend_compile_unset(const zend_ast *ast) /* {{{ */ opline = zend_compile_static_prop(NULL, var_ast, BP_VAR_UNSET, false, false); opline->opcode = ZEND_UNSET_STATIC_PROP; return; - EMPTY_SWITCH_DEFAULT_CASE() + default: ZEND_UNREACHABLE(); } } /* }}} */ @@ -5887,7 +5888,7 @@ static bool zend_handle_loops_and_finally_ex(zend_long depth, znode *return_valu zend_loop_var *loop_var = zend_stack_top(&CG(loop_var_stack)); if (!loop_var) { - return 1; + return true; } base = zend_stack_base(&CG(loop_var_stack)); for (; loop_var >= base; loop_var--) { @@ -5942,7 +5943,7 @@ static bool zend_has_finally_ex(zend_long depth) /* {{{ */ zend_loop_var *loop_var = zend_stack_top(&CG(loop_var_stack)); if (!loop_var) { - return 0; + return false; } base = zend_stack_base(&CG(loop_var_stack)); for (; loop_var >= base; loop_var--) { @@ -5958,7 +5959,7 @@ static bool zend_has_finally_ex(zend_long depth) /* {{{ */ depth--; } } - return 0; + return false; } /* }}} */ @@ -6560,7 +6561,7 @@ static uint8_t determine_switch_jumptable_type(const zend_ast_list *cases) { static bool should_use_jumptable(const zend_ast_list *cases, uint8_t jumptable_type) { if (CG(compiler_options) & ZEND_COMPILE_NO_JUMPTABLES) { - return 0; + return false; } /* Thresholds are chosen based on when the average switch time for equidistributed @@ -6743,17 +6744,17 @@ static bool can_match_use_jumptable(const zend_ast_list *arms) { zend_eval_const_expr(cond_ast); if ((*cond_ast)->kind != ZEND_AST_ZVAL) { - return 0; + return false; } const zval *cond_zv = zend_ast_get_zval(*cond_ast); if (Z_TYPE_P(cond_zv) != IS_LONG && Z_TYPE_P(cond_zv) != IS_STRING) { - return 0; + return false; } } } - return 1; + return true; } static bool zend_is_pipe_optimizable_callable_name(zend_ast *ast) @@ -7201,7 +7202,7 @@ bool zend_handle_encoding_declaration(zend_ast *ast) /* {{{ */ if (zend_string_equals_literal_ci(name, "encoding")) { if (value_ast->kind != ZEND_AST_ZVAL) { zend_throw_exception(zend_ce_compile_error, "Encoding must be a literal", 0); - return 0; + return false; } if (CG(multibyte)) { @@ -7235,7 +7236,7 @@ bool zend_handle_encoding_declaration(zend_ast *ast) /* {{{ */ } } - return 1; + return true; } /* }}} */ @@ -7469,15 +7470,15 @@ static void zend_are_intersection_types_redundant(const zend_type left_type, con unsigned int sum = 0; const zend_type *outer_type; - ZEND_TYPE_LIST_FOREACH(smaller_type_list, outer_type) + ZEND_TYPE_LIST_FOREACH(smaller_type_list, outer_type) { const zend_type *inner_type; - ZEND_TYPE_LIST_FOREACH(larger_type_list, inner_type) + ZEND_TYPE_LIST_FOREACH(larger_type_list, inner_type) { if (zend_string_equals_ci(ZEND_TYPE_NAME(*inner_type), ZEND_TYPE_NAME(*outer_type))) { sum++; break; } - ZEND_TYPE_LIST_FOREACH_END(); - ZEND_TYPE_LIST_FOREACH_END(); + } ZEND_TYPE_LIST_FOREACH_END(); + } ZEND_TYPE_LIST_FOREACH_END(); if (sum == smaller_type_list->num_types) { zend_string *smaller_type_str; @@ -7505,14 +7506,14 @@ static void zend_is_intersection_type_redundant_by_single_type(const zend_type i ZEND_ASSERT(!ZEND_TYPE_IS_INTERSECTION(single_type)); const zend_type *single_intersection_type = NULL; - ZEND_TYPE_FOREACH(intersection_type, single_intersection_type) + ZEND_TYPE_FOREACH(intersection_type, single_intersection_type) { if (zend_string_equals_ci(ZEND_TYPE_NAME(*single_intersection_type), ZEND_TYPE_NAME(single_type))) { zend_string *single_type_str = zend_type_to_string(single_type); zend_string *complete_type = zend_type_to_string(intersection_type); zend_error_noreturn(E_COMPILE_ERROR, "Type %s is redundant as it is more restrictive than type %s", ZSTR_VAL(complete_type), ZSTR_VAL(single_type_str)); } - ZEND_TYPE_FOREACH_END(); + } ZEND_TYPE_FOREACH_END(); } /* Used by both intersection and union types prior to transforming the type list to a full zend_type */ @@ -7773,14 +7774,14 @@ static bool zend_is_valid_default_value(zend_type type, zval *value) { ZEND_ASSERT(ZEND_TYPE_IS_SET(type)); if (ZEND_TYPE_CONTAINS_CODE(type, Z_TYPE_P(value))) { - return 1; + return true; } if ((ZEND_TYPE_FULL_MASK(type) & MAY_BE_DOUBLE) && Z_TYPE_P(value) == IS_LONG) { /* Integers are allowed as initializers for floating-point values. */ convert_to_double(value); - return 1; + return true; } - return 0; + return false; } static void zend_compile_attributes( @@ -8024,6 +8025,7 @@ static void zend_compile_params(zend_ast *ast, zend_ast *return_type_ast, uint32 } else { arg_infos->type = (zend_type) ZEND_TYPE_INIT_CODE(fallback_return_type, 0, 0); } + arg_infos->doc_comment = NULL; arg_infos++; op_array->fn_flags |= ZEND_ACC_HAS_RETURN_TYPE; @@ -8122,6 +8124,7 @@ static void zend_compile_params(zend_ast *ast, zend_ast *return_type_ast, uint32 arg_info->name = zend_string_copy(name); arg_info->type = (zend_type) ZEND_TYPE_INIT_NONE(0); arg_info->default_value = NULL; + arg_info->doc_comment = doc_comment_ast ? zend_string_copy(zend_ast_get_str(doc_comment_ast)) : NULL; if (attributes_ast) { zend_compile_attributes( @@ -8460,7 +8463,7 @@ static void compile_implicit_lexical_binds( op_array->static_variables = zend_new_array(8); } - ZEND_HASH_MAP_FOREACH_STR_KEY(&info->uses, var_name) + ZEND_HASH_MAP_FOREACH_STR_KEY(&info->uses, var_name) { zval *value = zend_hash_add( op_array->static_variables, var_name, &EG(uninitialized_zval)); uint32_t offset = (uint32_t)((char*)value - (char*)op_array->static_variables->arData); @@ -8469,7 +8472,7 @@ static void compile_implicit_lexical_binds( opline->op2_type = IS_CV; opline->op2.var = lookup_cv(var_name); opline->extended_value = offset | ZEND_BIND_IMPLICIT; - ZEND_HASH_FOREACH_END(); + } ZEND_HASH_FOREACH_END(); } static void zend_compile_closure_uses(zend_ast *ast) /* {{{ */ @@ -8509,11 +8512,11 @@ static void zend_compile_closure_uses(zend_ast *ast) /* {{{ */ static void zend_compile_implicit_closure_uses(const closure_info *info) { zend_string *var_name; - ZEND_HASH_MAP_FOREACH_STR_KEY(&info->uses, var_name) + ZEND_HASH_MAP_FOREACH_STR_KEY(&info->uses, var_name) { zval zv; ZVAL_NULL(&zv); zend_compile_static_var_common(var_name, &zv, ZEND_BIND_IMPLICIT); - ZEND_HASH_FOREACH_END(); + } ZEND_HASH_FOREACH_END(); } static void add_stringable_interface(zend_class_entry *ce) { @@ -8607,7 +8610,7 @@ static zend_string *zend_begin_method_decl(zend_op_array *op_array, zend_string } zend_add_magic_method(ce, (zend_function *) op_array, lcname); - if (zend_string_equals_literal(lcname, ZEND_TOSTRING_FUNC_NAME) + if (zend_string_equals_literal(lcname, ZEND_TOSTRING_FUNC_LCNAME) && !(ce->ce_flags & ZEND_ACC_TRAIT)) { add_stringable_interface(ce); } @@ -8838,7 +8841,7 @@ static zend_op_array *zend_compile_func_decl_ex( } zend_compile_params(params_ast, return_type_ast, - is_method && zend_string_equals_literal(lcname, ZEND_TOSTRING_FUNC_NAME) ? IS_STRING : 0); + is_method && zend_string_equals_literal(lcname, ZEND_TOSTRING_FUNC_LCNAME) ? IS_STRING : 0); if (CG(active_op_array)->fn_flags & ZEND_ACC_GENERATOR) { zend_mark_function_as_generator(); zend_emit_op(NULL, ZEND_GENERATOR_CREATE, NULL, NULL); @@ -9460,7 +9463,7 @@ static void zend_compile_use_trait(const zend_ast *ast) /* {{{ */ case ZEND_AST_TRAIT_ALIAS: zend_compile_trait_alias(adaptation_ast); break; - EMPTY_SWITCH_DEFAULT_CASE() + default: ZEND_UNREACHABLE(); } } } @@ -9832,7 +9835,7 @@ static HashTable *zend_get_import_ht(uint32_t type) /* {{{ */ zend_hash_init(FC(imports_const), 8, NULL, str_dtor, 0); } return FC(imports_const); - EMPTY_SWITCH_DEFAULT_CASE() + default: ZEND_UNREACHABLE(); } return NULL; @@ -9848,7 +9851,7 @@ static char *zend_get_use_type_str(uint32_t type) /* {{{ */ return " function"; case ZEND_SYMBOL_CONST: return " const"; - EMPTY_SWITCH_DEFAULT_CASE() + default: ZEND_UNREACHABLE(); } return " unknown"; @@ -10214,10 +10217,10 @@ static bool zend_try_ct_eval_magic_const(zval *zv, const zend_ast *ast) /* {{{ * ZVAL_EMPTY_STRING(zv); } break; - EMPTY_SWITCH_DEFAULT_CASE() + default: ZEND_UNREACHABLE(); } - return 1; + return true; } /* }}} */ @@ -10321,12 +10324,12 @@ ZEND_API bool zend_binary_op_produces_error(uint32_t opcode, const zval *op1, co static inline bool zend_try_ct_eval_binary_op(zval *result, uint32_t opcode, zval *op1, zval *op2) /* {{{ */ { if (zend_binary_op_produces_error(opcode, op1, op2)) { - return 0; + return false; } const binary_op_type fn = get_binary_op(opcode); fn(result, op1, op2); - return 1; + return true; } /* }}} */ @@ -10351,12 +10354,12 @@ ZEND_API bool zend_unary_op_produces_error(uint32_t opcode, const zval *op) static inline bool zend_try_ct_eval_unary_op(zval *result, uint32_t opcode, zval *op) /* {{{ */ { if (zend_unary_op_produces_error(opcode, op)) { - return 0; + return false; } const unary_op_type fn = get_unary_op(opcode); fn(result, op); - return 1; + return true; } /* }}} */ @@ -10420,12 +10423,12 @@ static bool zend_try_ct_eval_array(zval *result, zend_ast *ast) /* {{{ */ } if (!is_constant) { - return 0; + return false; } if (!list->children) { ZVAL_EMPTY_ARRAY(result); - return 1; + return true; } array_init_size(result, list->children); @@ -10498,7 +10501,7 @@ static bool zend_try_ct_eval_array(zval *result, zend_ast *ast) /* {{{ */ } } - return 1; + return true; } /* }}} */ @@ -10956,7 +10959,7 @@ static void zend_compile_assign_coalesce(znode *result, zend_ast *ast) /* {{{ */ zend_emit_op_data(&default_node); assign_node = var_node_w; break; - EMPTY_SWITCH_DEFAULT_CASE(); + default: ZEND_UNREACHABLE(); } opline = zend_emit_op_tmp(NULL, ZEND_QM_ASSIGN, &assign_node, NULL); @@ -11176,7 +11179,7 @@ static void zend_compile_isset_or_empty(znode *result, const zend_ast *ast) /* { opline = zend_compile_static_prop(result, var_ast, BP_VAR_IS, false, false); opline->opcode = ZEND_ISSET_ISEMPTY_STATIC_PROP; break; - EMPTY_SWITCH_DEFAULT_CASE() + default: ZEND_UNREACHABLE(); } result->op_type = opline->result_type = IS_TMP_VAR; @@ -11692,7 +11695,7 @@ static void zend_compile_const_expr_class_name(zend_ast **ast_ptr) /* {{{ */ case ZEND_FETCH_CLASS_STATIC: zend_error_noreturn(E_COMPILE_ERROR, "static::class cannot be used for compile-time class name resolution"); - EMPTY_SWITCH_DEFAULT_CASE() + default: ZEND_UNREACHABLE(); } } @@ -11800,7 +11803,7 @@ static void zend_compile_const_expr_fcc(zend_ast **ast_ptr) case ZEND_AST_STATIC_CALL: args_ast = &(*ast_ptr)->child[2]; break; - EMPTY_SWITCH_DEFAULT_CASE(); + default: ZEND_UNREACHABLE(); } if ((*args_ast)->kind != ZEND_AST_CALLABLE_CONVERT) { zend_error_noreturn(E_COMPILE_ERROR, "Constant expression contains invalid operations"); @@ -11838,7 +11841,7 @@ static void zend_compile_const_expr_fcc(zend_ast **ast_ptr) } break; } - EMPTY_SWITCH_DEFAULT_CASE(); + default: ZEND_UNREACHABLE(); } } @@ -12130,7 +12133,6 @@ static void zend_compile_expr_inner(znode *result, zend_ast *ast) /* {{{ */ case ZEND_AST_METHOD_CALL: case ZEND_AST_NULLSAFE_METHOD_CALL: case ZEND_AST_STATIC_CALL: - case ZEND_AST_PARENT_PROPERTY_HOOK_CALL: case ZEND_AST_PIPE: zend_compile_var(result, ast, BP_VAR_R, false); return; @@ -12287,9 +12289,6 @@ static zend_op *zend_compile_var_inner(znode *result, zend_ast *ast, uint32_t ty case ZEND_AST_CALL: zend_compile_call(result, ast, type); return NULL; - case ZEND_AST_PARENT_PROPERTY_HOOK_CALL: - zend_compile_parent_property_hook_call(result, ast, type); - return NULL; case ZEND_AST_METHOD_CALL: case ZEND_AST_NULLSAFE_METHOD_CALL: zend_compile_method_call(result, ast, type); diff --git a/Zend/zend_compile.h b/Zend/zend_compile.h index 5414467f3f87..2351882a560d 100644 --- a/Zend/zend_compile.h +++ b/Zend/zend_compile.h @@ -2,15 +2,14 @@ +----------------------------------------------------------------------+ | Zend Engine | +----------------------------------------------------------------------+ - | Copyright (c) Zend Technologies Ltd. (http://www.zend.com) | + | Copyright © Zend Technologies Ltd., a subsidiary company of | + | Perforce Software, Inc., and Contributors. | +----------------------------------------------------------------------+ - | This source file is subject to version 2.00 of the Zend license, | - | that is bundled with this package in the file LICENSE, and is | - | available through the world-wide-web at the following url: | - | http://www.zend.com/license/2_00.txt. | - | If you did not receive a copy of the Zend license and are unable to | - | obtain it through the world-wide-web, please send a note to | - | license@zend.com so we can mail you a copy immediately. | + | This source file is subject to the Modified BSD License that is | + | bundled with this package in the file LICENSE, and is available | + | through the World Wide Web at . | + | | + | SPDX-License-Identifier: BSD-3-Clause | +----------------------------------------------------------------------+ | Authors: Andi Gutmans | | Zeev Suraski | @@ -369,7 +368,7 @@ typedef struct _zend_oparray_context { #define ZEND_ACC_USES_THIS (1 << 17) /* | X | | */ /* | | | */ /* call through user function trampoline. e.g. | | | */ -/* __call, __callstatic | | | */ +/* __call, __callStatic | | | */ #define ZEND_ACC_CALL_VIA_TRAMPOLINE (1 << 18) /* | X | | */ /* | | | */ /* disable inline caching | | | */ @@ -413,10 +412,11 @@ typedef struct _zend_oparray_context { /* op_array uses strict mode types | | | */ #define ZEND_ACC_STRICT_TYPES (1U << 31) /* | X | | */ /* | | | */ -/* Function Flags 2 (fn_flags2) (unused: 0-31) | | | */ +/* Function Flags 2 (fn_flags2) (unused: 1-31) | | | */ /* ============================ | | | */ /* | | | */ -/* #define ZEND_ACC2_EXAMPLE (1 << 0) | X | | */ +/* Function forbids dynamic calls | | | */ +#define ZEND_ACC2_FORBID_DYN_CALLS (1 << 0) /* | X | | */ #define ZEND_ACC_PPP_MASK (ZEND_ACC_PUBLIC | ZEND_ACC_PROTECTED | ZEND_ACC_PRIVATE) #define ZEND_ACC_PPP_SET_MASK (ZEND_ACC_PUBLIC_SET | ZEND_ACC_PROTECTED_SET | ZEND_ACC_PRIVATE_SET) @@ -430,7 +430,7 @@ static zend_always_inline uint32_t zend_visibility_to_set_visibility(uint32_t vi return ZEND_ACC_PROTECTED_SET; case ZEND_ACC_PRIVATE: return ZEND_ACC_PRIVATE_SET; - EMPTY_SWITCH_DEFAULT_CASE(); + default: ZEND_UNREACHABLE(); } } @@ -481,7 +481,7 @@ typedef struct _zend_property_info { #define OBJ_PROP_NUM(obj, num) \ (&(obj)->properties_table[(num)]) #define OBJ_PROP_TO_OFFSET(num) \ - ((uint32_t)(XtOffsetOf(zend_object, properties_table) + sizeof(zval) * (num))) + ((uint32_t)(offsetof(zend_object, properties_table) + sizeof(zval) * (num))) #define OBJ_PROP_TO_NUM(offset) \ (((offset) - OBJ_PROP_TO_OFFSET(0)) / sizeof(zval)) #define OBJ_PROP_SLOT_TO_OFFSET(obj, slot) \ @@ -515,6 +515,7 @@ typedef struct _zend_arg_info { zend_string *name; zend_type type; zend_string *default_value; + zend_string *doc_comment; } zend_arg_info; /* the following structure repeats the layout of zend_internal_arg_info, @@ -1248,10 +1249,18 @@ END_EXTERN_C() #define ZEND_UNSET_FUNC_NAME "__unset" #define ZEND_ISSET_FUNC_NAME "__isset" #define ZEND_CALL_FUNC_NAME "__call" -#define ZEND_CALLSTATIC_FUNC_NAME "__callstatic" -#define ZEND_TOSTRING_FUNC_NAME "__tostring" +#define ZEND_CALLSTATIC_FUNC_NAME "__callStatic" +#define ZEND_CALLSTATIC_FUNC_LCNAME "__callstatic" +#define ZEND_TOSTRING_FUNC_NAME "__toString" +#define ZEND_TOSTRING_FUNC_LCNAME "__tostring" #define ZEND_INVOKE_FUNC_NAME "__invoke" -#define ZEND_DEBUGINFO_FUNC_NAME "__debuginfo" +#define ZEND_DEBUGINFO_FUNC_NAME "__debugInfo" +#define ZEND_DEBUGINFO_FUNC_LCNAME "__debuginfo" +#define ZEND_SLEEP_FUNC_NAME "__sleep" +#define ZEND_WAKEUP_FUNC_NAME "__wakeup" +#define ZEND_SERIALIZE_FUNC_NAME "__serialize" +#define ZEND_UNSERIALIZE_FUNC_NAME "__unserialize" +#define ZEND_SET_STATE_FUNC_NAME "__set_state" /* The following constants may be combined in CG(compiler_options) * to change the default compiler behavior */ diff --git a/Zend/zend_config.w32.h b/Zend/zend_config.w32.h index a44a8b9f70d2..629d7b4437f2 100644 --- a/Zend/zend_config.w32.h +++ b/Zend/zend_config.w32.h @@ -2,15 +2,14 @@ +----------------------------------------------------------------------+ | Zend Engine | +----------------------------------------------------------------------+ - | Copyright (c) Zend Technologies Ltd. (http://www.zend.com) | + | Copyright © Zend Technologies Ltd., a subsidiary company of | + | Perforce Software, Inc., and Contributors. | +----------------------------------------------------------------------+ - | This source file is subject to version 2.00 of the Zend license, | - | that is bundled with this package in the file LICENSE, and is | - | available through the world-wide-web at the following url: | - | http://www.zend.com/license/2_00.txt. | - | If you did not receive a copy of the Zend license and are unable to | - | obtain it through the world-wide-web, please send a note to | - | license@zend.com so we can mail you a copy immediately. | + | This source file is subject to the Modified BSD License that is | + | bundled with this package in the file LICENSE, and is available | + | through the World Wide Web at . | + | | + | SPDX-License-Identifier: BSD-3-Clause | +----------------------------------------------------------------------+ | Authors: Andi Gutmans | | Zeev Suraski | diff --git a/Zend/zend_constants.c b/Zend/zend_constants.c index a18c393be7f9..18292203bee9 100644 --- a/Zend/zend_constants.c +++ b/Zend/zend_constants.c @@ -2,15 +2,14 @@ +----------------------------------------------------------------------+ | Zend Engine | +----------------------------------------------------------------------+ - | Copyright (c) Zend Technologies Ltd. (http://www.zend.com) | + | Copyright © Zend Technologies Ltd., a subsidiary company of | + | Perforce Software, Inc., and Contributors. | +----------------------------------------------------------------------+ - | This source file is subject to version 2.00 of the Zend license, | - | that is bundled with this package in the file LICENSE, and is | - | available through the world-wide-web at the following url: | - | http://www.zend.com/license/2_00.txt. | - | If you did not receive a copy of the Zend license and are unable to | - | obtain it through the world-wide-web, please send a note to | - | license@zend.com so we can mail you a copy immediately. | + | This source file is subject to the Modified BSD License that is | + | bundled with this package in the file LICENSE, and is available | + | through the World Wide Web at . | + | | + | SPDX-License-Identifier: BSD-3-Clause | +----------------------------------------------------------------------+ | Authors: Andi Gutmans | | Zeev Suraski | @@ -251,7 +250,7 @@ ZEND_API zend_constant *_zend_get_special_const(const char *name, size_t len) /* } /* }}} */ -ZEND_API bool zend_verify_const_access(zend_class_constant *c, zend_class_entry *scope) /* {{{ */ +ZEND_API bool zend_verify_const_access(const zend_class_constant *c, const zend_class_entry *scope) /* {{{ */ { if (ZEND_CLASS_CONST_FLAGS(c) & ZEND_ACC_PUBLIC) { return 1; @@ -312,9 +311,9 @@ ZEND_API zval *zend_get_constant(zend_string *name) return NULL; } -ZEND_API zval *zend_get_class_constant_ex(zend_string *class_name, zend_string *constant_name, zend_class_entry *scope, uint32_t flags) +ZEND_API zval *zend_get_class_constant_ex(zend_string *class_name, zend_string *constant_name, const zend_class_entry *scope, uint32_t flags) { - zend_class_entry *ce = NULL; + const zend_class_entry *ce = NULL; zend_class_constant *c = NULL; zval *ret_constant = NULL; @@ -413,7 +412,7 @@ ZEND_API zval *zend_get_class_constant_ex(zend_string *class_name, zend_string * return ret_constant; } -ZEND_API zval *zend_get_constant_ex(zend_string *cname, zend_class_entry *scope, uint32_t flags) +ZEND_API zval *zend_get_constant_ex(zend_string *cname, const zend_class_entry *scope, uint32_t flags) { zend_constant *c; const char *colon; @@ -495,7 +494,7 @@ ZEND_API zval *zend_get_constant_ex(zend_string *cname, zend_class_entry *scope, return &c->value; } -static void* zend_hash_add_constant(HashTable *ht, zend_string *key, zend_constant *c) +static void* zend_hash_add_constant(HashTable *ht, zend_string *key, const zend_constant *c) { void *ret; zend_constant *copy = pemalloc(sizeof(zend_constant), ZEND_CONSTANT_FLAGS(c) & CONST_PERSISTENT); diff --git a/Zend/zend_constants.h b/Zend/zend_constants.h index 6bdb19c4d5af..9461ac764c90 100644 --- a/Zend/zend_constants.h +++ b/Zend/zend_constants.h @@ -2,15 +2,14 @@ +----------------------------------------------------------------------+ | Zend Engine | +----------------------------------------------------------------------+ - | Copyright (c) Zend Technologies Ltd. (http://www.zend.com) | + | Copyright © Zend Technologies Ltd., a subsidiary company of | + | Perforce Software, Inc., and Contributors. | +----------------------------------------------------------------------+ - | This source file is subject to version 2.00 of the Zend license, | - | that is bundled with this package in the file LICENSE, and is | - | available through the world-wide-web at the following url: | - | http://www.zend.com/license/2_00.txt. | - | If you did not receive a copy of the Zend license and are unable to | - | obtain it through the world-wide-web, please send a note to | - | license@zend.com so we can mail you a copy immediately. | + | This source file is subject to the Modified BSD License that is | + | bundled with this package in the file LICENSE, and is available | + | through the World Wide Web at . | + | | + | SPDX-License-Identifier: BSD-3-Clause | +----------------------------------------------------------------------+ | Authors: Andi Gutmans | | Zeev Suraski | @@ -85,12 +84,12 @@ void clean_module_constants(int module_number); void free_zend_constant(zval *zv); void zend_startup_constants(void); void zend_register_standard_constants(void); -ZEND_API bool zend_verify_const_access(zend_class_constant *c, zend_class_entry *ce); +ZEND_API bool zend_verify_const_access(const zend_class_constant *c, const zend_class_entry *ce); ZEND_API zval *zend_get_constant(zend_string *name); ZEND_API zend_constant *zend_get_constant_ptr(zend_string *name); ZEND_API zval *zend_get_constant_str(const char *name, size_t name_len); -ZEND_API zval *zend_get_constant_ex(zend_string *name, zend_class_entry *scope, uint32_t flags); -ZEND_API zval *zend_get_class_constant_ex(zend_string *class_name, zend_string *constant_name, zend_class_entry *scope, uint32_t flags); +ZEND_API zval *zend_get_constant_ex(zend_string *name, const zend_class_entry *scope, uint32_t flags); +ZEND_API zval *zend_get_class_constant_ex(zend_string *class_name, zend_string *constant_name, const zend_class_entry *scope, uint32_t flags); ZEND_API zend_constant *zend_register_bool_constant(const char *name, size_t name_len, bool bval, int flags, int module_number); ZEND_API zend_constant *zend_register_null_constant(const char *name, size_t name_len, int flags, int module_number); ZEND_API zend_constant *zend_register_long_constant(const char *name, size_t name_len, zend_long lval, int flags, int module_number); diff --git a/Zend/zend_cpuinfo.c b/Zend/zend_cpuinfo.c index 9f8f1354be06..6fc42ca39e6c 100644 --- a/Zend/zend_cpuinfo.c +++ b/Zend/zend_cpuinfo.c @@ -2,15 +2,14 @@ +----------------------------------------------------------------------+ | Zend Engine | +----------------------------------------------------------------------+ - | Copyright (c) Zend Technologies Ltd. (http://www.zend.com) | + | Copyright © Zend Technologies Ltd., a subsidiary company of | + | Perforce Software, Inc., and Contributors. | +----------------------------------------------------------------------+ - | This source file is subject to version 2.00 of the Zend license, | - | that is bundled with this package in the file LICENSE, and is | - | available through the world-wide-web at the following url: | - | http://www.zend.com/license/2_00.txt. | - | If you did not receive a copy of the Zend license and are unable to | - | obtain it through the world-wide-web, please send a note to | - | license@zend.com so we can mail you a copy immediately. | + | This source file is subject to the Modified BSD License that is | + | bundled with this package in the file LICENSE, and is available | + | through the World Wide Web at . | + | | + | SPDX-License-Identifier: BSD-3-Clause | +----------------------------------------------------------------------+ | Authors: Xinchen Hui | +----------------------------------------------------------------------+ diff --git a/Zend/zend_cpuinfo.h b/Zend/zend_cpuinfo.h index 7e53ba654dd4..855e245beafe 100644 --- a/Zend/zend_cpuinfo.h +++ b/Zend/zend_cpuinfo.h @@ -2,15 +2,14 @@ +----------------------------------------------------------------------+ | Zend Engine | +----------------------------------------------------------------------+ - | Copyright (c) Zend Technologies Ltd. (http://www.zend.com) | + | Copyright © Zend Technologies Ltd., a subsidiary company of | + | Perforce Software, Inc., and Contributors. | +----------------------------------------------------------------------+ - | This source file is subject to version 2.00 of the Zend license, | - | that is bundled with this package in the file LICENSE, and is | - | available through the world-wide-web at the following url: | - | http://www.zend.com/license/2_00.txt. | - | If you did not receive a copy of the Zend license and are unable to | - | obtain it through the world-wide-web, please send a note to | - | license@zend.com so we can mail you a copy immediately. | + | This source file is subject to the Modified BSD License that is | + | bundled with this package in the file LICENSE, and is available | + | through the World Wide Web at . | + | | + | SPDX-License-Identifier: BSD-3-Clause | +----------------------------------------------------------------------+ | Authors: Xinchen Hui | +----------------------------------------------------------------------+ @@ -272,8 +271,11 @@ static zend_always_inline int zend_cpu_supports_avx512_vbmi(void) { } #endif -/* __builtin_cpu_supports has pclmul from gcc9 */ -#if defined(PHP_HAVE_BUILTIN_CPU_SUPPORTS) && (!defined(__GNUC__) || (ZEND_GCC_VERSION >= 9000)) +/* __builtin_cpu_supports has pclmul from gcc9 and clang 19 */ +#if defined(PHP_HAVE_BUILTIN_CPU_SUPPORTS) && (defined(__x86_64__) || defined(__i386__)) && \ + ( \ + (!defined(__GNUC__) || (defined(__clang__) && __clang_major__ >= 19) || (ZEND_GCC_VERSION >= 9000)) \ + ) ZEND_NO_SANITIZE_ADDRESS static inline int zend_cpu_supports_pclmul(void) { #ifdef PHP_HAVE_BUILTIN_CPU_INIT @@ -287,8 +289,13 @@ static inline int zend_cpu_supports_pclmul(void) { } #endif -/* __builtin_cpu_supports has cldemote from gcc11 */ -#if defined(PHP_HAVE_BUILTIN_CPU_SUPPORTS) && defined(__GNUC__) && (ZEND_GCC_VERSION >= 11000) +/* __builtin_cpu_supports has cldemote from gcc11 and clang 19 */ +#if defined(PHP_HAVE_BUILTIN_CPU_SUPPORTS) && (defined(__x86_64__) || defined(__i386__)) && \ + ( \ + (defined(__clang__) && (__clang_major__ >= 19)) || \ + (!defined(__clang__) && defined(__GNUC__) && (ZEND_GCC_VERSION >= 11000)) \ + ) +#define HAVE_ZEND_CPU_SUPPORTS_CLDEMOTE 1 ZEND_NO_SANITIZE_ADDRESS static inline int zend_cpu_supports_cldemote(void) { #ifdef PHP_HAVE_BUILTIN_CPU_INIT diff --git a/Zend/zend_default_classes.c b/Zend/zend_default_classes.c index 7ab9b8325a39..cc534e04549d 100644 --- a/Zend/zend_default_classes.c +++ b/Zend/zend_default_classes.c @@ -2,15 +2,14 @@ +----------------------------------------------------------------------+ | Zend Engine | +----------------------------------------------------------------------+ - | Copyright (c) Zend Technologies Ltd. (http://www.zend.com) | + | Copyright © Zend Technologies Ltd., a subsidiary company of | + | Perforce Software, Inc., and Contributors. | +----------------------------------------------------------------------+ - | This source file is subject to version 2.00 of the Zend license, | - | that is bundled with this package in the file LICENSE, and is | - | available through the world-wide-web at the following url: | - | http://www.zend.com/license/2_00.txt. | - | If you did not receive a copy of the Zend license and are unable to | - | obtain it through the world-wide-web, please send a note to | - | license@zend.com so we can mail you a copy immediately. | + | This source file is subject to the Modified BSD License that is | + | bundled with this package in the file LICENSE, and is available | + | through the World Wide Web at . | + | | + | SPDX-License-Identifier: BSD-3-Clause | +----------------------------------------------------------------------+ | Authors: Sterling Hughes | | Marcus Boerger | diff --git a/Zend/zend_dtrace.c b/Zend/zend_dtrace.c index dfc43a85139b..1052022f3bed 100644 --- a/Zend/zend_dtrace.c +++ b/Zend/zend_dtrace.c @@ -2,15 +2,14 @@ +----------------------------------------------------------------------+ | Zend Engine | +----------------------------------------------------------------------+ - | Copyright (c) Zend Technologies Ltd. (http://www.zend.com) | + | Copyright © Zend Technologies Ltd., a subsidiary company of | + | Perforce Software, Inc., and Contributors. | +----------------------------------------------------------------------+ - | This source file is subject to version 2.00 of the Zend license, | - | that is bundled with this package in the file LICENSE, and is | - | available through the world-wide-web at the following url: | - | http://www.zend.com/license/2_00.txt. | - | If you did not receive a copy of the Zend license and are unable to | - | obtain it through the world-wide-web, please send a note to | - | license@zend.com so we can mail you a copy immediately. | + | This source file is subject to the Modified BSD License that is | + | bundled with this package in the file LICENSE, and is available | + | through the World Wide Web at . | + | | + | SPDX-License-Identifier: BSD-3-Clause | +----------------------------------------------------------------------+ | Authors: David Soria Parra | +----------------------------------------------------------------------+ diff --git a/Zend/zend_dtrace.d b/Zend/zend_dtrace.d index 6920d0e3602a..9ff085031178 100644 --- a/Zend/zend_dtrace.d +++ b/Zend/zend_dtrace.d @@ -2,15 +2,14 @@ +----------------------------------------------------------------------+ | Zend Engine | +----------------------------------------------------------------------+ - | Copyright (c) Zend Technologies Ltd. (http://www.zend.com) | + | Copyright © Zend Technologies Ltd., a subsidiary company of | + | Perforce Software, Inc., and Contributors. | +----------------------------------------------------------------------+ - | This source file is subject to version 2.00 of the Zend license, | - | that is bundled with this package in the file LICENSE, and is | - | available through the world-wide-web at the following url: | - | http://www.zend.com/license/2_00.txt. | - | If you did not receive a copy of the Zend license and are unable to | - | obtain it through the world-wide-web, please send a note to | - | license@zend.com so we can mail you a copy immediately. | + | This source file is subject to the Modified BSD License that is | + | bundled with this package in the file LICENSE, and is available | + | through the World Wide Web at . | + | | + | SPDX-License-Identifier: BSD-3-Clause | +----------------------------------------------------------------------+ | Authors: David Soria Parra | +----------------------------------------------------------------------+ diff --git a/Zend/zend_dtrace.h b/Zend/zend_dtrace.h index 53ccaca4e407..ada77ce664e3 100644 --- a/Zend/zend_dtrace.h +++ b/Zend/zend_dtrace.h @@ -2,15 +2,14 @@ +----------------------------------------------------------------------+ | Zend Engine | +----------------------------------------------------------------------+ - | Copyright (c) Zend Technologies Ltd. (http://www.zend.com) | + | Copyright © Zend Technologies Ltd., a subsidiary company of | + | Perforce Software, Inc., and Contributors. | +----------------------------------------------------------------------+ - | This source file is subject to version 2.00 of the Zend license, | - | that is bundled with this package in the file LICENSE, and is | - | available through the world-wide-web at the following url: | - | http://www.zend.com/license/2_00.txt. | - | If you did not receive a copy of the Zend license and are unable to | - | obtain it through the world-wide-web, please send a note to | - | license@zend.com so we can mail you a copy immediately. | + | This source file is subject to the Modified BSD License that is | + | bundled with this package in the file LICENSE, and is available | + | through the World Wide Web at . | + | | + | SPDX-License-Identifier: BSD-3-Clause | +----------------------------------------------------------------------+ | Authors: David Soria Parra | +----------------------------------------------------------------------+ diff --git a/Zend/zend_enum.c b/Zend/zend_enum.c index 6e9c68810d4b..7f0b58575387 100644 --- a/Zend/zend_enum.c +++ b/Zend/zend_enum.c @@ -2,15 +2,14 @@ +----------------------------------------------------------------------+ | Zend Engine | +----------------------------------------------------------------------+ - | Copyright (c) Zend Technologies Ltd. (http://www.zend.com) | + | Copyright © Zend Technologies Ltd., a subsidiary company of | + | Perforce Software, Inc., and Contributors. | +----------------------------------------------------------------------+ - | This source file is subject to version 2.00 of the Zend license, | - | that is bundled with this package in the file LICENSE, and is | - | available through the world-wide-web at the following url: | - | http://www.zend.com/license/2_00.txt. | - | If you did not receive a copy of the Zend license and are unable to | - | obtain it through the world-wide-web, please send a note to | - | license@zend.com so we can mail you a copy immediately. | + | This source file is subject to the Modified BSD License that is | + | bundled with this package in the file LICENSE, and is available | + | through the World Wide Web at . | + | | + | SPDX-License-Identifier: BSD-3-Clause | +----------------------------------------------------------------------+ | Authors: Ilija Tovilo | +----------------------------------------------------------------------+ @@ -91,24 +90,23 @@ static void zend_verify_enum_properties(const zend_class_entry *ce) static void zend_verify_enum_magic_methods(const zend_class_entry *ce) { - // Only __get, __call and __invoke are allowed - - ZEND_ENUM_DISALLOW_MAGIC_METHOD(constructor, "__construct"); - ZEND_ENUM_DISALLOW_MAGIC_METHOD(destructor, "__destruct"); - ZEND_ENUM_DISALLOW_MAGIC_METHOD(clone, "__clone"); - ZEND_ENUM_DISALLOW_MAGIC_METHOD(__get, "__get"); - ZEND_ENUM_DISALLOW_MAGIC_METHOD(__set, "__set"); - ZEND_ENUM_DISALLOW_MAGIC_METHOD(__unset, "__unset"); - ZEND_ENUM_DISALLOW_MAGIC_METHOD(__isset, "__isset"); - ZEND_ENUM_DISALLOW_MAGIC_METHOD(__tostring, "__toString"); - ZEND_ENUM_DISALLOW_MAGIC_METHOD(__debugInfo, "__debugInfo"); - ZEND_ENUM_DISALLOW_MAGIC_METHOD(__serialize, "__serialize"); - ZEND_ENUM_DISALLOW_MAGIC_METHOD(__unserialize, "__unserialize"); + // Only __get, __call, __debugInfo and __invoke are allowed + + ZEND_ENUM_DISALLOW_MAGIC_METHOD(constructor, ZEND_CONSTRUCTOR_FUNC_NAME); + ZEND_ENUM_DISALLOW_MAGIC_METHOD(destructor, ZEND_DESTRUCTOR_FUNC_NAME); + ZEND_ENUM_DISALLOW_MAGIC_METHOD(clone, ZEND_CLONE_FUNC_NAME); + ZEND_ENUM_DISALLOW_MAGIC_METHOD(__get, ZEND_GET_FUNC_NAME); + ZEND_ENUM_DISALLOW_MAGIC_METHOD(__set, ZEND_SET_FUNC_NAME); + ZEND_ENUM_DISALLOW_MAGIC_METHOD(__unset, ZEND_UNSET_FUNC_NAME); + ZEND_ENUM_DISALLOW_MAGIC_METHOD(__isset, ZEND_ISSET_FUNC_NAME); + ZEND_ENUM_DISALLOW_MAGIC_METHOD(__tostring, ZEND_TOSTRING_FUNC_NAME); + ZEND_ENUM_DISALLOW_MAGIC_METHOD(__serialize, ZEND_SERIALIZE_FUNC_NAME); + ZEND_ENUM_DISALLOW_MAGIC_METHOD(__unserialize, ZEND_UNSERIALIZE_FUNC_NAME); static const char *const forbidden_methods[] = { - "__sleep", - "__wakeup", - "__set_state", + ZEND_SLEEP_FUNC_NAME, + ZEND_WAKEUP_FUNC_NAME, + ZEND_SET_STATE_FUNC_NAME, }; uint32_t forbidden_methods_length = sizeof(forbidden_methods) / sizeof(forbidden_methods[0]); @@ -177,7 +175,7 @@ void zend_register_enum_ce(void) zend_ce_backed_enum->interface_gets_implemented = zend_implement_backed_enum; memcpy(&zend_enum_object_handlers, &std_object_handlers, sizeof(zend_object_handlers)); - zend_enum_object_handlers.offset = XtOffsetOf(zend_enum_obj, std); + zend_enum_object_handlers.offset = offsetof(zend_enum_obj, std); zend_enum_object_handlers.clone_obj = NULL; zend_enum_object_handlers.compare = zend_objects_not_comparable; } diff --git a/Zend/zend_enum.h b/Zend/zend_enum.h index 4d0799e4f0ac..6bffb8866507 100644 --- a/Zend/zend_enum.h +++ b/Zend/zend_enum.h @@ -2,15 +2,14 @@ +----------------------------------------------------------------------+ | Zend Engine | +----------------------------------------------------------------------+ - | Copyright (c) Zend Technologies Ltd. (http://www.zend.com) | + | Copyright © Zend Technologies Ltd., a subsidiary company of | + | Perforce Software, Inc., and Contributors. | +----------------------------------------------------------------------+ - | This source file is subject to version 2.00 of the Zend license, | - | that is bundled with this package in the file LICENSE, and is | - | available through the world-wide-web at the following url: | - | http://www.zend.com/license/2_00.txt. | - | If you did not receive a copy of the Zend license and are unable to | - | obtain it through the world-wide-web, please send a note to | - | license@zend.com so we can mail you a copy immediately. | + | This source file is subject to the Modified BSD License that is | + | bundled with this package in the file LICENSE, and is available | + | through the World Wide Web at . | + | | + | SPDX-License-Identifier: BSD-3-Clause | +----------------------------------------------------------------------+ | Authors: Ilija Tovilo | +----------------------------------------------------------------------+ @@ -37,7 +36,7 @@ typedef struct zend_enum_obj { static inline zend_enum_obj *zend_enum_obj_from_obj(zend_object *zobj) { ZEND_ASSERT(zobj->ce->ce_flags & ZEND_ACC_ENUM); - return (zend_enum_obj*)((char*)(zobj) - XtOffsetOf(zend_enum_obj, std)); + return ZEND_CONTAINER_OF(zobj, zend_enum_obj, std); } void zend_enum_startup(void); diff --git a/Zend/zend_errors.h b/Zend/zend_errors.h index 954be61a0aec..831e4a9b912a 100644 --- a/Zend/zend_errors.h +++ b/Zend/zend_errors.h @@ -2,15 +2,14 @@ +----------------------------------------------------------------------+ | Zend Engine | +----------------------------------------------------------------------+ - | Copyright (c) Zend Technologies Ltd. (http://www.zend.com) | + | Copyright © Zend Technologies Ltd., a subsidiary company of | + | Perforce Software, Inc., and Contributors. | +----------------------------------------------------------------------+ - | This source file is subject to version 2.00 of the Zend license, | - | that is bundled with this package in the file LICENSE, and is | - | available through the world-wide-web at the following url: | - | http://www.zend.com/license/2_00.txt. | - | If you did not receive a copy of the Zend license and are unable to | - | obtain it through the world-wide-web, please send a note to | - | license@zend.com so we can mail you a copy immediately. | + | This source file is subject to the Modified BSD License that is | + | bundled with this package in the file LICENSE, and is available | + | through the World Wide Web at . | + | | + | SPDX-License-Identifier: BSD-3-Clause | +----------------------------------------------------------------------+ | Authors: Andi Gutmans | | Zeev Suraski | diff --git a/Zend/zend_exceptions.c b/Zend/zend_exceptions.c index 52e3ab009254..a1301b8c20b2 100644 --- a/Zend/zend_exceptions.c +++ b/Zend/zend_exceptions.c @@ -2,15 +2,14 @@ +----------------------------------------------------------------------+ | Zend Engine | +----------------------------------------------------------------------+ - | Copyright (c) Zend Technologies Ltd. (http://www.zend.com) | + | Copyright © Zend Technologies Ltd., a subsidiary company of | + | Perforce Software, Inc., and Contributors. | +----------------------------------------------------------------------+ - | This source file is subject to version 2.00 of the Zend license, | - | that is bundled with this package in the file LICENSE, and is | - | available through the world-wide-web at the following url: | - | http://www.zend.com/license/2_00.txt. | - | If you did not receive a copy of the Zend license and are unable to | - | obtain it through the world-wide-web, please send a note to | - | license@zend.com so we can mail you a copy immediately. | + | This source file is subject to the Modified BSD License that is | + | bundled with this package in the file LICENSE, and is available | + | through the World Wide Web at . | + | | + | SPDX-License-Identifier: BSD-3-Clause | +----------------------------------------------------------------------+ | Authors: Andi Gutmans | | Marcus Boerger | @@ -497,17 +496,17 @@ ZEND_METHOD(ErrorException, getSeverity) #define TRACE_APPEND_KEY(key) do { \ tmp = zend_hash_find(ht, key); \ if (tmp) { \ - if (Z_TYPE_P(tmp) != IS_STRING) { \ + if (UNEXPECTED(Z_TYPE_P(tmp) != IS_STRING)) { \ zend_error(E_WARNING, "Value for %s is not a string", \ ZSTR_VAL(key)); \ smart_str_appends(str, "[unknown]"); \ } else { \ - smart_str_appends(str, Z_STRVAL_P(tmp)); \ + smart_str_append(str, Z_STR_P(tmp)); \ } \ } \ } while (0) -static void _build_trace_args(zval *arg, smart_str *str) /* {{{ */ +static void build_trace_args(zval *arg, smart_str *str) /* {{{ */ { /* the trivial way would be to do * convert_to_string(arg); @@ -517,23 +516,21 @@ static void _build_trace_args(zval *arg, smart_str *str) /* {{{ */ ZVAL_DEREF(arg); - if (smart_str_append_zval(str, arg, EG(exception_string_param_max_len)) == SUCCESS) { - smart_str_appends(str, ", "); - } else { + if (smart_str_append_zval(str, arg, EG(exception_string_param_max_len)) != SUCCESS) { switch (Z_TYPE_P(arg)) { case IS_RESOURCE: smart_str_appends(str, "Resource id #"); smart_str_append_long(str, Z_RES_HANDLE_P(arg)); - smart_str_appends(str, ", "); break; case IS_ARRAY: - smart_str_appends(str, "Array, "); + smart_str_appends(str, "Array"); break; case IS_OBJECT: { zend_string *class_name = Z_OBJ_HANDLER_P(arg, get_class_name)(Z_OBJ_P(arg)); smart_str_appends(str, "Object("); + /* cut off on NULL byte ... class@anonymous */ smart_str_appends(str, ZSTR_VAL(class_name)); - smart_str_appends(str, "), "); + smart_str_appends(str, ")"); zend_string_release_ex(class_name, 0); break; } @@ -542,7 +539,30 @@ static void _build_trace_args(zval *arg, smart_str *str) /* {{{ */ } /* }}} */ -static void _build_trace_string(smart_str *str, const HashTable *ht, uint32_t num) /* {{{ */ +static void build_trace_args_list(zval *tmp, smart_str *str) /* {{{ */ +{ + if (UNEXPECTED(Z_TYPE_P(tmp) != IS_ARRAY)) { + /* only happens w/ reflection abuse (Zend/tests/bug63762.phpt) */ + zend_error(E_WARNING, "args element is not an array"); + return; + } + + bool first = true; + ZEND_HASH_FOREACH_STR_KEY_VAL(Z_ARRVAL_P(tmp), zend_string *name, zval *arg) { + if (!first) { + smart_str_appends(str, ", "); + } + first = false; + if (name) { + smart_str_append(str, name); + smart_str_appends(str, ": "); + } + build_trace_args(arg, str); + } ZEND_HASH_FOREACH_END(); +} +/* }}} */ + +static void build_trace_string(smart_str *str, const HashTable *ht, uint32_t num) /* {{{ */ { zval *file, *tmp; @@ -573,33 +593,55 @@ static void _build_trace_string(smart_str *str, const HashTable *ht, uint32_t nu } else { smart_str_appends(str, "[internal function]: "); } - TRACE_APPEND_KEY(ZSTR_KNOWN(ZEND_STR_CLASS)); + const zval *class_name = zend_hash_find(ht, ZSTR_KNOWN(ZEND_STR_CLASS)); + if (class_name) { + if (UNEXPECTED(Z_TYPE_P(class_name) != IS_STRING)) { + zend_error(E_WARNING, "Value for class is not a string"); + smart_str_appends(str, "[unknown]"); + } else { + /* cut off on NULL byte ... class@anonymous */ + smart_str_appends(str, Z_STRVAL_P(class_name)); + } + } TRACE_APPEND_KEY(ZSTR_KNOWN(ZEND_STR_TYPE)); TRACE_APPEND_KEY(ZSTR_KNOWN(ZEND_STR_FUNCTION)); smart_str_appendc(str, '('); tmp = zend_hash_find_known_hash(ht, ZSTR_KNOWN(ZEND_STR_ARGS)); if (tmp) { - if (EXPECTED(Z_TYPE_P(tmp) == IS_ARRAY)) { - size_t last_len = ZSTR_LEN(str->s); - zend_string *name; - zval *arg; - - ZEND_HASH_FOREACH_STR_KEY_VAL(Z_ARRVAL_P(tmp), name, arg) { - if (name) { - smart_str_append(str, name); - smart_str_appends(str, ": "); - } - _build_trace_args(arg, str); - } ZEND_HASH_FOREACH_END(); + build_trace_args_list(tmp, str); + } + smart_str_appends(str, ")\n"); +} +/* }}} */ - if (last_len != ZSTR_LEN(str->s)) { - ZSTR_LEN(str->s) -= 2; /* remove last ', ' */ - } - } else { - zend_error(E_WARNING, "args element is not an array"); +/* {{{ Gets the function arguments printed as a string from a backtrace frame. */ +ZEND_API zend_string *zend_trace_function_args_to_string(const HashTable *frame) { + smart_str str = {0}; + + zval *tmp = zend_hash_find_known_hash(frame, ZSTR_KNOWN(ZEND_STR_ARGS)); + if (tmp) { + build_trace_args_list(tmp, &str); + } + + return smart_str_extract(&str); +} +/* }}} */ + +/* {{{ Gets the currently executing function's arguments as a string. Used by php_verror. */ +ZEND_API zend_string *zend_trace_current_function_args_string(void) { + zend_string *dynamic_params = NULL; + /* get a backtrace to snarf function args */ + zval backtrace; + zend_fetch_debug_backtrace(&backtrace, /* skip_last */ 0, /* options */ 0, /* limit */ 1); + /* can fail esp if low memory condition */ + if (Z_TYPE(backtrace) == IS_ARRAY) { + zval *first_frame = zend_hash_index_find(Z_ARRVAL(backtrace), 0); + if (first_frame) { + dynamic_params = zend_trace_function_args_to_string(Z_ARRVAL_P(first_frame)); } } - smart_str_appends(str, ")\n"); + zval_ptr_dtor(&backtrace); + return dynamic_params; } /* }}} */ @@ -615,7 +657,7 @@ ZEND_API zend_string *zend_trace_to_string(const HashTable *trace, bool include_ continue; } - _build_trace_string(&str, Z_ARRVAL_P(frame), num++); + build_trace_string(&str, Z_ARRVAL_P(frame), num++); } ZEND_HASH_FOREACH_END(); if (include_main) { diff --git a/Zend/zend_exceptions.h b/Zend/zend_exceptions.h index e5a6be2f32fe..7ef9ef016393 100644 --- a/Zend/zend_exceptions.h +++ b/Zend/zend_exceptions.h @@ -2,15 +2,14 @@ +----------------------------------------------------------------------+ | Zend Engine | +----------------------------------------------------------------------+ - | Copyright (c) Zend Technologies Ltd. (http://www.zend.com) | + | Copyright © Zend Technologies Ltd., a subsidiary company of | + | Perforce Software, Inc., and Contributors. | +----------------------------------------------------------------------+ - | This source file is subject to version 2.00 of the Zend license, | - | that is bundled with this package in the file LICENSE, and is | - | available through the world-wide-web at the following url: | - | http://www.zend.com/license/2_00.txt. | - | If you did not receive a copy of the Zend license and are unable to | - | obtain it through the world-wide-web, please send a note to | - | license@zend.com so we can mail you a copy immediately. | + | This source file is subject to the Modified BSD License that is | + | bundled with this package in the file LICENSE, and is available | + | through the World Wide Web at . | + | | + | SPDX-License-Identifier: BSD-3-Clause | +----------------------------------------------------------------------+ | Authors: Andi Gutmans | | Marcus Boerger | @@ -66,6 +65,8 @@ ZEND_API zend_result zend_update_exception_properties(zend_execute_data *execute /* show an exception using zend_error(severity,...), severity should be E_ERROR */ ZEND_API ZEND_COLD zend_result zend_exception_error(zend_object *exception, int severity); ZEND_NORETURN void zend_exception_uncaught_error(const char *prefix, ...) ZEND_ATTRIBUTE_FORMAT(printf, 1, 2); +ZEND_API zend_string *zend_trace_function_args_to_string(const HashTable *frame); +ZEND_API zend_string *zend_trace_current_function_args_string(void); ZEND_API zend_string *zend_trace_to_string(const HashTable *trace, bool include_main); ZEND_API ZEND_COLD zend_object *zend_create_unwind_exit(void); diff --git a/Zend/zend_execute.c b/Zend/zend_execute.c index 37278c5cb9a2..1b28ce25fe37 100644 --- a/Zend/zend_execute.c +++ b/Zend/zend_execute.c @@ -2,15 +2,14 @@ +----------------------------------------------------------------------+ | Zend Engine | +----------------------------------------------------------------------+ - | Copyright (c) Zend Technologies Ltd. (http://www.zend.com) | + | Copyright © Zend Technologies Ltd., a subsidiary company of | + | Perforce Software, Inc., and Contributors. | +----------------------------------------------------------------------+ - | This source file is subject to version 2.00 of the Zend license, | - | that is bundled with this package in the file LICENSE, and is | - | available through the world-wide-web at the following url: | - | http://www.zend.com/license/2_00.txt. | - | If you did not receive a copy of the Zend license and are unable to | - | obtain it through the world-wide-web, please send a note to | - | license@zend.com so we can mail you a copy immediately. | + | This source file is subject to the Modified BSD License that is | + | bundled with this package in the file LICENSE, and is available | + | through the World Wide Web at . | + | | + | SPDX-License-Identifier: BSD-3-Clause | +----------------------------------------------------------------------+ | Authors: Andi Gutmans | | Zeev Suraski | @@ -605,7 +604,7 @@ static zend_never_inline ZEND_COLD zval *zend_wrong_assign_to_variable_reference return zend_assign_to_variable_ex(variable_ptr, value_ptr, IS_TMP_VAR, EX_USES_STRICT_TYPES(), garbage_ptr); } -ZEND_API ZEND_COLD void ZEND_FASTCALL zend_cannot_pass_by_reference(uint32_t arg_num) +ZEND_API zend_never_inline ZEND_COLD void ZEND_FASTCALL zend_cannot_pass_by_reference(uint32_t arg_num) { const zend_execute_data *execute_data = EG(current_execute_data); zend_string *func_name = get_function_or_method_name(EX(call)->func); @@ -647,7 +646,7 @@ static zend_never_inline ZEND_COLD void zend_throw_access_uninit_prop_by_ref_err } /* this should modify object only if it's empty */ -static zend_never_inline ZEND_COLD void ZEND_FASTCALL zend_throw_non_object_error(const zval *object, zval *property OPLINE_DC EXECUTE_DATA_DC) +static zend_never_inline ZEND_COLD void ZEND_FASTCALL zend_throw_non_object_error(const zval *object, const zval *property OPLINE_DC EXECUTE_DATA_DC) { zend_string *tmp_property_name; zend_string *property_name = zval_get_tmp_string(property, &tmp_property_name); @@ -681,7 +680,7 @@ static zend_never_inline ZEND_COLD void ZEND_FASTCALL zend_throw_non_object_erro } } -static ZEND_COLD void zend_verify_type_error_common( +static zend_never_inline ZEND_COLD void zend_verify_type_error_common( const zend_function *zf, const zend_arg_info *arg_info, const zval *value, const char **fname, const char **fsep, const char **fclass, zend_string **need_msg, const char **given_kind) @@ -704,7 +703,7 @@ static ZEND_COLD void zend_verify_type_error_common( } } -ZEND_API ZEND_COLD void zend_verify_arg_error( +ZEND_API zend_never_inline ZEND_COLD void zend_verify_arg_error( const zend_function *zf, const zend_arg_info *arg_info, uint32_t arg_num, const zval *value) { const zend_execute_data *ptr = EG(current_execute_data)->prev_execute_data; @@ -734,8 +733,6 @@ static bool zend_verify_weak_scalar_type_hint(uint32_t type_mask, zval *arg) { zend_long lval; double dval; - zend_string *str; - bool bval; /* Type preference order: int -> float -> string -> bool */ if (type_mask & MAY_BE_LONG) { @@ -761,16 +758,23 @@ static bool zend_verify_weak_scalar_type_hint(uint32_t type_mask, zval *arg) return false; } } - if ((type_mask & MAY_BE_DOUBLE) && zend_parse_arg_double_weak(arg, &dval, 0)) { - zval_ptr_dtor(arg); - ZVAL_DOUBLE(arg, dval); - return true; + if (type_mask & MAY_BE_DOUBLE) { + dval = zend_parse_arg_double_weak(arg, 0); + if (EXPECTED(!zend_isnan(dval))) { + zval_ptr_dtor(arg); + ZVAL_DOUBLE(arg, dval); + return true; + } } - if ((type_mask & MAY_BE_STRING) && zend_parse_arg_str_weak(arg, &str, 0)) { + if ((type_mask & MAY_BE_STRING) && zend_parse_arg_str_weak(arg, 0)) { /* on success "arg" is converted to IS_STRING */ return true; } - if ((type_mask & MAY_BE_BOOL) == MAY_BE_BOOL && zend_parse_arg_bool_weak(arg, &bval, 0)) { + if ((type_mask & MAY_BE_BOOL) == MAY_BE_BOOL) { + zpp_parse_bool_status bval = zend_parse_arg_bool_weak(arg, 0); + if (UNEXPECTED(bval == ZPP_PARSE_BOOL_STATUS_ERROR)) { + return false; + } zval_ptr_dtor(arg); ZVAL_BOOL(arg, bval); return true; @@ -794,21 +798,19 @@ static bool can_convert_to_string(const zval *zv) { static bool zend_verify_weak_scalar_type_hint_no_sideeffect(uint32_t type_mask, const zval *arg) { zend_long lval; - double dval; - bool bval; /* Pass (uint32_t)-1 as arg_num to indicate to ZPP not to emit any deprecation notice, * this is needed because the version with side effects also uses 0 (e.g. for typed properties) */ if ((type_mask & MAY_BE_LONG) && zend_parse_arg_long_weak(arg, &lval, (uint32_t)-1)) { return true; } - if ((type_mask & MAY_BE_DOUBLE) && zend_parse_arg_double_weak(arg, &dval, (uint32_t)-1)) { + if ((type_mask & MAY_BE_DOUBLE) && !zend_isnan(zend_parse_arg_double_weak(arg, (uint32_t)-1))) { return true; } if ((type_mask & MAY_BE_STRING) && can_convert_to_string(arg)) { return true; } - if ((type_mask & MAY_BE_BOOL) == MAY_BE_BOOL && zend_parse_arg_bool_weak(arg, &bval, (uint32_t)-1)) { + if ((type_mask & MAY_BE_BOOL) == MAY_BE_BOOL && zend_parse_arg_bool_weak(arg, (uint32_t)-1) != ZPP_PARSE_BOOL_STATUS_ERROR) { return true; } return false; @@ -836,7 +838,7 @@ ZEND_API bool zend_verify_scalar_type_hint(uint32_t type_mask, zval *arg, bool s return zend_verify_weak_scalar_type_hint(type_mask, arg); } -ZEND_COLD zend_never_inline void zend_verify_class_constant_type_error(const zend_class_constant *c, const zend_string *name, const zval *constant) +static zend_never_inline ZEND_COLD void zend_verify_class_constant_type_error(const zend_class_constant *c, const zend_string *name, const zval *constant) { zend_string *type_str = zend_type_to_string(c->type); @@ -846,7 +848,7 @@ ZEND_COLD zend_never_inline void zend_verify_class_constant_type_error(const zen zend_string_release(type_str); } -ZEND_COLD zend_never_inline void zend_verify_property_type_error(const zend_property_info *info, const zval *property) +static zend_never_inline ZEND_COLD void zend_verify_property_type_error(const zend_property_info *info, const zval *property) { zend_string *type_str; @@ -864,7 +866,7 @@ ZEND_COLD zend_never_inline void zend_verify_property_type_error(const zend_prop zend_string_release(type_str); } -ZEND_COLD zend_never_inline void zend_magic_get_property_type_inconsistency_error(const zend_property_info *info, const zval *property) +static zend_never_inline ZEND_COLD void zend_magic_get_property_type_inconsistency_error(const zend_property_info *info, const zval *property) { /* we _may_ land here in case reading already errored and runtime cache thus has not been updated (i.e. it contains a valid but unrelated info) */ if (EG(exception)) { @@ -881,7 +883,7 @@ ZEND_COLD zend_never_inline void zend_magic_get_property_type_inconsistency_erro zend_string_release(type_str); } -ZEND_COLD void zend_match_unhandled_error(const zval *value) +zend_never_inline ZEND_COLD void zend_match_unhandled_error(const zval *value) { zend_long max_len = EG(exception_string_param_max_len); smart_str msg = {0}; @@ -901,35 +903,35 @@ ZEND_COLD void zend_match_unhandled_error(const zval *value) smart_str_free(&msg); } -ZEND_API ZEND_COLD void ZEND_FASTCALL zend_readonly_property_modification_error( +ZEND_API zend_never_inline ZEND_COLD void ZEND_FASTCALL zend_readonly_property_modification_error( const zend_property_info *info) { zend_readonly_property_modification_error_ex( ZSTR_VAL(info->ce->name), zend_get_unmangled_property_name(info->name)); } -ZEND_API ZEND_COLD void ZEND_FASTCALL zend_readonly_property_modification_error_ex( +ZEND_API zend_never_inline ZEND_COLD void ZEND_FASTCALL zend_readonly_property_modification_error_ex( const char *class_name, const char *prop_name) { zend_throw_error(NULL, "Cannot modify readonly property %s::$%s", class_name, prop_name); } -ZEND_API ZEND_COLD void ZEND_FASTCALL zend_readonly_property_indirect_modification_error(const zend_property_info *info) +ZEND_API zend_never_inline ZEND_COLD void ZEND_FASTCALL zend_readonly_property_indirect_modification_error(const zend_property_info *info) { zend_throw_error(NULL, "Cannot indirectly modify readonly property %s::$%s", ZSTR_VAL(info->ce->name), zend_get_unmangled_property_name(info->name)); } -ZEND_API ZEND_COLD void ZEND_FASTCALL zend_invalid_class_constant_type_error(const uint8_t type) +ZEND_API zend_never_inline ZEND_COLD void ZEND_FASTCALL zend_invalid_class_constant_type_error(const uint8_t type) { zend_type_error("Cannot use value of type %s as class constant name", zend_get_type_by_const(type)); } -ZEND_API ZEND_COLD void ZEND_FASTCALL zend_object_released_while_assigning_to_property_error(const zend_property_info *info) +ZEND_API zend_never_inline ZEND_COLD void ZEND_FASTCALL zend_object_released_while_assigning_to_property_error(const zend_property_info *info) { zend_throw_error(NULL, "Object was released while assigning to property %s::$%s", ZSTR_VAL(info->ce->name), zend_get_unmangled_property_name(info->name)); } -ZEND_API ZEND_COLD void ZEND_FASTCALL zend_asymmetric_visibility_property_modification_error( +ZEND_API zend_never_inline ZEND_COLD void ZEND_FASTCALL zend_asymmetric_visibility_property_modification_error( const zend_property_info *prop_info, const char *operation ) { const zend_class_entry *scope; @@ -1322,7 +1324,7 @@ ZEND_API bool zend_internal_call_should_throw(const zend_function *fbc, zend_exe return 0; } -ZEND_API ZEND_COLD void zend_internal_call_arginfo_violation(const zend_function *fbc) +ZEND_API zend_never_inline ZEND_COLD void zend_internal_call_arginfo_violation(const zend_function *fbc) { zend_error_noreturn(E_ERROR, "Arginfo / zpp mismatch during call of %s%s%s()", fbc->common.scope ? ZSTR_VAL(fbc->common.scope->name) : "", @@ -1393,7 +1395,7 @@ static void zend_verify_internal_func_info(const zend_function *fn, const zval * } #endif -ZEND_API ZEND_COLD void ZEND_FASTCALL zend_missing_arg_error(const zend_execute_data *execute_data) +ZEND_API zend_never_inline ZEND_COLD void ZEND_FASTCALL zend_missing_arg_error(const zend_execute_data *execute_data) { const zend_execute_data *ptr = EX(prev_execute_data); @@ -1418,7 +1420,7 @@ ZEND_API ZEND_COLD void ZEND_FASTCALL zend_missing_arg_error(const zend_execute_ } } -ZEND_API ZEND_COLD void zend_verify_return_error(const zend_function *zf, const zval *value) +ZEND_API zend_never_inline ZEND_COLD void zend_verify_return_error(const zend_function *zf, const zval *value) { const zend_arg_info *arg_info = &zf->common.arg_info[-1]; const char *fname, *fsep, *fclass; @@ -1434,7 +1436,7 @@ ZEND_API ZEND_COLD void zend_verify_return_error(const zend_function *zf, const zend_string_release(need_msg); } -ZEND_API ZEND_COLD void zend_verify_never_error(const zend_function *zf) +ZEND_API zend_never_inline ZEND_COLD void zend_verify_never_error(const zend_function *zf) { zend_string *func_name = get_function_or_method_name(zf); @@ -1445,7 +1447,7 @@ ZEND_API ZEND_COLD void zend_verify_never_error(const zend_function *zf) } #if ZEND_DEBUG -static ZEND_COLD void zend_verify_internal_return_error(const zend_function *zf, const zval *value) +static zend_never_inline ZEND_COLD void zend_verify_internal_return_error(const zend_function *zf, const zval *value) { const zend_arg_info *arg_info = &zf->common.arg_info[-1]; const char *fname, *fsep, *fclass; @@ -1459,7 +1461,7 @@ static ZEND_COLD void zend_verify_internal_return_error(const zend_function *zf, fclass, fsep, fname, ZSTR_VAL(need_msg), given_msg); } -static ZEND_COLD void zend_verify_void_return_error(const zend_function *zf, const char *returned_msg, const char *returned_kind) +static zend_never_inline ZEND_COLD void zend_verify_void_return_error(const zend_function *zf, const char *returned_msg, const char *returned_kind) { const char *fname = ZSTR_VAL(zf->common.function_name); const char *fsep; @@ -1498,7 +1500,7 @@ ZEND_API bool zend_verify_internal_return_type(const zend_function *zf, zval *re } #endif -static ZEND_COLD void zend_verify_missing_return_type(const zend_function *zf) +static zend_never_inline ZEND_COLD void zend_verify_missing_return_type(const zend_function *zf) { /* VERIFY_RETURN_TYPE is not emitted for "void" functions, so this is always an error. */ zend_verify_return_error(zf, NULL); @@ -1710,7 +1712,7 @@ static zend_never_inline void zend_binary_assign_op_typed_prop(const zend_proper } } -static zend_never_inline zend_long zend_check_string_offset(zval *dim, int type EXECUTE_DATA_DC) +static zend_never_inline zend_long zend_check_string_offset(const zval *dim, int type EXECUTE_DATA_DC) { zend_long offset; @@ -1755,7 +1757,7 @@ static zend_never_inline zend_long zend_check_string_offset(zval *dim, int type return zval_get_long_func(dim, /* is_strict */ false); } -ZEND_API ZEND_COLD void zend_wrong_string_offset_error(void) +ZEND_API zend_never_inline ZEND_COLD void zend_wrong_string_offset_error(void) { const char *msg = NULL; const zend_execute_data *execute_data = EG(current_execute_data); @@ -1789,10 +1791,10 @@ ZEND_API ZEND_COLD void zend_wrong_string_offset_error(void) case ZEND_FETCH_DIM_INCDEC: msg = "Cannot increment/decrement string offsets"; break; - EMPTY_SWITCH_DEFAULT_CASE(); + default: ZEND_UNREACHABLE(); } break; - EMPTY_SWITCH_DEFAULT_CASE(); + default: ZEND_UNREACHABLE(); } ZEND_ASSERT(msg != NULL); zend_throw_error(NULL, "%s", msg); @@ -2185,7 +2187,7 @@ static zend_property_info *zend_get_prop_not_accepting_double(zend_reference *re return NULL; } -static ZEND_COLD zend_long zend_throw_incdec_ref_error(zend_property_info *error_prop OPLINE_DC) +static zend_never_inline ZEND_COLD zend_long zend_throw_incdec_ref_error(const zend_property_info *error_prop OPLINE_DC) { zend_string *type_str = zend_type_to_string(error_prop->type); if (ZEND_IS_INCREMENT(opline->opcode)) { @@ -2207,7 +2209,7 @@ static ZEND_COLD zend_long zend_throw_incdec_ref_error(zend_property_info *error } } -static ZEND_COLD zend_long zend_throw_incdec_prop_error(zend_property_info *prop OPLINE_DC) { +static zend_never_inline ZEND_COLD zend_long zend_throw_incdec_prop_error(const zend_property_info *prop OPLINE_DC) { zend_string *type_str = zend_type_to_string(prop->type); if (ZEND_IS_INCREMENT(opline->opcode)) { zend_type_error("Cannot increment property %s::$%s of type %s past its maximal value", @@ -2258,7 +2260,7 @@ static void zend_incdec_typed_ref(zend_reference *ref, zval *copy OPLINE_DC EXEC } } -static void zend_incdec_typed_prop(zend_property_info *prop_info, zval *var_ptr, zval *copy OPLINE_DC EXECUTE_DATA_DC) +static void zend_incdec_typed_prop(const zend_property_info *prop_info, zval *var_ptr, zval *copy OPLINE_DC EXECUTE_DATA_DC) { zval tmp; @@ -2288,7 +2290,7 @@ static void zend_incdec_typed_prop(zend_property_info *prop_info, zval *var_ptr, } } -static void zend_pre_incdec_property_zval(zval *prop, zend_property_info *prop_info OPLINE_DC EXECUTE_DATA_DC) +static void zend_pre_incdec_property_zval(zval *prop, const zend_property_info *prop_info OPLINE_DC EXECUTE_DATA_DC) { if (EXPECTED(Z_TYPE_P(prop) == IS_LONG)) { if (ZEND_IS_INCREMENT(opline->opcode)) { @@ -2326,7 +2328,7 @@ static void zend_pre_incdec_property_zval(zval *prop, zend_property_info *prop_i } } -static void zend_post_incdec_property_zval(zval *prop, zend_property_info *prop_info OPLINE_DC EXECUTE_DATA_DC) +static void zend_post_incdec_property_zval(zval *prop, const zend_property_info *prop_info OPLINE_DC EXECUTE_DATA_DC) { if (EXPECTED(Z_TYPE_P(prop) == IS_LONG)) { ZVAL_LONG(EX_VAR(opline->result.var), Z_LVAL_P(prop)); @@ -2554,13 +2556,13 @@ ZEND_API zend_never_inline ZEND_COLD void ZEND_FASTCALL zend_undefined_method(co zend_throw_error(NULL, "Call to undefined method %s::%s()", ZSTR_VAL(ce->name), ZSTR_VAL(method)); } -static zend_never_inline ZEND_COLD void ZEND_FASTCALL zend_invalid_method_call(zval *object, zval *function_name) +static zend_never_inline ZEND_COLD void ZEND_FASTCALL zend_invalid_method_call(const zval *object, const zval *function_name) { zend_throw_error(NULL, "Call to a member function %s() on %s", Z_STRVAL_P(function_name), zend_zval_value_name(object)); } -ZEND_API void ZEND_FASTCALL zend_non_static_method_call(const zend_function *fbc) +ZEND_API zend_never_inline ZEND_COLD void ZEND_FASTCALL zend_non_static_method_call(const zend_function *fbc) { zend_throw_error( zend_ce_error, @@ -2618,7 +2620,7 @@ ZEND_API zend_never_inline ZEND_COLD void ZEND_FASTCALL zend_call_stack_size_err } #endif /* ZEND_CHECK_STACK_LIMIT */ -static ZEND_COLD void zend_binary_assign_op_dim_slow(zval *container, zval *dim OPLINE_DC EXECUTE_DATA_DC) +static ZEND_COLD void zend_binary_assign_op_dim_slow(const zval *container, const zval *dim OPLINE_DC EXECUTE_DATA_DC) { if (UNEXPECTED(Z_TYPE_P(container) == IS_STRING)) { if (opline->op2_type == IS_UNUSED) { @@ -3052,7 +3054,7 @@ static zend_never_inline void ZEND_FASTCALL zend_fetch_dimension_address_UNSET(z zend_fetch_dimension_address(result, container_ptr, dim, dim_type, BP_VAR_UNSET EXECUTE_DATA_CC); } -static zend_always_inline void zend_fetch_dimension_address_read(zval *result, zval *container, zval *dim, int dim_type, int type, bool is_list, bool slow EXECUTE_DATA_DC) +static zend_always_inline void zend_fetch_dimension_address_read(zval *result, const zval *container, zval *dim, int dim_type, int type, bool is_list, bool slow EXECUTE_DATA_DC) { zval *retval; @@ -3206,36 +3208,36 @@ static zend_always_inline void zend_fetch_dimension_address_read(zval *result, z } } -static zend_never_inline void ZEND_FASTCALL zend_fetch_dimension_address_read_R(zval *container, zval *dim, int dim_type OPLINE_DC EXECUTE_DATA_DC) +static zend_never_inline void ZEND_FASTCALL zend_fetch_dimension_address_read_R(const zval *container, zval *dim, int dim_type OPLINE_DC EXECUTE_DATA_DC) { zval *result = EX_VAR(opline->result.var); zend_fetch_dimension_address_read(result, container, dim, dim_type, BP_VAR_R, 0, 0 EXECUTE_DATA_CC); } -static zend_never_inline void zend_fetch_dimension_address_read_R_slow(zval *container, zval *dim OPLINE_DC EXECUTE_DATA_DC) +static zend_never_inline void zend_fetch_dimension_address_read_R_slow(const zval *container, zval *dim OPLINE_DC EXECUTE_DATA_DC) { zval *result = EX_VAR(opline->result.var); zend_fetch_dimension_address_read(result, container, dim, IS_CV, BP_VAR_R, 0, 1 EXECUTE_DATA_CC); } -static zend_never_inline void ZEND_FASTCALL zend_fetch_dimension_address_read_IS(zval *container, zval *dim, int dim_type OPLINE_DC EXECUTE_DATA_DC) +static zend_never_inline void ZEND_FASTCALL zend_fetch_dimension_address_read_IS(const zval *container, zval *dim, int dim_type OPLINE_DC EXECUTE_DATA_DC) { zval *result = EX_VAR(opline->result.var); zend_fetch_dimension_address_read(result, container, dim, dim_type, BP_VAR_IS, 0, 0 EXECUTE_DATA_CC); } -static zend_never_inline void ZEND_FASTCALL zend_fetch_dimension_address_LIST_r(zval *container, zval *dim, int dim_type OPLINE_DC EXECUTE_DATA_DC) +static zend_never_inline void ZEND_FASTCALL zend_fetch_dimension_address_LIST_r(const zval *container, zval *dim, int dim_type OPLINE_DC EXECUTE_DATA_DC) { zval *result = EX_VAR(opline->result.var); zend_fetch_dimension_address_read(result, container, dim, dim_type, BP_VAR_R, 1, 0 EXECUTE_DATA_CC); } -ZEND_API void zend_fetch_dimension_const(zval *result, zval *container, zval *dim, int type) +ZEND_API void zend_fetch_dimension_const(zval *result, const zval *container, zval *dim, int type) { zend_fetch_dimension_address_read(result, container, dim, IS_TMP_VAR, type, 0, 0 NO_EXECUTE_DATA_CC); } -static zend_never_inline zval* ZEND_FASTCALL zend_find_array_dim_slow(HashTable *ht, zval *offset EXECUTE_DATA_DC) +static zend_never_inline zval* ZEND_FASTCALL zend_find_array_dim_slow(HashTable *ht, const zval *offset EXECUTE_DATA_DC) { zend_ulong hval; @@ -3290,7 +3292,7 @@ static zend_never_inline zval* ZEND_FASTCALL zend_find_array_dim_slow(HashTable } } -static zend_never_inline bool ZEND_FASTCALL zend_isset_dim_slow(zval *container, zval *offset EXECUTE_DATA_DC) +static zend_never_inline bool ZEND_FASTCALL zend_isset_dim_slow(const zval *container, zval *offset EXECUTE_DATA_DC) { if (/*OP2_TYPE == IS_CV &&*/ UNEXPECTED(Z_TYPE_P(offset) == IS_UNDEF)) { offset = ZVAL_UNDEFINED_OP2(); @@ -3329,7 +3331,7 @@ static zend_never_inline bool ZEND_FASTCALL zend_isset_dim_slow(zval *container, } } -static zend_never_inline bool ZEND_FASTCALL zend_isempty_dim_slow(zval *container, zval *offset EXECUTE_DATA_DC) +static zend_never_inline bool ZEND_FASTCALL zend_isempty_dim_slow(const zval *container, zval *offset EXECUTE_DATA_DC) { if (/*OP2_TYPE == IS_CV &&*/ UNEXPECTED(Z_TYPE_P(offset) == IS_UNDEF)) { offset = ZVAL_UNDEFINED_OP2(); @@ -3368,7 +3370,7 @@ static zend_never_inline bool ZEND_FASTCALL zend_isempty_dim_slow(zval *containe } } -static zend_never_inline bool ZEND_FASTCALL zend_array_key_exists_fast(HashTable *ht, zval *key OPLINE_DC EXECUTE_DATA_DC) +static zend_never_inline bool ZEND_FASTCALL zend_array_key_exists_fast(HashTable *ht, const zval *key OPLINE_DC EXECUTE_DATA_DC) { zend_string *str; zend_ulong hval; @@ -3426,8 +3428,8 @@ static zend_never_inline bool ZEND_FASTCALL zend_array_key_exists_fast(HashTable } } -static ZEND_COLD void ZEND_FASTCALL zend_array_key_exists_error( - zval *subject, zval *key OPLINE_DC EXECUTE_DATA_DC) +static zend_never_inline ZEND_COLD void ZEND_FASTCALL zend_array_key_exists_error( + const zval *subject, const zval *key OPLINE_DC EXECUTE_DATA_DC) { if (Z_TYPE_P(key) == IS_UNDEF) { ZVAL_UNDEFINED_OP1(); @@ -3441,7 +3443,7 @@ static ZEND_COLD void ZEND_FASTCALL zend_array_key_exists_error( } } -static zend_always_inline bool promotes_to_array(zval *val) { +static zend_always_inline bool promotes_to_array(const zval *val) { return Z_TYPE_P(val) <= IS_FALSE || (Z_ISREF_P(val) && Z_TYPE_P(Z_REFVAL_P(val)) <= IS_FALSE); } @@ -3500,13 +3502,23 @@ static zend_never_inline bool zend_handle_fetch_obj_flags( ZEND_REF_ADD_TYPE_SOURCE(Z_REF_P(ptr), prop_info); } break; - EMPTY_SWITCH_DEFAULT_CASE() + default: ZEND_UNREACHABLE(); } return 1; } -static zend_always_inline void zend_fetch_property_address(zval *result, zval *container, uint32_t container_op_type, zval *prop_ptr, uint32_t prop_op_type, void **cache_slot, int type, uint32_t flags, zend_property_info **prop_info_p OPLINE_DC EXECUTE_DATA_DC) -{ +static zend_always_inline void zend_fetch_property_address( + zval *result, + const zval *container, + uint32_t container_op_type, + const zval *prop_ptr, + uint32_t prop_op_type, + void **cache_slot, + int type, + uint32_t flags, + zend_property_info **prop_info_p + OPLINE_DC EXECUTE_DATA_DC +) { zval *ptr; zend_object *zobj; zend_string *name, *tmp_name; @@ -3651,8 +3663,14 @@ static zend_always_inline void zend_fetch_property_address(zval *result, zval *c } } -static zend_always_inline void zend_assign_to_property_reference(zval *container, uint32_t container_op_type, zval *prop_ptr, uint32_t prop_op_type, zval *value_ptr OPLINE_DC EXECUTE_DATA_DC) -{ +static zend_always_inline void zend_assign_to_property_reference( + const zval *container, + uint32_t container_op_type, + const zval *prop_ptr, + uint32_t prop_op_type, + zval *value_ptr + OPLINE_DC EXECUTE_DATA_DC +) { zval variable, *variable_ptr = &variable; void **cache_addr = (prop_op_type == IS_CONST) ? CACHE_ADDR(opline->extended_value & ~ZEND_RETURNS_FUNCTION) : NULL; zend_refcounted *garbage = NULL; @@ -3690,25 +3708,25 @@ static zend_always_inline void zend_assign_to_property_reference(zval *container } } -static zend_never_inline void zend_assign_to_property_reference_this_const(zval *container, zval *prop_ptr, zval *value_ptr OPLINE_DC EXECUTE_DATA_DC) +static zend_never_inline void zend_assign_to_property_reference_this_const(const zval *container, const zval *prop_ptr, zval *value_ptr OPLINE_DC EXECUTE_DATA_DC) { zend_assign_to_property_reference(container, IS_UNUSED, prop_ptr, IS_CONST, value_ptr OPLINE_CC EXECUTE_DATA_CC); } -static zend_never_inline void zend_assign_to_property_reference_var_const(zval *container, zval *prop_ptr, zval *value_ptr OPLINE_DC EXECUTE_DATA_DC) +static zend_never_inline void zend_assign_to_property_reference_var_const(const zval *container, const zval *prop_ptr, zval *value_ptr OPLINE_DC EXECUTE_DATA_DC) { zend_assign_to_property_reference(container, IS_VAR, prop_ptr, IS_CONST, value_ptr OPLINE_CC EXECUTE_DATA_CC); } -static zend_never_inline void zend_assign_to_property_reference_this_var(zval *container, zval *prop_ptr, zval *value_ptr OPLINE_DC EXECUTE_DATA_DC) +static zend_never_inline void zend_assign_to_property_reference_this_var(const zval *container, const zval *prop_ptr, zval *value_ptr OPLINE_DC EXECUTE_DATA_DC) { zend_assign_to_property_reference(container, IS_UNUSED, prop_ptr, IS_VAR, value_ptr OPLINE_CC EXECUTE_DATA_CC); } -static zend_never_inline void zend_assign_to_property_reference_var_var(zval *container, zval *prop_ptr, zval *value_ptr OPLINE_DC EXECUTE_DATA_DC) +static zend_never_inline void zend_assign_to_property_reference_var_var(const zval *container, const zval *prop_ptr, zval *value_ptr OPLINE_DC EXECUTE_DATA_DC) { zend_assign_to_property_reference(container, IS_VAR, prop_ptr, IS_VAR, value_ptr OPLINE_CC EXECUTE_DATA_CC); @@ -3879,7 +3897,7 @@ ZEND_API zval* ZEND_FASTCALL zend_fetch_static_property(zend_execute_data *ex, i return result; } -ZEND_API ZEND_COLD void zend_throw_ref_type_error_type(const zend_property_info *prop1, const zend_property_info *prop2, const zval *zv) { +ZEND_API zend_never_inline ZEND_COLD void zend_throw_ref_type_error_type(const zend_property_info *prop1, const zend_property_info *prop2, const zval *zv) { zend_string *type1_str = zend_type_to_string(prop1->type); zend_string *type2_str = zend_type_to_string(prop2->type); zend_type_error("Reference with value of type %s held by property %s::$%s of type %s is not compatible with property %s::$%s of type %s", @@ -3895,7 +3913,7 @@ ZEND_API ZEND_COLD void zend_throw_ref_type_error_type(const zend_property_info zend_string_release(type2_str); } -ZEND_API ZEND_COLD void zend_throw_ref_type_error_zval(const zend_property_info *prop, const zval *zv) { +ZEND_API zend_never_inline ZEND_COLD void zend_throw_ref_type_error_zval(const zend_property_info *prop, const zval *zv) { zend_string *type_str = zend_type_to_string(prop->type); zend_type_error("Cannot assign %s to reference held by property %s::$%s of type %s", zend_zval_value_name(zv), @@ -3906,7 +3924,7 @@ ZEND_API ZEND_COLD void zend_throw_ref_type_error_zval(const zend_property_info zend_string_release(type_str); } -ZEND_API ZEND_COLD void zend_throw_conflicting_coercion_error(const zend_property_info *prop1, const zend_property_info *prop2, const zval *zv) { +static zend_never_inline ZEND_COLD void zend_throw_conflicting_coercion_error(const zend_property_info *prop1, const zend_property_info *prop2, const zval *zv) { zend_string *type1_str = zend_type_to_string(prop1->type); zend_string *type2_str = zend_type_to_string(prop2->type); zend_type_error("Cannot assign %s to reference held by property %s::$%s of type %s and property %s::$%s of type %s, as this would result in an inconsistent type conversion", @@ -4220,7 +4238,7 @@ static zend_never_inline void zend_fetch_this_var(int type OPLINE_DC EXECUTE_DAT ZVAL_UNDEF(result); zend_throw_error(NULL, "Cannot unset $this"); break; - EMPTY_SWITCH_DEFAULT_CASE() + default: ZEND_UNREACHABLE(); } } @@ -4309,8 +4327,15 @@ ZEND_API ZEND_COLD void ZEND_FASTCALL zend_fcall_interrupt(zend_execute_data *ca } \ } while (0) +#if ZEND_VM_KIND == ZEND_VM_KIND_TAILCALL +# define ZEND_VM_KIND_TAILCALL_SAVE_OPLINE() SAVE_OPLINE() +#else +# define ZEND_VM_KIND_TAILCALL_SAVE_OPLINE() +#endif + #define ZEND_VM_LOOP_INTERRUPT_CHECK() do { \ if (UNEXPECTED(zend_atomic_bool_load_ex(&EG(vm_interrupt)))) { \ + ZEND_VM_KIND_TAILCALL_SAVE_OPLINE(); \ ZEND_VM_LOOP_INTERRUPT(); \ } \ } while (0) @@ -4481,7 +4506,7 @@ ZEND_API zend_function * ZEND_FASTCALL zend_fetch_function(zend_string *name) /* ZEND_API zend_function * ZEND_FASTCALL zend_fetch_function_str(const char *name, size_t len) /* {{{ */ { - zval *zv = zend_hash_str_find(EG(function_table), name, len); + const zval *zv = zend_hash_str_find(EG(function_table), name, len); if (EXPECTED(zv != NULL)) { zend_function *fbc = Z_FUNC_P(zv); @@ -4890,9 +4915,7 @@ static void cleanup_unfinished_calls(zend_execute_data *execute_data, uint32_t o static void cleanup_live_vars(zend_execute_data *execute_data, uint32_t op_num, uint32_t catch_op_num) /* {{{ */ { - int i; - - for (i = 0; i < EX(func)->op_array.last_live_range; i++) { + for (uint32_t i = 0; i < EX(func)->op_array.last_live_range; i++) { const zend_live_range *range = &EX(func)->op_array.live_range[i]; if (range->start > op_num) { /* further blocks will not be relevant... */ @@ -4905,7 +4928,7 @@ static void cleanup_live_vars(zend_execute_data *execute_data, uint32_t op_num, /* Handle the split range for loop vars */ if (catch_op_num) { - zend_op *final_op = EX(func)->op_array.opcodes + range->end; + const zend_op *final_op = EX(func)->op_array.opcodes + range->end; if (final_op->extended_value & ZEND_FREE_ON_RETURN && (final_op->opcode == ZEND_FE_FREE || final_op->opcode == ZEND_FREE)) { if (catch_op_num < range->end + final_op->op2.num) { continue; @@ -5193,7 +5216,7 @@ static zend_never_inline zend_execute_data *zend_init_dynamic_call_object(zend_o } /* }}} */ -static zend_never_inline zend_execute_data *zend_init_dynamic_call_array(zend_array *function, uint32_t num_args) /* {{{ */ +static zend_never_inline zend_execute_data *zend_init_dynamic_call_array(const zend_array *function, uint32_t num_args) /* {{{ */ { zend_function *fbc; void *object_or_called_scope; @@ -5284,7 +5307,7 @@ static zend_never_inline zend_execute_data *zend_init_dynamic_call_array(zend_ar #define ZEND_FAKE_OP_ARRAY ((zend_op_array*)(intptr_t)-1) -static zend_never_inline zend_op_array* ZEND_FASTCALL zend_include_or_eval(zval *inc_filename_zv, int type) /* {{{ */ +static zend_never_inline zend_op_array* ZEND_FASTCALL zend_include_or_eval(const zval *inc_filename_zv, int type) /* {{{ */ { zend_op_array *new_op_array = NULL; zend_string *tmp_inc_filename; @@ -5357,7 +5380,7 @@ static zend_never_inline zend_op_array* ZEND_FASTCALL zend_include_or_eval(zval efree(eval_desc); } break; - EMPTY_SWITCH_DEFAULT_CASE() + default: ZEND_UNREACHABLE(); } zend_tmp_string_release(tmp_inc_filename); diff --git a/Zend/zend_execute.h b/Zend/zend_execute.h index 89a9e79143a8..ba48b19bcfe1 100644 --- a/Zend/zend_execute.h +++ b/Zend/zend_execute.h @@ -2,15 +2,14 @@ +----------------------------------------------------------------------+ | Zend Engine | +----------------------------------------------------------------------+ - | Copyright (c) Zend Technologies Ltd. (http://www.zend.com) | + | Copyright © Zend Technologies Ltd., a subsidiary company of | + | Perforce Software, Inc., and Contributors. | +----------------------------------------------------------------------+ - | This source file is subject to version 2.00 of the Zend license, | - | that is bundled with this package in the file LICENSE, and is | - | available through the world-wide-web at the following url: | - | http://www.zend.com/license/2_00.txt. | - | If you did not receive a copy of the Zend license and are unable to | - | obtain it through the world-wide-web, please send a note to | - | license@zend.com so we can mail you a copy immediately. | + | This source file is subject to the Modified BSD License that is | + | bundled with this package in the file LICENSE, and is available | + | through the World Wide Web at . | + | | + | SPDX-License-Identifier: BSD-3-Clause | +----------------------------------------------------------------------+ | Authors: Andi Gutmans | | Zeev Suraski | @@ -61,7 +60,7 @@ ZEND_API zend_result zend_eval_stringl_ex(const char *str, size_t str_len, zval /* export zend_pass_function to allow comparisons against it */ extern ZEND_API const zend_internal_function zend_pass_function; -ZEND_API ZEND_COLD void ZEND_FASTCALL zend_missing_arg_error(const zend_execute_data *execute_data); +ZEND_API zend_never_inline ZEND_COLD void ZEND_FASTCALL zend_missing_arg_error(const zend_execute_data *execute_data); ZEND_API ZEND_COLD void ZEND_FASTCALL zend_deprecated_function(const zend_function *fbc); ZEND_API ZEND_COLD void ZEND_FASTCALL zend_nodiscard_function(const zend_function *fbc); ZEND_API ZEND_COLD void ZEND_FASTCALL zend_deprecated_class_constant(const zend_class_constant *c, const zend_string *constant_name); @@ -81,31 +80,31 @@ typedef enum { ZEND_API bool ZEND_FASTCALL zend_verify_prop_assignable_by_ref_ex(const zend_property_info *prop_info, zval *orig_val, bool strict, zend_verify_prop_assignable_by_ref_context context); ZEND_API bool ZEND_FASTCALL zend_verify_prop_assignable_by_ref(const zend_property_info *prop_info, zval *orig_val, bool strict); -ZEND_API ZEND_COLD void zend_throw_ref_type_error_zval(const zend_property_info *prop, const zval *zv); -ZEND_API ZEND_COLD void zend_throw_ref_type_error_type(const zend_property_info *prop1, const zend_property_info *prop2, const zval *zv); +ZEND_API zend_never_inline ZEND_COLD void zend_throw_ref_type_error_zval(const zend_property_info *prop, const zval *zv); +ZEND_API zend_never_inline ZEND_COLD void zend_throw_ref_type_error_type(const zend_property_info *prop1, const zend_property_info *prop2, const zval *zv); ZEND_API ZEND_COLD zval* ZEND_FASTCALL zend_undefined_offset_write(HashTable *ht, zend_long lval); ZEND_API ZEND_COLD zval* ZEND_FASTCALL zend_undefined_index_write(HashTable *ht, zend_string *offset); -ZEND_API ZEND_COLD void zend_wrong_string_offset_error(void); +ZEND_API zend_never_inline ZEND_COLD void zend_wrong_string_offset_error(void); -ZEND_API ZEND_COLD void ZEND_FASTCALL zend_readonly_property_modification_error(const zend_property_info *info); -ZEND_API ZEND_COLD void ZEND_FASTCALL zend_readonly_property_modification_error_ex(const char *class_name, const char *prop_name); -ZEND_API ZEND_COLD void ZEND_FASTCALL zend_readonly_property_indirect_modification_error(const zend_property_info *info); +ZEND_API zend_never_inline ZEND_COLD void ZEND_FASTCALL zend_readonly_property_modification_error(const zend_property_info *info); +ZEND_API zend_never_inline ZEND_COLD void ZEND_FASTCALL zend_readonly_property_modification_error_ex(const char *class_name, const char *prop_name); +ZEND_API zend_never_inline ZEND_COLD void ZEND_FASTCALL zend_readonly_property_indirect_modification_error(const zend_property_info *info); -ZEND_API ZEND_COLD void ZEND_FASTCALL zend_invalid_class_constant_type_error(uint8_t type); +ZEND_API zend_never_inline ZEND_COLD void ZEND_FASTCALL zend_invalid_class_constant_type_error(uint8_t type); -ZEND_API ZEND_COLD void ZEND_FASTCALL zend_object_released_while_assigning_to_property_error(const zend_property_info *info); +ZEND_API zend_never_inline ZEND_COLD void ZEND_FASTCALL zend_object_released_while_assigning_to_property_error(const zend_property_info *info); -ZEND_API ZEND_COLD void ZEND_FASTCALL zend_cannot_add_element(void); +ZEND_API zend_never_inline ZEND_COLD void ZEND_FASTCALL zend_cannot_add_element(void); ZEND_API bool ZEND_FASTCALL zend_asymmetric_property_has_set_access(const zend_property_info *prop_info); -ZEND_API ZEND_COLD void ZEND_FASTCALL zend_asymmetric_visibility_property_modification_error(const zend_property_info *prop_info, const char *operation); +ZEND_API zend_never_inline ZEND_COLD void ZEND_FASTCALL zend_asymmetric_visibility_property_modification_error(const zend_property_info *prop_info, const char *operation); ZEND_API bool zend_verify_scalar_type_hint(uint32_t type_mask, zval *arg, bool strict, bool is_internal_arg); -ZEND_API ZEND_COLD void zend_verify_arg_error( +ZEND_API zend_never_inline ZEND_COLD void zend_verify_arg_error( const zend_function *zf, const zend_arg_info *arg_info, uint32_t arg_num, const zval *value); -ZEND_API ZEND_COLD void zend_verify_return_error( +ZEND_API zend_never_inline ZEND_COLD void zend_verify_return_error( const zend_function *zf, const zval *value); -ZEND_API ZEND_COLD void zend_verify_never_error( +ZEND_API zend_never_inline ZEND_COLD void zend_verify_never_error( const zend_function *zf); ZEND_API bool zend_verify_ref_array_assignable(zend_reference *ref); ZEND_API bool zend_check_user_type_slow( @@ -113,7 +112,7 @@ ZEND_API bool zend_check_user_type_slow( #if ZEND_DEBUG ZEND_API bool zend_internal_call_should_throw(const zend_function *fbc, zend_execute_data *call); -ZEND_API ZEND_COLD void zend_internal_call_arginfo_violation(const zend_function *fbc); +ZEND_API zend_never_inline ZEND_COLD void zend_internal_call_arginfo_violation(const zend_function *fbc); ZEND_API bool zend_verify_internal_return_type(const zend_function *zf, zval *ret); #endif @@ -135,7 +134,7 @@ ZEND_API void ZEND_FASTCALL zend_ref_del_type_source(zend_property_info_source_l ZEND_API zval* zend_assign_to_typed_ref(zval *variable_ptr, zval *value, uint8_t value_type, bool strict); ZEND_API zval* zend_assign_to_typed_ref_ex(zval *variable_ptr, zval *value, uint8_t value_type, bool strict, zend_refcounted **garbage_ptr); -static zend_always_inline void zend_copy_to_variable(zval *variable_ptr, zval *value, uint8_t value_type) +static zend_always_inline void zend_copy_to_variable(zval *variable_ptr, const zval *value, uint8_t value_type) { zend_refcounted *ref = NULL; @@ -211,7 +210,7 @@ static zend_always_inline zval* zend_assign_to_variable_ex(zval *variable_ptr, z return variable_ptr; } -static zend_always_inline void zend_safe_assign_to_variable_noref(zval *variable_ptr, zval *value) { +static zend_always_inline void zend_safe_assign_to_variable_noref(zval *variable_ptr, const zval *value) { if (Z_REFCOUNTED_P(variable_ptr)) { ZEND_ASSERT(Z_TYPE_P(variable_ptr) != IS_REFERENCE); zend_refcounted *ref = Z_COUNTED_P(variable_ptr); @@ -248,7 +247,7 @@ static zend_always_inline void zend_cast_zval_to_object(zval *result, zval *expr } static zend_always_inline void zend_cast_zval_to_array(zval *result, zval *expr, uint8_t op1_type) { - extern zend_class_entry *zend_ce_closure; + extern ZEND_API zend_class_entry *zend_ce_closure; if (op1_type == IS_CONST || Z_TYPE_P(expr) != IS_OBJECT || Z_OBJCE_P(expr) == zend_ce_closure) { if (Z_TYPE_P(expr) != IS_NULL) { if (UNEXPECTED(Z_TYPE_P(expr) == IS_DOUBLE && zend_isnan(Z_DVAL_P(expr)))) { @@ -472,7 +471,7 @@ ZEND_API zend_string *zend_get_executed_filename_ex(void); ZEND_API uint32_t zend_get_executed_lineno(void); ZEND_API zend_class_entry *zend_get_executed_scope(void); ZEND_API bool zend_is_executing(void); -ZEND_API ZEND_COLD void ZEND_FASTCALL zend_cannot_pass_by_reference(uint32_t arg_num); +ZEND_API zend_never_inline ZEND_COLD void ZEND_FASTCALL zend_cannot_pass_by_reference(uint32_t arg_num); ZEND_API void zend_set_timeout(zend_long seconds, bool reset_signals); ZEND_API void zend_unset_timeout(void); @@ -485,7 +484,7 @@ ZEND_API zend_function * ZEND_FASTCALL zend_fetch_function(zend_string *name); ZEND_API zend_function * ZEND_FASTCALL zend_fetch_function_str(const char *name, size_t len); ZEND_API void ZEND_FASTCALL zend_init_func_run_time_cache(zend_op_array *op_array); -ZEND_API void zend_fetch_dimension_const(zval *result, zval *container, zval *dim, int type); +ZEND_API void zend_fetch_dimension_const(zval *result, const zval *container, zval *dim, int type); ZEND_API zval* zend_get_compiled_variable_value(const zend_execute_data *execute_data_ptr, uint32_t var); @@ -512,7 +511,7 @@ ZEND_API ZEND_ATTRIBUTE_DEPRECATED HashTable *zend_unfinished_execution_gc(zend_ ZEND_API HashTable *zend_unfinished_execution_gc_ex(zend_execute_data *execute_data, zend_execute_data *call, zend_get_gc_buffer *gc_buffer, bool suspended_by_yield); ZEND_API zval* ZEND_FASTCALL zend_fetch_static_property(zend_execute_data *ex, int fetch_type); ZEND_API zend_never_inline ZEND_COLD void ZEND_FASTCALL zend_undefined_method(const zend_class_entry *ce, const zend_string *method); -ZEND_API void ZEND_FASTCALL zend_non_static_method_call(const zend_function *fbc); +ZEND_API zend_never_inline ZEND_COLD void ZEND_FASTCALL zend_non_static_method_call(const zend_function *fbc); ZEND_API void zend_frameless_observed_call(zend_execute_data *execute_data); @@ -586,11 +585,8 @@ ZEND_API zend_result ZEND_FASTCALL zend_handle_undef_args(zend_execute_data *cal ZEND_API bool zend_verify_class_constant_type(const zend_class_constant *c, const zend_string *name, zval *constant); -ZEND_COLD void zend_verify_class_constant_type_error(const zend_class_constant *c, const zend_string *name, const zval *constant); ZEND_API bool zend_verify_property_type(const zend_property_info *info, zval *property, bool strict); -ZEND_COLD void zend_verify_property_type_error(const zend_property_info *info, const zval *property); -ZEND_COLD void zend_magic_get_property_type_inconsistency_error(const zend_property_info *info, const zval *property); #define ZEND_REF_ADD_TYPE_SOURCE(ref, source) \ zend_ref_add_type_source(&ZEND_REF_TYPE_SOURCES(ref), source) @@ -619,7 +615,7 @@ ZEND_COLD void zend_magic_get_property_type_inconsistency_error(const zend_prope } \ } while (0) -ZEND_COLD void zend_match_unhandled_error(const zval *value); +zend_never_inline ZEND_COLD void zend_match_unhandled_error(const zval *value); /* Call this to handle the timeout or the interrupt function. It will set * EG(vm_interrupt) to false. diff --git a/Zend/zend_execute_API.c b/Zend/zend_execute_API.c index dbd2a9039cfc..71e0c56a51c8 100644 --- a/Zend/zend_execute_API.c +++ b/Zend/zend_execute_API.c @@ -2,15 +2,14 @@ +----------------------------------------------------------------------+ | Zend Engine | +----------------------------------------------------------------------+ - | Copyright (c) Zend Technologies Ltd. (http://www.zend.com) | + | Copyright © Zend Technologies Ltd., a subsidiary company of | + | Perforce Software, Inc., and Contributors. | +----------------------------------------------------------------------+ - | This source file is subject to version 2.00 of the Zend license, | - | that is bundled with this package in the file LICENSE, and is | - | available through the world-wide-web at the following url: | - | http://www.zend.com/license/2_00.txt. | - | If you did not receive a copy of the Zend license and are unable to | - | obtain it through the world-wide-web, please send a note to | - | license@zend.com so we can mail you a copy immediately. | + | This source file is subject to the Modified BSD License that is | + | bundled with this package in the file LICENSE, and is available | + | through the World Wide Web at . | + | | + | SPDX-License-Identifier: BSD-3-Clause | +----------------------------------------------------------------------+ | Authors: Andi Gutmans | | Zeev Suraski | @@ -192,8 +191,7 @@ void init_executor(void) /* {{{ */ EG(get_gc_buffer).start = EG(get_gc_buffer).end = EG(get_gc_buffer).cur = NULL; EG(record_errors) = false; - EG(num_errors) = 0; - EG(errors) = NULL; + memset(&EG(errors), 0, sizeof(EG(errors))); EG(filename_override) = NULL; EG(lineno_override) = -1; @@ -797,6 +795,7 @@ zend_result _call_user_function_impl(zval *object, zval *function_name, zval *re fci.param_count = param_count; fci.params = params; fci.named_params = named_params; + fci.consumed_args = 0; return zend_call_function(&fci, NULL); } @@ -864,6 +863,9 @@ zend_result zend_call_function(zend_fcall_info *fci, zend_fcall_info_cache *fci_ call = zend_vm_stack_push_call_frame(call_info, func, fci->param_count, object_or_called_scope); + uint32_t consumed_args = fci->param_count ? fci->consumed_args : 0; + + ZEND_ASSERT((consumed_args & (consumed_args - 1)) == 0); for (uint32_t i = 0; i < fci->param_count; i++) { zval *param = ZEND_CALL_ARG(call, i+1); @@ -905,7 +907,15 @@ zend_result zend_call_function(zend_fcall_info *fci, zend_fcall_info_cache *fci_ } if (EXPECTED(!must_wrap)) { - ZVAL_COPY(param, arg); + if (EXPECTED(consumed_args == 0) + || !zend_fci_is_consumed_arg(consumed_args, i) + || Z_ISREF_P(arg) + || arg != &fci->params[i]) { + ZVAL_COPY(param, arg); + } else { + ZVAL_COPY_VALUE(param, arg); + ZVAL_UNDEF(arg); + } } else { Z_TRY_ADDREF_P(arg); ZVAL_NEW_REF(param, arg); @@ -1026,10 +1036,13 @@ zend_result zend_call_function(zend_fcall_info *fci, zend_fcall_info_cache *fci_ if (should_throw) { zend_internal_call_arginfo_violation(call->func); } - ZEND_ASSERT(!(call->func->common.fn_flags & ZEND_ACC_HAS_RETURN_TYPE) || - zend_verify_internal_return_type(call->func, fci->retval)); + if (call->func->common.fn_flags & ZEND_ACC_HAS_RETURN_TYPE) { + bool result = zend_verify_internal_return_type(call->func, fci->retval); + ZEND_ASSERT(result); + } ZEND_ASSERT((call->func->common.fn_flags & ZEND_ACC_RETURN_REFERENCE) ? Z_ISREF_P(fci->retval) : !Z_ISREF_P(fci->retval)); + ZEND_ASSERT(!(call->func->common.fn_flags2 & ZEND_ACC2_FORBID_DYN_CALLS)); } #endif ZEND_OBSERVER_FCALL_END(call, fci->retval); @@ -1091,6 +1104,7 @@ ZEND_API void zend_call_known_function( fci.param_count = param_count; fci.params = params; fci.named_params = named_params; + fci.consumed_args = 0; ZVAL_UNDEF(&fci.function_name); /* Unused */ fcic.function_handler = fn; @@ -1207,7 +1221,7 @@ ZEND_API zend_class_entry *zend_lookup_class_ex(zend_string *name, zend_string * ALLOC_HASHTABLE(CG(unlinked_uses)); zend_hash_init(CG(unlinked_uses), 0, NULL, NULL, 0); } - zend_hash_index_add_empty_element(CG(unlinked_uses), (zend_long)(uintptr_t)ce); + zend_hash_index_add_empty_element(CG(unlinked_uses), (zend_ulong)(uintptr_t)ce); return ce; } return NULL; @@ -1765,7 +1779,7 @@ zend_class_entry *zend_fetch_class_with_scope( case 0: break; /* Other fetch types are not supported by this function. */ - EMPTY_SWITCH_DEFAULT_CASE() + default: ZEND_UNREACHABLE(); } ce = zend_lookup_class_ex(class_name, NULL, fetch_type); diff --git a/Zend/zend_extensions.c b/Zend/zend_extensions.c index a4e5a38f90d8..4459c3015d15 100644 --- a/Zend/zend_extensions.c +++ b/Zend/zend_extensions.c @@ -2,15 +2,14 @@ +----------------------------------------------------------------------+ | Zend Engine | +----------------------------------------------------------------------+ - | Copyright (c) Zend Technologies Ltd. (http://www.zend.com) | + | Copyright © Zend Technologies Ltd., a subsidiary company of | + | Perforce Software, Inc., and Contributors. | +----------------------------------------------------------------------+ - | This source file is subject to version 2.00 of the Zend license, | - | that is bundled with this package in the file LICENSE, and is | - | available through the world-wide-web at the following url: | - | http://www.zend.com/license/2_00.txt. | - | If you did not receive a copy of the Zend license and are unable to | - | obtain it through the world-wide-web, please send a note to | - | license@zend.com so we can mail you a copy immediately. | + | This source file is subject to the Modified BSD License that is | + | bundled with this package in the file LICENSE, and is available | + | through the World Wide Web at . | + | | + | SPDX-License-Identifier: BSD-3-Clause | +----------------------------------------------------------------------+ | Authors: Andi Gutmans | | Zeev Suraski | diff --git a/Zend/zend_extensions.h b/Zend/zend_extensions.h index 4de8ad5414c2..1e6887e444a6 100644 --- a/Zend/zend_extensions.h +++ b/Zend/zend_extensions.h @@ -2,15 +2,14 @@ +----------------------------------------------------------------------+ | Zend Engine | +----------------------------------------------------------------------+ - | Copyright (c) Zend Technologies Ltd. (http://www.zend.com) | + | Copyright © Zend Technologies Ltd., a subsidiary company of | + | Perforce Software, Inc., and Contributors. | +----------------------------------------------------------------------+ - | This source file is subject to version 2.00 of the Zend license, | - | that is bundled with this package in the file LICENSE, and is | - | available through the world-wide-web at the following url: | - | http://www.zend.com/license/2_00.txt. | - | If you did not receive a copy of the Zend license and are unable to | - | obtain it through the world-wide-web, please send a note to | - | license@zend.com so we can mail you a copy immediately. | + | This source file is subject to the Modified BSD License that is | + | bundled with this package in the file LICENSE, and is available | + | through the World Wide Web at . | + | | + | SPDX-License-Identifier: BSD-3-Clause | +----------------------------------------------------------------------+ | Authors: Andi Gutmans | | Zeev Suraski | diff --git a/Zend/zend_fibers.c b/Zend/zend_fibers.c index d571a622e476..c91436050856 100644 --- a/Zend/zend_fibers.c +++ b/Zend/zend_fibers.c @@ -2,15 +2,14 @@ +----------------------------------------------------------------------+ | Zend Engine | +----------------------------------------------------------------------+ - | Copyright (c) Zend Technologies Ltd. (http://www.zend.com) | + | Copyright © Zend Technologies Ltd., a subsidiary company of | + | Perforce Software, Inc., and Contributors. | +----------------------------------------------------------------------+ - | This source file is subject to version 2.00 of the Zend license, | - | that is bundled with this package in the file LICENSE, and is | - | available through the world-wide-web at the following url: | - | http://www.zend.com/license/2_00.txt. | - | If you did not receive a copy of the Zend license and are unable to | - | obtain it through the world-wide-web, please send a note to | - | license@zend.com so we can mail you a copy immediately. | + | This source file is subject to the Modified BSD License that is | + | bundled with this package in the file LICENSE, and is available | + | through the World Wide Web at . | + | | + | SPDX-License-Identifier: BSD-3-Clause | +----------------------------------------------------------------------+ | Authors: Aaron Piotrowski | | Martin Schröder | @@ -572,9 +571,9 @@ static ZEND_STACK_ALIGNED void zend_fiber_execute(zend_fiber_transfer *transfer) zend_fiber *fiber = EG(active_fiber); /* Determine the current error_reporting ini setting. */ - zend_long error_reporting = INI_INT("error_reporting"); - /* If error_reporting is 0 and not explicitly set to 0, INI_STR returns a null pointer. */ - if (!error_reporting && !INI_STR("error_reporting")) { + zend_long error_reporting = zend_ini_long_literal("error_reporting"); + /* If error_reporting is 0 and not explicitly set to 0, zend_ini_str returns a null pointer. */ + if (!error_reporting && !zend_ini_str_literal("error_reporting")) { error_reporting = E_ALL; } diff --git a/Zend/zend_fibers.h b/Zend/zend_fibers.h index 9442019bfa25..c72ffdc8f18e 100644 --- a/Zend/zend_fibers.h +++ b/Zend/zend_fibers.h @@ -2,15 +2,14 @@ +----------------------------------------------------------------------+ | Zend Engine | +----------------------------------------------------------------------+ - | Copyright (c) Zend Technologies Ltd. (http://www.zend.com) | + | Copyright © Zend Technologies Ltd., a subsidiary company of | + | Perforce Software, Inc., and Contributors. | +----------------------------------------------------------------------+ - | This source file is subject to version 2.00 of the Zend license, | - | that is bundled with this package in the file LICENSE, and is | - | available through the world-wide-web at the following url: | - | http://www.zend.com/license/2_00.txt. | - | If you did not receive a copy of the Zend license and are unable to | - | obtain it through the world-wide-web, please send a note to | - | license@zend.com so we can mail you a copy immediately. | + | This source file is subject to the Modified BSD License that is | + | bundled with this package in the file LICENSE, and is available | + | through the World Wide Web at . | + | | + | SPDX-License-Identifier: BSD-3-Clause | +----------------------------------------------------------------------+ | Authors: Aaron Piotrowski | | Martin Schröder | @@ -155,7 +154,7 @@ static zend_always_inline zend_fiber *zend_fiber_from_context(zend_fiber_context { ZEND_ASSERT(context->kind == zend_ce_fiber && "Fiber context does not belong to a Zend fiber"); - return (zend_fiber *)(((char *) context) - XtOffsetOf(zend_fiber, context)); + return ZEND_CONTAINER_OF(context, zend_fiber, context); } static zend_always_inline zend_fiber_context *zend_fiber_get_context(zend_fiber *fiber) diff --git a/Zend/zend_float.c b/Zend/zend_float.c index 90af0c4a5f90..12fd0fd74f7f 100644 --- a/Zend/zend_float.c +++ b/Zend/zend_float.c @@ -2,15 +2,14 @@ +----------------------------------------------------------------------+ | Zend Engine | +----------------------------------------------------------------------+ - | Copyright (c) Zend Technologies Ltd. (http://www.zend.com) | + | Copyright © Zend Technologies Ltd., a subsidiary company of | + | Perforce Software, Inc., and Contributors. | +----------------------------------------------------------------------+ - | This source file is subject to version 2.00 of the Zend license, | - | that is bundled with this package in the file LICENSE, and is | - | available through the world-wide-web at the following url: | - | http://www.zend.com/license/2_00.txt. | - | If you did not receive a copy of the Zend license and are unable to | - | obtain it through the world-wide-web, please send a note to | - | license@zend.com so we can mail you a copy immediately. | + | This source file is subject to the Modified BSD License that is | + | bundled with this package in the file LICENSE, and is available | + | through the World Wide Web at . | + | | + | SPDX-License-Identifier: BSD-3-Clause | +----------------------------------------------------------------------+ | Authors: Christian Seiler | +----------------------------------------------------------------------+ diff --git a/Zend/zend_float.h b/Zend/zend_float.h index 63e0f6f7f69b..12aa02005c2a 100644 --- a/Zend/zend_float.h +++ b/Zend/zend_float.h @@ -2,15 +2,14 @@ +----------------------------------------------------------------------+ | Zend Engine | +----------------------------------------------------------------------+ - | Copyright (c) Zend Technologies Ltd. (http://www.zend.com) | + | Copyright © Zend Technologies Ltd., a subsidiary company of | + | Perforce Software, Inc., and Contributors. | +----------------------------------------------------------------------+ - | This source file is subject to version 2.00 of the Zend license, | - | that is bundled with this package in the file LICENSE, and is | - | available through the world-wide-web at the following url: | - | http://www.zend.com/license/2_00.txt. | - | If you did not receive a copy of the Zend license and are unable to | - | obtain it through the world-wide-web, please send a note to | - | license@zend.com so we can mail you a copy immediately. | + | This source file is subject to the Modified BSD License that is | + | bundled with this package in the file LICENSE, and is available | + | through the World Wide Web at . | + | | + | SPDX-License-Identifier: BSD-3-Clause | +----------------------------------------------------------------------+ | Authors: Christian Seiler | +----------------------------------------------------------------------+ diff --git a/Zend/zend_frameless_function.c b/Zend/zend_frameless_function.c index 7ccda0cfb570..be390744fd92 100644 --- a/Zend/zend_frameless_function.c +++ b/Zend/zend_frameless_function.c @@ -2,15 +2,14 @@ +----------------------------------------------------------------------+ | Zend Engine | +----------------------------------------------------------------------+ - | Copyright (c) Zend Technologies Ltd. (http://www.zend.com) | + | Copyright © Zend Technologies Ltd., a subsidiary company of | + | Perforce Software, Inc., and Contributors. | +----------------------------------------------------------------------+ - | This source file is subject to version 2.00 of the Zend license, | - | that is bundled with this package in the file LICENSE, and is | - | available through the world-wide-web at the following url: | - | http://www.zend.com/license/2_00.txt. | - | If you did not receive a copy of the Zend license and are unable to | - | obtain it through the world-wide-web, please send a note to | - | license@zend.com so we can mail you a copy immediately. | + | This source file is subject to the Modified BSD License that is | + | bundled with this package in the file LICENSE, and is available | + | through the World Wide Web at . | + | | + | SPDX-License-Identifier: BSD-3-Clause | +----------------------------------------------------------------------+ */ diff --git a/Zend/zend_frameless_function.h b/Zend/zend_frameless_function.h index d64ca7ee15e2..b6f361f104b0 100644 --- a/Zend/zend_frameless_function.h +++ b/Zend/zend_frameless_function.h @@ -2,15 +2,14 @@ +----------------------------------------------------------------------+ | Zend Engine | +----------------------------------------------------------------------+ - | Copyright (c) Zend Technologies Ltd. (http://www.zend.com) | + | Copyright © Zend Technologies Ltd., a subsidiary company of | + | Perforce Software, Inc., and Contributors. | +----------------------------------------------------------------------+ - | This source file is subject to version 2.00 of the Zend license, | - | that is bundled with this package in the file LICENSE, and is | - | available through the world-wide-web at the following url: | - | http://www.zend.com/license/2_00.txt. | - | If you did not receive a copy of the Zend license and are unable to | - | obtain it through the world-wide-web, please send a note to | - | license@zend.com so we can mail you a copy immediately. | + | This source file is subject to the Modified BSD License that is | + | bundled with this package in the file LICENSE, and is available | + | through the World Wide Web at . | + | | + | SPDX-License-Identifier: BSD-3-Clause | +----------------------------------------------------------------------+ */ @@ -65,7 +64,7 @@ dest_ht = NULL; \ ZVAL_COPY(&str_tmp, arg ## arg_num); \ arg ## arg_num = &str_tmp; \ - if (!zend_flf_parse_arg_str_slow(arg ## arg_num, &dest_str, arg_num)) { \ + if (!(dest_str = zend_flf_parse_arg_str_slow(arg ## arg_num, arg_num))) { \ zend_wrong_parameter_type_error(arg_num, Z_EXPECTED_ARRAY_OR_STRING, arg ## arg_num); \ goto flf_clean; \ } \ diff --git a/Zend/zend_gc.c b/Zend/zend_gc.c index fc0c9fc0634a..5de2b69bf568 100644 --- a/Zend/zend_gc.c +++ b/Zend/zend_gc.c @@ -2,15 +2,14 @@ +----------------------------------------------------------------------+ | Zend Engine | +----------------------------------------------------------------------+ - | Copyright (c) Zend Technologies Ltd. (http://www.zend.com) | + | Copyright © Zend Technologies Ltd., a subsidiary company of | + | Perforce Software, Inc., and Contributors. | +----------------------------------------------------------------------+ - | This source file is subject to version 2.00 of the Zend license, | - | that is bundled with this package in the file LICENSE, and is | - | available through the world-wide-web at the following url: | - | http://www.zend.com/license/2_00.txt. | - | If you did not receive a copy of the Zend license and are unable to | - | obtain it through the world-wide-web, please send a note to | - | license@zend.com so we can mail you a copy immediately. | + | This source file is subject to the Modified BSD License that is | + | bundled with this package in the file LICENSE, and is available | + | through the World Wide Web at . | + | | + | SPDX-License-Identifier: BSD-3-Clause | +----------------------------------------------------------------------+ | Authors: David Wang | | Dmitry Stogov | @@ -1953,13 +1952,15 @@ static zend_never_inline void gc_call_destructors_in_fiber(void) GC_G(dtor_idx) = GC_FIRST_ROOT; GC_G(dtor_end) = GC_G(first_unused); + zend_object *exception = NULL; + remember_prev_exception(&exception); + if (UNEXPECTED(!fiber)) { fiber = gc_create_destructor_fiber(); } else { zend_fiber_resume(fiber, NULL, NULL); } - zend_object *exception = NULL; remember_prev_exception(&exception); for (;;) { diff --git a/Zend/zend_gc.h b/Zend/zend_gc.h index 06f550647bd7..b72b90ccd5ef 100644 --- a/Zend/zend_gc.h +++ b/Zend/zend_gc.h @@ -2,15 +2,14 @@ +----------------------------------------------------------------------+ | Zend Engine | +----------------------------------------------------------------------+ - | Copyright (c) Zend Technologies Ltd. (http://www.zend.com) | + | Copyright © Zend Technologies Ltd., a subsidiary company of | + | Perforce Software, Inc., and Contributors. | +----------------------------------------------------------------------+ - | This source file is subject to version 2.00 of the Zend license, | - | that is bundled with this package in the file LICENSE, and is | - | available through the world-wide-web at the following url: | - | http://www.zend.com/license/2_00.txt. | - | If you did not receive a copy of the Zend license and are unable to | - | obtain it through the world-wide-web, please send a note to | - | license@zend.com so we can mail you a copy immediately. | + | This source file is subject to the Modified BSD License that is | + | bundled with this package in the file LICENSE, and is available | + | through the World Wide Web at . | + | | + | SPDX-License-Identifier: BSD-3-Clause | +----------------------------------------------------------------------+ | Authors: David Wang | | Dmitry Stogov | diff --git a/Zend/zend_gdb.c b/Zend/zend_gdb.c index 5975d8c29c09..0c2a82a144c0 100644 --- a/Zend/zend_gdb.c +++ b/Zend/zend_gdb.c @@ -2,15 +2,14 @@ +----------------------------------------------------------------------+ | Zend Engine | +----------------------------------------------------------------------+ - | Copyright (c) Zend Technologies Ltd. (http://www.zend.com) | + | Copyright © Zend Technologies Ltd., a subsidiary company of | + | Perforce Software, Inc., and Contributors. | +----------------------------------------------------------------------+ - | This source file is subject to version 2.00 of the Zend license, | - | that is bundled with this package in the file LICENSE, and is | - | available through the world-wide-web at the following url: | - | http://www.zend.com/license/2_00.txt. | - | If you did not receive a copy of the Zend license and are unable to | - | obtain it through the world-wide-web, please send a note to | - | license@zend.com so we can mail you a copy immediately. | + | This source file is subject to the Modified BSD License that is | + | bundled with this package in the file LICENSE, and is available | + | through the World Wide Web at . | + | | + | SPDX-License-Identifier: BSD-3-Clause | +----------------------------------------------------------------------+ | Authors: Dmitry Stogov | | Xinchen Hui | diff --git a/Zend/zend_gdb.h b/Zend/zend_gdb.h index aad0fefb097b..554791f5255a 100644 --- a/Zend/zend_gdb.h +++ b/Zend/zend_gdb.h @@ -2,15 +2,14 @@ +----------------------------------------------------------------------+ | Zend Engine | +----------------------------------------------------------------------+ - | Copyright (c) Zend Technologies Ltd. (http://www.zend.com) | + | Copyright © Zend Technologies Ltd., a subsidiary company of | + | Perforce Software, Inc., and Contributors. | +----------------------------------------------------------------------+ - | This source file is subject to version 2.00 of the Zend license, | - | that is bundled with this package in the file LICENSE, and is | - | available through the world-wide-web at the following url: | - | http://www.zend.com/license/2_00.txt. | - | If you did not receive a copy of the Zend license and are unable to | - | obtain it through the world-wide-web, please send a note to | - | license@zend.com so we can mail you a copy immediately. | + | This source file is subject to the Modified BSD License that is | + | bundled with this package in the file LICENSE, and is available | + | through the World Wide Web at . | + | | + | SPDX-License-Identifier: BSD-3-Clause | +----------------------------------------------------------------------+ | Authors: Dmitry Stogov | | Xinchen Hui | diff --git a/Zend/zend_generators.c b/Zend/zend_generators.c index 3bec062e9ce1..52d409f2e69b 100644 --- a/Zend/zend_generators.c +++ b/Zend/zend_generators.c @@ -2,15 +2,14 @@ +----------------------------------------------------------------------+ | Zend Engine | +----------------------------------------------------------------------+ - | Copyright (c) Zend Technologies Ltd. (http://www.zend.com) | + | Copyright © Zend Technologies Ltd., a subsidiary company of | + | Perforce Software, Inc., and Contributors. | +----------------------------------------------------------------------+ - | This source file is subject to version 2.00 of the Zend license, | - | that is bundled with this package in the file LICENSE, and is | - | available through the world-wide-web at the following url: | - | http://www.zend.com/license/2_00.txt. | - | If you did not receive a copy of the Zend license and are unable to | - | obtain it through the world-wide-web, please send a note to | - | license@zend.com so we can mail you a copy immediately. | + | This source file is subject to the Modified BSD License that is | + | bundled with this package in the file LICENSE, and is available | + | through the World Wide Web at . | + | | + | SPDX-License-Identifier: BSD-3-Clause | +----------------------------------------------------------------------+ | Authors: Nikita Popov | | Bob Weinand | @@ -179,7 +178,7 @@ static void zend_generator_remove_child(zend_generator_node *node, zend_generato node->child.single = NULL; } else { HashTable *ht = node->child.ht; - zend_hash_index_del(ht, (zend_ulong) child); + zend_hash_index_del(ht, (zend_ulong)(uintptr_t) child); if (node->children == 2) { zend_generator *other_child; ZEND_HASH_FOREACH_PTR(ht, other_child) { @@ -558,7 +557,7 @@ static void zend_generator_add_child(zend_generator *generator, zend_generator * node->child.ht = ht; } - zend_hash_index_add_new_ptr(node->child.ht, (zend_ulong) child, child); + zend_hash_index_add_new_ptr(node->child.ht, (zend_ulong)(uintptr_t) child, child); } ++node->children; diff --git a/Zend/zend_generators.h b/Zend/zend_generators.h index e7b01fb20ad7..73dd9ddc1f91 100644 --- a/Zend/zend_generators.h +++ b/Zend/zend_generators.h @@ -2,15 +2,14 @@ +----------------------------------------------------------------------+ | Zend Engine | +----------------------------------------------------------------------+ - | Copyright (c) Zend Technologies Ltd. (http://www.zend.com) | + | Copyright © Zend Technologies Ltd., a subsidiary company of | + | Perforce Software, Inc., and Contributors. | +----------------------------------------------------------------------+ - | This source file is subject to version 2.00 of the Zend license, | - | that is bundled with this package in the file LICENSE, and is | - | available through the world-wide-web at the following url: | - | http://www.zend.com/license/2_00.txt. | - | If you did not receive a copy of the Zend license and are unable to | - | obtain it through the world-wide-web, please send a note to | - | license@zend.com so we can mail you a copy immediately. | + | This source file is subject to the Modified BSD License that is | + | bundled with this package in the file LICENSE, and is available | + | through the World Wide Web at . | + | | + | SPDX-License-Identifier: BSD-3-Clause | +----------------------------------------------------------------------+ | Authors: Nikita Popov | | Bob Weinand | diff --git a/Zend/zend_globals.h b/Zend/zend_globals.h index 31f54cd8284b..8257df32e831 100644 --- a/Zend/zend_globals.h +++ b/Zend/zend_globals.h @@ -2,15 +2,14 @@ +----------------------------------------------------------------------+ | Zend Engine | +----------------------------------------------------------------------+ - | Copyright (c) Zend Technologies Ltd. (http://www.zend.com) | + | Copyright © Zend Technologies Ltd., a subsidiary company of | + | Perforce Software, Inc., and Contributors. | +----------------------------------------------------------------------+ - | This source file is subject to version 2.00 of the Zend license, | - | that is bundled with this package in the file LICENSE, and is | - | available through the world-wide-web at the following url: | - | http://www.zend.com/license/2_00.txt. | - | If you did not receive a copy of the Zend license and are unable to | - | obtain it through the world-wide-web, please send a note to | - | license@zend.com so we can mail you a copy immediately. | + | This source file is subject to the Modified BSD License that is | + | bundled with this package in the file LICENSE, and is available | + | through the World Wide Web at . | + | | + | SPDX-License-Identifier: BSD-3-Clause | +----------------------------------------------------------------------+ | Authors: Andi Gutmans | | Zeev Suraski | @@ -74,6 +73,7 @@ typedef struct _zend_vm_stack *zend_vm_stack; typedef struct _zend_ini_entry zend_ini_entry; typedef struct _zend_fiber_context zend_fiber_context; typedef struct _zend_fiber zend_fiber; +typedef struct _zend_error_info zend_error_info; typedef enum { ZEND_MEMOIZE_NONE, @@ -81,6 +81,12 @@ typedef enum { ZEND_MEMOIZE_FETCH, } zend_memoize_mode; +typedef struct zend_err_buf { + uint32_t size; + uint32_t capacity; + zend_error_info **errors; +} zend_err_buf; + struct _zend_compiler_globals { zend_stack loop_var_stack; @@ -298,8 +304,7 @@ struct _zend_executor_globals { * and their processing is delayed until zend_emit_recorded_errors() * is called or a fatal diagnostic is emitted. */ bool record_errors; - uint32_t num_errors; - zend_error_info **errors; + zend_err_buf errors; /* Override filename or line number of thrown errors and exceptions */ zend_string *filename_override; diff --git a/Zend/zend_globals_macros.h b/Zend/zend_globals_macros.h index d3cd9f923eee..bde10a0989d1 100644 --- a/Zend/zend_globals_macros.h +++ b/Zend/zend_globals_macros.h @@ -2,15 +2,14 @@ +----------------------------------------------------------------------+ | Zend Engine | +----------------------------------------------------------------------+ - | Copyright (c) Zend Technologies Ltd. (http://www.zend.com) | + | Copyright © Zend Technologies Ltd., a subsidiary company of | + | Perforce Software, Inc., and Contributors. | +----------------------------------------------------------------------+ - | This source file is subject to version 2.00 of the Zend license, | - | that is bundled with this package in the file LICENSE, and is | - | available through the world-wide-web at the following url: | - | http://www.zend.com/license/2_00.txt. | - | If you did not receive a copy of the Zend license and are unable to | - | obtain it through the world-wide-web, please send a note to | - | license@zend.com so we can mail you a copy immediately. | + | This source file is subject to the Modified BSD License that is | + | bundled with this package in the file LICENSE, and is available | + | through the World Wide Web at . | + | | + | SPDX-License-Identifier: BSD-3-Clause | +----------------------------------------------------------------------+ | Authors: Andi Gutmans | | Zeev Suraski | diff --git a/Zend/zend_hash.c b/Zend/zend_hash.c index e0e789cb7cb4..2913af9c2b5f 100644 --- a/Zend/zend_hash.c +++ b/Zend/zend_hash.c @@ -2,15 +2,14 @@ +----------------------------------------------------------------------+ | Zend Engine | +----------------------------------------------------------------------+ - | Copyright (c) Zend Technologies Ltd. (http://www.zend.com) | + | Copyright © Zend Technologies Ltd., a subsidiary company of | + | Perforce Software, Inc., and Contributors. | +----------------------------------------------------------------------+ - | This source file is subject to version 2.00 of the Zend license, | - | that is bundled with this package in the file LICENSE, and is | - | available through the world-wide-web at the following url: | - | http://www.zend.com/license/2_00.txt. | - | If you did not receive a copy of the Zend license and are unable to | - | obtain it through the world-wide-web, please send a note to | - | license@zend.com so we can mail you a copy immediately. | + | This source file is subject to the Modified BSD License that is | + | bundled with this package in the file LICENSE, and is available | + | through the World Wide Web at . | + | | + | SPDX-License-Identifier: BSD-3-Clause | +----------------------------------------------------------------------+ | Authors: Andi Gutmans | | Zeev Suraski | @@ -1111,7 +1110,10 @@ static zend_always_inline zval *_zend_hash_index_add_or_update_i(HashTable *ht, if ((flag & (HASH_ADD_NEW|HASH_ADD_NEXT)) != (HASH_ADD_NEW|HASH_ADD_NEXT) && h < ht->nNumUsed) { zv = ht->arPacked + h; - if (Z_TYPE_P(zv) != IS_UNDEF) { + if (flag & HASH_ADD_NEW) { + ZEND_ASSERT(Z_TYPE_P(zv) == IS_UNDEF); + goto convert_to_hash; + } else if (Z_TYPE_P(zv) != IS_UNDEF) { if (flag & HASH_LOOKUP) { return zv; } @@ -3209,7 +3211,7 @@ static zend_always_inline int zend_hash_compare_impl(const HashTable *ht1, const return 0; } -ZEND_API int zend_hash_compare(HashTable *ht1, HashTable *ht2, compare_func_t compar, bool ordered) +ZEND_API int zend_hash_compare(HashTable *ht1, const HashTable *ht2, compare_func_t compar, bool ordered) { int result; IS_CONSISTENT(ht1); diff --git a/Zend/zend_hash.h b/Zend/zend_hash.h index 70d9721cb7a1..6c0d4a241a1b 100644 --- a/Zend/zend_hash.h +++ b/Zend/zend_hash.h @@ -2,15 +2,14 @@ +----------------------------------------------------------------------+ | Zend Engine | +----------------------------------------------------------------------+ - | Copyright (c) Zend Technologies Ltd. (http://www.zend.com) | + | Copyright © Zend Technologies Ltd., a subsidiary company of | + | Perforce Software, Inc., and Contributors. | +----------------------------------------------------------------------+ - | This source file is subject to version 2.00 of the Zend license, | - | that is bundled with this package in the file LICENSE, and is | - | available through the world-wide-web at the following url: | - | http://www.zend.com/license/2_00.txt. | - | If you did not receive a copy of the Zend license and are unable to | - | obtain it through the world-wide-web, please send a note to | - | license@zend.com so we can mail you a copy immediately. | + | This source file is subject to the Modified BSD License that is | + | bundled with this package in the file LICENSE, and is available | + | through the World Wide Web at . | + | | + | SPDX-License-Identifier: BSD-3-Clause | +----------------------------------------------------------------------+ | Authors: Andi Gutmans | | Zeev Suraski | @@ -301,7 +300,7 @@ ZEND_API void zend_hash_bucket_renum_swap(Bucket *p, Bucket *q); ZEND_API void zend_hash_bucket_packed_swap(Bucket *p, Bucket *q); typedef int (*bucket_compare_func_t)(Bucket *a, Bucket *b); -ZEND_API int zend_hash_compare(HashTable *ht1, HashTable *ht2, compare_func_t compar, bool ordered); +ZEND_API int zend_hash_compare(HashTable *ht1, const HashTable *ht2, compare_func_t compar, bool ordered); ZEND_API void ZEND_FASTCALL zend_hash_sort_ex(HashTable *ht, sort_func_t sort_func, bucket_compare_func_t compare_func, bool renumber); ZEND_API void ZEND_FASTCALL zend_array_sort_ex(HashTable *ht, sort_func_t sort_func, bucket_compare_func_t compare_func, bool renumber); ZEND_API zval* ZEND_FASTCALL zend_hash_minmax(const HashTable *ht, compare_func_t compar, uint32_t flag); @@ -405,14 +404,14 @@ static zend_always_inline bool _zend_handle_numeric_str(const char *key, size_t const char *tmp = key; if (EXPECTED(*tmp > '9')) { - return 0; + return false; } else if (*tmp < '0') { if (*tmp != '-') { - return 0; + return false; } tmp++; if (*tmp > '9' || *tmp < '0') { - return 0; + return false; } } return _zend_handle_numeric_str_ex(key, length, idx); @@ -1606,30 +1605,30 @@ static zend_always_inline bool zend_array_is_list(const zend_array *array) zend_string* str_idx; /* Empty arrays are lists */ if (zend_hash_num_elements(array) == 0) { - return 1; + return true; } /* Packed arrays are lists */ if (HT_IS_PACKED(array)) { if (HT_IS_WITHOUT_HOLES(array)) { - return 1; + return true; } /* Check if the list could theoretically be repacked */ ZEND_HASH_PACKED_FOREACH_KEY(array, num_idx) { if (num_idx != expected_idx++) { - return 0; + return false; } } ZEND_HASH_FOREACH_END(); } else { /* Check if the list could theoretically be repacked */ ZEND_HASH_MAP_FOREACH_KEY(array, num_idx, str_idx) { if (str_idx != NULL || num_idx != expected_idx++) { - return 0; + return false; } } ZEND_HASH_FOREACH_END(); } - return 1; + return true; } diff --git a/Zend/zend_highlight.c b/Zend/zend_highlight.c index 5c3cd136d580..a3c65932ca4d 100644 --- a/Zend/zend_highlight.c +++ b/Zend/zend_highlight.c @@ -2,15 +2,14 @@ +----------------------------------------------------------------------+ | Zend Engine | +----------------------------------------------------------------------+ - | Copyright (c) Zend Technologies Ltd. (http://www.zend.com) | + | Copyright © Zend Technologies Ltd., a subsidiary company of | + | Perforce Software, Inc., and Contributors. | +----------------------------------------------------------------------+ - | This source file is subject to version 2.00 of the Zend license, | - | that is bundled with this package in the file LICENSE, and is | - | available through the world-wide-web at the following url: | - | http://www.zend.com/license/2_00.txt. | - | If you did not receive a copy of the Zend license and are unable to | - | obtain it through the world-wide-web, please send a note to | - | license@zend.com so we can mail you a copy immediately. | + | This source file is subject to the Modified BSD License that is | + | bundled with this package in the file LICENSE, and is available | + | through the World Wide Web at . | + | | + | SPDX-License-Identifier: BSD-3-Clause | +----------------------------------------------------------------------+ | Authors: Andi Gutmans | | Zeev Suraski | @@ -79,8 +78,8 @@ ZEND_API void zend_highlight(zend_syntax_highlighter_ini *syntax_highlighter_ini { zval token; int token_type; - char *last_color = syntax_highlighter_ini->highlight_html; - char *next_color; + const char *last_color = syntax_highlighter_ini->highlight_html; + const char *next_color; zend_printf("
", last_color);
 	/* highlight stuff coming back from zendlex() */
diff --git a/Zend/zend_highlight.h b/Zend/zend_highlight.h
index 04688d65132b..2e399f408063 100644
--- a/Zend/zend_highlight.h
+++ b/Zend/zend_highlight.h
@@ -2,15 +2,14 @@
    +----------------------------------------------------------------------+
    | Zend Engine                                                          |
    +----------------------------------------------------------------------+
-   | Copyright (c) Zend Technologies Ltd. (http://www.zend.com)           |
+   | Copyright © Zend Technologies Ltd., a subsidiary company of          |
+   |     Perforce Software, Inc., and Contributors.                       |
    +----------------------------------------------------------------------+
-   | This source file is subject to version 2.00 of the Zend license,     |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | http://www.zend.com/license/2_00.txt.                                |
-   | If you did not receive a copy of the Zend license and are unable to  |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@zend.com so we can mail you a copy immediately.              |
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Authors: Andi Gutmans                                  |
    |          Zeev Suraski                                  |
@@ -30,11 +29,11 @@
 
 
 typedef struct _zend_syntax_highlighter_ini {
-	char *highlight_html;
-	char *highlight_comment;
-	char *highlight_default;
-	char *highlight_string;
-	char *highlight_keyword;
+	const char *highlight_html;
+	const char *highlight_comment;
+	const char *highlight_default;
+	const char *highlight_string;
+	const char *highlight_keyword;
 } zend_syntax_highlighter_ini;
 
 
diff --git a/Zend/zend_hrtime.c b/Zend/zend_hrtime.c
index 773e0525cadd..819f95c47662 100644
--- a/Zend/zend_hrtime.c
+++ b/Zend/zend_hrtime.c
@@ -1,14 +1,12 @@
 /*
    +----------------------------------------------------------------------+
-   | Copyright (c) The PHP Group                                          |
+   | Copyright © The PHP Group and Contributors.                          |
    +----------------------------------------------------------------------+
-   | This source file is subject to version 3.01 of the PHP license,      |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | https://www.php.net/license/3_01.txt                                 |
-   | If you did not receive a copy of the PHP license and are unable to   |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@php.net so we can mail you a copy immediately.               |
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Author: Niklas Keller                               |
    | Author: Anatol Belski                                    |
diff --git a/Zend/zend_hrtime.h b/Zend/zend_hrtime.h
index f3bc4deeaf50..464c7e571d5b 100644
--- a/Zend/zend_hrtime.h
+++ b/Zend/zend_hrtime.h
@@ -1,14 +1,12 @@
 /*
    +----------------------------------------------------------------------+
-   | Copyright (c) The PHP Group                                          |
+   | Copyright © The PHP Group and Contributors.                          |
    +----------------------------------------------------------------------+
-   | This source file is subject to version 3.01 of the PHP license,      |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | https://www.php.net/license/3_01.txt                                 |
-   | If you did not receive a copy of the PHP license and are unable to   |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@php.net so we can mail you a copy immediately.               |
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Author: Niklas Keller                               |
    | Author: Anatol Belski                                    |
diff --git a/Zend/zend_inheritance.c b/Zend/zend_inheritance.c
index ba13a3233ed2..8df6a5599d30 100644
--- a/Zend/zend_inheritance.c
+++ b/Zend/zend_inheritance.c
@@ -2,15 +2,14 @@
    +----------------------------------------------------------------------+
    | Zend Engine                                                          |
    +----------------------------------------------------------------------+
-   | Copyright (c) Zend Technologies Ltd. (http://www.zend.com)           |
+   | Copyright © Zend Technologies Ltd., a subsidiary company of          |
+   |     Perforce Software, Inc., and Contributors.                       |
    +----------------------------------------------------------------------+
-   | This source file is subject to version 2.00 of the Zend license,     |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | http://www.zend.com/license/2_00.txt.                                |
-   | If you did not receive a copy of the Zend license and are unable to  |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@zend.com so we can mail you a copy immediately.              |
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Authors: Andi Gutmans                                  |
    |          Zeev Suraski                                  |
@@ -189,9 +188,9 @@ static void do_inherit_parent_constructor(zend_class_entry *ce) /* {{{ */
 
 	if (ce->constructor) {
 		if (parent->constructor && UNEXPECTED(parent->constructor->common.fn_flags & ZEND_ACC_FINAL)) {
-			zend_error_noreturn(E_ERROR, "Cannot override final %s::%s() with %s::%s()",
-				ZSTR_VAL(parent->name), ZSTR_VAL(parent->constructor->common.function_name),
-				ZSTR_VAL(ce->name), ZSTR_VAL(ce->constructor->common.function_name));
+			zend_error_noreturn(E_ERROR, "Cannot override final %s::__construct() with %s::__construct()",
+				ZSTR_VAL(parent->name),
+				ZSTR_VAL(ce->name));
 		}
 		return;
 	}
@@ -537,7 +536,7 @@ static inheritance_status zend_is_class_subtype_of_type(
 						return INHERITANCE_SUCCESS;
 					}
 					continue;
-				EMPTY_SWITCH_DEFAULT_CASE();
+				default: ZEND_UNREACHABLE();
 			}
 		}
 
@@ -924,7 +923,7 @@ static ZEND_COLD zend_string *zend_get_function_declaration(
 			/* cut off on NULL byte ... class@anonymous */
 			smart_str_appends(&str, ZSTR_VAL(fptr->common.scope->name));
 		} else {
-			smart_str_appendl(&str, ZSTR_VAL(fptr->common.scope->name), ZSTR_LEN(fptr->common.scope->name));
+			smart_str_append(&str, fptr->common.scope->name);
 		}
 		smart_str_appends(&str, "::");
 	}
@@ -1596,11 +1595,7 @@ static void zend_do_inherit_interfaces(zend_class_entry *ce, const zend_class_en
 
 	ce_num = ce->num_interfaces;
 
-	if (ce->type == ZEND_INTERNAL_CLASS) {
-		ce->interfaces = (zend_class_entry **) realloc(ce->interfaces, sizeof(zend_class_entry *) * (ce_num + if_num));
-	} else {
-		ce->interfaces = (zend_class_entry **) erealloc(ce->interfaces, sizeof(zend_class_entry *) * (ce_num + if_num));
-	}
+	ce->interfaces = (zend_class_entry **) perealloc(ce->interfaces, sizeof(zend_class_entry *) * (ce_num + if_num), ce->type == ZEND_INTERNAL_CLASS);
 
 	/* Inherit the interfaces, only if they're not already inherited by the class */
 	while (if_num--) {
@@ -2235,11 +2230,7 @@ ZEND_API void zend_do_implement_interface(zend_class_entry *ce, zend_class_entry
 		} ZEND_HASH_FOREACH_END();
 	} else {
 		if (ce->num_interfaces >= current_iface_num) {
-			if (ce->type == ZEND_INTERNAL_CLASS) {
-				ce->interfaces = (zend_class_entry **) realloc(ce->interfaces, sizeof(zend_class_entry *) * (++current_iface_num));
-			} else {
-				ce->interfaces = (zend_class_entry **) erealloc(ce->interfaces, sizeof(zend_class_entry *) * (++current_iface_num));
-			}
+			ce->interfaces = (zend_class_entry **) perealloc(ce->interfaces, sizeof(zend_class_entry *) * (++current_iface_num), ce->type == ZEND_INTERNAL_CLASS);
 		}
 		ce->interfaces[ce->num_interfaces++] = iface;
 
@@ -2766,6 +2757,19 @@ static void emit_incompatible_trait_constant_error(
 	);
 }
 
+static void emit_trait_constant_enum_case_conflict_error(
+	const zend_class_entry *ce, const zend_class_constant *trait_constant, zend_string *name
+) {
+	zend_error_noreturn(E_COMPILE_ERROR,
+		"Cannot use trait %s, because %s::%s conflicts with enum case %s::%s",
+		ZSTR_VAL(trait_constant->ce->name),
+		ZSTR_VAL(trait_constant->ce->name),
+		ZSTR_VAL(name),
+		ZSTR_VAL(ce->name),
+		ZSTR_VAL(name)
+	);
+}
+
 static bool do_trait_constant_check(
 	zend_class_entry *ce, zend_class_constant *trait_constant, zend_string *name, zend_class_entry **traits, size_t current_trait
 ) {
@@ -2779,6 +2783,11 @@ static bool do_trait_constant_check(
 
 	zend_class_constant *existing_constant = Z_PTR_P(zv);
 
+	if (UNEXPECTED(ZEND_CLASS_CONST_FLAGS(existing_constant) & ZEND_CLASS_CONST_IS_CASE)) {
+		emit_trait_constant_enum_case_conflict_error(ce, trait_constant, name);
+		return false;
+	}
+
 	if ((ZEND_CLASS_CONST_FLAGS(trait_constant) & flags_mask) != (ZEND_CLASS_CONST_FLAGS(existing_constant) & flags_mask)) {
 		emit_incompatible_trait_constant_error(ce, existing_constant, trait_constant, name, traits, current_trait);
 		return false;
@@ -3308,7 +3317,7 @@ static void check_unrecoverable_load_failure(const zend_class_entry *ce) {
 	 * a dependence on the inheritance hierarchy of this specific class. Instead we fall back to
 	 * a fatal error, as would happen if we did not allow exceptions in the first place. */
 	if (CG(unlinked_uses)
-			&& zend_hash_index_del(CG(unlinked_uses), (zend_long)(uintptr_t)ce) == SUCCESS) {
+			&& zend_hash_index_del(CG(unlinked_uses), (zend_ulong)(uintptr_t)ce) == SUCCESS) {
 		zend_exception_uncaught_error(
 			"During inheritance of %s with variance dependencies", ZSTR_VAL(ce->name));
 	}
@@ -3603,7 +3612,7 @@ ZEND_API zend_class_entry *zend_do_link_class(zend_class_entry *ce, zend_string
 		}
 
 		if (CG(unlinked_uses)) {
-			zend_hash_index_del(CG(unlinked_uses), (zend_long)(uintptr_t) ce);
+			zend_hash_index_del(CG(unlinked_uses), (zend_ulong)(uintptr_t) ce);
 		}
 
 		orig_linking_class = CG(current_linking_class);
@@ -3748,6 +3757,11 @@ ZEND_API zend_class_entry *zend_do_link_class(zend_class_entry *ce, zend_string
 		if (ce->ce_flags & ZEND_ACC_UNRESOLVED_VARIANCE) {
 			resolve_delayed_variance_obligations(ce);
 		}
+		/* Delayed variance resolution can re-enter linking before the full
+		 * hierarchy is linked. See ext/opcache/tests/gh20469*.phpt. */
+		if (CG(unlinked_uses) && zend_hash_index_exists(CG(unlinked_uses), (zend_long)(uintptr_t) ce)) {
+			ce->ce_flags &= ~ZEND_ACC_CACHEABLE;
+		}
 		if (ce->ce_flags & ZEND_ACC_CACHEABLE) {
 			ce->ce_flags &= ~ZEND_ACC_CACHEABLE;
 		} else {
@@ -3755,6 +3769,7 @@ ZEND_API zend_class_entry *zend_do_link_class(zend_class_entry *ce, zend_string
 		}
 	}
 
+	bool was_cacheable = is_cacheable;
 	if (!CG(current_linking_class)) {
 		is_cacheable = 0;
 	}
@@ -3775,6 +3790,13 @@ ZEND_API zend_class_entry *zend_do_link_class(zend_class_entry *ce, zend_string
 			zend_hash_destroy(ht);
 			FREE_HASHTABLE(ht);
 		}
+	} else if (was_cacheable && ce->inheritance_cache) {
+		/* Cacheability can be disabled after dependency tracking prepared
+		 * an inheritance-cache dependency table. Discard it here. */
+		HashTable *ht = (HashTable*)ce->inheritance_cache;
+		ce->inheritance_cache = NULL;
+		zend_hash_destroy(ht);
+		FREE_HASHTABLE(ht);
 	}
 
 	if (!orig_record_errors) {
diff --git a/Zend/zend_inheritance.h b/Zend/zend_inheritance.h
index 7171a9385f3b..fdcbd95764b3 100644
--- a/Zend/zend_inheritance.h
+++ b/Zend/zend_inheritance.h
@@ -2,15 +2,14 @@
    +----------------------------------------------------------------------+
    | Zend Engine                                                          |
    +----------------------------------------------------------------------+
-   | Copyright (c) Zend Technologies Ltd. (http://www.zend.com)           |
+   | Copyright © Zend Technologies Ltd., a subsidiary company of          |
+   |     Perforce Software, Inc., and Contributors.                       |
    +----------------------------------------------------------------------+
-   | This source file is subject to version 2.00 of the Zend license,     |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | http://www.zend.com/license/2_00.txt.                                |
-   | If you did not receive a copy of the Zend license and are unable to  |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@zend.com so we can mail you a copy immediately.              |
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Authors: Andi Gutmans                                  |
    |          Zeev Suraski                                  |
diff --git a/Zend/zend_ini.c b/Zend/zend_ini.c
index d8f1d4f50f95..093683526d31 100644
--- a/Zend/zend_ini.c
+++ b/Zend/zend_ini.c
@@ -2,15 +2,14 @@
    +----------------------------------------------------------------------+
    | Zend Engine                                                          |
    +----------------------------------------------------------------------+
-   | Copyright (c) Zend Technologies Ltd. (http://www.zend.com)           |
+   | Copyright © Zend Technologies Ltd., a subsidiary company of          |
+   |     Perforce Software, Inc., and Contributors.                       |
    +----------------------------------------------------------------------+
-   | This source file is subject to version 2.00 of the Zend license,     |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | http://www.zend.com/license/2_00.txt.                                |
-   | If you did not receive a copy of the Zend license and are unable to  |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@zend.com so we can mail you a copy immediately.              |
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Author: Zeev Suraski                                   |
    +----------------------------------------------------------------------+
@@ -491,7 +490,7 @@ ZEND_API double zend_ini_double(const char *name, size_t name_length, bool orig)
 }
 /* }}} */
 
-ZEND_API char *zend_ini_string_ex(const char *name, size_t name_length, bool orig, bool *exists) /* {{{ */
+ZEND_API const char *zend_ini_string_ex(const char *name, size_t name_length, bool orig, bool *exists) /* {{{ */
 {
 	zend_string *str = zend_ini_str_ex(name, name_length, orig, exists);
 
@@ -499,7 +498,7 @@ ZEND_API char *zend_ini_string_ex(const char *name, size_t name_length, bool ori
 }
 /* }}} */
 
-ZEND_API char *zend_ini_string(const char *name, size_t name_length, bool orig) /* {{{ */
+ZEND_API const char *zend_ini_string(const char *name, size_t name_length, bool orig) /* {{{ */
 {
 	zend_string *str = zend_ini_str(name, name_length, orig);
 
@@ -562,6 +561,11 @@ ZEND_API zend_string *zend_ini_get_value(zend_string *name) /* {{{ */
 
 ZEND_API bool zend_ini_parse_bool(const zend_string *str)
 {
+	/* May happen if an unknown INI setting is queried via zend_ini_bool_literal(),
+	 * as zend_ini_str() would return NULL */
+	if (UNEXPECTED(str == NULL)) {
+		return false;
+	}
 	if (zend_string_equals_literal_ci(str, "true")
 			|| zend_string_equals_literal_ci(str, "yes")
 			|| zend_string_equals_literal_ci(str, "on")
@@ -585,7 +589,7 @@ static const char *zend_ini_consume_quantity_prefix(const char *const digits, co
 		++digits_consumed;
 	}
 
-	if (digits_consumed[0] == '0' && !isdigit(digits_consumed[1])) {
+	if (digits_consumed[0] == '0' && !isdigit((unsigned char)digits_consumed[1])) {
 		/* Value is just 0 */
 		if ((digits_consumed+1) == str_end) {
 			return digits_consumed;
@@ -643,7 +647,7 @@ static zend_ulong zend_ini_parse_quantity_internal(const zend_string *value, zen
 	}
 
 	/* if there is no digit after +/- */
-	if (!isdigit(digits[0])) {
+	if (!isdigit((unsigned char)digits[0])) {
 		/* Escape the string to avoid null bytes and to make non-printable chars
 		 * visible */
 		smart_str_append_escaped(&invalid, ZSTR_VAL(value), ZSTR_LEN(value));
@@ -657,7 +661,7 @@ static zend_ulong zend_ini_parse_quantity_internal(const zend_string *value, zen
 	}
 
 	int base = 0;
-	if (digits[0] == '0' && !isdigit(digits[1])) {
+	if (digits[0] == '0' && !isdigit((unsigned char)digits[1])) {
 		/* Value is just 0 */
 		if ((digits+1) == str_end) {
 			*errstr = NULL;
diff --git a/Zend/zend_ini.h b/Zend/zend_ini.h
index d8d7f599f461..dbe650675b66 100644
--- a/Zend/zend_ini.h
+++ b/Zend/zend_ini.h
@@ -2,15 +2,14 @@
    +----------------------------------------------------------------------+
    | Zend Engine                                                          |
    +----------------------------------------------------------------------+
-   | Copyright (c) Zend Technologies Ltd. (http://www.zend.com)           |
+   | Copyright © Zend Technologies Ltd., a subsidiary company of          |
+   |     Perforce Software, Inc., and Contributors.                       |
    +----------------------------------------------------------------------+
-   | This source file is subject to version 2.00 of the Zend license,     |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | http://www.zend.com/license/2_00.txt.                                |
-   | If you did not receive a copy of the Zend license and are unable to  |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@zend.com so we can mail you a copy immediately.              |
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Author: Zeev Suraski                                   |
    +----------------------------------------------------------------------+
@@ -88,13 +87,19 @@ ZEND_API void display_ini_entries(zend_module_entry *module);
 
 ZEND_API zend_long zend_ini_long(const char *name, size_t name_length, bool orig);
 ZEND_API double zend_ini_double(const char *name, size_t name_length, bool orig);
-ZEND_API char *zend_ini_string(const char *name, size_t name_length, bool orig);
-ZEND_API char *zend_ini_string_ex(const char *name, size_t name_length, bool orig, bool *exists);
+ZEND_API const char *zend_ini_string(const char *name, size_t name_length, bool orig);
+ZEND_API const char *zend_ini_string_ex(const char *name, size_t name_length, bool orig, bool *exists);
 ZEND_API zend_string *zend_ini_str(const char *name, size_t name_length, bool orig);
 ZEND_API zend_string *zend_ini_str_ex(const char *name, size_t name_length, bool orig, bool *exists);
 ZEND_API zend_string *zend_ini_get_value(zend_string *name);
 ZEND_API bool zend_ini_parse_bool(const zend_string *str);
 
+#define zend_ini_bool_literal(name) zend_ini_parse_bool(zend_ini_str((name), sizeof("" name) - 1, false))
+#define zend_ini_long_literal(name) zend_ini_long((name), sizeof("" name) - 1, false)
+#define zend_ini_double_literal(name) zend_ini_double((name), sizeof("" name) - 1, false)
+#define zend_ini_str_literal(name) zend_ini_str((name), sizeof("" name) - 1, false)
+#define zend_ini_string_literal(name) zend_ini_string((name), sizeof("" name) - 1, false)
+
 /**
  * Parses an ini quantity
  *
@@ -177,30 +182,20 @@ END_EXTERN_C()
 
 #ifdef ZTS
 #define STD_ZEND_INI_ENTRY(name, default_value, modifiable, on_modify, property_name, struct_type, struct_ptr) \
-	ZEND_INI_ENTRY2(name, default_value, modifiable, on_modify, (void *) XtOffsetOf(struct_type, property_name), (void *) &struct_ptr##_id)
+	ZEND_INI_ENTRY2(name, default_value, modifiable, on_modify, (void *) offsetof(struct_type, property_name), (void *) &struct_ptr##_id)
 #define STD_ZEND_INI_ENTRY_EX(name, default_value, modifiable, on_modify, property_name, struct_type, struct_ptr, displayer) \
-	ZEND_INI_ENTRY2_EX(name, default_value, modifiable, on_modify, (void *) XtOffsetOf(struct_type, property_name), (void *) &struct_ptr##_id, displayer)
+	ZEND_INI_ENTRY2_EX(name, default_value, modifiable, on_modify, (void *) offsetof(struct_type, property_name), (void *) &struct_ptr##_id, displayer)
 #define STD_ZEND_INI_BOOLEAN(name, default_value, modifiable, on_modify, property_name, struct_type, struct_ptr) \
-	ZEND_INI_ENTRY3_EX(name, default_value, modifiable, on_modify, (void *) XtOffsetOf(struct_type, property_name), (void *) &struct_ptr##_id, NULL, zend_ini_boolean_displayer_cb)
+	ZEND_INI_ENTRY3_EX(name, default_value, modifiable, on_modify, (void *) offsetof(struct_type, property_name), (void *) &struct_ptr##_id, NULL, zend_ini_boolean_displayer_cb)
 #else
 #define STD_ZEND_INI_ENTRY(name, default_value, modifiable, on_modify, property_name, struct_type, struct_ptr) \
-	ZEND_INI_ENTRY2(name, default_value, modifiable, on_modify, (void *) XtOffsetOf(struct_type, property_name), (void *) &struct_ptr)
+	ZEND_INI_ENTRY2(name, default_value, modifiable, on_modify, (void *) offsetof(struct_type, property_name), (void *) &struct_ptr)
 #define STD_ZEND_INI_ENTRY_EX(name, default_value, modifiable, on_modify, property_name, struct_type, struct_ptr, displayer) \
-	ZEND_INI_ENTRY2_EX(name, default_value, modifiable, on_modify, (void *) XtOffsetOf(struct_type, property_name), (void *) &struct_ptr, displayer)
+	ZEND_INI_ENTRY2_EX(name, default_value, modifiable, on_modify, (void *) offsetof(struct_type, property_name), (void *) &struct_ptr, displayer)
 #define STD_ZEND_INI_BOOLEAN(name, default_value, modifiable, on_modify, property_name, struct_type, struct_ptr) \
-	ZEND_INI_ENTRY3_EX(name, default_value, modifiable, on_modify, (void *) XtOffsetOf(struct_type, property_name), (void *) &struct_ptr, NULL, zend_ini_boolean_displayer_cb)
+	ZEND_INI_ENTRY3_EX(name, default_value, modifiable, on_modify, (void *) offsetof(struct_type, property_name), (void *) &struct_ptr, NULL, zend_ini_boolean_displayer_cb)
 #endif
 
-#define INI_INT(name) zend_ini_long((name), strlen(name), 0)
-#define INI_FLT(name) zend_ini_double((name), strlen(name), 0)
-#define INI_STR(name) zend_ini_string_ex((name), strlen(name), 0, NULL)
-#define INI_BOOL(name) ((bool) INI_INT(name))
-
-#define INI_ORIG_INT(name)	zend_ini_long((name), strlen(name), 1)
-#define INI_ORIG_FLT(name)	zend_ini_double((name), strlen(name), 1)
-#define INI_ORIG_STR(name)	zend_ini_string((name), strlen(name), 1)
-#define INI_ORIG_BOOL(name) ((bool) INI_ORIG_INT(name))
-
 #define REGISTER_INI_ENTRIES() zend_register_ini_entries_ex(ini_entries, module_number, type)
 #define UNREGISTER_INI_ENTRIES() zend_unregister_ini_entries_ex(module_number, type)
 #define DISPLAY_INI_ENTRIES() display_ini_entries(zend_module)
diff --git a/Zend/zend_ini_parser.y b/Zend/zend_ini_parser.y
index 748ccd2235a6..d35853ab5acd 100644
--- a/Zend/zend_ini_parser.y
+++ b/Zend/zend_ini_parser.y
@@ -4,15 +4,14 @@
    +----------------------------------------------------------------------+
    | Zend Engine                                                          |
    +----------------------------------------------------------------------+
-   | Copyright (c) Zend Technologies Ltd. (http://www.zend.com)           |
+   | Copyright © Zend Technologies Ltd., a subsidiary company of          |
+   |     Perforce Software, Inc., and Contributors.                       |
    +----------------------------------------------------------------------+
-   | This source file is subject to version 2.00 of the Zend license,     |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | http://www.zend.com/license/2_00.txt.                                |
-   | If you did not receive a copy of the Zend license and are unable to  |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@zend.com so we can mail you a copy immediately.              |
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Authors: Zeev Suraski                                  |
    |          Jani Taskinen                                 |
@@ -57,7 +56,7 @@ static int get_int_val(zval *op) {
 			zend_string_free(Z_STR_P(op));
 			return val;
 		}
-		EMPTY_SWITCH_DEFAULT_CASE()
+		default: ZEND_UNREACHABLE();
 	}
 }
 
diff --git a/Zend/zend_ini_scanner.h b/Zend/zend_ini_scanner.h
index 9a6c84fce429..c013564a10f4 100644
--- a/Zend/zend_ini_scanner.h
+++ b/Zend/zend_ini_scanner.h
@@ -2,15 +2,14 @@
    +----------------------------------------------------------------------+
    | Zend Engine                                                          |
    +----------------------------------------------------------------------+
-   | Copyright (c) Zend Technologies Ltd. (http://www.zend.com)           |
+   | Copyright © Zend Technologies Ltd., a subsidiary company of          |
+   |     Perforce Software, Inc., and Contributors.                       |
    +----------------------------------------------------------------------+
-   | This source file is subject to version 2.00 of the Zend license,     |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | http://www.zend.com/license/2_00.txt.                                |
-   | If you did not receive a copy of the Zend license and are unable to  |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@zend.com so we can mail you a copy immediately.              |
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Authors: Andi Gutmans                                  |
    |          Zeev Suraski                                  |
diff --git a/Zend/zend_ini_scanner.l b/Zend/zend_ini_scanner.l
index 5f9b77e6a3d8..7fd51654ac82 100644
--- a/Zend/zend_ini_scanner.l
+++ b/Zend/zend_ini_scanner.l
@@ -2,15 +2,14 @@
    +----------------------------------------------------------------------+
    | Zend Engine                                                          |
    +----------------------------------------------------------------------+
-   | Copyright (c) Zend Technologies Ltd. (http://www.zend.com)           |
+   | Copyright © Zend Technologies Ltd., a subsidiary company of          |
+   |     Perforce Software, Inc., and Contributors.                       |
    +----------------------------------------------------------------------+
-   | This source file is subject to version 2.00 of the Zend license,     |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | http://www.zend.com/license/2_00.txt.                                |
-   | If you did not receive a copy of the Zend license and are unable to  |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@zend.com so we can mail you a copy immediately.              |
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Authors: Zeev Suraski                                  |
    |          Jani Taskinen                                 |
diff --git a/Zend/zend_interfaces.c b/Zend/zend_interfaces.c
index 404dd9db893e..49169dfca234 100644
--- a/Zend/zend_interfaces.c
+++ b/Zend/zend_interfaces.c
@@ -2,15 +2,14 @@
    +----------------------------------------------------------------------+
    | Zend Engine                                                          |
    +----------------------------------------------------------------------+
-   | Copyright (c) Zend Technologies Ltd. (http://www.zend.com)           |
+   | Copyright © Zend Technologies Ltd., a subsidiary company of          |
+   |     Perforce Software, Inc., and Contributors.                       |
    +----------------------------------------------------------------------+
-   | This source file is subject to version 2.00 of the Zend license,     |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | http://www.zend.com/license/2_00.txt.                                |
-   | If you did not receive a copy of the Zend license and are unable to  |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@zend.com so we can mail you a copy immediately.              |
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Authors: Marcus Boerger                               |
    +----------------------------------------------------------------------+
diff --git a/Zend/zend_interfaces.h b/Zend/zend_interfaces.h
index 883e482f510c..3aeac4fc8146 100644
--- a/Zend/zend_interfaces.h
+++ b/Zend/zend_interfaces.h
@@ -2,15 +2,14 @@
    +----------------------------------------------------------------------+
    | Zend Engine                                                          |
    +----------------------------------------------------------------------+
-   | Copyright (c) Zend Technologies Ltd. (http://www.zend.com)           |
+   | Copyright © Zend Technologies Ltd., a subsidiary company of          |
+   |     Perforce Software, Inc., and Contributors.                       |
    +----------------------------------------------------------------------+
-   | This source file is subject to version 2.00 of the Zend license,     |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | http://www.zend.com/license/2_00.txt.                                |
-   | If you did not receive a copy of the Zend license and are unable to  |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@zend.com so we can mail you a copy immediately.              |
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Authors: Marcus Boerger                               |
    +----------------------------------------------------------------------+
diff --git a/Zend/zend_iterators.c b/Zend/zend_iterators.c
index 64dbb0541a80..c05434486f89 100644
--- a/Zend/zend_iterators.c
+++ b/Zend/zend_iterators.c
@@ -2,15 +2,14 @@
    +----------------------------------------------------------------------+
    | Zend Engine                                                          |
    +----------------------------------------------------------------------+
-   | Copyright (c) Zend Technologies Ltd. (http://www.zend.com)           |
+   | Copyright © Zend Technologies Ltd., a subsidiary company of          |
+   |     Perforce Software, Inc., and Contributors.                       |
    +----------------------------------------------------------------------+
-   | This source file is subject to version 2.00 of the Zend license,     |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | http://www.zend.com/license/2_00.txt.                                |
-   | If you did not receive a copy of the Zend license and are unable to  |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@zend.com so we can mail you a copy immediately.              |
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Author: Wez Furlong                            |
    |         Marcus Boerger                                |
diff --git a/Zend/zend_iterators.h b/Zend/zend_iterators.h
index 75549188ed6b..973903768405 100644
--- a/Zend/zend_iterators.h
+++ b/Zend/zend_iterators.h
@@ -2,15 +2,14 @@
    +----------------------------------------------------------------------+
    | Zend Engine                                                          |
    +----------------------------------------------------------------------+
-   | Copyright (c) Zend Technologies Ltd. (http://www.zend.com)           |
+   | Copyright © Zend Technologies Ltd., a subsidiary company of          |
+   |     Perforce Software, Inc., and Contributors.                       |
    +----------------------------------------------------------------------+
-   | This source file is subject to version 2.00 of the Zend license,     |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | http://www.zend.com/license/2_00.txt.                                |
-   | If you did not receive a copy of the Zend license and are unable to  |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@zend.com so we can mail you a copy immediately.              |
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Author: Wez Furlong                            |
    |         Marcus Boerger                                |
diff --git a/Zend/zend_language_parser.y b/Zend/zend_language_parser.y
index e2686c7e1c5a..b4dda00404ea 100644
--- a/Zend/zend_language_parser.y
+++ b/Zend/zend_language_parser.y
@@ -3,15 +3,14 @@
    +----------------------------------------------------------------------+
    | Zend Engine                                                          |
    +----------------------------------------------------------------------+
-   | Copyright (c) Zend Technologies Ltd. (http://www.zend.com)           |
+   | Copyright © Zend Technologies Ltd., a subsidiary company of          |
+   |     Perforce Software, Inc., and Contributors.                       |
    +----------------------------------------------------------------------+
-   | This source file is subject to version 2.00 of the Zend license,     |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | http://www.zend.com/license/2_00.txt.                                |
-   | If you did not receive a copy of the Zend license and are unable to  |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@zend.com so we can mail you a copy immediately.              |
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Authors: Andi Gutmans                                  |
    |          Zeev Suraski                                  |
@@ -821,9 +820,9 @@ parameter:
 			{ $$ = zend_ast_create_ex(ZEND_AST_PARAM, $1 | $3 | $4, $2, $5, NULL,
 					NULL, $6 ? zend_ast_create_zval_from_str($6) : NULL, $7); }
 	|	optional_cpp_modifiers optional_type_without_static
-		is_reference is_variadic T_VARIABLE backup_doc_comment '=' expr optional_property_hook_list
-			{ $$ = zend_ast_create_ex(ZEND_AST_PARAM, $1 | $3 | $4, $2, $5, $8,
-					NULL, $6 ? zend_ast_create_zval_from_str($6) : NULL, $9); }
+		is_reference is_variadic T_VARIABLE '=' expr backup_doc_comment optional_property_hook_list
+			{ $$ = zend_ast_create_ex(ZEND_AST_PARAM, $1 | $3 | $4, $2, $5, $7,
+					NULL, $8 ? zend_ast_create_zval_from_str($8) : NULL, $9); }
 ;
 
 optional_type_without_static:
@@ -1059,13 +1058,13 @@ trait_alias:
 
 trait_method_reference:
 		identifier
-			{ $$ = zend_ast_create(ZEND_AST_METHOD_REFERENCE, NULL, $1); }
+			{ $$ = zend_ast_create(ZEND_AST_TRAIT_METHOD_REFERENCE, NULL, $1); }
 	|	absolute_trait_method_reference { $$ = $1; }
 ;
 
 absolute_trait_method_reference:
 	class_name T_PAAMAYIM_NEKUDOTAYIM identifier
-		{ $$ = zend_ast_create(ZEND_AST_METHOD_REFERENCE, $1, $3); }
+		{ $$ = zend_ast_create(ZEND_AST_TRAIT_METHOD_REFERENCE, $1, $3); }
 ;
 
 method_body:
diff --git a/Zend/zend_language_scanner.h b/Zend/zend_language_scanner.h
index c494564ba234..e502d91411b5 100644
--- a/Zend/zend_language_scanner.h
+++ b/Zend/zend_language_scanner.h
@@ -2,15 +2,14 @@
    +----------------------------------------------------------------------+
    | Zend Engine                                                          |
    +----------------------------------------------------------------------+
-   | Copyright (c) Zend Technologies Ltd. (http://www.zend.com)           |
+   | Copyright © Zend Technologies Ltd., a subsidiary company of          |
+   |     Perforce Software, Inc., and Contributors.                       |
    +----------------------------------------------------------------------+
-   | This source file is subject to version 2.00 of the Zend license,     |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | http://www.zend.com/license/2_00.txt.                                |
-   | If you did not receive a copy of the Zend license and are unable to  |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@zend.com so we can mail you a copy immediately.              |
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Authors: Andi Gutmans                                  |
    |          Zeev Suraski                                  |
diff --git a/Zend/zend_language_scanner.l b/Zend/zend_language_scanner.l
index 1c985189fd3c..07f2d44cb5c6 100644
--- a/Zend/zend_language_scanner.l
+++ b/Zend/zend_language_scanner.l
@@ -2,15 +2,14 @@
    +----------------------------------------------------------------------+
    | Zend Engine                                                          |
    +----------------------------------------------------------------------+
-   | Copyright (c) Zend Technologies Ltd. (http://www.zend.com)           |
+   | Copyright © Zend Technologies Ltd., a subsidiary company of          |
+   |     Perforce Software, Inc., and Contributors.                       |
    +----------------------------------------------------------------------+
-   | This source file is subject to version 2.00 of the Zend license,     |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | http://www.zend.com/license/2_00.txt.                                |
-   | If you did not receive a copy of the Zend license and are unable to  |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@zend.com so we can mail you a copy immediately.              |
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Authors: Marcus Boerger                               |
    |          Nuno Lopes                                 |
diff --git a/Zend/zend_lazy_objects.c b/Zend/zend_lazy_objects.c
index e88ecf9fbe65..a8316768ef5f 100644
--- a/Zend/zend_lazy_objects.c
+++ b/Zend/zend_lazy_objects.c
@@ -2,15 +2,14 @@
    +----------------------------------------------------------------------+
    | Zend Engine                                                          |
    +----------------------------------------------------------------------+
-   | Copyright (c) Zend Technologies Ltd. (http://www.zend.com)           |
+   | Copyright © Zend Technologies Ltd., a subsidiary company of          |
+   |     Perforce Software, Inc., and Contributors.                       |
    +----------------------------------------------------------------------+
-   | This source file is subject to version 2.00 of the Zend license,     |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | http://www.zend.com/license/2_00.txt.                                |
-   | If you did not receive a copy of the Zend license and are unable to  |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@zend.com so we can mail you a copy immediately.              |
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Authors: Arnaud Le Blanc                        |
    +----------------------------------------------------------------------+
diff --git a/Zend/zend_lazy_objects.h b/Zend/zend_lazy_objects.h
index fc0a908e7ad2..8e66ee3facd6 100644
--- a/Zend/zend_lazy_objects.h
+++ b/Zend/zend_lazy_objects.h
@@ -2,15 +2,14 @@
    +----------------------------------------------------------------------+
    | Zend Engine                                                          |
    +----------------------------------------------------------------------+
-   | Copyright (c) Zend Technologies Ltd. (http://www.zend.com)           |
+   | Copyright © Zend Technologies Ltd., a subsidiary company of          |
+   |     Perforce Software, Inc., and Contributors.                       |
    +----------------------------------------------------------------------+
-   | This source file is subject to version 2.00 of the Zend license,     |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | http://www.zend.com/license/2_00.txt.                                |
-   | If you did not receive a copy of the Zend license and are unable to  |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@zend.com so we can mail you a copy immediately.              |
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Authors: Arnaud Le Blanc                        |
    +----------------------------------------------------------------------+
diff --git a/Zend/zend_list.c b/Zend/zend_list.c
index 10aa9174cfcc..4e96ce0ec7da 100644
--- a/Zend/zend_list.c
+++ b/Zend/zend_list.c
@@ -2,15 +2,14 @@
    +----------------------------------------------------------------------+
    | Zend Engine                                                          |
    +----------------------------------------------------------------------+
-   | Copyright (c) Zend Technologies Ltd. (http://www.zend.com)           |
+   | Copyright © Zend Technologies Ltd., a subsidiary company of          |
+   |     Perforce Software, Inc., and Contributors.                       |
    +----------------------------------------------------------------------+
-   | This source file is subject to version 2.00 of the Zend license,     |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | http://www.zend.com/license/2_00.txt.                                |
-   | If you did not receive a copy of the Zend license and are unable to  |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@zend.com so we can mail you a copy immediately.              |
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Authors: Andi Gutmans                                  |
    |          Zeev Suraski                                  |
diff --git a/Zend/zend_list.h b/Zend/zend_list.h
index 55ccf78dca10..108bd3fc3e7f 100644
--- a/Zend/zend_list.h
+++ b/Zend/zend_list.h
@@ -2,15 +2,14 @@
    +----------------------------------------------------------------------+
    | Zend Engine                                                          |
    +----------------------------------------------------------------------+
-   | Copyright (c) Zend Technologies Ltd. (http://www.zend.com)           |
+   | Copyright © Zend Technologies Ltd., a subsidiary company of          |
+   |     Perforce Software, Inc., and Contributors.                       |
    +----------------------------------------------------------------------+
-   | This source file is subject to version 2.00 of the Zend license,     |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | http://www.zend.com/license/2_00.txt.                                |
-   | If you did not receive a copy of the Zend license and are unable to  |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@zend.com so we can mail you a copy immediately.              |
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Authors: Andi Gutmans                                  |
    |          Zeev Suraski                                  |
diff --git a/Zend/zend_llist.c b/Zend/zend_llist.c
index 28a275e6fce7..95ce31764bfc 100644
--- a/Zend/zend_llist.c
+++ b/Zend/zend_llist.c
@@ -2,15 +2,14 @@
    +----------------------------------------------------------------------+
    | Zend Engine                                                          |
    +----------------------------------------------------------------------+
-   | Copyright (c) Zend Technologies Ltd. (http://www.zend.com)           |
+   | Copyright © Zend Technologies Ltd., a subsidiary company of          |
+   |     Perforce Software, Inc., and Contributors.                       |
    +----------------------------------------------------------------------+
-   | This source file is subject to version 2.00 of the Zend license,     |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | http://www.zend.com/license/2_00.txt.                                |
-   | If you did not receive a copy of the Zend license and are unable to  |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@zend.com so we can mail you a copy immediately.              |
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Authors: Andi Gutmans                                  |
    |          Zeev Suraski                                  |
diff --git a/Zend/zend_llist.h b/Zend/zend_llist.h
index 848543eba0a6..a92b8a59648c 100644
--- a/Zend/zend_llist.h
+++ b/Zend/zend_llist.h
@@ -2,15 +2,14 @@
    +----------------------------------------------------------------------+
    | Zend Engine                                                          |
    +----------------------------------------------------------------------+
-   | Copyright (c) Zend Technologies Ltd. (http://www.zend.com)           |
+   | Copyright © Zend Technologies Ltd., a subsidiary company of          |
+   |     Perforce Software, Inc., and Contributors.                       |
    +----------------------------------------------------------------------+
-   | This source file is subject to version 2.00 of the Zend license,     |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | http://www.zend.com/license/2_00.txt.                                |
-   | If you did not receive a copy of the Zend license and are unable to  |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@zend.com so we can mail you a copy immediately.              |
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Authors: Andi Gutmans                                  |
    |          Zeev Suraski                                  |
diff --git a/Zend/zend_long.h b/Zend/zend_long.h
index fef237701f3b..303bacd03d4c 100644
--- a/Zend/zend_long.h
+++ b/Zend/zend_long.h
@@ -2,15 +2,14 @@
    +----------------------------------------------------------------------+
    | Zend Engine                                                          |
    +----------------------------------------------------------------------+
-   | Copyright (c) Zend Technologies Ltd. (http://www.zend.com)           |
+   | Copyright © Zend Technologies Ltd., a subsidiary company of          |
+   |     Perforce Software, Inc., and Contributors.                       |
    +----------------------------------------------------------------------+
-   | This source file is subject to version 2.00 of the Zend license,     |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | http://www.zend.com/license/2_00.txt.                                |
-   | If you did not receive a copy of the Zend license and are unable to  |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@zend.com so we can mail you a copy immediately.              |
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Authors: Anatol Belski                                   |
    +----------------------------------------------------------------------+
diff --git a/Zend/zend_map_ptr.h b/Zend/zend_map_ptr.h
index 4dfa0e5043ef..af3b5178aa4a 100644
--- a/Zend/zend_map_ptr.h
+++ b/Zend/zend_map_ptr.h
@@ -2,15 +2,14 @@
    +----------------------------------------------------------------------+
    | Zend Engine                                                          |
    +----------------------------------------------------------------------+
-   | Copyright (c) Zend Technologies Ltd. (http://www.zend.com)           |
+   | Copyright © Zend Technologies Ltd., a subsidiary company of          |
+   |     Perforce Software, Inc., and Contributors.                       |
    +----------------------------------------------------------------------+
-   | This source file is subject to version 2.00 of the Zend license,     |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | http://www.zend.com/license/2_00.txt.                                |
-   | If you did not receive a copy of the Zend license and are unable to  |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@zend.com so we can mail you a copy immediately.              |
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Authors: Dmitry Stogov                               |
    +----------------------------------------------------------------------+
diff --git a/Zend/zend_max_execution_timer.c b/Zend/zend_max_execution_timer.c
index 005ce14868a0..5d0eb1219c0b 100644
--- a/Zend/zend_max_execution_timer.c
+++ b/Zend/zend_max_execution_timer.c
@@ -1,14 +1,12 @@
 /*
    +----------------------------------------------------------------------+
-   | Copyright (c) The PHP Group                                          |
+   | Copyright © The PHP Group and Contributors.                          |
    +----------------------------------------------------------------------+
-   | This source file is subject to version 3.01 of the PHP license,      |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | https://www.php.net/license/3_01.txt                                 |
-   | If you did not receive a copy of the PHP license and are unable to   |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@php.net so we can mail you a copy immediately.               |
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Author: Kévin Dunglas                             |
    +----------------------------------------------------------------------+
diff --git a/Zend/zend_max_execution_timer.h b/Zend/zend_max_execution_timer.h
index 6557d6c91845..3839ea4cf676 100644
--- a/Zend/zend_max_execution_timer.h
+++ b/Zend/zend_max_execution_timer.h
@@ -1,14 +1,12 @@
 /*
    +----------------------------------------------------------------------+
-   | Copyright (c) The PHP Group                                          |
+   | Copyright © The PHP Group and Contributors.                          |
    +----------------------------------------------------------------------+
-   | This source file is subject to version 3.01 of the PHP license,      |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | https://www.php.net/license/3_01.txt                                 |
-   | If you did not receive a copy of the PHP license and are unable to   |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@php.net so we can mail you a copy immediately.               |
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Author: Kévin Dunglas                             |
    +----------------------------------------------------------------------+
diff --git a/Zend/zend_mmap.h b/Zend/zend_mmap.h
index 201fd84d074d..d56196c24687 100644
--- a/Zend/zend_mmap.h
+++ b/Zend/zend_mmap.h
@@ -1,12 +1,15 @@
 /*
    +----------------------------------------------------------------------+
-   | This source file is subject to version 2.00 of the Zend license,     |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | http://www.zend.com/license/2_00.txt.                                |
-   | If you did not receive a copy of the Zend license and are unable to  |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@zend.com so we can mail you a copy immediately.              |
+   | Zend Engine                                                          |
+   +----------------------------------------------------------------------+
+   | Copyright © Zend Technologies Ltd., a subsidiary company of          |
+   |     Perforce Software, Inc., and Contributors.                       |
+   +----------------------------------------------------------------------+
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Authors: Max Kellermann                    |
    +----------------------------------------------------------------------+
diff --git a/Zend/zend_modules.h b/Zend/zend_modules.h
index a8076c0fb905..3a98b1c06e29 100644
--- a/Zend/zend_modules.h
+++ b/Zend/zend_modules.h
@@ -2,15 +2,14 @@
    +----------------------------------------------------------------------+
    | Zend Engine                                                          |
    +----------------------------------------------------------------------+
-   | Copyright (c) Zend Technologies Ltd. (http://www.zend.com)           |
+   | Copyright © Zend Technologies Ltd., a subsidiary company of          |
+   |     Perforce Software, Inc., and Contributors.                       |
    +----------------------------------------------------------------------+
-   | This source file is subject to version 2.00 of the Zend license,     |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | http://www.zend.com/license/2_00.txt.                                |
-   | If you did not receive a copy of the Zend license and are unable to  |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@zend.com so we can mail you a copy immediately.              |
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Authors: Andi Gutmans                                  |
    |          Zeev Suraski                                  |
diff --git a/Zend/zend_multibyte.c b/Zend/zend_multibyte.c
index f61ed79fd1f7..28be8126b117 100644
--- a/Zend/zend_multibyte.c
+++ b/Zend/zend_multibyte.c
@@ -2,15 +2,14 @@
    +----------------------------------------------------------------------+
    | Zend Engine                                                          |
    +----------------------------------------------------------------------+
-   | Copyright (c) Zend Technologies Ltd. (http://www.zend.com)           |
+   | Copyright © Zend Technologies Ltd., a subsidiary company of          |
+   |     Perforce Software, Inc., and Contributors.                       |
    +----------------------------------------------------------------------+
-   | This source file is subject to version 2.00 of the Zend license,     |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at                              |
-   | http://www.zend.com/license/2_00.txt.                                |
-   | If you did not receive a copy of the Zend license and are unable to  |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@zend.com so we can mail you a copy immediately.              |
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Authors: Masaki Fujimoto                           |
    |          Rui Hirokawa                              |
@@ -114,8 +113,8 @@ ZEND_API zend_result zend_multibyte_set_functions(const zend_multibyte_functions
 	 * populated, we need to reinitialize script_encoding here.
 	 */
 	{
-		const char *value = zend_ini_string("zend.script_encoding", sizeof("zend.script_encoding") - 1, 0);
-		zend_multibyte_set_script_encoding_by_string(value, strlen(value));
+		const zend_string *value = zend_ini_str_literal("zend.script_encoding");
+		zend_multibyte_set_script_encoding_by_string(ZSTR_VAL(value), ZSTR_LEN(value));
 	}
 	return SUCCESS;
 }
diff --git a/Zend/zend_multibyte.h b/Zend/zend_multibyte.h
index 16ba56ec69fd..41480ed6f86b 100644
--- a/Zend/zend_multibyte.h
+++ b/Zend/zend_multibyte.h
@@ -2,15 +2,14 @@
    +----------------------------------------------------------------------+
    | Zend Engine                                                          |
    +----------------------------------------------------------------------+
-   | Copyright (c) Zend Technologies Ltd. (http://www.zend.com)           |
+   | Copyright © Zend Technologies Ltd., a subsidiary company of          |
+   |     Perforce Software, Inc., and Contributors.                       |
    +----------------------------------------------------------------------+
-   | This source file is subject to version 2.00 of the Zend license,     |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at                              |
-   | http://www.zend.com/license/2_00.txt.                                |
-   | If you did not receive a copy of the Zend license and are unable to  |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@zend.com so we can mail you a copy immediately.              |
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Authors: Masaki Fujimoto                           |
    |          Rui Hirokawa                              |
diff --git a/Zend/zend_multiply.h b/Zend/zend_multiply.h
index 716e3ba4b571..6457f85f64fb 100644
--- a/Zend/zend_multiply.h
+++ b/Zend/zend_multiply.h
@@ -2,15 +2,14 @@
    +----------------------------------------------------------------------+
    | Zend Engine                                                          |
    +----------------------------------------------------------------------+
-   | Copyright (c) Zend Technologies Ltd. (http://www.zend.com)           |
+   | Copyright © Zend Technologies Ltd., a subsidiary company of          |
+   |     Perforce Software, Inc., and Contributors.                       |
    +----------------------------------------------------------------------+
-   | This source file is subject to version 2.00 of the Zend license,     |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | http://www.zend.com/license/2_00.txt.                                |
-   | If you did not receive a copy of the Zend license and are unable to  |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@zend.com so we can mail you a copy immediately.              |
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Authors: Sascha Schumann                         |
    |          Ard Biesheuvel                   |
diff --git a/Zend/zend_object_handlers.c b/Zend/zend_object_handlers.c
index 45eac02949d1..9e993627a74a 100644
--- a/Zend/zend_object_handlers.c
+++ b/Zend/zend_object_handlers.c
@@ -2,15 +2,14 @@
    +----------------------------------------------------------------------+
    | Zend Engine                                                          |
    +----------------------------------------------------------------------+
-   | Copyright (c) Zend Technologies Ltd. (http://www.zend.com)           |
+   | Copyright © Zend Technologies Ltd., a subsidiary company of          |
+   |     Perforce Software, Inc., and Contributors.                       |
    +----------------------------------------------------------------------+
-   | This source file is subject to version 2.00 of the Zend license,     |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | http://www.zend.com/license/2_00.txt.                                |
-   | If you did not receive a copy of the Zend license and are unable to  |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@zend.com so we can mail you a copy immediately.              |
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Authors: Andi Gutmans                                  |
    |          Zeev Suraski                                  |
@@ -893,6 +892,28 @@ ZEND_API zval *zend_std_read_property(zend_object *zobj, zend_string *name, int
 
 	retval = &EG(uninitialized_zval);
 
+	/* For initialized lazy proxies: if the real instance's magic method
+	 * guard is already set for this property, we are inside a recursive
+	 * call from the real instance's __get/__isset. Forward directly to
+	 * the real instance to avoid double invocation. (GH-21478) */
+	if (UNEXPECTED(zend_object_is_lazy_proxy(zobj)
+			&& zend_lazy_object_initialized(zobj))) {
+		zend_object *instance = zend_lazy_object_get_instance(zobj);
+		if (instance->ce->ce_flags & ZEND_ACC_USE_GUARDS) {
+			uint32_t *instance_guard = zend_get_property_guard(instance, name);
+			uint32_t guard_type = ((type == BP_VAR_IS) && zobj->ce->__isset)
+				? IN_ISSET : IN_GET;
+			if ((*instance_guard) & guard_type) {
+				retval = zend_std_read_property(instance, name, type, cache_slot, rv);
+				if (retval == &EG(uninitialized_zval)) {
+					ZVAL_NULL(rv);
+					retval = rv;
+				}
+				return retval;
+			}
+		}
+	}
+
 	/* magic isset */
 	if ((type == BP_VAR_IS) && zobj->ce->__isset) {
 		zval tmp_result;
@@ -1209,6 +1230,20 @@ found:;
 		goto exit;
 	}
 
+	/* For initialized lazy proxies: if the real instance's __set guard
+	 * is already set, we are inside a recursive call from the real
+	 * instance's __set. Forward directly to avoid double invocation. */
+	if (UNEXPECTED(zend_object_is_lazy_proxy(zobj)
+			&& zend_lazy_object_initialized(zobj))) {
+		zend_object *instance = zend_lazy_object_get_instance(zobj);
+		if (instance->ce->ce_flags & ZEND_ACC_USE_GUARDS) {
+			uint32_t *instance_guard = zend_get_property_guard(instance, name);
+			if ((*instance_guard) & IN_SET) {
+				return zend_std_write_property(instance, name, value, cache_slot);
+			}
+		}
+	}
+
 	/* magic set */
 	if (zobj->ce->__set) {
 		if (!guard) {
@@ -1409,12 +1444,24 @@ ZEND_API zval *zend_std_get_property_ptr_ptr(zend_object *zobj, zend_string *nam
 			    UNEXPECTED((*zend_get_property_guard(zobj, name)) & IN_GET) ||
 			    UNEXPECTED(prop_info && (Z_PROP_FLAG_P(retval) & IS_PROP_UNINIT))) {
 				if (UNEXPECTED(zend_lazy_object_must_init(zobj) && (Z_PROP_FLAG_P(retval) & IS_PROP_LAZY))) {
-					zobj = zend_lazy_object_init(zobj);
-					if (!zobj) {
+					bool guarded = zobj->ce->__get
+						&& (*zend_get_property_guard(zobj, name) & IN_GET);
+					zend_object *instance = zend_lazy_object_init(zobj);
+					if (!instance) {
 						return &EG(error_zval);
 					}
 
-					return zend_std_get_property_ptr_ptr(zobj, name, type, cache_slot);
+					if (guarded && (instance->ce->ce_flags & ZEND_ACC_USE_GUARDS)) {
+						uint32_t *guard = zend_get_property_guard(instance, name);
+						if (!(*guard & IN_GET)) {
+							(*guard) |= IN_GET;
+							retval = zend_std_get_property_ptr_ptr(instance, name, type, cache_slot);
+							(*guard) &= ~IN_GET;
+							return retval;
+						}
+					}
+
+					return zend_std_get_property_ptr_ptr(instance, name, type, cache_slot);
 				}
 				if (UNEXPECTED(type == BP_VAR_RW)) {
 					if (prop_info) {
@@ -1457,6 +1504,25 @@ ZEND_API zval *zend_std_get_property_ptr_ptr(zend_object *zobj, zend_string *nam
 		}
 		if (EXPECTED(!zobj->ce->__get) ||
 		    UNEXPECTED((*zend_get_property_guard(zobj, name)) & IN_GET)) {
+			if (UNEXPECTED(zend_lazy_object_must_init(zobj))) {
+				bool guarded = (zobj->ce->__get != NULL);
+				zend_object *instance = zend_lazy_object_init(zobj);
+				if (!instance) {
+					return &EG(error_zval);
+				}
+
+				if (guarded && (instance->ce->ce_flags & ZEND_ACC_USE_GUARDS)) {
+					uint32_t *guard = zend_get_property_guard(instance, name);
+					if (!(*guard & IN_GET)) {
+						(*guard) |= IN_GET;
+						retval = zend_std_get_property_ptr_ptr(instance, name, type, cache_slot);
+						(*guard) &= ~IN_GET;
+						return retval;
+					}
+				}
+
+				return zend_std_get_property_ptr_ptr(instance, name, type, cache_slot);
+			}
 			if (UNEXPECTED(zobj->ce->ce_flags & ZEND_ACC_NO_DYNAMIC_PROPERTIES)) {
 				zend_forbidden_dynamic_property(zobj->ce, name);
 				return &EG(error_zval);
@@ -1466,14 +1532,6 @@ ZEND_API zval *zend_std_get_property_ptr_ptr(zend_object *zobj, zend_string *nam
 					return &EG(error_zval);
 				}
 			}
-			if (UNEXPECTED(zend_lazy_object_must_init(zobj))) {
-				zobj = zend_lazy_object_init(zobj);
-				if (!zobj) {
-					return &EG(error_zval);
-				}
-
-				return zend_std_get_property_ptr_ptr(zobj, name, type, cache_slot);
-			}
 			if (UNEXPECTED(!zobj->properties)) {
 				rebuild_object_properties_internal(zobj);
 			}
@@ -1580,6 +1638,21 @@ ZEND_API void zend_std_unset_property(zend_object *zobj, zend_string *name, void
 		return;
 	}
 
+	/* For initialized lazy proxies: if the real instance's __unset guard
+	 * is already set, we are inside a recursive call from the real
+	 * instance's __unset. Forward directly to avoid double invocation. */
+	if (UNEXPECTED(zend_object_is_lazy_proxy(zobj)
+			&& zend_lazy_object_initialized(zobj))) {
+		zend_object *instance = zend_lazy_object_get_instance(zobj);
+		if (instance->ce->ce_flags & ZEND_ACC_USE_GUARDS) {
+			uint32_t *instance_guard = zend_get_property_guard(instance, name);
+			if ((*instance_guard) & IN_UNSET) {
+				zend_std_unset_property(instance, name, cache_slot);
+				return;
+			}
+		}
+	}
+
 	/* magic unset */
 	if (zobj->ce->__unset) {
 		if (!guard) {
@@ -1587,9 +1660,11 @@ ZEND_API void zend_std_unset_property(zend_object *zobj, zend_string *name, void
 		}
 		if (!((*guard) & IN_UNSET)) {
 			/* have unsetter - try with it! */
+			GC_ADDREF(zobj);
 			(*guard) |= IN_UNSET; /* prevent circular unsetting */
 			zend_std_call_unsetter(zobj, name);
 			(*guard) &= ~IN_UNSET;
+			OBJ_RELEASE(zobj);
 			return;
 		} else if (UNEXPECTED(IS_WRONG_PROPERTY_OFFSET(property_offset))) {
 			/* Trigger the correct error */
@@ -1750,6 +1825,18 @@ ZEND_API ZEND_ATTRIBUTE_NONNULL zend_function *zend_get_call_trampoline_func(
 }
 /* }}} */
 
+ZEND_API void zend_free_trampoline(zend_function *func)
+{
+	ZEND_ASSERT(func->common.fn_flags & ZEND_ACC_CALL_VIA_TRAMPOLINE);
+
+	if (func == &EG(trampoline)) {
+		EG(trampoline).common.attributes = NULL;
+		EG(trampoline).common.function_name = NULL;
+	} else {
+		efree(func);
+	}
+}
+
 static ZEND_FUNCTION(zend_parent_hook_get_trampoline)
 {
 	zend_object *obj = Z_PTR_P(ZEND_THIS);
@@ -2101,12 +2188,16 @@ ZEND_API ZEND_COLD bool zend_std_unset_static_property(const zend_class_entry *c
 static ZEND_COLD zend_never_inline void zend_bad_constructor_call(const zend_function *constructor, const zend_class_entry *scope) /* {{{ */
 {
 	if (scope) {
-		zend_throw_error(NULL, "Call to %s %s::%s() from scope %s",
-			zend_visibility_string(constructor->common.fn_flags), ZSTR_VAL(constructor->common.scope->name),
-			ZSTR_VAL(constructor->common.function_name), ZSTR_VAL(scope->name)
+		zend_throw_error(NULL, "Call to %s %s::__construct() from scope %s",
+			zend_visibility_string(constructor->common.fn_flags),
+			ZSTR_VAL(constructor->common.scope->name),
+			ZSTR_VAL(scope->name)
 		);
 	} else {
-		zend_throw_error(NULL, "Call to %s %s::%s() from global scope", zend_visibility_string(constructor->common.fn_flags), ZSTR_VAL(constructor->common.scope->name), ZSTR_VAL(constructor->common.function_name));
+		zend_throw_error(NULL, "Call to %s %s::__construct() from global scope",
+			zend_visibility_string(constructor->common.fn_flags),
+			ZSTR_VAL(constructor->common.scope->name)
+		);
 	}
 }
 /* }}} */
@@ -2376,6 +2467,20 @@ ZEND_API int zend_std_has_property(zend_object *zobj, zend_string *name, int has
 		goto exit;
 	}
 
+	/* For initialized lazy proxies: if the real instance's __isset guard
+	 * is already set, we are inside a recursive call from the real
+	 * instance's __isset. Forward directly to avoid double invocation. */
+	if (UNEXPECTED(zend_object_is_lazy_proxy(zobj)
+			&& zend_lazy_object_initialized(zobj))) {
+		zend_object *instance = zend_lazy_object_get_instance(zobj);
+		if (instance->ce->ce_flags & ZEND_ACC_USE_GUARDS) {
+			uint32_t *instance_guard = zend_get_property_guard(instance, name);
+			if ((*instance_guard) & IN_ISSET) {
+				return zend_std_has_property(instance, name, has_set_exists, cache_slot);
+			}
+		}
+	}
+
 	if (!zobj->ce->__isset) {
 		goto lazy_init;
 	}
diff --git a/Zend/zend_object_handlers.h b/Zend/zend_object_handlers.h
index 3e922343eb15..8ed4803c3f0e 100644
--- a/Zend/zend_object_handlers.h
+++ b/Zend/zend_object_handlers.h
@@ -2,15 +2,14 @@
    +----------------------------------------------------------------------+
    | Zend Engine                                                          |
    +----------------------------------------------------------------------+
-   | Copyright (c) Zend Technologies Ltd. (http://www.zend.com)           |
+   | Copyright © Zend Technologies Ltd., a subsidiary company of          |
+   |     Perforce Software, Inc., and Contributors.                       |
    +----------------------------------------------------------------------+
-   | This source file is subject to version 2.00 of the Zend license,     |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | http://www.zend.com/license/2_00.txt.                                |
-   | If you did not receive a copy of the Zend license and are unable to  |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@zend.com so we can mail you a copy immediately.              |
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Authors: Andi Gutmans                                  |
    |          Zeev Suraski                                  |
@@ -205,7 +204,7 @@ typedef zend_result (*zend_object_do_operation_t)(uint8_t opcode, zval *result,
 
 struct _zend_object_handlers {
 	/* offset of real object header (usually zero) */
-	int										offset;
+	size_t										offset;
 	/* object handlers */
 	zend_object_free_obj_t					free_obj;             /* required */
 	zend_object_dtor_obj_t					dtor_obj;             /* required */
@@ -237,11 +236,10 @@ struct _zend_object_handlers {
 BEGIN_EXTERN_C()
 extern const ZEND_API zend_object_handlers std_object_handlers;
 
-#define zend_get_std_object_handlers() \
-	(&std_object_handlers)
-
-#define zend_get_function_root_class(fbc) \
-	((fbc)->common.prototype ? (fbc)->common.prototype->common.scope : (fbc)->common.scope)
+static zend_always_inline const zend_object_handlers *zend_get_std_object_handlers(void)
+{
+	return &std_object_handlers;
+}
 
 #define ZEND_PROPERTY_ISSET     0x0          /* Property exists and is not NULL */
 #define ZEND_PROPERTY_NOT_EMPTY ZEND_ISEMPTY /* Property is not empty */
@@ -291,18 +289,20 @@ static zend_always_inline HashTable *zend_std_get_properties_ex(zend_object *obj
 /* Implements the fast path for array cast */
 ZEND_API HashTable *zend_std_build_object_properties_array(zend_object *zobj);
 
-#define ZEND_STD_BUILD_OBJECT_PROPERTIES_ARRAY_COMPATIBLE(object) (            \
-		/* We can use zend_std_build_object_properties_array() for objects     \
-		 * without properties ht and with standard handlers */                 \
-		Z_OBJ_P(object)->properties == NULL                                    \
-		&& Z_OBJ_HT_P(object)->get_properties_for == NULL                      \
-		&& Z_OBJ_HT_P(object)->get_properties == zend_std_get_properties       \
-		/* For initialized proxies we need to forward to the real instance */  \
-		&& (                                                                   \
-			!zend_object_is_lazy_proxy(Z_OBJ_P(object))                        \
-			|| !zend_lazy_object_initialized(Z_OBJ_P(object))                  \
-		)                                                                      \
-)
+static zend_always_inline bool ZEND_STD_BUILD_OBJECT_PROPERTIES_ARRAY_COMPATIBLE(const zval *zv) {
+	/* We can use zend_std_build_object_properties_array() for objects
+	 * without properties ht and with standard handlers */
+	const zend_object *obj = Z_OBJ_P(zv);
+
+	return obj->properties == NULL
+		&& obj->handlers->get_properties_for == NULL
+		&& obj->handlers->get_properties == zend_std_get_properties
+		/* For initialized proxies we need to forward to the real instance */
+		&& (
+			!zend_object_is_lazy_proxy(obj)
+			|| !zend_lazy_object_initialized(obj)
+		);
+}
 
 /* Handler for objects that cannot be meaningfully compared.
  * Only objects with the same identity will be considered equal. */
@@ -313,6 +313,7 @@ ZEND_API bool zend_check_protected(const zend_class_entry *ce, const zend_class_
 ZEND_API zend_result zend_check_property_access(const zend_object *zobj, zend_string *prop_info_name, bool is_dynamic);
 
 ZEND_API ZEND_ATTRIBUTE_NONNULL zend_function *zend_get_call_trampoline_func(const zend_function *fbc, zend_string *method_name);
+ZEND_API void zend_free_trampoline(zend_function *func);
 
 ZEND_API uint32_t *zend_get_property_guard(zend_object *zobj, zend_string *member);
 
@@ -336,20 +337,12 @@ ZEND_API bool ZEND_FASTCALL zend_asymmetric_property_has_set_access(const zend_p
 
 void zend_object_handlers_startup(void);
 
-#define zend_release_properties(ht) do { \
-	if (ht) { \
-		zend_array_release(ht); \
-	} \
-} while (0)
-
-#define zend_free_trampoline(func) do { \
-		if ((func) == &EG(trampoline)) { \
-			EG(trampoline).common.attributes = NULL; \
-			EG(trampoline).common.function_name = NULL; \
-		} else { \
-			efree(func); \
-		} \
-	} while (0)
+static zend_always_inline void zend_release_properties(HashTable *ht)
+{
+	if (ht) {
+		zend_array_release(ht);
+	}
+}
 
 /* Fallback to default comparison implementation if the arguments aren't both objects
  * and have the same compare() handler. You'll likely want to use this unless you
diff --git a/Zend/zend_objects.c b/Zend/zend_objects.c
index 6f6a82638944..2fc264742cd1 100644
--- a/Zend/zend_objects.c
+++ b/Zend/zend_objects.c
@@ -2,15 +2,14 @@
    +----------------------------------------------------------------------+
    | Zend Engine                                                          |
    +----------------------------------------------------------------------+
-   | Copyright (c) Zend Technologies Ltd. (http://www.zend.com)           |
+   | Copyright © Zend Technologies Ltd., a subsidiary company of          |
+   |     Perforce Software, Inc., and Contributors.                       |
    +----------------------------------------------------------------------+
-   | This source file is subject to version 2.00 of the Zend license,     |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | http://www.zend.com/license/2_00.txt.                                |
-   | If you did not receive a copy of the Zend license and are unable to  |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@zend.com so we can mail you a copy immediately.              |
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Authors: Andi Gutmans                                  |
    |          Zeev Suraski                                  |
@@ -194,14 +193,14 @@ ZEND_API zend_object* ZEND_FASTCALL zend_objects_new(zend_class_entry *ce)
 	return object;
 }
 
-ZEND_API void ZEND_FASTCALL zend_objects_clone_members(zend_object *new_object, zend_object *old_object)
+ZEND_API void ZEND_FASTCALL zend_objects_clone_members(zend_object *new_object, const zend_object *old_object)
 {
 	bool has_clone_method = old_object->ce->clone != NULL;
 
 	if (old_object->ce->default_properties_count) {
-		zval *src = old_object->properties_table;
+		const zval *src = old_object->properties_table;
 		zval *dst = new_object->properties_table;
-		zval *end = src + old_object->ce->default_properties_count;
+		const zval *end = src + old_object->ce->default_properties_count;
 
 		do {
 			i_zval_ptr_dtor(dst);
diff --git a/Zend/zend_objects.h b/Zend/zend_objects.h
index 712fd442da5a..0930fa043101 100644
--- a/Zend/zend_objects.h
+++ b/Zend/zend_objects.h
@@ -2,15 +2,14 @@
    +----------------------------------------------------------------------+
    | Zend Engine                                                          |
    +----------------------------------------------------------------------+
-   | Copyright (c) Zend Technologies Ltd. (http://www.zend.com)           |
+   | Copyright © Zend Technologies Ltd., a subsidiary company of          |
+   |     Perforce Software, Inc., and Contributors.                       |
    +----------------------------------------------------------------------+
-   | This source file is subject to version 2.00 of the Zend license,     |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | http://www.zend.com/license/2_00.txt.                                |
-   | If you did not receive a copy of the Zend license and are unable to  |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@zend.com so we can mail you a copy immediately.              |
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Authors: Andi Gutmans                                  |
    |          Zeev Suraski                                  |
@@ -25,7 +24,7 @@
 BEGIN_EXTERN_C()
 ZEND_API void ZEND_FASTCALL zend_object_std_init(zend_object *object, zend_class_entry *ce);
 ZEND_API zend_object* ZEND_FASTCALL zend_objects_new(zend_class_entry *ce);
-ZEND_API void ZEND_FASTCALL zend_objects_clone_members(zend_object *new_object, zend_object *old_object);
+ZEND_API void ZEND_FASTCALL zend_objects_clone_members(zend_object *new_object, const zend_object *old_object);
 
 ZEND_API void zend_object_std_dtor(zend_object *object);
 ZEND_API void zend_objects_destroy_object(zend_object *object);
diff --git a/Zend/zend_objects_API.c b/Zend/zend_objects_API.c
index c19873cf3be3..537cad8a3644 100644
--- a/Zend/zend_objects_API.c
+++ b/Zend/zend_objects_API.c
@@ -2,15 +2,14 @@
    +----------------------------------------------------------------------+
    | Zend Engine                                                          |
    +----------------------------------------------------------------------+
-   | Copyright (c) Zend Technologies Ltd. (http://www.zend.com)           |
+   | Copyright © Zend Technologies Ltd., a subsidiary company of          |
+   |     Perforce Software, Inc., and Contributors.                       |
    +----------------------------------------------------------------------+
-   | This source file is subject to version 2.00 of the Zend license,     |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | http://www.zend.com/license/2_00.txt.                                |
-   | If you did not receive a copy of the Zend license and are unable to  |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@zend.com so we can mail you a copy immediately.              |
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Authors: Andi Gutmans                                  |
    |          Zeev Suraski                                  |
@@ -44,8 +43,7 @@ ZEND_API void ZEND_FASTCALL zend_objects_store_call_destructors(zend_objects_sto
 {
 	EG(flags) |= EG_FLAGS_OBJECT_STORE_NO_REUSE;
 	if (objects->top > 1) {
-		uint32_t i;
-		for (i = 1; i < objects->top; i++) {
+		for (uint32_t i = 1; i < objects->top; i++) {
 			zend_object *obj = objects->object_buckets[i];
 			if (IS_OBJ_VALID(obj)) {
 				if (!(OBJ_FLAGS(obj) & IS_OBJ_DESTRUCTOR_CALLED)) {
@@ -128,20 +126,19 @@ ZEND_API void ZEND_FASTCALL zend_objects_store_free_object_storage(zend_objects_
 /* Store objects API */
 static ZEND_COLD zend_never_inline void ZEND_FASTCALL zend_objects_store_put_cold(zend_object *object)
 {
-	int handle;
 	uint32_t new_size = 2 * EG(objects_store).size;
 
 	EG(objects_store).object_buckets = (zend_object **) erealloc(EG(objects_store).object_buckets, new_size * sizeof(zend_object*));
 	/* Assign size after realloc, in case it fails */
 	EG(objects_store).size = new_size;
-	handle = EG(objects_store).top++;
+	uint32_t handle = EG(objects_store).top++;
 	object->handle = handle;
 	EG(objects_store).object_buckets[handle] = object;
 }
 
 ZEND_API void ZEND_FASTCALL zend_objects_store_put(zend_object *object)
 {
-	int handle;
+	uint32_t handle;
 
 	/* When in shutdown sequence - do not reuse previously freed handles, to make sure
 	 * the dtors for newly created objects are called in zend_objects_store_call_destructors() loop
diff --git a/Zend/zend_objects_API.h b/Zend/zend_objects_API.h
index 86c3a49f8c8c..434ac4499e7f 100644
--- a/Zend/zend_objects_API.h
+++ b/Zend/zend_objects_API.h
@@ -2,15 +2,14 @@
    +----------------------------------------------------------------------+
    | Zend Engine                                                          |
    +----------------------------------------------------------------------+
-   | Copyright (c) Zend Technologies Ltd. (http://www.zend.com)           |
+   | Copyright © Zend Technologies Ltd., a subsidiary company of          |
+   |     Perforce Software, Inc., and Contributors.                       |
    +----------------------------------------------------------------------+
-   | This source file is subject to version 2.00 of the Zend license,     |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | http://www.zend.com/license/2_00.txt.                                |
-   | If you did not receive a copy of the Zend license and are unable to  |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@zend.com so we can mail you a copy immediately.              |
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Authors: Andi Gutmans                                  |
    |          Zeev Suraski                                  |
@@ -80,7 +79,7 @@ static zend_always_inline void zend_object_release(zend_object *obj)
 	}
 }
 
-static zend_always_inline size_t zend_object_properties_size(zend_class_entry *ce)
+static zend_always_inline size_t zend_object_properties_size(const zend_class_entry *ce)
 {
 	return sizeof(zval) *
 		(ce->default_properties_count -
@@ -90,7 +89,7 @@ static zend_always_inline size_t zend_object_properties_size(zend_class_entry *c
 /* Allocates object type and zeros it, but not the standard zend_object and properties.
  * Standard object MUST be initialized using zend_object_std_init().
  * Properties MUST be initialized using object_properties_init(). */
-static zend_always_inline void *zend_object_alloc(size_t obj_size, zend_class_entry *ce) {
+static zend_always_inline void *zend_object_alloc(size_t obj_size, const zend_class_entry *ce) {
 	void *obj = emalloc(obj_size + zend_object_properties_size(ce));
 	memset(obj, 0, obj_size - sizeof(zend_object));
 	return obj;
@@ -137,6 +136,11 @@ static inline zend_property_info *zend_get_typed_property_info_for_slot(zend_obj
 	return NULL;
 }
 
+static zend_always_inline zend_class_entry *zend_get_function_root_class(const zend_function *fbc)
+{
+	return fbc->common.prototype ? fbc->common.prototype->common.scope : fbc->common.scope;
+}
+
 static zend_always_inline bool zend_check_method_accessible(const zend_function *fn, const zend_class_entry *scope)
 {
 	if (!(fn->common.fn_flags & ZEND_ACC_PUBLIC)
diff --git a/Zend/zend_observer.c b/Zend/zend_observer.c
index bee20bdbc20d..1cb4373f4c07 100644
--- a/Zend/zend_observer.c
+++ b/Zend/zend_observer.c
@@ -2,15 +2,14 @@
    +----------------------------------------------------------------------+
    | Zend Engine                                                          |
    +----------------------------------------------------------------------+
-   | Copyright (c) Zend Technologies Ltd. (http://www.zend.com)           |
+   | Copyright © Zend Technologies Ltd., a subsidiary company of          |
+   |     Perforce Software, Inc., and Contributors.                       |
    +----------------------------------------------------------------------+
-   | This source file is subject to version 2.00 of the Zend license,     |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | http://www.zend.com/license/2_00.txt.                                |
-   | If you did not receive a copy of the Zend license and are unable to  |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@zend.com so we can mail you a copy immediately.              |
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Authors: Levi Morrison                                |
    |          Sammy Kaye Powers                           |
@@ -168,7 +167,7 @@ static bool zend_observer_remove_handler(void **first_handler, const void *old_h
 				*next_handler = NULL;
 			} else {
 				if (cur_handler != last_handler) {
-					memmove(cur_handler, cur_handler + 1, sizeof(cur_handler) * (last_handler - cur_handler));
+					memmove(cur_handler, cur_handler + 1, sizeof(*cur_handler) * (last_handler - cur_handler));
 				}
 				*last_handler = NULL;
 				*next_handler = *cur_handler;
@@ -219,7 +218,7 @@ ZEND_API void zend_observer_add_end_handler(const zend_function *function, zend_
 	if (*end_handler != ZEND_OBSERVER_NOT_OBSERVED) {
 		// there's no space for new handlers, then it's forbidden to call this function
 		ZEND_ASSERT(end_handler[registered_observers - 1] == NULL);
-		memmove(end_handler + 1, end_handler, sizeof(end_handler) * (registered_observers - 1));
+		memmove(end_handler + 1, end_handler, sizeof(*end_handler) * (registered_observers - 1));
 	} else if (*begin_handler == ZEND_OBSERVER_NONE_OBSERVED) {
 		*begin_handler = ZEND_OBSERVER_NOT_OBSERVED;
 	}
diff --git a/Zend/zend_observer.h b/Zend/zend_observer.h
index cfec5200055a..bcfba35c0658 100644
--- a/Zend/zend_observer.h
+++ b/Zend/zend_observer.h
@@ -2,15 +2,14 @@
    +----------------------------------------------------------------------+
    | Zend Engine                                                          |
    +----------------------------------------------------------------------+
-   | Copyright (c) Zend Technologies Ltd. (http://www.zend.com)           |
+   | Copyright © Zend Technologies Ltd., a subsidiary company of          |
+   |     Perforce Software, Inc., and Contributors.                       |
    +----------------------------------------------------------------------+
-   | This source file is subject to version 2.00 of the Zend license,     |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | http://www.zend.com/license/2_00.txt.                                |
-   | If you did not receive a copy of the Zend license and are unable to  |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@zend.com so we can mail you a copy immediately.              |
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Authors: Levi Morrison                                |
    |          Sammy Kaye Powers                           |
@@ -33,8 +32,9 @@ extern ZEND_API bool zend_observer_errors_observed;
 extern ZEND_API bool zend_observer_function_declared_observed;
 extern ZEND_API bool zend_observer_class_linked_observed;
 
-#define ZEND_OBSERVER_HANDLE(function) (ZEND_USER_CODE((function)->type) \
-	? zend_observer_fcall_op_array_extension : zend_observer_fcall_internal_function_extension)
+static zend_always_inline int ZEND_OBSERVER_HANDLE(const zend_function *function) {
+	return ZEND_USER_CODE(function->common.type) ? zend_observer_fcall_op_array_extension : zend_observer_fcall_internal_function_extension;
+}
 
 #define ZEND_OBSERVER_DATA(function) \
 	((zend_observer_fcall_begin_handler *)&ZEND_OP_ARRAY_EXTENSION((&(function)->common), ZEND_OBSERVER_HANDLE(function)))
@@ -46,18 +46,6 @@ extern ZEND_API bool zend_observer_class_linked_observed;
 /* Omit zend_observer_fcall_internal_function_extension check, they are set at the same time. */
 #define ZEND_OBSERVER_ENABLED (zend_observer_fcall_op_array_extension != -1)
 
-#define ZEND_OBSERVER_FCALL_BEGIN(execute_data) do { \
-		if (ZEND_OBSERVER_ENABLED) { \
-			zend_observer_fcall_begin(execute_data); \
-		} \
-	} while (0)
-
-#define ZEND_OBSERVER_FCALL_END(execute_data, return_value) do { \
-		if (ZEND_OBSERVER_ENABLED) { \
-			zend_observer_fcall_end(execute_data, return_value); \
-		} \
-	} while (0)
-
 typedef void (*zend_observer_fcall_begin_handler)(zend_execute_data *execute_data);
 typedef void (*zend_observer_fcall_end_handler)(zend_execute_data *execute_data, zval *retval);
 
@@ -88,6 +76,12 @@ ZEND_API void ZEND_FASTCALL zend_observer_fcall_begin(zend_execute_data *execute
 /* prechecked: the call is actually observed. */
 ZEND_API void ZEND_FASTCALL zend_observer_fcall_begin_prechecked(zend_execute_data *execute_data, zend_observer_fcall_begin_handler *observer_data);
 
+static zend_always_inline void ZEND_OBSERVER_FCALL_BEGIN(zend_execute_data *execute_data) {
+	if (ZEND_OBSERVER_ENABLED) {
+		zend_observer_fcall_begin(execute_data);
+	}
+}
+
 static zend_always_inline bool zend_observer_handler_is_unobserved(const zend_observer_fcall_begin_handler *handler) {
 	return *handler == ZEND_OBSERVER_NONE_OBSERVED;
 }
@@ -127,6 +121,12 @@ static zend_always_inline void zend_observer_fcall_end(zend_execute_data *execut
 	}
 }
 
+static zend_always_inline void ZEND_OBSERVER_FCALL_END(zend_execute_data *execute_data, zval *return_value) {
+	if (ZEND_OBSERVER_ENABLED) {
+		zend_observer_fcall_end(execute_data, return_value);
+	}
+}
+
 ZEND_API void zend_observer_fcall_end_all(void);
 
 typedef void (*zend_observer_function_declared_cb)(zend_op_array *op_array, zend_string *name);
diff --git a/Zend/zend_opcode.c b/Zend/zend_opcode.c
index 24b480ad71e6..538eff3ea34d 100644
--- a/Zend/zend_opcode.c
+++ b/Zend/zend_opcode.c
@@ -2,15 +2,14 @@
    +----------------------------------------------------------------------+
    | Zend Engine                                                          |
    +----------------------------------------------------------------------+
-   | Copyright (c) Zend Technologies Ltd. (http://www.zend.com)           |
+   | Copyright © Zend Technologies Ltd., a subsidiary company of          |
+   |     Perforce Software, Inc., and Contributors.                       |
    +----------------------------------------------------------------------+
-   | This source file is subject to version 2.00 of the Zend license,     |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | http://www.zend.com/license/2_00.txt.                                |
-   | If you did not receive a copy of the Zend license and are unable to  |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@zend.com so we can mail you a copy immediately.              |
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Authors: Andi Gutmans                                  |
    |          Zeev Suraski                                  |
@@ -648,6 +647,9 @@ ZEND_API void destroy_op_array(zend_op_array *op_array)
 			if (arg_info[i].name) {
 				zend_string_release_ex(arg_info[i].name, 0);
 			}
+			if (arg_info[i].doc_comment) {
+				zend_string_release_ex(arg_info[i].doc_comment, 0);
+			}
 			zend_type_release(arg_info[i].type, /* persistent */ false);
 		}
 		efree(arg_info);
@@ -696,6 +698,10 @@ static void zend_extension_op_array_handler(zend_extension *extension, zend_op_a
 static void zend_check_finally_breakout(zend_op_array *op_array, uint32_t op_num, uint32_t dst_num)
 {
 	for (uint32_t i = 0; i < op_array->last_try_catch; i++) {
+		if (!op_array->try_catch_array[i].finally_op) {
+			continue;
+		}
+
 		if ((op_num < op_array->try_catch_array[i].finally_op ||
 					op_num >= op_array->try_catch_array[i].finally_end)
 				&& (dst_num >= op_array->try_catch_array[i].finally_op &&
diff --git a/Zend/zend_operators.c b/Zend/zend_operators.c
index 571494088e33..ab8f2c2b54f8 100644
--- a/Zend/zend_operators.c
+++ b/Zend/zend_operators.c
@@ -2,15 +2,14 @@
    +----------------------------------------------------------------------+
    | Zend Engine                                                          |
    +----------------------------------------------------------------------+
-   | Copyright (c) Zend Technologies Ltd. (http://www.zend.com)           |
+   | Copyright © Zend Technologies Ltd., a subsidiary company of          |
+   |     Perforce Software, Inc., and Contributors.                       |
    +----------------------------------------------------------------------+
-   | This source file is subject to version 2.00 of the Zend license,     |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | http://www.zend.com/license/2_00.txt.                                |
-   | If you did not receive a copy of the Zend license and are unable to  |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@zend.com so we can mail you a copy immediately.              |
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Authors: Andi Gutmans                                  |
    |          Zeev Suraski                                  |
@@ -359,7 +358,7 @@ static zend_never_inline zend_result ZEND_FASTCALL _zendi_try_convert_scalar_to_
 		case IS_RESOURCE:
 		case IS_ARRAY:
 			return FAILURE;
-		EMPTY_SWITCH_DEFAULT_CASE()
+		default: ZEND_UNREACHABLE();
 	}
 }
 /* }}} */
@@ -449,6 +448,7 @@ static zend_never_inline zend_long ZEND_FASTCALL zendi_try_get_long(const zval *
 				ZEND_ASSERT(Z_TYPE(dst) == IS_LONG);
 				return Z_LVAL(dst);
 			}
+		case IS_UNDEF:
 		case IS_RESOURCE:
 		case IS_ARRAY:
 			*failed = true;
@@ -461,7 +461,7 @@ static zend_never_inline zend_long ZEND_FASTCALL zendi_try_get_long(const zval *
 				goto try_again;
 			}
 			break;
-		EMPTY_SWITCH_DEFAULT_CASE()
+		default: ZEND_UNREACHABLE();
 	}
 }
 /* }}} */
@@ -606,7 +606,7 @@ ZEND_API void ZEND_FASTCALL convert_to_long(zval *op) /* {{{ */
 		case IS_REFERENCE:
 			zend_unwrap_reference(op);
 			goto try_again;
-		EMPTY_SWITCH_DEFAULT_CASE()
+		default: ZEND_UNREACHABLE();
 	}
 }
 /* }}} */
@@ -665,7 +665,7 @@ ZEND_API void ZEND_FASTCALL convert_to_double(zval *op) /* {{{ */
 		case IS_REFERENCE:
 			zend_unwrap_reference(op);
 			goto try_again;
-		EMPTY_SWITCH_DEFAULT_CASE()
+		default: ZEND_UNREACHABLE();
 	}
 }
 /* }}} */
@@ -747,7 +747,7 @@ ZEND_API void ZEND_FASTCALL convert_to_boolean(zval *op) /* {{{ */
 		case IS_REFERENCE:
 			zend_unwrap_reference(op);
 			goto try_again;
-		EMPTY_SWITCH_DEFAULT_CASE()
+		default: ZEND_UNREACHABLE();
 	}
 }
 /* }}} */
@@ -805,7 +805,7 @@ ZEND_API void ZEND_FASTCALL _convert_to_string(zval *op) /* {{{ */
 		case IS_REFERENCE:
 			zend_unwrap_reference(op);
 			goto try_again;
-		EMPTY_SWITCH_DEFAULT_CASE()
+		default: ZEND_UNREACHABLE();
 	}
 }
 /* }}} */
@@ -1014,7 +1014,7 @@ ZEND_API zend_long ZEND_FASTCALL zval_get_long_func(const zval *op, bool is_stri
 		case IS_REFERENCE:
 			op = Z_REFVAL_P(op);
 			goto try_again;
-		EMPTY_SWITCH_DEFAULT_CASE()
+		default: ZEND_UNREACHABLE();
 	}
 	return 0;
 }
@@ -1053,13 +1053,13 @@ ZEND_API double ZEND_FASTCALL zval_get_double_func(const zval *op) /* {{{ */
 		case IS_REFERENCE:
 			op = Z_REFVAL_P(op);
 			goto try_again;
-		EMPTY_SWITCH_DEFAULT_CASE()
+		default: ZEND_UNREACHABLE();
 	}
 	return 0.0;
 }
 /* }}} */
 
-static zend_always_inline zend_string* __zval_get_string_func(zval *op, bool try) /* {{{ */
+static zend_always_inline zend_string* __zval_get_string_func(const zval *op, bool try) /* {{{ */
 {
 try_again:
 	switch (Z_TYPE_P(op)) {
@@ -1094,25 +1094,25 @@ static zend_always_inline zend_string* __zval_get_string_func(zval *op, bool try
 			goto try_again;
 		case IS_STRING:
 			return zend_string_copy(Z_STR_P(op));
-		EMPTY_SWITCH_DEFAULT_CASE()
+		default: ZEND_UNREACHABLE();
 	}
 	return NULL;
 }
 /* }}} */
 
-ZEND_API zend_string* ZEND_FASTCALL zval_get_string_func(zval *op) /* {{{ */
+ZEND_API zend_string* ZEND_FASTCALL zval_get_string_func(const zval *op) /* {{{ */
 {
 	return __zval_get_string_func(op, false);
 }
 /* }}} */
 
-ZEND_API zend_string* ZEND_FASTCALL zval_try_get_string_func(zval *op) /* {{{ */
+ZEND_API zend_string* ZEND_FASTCALL zval_try_get_string_func(const zval *op) /* {{{ */
 {
 	return __zval_get_string_func(op, true);
 }
 /* }}} */
 
-static ZEND_COLD zend_never_inline void ZEND_FASTCALL zend_binop_error(const char *operator, zval *op1, zval *op2) /* {{{ */ {
+static ZEND_COLD zend_never_inline void ZEND_FASTCALL zend_binop_error(const char *operator, const zval *op1, const zval *op2) /* {{{ */ {
 	if (EG(exception)) {
 		return;
 	}
@@ -1122,7 +1122,7 @@ static ZEND_COLD zend_never_inline void ZEND_FASTCALL zend_binop_error(const cha
 }
 /* }}} */
 
-static zend_never_inline void ZEND_FASTCALL add_function_array(zval *result, zval *op1, zval *op2) /* {{{ */
+static zend_never_inline void ZEND_FASTCALL add_function_array(zval *result, const zval *op1, const zval *op2) /* {{{ */
 {
 	if (result == op1 && Z_ARR_P(op1) == Z_ARR_P(op2)) {
 		/* $a += $a */
@@ -2159,7 +2159,7 @@ has_op2_string:;
 }
 /* }}} */
 
-ZEND_API int ZEND_FASTCALL string_compare_function_ex(zval *op1, zval *op2, bool case_insensitive) /* {{{ */
+ZEND_API int ZEND_FASTCALL string_compare_function_ex(const zval *op1, const zval *op2, bool case_insensitive) /* {{{ */
 {
 	zend_string *tmp_str1, *tmp_str2;
 	zend_string *str1 = zval_get_tmp_string(op1, &tmp_str1);
@@ -2178,7 +2178,7 @@ ZEND_API int ZEND_FASTCALL string_compare_function_ex(zval *op1, zval *op2, bool
 }
 /* }}} */
 
-ZEND_API int ZEND_FASTCALL string_compare_function(zval *op1, zval *op2) /* {{{ */
+ZEND_API int ZEND_FASTCALL string_compare_function(const zval *op1, const zval *op2) /* {{{ */
 {
 	if (EXPECTED(Z_TYPE_P(op1) == IS_STRING) &&
 	    EXPECTED(Z_TYPE_P(op2) == IS_STRING)) {
@@ -2200,7 +2200,7 @@ ZEND_API int ZEND_FASTCALL string_compare_function(zval *op1, zval *op2) /* {{{
 }
 /* }}} */
 
-ZEND_API int ZEND_FASTCALL string_case_compare_function(zval *op1, zval *op2) /* {{{ */
+ZEND_API int ZEND_FASTCALL string_case_compare_function(const zval *op1, const zval *op2) /* {{{ */
 {
 	if (EXPECTED(Z_TYPE_P(op1) == IS_STRING) &&
 	    EXPECTED(Z_TYPE_P(op2) == IS_STRING)) {
@@ -2222,7 +2222,7 @@ ZEND_API int ZEND_FASTCALL string_case_compare_function(zval *op1, zval *op2) /*
 }
 /* }}} */
 
-ZEND_API int ZEND_FASTCALL string_locale_compare_function(zval *op1, zval *op2) /* {{{ */
+ZEND_API int ZEND_FASTCALL string_locale_compare_function(const zval *op1, const zval *op2) /* {{{ */
 {
 	zend_string *tmp_str1, *tmp_str2;
 	zend_string *str1 = zval_get_tmp_string(op1, &tmp_str1);
@@ -2235,7 +2235,7 @@ ZEND_API int ZEND_FASTCALL string_locale_compare_function(zval *op1, zval *op2)
 }
 /* }}} */
 
-ZEND_API int ZEND_FASTCALL numeric_compare_function(zval *op1, zval *op2) /* {{{ */
+ZEND_API int ZEND_FASTCALL numeric_compare_function(const zval *op1, const zval *op2) /* {{{ */
 {
 	double d1, d2;
 
@@ -2253,7 +2253,7 @@ ZEND_API zend_result ZEND_FASTCALL compare_function(zval *result, zval *op1, zva
 }
 /* }}} */
 
-static int compare_long_to_string(zend_long lval, zend_string *str) /* {{{ */
+static int compare_long_to_string(zend_long lval, const zend_string *str) /* {{{ */
 {
 	zend_long str_lval;
 	double str_dval;
@@ -2275,7 +2275,7 @@ static int compare_long_to_string(zend_long lval, zend_string *str) /* {{{ */
 }
 /* }}} */
 
-static int compare_double_to_string(double dval, zend_string *str) /* {{{ */
+static int compare_double_to_string(double dval, const zend_string *str) /* {{{ */
 {
 	zend_long str_lval;
 	double str_dval;
@@ -2459,7 +2459,7 @@ ZEND_API int ZEND_FASTCALL zend_compare(zval *op1, zval *op2) /* {{{ */
 /* }}} */
 
 /* return int to be compatible with compare_func_t */
-static int hash_zval_identical_function(zval *z1, zval *z2) /* {{{ */
+static int hash_zval_identical_function(const zval *z1, const zval *z2) /* {{{ */
 {
 	/* is_identical_function() returns 1 in case of identity and 0 in case
 	 * of a difference;
@@ -2501,14 +2501,14 @@ ZEND_API bool ZEND_FASTCALL zend_is_identical(const zval *op1, const zval *op2)
 }
 /* }}} */
 
-ZEND_API zend_result ZEND_FASTCALL is_identical_function(zval *result, zval *op1, zval *op2) /* {{{ */
+ZEND_API zend_result ZEND_FASTCALL is_identical_function(zval *result, const zval *op1, const zval *op2) /* {{{ */
 {
 	ZVAL_BOOL(result, zend_is_identical(op1, op2));
 	return SUCCESS;
 }
 /* }}} */
 
-ZEND_API zend_result ZEND_FASTCALL is_not_identical_function(zval *result, zval *op1, zval *op2) /* {{{ */
+ZEND_API zend_result ZEND_FASTCALL is_not_identical_function(zval *result, const zval *op1, const zval *op2) /* {{{ */
 {
 	ZVAL_BOOL(result, !zend_is_identical(op1, op2));
 	return SUCCESS;
@@ -2784,7 +2784,7 @@ ZEND_API zend_result ZEND_FASTCALL increment_function(zval *op1) /* {{{ */
 		case IS_ARRAY:
 			zend_type_error("Cannot increment %s", zend_zval_value_name(op1));
 			return FAILURE;
-		EMPTY_SWITCH_DEFAULT_CASE()
+		default: ZEND_UNREACHABLE();
 	}
 	return SUCCESS;
 }
@@ -2891,7 +2891,7 @@ ZEND_API zend_result ZEND_FASTCALL decrement_function(zval *op1) /* {{{ */
 		case IS_ARRAY:
 			zend_type_error("Cannot decrement %s", zend_zval_value_name(op1));
 			return FAILURE;
-		EMPTY_SWITCH_DEFAULT_CASE()
+		default: ZEND_UNREACHABLE();
 	}
 
 	return SUCCESS;
@@ -3322,8 +3322,8 @@ ZEND_API int ZEND_FASTCALL zend_binary_strcasecmp_l(const char *s1, size_t len1,
 
 	len = MIN(len1, len2);
 	while (len--) {
-		c1 = zend_tolower((int)*(unsigned char *)s1++);
-		c2 = zend_tolower((int)*(unsigned char *)s2++);
+		c1 = zend_tolower((unsigned char)*(s1++));
+		c2 = zend_tolower((unsigned char)*(s2++));
 		if (c1 != c2) {
 			return c1 - c2;
 		}
@@ -3343,8 +3343,8 @@ ZEND_API int ZEND_FASTCALL zend_binary_strncasecmp_l(const char *s1, size_t len1
 	}
 	len = MIN(length, MIN(len1, len2));
 	while (len--) {
-		c1 = zend_tolower((int)*(unsigned char *)s1++);
-		c2 = zend_tolower((int)*(unsigned char *)s2++);
+		c1 = zend_tolower((unsigned char)*(s1++));
+		c2 = zend_tolower((unsigned char)*(s2++));
 		if (c1 != c2) {
 			return c1 - c2;
 		}
@@ -3354,19 +3354,7 @@ ZEND_API int ZEND_FASTCALL zend_binary_strncasecmp_l(const char *s1, size_t len1
 }
 /* }}} */
 
-ZEND_API int ZEND_FASTCALL zend_binary_zval_strcmp(zval *s1, zval *s2) /* {{{ */
-{
-	return zend_binary_strcmp(Z_STRVAL_P(s1), Z_STRLEN_P(s1), Z_STRVAL_P(s2), Z_STRLEN_P(s2));
-}
-/* }}} */
-
-ZEND_API int ZEND_FASTCALL zend_binary_zval_strncmp(zval *s1, zval *s2, zval *s3) /* {{{ */
-{
-	return zend_binary_strncmp(Z_STRVAL_P(s1), Z_STRLEN_P(s1), Z_STRVAL_P(s2), Z_STRLEN_P(s2), Z_LVAL_P(s3));
-}
-/* }}} */
-
-ZEND_API bool ZEND_FASTCALL zendi_smart_streq(zend_string *s1, zend_string *s2) /* {{{ */
+ZEND_API bool ZEND_FASTCALL zendi_smart_streq(const zend_string *s1, const zend_string *s2) /* {{{ */
 {
 	uint8_t ret1, ret2;
 	int oflow1, oflow2;
@@ -3414,7 +3402,7 @@ ZEND_API bool ZEND_FASTCALL zendi_smart_streq(zend_string *s1, zend_string *s2)
 }
 /* }}} */
 
-ZEND_API int ZEND_FASTCALL zendi_smart_strcmp(zend_string *s1, zend_string *s2) /* {{{ */
+ZEND_API int ZEND_FASTCALL zendi_smart_strcmp(const zend_string *s1, const zend_string *s2) /* {{{ */
 {
 	uint8_t ret1, ret2;
 	int oflow1, oflow2;
@@ -3489,7 +3477,7 @@ ZEND_API int ZEND_FASTCALL zend_compare_symbol_tables(HashTable *ht1, HashTable
 }
 /* }}} */
 
-ZEND_API int ZEND_FASTCALL zend_compare_arrays(zval *a1, zval *a2) /* {{{ */
+ZEND_API int ZEND_FASTCALL zend_compare_arrays(const zval *a1, const zval *a2) /* {{{ */
 {
 	return zend_compare_symbol_tables(Z_ARRVAL_P(a1), Z_ARRVAL_P(a2));
 }
diff --git a/Zend/zend_operators.h b/Zend/zend_operators.h
index e6d648d1208a..27aa4fdb0486 100644
--- a/Zend/zend_operators.h
+++ b/Zend/zend_operators.h
@@ -2,15 +2,14 @@
    +----------------------------------------------------------------------+
    | Zend Engine                                                          |
    +----------------------------------------------------------------------+
-   | Copyright (c) Zend Technologies Ltd. (http://www.zend.com)           |
+   | Copyright © Zend Technologies Ltd., a subsidiary company of          |
+   |     Perforce Software, Inc., and Contributors.                       |
    +----------------------------------------------------------------------+
-   | This source file is subject to version 2.00 of the Zend license,     |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | http://www.zend.com/license/2_00.txt.                                |
-   | If you did not receive a copy of the Zend license and are unable to  |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@zend.com so we can mail you a copy immediately.              |
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Authors: Andi Gutmans                                  |
    |          Zeev Suraski                                  |
@@ -47,7 +46,6 @@
 #include "zend_portability.h"
 #include "zend_strtod.h"
 #include "zend_multiply.h"
-#include "zend_object_handlers.h"
 
 #define LONG_SIGN_MASK ZEND_LONG_MIN
 
@@ -71,8 +69,8 @@ ZEND_API zend_result ZEND_FASTCALL concat_function(zval *result, zval *op1, zval
 ZEND_API bool ZEND_FASTCALL zend_is_identical(const zval *op1, const zval *op2);
 
 ZEND_API zend_result ZEND_FASTCALL is_equal_function(zval *result, zval *op1, zval *op2);
-ZEND_API zend_result ZEND_FASTCALL is_identical_function(zval *result, zval *op1, zval *op2);
-ZEND_API zend_result ZEND_FASTCALL is_not_identical_function(zval *result, zval *op1, zval *op2);
+ZEND_API zend_result ZEND_FASTCALL is_identical_function(zval *result, const zval *op1, const zval *op2);
+ZEND_API zend_result ZEND_FASTCALL is_not_identical_function(zval *result, const zval *op1, const zval *op2);
 ZEND_API zend_result ZEND_FASTCALL is_not_equal_function(zval *result, zval *op1, zval *op2);
 ZEND_API zend_result ZEND_FASTCALL is_smaller_function(zval *result, zval *op1, zval *op2);
 ZEND_API zend_result ZEND_FASTCALL is_smaller_or_equal_function(zval *result, zval *op1, zval *op2);
@@ -325,8 +323,8 @@ ZEND_API void ZEND_FASTCALL convert_to_object(zval *op);
 ZEND_API zend_long    ZEND_FASTCALL zval_get_long_func(const zval *op, bool is_strict);
 ZEND_API zend_long    ZEND_FASTCALL zval_try_get_long(const zval *op, bool *failed);
 ZEND_API double       ZEND_FASTCALL zval_get_double_func(const zval *op);
-ZEND_API zend_string* ZEND_FASTCALL zval_get_string_func(zval *op);
-ZEND_API zend_string* ZEND_FASTCALL zval_try_get_string_func(zval *op);
+ZEND_API zend_string* ZEND_FASTCALL zval_get_string_func(const zval *op);
+ZEND_API zend_string* ZEND_FASTCALL zval_try_get_string_func(const zval *op);
 
 static zend_always_inline zend_long zval_get_long(const zval *op) {
 	return EXPECTED(Z_TYPE_P(op) == IS_LONG) ? Z_LVAL_P(op) : zval_get_long_func(op, false);
@@ -337,11 +335,11 @@ static zend_always_inline zend_long zval_get_long_ex(const zval *op, bool is_str
 static zend_always_inline double zval_get_double(const zval *op) {
 	return EXPECTED(Z_TYPE_P(op) == IS_DOUBLE) ? Z_DVAL_P(op) : zval_get_double_func(op);
 }
-static zend_always_inline zend_string *zval_get_string(zval *op) {
+static zend_always_inline zend_string *zval_get_string(const zval *op) {
 	return EXPECTED(Z_TYPE_P(op) == IS_STRING) ? zend_string_copy(Z_STR_P(op)) : zval_get_string_func(op);
 }
 
-static zend_always_inline zend_string *zval_get_tmp_string(zval *op, zend_string **tmp) {
+static zend_always_inline zend_string *zval_get_tmp_string(const zval *op, zend_string **tmp) {
 	if (EXPECTED(Z_TYPE_P(op) == IS_STRING)) {
 		*tmp = NULL;
 		return Z_STR_P(op);
@@ -356,7 +354,7 @@ static zend_always_inline void zend_tmp_string_release(zend_string *tmp) {
 }
 
 /* Like zval_get_string, but returns NULL if the conversion fails with an exception. */
-static zend_always_inline zend_string *zval_try_get_string(zval *op) {
+static zend_always_inline zend_string *zval_try_get_string(const zval *op) {
 	if (EXPECTED(Z_TYPE_P(op) == IS_STRING)) {
 		zend_string *ret = zend_string_copy(Z_STR_P(op));
 		ZEND_ASSUME(ret != NULL);
@@ -367,7 +365,7 @@ static zend_always_inline zend_string *zval_try_get_string(zval *op) {
 }
 
 /* Like zval_get_tmp_string, but returns NULL if the conversion fails with an exception. */
-static zend_always_inline zend_string *zval_try_get_tmp_string(zval *op, zend_string **tmp) {
+static zend_always_inline zend_string *zval_try_get_tmp_string(const zval *op, zend_string **tmp) {
 	if (EXPECTED(Z_TYPE_P(op) == IS_STRING)) {
 		zend_string *ret = Z_STR_P(op);
 		*tmp = NULL;
@@ -458,11 +456,11 @@ ZEND_API int ZEND_FASTCALL zend_compare(zval *op1, zval *op2);
 
 ZEND_API zend_result ZEND_FASTCALL compare_function(zval *result, zval *op1, zval *op2);
 
-ZEND_API int ZEND_FASTCALL numeric_compare_function(zval *op1, zval *op2);
-ZEND_API int ZEND_FASTCALL string_compare_function_ex(zval *op1, zval *op2, bool case_insensitive);
-ZEND_API int ZEND_FASTCALL string_compare_function(zval *op1, zval *op2);
-ZEND_API int ZEND_FASTCALL string_case_compare_function(zval *op1, zval *op2);
-ZEND_API int ZEND_FASTCALL string_locale_compare_function(zval *op1, zval *op2);
+ZEND_API int ZEND_FASTCALL numeric_compare_function(const zval *op1, const zval *op2);
+ZEND_API int ZEND_FASTCALL string_compare_function_ex(const zval *op1, const zval *op2, bool case_insensitive);
+ZEND_API int ZEND_FASTCALL string_compare_function(const zval *op1, const zval *op2);
+ZEND_API int ZEND_FASTCALL string_case_compare_function(const zval *op1, const zval *op2);
+ZEND_API int ZEND_FASTCALL string_locale_compare_function(const zval *op1, const zval *op2);
 
 ZEND_API extern const unsigned char zend_tolower_map[256];
 ZEND_API extern const unsigned char zend_toupper_map[256];
@@ -488,8 +486,6 @@ static zend_always_inline zend_string* zend_string_toupper(zend_string *str) {
 	return zend_string_toupper_ex(str, false);
 }
 
-ZEND_API int ZEND_FASTCALL zend_binary_zval_strcmp(zval *s1, zval *s2);
-ZEND_API int ZEND_FASTCALL zend_binary_zval_strncmp(zval *s1, zval *s2, zval *s3);
 ZEND_API int ZEND_FASTCALL zend_binary_strcmp(const char *s1, size_t len1, const char *s2, size_t len2);
 ZEND_API int ZEND_FASTCALL zend_binary_strncmp(const char *s1, size_t len1, const char *s2, size_t len2, size_t length);
 ZEND_API int ZEND_FASTCALL zend_binary_strcasecmp(const char *s1, size_t len1, const char *s2, size_t len2);
@@ -497,10 +493,10 @@ ZEND_API int ZEND_FASTCALL zend_binary_strncasecmp(const char *s1, size_t len1,
 ZEND_API int ZEND_FASTCALL zend_binary_strcasecmp_l(const char *s1, size_t len1, const char *s2, size_t len2);
 ZEND_API int ZEND_FASTCALL zend_binary_strncasecmp_l(const char *s1, size_t len1, const char *s2, size_t len2, size_t length);
 
-ZEND_API bool ZEND_FASTCALL zendi_smart_streq(zend_string *s1, zend_string *s2);
-ZEND_API int ZEND_FASTCALL zendi_smart_strcmp(zend_string *s1, zend_string *s2);
+ZEND_API bool ZEND_FASTCALL zendi_smart_streq(const zend_string *s1, const zend_string *s2);
+ZEND_API int ZEND_FASTCALL zendi_smart_strcmp(const zend_string *s1, const zend_string *s2);
 ZEND_API int ZEND_FASTCALL zend_compare_symbol_tables(HashTable *ht1, HashTable *ht2);
-ZEND_API int ZEND_FASTCALL zend_compare_arrays(zval *a1, zval *a2);
+ZEND_API int ZEND_FASTCALL zend_compare_arrays(const zval *a1, const zval *a2);
 ZEND_API int ZEND_FASTCALL zend_compare_objects(zval *o1, zval *o2);
 
 /** Deprecated in favor of ZEND_STRTOL() */
@@ -947,7 +943,7 @@ static zend_always_inline bool fast_equal_check_string(zval *op1, zval *op2)
 	return zend_compare(op1, op2) == 0;
 }
 
-static zend_always_inline bool fast_is_identical_function(zval *op1, zval *op2)
+static zend_always_inline bool fast_is_identical_function(const zval *op1, const zval *op2)
 {
 	if (Z_TYPE_P(op1) != Z_TYPE_P(op2)) {
 		return 0;
@@ -957,7 +953,7 @@ static zend_always_inline bool fast_is_identical_function(zval *op1, zval *op2)
 	return zend_is_identical(op1, op2);
 }
 
-static zend_always_inline bool fast_is_not_identical_function(zval *op1, zval *op2)
+static zend_always_inline bool fast_is_not_identical_function(const zval *op1, const zval *op2)
 {
 	if (Z_TYPE_P(op1) != Z_TYPE_P(op2)) {
 		return 1;
diff --git a/Zend/zend_portability.h b/Zend/zend_portability.h
index c8a6dfa871b5..ccad24682fdb 100644
--- a/Zend/zend_portability.h
+++ b/Zend/zend_portability.h
@@ -2,15 +2,14 @@
    +----------------------------------------------------------------------+
    | Zend Engine                                                          |
    +----------------------------------------------------------------------+
-   | Copyright (c) Zend Technologies Ltd. (http://www.zend.com)           |
+   | Copyright © Zend Technologies Ltd., a subsidiary company of          |
+   |     Perforce Software, Inc., and Contributors.                       |
    +----------------------------------------------------------------------+
-   | This source file is subject to version 2.00 of the Zend license,     |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | http://www.zend.com/license/2_00.txt.                                |
-   | If you did not receive a copy of the Zend license and are unable to  |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@zend.com so we can mail you a copy immediately.              |
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Authors: Andi Gutmans                                  |
    |          Zeev Suraski                                  |
@@ -106,7 +105,10 @@
 # define ZEND_ASSUME(c)
 #endif
 
-#if ZEND_DEBUG
+#ifdef HAVE_GCOV
+/* Disable assert() when compiling with gcov to avoid untested branch warning. */
+# define ZEND_ASSERT(c) ((void)sizeof(c))
+#elif ZEND_DEBUG
 # define ZEND_ASSERT(c)	assert(c)
 #else
 # define ZEND_ASSERT(c) ZEND_ASSUME(c)
@@ -128,16 +130,14 @@
 #endif
 
 /* pseudo fallthrough keyword; */
-#if defined(__GNUC__) && __GNUC__ >= 7
+#if __STDC_VERSION__ >= 202311L || defined(__cplusplus)
+# define ZEND_FALLTHROUGH [[fallthrough]]
+#elif defined(__GNUC__) && __GNUC__ >= 7
 # define ZEND_FALLTHROUGH __attribute__((__fallthrough__))
 #else
 # define ZEND_FALLTHROUGH ((void)0)
 #endif
 
-/* Only use this macro if you know for sure that all of the switches values
-   are covered by its case statements */
-#define EMPTY_SWITCH_DEFAULT_CASE() default: ZEND_UNREACHABLE(); break;
-
 #if defined(__GNUC__) && __GNUC__ >= 4
 # define ZEND_IGNORE_VALUE(x) (({ __typeof__ (x) __x = (x); (void) __x; }))
 #else
@@ -272,7 +272,7 @@ char *alloca();
 # define ZEND_ATTRIBUTE_NODISCARD
 #endif
 
-#if ZEND_GCC_VERSION >= 3000
+#if ZEND_GCC_VERSION >= 3000 || __has_attribute(const)
 # define ZEND_ATTRIBUTE_CONST __attribute__((const))
 #else
 # define ZEND_ATTRIBUTE_CONST
@@ -314,22 +314,21 @@ char *alloca();
 # define ZEND_ATTRIBUTE_NONNULL_ARGS(...)
 #endif
 
-#if defined(__GNUC__) && ZEND_GCC_VERSION >= 4003
+#if (defined(__GNUC__) && ZEND_GCC_VERSION >= 4003) || __has_attribute(cold)
 # define ZEND_COLD __attribute__((cold))
-# ifdef __OPTIMIZE__
-#  define ZEND_OPT_SIZE  __attribute__((optimize("Os")))
-#  define ZEND_OPT_SPEED __attribute__((optimize("Ofast")))
-# else
-#  define ZEND_OPT_SIZE
-#  define ZEND_OPT_SPEED
-# endif
 #else
 # define ZEND_COLD
+#endif
+
+#if ((defined(__GNUC__) && ZEND_GCC_VERSION >= 4003) || __has_attribute(optimize)) && defined(__OPTIMIZE__)
+# define ZEND_OPT_SIZE  __attribute__((optimize("Os")))
+# define ZEND_OPT_SPEED __attribute__((optimize("Ofast")))
+#else
 # define ZEND_OPT_SIZE
 # define ZEND_OPT_SPEED
 #endif
 
-#if defined(__GNUC__) && ZEND_GCC_VERSION >= 5000
+#if (defined(__GNUC__) && ZEND_GCC_VERSION >= 5000)
 # define ZEND_ATTRIBUTE_UNUSED_LABEL __attribute__((unused));
 # define ZEND_ATTRIBUTE_COLD_LABEL __attribute__((cold));
 #else
@@ -388,6 +387,34 @@ char *alloca();
 #define ZEND_ELEMENT_COUNT(m)
 #endif
 
+#if __cplusplus
+extern "C++" {
+# include 
+	template
+	const T* zend_container_of(const M *ptr, size_t offset) {
+		return reinterpret_cast(reinterpret_cast(ptr) - offset);
+	}
+	template
+	T* zend_container_of(M *ptr, size_t offset) {
+		return reinterpret_cast(reinterpret_cast(ptr) - offset);
+	}
+
+# define ZEND_CONTAINER_OF(ptr, Type, member) zend_container_of(ptr, offsetof(Type, member))
+}
+#elif __STDC_VERSION__ >= 202311L || ZEND_GCC_VERSION
+/* typeof is C23 or a GCC extension */
+# define ZEND_CONTAINER_OF(ptr, Type, member) \
+	_Generic( \
+		(ptr), \
+		const typeof(((Type*)0)->member) *: ((const Type*)((char*)(ptr) - offsetof(Type, member))), \
+		typeof(((Type*)0)->member) *: ((Type*)((char*)(ptr) - offsetof(Type, member))) \
+	)
+#else
+/* Define a variant that does not keep const-ness for older compilers. Mismatches
+ * are expected to be caught by CI running modern compilers. */
+# define ZEND_CONTAINER_OF(ptr, Type, member) ((Type*)((char*)(ptr) - offsetof(Type, member)))
+#endif
+
 #ifdef HAVE_BUILTIN_CONSTANT_P
 # define ZEND_CONST_COND(_condition, _default) \
 	(__builtin_constant_p(_condition) ? (_condition) : (_default))
@@ -433,10 +460,6 @@ char *alloca();
 # define UNEXPECTED(condition) (condition)
 #endif
 
-#ifndef XtOffsetOf
-# define XtOffsetOf(s_type, field) offsetof(s_type, field)
-#endif
-
 #ifndef ZEND_WIN32
 # define SETJMP(a) sigsetjmp(a, 0)
 # define LONGJMP(a,b) siglongjmp(a, b)
@@ -653,8 +676,8 @@ extern "C++" {
 #endif
 
 /* Do not use for conditional declaration of API functions! */
-#if defined(ZEND_INTRIN_PCLMUL_RESOLVER) && defined(ZEND_INTRIN_HAVE_IFUNC_TARGET) && (!defined(__GNUC__) || (ZEND_GCC_VERSION >= 9000))
-/* __builtin_cpu_supports has pclmul from gcc9 */
+#if defined(ZEND_INTRIN_PCLMUL_RESOLVER) && defined(ZEND_INTRIN_HAVE_IFUNC_TARGET) && (!defined(__GNUC__) || (defined(__clang__) && __clang_major__ >= 19) || (ZEND_GCC_VERSION >= 9000))
+/* __builtin_cpu_supports has pclmul from gcc9 and clang 19 */
 # define ZEND_INTRIN_PCLMUL_FUNC_PROTO 1
 #elif defined(ZEND_INTRIN_PCLMUL_RESOLVER)
 # define ZEND_INTRIN_PCLMUL_FUNC_PTR 1
@@ -679,8 +702,8 @@ extern "C++" {
 #endif
 
 /* Do not use for conditional declaration of API functions! */
-#if defined(ZEND_INTRIN_SSE4_2_PCLMUL_RESOLVER) && defined(ZEND_INTRIN_HAVE_IFUNC_TARGET) && (!defined(__GNUC__) || (ZEND_GCC_VERSION >= 9000))
-/* __builtin_cpu_supports has pclmul from gcc9 */
+#if defined(ZEND_INTRIN_SSE4_2_PCLMUL_RESOLVER) && defined(ZEND_INTRIN_HAVE_IFUNC_TARGET) && (!defined(__GNUC__) || (defined(__clang__) && __clang_major__ >= 19) || (ZEND_GCC_VERSION >= 9000))
+/* __builtin_cpu_supports has pclmul from gcc9 and clang 19 */
 # define ZEND_INTRIN_SSE4_2_PCLMUL_FUNC_PROTO 1
 #elif defined(ZEND_INTRIN_SSE4_2_PCLMUL_RESOLVER)
 # define ZEND_INTRIN_SSE4_2_PCLMUL_FUNC_PTR 1
diff --git a/Zend/zend_property_hooks.c b/Zend/zend_property_hooks.c
index 57e22f23ad7b..dd6fe95ef57a 100644
--- a/Zend/zend_property_hooks.c
+++ b/Zend/zend_property_hooks.c
@@ -2,15 +2,14 @@
    +----------------------------------------------------------------------+
    | Zend Engine                                                          |
    +----------------------------------------------------------------------+
-   | Copyright (c) Zend Technologies Ltd. (http://www.zend.com)           |
+   | Copyright © Zend Technologies Ltd., a subsidiary company of          |
+   |     Perforce Software, Inc., and Contributors.                       |
    +----------------------------------------------------------------------+
-   | This source file is subject to version 2.00 of the Zend license,     |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | http://www.zend.com/license/2_00.txt.                                |
-   | If you did not receive a copy of the Zend license and are unable to  |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@zend.com so we can mail you a copy immediately.              |
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Authors: Ilija Tovilo                                |
    +----------------------------------------------------------------------+
diff --git a/Zend/zend_property_hooks.h b/Zend/zend_property_hooks.h
index 3793fa1a683c..9c88cccb0c07 100644
--- a/Zend/zend_property_hooks.h
+++ b/Zend/zend_property_hooks.h
@@ -2,15 +2,14 @@
    +----------------------------------------------------------------------+
    | Zend Engine                                                          |
    +----------------------------------------------------------------------+
-   | Copyright (c) Zend Technologies Ltd. (http://www.zend.com)           |
+   | Copyright © Zend Technologies Ltd., a subsidiary company of          |
+   |     Perforce Software, Inc., and Contributors.                       |
    +----------------------------------------------------------------------+
-   | This source file is subject to version 2.00 of the Zend license,     |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | http://www.zend.com/license/2_00.txt.                                |
-   | If you did not receive a copy of the Zend license and are unable to  |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@zend.com so we can mail you a copy immediately.              |
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Authors: Ilija Tovilo                                |
    +----------------------------------------------------------------------+
diff --git a/Zend/zend_ptr_stack.c b/Zend/zend_ptr_stack.c
index fdabdeb61cef..67cc836a240c 100644
--- a/Zend/zend_ptr_stack.c
+++ b/Zend/zend_ptr_stack.c
@@ -2,15 +2,14 @@
    +----------------------------------------------------------------------+
    | Zend Engine                                                          |
    +----------------------------------------------------------------------+
-   | Copyright (c) Zend Technologies Ltd. (http://www.zend.com)           |
+   | Copyright © Zend Technologies Ltd., a subsidiary company of          |
+   |     Perforce Software, Inc., and Contributors.                       |
    +----------------------------------------------------------------------+
-   | This source file is subject to version 2.00 of the Zend license,     |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | http://www.zend.com/license/2_00.txt.                                |
-   | If you did not receive a copy of the Zend license and are unable to  |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@zend.com so we can mail you a copy immediately.              |
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Authors: Andi Gutmans                                  |
    |          Zeev Suraski                                  |
diff --git a/Zend/zend_ptr_stack.h b/Zend/zend_ptr_stack.h
index 3ef1478fe4c3..6a6376f79dae 100644
--- a/Zend/zend_ptr_stack.h
+++ b/Zend/zend_ptr_stack.h
@@ -2,15 +2,14 @@
    +----------------------------------------------------------------------+
    | Zend Engine                                                          |
    +----------------------------------------------------------------------+
-   | Copyright (c) Zend Technologies Ltd. (http://www.zend.com)           |
+   | Copyright © Zend Technologies Ltd., a subsidiary company of          |
+   |     Perforce Software, Inc., and Contributors.                       |
    +----------------------------------------------------------------------+
-   | This source file is subject to version 2.00 of the Zend license,     |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | http://www.zend.com/license/2_00.txt.                                |
-   | If you did not receive a copy of the Zend license and are unable to  |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@zend.com so we can mail you a copy immediately.              |
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Authors: Andi Gutmans                                  |
    |          Zeev Suraski                                  |
diff --git a/Zend/zend_range_check.h b/Zend/zend_range_check.h
index 9c822493fa3e..8db867434399 100644
--- a/Zend/zend_range_check.h
+++ b/Zend/zend_range_check.h
@@ -2,15 +2,14 @@
    +----------------------------------------------------------------------+
    | Zend Engine                                                          |
    +----------------------------------------------------------------------+
-   | Copyright (c) Zend Technologies Ltd. (http://www.zend.com)           |
+   | Copyright © Zend Technologies Ltd., a subsidiary company of          |
+   |     Perforce Software, Inc., and Contributors.                       |
    +----------------------------------------------------------------------+
-   | This source file is subject to version 2.00 of the Zend license,     |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | http://www.zend.com/license/2_00.txt.                                |
-   | If you did not receive a copy of the Zend license and are unable to  |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@zend.com so we can mail you a copy immediately.              |
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Authors: Anatol Belski                                   |
    +----------------------------------------------------------------------+
diff --git a/Zend/zend_signal.c b/Zend/zend_signal.c
index 83f8aa0852db..2e4b398aa965 100644
--- a/Zend/zend_signal.c
+++ b/Zend/zend_signal.c
@@ -2,15 +2,13 @@
   +----------------------------------------------------------------------+
   | Zend Signal Handling                                                 |
   +----------------------------------------------------------------------+
-  | Copyright (c) The PHP Group                                          |
+  | Copyright © The PHP Group and Contributors.                          |
   +----------------------------------------------------------------------+
-  | This source file is subject to version 3.01 of the PHP license,      |
-  | that is bundled with this package in the file LICENSE, and is        |
-  | available through the world-wide-web at the following url:           |
-  | https://www.php.net/license/3_01.txt                                 |
-  | If you did not receive a copy of the PHP license and are unable to   |
-  | obtain it through the world-wide-web, please send a note to          |
-  | license@php.net so we can mail you a copy immediately.               |
+  | This source file is subject to the Modified BSD License that is      |
+  | bundled with this package in the file LICENSE, and is available      |
+  | through the World Wide Web at .        |
+  |                                                                      |
+  | SPDX-License-Identifier: BSD-3-Clause                                |
   +----------------------------------------------------------------------+
   | Authors: Lucas Nealan                                 |
   |          Arnaud Le Blanc                           |
@@ -22,8 +20,9 @@
    Facebook Inc. as the original contributor of this module by leaving
    this note intact in the source code.
 
-   All other licensing and usage conditions are those of the PHP Group.
-*/
+   All other licensing and usage conditions are those of the PHP Group and
+   Contributors.
+ */
 
 #ifndef _GNU_SOURCE
 # define _GNU_SOURCE
diff --git a/Zend/zend_signal.h b/Zend/zend_signal.h
index e88892da35aa..973f0c302b21 100644
--- a/Zend/zend_signal.h
+++ b/Zend/zend_signal.h
@@ -2,20 +2,17 @@
   +----------------------------------------------------------------------+
   | Zend Signal Handling                                                 |
   +----------------------------------------------------------------------+
-  | Copyright (c) The PHP Group                                          |
+  | Copyright © The PHP Group and Contributors.                          |
   +----------------------------------------------------------------------+
-  | This source file is subject to version 3.01 of the PHP license,      |
-  | that is bundled with this package in the file LICENSE, and is        |
-  | available through the world-wide-web at the following url:           |
-  | https://www.php.net/license/3_01.txt                                 |
-  | If you did not receive a copy of the PHP license and are unable to   |
-  | obtain it through the world-wide-web, please send a note to          |
-  | license@php.net so we can mail you a copy immediately.               |
+  | This source file is subject to the Modified BSD License that is      |
+  | bundled with this package in the file LICENSE, and is available      |
+  | through the World Wide Web at .        |
+  |                                                                      |
+  | SPDX-License-Identifier: BSD-3-Clause                                |
   +----------------------------------------------------------------------+
   | Authors: Lucas Nealan                                 |
   |          Arnaud Le Blanc                           |
   +----------------------------------------------------------------------+
-
  */
 
 #ifndef ZEND_SIGNAL_H
diff --git a/Zend/zend_smart_str.c b/Zend/zend_smart_str.c
index c779ee5c97ca..e6475c1dd626 100644
--- a/Zend/zend_smart_str.c
+++ b/Zend/zend_smart_str.c
@@ -1,14 +1,12 @@
 /*
    +----------------------------------------------------------------------+
-   | Copyright (c) The PHP Group                                          |
+   | Copyright © The PHP Group and Contributors.                          |
    +----------------------------------------------------------------------+
-   | This source file is subject to version 3.01 of the PHP license,      |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | https://www.php.net/license/3_01.txt                                 |
-   | If you did not receive a copy of the PHP license and are unable to   |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@php.net so we can mail you a copy immediately.               |
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Author: Dmitry Stogov                                |
    +----------------------------------------------------------------------+
@@ -229,7 +227,7 @@ ZEND_API void ZEND_FASTCALL smart_str_append_scalar(smart_str *dest, const zval
 			smart_str_appendc(dest, '\'');
 		break;
 
-		EMPTY_SWITCH_DEFAULT_CASE();
+		default: ZEND_UNREACHABLE();
 	}
 }
 
diff --git a/Zend/zend_smart_str.h b/Zend/zend_smart_str.h
index affbb5c50ac2..cb81cd2361c8 100644
--- a/Zend/zend_smart_str.h
+++ b/Zend/zend_smart_str.h
@@ -1,14 +1,12 @@
 /*
    +----------------------------------------------------------------------+
-   | Copyright (c) The PHP Group                                          |
+   | Copyright © The PHP Group and Contributors.                          |
    +----------------------------------------------------------------------+
-   | This source file is subject to version 3.01 of the PHP license,      |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | https://www.php.net/license/3_01.txt                                 |
-   | If you did not receive a copy of the PHP license and are unable to   |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@php.net so we can mail you a copy immediately.               |
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Author: Sascha Schumann                          |
    +----------------------------------------------------------------------+
diff --git a/Zend/zend_smart_str_public.h b/Zend/zend_smart_str_public.h
index 6a3b526254e4..d08ee49e47e0 100644
--- a/Zend/zend_smart_str_public.h
+++ b/Zend/zend_smart_str_public.h
@@ -1,14 +1,12 @@
 /*
    +----------------------------------------------------------------------+
-   | Copyright (c) The PHP Group                                          |
+   | Copyright © The PHP Group and Contributors.                          |
    +----------------------------------------------------------------------+
-   | This source file is subject to version 3.01 of the PHP license,      |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | https://www.php.net/license/3_01.txt                                 |
-   | If you did not receive a copy of the PHP license and are unable to   |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@php.net so we can mail you a copy immediately.               |
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Author: Sascha Schumann                          |
    +----------------------------------------------------------------------+
diff --git a/Zend/zend_smart_string.h b/Zend/zend_smart_string.h
index 9f04e1a340ad..e8655681186b 100644
--- a/Zend/zend_smart_string.h
+++ b/Zend/zend_smart_string.h
@@ -1,14 +1,12 @@
 /*
    +----------------------------------------------------------------------+
-   | Copyright (c) The PHP Group                                          |
+   | Copyright © The PHP Group and Contributors.                          |
    +----------------------------------------------------------------------+
-   | This source file is subject to version 3.01 of the PHP license,      |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | https://www.php.net/license/3_01.txt                                 |
-   | If you did not receive a copy of the PHP license and are unable to   |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@php.net so we can mail you a copy immediately.               |
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Author: Sascha Schumann                          |
    |         Xinchen Hui                                |
diff --git a/Zend/zend_smart_string_public.h b/Zend/zend_smart_string_public.h
index 543e1d37a4ef..8b2bfbedb271 100644
--- a/Zend/zend_smart_string_public.h
+++ b/Zend/zend_smart_string_public.h
@@ -1,14 +1,12 @@
 /*
    +----------------------------------------------------------------------+
-   | Copyright (c) The PHP Group                                          |
+   | Copyright © The PHP Group and Contributors.                          |
    +----------------------------------------------------------------------+
-   | This source file is subject to version 3.01 of the PHP license,      |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | https://www.php.net/license/3_01.txt                                 |
-   | If you did not receive a copy of the PHP license and are unable to   |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@php.net so we can mail you a copy immediately.               |
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Author: Sascha Schumann                          |
    |         Xinchen Hui                                |
diff --git a/Zend/zend_sort.c b/Zend/zend_sort.c
index 355d2d1bad58..ac559141dd97 100644
--- a/Zend/zend_sort.c
+++ b/Zend/zend_sort.c
@@ -2,15 +2,14 @@
    +----------------------------------------------------------------------+
    | Zend Engine                                                          |
    +----------------------------------------------------------------------+
-   | Copyright (c) Zend Technologies Ltd. (http://www.zend.com)           |
+   | Copyright © Zend Technologies Ltd., a subsidiary company of          |
+   |     Perforce Software, Inc., and Contributors.                       |
    +----------------------------------------------------------------------+
-   | This source file is subject to version 2.00 of the Zend license,     |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | http://www.zend.com/license/2_00.txt.                                |
-   | If you did not receive a copy of the Zend license and are unable to  |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@zend.com so we can mail you a copy immediately.              |
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Authors: Xinchen Hui                               |
    |          Sterling Hughes                           |
diff --git a/Zend/zend_sort.h b/Zend/zend_sort.h
index 5954575dbc25..03c63bb12e17 100644
--- a/Zend/zend_sort.h
+++ b/Zend/zend_sort.h
@@ -2,15 +2,14 @@
    +----------------------------------------------------------------------+
    | Zend Engine                                                          |
    +----------------------------------------------------------------------+
-   | Copyright (c) Zend Technologies Ltd. (http://www.zend.com)           |
+   | Copyright © Zend Technologies Ltd., a subsidiary company of          |
+   |     Perforce Software, Inc., and Contributors.                       |
    +----------------------------------------------------------------------+
-   | This source file is subject to version 2.00 of the Zend license,     |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | http://www.zend.com/license/2_00.txt.                                |
-   | If you did not receive a copy of the Zend license and are unable to  |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@zend.com so we can mail you a copy immediately.              |
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Authors: Xinchen Hui                               |
    |          Sterling Hughes                           |
diff --git a/Zend/zend_stack.c b/Zend/zend_stack.c
index 5d9cc166367e..d999d684d05d 100644
--- a/Zend/zend_stack.c
+++ b/Zend/zend_stack.c
@@ -2,15 +2,14 @@
    +----------------------------------------------------------------------+
    | Zend Engine                                                          |
    +----------------------------------------------------------------------+
-   | Copyright (c) Zend Technologies Ltd. (http://www.zend.com)           |
+   | Copyright © Zend Technologies Ltd., a subsidiary company of          |
+   |     Perforce Software, Inc., and Contributors.                       |
    +----------------------------------------------------------------------+
-   | This source file is subject to version 2.00 of the Zend license,     |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | http://www.zend.com/license/2_00.txt.                                |
-   | If you did not receive a copy of the Zend license and are unable to  |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@zend.com so we can mail you a copy immediately.              |
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Authors: Andi Gutmans                                  |
    |          Zeev Suraski                                  |
diff --git a/Zend/zend_stack.h b/Zend/zend_stack.h
index a2edc12b1fb4..66c90f0b5217 100644
--- a/Zend/zend_stack.h
+++ b/Zend/zend_stack.h
@@ -2,15 +2,14 @@
    +----------------------------------------------------------------------+
    | Zend Engine                                                          |
    +----------------------------------------------------------------------+
-   | Copyright (c) Zend Technologies Ltd. (http://www.zend.com)           |
+   | Copyright © Zend Technologies Ltd., a subsidiary company of          |
+   |     Perforce Software, Inc., and Contributors.                       |
    +----------------------------------------------------------------------+
-   | This source file is subject to version 2.00 of the Zend license,     |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | http://www.zend.com/license/2_00.txt.                                |
-   | If you did not receive a copy of the Zend license and are unable to  |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@zend.com so we can mail you a copy immediately.              |
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Authors: Andi Gutmans                                  |
    |          Zeev Suraski                                  |
diff --git a/Zend/zend_stream.c b/Zend/zend_stream.c
index 8e11841ad265..0627ae145939 100644
--- a/Zend/zend_stream.c
+++ b/Zend/zend_stream.c
@@ -2,15 +2,14 @@
    +----------------------------------------------------------------------+
    | Zend Engine                                                          |
    +----------------------------------------------------------------------+
-   | Copyright (c) Zend Technologies Ltd. (http://www.zend.com)           |
+   | Copyright © Zend Technologies Ltd., a subsidiary company of          |
+   |     Perforce Software, Inc., and Contributors.                       |
    +----------------------------------------------------------------------+
-   | This source file is subject to version 2.00 of the Zend license,     |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | http://www.zend.com/license/2_00.txt.                                |
-   | If you did not receive a copy of the Zend license and are unable to  |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@zend.com so we can mail you a copy immediately.              |
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Authors: Wez Furlong                           |
    |          Scott MacVicar                            |
diff --git a/Zend/zend_stream.h b/Zend/zend_stream.h
index 33d8656dad5e..ed2bef941e2a 100644
--- a/Zend/zend_stream.h
+++ b/Zend/zend_stream.h
@@ -2,15 +2,14 @@
    +----------------------------------------------------------------------+
    | Zend Engine                                                          |
    +----------------------------------------------------------------------+
-   | Copyright (c) Zend Technologies Ltd. (http://www.zend.com)           |
+   | Copyright © Zend Technologies Ltd., a subsidiary company of          |
+   |     Perforce Software, Inc., and Contributors.                       |
    +----------------------------------------------------------------------+
-   | This source file is subject to version 2.00 of the Zend license,     |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | http://www.zend.com/license/2_00.txt.                                |
-   | If you did not receive a copy of the Zend license and are unable to  |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@zend.com so we can mail you a copy immediately.              |
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Authors: Wez Furlong                           |
    |          Scott MacVicar                            |
diff --git a/Zend/zend_string.c b/Zend/zend_string.c
index ad4b9d2d6cde..52fca0cd4346 100644
--- a/Zend/zend_string.c
+++ b/Zend/zend_string.c
@@ -2,15 +2,14 @@
    +----------------------------------------------------------------------+
    | Zend Engine                                                          |
    +----------------------------------------------------------------------+
-   | Copyright (c) Zend Technologies Ltd. (http://www.zend.com)           |
+   | Copyright © Zend Technologies Ltd., a subsidiary company of          |
+   |     Perforce Software, Inc., and Contributors.                       |
    +----------------------------------------------------------------------+
-   | This source file is subject to version 2.00 of the Zend license,     |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | http://www.zend.com/license/2_00.txt.                                |
-   | If you did not receive a copy of the Zend license and are unable to  |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@zend.com so we can mail you a copy immediately.              |
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Authors: Dmitry Stogov                               |
    +----------------------------------------------------------------------+
@@ -18,6 +17,7 @@
 
 #include "zend.h"
 #include "zend_globals.h"
+#include "zend_multiply.h"
 
 #ifdef HAVE_VALGRIND
 # include "valgrind/callgrind.h"
@@ -474,12 +474,12 @@ ZEND_API zend_string *zend_string_concat2(
 		const char *str1, size_t str1_len,
 		const char *str2, size_t str2_len)
 {
-	size_t len = str1_len + str2_len;
-	zend_string *res = zend_string_alloc(len, 0);
+	zend_string *res = zend_string_safe_alloc(1, str1_len, str2_len, 0);
 
-	memcpy(ZSTR_VAL(res), str1, str1_len);
-	memcpy(ZSTR_VAL(res) + str1_len, str2, str2_len);
-	ZSTR_VAL(res)[len] = '\0';
+	char *p = ZSTR_VAL(res);
+	p = zend_mempcpy(p, str1, str1_len);
+	p = zend_mempcpy(p, str2, str2_len);
+	*p++ = '\0';
 
 	return res;
 }
@@ -489,13 +489,15 @@ ZEND_API zend_string *zend_string_concat3(
 		const char *str2, size_t str2_len,
 		const char *str3, size_t str3_len)
 {
-	size_t len = str1_len + str2_len + str3_len;
+	size_t tmp_len = zend_safe_address_guarded(1, str1_len, str2_len);
+	size_t len = zend_safe_address_guarded(1, tmp_len, str3_len);
 	zend_string *res = zend_string_alloc(len, 0);
 
-	memcpy(ZSTR_VAL(res), str1, str1_len);
-	memcpy(ZSTR_VAL(res) + str1_len, str2, str2_len);
-	memcpy(ZSTR_VAL(res) + str1_len + str2_len, str3, str3_len);
-	ZSTR_VAL(res)[len] = '\0';
+	char *p = ZSTR_VAL(res);
+	p = zend_mempcpy(p, str1, str1_len);
+	p = zend_mempcpy(p, str2, str2_len);
+	p = zend_mempcpy(p, str3, str3_len);
+	*p++ = '\0';
 
 	return res;
 }
diff --git a/Zend/zend_string.h b/Zend/zend_string.h
index 97386ea6bad6..930d733307f4 100644
--- a/Zend/zend_string.h
+++ b/Zend/zend_string.h
@@ -2,15 +2,14 @@
    +----------------------------------------------------------------------+
    | Zend Engine                                                          |
    +----------------------------------------------------------------------+
-   | Copyright (c) Zend Technologies Ltd. (http://www.zend.com)           |
+   | Copyright © Zend Technologies Ltd., a subsidiary company of          |
+   |     Perforce Software, Inc., and Contributors.                       |
    +----------------------------------------------------------------------+
-   | This source file is subject to version 2.00 of the Zend license,     |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | http://www.zend.com/license/2_00.txt.                                |
-   | If you did not receive a copy of the Zend license and are unable to  |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@zend.com so we can mail you a copy immediately.              |
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Authors: Dmitry Stogov                               |
    +----------------------------------------------------------------------+
@@ -72,35 +71,51 @@ END_EXTERN_C()
 
 /*---*/
 
-#define ZSTR_IS_INTERNED(s)					(GC_FLAGS(s) & IS_STR_INTERNED)
-#define ZSTR_IS_VALID_UTF8(s)				(GC_FLAGS(s) & IS_STR_VALID_UTF8)
+static zend_always_inline bool ZSTR_IS_INTERNED(const zend_string *s) {
+	return GC_FLAGS(s) & IS_STR_INTERNED;
+}
+
+static inline bool ZSTR_IS_VALID_UTF8(const zend_string *s) {
+	return GC_FLAGS(s) & IS_STR_VALID_UTF8;
+}
 
 /* These are properties, encoded as flags, that will hold on the resulting string
  * after concatenating two strings that have these property.
  * Example: concatenating two UTF-8 strings yields another UTF-8 string. */
 #define ZSTR_COPYABLE_CONCAT_PROPERTIES		(IS_STR_VALID_UTF8)
 
-#define ZSTR_GET_COPYABLE_CONCAT_PROPERTIES(s) 				(GC_FLAGS(s) & ZSTR_COPYABLE_CONCAT_PROPERTIES)
-/* This macro returns the copyable concat properties which hold on both strings. */
-#define ZSTR_GET_COPYABLE_CONCAT_PROPERTIES_BOTH(s1, s2)	(GC_FLAGS(s1) & GC_FLAGS(s2) & ZSTR_COPYABLE_CONCAT_PROPERTIES)
+static inline uint32_t ZSTR_GET_COPYABLE_CONCAT_PROPERTIES(const zend_string *s) {
+	return GC_FLAGS(s) & ZSTR_COPYABLE_CONCAT_PROPERTIES;
+}
 
-#define ZSTR_COPY_CONCAT_PROPERTIES(out, in) do { \
-	zend_string *_out = (out); \
-	uint32_t properties = ZSTR_GET_COPYABLE_CONCAT_PROPERTIES((in)); \
-	GC_ADD_FLAGS(_out, properties); \
-} while (0)
+/* This function returns the copyable concat properties which hold on both strings. */
+static inline uint32_t ZSTR_GET_COPYABLE_CONCAT_PROPERTIES_BOTH(const zend_string *s1, const zend_string *s2) {
+	return ZSTR_GET_COPYABLE_CONCAT_PROPERTIES(s1) & ZSTR_GET_COPYABLE_CONCAT_PROPERTIES(s2);
+}
 
-#define ZSTR_COPY_CONCAT_PROPERTIES_BOTH(out, in1, in2) do { \
-	zend_string *_out = (out); \
-	uint32_t properties = ZSTR_GET_COPYABLE_CONCAT_PROPERTIES_BOTH((in1), (in2)); \
-	GC_ADD_FLAGS(_out, properties); \
-} while (0)
+static inline void ZSTR_COPY_CONCAT_PROPERTIES(zend_string *out, const zend_string *in) {
+	uint32_t properties = ZSTR_GET_COPYABLE_CONCAT_PROPERTIES(in);
+	GC_ADD_FLAGS(out, properties);
+}
+
+static inline void ZSTR_COPY_CONCAT_PROPERTIES_BOTH(zend_string *out, const zend_string *in1, const zend_string *in2) {
+	uint32_t properties = ZSTR_GET_COPYABLE_CONCAT_PROPERTIES_BOTH(in1, in2);
+	GC_ADD_FLAGS(out, properties);
+}
 
-#define ZSTR_EMPTY_ALLOC() zend_empty_string
-#define ZSTR_CHAR(c) zend_one_char_string[c]
-#define ZSTR_KNOWN(idx) zend_known_strings[idx]
+static zend_always_inline zend_string *ZSTR_EMPTY_ALLOC(void) {
+	return zend_empty_string;
+}
 
-#define _ZSTR_HEADER_SIZE XtOffsetOf(zend_string, val)
+static zend_always_inline zend_string *ZSTR_CHAR(unsigned char c) {
+	return zend_one_char_string[c];
+}
+
+static zend_always_inline zend_string *ZSTR_KNOWN(size_t idx) {
+	return zend_known_strings[idx];
+}
+
+#define _ZSTR_HEADER_SIZE offsetof(zend_string, val)
 
 #define _ZSTR_STRUCT_SIZE(len) (_ZSTR_HEADER_SIZE + len + 1)
 
@@ -382,11 +397,22 @@ static zend_always_inline bool zend_string_equals(const zend_string *s1, const z
 	return s1 == s2 || zend_string_equal_content(s1, s2);
 }
 
-#define zend_string_equals_ci(s1, s2) \
-	(ZSTR_LEN(s1) == ZSTR_LEN(s2) && !zend_binary_strcasecmp(ZSTR_VAL(s1), ZSTR_LEN(s1), ZSTR_VAL(s2), ZSTR_LEN(s2)))
+BEGIN_EXTERN_C()
+ZEND_API int ZEND_FASTCALL zend_binary_strcasecmp(const char *s1, size_t len1, const char *s2, size_t len2);
+END_EXTERN_C()
 
-#define zend_string_equals_literal_ci(str, c) \
-	(ZSTR_LEN(str) == sizeof("" c) - 1 && !zend_binary_strcasecmp(ZSTR_VAL(str), ZSTR_LEN(str), (c), sizeof(c) - 1))
+static zend_always_inline bool zend_string_equals_cstr_ci(const zend_string *s1, const char *s2, size_t s2_length)
+{
+	return ZSTR_LEN(s1) == s2_length && !zend_binary_strcasecmp(ZSTR_VAL(s1), ZSTR_LEN(s1), s2, s2_length);
+}
+
+#define zend_string_equals_literal_ci(str, literal) \
+	zend_string_equals_cstr_ci(str, "" literal, sizeof(literal) - 1)
+
+static zend_always_inline bool zend_string_equals_ci(const zend_string *s1, const zend_string *s2)
+{
+	return zend_string_equals_cstr_ci(s1, ZSTR_VAL(s2), ZSTR_LEN(s2));
+}
 
 #define zend_string_equals_literal(str, literal) \
 	zend_string_equals_cstr(str, "" literal, sizeof(literal) - 1)
@@ -537,7 +563,7 @@ static zend_always_inline zend_ulong zend_inline_hash_func(const char *str, size
 		case 2: hash = ((hash << 5) + hash) + *str++; /* fallthrough... */
 		case 1: hash = ((hash << 5) + hash) + *str++; break;
 		case 0: break;
-EMPTY_SWITCH_DEFAULT_CASE()
+default: ZEND_UNREACHABLE();
 	}
 #endif
 
diff --git a/Zend/zend_strtod.h b/Zend/zend_strtod.h
index 4e0d85a7d216..fa557ed2a0c3 100644
--- a/Zend/zend_strtod.h
+++ b/Zend/zend_strtod.h
@@ -2,15 +2,14 @@
    +----------------------------------------------------------------------+
    | Zend Engine                                                          |
    +----------------------------------------------------------------------+
-   | Copyright (c) Zend Technologies Ltd. (http://www.zend.com)           |
+   | Copyright © Zend Technologies Ltd., a subsidiary company of          |
+   |     Perforce Software, Inc., and Contributors.                       |
    +----------------------------------------------------------------------+
-   | This source file is subject to version 2.00 of the Zend license,     |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | http://www.zend.com/license/2_00.txt.                                |
-   | If you did not receive a copy of the Zend license and are unable to  |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@zend.com so we can mail you a copy immediately.              |
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Authors: Derick Rethans                              |
    +----------------------------------------------------------------------+
diff --git a/Zend/zend_strtod_int.h b/Zend/zend_strtod_int.h
index 06a02618e9e6..4de5c225ccd8 100644
--- a/Zend/zend_strtod_int.h
+++ b/Zend/zend_strtod_int.h
@@ -2,15 +2,14 @@
    +----------------------------------------------------------------------+
    | Zend Engine                                                          |
    +----------------------------------------------------------------------+
-   | Copyright (c) Zend Technologies Ltd. (http://www.zend.com)           |
+   | Copyright © Zend Technologies Ltd., a subsidiary company of          |
+   |     Perforce Software, Inc., and Contributors.                       |
    +----------------------------------------------------------------------+
-   | This source file is subject to version 2.00 of the Zend license,     |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | http://www.zend.com/license/2_00.txt.                                |
-   | If you did not receive a copy of the Zend license and are unable to  |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@zend.com so we can mail you a copy immediately.              |
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Authors: Anatol Belski                                   |
    +----------------------------------------------------------------------+
diff --git a/Zend/zend_system_id.c b/Zend/zend_system_id.c
index 2c3ebab0f480..ead694375b6d 100644
--- a/Zend/zend_system_id.c
+++ b/Zend/zend_system_id.c
@@ -1,14 +1,12 @@
 /*
    +----------------------------------------------------------------------+
-   | Copyright (c) The PHP Group                                          |
+   | Copyright © The PHP Group and Contributors.                          |
    +----------------------------------------------------------------------+
-   | This source file is subject to version 3.01 of the PHP license,      |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | https://www.php.net/license/3_01.txt                                 |
-   | If you did not receive a copy of the PHP license and are unable to   |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@php.net so we can mail you a copy immediately.               |
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Authors: Sammy Kaye Powers                           |
    |          Dmitry Stogov                               |
diff --git a/Zend/zend_system_id.h b/Zend/zend_system_id.h
index b6785f8d7b67..ae39381a52a3 100644
--- a/Zend/zend_system_id.h
+++ b/Zend/zend_system_id.h
@@ -1,14 +1,12 @@
 /*
    +----------------------------------------------------------------------+
-   | Copyright (c) The PHP Group                                          |
+   | Copyright © The PHP Group and Contributors.                          |
    +----------------------------------------------------------------------+
-   | This source file is subject to version 3.01 of the PHP license,      |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | https://www.php.net/license/3_01.txt                                 |
-   | If you did not receive a copy of the PHP license and are unable to   |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@php.net so we can mail you a copy immediately.               |
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Author: Sammy Kaye Powers                            |
    +----------------------------------------------------------------------+
diff --git a/Zend/zend_type_info.h b/Zend/zend_type_info.h
index eeab7bf0431d..1e0045558383 100644
--- a/Zend/zend_type_info.h
+++ b/Zend/zend_type_info.h
@@ -2,15 +2,14 @@
    +----------------------------------------------------------------------+
    | Zend Engine                                                          |
    +----------------------------------------------------------------------+
-   | Copyright (c) Zend Technologies Ltd. (http://www.zend.com)           |
+   | Copyright © Zend Technologies Ltd., a subsidiary company of          |
+   |     Perforce Software, Inc., and Contributors.                       |
    +----------------------------------------------------------------------+
-   | This source file is subject to version 2.00 of the Zend license,     |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | http://www.zend.com/license/2_00.txt.                                |
-   | If you did not receive a copy of the Zend license and are unable to  |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@zend.com so we can mail you a copy immediately.              |
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Authors: Dmitry Stogov                               |
    +----------------------------------------------------------------------+
diff --git a/Zend/zend_types.h b/Zend/zend_types.h
index 22dbfa9be879..0edc4df37484 100644
--- a/Zend/zend_types.h
+++ b/Zend/zend_types.h
@@ -2,15 +2,14 @@
    +----------------------------------------------------------------------+
    | Zend Engine                                                          |
    +----------------------------------------------------------------------+
-   | Copyright (c) Zend Technologies Ltd. (http://www.zend.com)           |
+   | Copyright © Zend Technologies Ltd., a subsidiary company of          |
+   |     Perforce Software, Inc., and Contributors.                       |
    +----------------------------------------------------------------------+
-   | This source file is subject to version 2.00 of the Zend license,     |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | http://www.zend.com/license/2_00.txt.                                |
-   | If you did not receive a copy of the Zend license and are unable to  |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@zend.com so we can mail you a copy immediately.              |
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Authors: Andi Gutmans                                  |
    |          Zeev Suraski                                  |
@@ -55,12 +54,10 @@
 
 typedef unsigned char zend_uchar;
 
-typedef enum {
+typedef enum zend_result {
   SUCCESS =  0,
   FAILURE = -1,		/* this MUST stay a negative number, or it may affect functions! */
-} ZEND_RESULT_CODE;
-
-typedef ZEND_RESULT_CODE zend_result;
+} zend_result;
 
 /* This constant is deprecated, use SIZE_MAX instead */
 #define ZEND_SIZE_MAX SIZE_MAX
@@ -716,6 +713,116 @@ static zend_always_inline uint8_t zval_get_type(const zval* pz) {
 #define Z_TYPE_FLAGS_SHIFT			8
 #define Z_TYPE_INFO_EXTRA_SHIFT		16
 
+/* zval_gc_flags(zval.value->gc.u.type_info) (common flags) */
+#define GC_NOT_COLLECTABLE			(1<<4)
+#define GC_PROTECTED                (1<<5) /* used for recursion detection */
+#define GC_IMMUTABLE                (1<<6) /* can't be changed in place */
+#define GC_PERSISTENT               (1<<7) /* allocated using malloc */
+#define GC_PERSISTENT_LOCAL         (1<<8) /* persistent, but thread-local */
+
+#define GC_TYPE_MASK				0x0000000f
+#define GC_FLAGS_MASK				0x000003f0
+#define GC_INFO_MASK				0xfffffc00
+#define GC_FLAGS_SHIFT				0
+#define GC_INFO_SHIFT				10
+
+static zend_always_inline uint8_t zval_gc_type(uint32_t gc_type_info) {
+	return (gc_type_info & GC_TYPE_MASK);
+}
+
+static zend_always_inline uint32_t zval_gc_flags(uint32_t gc_type_info) {
+	return (gc_type_info >> GC_FLAGS_SHIFT) & (GC_FLAGS_MASK >> GC_FLAGS_SHIFT);
+}
+
+static zend_always_inline uint32_t zval_gc_info(uint32_t gc_type_info) {
+	return (gc_type_info >> GC_INFO_SHIFT);
+}
+
+#define GC_TYPE_INFO(p)				(p)->gc.u.type_info
+#define GC_TYPE(p)					zval_gc_type(GC_TYPE_INFO(p))
+#define GC_FLAGS(p)					zval_gc_flags(GC_TYPE_INFO(p))
+#define GC_INFO(p)					zval_gc_info(GC_TYPE_INFO(p))
+
+#define GC_ADD_FLAGS(p, flags) do { \
+		GC_TYPE_INFO(p) |= (flags) << GC_FLAGS_SHIFT; \
+	} while (0)
+#define GC_DEL_FLAGS(p, flags) do { \
+		GC_TYPE_INFO(p) &= ~((flags) << GC_FLAGS_SHIFT); \
+	} while (0)
+
+#ifndef ZEND_RC_DEBUG
+# define ZEND_RC_DEBUG 0
+#endif
+
+#if ZEND_RC_DEBUG
+extern ZEND_API bool zend_rc_debug;
+/* The GC_PERSISTENT flag is reused for IS_OBJ_WEAKLY_REFERENCED on objects.
+ * Skip checks for OBJECT/NULL type to avoid interpreting the flag incorrectly. */
+# define ZEND_RC_MOD_CHECK(p) do { \
+		if (zend_rc_debug) { \
+			uint8_t type = zval_gc_type((p)->u.type_info); \
+			if (type != IS_OBJECT && type != IS_NULL) { \
+				ZEND_ASSERT(!(zval_gc_flags((p)->u.type_info) & GC_IMMUTABLE)); \
+				ZEND_ASSERT((zval_gc_flags((p)->u.type_info) & (GC_PERSISTENT|GC_PERSISTENT_LOCAL)) != GC_PERSISTENT); \
+			} \
+		} \
+	} while (0)
+# define GC_MAKE_PERSISTENT_LOCAL(p) do { \
+		GC_ADD_FLAGS(p, GC_PERSISTENT_LOCAL); \
+	} while (0)
+#else
+# define ZEND_RC_MOD_CHECK(p) \
+	do { } while (0)
+# define GC_MAKE_PERSISTENT_LOCAL(p) \
+	do { } while (0)
+#endif
+
+static zend_always_inline uint32_t zend_gc_refcount(const zend_refcounted_h *p) {
+	return p->refcount;
+}
+
+static zend_always_inline uint32_t zend_gc_set_refcount(zend_refcounted_h *p, uint32_t rc) {
+	p->refcount = rc;
+	return p->refcount;
+}
+
+static zend_always_inline uint32_t zend_gc_addref(zend_refcounted_h *p) {
+	ZEND_RC_MOD_CHECK(p);
+	return ++(p->refcount);
+}
+
+static zend_always_inline void zend_gc_try_addref(zend_refcounted_h *p) {
+	if (!(p->u.type_info & GC_IMMUTABLE)) {
+		ZEND_RC_MOD_CHECK(p);
+		++p->refcount;
+	}
+}
+
+static zend_always_inline void zend_gc_try_delref(zend_refcounted_h *p) {
+	if (!(p->u.type_info & GC_IMMUTABLE)) {
+		ZEND_RC_MOD_CHECK(p);
+		--p->refcount;
+	}
+}
+
+static zend_always_inline uint32_t zend_gc_delref(zend_refcounted_h *p) {
+	ZEND_ASSERT(p->refcount > 0);
+	ZEND_RC_MOD_CHECK(p);
+	return --(p->refcount);
+}
+
+static zend_always_inline uint32_t zend_gc_addref_ex(zend_refcounted_h *p, uint32_t rc) {
+	ZEND_RC_MOD_CHECK(p);
+	p->refcount += rc;
+	return p->refcount;
+}
+
+static zend_always_inline uint32_t zend_gc_delref_ex(zend_refcounted_h *p, uint32_t rc) {
+	ZEND_RC_MOD_CHECK(p);
+	p->refcount -= rc;
+	return p->refcount;
+}
+
 #define GC_REFCOUNT(p)				zend_gc_refcount(&(p)->gc)
 #define GC_SET_REFCOUNT(p, rc)		zend_gc_set_refcount(&(p)->gc, rc)
 #define GC_ADDREF(p)				zend_gc_addref(&(p)->gc)
@@ -757,54 +864,6 @@ static zend_always_inline uint8_t zval_get_type(const zval* pz) {
 		} \
 	} while (0)
 
-#define GC_TYPE_MASK				0x0000000f
-#define GC_FLAGS_MASK				0x000003f0
-#define GC_INFO_MASK				0xfffffc00
-#define GC_FLAGS_SHIFT				0
-#define GC_INFO_SHIFT				10
-
-static zend_always_inline uint8_t zval_gc_type(uint32_t gc_type_info) {
-	return (gc_type_info & GC_TYPE_MASK);
-}
-
-static zend_always_inline uint32_t zval_gc_flags(uint32_t gc_type_info) {
-	return (gc_type_info >> GC_FLAGS_SHIFT) & (GC_FLAGS_MASK >> GC_FLAGS_SHIFT);
-}
-
-static zend_always_inline uint32_t zval_gc_info(uint32_t gc_type_info) {
-	return (gc_type_info >> GC_INFO_SHIFT);
-}
-
-#define GC_TYPE_INFO(p)				(p)->gc.u.type_info
-#define GC_TYPE(p)					zval_gc_type(GC_TYPE_INFO(p))
-#define GC_FLAGS(p)					zval_gc_flags(GC_TYPE_INFO(p))
-#define GC_INFO(p)					zval_gc_info(GC_TYPE_INFO(p))
-
-#define GC_ADD_FLAGS(p, flags) do { \
-		GC_TYPE_INFO(p) |= (flags) << GC_FLAGS_SHIFT; \
-	} while (0)
-#define GC_DEL_FLAGS(p, flags) do { \
-		GC_TYPE_INFO(p) &= ~((flags) << GC_FLAGS_SHIFT); \
-	} while (0)
-
-#define Z_GC_TYPE(zval)				GC_TYPE(Z_COUNTED(zval))
-#define Z_GC_TYPE_P(zval_p)			Z_GC_TYPE(*(zval_p))
-
-#define Z_GC_FLAGS(zval)			GC_FLAGS(Z_COUNTED(zval))
-#define Z_GC_FLAGS_P(zval_p)		Z_GC_FLAGS(*(zval_p))
-
-#define Z_GC_INFO(zval)				GC_INFO(Z_COUNTED(zval))
-#define Z_GC_INFO_P(zval_p)			Z_GC_INFO(*(zval_p))
-#define Z_GC_TYPE_INFO(zval)		GC_TYPE_INFO(Z_COUNTED(zval))
-#define Z_GC_TYPE_INFO_P(zval_p)	Z_GC_TYPE_INFO(*(zval_p))
-
-/* zval_gc_flags(zval.value->gc.u.type_info) (common flags) */
-#define GC_NOT_COLLECTABLE			(1<<4)
-#define GC_PROTECTED                (1<<5) /* used for recursion detection */
-#define GC_IMMUTABLE                (1<<6) /* can't be changed in place */
-#define GC_PERSISTENT               (1<<7) /* allocated using malloc */
-#define GC_PERSISTENT_LOCAL         (1<<8) /* persistent, but thread-local */
-
 #define GC_NULL						(IS_NULL         | (GC_NOT_COLLECTABLE << GC_FLAGS_SHIFT))
 #define GC_STRING					(IS_STRING       | (GC_NOT_COLLECTABLE << GC_FLAGS_SHIFT))
 #define GC_ARRAY					IS_ARRAY
@@ -947,16 +1006,6 @@ static zend_always_inline uint32_t zval_gc_info(uint32_t gc_type_info) {
 #define Z_COLLECTABLE(zval)			((Z_TYPE_FLAGS(zval) & IS_TYPE_COLLECTABLE) != 0)
 #define Z_COLLECTABLE_P(zval_p)		Z_COLLECTABLE(*(zval_p))
 
-/* deprecated: (COPYABLE is the same as IS_ARRAY) */
-#define Z_COPYABLE(zval)			(Z_TYPE(zval) == IS_ARRAY)
-#define Z_COPYABLE_P(zval_p)		Z_COPYABLE(*(zval_p))
-
-/* deprecated: (IMMUTABLE is the same as IS_ARRAY && !REFCOUNTED) */
-#define Z_IMMUTABLE(zval)			(Z_TYPE_INFO(zval) == IS_ARRAY)
-#define Z_IMMUTABLE_P(zval_p)		Z_IMMUTABLE(*(zval_p))
-#define Z_OPT_IMMUTABLE(zval)		Z_IMMUTABLE(zval_p)
-#define Z_OPT_IMMUTABLE_P(zval_p)	Z_IMMUTABLE(*(zval_p))
-
 /* the following Z_OPT_* macros make better code when Z_TYPE_INFO accessed before */
 #define Z_OPT_TYPE(zval)			(Z_TYPE_INFO(zval) & Z_TYPE_MASK)
 #define Z_OPT_TYPE_P(zval_p)		Z_OPT_TYPE(*(zval_p))
@@ -970,10 +1019,6 @@ static zend_always_inline uint32_t zval_gc_info(uint32_t gc_type_info) {
 #define Z_OPT_COLLECTABLE(zval)		((Z_TYPE_INFO(zval) & (IS_TYPE_COLLECTABLE << Z_TYPE_FLAGS_SHIFT)) != 0)
 #define Z_OPT_COLLECTABLE_P(zval_p)	Z_OPT_COLLECTABLE(*(zval_p))
 
-/* deprecated: (COPYABLE is the same as IS_ARRAY) */
-#define Z_OPT_COPYABLE(zval)		(Z_OPT_TYPE(zval) == IS_ARRAY)
-#define Z_OPT_COPYABLE_P(zval_p)	Z_OPT_COPYABLE(*(zval_p))
-
 #define Z_OPT_ISREF(zval)			(Z_OPT_TYPE(zval) == IS_REFERENCE)
 #define Z_OPT_ISREF_P(zval_p)		Z_OPT_ISREF(*(zval_p))
 
@@ -1316,79 +1361,6 @@ static zend_always_inline uint32_t zval_gc_info(uint32_t gc_type_info) {
 #define Z_TRY_ADDREF(z)				Z_TRY_ADDREF_P(&(z))
 #define Z_TRY_DELREF(z)				Z_TRY_DELREF_P(&(z))
 
-#ifndef ZEND_RC_DEBUG
-# define ZEND_RC_DEBUG 0
-#endif
-
-#if ZEND_RC_DEBUG
-extern ZEND_API bool zend_rc_debug;
-/* The GC_PERSISTENT flag is reused for IS_OBJ_WEAKLY_REFERENCED on objects.
- * Skip checks for OBJECT/NULL type to avoid interpreting the flag incorrectly. */
-# define ZEND_RC_MOD_CHECK(p) do { \
-		if (zend_rc_debug) { \
-			uint8_t type = zval_gc_type((p)->u.type_info); \
-			if (type != IS_OBJECT && type != IS_NULL) { \
-				ZEND_ASSERT(!(zval_gc_flags((p)->u.type_info) & GC_IMMUTABLE)); \
-				ZEND_ASSERT((zval_gc_flags((p)->u.type_info) & (GC_PERSISTENT|GC_PERSISTENT_LOCAL)) != GC_PERSISTENT); \
-			} \
-		} \
-	} while (0)
-# define GC_MAKE_PERSISTENT_LOCAL(p) do { \
-		GC_ADD_FLAGS(p, GC_PERSISTENT_LOCAL); \
-	} while (0)
-#else
-# define ZEND_RC_MOD_CHECK(p) \
-	do { } while (0)
-# define GC_MAKE_PERSISTENT_LOCAL(p) \
-	do { } while (0)
-#endif
-
-static zend_always_inline uint32_t zend_gc_refcount(const zend_refcounted_h *p) {
-	return p->refcount;
-}
-
-static zend_always_inline uint32_t zend_gc_set_refcount(zend_refcounted_h *p, uint32_t rc) {
-	p->refcount = rc;
-	return p->refcount;
-}
-
-static zend_always_inline uint32_t zend_gc_addref(zend_refcounted_h *p) {
-	ZEND_RC_MOD_CHECK(p);
-	return ++(p->refcount);
-}
-
-static zend_always_inline void zend_gc_try_addref(zend_refcounted_h *p) {
-	if (!(p->u.type_info & GC_IMMUTABLE)) {
-		ZEND_RC_MOD_CHECK(p);
-		++p->refcount;
-	}
-}
-
-static zend_always_inline void zend_gc_try_delref(zend_refcounted_h *p) {
-	if (!(p->u.type_info & GC_IMMUTABLE)) {
-		ZEND_RC_MOD_CHECK(p);
-		--p->refcount;
-	}
-}
-
-static zend_always_inline uint32_t zend_gc_delref(zend_refcounted_h *p) {
-	ZEND_ASSERT(p->refcount > 0);
-	ZEND_RC_MOD_CHECK(p);
-	return --(p->refcount);
-}
-
-static zend_always_inline uint32_t zend_gc_addref_ex(zend_refcounted_h *p, uint32_t rc) {
-	ZEND_RC_MOD_CHECK(p);
-	p->refcount += rc;
-	return p->refcount;
-}
-
-static zend_always_inline uint32_t zend_gc_delref_ex(zend_refcounted_h *p, uint32_t rc) {
-	ZEND_RC_MOD_CHECK(p);
-	p->refcount -= rc;
-	return p->refcount;
-}
-
 static zend_always_inline uint32_t zval_refcount_p(const zval* pz) {
 #if ZEND_DEBUG
 	ZEND_ASSERT(Z_REFCOUNTED_P(pz) || Z_TYPE_P(pz) == IS_ARRAY);
diff --git a/Zend/zend_variables.c b/Zend/zend_variables.c
index 00f10b08f80a..02c286ac486a 100644
--- a/Zend/zend_variables.c
+++ b/Zend/zend_variables.c
@@ -2,15 +2,14 @@
    +----------------------------------------------------------------------+
    | Zend Engine                                                          |
    +----------------------------------------------------------------------+
-   | Copyright (c) Zend Technologies Ltd. (http://www.zend.com)           |
+   | Copyright © Zend Technologies Ltd., a subsidiary company of          |
+   |     Perforce Software, Inc., and Contributors.                       |
    +----------------------------------------------------------------------+
-   | This source file is subject to version 2.00 of the Zend license,     |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | http://www.zend.com/license/2_00.txt.                                |
-   | If you did not receive a copy of the Zend license and are unable to  |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@zend.com so we can mail you a copy immediately.              |
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Authors: Andi Gutmans                                  |
    |          Zeev Suraski                                  |
diff --git a/Zend/zend_variables.h b/Zend/zend_variables.h
index d90ad9951782..9c6040a75bcb 100644
--- a/Zend/zend_variables.h
+++ b/Zend/zend_variables.h
@@ -2,15 +2,14 @@
    +----------------------------------------------------------------------+
    | Zend Engine                                                          |
    +----------------------------------------------------------------------+
-   | Copyright (c) Zend Technologies Ltd. (http://www.zend.com)           |
+   | Copyright © Zend Technologies Ltd., a subsidiary company of          |
+   |     Perforce Software, Inc., and Contributors.                       |
    +----------------------------------------------------------------------+
-   | This source file is subject to version 2.00 of the Zend license,     |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | http://www.zend.com/license/2_00.txt.                                |
-   | If you did not receive a copy of the Zend license and are unable to  |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@zend.com so we can mail you a copy immediately.              |
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Authors: Andi Gutmans                                  |
    |          Zeev Suraski                                  |
diff --git a/Zend/zend_verify_type_inference.h b/Zend/zend_verify_type_inference.h
index 8e9cbcbc181f..807bf21e3910 100644
--- a/Zend/zend_verify_type_inference.h
+++ b/Zend/zend_verify_type_inference.h
@@ -2,15 +2,14 @@
    +----------------------------------------------------------------------+
    | Zend Engine                                                          |
    +----------------------------------------------------------------------+
-   | Copyright (c) Zend Technologies Ltd. (http://www.zend.com)           |
+   | Copyright © Zend Technologies Ltd., a subsidiary company of          |
+   |     Perforce Software, Inc., and Contributors.                       |
    +----------------------------------------------------------------------+
-   | This source file is subject to version 2.00 of the Zend license,     |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | http://www.zend.com/license/2_00.txt.                                |
-   | If you did not receive a copy of the Zend license and are unable to  |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@zend.com so we can mail you a copy immediately.              |
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
 */
 
diff --git a/Zend/zend_virtual_cwd.c b/Zend/zend_virtual_cwd.c
index 94183e3724c4..da27e9fd5426 100644
--- a/Zend/zend_virtual_cwd.c
+++ b/Zend/zend_virtual_cwd.c
@@ -1,14 +1,12 @@
 /*
    +----------------------------------------------------------------------+
-   | Copyright (c) The PHP Group                                          |
+   | Copyright © The PHP Group and Contributors.                          |
    +----------------------------------------------------------------------+
-   | This source file is subject to version 3.01 of the PHP license,      |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | https://www.php.net/license/3_01.txt                                 |
-   | If you did not receive a copy of the PHP license and are unable to   |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@php.net so we can mail you a copy immediately.               |
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Authors: Andi Gutmans                                  |
    |          Sascha Schumann                         |
@@ -195,7 +193,7 @@ void virtual_cwd_main_cwd_init(uint8_t reinit) /* {{{ */
 	main_cwd_state.cwd_length = strlen(cwd);
 #ifdef ZEND_WIN32
 	if (main_cwd_state.cwd_length >= 2 && cwd[1] == ':') {
-		cwd[0] = toupper(cwd[0]);
+		cwd[0] = toupper((unsigned char)cwd[0]);
 	}
 #endif
 	main_cwd_state.cwd = strdup(cwd);
@@ -271,7 +269,7 @@ CWD_API char *virtual_getcwd_ex(size_t *length) /* {{{ */
 		*length = state->cwd_length+1;
 		retval = (char *) emalloc(*length+1);
 		memcpy(retval, state->cwd, *length);
-		retval[0] = toupper(retval[0]);
+		retval[0] = toupper((unsigned char)retval[0]);
 		retval[*length-1] = DEFAULT_SLASH;
 		retval[*length] = '\0';
 		return retval;
@@ -1114,7 +1112,7 @@ CWD_API int virtual_file_ex(cwd_state *state, const char *path, verify_path_func
 			if (resolved_path[start] == 0) {
 				goto verify;
 			}
-			resolved_path[start] = toupper(resolved_path[start]);
+			resolved_path[start] = toupper((unsigned char)resolved_path[start]);
 			start++;
 		}
 		resolved_path[start++] = DEFAULT_SLASH;
@@ -1122,13 +1120,13 @@ CWD_API int virtual_file_ex(cwd_state *state, const char *path, verify_path_func
 			if (resolved_path[start] == 0) {
 				goto verify;
 			}
-			resolved_path[start] = toupper(resolved_path[start]);
+			resolved_path[start] = toupper((unsigned char)resolved_path[start]);
 			start++;
 		}
 		resolved_path[start++] = DEFAULT_SLASH;
 	} else if (IS_ABSOLUTE_PATH(resolved_path, path_length)) {
 		/* skip DRIVE name */
-		resolved_path[0] = toupper(resolved_path[0]);
+		resolved_path[0] = toupper((unsigned char)resolved_path[0]);
 		resolved_path[2] = DEFAULT_SLASH;
 		if (path_length == 2) {
 			resolved_path[3] = '\0';
diff --git a/Zend/zend_virtual_cwd.h b/Zend/zend_virtual_cwd.h
index 21735f6dfae5..ad30c0323892 100644
--- a/Zend/zend_virtual_cwd.h
+++ b/Zend/zend_virtual_cwd.h
@@ -1,14 +1,12 @@
 /*
    +----------------------------------------------------------------------+
-   | Copyright (c) The PHP Group                                          |
+   | Copyright © The PHP Group and Contributors.                          |
    +----------------------------------------------------------------------+
-   | This source file is subject to version 3.01 of the PHP license,      |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | https://www.php.net/license/3_01.txt                                 |
-   | If you did not receive a copy of the PHP license and are unable to   |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@php.net so we can mail you a copy immediately.               |
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Authors: Andi Gutmans                                  |
    |          Sascha Schumann                         |
@@ -87,7 +85,7 @@ typedef unsigned short mode_t;
 #define IS_UNC_PATH(path, len) \
 	(len >= 2 && IS_SLASH(path[0]) && IS_SLASH(path[1]))
 #define IS_ABSOLUTE_PATH(path, len) \
-	(len >= 2 && (/* is local */isalpha(path[0]) && path[1] == ':' || /* is UNC */IS_SLASH(path[0]) && IS_SLASH(path[1])))
+	(len >= 2 && (/* is local */isalpha((unsigned char)(path)[0]) && path[1] == ':' || /* is UNC */IS_SLASH(path[0]) && IS_SLASH(path[1])))
 
 #else
 #ifdef HAVE_DIRENT_H
diff --git a/Zend/zend_vm.h b/Zend/zend_vm.h
index c9c41c75c72a..4f4a48c92205 100644
--- a/Zend/zend_vm.h
+++ b/Zend/zend_vm.h
@@ -2,15 +2,14 @@
    +----------------------------------------------------------------------+
    | Zend Engine                                                          |
    +----------------------------------------------------------------------+
-   | Copyright (c) Zend Technologies Ltd. (http://www.zend.com)           |
+   | Copyright © Zend Technologies Ltd., a subsidiary company of          |
+   |     Perforce Software, Inc., and Contributors.                       |
    +----------------------------------------------------------------------+
-   | This source file is subject to version 2.00 of the Zend license,     |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | http://www.zend.com/license/2_00.txt.                                |
-   | If you did not receive a copy of the Zend license and are unable to  |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@zend.com so we can mail you a copy immediately.              |
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Authors: Dmitry Stogov                               |
    +----------------------------------------------------------------------+
@@ -32,6 +31,7 @@ ZEND_API void ZEND_FASTCALL zend_serialize_opcode_handler(zend_op *op);
 ZEND_API void ZEND_FASTCALL zend_deserialize_opcode_handler(zend_op *op);
 ZEND_API const void* ZEND_FASTCALL zend_get_opcode_handler_func(const zend_op *op);
 ZEND_API const zend_op *zend_get_halt_op(void);
+ZEND_API const zend_op *zend_get_interrupt_op(void);
 ZEND_API int ZEND_FASTCALL zend_vm_call_opcode_handler(zend_execute_data *ex);
 ZEND_API int zend_vm_kind(void);
 ZEND_API bool zend_gcc_global_regs(void);
@@ -39,6 +39,10 @@ ZEND_API bool zend_gcc_global_regs(void);
 void zend_vm_init(void);
 void zend_vm_dtor(void);
 
+#if ZEND_VM_KIND == ZEND_VM_KIND_TAILCALL
+const struct _zend_op *ZEND_FASTCALL zend_vm_handle_interrupt(struct _zend_execute_data *execute_data, const struct _zend_op *opline);
+#endif
+
 END_EXTERN_C()
 
 #define ZEND_VM_SET_OPCODE_HANDLER(opline) zend_vm_set_opcode_handler(opline)
diff --git a/Zend/zend_vm_def.h b/Zend/zend_vm_def.h
index 86708f8c97a2..a0bfad488f85 100644
--- a/Zend/zend_vm_def.h
+++ b/Zend/zend_vm_def.h
@@ -2,15 +2,14 @@
    +----------------------------------------------------------------------+
    | Zend Engine                                                          |
    +----------------------------------------------------------------------+
-   | Copyright (c) Zend Technologies Ltd. (http://www.zend.com)           |
+   | Copyright © Zend Technologies Ltd., a subsidiary company of          |
+   |     Perforce Software, Inc., and Contributors.                       |
    +----------------------------------------------------------------------+
-   | This source file is subject to version 2.00 of the Zend license,     |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | http://www.zend.com/license/2_00.txt.                                |
-   | If you did not receive a copy of the Zend license and are unable to  |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@zend.com so we can mail you a copy immediately.              |
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Authors: Andi Gutmans                                  |
    |          Zeev Suraski                                  |
@@ -4154,11 +4153,15 @@ ZEND_VM_HOT_HANDLER(129, ZEND_DO_ICALL, ANY, ANY, SPEC(RETVAL,OBSERVER))
 		if (should_throw) {
 			zend_internal_call_arginfo_violation(call->func);
 		}
-		ZEND_ASSERT(!(call->func->common.fn_flags & ZEND_ACC_HAS_RETURN_TYPE) ||
-			zend_verify_internal_return_type(call->func, ret));
+		if (call->func->common.fn_flags & ZEND_ACC_HAS_RETURN_TYPE) {
+			bool result = zend_verify_internal_return_type(call->func, ret);
+			ZEND_ASSERT(result);
+		}
 		ZEND_ASSERT((call->func->common.fn_flags & ZEND_ACC_RETURN_REFERENCE)
 			? Z_ISREF_P(ret) : !Z_ISREF_P(ret));
 		zend_verify_internal_func_info(call->func, ret);
+		ZEND_ASSERT(!(ZEND_CALL_INFO(call) & ZEND_CALL_DYNAMIC)
+				|| !(call->func->common.fn_flags2 & ZEND_ACC2_FORBID_DYN_CALLS));
 	}
 #endif
 	ZEND_OBSERVER_FCALL_END(call, EG(exception) ? NULL : ret);
@@ -4283,11 +4286,15 @@ ZEND_VM_HOT_HANDLER(131, ZEND_DO_FCALL_BY_NAME, ANY, ANY, SPEC(RETVAL,OBSERVER))
 			if (should_throw) {
 				zend_internal_call_arginfo_violation(call->func);
 			}
-			ZEND_ASSERT(!(call->func->common.fn_flags & ZEND_ACC_HAS_RETURN_TYPE) ||
-				zend_verify_internal_return_type(call->func, ret));
+			if (call->func->common.fn_flags & ZEND_ACC_HAS_RETURN_TYPE) {
+				bool result = zend_verify_internal_return_type(call->func, ret);
+				ZEND_ASSERT(result);
+			}
 			ZEND_ASSERT((call->func->common.fn_flags & ZEND_ACC_RETURN_REFERENCE)
 				? Z_ISREF_P(ret) : !Z_ISREF_P(ret));
 			zend_verify_internal_func_info(call->func, ret);
+			ZEND_ASSERT(!(ZEND_CALL_INFO(call) & ZEND_CALL_DYNAMIC)
+					|| !(call->func->common.fn_flags2 & ZEND_ACC2_FORBID_DYN_CALLS));
 		}
 		ZEND_ASSERT(opline->result_type != IS_TMP_VAR || !Z_ISREF_P(ret));
 #endif
@@ -4412,11 +4419,15 @@ ZEND_VM_HOT_HANDLER(60, ZEND_DO_FCALL, ANY, ANY, SPEC(RETVAL,OBSERVER))
 			if (should_throw) {
 				zend_internal_call_arginfo_violation(call->func);
 			}
-			ZEND_ASSERT(!(call->func->common.fn_flags & ZEND_ACC_HAS_RETURN_TYPE) ||
-				zend_verify_internal_return_type(call->func, ret));
+			if (call->func->common.fn_flags & ZEND_ACC_HAS_RETURN_TYPE) {
+				bool result = zend_verify_internal_return_type(call->func, ret);
+				ZEND_ASSERT(result);
+			}
 			ZEND_ASSERT((call->func->common.fn_flags & ZEND_ACC_RETURN_REFERENCE)
 				? Z_ISREF_P(ret) : !Z_ISREF_P(ret));
 			zend_verify_internal_func_info(call->func, ret);
+			ZEND_ASSERT(!(ZEND_CALL_INFO(call) & ZEND_CALL_DYNAMIC)
+					|| !(call->func->common.fn_flags2 & ZEND_ACC2_FORBID_DYN_CALLS));
 		}
 		ZEND_ASSERT(opline->result_type != IS_TMP_VAR || !Z_ISREF_P(ret));
 #endif
@@ -4480,7 +4491,7 @@ ZEND_VM_COLD_CONST_HANDLER(124, ZEND_VERIFY_RETURN_TYPE, CONST|TMP|VAR|UNUSED|CV
 			ZVAL_DEREF(retval_ptr);
 		}
 
-		if (EXPECTED(ZEND_TYPE_CONTAINS_CODE(ret_info->type, Z_TYPE_P(retval_ptr)))) {
+		if (EXPECTED(ZEND_TYPE_CONTAINS_CODE(ret_info->type, Z_TYPE_P(retval_ref)))) {
 			ZEND_VM_NEXT_OPCODE();
 		}
 
@@ -4509,6 +4520,9 @@ ZEND_VM_COLD_CONST_HANDLER(124, ZEND_VERIFY_RETURN_TYPE, CONST|TMP|VAR|UNUSED|CV
 				}
 				retval_ptr = retval_ref;
 			}
+			if (EXPECTED(ZEND_TYPE_CONTAINS_CODE(ret_info->type, Z_TYPE_P(retval_ptr)))) {
+				ZEND_VM_NEXT_OPCODE();
+			}
 		}
 
 		SAVE_OPLINE();
@@ -8832,7 +8846,7 @@ ZEND_VM_COLD_CONST_HANDLER(121, ZEND_STRLEN, CONST|TMP|CV, ANY)
 				}
 
 				ZVAL_COPY(&tmp, value);
-				if (zend_parse_arg_str_weak(&tmp, &str, 1)) {
+				if ((str = zend_parse_arg_str_weak(&tmp, 1)) != NULL) {
 					ZVAL_LONG(EX_VAR(opline->result.var), ZSTR_LEN(str));
 					zval_ptr_dtor(&tmp);
 					break;
@@ -9012,7 +9026,7 @@ ZEND_VM_HANDLER(157, ZEND_FETCH_CLASS_NAME, CV|TMP|UNUSED|CLASS_FETCH, ANY)
 			}
 			ZVAL_STR_COPY(EX_VAR(opline->result.var), called_scope->name);
 			break;
-		EMPTY_SWITCH_DEFAULT_CASE()
+		default: ZEND_UNREACHABLE();
 	}
 	ZEND_VM_NEXT_OPCODE();
 }
@@ -9119,11 +9133,15 @@ ZEND_VM_HANDLER(158, ZEND_CALL_TRAMPOLINE, ANY, ANY, SPEC(OBSERVER))
 			if (should_throw) {
 				zend_internal_call_arginfo_violation(call->func);
 			}
-			ZEND_ASSERT(!(call->func->common.fn_flags & ZEND_ACC_HAS_RETURN_TYPE) ||
-				zend_verify_internal_return_type(call->func, ret));
+			if (call->func->common.fn_flags & ZEND_ACC_HAS_RETURN_TYPE) {
+				bool result = zend_verify_internal_return_type(call->func, ret);
+				ZEND_ASSERT(result);
+			}
 			ZEND_ASSERT((call->func->common.fn_flags & ZEND_ACC_RETURN_REFERENCE)
 				? Z_ISREF_P(ret) : !Z_ISREF_P(ret));
 			zend_verify_internal_func_info(call->func, ret);
+			ZEND_ASSERT(!(ZEND_CALL_INFO(call) & ZEND_CALL_DYNAMIC)
+					|| !(call->func->common.fn_flags2 & ZEND_ACC2_FORBID_DYN_CALLS));
 		}
 #endif
 		ZEND_OBSERVER_FCALL_END(call, EG(exception) ? NULL : ret);
@@ -9572,7 +9590,9 @@ ZEND_VM_COLD_CONST_HANDLER(190, ZEND_COUNT, CONST|TMP|CV, UNUSED)
 				zval retval;
 
 				zend_function *count_fn = zend_hash_find_ptr(&zobj->ce->function_table, ZSTR_KNOWN(ZEND_STR_COUNT));
+				GC_ADDREF(zobj);
 				zend_call_known_instance_method_with_0_params(count_fn, zobj, &retval);
+				OBJ_RELEASE(zobj);
 				count = zval_get_long(&retval);
 				zval_ptr_dtor(&retval);
 				break;
@@ -10607,7 +10627,12 @@ ZEND_VM_DEFINE_OP(137, ZEND_OP_DATA);
 ZEND_VM_HELPER(zend_interrupt_helper, ANY, ANY)
 {
 	zend_atomic_bool_store_ex(&EG(vm_interrupt), false);
+#if ZEND_VM_KIND == ZEND_VM_KIND_TAILCALL
+	/* opline is &call_interrupt_op. Load orig opline. */
+	LOAD_OPLINE();
+#else
 	SAVE_OPLINE();
+#endif
 	if (zend_atomic_bool_load_ex(&EG(timed_out))) {
 		zend_timeout();
 	} else if (zend_interrupt_function) {
diff --git a/Zend/zend_vm_execute.h b/Zend/zend_vm_execute.h
index cbfae90802cf..cedc735bbb1e 100644
--- a/Zend/zend_vm_execute.h
+++ b/Zend/zend_vm_execute.h
@@ -2,15 +2,14 @@
    +----------------------------------------------------------------------+
    | Zend Engine                                                          |
    +----------------------------------------------------------------------+
-   | Copyright (c) Zend Technologies Ltd. (http://www.zend.com)           |
+   | Copyright © Zend Technologies Ltd., a subsidiary company of          |
+   |     Perforce Software, Inc., and Contributors.                       |
    +----------------------------------------------------------------------+
-   | This source file is subject to version 2.00 of the Zend license,     |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | http://www.zend.com/license/2_00.txt.                                |
-   | If you did not receive a copy of the Zend license and are unable to  |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@zend.com so we can mail you a copy immediately.              |
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Authors: Andi Gutmans                                  |
    |          Zeev Suraski                                  |
@@ -331,6 +330,11 @@ static zend_op hybrid_halt_op;
 
 static zend_vm_opcode_handler_func_t const * zend_opcode_handler_funcs;
 #endif
+
+#if ZEND_VM_KIND == ZEND_VM_KIND_TAILCALL
+static const zend_op call_interrupt_op;
+#endif
+
 #if (ZEND_VM_KIND != ZEND_VM_KIND_HYBRID && ZEND_VM_KIND != ZEND_VM_KIND_TAILCALL) || !ZEND_VM_SPEC
 static zend_vm_opcode_handler_t zend_vm_get_opcode_handler(uint8_t opcode, const zend_op* op);
 #endif
@@ -1322,11 +1326,15 @@ static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_OPCODE_HANDLER_FUNC_CCONV ZEND_D
 		if (should_throw) {
 			zend_internal_call_arginfo_violation(call->func);
 		}
-		ZEND_ASSERT(!(call->func->common.fn_flags & ZEND_ACC_HAS_RETURN_TYPE) ||
-			zend_verify_internal_return_type(call->func, ret));
+		if (call->func->common.fn_flags & ZEND_ACC_HAS_RETURN_TYPE) {
+			bool result = zend_verify_internal_return_type(call->func, ret);
+			ZEND_ASSERT(result);
+		}
 		ZEND_ASSERT((call->func->common.fn_flags & ZEND_ACC_RETURN_REFERENCE)
 			? Z_ISREF_P(ret) : !Z_ISREF_P(ret));
 		zend_verify_internal_func_info(call->func, ret);
+		ZEND_ASSERT(!(ZEND_CALL_INFO(call) & ZEND_CALL_DYNAMIC)
+				|| !(call->func->common.fn_flags2 & ZEND_ACC2_FORBID_DYN_CALLS));
 	}
 #endif
 
@@ -1388,11 +1396,15 @@ static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_OPCODE_HANDLER_FUNC_CCONV ZEND_D
 		if (should_throw) {
 			zend_internal_call_arginfo_violation(call->func);
 		}
-		ZEND_ASSERT(!(call->func->common.fn_flags & ZEND_ACC_HAS_RETURN_TYPE) ||
-			zend_verify_internal_return_type(call->func, ret));
+		if (call->func->common.fn_flags & ZEND_ACC_HAS_RETURN_TYPE) {
+			bool result = zend_verify_internal_return_type(call->func, ret);
+			ZEND_ASSERT(result);
+		}
 		ZEND_ASSERT((call->func->common.fn_flags & ZEND_ACC_RETURN_REFERENCE)
 			? Z_ISREF_P(ret) : !Z_ISREF_P(ret));
 		zend_verify_internal_func_info(call->func, ret);
+		ZEND_ASSERT(!(ZEND_CALL_INFO(call) & ZEND_CALL_DYNAMIC)
+				|| !(call->func->common.fn_flags2 & ZEND_ACC2_FORBID_DYN_CALLS));
 	}
 #endif
 
@@ -1454,11 +1466,15 @@ static ZEND_VM_COLD ZEND_OPCODE_HANDLER_RET ZEND_OPCODE_HANDLER_FUNC_CCONV ZEND_
 		if (should_throw) {
 			zend_internal_call_arginfo_violation(call->func);
 		}
-		ZEND_ASSERT(!(call->func->common.fn_flags & ZEND_ACC_HAS_RETURN_TYPE) ||
-			zend_verify_internal_return_type(call->func, ret));
+		if (call->func->common.fn_flags & ZEND_ACC_HAS_RETURN_TYPE) {
+			bool result = zend_verify_internal_return_type(call->func, ret);
+			ZEND_ASSERT(result);
+		}
 		ZEND_ASSERT((call->func->common.fn_flags & ZEND_ACC_RETURN_REFERENCE)
 			? Z_ISREF_P(ret) : !Z_ISREF_P(ret));
 		zend_verify_internal_func_info(call->func, ret);
+		ZEND_ASSERT(!(ZEND_CALL_INFO(call) & ZEND_CALL_DYNAMIC)
+				|| !(call->func->common.fn_flags2 & ZEND_ACC2_FORBID_DYN_CALLS));
 	}
 #endif
 	zend_observer_fcall_end(call, EG(exception) ? NULL : ret);
@@ -1636,11 +1652,15 @@ static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_OPCODE_HANDLER_FUNC_CCONV ZEND_D
 			if (should_throw) {
 				zend_internal_call_arginfo_violation(call->func);
 			}
-			ZEND_ASSERT(!(call->func->common.fn_flags & ZEND_ACC_HAS_RETURN_TYPE) ||
-				zend_verify_internal_return_type(call->func, ret));
+			if (call->func->common.fn_flags & ZEND_ACC_HAS_RETURN_TYPE) {
+				bool result = zend_verify_internal_return_type(call->func, ret);
+				ZEND_ASSERT(result);
+			}
 			ZEND_ASSERT((call->func->common.fn_flags & ZEND_ACC_RETURN_REFERENCE)
 				? Z_ISREF_P(ret) : !Z_ISREF_P(ret));
 			zend_verify_internal_func_info(call->func, ret);
+			ZEND_ASSERT(!(ZEND_CALL_INFO(call) & ZEND_CALL_DYNAMIC)
+					|| !(call->func->common.fn_flags2 & ZEND_ACC2_FORBID_DYN_CALLS));
 		}
 		ZEND_ASSERT(opline->result_type != IS_TMP_VAR || !Z_ISREF_P(ret));
 #endif
@@ -1750,11 +1770,15 @@ static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_OPCODE_HANDLER_FUNC_CCONV ZEND_D
 			if (should_throw) {
 				zend_internal_call_arginfo_violation(call->func);
 			}
-			ZEND_ASSERT(!(call->func->common.fn_flags & ZEND_ACC_HAS_RETURN_TYPE) ||
-				zend_verify_internal_return_type(call->func, ret));
+			if (call->func->common.fn_flags & ZEND_ACC_HAS_RETURN_TYPE) {
+				bool result = zend_verify_internal_return_type(call->func, ret);
+				ZEND_ASSERT(result);
+			}
 			ZEND_ASSERT((call->func->common.fn_flags & ZEND_ACC_RETURN_REFERENCE)
 				? Z_ISREF_P(ret) : !Z_ISREF_P(ret));
 			zend_verify_internal_func_info(call->func, ret);
+			ZEND_ASSERT(!(ZEND_CALL_INFO(call) & ZEND_CALL_DYNAMIC)
+					|| !(call->func->common.fn_flags2 & ZEND_ACC2_FORBID_DYN_CALLS));
 		}
 		ZEND_ASSERT(opline->result_type != IS_TMP_VAR || !Z_ISREF_P(ret));
 #endif
@@ -1863,11 +1887,15 @@ static ZEND_VM_COLD ZEND_OPCODE_HANDLER_RET ZEND_OPCODE_HANDLER_FUNC_CCONV ZEND_
 			if (should_throw) {
 				zend_internal_call_arginfo_violation(call->func);
 			}
-			ZEND_ASSERT(!(call->func->common.fn_flags & ZEND_ACC_HAS_RETURN_TYPE) ||
-				zend_verify_internal_return_type(call->func, ret));
+			if (call->func->common.fn_flags & ZEND_ACC_HAS_RETURN_TYPE) {
+				bool result = zend_verify_internal_return_type(call->func, ret);
+				ZEND_ASSERT(result);
+			}
 			ZEND_ASSERT((call->func->common.fn_flags & ZEND_ACC_RETURN_REFERENCE)
 				? Z_ISREF_P(ret) : !Z_ISREF_P(ret));
 			zend_verify_internal_func_info(call->func, ret);
+			ZEND_ASSERT(!(ZEND_CALL_INFO(call) & ZEND_CALL_DYNAMIC)
+					|| !(call->func->common.fn_flags2 & ZEND_ACC2_FORBID_DYN_CALLS));
 		}
 		ZEND_ASSERT(opline->result_type != IS_TMP_VAR || !Z_ISREF_P(ret));
 #endif
@@ -1995,11 +2023,15 @@ static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_OPCODE_HANDLER_FUNC_CCONV ZEND_D
 			if (should_throw) {
 				zend_internal_call_arginfo_violation(call->func);
 			}
-			ZEND_ASSERT(!(call->func->common.fn_flags & ZEND_ACC_HAS_RETURN_TYPE) ||
-				zend_verify_internal_return_type(call->func, ret));
+			if (call->func->common.fn_flags & ZEND_ACC_HAS_RETURN_TYPE) {
+				bool result = zend_verify_internal_return_type(call->func, ret);
+				ZEND_ASSERT(result);
+			}
 			ZEND_ASSERT((call->func->common.fn_flags & ZEND_ACC_RETURN_REFERENCE)
 				? Z_ISREF_P(ret) : !Z_ISREF_P(ret));
 			zend_verify_internal_func_info(call->func, ret);
+			ZEND_ASSERT(!(ZEND_CALL_INFO(call) & ZEND_CALL_DYNAMIC)
+					|| !(call->func->common.fn_flags2 & ZEND_ACC2_FORBID_DYN_CALLS));
 		}
 		ZEND_ASSERT(opline->result_type != IS_TMP_VAR || !Z_ISREF_P(ret));
 #endif
@@ -2126,11 +2158,15 @@ static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_OPCODE_HANDLER_FUNC_CCONV ZEND_D
 			if (should_throw) {
 				zend_internal_call_arginfo_violation(call->func);
 			}
-			ZEND_ASSERT(!(call->func->common.fn_flags & ZEND_ACC_HAS_RETURN_TYPE) ||
-				zend_verify_internal_return_type(call->func, ret));
+			if (call->func->common.fn_flags & ZEND_ACC_HAS_RETURN_TYPE) {
+				bool result = zend_verify_internal_return_type(call->func, ret);
+				ZEND_ASSERT(result);
+			}
 			ZEND_ASSERT((call->func->common.fn_flags & ZEND_ACC_RETURN_REFERENCE)
 				? Z_ISREF_P(ret) : !Z_ISREF_P(ret));
 			zend_verify_internal_func_info(call->func, ret);
+			ZEND_ASSERT(!(ZEND_CALL_INFO(call) & ZEND_CALL_DYNAMIC)
+					|| !(call->func->common.fn_flags2 & ZEND_ACC2_FORBID_DYN_CALLS));
 		}
 		ZEND_ASSERT(opline->result_type != IS_TMP_VAR || !Z_ISREF_P(ret));
 #endif
@@ -2254,11 +2290,15 @@ static ZEND_VM_COLD ZEND_OPCODE_HANDLER_RET ZEND_OPCODE_HANDLER_FUNC_CCONV ZEND_
 			if (should_throw) {
 				zend_internal_call_arginfo_violation(call->func);
 			}
-			ZEND_ASSERT(!(call->func->common.fn_flags & ZEND_ACC_HAS_RETURN_TYPE) ||
-				zend_verify_internal_return_type(call->func, ret));
+			if (call->func->common.fn_flags & ZEND_ACC_HAS_RETURN_TYPE) {
+				bool result = zend_verify_internal_return_type(call->func, ret);
+				ZEND_ASSERT(result);
+			}
 			ZEND_ASSERT((call->func->common.fn_flags & ZEND_ACC_RETURN_REFERENCE)
 				? Z_ISREF_P(ret) : !Z_ISREF_P(ret));
 			zend_verify_internal_func_info(call->func, ret);
+			ZEND_ASSERT(!(ZEND_CALL_INFO(call) & ZEND_CALL_DYNAMIC)
+					|| !(call->func->common.fn_flags2 & ZEND_ACC2_FORBID_DYN_CALLS));
 		}
 		ZEND_ASSERT(opline->result_type != IS_TMP_VAR || !Z_ISREF_P(ret));
 #endif
@@ -3639,11 +3679,15 @@ static ZEND_OPCODE_HANDLER_RET ZEND_OPCODE_HANDLER_FUNC_CCONV ZEND_CALL_TRAMPOLI
 			if (should_throw) {
 				zend_internal_call_arginfo_violation(call->func);
 			}
-			ZEND_ASSERT(!(call->func->common.fn_flags & ZEND_ACC_HAS_RETURN_TYPE) ||
-				zend_verify_internal_return_type(call->func, ret));
+			if (call->func->common.fn_flags & ZEND_ACC_HAS_RETURN_TYPE) {
+				bool result = zend_verify_internal_return_type(call->func, ret);
+				ZEND_ASSERT(result);
+			}
 			ZEND_ASSERT((call->func->common.fn_flags & ZEND_ACC_RETURN_REFERENCE)
 				? Z_ISREF_P(ret) : !Z_ISREF_P(ret));
 			zend_verify_internal_func_info(call->func, ret);
+			ZEND_ASSERT(!(ZEND_CALL_INFO(call) & ZEND_CALL_DYNAMIC)
+					|| !(call->func->common.fn_flags2 & ZEND_ACC2_FORBID_DYN_CALLS));
 		}
 #endif
 
@@ -3783,11 +3827,15 @@ static ZEND_OPCODE_HANDLER_RET ZEND_OPCODE_HANDLER_FUNC_CCONV ZEND_CALL_TRAMPOLI
 			if (should_throw) {
 				zend_internal_call_arginfo_violation(call->func);
 			}
-			ZEND_ASSERT(!(call->func->common.fn_flags & ZEND_ACC_HAS_RETURN_TYPE) ||
-				zend_verify_internal_return_type(call->func, ret));
+			if (call->func->common.fn_flags & ZEND_ACC_HAS_RETURN_TYPE) {
+				bool result = zend_verify_internal_return_type(call->func, ret);
+				ZEND_ASSERT(result);
+			}
 			ZEND_ASSERT((call->func->common.fn_flags & ZEND_ACC_RETURN_REFERENCE)
 				? Z_ISREF_P(ret) : !Z_ISREF_P(ret));
 			zend_verify_internal_func_info(call->func, ret);
+			ZEND_ASSERT(!(ZEND_CALL_INFO(call) & ZEND_CALL_DYNAMIC)
+					|| !(call->func->common.fn_flags2 & ZEND_ACC2_FORBID_DYN_CALLS));
 		}
 #endif
 		zend_observer_fcall_end(call, EG(exception) ? NULL : ret);
@@ -3984,7 +4032,12 @@ static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_OPCODE_HANDLER_FUNC_CCONV ZEND_J
 static zend_never_inline ZEND_OPCODE_HANDLER_RET ZEND_OPCODE_HANDLER_FUNC_CCONV  zend_interrupt_helper_SPEC(ZEND_OPCODE_HANDLER_ARGS)
 {
 	zend_atomic_bool_store_ex(&EG(vm_interrupt), false);
+#if ZEND_VM_KIND == ZEND_VM_KIND_TAILCALL
+	/* opline is &call_interrupt_op. Load orig opline. */
+	LOAD_OPLINE();
+#else
 	SAVE_OPLINE();
+#endif
 	if (zend_atomic_bool_load_ex(&EG(timed_out))) {
 		zend_timeout();
 	} else if (zend_interrupt_function) {
@@ -6040,7 +6093,7 @@ static ZEND_VM_COLD ZEND_OPCODE_HANDLER_RET ZEND_OPCODE_HANDLER_FUNC_CCONV ZEND_
 				}
 
 				ZVAL_COPY(&tmp, value);
-				if (zend_parse_arg_str_weak(&tmp, &str, 1)) {
+				if ((str = zend_parse_arg_str_weak(&tmp, 1)) != NULL) {
 					ZVAL_LONG(EX_VAR(opline->result.var), ZSTR_LEN(str));
 					zval_ptr_dtor(&tmp);
 					break;
@@ -11166,7 +11219,7 @@ static ZEND_VM_COLD ZEND_OPCODE_HANDLER_RET ZEND_OPCODE_HANDLER_FUNC_CCONV ZEND_
 			ZVAL_DEREF(retval_ptr);
 		}
 
-		if (EXPECTED(ZEND_TYPE_CONTAINS_CODE(ret_info->type, Z_TYPE_P(retval_ptr)))) {
+		if (EXPECTED(ZEND_TYPE_CONTAINS_CODE(ret_info->type, Z_TYPE_P(retval_ref)))) {
 			ZEND_VM_NEXT_OPCODE();
 		}
 
@@ -11195,6 +11248,9 @@ static ZEND_VM_COLD ZEND_OPCODE_HANDLER_RET ZEND_OPCODE_HANDLER_FUNC_CCONV ZEND_
 				}
 				retval_ptr = retval_ref;
 			}
+			if (EXPECTED(ZEND_TYPE_CONTAINS_CODE(ret_info->type, Z_TYPE_P(retval_ptr)))) {
+				ZEND_VM_NEXT_OPCODE();
+			}
 		}
 
 		SAVE_OPLINE();
@@ -11765,7 +11821,9 @@ static ZEND_VM_COLD ZEND_OPCODE_HANDLER_RET ZEND_OPCODE_HANDLER_FUNC_CCONV ZEND_
 				zval retval;
 
 				zend_function *count_fn = zend_hash_find_ptr(&zobj->ce->function_table, ZSTR_KNOWN(ZEND_STR_COUNT));
+				GC_ADDREF(zobj);
 				zend_call_known_instance_method_with_0_params(count_fn, zobj, &retval);
+				OBJ_RELEASE(zobj);
 				count = zval_get_long(&retval);
 				zval_ptr_dtor(&retval);
 				break;
@@ -18122,7 +18180,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_OPCODE_HANDLER_FUNC_CCONV ZEND_STRLEN_SPEC_T
 				}
 
 				ZVAL_COPY(&tmp, value);
-				if (zend_parse_arg_str_weak(&tmp, &str, 1)) {
+				if ((str = zend_parse_arg_str_weak(&tmp, 1)) != NULL) {
 					ZVAL_LONG(EX_VAR(opline->result.var), ZSTR_LEN(str));
 					zval_ptr_dtor(&tmp);
 					break;
@@ -18232,7 +18290,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_OPCODE_HANDLER_FUNC_CCONV ZEND_FETCH_CLASS_N
 			}
 			ZVAL_STR_COPY(EX_VAR(opline->result.var), called_scope->name);
 			break;
-		EMPTY_SWITCH_DEFAULT_CASE()
+		default: ZEND_UNREACHABLE();
 	}
 	ZEND_VM_NEXT_OPCODE();
 }
@@ -21473,7 +21531,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_OPCODE_HANDLER_FUNC_CCONV ZEND_VERIFY_RETURN
 			ZVAL_DEREF(retval_ptr);
 		}
 
-		if (EXPECTED(ZEND_TYPE_CONTAINS_CODE(ret_info->type, Z_TYPE_P(retval_ptr)))) {
+		if (EXPECTED(ZEND_TYPE_CONTAINS_CODE(ret_info->type, Z_TYPE_P(retval_ref)))) {
 			ZEND_VM_NEXT_OPCODE();
 		}
 
@@ -21502,6 +21560,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_OPCODE_HANDLER_FUNC_CCONV ZEND_VERIFY_RETURN
 				}
 				retval_ptr = retval_ref;
 			}
+			if (EXPECTED(ZEND_TYPE_CONTAINS_CODE(ret_info->type, Z_TYPE_P(retval_ptr)))) {
+				ZEND_VM_NEXT_OPCODE();
+			}
 		}
 
 		SAVE_OPLINE();
@@ -21965,7 +22026,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_OPCODE_HANDLER_FUNC_CCONV ZEND_COUNT_SPEC_TM
 				zval retval;
 
 				zend_function *count_fn = zend_hash_find_ptr(&zobj->ce->function_table, ZSTR_KNOWN(ZEND_STR_COUNT));
+				GC_ADDREF(zobj);
 				zend_call_known_instance_method_with_0_params(count_fn, zobj, &retval);
+				OBJ_RELEASE(zobj);
 				count = zval_get_long(&retval);
 				zval_ptr_dtor(&retval);
 				break;
@@ -29516,7 +29579,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_OPCODE_HANDLER_FUNC_CCONV ZEND_VERIFY_RETURN
 			ZVAL_DEREF(retval_ptr);
 		}
 
-		if (EXPECTED(ZEND_TYPE_CONTAINS_CODE(ret_info->type, Z_TYPE_P(retval_ptr)))) {
+		if (EXPECTED(ZEND_TYPE_CONTAINS_CODE(ret_info->type, Z_TYPE_P(retval_ref)))) {
 			ZEND_VM_NEXT_OPCODE();
 		}
 
@@ -29545,6 +29608,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_OPCODE_HANDLER_FUNC_CCONV ZEND_VERIFY_RETURN
 				}
 				retval_ptr = retval_ref;
 			}
+			if (EXPECTED(ZEND_TYPE_CONTAINS_CODE(ret_info->type, Z_TYPE_P(retval_ptr)))) {
+				ZEND_VM_NEXT_OPCODE();
+			}
 		}
 
 		SAVE_OPLINE();
@@ -32825,7 +32891,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_OPCODE_HANDLER_FUNC_CCONV ZEND_FETCH_CLASS_N
 			}
 			ZVAL_STR_COPY(EX_VAR(opline->result.var), called_scope->name);
 			break;
-		EMPTY_SWITCH_DEFAULT_CASE()
+		default: ZEND_UNREACHABLE();
 	}
 	ZEND_VM_NEXT_OPCODE();
 }
@@ -36903,7 +36969,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_OPCODE_HANDLER_FUNC_CCONV ZEND_VERIFY_RETURN
 			ZVAL_DEREF(retval_ptr);
 		}
 
-		if (EXPECTED(ZEND_TYPE_CONTAINS_CODE(ret_info->type, Z_TYPE_P(retval_ptr)))) {
+		if (EXPECTED(ZEND_TYPE_CONTAINS_CODE(ret_info->type, Z_TYPE_P(retval_ref)))) {
 			ZEND_VM_NEXT_OPCODE();
 		}
 
@@ -36932,6 +36998,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_OPCODE_HANDLER_FUNC_CCONV ZEND_VERIFY_RETURN
 				}
 				retval_ptr = retval_ref;
 			}
+			if (EXPECTED(ZEND_TYPE_CONTAINS_CODE(ret_info->type, Z_TYPE_P(retval_ptr)))) {
+				ZEND_VM_NEXT_OPCODE();
+			}
 		}
 
 		SAVE_OPLINE();
@@ -40711,7 +40780,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_OPCODE_HANDLER_FUNC_CCONV ZEND_STRLEN_SPEC_C
 				}
 
 				ZVAL_COPY(&tmp, value);
-				if (zend_parse_arg_str_weak(&tmp, &str, 1)) {
+				if ((str = zend_parse_arg_str_weak(&tmp, 1)) != NULL) {
 					ZVAL_LONG(EX_VAR(opline->result.var), ZSTR_LEN(str));
 					zval_ptr_dtor(&tmp);
 					break;
@@ -40825,7 +40894,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_OPCODE_HANDLER_FUNC_CCONV ZEND_FETCH_CLASS_N
 			}
 			ZVAL_STR_COPY(EX_VAR(opline->result.var), called_scope->name);
 			break;
-		EMPTY_SWITCH_DEFAULT_CASE()
+		default: ZEND_UNREACHABLE();
 	}
 	ZEND_VM_NEXT_OPCODE();
 }
@@ -49112,7 +49181,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_OPCODE_HANDLER_FUNC_CCONV ZEND_VERIFY_RETURN
 			ZVAL_DEREF(retval_ptr);
 		}
 
-		if (EXPECTED(ZEND_TYPE_CONTAINS_CODE(ret_info->type, Z_TYPE_P(retval_ptr)))) {
+		if (EXPECTED(ZEND_TYPE_CONTAINS_CODE(ret_info->type, Z_TYPE_P(retval_ref)))) {
 			ZEND_VM_NEXT_OPCODE();
 		}
 
@@ -49141,6 +49210,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_OPCODE_HANDLER_FUNC_CCONV ZEND_VERIFY_RETURN
 				}
 				retval_ptr = retval_ref;
 			}
+			if (EXPECTED(ZEND_TYPE_CONTAINS_CODE(ret_info->type, Z_TYPE_P(retval_ptr)))) {
+				ZEND_VM_NEXT_OPCODE();
+			}
 		}
 
 		SAVE_OPLINE();
@@ -49894,7 +49966,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_OPCODE_HANDLER_FUNC_CCONV ZEND_COUNT_SPEC_CV
 				zval retval;
 
 				zend_function *count_fn = zend_hash_find_ptr(&zobj->ce->function_table, ZSTR_KNOWN(ZEND_STR_COUNT));
+				GC_ADDREF(zobj);
 				zend_call_known_instance_method_with_0_params(count_fn, zobj, &retval);
+				OBJ_RELEASE(zobj);
 				count = zval_get_long(&retval);
 				zval_ptr_dtor(&retval);
 				break;
@@ -53439,6 +53513,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_OPCODE_HANDLER_FUNC_CCONV ZEND_NULL_HANDLER(
 	zend_error_noreturn(E_ERROR, "Invalid opcode %d/%d/%d.", OPLINE->opcode, OPLINE->op1_type, OPLINE->op2_type);
 }
 
+#if ZEND_VM_KIND == ZEND_VM_KIND_TAILCALL
+static ZEND_COLD zend_never_inline ZEND_OPCODE_HANDLER_RET ZEND_OPCODE_HANDLER_FUNC_CCONV zend_interrupt(ZEND_OPCODE_HANDLER_ARGS) {
+	SAVE_OPLINE();
+	return &call_interrupt_op;
+}
+#endif
 
 #if (ZEND_VM_KIND == ZEND_VM_KIND_HYBRID)
 # undef ZEND_VM_TAIL_CALL
@@ -53457,6 +53537,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_OPCODE_HANDLER_FUNC_CCONV ZEND_NULL_HANDLER(
 # undef ZEND_VM_RETURN
 # undef ZEND_VM_DISPATCH_TO_HELPER
 # undef ZEND_VM_INTERRUPT
+# undef ZEND_VM_ENTER_EX
+# undef ZEND_VM_LEAVE
 
 # define ZEND_VM_TAIL_CALL(call)               ZEND_MUSTTAIL return call
 # define ZEND_VM_CONTINUE()                    ZEND_VM_TAIL_CALL(opline->handler(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU))
@@ -53467,9 +53549,13 @@ static ZEND_OPCODE_HANDLER_RET ZEND_OPCODE_HANDLER_FUNC_CCONV ZEND_NULL_HANDLER(
         ZEND_VM_TAIL_CALL(opline->handler(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU)); \
     } while (0)
 # define ZEND_VM_DISPATCH_TO_LEAVE_HELPER(helper) opline = &call_leave_op; SAVE_OPLINE(); ZEND_VM_CONTINUE()
-# define ZEND_VM_INTERRUPT()        ZEND_VM_TAIL_CALL(zend_interrupt_helper_SPEC_TAILCALL(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU))
+# define ZEND_VM_INTERRUPT()        ZEND_VM_TAIL_CALL(zend_interrupt_TAILCALL(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU))
+# define ZEND_VM_ENTER_EX() ZEND_VM_INTERRUPT_CHECK(); ZEND_VM_CONTINUE()
+# define ZEND_VM_LEAVE()    ZEND_VM_CONTINUE()
 
 static ZEND_OPCODE_HANDLER_RET ZEND_OPCODE_HANDLER_CCONV zend_interrupt_helper_SPEC_TAILCALL(ZEND_OPCODE_HANDLER_ARGS);
+static ZEND_OPCODE_HANDLER_RET ZEND_OPCODE_HANDLER_FUNC_CCONV zend_interrupt(ZEND_OPCODE_HANDLER_ARGS);
+static ZEND_OPCODE_HANDLER_RET ZEND_OPCODE_HANDLER_CCONV zend_interrupt_TAILCALL(ZEND_OPCODE_HANDLER_ARGS);
 static ZEND_OPCODE_HANDLER_RET ZEND_OPCODE_HANDLER_CCONV ZEND_NULL_TAILCALL_HANDLER(ZEND_OPCODE_HANDLER_ARGS);
 static ZEND_OPCODE_HANDLER_RET ZEND_OPCODE_HANDLER_CCONV ZEND_HALT_TAILCALL_HANDLER(ZEND_OPCODE_HANDLER_ARGS);
 static zend_never_inline const zend_op *ZEND_OPCODE_HANDLER_CCONV zend_leave_helper_SPEC_TAILCALL(zend_execute_data *ex, const zend_op *opline);
@@ -53480,6 +53566,9 @@ static const zend_op call_halt_op = {
 static const zend_op call_leave_op = {
     .handler = zend_leave_helper_SPEC_TAILCALL,
 };
+static const zend_op call_interrupt_op = {
+    .handler = zend_interrupt_helper_SPEC_TAILCALL,
+};
 
 static zend_never_inline ZEND_OPCODE_HANDLER_RET ZEND_OPCODE_HANDLER_CCONV_EX  zend_add_helper_SPEC_TAILCALL(ZEND_OPCODE_HANDLER_ARGS_EX zval *op_1, zval *op_2);
 static zend_never_inline ZEND_OPCODE_HANDLER_RET ZEND_OPCODE_HANDLER_CCONV_EX  zend_sub_helper_SPEC_TAILCALL(ZEND_OPCODE_HANDLER_ARGS_EX zval *op_1, zval *op_2);
@@ -54042,11 +54131,15 @@ static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_OPCODE_HANDLER_CCONV ZEND_DO_ICA
 		if (should_throw) {
 			zend_internal_call_arginfo_violation(call->func);
 		}
-		ZEND_ASSERT(!(call->func->common.fn_flags & ZEND_ACC_HAS_RETURN_TYPE) ||
-			zend_verify_internal_return_type(call->func, ret));
+		if (call->func->common.fn_flags & ZEND_ACC_HAS_RETURN_TYPE) {
+			bool result = zend_verify_internal_return_type(call->func, ret);
+			ZEND_ASSERT(result);
+		}
 		ZEND_ASSERT((call->func->common.fn_flags & ZEND_ACC_RETURN_REFERENCE)
 			? Z_ISREF_P(ret) : !Z_ISREF_P(ret));
 		zend_verify_internal_func_info(call->func, ret);
+		ZEND_ASSERT(!(ZEND_CALL_INFO(call) & ZEND_CALL_DYNAMIC)
+				|| !(call->func->common.fn_flags2 & ZEND_ACC2_FORBID_DYN_CALLS));
 	}
 #endif
 
@@ -54108,11 +54201,15 @@ static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_OPCODE_HANDLER_CCONV ZEND_DO_ICA
 		if (should_throw) {
 			zend_internal_call_arginfo_violation(call->func);
 		}
-		ZEND_ASSERT(!(call->func->common.fn_flags & ZEND_ACC_HAS_RETURN_TYPE) ||
-			zend_verify_internal_return_type(call->func, ret));
+		if (call->func->common.fn_flags & ZEND_ACC_HAS_RETURN_TYPE) {
+			bool result = zend_verify_internal_return_type(call->func, ret);
+			ZEND_ASSERT(result);
+		}
 		ZEND_ASSERT((call->func->common.fn_flags & ZEND_ACC_RETURN_REFERENCE)
 			? Z_ISREF_P(ret) : !Z_ISREF_P(ret));
 		zend_verify_internal_func_info(call->func, ret);
+		ZEND_ASSERT(!(ZEND_CALL_INFO(call) & ZEND_CALL_DYNAMIC)
+				|| !(call->func->common.fn_flags2 & ZEND_ACC2_FORBID_DYN_CALLS));
 	}
 #endif
 
@@ -54174,11 +54271,15 @@ static ZEND_VM_COLD ZEND_OPCODE_HANDLER_RET ZEND_OPCODE_HANDLER_CCONV ZEND_DO_IC
 		if (should_throw) {
 			zend_internal_call_arginfo_violation(call->func);
 		}
-		ZEND_ASSERT(!(call->func->common.fn_flags & ZEND_ACC_HAS_RETURN_TYPE) ||
-			zend_verify_internal_return_type(call->func, ret));
+		if (call->func->common.fn_flags & ZEND_ACC_HAS_RETURN_TYPE) {
+			bool result = zend_verify_internal_return_type(call->func, ret);
+			ZEND_ASSERT(result);
+		}
 		ZEND_ASSERT((call->func->common.fn_flags & ZEND_ACC_RETURN_REFERENCE)
 			? Z_ISREF_P(ret) : !Z_ISREF_P(ret));
 		zend_verify_internal_func_info(call->func, ret);
+		ZEND_ASSERT(!(ZEND_CALL_INFO(call) & ZEND_CALL_DYNAMIC)
+				|| !(call->func->common.fn_flags2 & ZEND_ACC2_FORBID_DYN_CALLS));
 	}
 #endif
 	zend_observer_fcall_end(call, EG(exception) ? NULL : ret);
@@ -54356,11 +54457,15 @@ static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_OPCODE_HANDLER_CCONV ZEND_DO_FCA
 			if (should_throw) {
 				zend_internal_call_arginfo_violation(call->func);
 			}
-			ZEND_ASSERT(!(call->func->common.fn_flags & ZEND_ACC_HAS_RETURN_TYPE) ||
-				zend_verify_internal_return_type(call->func, ret));
+			if (call->func->common.fn_flags & ZEND_ACC_HAS_RETURN_TYPE) {
+				bool result = zend_verify_internal_return_type(call->func, ret);
+				ZEND_ASSERT(result);
+			}
 			ZEND_ASSERT((call->func->common.fn_flags & ZEND_ACC_RETURN_REFERENCE)
 				? Z_ISREF_P(ret) : !Z_ISREF_P(ret));
 			zend_verify_internal_func_info(call->func, ret);
+			ZEND_ASSERT(!(ZEND_CALL_INFO(call) & ZEND_CALL_DYNAMIC)
+					|| !(call->func->common.fn_flags2 & ZEND_ACC2_FORBID_DYN_CALLS));
 		}
 		ZEND_ASSERT(opline->result_type != IS_TMP_VAR || !Z_ISREF_P(ret));
 #endif
@@ -54470,11 +54575,15 @@ static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_OPCODE_HANDLER_CCONV ZEND_DO_FCA
 			if (should_throw) {
 				zend_internal_call_arginfo_violation(call->func);
 			}
-			ZEND_ASSERT(!(call->func->common.fn_flags & ZEND_ACC_HAS_RETURN_TYPE) ||
-				zend_verify_internal_return_type(call->func, ret));
+			if (call->func->common.fn_flags & ZEND_ACC_HAS_RETURN_TYPE) {
+				bool result = zend_verify_internal_return_type(call->func, ret);
+				ZEND_ASSERT(result);
+			}
 			ZEND_ASSERT((call->func->common.fn_flags & ZEND_ACC_RETURN_REFERENCE)
 				? Z_ISREF_P(ret) : !Z_ISREF_P(ret));
 			zend_verify_internal_func_info(call->func, ret);
+			ZEND_ASSERT(!(ZEND_CALL_INFO(call) & ZEND_CALL_DYNAMIC)
+					|| !(call->func->common.fn_flags2 & ZEND_ACC2_FORBID_DYN_CALLS));
 		}
 		ZEND_ASSERT(opline->result_type != IS_TMP_VAR || !Z_ISREF_P(ret));
 #endif
@@ -54583,11 +54692,15 @@ static ZEND_VM_COLD ZEND_OPCODE_HANDLER_RET ZEND_OPCODE_HANDLER_CCONV ZEND_DO_FC
 			if (should_throw) {
 				zend_internal_call_arginfo_violation(call->func);
 			}
-			ZEND_ASSERT(!(call->func->common.fn_flags & ZEND_ACC_HAS_RETURN_TYPE) ||
-				zend_verify_internal_return_type(call->func, ret));
+			if (call->func->common.fn_flags & ZEND_ACC_HAS_RETURN_TYPE) {
+				bool result = zend_verify_internal_return_type(call->func, ret);
+				ZEND_ASSERT(result);
+			}
 			ZEND_ASSERT((call->func->common.fn_flags & ZEND_ACC_RETURN_REFERENCE)
 				? Z_ISREF_P(ret) : !Z_ISREF_P(ret));
 			zend_verify_internal_func_info(call->func, ret);
+			ZEND_ASSERT(!(ZEND_CALL_INFO(call) & ZEND_CALL_DYNAMIC)
+					|| !(call->func->common.fn_flags2 & ZEND_ACC2_FORBID_DYN_CALLS));
 		}
 		ZEND_ASSERT(opline->result_type != IS_TMP_VAR || !Z_ISREF_P(ret));
 #endif
@@ -54715,11 +54828,15 @@ static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_OPCODE_HANDLER_CCONV ZEND_DO_FCA
 			if (should_throw) {
 				zend_internal_call_arginfo_violation(call->func);
 			}
-			ZEND_ASSERT(!(call->func->common.fn_flags & ZEND_ACC_HAS_RETURN_TYPE) ||
-				zend_verify_internal_return_type(call->func, ret));
+			if (call->func->common.fn_flags & ZEND_ACC_HAS_RETURN_TYPE) {
+				bool result = zend_verify_internal_return_type(call->func, ret);
+				ZEND_ASSERT(result);
+			}
 			ZEND_ASSERT((call->func->common.fn_flags & ZEND_ACC_RETURN_REFERENCE)
 				? Z_ISREF_P(ret) : !Z_ISREF_P(ret));
 			zend_verify_internal_func_info(call->func, ret);
+			ZEND_ASSERT(!(ZEND_CALL_INFO(call) & ZEND_CALL_DYNAMIC)
+					|| !(call->func->common.fn_flags2 & ZEND_ACC2_FORBID_DYN_CALLS));
 		}
 		ZEND_ASSERT(opline->result_type != IS_TMP_VAR || !Z_ISREF_P(ret));
 #endif
@@ -54846,11 +54963,15 @@ static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_OPCODE_HANDLER_CCONV ZEND_DO_FCA
 			if (should_throw) {
 				zend_internal_call_arginfo_violation(call->func);
 			}
-			ZEND_ASSERT(!(call->func->common.fn_flags & ZEND_ACC_HAS_RETURN_TYPE) ||
-				zend_verify_internal_return_type(call->func, ret));
+			if (call->func->common.fn_flags & ZEND_ACC_HAS_RETURN_TYPE) {
+				bool result = zend_verify_internal_return_type(call->func, ret);
+				ZEND_ASSERT(result);
+			}
 			ZEND_ASSERT((call->func->common.fn_flags & ZEND_ACC_RETURN_REFERENCE)
 				? Z_ISREF_P(ret) : !Z_ISREF_P(ret));
 			zend_verify_internal_func_info(call->func, ret);
+			ZEND_ASSERT(!(ZEND_CALL_INFO(call) & ZEND_CALL_DYNAMIC)
+					|| !(call->func->common.fn_flags2 & ZEND_ACC2_FORBID_DYN_CALLS));
 		}
 		ZEND_ASSERT(opline->result_type != IS_TMP_VAR || !Z_ISREF_P(ret));
 #endif
@@ -54974,11 +55095,15 @@ static ZEND_VM_COLD ZEND_OPCODE_HANDLER_RET ZEND_OPCODE_HANDLER_CCONV ZEND_DO_FC
 			if (should_throw) {
 				zend_internal_call_arginfo_violation(call->func);
 			}
-			ZEND_ASSERT(!(call->func->common.fn_flags & ZEND_ACC_HAS_RETURN_TYPE) ||
-				zend_verify_internal_return_type(call->func, ret));
+			if (call->func->common.fn_flags & ZEND_ACC_HAS_RETURN_TYPE) {
+				bool result = zend_verify_internal_return_type(call->func, ret);
+				ZEND_ASSERT(result);
+			}
 			ZEND_ASSERT((call->func->common.fn_flags & ZEND_ACC_RETURN_REFERENCE)
 				? Z_ISREF_P(ret) : !Z_ISREF_P(ret));
 			zend_verify_internal_func_info(call->func, ret);
+			ZEND_ASSERT(!(ZEND_CALL_INFO(call) & ZEND_CALL_DYNAMIC)
+					|| !(call->func->common.fn_flags2 & ZEND_ACC2_FORBID_DYN_CALLS));
 		}
 		ZEND_ASSERT(opline->result_type != IS_TMP_VAR || !Z_ISREF_P(ret));
 #endif
@@ -56243,11 +56368,15 @@ static ZEND_OPCODE_HANDLER_RET ZEND_OPCODE_HANDLER_CCONV ZEND_CALL_TRAMPOLINE_SP
 			if (should_throw) {
 				zend_internal_call_arginfo_violation(call->func);
 			}
-			ZEND_ASSERT(!(call->func->common.fn_flags & ZEND_ACC_HAS_RETURN_TYPE) ||
-				zend_verify_internal_return_type(call->func, ret));
+			if (call->func->common.fn_flags & ZEND_ACC_HAS_RETURN_TYPE) {
+				bool result = zend_verify_internal_return_type(call->func, ret);
+				ZEND_ASSERT(result);
+			}
 			ZEND_ASSERT((call->func->common.fn_flags & ZEND_ACC_RETURN_REFERENCE)
 				? Z_ISREF_P(ret) : !Z_ISREF_P(ret));
 			zend_verify_internal_func_info(call->func, ret);
+			ZEND_ASSERT(!(ZEND_CALL_INFO(call) & ZEND_CALL_DYNAMIC)
+					|| !(call->func->common.fn_flags2 & ZEND_ACC2_FORBID_DYN_CALLS));
 		}
 #endif
 
@@ -56387,11 +56516,15 @@ static ZEND_OPCODE_HANDLER_RET ZEND_OPCODE_HANDLER_CCONV ZEND_CALL_TRAMPOLINE_SP
 			if (should_throw) {
 				zend_internal_call_arginfo_violation(call->func);
 			}
-			ZEND_ASSERT(!(call->func->common.fn_flags & ZEND_ACC_HAS_RETURN_TYPE) ||
-				zend_verify_internal_return_type(call->func, ret));
+			if (call->func->common.fn_flags & ZEND_ACC_HAS_RETURN_TYPE) {
+				bool result = zend_verify_internal_return_type(call->func, ret);
+				ZEND_ASSERT(result);
+			}
 			ZEND_ASSERT((call->func->common.fn_flags & ZEND_ACC_RETURN_REFERENCE)
 				? Z_ISREF_P(ret) : !Z_ISREF_P(ret));
 			zend_verify_internal_func_info(call->func, ret);
+			ZEND_ASSERT(!(ZEND_CALL_INFO(call) & ZEND_CALL_DYNAMIC)
+					|| !(call->func->common.fn_flags2 & ZEND_ACC2_FORBID_DYN_CALLS));
 		}
 #endif
 		zend_observer_fcall_end(call, EG(exception) ? NULL : ret);
@@ -56588,7 +56721,12 @@ static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_OPCODE_HANDLER_CCONV ZEND_JMP_FO
 static zend_never_inline ZEND_OPCODE_HANDLER_RET ZEND_OPCODE_HANDLER_CCONV  zend_interrupt_helper_SPEC_TAILCALL(ZEND_OPCODE_HANDLER_ARGS)
 {
 	zend_atomic_bool_store_ex(&EG(vm_interrupt), false);
+#if ZEND_VM_KIND == ZEND_VM_KIND_TAILCALL
+	/* opline is &call_interrupt_op. Load orig opline. */
+	LOAD_OPLINE();
+#else
 	SAVE_OPLINE();
+#endif
 	if (zend_atomic_bool_load_ex(&EG(timed_out))) {
 		zend_timeout();
 	} else if (zend_interrupt_function) {
@@ -58644,7 +58782,7 @@ static ZEND_VM_COLD ZEND_OPCODE_HANDLER_RET ZEND_OPCODE_HANDLER_CCONV ZEND_STRLE
 				}
 
 				ZVAL_COPY(&tmp, value);
-				if (zend_parse_arg_str_weak(&tmp, &str, 1)) {
+				if ((str = zend_parse_arg_str_weak(&tmp, 1)) != NULL) {
 					ZVAL_LONG(EX_VAR(opline->result.var), ZSTR_LEN(str));
 					zval_ptr_dtor(&tmp);
 					break;
@@ -63668,7 +63806,7 @@ static ZEND_VM_COLD ZEND_OPCODE_HANDLER_RET ZEND_OPCODE_HANDLER_CCONV ZEND_VERIF
 			ZVAL_DEREF(retval_ptr);
 		}
 
-		if (EXPECTED(ZEND_TYPE_CONTAINS_CODE(ret_info->type, Z_TYPE_P(retval_ptr)))) {
+		if (EXPECTED(ZEND_TYPE_CONTAINS_CODE(ret_info->type, Z_TYPE_P(retval_ref)))) {
 			ZEND_VM_NEXT_OPCODE();
 		}
 
@@ -63697,6 +63835,9 @@ static ZEND_VM_COLD ZEND_OPCODE_HANDLER_RET ZEND_OPCODE_HANDLER_CCONV ZEND_VERIF
 				}
 				retval_ptr = retval_ref;
 			}
+			if (EXPECTED(ZEND_TYPE_CONTAINS_CODE(ret_info->type, Z_TYPE_P(retval_ptr)))) {
+				ZEND_VM_NEXT_OPCODE();
+			}
 		}
 
 		SAVE_OPLINE();
@@ -64267,7 +64408,9 @@ static ZEND_VM_COLD ZEND_OPCODE_HANDLER_RET ZEND_OPCODE_HANDLER_CCONV ZEND_COUNT
 				zval retval;
 
 				zend_function *count_fn = zend_hash_find_ptr(&zobj->ce->function_table, ZSTR_KNOWN(ZEND_STR_COUNT));
+				GC_ADDREF(zobj);
 				zend_call_known_instance_method_with_0_params(count_fn, zobj, &retval);
+				OBJ_RELEASE(zobj);
 				count = zval_get_long(&retval);
 				zval_ptr_dtor(&retval);
 				break;
@@ -70624,7 +70767,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_OPCODE_HANDLER_CCONV ZEND_STRLEN_SPEC_TMP_TA
 				}
 
 				ZVAL_COPY(&tmp, value);
-				if (zend_parse_arg_str_weak(&tmp, &str, 1)) {
+				if ((str = zend_parse_arg_str_weak(&tmp, 1)) != NULL) {
 					ZVAL_LONG(EX_VAR(opline->result.var), ZSTR_LEN(str));
 					zval_ptr_dtor(&tmp);
 					break;
@@ -70734,7 +70877,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_OPCODE_HANDLER_CCONV ZEND_FETCH_CLASS_NAME_S
 			}
 			ZVAL_STR_COPY(EX_VAR(opline->result.var), called_scope->name);
 			break;
-		EMPTY_SWITCH_DEFAULT_CASE()
+		default: ZEND_UNREACHABLE();
 	}
 	ZEND_VM_NEXT_OPCODE();
 }
@@ -73875,7 +74018,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_OPCODE_HANDLER_CCONV ZEND_VERIFY_RETURN_TYPE
 			ZVAL_DEREF(retval_ptr);
 		}
 
-		if (EXPECTED(ZEND_TYPE_CONTAINS_CODE(ret_info->type, Z_TYPE_P(retval_ptr)))) {
+		if (EXPECTED(ZEND_TYPE_CONTAINS_CODE(ret_info->type, Z_TYPE_P(retval_ref)))) {
 			ZEND_VM_NEXT_OPCODE();
 		}
 
@@ -73904,6 +74047,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_OPCODE_HANDLER_CCONV ZEND_VERIFY_RETURN_TYPE
 				}
 				retval_ptr = retval_ref;
 			}
+			if (EXPECTED(ZEND_TYPE_CONTAINS_CODE(ret_info->type, Z_TYPE_P(retval_ptr)))) {
+				ZEND_VM_NEXT_OPCODE();
+			}
 		}
 
 		SAVE_OPLINE();
@@ -74367,7 +74513,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_OPCODE_HANDLER_CCONV ZEND_COUNT_SPEC_TMP_UNU
 				zval retval;
 
 				zend_function *count_fn = zend_hash_find_ptr(&zobj->ce->function_table, ZSTR_KNOWN(ZEND_STR_COUNT));
+				GC_ADDREF(zobj);
 				zend_call_known_instance_method_with_0_params(count_fn, zobj, &retval);
+				OBJ_RELEASE(zobj);
 				count = zval_get_long(&retval);
 				zval_ptr_dtor(&retval);
 				break;
@@ -81918,7 +82066,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_OPCODE_HANDLER_CCONV ZEND_VERIFY_RETURN_TYPE
 			ZVAL_DEREF(retval_ptr);
 		}
 
-		if (EXPECTED(ZEND_TYPE_CONTAINS_CODE(ret_info->type, Z_TYPE_P(retval_ptr)))) {
+		if (EXPECTED(ZEND_TYPE_CONTAINS_CODE(ret_info->type, Z_TYPE_P(retval_ref)))) {
 			ZEND_VM_NEXT_OPCODE();
 		}
 
@@ -81947,6 +82095,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_OPCODE_HANDLER_CCONV ZEND_VERIFY_RETURN_TYPE
 				}
 				retval_ptr = retval_ref;
 			}
+			if (EXPECTED(ZEND_TYPE_CONTAINS_CODE(ret_info->type, Z_TYPE_P(retval_ptr)))) {
+				ZEND_VM_NEXT_OPCODE();
+			}
 		}
 
 		SAVE_OPLINE();
@@ -85227,7 +85378,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_OPCODE_HANDLER_CCONV ZEND_FETCH_CLASS_NAME_S
 			}
 			ZVAL_STR_COPY(EX_VAR(opline->result.var), called_scope->name);
 			break;
-		EMPTY_SWITCH_DEFAULT_CASE()
+		default: ZEND_UNREACHABLE();
 	}
 	ZEND_VM_NEXT_OPCODE();
 }
@@ -89305,7 +89456,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_OPCODE_HANDLER_CCONV ZEND_VERIFY_RETURN_TYPE
 			ZVAL_DEREF(retval_ptr);
 		}
 
-		if (EXPECTED(ZEND_TYPE_CONTAINS_CODE(ret_info->type, Z_TYPE_P(retval_ptr)))) {
+		if (EXPECTED(ZEND_TYPE_CONTAINS_CODE(ret_info->type, Z_TYPE_P(retval_ref)))) {
 			ZEND_VM_NEXT_OPCODE();
 		}
 
@@ -89334,6 +89485,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_OPCODE_HANDLER_CCONV ZEND_VERIFY_RETURN_TYPE
 				}
 				retval_ptr = retval_ref;
 			}
+			if (EXPECTED(ZEND_TYPE_CONTAINS_CODE(ret_info->type, Z_TYPE_P(retval_ptr)))) {
+				ZEND_VM_NEXT_OPCODE();
+			}
 		}
 
 		SAVE_OPLINE();
@@ -93113,7 +93267,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_OPCODE_HANDLER_CCONV ZEND_STRLEN_SPEC_CV_TAI
 				}
 
 				ZVAL_COPY(&tmp, value);
-				if (zend_parse_arg_str_weak(&tmp, &str, 1)) {
+				if ((str = zend_parse_arg_str_weak(&tmp, 1)) != NULL) {
 					ZVAL_LONG(EX_VAR(opline->result.var), ZSTR_LEN(str));
 					zval_ptr_dtor(&tmp);
 					break;
@@ -93227,7 +93381,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_OPCODE_HANDLER_CCONV ZEND_FETCH_CLASS_NAME_S
 			}
 			ZVAL_STR_COPY(EX_VAR(opline->result.var), called_scope->name);
 			break;
-		EMPTY_SWITCH_DEFAULT_CASE()
+		default: ZEND_UNREACHABLE();
 	}
 	ZEND_VM_NEXT_OPCODE();
 }
@@ -101412,7 +101566,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_OPCODE_HANDLER_CCONV ZEND_VERIFY_RETURN_TYPE
 			ZVAL_DEREF(retval_ptr);
 		}
 
-		if (EXPECTED(ZEND_TYPE_CONTAINS_CODE(ret_info->type, Z_TYPE_P(retval_ptr)))) {
+		if (EXPECTED(ZEND_TYPE_CONTAINS_CODE(ret_info->type, Z_TYPE_P(retval_ref)))) {
 			ZEND_VM_NEXT_OPCODE();
 		}
 
@@ -101441,6 +101595,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_OPCODE_HANDLER_CCONV ZEND_VERIFY_RETURN_TYPE
 				}
 				retval_ptr = retval_ref;
 			}
+			if (EXPECTED(ZEND_TYPE_CONTAINS_CODE(ret_info->type, Z_TYPE_P(retval_ptr)))) {
+				ZEND_VM_NEXT_OPCODE();
+			}
 		}
 
 		SAVE_OPLINE();
@@ -102194,7 +102351,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_OPCODE_HANDLER_CCONV ZEND_COUNT_SPEC_CV_UNUS
 				zval retval;
 
 				zend_function *count_fn = zend_hash_find_ptr(&zobj->ce->function_table, ZSTR_KNOWN(ZEND_STR_COUNT));
+				GC_ADDREF(zobj);
 				zend_call_known_instance_method_with_0_params(count_fn, zobj, &retval);
+				OBJ_RELEASE(zobj);
 				count = zval_get_long(&retval);
 				zval_ptr_dtor(&retval);
 				break;
@@ -105744,13 +105903,17 @@ static ZEND_OPCODE_HANDLER_RET ZEND_OPCODE_HANDLER_CCONV ZEND_HALT_TAILCALL_HAND
 	return (zend_op*) ZEND_VM_ENTER_BIT;
 }
 
+static ZEND_COLD zend_never_inline ZEND_OPCODE_HANDLER_RET ZEND_OPCODE_HANDLER_CCONV zend_interrupt_TAILCALL(ZEND_OPCODE_HANDLER_ARGS) {
+	SAVE_OPLINE();
+	ZEND_VM_TAIL_CALL(zend_interrupt_helper_SPEC_TAILCALL(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU));
+}
 /* The following helpers can not tailcall due to signature mismatch. Redefine some macros so they do not enforce tailcall. */
 #pragma push_macro("ZEND_VM_CONTINUE")
 #undef  ZEND_VM_CONTINUE
 #pragma push_macro("ZEND_VM_INTERRUPT")
 #undef  ZEND_VM_INTERRUPT
 #define ZEND_VM_CONTINUE(handler) return opline
-#define ZEND_VM_INTERRUPT()       return zend_interrupt_helper_SPEC(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU)
+#define ZEND_VM_INTERRUPT()       return zend_interrupt(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU)
 static zend_never_inline ZEND_OPCODE_HANDLER_RET ZEND_OPCODE_HANDLER_CCONV_EX  zend_add_helper_SPEC_TAILCALL(ZEND_OPCODE_HANDLER_ARGS_EX zval *op_1, zval *op_2)
 {
 	USE_OPLINE
@@ -122745,7 +122908,7 @@ static void init_opcode_serialiser(void)
 	Z_TYPE_INFO(tmp) = IS_LONG;
 	for (i = 0; i < zend_handlers_count; i++) {
 		Z_LVAL(tmp) = i;
-		zend_hash_index_add(zend_handlers_table, (zend_long)(uintptr_t)zend_opcode_handlers[i], &tmp);
+		zend_hash_index_add(zend_handlers_table, (zend_ulong)(uintptr_t)zend_opcode_handlers[i], &tmp);
 	}
 }
 
@@ -122756,7 +122919,7 @@ ZEND_API void ZEND_FASTCALL zend_serialize_opcode_handler(zend_op *op)
 	if (!zend_handlers_table) {
 		init_opcode_serialiser();
 	}
-	zv = zend_hash_index_find(zend_handlers_table, (zend_long)(uintptr_t)op->handler);
+	zv = zend_hash_index_find(zend_handlers_table, (zend_ulong)(uintptr_t)op->handler);
 	ZEND_ASSERT(zv != NULL);
 	op->handler = (zend_vm_opcode_handler_t)(uintptr_t)Z_LVAL_P(zv);
 }
@@ -122774,7 +122937,7 @@ ZEND_API const void* ZEND_FASTCALL zend_get_opcode_handler_func(const zend_op *o
 	if (!zend_handlers_table) {
 		init_opcode_serialiser();
 	}
-	zv = zend_hash_index_find(zend_handlers_table, (zend_long)(uintptr_t)op->handler);
+	zv = zend_hash_index_find(zend_handlers_table, (zend_ulong)(uintptr_t)op->handler);
 	ZEND_ASSERT(zv != NULL);
 	return zend_opcode_handler_funcs[Z_LVAL_P(zv)];
 #elif ZEND_VM_KIND == ZEND_VM_KIND_CALL
@@ -122793,6 +122956,22 @@ ZEND_API const zend_op *zend_get_halt_op(void)
 #endif
 }
 
+ZEND_API const zend_op *zend_get_interrupt_op(void)
+{
+#if ZEND_VM_KIND == ZEND_VM_KIND_TAILCALL
+	return &call_interrupt_op;
+#else
+	return NULL;
+#endif
+}
+
+#if ZEND_VM_KIND == ZEND_VM_KIND_TAILCALL
+ZEND_OPCODE_HANDLER_RET ZEND_OPCODE_HANDLER_FUNC_CCONV zend_vm_handle_interrupt(ZEND_OPCODE_HANDLER_ARGS)
+{
+	return zend_interrupt_helper_SPEC(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+}
+#endif
+
 ZEND_API int zend_vm_kind(void)
 {
 	return ZEND_VM_KIND;
diff --git a/Zend/zend_vm_execute.skl b/Zend/zend_vm_execute.skl
index 53b1ac6baf0a..beabe36688df 100644
--- a/Zend/zend_vm_execute.skl
+++ b/Zend/zend_vm_execute.skl
@@ -113,7 +113,7 @@ static void init_opcode_serialiser(void)
 	Z_TYPE_INFO(tmp) = IS_LONG;
 	for (i = 0; i < zend_handlers_count; i++) {
 		Z_LVAL(tmp) = i;
-		zend_hash_index_add(zend_handlers_table, (zend_long)(uintptr_t)zend_opcode_handlers[i], &tmp);
+		zend_hash_index_add(zend_handlers_table, (zend_ulong)(uintptr_t)zend_opcode_handlers[i], &tmp);
 	}
 }
 
@@ -124,7 +124,7 @@ ZEND_API void ZEND_FASTCALL zend_serialize_opcode_handler(zend_op *op)
 	if (!zend_handlers_table) {
 		init_opcode_serialiser();
 	}
-	zv = zend_hash_index_find(zend_handlers_table, (zend_long)(uintptr_t)op->handler);
+	zv = zend_hash_index_find(zend_handlers_table, (zend_ulong)(uintptr_t)op->handler);
 	ZEND_ASSERT(zv != NULL);
 	op->handler = (zend_vm_opcode_handler_t)(uintptr_t)Z_LVAL_P(zv);
 }
@@ -142,7 +142,7 @@ ZEND_API const void* ZEND_FASTCALL zend_get_opcode_handler_func(const zend_op *o
 	if (!zend_handlers_table) {
 		init_opcode_serialiser();
 	}
-	zv = zend_hash_index_find(zend_handlers_table, (zend_long)(uintptr_t)op->handler);
+	zv = zend_hash_index_find(zend_handlers_table, (zend_ulong)(uintptr_t)op->handler);
 	ZEND_ASSERT(zv != NULL);
 	return zend_opcode_handler_funcs[Z_LVAL_P(zv)];
 #elif ZEND_VM_KIND == ZEND_VM_KIND_CALL
@@ -161,6 +161,22 @@ ZEND_API const zend_op *zend_get_halt_op(void)
 #endif
 }
 
+ZEND_API const zend_op *zend_get_interrupt_op(void)
+{
+#if ZEND_VM_KIND == ZEND_VM_KIND_TAILCALL
+	return &call_interrupt_op;
+#else
+	return NULL;
+#endif
+}
+
+#if ZEND_VM_KIND == ZEND_VM_KIND_TAILCALL
+ZEND_OPCODE_HANDLER_RET ZEND_OPCODE_HANDLER_FUNC_CCONV zend_vm_handle_interrupt(ZEND_OPCODE_HANDLER_ARGS)
+{
+	return zend_interrupt_helper_SPEC(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+}
+#endif
+
 ZEND_API int zend_vm_kind(void)
 {
 	return ZEND_VM_KIND;
diff --git a/Zend/zend_vm_gen.php b/Zend/zend_vm_gen.php
index f8989b2336f4..8e65bc0a28ea 100755
--- a/Zend/zend_vm_gen.php
+++ b/Zend/zend_vm_gen.php
@@ -4,15 +4,14 @@
    +----------------------------------------------------------------------+
    | Zend Engine                                                          |
    +----------------------------------------------------------------------+
-   | Copyright (c) Zend Technologies Ltd. (http://www.zend.com)           |
+   | Copyright © Zend Technologies Ltd., a subsidiary company of          |
+   |     Perforce Software, Inc., and Contributors.                       |
    +----------------------------------------------------------------------+
-   | This source file is subject to version 2.00 of the Zend license,     |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | http://www.zend.com/license/2_00.txt.                                |
-   | If you did not receive a copy of the Zend license and are unable to  |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@zend.com so we can mail you a copy immediately.              |
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Authors: Dmitry Stogov                               |
    +----------------------------------------------------------------------+
@@ -23,15 +22,14 @@
    +----------------------------------------------------------------------+
    | Zend Engine                                                          |
    +----------------------------------------------------------------------+
-   | Copyright (c) Zend Technologies Ltd. (http://www.zend.com)           |
+   | Copyright © Zend Technologies Ltd., a subsidiary company of          |
+   |     Perforce Software, Inc., and Contributors.                       |
    +----------------------------------------------------------------------+
-   | This source file is subject to version 2.00 of the Zend license,     |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | http://www.zend.com/license/2_00.txt.                                |
-   | If you did not receive a copy of the Zend license and are unable to  |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@zend.com so we can mail you a copy immediately.              |
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Authors: Andi Gutmans                                  |
    |          Zeev Suraski                                  |
@@ -1593,6 +1591,19 @@ function gen_halt_handler($f, $kind) {
     out($f,"}\n\n");
 }
 
+function gen_interrupt_func($f, $kind, $spec) {
+    $cconv = $kind === ZEND_VM_KIND_TAILCALL ? 'ZEND_OPCODE_HANDLER_CCONV' : 'ZEND_OPCODE_HANDLER_FUNC_CCONV';
+    $variant = $kind === ZEND_VM_KIND_TAILCALL ? '_TAILCALL' : '';
+    out($f, "static ZEND_COLD zend_never_inline ZEND_OPCODE_HANDLER_RET {$cconv} zend_interrupt{$variant}(ZEND_OPCODE_HANDLER_ARGS) {\n");
+    out($f,"\tSAVE_OPLINE();\n");
+    if ($kind === ZEND_VM_KIND_TAILCALL) {
+        out($f,"\tZEND_VM_TAIL_CALL(zend_interrupt_helper".($spec?"_SPEC":"")."_TAILCALL(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU));\n");
+    } else {
+        out($f, "\treturn &call_interrupt_op;\n");
+    }
+    out($f, "}\n");
+}
+
 function extra_spec_name($extra_spec) {
     global $prefix;
 
@@ -1803,10 +1814,14 @@ function gen_executor_code($f, $spec, $kind, $prolog, &$switch_labels = array())
     switch ($kind) {
         case ZEND_VM_KIND_CALL:
             gen_null_handler($f, $kind);
+            out($f, "#if ZEND_VM_KIND == ZEND_VM_KIND_TAILCALL\n");
+            gen_interrupt_func($f, $kind, $spec);
+            out($f, "#endif\n");
             break;
         case ZEND_VM_KIND_TAILCALL:
             gen_null_handler($f, $kind);
             gen_halt_handler($f, $kind);
+            gen_interrupt_func($f, $kind, $spec);
             break;
         case ZEND_VM_KIND_SWITCH:
             out($f,"default: ZEND_NULL_LABEL:\n");
@@ -1842,7 +1857,7 @@ function gen_executor_code($f, $spec, $kind, $prolog, &$switch_labels = array())
         out($f, "#pragma push_macro(\"ZEND_VM_INTERRUPT\")\n");
         out($f, "#undef  ZEND_VM_INTERRUPT\n");
         out($f, "#define ZEND_VM_CONTINUE(handler) return opline\n");
-        out($f, "#define ZEND_VM_INTERRUPT()       return zend_interrupt_helper".($spec?"_SPEC":"")."(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU)\n");
+        out($f, "#define ZEND_VM_INTERRUPT()       return zend_interrupt(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU)\n");
         out($f, $delayed_helpers);
         out($f, "#pragma pop_macro(\"ZEND_VM_INTERRUPT\")\n");
         out($f, "#pragma pop_macro(\"ZEND_VM_CONTINUE\")\n");
@@ -1897,7 +1912,10 @@ function gen_executor($f, $skl, $spec, $kind, $executor_name, $initializer_name)
                     if ($kind == ZEND_VM_KIND_HYBRID || $kind == ZEND_VM_KIND_CALL) {
                         out($f,"#if ZEND_VM_KIND == ZEND_VM_KIND_HYBRID || ZEND_VM_KIND == ZEND_VM_KIND_TAILCALL\n\n");
                         out($f,"static zend_vm_opcode_handler_func_t const * zend_opcode_handler_funcs;\n");
-                        out($f,"#endif\n");
+                        out($f,"#endif\n\n");
+                        out($f,"#if ZEND_VM_KIND == ZEND_VM_KIND_TAILCALL\n");
+                        out($f,"static const zend_op call_interrupt_op;\n");
+                        out($f,"#endif\n\n");
                     }
                     out($f,"#if (ZEND_VM_KIND != ZEND_VM_KIND_HYBRID && ZEND_VM_KIND != ZEND_VM_KIND_TAILCALL) || !ZEND_VM_SPEC\n");
                     out($f,"static zend_vm_opcode_handler_t zend_vm_get_opcode_handler(uint8_t opcode, const zend_op* op);\n");
@@ -2126,6 +2144,8 @@ function gen_executor($f, $skl, $spec, $kind, $executor_name, $initializer_name)
                         out($f,"# undef ZEND_VM_RETURN\n");
                         out($f,"# undef ZEND_VM_DISPATCH_TO_HELPER\n");
                         out($f,"# undef ZEND_VM_INTERRUPT\n");
+                        out($f,"# undef ZEND_VM_ENTER_EX\n");
+                        out($f,"# undef ZEND_VM_LEAVE\n");
                         out($f,"\n");
                         out($f,"# define ZEND_VM_TAIL_CALL(call)               ZEND_MUSTTAIL return call\n");
                         out($f,"# define ZEND_VM_CONTINUE()                    ZEND_VM_TAIL_CALL(opline->handler(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU))\n");
@@ -2136,9 +2156,13 @@ function gen_executor($f, $skl, $spec, $kind, $executor_name, $initializer_name)
                         out($f,"        ZEND_VM_TAIL_CALL(opline->handler(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU)); \\\n");
                         out($f,"    } while (0)\n");
                         out($f,"# define ZEND_VM_DISPATCH_TO_LEAVE_HELPER(helper) opline = &call_leave_op; SAVE_OPLINE(); ZEND_VM_CONTINUE()\n");
-                        out($f,"# define ZEND_VM_INTERRUPT()        ZEND_VM_TAIL_CALL(zend_interrupt_helper".($spec?"_SPEC":"")."_TAILCALL(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU))\n");
+                        out($f,"# define ZEND_VM_INTERRUPT()        ZEND_VM_TAIL_CALL(zend_interrupt_TAILCALL(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU))\n");
+                        out($f,"# define ZEND_VM_ENTER_EX() ZEND_VM_INTERRUPT_CHECK(); ZEND_VM_CONTINUE()\n");
+                        out($f,"# define ZEND_VM_LEAVE()    ZEND_VM_CONTINUE()\n");
                         out($f,"\n");
                         out($f,"static ZEND_OPCODE_HANDLER_RET ZEND_OPCODE_HANDLER_CCONV zend_interrupt_helper".($spec?"_SPEC":"")."_TAILCALL(ZEND_OPCODE_HANDLER_ARGS);\n");
+                        out($f,"static ZEND_OPCODE_HANDLER_RET ZEND_OPCODE_HANDLER_FUNC_CCONV zend_interrupt(ZEND_OPCODE_HANDLER_ARGS);\n");
+                        out($f,"static ZEND_OPCODE_HANDLER_RET ZEND_OPCODE_HANDLER_CCONV zend_interrupt_TAILCALL(ZEND_OPCODE_HANDLER_ARGS);\n");
                         out($f,"static ZEND_OPCODE_HANDLER_RET ZEND_OPCODE_HANDLER_CCONV ZEND_NULL_TAILCALL_HANDLER(ZEND_OPCODE_HANDLER_ARGS);\n");
                         out($f,"static ZEND_OPCODE_HANDLER_RET ZEND_OPCODE_HANDLER_CCONV ZEND_HALT_TAILCALL_HANDLER(ZEND_OPCODE_HANDLER_ARGS);\n");
                         out($f,"static zend_never_inline const zend_op *ZEND_OPCODE_HANDLER_CCONV zend_leave_helper_SPEC_TAILCALL(zend_execute_data *ex, const zend_op *opline);\n");
@@ -2149,6 +2173,9 @@ function gen_executor($f, $skl, $spec, $kind, $executor_name, $initializer_name)
                         out($f,"static const zend_op call_leave_op = {\n");
                         out($f,"    .handler = zend_leave_helper_SPEC_TAILCALL,\n");
                         out($f,"};\n");
+                        out($f,"static const zend_op call_interrupt_op = {\n");
+                        out($f,"    .handler = zend_interrupt_helper_SPEC_TAILCALL,\n");
+                        out($f,"};\n");
                         out($f,"\n");
 
                         gen_executor_code($f, $spec, ZEND_VM_KIND_TAILCALL, $m[1]);
@@ -2495,7 +2522,7 @@ function gen_vm_opcodes_header(
         $str .= "# define ZEND_VM_KIND\t\tZEND_VM_KIND_HYBRID\n";
     }
     if ($GLOBALS["vm_kind_name"][ZEND_VM_GEN_KIND] === "ZEND_VM_KIND_HYBRID" || $GLOBALS["vm_kind_name"][ZEND_VM_GEN_KIND] === "ZEND_VM_KIND_CALL") {
-        $str .= "#elif defined(HAVE_MUSTTAIL) && defined(HAVE_PRESERVE_NONE) && (defined(__x86_64__) || defined(__aarch64__))\n";
+        $str .= "#elif defined(HAVE_MUSTTAIL) && defined(HAVE_PRESERVE_NONE) && (defined(__x86_64__) || defined(_M_X64) || defined(__aarch64__))\n";
         $str .= "# define ZEND_VM_KIND\t\tZEND_VM_KIND_TAILCALL\n";
         $str .= "#else\n";
         $str .= "# define ZEND_VM_KIND\t\tZEND_VM_KIND_CALL\n";
diff --git a/Zend/zend_vm_opcodes.c b/Zend/zend_vm_opcodes.c
index 87cd00a6f8b5..0ece3e6f0c66 100644
--- a/Zend/zend_vm_opcodes.c
+++ b/Zend/zend_vm_opcodes.c
@@ -2,15 +2,14 @@
    +----------------------------------------------------------------------+
    | Zend Engine                                                          |
    +----------------------------------------------------------------------+
-   | Copyright (c) Zend Technologies Ltd. (http://www.zend.com)           |
+   | Copyright © Zend Technologies Ltd., a subsidiary company of          |
+   |     Perforce Software, Inc., and Contributors.                       |
    +----------------------------------------------------------------------+
-   | This source file is subject to version 2.00 of the Zend license,     |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | http://www.zend.com/license/2_00.txt.                                |
-   | If you did not receive a copy of the Zend license and are unable to  |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@zend.com so we can mail you a copy immediately.              |
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Authors: Andi Gutmans                                  |
    |          Zeev Suraski                                  |
diff --git a/Zend/zend_vm_opcodes.h b/Zend/zend_vm_opcodes.h
index 7aae4d0e55f1..92b46e6628f3 100644
--- a/Zend/zend_vm_opcodes.h
+++ b/Zend/zend_vm_opcodes.h
@@ -2,15 +2,14 @@
    +----------------------------------------------------------------------+
    | Zend Engine                                                          |
    +----------------------------------------------------------------------+
-   | Copyright (c) Zend Technologies Ltd. (http://www.zend.com)           |
+   | Copyright © Zend Technologies Ltd., a subsidiary company of          |
+   |     Perforce Software, Inc., and Contributors.                       |
    +----------------------------------------------------------------------+
-   | This source file is subject to version 2.00 of the Zend license,     |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | http://www.zend.com/license/2_00.txt.                                |
-   | If you did not receive a copy of the Zend license and are unable to  |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@zend.com so we can mail you a copy immediately.              |
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Authors: Andi Gutmans                                  |
    |          Zeev Suraski                                  |
@@ -42,7 +41,7 @@ static const char *const zend_vm_kind_name[] = {
 /* HYBRID requires support for computed GOTO and global register variables*/
 #elif (defined(__GNUC__) && defined(HAVE_GCC_GLOBAL_REGS))
 # define ZEND_VM_KIND		ZEND_VM_KIND_HYBRID
-#elif defined(HAVE_MUSTTAIL) && defined(HAVE_PRESERVE_NONE) && (defined(__x86_64__) || defined(__aarch64__))
+#elif defined(HAVE_MUSTTAIL) && defined(HAVE_PRESERVE_NONE) && (defined(__x86_64__) || defined(_M_X64) || defined(__aarch64__))
 # define ZEND_VM_KIND		ZEND_VM_KIND_TAILCALL
 #else
 # define ZEND_VM_KIND		ZEND_VM_KIND_CALL
diff --git a/Zend/zend_vm_trace_handlers.h b/Zend/zend_vm_trace_handlers.h
index eaf97e012cac..e7510f406711 100644
--- a/Zend/zend_vm_trace_handlers.h
+++ b/Zend/zend_vm_trace_handlers.h
@@ -2,15 +2,14 @@
    +----------------------------------------------------------------------+
    | Zend Engine                                                          |
    +----------------------------------------------------------------------+
-   | Copyright (c) Zend Technologies Ltd. (http://www.zend.com)           |
+   | Copyright © Zend Technologies Ltd., a subsidiary company of          |
+   |     Perforce Software, Inc., and Contributors.                       |
    +----------------------------------------------------------------------+
-   | This source file is subject to version 2.00 of the Zend license,     |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | http://www.zend.com/license/2_00.txt.                                |
-   | If you did not receive a copy of the Zend license and are unable to  |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@zend.com so we can mail you a copy immediately.              |
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Authors: Dmitry Stogov                               |
    +----------------------------------------------------------------------+
diff --git a/Zend/zend_vm_trace_lines.h b/Zend/zend_vm_trace_lines.h
index 740e18776395..8c194edbcde1 100644
--- a/Zend/zend_vm_trace_lines.h
+++ b/Zend/zend_vm_trace_lines.h
@@ -2,15 +2,14 @@
    +----------------------------------------------------------------------+
    | Zend Engine                                                          |
    +----------------------------------------------------------------------+
-   | Copyright (c) Zend Technologies Ltd. (http://www.zend.com)           |
+   | Copyright © Zend Technologies Ltd., a subsidiary company of          |
+   |     Perforce Software, Inc., and Contributors.                       |
    +----------------------------------------------------------------------+
-   | This source file is subject to version 2.00 of the Zend license,     |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | http://www.zend.com/license/2_00.txt.                                |
-   | If you did not receive a copy of the Zend license and are unable to  |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@zend.com so we can mail you a copy immediately.              |
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Authors: Dmitry Stogov                               |
    +----------------------------------------------------------------------+
diff --git a/Zend/zend_vm_trace_map.h b/Zend/zend_vm_trace_map.h
index d84aa0442d26..18c705b454d5 100644
--- a/Zend/zend_vm_trace_map.h
+++ b/Zend/zend_vm_trace_map.h
@@ -2,15 +2,14 @@
    +----------------------------------------------------------------------+
    | Zend Engine                                                          |
    +----------------------------------------------------------------------+
-   | Copyright (c) Zend Technologies Ltd. (http://www.zend.com)           |
+   | Copyright © Zend Technologies Ltd., a subsidiary company of          |
+   |     Perforce Software, Inc., and Contributors.                       |
    +----------------------------------------------------------------------+
-   | This source file is subject to version 2.00 of the Zend license,     |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | http://www.zend.com/license/2_00.txt.                                |
-   | If you did not receive a copy of the Zend license and are unable to  |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@zend.com so we can mail you a copy immediately.              |
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Authors: Dmitry Stogov                               |
    +----------------------------------------------------------------------+
diff --git a/Zend/zend_weakrefs.c b/Zend/zend_weakrefs.c
index 8c1263885bf6..ad0308f44e20 100644
--- a/Zend/zend_weakrefs.c
+++ b/Zend/zend_weakrefs.c
@@ -1,14 +1,12 @@
 /*
    +----------------------------------------------------------------------+
-   | Copyright (c) The PHP Group                                          |
+   | Copyright © The PHP Group and Contributors.                          |
    +----------------------------------------------------------------------+
-   | This source file is subject to version 2.00 of the Zend license,     |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | http://www.zend.com/license/2_00.txt.                                |
-   | If you did not receive a copy of the Zend license and are unable to  |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@zend.com so we can mail you a copy immediately.              |
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Authors: krakjoe@php.net                                             |
    +----------------------------------------------------------------------+
@@ -60,10 +58,10 @@ static zend_class_entry *zend_ce_weakmap;
 static zend_object_handlers zend_weakref_handlers;
 static zend_object_handlers zend_weakmap_handlers;
 
-#define zend_weakref_from(o) ((zend_weakref*)(((char*) o) - XtOffsetOf(zend_weakref, std)))
+#define zend_weakref_from(o) (ZEND_CONTAINER_OF(o, zend_weakref, std))
 #define zend_weakref_fetch(z) zend_weakref_from(Z_OBJ_P(z))
 
-#define zend_weakmap_from(o) ((zend_weakmap*)(((char*) o) - XtOffsetOf(zend_weakmap, std)))
+#define zend_weakmap_from(o) (ZEND_CONTAINER_OF(o, zend_weakmap, std))
 #define zend_weakmap_fetch(z) zend_weakmap_from(Z_OBJ_P(z))
 
 static inline void zend_weakref_unref_single(
@@ -109,15 +107,15 @@ static void zend_weakref_register(zend_object *object, void *payload) {
 	void *tagged_ptr = Z_PTR_P(zv);
 	if (ZEND_WEAKREF_GET_TAG(tagged_ptr) == ZEND_WEAKREF_TAG_HT) {
 		HashTable *ht = ZEND_WEAKREF_GET_PTR(tagged_ptr);
-		zend_hash_index_add_new_ptr(ht, (zend_ulong) payload, payload);
+		zend_hash_index_add_new_ptr(ht, (zend_ulong)(uintptr_t) payload, payload);
 		return;
 	}
 
 	/* Convert simple pointer to hashtable. */
 	HashTable *ht = emalloc(sizeof(HashTable));
 	zend_hash_init(ht, 0, NULL, NULL, 0);
-	zend_hash_index_add_new_ptr(ht, (zend_ulong) tagged_ptr, tagged_ptr);
-	zend_hash_index_add_new_ptr(ht, (zend_ulong) payload, payload);
+	zend_hash_index_add_new_ptr(ht, (zend_ulong)(uintptr_t) tagged_ptr, tagged_ptr);
+	zend_hash_index_add_new_ptr(ht, (zend_ulong)(uintptr_t) payload, payload);
 	/* Replace the single WeakMap or WeakReference entry in EG(weakrefs) with a HashTable with 2 entries in place. */
 	ZVAL_PTR(zv, ZEND_WEAKREF_ENCODE(ht, ZEND_WEAKREF_TAG_HT));
 }
@@ -146,11 +144,11 @@ static void zend_weakref_unregister(zend_object *object, void *payload, bool wea
 
 	HashTable *ht = ptr;
 #if ZEND_DEBUG
-	void *old_payload = zend_hash_index_find_ptr(ht, (zend_ulong) payload);
+	void *old_payload = zend_hash_index_find_ptr(ht, (zend_ulong)(uintptr_t) payload);
 	ZEND_ASSERT(old_payload && "Weakref not registered?");
 	ZEND_ASSERT(old_payload == payload);
 #endif
-	zend_hash_index_del(ht, (zend_ulong) payload);
+	zend_hash_index_del(ht, (zend_ulong)(uintptr_t) payload);
 	if (zend_hash_num_elements(ht) == 0) {
 		GC_DEL_FLAGS(object, IS_OBJ_WEAKLY_REFERENCED);
 		zend_hash_destroy(ht);
@@ -798,7 +796,7 @@ void zend_register_weakref_ce(void) /* {{{ */
 	zend_ce_weakref->default_object_handlers = &zend_weakref_handlers;
 
 	memcpy(&zend_weakref_handlers, zend_get_std_object_handlers(), sizeof(zend_object_handlers));
-	zend_weakref_handlers.offset = XtOffsetOf(zend_weakref, std);
+	zend_weakref_handlers.offset = offsetof(zend_weakref, std);
 
 	zend_weakref_handlers.free_obj = zend_weakref_free;
 	zend_weakref_handlers.get_debug_info = zend_weakref_get_debug_info;
@@ -811,7 +809,7 @@ void zend_register_weakref_ce(void) /* {{{ */
 	zend_ce_weakmap->default_object_handlers = &zend_weakmap_handlers;
 
 	memcpy(&zend_weakmap_handlers, zend_get_std_object_handlers(), sizeof(zend_object_handlers));
-	zend_weakmap_handlers.offset = XtOffsetOf(zend_weakmap, std);
+	zend_weakmap_handlers.offset = offsetof(zend_weakmap, std);
 	zend_weakmap_handlers.free_obj = zend_weakmap_free_obj;
 	zend_weakmap_handlers.read_dimension = zend_weakmap_read_dimension;
 	zend_weakmap_handlers.write_dimension = zend_weakmap_write_dimension;
diff --git a/Zend/zend_weakrefs.h b/Zend/zend_weakrefs.h
index 00d4fbcc6bc4..41662c33a300 100644
--- a/Zend/zend_weakrefs.h
+++ b/Zend/zend_weakrefs.h
@@ -1,14 +1,12 @@
 /*
    +----------------------------------------------------------------------+
-   | Copyright (c) The PHP Group                                          |
+   | Copyright © The PHP Group and Contributors.                          |
    +----------------------------------------------------------------------+
-   | This source file is subject to version 2.00 of the Zend license,     |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | http://www.zend.com/license/2_00.txt.                                |
-   | If you did not receive a copy of the Zend license and are unable to  |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@zend.com so we can mail you a copy immediately.              |
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Authors: krakjoe@php.net                                             |
    +----------------------------------------------------------------------+
diff --git a/build/Makefile.gcov b/build/Makefile.gcov
index de85893398cd..5097bfaaa277 100644
--- a/build/Makefile.gcov
+++ b/build/Makefile.gcov
@@ -16,15 +16,6 @@ LCOV_EXCLUDES = \
 	'$(top_srcdir)/parse_date.re' \
 	'$(top_srcdir)/parse_iso_intervals.re'
 
-GCOVR_EXCLUDES = \
-	'ext/bcmath/libbcmath/.*' \
-	'ext/date/lib/.*' \
-	'ext/fileinfo/libmagic/.*' \
-	'ext/gd/libgd/.*' \
-	'ext/hash/sha3/.*' \
-	'ext/mbstring/libmbfl/.*' \
-	'ext/pcre/pcre2lib/.*'
-
 lcov: lcov-html
 
 php_lcov.info:
@@ -48,15 +39,11 @@ gcovr-html:
 	@echo "Generating gcovr HTML"
 	@rm -rf gcovr_html/
 	@mkdir gcovr_html
-	gcovr -sr . -o gcovr_html/index.html --html --html-details \
-		--exclude-directories 'ext/date/lib$$' \
-		$(foreach lib, $(GCOVR_EXCLUDES), -e $(lib))
+	gcovr -r . -o gcovr_html/index.html --html --html-details
 
 gcovr-xml:
 	@echo "Generating gcovr XML"
 	@rm -f gcovr.xml
-	gcovr -sr . -o gcovr.xml --xml \
-		--exclude-directories 'ext/date/lib$$' \
-		$(foreach lib, $(GCOVR_EXCLUDES), -e $(lib))
+	gcovr -r . -o gcovr.xml --xml
 
 .PHONY: gcovr-html lcov-html php_lcov.info
diff --git a/build/gen_stub.php b/build/gen_stub.php
index c64aa65530f9..e60e61885206 100755
--- a/build/gen_stub.php
+++ b/build/gen_stub.php
@@ -26,6 +26,7 @@
 const PHP_83_VERSION_ID = 80300;
 const PHP_84_VERSION_ID = 80400;
 const PHP_85_VERSION_ID = 80500;
+const PHP_86_VERSION_ID = 80600;
 const ALL_PHP_VERSION_IDS = [
     PHP_70_VERSION_ID,
     PHP_80_VERSION_ID,
@@ -34,6 +35,7 @@
     PHP_83_VERSION_ID,
     PHP_84_VERSION_ID,
     PHP_85_VERSION_ID,
+    PHP_86_VERSION_ID,
 ];
 
 // file_put_contents() but with a success message printed after saving
@@ -54,6 +56,24 @@ function array_any(array $array, callable $callback): bool {
     }
 }
 
+if (function_exists('clone')) {
+    // Replace (\clone)(...) with \clone(...) once the minimally
+    // supported PHP version is 8.5.
+    define('clone', \clone(...));
+} else {
+    define(
+        'clone',
+        /**
+         * @template T
+         * @param T $o
+         * @return T
+         */
+        function (object $o): object {
+            return clone $o;
+        }
+    );
+}
+
 /**
  * @return FileInfo[]
  */
@@ -65,7 +85,7 @@ function processDirectory(string $dir, Context $context): array {
     );
     foreach ($it as $file) {
         $pathName = $file->getPathName();
-        if (substr($pathName, -9) === '.stub.php') {
+        if (str_ends_with($pathName, '.stub.php')) {
             $pathNames[] = $pathName;
         }
     }
@@ -210,20 +230,17 @@ class Context {
 }
 
 class ArrayType extends SimpleType {
-    private /* readonly */ Type $keyType;
-    private /* readonly */ Type $valueType;
 
-    public static function createGenericArray(): self
-    {
-        return new ArrayType(Type::fromString("int|string"), Type::fromString("mixed|ref"));
+    public function __construct(
+        private readonly Type $keyType,
+        private readonly Type $valueType,
+    ) {
+        parent::__construct("array", true);
     }
 
-    public function __construct(Type $keyType, Type $valueType)
+    public static function createGenericArray(): self
     {
-        parent::__construct("array", true);
-
-        $this->keyType = $keyType;
-        $this->valueType = $valueType;
+        return new ArrayType(Type::fromString("int|string"), Type::fromString("mixed|ref"));
     }
 
     public function toOptimizerTypeMask(): string {
@@ -249,8 +266,11 @@ public function equals(SimpleType $other): bool {
 }
 
 class SimpleType {
-    public /* readonly */ string $name;
-    public /* readonly */ bool $isBuiltin;
+
+    protected function __construct(
+        public readonly string $name,
+        public readonly bool $isBuiltin,
+    ) {}
 
     public static function fromNode(Node $node): SimpleType {
         if ($node instanceof Node\Name) {
@@ -329,24 +349,16 @@ public static function fromString(string $typeString): SimpleType
      */
     public static function fromValue($value): SimpleType
     {
-        switch (gettype($value)) {
-            case "NULL":
-                return SimpleType::null();
-            case "boolean":
-                return new SimpleType("bool", true);
-            case "integer":
-                return new SimpleType("int", true);
-            case "double":
-                return new SimpleType("float", true);
-            case "string":
-                return new SimpleType("string", true);
-            case "array":
-                return new SimpleType("array", true);
-            case "object":
-                return new SimpleType("object", true);
-            default:
-                throw new Exception("Type \"" . gettype($value) . "\" cannot be inferred based on value");
-        }
+        return match (gettype($value)) {
+            "NULL" => SimpleType::null(),
+            "boolean" => new SimpleType("bool", true),
+            "integer" => new SimpleType("int", true),
+            "double" => new SimpleType("float", true),
+            "string" => new SimpleType("string", true),
+            "array" => new SimpleType("array", true),
+            "object" => new SimpleType("object", true),
+            default => throw new Exception("Type \"" . gettype($value) . "\" cannot be inferred based on value"),
+        };
     }
 
     public static function null(): SimpleType
@@ -354,11 +366,6 @@ public static function null(): SimpleType
         return new SimpleType("null", true);
     }
 
-    protected function __construct(string $name, bool $isBuiltin) {
-        $this->name = $name;
-        $this->isBuiltin = $isBuiltin;
-    }
-
     public function isScalar(): bool {
         return $this->isBuiltin && in_array($this->name, ["null", "false", "true", "bool", "int", "float"], true);
     }
@@ -394,38 +401,23 @@ public function isMixed(): bool {
     private function toTypeInfo(): array {
         assert($this->isBuiltin);
 
-        switch ($this->name) {
-            case "null":
-                return ["IS_NULL", "MAY_BE_NULL"];
-            case "false":
-                return ["IS_FALSE", "MAY_BE_FALSE"];
-            case "true":
-                return ["IS_TRUE", "MAY_BE_TRUE"];
-            case "bool":
-                return ["_IS_BOOL", "MAY_BE_BOOL"];
-            case "int":
-                return ["IS_LONG", "MAY_BE_LONG"];
-            case "float":
-                return ["IS_DOUBLE", "MAY_BE_DOUBLE"];
-            case "string":
-                return ["IS_STRING", "MAY_BE_STRING"];
-            case "array":
-                return ["IS_ARRAY", "MAY_BE_ARRAY"];
-            case "object":
-                return ["IS_OBJECT", "MAY_BE_OBJECT"];
-            case "callable":
-                return ["IS_CALLABLE", "MAY_BE_CALLABLE"];
-            case "mixed":
-                return ["IS_MIXED", "MAY_BE_ANY"];
-            case "void":
-                return ["IS_VOID", "MAY_BE_VOID"];
-            case "static":
-                return ["IS_STATIC", "MAY_BE_STATIC"];
-            case "never":
-                return ["IS_NEVER", "MAY_BE_NEVER"];
-            default:
-                throw new Exception("Not implemented: $this->name");
-        }
+        return match ($this->name) {
+            "null" => ["IS_NULL", "MAY_BE_NULL"],
+            "false" => ["IS_FALSE", "MAY_BE_FALSE"],
+            "true" => ["IS_TRUE", "MAY_BE_TRUE"],
+            "bool" => ["_IS_BOOL", "MAY_BE_BOOL"],
+            "int" => ["IS_LONG", "MAY_BE_LONG"],
+            "float" => ["IS_DOUBLE", "MAY_BE_DOUBLE"],
+            "string" => ["IS_STRING", "MAY_BE_STRING"],
+            "array" => ["IS_ARRAY", "MAY_BE_ARRAY"],
+            "object" => ["IS_OBJECT", "MAY_BE_OBJECT"],
+            "callable" => ["IS_CALLABLE", "MAY_BE_CALLABLE"],
+            "mixed" => ["IS_MIXED", "MAY_BE_ANY"],
+            "void" => ["IS_VOID", "MAY_BE_VOID"],
+            "static" => ["IS_STATIC", "MAY_BE_STATIC"],
+            "never" => ["IS_NEVER", "MAY_BE_NEVER"],
+            default => throw new Exception("Not implemented: $this->name"),
+        };
     }
 
     public function toTypeCode(): string {
@@ -439,14 +431,11 @@ public function toTypeMask(): string {
     public function toOptimizerTypeMaskForArrayKey(): string {
         assert($this->isBuiltin);
 
-        switch ($this->name) {
-            case "int":
-                return "MAY_BE_ARRAY_KEY_LONG";
-            case "string":
-                return "MAY_BE_ARRAY_KEY_STRING";
-            default:
-                throw new Exception("Type $this->name cannot be an array key");
-        }
+        return match ($this->name) {
+            "int" => "MAY_BE_ARRAY_KEY_LONG",
+            "string" => "MAY_BE_ARRAY_KEY_STRING",
+            default => throw new Exception("Type $this->name cannot be an array key"),
+        };
     }
 
     public function toOptimizerTypeMaskForArrayValue(): string {
@@ -454,34 +443,21 @@ public function toOptimizerTypeMaskForArrayValue(): string {
             return "MAY_BE_ARRAY_OF_OBJECT";
         }
 
-        switch ($this->name) {
-            case "null":
-                return "MAY_BE_ARRAY_OF_NULL";
-            case "false":
-                return "MAY_BE_ARRAY_OF_FALSE";
-            case "true":
-                return "MAY_BE_ARRAY_OF_TRUE";
-            case "bool":
-                return "MAY_BE_ARRAY_OF_FALSE|MAY_BE_ARRAY_OF_TRUE";
-            case "int":
-                return "MAY_BE_ARRAY_OF_LONG";
-            case "float":
-                return "MAY_BE_ARRAY_OF_DOUBLE";
-            case "string":
-                return "MAY_BE_ARRAY_OF_STRING";
-            case "array":
-                return "MAY_BE_ARRAY_OF_ARRAY";
-            case "object":
-                return "MAY_BE_ARRAY_OF_OBJECT";
-            case "resource":
-                return "MAY_BE_ARRAY_OF_RESOURCE";
-            case "mixed":
-                return "MAY_BE_ARRAY_OF_ANY";
-            case "ref":
-                return "MAY_BE_ARRAY_OF_REF";
-            default:
-                throw new Exception("Type $this->name cannot be an array value");
-        }
+        return match ($this->name) {
+            "null" => "MAY_BE_ARRAY_OF_NULL",
+            "false" => "MAY_BE_ARRAY_OF_FALSE",
+            "true" => "MAY_BE_ARRAY_OF_TRUE",
+            "bool" => "MAY_BE_ARRAY_OF_FALSE|MAY_BE_ARRAY_OF_TRUE",
+            "int" => "MAY_BE_ARRAY_OF_LONG",
+            "float" => "MAY_BE_ARRAY_OF_DOUBLE",
+            "string" => "MAY_BE_ARRAY_OF_STRING",
+            "array" => "MAY_BE_ARRAY_OF_ARRAY",
+            "object" => "MAY_BE_ARRAY_OF_OBJECT",
+            "resource" => "MAY_BE_ARRAY_OF_RESOURCE",
+            "mixed" => "MAY_BE_ARRAY_OF_ANY",
+            "ref" => "MAY_BE_ARRAY_OF_REF",
+            default => throw new Exception("Type $this->name cannot be an array value"),
+        };
     }
 
     public function toOptimizerTypeMask(): string {
@@ -489,18 +465,13 @@ public function toOptimizerTypeMask(): string {
             return "MAY_BE_OBJECT";
         }
 
-        switch ($this->name) {
-            case "resource":
-                return "MAY_BE_RESOURCE";
-            case "callable":
-                return "MAY_BE_STRING|MAY_BE_ARRAY|MAY_BE_ARRAY_KEY_LONG|MAY_BE_ARRAY_OF_STRING|MAY_BE_ARRAY_OF_OBJECT|MAY_BE_OBJECT";
-            case "iterable":
-                return "MAY_BE_ARRAY|MAY_BE_ARRAY_KEY_ANY|MAY_BE_ARRAY_OF_ANY|MAY_BE_OBJECT";
-            case "mixed":
-                return "MAY_BE_ANY|MAY_BE_ARRAY_KEY_ANY|MAY_BE_ARRAY_OF_ANY";
-        }
-
-        return $this->toTypeMask();
+        return match ($this->name) {
+            "resource" => "MAY_BE_RESOURCE",
+            "callable" => "MAY_BE_STRING|MAY_BE_ARRAY|MAY_BE_ARRAY_KEY_LONG|MAY_BE_ARRAY_OF_STRING|MAY_BE_ARRAY_OF_OBJECT|MAY_BE_OBJECT",
+            "iterable" => "MAY_BE_ARRAY|MAY_BE_ARRAY_KEY_ANY|MAY_BE_ARRAY_OF_ANY|MAY_BE_OBJECT",
+            "mixed" => "MAY_BE_ANY|MAY_BE_ARRAY_KEY_ANY|MAY_BE_ARRAY_OF_ANY",
+            default => $this->toTypeMask(),
+        };
     }
 
     public function toEscapedName(): string {
@@ -524,13 +495,18 @@ public function equals(SimpleType $other): bool {
 // Instances of Type are immutable and do not need to be cloned
 // when held by an object that is cloned
 class Type {
-    /** @var SimpleType[] */
-    public /* readonly */ array $types;
-    public /* readonly */ bool $isIntersection;
+
+    /**
+     * @param SimpleType[] $types
+     */
+    private function __construct(
+        public readonly array $types,
+        public readonly bool $isIntersection
+    ) {}
 
     public static function fromNode(Node $node): Type {
         if ($node instanceof Node\UnionType || $node instanceof Node\IntersectionType) {
-            $nestedTypeObjects = array_map(['Type', 'fromNode'], $node->types);
+            $nestedTypeObjects = array_map(Type::fromNode(...), $node->types);
             $types = [];
             foreach ($nestedTypeObjects as $typeObject) {
                 array_push($types, ...$typeObject->types);
@@ -599,14 +575,6 @@ public static function fromString(string $typeString): self {
         return new Type($simpleTypes, $isIntersection);
     }
 
-    /**
-     * @param SimpleType[] $types
-     */
-    private function __construct(array $types, bool $isIntersection) {
-        $this->types = $types;
-        $this->isIntersection = $isIntersection;
-    }
-
     public function isScalar(): bool {
         return !array_any($this->types, static fn (SimpleType $type): bool => !$type->isScalar());
     }
@@ -722,19 +690,15 @@ function ($type) { return $type->name; },
 }
 
 class ArginfoType {
-    /** @var SimpleType[] $classTypes */
-    public /* readonly */ array $classTypes;
-    /** @var SimpleType[] $builtinTypes */
-    private /* readonly */ array $builtinTypes;
 
     /**
      * @param SimpleType[] $classTypes
      * @param SimpleType[] $builtinTypes
      */
-    public function __construct(array $classTypes, array $builtinTypes) {
-        $this->classTypes = $classTypes;
-        $this->builtinTypes = $builtinTypes;
-    }
+    public function __construct(
+        public readonly array $classTypes,
+        private readonly array $builtinTypes,
+    ) {}
 
     public function hasClassType(): bool {
         return !empty($this->classTypes);
@@ -761,35 +725,18 @@ class ArgInfo {
     public const SEND_BY_REF = "1";
     public const SEND_PREFER_REF = "ZEND_SEND_PREFER_REF";
 
-    public /* readonly */ string $name;
-    public /* readonly */ string $sendBy;
-    public /* readonly */ bool $isVariadic;
-    public ?Type $type;
-    private /* readonly */ ?Type $phpDocType;
-    public ?string $defaultValue;
-    /** @var AttributeInfo[] */
-    public array $attributes;
-
     /**
      * @param AttributeInfo[] $attributes
      */
     public function __construct(
-        string $name,
-        string $sendBy,
-        bool $isVariadic,
-        ?Type $type,
-        ?Type $phpDocType,
-        ?string $defaultValue,
-        array $attributes
-    ) {
-        $this->name = $name;
-        $this->sendBy = $sendBy;
-        $this->isVariadic = $isVariadic;
-        $this->type = $type;
-        $this->phpDocType = $phpDocType;
-        $this->defaultValue = $defaultValue;
-        $this->attributes = $attributes;
-    }
+        public readonly string $name,
+        public readonly string $sendBy,
+        public readonly bool $isVariadic,
+        public ?Type $type,
+        private readonly ?Type $phpDocType,
+        public ?string $defaultValue,
+        public array $attributes,
+    ) {}
 
     public function equals(ArgInfo $other): bool {
         return $this->name === $other->name
@@ -824,16 +771,11 @@ private function getDefaultValueAsArginfoString(): string {
     }
 
     public function getDefaultValueAsMethodSynopsisString(): ?string {
-        switch ($this->defaultValue) {
-            case 'UNKNOWN':
-                return null;
-            case 'false':
-            case 'true':
-            case 'null':
-                return "&{$this->defaultValue};";
-        }
-
-        return $this->defaultValue;
+        return match ($this->defaultValue) {
+            'UNKNOWN' => null,
+            'false' | 'true' | 'null' => "&{$this->defaultValue};",
+            default => $this->defaultValue,
+        };
     }
 
     public function toZendInfo(): string {
@@ -895,7 +837,7 @@ public function isUnknown(): bool
 }
 
 class ConstName extends AbstractConstName {
-    private /* readonly */ string $const;
+    private readonly string $const;
 
     public function __construct(?Name $namespace, string $const)
     {
@@ -926,14 +868,11 @@ public function getDeclarationName(): string
 }
 
 class ClassConstName extends AbstractConstName {
-    public /* readonly */ Name $class;
-    private /* readonly */ string $const;
 
-    public function __construct(Name $class, string $const)
-    {
-        $this->class = $class;
-        $this->const = $const;
-    }
+    public function __construct(
+        public readonly Name $class,
+        private readonly string $const,
+    ) {}
 
     public function __toString(): string
     {
@@ -947,14 +886,11 @@ public function getDeclarationName(): string
 }
 
 class PropertyName implements VariableLikeName {
-    public /* readonly */ Name $class;
-    private /* readonly */ string $property;
 
-    public function __construct(Name $class, string $property)
-    {
-        $this->class = $class;
-        $this->property = $property;
-    }
+    public function __construct(
+        public readonly Name $class,
+        private readonly string $property
+    ) {}
 
     public function __toString(): string
     {
@@ -967,6 +903,19 @@ public function getDeclarationName(): string
     }
 }
 
+class EnumCaseName {
+    public function __construct(
+        public readonly Name $enum,
+        public readonly string $case
+    ) {
+    }
+
+    public function __toString(): string
+    {
+        return "$this->enum::$this->case";
+    }
+}
+
 interface FunctionOrMethodName {
     public function getDeclaration(): string;
     public function getArgInfoName(): string;
@@ -978,11 +927,10 @@ public function isDestructor(): bool;
 }
 
 class FunctionName implements FunctionOrMethodName {
-    private /* readonly */ Name $name;
 
-    public function __construct(Name $name) {
-        $this->name = $name;
-    }
+    public function __construct(
+        private readonly Name $name,
+    ) {}
 
     public function getNamespace(): ?string {
         if ($this->name->isQualified()) {
@@ -1042,13 +990,11 @@ public function isDestructor(): bool {
 }
 
 class MethodName implements FunctionOrMethodName {
-    public /* readonly */ Name $className;
-    public /* readonly */ string $methodName;
 
-    public function __construct(Name $className, string $methodName) {
-        $this->className = $className;
-        $this->methodName = $methodName;
-    }
+    public function __construct(
+        public readonly Name $className,
+        public readonly string $methodName,
+    ) {}
 
     public function getDeclarationClassName(): string {
         return implode('_', $this->className->getParts());
@@ -1096,18 +1042,16 @@ class ReturnInfo {
         self::REFCOUNT_N,
     ];
 
-    private /* readonly */ bool $byRef;
-    // NOT readonly - gets removed when discarding info for older PHP versions
-    public ?Type $type;
-    public /* readonly */ ?Type $phpDocType;
-    public /* readonly */ bool $tentativeReturnType;
-    public /* readonly */ string $refcount;
-
-    public function __construct(bool $byRef, ?Type $type, ?Type $phpDocType, bool $tentativeReturnType, ?string $refcount) {
-        $this->byRef = $byRef;
-        $this->type = $type;
-        $this->phpDocType = $phpDocType;
-        $this->tentativeReturnType = $tentativeReturnType;
+    public readonly string $refcount;
+
+    public function __construct(
+        private readonly bool $byRef,
+        // NOT readonly - gets removed when discarding info for older PHP versions
+        public ?Type $type,
+        public readonly ?Type $phpDocType,
+        public readonly bool $tentativeReturnType,
+        ?string $refcount
+    ) {
         $this->setRefcount($refcount);
     }
 
@@ -1240,6 +1184,32 @@ public function isEmpty(): bool {
         );
     }
 
+    /**
+     * If we have ZEND_ACC2_ flags, represent as 'ZEND_FENTRY_FLAGS(flags1, flags2)'.
+     * Otherwise, represent as just 'flags1' (backwards compatible).
+     */
+    private function formatFlags(array $flags): string {
+        $flags1 = [];
+        $flags2 = [];
+        foreach ($flags as $flag) {
+            if (str_starts_with($flag, 'ZEND_ACC2_')) {
+                $flags2[] = $flag;
+            } else {
+                $flags1[] = $flag;
+            }
+        }
+
+        if ($flags2 !== []) {
+            return sprintf(
+                'ZEND_FENTRY_FLAGS(%s, %s)',
+                $flags1 === [] ? 0 : implode("|", $flags1),
+                implode("|", $flags2),
+            );
+        }
+
+        return implode("|", $flags1);
+    }
+
     public function generateVersionDependentFlagCode(
         string $codeTemplate,
         ?int $phpVersionIdMinimumCompatibility,
@@ -1255,7 +1225,7 @@ public function generateVersionDependentFlagCode(
             if (empty($flagsByPhpVersions[$currentPhpVersion])) {
                 return '';
             }
-            return sprintf($codeTemplate, implode("|", $flagsByPhpVersions[$currentPhpVersion]));
+            return sprintf($codeTemplate, $this->formatFlags($flagsByPhpVersions[$currentPhpVersion]));
         }
 
         ksort($flagsByPhpVersions);
@@ -1296,7 +1266,7 @@ public function generateVersionDependentFlagCode(
             reset($flagsByPhpVersions);
             $firstVersion = key($flagsByPhpVersions);
             if ($firstVersion === $phpVersionIdMinimumCompatibility) {
-                return sprintf($codeTemplate, implode("|", reset($flagsByPhpVersions)));
+                return sprintf($codeTemplate, $this->formatFlags(reset($flagsByPhpVersions)));
             }
         }
 
@@ -1309,7 +1279,7 @@ public function generateVersionDependentFlagCode(
 
             $code .= "$if (PHP_VERSION_ID >= $version)\n";
 
-            $code .= sprintf($codeTemplate, implode("|", $versionFlags));
+            $code .= sprintf($codeTemplate, $this->formatFlags($versionFlags));
             $code .= $endif;
 
             $i++;
@@ -1320,26 +1290,6 @@ public function generateVersionDependentFlagCode(
 }
 
 class FuncInfo {
-    public /* readonly */ FunctionOrMethodName $name;
-    private /* readonly */ int $classFlags;
-    public int $flags;
-    public /* readonly */ ?string $aliasType;
-    public ?FunctionOrMethodName $alias;
-    private /* readonly */ bool $isDeprecated;
-    private bool $supportsCompileTimeEval;
-    public /* readonly */ bool $verify;
-    /** @var ArgInfo[] */
-    public /* readonly */ array $args;
-    public /* readonly */ ReturnInfo $return;
-    private /* readonly */ int $numRequiredArgs;
-    public /* readonly */ ?string $cond;
-    public bool $isUndocumentable;
-    private ?int $minimumPhpVersionIdCompatibility;
-    /** @var AttributeInfo[] */
-    public array $attributes;
-    /** @var FramelessFunctionInfo[] */
-    private array $framelessFunctionInfos;
-    private ?ExposedDocComment $exposedDocComment;
 
     /**
      * @param ArgInfo[] $args
@@ -1347,41 +1297,25 @@ class FuncInfo {
      * @param FramelessFunctionInfo[] $framelessFunctionInfos
      */
     public function __construct(
-        FunctionOrMethodName $name,
-        int $classFlags,
-        int $flags,
-        ?string $aliasType,
-        ?FunctionOrMethodName $alias,
-        bool $isDeprecated,
-        bool $supportsCompileTimeEval,
-        bool $verify,
-        array $args,
-        ReturnInfo $return,
-        int $numRequiredArgs,
-        ?string $cond,
-        bool $isUndocumentable,
-        ?int $minimumPhpVersionIdCompatibility,
-        array $attributes,
-        array $framelessFunctionInfos,
-        ?ExposedDocComment $exposedDocComment
+        public readonly FunctionOrMethodName $name,
+        private readonly int $classFlags,
+        public int $flags,
+        public readonly ?string $aliasType,
+        public ?FunctionOrMethodName $alias,
+        private readonly bool $isDeprecated,
+        private bool $supportsCompileTimeEval,
+        private bool $forbidDynamicCalls,
+        public readonly bool $verify,
+        public /* readonly */ array $args,
+        public /* readonly */ ReturnInfo $return,
+        private readonly int $numRequiredArgs,
+        public readonly ?string $cond,
+        public bool $isUndocumentable,
+        private ?int $minimumPhpVersionIdCompatibility,
+        public array $attributes,
+        private array $framelessFunctionInfos,
+        private ?ExposedDocComment $exposedDocComment,
     ) {
-        $this->name = $name;
-        $this->classFlags = $classFlags;
-        $this->flags = $flags;
-        $this->aliasType = $aliasType;
-        $this->alias = $alias;
-        $this->isDeprecated = $isDeprecated;
-        $this->supportsCompileTimeEval = $supportsCompileTimeEval;
-        $this->verify = $verify;
-        $this->args = $args;
-        $this->return = $return;
-        $this->numRequiredArgs = $numRequiredArgs;
-        $this->cond = $cond;
-        $this->isUndocumentable = $isUndocumentable;
-        $this->minimumPhpVersionIdCompatibility = $minimumPhpVersionIdCompatibility;
-        $this->attributes = $attributes;
-        $this->framelessFunctionInfos = $framelessFunctionInfos;
-        $this->exposedDocComment = $exposedDocComment;
         if ($return->tentativeReturnType && $this->isFinalMethod()) {
             throw new Exception("Tentative return inapplicable for final method");
         }
@@ -1678,6 +1612,10 @@ private function getArginfoFlagsByPhpVersions(): VersionFlags
             $flags->addForVersionsAbove("ZEND_ACC_NODISCARD", PHP_85_VERSION_ID);
         }
 
+        if ($this->forbidDynamicCalls) {
+            $flags->addForVersionsAbove("ZEND_ACC2_FORBID_DYN_CALLS", PHP_86_VERSION_ID);
+        }
+
         return $flags;
     }
 
@@ -1693,7 +1631,7 @@ private function generateRefSect1(DOMDocument $doc, string $role): DOMElement {
     }
 
     public function getMethodSynopsisDocument(): ?string {
-        $REFSEC1_SEPERATOR = "\n\n ";
+        $REFSEC1_SEPARATOR = "\n\n ";
 
         $doc = new DOMDocument("1.0", "utf-8");
         $doc->formatOutput = true;
@@ -1703,7 +1641,7 @@ public function getMethodSynopsisDocument(): ?string {
 
         if ($this->isMethod()) {
             assert($this->name instanceof MethodName);
-            /* Namespaces are seperated by '-', '_' must be converted to '-' too.
+            /* Namespaces are separated by '-', '_' must be converted to '-' too.
              * Trim away the __ for magic methods */
             $id = strtolower(
                 str_replace('\\', '-', $this->name->className->__toString())
@@ -1732,7 +1670,7 @@ public function getMethodSynopsisDocument(): ?string {
         $refnamediv->appendChild($refpurpose);
 
         $refnamediv->appendChild(new DOMText("\n "));
-        $refentry->append($refnamediv, $REFSEC1_SEPERATOR);
+        $refentry->append($refnamediv, $REFSEC1_SEPARATOR);
 
         /* Creation of  */
         $descriptionRefSec = $this->generateRefSect1($doc, 'description');
@@ -1751,16 +1689,16 @@ public function getMethodSynopsisDocument(): ?string {
         $descriptionRefSec->appendChild($returnDescriptionPara);
 
         $descriptionRefSec->appendChild(new DOMText("\n "));
-        $refentry->append($descriptionRefSec, $REFSEC1_SEPERATOR);
+        $refentry->append($descriptionRefSec, $REFSEC1_SEPARATOR);
 
         /* Creation of  */
         $parametersRefSec = $this->getParameterSection($doc);
-        $refentry->append($parametersRefSec, $REFSEC1_SEPERATOR);
+        $refentry->append($parametersRefSec, $REFSEC1_SEPARATOR);
 
         /* Creation of  */
         if (!$this->name->isConstructor() && !$this->name->isDestructor()) {
             $returnRefSec = $this->getReturnValueSection($doc);
-            $refentry->append($returnRefSec, $REFSEC1_SEPERATOR);
+            $refentry->append($returnRefSec, $REFSEC1_SEPARATOR);
         }
 
         /* Creation of  */
@@ -1780,14 +1718,14 @@ public function getMethodSynopsisDocument(): ?string {
         $errorsRefSec->appendChild($errorsDescriptionPara);
         $errorsRefSec->appendChild(new DOMText("\n "));
 
-        $refentry->append($errorsRefSec, $REFSEC1_SEPERATOR);
+        $refentry->append($errorsRefSec, $REFSEC1_SEPARATOR);
 
         /* Creation of  */
         $changelogRefSec = $this->getChangelogSection($doc);
-        $refentry->append($changelogRefSec, $REFSEC1_SEPERATOR);
+        $refentry->append($changelogRefSec, $REFSEC1_SEPARATOR);
 
         $exampleRefSec = $this->getExampleSection($doc, $id);
-        $refentry->append($exampleRefSec, $REFSEC1_SEPERATOR);
+        $refentry->append($exampleRefSec, $REFSEC1_SEPARATOR);
 
         /* Creation of  */
         $notesRefSec = $this->generateRefSect1($doc, 'notes');
@@ -1800,7 +1738,7 @@ public function getMethodSynopsisDocument(): ?string {
         $noteTag->append("\n   ", $noteTagSimara, "\n  ");
         $notesRefSec->append($noteTag, "\n ");
 
-        $refentry->append($notesRefSec, $REFSEC1_SEPERATOR);
+        $refentry->append($notesRefSec, $REFSEC1_SEPARATOR);
 
         /* Creation of  */
         $seeAlsoRefSec = $this->generateRefSect1($doc, 'seealso');
@@ -1940,20 +1878,12 @@ private function getReturnValueSection(DOMDocument $doc): DOMElement {
         } else if (count($returnType->types) === 1) {
             $type = $returnType->types[0];
 
-            switch ($type->name) {
-                case 'void':
-                    $descriptionNode = $doc->createEntityReference('return.void');
-                    break;
-                case 'true':
-                    $descriptionNode = $doc->createEntityReference('return.true.always');
-                    break;
-                case 'bool':
-                    $descriptionNode = $doc->createEntityReference('return.success');
-                    break;
-                default:
-                    $descriptionNode = new DOMText("Description.");
-                    break;
-            }
+            $descriptionNode = match ($type->name) {
+                'void' => $doc->createEntityReference('return.void'),
+                'true' => $doc->createEntityReference('return.true.always'),
+                'bool' => $doc->createEntityReference('return.success'),
+                default => new DOMText("Description."),
+            };
             $returnDescriptionPara->appendChild($descriptionNode);
         } else {
             $returnDescriptionPara->appendChild(new DOMText("Description."));
@@ -2241,21 +2171,24 @@ public function toArgInfoCode(?int $minPHPCompatibility): string {
 
     public function __clone()
     {
-        foreach ($this->args as $key => $argInfo) {
-            $this->args[$key] = clone $argInfo;
-        }
+        $this->args = array_map((\clone)(...), $this->args);
         $this->return = clone $this->return;
     }
 }
 
 class EvaluatedValue
 {
-    public /* readonly */ /* mixed */ $value;
-    public SimpleType $type;
-    public Expr $expr;
-    public bool $isUnknownConstValue;
-    /** @var ConstInfo[] */
-    public array $originatingConsts;
+
+    /**
+     * @param ConstInfo[] $originatingConsts
+     */
+    private function __construct(
+        public readonly mixed $value,
+        public SimpleType $type,
+        public Expr $expr,
+        public array $originatingConsts,
+        public bool $isUnknownConstValue,
+    ) {}
 
     /**
      * @param array $allConstInfos
@@ -2267,14 +2200,11 @@ public static function createFromExpression(Expr $expr, ?SimpleType $constType,
         {
             /** @var iterable */
             public array $visitedConstants = [];
-            /** @var array */
-            public array $allConstInfos;
 
             /** @param array $allConstInfos */
-            public function __construct(array $allConstInfos)
-            {
-                $this->allConstInfos = $allConstInfos;
-            }
+            public function __construct(
+                public array $allConstInfos,
+            ) {}
 
             /** @return Node|null */
             public function enterNode(Node $expr)
@@ -2363,19 +2293,6 @@ public static function null(): EvaluatedValue
         return new self(null, SimpleType::null(), new Expr\ConstFetch(new Node\Name('null')), [], false);
     }
 
-    /**
-     * @param mixed $value
-     * @param ConstInfo[] $originatingConsts
-     */
-    private function __construct($value, SimpleType $type, Expr $expr, array $originatingConsts, bool $isUnknownConstValue)
-    {
-        $this->value = $value;
-        $this->type = $type;
-        $this->expr = $expr;
-        $this->originatingConsts = $originatingConsts;
-        $this->isUnknownConstValue = $isUnknownConstValue;
-    }
-
     public function initializeZval(string $zvalName, bool $alreadyExists = false, string $forStringDef = ''): string
     {
         $cExpr = $this->getCExpr();
@@ -2427,9 +2344,28 @@ public function getCExpr(): ?string
         // $this->expr has all its PHP constants replaced by C constants
         $prettyPrinter = new Standard;
         $expr = $prettyPrinter->prettyPrintExpr($this->expr);
-        // PHP single-quote to C double-quote string
         if ($this->type->isString()) {
-            $expr = preg_replace("/(^'|'$)/", '"', $expr);
+            // The string in $expr has had the octal, hex, and unicode
+            // backslash sequences already applied for double-quoted strings,
+            // but not the other sequences.
+            //
+            // PHP has single quote strings, C doesn't (they're one char).
+            // Single-quoted strings need handling to replace their escapes
+            // with the double-quoted equivalent; namely single quote escapes.
+            //
+            // Double-quoted strings have similar escape sequences as C does,
+            // so we can pass them through directly. However, C does *not*
+            // support the \$ escape sequence (in ""), so strip that. Variable
+            // interpolation shouldn't be possible in a stub, so we don't need
+            // to worry about mangling such a case.
+            if (preg_match("/(^'|'$)/", $expr)) {
+                $expr = substr($expr, 1, -1); // strip quotes, readd later
+                $expr = str_replace("\\'", "'", $expr);
+                $expr = addcslashes($expr, "\\\"");
+                $expr = "\"$expr\"";
+            } else {
+                $expr = str_replace('\$', "$", $expr);
+            }
         }
         return $expr[0] == '"' ? $expr : preg_replace('(\bnull\b)', 'NULL', str_replace('\\', '', $expr));
     }
@@ -2437,35 +2373,18 @@ public function getCExpr(): ?string
 
 abstract class VariableLike
 {
-    protected int $flags;
-    public ?Type $type;
-    public /* readonly */ ?Type $phpDocType;
-    private /* readonly */ ?string $link;
-    protected ?int $phpVersionIdMinimumCompatibility;
-    /** @var AttributeInfo[] */
-    public array $attributes;
-    protected /* readonly */ ?ExposedDocComment $exposedDocComment;
-
     /**
      * @param AttributeInfo[] $attributes
      */
     public function __construct(
-        int $flags,
-        ?Type $type,
-        ?Type $phpDocType,
-        ?string $link,
-        ?int $phpVersionIdMinimumCompatibility,
-        array $attributes,
-        ?ExposedDocComment $exposedDocComment
-    ) {
-        $this->flags = $flags;
-        $this->type = $type;
-        $this->phpDocType = $phpDocType;
-        $this->link = $link;
-        $this->phpVersionIdMinimumCompatibility = $phpVersionIdMinimumCompatibility;
-        $this->attributes = $attributes;
-        $this->exposedDocComment = $exposedDocComment;
-    }
+        protected int $flags,
+        public ?Type $type,
+        public readonly ?Type $phpDocType,
+        private readonly ?string $link,
+        protected ?int $phpVersionIdMinimumCompatibility,
+        public array $attributes,
+        protected readonly ?ExposedDocComment $exposedDocComment,
+    ) {}
 
     abstract protected function getVariableTypeName(): string;
 
@@ -2487,7 +2406,17 @@ protected function getFlagsByPhpVersion(): VersionFlags
             $flags = "ZEND_ACC_PRIVATE";
         }
 
-        return new VersionFlags([$flags]);
+        $versionFlags = new VersionFlags([$flags]);
+
+        if ($this->flags & Modifiers::PUBLIC_SET) {
+            $versionFlags->addForVersionsAbove("ZEND_ACC_PUBLIC_SET", PHP_84_VERSION_ID);
+        } elseif ($this->flags & Modifiers::PROTECTED_SET) {
+            $versionFlags->addForVersionsAbove("ZEND_ACC_PROTECTED_SET", PHP_84_VERSION_ID);
+        } elseif ($this->flags & Modifiers::PRIVATE_SET) {
+            $versionFlags->addForVersionsAbove("ZEND_ACC_PRIVATE_SET", PHP_84_VERSION_ID);
+        }
+
+        return $versionFlags;
     }
 
     protected function getTypeCode(string $variableLikeName, string &$code): string
@@ -2508,8 +2437,8 @@ protected function getTypeCode(string $variableLikeName, string &$code): string
                     $code .= "\t{$variableLikeType}_{$variableLikeName}_type_list->num_types = $classTypeCount;\n";
 
                     foreach ($arginfoType->classTypes as $k => $classType) {
-                        $escapedClassName = $classType->toEscapedName();
-                        $code .= "\t{$variableLikeType}_{$variableLikeName}_type_list->types[$k] = (zend_type) ZEND_TYPE_INIT_CLASS({$variableLikeType}_{$variableLikeName}_class_{$escapedClassName}, 0, 0);\n";
+                        $varEscapedClassName = $classType->toVarEscapedName();
+                        $code .= "\t{$variableLikeType}_{$variableLikeName}_type_list->types[$k] = (zend_type) ZEND_TYPE_INIT_CLASS({$variableLikeType}_{$variableLikeName}_class_{$varEscapedClassName}, 0, 0);\n";
                     }
 
                     $typeMaskCode = $this->type->toArginfoType()->toTypeMask();
@@ -2583,56 +2512,51 @@ protected function addModifiersToFieldSynopsis(DOMDocument $doc, DOMElement $fie
             $fieldsynopsisElement->appendChild(new DOMText("\n$indentation"));
             $fieldsynopsisElement->appendChild($doc->createElement("modifier", "private"));
         }
+
+        if ($this->flags & Modifiers::PUBLIC_SET) {
+            $fieldsynopsisElement->appendChild(new DOMText("\n$indentation"));
+            $fieldsynopsisElement->appendChild($doc->createElement("modifier", "public(set)"));
+        } elseif ($this->flags & Modifiers::PROTECTED_SET) {
+            $fieldsynopsisElement->appendChild(new DOMText("\n$indentation"));
+            $fieldsynopsisElement->appendChild($doc->createElement("modifier", "protected(set)"));
+        } elseif ($this->flags & Modifiers::PRIVATE_SET) {
+            $fieldsynopsisElement->appendChild(new DOMText("\n$indentation"));
+            $fieldsynopsisElement->appendChild($doc->createElement("modifier", "private(set)"));
+        }
     }
 
 }
 
 class ConstInfo extends VariableLike
 {
-    public /* readonly */ AbstractConstName $name;
-    public /* readonly */ Expr $value;
-    private bool $isDeprecated;
-    private /* readonly */ ?string $valueString;
-    public /* readonly */ ?string $cond;
-    public /* readonly */ ?string $cValue;
-    public /* readonly */ bool $isUndocumentable;
-    private /* readonly */ bool $isFileCacheAllowed;
 
     /**
      * @param AttributeInfo[] $attributes
      */
     public function __construct(
-        AbstractConstName $name,
+        public readonly AbstractConstName $name,
         int $flags,
-        Expr $value,
-        ?string $valueString,
+        public readonly Expr $value,
+        private readonly ?string $valueString,
         ?Type $type,
         ?Type $phpDocType,
-        bool $isDeprecated,
-        ?string $cond,
-        ?string $cValue,
-        bool $isUndocumentable,
+        private bool $isDeprecated,
+        public readonly ?string $cond,
+        public readonly ?string $cValue,
+        public readonly bool $isUndocumentable,
         ?string $link,
         ?int $phpVersionIdMinimumCompatibility,
         array $attributes,
         ?ExposedDocComment $exposedDocComment,
-        bool $isFileCacheAllowed
+        private readonly bool $isFileCacheAllowed,
     ) {
         if (array_any(
             $attributes,
             static fn (AttributeInfo $attr): bool => $attr->class === "Deprecated"
         )) {
-            $isDeprecated = true;
+            $this->isDeprecated = true;
         }
 
-        $this->name = $name;
-        $this->value = $value;
-        $this->valueString = $valueString;
-        $this->isDeprecated = $isDeprecated;
-        $this->cond = $cond;
-        $this->cValue = $cValue;
-        $this->isUndocumentable = $isUndocumentable;
-        $this->isFileCacheAllowed = $isFileCacheAllowed;
         parent::__construct($flags, $type, $phpDocType, $link, $phpVersionIdMinimumCompatibility, $attributes, $exposedDocComment);
     }
 
@@ -3049,6 +2973,11 @@ class StringBuilder {
         '8.5' => 'ZEND_STR_8_DOT_5',
     ];
 
+    // NEW in 8.6
+    private const PHP_86_KNOWN = [
+        "arguments" => "ZEND_STR_ARGUMENTS",
+    ];
+
     /**
      * Get an array of three strings:
      *   - declaration of zend_string, if needed, or empty otherwise
@@ -3087,6 +3016,10 @@ public static function getString(
         }
         $include = self::PHP_80_KNOWN;
         switch ($minPhp) {
+            case PHP_86_VERSION_ID:
+                $include = array_merge($include, self::PHP_86_KNOWN);
+                // Intentional fall through
+
             case PHP_85_VERSION_ID:
                 $include = array_merge($include, self::PHP_85_KNOWN);
                 // Intentional fall through
@@ -3118,37 +3051,25 @@ public static function getString(
 
 class PropertyInfo extends VariableLike
 {
-    private /* readonly */ int $classFlags;
-    public /* readonly */ PropertyName $name;
-    private /* readonly */ ?Expr $defaultValue;
-    private /* readonly */ ?string $defaultValueString;
-    private /* readonly */ bool $isDocReadonly;
-    private /* readonly */ bool $isVirtual;
 
     /**
      * @param AttributeInfo[] $attributes
      */
     public function __construct(
-        PropertyName $name,
-        int $classFlags,
+        public readonly PropertyName $name,
+        private readonly int $classFlags,
         int $flags,
         ?Type $type,
         ?Type $phpDocType,
-        ?Expr $defaultValue,
-        ?string $defaultValueString,
-        bool $isDocReadonly,
-        bool $isVirtual,
+        private readonly ?Expr $defaultValue,
+        private readonly ?string $defaultValueString,
+        private readonly bool $isDocReadonly,
+        private readonly bool $isVirtual,
         ?string $link,
         ?int $phpVersionIdMinimumCompatibility,
         array $attributes,
         ?ExposedDocComment $exposedDocComment
     ) {
-        $this->name = $name;
-        $this->classFlags = $classFlags;
-        $this->defaultValue = $defaultValue;
-        $this->defaultValueString = $defaultValueString;
-        $this->isDocReadonly = $isDocReadonly;
-        $this->isVirtual = $isVirtual;
         parent::__construct($flags, $type, $phpDocType, $link, $phpVersionIdMinimumCompatibility, $attributes, $exposedDocComment);
     }
 
@@ -3292,17 +3213,15 @@ protected function addModifiersToFieldSynopsis(DOMDocument $doc, DOMElement $fie
 }
 
 class EnumCaseInfo {
-    public /* readonly */ string $name;
-    private /* readonly */ ?Expr $value;
-
-    public function __construct(string $name, ?Expr $value) {
-        $this->name = $name;
-        $this->value = $value;
-    }
+    public function __construct(
+        public readonly EnumCaseName $name,
+        private readonly ?Expr $value,
+        private readonly ?string $valueString
+    ) {}
 
     /** @param array $allConstInfos */
     public function getDeclaration(array $allConstInfos): string {
-        $escapedName = addslashes($this->name);
+        $escapedName = addslashes($this->name->case);
         if ($this->value === null) {
             return "\n\tzend_enum_add_case_cstr(class_entry, \"$escapedName\", NULL);\n";
         }
@@ -3314,20 +3233,66 @@ public function getDeclaration(array $allConstInfos): string {
 
         return $code;
     }
+
+    /** @param array $allConstInfos */
+    public function getEnumSynopsisItemElement(DOMDocument $doc, array $allConstInfos, int $indentationLevel): DOMElement
+    {
+        $indentation = str_repeat(" ", $indentationLevel);
+
+        $itemElement = $doc->createElement("enumitem");
+
+        $identifierElement = $doc->createElement("enumidentifier", $this->name->case);
+
+        $itemElement->appendChild(new DOMText("\n$indentation "));
+        $itemElement->appendChild($identifierElement);
+
+        $valueString = $this->getEnumSynopsisValueString($allConstInfos);
+        if ($valueString) {
+            $itemElement->appendChild(new DOMText("\n$indentation "));
+            $valueElement = $doc->createElement("enumvalue",  $valueString);
+            $itemElement->appendChild($valueElement);
+        }
+
+        $descriptionElement = $doc->createElement("enumitemdescription", "Description.");
+        $itemElement->appendChild(new DOMText("\n$indentation "));
+        $itemElement->appendChild($descriptionElement);
+
+        $itemElement->appendChild(new DOMText("\n$indentation"));
+
+        return $itemElement;
+    }
+
+    /** @param array $allConstInfos */
+    public function getEnumSynopsisValueString(array $allConstInfos): ?string
+    {
+        if ($this->value === null) {
+            return null;
+        }
+
+        $value = EvaluatedValue::createFromExpression($this->value, null, null, $allConstInfos);
+        if ($value->isUnknownConstValue) {
+            return null;
+        }
+
+        if ($value->originatingConsts) {
+            return implode("\n", array_map(function (ConstInfo $const) use ($allConstInfos) {
+                return $const->getFieldSynopsisValueString($allConstInfos);
+            }, $value->originatingConsts));
+        }
+
+        return $this->valueString;
+    }
 }
 
 // Instances of AttributeInfo are immutable and do not need to be cloned
 // when held by an object that is cloned
 class AttributeInfo {
-    public /* readonly */ string $class;
-    /** @var \PhpParser\Node\Arg[] */
-    private /* readonly */ array $args;
 
     /** @param \PhpParser\Node\Arg[] $args */
-    public function __construct(string $class, array $args) {
-        $this->class = $class;
-        $this->args = $args;
-    }
+    public function __construct(
+        public readonly string $class,
+        private readonly array $args,
+    ) {}
 
     /**
      * @param array $allConstInfos
@@ -3412,32 +3377,6 @@ public static function createFromGroups(array $attributeGroups): array {
 }
 
 class ClassInfo {
-    public /* readonly */ Name $name;
-    private int $flags;
-    public string $type;
-    public /* readonly */ ?string $alias;
-    private /* readonly */ ?SimpleType $enumBackingType;
-    private /* readonly */ bool $isDeprecated;
-    private bool $isStrictProperties;
-    /** @var AttributeInfo[] */
-    private array $attributes;
-    private ?ExposedDocComment $exposedDocComment;
-    private bool $isNotSerializable;
-    /** @var Name[] */
-    private /* readonly */ array $extends;
-    /** @var Name[] */
-    private /* readonly */ array $implements;
-    /** @var ConstInfo[] */
-    public /* readonly */ array $constInfos;
-    /** @var PropertyInfo[] */
-    private /* readonly */ array $propertyInfos;
-    /** @var FuncInfo[] */
-    public array $funcInfos;
-    /** @var EnumCaseInfo[] */
-    private /* readonly */ array $enumCaseInfos;
-    public /* readonly */ ?string $cond;
-    public ?int $phpVersionIdMinimumCompatibility;
-    public /* readonly */ bool $isUndocumentable;
 
     /**
      * @param AttributeInfo[] $attributes
@@ -3449,46 +3388,27 @@ class ClassInfo {
      * @param EnumCaseInfo[] $enumCaseInfos
      */
     public function __construct(
-        Name $name,
-        int $flags,
-        string $type,
-        ?string $alias,
-        ?SimpleType $enumBackingType,
-        bool $isDeprecated,
-        bool $isStrictProperties,
-        array $attributes,
-        ?ExposedDocComment $exposedDocComment,
-        bool $isNotSerializable,
-        array $extends,
-        array $implements,
-        array $constInfos,
-        array $propertyInfos,
-        array $funcInfos,
-        array $enumCaseInfos,
-        ?string $cond,
-        ?int $minimumPhpVersionIdCompatibility,
-        bool $isUndocumentable
-    ) {
-        $this->name = $name;
-        $this->flags = $flags;
-        $this->type = $type;
-        $this->alias = $alias;
-        $this->enumBackingType = $enumBackingType;
-        $this->isDeprecated = $isDeprecated;
-        $this->isStrictProperties = $isStrictProperties;
-        $this->attributes = $attributes;
-        $this->exposedDocComment = $exposedDocComment;
-        $this->isNotSerializable = $isNotSerializable;
-        $this->extends = $extends;
-        $this->implements = $implements;
-        $this->constInfos = $constInfos;
-        $this->propertyInfos = $propertyInfos;
-        $this->funcInfos = $funcInfos;
-        $this->enumCaseInfos = $enumCaseInfos;
-        $this->cond = $cond;
-        $this->phpVersionIdMinimumCompatibility = $minimumPhpVersionIdCompatibility;
-        $this->isUndocumentable = $isUndocumentable;
-    }
+        public readonly Name $name,
+        private int $flags,
+        public string $type,
+        public readonly ?string $alias,
+        private readonly ?SimpleType $enumBackingType,
+        private readonly bool $isDeprecated,
+        private bool $isStrictProperties,
+        private array $attributes,
+        private ?ExposedDocComment $exposedDocComment,
+        private bool $isNotSerializable,
+        private readonly array $extends,
+        private readonly array $implements,
+        public /* readonly */ array $constInfos,
+        private /* readonly */ array $propertyInfos,
+        public array $funcInfos,
+        private readonly array $enumCaseInfos,
+        private readonly bool $generateCNameTable,
+        public readonly ?string $cond,
+        public ?int $phpVersionIdMinimumCompatibility,
+        public readonly bool $isUndocumentable,
+    ) {}
 
     /** @param array $allConstInfos */
     public function getRegistration(array $allConstInfos): string
@@ -3692,13 +3612,32 @@ public function getCDeclarations(): string
 
         $i = 1;
         foreach ($this->enumCaseInfos as $case) {
-            $cName = 'ZEND_ENUM_' . str_replace('\\', '_', $this->name->toString()) . '_' . $case->name;
+            $cName = 'ZEND_ENUM_' . str_replace('\\', '_', $this->name->toString()) . '_' . $case->name->case;
             $code .= "\t{$cName} = {$i},\n";
             $i++;
         }
 
         $code .= "} {$cEnumName};\n";
 
+        $caseCount = count($this->enumCaseInfos);
+
+        if ($this->generateCNameTable && $caseCount > 0) {
+            $cPrefix = 'ZEND_ENUM_' . str_replace('\\', '_', $this->name->toString());
+            $useGuard = $cPrefix . '_USE_NAME_TABLE';
+
+            $code .= "\n#define {$cPrefix}_CASE_COUNT {$caseCount}\n";
+            $code .= "\n#ifdef {$useGuard}\n";
+            $code .= "static const char *{$cEnumName}_case_names[{$cPrefix}_CASE_COUNT + 1] = {\n";
+
+            foreach ($this->enumCaseInfos as $case) {
+                $cName = $cPrefix . '_' . $case->name->case;
+                $code .= "\t[{$cName}] = \"{$case->name->case}\",\n";
+            }
+
+            $code .= "};\n";
+            $code .= "#endif\n";
+        }
+
         if ($this->cond) {
             $code .= "#endif\n";
         }
@@ -3785,8 +3724,12 @@ public function getClassSynopsisDocument(array $classMap, array $allConstInfos):
      * @param array $allConstInfos
      */
     public function getClassSynopsisElement(DOMDocument $doc, array $classMap, array $allConstInfos): ?DOMElement {
-        $classSynopsis = $doc->createElement("classsynopsis");
-        $classSynopsis->setAttribute("class", $this->type === "interface" ? "interface" : "class");
+        if ($this->type === "enum") {
+            $classSynopsis = $doc->createElement("enumsynopsis");
+        } else {
+            $classSynopsis = $doc->createElement("classsynopsis");
+            $classSynopsis->setAttribute("class", $this->type === "interface" ? "interface" : "class");
+        }
 
         $namespace = $this->getNamespace();
         if ($namespace) {
@@ -3806,108 +3749,120 @@ public function getClassSynopsisElement(DOMDocument $doc, array $classMap, array
             $classSynopsisIndentation = str_repeat(" ", $classSynopsisIndentationLevel);
         }
 
-        $exceptionOverride = $this->type === "class" && $this->isException($classMap) ? "exception" : null;
-        $ooElement = self::createOoElement($doc, $this, $exceptionOverride, true, null, $classSynopsisIndentationLevel + 1);
-        if (!$ooElement) {
-            return null;
-        }
         $classSynopsis->appendChild(new DOMText("\n$classSynopsisIndentation "));
-        $classSynopsis->appendChild($ooElement);
 
-        foreach ($this->extends as $k => $parent) {
-            $parentInfo = $classMap[$parent->toString()] ?? null;
-            if ($parentInfo === null) {
-                throw new Exception("Missing parent class " . $parent->toString());
-            }
+        if ($this->type === "enum") {
+            $enumName = $doc->createElement("enumname", $this->getClassName());
+            $classSynopsis->appendChild($enumName);
 
-            $ooElement = self::createOoElement(
-                $doc,
-                $parentInfo,
-                null,
-                false,
-                $k === 0 ? "extends" : null,
-                $classSynopsisIndentationLevel + 1
-            );
+            foreach ($this->enumCaseInfos as $enumCaseInfo) {
+                $classSynopsis->appendChild(new DOMText("\n\n$classSynopsisIndentation "));
+                $enumItemElement = $enumCaseInfo->getEnumSynopsisItemElement($doc, $allConstInfos, $classSynopsisIndentationLevel + 1);
+                $classSynopsis->appendChild($enumItemElement);
+            }
+        } else {
+            $exceptionOverride = $this->type === "class" && $this->isException($classMap) ? "exception" : null;
+            $ooElement = self::createOoElement($doc, $this, $exceptionOverride, true, null, $classSynopsisIndentationLevel + 1);
             if (!$ooElement) {
                 return null;
             }
-
-            $classSynopsis->appendChild(new DOMText("\n\n$classSynopsisIndentation "));
             $classSynopsis->appendChild($ooElement);
-        }
 
-        foreach ($this->implements as $k => $interface) {
-            $interfaceInfo = $classMap[$interface->toString()] ?? null;
-            if (!$interfaceInfo) {
-                throw new Exception("Missing implemented interface " . $interface->toString());
+            foreach ($this->extends as $k => $parent) {
+                $parentInfo = $classMap[$parent->toString()] ?? null;
+                if ($parentInfo === null) {
+                    throw new Exception("Missing parent class " . $parent->toString());
+                }
+
+                $ooElement = self::createOoElement(
+                    $doc,
+                    $parentInfo,
+                    null,
+                    false,
+                    $k === 0 ? "extends" : null,
+                    $classSynopsisIndentationLevel + 1
+                );
+                if (!$ooElement) {
+                    return null;
+                }
+
+                $classSynopsis->appendChild(new DOMText("\n\n$classSynopsisIndentation "));
+                $classSynopsis->appendChild($ooElement);
             }
 
-            $ooElement = self::createOoElement($doc, $interfaceInfo, null, false, $k === 0 ? "implements" : null, $classSynopsisIndentationLevel + 1);
-            if (!$ooElement) {
-                return null;
+            foreach ($this->implements as $k => $interface) {
+                $interfaceInfo = $classMap[$interface->toString()] ?? null;
+                if (!$interfaceInfo) {
+                    throw new Exception("Missing implemented interface " . $interface->toString());
+                }
+
+                $ooElement = self::createOoElement($doc, $interfaceInfo, null, false, $k === 0 ? "implements" : null, $classSynopsisIndentationLevel + 1);
+                if (!$ooElement) {
+                    return null;
+                }
+                $classSynopsis->appendChild(new DOMText("\n\n$classSynopsisIndentation "));
+                $classSynopsis->appendChild($ooElement);
             }
-            $classSynopsis->appendChild(new DOMText("\n\n$classSynopsisIndentation "));
-            $classSynopsis->appendChild($ooElement);
-        }
 
-        /** @var array $parentsWithInheritedConstants */
-        $parentsWithInheritedConstants = [];
-        /** @var array $parentsWithInheritedProperties */
-        $parentsWithInheritedProperties = [];
-        /** @var array $parentsWithInheritedMethods */
-        $parentsWithInheritedMethods = [];
+            /** @var array $parentsWithInheritedConstants */
+            $parentsWithInheritedConstants = [];
+            /** @var array $parentsWithInheritedProperties */
+            $parentsWithInheritedProperties = [];
+            /** @var array $parentsWithInheritedMethods */
+            $parentsWithInheritedMethods = [];
 
-        $this->collectInheritedMembers(
-            $parentsWithInheritedConstants,
-            $parentsWithInheritedProperties,
-            $parentsWithInheritedMethods,
-            $this->hasConstructor(),
-            $classMap
-        );
+            $this->collectInheritedMembers(
+                $parentsWithInheritedConstants,
+                $parentsWithInheritedProperties,
+                $parentsWithInheritedMethods,
+                $this->hasConstructor(),
+                $classMap
+            );
 
-        $this->appendInheritedMemberSectionToClassSynopsis(
-            $doc,
-            $classSynopsis,
-            $parentsWithInheritedConstants,
-            "&Constants;",
-            "&InheritedConstants;",
-            $classSynopsisIndentationLevel + 1
-        );
+            $this->appendInheritedMemberSectionToClassSynopsis(
+                $doc,
+                $classSynopsis,
+                $parentsWithInheritedConstants,
+                "&Constants;",
+                "&InheritedConstants;",
+                $classSynopsisIndentationLevel + 1
+            );
 
-        if (!empty($this->constInfos)) {
-            $classSynopsis->appendChild(new DOMText("\n\n$classSynopsisIndentation "));
-            $classSynopsisInfo = $doc->createElement("classsynopsisinfo", "&Constants;");
-            $classSynopsisInfo->setAttribute("role", "comment");
-            $classSynopsis->appendChild($classSynopsisInfo);
+            if (!empty($this->constInfos)) {
+                $classSynopsis->appendChild(new DOMText("\n\n$classSynopsisIndentation "));
+                $classSynopsisInfo = $doc->createElement("classsynopsisinfo", "&Constants;");
+                $classSynopsisInfo->setAttribute("role", "comment");
+                $classSynopsis->appendChild($classSynopsisInfo);
 
-            foreach ($this->constInfos as $constInfo) {
-                $classSynopsis->appendChild(new DOMText("\n$classSynopsisIndentation "));
-                $fieldSynopsisElement = $constInfo->getFieldSynopsisElement($doc, $allConstInfos, $classSynopsisIndentationLevel + 1);
-                $classSynopsis->appendChild($fieldSynopsisElement);
+                foreach ($this->constInfos as $constInfo) {
+                    $classSynopsis->appendChild(new DOMText("\n$classSynopsisIndentation "));
+                    $fieldSynopsisElement = $constInfo->getFieldSynopsisElement($doc, $allConstInfos, $classSynopsisIndentationLevel + 1);
+                    $classSynopsis->appendChild($fieldSynopsisElement);
+                }
             }
-        }
 
-        if (!empty($this->propertyInfos)) {
-            $classSynopsis->appendChild(new DOMText("\n\n$classSynopsisIndentation "));
-            $classSynopsisInfo = $doc->createElement("classsynopsisinfo", "&Properties;");
-            $classSynopsisInfo->setAttribute("role", "comment");
-            $classSynopsis->appendChild($classSynopsisInfo);
+            if (!empty($this->propertyInfos)) {
+                $classSynopsis->appendChild(new DOMText("\n\n$classSynopsisIndentation "));
+                $classSynopsisInfo = $doc->createElement("classsynopsisinfo", "&Properties;");
+                $classSynopsisInfo->setAttribute("role", "comment");
+                $classSynopsis->appendChild($classSynopsisInfo);
 
-            foreach ($this->propertyInfos as $propertyInfo) {
-                $classSynopsis->appendChild(new DOMText("\n$classSynopsisIndentation "));
-                $fieldSynopsisElement = $propertyInfo->getFieldSynopsisElement($doc, $allConstInfos, $classSynopsisIndentationLevel + 1);
-                $classSynopsis->appendChild($fieldSynopsisElement);
+                foreach ($this->propertyInfos as $propertyInfo) {
+                    $classSynopsis->appendChild(new DOMText("\n$classSynopsisIndentation "));
+                    $fieldSynopsisElement = $propertyInfo->getFieldSynopsisElement($doc, $allConstInfos, $classSynopsisIndentationLevel + 1);
+                    $classSynopsis->appendChild($fieldSynopsisElement);
+                }
             }
-        }
 
-        $this->appendInheritedMemberSectionToClassSynopsis(
-            $doc,
-            $classSynopsis,
-            $parentsWithInheritedProperties,
-            "&Properties;",
-            "&InheritedProperties;",
-            $classSynopsisIndentationLevel + 1
-        );
+            $this->appendInheritedMemberSectionToClassSynopsis(
+                $doc,
+                $classSynopsis,
+                $parentsWithInheritedProperties,
+                "&Properties;",
+                "&InheritedProperties;",
+                $classSynopsisIndentationLevel + 1
+            );
+        }
 
         if (!empty($this->funcInfos)) {
             $classSynopsis->appendChild(new DOMText("\n\n$classSynopsisIndentation "));
@@ -3991,7 +3946,7 @@ private static function createOoElement(
         $indentation = str_repeat(" ", $indentationLevel);
 
         if ($classInfo->type !== "class" && $classInfo->type !== "interface") {
-            echo "Class synopsis generation is not implemented for " . $classInfo->type . "\n";
+            echo "Warning: Class synopsis generation is not implemented for " . $classInfo->type . " of type " . $classInfo->name . "\n";
             return null;
         }
 
@@ -4211,17 +4166,9 @@ private function createIncludeElement(DOMDocument $doc, string $query, int $inde
 
     public function __clone()
     {
-        foreach ($this->constInfos as $key => $constInfo) {
-            $this->constInfos[$key] = clone $constInfo;
-        }
-
-        foreach ($this->propertyInfos as $key => $propertyInfo) {
-            $this->propertyInfos[$key] = clone $propertyInfo;
-        }
-
-        foreach ($this->funcInfos as $key => $funcInfo) {
-            $this->funcInfos[$key] = clone $funcInfo;
-        }
+        $this->constInfos = array_map((\clone)(...), $this->constInfos);
+        $this->propertyInfos = array_map((\clone)(...), $this->propertyInfos);
+        $this->funcInfos = array_map((\clone)(...), $this->funcInfos);
     }
 
     /**
@@ -4282,7 +4229,8 @@ public function __construct(array $fileTags) {
                     throw new Exception(
                         "Legacy PHP version must be one of: \"" . PHP_70_VERSION_ID . "\" (PHP 7.0), \"" . PHP_80_VERSION_ID . "\" (PHP 8.0), " .
                         "\"" . PHP_81_VERSION_ID . "\" (PHP 8.1), \"" . PHP_82_VERSION_ID . "\" (PHP 8.2), \"" . PHP_83_VERSION_ID . "\" (PHP 8.3), " .
-                        "\"" . PHP_84_VERSION_ID . "\" (PHP 8.4), \"" . PHP_85_VERSION_ID . "\" (PHP 8.5), \"" . $tag->value . "\" provided"
+                        "\"" . PHP_84_VERSION_ID . "\" (PHP 8.4), \"" . PHP_85_VERSION_ID . "\" (PHP 8.5), \"" . PHP_86_VERSION_ID . "\" (PHP 8.6), " .
+                        $tag->value . "\" provided"
                     );
                 }
 
@@ -4332,17 +4280,9 @@ public function getAllConstInfos(): array {
 
     public function __clone()
     {
-        foreach ($this->constInfos as $key => $constInfo) {
-            $this->constInfos[$key] = clone $constInfo;
-        }
-
-        foreach ($this->funcInfos as $key => $funcInfo) {
-            $this->funcInfos[$key] = clone $funcInfo;
-        }
-
-        foreach ($this->classInfos as $key => $classInfo) {
-            $this->classInfos[$key] = clone $classInfo;
-        }
+        $this->constInfos = array_map((\clone)(...), $this->constInfos);
+        $this->funcInfos = array_map((\clone)(...), $this->funcInfos);
+        $this->classInfos = array_map((\clone)(...), $this->classInfos);
     }
 
     private function getMinimumPhpVersionIdCompatibility(): ?int {
@@ -4424,6 +4364,11 @@ private function handleStatements(array $stmts, PrettyPrinterAbstract $prettyPri
                 continue;
             }
 
+            if ($stmt instanceof Stmt\Use_ || $stmt instanceof Stmt\GroupUse) {
+                // use statements are resolved by NameResolver before this point
+                continue;
+            }
+
             if ($stmt instanceof Stmt\Const_) {
                 foreach ($stmt->consts as $const) {
                     $this->constInfos[] = parseConstLike(
@@ -4519,7 +4464,10 @@ private function handleStatements(array $stmts, PrettyPrinterAbstract $prettyPri
                         );
                     } else if ($classStmt instanceof Stmt\EnumCase) {
                         $enumCaseInfos[] = new EnumCaseInfo(
-                            $classStmt->name->toString(), $classStmt->expr);
+                            new EnumCaseName($className, $classStmt->name->toString()),
+                            $classStmt->expr,
+                            $classStmt->expr ? $prettyPrinter->prettyPrintExpr($classStmt->expr) : null,
+                        );
                     } else {
                         throw new Exception("Not implemented {$classStmt->getType()}");
                     }
@@ -4610,7 +4558,7 @@ public function generateCDeclarations(): string {
         return $code;
     }
 
-    
+
     /**
      * @param array $allConstInfos
      * @return array{string, string}
@@ -4736,13 +4684,11 @@ function (FuncInfo $funcInfo) use (&$generatedFunctionDeclarations) {
 }
 
 class DocCommentTag {
-    public /* readonly */ string $name;
-    public /* readonly */ ?string $value;
 
-    public function __construct(string $name, ?string $value) {
-        $this->name = $name;
-        $this->value = $value;
-    }
+    public function __construct(
+        public readonly string $name,
+        public readonly ?string $value,
+    ) {}
 
     public function getValue(): string {
         if ($this->value === null) {
@@ -4828,11 +4774,10 @@ public static function makeTagMap(array $tags): array {
 // Instances of ExposedDocComment are immutable and do not need to be cloned
 // when held by an object that is cloned
 class ExposedDocComment {
-    private /* readonly */ string $docComment;
 
-    public function __construct(string $docComment) {
-        $this->docComment = $docComment;
-    }
+    public function __construct(
+        private readonly string $docComment,
+    ) {}
 
     public function escape(): string {
         return str_replace("\n", '\n', addslashes($this->docComment));
@@ -4869,7 +4814,7 @@ public static function extractExposedComment(array $comments): ?ExposedDocCommen
 // Instances of FramelessFunctionInfo are immutable and do not need to be cloned
 // when held by an object that is cloned
 class FramelessFunctionInfo {
-    public /* readonly */ int $arity;
+    public readonly int $arity;
 
     public function __construct(string $json) {
         // FIXME: Should have some validation
@@ -4896,6 +4841,7 @@ function parseFunctionLike(
         $alias = null;
         $isDeprecated = false;
         $supportsCompileTimeEval = false;
+        $forbidDynamicCalls = false;
         $verify = true;
         $docReturnType = null;
         $tentativeReturnType = false;
@@ -4911,6 +4857,7 @@ function parseFunctionLike(
             $verify = !array_key_exists('no-verify', $tagMap);
             $tentativeReturnType = array_key_exists('tentative-return-type', $tagMap);
             $supportsCompileTimeEval = array_key_exists('compile-time-eval', $tagMap);
+            $forbidDynamicCalls = array_key_exists('forbid-dynamic-calls', $tagMap);
             $isUndocumentable = $isUndocumentable || array_key_exists('undocumentable', $tagMap);
 
             foreach ($tags as $tag) {
@@ -5043,6 +4990,7 @@ function parseFunctionLike(
             $alias,
             $isDeprecated,
             $supportsCompileTimeEval,
+            $forbidDynamicCalls,
             $verify,
             $args,
             $return,
@@ -5240,6 +5188,7 @@ function parseClass(
     $isStrictProperties = array_key_exists('strict-properties', $tagMap);
     $isNotSerializable = array_key_exists('not-serializable', $tagMap);
     $isUndocumentable = $isUndocumentable || array_key_exists('undocumentable', $tagMap);
+    $generateCNameTable = array_key_exists('c-name-table', $tagMap);
     foreach ($tags as $tag) {
         if ($tag->name === 'alias') {
             $alias = $tag->getValue();
@@ -5301,6 +5250,7 @@ function parseClass(
         $properties,
         $methods,
         $enumCases,
+        $generateCNameTable,
         $cond,
         $minimumPhpVersionIdCompatibility,
         $isUndocumentable
@@ -5801,7 +5751,7 @@ function replaceClassSynopses(
             continue;
         }
 
-        if (stripos($xml, "getElementsByTagName("classsynopsis") as $element) {
-            $classSynopsisElements[] = $element;
+            $synopsisElements[] = $element;
         }
 
-        foreach ($classSynopsisElements as $classSynopsis) {
-            if (!$classSynopsis instanceof DOMElement) {
-                continue;
-            }
+        foreach ($doc->getElementsByTagName("enumsynopsis") as $element) {
+            $synopsisElements[] = $element;
+        }
 
-            $child = $classSynopsis->firstElementChild;
-            if ($child === null) {
+        foreach ($synopsisElements as $synopsis) {
+            if (!$synopsis instanceof DOMElement) {
                 continue;
             }
-            $child = $child->lastElementChild;
-            if ($child === null) {
-                continue;
+
+            if ($synopsis->nodeName === "classsynopsis") {
+                $child = $synopsis->firstElementChild;
+                if ($child === null) {
+                    continue;
+                }
+                $child = $child->lastElementChild;
+                if ($child === null) {
+                    continue;
+                }
+            } elseif ($synopsis->nodeName === "enumsynopsis") {
+                $child = $synopsis->firstElementChild;
+                if ($child === null) {
+                    continue;
+                }
             }
+
             $className = $child->textContent;
+
+            if ($synopsis->parentElement->nodeName === "packagesynopsis" &&
+                $synopsis->parentElement->firstElementChild->nodeName === "package"
+            ) {
+                $package = $synopsis->parentElement->firstElementChild;
+                $namespace = $package->textContent;
+
+                $className = $namespace . "\\" . $className;
+                $elementToReplace = $synopsis->parentElement;
+            } else {
+                $elementToReplace = $synopsis;
+            }
+
             if (!isset($classMap[$className])) {
                 continue;
             }
@@ -5844,17 +5819,32 @@ function replaceClassSynopses(
 
             $classInfo = $classMap[$className];
 
-            $newClassSynopsis = $classInfo->getClassSynopsisElement($doc, $classMap, $allConstInfos);
-            if ($newClassSynopsis === null) {
+            $newSynopsis = $classInfo->getClassSynopsisElement($doc, $classMap, $allConstInfos);
+            if ($newSynopsis === null) {
                 continue;
             }
 
             // Check if there is any change - short circuit if there is not any.
 
-            if (replaceAndCompareXmls($doc, $classSynopsis, $newClassSynopsis)) {
+            if (replaceAndCompareXmls($doc, $elementToReplace, $newSynopsis)) {
                 continue;
             }
 
+            if ($synopsis->nodeName === "enumsynopsis") {
+                $oldEnumCaseDescriptionElements = collectEnumSynopsisItemDescriptions($className, $elementToReplace);
+                $newEnumCaseDescriptionElements = collectEnumSynopsisItemDescriptions($className, $newSynopsis);
+
+                foreach ($newEnumCaseDescriptionElements as $key => $newEnumCaseDescriptionElement) {
+                    if (isset($oldEnumCaseDescriptionElements[$key]) === false) {
+                        continue;
+                    }
+
+                    $oldEnumCaseDescriptionElement = $oldEnumCaseDescriptionElements[$key];
+
+                    $newEnumCaseDescriptionElement->parentElement->replaceChild($oldEnumCaseDescriptionElement, $newEnumCaseDescriptionElement);
+                }
+            }
+
             // Return the updated XML
 
             $replacedXml = $doc->saveXML();
@@ -5890,6 +5880,28 @@ function replaceClassSynopses(
     return $classSynopses;
 }
 
+/**
+ * @return array
+ */
+function collectEnumSynopsisItemDescriptions(string $className, DOMElement $synopsis): array
+{
+    $enumCaseDescriptionElements = [];
+
+    $enumCaseDescriptions = $synopsis->getElementsByTagName("enumitemdescription");
+    foreach ($enumCaseDescriptions as $enumItemDescription) {
+        $enumCaseNames = $enumItemDescription->parentElement->getElementsByTagName("enumidentifier");
+        if (empty($enumCaseNames)) {
+            continue;
+        }
+
+        $enumCaseName = $enumCaseNames[0]->textContent;
+
+        $enumCaseDescriptionElements["$className::$enumCaseName"] = $enumItemDescription;
+    }
+
+    return $enumCaseDescriptionElements;
+}
+
 function getReplacedSynopsisXml(string $xml): string
 {
     return preg_replace(
@@ -6199,7 +6211,7 @@ function initPhpParser() {
     }
 
     spl_autoload_register(static function(string $class) use ($phpParserDir) {
-        if (strpos($class, "PhpParser\\") === 0) {
+        if (str_starts_with($class, "PhpParser\\")) {
             $fileName = $phpParserDir . "/lib/" . str_replace("\\", "/", $class) . ".php";
             require $fileName;
         }
diff --git a/build/php.m4 b/build/php.m4
index 516e18e1abfb..83375bec5aa2 100644
--- a/build/php.m4
+++ b/build/php.m4
@@ -1382,6 +1382,54 @@ int main(void) {
 ])
 ])
 
+AC_DEFUN([PHP_POLL_MECHANISMS],
+[
+  AC_MSG_CHECKING([for polling mechanisms])
+  poll_mechanisms=""
+
+  AC_COMPILE_IFELSE([AC_LANG_PROGRAM([
+    #include 
+  ], [
+    int fd = epoll_create(1);
+    return fd;
+  ])], [
+    AC_DEFINE([HAVE_EPOLL], [1], [Define if epoll is available])
+    poll_mechanisms="$poll_mechanisms epoll"
+
+    AC_CHECK_FUNCS([epoll_pwait2], [],
+      [AC_CHECK_DECL([epoll_pwait2],
+        [AC_DEFINE([HAVE_EPOLL_PWAIT2], [1])],
+        [],
+        [#include ])])
+  ])
+
+  AC_COMPILE_IFELSE([AC_LANG_PROGRAM([
+    #include 
+    #include 
+  ], [
+    int kq = kqueue();
+    return kq;
+  ])], [
+    AC_DEFINE([HAVE_KQUEUE], [1], [Define if kqueue is available])
+    poll_mechanisms="$poll_mechanisms kqueue"
+  ])
+
+  AC_COMPILE_IFELSE([AC_LANG_PROGRAM([
+    #include 
+  ], [
+    int port = port_create();
+    return port;
+  ])], [
+    AC_DEFINE([HAVE_EVENT_PORTS], [1], [Define if event ports are available])
+    poll_mechanisms="$poll_mechanisms eventport"
+  ])
+
+  dnl Set poll mechanisms including poll that is always available
+  poll_mechanisms="$poll_mechanisms poll"
+
+  AC_MSG_RESULT([$poll_mechanisms])
+])
+
 dnl ----------------------------------------------------------------------------
 dnl Library/function existence and build sanity checks.
 dnl ----------------------------------------------------------------------------
diff --git a/codecov.yml b/codecov.yml
deleted file mode 100644
index 4c7648e738cd..000000000000
--- a/codecov.yml
+++ /dev/null
@@ -1,15 +0,0 @@
-ignore:
-  # bundled libraries
-  - "ext/lexbor/lexbor/core"
-  - "ext/lexbor/lexbor/css"
-  - "ext/lexbor/lexbor/dom"
-  - "ext/lexbor/lexbor/encoding"
-  - "ext/lexbor/lexbor/html"
-  - "ext/lexbor/lexbor/ns"
-  - "ext/lexbor/lexbor/ports"
-  - "ext/lexbor/lexbor/punycode"
-  - "ext/lexbor/lexbor/tag"
-  - "ext/lexbor/lexbor/unicode"
-  - "ext/lexbor/lexbor/url"
-  - "ext/pcre/pcre2lib"
-  - "ext/uri/uriparser"
diff --git a/configure.ac b/configure.ac
index 214c0ab91b2a..b61b909b67b7 100644
--- a/configure.ac
+++ b/configure.ac
@@ -444,6 +444,7 @@ AC_CHECK_HEADERS(m4_normalize([
 ])
 
 PHP_FOPENCOOKIE
+PHP_POLL_MECHANISMS
 PHP_BROKEN_GETCWD
 AS_VAR_IF([GCC], [yes], [PHP_BROKEN_GCC_STRLEN_OPT])
 
@@ -1682,6 +1683,17 @@ PHP_ADD_SOURCES_X([main],
   [PHP_FASTCGI_OBJS],
   [no])
 
+PHP_ADD_SOURCES([main/poll], m4_normalize([
+    poll_backend_epoll.c
+    poll_backend_eventport.c
+    poll_backend_kqueue.c
+    poll_backend_poll.c
+    poll_core.c
+    poll_fd_table.c
+    poll_handle.c
+  ]),
+  [-DZEND_ENABLE_STATIC_TSRMLS_CACHE=1])
+
 PHP_ADD_SOURCES([main/streams], m4_normalize([
     cast.c
     filter.c
@@ -1689,6 +1701,7 @@ PHP_ADD_SOURCES([main/streams], m4_normalize([
     memory.c
     mmap.c
     plain_wrapper.c
+    stream_errors.c
     streams.c
     transports.c
     userspace.c
@@ -1804,6 +1817,7 @@ AC_DEFINE([HAVE_BUILD_DEFS_H], [1],
 
 PHP_ADD_BUILD_DIR([
   main
+  main/poll
   main/streams
   scripts
   scripts/man1
@@ -1846,11 +1860,11 @@ cat < Only release tags should have version numbers in these files that do not
    > end in `-dev` (e.g., `8.1.7`, `8.1.7RC1`, `8.2.0alpha1`, etc.).
 
-    Do not forget to merge up PHP-X.Y all the way to master. When resolving
-    the conflicts, ignore the changes from PHP-X.Y in higher branches. It
-    means using something like `git checkout --ours .` when on PHP.X.Y+1 or
-    master after the merge resulting in the conflicts.
+    Do not forget to merge up PHP-X.Y all the way to master.
 
-    Be sure to set up a merge driver for the NEWS file as described in
+    ```shell
+    git switch PHP-X.Y+1 # starting from your release branch
+    git merge PHP-X.Y
+    # repeat             # Merge up all the way
+    git switch master
+    git merge PHP-X.Y+n  # latest release branch
+    ```
+
+    When resolving the conflicts, ignore the changes from PHP-X.Y in higher
+    branches when on PHP.X.Y+1 or master after the merge resulting in the
+    conflicts.
+
+    ```shell
+    git checkout --ours main/php_version.h Zend/zend.h configure.ac
+    git add main/php_version.h Zend/zend.h configure.ac
+    git merge --continue
+    ```
+    
+    Be sure to set up a merge driver for the `NEWS` file as described in
     the [Git FAQ page on the PHP wiki][gitfaq-mandatory].
 
 11. Push the changes to the `php-src`.
@@ -1087,26 +1102,19 @@ volunteers to begin the selection process for the next release managers.
    * php-general@lists.php.net (email php-general+subscribe@lists.php.net)
    * php-qa@lists.php.net (email php-qa+subscribe@lists.php.net)
 
-4. Email systems@php.net to get setup for access to downloads.php.net, to be
-   added to the release-managers@php.net distribution list, and to be added to
-   the moderators for php-announce@lists.php.net so you are able to moderate
-   your release announcements.
-
-   Provide the following information in a single email:
+4. File a [ticket in the infrastructure](https://github.com/php/infrastructure/issues/new?template=request-release-manager-access.yml)
+   project and provide an SSH key, your @php.net email address, your GitHub
+   account name, and your preferred system account name. Preferrably they're
+   all the same!
 
-   - An SSH public key, preferably a new unique one for PHP systems and
-     projects.
-   - Read [Machine Access](https://wiki.php.net/systems#machine_access) to set
-     up access to downloads.php.net through jump hosts, and provide a
-     `.google_authenticator` file for 2FA.
-   - Your @php.net email address to use for the release-managers@php.net
-     distribution list and php-announce@lists.php.net moderator address. This
-     should preferably not forward to a Gmail address.
-   - Your GitHub account name, so that your membership to the release managers
-     group may be approved.
+5. Read [Logging into Servers](https://github.com/php/infrastructure/blob/main/docs/ServerAccess.rst#logging-into-servers) to set up
+   access to downloads.php.net through jump hosts with 2FA.
 
-   A system admin will then contact you to go through with steps 5 through 8 of
-   [2FA setup instructions](https://wiki.php.net/systems#fa_setup_instructions).
+   Then [create a Google Authenticator file](https://github.com/php/infrastructure/blob/main/docs/ServerAccess.rst#creating-google-authenticator-files),
+   and provide the `.google_authenticator` file that this created, as
+   attachment to an email to systems@php.net. In this email you should also
+   provide a link to the ticket in the infrastructure project that you have
+   created in the previous step
 
    > 💬 **Hint** \
    > To send email from your @php.net address, you will need to use a custom
@@ -1114,7 +1122,7 @@ volunteers to begin the selection process for the next release managers.
    > "[Send emails from a different address or alias][]."
 
 
-5. Create a [GPG key][] for your @php.net address.
+6. Create a [GPG key][] for your @php.net address.
 
    > 💡 **Tip** \
    > If you're new to GPG, follow GitHub's instructions for
@@ -1179,7 +1187,7 @@ volunteers to begin the selection process for the next release managers.
    git push
    ```
 
-6. Make sure you have the following repositories cloned locally:
+7. Make sure you have the following repositories cloned locally:
 
    * https://github.com/php/php-src
    * https://github.com/php/web-php
diff --git a/docs/source/core/data-structures/zend_string.rst b/docs/source/core/data-structures/zend_string.rst
index 2b07611e3425..5b1d3ac0ccfb 100644
--- a/docs/source/core/data-structures/zend_string.rst
+++ b/docs/source/core/data-structures/zend_string.rst
@@ -29,7 +29,7 @@ in bytes, and the ``val`` field contains the actual string data.
 
 You may wonder why the ``val`` field is declared as ``char val[1]``. This is called the `struct
 hack`_ in C. It is used to create structs with a flexible size, namely by allowing the last element
-to be expanded arbitrarily. In this case, the size of ``zend_string`` depends on the strings length,
+to be expanded arbitrarily. In this case, the size of ``zend_string`` depends on the string's length,
 which is determined at runtime (see ``_ZSTR_STRUCT_SIZE``). When allocating the string, we append
 enough bytes to the allocation to hold the strings content.
 
diff --git a/ext/bcmath/bcmath.c b/ext/bcmath/bcmath.c
index 63d9cd2a994e..0e0a9a23b94a 100644
--- a/ext/bcmath/bcmath.c
+++ b/ext/bcmath/bcmath.c
@@ -1,14 +1,12 @@
 /*
    +----------------------------------------------------------------------+
-   | Copyright (c) The PHP Group                                          |
+   | Copyright © The PHP Group and Contributors.                          |
    +----------------------------------------------------------------------+
-   | This source file is subject to version 3.01 of the PHP license,      |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | https://www.php.net/license/3_01.txt                                 |
-   | If you did not receive a copy of the PHP license and are unable to   |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@php.net so we can mail you a copy immediately.               |
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Author: Andi Gutmans                                   |
    +----------------------------------------------------------------------+
@@ -157,6 +155,16 @@ static zend_always_inline zend_result bcmath_check_scale(zend_long scale, uint32
 	return SUCCESS;
 }
 
+static zend_result bcmath_check_precision(zend_long precision, uint32_t arg_num)
+{
+	if (ZEND_LONG_INT_OVFL(precision)) {
+		zend_argument_value_error(arg_num, "must be between " ZEND_LONG_FMT " and %d",
+			(zend_long) ZEND_LONG_MIN, INT_MAX);
+		return FAILURE;
+	}
+	return SUCCESS;
+}
+
 static void php_long2num(bc_num *num, zend_long lval)
 {
 	*num = bc_long2num(lval);
@@ -195,7 +203,7 @@ static void bc_pow_err(bc_raise_status status, uint32_t arg_num)
 				zend_argument_value_error(arg_num, "exponent is too large, the number of digits overflowed");
 			}
 			break;
-		EMPTY_SWITCH_DEFAULT_CASE();
+		default: ZEND_UNREACHABLE();
 	}
 }
 
@@ -573,7 +581,7 @@ PHP_FUNCTION(bcpowmod)
 		case OK:
 			RETVAL_NEW_STR(bc_num2str_ex(result, scale));
 			break;
-		EMPTY_SWITCH_DEFAULT_CASE();
+		default: ZEND_UNREACHABLE();
 	}
 
 	cleanup: {
@@ -797,6 +805,10 @@ PHP_FUNCTION(bcround)
 		Z_PARAM_ENUM(rounding_mode, rounding_mode_ce)
 	ZEND_PARSE_PARAMETERS_END();
 
+	if (bcmath_check_precision(precision, 2) == FAILURE) {
+		RETURN_THROWS();
+	}
+
 	switch (rounding_mode) {
 		case ZEND_ENUM_RoundingMode_HalfAwayFromZero:
 		case ZEND_ENUM_RoundingMode_HalfTowardsZero:
@@ -877,10 +889,7 @@ static int bcmath_number_compare(zval *op1, zval *op2);
 #endif
 #define CHECK_SCALE_OVERFLOW(scale) (scale > INT_MAX)
 
-static zend_always_inline bcmath_number_obj_t *get_bcmath_number_from_obj(const zend_object *obj)
-{
-	return (bcmath_number_obj_t*)((char*)(obj) - XtOffsetOf(bcmath_number_obj_t, std));
-}
+#define get_bcmath_number_from_obj(obj) ZEND_CONTAINER_OF(obj, bcmath_number_obj_t, std)
 
 static zend_always_inline bcmath_number_obj_t *get_bcmath_number_from_zval(const zval *zv)
 {
@@ -1026,7 +1035,7 @@ static void bcmath_number_register_class(void)
 	bcmath_number_ce->default_object_handlers = &bcmath_number_obj_handlers;
 
 	memcpy(&bcmath_number_obj_handlers, &std_object_handlers, sizeof(zend_object_handlers));
-	bcmath_number_obj_handlers.offset = XtOffsetOf(bcmath_number_obj_t, std);
+	bcmath_number_obj_handlers.offset = offsetof(bcmath_number_obj_t, std);
 	bcmath_number_obj_handlers.free_obj = bcmath_number_free;
 	bcmath_number_obj_handlers.clone_obj = bcmath_number_clone;
 	bcmath_number_obj_handlers.do_operation = bcmath_number_do_operation;
@@ -1216,7 +1225,7 @@ static zend_result bc_num_from_obj_or_str_or_long(
 	bc_num *num, size_t *full_scale, const zend_object *obj, const zend_string *str, zend_long lval)
 {
 	if (obj) {
-		bcmath_number_obj_t *intern = get_bcmath_number_from_obj(obj);
+		const bcmath_number_obj_t *intern = get_bcmath_number_from_obj(obj);
 		*num = intern->num;
 		if (full_scale) {
 			*full_scale = intern->scale;
@@ -1306,7 +1315,7 @@ static zend_result bcmath_number_do_operation(uint8_t opcode, zval *ret_val, zva
 				goto fail;
 			}
 			break;
-		EMPTY_SWITCH_DEFAULT_CASE();
+		default: ZEND_UNREACHABLE();
 	}
 
 	if (Z_TYPE_P(op1) != IS_OBJECT) {
@@ -1492,7 +1501,7 @@ static void bcmath_number_calc_method(INTERNAL_FUNCTION_PARAMETERS, uint8_t opco
 				goto fail;
 			}
 			break;
-		EMPTY_SWITCH_DEFAULT_CASE();
+		default: ZEND_UNREACHABLE();
 	}
 
 	if (num_obj == NULL) {
@@ -1652,7 +1661,7 @@ PHP_METHOD(BcMath_Number, powmod)
 			goto cleanup;
 		case OK:
 			break;
-		EMPTY_SWITCH_DEFAULT_CASE();
+		default: ZEND_UNREACHABLE();
 	}
 
 	bc_rm_trailing_zeros(ret);
@@ -1799,6 +1808,10 @@ PHP_METHOD(BcMath_Number, round)
 		Z_PARAM_ENUM(rounding_mode, rounding_mode_ce);
 	ZEND_PARSE_PARAMETERS_END();
 
+	if (bcmath_check_precision(precision, 1) == FAILURE) {
+		RETURN_THROWS();
+	}
+
 	switch (rounding_mode) {
 		case ZEND_ENUM_RoundingMode_HalfAwayFromZero:
 		case ZEND_ENUM_RoundingMode_HalfTowardsZero:
diff --git a/ext/bcmath/libbcmath/src/convert.c b/ext/bcmath/libbcmath/src/convert.c
index ca5b84efde1b..b6003e58682b 100644
--- a/ext/bcmath/libbcmath/src/convert.c
+++ b/ext/bcmath/libbcmath/src/convert.c
@@ -1,14 +1,12 @@
 /*
    +----------------------------------------------------------------------+
-   | Copyright (c) The PHP Group                                          |
+   | Copyright © The PHP Group and Contributors.                          |
    +----------------------------------------------------------------------+
-   | This source file is subject to version 3.01 of the PHP license,      |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | https://www.php.net/license/3_01.txt                                 |
-   | If you did not receive a copy of the PHP license and are unable to   |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@php.net so we can mail you a copy immediately.               |
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Authors: Niels Dossche                             |
    +----------------------------------------------------------------------+
diff --git a/ext/bcmath/libbcmath/src/convert.h b/ext/bcmath/libbcmath/src/convert.h
index 73c38cd13010..69ff63b48e03 100644
--- a/ext/bcmath/libbcmath/src/convert.h
+++ b/ext/bcmath/libbcmath/src/convert.h
@@ -1,14 +1,12 @@
 /*
    +----------------------------------------------------------------------+
-   | Copyright (c) The PHP Group                                          |
+   | Copyright © The PHP Group and Contributors.                          |
    +----------------------------------------------------------------------+
-   | This source file is subject to version 3.01 of the PHP license,      |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | https://www.php.net/license/3_01.txt                                 |
-   | If you did not receive a copy of the PHP license and are unable to   |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@php.net so we can mail you a copy immediately.               |
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Authors: Niels Dossche                             |
    +----------------------------------------------------------------------+
diff --git a/ext/bcmath/libbcmath/src/floor_or_ceil.c b/ext/bcmath/libbcmath/src/floor_or_ceil.c
index 98dc94601ac7..f2682951ab82 100644
--- a/ext/bcmath/libbcmath/src/floor_or_ceil.c
+++ b/ext/bcmath/libbcmath/src/floor_or_ceil.c
@@ -1,14 +1,12 @@
 /*
    +----------------------------------------------------------------------+
-   | Copyright (c) The PHP Group                                          |
+   | Copyright © The PHP Group and Contributors.                          |
    +----------------------------------------------------------------------+
-   | This source file is subject to version 3.01 of the PHP license,      |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | https://www.php.net/license/3_01.txt                                 |
-   | If you did not receive a copy of the PHP license and are unable to   |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@php.net so we can mail you a copy immediately.               |
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Authors: Saki Takamachi                                |
    +----------------------------------------------------------------------+
diff --git a/ext/bcmath/libbcmath/src/long2num.c b/ext/bcmath/libbcmath/src/long2num.c
index 7645045b1fa3..494ec9e93564 100644
--- a/ext/bcmath/libbcmath/src/long2num.c
+++ b/ext/bcmath/libbcmath/src/long2num.c
@@ -1,14 +1,12 @@
 /*
    +----------------------------------------------------------------------+
-   | Copyright (c) The PHP Group                                          |
+   | Copyright © The PHP Group and Contributors.                          |
    +----------------------------------------------------------------------+
-   | This source file is subject to version 3.01 of the PHP license,      |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | https://www.php.net/license/3_01.txt                                 |
-   | If you did not receive a copy of the PHP license and are unable to   |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@php.net so we can mail you a copy immediately.               |
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Authors: Saki Takamachi                                |
    +----------------------------------------------------------------------+
diff --git a/ext/bcmath/libbcmath/src/round.c b/ext/bcmath/libbcmath/src/round.c
index ec0042a9f482..86cc7d085ec2 100644
--- a/ext/bcmath/libbcmath/src/round.c
+++ b/ext/bcmath/libbcmath/src/round.c
@@ -1,14 +1,12 @@
 /*
    +----------------------------------------------------------------------+
-   | Copyright (c) The PHP Group                                          |
+   | Copyright © The PHP Group and Contributors.                          |
    +----------------------------------------------------------------------+
-   | This source file is subject to version 3.01 of the PHP license,      |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | https://www.php.net/license/3_01.txt                                 |
-   | If you did not receive a copy of the PHP license and are unable to   |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@php.net so we can mail you a copy immediately.               |
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Authors: Saki Takamachi                                |
    +----------------------------------------------------------------------+
@@ -69,12 +67,10 @@ size_t bc_round(bc_num num, zend_long precision, zend_enum_RoundingMode mode, bc
 			return 0;
 		}
 
-		/* If precision is -3, it becomes 1000. */
-		if (UNEXPECTED(precision == ZEND_LONG_MIN)) {
-			*result = bc_new_num((size_t) ZEND_LONG_MAX + 2, 0);
-		} else {
-			*result = bc_new_num(-precision + 1, 0);
-		}
+		/* If precision is -3, it becomes 1000. Negate in unsigned space so
+		 * precision == ZEND_LONG_MIN doesn't overflow signed long. */
+		zend_ulong magnitude = -(zend_ulong) precision;
+		*result = bc_new_num((size_t) magnitude + 1, 0);
 		(*result)->n_value[0] = 1;
 		(*result)->n_sign = num->n_sign;
 		return 0;
@@ -194,7 +190,7 @@ size_t bc_round(bc_num num, zend_long precision, zend_enum_RoundingMode mode, bc
 			}
 			break;
 
-		EMPTY_SWITCH_DEFAULT_CASE()
+		default: ZEND_UNREACHABLE();
 	}
 
 up:
diff --git a/ext/bcmath/libbcmath/src/str2num.c b/ext/bcmath/libbcmath/src/str2num.c
index 11d71ae492ad..b6f3d736f8da 100644
--- a/ext/bcmath/libbcmath/src/str2num.c
+++ b/ext/bcmath/libbcmath/src/str2num.c
@@ -131,7 +131,7 @@ bool bc_str2num(bc_num *num, const char *str, const char *end, size_t scale, siz
 	const char *decimal_point = (*ptr == '.') ? ptr : NULL;
 
 	/* If a non-digit and non-decimal-point indicator is in the string, i.e. an invalid character */
-	if (UNEXPECTED(!decimal_point && *ptr != '\0')) {
+	if (UNEXPECTED(!decimal_point && ptr != end)) {
 		goto fail;
 	}
 
@@ -140,7 +140,7 @@ bool bc_str2num(bc_num *num, const char *str, const char *end, size_t scale, siz
 		/* search */
 		fractional_ptr = fractional_end = decimal_point + 1;
 		/* For strings that end with a decimal point, such as "012." */
-		if (UNEXPECTED(*fractional_ptr == '\0')) {
+		if (UNEXPECTED(fractional_ptr == end)) {
 			if (full_scale) {
 				*full_scale = 0;
 			}
@@ -149,7 +149,7 @@ bool bc_str2num(bc_num *num, const char *str, const char *end, size_t scale, siz
 
 		/* validate */
 		fractional_end = bc_count_digits(fractional_ptr, end);
-		if (UNEXPECTED(*fractional_end != '\0')) {
+		if (UNEXPECTED(fractional_end != end)) {
 			/* invalid num */
 			goto fail;
 		}
diff --git a/ext/bcmath/php_bcmath.h b/ext/bcmath/php_bcmath.h
index 83894fd7ca6b..334f7400c375 100644
--- a/ext/bcmath/php_bcmath.h
+++ b/ext/bcmath/php_bcmath.h
@@ -1,14 +1,12 @@
 /*
    +----------------------------------------------------------------------+
-   | Copyright (c) The PHP Group                                          |
+   | Copyright © The PHP Group and Contributors.                          |
    +----------------------------------------------------------------------+
-   | This source file is subject to version 3.01 of the PHP license,      |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | https://www.php.net/license/3_01.txt                                 |
-   | If you did not receive a copy of the PHP license and are unable to   |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@php.net so we can mail you a copy immediately.               |
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Author: Andi Gutmans                                   |
    +----------------------------------------------------------------------+
diff --git a/ext/bcmath/tests/bcround_precision_bounds.phpt b/ext/bcmath/tests/bcround_precision_bounds.phpt
new file mode 100644
index 000000000000..4c4f910476a7
--- /dev/null
+++ b/ext/bcmath/tests/bcround_precision_bounds.phpt
@@ -0,0 +1,28 @@
+--TEST--
+bcround() and BcMath\Number::round() reject $precision above INT_MAX
+--EXTENSIONS--
+bcmath
+--SKIPIF--
+
+--FILE--
+getMessage() . \PHP_EOL;
+}
+try {
+    (new BcMath\Number('1'))->round(PHP_INT_MAX);
+} catch (\ValueError $e) {
+    echo $e->getMessage() . \PHP_EOL;
+}
+try {
+    (new BcMath\Number('1'))->round(2147483648); // INT_MAX + 1
+} catch (\ValueError $e) {
+    echo $e->getMessage() . \PHP_EOL;
+}
+?>
+--EXPECTF--
+bcround(): Argument #2 ($precision) must be between %i and %d
+BcMath\Number::round(): Argument #1 ($precision) must be between %i and %d
+BcMath\Number::round(): Argument #1 ($precision) must be between %i and %d
diff --git a/ext/bcmath/tests/sec_embedded_null_truncation.phpt b/ext/bcmath/tests/sec_embedded_null_truncation.phpt
new file mode 100644
index 000000000000..157810ecbb3a
--- /dev/null
+++ b/ext/bcmath/tests/sec_embedded_null_truncation.phpt
@@ -0,0 +1,59 @@
+--TEST--
+bcmath strings with embedded null bytes must be rejected as not well-formed
+--EXTENSIONS--
+bcmath
+--FILE--
+ bcadd($s, "0"),
+    fn($s) => bcsub($s, "0"),
+    fn($s) => bcmul($s, "1"),
+    fn($s) => bcdiv($s, "1"),
+    fn($s) => bcmod($s, "7"),
+    fn($s) => bcpow($s, "1"),
+    fn($s) => bccomp($s, "0"),
+    fn($s) => bcsqrt($s),
+];
+
+foreach ($cases as $s) {
+    foreach ($calls as $fn) {
+        try {
+            $fn($s);
+            echo "FAIL: accepted\n";
+        } catch (\ValueError $e) {
+            echo $e->getMessage() . "\n";
+        }
+    }
+}
+?>
+--EXPECT--
+bcadd(): Argument #1 ($num1) is not well-formed
+bcsub(): Argument #1 ($num1) is not well-formed
+bcmul(): Argument #1 ($num1) is not well-formed
+bcdiv(): Argument #1 ($num1) is not well-formed
+bcmod(): Argument #1 ($num1) is not well-formed
+bcpow(): Argument #1 ($num) is not well-formed
+bccomp(): Argument #1 ($num1) is not well-formed
+bcsqrt(): Argument #1 ($num) is not well-formed
+bcadd(): Argument #1 ($num1) is not well-formed
+bcsub(): Argument #1 ($num1) is not well-formed
+bcmul(): Argument #1 ($num1) is not well-formed
+bcdiv(): Argument #1 ($num1) is not well-formed
+bcmod(): Argument #1 ($num1) is not well-formed
+bcpow(): Argument #1 ($num) is not well-formed
+bccomp(): Argument #1 ($num1) is not well-formed
+bcsqrt(): Argument #1 ($num) is not well-formed
+bcadd(): Argument #1 ($num1) is not well-formed
+bcsub(): Argument #1 ($num1) is not well-formed
+bcmul(): Argument #1 ($num1) is not well-formed
+bcdiv(): Argument #1 ($num1) is not well-formed
+bcmod(): Argument #1 ($num1) is not well-formed
+bcpow(): Argument #1 ($num) is not well-formed
+bccomp(): Argument #1 ($num1) is not well-formed
+bcsqrt(): Argument #1 ($num) is not well-formed
diff --git a/ext/bz2/bz2.c b/ext/bz2/bz2.c
index 91e694f58f46..512632fe8a22 100644
--- a/ext/bz2/bz2.c
+++ b/ext/bz2/bz2.c
@@ -1,14 +1,12 @@
 /*
   +----------------------------------------------------------------------+
-  | Copyright (c) The PHP Group                                          |
+  | Copyright © The PHP Group and Contributors.                          |
   +----------------------------------------------------------------------+
-  | This source file is subject to version 3.01 of the PHP license,      |
-  | that is bundled with this package in the file LICENSE, and is        |
-  | available through the world-wide-web at the following url:           |
-  | https://www.php.net/license/3_01.txt                                 |
-  | If you did not receive a copy of the PHP license and are unable to   |
-  | obtain it through the world-wide-web, please send a note to          |
-  | license@php.net so we can mail you a copy immediately.               |
+  | This source file is subject to the Modified BSD License that is      |
+  | bundled with this package in the file LICENSE, and is available      |
+  | through the World Wide Web at .        |
+  |                                                                      |
+  | SPDX-License-Identifier: BSD-3-Clause                                |
   +----------------------------------------------------------------------+
   | Author: Sterling Hughes                            |
   +----------------------------------------------------------------------+
@@ -402,7 +400,7 @@ PHP_FUNCTION(bzopen)
 					RETURN_FALSE;
 				}
 				break;
-			EMPTY_SWITCH_DEFAULT_CASE();
+			default: ZEND_UNREACHABLE();
 		}
 
 		if (FAILURE == php_stream_cast(stream, PHP_STREAM_AS_FD, (void *) &fd, REPORT_ERRORS)) {
@@ -521,11 +519,15 @@ PHP_FUNCTION(bzdecompress)
 	bzs.bzalloc = NULL;
 	bzs.bzfree = NULL;
 
+	if (source_len > UINT_MAX) {
+		zend_argument_value_error(1, "must have a length less than or equal to %u", UINT_MAX);
+		RETURN_THROWS();
+	}
+
 	if (BZ2_bzDecompressInit(&bzs, 0, (int)small) != BZ_OK) {
 		RETURN_FALSE;
 	}
 
-	// TODO Check source string length fits in unsigned int
 	bzs.next_in = source;
 	bzs.avail_in = source_len;
 
@@ -594,10 +596,8 @@ static void php_bz2_error(INTERNAL_FUNCTION_PARAMETERS, int opt)
 	switch (opt) {
 		case PHP_BZ_ERRNO:
 			RETURN_LONG(errnum);
-			break;
 		case PHP_BZ_ERRSTR:
 			RETURN_STRING((char*)errstr);
-			break;
 		case PHP_BZ_ERRBOTH:
 			array_init(return_value);
 
diff --git a/ext/bz2/bz2_filter.c b/ext/bz2/bz2_filter.c
index 27059391dacb..09c49fa76687 100644
--- a/ext/bz2/bz2_filter.c
+++ b/ext/bz2/bz2_filter.c
@@ -1,14 +1,12 @@
 /*
    +----------------------------------------------------------------------+
-   | Copyright (c) The PHP Group                                          |
+   | Copyright © The PHP Group and Contributors.                          |
    +----------------------------------------------------------------------+
-   | This source file is subject to version 3.01 of the PHP license,      |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | https://www.php.net/license/3_01.txt                                 |
-   | If you did not receive a copy of the PHP license and are unable to   |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@php.net so we can mail you a copy immediately.               |
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Authors: Sara Golemon (pollita@php.net)                              |
    +----------------------------------------------------------------------+
@@ -42,6 +40,10 @@ typedef struct _php_bz2_filter_data {
 	unsigned int is_flushed : 1;          /* only for compression */
 
 	int persistent;
+
+	/* Configuration for reset - immutable */
+	int blockSize100k;  /* compress only */
+	int workFactor;     /* compress only */
 } php_bz2_filter_data;
 
 /* }}} */
@@ -178,6 +180,36 @@ static php_stream_filter_status_t php_bz2_decompress_filter(
 	return exit_status;
 }
 
+static zend_result php_bz2_decompress_seek(
+	php_stream *stream,
+	php_stream_filter *thisfilter,
+	zend_off_t offset,
+	int whence
+	)
+{
+	if (!Z_PTR(thisfilter->abstract)) {
+		return FAILURE;
+	}
+
+	php_bz2_filter_data *data = Z_PTR(thisfilter->abstract);
+
+	/* End current decompression if running */
+	if (data->status == PHP_BZ2_RUNNING) {
+		BZ2_bzDecompressEnd(&(data->strm));
+	}
+
+	/* Reset stream state */
+	data->strm.next_in = data->inbuf;
+	data->strm.avail_in = 0;
+	data->strm.next_out = data->outbuf;
+	data->strm.avail_out = data->outbuf_len;
+	data->status = PHP_BZ2_UNINITIALIZED;
+
+	/* Note: We don't reinitialize here - it will be done on first use in the filter function */
+
+	return SUCCESS;
+}
+
 static void php_bz2_decompress_dtor(php_stream_filter *thisfilter)
 {
 	if (thisfilter && Z_PTR(thisfilter->abstract)) {
@@ -193,6 +225,7 @@ static void php_bz2_decompress_dtor(php_stream_filter *thisfilter)
 
 static const php_stream_filter_ops php_bz2_decompress_ops = {
 	php_bz2_decompress_filter,
+	php_bz2_decompress_seek,
 	php_bz2_decompress_dtor,
 	"bzip2.decompress"
 };
@@ -288,6 +321,41 @@ static php_stream_filter_status_t php_bz2_compress_filter(
 	return exit_status;
 }
 
+static zend_result php_bz2_compress_seek(
+	php_stream *stream,
+	php_stream_filter *thisfilter,
+	zend_off_t offset,
+	int whence
+	)
+{
+	int status;
+
+	if (!Z_PTR(thisfilter->abstract)) {
+		return FAILURE;
+	}
+
+	php_bz2_filter_data *data = Z_PTR(thisfilter->abstract);
+
+	/* End current compression */
+	BZ2_bzCompressEnd(&(data->strm));
+
+	/* Reset stream state */
+	data->strm.next_in = data->inbuf;
+	data->strm.avail_in = 0;
+	data->strm.next_out = data->outbuf;
+	data->strm.avail_out = data->outbuf_len;
+	data->is_flushed = 1;
+
+	/* Reinitialize compression with saved configuration */
+	status = BZ2_bzCompressInit(&(data->strm), data->blockSize100k, 0, data->workFactor);
+	if (status != BZ_OK) {
+		php_error_docref(NULL, E_WARNING, "bzip2.compress: failed to reset compression state");
+		return FAILURE;
+	}
+
+	return SUCCESS;
+}
+
 static void php_bz2_compress_dtor(php_stream_filter *thisfilter)
 {
 	if (Z_PTR(thisfilter->abstract)) {
@@ -301,6 +369,7 @@ static void php_bz2_compress_dtor(php_stream_filter *thisfilter)
 
 static const php_stream_filter_ops php_bz2_compress_ops = {
 	php_bz2_compress_filter,
+	php_bz2_compress_seek,
 	php_bz2_compress_dtor,
 	"bzip2.compress"
 };
@@ -309,12 +378,17 @@ static const php_stream_filter_ops php_bz2_compress_ops = {
 
 /* {{{ bzip2.* common factory */
 
-static php_stream_filter *php_bz2_filter_create(const char *filtername, zval *filterparams, uint8_t persistent)
+static php_stream_filter *php_bz2_filter_create(const char *filtername, zval *filterparams, bool persistent)
 {
 	const php_stream_filter_ops *fops = NULL;
+	php_stream_filter_seekable_t write_seekable;
 	php_bz2_filter_data *data;
 	int status = BZ_OK;
 
+	if (php_stream_filter_parse_write_seek_mode(filterparams, &write_seekable) == FAILURE) {
+		return NULL;
+	}
+
 	/* Create this filter */
 	data = pecalloc(1, sizeof(php_bz2_filter_data), persistent);
 
@@ -388,6 +462,10 @@ static php_stream_filter *php_bz2_filter_create(const char *filtername, zval *fi
 			}
 		}
 
+		/* Save configuration for reset */
+		data->blockSize100k = blockSize100k;
+		data->workFactor = workFactor;
+
 		status = BZ2_bzCompressInit(&(data->strm), blockSize100k, 0, workFactor);
 		data->is_flushed = 1;
 		fops = &php_bz2_compress_ops;
@@ -403,7 +481,7 @@ static php_stream_filter *php_bz2_filter_create(const char *filtername, zval *fi
 		return NULL;
 	}
 
-	return php_stream_filter_alloc(fops, data, persistent);
+	return php_stream_filter_alloc(fops, data, persistent, PSFS_SEEKABLE_START, write_seekable);
 }
 
 const php_stream_filter_factory php_bz2_filter_factory = {
diff --git a/ext/bz2/php_bz2.h b/ext/bz2/php_bz2.h
index 8f1770f2808a..5da17d793059 100644
--- a/ext/bz2/php_bz2.h
+++ b/ext/bz2/php_bz2.h
@@ -1,14 +1,12 @@
 /*
   +----------------------------------------------------------------------+
-  | Copyright (c) The PHP Group                                          |
+  | Copyright © The PHP Group and Contributors.                          |
   +----------------------------------------------------------------------+
-  | This source file is subject to version 3.01 of the PHP license,      |
-  | that is bundled with this package in the file LICENSE, and is        |
-  | available through the world-wide-web at the following url:           |
-  | https://www.php.net/license/3_01.txt                                 |
-  | If you did not receive a copy of the PHP license and are unable to   |
-  | obtain it through the world-wide-web, please send a note to          |
-  | license@php.net so we can mail you a copy immediately.               |
+  | This source file is subject to the Modified BSD License that is      |
+  | bundled with this package in the file LICENSE, and is available      |
+  | through the World Wide Web at .        |
+  |                                                                      |
+  | SPDX-License-Identifier: BSD-3-Clause                                |
   +----------------------------------------------------------------------+
   | Author: Sterling Hughes                            |
   +----------------------------------------------------------------------+
diff --git a/ext/bz2/tests/bz2_filter_seek_compress.phpt b/ext/bz2/tests/bz2_filter_seek_compress.phpt
new file mode 100644
index 000000000000..557021c9fd0d
--- /dev/null
+++ b/ext/bz2/tests/bz2_filter_seek_compress.phpt
@@ -0,0 +1,51 @@
+--TEST--
+bzip2.compress write filter is not reset on seek
+--EXTENSIONS--
+bz2
+--FILE--
+
+--CLEAN--
+
+--EXPECTF--
+Size after write: %d
+Seek to start: SUCCESS
+Seek to middle: SUCCESS
+Decompressed content matches: YES
diff --git a/ext/bz2/tests/bz2_filter_seek_decompress.phpt b/ext/bz2/tests/bz2_filter_seek_decompress.phpt
new file mode 100644
index 000000000000..8ccd224b1a40
--- /dev/null
+++ b/ext/bz2/tests/bz2_filter_seek_decompress.phpt
@@ -0,0 +1,43 @@
+--TEST--
+bzip2.decompress filter with seek to start
+--EXTENSIONS--
+bz2
+--FILE--
+
+--CLEAN--
+
+--EXPECTF--
+First read (20 bytes): I am the very model 
+Seek to start: SUCCESS
+Content after seek matches: YES
+
+Warning: fseek(): Stream filter bzip2.decompress is seekable only to start position in %s on line %d
+Seek to middle: FAILURE
diff --git a/ext/bz2/tests/bz2_filter_write_seek_modes.phpt b/ext/bz2/tests/bz2_filter_write_seek_modes.phpt
new file mode 100644
index 000000000000..b3b4fa39eb16
--- /dev/null
+++ b/ext/bz2/tests/bz2_filter_write_seek_modes.phpt
@@ -0,0 +1,54 @@
+--TEST--
+bzip2.compress write filter: write_seek_mode parameter
+--EXTENSIONS--
+bz2
+--FILE--
+ 'reset']);
+fwrite($fp, $text1);
+ftruncate($fp, 0);
+var_dump(fseek($fp, 0, SEEK_SET) === 0);
+fwrite($fp, $text2);
+fclose($fp);
+
+$fp = fopen($file, 'r');
+stream_filter_append($fp, 'bzip2.decompress', STREAM_FILTER_READ);
+$decoded = stream_get_contents($fp);
+fclose($fp);
+var_dump($decoded === $text2);
+
+/* "strict" */
+$fp = fopen($file, 'w+');
+stream_filter_append($fp, 'bzip2.compress', STREAM_FILTER_WRITE,
+    ['write_seek_mode' => 'strict']);
+fwrite($fp, $text1);
+var_dump(@fseek($fp, 0, SEEK_SET) === -1);
+fclose($fp);
+
+/* Invalid mode: ValueError */
+$fp = fopen($file, 'w+');
+stream_filter_append($fp, 'bzip2.compress', STREAM_FILTER_WRITE,
+    ['write_seek_mode' => 'nope']);
+fclose($fp);
+
+?>
+--CLEAN--
+
+--EXPECTF--
+bool(true)
+bool(true)
+bool(true)
+
+Warning: stream_filter_append(): "write_seek_mode" filter parameter must be one of "preserve", "reset", or "strict" in %s
+
+Warning: stream_filter_append(): Unable to create or locate filter "bzip2.compress" in %s
diff --git a/ext/bz2/tests/bzdecompress_input_too_large.phpt b/ext/bz2/tests/bzdecompress_input_too_large.phpt
new file mode 100644
index 000000000000..88c93d366c54
--- /dev/null
+++ b/ext/bz2/tests/bzdecompress_input_too_large.phpt
@@ -0,0 +1,24 @@
+--TEST--
+bzdecompress() rejects input larger than 4294967296
+--EXTENSIONS--
+bz2
+--INI--
+memory_limit=8G
+--SKIPIF--
+
+--FILE--
+getMessage(), "\n";
+}
+?>
+--EXPECT--
+bzdecompress(): Argument #1 ($data) must have a length less than or equal to 4294967295
diff --git a/ext/calendar/cal_unix.c b/ext/calendar/cal_unix.c
index 915da1c326ae..983857c553d9 100644
--- a/ext/calendar/cal_unix.c
+++ b/ext/calendar/cal_unix.c
@@ -1,14 +1,12 @@
 /*
    +----------------------------------------------------------------------+
-   | Copyright (c) The PHP Group                                          |
+   | Copyright © The PHP Group and Contributors.                          |
    +----------------------------------------------------------------------+
-   | This source file is subject to version 3.01 of the PHP license,      |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | https://www.php.net/license/3_01.txt                                 |
-   | If you did not receive a copy of the PHP license and are unable to   |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@php.net so we can mail you a copy immediately.               |
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Authors: Shane Caraveo                            |
    |          Colin Viebrock                           |
diff --git a/ext/calendar/calendar.c b/ext/calendar/calendar.c
index b90e461da49c..f26d611092db 100644
--- a/ext/calendar/calendar.c
+++ b/ext/calendar/calendar.c
@@ -1,14 +1,12 @@
 /*
    +----------------------------------------------------------------------+
-   | Copyright (c) The PHP Group                                          |
+   | Copyright © The PHP Group and Contributors.                          |
    +----------------------------------------------------------------------+
-   | This source file is subject to version 3.01 of the PHP license,      |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | https://www.php.net/license/3_01.txt                                 |
-   | If you did not receive a copy of the PHP license and are unable to   |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@php.net so we can mail you a copy immediately.               |
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Authors: Shane Caraveo                            |
    |          Colin Viebrock                           |
@@ -574,14 +572,11 @@ PHP_FUNCTION(jddayofweek)
 	switch (mode) {
 	case CAL_DOW_LONG:
 		RETURN_STRING(daynamel);
-		break;
 	case CAL_DOW_SHORT:
 		RETURN_STRING(daynames);
-		break;
 	case CAL_DOW_DAYNO:
 	default:
 		RETURN_LONG(day);
-		break;
 	}
 }
 /* }}} */
diff --git a/ext/calendar/easter.c b/ext/calendar/easter.c
index 7fd8c0b33bb3..198ea7625a1a 100644
--- a/ext/calendar/easter.c
+++ b/ext/calendar/easter.c
@@ -1,14 +1,12 @@
 /*
    +----------------------------------------------------------------------+
-   | Copyright (c) The PHP Group                                          |
+   | Copyright © The PHP Group and Contributors.                          |
    +----------------------------------------------------------------------+
-   | This source file is subject to version 3.01 of the PHP license,      |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | https://www.php.net/license/3_01.txt                                 |
-   | If you did not receive a copy of the PHP license and are unable to   |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@php.net so we can mail you a copy immediately.               |
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Authors: Shane Caraveo                            |
    |          Colin Viebrock                           |
diff --git a/ext/calendar/jewish.c b/ext/calendar/jewish.c
index 19b87316eb14..b589c4cb2617 100644
--- a/ext/calendar/jewish.c
+++ b/ext/calendar/jewish.c
@@ -710,7 +710,7 @@ zend_long JewishToSdn(
 	int yearLength;
 	int lengthOfAdarIAndII;
 
-	if (year <= 0 || year >= 6000 || day <= 0 || day > 30) {
+	if (year <= 0 || year >= INT_MAX - 1 || day <= 0 || day > 30) {
 		return (0);
 	}
 	switch (month) {
diff --git a/ext/calendar/php_calendar.h b/ext/calendar/php_calendar.h
index 38127eb80e24..eee8fbbb6bb3 100644
--- a/ext/calendar/php_calendar.h
+++ b/ext/calendar/php_calendar.h
@@ -1,3 +1,15 @@
+/*
+   +----------------------------------------------------------------------+
+   | Copyright © The PHP Group and Contributors.                          |
+   +----------------------------------------------------------------------+
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
+   +----------------------------------------------------------------------+
+ */
+
 #ifndef PHP_CALENDAR_H
 #define PHP_CALENDAR_H
 
diff --git a/ext/calendar/tests/gh21557.phpt b/ext/calendar/tests/gh21557.phpt
new file mode 100644
index 000000000000..1aa5e65cb342
--- /dev/null
+++ b/ext/calendar/tests/gh21557.phpt
@@ -0,0 +1,24 @@
+--TEST--
+GH-21557 jewishtojd returns 0 for years >= 6000
+--CREDITS--
+oleibman
+--EXTENSIONS--
+calendar
+--FILE--
+
+--EXPECT--
+yh=5995 rh=2537279
+yh=5996 rh=2537633
+yh=5997 rh=2538016
+yh=5998 rh=2538371
+yh=5999 rh=2538725
+yh=6000 rh=2539110
+yh=6001 rh=2539463
+yh=6002 rh=2539818
+yh=6003 rh=2540202
+yh=6004 rh=2540557
diff --git a/ext/com_dotnet/com_com.c b/ext/com_dotnet/com_com.c
index 1b8c8a082a05..a0c8a955e0c5 100644
--- a/ext/com_dotnet/com_com.c
+++ b/ext/com_dotnet/com_com.c
@@ -1,14 +1,12 @@
 /*
    +----------------------------------------------------------------------+
-   | Copyright (c) The PHP Group                                          |
+   | Copyright © The PHP Group and Contributors.                          |
    +----------------------------------------------------------------------+
-   | This source file is subject to version 3.01 of the PHP license,      |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | https://www.php.net/license/3_01.txt                                 |
-   | If you did not receive a copy of the PHP license and are unable to   |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@php.net so we can mail you a copy immediately.               |
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Author: Wez Furlong                            |
    +----------------------------------------------------------------------+
@@ -324,7 +322,7 @@ PHP_FUNCTION(com_get_active_object)
 		IDispatch_Release(obj);
 	}
 	if (unk) {
-		IUnknown_Release(obj);
+		IUnknown_Release(unk);
 	}
 	efree(module);
 }
diff --git a/ext/com_dotnet/com_dotnet.c b/ext/com_dotnet/com_dotnet.c
index f8b4a828e154..78f420ff5591 100644
--- a/ext/com_dotnet/com_dotnet.c
+++ b/ext/com_dotnet/com_dotnet.c
@@ -1,14 +1,12 @@
 /*
    +----------------------------------------------------------------------+
-   | Copyright (c) The PHP Group                                          |
+   | Copyright © The PHP Group and Contributors.                          |
    +----------------------------------------------------------------------+
-   | This source file is subject to version 3.01 of the PHP license,      |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | https://www.php.net/license/3_01.txt                                 |
-   | If you did not receive a copy of the PHP license and are unable to   |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@php.net so we can mail you a copy immediately.               |
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Author: Wez Furlong                            |
    +----------------------------------------------------------------------+
@@ -127,7 +125,6 @@ static HRESULT dotnet_bind_runtime(LPVOID FAR *ppv)
 	typedef HRESULT (STDAPICALLTYPE *cbtr_t)(LPCWSTR pwszVersion, LPCWSTR pwszBuildFlavor, REFCLSID rclsid, REFIID riid, LPVOID FAR *ppv);
 	cbtr_t CorBindToRuntime;
 	OLECHAR *oleversion;
-	char *version;
 
 	mscoree = LoadLibraryA("mscoree.dll");
 	if (mscoree == NULL) {
@@ -140,11 +137,11 @@ static HRESULT dotnet_bind_runtime(LPVOID FAR *ppv)
 		return S_FALSE;
 	}
 
-	version = INI_STR("com.dotnet_version");
-	if (version == NULL || *version == '\0') {
+	const zend_string *version = zend_ini_str_literal("com.dotnet_version");
+	if (version == NULL || ZSTR_LEN(version) == 0) {
 		oleversion = NULL;
 	} else {
-		oleversion = php_com_string_to_olestring(version, strlen(version), COMG(code_page));
+		oleversion = php_com_string_to_olestring(ZSTR_VAL(version), ZSTR_LEN(version), COMG(code_page));
 	}
 
 	hr = CorBindToRuntime(oleversion, NULL, &CLSID_CorRuntimeHost, &IID_ICorRuntimeHost, ppv);
diff --git a/ext/com_dotnet/com_extension.c b/ext/com_dotnet/com_extension.c
index df8314fa7613..e9c6e46884ce 100644
--- a/ext/com_dotnet/com_extension.c
+++ b/ext/com_dotnet/com_extension.c
@@ -1,14 +1,12 @@
 /*
    +----------------------------------------------------------------------+
-   | Copyright (c) The PHP Group                                          |
+   | Copyright © The PHP Group and Contributors.                          |
    +----------------------------------------------------------------------+
-   | This source file is subject to version 3.01 of the PHP license,      |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | https://www.php.net/license/3_01.txt                                 |
-   | If you did not receive a copy of the PHP license and are unable to   |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@php.net so we can mail you a copy immediately.               |
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Author: Wez Furlong                            |
    +----------------------------------------------------------------------+
@@ -118,11 +116,11 @@ static PHP_INI_MH(OnTypeLibFileUpdate)
 		}
 
 		/* Remove leading/training white spaces on search_string */
-		while (isspace(*typelib_name)) {/* Ends on '\0' in worst case */
+		while (isspace((unsigned char)*typelib_name)) {/* Ends on '\0' in worst case */
 			typelib_name ++;
 		}
 		ptr = typelib_name + strlen(typelib_name) - 1;
-		while ((ptr != typelib_name) && isspace(*ptr)) {
+		while ((ptr != typelib_name) && isspace((unsigned char)*ptr)) {
 			*ptr = '\0';
 			ptr--;
 		}
diff --git a/ext/com_dotnet/com_handlers.c b/ext/com_dotnet/com_handlers.c
index 638fc5d8a3ae..81c42da34972 100644
--- a/ext/com_dotnet/com_handlers.c
+++ b/ext/com_dotnet/com_handlers.c
@@ -1,14 +1,12 @@
 /*
    +----------------------------------------------------------------------+
-   | Copyright (c) The PHP Group                                          |
+   | Copyright © The PHP Group and Contributors.                          |
    +----------------------------------------------------------------------+
-   | This source file is subject to version 3.01 of the PHP license,      |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | https://www.php.net/license/3_01.txt                                 |
-   | If you did not receive a copy of the PHP license and are unable to   |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@php.net so we can mail you a copy immediately.               |
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Author: Wez Furlong                            |
    +----------------------------------------------------------------------+
diff --git a/ext/com_dotnet/com_iterator.c b/ext/com_dotnet/com_iterator.c
index 931e4a9afdd0..796a31ac9be5 100644
--- a/ext/com_dotnet/com_iterator.c
+++ b/ext/com_dotnet/com_iterator.c
@@ -1,14 +1,12 @@
 /*
    +----------------------------------------------------------------------+
-   | Copyright (c) The PHP Group                                          |
+   | Copyright © The PHP Group and Contributors.                          |
    +----------------------------------------------------------------------+
-   | This source file is subject to version 3.01 of the PHP license,      |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | https://www.php.net/license/3_01.txt                                 |
-   | If you did not receive a copy of the PHP license and are unable to   |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@php.net so we can mail you a copy immediately.               |
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Author: Wez Furlong                            |
    +----------------------------------------------------------------------+
diff --git a/ext/com_dotnet/com_misc.c b/ext/com_dotnet/com_misc.c
index 6c80bd2b9e24..47c670cd3588 100644
--- a/ext/com_dotnet/com_misc.c
+++ b/ext/com_dotnet/com_misc.c
@@ -1,14 +1,12 @@
 /*
    +----------------------------------------------------------------------+
-   | Copyright (c) The PHP Group                                          |
+   | Copyright © The PHP Group and Contributors.                          |
    +----------------------------------------------------------------------+
-   | This source file is subject to version 3.01 of the PHP license,      |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | https://www.php.net/license/3_01.txt                                 |
-   | If you did not receive a copy of the PHP license and are unable to   |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@php.net so we can mail you a copy immediately.               |
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Author: Wez Furlong                            |
    +----------------------------------------------------------------------+
diff --git a/ext/com_dotnet/com_olechar.c b/ext/com_dotnet/com_olechar.c
index d04f8b18c623..6270db6580f8 100644
--- a/ext/com_dotnet/com_olechar.c
+++ b/ext/com_dotnet/com_olechar.c
@@ -1,14 +1,12 @@
 /*
    +----------------------------------------------------------------------+
-   | Copyright (c) The PHP Group                                          |
+   | Copyright © The PHP Group and Contributors.                          |
    +----------------------------------------------------------------------+
-   | This source file is subject to version 3.01 of the PHP license,      |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | https://www.php.net/license/3_01.txt                                 |
-   | If you did not receive a copy of the PHP license and are unable to   |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@php.net so we can mail you a copy immediately.               |
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Author: Wez Furlong                            |
    |         Harald Radi                                   |
diff --git a/ext/com_dotnet/com_persist.c b/ext/com_dotnet/com_persist.c
index 1b89aea15e23..5559567cbab3 100644
--- a/ext/com_dotnet/com_persist.c
+++ b/ext/com_dotnet/com_persist.c
@@ -1,14 +1,12 @@
 /*
    +----------------------------------------------------------------------+
-   | Copyright (c) The PHP Group                                          |
+   | Copyright © The PHP Group and Contributors.                          |
    +----------------------------------------------------------------------+
-   | This source file is subject to version 3.01 of the PHP license,      |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | https://www.php.net/license/3_01.txt                                 |
-   | If you did not receive a copy of the PHP license and are unable to   |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@php.net so we can mail you a copy immediately.               |
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Author: Wez Furlong                            |
    +----------------------------------------------------------------------+
diff --git a/ext/com_dotnet/com_saproxy.c b/ext/com_dotnet/com_saproxy.c
index ec79faa30a32..0317c329589e 100644
--- a/ext/com_dotnet/com_saproxy.c
+++ b/ext/com_dotnet/com_saproxy.c
@@ -1,14 +1,12 @@
 /*
    +----------------------------------------------------------------------+
-   | Copyright (c) The PHP Group                                          |
+   | Copyright © The PHP Group and Contributors.                          |
    +----------------------------------------------------------------------+
-   | This source file is subject to version 3.01 of the PHP license,      |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | https://www.php.net/license/3_01.txt                                 |
-   | If you did not receive a copy of the PHP license and are unable to   |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@php.net so we can mail you a copy immediately.               |
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Author: Wez Furlong                            |
    +----------------------------------------------------------------------+
diff --git a/ext/com_dotnet/com_typeinfo.c b/ext/com_dotnet/com_typeinfo.c
index 28306b5609b0..ca20ed004d87 100644
--- a/ext/com_dotnet/com_typeinfo.c
+++ b/ext/com_dotnet/com_typeinfo.c
@@ -1,14 +1,12 @@
 /*
    +----------------------------------------------------------------------+
-   | Copyright (c) The PHP Group                                          |
+   | Copyright © The PHP Group and Contributors.                          |
    +----------------------------------------------------------------------+
-   | This source file is subject to version 3.01 of the PHP license,      |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | https://www.php.net/license/3_01.txt                                 |
-   | If you did not receive a copy of the PHP license and are unable to   |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@php.net so we can mail you a copy immediately.               |
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Author: Wez Furlong                            |
    |         Harald Radi                                   |
diff --git a/ext/com_dotnet/com_variant.c b/ext/com_dotnet/com_variant.c
index 7e63d66b3d3a..da3ccc64ffb3 100644
--- a/ext/com_dotnet/com_variant.c
+++ b/ext/com_dotnet/com_variant.c
@@ -1,14 +1,12 @@
 /*
    +----------------------------------------------------------------------+
-   | Copyright (c) The PHP Group                                          |
+   | Copyright © The PHP Group and Contributors.                          |
    +----------------------------------------------------------------------+
-   | This source file is subject to version 3.01 of the PHP license,      |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | https://www.php.net/license/3_01.txt                                 |
-   | If you did not receive a copy of the PHP license and are unable to   |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@php.net so we can mail you a copy immediately.               |
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Author: Wez Furlong                            |
    +----------------------------------------------------------------------+
diff --git a/ext/com_dotnet/com_wrapper.c b/ext/com_dotnet/com_wrapper.c
index 3d05e17affae..c2297d18e58c 100644
--- a/ext/com_dotnet/com_wrapper.c
+++ b/ext/com_dotnet/com_wrapper.c
@@ -1,14 +1,12 @@
 /*
    +----------------------------------------------------------------------+
-   | Copyright (c) The PHP Group                                          |
+   | Copyright © The PHP Group and Contributors.                          |
    +----------------------------------------------------------------------+
-   | This source file is subject to version 3.01 of the PHP license,      |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | https://www.php.net/license/3_01.txt                                 |
-   | If you did not receive a copy of the PHP license and are unable to   |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@php.net so we can mail you a copy immediately.               |
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Author: Wez Furlong                            |
    +----------------------------------------------------------------------+
diff --git a/ext/com_dotnet/php_com_dotnet.h b/ext/com_dotnet/php_com_dotnet.h
index 556c477799ea..51e24b3e5d2a 100644
--- a/ext/com_dotnet/php_com_dotnet.h
+++ b/ext/com_dotnet/php_com_dotnet.h
@@ -1,14 +1,12 @@
 /*
    +----------------------------------------------------------------------+
-   | Copyright (c) The PHP Group                                          |
+   | Copyright © The PHP Group and Contributors.                          |
    +----------------------------------------------------------------------+
-   | This source file is subject to version 3.01 of the PHP license,      |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | https://www.php.net/license/3_01.txt                                 |
-   | If you did not receive a copy of the PHP license and are unable to   |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@php.net so we can mail you a copy immediately.               |
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Author: Wez Furlong                            |
    +----------------------------------------------------------------------+
diff --git a/ext/com_dotnet/php_com_dotnet_internal.h b/ext/com_dotnet/php_com_dotnet_internal.h
index 09fe49439347..5aef37659c44 100644
--- a/ext/com_dotnet/php_com_dotnet_internal.h
+++ b/ext/com_dotnet/php_com_dotnet_internal.h
@@ -1,14 +1,12 @@
 /*
    +----------------------------------------------------------------------+
-   | Copyright (c) The PHP Group                                          |
+   | Copyright © The PHP Group and Contributors.                          |
    +----------------------------------------------------------------------+
-   | This source file is subject to version 3.01 of the PHP license,      |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | https://www.php.net/license/3_01.txt                                 |
-   | If you did not receive a copy of the PHP license and are unable to   |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@php.net so we can mail you a copy immediately.               |
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Author: Wez Furlong                            |
    +----------------------------------------------------------------------+
diff --git a/ext/com_dotnet/tests/comtest/comtest.cpp b/ext/com_dotnet/tests/comtest/comtest.cpp
index a4f91d3121e4..9f6c8c3e466f 100644
--- a/ext/com_dotnet/tests/comtest/comtest.cpp
+++ b/ext/com_dotnet/tests/comtest/comtest.cpp
@@ -1,14 +1,12 @@
 /*
    +----------------------------------------------------------------------+
-   | Copyright (c) The PHP Group                                          |
+   | Copyright © The PHP Group and Contributors.                          |
    +----------------------------------------------------------------------+
-   | This source file is subject to version 3.01 of the PHP license,      |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | https://www.php.net/license/3_01.txt                                 |
-   | If you did not receive a copy of the PHP license and are unable to   |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@php.net so we can mail you a copy immediately.               |
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Author: Christoph M. Becker                             |
    | Based on:                           |
diff --git a/ext/com_dotnet/tests/variants.phpt b/ext/com_dotnet/tests/variants.phpt
index 8547e65efb33..a145fec87ae2 100644
--- a/ext/com_dotnet/tests/variants.phpt
+++ b/ext/com_dotnet/tests/variants.phpt
@@ -43,7 +43,7 @@ foreach ($values as $t => $val) {
 
 echo "OK!";
 ?>
---EXPECT--
+--EXPECTF--
 --
 add: 84
 cat: 4242
@@ -142,8 +142,8 @@ mul: 0
 and: 0
 div:
 	variant_div(42, )
-	exception Division by zero
-	code 80020012
+	exception %s
+	code 800200%x
 
 eqv: -43
 idiv:
@@ -258,8 +258,8 @@ mul: 0
 and: 0
 div:
 	variant_div(3.5, )
-	exception Division by zero
-	code 80020012
+	exception %s
+	code 800200%x
 
 eqv: -5
 idiv:
diff --git a/ext/ctype/ctype.c b/ext/ctype/ctype.c
index b4835019602e..792c5c6679c4 100644
--- a/ext/ctype/ctype.c
+++ b/ext/ctype/ctype.c
@@ -1,14 +1,12 @@
 /*
    +----------------------------------------------------------------------+
-   | Copyright (c) The PHP Group                                          |
+   | Copyright © The PHP Group and Contributors.                          |
    +----------------------------------------------------------------------+
-   | This source file is subject to version 3.01 of the PHP license,      |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | https://www.php.net/license/3_01.txt                                 |
-   | If you did not receive a copy of the PHP license and are unable to   |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@php.net so we can mail you a copy immediately.               |
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Author: Hartmut Holzgraefe                         |
    +----------------------------------------------------------------------+
diff --git a/ext/ctype/php_ctype.h b/ext/ctype/php_ctype.h
index 1596514184c0..c0a1337aa7db 100644
--- a/ext/ctype/php_ctype.h
+++ b/ext/ctype/php_ctype.h
@@ -1,14 +1,12 @@
 /*
    +----------------------------------------------------------------------+
-   | Copyright (c) The PHP Group                                          |
+   | Copyright © The PHP Group and Contributors.                          |
    +----------------------------------------------------------------------+
-   | This source file is subject to version 3.01 of the PHP license,      |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | https://www.php.net/license/3_01.txt                                 |
-   | If you did not receive a copy of the PHP license and are unable to   |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@php.net so we can mail you a copy immediately.               |
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Author: Hartmut Holzgraefe                         |
    +----------------------------------------------------------------------+
diff --git a/ext/curl/config.w32 b/ext/curl/config.w32
index a4bdce59ccb1..567699f3b748 100644
--- a/ext/curl/config.w32
+++ b/ext/curl/config.w32
@@ -14,6 +14,16 @@ if (PHP_CURL != "no") {
 		 CHECK_LIB("libssh2.lib", "curl", PHP_CURL) &&
 		 CHECK_LIB("nghttp2.lib", "curl", PHP_CURL))
 		) {
+		if (!(CHECK_HEADER("brotli/decode.h", "CFLAGS_CURL") &&
+			CHECK_LIB("brotlidec.lib;brotlidec-static.lib", "curl", PHP_CURL) &&
+			CHECK_LIB("brotlicommon.lib;brotlicommon-static.lib", "curl", PHP_CURL)
+		)) {
+			WARNING("brotli in curl not enabled; libraries or headers not found");
+		}
+		if (!(CHECK_LIB("libzstd.lib;libzstd_a.lib", "curl", PHP_CURL)
+		)) {
+			WARNING("zstd in curl not enabled; library not found");
+		}
 		EXTENSION("curl", "interface.c multi.c share.c curl_file.c");
 		AC_DEFINE('HAVE_CURL', 1, "Define to 1 if the PHP extension 'curl' is available.");
 		ADD_FLAG("CFLAGS_CURL", "/D PHP_CURL_EXPORTS=1");
diff --git a/ext/curl/curl_file.c b/ext/curl/curl_file.c
index fd8baecc6838..b67028566c9c 100644
--- a/ext/curl/curl_file.c
+++ b/ext/curl/curl_file.c
@@ -1,14 +1,12 @@
 /*
    +----------------------------------------------------------------------+
-   | Copyright (c) The PHP Group                                          |
+   | Copyright © The PHP Group and Contributors.                          |
    +----------------------------------------------------------------------+
-   | This source file is subject to version 3.01 of the PHP license,      |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | https://www.php.net/license/3_01.txt                                 |
-   | If you did not receive a copy of the PHP license and are unable to   |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@php.net so we can mail you a copy immediately.               |
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Author: Stanislav Malyshev                             |
    +----------------------------------------------------------------------+
diff --git a/ext/curl/curl_private.h b/ext/curl/curl_private.h
index df6fd691a2a7..77b0628ee42a 100644
--- a/ext/curl/curl_private.h
+++ b/ext/curl/curl_private.h
@@ -1,14 +1,12 @@
 /*
    +----------------------------------------------------------------------+
-   | Copyright (c) The PHP Group                                          |
+   | Copyright © The PHP Group and Contributors.                          |
    +----------------------------------------------------------------------+
-   | This source file is subject to version 3.01 of the PHP license,      |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | https://www.php.net/license/3_01.txt                                 |
-   | If you did not receive a copy of the PHP license and are unable to   |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@php.net so we can mail you a copy immediately.               |
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Author: Sterling Hughes                            |
    |         Wez Furlong                            |
@@ -153,15 +151,11 @@ void _php_setup_easy_copy_handlers(php_curl *ch, php_curl *source);
 /* Consumes `zv` */
 zend_long php_curl_get_long(zval *zv);
 
-static inline php_curl *curl_from_obj(zend_object *obj) {
-	return (php_curl *)((char *)(obj) - XtOffsetOf(php_curl, std));
-}
+#define curl_from_obj(obj) ZEND_CONTAINER_OF(obj, php_curl, std)
 
 #define Z_CURL_P(zv) curl_from_obj(Z_OBJ_P(zv))
 
-static inline php_curlsh *curl_share_from_obj(zend_object *obj) {
-	return (php_curlsh *)((char *)(obj) - XtOffsetOf(php_curlsh, std));
-}
+#define curl_share_from_obj(obj) ZEND_CONTAINER_OF(obj, php_curlsh, std)
 
 #define Z_CURL_SHARE_P(zv) curl_share_from_obj(Z_OBJ_P(zv))
 
diff --git a/ext/curl/interface.c b/ext/curl/interface.c
index 6328538241fe..ed544866a886 100644
--- a/ext/curl/interface.c
+++ b/ext/curl/interface.c
@@ -1,14 +1,12 @@
 /*
    +----------------------------------------------------------------------+
-   | Copyright (c) The PHP Group                                          |
+   | Copyright © The PHP Group and Contributors.                          |
    +----------------------------------------------------------------------+
-   | This source file is subject to version 3.01 of the PHP license,      |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | https://www.php.net/license/3_01.txt                                 |
-   | If you did not receive a copy of the PHP license and are unable to   |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@php.net so we can mail you a copy immediately.               |
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Author: Sterling Hughes                            |
    +----------------------------------------------------------------------+
@@ -359,7 +357,7 @@ PHP_MINIT_FUNCTION(curl)
 	curl_ce->default_object_handlers = &curl_object_handlers;
 
 	memcpy(&curl_object_handlers, &std_object_handlers, sizeof(zend_object_handlers));
-	curl_object_handlers.offset = XtOffsetOf(php_curl, std);
+	curl_object_handlers.offset = offsetof(php_curl, std);
 	curl_object_handlers.free_obj = curl_free_obj;
 	curl_object_handlers.get_gc = curl_get_gc;
 	curl_object_handlers.get_constructor = curl_get_constructor;
@@ -1100,8 +1098,6 @@ static void create_certinfo(struct curl_certinfo *ci, zval *listcode)
    Set default options for a handle */
 static void _php_curl_set_default_options(php_curl *ch)
 {
-	char *cainfo;
-
 	curl_easy_setopt(ch->cp, CURLOPT_NOPROGRESS,        1L);
 	curl_easy_setopt(ch->cp, CURLOPT_VERBOSE,           0L);
 	curl_easy_setopt(ch->cp, CURLOPT_ERRORBUFFER,       ch->err.str);
@@ -1114,9 +1110,9 @@ static void _php_curl_set_default_options(php_curl *ch)
 	curl_easy_setopt(ch->cp, CURLOPT_DNS_CACHE_TIMEOUT, 120L);
 	curl_easy_setopt(ch->cp, CURLOPT_MAXREDIRS, 20L); /* prevent infinite redirects */
 
-	cainfo = INI_STR("openssl.cafile");
+	const char *cainfo = zend_ini_string_literal("openssl.cafile");
 	if (!(cainfo && cainfo[0] != '\0')) {
-		cainfo = INI_STR("curl.cainfo");
+		cainfo = zend_ini_string_literal("curl.cainfo");
 	}
 	if (cainfo && cainfo[0] != '\0') {
 		curl_easy_setopt(ch->cp, CURLOPT_CAINFO, cainfo);
diff --git a/ext/curl/multi.c b/ext/curl/multi.c
index 3e6142466e98..0e329e58f977 100644
--- a/ext/curl/multi.c
+++ b/ext/curl/multi.c
@@ -1,14 +1,12 @@
 /*
    +----------------------------------------------------------------------+
-   | Copyright (c) The PHP Group                                          |
+   | Copyright © The PHP Group and Contributors.                          |
    +----------------------------------------------------------------------+
-   | This source file is subject to version 3.01 of the PHP license,      |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | https://www.php.net/license/3_01.txt                                 |
-   | If you did not receive a copy of the PHP license and are unable to   |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@php.net so we can mail you a copy immediately.               |
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Author: Sterling Hughes                            |
    +----------------------------------------------------------------------+
@@ -50,9 +48,7 @@
 
 zend_class_entry *curl_multi_ce;
 
-static inline php_curlm *curl_multi_from_obj(zend_object *obj) {
-	return (php_curlm *)((char *)(obj) - XtOffsetOf(php_curlm, std));
-}
+#define curl_multi_from_obj(obj) ZEND_CONTAINER_OF(obj, php_curlm, std)
 
 #define Z_CURL_MULTI_P(zv) curl_multi_from_obj(Z_OBJ_P(zv))
 
@@ -607,7 +603,7 @@ void curl_multi_register_handlers(void) {
 	curl_multi_ce->default_object_handlers = &curl_multi_handlers;
 
 	memcpy(&curl_multi_handlers, &std_object_handlers, sizeof(zend_object_handlers));
-	curl_multi_handlers.offset = XtOffsetOf(php_curlm, std);
+	curl_multi_handlers.offset = offsetof(php_curlm, std);
 	curl_multi_handlers.free_obj = curl_multi_free_obj;
 	curl_multi_handlers.get_gc = curl_multi_get_gc;
 	curl_multi_handlers.get_constructor = curl_multi_get_constructor;
diff --git a/ext/curl/php_curl.h b/ext/curl/php_curl.h
index 6084d5935c70..9a70d6466c92 100644
--- a/ext/curl/php_curl.h
+++ b/ext/curl/php_curl.h
@@ -1,14 +1,12 @@
 /*
    +----------------------------------------------------------------------+
-   | Copyright (c) The PHP Group                                          |
+   | Copyright © The PHP Group and Contributors.                          |
    +----------------------------------------------------------------------+
-   | This source file is subject to version 3.01 of the PHP license,      |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | https://www.php.net/license/3_01.txt                                 |
-   | If you did not receive a copy of the PHP license and are unable to   |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@php.net so we can mail you a copy immediately.               |
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Author: Sterling Hughes                            |
    |         Wez Furlong                            |
diff --git a/ext/curl/share.c b/ext/curl/share.c
index ba23faa46bf5..56cd804658a4 100644
--- a/ext/curl/share.c
+++ b/ext/curl/share.c
@@ -1,14 +1,12 @@
 /*
    +----------------------------------------------------------------------+
-   | Copyright (c) The PHP Group                                          |
+   | Copyright © The PHP Group and Contributors.                          |
    +----------------------------------------------------------------------+
-   | This source file is subject to version 3.01 of the PHP license,      |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | https://www.php.net/license/3_01.txt                                 |
-   | If you did not receive a copy of the PHP license and are unable to   |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@php.net so we can mail you a copy immediately.               |
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Author: Pierrick Charron                           |
    +----------------------------------------------------------------------+
@@ -305,7 +303,7 @@ void curl_share_register_handlers(void) {
 	curl_share_ce->default_object_handlers = &curl_share_handlers;
 
 	memcpy(&curl_share_handlers, &std_object_handlers, sizeof(zend_object_handlers));
-	curl_share_handlers.offset = XtOffsetOf(php_curlsh, std);
+	curl_share_handlers.offset = offsetof(php_curlsh, std);
 	curl_share_handlers.free_obj = curl_share_free_obj;
 	curl_share_handlers.get_constructor = curl_share_get_constructor;
 	curl_share_handlers.clone_obj = NULL;
@@ -326,7 +324,7 @@ void curl_share_persistent_register_handlers(void) {
 	curl_share_persistent_ce->default_object_handlers = &curl_share_persistent_handlers;
 
 	memcpy(&curl_share_persistent_handlers, &std_object_handlers, sizeof(zend_object_handlers));
-	curl_share_persistent_handlers.offset = XtOffsetOf(php_curlsh, std);
+	curl_share_persistent_handlers.offset = offsetof(php_curlsh, std);
 	curl_share_persistent_handlers.get_constructor = curl_share_persistent_get_constructor;
 	curl_share_persistent_handlers.clone_obj = NULL;
 	curl_share_persistent_handlers.compare = zend_objects_not_comparable;
diff --git a/ext/curl/tests/bug71523.phpt b/ext/curl/tests/bug71523.phpt
index 2cf2477409da..1a01209dbb8b 100644
--- a/ext/curl/tests/bug71523.phpt
+++ b/ext/curl/tests/bug71523.phpt
@@ -4,6 +4,7 @@ Bug #71523 (Copied handle with new option CURLOPT_HTTPHEADER crashes while curl_
 curl
 --SKIPIF--
  %r(Yes|No)%r
 PSL => No
 HTTPS_PROXY => Yes
 MULTI_SSL => %s
-BROTLI => %s
+BROTLI => Yes
 ALTSVC => Yes
 HTTP3 => No
 UNICODE => No
-ZSTD => No
+ZSTD => Yes
 HSTS => Yes
 GSASL => No
 Protocols => dict, file, ftp, ftps, gopher, %r(gophers, )?%rhttp, https, imap, imaps, ldap, ldaps, %r(mqtt, )?%rpop3, pop3s, rtsp, scp, sftp, smb, smbs, smtp, smtps, telnet, tftp%r(, ws)?(, wss)?%r
diff --git a/ext/curl/tests/curl_setopt_ssl.phpt b/ext/curl/tests/curl_setopt_ssl.phpt
index 601e09d1f71a..f3b82e1756e3 100644
--- a/ext/curl/tests/curl_setopt_ssl.phpt
+++ b/ext/curl/tests/curl_setopt_ssl.phpt
@@ -37,6 +37,7 @@ function check_response($response, $clientCertSubject) {
 }
 
 $clientCertSubject = "Subject: C=US, ST=TX, L=Clientlocation, O=Clientcompany, CN=clientname/emailAddress=test@example.com";
+$rejectsZeroLengthBlobs = curl_version()['version_number'] >= 0x081300;
 
 // load server cert
 $serverCertPath = __DIR__ . DIRECTORY_SEPARATOR . 'curl_setopt_ssl_servercert.pem';
@@ -91,7 +92,7 @@ try {
     echo "\n";
     echo "case 2: empty client cert and key from string\n";
     $ch = curl_init("https://127.0.0.1:$port/");
-    var_dump(curl_setopt($ch, CURLOPT_SSLCERT_BLOB, ''));
+    var_dump(curl_setopt($ch, CURLOPT_SSLCERT_BLOB, '') === !$rejectsZeroLengthBlobs);
     var_dump(curl_setopt($ch, CURLOPT_SSLKEY_BLOB, $clientKey));
     var_dump(curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false));
     var_dump(curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false));
@@ -99,14 +100,14 @@ try {
 
     $response = curl_exec($ch);
     check_response($response, $clientCertSubject);
-    check_error($ch);
+    check_error($ch, $rejectsZeroLengthBlobs ? 56 : 58);
     $ch = null;
 
     echo "\n";
     echo "case 3: client cert and empty key from string\n";
     $ch = curl_init("https://127.0.0.1:$port/");
     var_dump(curl_setopt($ch, CURLOPT_SSLCERT_BLOB, $clientCert));
-    var_dump(curl_setopt($ch, CURLOPT_SSLKEY_BLOB, ''));
+    var_dump(curl_setopt($ch, CURLOPT_SSLKEY_BLOB, '') === !$rejectsZeroLengthBlobs);
     var_dump(curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false));
     var_dump(curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false));
     curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
@@ -166,7 +167,7 @@ try {
     echo "case 7: empty issuer cert from string\n";
     $ch = curl_init("https://127.0.0.1:$port/");
     var_dump(curl_setopt($ch, CURLOPT_CAINFO, $serverCertPath));
-    var_dump(curl_setopt($ch, CURLOPT_ISSUERCERT_BLOB, ''));
+    var_dump(curl_setopt($ch, CURLOPT_ISSUERCERT_BLOB, '') === !$rejectsZeroLengthBlobs);
     var_dump(curl_setopt($ch, CURLOPT_SSLCERT, $clientCertPath));
     var_dump(curl_setopt($ch, CURLOPT_SSLKEY, $clientKeyPath));
     var_dump(curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, true));
@@ -174,8 +175,8 @@ try {
     curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
 
     $response = curl_exec($ch);
-    check_response($response, $clientCertSubject);
-    check_error($ch);
+    var_dump((is_string($response) && strpos($response, $clientCertSubject) !== false) === $rejectsZeroLengthBlobs);
+    var_dump(curl_errno($ch) === ($rejectsZeroLengthBlobs ? 0 : 83));
     $ch = null;
 
 } finally {
@@ -199,7 +200,7 @@ bool(true)
 bool(true)
 bool(true)
 client cert subject not in response
-CURL ERROR: 58
+CURL ERROR: EXPECTED
 
 case 3: client cert and empty key from string
 bool(true)
@@ -241,5 +242,5 @@ bool(true)
 bool(true)
 bool(true)
 bool(true)
-client cert subject not in response
-CURL ERROR: 83
+bool(true)
+bool(true)
diff --git a/ext/date/lib/parse_date.c b/ext/date/lib/parse_date.c
index 65d99806642d..eb324f8430c5 100644
--- a/ext/date/lib/parse_date.c
+++ b/ext/date/lib/parse_date.c
@@ -518,7 +518,7 @@ static timelib_sll timelib_get_nr(const char **ptr, int max_length)
 
 static void timelib_skip_day_suffix(const char **ptr)
 {
-	if (isspace(**ptr)) {
+	if (isspace((unsigned char)**ptr)) {
 		return;
 	}
 	if (!timelib_strncasecmp(*ptr, "nd", 2) || !timelib_strncasecmp(*ptr, "rd", 2) ||!timelib_strncasecmp(*ptr, "st", 2) || !timelib_strncasecmp(*ptr, "th", 2)) {
@@ -859,7 +859,7 @@ static timelib_long timelib_parse_tz_cor(const char **ptr, int *tz_not_found)
 
 	*tz_not_found = 1;
 
-	while (isdigit(**ptr) || **ptr == ':') {
+	while (isdigit((unsigned char)**ptr) || **ptr == ':') {
 		++*ptr;
 	}
 	end = *ptr;
@@ -924,7 +924,7 @@ static timelib_long timelib_parse_tz_minutes(const char **ptr, timelib_time *t)
 	}
 
 	++*ptr;
-	while (isdigit(**ptr)) {
+	while (isdigit((unsigned char)**ptr)) {
 		++*ptr;
 	}
 
diff --git a/ext/date/lib/parse_date.re b/ext/date/lib/parse_date.re
index ffb3e8e35913..f4a392753249 100644
--- a/ext/date/lib/parse_date.re
+++ b/ext/date/lib/parse_date.re
@@ -516,7 +516,7 @@ static timelib_sll timelib_get_nr(const char **ptr, int max_length)
 
 static void timelib_skip_day_suffix(const char **ptr)
 {
-	if (isspace(**ptr)) {
+	if (isspace((unsigned char)**ptr)) {
 		return;
 	}
 	if (!timelib_strncasecmp(*ptr, "nd", 2) || !timelib_strncasecmp(*ptr, "rd", 2) ||!timelib_strncasecmp(*ptr, "st", 2) || !timelib_strncasecmp(*ptr, "th", 2)) {
@@ -857,7 +857,7 @@ static timelib_long timelib_parse_tz_cor(const char **ptr, int *tz_not_found)
 
 	*tz_not_found = 1;
 
-	while (isdigit(**ptr) || **ptr == ':') {
+	while (isdigit((unsigned char)**ptr) || **ptr == ':') {
 		++*ptr;
 	}
 	end = *ptr;
@@ -922,7 +922,7 @@ static timelib_long timelib_parse_tz_minutes(const char **ptr, timelib_time *t)
 	}
 
 	++*ptr;
-	while (isdigit(**ptr)) {
+	while (isdigit((unsigned char)**ptr)) {
 		++*ptr;
 	}
 
diff --git a/ext/date/lib/parse_iso_intervals.c b/ext/date/lib/parse_iso_intervals.c
index 1fc0ede9679c..5dcbfe350639 100644
--- a/ext/date/lib/parse_iso_intervals.c
+++ b/ext/date/lib/parse_iso_intervals.c
@@ -985,10 +985,10 @@ void timelib_strtointerval(const char *s, size_t len,
 	in.errors->error_messages = NULL;
 
 	if (len > 0) {
-		while (isspace(*s) && s < e) {
+		while (isspace((unsigned char)*s) && s < e) {
 			s++;
 		}
-		while (isspace(*e) && e > s) {
+		while (isspace((unsigned char)*e) && e > s) {
 			e--;
 		}
 	}
diff --git a/ext/date/lib/parse_iso_intervals.re b/ext/date/lib/parse_iso_intervals.re
index 2a394156f98d..009420077513 100644
--- a/ext/date/lib/parse_iso_intervals.re
+++ b/ext/date/lib/parse_iso_intervals.re
@@ -343,10 +343,10 @@ void timelib_strtointerval(const char *s, size_t len,
 	in.errors->error_messages = NULL;
 
 	if (len > 0) {
-		while (isspace(*s) && s < e) {
+		while (isspace((unsigned char)*s) && s < e) {
 			s++;
 		}
-		while (isspace(*e) && e > s) {
+		while (isspace((unsigned char)*e) && e > s) {
 			e--;
 		}
 	}
diff --git a/ext/date/lib/timelib.c b/ext/date/lib/timelib.c
index 6473a2798a80..faf383a5fa12 100644
--- a/ext/date/lib/timelib.c
+++ b/ext/date/lib/timelib.c
@@ -126,7 +126,7 @@ void timelib_time_tz_abbr_update(timelib_time* tm, const char* tz_abbr)
 	TIMELIB_TIME_FREE(tm->tz_abbr);
 	tm->tz_abbr = timelib_strdup(tz_abbr);
 	for (i = 0; i < tz_abbr_len; i++) {
-		tm->tz_abbr[i] = toupper(tz_abbr[i]);
+		tm->tz_abbr[i] = toupper((unsigned char)tz_abbr[i]);
 	}
 }
 
diff --git a/ext/date/php_date.c b/ext/date/php_date.c
index ddc7d315784b..1dbcf51e72df 100644
--- a/ext/date/php_date.c
+++ b/ext/date/php_date.c
@@ -1,14 +1,12 @@
 /*
    +----------------------------------------------------------------------+
-   | Copyright (c) The PHP Group                                          |
+   | Copyright © The PHP Group and Contributors.                          |
    +----------------------------------------------------------------------+
-   | This source file is subject to version 3.01 of the PHP license,      |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | https://www.php.net/license/3_01.txt                                 |
-   | If you did not receive a copy of the PHP license and are unable to   |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@php.net so we can mail you a copy immediately.               |
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Authors: Derick Rethans                     |
    +----------------------------------------------------------------------+
@@ -31,13 +29,7 @@
 #include "win32/time.h"
 #endif
 
-#ifdef PHP_WIN32
-static __inline __int64 php_date_llabs( __int64 i ) { return i >= 0? i: -i; }
-#elif defined(__GNUC__) && __GNUC__ < 3
-static __inline __int64_t php_date_llabs( __int64_t i ) { return i >= 0 ? i : -i; }
-#else
-static inline long long php_date_llabs( long long i ) { return i >= 0 ? i : -i; }
-#endif
+static inline uint64_t php_date_llabs(int64_t i) { return i >= 0 ? (uint64_t)i : -(uint64_t)i; }
 
 #ifdef PHP_WIN32
 #define DATE_I64_BUF_LEN 65
@@ -742,9 +734,9 @@ static zend_string *date_format(const char *format, size_t format_len, const tim
 			/* year */
 			case 'L': length = slprintf(buffer, sizeof(buffer), "%d", timelib_is_leap((int) t->y)); break;
 			case 'y': length = slprintf(buffer, sizeof(buffer), "%02d", (int) (t->y % 100)); break;
-			case 'Y': length = slprintf(buffer, sizeof(buffer), "%s%04lld", t->y < 0 ? "-" : "", php_date_llabs((timelib_sll) t->y)); break;
-			case 'x': length = slprintf(buffer, sizeof(buffer), "%s%04lld", t->y < 0 ? "-" : (t->y >= 10000 ? "+" : ""), php_date_llabs((timelib_sll) t->y)); break;
-			case 'X': length = slprintf(buffer, sizeof(buffer), "%s%04lld", t->y < 0 ? "-" : "+", php_date_llabs((timelib_sll) t->y)); break;
+			case 'Y': length = slprintf(buffer, sizeof(buffer), "%s%04" PRIu64, t->y < 0 ? "-" : "", php_date_llabs((timelib_sll) t->y)); break;
+			case 'x': length = slprintf(buffer, sizeof(buffer), "%s%04" PRIu64, t->y < 0 ? "-" : (t->y >= 10000 ? "+" : ""), php_date_llabs((timelib_sll) t->y)); break;
+			case 'X': length = slprintf(buffer, sizeof(buffer), "%s%04" PRIu64, t->y < 0 ? "-" : "+", php_date_llabs((timelib_sll) t->y)); break;
 
 			/* time */
 			case 'a': length = slprintf(buffer, sizeof(buffer), "%s", t->h >= 12 ? "pm" : "am"); break;
@@ -1756,7 +1748,7 @@ static void date_register_classes(void) /* {{{ */
 	date_ce_date->create_object = date_object_new_date;
 	date_ce_date->default_object_handlers = &date_object_handlers_date;
 	memcpy(&date_object_handlers_date, &std_object_handlers, sizeof(zend_object_handlers));
-	date_object_handlers_date.offset = XtOffsetOf(php_date_obj, std);
+	date_object_handlers_date.offset = offsetof(php_date_obj, std);
 	date_object_handlers_date.free_obj = date_object_free_storage_date;
 	date_object_handlers_date.clone_obj = date_object_clone_date;
 	date_object_handlers_date.compare = date_object_compare_date;
@@ -1776,7 +1768,7 @@ static void date_register_classes(void) /* {{{ */
 	date_ce_timezone->create_object = date_object_new_timezone;
 	date_ce_timezone->default_object_handlers = &date_object_handlers_timezone;
 	memcpy(&date_object_handlers_timezone, &std_object_handlers, sizeof(zend_object_handlers));
-	date_object_handlers_timezone.offset = XtOffsetOf(php_timezone_obj, std);
+	date_object_handlers_timezone.offset = offsetof(php_timezone_obj, std);
 	date_object_handlers_timezone.free_obj = date_object_free_storage_timezone;
 	date_object_handlers_timezone.clone_obj = date_object_clone_timezone;
 	date_object_handlers_timezone.get_properties_for = date_object_get_properties_for_timezone;
@@ -1788,7 +1780,7 @@ static void date_register_classes(void) /* {{{ */
 	date_ce_interval->create_object = date_object_new_interval;
 	date_ce_interval->default_object_handlers = &date_object_handlers_interval;
 	memcpy(&date_object_handlers_interval, &std_object_handlers, sizeof(zend_object_handlers));
-	date_object_handlers_interval.offset = XtOffsetOf(php_interval_obj, std);
+	date_object_handlers_interval.offset = offsetof(php_interval_obj, std);
 	date_object_handlers_interval.free_obj = date_object_free_storage_interval;
 	date_object_handlers_interval.clone_obj = date_object_clone_interval;
 	date_object_handlers_interval.has_property = date_interval_has_property;
@@ -1804,7 +1796,7 @@ static void date_register_classes(void) /* {{{ */
 	date_ce_period->default_object_handlers = &date_object_handlers_period;
 	date_ce_period->get_iterator = date_object_period_get_iterator;
 	memcpy(&date_object_handlers_period, &std_object_handlers, sizeof(zend_object_handlers));
-	date_object_handlers_period.offset = XtOffsetOf(php_period_obj, std);
+	date_object_handlers_period.offset = offsetof(php_period_obj, std);
 	date_object_handlers_period.free_obj = date_object_free_storage_period;
 	date_object_handlers_period.clone_obj = date_object_clone_period;
 	date_object_handlers_period.get_gc = date_object_get_gc_period;
@@ -1839,7 +1831,7 @@ static zend_object *date_object_new_date(zend_class_entry *class_type) /* {{{ */
 
 static zend_object *date_object_clone_date(zend_object *this_ptr) /* {{{ */
 {
-	php_date_obj *old_obj = php_date_obj_from_obj(this_ptr);
+	const php_date_obj *old_obj = php_date_obj_from_obj(this_ptr);
 	php_date_obj *new_obj = php_date_obj_from_obj(date_object_new_date(old_obj->std.ce));
 
 	zend_objects_clone_members(&new_obj->std, &old_obj->std);
@@ -1996,7 +1988,7 @@ static zend_object *date_object_new_timezone(zend_class_entry *class_type) /* {{
 
 static zend_object *date_object_clone_timezone(zend_object *this_ptr) /* {{{ */
 {
-	php_timezone_obj *old_obj = php_timezone_obj_from_obj(this_ptr);
+	const php_timezone_obj *old_obj = php_timezone_obj_from_obj(this_ptr);
 	php_timezone_obj *new_obj = php_timezone_obj_from_obj(date_object_new_timezone(old_obj->std.ce));
 
 	zend_objects_clone_members(&new_obj->std, &old_obj->std);
@@ -2049,7 +2041,7 @@ static int date_object_compare_timezone(zval *tz1, zval *tz2) /* {{{ */
 			return strcmp(o1->tzi.z.abbr, o2->tzi.z.abbr) ? 1 : 0;
 		case TIMELIB_ZONETYPE_ID:
 			return strcmp(o1->tzi.tz->name, o2->tzi.tz->name) ? 1 : 0;
-		EMPTY_SWITCH_DEFAULT_CASE();
+		default: ZEND_UNREACHABLE();
 	}
 } /* }}} */
 
@@ -2139,7 +2131,7 @@ static zend_object *date_object_new_interval(zend_class_entry *class_type) /* {{
 
 static zend_object *date_object_clone_interval(zend_object *this_ptr) /* {{{ */
 {
-	php_interval_obj *old_obj = php_interval_obj_from_obj(this_ptr);
+	const php_interval_obj *old_obj = php_interval_obj_from_obj(this_ptr);
 	php_interval_obj *new_obj = php_interval_obj_from_obj(date_object_new_interval(old_obj->std.ce));
 
 	zend_objects_clone_members(&new_obj->std, &old_obj->std);
@@ -2230,7 +2222,7 @@ static zend_object *date_object_new_period(zend_class_entry *class_type) /* {{{
 
 static zend_object *date_object_clone_period(zend_object *this_ptr) /* {{{ */
 {
-	php_period_obj *old_obj = php_period_obj_from_obj(this_ptr);
+	const php_period_obj *old_obj = php_period_obj_from_obj(this_ptr);
 	php_period_obj *new_obj = php_period_obj_from_obj(date_object_new_period(old_obj->std.ce));
 
 	zend_objects_clone_members(&new_obj->std, &old_obj->std);
@@ -2744,7 +2736,7 @@ PHP_METHOD(DateTime, createFromTimestamp)
 			}
 			break;
 
-		EMPTY_SWITCH_DEFAULT_CASE();
+		default: ZEND_UNREACHABLE();
 	}
 
 	RETURN_OBJ(Z_OBJ(new_object));
@@ -2825,7 +2817,7 @@ PHP_METHOD(DateTimeImmutable, createFromTimestamp)
 			}
 			break;
 
-		EMPTY_SWITCH_DEFAULT_CASE();
+		default: ZEND_UNREACHABLE();
 	}
 
 	RETURN_OBJ(Z_OBJ(new_object));
@@ -4266,10 +4258,8 @@ PHP_FUNCTION(timezone_offset_get)
 			break;
 		case TIMELIB_ZONETYPE_OFFSET:
 			RETURN_LONG(tzobj->tzi.utc_offset);
-			break;
 		case TIMELIB_ZONETYPE_ABBR:
 			RETURN_LONG(tzobj->tzi.z.utc_offset + (tzobj->tzi.z.dst * 3600));
-			break;
 	}
 }
 /* }}} */
@@ -5068,7 +5058,7 @@ static bool date_period_init_iso8601_string(php_period_obj *dpobj, zend_class_en
 		zend_string_release(func);
 		return false;
 	}
-	if (dpobj->end == NULL && recurrences == 0) {
+	if (dpobj->end == NULL && *recurrences == 0) {
 		zend_string *func = get_active_function_or_method_name();
 		zend_throw_exception_ex(date_ce_date_malformed_period_string_exception, 0, "%s(): ISO interval must contain an end date or a recurrence count, \"%s\" given", ZSTR_VAL(func), isostr);
 		zend_string_release(func);
@@ -5480,18 +5470,18 @@ static void php_do_date_sunrise_sunset(INTERNAL_FUNCTION_PARAMETERS, bool calc_s
 	ZEND_PARSE_PARAMETERS_END();
 
 	if (latitude_is_null) {
-		latitude = INI_FLT("date.default_latitude");
+		latitude = zend_ini_double_literal("date.default_latitude");
 	}
 
 	if (longitude_is_null) {
-		longitude = INI_FLT("date.default_longitude");
+		longitude = zend_ini_double_literal("date.default_longitude");
 	}
 
 	if (zenith_is_null) {
 		if (calc_sunset) {
-			zenith = INI_FLT("date.sunset_zenith");
+			zenith = zend_ini_double_literal("date.sunset_zenith");
 		} else {
-			zenith = INI_FLT("date.sunrise_zenith");
+			zenith = zend_ini_double_literal("date.sunrise_zenith");
 		}
 	}
 
@@ -5545,10 +5535,8 @@ static void php_do_date_sunrise_sunset(INTERNAL_FUNCTION_PARAMETERS, bool calc_s
 		case SUNFUNCS_RET_STRING:
 			retstr = strpprintf(0, "%02d:%02d", (int) N, (int) (60 * (N - (int) N)));
 			RETURN_NEW_STR(retstr);
-			break;
 		case SUNFUNCS_RET_DOUBLE:
 			RETURN_DOUBLE(N);
-			break;
 	}
 }
 /* }}} */
@@ -5973,7 +5961,7 @@ static int date_period_has_property(zend_object *object, zend_string *name, int
 				return 0;
 			case ZEND_PROPERTY_EXISTS:
 				return 1;
-			EMPTY_SWITCH_DEFAULT_CASE()
+			default: ZEND_UNREACHABLE();
 		}
 	}
 
diff --git a/ext/date/php_date.h b/ext/date/php_date.h
index f5f43bc7dfb0..f26617c15ea9 100644
--- a/ext/date/php_date.h
+++ b/ext/date/php_date.h
@@ -1,14 +1,12 @@
 /*
    +----------------------------------------------------------------------+
-   | Copyright (c) The PHP Group                                          |
+   | Copyright © The PHP Group and Contributors.                          |
    +----------------------------------------------------------------------+
-   | This source file is subject to version 3.01 of the PHP license,      |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | https://www.php.net/license/3_01.txt                                 |
-   | If you did not receive a copy of the PHP license and are unable to   |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@php.net so we can mail you a copy immediately.               |
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Authors: Derick Rethans                     |
    +----------------------------------------------------------------------+
@@ -60,9 +58,7 @@ struct _php_date_obj {
 	zend_object   std;
 };
 
-static inline php_date_obj *php_date_obj_from_obj(zend_object *obj) {
-	return (php_date_obj*)((char*)(obj) - XtOffsetOf(php_date_obj, std));
-}
+#define php_date_obj_from_obj(obj) ZEND_CONTAINER_OF(obj, php_date_obj, std)
 
 #define Z_PHPDATE_P(zv)  php_date_obj_from_obj(Z_OBJ_P((zv)))
 
@@ -77,9 +73,7 @@ struct _php_timezone_obj {
 	zend_object std;
 };
 
-static inline php_timezone_obj *php_timezone_obj_from_obj(zend_object *obj) {
-	return (php_timezone_obj*)((char*)(obj) - XtOffsetOf(php_timezone_obj, std));
-}
+#define php_timezone_obj_from_obj(obj) ZEND_CONTAINER_OF(obj, php_timezone_obj, std)
 
 #define Z_PHPTIMEZONE_P(zv)  php_timezone_obj_from_obj(Z_OBJ_P((zv)))
 
@@ -95,9 +89,7 @@ struct _php_interval_obj {
 	zend_object       std;
 };
 
-static inline php_interval_obj *php_interval_obj_from_obj(zend_object *obj) {
-	return (php_interval_obj*)((char*)(obj) - XtOffsetOf(php_interval_obj, std));
-}
+#define php_interval_obj_from_obj(obj) ZEND_CONTAINER_OF(obj, php_interval_obj, std)
 
 #define Z_PHPINTERVAL_P(zv)  php_interval_obj_from_obj(Z_OBJ_P((zv)))
 
@@ -114,9 +106,7 @@ struct _php_period_obj {
 	zend_object       std;
 };
 
-static inline php_period_obj *php_period_obj_from_obj(zend_object *obj) {
-	return (php_period_obj*)((char*)(obj) - XtOffsetOf(php_period_obj, std));
-}
+#define php_period_obj_from_obj(obj) ZEND_CONTAINER_OF(obj, php_period_obj, std)
 
 #define Z_PHPPERIOD_P(zv)  php_period_obj_from_obj(Z_OBJ_P((zv)))
 
diff --git a/ext/date/tests/date_period_bad_iso_format.phpt b/ext/date/tests/date_period_bad_iso_format.phpt
index cf2025bef0e3..1ab8197d76c9 100644
--- a/ext/date/tests/date_period_bad_iso_format.phpt
+++ b/ext/date/tests/date_period_bad_iso_format.phpt
@@ -50,5 +50,5 @@ DateMalformedPeriodStringException: DatePeriod::__construct(): ISO interval must
 DateMalformedPeriodStringException: DatePeriod::createFromISO8601String(): ISO interval must contain an interval, "R4/2012-07-01T00:00:00Z" given
 
 Deprecated: Calling DatePeriod::__construct(string $isostr, int $options = 0) is deprecated, use DatePeriod::createFromISO8601String() instead in %s on line %d
-DateMalformedPeriodStringException: DatePeriod::__construct(): Recurrence count must be greater or equal to 1 and lower than %d
-DateMalformedPeriodStringException: DatePeriod::createFromISO8601String(): Recurrence count must be greater or equal to 1 and lower than %d
+DateMalformedPeriodStringException: DatePeriod::__construct(): ISO interval must contain an end date or a recurrence count, "2012-07-01T00:00:00Z/P7D" given
+DateMalformedPeriodStringException: DatePeriod::createFromISO8601String(): ISO interval must contain an end date or a recurrence count, "2012-07-01T00:00:00Z/P7D" given
diff --git a/ext/date/tests/gh-124.phpt b/ext/date/tests/gh-124.phpt
index 074e519d4399..30cccd74ef1f 100644
--- a/ext/date/tests/gh-124.phpt
+++ b/ext/date/tests/gh-124.phpt
@@ -4,7 +4,7 @@ Test for timelib #124: Problem with large negative timestamps
 date.timezone=UTC
 --SKIPIF--
 
 --FILE--
diff --git a/ext/date/tests/gh18422.phpt b/ext/date/tests/gh18422.phpt
new file mode 100644
index 000000000000..643476615277
--- /dev/null
+++ b/ext/date/tests/gh18422.phpt
@@ -0,0 +1,21 @@
+--TEST--
+GH-18422 (int overflow in Date extension)
+--FILE--
+format("Y"), "\n";
+echo $dto->format("x"), "\n";
+echo $dto->format("X"), "\n";
+
+echo date_create("2024-06-15")->format("Y"), "\n";
+echo date_create("-0042-01-01")->format("Y"), "\n";
+?>
+--EXPECTF--
+-%d
+-%d
+-%d
+2024
+-0042
diff --git a/ext/dba/dba.c b/ext/dba/dba.c
index fb6017fbab88..c0688714fe7c 100644
--- a/ext/dba/dba.c
+++ b/ext/dba/dba.c
@@ -1,14 +1,12 @@
 /*
-+----------------------------------------------------------------------+
-   | Copyright (c) The PHP Group                                          |
    +----------------------------------------------------------------------+
-   | This source file is subject to version 3.01 of the PHP license,      |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | https://www.php.net/license/3_01.txt                                 |
-   | If you did not receive a copy of the PHP license and are unable to   |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@php.net so we can mail you a copy immediately.               |
+   | Copyright © The PHP Group and Contributors.                          |
+   +----------------------------------------------------------------------+
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Authors: Sascha Schumann                         |
    |          Marcus Boerger                               |
@@ -337,10 +335,7 @@ static zend_result dba_connection_cast_object(zend_object *obj, zval *result, in
 	return zend_std_cast_object_tostring(obj, result, type);
 }
 
-static inline dba_connection *dba_connection_from_obj(zend_object *obj)
-{
-	return (dba_connection *)((char *)(obj) - XtOffsetOf(dba_connection, std));
-}
+#define dba_connection_from_obj(obj) ZEND_CONTAINER_OF(obj, dba_connection, std)
 
 #define Z_DBA_CONNECTION_P(zv) dba_connection_from_obj(Z_OBJ_P(zv))
 #define Z_DBA_INFO_P(zv) Z_DBA_CONNECTION_P(zv)->info
@@ -411,7 +406,7 @@ PHP_MINIT_FUNCTION(dba)
 	dba_connection_ce->default_object_handlers = &dba_connection_object_handlers;
 
 	memcpy(&dba_connection_object_handlers, &std_object_handlers, sizeof(zend_object_handlers));
-	dba_connection_object_handlers.offset = XtOffsetOf(dba_connection, std);
+	dba_connection_object_handlers.offset = offsetof(dba_connection, std);
 	dba_connection_object_handlers.free_obj = dba_connection_free_obj;
 	dba_connection_object_handlers.get_constructor = dba_connection_get_constructor;
 	dba_connection_object_handlers.clone_obj = NULL;
diff --git a/ext/dba/dba_cdb.c b/ext/dba/dba_cdb.c
index 10a381b579da..79b60c765c37 100644
--- a/ext/dba/dba_cdb.c
+++ b/ext/dba/dba_cdb.c
@@ -1,14 +1,12 @@
 /*
    +----------------------------------------------------------------------+
-   | Copyright (c) The PHP Group                                          |
+   | Copyright © The PHP Group and Contributors.                          |
    +----------------------------------------------------------------------+
-   | This source file is subject to version 3.01 of the PHP license,      |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | https://www.php.net/license/3_01.txt                                 |
-   | If you did not receive a copy of the PHP license and are unable to   |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@php.net so we can mail you a copy immediately.               |
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Authors: Sascha Schumann                         |
    |          Marcus Boerger                               |
diff --git a/ext/dba/dba_db1.c b/ext/dba/dba_db1.c
index e4b83fcb55f3..dfcd637c8f87 100644
--- a/ext/dba/dba_db1.c
+++ b/ext/dba/dba_db1.c
@@ -1,14 +1,12 @@
 /*
    +----------------------------------------------------------------------+
-   | Copyright (c) The PHP Group                                          |
+   | Copyright © The PHP Group and Contributors.                          |
    +----------------------------------------------------------------------+
-   | This source file is subject to version 3.01 of the PHP license,      |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | https://www.php.net/license/3_01.txt                                 |
-   | If you did not receive a copy of the PHP license and are unable to   |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@php.net so we can mail you a copy immediately.               |
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Author: Shen Cheng-Da                             |
    +----------------------------------------------------------------------+
diff --git a/ext/dba/dba_db2.c b/ext/dba/dba_db2.c
index 5ec3df182e84..dd723ea40af8 100644
--- a/ext/dba/dba_db2.c
+++ b/ext/dba/dba_db2.c
@@ -1,14 +1,12 @@
 /*
    +----------------------------------------------------------------------+
-   | Copyright (c) The PHP Group                                          |
+   | Copyright © The PHP Group and Contributors.                          |
    +----------------------------------------------------------------------+
-   | This source file is subject to version 3.01 of the PHP license,      |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | https://www.php.net/license/3_01.txt                                 |
-   | If you did not receive a copy of the PHP license and are unable to   |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@php.net so we can mail you a copy immediately.               |
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Author: Sascha Schumann                          |
    +----------------------------------------------------------------------+
diff --git a/ext/dba/dba_db3.c b/ext/dba/dba_db3.c
index 8efc8d45b3ba..aacc65dda5a5 100644
--- a/ext/dba/dba_db3.c
+++ b/ext/dba/dba_db3.c
@@ -1,14 +1,12 @@
 /*
    +----------------------------------------------------------------------+
-   | Copyright (c) The PHP Group                                          |
+   | Copyright © The PHP Group and Contributors.                          |
    +----------------------------------------------------------------------+
-   | This source file is subject to version 3.01 of the PHP license,      |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | https://www.php.net/license/3_01.txt                                 |
-   | If you did not receive a copy of the PHP license and are unable to   |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@php.net so we can mail you a copy immediately.               |
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Author: Sascha Schumann                          |
    +----------------------------------------------------------------------+
diff --git a/ext/dba/dba_db4.c b/ext/dba/dba_db4.c
index f64db5540ee9..16ac9be37a13 100644
--- a/ext/dba/dba_db4.c
+++ b/ext/dba/dba_db4.c
@@ -1,14 +1,12 @@
 /*
    +----------------------------------------------------------------------+
-   | Copyright (c) The PHP Group                                          |
+   | Copyright © The PHP Group and Contributors.                          |
    +----------------------------------------------------------------------+
-   | This source file is subject to version 3.01 of the PHP license,      |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | https://www.php.net/license/3_01.txt                                 |
-   | If you did not receive a copy of the PHP license and are unable to   |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@php.net so we can mail you a copy immediately.               |
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Authors: Marcus Boerger                               |
    |          Sascha Schumann                         |
diff --git a/ext/dba/dba_dbm.c b/ext/dba/dba_dbm.c
index b6d98d22893e..9579444454ce 100644
--- a/ext/dba/dba_dbm.c
+++ b/ext/dba/dba_dbm.c
@@ -1,14 +1,12 @@
 /*
    +----------------------------------------------------------------------+
-   | Copyright (c) The PHP Group                                          |
+   | Copyright © The PHP Group and Contributors.                          |
    +----------------------------------------------------------------------+
-   | This source file is subject to version 3.01 of the PHP license,      |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | https://www.php.net/license/3_01.txt                                 |
-   | If you did not receive a copy of the PHP license and are unable to   |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@php.net so we can mail you a copy immediately.               |
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Author: Sascha Schumann                          |
    +----------------------------------------------------------------------+
diff --git a/ext/dba/dba_flatfile.c b/ext/dba/dba_flatfile.c
index 997e6b9cc112..4208277a920d 100644
--- a/ext/dba/dba_flatfile.c
+++ b/ext/dba/dba_flatfile.c
@@ -1,14 +1,12 @@
 /*
    +----------------------------------------------------------------------+
-   | Copyright (c) The PHP Group                                          |
+   | Copyright © The PHP Group and Contributors.                          |
    +----------------------------------------------------------------------+
-   | This source file is subject to version 3.01 of the PHP license,      |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | https://www.php.net/license/3_01.txt                                 |
-   | If you did not receive a copy of the PHP license and are unable to   |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@php.net so we can mail you a copy immediately.               |
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Author: Marcus Boerger                                |
    +----------------------------------------------------------------------+
diff --git a/ext/dba/dba_gdbm.c b/ext/dba/dba_gdbm.c
index 245c79e0e62d..961f539a451f 100644
--- a/ext/dba/dba_gdbm.c
+++ b/ext/dba/dba_gdbm.c
@@ -1,14 +1,12 @@
 /*
    +----------------------------------------------------------------------+
-   | Copyright (c) The PHP Group                                          |
+   | Copyright © The PHP Group and Contributors.                          |
    +----------------------------------------------------------------------+
-   | This source file is subject to version 3.01 of the PHP license,      |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | https://www.php.net/license/3_01.txt                                 |
-   | If you did not receive a copy of the PHP license and are unable to   |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@php.net so we can mail you a copy immediately.               |
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Author: Sascha Schumann                          |
    +----------------------------------------------------------------------+
diff --git a/ext/dba/dba_inifile.c b/ext/dba/dba_inifile.c
index 75a267055d96..1539bb0496dd 100644
--- a/ext/dba/dba_inifile.c
+++ b/ext/dba/dba_inifile.c
@@ -1,14 +1,12 @@
 /*
    +----------------------------------------------------------------------+
-   | Copyright (c) The PHP Group                                          |
+   | Copyright © The PHP Group and Contributors.                          |
    +----------------------------------------------------------------------+
-   | This source file is subject to version 3.01 of the PHP license,      |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | https://www.php.net/license/3_01.txt                                 |
-   | If you did not receive a copy of the PHP license and are unable to   |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@php.net so we can mail you a copy immediately.               |
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Author: Marcus Boerger                                |
    +----------------------------------------------------------------------+
diff --git a/ext/dba/dba_lmdb.c b/ext/dba/dba_lmdb.c
index f6bdc7838a6a..57e74f320239 100644
--- a/ext/dba/dba_lmdb.c
+++ b/ext/dba/dba_lmdb.c
@@ -1,14 +1,12 @@
 /*
   +----------------------------------------------------------------------+
-  | Copyright (c) The PHP Group                                          |
+  | Copyright © The PHP Group and Contributors.                          |
   +----------------------------------------------------------------------+
-  | This source file is subject to version 3.01 of the PHP license,      |
-  | that is bundled with this package in the file LICENSE, and is        |
-  | available through the world-wide-web at the following url:           |
-  | https://www.php.net/license/3_01.txt                                 |
-  | If you did not receive a copy of the PHP license and are unable to   |
-  | obtain it through the world-wide-web, please send a note to          |
-  | license@php.net so we can mail you a copy immediately.               |
+  | This source file is subject to the Modified BSD License that is      |
+  | bundled with this package in the file LICENSE, and is available      |
+  | through the World Wide Web at .        |
+  |                                                                      |
+  | SPDX-License-Identifier: BSD-3-Clause                                |
   +----------------------------------------------------------------------+
   | Author: Anatol Belski                                    |
   +----------------------------------------------------------------------+
diff --git a/ext/dba/dba_ndbm.c b/ext/dba/dba_ndbm.c
index 40ae304cb7d2..2b4002591e91 100644
--- a/ext/dba/dba_ndbm.c
+++ b/ext/dba/dba_ndbm.c
@@ -1,14 +1,12 @@
 /*
    +----------------------------------------------------------------------+
-   | Copyright (c) The PHP Group                                          |
+   | Copyright © The PHP Group and Contributors.                          |
    +----------------------------------------------------------------------+
-   | This source file is subject to version 3.01 of the PHP license,      |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | https://www.php.net/license/3_01.txt                                 |
-   | If you did not receive a copy of the PHP license and are unable to   |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@php.net so we can mail you a copy immediately.               |
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Author: Sascha Schumann                          |
    +----------------------------------------------------------------------+
diff --git a/ext/dba/dba_qdbm.c b/ext/dba/dba_qdbm.c
index 5cbfeee874d5..8e692b7e55bc 100644
--- a/ext/dba/dba_qdbm.c
+++ b/ext/dba/dba_qdbm.c
@@ -1,14 +1,12 @@
 /*
   +----------------------------------------------------------------------+
-  | Copyright (c) The PHP Group                                          |
+  | Copyright © The PHP Group and Contributors.                          |
   +----------------------------------------------------------------------+
-  | This source file is subject to version 3.01 of the PHP license,      |
-  | that is bundled with this package in the file LICENSE, and is        |
-  | available through the world-wide-web at the following url:           |
-  | https://www.php.net/license/3_01.txt                                 |
-  | If you did not receive a copy of the PHP license and are unable to   |
-  | obtain it through the world-wide-web, please send a note to          |
-  | license@php.net so we can mail you a copy immediately.               |
+  | This source file is subject to the Modified BSD License that is      |
+  | bundled with this package in the file LICENSE, and is available      |
+  | through the World Wide Web at .        |
+  |                                                                      |
+  | SPDX-License-Identifier: BSD-3-Clause                                |
   +----------------------------------------------------------------------+
   | Author: Marcin Gibula                                   |
   +----------------------------------------------------------------------+
diff --git a/ext/dba/dba_tcadb.c b/ext/dba/dba_tcadb.c
index 6f4cb01e69e5..0539a7036602 100644
--- a/ext/dba/dba_tcadb.c
+++ b/ext/dba/dba_tcadb.c
@@ -1,14 +1,12 @@
 /*
    +----------------------------------------------------------------------+
-   | Copyright (c) The PHP Group                                          |
+   | Copyright © The PHP Group and Contributors.                          |
    +----------------------------------------------------------------------+
-   | This source file is subject to version 3.01 of the PHP license,      |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | https://www.php.net/license/3_01.txt                                 |
-   | If you did not receive a copy of the PHP license and are unable to   |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@php.net so we can mail you a copy immediately.               |
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Author:  Michael Maclean                               |
    +----------------------------------------------------------------------+
diff --git a/ext/dba/libcdb/cdb.c b/ext/dba/libcdb/cdb.c
index e694d6a6eb12..e258e8fe2d5a 100644
--- a/ext/dba/libcdb/cdb.c
+++ b/ext/dba/libcdb/cdb.c
@@ -1,14 +1,12 @@
 /*
    +----------------------------------------------------------------------+
-   | Copyright (c) The PHP Group                                          |
+   | Copyright © The PHP Group and Contributors.                          |
    +----------------------------------------------------------------------+
-   | This source file is subject to version 3.01 of the PHP license,      |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | https://www.php.net/license/3_01.txt                                 |
-   | If you did not receive a copy of the PHP license and are unable to   |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@php.net so we can mail you a copy immediately.               |
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Author: Marcus Boerger                                |
    +----------------------------------------------------------------------+
diff --git a/ext/dba/libcdb/cdb.h b/ext/dba/libcdb/cdb.h
index 4a94b81f832d..cc645196a983 100644
--- a/ext/dba/libcdb/cdb.h
+++ b/ext/dba/libcdb/cdb.h
@@ -1,14 +1,12 @@
 /*
    +----------------------------------------------------------------------+
-   | Copyright (c) The PHP Group                                          |
+   | Copyright © The PHP Group and Contributors.                          |
    +----------------------------------------------------------------------+
-   | This source file is subject to version 3.01 of the PHP license,      |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | https://www.php.net/license/3_01.txt                                 |
-   | If you did not receive a copy of the PHP license and are unable to   |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@php.net so we can mail you a copy immediately.               |
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Author: Marcus Boerger                                |
    +----------------------------------------------------------------------+
diff --git a/ext/dba/libcdb/cdb_make.c b/ext/dba/libcdb/cdb_make.c
index 570e3625b0ce..b216b904e9bd 100644
--- a/ext/dba/libcdb/cdb_make.c
+++ b/ext/dba/libcdb/cdb_make.c
@@ -1,14 +1,12 @@
 /*
    +----------------------------------------------------------------------+
-   | Copyright (c) The PHP Group                                          |
+   | Copyright © The PHP Group and Contributors.                          |
    +----------------------------------------------------------------------+
-   | This source file is subject to version 3.01 of the PHP license,      |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | https://www.php.net/license/3_01.txt                                 |
-   | If you did not receive a copy of the PHP license and are unable to   |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@php.net so we can mail you a copy immediately.               |
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Author: Marcus Boerger                                |
    +----------------------------------------------------------------------+
diff --git a/ext/dba/libcdb/cdb_make.h b/ext/dba/libcdb/cdb_make.h
index 96dbd43d1e56..aa94c1747267 100644
--- a/ext/dba/libcdb/cdb_make.h
+++ b/ext/dba/libcdb/cdb_make.h
@@ -1,14 +1,12 @@
 /*
    +----------------------------------------------------------------------+
-   | Copyright (c) The PHP Group                                          |
+   | Copyright © The PHP Group and Contributors.                          |
    +----------------------------------------------------------------------+
-   | This source file is subject to version 3.01 of the PHP license,      |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | https://www.php.net/license/3_01.txt                                 |
-   | If you did not receive a copy of the PHP license and are unable to   |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@php.net so we can mail you a copy immediately.               |
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Author: Marcus Boerger                                |
    +----------------------------------------------------------------------+
diff --git a/ext/dba/libcdb/uint32.c b/ext/dba/libcdb/uint32.c
index 6f2507204aad..e5ba93fed2af 100644
--- a/ext/dba/libcdb/uint32.c
+++ b/ext/dba/libcdb/uint32.c
@@ -1,14 +1,12 @@
 /*
    +----------------------------------------------------------------------+
-   | Copyright (c) The PHP Group                                          |
+   | Copyright © The PHP Group and Contributors.                          |
    +----------------------------------------------------------------------+
-   | This source file is subject to version 3.01 of the PHP license,      |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | https://www.php.net/license/3_01.txt                                 |
-   | If you did not receive a copy of the PHP license and are unable to   |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@php.net so we can mail you a copy immediately.               |
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Author: Marcus Boerger                                |
    +----------------------------------------------------------------------+
diff --git a/ext/dba/libcdb/uint32.h b/ext/dba/libcdb/uint32.h
index 41041853fdbf..fe9ffba847a5 100644
--- a/ext/dba/libcdb/uint32.h
+++ b/ext/dba/libcdb/uint32.h
@@ -1,14 +1,12 @@
 /*
    +----------------------------------------------------------------------+
-   | Copyright (c) The PHP Group                                          |
+   | Copyright © The PHP Group and Contributors.                          |
    +----------------------------------------------------------------------+
-   | This source file is subject to version 3.01 of the PHP license,      |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | https://www.php.net/license/3_01.txt                                 |
-   | If you did not receive a copy of the PHP license and are unable to   |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@php.net so we can mail you a copy immediately.               |
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Author: Marcus Boerger                                |
    +----------------------------------------------------------------------+
diff --git a/ext/dba/libflatfile/flatfile.c b/ext/dba/libflatfile/flatfile.c
index bd76ecfdd0ae..561766777f6f 100644
--- a/ext/dba/libflatfile/flatfile.c
+++ b/ext/dba/libflatfile/flatfile.c
@@ -1,14 +1,12 @@
 /*
    +----------------------------------------------------------------------+
-   | Copyright (c) The PHP Group                                          |
+   | Copyright © The PHP Group and Contributors.                          |
    +----------------------------------------------------------------------+
-   | This source file is subject to version 3.01 of the PHP license,      |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | https://www.php.net/license/3_01.txt                                 |
-   | If you did not receive a copy of the PHP license and are unable to   |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@php.net so we can mail you a copy immediately.               |
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Authors: Marcus Boerger                               |
    | based on ext/db/db.c by:                                             |
diff --git a/ext/dba/libflatfile/flatfile.h b/ext/dba/libflatfile/flatfile.h
index 801ec8054f4f..ee3e5380b72b 100644
--- a/ext/dba/libflatfile/flatfile.h
+++ b/ext/dba/libflatfile/flatfile.h
@@ -1,14 +1,12 @@
 /*
    +----------------------------------------------------------------------+
-   | Copyright (c) The PHP Group                                          |
+   | Copyright © The PHP Group and Contributors.                          |
    +----------------------------------------------------------------------+
-   | This source file is subject to version 3.01 of the PHP license,      |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | https://www.php.net/license/3_01.txt                                 |
-   | If you did not receive a copy of the PHP license and are unable to   |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@php.net so we can mail you a copy immediately.               |
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Author: Marcus Boerger                                |
    +----------------------------------------------------------------------+
diff --git a/ext/dba/libinifile/inifile.c b/ext/dba/libinifile/inifile.c
index c5467396d4bf..fa2b05a715e2 100644
--- a/ext/dba/libinifile/inifile.c
+++ b/ext/dba/libinifile/inifile.c
@@ -1,14 +1,12 @@
 /*
    +----------------------------------------------------------------------+
-   | Copyright (c) The PHP Group                                          |
+   | Copyright © The PHP Group and Contributors.                          |
    +----------------------------------------------------------------------+
-   | This source file is subject to version 3.01 of the PHP license,      |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | https://www.php.net/license/3_01.txt                                 |
-   | If you did not receive a copy of the PHP license and are unable to   |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@php.net so we can mail you a copy immediately.               |
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Author: Marcus Boerger                                |
    +----------------------------------------------------------------------+
@@ -111,7 +109,7 @@ void inifile_free(inifile *dba, int persistent)
 key_type inifile_key_split(const char *group_name)
 {
 	key_type key;
-	char *name;
+	const char *name;
 
 	if (group_name[0] == '[' && (name = strchr(group_name, ']')) != NULL) {
 		key.group = estrndup(group_name+1, name - (group_name + 1));
@@ -249,7 +247,7 @@ val_type inifile_fetch(inifile *dba, const key_type *key, int skip) {
 		ln.key.group = estrdup(dba->next.key.group);
 	} else {
 		/* specific instance or not same key -> restart search */
-		/* the slow way: restart and seacrch */
+		/* the slow way: restart and search */
 		php_stream_rewind(dba->fp);
 		inifile_line_free(&dba->next);
 	}
@@ -471,7 +469,7 @@ static int inifile_delete_replace_append(inifile *dba, const key_type *key, cons
 	 * 8) Append temporary stream
 	 */
 
-	assert(!append || (key->name && value)); /* missuse */
+	assert(!append || (key->name && value)); /* misuse */
 
 	/* 1 - 3 */
 	inifile_find_group(dba, key, &pos_grp_start);
diff --git a/ext/dba/libinifile/inifile.h b/ext/dba/libinifile/inifile.h
index e931c70bcbf6..75cf22d53fdd 100644
--- a/ext/dba/libinifile/inifile.h
+++ b/ext/dba/libinifile/inifile.h
@@ -1,14 +1,12 @@
 /*
    +----------------------------------------------------------------------+
-   | Copyright (c) The PHP Group                                          |
+   | Copyright © The PHP Group and Contributors.                          |
    +----------------------------------------------------------------------+
-   | This source file is subject to version 3.01 of the PHP license,      |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | https://www.php.net/license/3_01.txt                                 |
-   | If you did not receive a copy of the PHP license and are unable to   |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@php.net so we can mail you a copy immediately.               |
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Author: Marcus Boerger                                |
    +----------------------------------------------------------------------+
diff --git a/ext/dba/php_dba.h b/ext/dba/php_dba.h
index 033aed59c9ea..86c8a4f0ed65 100644
--- a/ext/dba/php_dba.h
+++ b/ext/dba/php_dba.h
@@ -1,14 +1,12 @@
 /*
    +----------------------------------------------------------------------+
-   | Copyright (c) The PHP Group                                          |
+   | Copyright © The PHP Group and Contributors.                          |
    +----------------------------------------------------------------------+
-   | This source file is subject to version 3.01 of the PHP license,      |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | https://www.php.net/license/3_01.txt                                 |
-   | If you did not receive a copy of the PHP license and are unable to   |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@php.net so we can mail you a copy immediately.               |
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Author: Sascha Schumann                          |
    +----------------------------------------------------------------------+
diff --git a/ext/dba/php_tcadb.h b/ext/dba/php_tcadb.h
index 6bfecf7d6d96..038440c7607e 100644
--- a/ext/dba/php_tcadb.h
+++ b/ext/dba/php_tcadb.h
@@ -1,14 +1,12 @@
 /*
    +----------------------------------------------------------------------+
-   | Copyright (c) The PHP Group                                          |
+   | Copyright © The PHP Group and Contributors.                          |
    +----------------------------------------------------------------------+
-   | This source file is subject to version 3.01 of the PHP license,      |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | https://www.php.net/license/3_01.txt                                 |
-   | If you did not receive a copy of the PHP license and are unable to   |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@php.net so we can mail you a copy immediately.               |
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Author: Michael Maclean                                |
    +----------------------------------------------------------------------+
diff --git a/ext/dl_test/dl_test.c b/ext/dl_test/dl_test.c
index 10afdb0720f2..4346e868c1e5 100644
--- a/ext/dl_test/dl_test.c
+++ b/ext/dl_test/dl_test.c
@@ -1,14 +1,12 @@
 /*
   +----------------------------------------------------------------------+
-  | Copyright (c) The PHP Group                                          |
+  | Copyright © The PHP Group and Contributors.                          |
   +----------------------------------------------------------------------+
-  | This source file is subject to version 3.01 of the PHP license,      |
-  | that is bundled with this package in the file LICENSE, and is        |
-  | available through the world-wide-web at the following url:           |
-  | https://www.php.net/license/3_01.txt                                 |
-  | If you did not receive a copy of the PHP license and are unable to   |
-  | obtain it through the world-wide-web, please send a note to          |
-  | license@php.net so we can mail you a copy immediately.               |
+  | This source file is subject to the Modified BSD License that is      |
+  | bundled with this package in the file LICENSE, and is available      |
+  | through the World Wide Web at .        |
+  |                                                                      |
+  | SPDX-License-Identifier: BSD-3-Clause                                |
   +----------------------------------------------------------------------+
   | Author: Arnaud Le Blanc                         |
   +----------------------------------------------------------------------+
diff --git a/ext/dl_test/php_dl_test.h b/ext/dl_test/php_dl_test.h
index c12a43fe165b..133d513cbf99 100644
--- a/ext/dl_test/php_dl_test.h
+++ b/ext/dl_test/php_dl_test.h
@@ -1,14 +1,12 @@
 /*
   +----------------------------------------------------------------------+
-  | Copyright (c) The PHP Group                                          |
+  | Copyright © The PHP Group and Contributors.                          |
   +----------------------------------------------------------------------+
-  | This source file is subject to version 3.01 of the PHP license,      |
-  | that is bundled with this package in the file LICENSE, and is        |
-  | available through the world-wide-web at the following url:           |
-  | https://www.php.net/license/3_01.txt                                 |
-  | If you did not receive a copy of the PHP license and are unable to   |
-  | obtain it through the world-wide-web, please send a note to          |
-  | license@php.net so we can mail you a copy immediately.               |
+  | This source file is subject to the Modified BSD License that is      |
+  | bundled with this package in the file LICENSE, and is available      |
+  | through the World Wide Web at .        |
+  |                                                                      |
+  | SPDX-License-Identifier: BSD-3-Clause                                |
   +----------------------------------------------------------------------+
   | Author:                                                              |
   +----------------------------------------------------------------------+
diff --git a/ext/dom/CREDITS b/ext/dom/CREDITS
index 106446a4730b..0c567fca9828 100644
--- a/ext/dom/CREDITS
+++ b/ext/dom/CREDITS
@@ -1,2 +1,2 @@
 DOM
-Christian Stocker, Rob Richards, Marcus Boerger, Niels Dossche
+Christian Stocker, Rob Richards, Marcus Boerger, Nora Dossche
diff --git a/ext/dom/attr.c b/ext/dom/attr.c
index 3107f5a21a2b..aa613a9f6d37 100644
--- a/ext/dom/attr.c
+++ b/ext/dom/attr.c
@@ -1,14 +1,12 @@
 /*
    +----------------------------------------------------------------------+
-   | Copyright (c) The PHP Group                                          |
+   | Copyright © The PHP Group and Contributors.                          |
    +----------------------------------------------------------------------+
-   | This source file is subject to version 3.01 of the PHP license,      |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | https://www.php.net/license/3_01.txt                                 |
-   | If you did not receive a copy of the PHP license and are unable to   |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@php.net so we can mail you a copy immediately.               |
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Authors: Christian Stocker                           |
    |          Rob Richards                             |
diff --git a/ext/dom/cdatasection.c b/ext/dom/cdatasection.c
index 6d063e19d43e..b735a93f3bee 100644
--- a/ext/dom/cdatasection.c
+++ b/ext/dom/cdatasection.c
@@ -1,14 +1,12 @@
 /*
    +----------------------------------------------------------------------+
-   | Copyright (c) The PHP Group                                          |
+   | Copyright © The PHP Group and Contributors.                          |
    +----------------------------------------------------------------------+
-   | This source file is subject to version 3.01 of the PHP license,      |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | https://www.php.net/license/3_01.txt                                 |
-   | If you did not receive a copy of the PHP license and are unable to   |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@php.net so we can mail you a copy immediately.               |
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Authors: Christian Stocker                           |
    |          Rob Richards                             |
diff --git a/ext/dom/characterdata.c b/ext/dom/characterdata.c
index e6b050a35867..80dce80cf2f0 100644
--- a/ext/dom/characterdata.c
+++ b/ext/dom/characterdata.c
@@ -1,14 +1,12 @@
 /*
    +----------------------------------------------------------------------+
-   | Copyright (c) The PHP Group                                          |
+   | Copyright © The PHP Group and Contributors.                          |
    +----------------------------------------------------------------------+
-   | This source file is subject to version 3.01 of the PHP license,      |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | https://www.php.net/license/3_01.txt                                 |
-   | If you did not receive a copy of the PHP license and are unable to   |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@php.net so we can mail you a copy immediately.               |
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Authors: Christian Stocker                           |
    |          Rob Richards                             |
diff --git a/ext/dom/comment.c b/ext/dom/comment.c
index 211d27d2c319..b8ee8780d926 100644
--- a/ext/dom/comment.c
+++ b/ext/dom/comment.c
@@ -1,14 +1,12 @@
 /*
    +----------------------------------------------------------------------+
-   | Copyright (c) The PHP Group                                          |
+   | Copyright © The PHP Group and Contributors.                          |
    +----------------------------------------------------------------------+
-   | This source file is subject to version 3.01 of the PHP license,      |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | https://www.php.net/license/3_01.txt                                 |
-   | If you did not receive a copy of the PHP license and are unable to   |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@php.net so we can mail you a copy immediately.               |
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Authors: Christian Stocker                           |
    |          Rob Richards                             |
diff --git a/ext/dom/config.w32 b/ext/dom/config.w32
index e045e29c6bab..e1cbccecf608 100644
--- a/ext/dom/config.w32
+++ b/ext/dom/config.w32
@@ -36,8 +36,7 @@ if (PHP_DOM == "yes") {
 			"dom_ce.h " +
 			"namespace_compat.h " +
 			"xml_common.h " +
-			"xpath_callbacks.h " +
-			"lexbor/selectors-adapted/selectors.h "
+			"xpath_callbacks.h "
 		);
 	} else {
 		WARNING("dom support can't be enabled, libxml is not enabled")
diff --git a/ext/dom/document.c b/ext/dom/document.c
index 9d7213a64df2..9c6f12143ad1 100644
--- a/ext/dom/document.c
+++ b/ext/dom/document.c
@@ -1,14 +1,12 @@
 /*
    +----------------------------------------------------------------------+
-   | Copyright (c) The PHP Group                                          |
+   | Copyright © The PHP Group and Contributors.                          |
    +----------------------------------------------------------------------+
-   | This source file is subject to version 3.01 of the PHP license,      |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | https://www.php.net/license/3_01.txt                                 |
-   | If you did not receive a copy of the PHP license and are unable to   |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@php.net so we can mail you a copy immediately.               |
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Authors: Christian Stocker                           |
    |          Rob Richards                             |
@@ -1751,6 +1749,35 @@ static int dom_perform_xinclude(xmlDocPtr docp, dom_object *intern, zend_long fl
 	return err;
 }
 
+/* For modern DOM, namespace declarations are stored as attributes (node->nsDef
+ * is NULL), so libxml's native validators can't resolve prefixed QNames found in
+ * content (e.g. an xs:QName attribute value). Temporarily relink them, mirroring
+ * what C14N does in dom_canonicalization(). */
+typedef struct {
+	HashTable links;
+	bool active;
+} dom_validate_ns_guard;
+
+static void dom_validate_ns_guard_begin(dom_validate_ns_guard *guard, xmlDocPtr docp)
+{
+	guard->active = php_dom_follow_spec_node((const xmlNode *) docp);
+	if (guard->active) {
+		zend_hash_init(&guard->links, 0, NULL, NULL, false);
+		xmlNodePtr root_element = xmlDocGetRootElement(docp);
+		if (root_element) {
+			dom_relink_ns_decls(&guard->links, root_element);
+		}
+	}
+}
+
+static void dom_validate_ns_guard_end(dom_validate_ns_guard *guard)
+{
+	if (guard->active) {
+		dom_unlink_ns_decls(&guard->links);
+		zend_hash_destroy(&guard->links);
+	}
+}
+
 /* {{{ Substitutues xincludes in a DomDocument */
 PHP_METHOD(DOMDocument, xinclude)
 {
@@ -1824,8 +1851,11 @@ PHP_METHOD(DOMDocument, validate)
 	cvp->userData = NULL;
 	cvp->error    = (xmlValidityErrorFunc) php_libxml_error_handler;
 	cvp->warning  = (xmlValidityErrorFunc) php_libxml_error_handler;
-
-	if (xmlValidateDocument(cvp, docp)) {
+	dom_validate_ns_guard guard;
+	dom_validate_ns_guard_begin(&guard, docp);
+	int dtd_valid = xmlValidateDocument(cvp, docp);
+	dom_validate_ns_guard_end(&guard);
+	if (dtd_valid) {
 		RETVAL_TRUE;
 	} else {
 		RETVAL_FALSE;
@@ -1922,7 +1952,10 @@ static void dom_document_schema_validate(INTERNAL_FUNCTION_PARAMETERS, int type)
 	PHP_LIBXML_SANITIZE_GLOBALS(validate);
 	xmlSchemaSetValidOptions(vptr, valid_opts);
 	xmlSchemaSetValidErrors(vptr, php_libxml_error_handler, php_libxml_error_handler, vptr);
+	dom_validate_ns_guard guard;
+	dom_validate_ns_guard_begin(&guard, docp);
 	is_valid = xmlSchemaValidateDoc(vptr, docp);
+	dom_validate_ns_guard_end(&guard);
 	xmlSchemaFree(sptr);
 	xmlSchemaFreeValidCtxt(vptr);
 	PHP_LIBXML_RESTORE_GLOBALS(validate);
@@ -2020,7 +2053,10 @@ static void dom_document_relaxNG_validate(INTERNAL_FUNCTION_PARAMETERS, int type
 	}
 
 	xmlRelaxNGSetValidErrors(vptr, php_libxml_error_handler, php_libxml_error_handler, vptr);
+	dom_validate_ns_guard guard;
+	dom_validate_ns_guard_begin(&guard, docp);
 	is_valid = xmlRelaxNGValidateDoc(vptr, docp);
+	dom_validate_ns_guard_end(&guard);
 	xmlRelaxNGFree(sptr);
 	xmlRelaxNGFreeValidCtxt(vptr);
 
diff --git a/ext/dom/documentfragment.c b/ext/dom/documentfragment.c
index 65538b711f2d..01af436c69ed 100644
--- a/ext/dom/documentfragment.c
+++ b/ext/dom/documentfragment.c
@@ -1,14 +1,12 @@
 /*
    +----------------------------------------------------------------------+
-   | Copyright (c) The PHP Group                                          |
+   | Copyright © The PHP Group and Contributors.                          |
    +----------------------------------------------------------------------+
-   | This source file is subject to version 3.01 of the PHP license,      |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | https://www.php.net/license/3_01.txt                                 |
-   | If you did not receive a copy of the PHP license and are unable to   |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@php.net so we can mail you a copy immediately.               |
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Authors: Christian Stocker                           |
    |          Rob Richards                             |
diff --git a/ext/dom/documenttype.c b/ext/dom/documenttype.c
index 958559801a53..03f471493777 100644
--- a/ext/dom/documenttype.c
+++ b/ext/dom/documenttype.c
@@ -1,14 +1,12 @@
 /*
    +----------------------------------------------------------------------+
-   | Copyright (c) The PHP Group                                          |
+   | Copyright © The PHP Group and Contributors.                          |
    +----------------------------------------------------------------------+
-   | This source file is subject to version 3.01 of the PHP license,      |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | https://www.php.net/license/3_01.txt                                 |
-   | If you did not receive a copy of the PHP license and are unable to   |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@php.net so we can mail you a copy immediately.               |
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Authors: Christian Stocker                           |
    |          Rob Richards                             |
diff --git a/ext/dom/dom_ce.h b/ext/dom/dom_ce.h
index 5106738a0afd..8959d6013c7b 100644
--- a/ext/dom/dom_ce.h
+++ b/ext/dom/dom_ce.h
@@ -1,14 +1,12 @@
 /*
    +----------------------------------------------------------------------+
-   | Copyright (c) The PHP Group                                          |
+   | Copyright © The PHP Group and Contributors.                          |
    +----------------------------------------------------------------------+
-   | This source file is subject to version 3.01 of the PHP license,      |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | https://www.php.net/license/3_01.txt                                 |
-   | If you did not receive a copy of the PHP license and are unable to   |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@php.net so we can mail you a copy immediately.               |
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Authors: Christian Stocker                           |
    |          Rob Richards                             |
diff --git a/ext/dom/dom_iterators.c b/ext/dom/dom_iterators.c
index 9134b107925a..f97a9ec825d5 100644
--- a/ext/dom/dom_iterators.c
+++ b/ext/dom/dom_iterators.c
@@ -1,14 +1,12 @@
 /*
    +----------------------------------------------------------------------+
-   | Copyright (c) The PHP Group                                          |
+   | Copyright © The PHP Group and Contributors.                          |
    +----------------------------------------------------------------------+
-   | This source file is subject to version 3.01 of the PHP license,      |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | https://www.php.net/license/3_01.txt                                 |
-   | If you did not receive a copy of the PHP license and are unable to   |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@php.net so we can mail you a copy immediately.               |
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Authors: Christian Stocker                           |
    |          Rob Richards                             |
@@ -56,7 +54,7 @@ static dom_nnodemap_object *php_dom_iterator_get_nnmap(const php_dom_iterator *i
 	return nnmap->ptr;
 }
 
-xmlNodePtr create_notation(const xmlChar *name, const xmlChar *ExternalID, const xmlChar *SystemID) /* {{{ */
+xmlNodePtr create_notation(xmlDtdPtr parent_dtd, const xmlChar *name, const xmlChar *ExternalID, const xmlChar *SystemID) /* {{{ */
 {
 	xmlEntityPtr ret = xmlMalloc(sizeof(xmlEntity));
 	memset(ret, 0, sizeof(xmlEntity));
@@ -64,10 +62,23 @@ xmlNodePtr create_notation(const xmlChar *name, const xmlChar *ExternalID, const
 	ret->name = xmlStrdup(name);
 	ret->ExternalID = xmlStrdup(ExternalID);
 	ret->SystemID = xmlStrdup(SystemID);
+	if (parent_dtd != NULL) {
+		ret->parent = parent_dtd;
+		ret->doc = parent_dtd->doc;
+	}
 	return (xmlNodePtr) ret;
 }
 /* }}} */
 
+void dom_free_notation(xmlEntityPtr entity) /* {{{ */
+{
+	xmlFree((xmlChar *) entity->name);
+	xmlFree((xmlChar *) entity->ExternalID);
+	xmlFree((xmlChar *) entity->SystemID);
+	xmlFree(entity);
+}
+/* }}} */
+
 xmlNodePtr php_dom_libxml_hash_iter(xmlHashTable *ht, int index)
 {
 	int htsize;
diff --git a/ext/dom/dom_properties.h b/ext/dom/dom_properties.h
index 53113b04005a..918bf0c62f78 100644
--- a/ext/dom/dom_properties.h
+++ b/ext/dom/dom_properties.h
@@ -1,14 +1,12 @@
 /*
    +----------------------------------------------------------------------+
-   | Copyright (c) The PHP Group                                          |
+   | Copyright © The PHP Group and Contributors.                          |
    +----------------------------------------------------------------------+
-   | This source file is subject to version 3.01 of the PHP license,      |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | https://www.php.net/license/3_01.txt                                 |
-   | If you did not receive a copy of the PHP license and are unable to   |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@php.net so we can mail you a copy immediately.               |
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Authors: Christian Stocker                           |
    |          Rob Richards                             |
diff --git a/ext/dom/domexception.c b/ext/dom/domexception.c
index 86eecd579b2b..a7bea009dabc 100644
--- a/ext/dom/domexception.c
+++ b/ext/dom/domexception.c
@@ -1,14 +1,12 @@
 /*
    +----------------------------------------------------------------------+
-   | Copyright (c) The PHP Group                                          |
+   | Copyright © The PHP Group and Contributors.                          |
    +----------------------------------------------------------------------+
-   | This source file is subject to version 3.01 of the PHP license,      |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | https://www.php.net/license/3_01.txt                                 |
-   | If you did not receive a copy of the PHP license and are unable to   |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@php.net so we can mail you a copy immediately.               |
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Authors: Christian Stocker                           |
    |          Rob Richards                             |
diff --git a/ext/dom/domexception.h b/ext/dom/domexception.h
index 574e164424d6..3e3c7abed894 100644
--- a/ext/dom/domexception.h
+++ b/ext/dom/domexception.h
@@ -1,14 +1,12 @@
 /*
    +----------------------------------------------------------------------+
-   | Copyright (c) The PHP Group                                          |
+   | Copyright © The PHP Group and Contributors.                          |
    +----------------------------------------------------------------------+
-   | This source file is subject to version 3.01 of the PHP license,      |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | https://www.php.net/license/3_01.txt                                 |
-   | If you did not receive a copy of the PHP license and are unable to   |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@php.net so we can mail you a copy immediately.               |
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Authors: Christian Stocker                           |
    |          Rob Richards                             |
diff --git a/ext/dom/domimplementation.c b/ext/dom/domimplementation.c
index 0737be5fa5c9..e7fc2a414834 100644
--- a/ext/dom/domimplementation.c
+++ b/ext/dom/domimplementation.c
@@ -1,14 +1,12 @@
 /*
    +----------------------------------------------------------------------+
-   | Copyright (c) The PHP Group                                          |
+   | Copyright © The PHP Group and Contributors.                          |
    +----------------------------------------------------------------------+
-   | This source file is subject to version 3.01 of the PHP license,      |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | https://www.php.net/license/3_01.txt                                 |
-   | If you did not receive a copy of the PHP license and are unable to   |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@php.net so we can mail you a copy immediately.               |
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Authors: Christian Stocker                           |
    |          Rob Richards                             |
diff --git a/ext/dom/element.c b/ext/dom/element.c
index 4d0099b2c641..8e6102e9658e 100644
--- a/ext/dom/element.c
+++ b/ext/dom/element.c
@@ -1,14 +1,12 @@
 /*
    +----------------------------------------------------------------------+
-   | Copyright (c) The PHP Group                                          |
+   | Copyright © The PHP Group and Contributors.                          |
    +----------------------------------------------------------------------+
-   | This source file is subject to version 3.01 of the PHP license,      |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | https://www.php.net/license/3_01.txt                                 |
-   | If you did not receive a copy of the PHP license and are unable to   |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@php.net so we can mail you a copy immediately.               |
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Authors: Christian Stocker                           |
    |          Rob Richards                             |
@@ -466,7 +464,7 @@ PHP_METHOD(DOMElement, setAttribute)
 					break;
 				case XML_NAMESPACE_DECL:
 					RETURN_FALSE;
-				EMPTY_SWITCH_DEFAULT_CASE();
+				default: ZEND_UNREACHABLE();
 			}
 		}
 
@@ -593,7 +591,7 @@ static bool dom_remove_attribute(xmlNodePtr thisp, xmlNodePtr attrp)
 
 			break;
 		}
-		EMPTY_SWITCH_DEFAULT_CASE();
+		default: ZEND_UNREACHABLE();
 	}
 	return true;
 }
@@ -1819,7 +1817,7 @@ PHP_METHOD(Dom_Element, insertAdjacentHTML)
 			/* Set context to this. */
 			context = thisp;
 			break;
-		EMPTY_SWITCH_DEFAULT_CASE();
+		default: ZEND_UNREACHABLE();
 	}
 
 	/* 4. If context is not an Element or all of the following are true: (...) */
@@ -1858,7 +1856,7 @@ PHP_METHOD(Dom_Element, insertAdjacentHTML)
 		case ZEND_ENUM_Dom_AdjacentPosition_BeforeEnd:
 			php_dom_node_append(this_intern->document, fragment, thisp);
 			break;
-		EMPTY_SWITCH_DEFAULT_CASE();
+		default: ZEND_UNREACHABLE();
 	}
 
 err:
diff --git a/ext/dom/entity.c b/ext/dom/entity.c
index 3cfcbb5ae808..acccda98de0c 100644
--- a/ext/dom/entity.c
+++ b/ext/dom/entity.c
@@ -1,14 +1,12 @@
 /*
    +----------------------------------------------------------------------+
-   | Copyright (c) The PHP Group                                          |
+   | Copyright © The PHP Group and Contributors.                          |
    +----------------------------------------------------------------------+
-   | This source file is subject to version 3.01 of the PHP license,      |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | https://www.php.net/license/3_01.txt                                 |
-   | If you did not receive a copy of the PHP license and are unable to   |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@php.net so we can mail you a copy immediately.               |
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Authors: Christian Stocker                           |
    |          Rob Richards                             |
diff --git a/ext/dom/entityreference.c b/ext/dom/entityreference.c
index 215df208f530..a669fd2aa791 100644
--- a/ext/dom/entityreference.c
+++ b/ext/dom/entityreference.c
@@ -1,14 +1,12 @@
 /*
    +----------------------------------------------------------------------+
-   | Copyright (c) The PHP Group                                          |
+   | Copyright © The PHP Group and Contributors.                          |
    +----------------------------------------------------------------------+
-   | This source file is subject to version 3.01 of the PHP license,      |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | https://www.php.net/license/3_01.txt                                 |
-   | If you did not receive a copy of the PHP license and are unable to   |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@php.net so we can mail you a copy immediately.               |
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Authors: Christian Stocker                           |
    |          Rob Richards                             |
diff --git a/ext/dom/html5_parser.c b/ext/dom/html5_parser.c
index d5fe3d5c2773..583de89ecc4f 100644
--- a/ext/dom/html5_parser.c
+++ b/ext/dom/html5_parser.c
@@ -1,14 +1,12 @@
 /*
    +----------------------------------------------------------------------+
-   | Copyright (c) The PHP Group                                          |
+   | Copyright © The PHP Group and Contributors.                          |
    +----------------------------------------------------------------------+
-   | This source file is subject to version 3.01 of the PHP license,      |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | https://www.php.net/license/3_01.txt                                 |
-   | If you did not receive a copy of the PHP license and are unable to   |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@php.net so we can mail you a copy immediately.               |
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Authors: Niels Dossche                             |
    +----------------------------------------------------------------------+
@@ -117,6 +115,7 @@ static lexbor_libxml2_bridge_status lexbor_libxml2_bridge_convert(
 	php_dom_libxml_ns_mapper *ns_mapper = php_dom_ns_mapper_from_private(private_data);
     xmlNsPtr html_ns = php_dom_libxml_ns_mapper_ensure_html_ns(ns_mapper);
     xmlNsPtr xlink_ns = NULL;
+    xmlNsPtr xml_ns = NULL;
     xmlNsPtr prefixed_xmlns_ns = NULL;
 
     lexbor_array_obj_t work_list;
@@ -256,6 +255,12 @@ static lexbor_libxml2_bridge_status lexbor_libxml2_bridge_convert(
                         xlink_ns->_private = (void *) php_dom_ns_is_xlink_magic_token;
                     }
                     lxml_attr->ns = xlink_ns;
+                } else if (attr->node.ns == LXB_NS_XML) {
+                    if (xml_ns == NULL) {
+                        xml_ns = php_dom_libxml_ns_mapper_get_ns_raw_strings_nullsafe(ns_mapper, "xml", DOM_XML_NS_URI);
+                        xml_ns->_private = (void *) php_dom_ns_is_xml_magic_token;
+                    }
+                    lxml_attr->ns = xml_ns;
                 }
 
                 if (last_added_attr == NULL) {
@@ -455,7 +460,7 @@ static php_libxml_quirks_mode dom_translate_quirks_mode(lxb_dom_document_cmode_t
 		case LXB_DOM_DOCUMENT_CMODE_NO_QUIRKS: return PHP_LIBXML_NO_QUIRKS;
 		case LXB_DOM_DOCUMENT_CMODE_LIMITED_QUIRKS: return PHP_LIBXML_LIMITED_QUIRKS;
 		case LXB_DOM_DOCUMENT_CMODE_QUIRKS: return PHP_LIBXML_QUIRKS;
-		EMPTY_SWITCH_DEFAULT_CASE();
+		default: ZEND_UNREACHABLE();
 	}
 }
 
diff --git a/ext/dom/html5_parser.h b/ext/dom/html5_parser.h
index a56166639a60..43f7cf4f84cc 100644
--- a/ext/dom/html5_parser.h
+++ b/ext/dom/html5_parser.h
@@ -1,14 +1,12 @@
 /*
    +----------------------------------------------------------------------+
-   | Copyright (c) The PHP Group                                          |
+   | Copyright © The PHP Group and Contributors.                          |
    +----------------------------------------------------------------------+
-   | This source file is subject to version 3.01 of the PHP license,      |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | https://www.php.net/license/3_01.txt                                 |
-   | If you did not receive a copy of the PHP license and are unable to   |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@php.net so we can mail you a copy immediately.               |
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Authors: Niels Dossche                             |
    +----------------------------------------------------------------------+
diff --git a/ext/dom/html5_serializer.c b/ext/dom/html5_serializer.c
index 26eef9d5f968..ad3e24e00821 100644
--- a/ext/dom/html5_serializer.c
+++ b/ext/dom/html5_serializer.c
@@ -1,14 +1,12 @@
 /*
    +----------------------------------------------------------------------+
-   | Copyright (c) The PHP Group                                          |
+   | Copyright © The PHP Group and Contributors.                          |
    +----------------------------------------------------------------------+
-   | This source file is subject to version 3.01 of the PHP license,      |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | https://www.php.net/license/3_01.txt                                 |
-   | If you did not receive a copy of the PHP license and are unable to   |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@php.net so we can mail you a copy immediately.               |
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Authors: Niels Dossche                             |
    +----------------------------------------------------------------------+
diff --git a/ext/dom/html5_serializer.h b/ext/dom/html5_serializer.h
index 27fd1c92f24f..e4ae67861eee 100644
--- a/ext/dom/html5_serializer.h
+++ b/ext/dom/html5_serializer.h
@@ -1,14 +1,12 @@
 /*
    +----------------------------------------------------------------------+
-   | Copyright (c) The PHP Group                                          |
+   | Copyright © The PHP Group and Contributors.                          |
    +----------------------------------------------------------------------+
-   | This source file is subject to version 3.01 of the PHP license,      |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | https://www.php.net/license/3_01.txt                                 |
-   | If you did not receive a copy of the PHP license and are unable to   |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@php.net so we can mail you a copy immediately.               |
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Authors: Niels Dossche                             |
    +----------------------------------------------------------------------+
diff --git a/ext/dom/html_collection.c b/ext/dom/html_collection.c
index a4e2d6ad6fbe..0a24d4909cf4 100644
--- a/ext/dom/html_collection.c
+++ b/ext/dom/html_collection.c
@@ -1,14 +1,12 @@
 /*
    +----------------------------------------------------------------------+
-   | Copyright (c) The PHP Group                                          |
+   | Copyright © The PHP Group and Contributors.                          |
    +----------------------------------------------------------------------+
-   | This source file is subject to version 3.01 of the PHP license,      |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | https://www.php.net/license/3_01.txt                                 |
-   | If you did not receive a copy of the PHP license and are unable to   |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@php.net so we can mail you a copy immediately.               |
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Authors: Niels Dossche                             |
    +----------------------------------------------------------------------+
diff --git a/ext/dom/html_collection.h b/ext/dom/html_collection.h
index 59ab50abc1b0..f7e8effc16e1 100644
--- a/ext/dom/html_collection.h
+++ b/ext/dom/html_collection.h
@@ -1,14 +1,12 @@
 /*
    +----------------------------------------------------------------------+
-   | Copyright (c) The PHP Group                                          |
+   | Copyright © The PHP Group and Contributors.                          |
    +----------------------------------------------------------------------+
-   | This source file is subject to version 3.01 of the PHP license,      |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | https://www.php.net/license/3_01.txt                                 |
-   | If you did not receive a copy of the PHP license and are unable to   |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@php.net so we can mail you a copy immediately.               |
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Authors: Niels Dossche                             |
    +----------------------------------------------------------------------+
diff --git a/ext/dom/html_document.c b/ext/dom/html_document.c
index 954403ca1c5d..58f07e079dd3 100644
--- a/ext/dom/html_document.c
+++ b/ext/dom/html_document.c
@@ -1,14 +1,12 @@
 /*
    +----------------------------------------------------------------------+
-   | Copyright (c) The PHP Group                                          |
+   | Copyright © The PHP Group and Contributors.                          |
    +----------------------------------------------------------------------+
-   | This source file is subject to version 3.01 of the PHP license,      |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | https://www.php.net/license/3_01.txt                                 |
-   | If you did not receive a copy of the PHP license and are unable to   |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@php.net so we can mail you a copy immediately.               |
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Authors: Niels Dossche                             |
    +----------------------------------------------------------------------+
diff --git a/ext/dom/infra.c b/ext/dom/infra.c
index 9bb1942fe01d..33026d8a7526 100644
--- a/ext/dom/infra.c
+++ b/ext/dom/infra.c
@@ -1,14 +1,12 @@
 /*
    +----------------------------------------------------------------------+
-   | Copyright (c) The PHP Group                                          |
+   | Copyright © The PHP Group and Contributors.                          |
    +----------------------------------------------------------------------+
-   | This source file is subject to version 3.01 of the PHP license,      |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | https://www.php.net/license/3_01.txt                                 |
-   | If you did not receive a copy of the PHP license and are unable to   |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@php.net so we can mail you a copy immediately.               |
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Authors: Niels Dossche                             |
    +----------------------------------------------------------------------+
diff --git a/ext/dom/infra.h b/ext/dom/infra.h
index d84ad5a2a0ef..4cf8ad26c789 100644
--- a/ext/dom/infra.h
+++ b/ext/dom/infra.h
@@ -1,14 +1,12 @@
 /*
    +----------------------------------------------------------------------+
-   | Copyright (c) The PHP Group                                          |
+   | Copyright © The PHP Group and Contributors.                          |
    +----------------------------------------------------------------------+
-   | This source file is subject to version 3.01 of the PHP license,      |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | https://www.php.net/license/3_01.txt                                 |
-   | If you did not receive a copy of the PHP license and are unable to   |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@php.net so we can mail you a copy immediately.               |
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Authors: Niels Dossche                             |
    +----------------------------------------------------------------------+
diff --git a/ext/dom/inner_outer_html_mixin.c b/ext/dom/inner_outer_html_mixin.c
index 85124d41689a..e1bf226d8602 100644
--- a/ext/dom/inner_outer_html_mixin.c
+++ b/ext/dom/inner_outer_html_mixin.c
@@ -1,14 +1,12 @@
 /*
    +----------------------------------------------------------------------+
-   | Copyright (c) The PHP Group                                          |
+   | Copyright © The PHP Group and Contributors.                          |
    +----------------------------------------------------------------------+
-   | This source file is subject to version 3.01 of the PHP license,      |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | https://www.php.net/license/3_01.txt                                 |
-   | If you did not receive a copy of the PHP license and are unable to   |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@php.net so we can mail you a copy immediately.               |
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Authors: Niels Dossche                             |
    +----------------------------------------------------------------------+
@@ -181,7 +179,7 @@ static lxb_dom_document_cmode_t dom_translate_quirks_mode(php_libxml_quirks_mode
 		case PHP_LIBXML_NO_QUIRKS: return LXB_DOM_DOCUMENT_CMODE_NO_QUIRKS;
 		case PHP_LIBXML_LIMITED_QUIRKS: return LXB_DOM_DOCUMENT_CMODE_LIMITED_QUIRKS;
 		case PHP_LIBXML_QUIRKS: return LXB_DOM_DOCUMENT_CMODE_QUIRKS;
-		EMPTY_SWITCH_DEFAULT_CASE();
+		default: ZEND_UNREACHABLE();
 	}
 }
 
diff --git a/ext/dom/internal_helpers.h b/ext/dom/internal_helpers.h
index c87ea49c6143..725c8222f429 100644
--- a/ext/dom/internal_helpers.h
+++ b/ext/dom/internal_helpers.h
@@ -1,14 +1,12 @@
 /*
    +----------------------------------------------------------------------+
-   | Copyright (c) The PHP Group                                          |
+   | Copyright © The PHP Group and Contributors.                          |
    +----------------------------------------------------------------------+
-   | This source file is subject to version 3.01 of the PHP license,      |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | https://www.php.net/license/3_01.txt                                 |
-   | If you did not receive a copy of the PHP license and are unable to   |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@php.net so we can mail you a copy immediately.               |
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Authors: Niels Dossche                             |
    +----------------------------------------------------------------------+
diff --git a/ext/dom/lexbor/selectors-adapted/selectors.c b/ext/dom/lexbor/selectors-adapted/selectors.c
index 0bb285b39e99..0f7874d2cf53 100644
--- a/ext/dom/lexbor/selectors-adapted/selectors.c
+++ b/ext/dom/lexbor/selectors-adapted/selectors.c
@@ -1,9 +1,9 @@
 /*
- * Copyright (C) 2021-2025 Alexander Borisov
+ * Copyright (C) 2021-2026 Alexander Borisov
  *
  * Author: Alexander Borisov 
  * Adapted for PHP + libxml2 by: Niels Dossche 
- * Based on Lexbor (upstream commit 971faf11a5f45433b9193a143e2897d8c0fd5611)
+ * Based on Lexbor (upstream commit 5291cde0d40f77e7c4ea364b7cd726269e0bf1f9)
  */
 
 #include 
@@ -1356,8 +1356,8 @@ lxb_selectors_state_after_nth_child(lxb_selectors_t *selectors,
 	current = selectors->current;
 
 	if (current->index == 0) {
-		selectors->state = lxb_selectors_state_not_found;
 		selectors->current = selectors->current->parent;
+		lxb_selectors_switch_to_not_found(selectors, selectors->current);
 
 		return selectors->current->entry;
 	}
@@ -1453,7 +1453,7 @@ lxb_selectors_match(lxb_selectors_t *selectors, lxb_selectors_entry_t *entry,
 		case LXB_CSS_SELECTOR_TYPE_PSEUDO_ELEMENT_FUNCTION:
 			return false;
 
-		EMPTY_SWITCH_DEFAULT_CASE();
+		default: ZEND_UNREACHABLE();
 	}
 
 	return false;
@@ -1635,7 +1635,7 @@ lxb_selectors_match_attribute_value(const lxb_css_selector_attribute_t *attr, bo
 
 			return lexbor_str_data_ncmp_contain(trg->data, trg->length,
 												src->data, src->length);
-		EMPTY_SWITCH_DEFAULT_CASE();
+		default: ZEND_UNREACHABLE();
 	}
 
 	return false;
diff --git a/ext/dom/namednodemap.c b/ext/dom/namednodemap.c
index 4964f836407c..c6d8157881a3 100644
--- a/ext/dom/namednodemap.c
+++ b/ext/dom/namednodemap.c
@@ -1,14 +1,12 @@
 /*
    +----------------------------------------------------------------------+
-   | Copyright (c) The PHP Group                                          |
+   | Copyright © The PHP Group and Contributors.                          |
    +----------------------------------------------------------------------+
-   | This source file is subject to version 3.01 of the PHP license,      |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | https://www.php.net/license/3_01.txt                                 |
-   | If you did not receive a copy of the PHP license and are unable to   |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@php.net so we can mail you a copy immediately.               |
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Authors: Christian Stocker                           |
    |          Rob Richards                             |
diff --git a/ext/dom/namespace_compat.c b/ext/dom/namespace_compat.c
index ee32ec39dbeb..420759b369ef 100644
--- a/ext/dom/namespace_compat.c
+++ b/ext/dom/namespace_compat.c
@@ -1,14 +1,12 @@
 /*
    +----------------------------------------------------------------------+
-   | Copyright (c) The PHP Group                                          |
+   | Copyright © The PHP Group and Contributors.                          |
    +----------------------------------------------------------------------+
-   | This source file is subject to version 3.01 of the PHP license,      |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | https://www.php.net/license/3_01.txt                                 |
-   | If you did not receive a copy of the PHP license and are unable to   |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@php.net so we can mail you a copy immediately.               |
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Authors: Niels Dossche                             |
    +----------------------------------------------------------------------+
@@ -61,7 +59,7 @@ static HashTable *php_dom_libxml_ns_mapper_ensure_prefix_map(php_dom_libxml_ns_m
 		zend_hash_add_new(&mapper->uri_to_prefix_map, *uri, &zv_prefix_map);
 	} else {
 		/* cast to Bucket* only works if this holds, I would prefer a static assert but we're stuck at C99. */
-		ZEND_ASSERT(XtOffsetOf(Bucket, val) == 0);
+		ZEND_ASSERT(offsetof(Bucket, val) == 0);
 		ZEND_ASSERT(Z_TYPE_P(zv) == IS_ARRAY);
 		Bucket *bucket = (Bucket *) zv;
 		/* Make sure we take the value from the key string that lives long enough. */
@@ -494,4 +492,142 @@ PHP_DOM_EXPORT void php_dom_in_scope_ns_destroy(php_dom_in_scope_ns *in_scope_ns
 	}
 }
 
+static xmlNsPtr dom_alloc_ns_decl(HashTable *links, xmlNodePtr node)
+{
+	xmlNsPtr ns = xmlMalloc(sizeof(*ns));
+	if (!ns) {
+		return NULL;
+	}
+
+	zval *zv = zend_hash_index_lookup(links, (zend_ulong) node);
+	if (Z_ISNULL_P(zv)) {
+		ZVAL_LONG(zv, 1);
+	} else {
+		Z_LVAL_P(zv)++;
+	}
+
+	memset(ns, 0, sizeof(*ns));
+	ns->type = XML_LOCAL_NAMESPACE;
+	ns->next = node->nsDef;
+	node->nsDef = ns;
+
+	return ns;
+}
+
+/* Mint a temporary nsDef entry so C14N finds namespaces that live on node->ns
+ * but have no matching xmlns attribute (typical for createElementNS). */
+static void dom_add_synthetic_ns_decl(HashTable *links, xmlNodePtr node, xmlNsPtr src_ns)
+{
+	xmlNsPtr ns = dom_alloc_ns_decl(links, node);
+	if (!ns) {
+		return;
+	}
+
+	ns->href = xmlStrdup(src_ns->href);
+	ns->prefix = src_ns->prefix ? xmlStrdup(src_ns->prefix) : NULL;
+}
+
+/* Same, but for attribute namespaces, which may collide by prefix with the
+ * element's own ns or with a sibling attribute's ns. */
+static void dom_add_synthetic_ns_decl_for_attr(HashTable *links, xmlNodePtr node, xmlNsPtr src_ns)
+{
+	for (xmlNsPtr existing = node->nsDef; existing; existing = existing->next) {
+		if (xmlStrEqual(existing->prefix, src_ns->prefix)) {
+			return;
+		}
+	}
+
+	dom_add_synthetic_ns_decl(links, node, src_ns);
+}
+
+static void dom_relink_ns_decls_element(HashTable *links, xmlNodePtr node)
+{
+	if (node->type == XML_ELEMENT_NODE) {
+		for (xmlAttrPtr attr = node->properties; attr; attr = attr->next) {
+			if (php_dom_ns_is_fast((const xmlNode *) attr, php_dom_ns_is_xmlns_magic_token)) {
+				xmlNsPtr ns = dom_alloc_ns_decl(links, node);
+				if (!ns) {
+					return;
+				}
+
+				bool should_free;
+				xmlChar *attr_value = php_libxml_attr_value(attr, &should_free);
+
+				ns->href = should_free ? attr_value : xmlStrdup(attr_value);
+				ns->prefix = attr->ns->prefix ? xmlStrdup(attr->name) : NULL;
+				ns->_private = attr;
+				if (attr->prev) {
+					attr->prev->next = attr->next;
+				} else {
+					node->properties = attr->next;
+				}
+				if (attr->next) {
+					attr->next->prev = attr->prev;
+				}
+			}
+		}
+
+		/* The default namespace is handled separately from the other namespaces in C14N.
+		 * The default namespace is explicitly looked up while the other namespaces are
+		 * deduplicated and compared to a list of visible namespaces. */
+		if (node->ns && !node->ns->prefix) {
+			/* Workaround for the behaviour where the xmlSearchNs() call inside c14n.c
+			 * can return the current namespace. */
+			zend_hash_index_add_new_ptr(links, (zend_ulong) node | 1, node->ns);
+			node->ns = xmlSearchNs(node->doc, node, NULL);
+		} else if (node->ns) {
+			dom_add_synthetic_ns_decl(links, node, node->ns);
+		}
+
+		for (xmlAttrPtr attr = node->properties; attr; attr = attr->next) {
+			if (attr->ns && !php_dom_ns_is_fast((const xmlNode *) attr, php_dom_ns_is_xmlns_magic_token)) {
+				dom_add_synthetic_ns_decl_for_attr(links, node, attr->ns);
+			}
+		}
+	}
+}
+
+void dom_relink_ns_decls(HashTable *links, xmlNodePtr root)
+{
+	dom_relink_ns_decls_element(links, root);
+
+	xmlNodePtr base = root;
+	xmlNodePtr node = base->children;
+	while (node != NULL) {
+		dom_relink_ns_decls_element(links, node);
+		node = php_dom_next_in_tree_order(node, base);
+	}
+}
+
+void dom_unlink_ns_decls(HashTable *links)
+{
+	ZEND_HASH_MAP_FOREACH_NUM_KEY_VAL(links, zend_ulong h, zval *data) {
+		if (h & 1) {
+			xmlNodePtr node = (xmlNodePtr) (h ^ 1);
+			node->ns = Z_PTR_P(data);
+		} else {
+			xmlNodePtr node = (xmlNodePtr) h;
+			while (Z_LVAL_P(data)-- > 0) {
+				xmlNsPtr ns = node->nsDef;
+				node->nsDef = ns->next;
+
+				xmlAttrPtr attr = ns->_private;
+				if (attr) {
+					if (attr->prev) {
+						attr->prev->next = attr;
+					} else {
+						node->properties = attr;
+					}
+					if (attr->next) {
+						attr->next->prev = attr;
+					}
+				}
+
+				xmlFreeNs(ns);
+			}
+		}
+	} ZEND_HASH_FOREACH_END();
+}
+
+
 #endif  /* HAVE_LIBXML && HAVE_DOM */
diff --git a/ext/dom/namespace_compat.h b/ext/dom/namespace_compat.h
index 23c80acc7fd7..dc66021e5ec4 100644
--- a/ext/dom/namespace_compat.h
+++ b/ext/dom/namespace_compat.h
@@ -1,14 +1,12 @@
 /*
    +----------------------------------------------------------------------+
-   | Copyright (c) The PHP Group                                          |
+   | Copyright © The PHP Group and Contributors.                          |
    +----------------------------------------------------------------------+
-   | This source file is subject to version 3.01 of the PHP license,      |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | https://www.php.net/license/3_01.txt                                 |
-   | If you did not receive a copy of the PHP license and are unable to   |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@php.net so we can mail you a copy immediately.               |
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Authors: Niels Dossche                             |
    +----------------------------------------------------------------------+
diff --git a/ext/dom/node.c b/ext/dom/node.c
index 19b6c2eeae3b..4cfc6c5af0d2 100644
--- a/ext/dom/node.c
+++ b/ext/dom/node.c
@@ -1,14 +1,12 @@
 /*
    +----------------------------------------------------------------------+
-   | Copyright (c) The PHP Group                                          |
+   | Copyright © The PHP Group and Contributors.                          |
    +----------------------------------------------------------------------+
-   | This source file is subject to version 3.01 of the PHP license,      |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | https://www.php.net/license/3_01.txt                                 |
-   | If you did not receive a copy of the PHP license and are unable to   |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@php.net so we can mail you a copy immediately.               |
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Authors: Christian Stocker                           |
    |          Rob Richards                             |
@@ -138,7 +136,7 @@ zend_result dom_node_node_name_read(dom_object *obj, zval *retval)
 		case XML_TEXT_NODE:
 			ZVAL_STRING(retval, "#text");
 			break;
-		EMPTY_SWITCH_DEFAULT_CASE();
+		default: ZEND_UNREACHABLE();
 	}
 
 	return SUCCESS;
@@ -2103,97 +2101,6 @@ PHP_METHOD(DOMNode, lookupNamespaceURI)
 }
 /* }}} end dom_node_lookup_namespace_uri */
 
-static void dom_relink_ns_decls_element(HashTable *links, xmlNodePtr node)
-{
-	if (node->type == XML_ELEMENT_NODE) {
-		for (xmlAttrPtr attr = node->properties; attr; attr = attr->next) {
-			if (php_dom_ns_is_fast((const xmlNode *) attr, php_dom_ns_is_xmlns_magic_token)) {
-				xmlNsPtr ns = xmlMalloc(sizeof(*ns));
-				if (!ns) {
-					return;
-				}
-
-				zval *zv = zend_hash_index_lookup(links, (zend_ulong) node);
-				if (Z_ISNULL_P(zv)) {
-					ZVAL_LONG(zv, 1);
-				} else {
-					Z_LVAL_P(zv)++;
-				}
-
-				bool should_free;
-				xmlChar *attr_value = php_libxml_attr_value(attr, &should_free);
-
-				memset(ns, 0, sizeof(*ns));
-				ns->type = XML_LOCAL_NAMESPACE;
-				ns->href = should_free ? attr_value : xmlStrdup(attr_value);
-				ns->prefix = attr->ns->prefix ? xmlStrdup(attr->name) : NULL;
-				ns->next = node->nsDef;
-				node->nsDef = ns;
-
-				ns->_private = attr;
-				if (attr->prev) {
-					attr->prev = attr->next;
-				} else {
-					node->properties = attr->next;
-				}
-				if (attr->next) {
-					attr->next->prev = attr->prev;
-				}
-			}
-		}
-
-		/* The default namespace is handled separately from the other namespaces in C14N.
-		 * The default namespace is explicitly looked up while the other namespaces are
-		 * deduplicated and compared to a list of visible namespaces. */
-		if (node->ns && !node->ns->prefix) {
-			/* Workaround for the behaviour where the xmlSearchNs() call inside c14n.c
-			 * can return the current namespace. */
-			zend_hash_index_add_new_ptr(links, (zend_ulong) node | 1, node->ns);
-			node->ns = xmlSearchNs(node->doc, node, NULL);
-		}
-	}
-}
-
-static void dom_relink_ns_decls(HashTable *links, xmlNodePtr root)
-{
-	dom_relink_ns_decls_element(links, root);
-
-	xmlNodePtr base = root;
-	xmlNodePtr node = base->children;
-	while (node != NULL) {
-		dom_relink_ns_decls_element(links, node);
-		node = php_dom_next_in_tree_order(node, base);
-	}
-}
-
-static void dom_unlink_ns_decls(HashTable *links)
-{
-	ZEND_HASH_MAP_FOREACH_NUM_KEY_VAL(links, zend_ulong h, zval *data) {
-		if (h & 1) {
-			xmlNodePtr node = (xmlNodePtr) (h ^ 1);
-			node->ns = Z_PTR_P(data);
-		} else {
-			xmlNodePtr node = (xmlNodePtr) h;
-			while (Z_LVAL_P(data)-- > 0) {
-				xmlNsPtr ns = node->nsDef;
-				node->nsDef = ns->next;
-
-				xmlAttrPtr attr = ns->_private;
-				if (attr->prev) {
-					attr->prev->next = attr;
-				} else {
-					node->properties = attr;
-				}
-				if (attr->next) {
-					attr->next->prev = attr;
-				}
-
-				xmlFreeNs(ns);
-			}
-		}
-	} ZEND_HASH_FOREACH_END();
-}
-
 static int dom_canonicalize_node_parent_lookup_cb(void *user_data, xmlNodePtr node, xmlNodePtr parent)
 {
 	xmlNodePtr root = user_data;
@@ -2263,7 +2170,11 @@ static void dom_canonicalization(INTERNAL_FUNCTION_PARAMETERS, int mode) /* {{{
 		}
 
 		zend_hash_init(&links, 0, NULL, NULL, false);
-		dom_relink_ns_decls(&links, xmlDocGetRootElement(docp));
+		xmlNodePtr root_element = xmlDocGetRootElement(docp);
+
+		if (root_element) {
+			dom_relink_ns_decls(&links, root_element);
+		}
 	} else if (!docp) {
 		/* Note: not triggerable with modern DOM */
 		zend_throw_error(NULL, "Node must be associated with a document");
diff --git a/ext/dom/nodelist.c b/ext/dom/nodelist.c
index 5e3de728e4fa..197ff3ceb880 100644
--- a/ext/dom/nodelist.c
+++ b/ext/dom/nodelist.c
@@ -1,14 +1,12 @@
 /*
    +----------------------------------------------------------------------+
-   | Copyright (c) The PHP Group                                          |
+   | Copyright © The PHP Group and Contributors.                          |
    +----------------------------------------------------------------------+
-   | This source file is subject to version 3.01 of the PHP license,      |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | https://www.php.net/license/3_01.txt                                 |
-   | If you did not receive a copy of the PHP license and are unable to   |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@php.net so we can mail you a copy immediately.               |
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Authors: Christian Stocker                           |
    |          Rob Richards                             |
diff --git a/ext/dom/nodelist.h b/ext/dom/nodelist.h
index 5c5653eea6dc..084ce33b5494 100644
--- a/ext/dom/nodelist.h
+++ b/ext/dom/nodelist.h
@@ -1,14 +1,12 @@
 /*
    +----------------------------------------------------------------------+
-   | Copyright (c) The PHP Group                                          |
+   | Copyright © The PHP Group and Contributors.                          |
    +----------------------------------------------------------------------+
-   | This source file is subject to version 3.01 of the PHP license,      |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | https://www.php.net/license/3_01.txt                                 |
-   | If you did not receive a copy of the PHP license and are unable to   |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@php.net so we can mail you a copy immediately.               |
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Authors: Niels Dossche                             |
    +----------------------------------------------------------------------+
diff --git a/ext/dom/notation.c b/ext/dom/notation.c
index f83b31428e16..73d0d6b083a5 100644
--- a/ext/dom/notation.c
+++ b/ext/dom/notation.c
@@ -1,14 +1,12 @@
 /*
    +----------------------------------------------------------------------+
-   | Copyright (c) The PHP Group                                          |
+   | Copyright © The PHP Group and Contributors.                          |
    +----------------------------------------------------------------------+
-   | This source file is subject to version 3.01 of the PHP license,      |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | https://www.php.net/license/3_01.txt                                 |
-   | If you did not receive a copy of the PHP license and are unable to   |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@php.net so we can mail you a copy immediately.               |
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Authors: Christian Stocker                           |
    |          Rob Richards                             |
diff --git a/ext/dom/obj_map.c b/ext/dom/obj_map.c
index 84fae3bad572..eeef8345fc63 100644
--- a/ext/dom/obj_map.c
+++ b/ext/dom/obj_map.c
@@ -1,14 +1,12 @@
 /*
    +----------------------------------------------------------------------+
-   | Copyright (c) The PHP Group                                          |
+   | Copyright © The PHP Group and Contributors.                          |
    +----------------------------------------------------------------------+
-   | This source file is subject to version 3.01 of the PHP license,      |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | https://www.php.net/license/3_01.txt                                 |
-   | If you did not receive a copy of the PHP license and are unable to   |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@php.net so we can mail you a copy immediately.               |
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Authors: Christian Stocker                           |
    |          Rob Richards                             |
@@ -178,7 +176,8 @@ static void dom_map_get_notation_item(dom_nnodemap_object *map, zend_long index,
 	xmlNodePtr node = map->ht ? php_dom_libxml_hash_iter(map->ht, index) : NULL;
 	if (node) {
 		xmlNotation *notation = (xmlNotation *) node;
-		node = create_notation(notation->name, notation->PublicID, notation->SystemID);
+		xmlDtdPtr dtd = (xmlDtdPtr) dom_object_get_node(map->baseobj);
+		node = create_notation(dtd, notation->name, notation->PublicID, notation->SystemID);
 	}
 	dom_ret_node_to_zobj(map, node, return_value);
 }
@@ -506,7 +505,8 @@ static xmlNodePtr dom_map_get_ns_named_item_notation(dom_nnodemap_object *map, c
 {
 	xmlNotationPtr notation = xmlHashLookup(map->ht, BAD_CAST ZSTR_VAL(named));
 	if (notation) {
-		return create_notation(notation->name, notation->PublicID, notation->SystemID);
+		xmlDtdPtr dtd = (xmlDtdPtr) dom_object_get_node(map->baseobj);
+		return create_notation(dtd, notation->name, notation->PublicID, notation->SystemID);
 	}
 	return NULL;
 }
diff --git a/ext/dom/obj_map.h b/ext/dom/obj_map.h
index e7231eb7b10a..1853cce354e6 100644
--- a/ext/dom/obj_map.h
+++ b/ext/dom/obj_map.h
@@ -1,14 +1,12 @@
 /*
    +----------------------------------------------------------------------+
-   | Copyright (c) The PHP Group                                          |
+   | Copyright © The PHP Group and Contributors.                          |
    +----------------------------------------------------------------------+
-   | This source file is subject to version 3.01 of the PHP license,      |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | https://www.php.net/license/3_01.txt                                 |
-   | If you did not receive a copy of the PHP license and are unable to   |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@php.net so we can mail you a copy immediately.               |
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Authors: Niels Dossche                             |
    +----------------------------------------------------------------------+
diff --git a/ext/dom/parentnode/css_selectors.c b/ext/dom/parentnode/css_selectors.c
index 4f77359835ce..7254bd909a0a 100644
--- a/ext/dom/parentnode/css_selectors.c
+++ b/ext/dom/parentnode/css_selectors.c
@@ -1,14 +1,12 @@
 /*
    +----------------------------------------------------------------------+
-   | Copyright (c) The PHP Group                                          |
+   | Copyright © The PHP Group and Contributors.                          |
    +----------------------------------------------------------------------+
-   | This source file is subject to version 3.01 of the PHP license,      |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | https://www.php.net/license/3_01.txt                                 |
-   | If you did not receive a copy of the PHP license and are unable to   |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@php.net so we can mail you a copy immediately.               |
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Authors: Niels Dossche                             |
    +----------------------------------------------------------------------+
diff --git a/ext/dom/parentnode/tree.c b/ext/dom/parentnode/tree.c
index c51bd2753cd8..696c42ba64ff 100644
--- a/ext/dom/parentnode/tree.c
+++ b/ext/dom/parentnode/tree.c
@@ -1,14 +1,12 @@
 /*
    +----------------------------------------------------------------------+
-   | Copyright (c) The PHP Group                                          |
+   | Copyright © The PHP Group and Contributors.                          |
    +----------------------------------------------------------------------+
-   | This source file is subject to version 3.01 of the PHP license,      |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | https://www.php.net/license/3_01.txt                                 |
-   | If you did not receive a copy of the PHP license and are unable to   |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@php.net so we can mail you a copy immediately.               |
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Authors: Benjamin Eberlei                          |
    |          Niels Dossche                             |
diff --git a/ext/dom/php_dom.c b/ext/dom/php_dom.c
index 57fa5e71f6bc..eccbe4ed2984 100644
--- a/ext/dom/php_dom.c
+++ b/ext/dom/php_dom.c
@@ -1,14 +1,12 @@
 /*
    +----------------------------------------------------------------------+
-   | Copyright (c) The PHP Group                                          |
+   | Copyright © The PHP Group and Contributors.                          |
    +----------------------------------------------------------------------+
-   | This source file is subject to version 3.01 of the PHP license,      |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | https://www.php.net/license/3_01.txt                                 |
-   | If you did not receive a copy of the PHP license and are unable to   |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@php.net so we can mail you a copy immediately.               |
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Authors: Christian Stocker                           |
    |          Rob Richards                             |
@@ -414,11 +412,6 @@ zval *dom_write_property(zend_object *object, zend_string *name, zval *value, vo
 	const dom_prop_handler *hnd = dom_get_prop_handler(obj, name, cache_slot);
 
 	if (hnd) {
-		if (UNEXPECTED(!hnd->write_func)) {
-			zend_readonly_property_modification_error_ex(ZSTR_VAL(object->ce->name), ZSTR_VAL(name));
-			return &EG(error_zval);
-		}
-
 		zend_property_info *prop = NULL;
 		if (cache_slot) {
 			ZEND_ASSERT(*cache_slot == obj->prop_handler);
@@ -431,6 +424,16 @@ zval *dom_write_property(zend_object *object, zend_string *name, zval *value, vo
 			}
 		}
 
+		if (UNEXPECTED(!hnd->write_func)) {
+			if (prop && (prop->flags & ZEND_ACC_PPP_SET_MASK) &&
+			    !zend_asymmetric_property_has_set_access(prop)) {
+				zend_asymmetric_visibility_property_modification_error(prop, "modify");
+			} else {
+				zend_readonly_property_modification_error_ex(ZSTR_VAL(object->ce->name), ZSTR_VAL(name));
+			}
+			return &EG(error_zval);
+		}
+
 		ZEND_ASSERT(prop && ZEND_TYPE_IS_SET(prop->type));
 		zval tmp;
 		ZVAL_COPY(&tmp, value);
@@ -789,7 +792,7 @@ HashTable *dom_xpath_get_gc(zend_object *object, zval **table, int *n);
 PHP_MINIT_FUNCTION(dom)
 {
 	memcpy(&dom_object_handlers, &std_object_handlers, sizeof(zend_object_handlers));
-	dom_object_handlers.offset = XtOffsetOf(dom_object, std);
+	dom_object_handlers.offset = offsetof(dom_object, std);
 	dom_object_handlers.free_obj = dom_objects_free_storage;
 	dom_object_handlers.read_property = dom_read_property;
 	dom_object_handlers.write_property = dom_write_property;
@@ -834,12 +837,12 @@ PHP_MINIT_FUNCTION(dom)
 	dom_html_collection_object_handlers.get_gc = dom_html_collection_get_gc;
 
 	memcpy(&dom_object_namespace_node_handlers, &dom_object_handlers, sizeof(zend_object_handlers));
-	dom_object_namespace_node_handlers.offset = XtOffsetOf(dom_object_namespace_node, dom.std);
+	dom_object_namespace_node_handlers.offset = offsetof(dom_object_namespace_node, dom.std);
 	dom_object_namespace_node_handlers.free_obj = dom_object_namespace_node_free_storage;
 	dom_object_namespace_node_handlers.clone_obj = dom_object_namespace_node_clone_obj;
 
 	memcpy(&dom_token_list_object_handlers, &dom_object_handlers, sizeof(zend_object_handlers));
-	dom_token_list_object_handlers.offset = XtOffsetOf(dom_token_list_object, dom.std);
+	dom_token_list_object_handlers.offset = offsetof(dom_token_list_object, dom.std);
 	dom_token_list_object_handlers.free_obj = dom_token_list_free_obj;
 	/* The Web IDL (Web Interface Description Language - https://webidl.spec.whatwg.org) has the [SameObject] constraint
 	 * for this object, which is incompatible with cloning because it imposes that there is only one instance
@@ -1330,7 +1333,7 @@ PHP_MINIT_FUNCTION(dom)
 
 #ifdef LIBXML_XPATH_ENABLED
 	memcpy(&dom_xpath_object_handlers, &dom_object_handlers, sizeof(zend_object_handlers));
-	dom_xpath_object_handlers.offset = XtOffsetOf(dom_xpath_object, dom) + XtOffsetOf(dom_object, std);
+	dom_xpath_object_handlers.offset = offsetof(dom_xpath_object, dom) + offsetof(dom_object, std);
 	dom_xpath_object_handlers.free_obj = dom_xpath_objects_free_storage;
 	dom_xpath_object_handlers.get_gc = dom_xpath_get_gc;
 	dom_xpath_object_handlers.clone_obj = NULL;
@@ -1483,7 +1486,13 @@ void dom_objects_free_storage(zend_object *object)
 	if (ptr != NULL && ptr->node != NULL) {
 		xmlNodePtr node = ptr->node;
 
-		if (node->type != XML_DOCUMENT_NODE && node->type != XML_HTML_DOCUMENT_NODE) {
+		if (node->type == XML_NOTATION_NODE) {
+			unsigned int refcount = php_libxml_decrement_node_ptr((php_libxml_node_object *) intern);
+			php_libxml_decrement_doc_ref((php_libxml_node_object *) intern);
+			if (refcount == 0) {
+				dom_free_notation((xmlEntityPtr) node);
+			}
+		} else if (node->type != XML_DOCUMENT_NODE && node->type != XML_HTML_DOCUMENT_NODE) {
 			php_libxml_node_decrement_resource((php_libxml_node_object *) intern);
 		} else {
 			php_libxml_decrement_node_ptr((php_libxml_node_object *) intern);
@@ -1496,7 +1505,7 @@ void dom_objects_free_storage(zend_object *object)
 
 static void dom_objects_set_class_ex(zend_class_entry *class_type, dom_object *intern)
 {
-	zend_class_entry *base_class = class_type;
+	const zend_class_entry *base_class = class_type;
 	while ((base_class->type != ZEND_INTERNAL_CLASS || base_class->info.internal.module->module_number != dom_module_entry.module_number) && base_class->parent != NULL) {
 		base_class = base_class->parent;
 	}
@@ -1561,7 +1570,7 @@ zend_object *dom_xpath_objects_new(zend_class_entry *class_type)
 
 /* The char pointer MUST refer to the char* of a zend_string struct */
 static void dom_zend_string_release_from_char_pointer(xmlChar *ptr) {
-	zend_string_release((zend_string*) (ptr - XtOffsetOf(zend_string, val)));
+	zend_string_release((zend_string*) (ptr - offsetof(zend_string, val)));
 }
 
 void dom_nnodemap_objects_free_storage(zend_object *object) /* {{{ */
diff --git a/ext/dom/php_dom.h b/ext/dom/php_dom.h
index e93000044f00..1b19aeee3baa 100644
--- a/ext/dom/php_dom.h
+++ b/ext/dom/php_dom.h
@@ -1,14 +1,12 @@
 /*
    +----------------------------------------------------------------------+
-   | Copyright (c) The PHP Group                                          |
+   | Copyright © The PHP Group and Contributors.                          |
    +----------------------------------------------------------------------+
-   | This source file is subject to version 3.01 of the PHP license,      |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | https://www.php.net/license/3_01.txt                                 |
-   | If you did not receive a copy of the PHP license and are unable to   |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@php.net so we can mail you a copy immediately.               |
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Authors: Christian Stocker                           |
    |          Rob Richards 							  |
@@ -70,7 +68,7 @@ typedef struct dom_xpath_object {
 
 static inline dom_xpath_object *php_xpath_obj_from_obj(zend_object *obj) {
 	return (dom_xpath_object*)((char*)(obj)
-		- XtOffsetOf(dom_xpath_object, dom) - XtOffsetOf(dom_object, std));
+		- offsetof(dom_xpath_object, dom) - offsetof(dom_object, std));
 }
 
 #define Z_XPATHOBJ_P(zv)  php_xpath_obj_from_obj(Z_OBJ_P((zv)))
@@ -96,7 +94,7 @@ struct php_dom_libxml_ns_mapper;
 typedef struct php_dom_libxml_ns_mapper php_dom_libxml_ns_mapper;
 
 static inline dom_object_namespace_node *php_dom_namespace_node_obj_from_obj(zend_object *obj) {
-	return (dom_object_namespace_node*)((char*)(obj) - XtOffsetOf(dom_object_namespace_node, dom.std));
+	return (dom_object_namespace_node*)((char*)(obj) - offsetof(dom_object_namespace_node, dom.std));
 }
 
 #include "domexception.h"
@@ -127,7 +125,8 @@ int dom_hierarchy(xmlNodePtr parent, xmlNodePtr child);
 bool dom_has_feature(zend_string *feature, zend_string *version);
 bool dom_node_is_read_only(const xmlNode *node);
 bool dom_node_children_valid(const xmlNode *node);
-xmlNodePtr create_notation(const xmlChar *name, const xmlChar *ExternalID, const xmlChar *SystemID);
+xmlNodePtr create_notation(xmlDtdPtr parent_dtd, const xmlChar *name, const xmlChar *ExternalID, const xmlChar *SystemID);
+void dom_free_notation(xmlEntityPtr entity);
 xmlNode *php_dom_libxml_hash_iter(xmlHashTable *ht, int index);
 zend_object_iterator *php_dom_get_iterator(zend_class_entry *ce, zval *object, int by_ref);
 void dom_set_doc_classmap(php_libxml_ref_obj *document, zend_class_entry *basece, zend_class_entry *ce);
@@ -162,6 +161,12 @@ void dom_set_document_ref_pointers_attr(xmlAttrPtr attr, php_libxml_ref_obj *doc
 
 /* Prop getters by offset */
 zval *dom_get_prop_checked_offset(dom_object *obj, uint32_t offset, const char *name);
+/* Temporarily materialize namespace declarations as nsDef entries on the tree so
+ * that libxml's native validators/canonicalizers can resolve prefixed QNames that
+ * appear in element/attribute *content*. Modern DOM keeps declarations off the
+ * tree (node->nsDef == NULL), which xmlSearchNs() cannot follow. Internal only. */
+void dom_relink_ns_decls(HashTable *links, xmlNodePtr root);
+void dom_unlink_ns_decls(HashTable *links);
 zval *dom_element_class_list_zval(dom_object *obj);
 zval *dom_parent_node_children(dom_object *obj);
 
diff --git a/ext/dom/php_dom.stub.php b/ext/dom/php_dom.stub.php
index 71aa5f4ec0fa..521e3cd99c2e 100644
--- a/ext/dom/php_dom.stub.php
+++ b/ext/dom/php_dom.stub.php
@@ -237,41 +237,23 @@
 
     class DOMDocumentType extends DOMNode
     {
-        /**
-         * @readonly
-         * @virtual
-         */
-        public string $name;
+        /** @virtual */
+        public private(set) string $name;
 
-        /**
-         * @readonly
-         * @virtual
-         */
-        public DOMNamedNodeMap $entities;
+        /** @virtual */
+        public private(set) DOMNamedNodeMap $entities;
 
-        /**
-         * @readonly
-         * @virtual
-         */
-        public DOMNamedNodeMap $notations;
+        /** @virtual */
+        public private(set) DOMNamedNodeMap $notations;
 
-        /**
-         * @readonly
-         * @virtual
-         */
-        public string $publicId;
+        /** @virtual */
+        public private(set) string $publicId;
 
-        /**
-         * @readonly
-         * @virtual
-         */
-        public string $systemId;
+        /** @virtual */
+        public private(set) string $systemId;
 
-        /**
-         * @readonly
-         * @virtual
-         */
-        public ?string $internalSubset;
+        /** @virtual */
+        public private(set) ?string $internalSubset;
     }
 
     class DOMCdataSection extends DOMText
@@ -319,101 +301,56 @@ class DOMNode
         public const int DOCUMENT_POSITION_CONTAINED_BY = 0x10;
         public const int DOCUMENT_POSITION_IMPLEMENTATION_SPECIFIC = 0x20;
 
-        /**
-         * @readonly
-         * @virtual
-         */
-        public string $nodeName;
+        /** @virtual */
+        public private(set) string $nodeName;
 
         /** @virtual */
         public ?string $nodeValue;
 
-        /**
-         * @readonly
-         * @virtual
-         */
-        public int $nodeType;
+        /** @virtual */
+        public private(set) int $nodeType;
 
-        /**
-         * @readonly
-         * @virtual
-         */
-        public ?DOMNode $parentNode;
+        /** @virtual */
+        public private(set) ?DOMNode $parentNode;
 
-        /**
-         * @readonly
-         * @virtual
-         */
-        public ?DOMElement $parentElement;
+        /** @virtual */
+        public private(set) ?DOMElement $parentElement;
 
-        /**
-         * @readonly
-         * @virtual
-         */
-        public DOMNodeList $childNodes;
+        /** @virtual */
+        public private(set) DOMNodeList $childNodes;
 
-        /**
-         * @readonly
-         * @virtual
-         */
-        public ?DOMNode $firstChild;
+        /** @virtual */
+        public private(set) ?DOMNode $firstChild;
 
-        /**
-         * @readonly
-         * @virtual
-         */
-        public ?DOMNode $lastChild;
+        /** @virtual */
+        public private(set) ?DOMNode $lastChild;
 
-        /**
-         * @readonly
-         * @virtual
-         */
-        public ?DOMNode $previousSibling;
+        /** @virtual */
+        public private(set) ?DOMNode $previousSibling;
 
-        /**
-         * @readonly
-         * @virtual
-         */
-        public ?DOMNode $nextSibling;
+        /** @virtual */
+        public private(set) ?DOMNode $nextSibling;
 
-        /**
-         * @readonly
-         * @virtual
-         */
-        public ?DOMNamedNodeMap $attributes;
+        /** @virtual */
+        public private(set) ?DOMNamedNodeMap $attributes;
 
-        /**
-         * @readonly
-         * @virtual
-         */
-        public bool $isConnected;
+        /** @virtual */
+        public private(set) bool $isConnected;
 
-        /**
-         * @readonly
-         * @virtual
-         */
-        public ?DOMDocument $ownerDocument;
+        /** @virtual */
+        public private(set) ?DOMDocument $ownerDocument;
 
-        /**
-         * @readonly
-         * @virtual
-         */
-        public ?string $namespaceURI;
+        /** @virtual */
+        public private(set) ?string $namespaceURI;
 
         /** @virtual */
         public string $prefix;
 
-        /**
-         * @readonly
-         * @virtual
-         */
-        public ?string $localName;
+        /** @virtual */
+        public private(set) ?string $localName;
 
-        /**
-         * @readonly
-         * @virtual
-         */
-        public ?string $baseURI;
+        /** @virtual */
+        public private(set) ?string $baseURI;
 
         /** @virtual */
         public string $textContent;
@@ -484,65 +421,35 @@ public function __wakeup(): void {}
 
     class DOMNameSpaceNode
     {
-        /**
-         * @readonly
-         * @virtual
-         */
-        public string $nodeName;
+        /** @virtual */
+        public private(set) string $nodeName;
 
-        /**
-         * @readonly
-         * @virtual
-         */
-        public ?string $nodeValue;
+        /** @virtual */
+        public private(set) ?string $nodeValue;
 
-        /**
-         * @readonly
-         * @virtual
-         */
-        public int $nodeType;
+        /** @virtual */
+        public private(set) int $nodeType;
 
-        /**
-         * @readonly
-         * @virtual
-         */
-        public string $prefix;
+        /** @virtual */
+        public private(set) string $prefix;
 
-        /**
-         * @readonly
-         * @virtual
-         */
-        public ?string $localName;
+        /** @virtual */
+        public private(set) ?string $localName;
 
-        /**
-         * @readonly
-         * @virtual
-         */
-        public ?string $namespaceURI;
+        /** @virtual */
+        public private(set) ?string $namespaceURI;
 
-        /**
-         * @readonly
-         * @virtual
-         */
-        public bool $isConnected;
+        /** @virtual */
+        public private(set) bool $isConnected;
 
-        /**
-         * @readonly
-         * @virtual
-         */
-        public ?DOMDocument $ownerDocument;
+        /** @virtual */
+        public private(set) ?DOMDocument $ownerDocument;
 
-        /**
-         * @readonly
-         * @virtual
-         */
-        public ?DOMNode $parentNode;
+        /** @virtual */
+        public private(set) ?DOMNode $parentNode;
 
-        /**
-         * @readonly
-         * @virtual
-         */
-        public ?DOMElement $parentElement;
+        /** @virtual */
+        public private(set) ?DOMElement $parentElement;
 
         /** @implementation-alias DOMNode::__sleep */
         public function __sleep(): array {}
@@ -565,23 +472,14 @@ public function createDocument(?string $namespace = null, string $qualifiedName
 
     class DOMDocumentFragment extends DOMNode implements DOMParentNode
     {
-        /**
-         * @readonly
-         * @virtual
-         */
-        public ?DOMElement $firstElementChild;
+        /** @virtual */
+        public private(set) ?DOMElement $firstElementChild;
 
-        /**
-         * @readonly
-         * @virtual
-         */
-        public ?DOMElement $lastElementChild;
+        /** @virtual */
+        public private(set) ?DOMElement $lastElementChild;
 
-        /**
-         * @readonly
-         * @virtual
-         */
-        public int $childElementCount;
+        /** @virtual */
+        public private(set) int $childElementCount;
 
         public function __construct() {}
 
@@ -609,11 +507,8 @@ public function replaceChildren(...$nodes): void {}
 
     class DOMNodeList implements IteratorAggregate, Countable
     {
-        /**
-         * @readonly
-         * @virtual
-         */
-        public int $length;
+        /** @virtual */
+        public private(set) int $length;
 
         /** @tentative-return-type */
         public function count(): int {}
@@ -629,23 +524,14 @@ class DOMCharacterData extends DOMNode implements DOMChildNode
         /** @virtual */
         public string $data;
 
-        /**
-         * @readonly
-         * @virtual
-         */
-        public int $length;
+        /** @virtual */
+        public private(set) int $length;
 
-        /**
-         * @readonly
-         * @virtual
-         */
-        public ?DOMElement $previousElementSibling;
+        /** @virtual */
+        public private(set) ?DOMElement $previousElementSibling;
 
-        /**
-         * @readonly
-         * @virtual
-         */
-        public ?DOMElement $nextElementSibling;
+        /** @virtual */
+        public private(set) ?DOMElement $nextElementSibling;
 
         /** @tentative-return-type */
         public function appendData(string $data): true {}
@@ -686,32 +572,20 @@ public function after(...$nodes): void {}
 
     class DOMAttr extends DOMNode
     {
-        /**
-         * @readonly
-         * @virtual
-         */
-        public string $name;
+        /** @virtual */
+        public private(set) string $name;
 
-        /**
-         * @readonly
-         * @virtual
-         */
-        public bool $specified;
+        /** @virtual */
+        public private(set) bool $specified;
 
         /** @virtual */
         public string $value;
 
-        /**
-         * @readonly
-         * @virtual
-         */
-        public ?DOMElement $ownerElement;
+        /** @virtual */
+        public private(set) ?DOMElement $ownerElement;
 
-        /**
-         * @readonly
-         * @virtual
-         */
-        public mixed $schemaTypeInfo;
+        /** @virtual */
+        public private(set) mixed $schemaTypeInfo;
 
         public function __construct(string $name, string $value = "") {}
 
@@ -721,11 +595,8 @@ public function isId(): bool {}
 
     class DOMElement extends DOMNode implements \DOMParentNode, \DOMChildNode
     {
-        /**
-         * @readonly
-         * @virtual
-         */
-        public string $tagName;
+        /** @virtual */
+        public private(set) string $tagName;
 
         /** @virtual */
         public string $className;
@@ -733,41 +604,23 @@ class DOMElement extends DOMNode implements \DOMParentNode, \DOMChildNode
         /** @virtual */
         public string $id;
 
-        /**
-         * @readonly
-         * @virtual
-         */
-        public mixed $schemaTypeInfo;
+        /** @virtual */
+        public private(set) mixed $schemaTypeInfo;
 
-        /**
-         * @readonly
-         * @virtual
-         */
-        public ?DOMElement $firstElementChild;
+        /** @virtual */
+        public private(set) ?DOMElement $firstElementChild;
 
-        /**
-         * @readonly
-         * @virtual
-         */
-        public ?DOMElement $lastElementChild;
+        /** @virtual */
+        public private(set) ?DOMElement $lastElementChild;
 
-        /**
-         * @readonly
-         * @virtual
-         */
-        public int $childElementCount;
+        /** @virtual */
+        public private(set) int $childElementCount;
 
-        /**
-         * @readonly
-         * @virtual
-         */
-        public ?DOMElement $previousElementSibling;
+        /** @virtual */
+        public private(set) ?DOMElement $previousElementSibling;
 
-        /**
-         * @readonly
-         * @virtual
-         */
-        public ?DOMElement $nextElementSibling;
+        /** @virtual */
+        public private(set) ?DOMElement $nextElementSibling;
 
         public function __construct(string $qualifiedName, ?string $value = null, string $namespace = "") {}
 
@@ -856,39 +709,26 @@ public function insertAdjacentText(string $where, string $data): void {}
 
     class DOMDocument extends DOMNode implements DOMParentNode
     {
-        /**
-         * @readonly
-         * @virtual
-         */
-        public ?DOMDocumentType $doctype;
+        /** @virtual */
+        public private(set) ?DOMDocumentType $doctype;
 
-        /**
-         * @readonly
-         * @virtual
-         */
-        public DOMImplementation $implementation;
+        /** @virtual */
+        public private(set) DOMImplementation $implementation;
 
-        /**
-         * @readonly
-         * @virtual
-         */
-        public ?DOMElement $documentElement;
+        /** @virtual */
+        public private(set) ?DOMElement $documentElement;
 
         /**
-         * @readonly
          * @deprecated
          * @virtual
          */
-        public ?string $actualEncoding;
+        public private(set) ?string $actualEncoding;
 
         /** @virtual */
         public ?string $encoding;
 
-        /**
-         * @readonly
-         * @virtual
-         */
-        public ?string $xmlEncoding;
+        /** @virtual */
+        public private(set) ?string $xmlEncoding;
 
         /** @virtual */
         public bool $standalone;
@@ -909,11 +749,10 @@ class DOMDocument extends DOMNode implements DOMParentNode
         public ?string $documentURI;
 
         /**
-         * @readonly
          * @deprecated
          * @virtual
          */
-        public mixed $config;
+        public private(set) mixed $config;
 
         /** @virtual */
         public bool $formatOutput;
@@ -933,23 +772,14 @@ class DOMDocument extends DOMNode implements DOMParentNode
         /** @virtual */
         public bool $substituteEntities;
 
-        /**
-         * @readonly
-         * @virtual
-         */
-        public ?DOMElement $firstElementChild;
+        /** @virtual */
+        public private(set) ?DOMElement $firstElementChild;
 
-        /**
-         * @readonly
-         * @virtual
-         */
-        public ?DOMElement $lastElementChild;
+        /** @virtual */
+        public private(set) ?DOMElement $lastElementChild;
 
-        /**
-         * @readonly
-         * @virtual
-         */
-        public int $childElementCount;
+        /** @virtual */
+        public private(set) int $childElementCount;
 
         public function __construct(string $version = "1.0", string $encoding = "") {}
 
@@ -1082,11 +912,8 @@ final class DOMException extends Exception
 
     class DOMText extends DOMCharacterData
     {
-        /**
-         * @readonly
-         * @virtual
-         */
-        public string $wholeText;
+        /** @virtual */
+        public private(set) string $wholeText;
 
         public function __construct(string $data = "") {}
 
@@ -1105,11 +932,8 @@ public function splitText(int $offset) {}
 
     class DOMNamedNodeMap implements IteratorAggregate, Countable
     {
-        /**
-         * @readonly
-         * @virtual
-         */
-        public int $length;
+        /** @virtual */
+        public private(set) int $length;
 
         /** @tentative-return-type */
         public function getNamedItem(string $qualifiedName): ?DOMNode {}
@@ -1128,44 +952,32 @@ public function getIterator(): Iterator {}
 
     class DOMEntity extends DOMNode
     {
-        /**
-         * @readonly
-         * @virtual
-         */
-        public ?string $publicId;
+        /** @virtual */
+        public private(set) ?string $publicId;
 
-        /**
-         * @readonly
-         * @virtual
-         */
-        public ?string $systemId;
+        /** @virtual */
+        public private(set) ?string $systemId;
 
-        /**
-         * @readonly
-         * @virtual
-         */
-        public ?string $notationName;
+        /** @virtual */
+        public private(set) ?string $notationName;
 
         /**
-         * @readonly
          * @deprecated
          * @virtual
          */
-        public ?string $actualEncoding;
+        public private(set) ?string $actualEncoding;
 
         /**
-         * @readonly
          * @deprecated
          * @virtual
          */
-        public ?string $encoding;
+        public private(set) ?string $encoding;
 
         /**
-         * @readonly
          * @deprecated
          * @virtual
          */
-        public ?string $version;
+        public private(set) ?string $version;
     }
 
     class DOMEntityReference extends DOMNode
@@ -1175,26 +987,17 @@ public function __construct(string $name) {}
 
     class DOMNotation extends DOMNode
     {
-        /**
-         * @readonly
-         * @virtual
-         */
-        public string $publicId;
+        /** @virtual */
+        public private(set) string $publicId;
 
-        /**
-         * @readonly
-         * @virtual
-         */
-        public string $systemId;
+        /** @virtual */
+        public private(set) string $systemId;
     }
 
     class DOMProcessingInstruction extends DOMNode
-    {
-        /**
-         * @readonly
-         * @virtual
-         */
-        public string $target;
+    {
+        /** @virtual */
+        public private(set) string $target;
 
         /** @virtual */
         public string $data;
@@ -1206,11 +1009,8 @@ public function __construct(string $name, string $value = "") {}
     /** @not-serializable */
     class DOMXPath
     {
-        /**
-         * @readonly
-         * @virtual
-         */
-        public DOMDocument $document;
+        /** @virtual */
+        public private(set) DOMDocument $document;
 
         /** @virtual */
         public bool $registerNodeNamespaces;
@@ -1358,73 +1158,37 @@ class Node
     {
         private final function __construct() {}
 
-        /**
-         * @readonly
-         * @virtual
-         */
-        public int $nodeType;
-        /**
-         * @readonly
-         * @virtual
-         */
-        public string $nodeName;
+        /** @virtual */
+        public private(set) int $nodeType;
+        /** @virtual */
+        public private(set) string $nodeName;
 
-        /**
-         * @readonly
-         * @virtual
-         */
-        public string $baseURI;
+        /** @virtual */
+        public private(set) string $baseURI;
 
-        /**
-         * @readonly
-         * @virtual
-         */
-        public bool $isConnected;
-        /**
-         * @readonly
-         * @virtual
-         */
-        public ?Document $ownerDocument;
+        /** @virtual */
+        public private(set) bool $isConnected;
+        /** @virtual */
+        public private(set) ?Document $ownerDocument;
 
         /** @implementation-alias DOMNode::getRootNode */
         public function getRootNode(array $options = []): Node {}
-        /**
-         * @readonly
-         * @virtual
-         */
-        public ?Node $parentNode;
-        /**
-         * @readonly
-         * @virtual
-         */
-        public ?Element $parentElement;
+        /** @virtual */
+        public private(set) ?Node $parentNode;
+        /** @virtual */
+        public private(set) ?Element $parentElement;
         /** @implementation-alias DOMNode::hasChildNodes */
         public function hasChildNodes(): bool {}
-        /**
-         * @readonly
-         * @virtual
-         */
-        public NodeList $childNodes;
-        /**
-         * @readonly
-         * @virtual
-         */
-        public ?Node $firstChild;
-        /**
-         * @readonly
-         * @virtual
-         */
-        public ?Node $lastChild;
-        /**
-         * @readonly
-         * @virtual
-         */
-        public ?Node $previousSibling;
-        /**
-         * @readonly
-         * @virtual
-         */
-        public ?Node $nextSibling;
+        /** @virtual */
+        public private(set) NodeList $childNodes;
+        /** @virtual */
+        public private(set) ?Node $firstChild;
+        /** @virtual */
+        public private(set) ?Node $lastChild;
+        /** @virtual */
+        public private(set) ?Node $previousSibling;
+        /** @virtual */
+        public private(set) ?Node $nextSibling;
 
         /** @virtual */
         public ?string $nodeValue;
@@ -1474,11 +1238,8 @@ public function __wakeup(): void {}
 
     class NodeList implements \IteratorAggregate, \Countable
     {
-        /**
-         * @readonly
-         * @virtual
-         */
-        public int $length;
+        /** @virtual */
+        public private(set) int $length;
 
         /** @implementation-alias DOMNodeList::count */
         public function count(): int {}
@@ -1492,11 +1253,8 @@ public function item(int $index): ?Node {}
 
     class NamedNodeMap implements \IteratorAggregate, \Countable
     {
-        /**
-         * @readonly
-         * @virtual
-         */
-        public int $length;
+        /** @virtual */
+        public private(set) int $length;
 
         /** @implementation-alias DOMNamedNodeMap::item */
         public function item(int $index): ?Attr {}
@@ -1514,11 +1272,8 @@ public function getIterator(): \Iterator {}
 
     class DtdNamedNodeMap implements \IteratorAggregate, \Countable
     {
-        /**
-         * @readonly
-         * @virtual
-         */
-        public int $length;
+        /** @virtual */
+        public private(set) int $length;
 
         /** @implementation-alias DOMNamedNodeMap::item */
         public function item(int $index): Entity|Notation|null {}
@@ -1536,11 +1291,8 @@ public function getIterator(): \Iterator {}
 
     class HTMLCollection implements \IteratorAggregate, \Countable
     {
-        /**
-         * @readonly
-         * @virtual
-         */
-        public int $length;
+        /** @virtual */
+        public private(set) int $length;
 
         /** @implementation-alias DOMNodeList::item */
         public function item(int $index): ?Element {}
@@ -1564,71 +1316,37 @@ enum AdjacentPosition : string
 
     class Element extends Node implements ParentNode, ChildNode
     {
-        /**
-         * @readonly
-         * @virtual
-         */
-        public ?string $namespaceURI;
-        /**
-         * @readonly
-         * @virtual
-         */
-        public ?string $prefix;
-        /**
-         * @readonly
-         * @virtual
-         */
-        public string $localName;
-        /**
-         * @readonly
-         * @virtual
-         */
-        public string $tagName;
+        /** @virtual */
+        public private(set) ?string $namespaceURI;
+        /** @virtual */
+        public private(set) ?string $prefix;
+        /** @virtual */
+        public private(set) string $localName;
+        /** @virtual */
+        public private(set) string $tagName;
 
-        /**
-         * @readonly
-         */
-        public HTMLCollection $children;
-        /**
-         * @readonly
-         * @virtual
-         */
-        public ?Element $firstElementChild;
-        /**
-         * @readonly
-         * @virtual
-         */
-        public ?Element $lastElementChild;
-        /**
-         * @readonly
-         * @virtual
-         */
-        public int $childElementCount;
-        /**
-         * @readonly
-         * @virtual
-         */
-        public ?Element $previousElementSibling;
-        /**
-         * @readonly
-         * @virtual
-         */
-        public ?Element $nextElementSibling;
+        public private(set) HTMLCollection $children;
+        /** @virtual */
+        public private(set) ?Element $firstElementChild;
+        /** @virtual */
+        public private(set) ?Element $lastElementChild;
+        /** @virtual */
+        public private(set) int $childElementCount;
+        /** @virtual */
+        public private(set) ?Element $previousElementSibling;
+        /** @virtual */
+        public private(set) ?Element $nextElementSibling;
 
         /** @virtual */
         public string $id;
         /** @virtual */
         public string $className;
-        /** @readonly */
-        public TokenList $classList;
+        public private(set) TokenList $classList;
 
         /** @implementation-alias DOMNode::hasAttributes */
         public function hasAttributes(): bool {}
-        /**
-         * @readonly
-         * @virtual
-         */
-        public NamedNodeMap $attributes;
+        /** @virtual */
+        public private(set) NamedNodeMap $attributes;
         /** @implementation-alias DOMElement::getAttributeNames */
         public function getAttributeNames(): array {}
         /** @implementation-alias DOMElement::getAttribute */
@@ -1716,40 +1434,22 @@ class HTMLElement extends Element
 
     class Attr extends Node
     {
-        /**
-         * @readonly
-         * @virtual
-         */
-        public ?string $namespaceURI;
-        /**
-         * @readonly
-         * @virtual
-         */
-        public ?string $prefix;
-        /**
-         * @readonly
-         * @virtual
-         */
-        public string $localName;
-        /**
-         * @readonly
-         * @virtual
-         */
-        public string $name;
+        /** @virtual */
+        public private(set) ?string $namespaceURI;
+        /** @virtual */
+        public private(set) ?string $prefix;
+        /** @virtual */
+        public private(set) string $localName;
+        /** @virtual */
+        public private(set) string $name;
         /** @virtual */
         public string $value;
 
-        /**
-         * @readonly
-         * @virtual
-         */
-        public ?Element $ownerElement;
+        /** @virtual */
+        public private(set) ?Element $ownerElement;
 
-        /**
-         * @readonly
-         * @virtual
-         */
-        public bool $specified;
+        /** @virtual */
+        public private(set) bool $specified;
 
         /** @implementation-alias DOMAttr::isId */
         public function isId(): bool {}
@@ -1760,24 +1460,15 @@ public function rename(?string $namespaceURI, string $qualifiedName): void {}
 
     class CharacterData extends Node implements ChildNode
     {
-        /**
-         * @readonly
-         * @virtual
-         */
-        public ?Element $previousElementSibling;
-        /**
-         * @readonly
-         * @virtual
-         */
-        public ?Element $nextElementSibling;
+        /** @virtual */
+        public private(set) ?Element $previousElementSibling;
+        /** @virtual */
+        public private(set) ?Element $nextElementSibling;
 
         /** @virtual */
         public string $data;
-        /**
-         * @readonly
-         * @virtual
-         */
-        public int $length;
+        /** @virtual */
+        public private(set) int $length;
         /** @implementation-alias DOMCharacterData::substringData */
         public function substringData(int $offset, int $count): string {}
         public function appendData(string $data): void {}
@@ -1801,22 +1492,16 @@ class Text extends CharacterData
 
         /** @implementation-alias DOMText::splitText */
         public function splitText(int $offset): Text {}
-        /**
-         * @readonly
-         * @virtual
-         */
-        public string $wholeText;
+        /** @virtual */
+        public private(set) string $wholeText;
     }
 
     class CDATASection extends Text {}
 
     class ProcessingInstruction extends CharacterData
     {
-        /**
-         * @readonly
-         * @virtual
-         */
-        public string $target;
+        /** @virtual */
+        public private(set) string $target;
     }
 
     class Comment extends CharacterData
@@ -1826,36 +1511,18 @@ class Comment extends CharacterData
 
     class DocumentType extends Node implements ChildNode
     {
-        /**
-         * @readonly
-         * @virtual
-         */
-        public string $name;
-        /**
-         * @readonly
-         * @virtual
-         */
-        public DtdNamedNodeMap $entities;
-        /**
-         * @readonly
-         * @virtual
-         */
-        public DtdNamedNodeMap $notations;
-        /**
-         * @readonly
-         * @virtual
-         */
-        public string $publicId;
-        /**
-         * @readonly
-         * @virtual
-         */
-        public string $systemId;
-        /**
-         * @readonly
-         * @virtual
-         */
-        public ?string $internalSubset;
+        /** @virtual */
+        public private(set) string $name;
+        /** @virtual */
+        public private(set) DtdNamedNodeMap $entities;
+        /** @virtual */
+        public private(set) DtdNamedNodeMap $notations;
+        /** @virtual */
+        public private(set) string $publicId;
+        /** @virtual */
+        public private(set) string $systemId;
+        /** @virtual */
+        public private(set) ?string $internalSubset;
 
         /** @implementation-alias DOMElement::remove */
         public function remove(): void {}
@@ -1869,25 +1536,13 @@ public function replaceWith(Node|string ...$nodes): void {}
 
     class DocumentFragment extends Node implements ParentNode
     {
-        /**
-         * @readonly
-         */
-        public HTMLCollection $children;
-        /**
-         * @readonly
-         * @virtual
-         */
-        public ?Element $firstElementChild;
-        /**
-         * @readonly
-         * @virtual
-         */
-        public ?Element $lastElementChild;
-        /**
-         * @readonly
-         * @virtual
-         */
-        public int $childElementCount;
+        public private(set) HTMLCollection $children;
+        /** @virtual */
+        public private(set) ?Element $firstElementChild;
+        /** @virtual */
+        public private(set) ?Element $lastElementChild;
+        /** @virtual */
+        public private(set) int $childElementCount;
 
         /** @implementation-alias DOMDocumentFragment::appendXML */
         public function appendXml(string $data): bool {}
@@ -1906,63 +1561,35 @@ public function querySelectorAll(string $selectors): NodeList {}
 
     class Entity extends Node
     {
-        /**
-         * @readonly
-         * @virtual
-         */
-        public ?string $publicId;
-        /**
-         * @readonly
-         * @virtual
-         */
-        public ?string $systemId;
-        /**
-         * @readonly
-         * @virtual
-         */
-        public ?string $notationName;
+        /** @virtual */
+        public private(set) ?string $publicId;
+        /** @virtual */
+        public private(set) ?string $systemId;
+        /** @virtual */
+        public private(set) ?string $notationName;
     }
 
     class EntityReference extends Node {}
 
     class Notation extends Node
     {
-        /**
-         * @readonly
-         * @virtual
-         */
-        public string $publicId;
-        /**
-         * @readonly
-         * @virtual
-         */
-        public string $systemId;
+        /** @virtual */
+        public private(set) string $publicId;
+        /** @virtual */
+        public private(set) string $systemId;
     }
 
     abstract class Document extends Node implements ParentNode
     {
-        /**
-         * @readonly
-         */
-        public HTMLCollection $children;
-        /**
-         * @readonly
-         * @virtual
-         */
-        public ?Element $firstElementChild;
-        /**
-         * @readonly
-         * @virtual
-         */
-        public ?Element $lastElementChild;
-        /**
-         * @readonly
-         * @virtual
-         */
-        public int $childElementCount;
+        public private(set) HTMLCollection $children;
+        /** @virtual */
+        public private(set) ?Element $firstElementChild;
+        /** @virtual */
+        public private(set) ?Element $lastElementChild;
+        /** @virtual */
+        public private(set) int $childElementCount;
 
-        /** @readonly */
-        public Implementation $implementation;
+        public private(set) Implementation $implementation;
         /** @virtual */
         public string $URL;
         /** @virtual */
@@ -1974,16 +1601,10 @@ abstract class Document extends Node implements ParentNode
         /** @virtual */
         public string $inputEncoding;
 
-        /**
-         * @readonly
-         * @virtual
-         */
-        public ?DocumentType $doctype;
-        /**
-         * @readonly
-         * @virtual
-         */
-        public ?Element $documentElement;
+        /** @virtual */
+        public private(set) ?DocumentType $doctype;
+        /** @virtual */
+        public private(set) ?Element $documentElement;
         /** @implementation-alias Dom\Element::getElementsByTagName */
         public function getElementsByTagName(string $qualifiedName): HTMLCollection {}
         /** @implementation-alias Dom\Element::getElementsByTagNameNS */
@@ -2043,11 +1664,8 @@ public function querySelectorAll(string $selectors): NodeList {}
 
         /** @virtual */
         public ?HTMLElement $body;
-        /**
-         * @readonly
-         * @virtual
-         */
-        public ?HTMLElement $head;
+        /** @virtual */
+        public private(set) ?HTMLElement $head;
         /** @virtual */
         public string $title;
     }
@@ -2083,11 +1701,8 @@ public static function createFromFile(string $path, int $options = 0, ?string $o
 
         public static function createFromString(string $source, int $options = 0, ?string $overrideEncoding = null): XMLDocument {}
 
-        /**
-         * @readonly
-         * @virtual
-         */
-        public string $xmlEncoding;
+        /** @virtual */
+        public private(set) string $xmlEncoding;
 
         /** @virtual */
         public bool $xmlStandalone;
@@ -2121,11 +1736,8 @@ final class TokenList implements \IteratorAggregate, \Countable
         /** @implementation-alias Dom\Node::__construct */
         private function __construct() {}
 
-        /**
-         * @readonly
-         * @virtual
-         */
-        public int $length;
+        /** @virtual */
+        public private(set) int $length;
         public function item(int $index): ?string {}
         public function contains(string $token): bool {}
         public function add(string ...$tokens): void {}
@@ -2159,11 +1771,8 @@ private function __construct() {}
     /** @not-serializable */
     final class XPath
     {
-        /**
-         * @readonly
-         * @virtual
-         */
-        public Document $document;
+        /** @virtual */
+        public private(set) Document $document;
 
         /** @virtual */
         public bool $registerNodeNamespaces;
diff --git a/ext/dom/php_dom_arginfo.h b/ext/dom/php_dom_arginfo.h
index 1c90f920cdd8..0274186380dc 100644
--- a/ext/dom/php_dom_arginfo.h
+++ b/ext/dom/php_dom_arginfo.h
@@ -1,5 +1,5 @@
 /* This is a generated file, edit php_dom.stub.php instead.
- * Stub hash: e00668999f4fe9afee1f78f6986467a315f831a5
+ * Stub hash: 8d7713834c924709155ed7acc554c9efc55e96c1
  * Has decl header: yes */
 
 ZEND_BEGIN_ARG_WITH_RETURN_OBJ_TYPE_MASK_EX(arginfo_dom_import_simplexml, 0, 1, DOMAttr|DOMElement, 0)
@@ -1887,38 +1887,38 @@ static zend_class_entry *register_class_DOMDocumentType(zend_class_entry *class_
 
 	zval property_name_default_value;
 	ZVAL_UNDEF(&property_name_default_value);
-	zend_declare_typed_property(class_entry, ZSTR_KNOWN(ZEND_STR_NAME), &property_name_default_value, ZEND_ACC_PUBLIC|ZEND_ACC_VIRTUAL, NULL, (zend_type) ZEND_TYPE_INIT_MASK(MAY_BE_STRING));
+	zend_declare_typed_property(class_entry, ZSTR_KNOWN(ZEND_STR_NAME), &property_name_default_value, ZEND_ACC_PUBLIC|ZEND_ACC_PRIVATE_SET|ZEND_ACC_VIRTUAL, NULL, (zend_type) ZEND_TYPE_INIT_MASK(MAY_BE_STRING));
 
 	zval property_entities_default_value;
 	ZVAL_UNDEF(&property_entities_default_value);
 	zend_string *property_entities_name = zend_string_init("entities", sizeof("entities") - 1, true);
 	zend_string *property_entities_class_DOMNamedNodeMap = zend_string_init("DOMNamedNodeMap", sizeof("DOMNamedNodeMap")-1, 1);
-	zend_declare_typed_property(class_entry, property_entities_name, &property_entities_default_value, ZEND_ACC_PUBLIC|ZEND_ACC_VIRTUAL, NULL, (zend_type) ZEND_TYPE_INIT_CLASS(property_entities_class_DOMNamedNodeMap, 0, 0));
+	zend_declare_typed_property(class_entry, property_entities_name, &property_entities_default_value, ZEND_ACC_PUBLIC|ZEND_ACC_PRIVATE_SET|ZEND_ACC_VIRTUAL, NULL, (zend_type) ZEND_TYPE_INIT_CLASS(property_entities_class_DOMNamedNodeMap, 0, 0));
 	zend_string_release_ex(property_entities_name, true);
 
 	zval property_notations_default_value;
 	ZVAL_UNDEF(&property_notations_default_value);
 	zend_string *property_notations_name = zend_string_init("notations", sizeof("notations") - 1, true);
 	zend_string *property_notations_class_DOMNamedNodeMap = zend_string_init("DOMNamedNodeMap", sizeof("DOMNamedNodeMap")-1, 1);
-	zend_declare_typed_property(class_entry, property_notations_name, &property_notations_default_value, ZEND_ACC_PUBLIC|ZEND_ACC_VIRTUAL, NULL, (zend_type) ZEND_TYPE_INIT_CLASS(property_notations_class_DOMNamedNodeMap, 0, 0));
+	zend_declare_typed_property(class_entry, property_notations_name, &property_notations_default_value, ZEND_ACC_PUBLIC|ZEND_ACC_PRIVATE_SET|ZEND_ACC_VIRTUAL, NULL, (zend_type) ZEND_TYPE_INIT_CLASS(property_notations_class_DOMNamedNodeMap, 0, 0));
 	zend_string_release_ex(property_notations_name, true);
 
 	zval property_publicId_default_value;
 	ZVAL_UNDEF(&property_publicId_default_value);
 	zend_string *property_publicId_name = zend_string_init("publicId", sizeof("publicId") - 1, true);
-	zend_declare_typed_property(class_entry, property_publicId_name, &property_publicId_default_value, ZEND_ACC_PUBLIC|ZEND_ACC_VIRTUAL, NULL, (zend_type) ZEND_TYPE_INIT_MASK(MAY_BE_STRING));
+	zend_declare_typed_property(class_entry, property_publicId_name, &property_publicId_default_value, ZEND_ACC_PUBLIC|ZEND_ACC_PRIVATE_SET|ZEND_ACC_VIRTUAL, NULL, (zend_type) ZEND_TYPE_INIT_MASK(MAY_BE_STRING));
 	zend_string_release_ex(property_publicId_name, true);
 
 	zval property_systemId_default_value;
 	ZVAL_UNDEF(&property_systemId_default_value);
 	zend_string *property_systemId_name = zend_string_init("systemId", sizeof("systemId") - 1, true);
-	zend_declare_typed_property(class_entry, property_systemId_name, &property_systemId_default_value, ZEND_ACC_PUBLIC|ZEND_ACC_VIRTUAL, NULL, (zend_type) ZEND_TYPE_INIT_MASK(MAY_BE_STRING));
+	zend_declare_typed_property(class_entry, property_systemId_name, &property_systemId_default_value, ZEND_ACC_PUBLIC|ZEND_ACC_PRIVATE_SET|ZEND_ACC_VIRTUAL, NULL, (zend_type) ZEND_TYPE_INIT_MASK(MAY_BE_STRING));
 	zend_string_release_ex(property_systemId_name, true);
 
 	zval property_internalSubset_default_value;
 	ZVAL_UNDEF(&property_internalSubset_default_value);
 	zend_string *property_internalSubset_name = zend_string_init("internalSubset", sizeof("internalSubset") - 1, true);
-	zend_declare_typed_property(class_entry, property_internalSubset_name, &property_internalSubset_default_value, ZEND_ACC_PUBLIC|ZEND_ACC_VIRTUAL, NULL, (zend_type) ZEND_TYPE_INIT_MASK(MAY_BE_STRING|MAY_BE_NULL));
+	zend_declare_typed_property(class_entry, property_internalSubset_name, &property_internalSubset_default_value, ZEND_ACC_PUBLIC|ZEND_ACC_PRIVATE_SET|ZEND_ACC_VIRTUAL, NULL, (zend_type) ZEND_TYPE_INIT_MASK(MAY_BE_STRING|MAY_BE_NULL));
 	zend_string_release_ex(property_internalSubset_name, true);
 
 	return class_entry;
@@ -2010,7 +2010,7 @@ static zend_class_entry *register_class_DOMNode(void)
 	zval property_nodeName_default_value;
 	ZVAL_UNDEF(&property_nodeName_default_value);
 	zend_string *property_nodeName_name = zend_string_init("nodeName", sizeof("nodeName") - 1, true);
-	zend_declare_typed_property(class_entry, property_nodeName_name, &property_nodeName_default_value, ZEND_ACC_PUBLIC|ZEND_ACC_VIRTUAL, NULL, (zend_type) ZEND_TYPE_INIT_MASK(MAY_BE_STRING));
+	zend_declare_typed_property(class_entry, property_nodeName_name, &property_nodeName_default_value, ZEND_ACC_PUBLIC|ZEND_ACC_PRIVATE_SET|ZEND_ACC_VIRTUAL, NULL, (zend_type) ZEND_TYPE_INIT_MASK(MAY_BE_STRING));
 	zend_string_release_ex(property_nodeName_name, true);
 
 	zval property_nodeValue_default_value;
@@ -2022,82 +2022,82 @@ static zend_class_entry *register_class_DOMNode(void)
 	zval property_nodeType_default_value;
 	ZVAL_UNDEF(&property_nodeType_default_value);
 	zend_string *property_nodeType_name = zend_string_init("nodeType", sizeof("nodeType") - 1, true);
-	zend_declare_typed_property(class_entry, property_nodeType_name, &property_nodeType_default_value, ZEND_ACC_PUBLIC|ZEND_ACC_VIRTUAL, NULL, (zend_type) ZEND_TYPE_INIT_MASK(MAY_BE_LONG));
+	zend_declare_typed_property(class_entry, property_nodeType_name, &property_nodeType_default_value, ZEND_ACC_PUBLIC|ZEND_ACC_PRIVATE_SET|ZEND_ACC_VIRTUAL, NULL, (zend_type) ZEND_TYPE_INIT_MASK(MAY_BE_LONG));
 	zend_string_release_ex(property_nodeType_name, true);
 
 	zval property_parentNode_default_value;
 	ZVAL_UNDEF(&property_parentNode_default_value);
 	zend_string *property_parentNode_name = zend_string_init("parentNode", sizeof("parentNode") - 1, true);
 	zend_string *property_parentNode_class_DOMNode = zend_string_init("DOMNode", sizeof("DOMNode")-1, 1);
-	zend_declare_typed_property(class_entry, property_parentNode_name, &property_parentNode_default_value, ZEND_ACC_PUBLIC|ZEND_ACC_VIRTUAL, NULL, (zend_type) ZEND_TYPE_INIT_CLASS(property_parentNode_class_DOMNode, 0, MAY_BE_NULL));
+	zend_declare_typed_property(class_entry, property_parentNode_name, &property_parentNode_default_value, ZEND_ACC_PUBLIC|ZEND_ACC_PRIVATE_SET|ZEND_ACC_VIRTUAL, NULL, (zend_type) ZEND_TYPE_INIT_CLASS(property_parentNode_class_DOMNode, 0, MAY_BE_NULL));
 	zend_string_release_ex(property_parentNode_name, true);
 
 	zval property_parentElement_default_value;
 	ZVAL_UNDEF(&property_parentElement_default_value);
 	zend_string *property_parentElement_name = zend_string_init("parentElement", sizeof("parentElement") - 1, true);
 	zend_string *property_parentElement_class_DOMElement = zend_string_init("DOMElement", sizeof("DOMElement")-1, 1);
-	zend_declare_typed_property(class_entry, property_parentElement_name, &property_parentElement_default_value, ZEND_ACC_PUBLIC|ZEND_ACC_VIRTUAL, NULL, (zend_type) ZEND_TYPE_INIT_CLASS(property_parentElement_class_DOMElement, 0, MAY_BE_NULL));
+	zend_declare_typed_property(class_entry, property_parentElement_name, &property_parentElement_default_value, ZEND_ACC_PUBLIC|ZEND_ACC_PRIVATE_SET|ZEND_ACC_VIRTUAL, NULL, (zend_type) ZEND_TYPE_INIT_CLASS(property_parentElement_class_DOMElement, 0, MAY_BE_NULL));
 	zend_string_release_ex(property_parentElement_name, true);
 
 	zval property_childNodes_default_value;
 	ZVAL_UNDEF(&property_childNodes_default_value);
 	zend_string *property_childNodes_name = zend_string_init("childNodes", sizeof("childNodes") - 1, true);
 	zend_string *property_childNodes_class_DOMNodeList = zend_string_init("DOMNodeList", sizeof("DOMNodeList")-1, 1);
-	zend_declare_typed_property(class_entry, property_childNodes_name, &property_childNodes_default_value, ZEND_ACC_PUBLIC|ZEND_ACC_VIRTUAL, NULL, (zend_type) ZEND_TYPE_INIT_CLASS(property_childNodes_class_DOMNodeList, 0, 0));
+	zend_declare_typed_property(class_entry, property_childNodes_name, &property_childNodes_default_value, ZEND_ACC_PUBLIC|ZEND_ACC_PRIVATE_SET|ZEND_ACC_VIRTUAL, NULL, (zend_type) ZEND_TYPE_INIT_CLASS(property_childNodes_class_DOMNodeList, 0, 0));
 	zend_string_release_ex(property_childNodes_name, true);
 
 	zval property_firstChild_default_value;
 	ZVAL_UNDEF(&property_firstChild_default_value);
 	zend_string *property_firstChild_name = zend_string_init("firstChild", sizeof("firstChild") - 1, true);
 	zend_string *property_firstChild_class_DOMNode = zend_string_init("DOMNode", sizeof("DOMNode")-1, 1);
-	zend_declare_typed_property(class_entry, property_firstChild_name, &property_firstChild_default_value, ZEND_ACC_PUBLIC|ZEND_ACC_VIRTUAL, NULL, (zend_type) ZEND_TYPE_INIT_CLASS(property_firstChild_class_DOMNode, 0, MAY_BE_NULL));
+	zend_declare_typed_property(class_entry, property_firstChild_name, &property_firstChild_default_value, ZEND_ACC_PUBLIC|ZEND_ACC_PRIVATE_SET|ZEND_ACC_VIRTUAL, NULL, (zend_type) ZEND_TYPE_INIT_CLASS(property_firstChild_class_DOMNode, 0, MAY_BE_NULL));
 	zend_string_release_ex(property_firstChild_name, true);
 
 	zval property_lastChild_default_value;
 	ZVAL_UNDEF(&property_lastChild_default_value);
 	zend_string *property_lastChild_name = zend_string_init("lastChild", sizeof("lastChild") - 1, true);
 	zend_string *property_lastChild_class_DOMNode = zend_string_init("DOMNode", sizeof("DOMNode")-1, 1);
-	zend_declare_typed_property(class_entry, property_lastChild_name, &property_lastChild_default_value, ZEND_ACC_PUBLIC|ZEND_ACC_VIRTUAL, NULL, (zend_type) ZEND_TYPE_INIT_CLASS(property_lastChild_class_DOMNode, 0, MAY_BE_NULL));
+	zend_declare_typed_property(class_entry, property_lastChild_name, &property_lastChild_default_value, ZEND_ACC_PUBLIC|ZEND_ACC_PRIVATE_SET|ZEND_ACC_VIRTUAL, NULL, (zend_type) ZEND_TYPE_INIT_CLASS(property_lastChild_class_DOMNode, 0, MAY_BE_NULL));
 	zend_string_release_ex(property_lastChild_name, true);
 
 	zval property_previousSibling_default_value;
 	ZVAL_UNDEF(&property_previousSibling_default_value);
 	zend_string *property_previousSibling_name = zend_string_init("previousSibling", sizeof("previousSibling") - 1, true);
 	zend_string *property_previousSibling_class_DOMNode = zend_string_init("DOMNode", sizeof("DOMNode")-1, 1);
-	zend_declare_typed_property(class_entry, property_previousSibling_name, &property_previousSibling_default_value, ZEND_ACC_PUBLIC|ZEND_ACC_VIRTUAL, NULL, (zend_type) ZEND_TYPE_INIT_CLASS(property_previousSibling_class_DOMNode, 0, MAY_BE_NULL));
+	zend_declare_typed_property(class_entry, property_previousSibling_name, &property_previousSibling_default_value, ZEND_ACC_PUBLIC|ZEND_ACC_PRIVATE_SET|ZEND_ACC_VIRTUAL, NULL, (zend_type) ZEND_TYPE_INIT_CLASS(property_previousSibling_class_DOMNode, 0, MAY_BE_NULL));
 	zend_string_release_ex(property_previousSibling_name, true);
 
 	zval property_nextSibling_default_value;
 	ZVAL_UNDEF(&property_nextSibling_default_value);
 	zend_string *property_nextSibling_name = zend_string_init("nextSibling", sizeof("nextSibling") - 1, true);
 	zend_string *property_nextSibling_class_DOMNode = zend_string_init("DOMNode", sizeof("DOMNode")-1, 1);
-	zend_declare_typed_property(class_entry, property_nextSibling_name, &property_nextSibling_default_value, ZEND_ACC_PUBLIC|ZEND_ACC_VIRTUAL, NULL, (zend_type) ZEND_TYPE_INIT_CLASS(property_nextSibling_class_DOMNode, 0, MAY_BE_NULL));
+	zend_declare_typed_property(class_entry, property_nextSibling_name, &property_nextSibling_default_value, ZEND_ACC_PUBLIC|ZEND_ACC_PRIVATE_SET|ZEND_ACC_VIRTUAL, NULL, (zend_type) ZEND_TYPE_INIT_CLASS(property_nextSibling_class_DOMNode, 0, MAY_BE_NULL));
 	zend_string_release_ex(property_nextSibling_name, true);
 
 	zval property_attributes_default_value;
 	ZVAL_UNDEF(&property_attributes_default_value);
 	zend_string *property_attributes_name = zend_string_init("attributes", sizeof("attributes") - 1, true);
 	zend_string *property_attributes_class_DOMNamedNodeMap = zend_string_init("DOMNamedNodeMap", sizeof("DOMNamedNodeMap")-1, 1);
-	zend_declare_typed_property(class_entry, property_attributes_name, &property_attributes_default_value, ZEND_ACC_PUBLIC|ZEND_ACC_VIRTUAL, NULL, (zend_type) ZEND_TYPE_INIT_CLASS(property_attributes_class_DOMNamedNodeMap, 0, MAY_BE_NULL));
+	zend_declare_typed_property(class_entry, property_attributes_name, &property_attributes_default_value, ZEND_ACC_PUBLIC|ZEND_ACC_PRIVATE_SET|ZEND_ACC_VIRTUAL, NULL, (zend_type) ZEND_TYPE_INIT_CLASS(property_attributes_class_DOMNamedNodeMap, 0, MAY_BE_NULL));
 	zend_string_release_ex(property_attributes_name, true);
 
 	zval property_isConnected_default_value;
 	ZVAL_UNDEF(&property_isConnected_default_value);
 	zend_string *property_isConnected_name = zend_string_init("isConnected", sizeof("isConnected") - 1, true);
-	zend_declare_typed_property(class_entry, property_isConnected_name, &property_isConnected_default_value, ZEND_ACC_PUBLIC|ZEND_ACC_VIRTUAL, NULL, (zend_type) ZEND_TYPE_INIT_MASK(MAY_BE_BOOL));
+	zend_declare_typed_property(class_entry, property_isConnected_name, &property_isConnected_default_value, ZEND_ACC_PUBLIC|ZEND_ACC_PRIVATE_SET|ZEND_ACC_VIRTUAL, NULL, (zend_type) ZEND_TYPE_INIT_MASK(MAY_BE_BOOL));
 	zend_string_release_ex(property_isConnected_name, true);
 
 	zval property_ownerDocument_default_value;
 	ZVAL_UNDEF(&property_ownerDocument_default_value);
 	zend_string *property_ownerDocument_name = zend_string_init("ownerDocument", sizeof("ownerDocument") - 1, true);
 	zend_string *property_ownerDocument_class_DOMDocument = zend_string_init("DOMDocument", sizeof("DOMDocument")-1, 1);
-	zend_declare_typed_property(class_entry, property_ownerDocument_name, &property_ownerDocument_default_value, ZEND_ACC_PUBLIC|ZEND_ACC_VIRTUAL, NULL, (zend_type) ZEND_TYPE_INIT_CLASS(property_ownerDocument_class_DOMDocument, 0, MAY_BE_NULL));
+	zend_declare_typed_property(class_entry, property_ownerDocument_name, &property_ownerDocument_default_value, ZEND_ACC_PUBLIC|ZEND_ACC_PRIVATE_SET|ZEND_ACC_VIRTUAL, NULL, (zend_type) ZEND_TYPE_INIT_CLASS(property_ownerDocument_class_DOMDocument, 0, MAY_BE_NULL));
 	zend_string_release_ex(property_ownerDocument_name, true);
 
 	zval property_namespaceURI_default_value;
 	ZVAL_UNDEF(&property_namespaceURI_default_value);
 	zend_string *property_namespaceURI_name = zend_string_init("namespaceURI", sizeof("namespaceURI") - 1, true);
-	zend_declare_typed_property(class_entry, property_namespaceURI_name, &property_namespaceURI_default_value, ZEND_ACC_PUBLIC|ZEND_ACC_VIRTUAL, NULL, (zend_type) ZEND_TYPE_INIT_MASK(MAY_BE_STRING|MAY_BE_NULL));
+	zend_declare_typed_property(class_entry, property_namespaceURI_name, &property_namespaceURI_default_value, ZEND_ACC_PUBLIC|ZEND_ACC_PRIVATE_SET|ZEND_ACC_VIRTUAL, NULL, (zend_type) ZEND_TYPE_INIT_MASK(MAY_BE_STRING|MAY_BE_NULL));
 	zend_string_release_ex(property_namespaceURI_name, true);
 
 	zval property_prefix_default_value;
@@ -2109,13 +2109,13 @@ static zend_class_entry *register_class_DOMNode(void)
 	zval property_localName_default_value;
 	ZVAL_UNDEF(&property_localName_default_value);
 	zend_string *property_localName_name = zend_string_init("localName", sizeof("localName") - 1, true);
-	zend_declare_typed_property(class_entry, property_localName_name, &property_localName_default_value, ZEND_ACC_PUBLIC|ZEND_ACC_VIRTUAL, NULL, (zend_type) ZEND_TYPE_INIT_MASK(MAY_BE_STRING|MAY_BE_NULL));
+	zend_declare_typed_property(class_entry, property_localName_name, &property_localName_default_value, ZEND_ACC_PUBLIC|ZEND_ACC_PRIVATE_SET|ZEND_ACC_VIRTUAL, NULL, (zend_type) ZEND_TYPE_INIT_MASK(MAY_BE_STRING|MAY_BE_NULL));
 	zend_string_release_ex(property_localName_name, true);
 
 	zval property_baseURI_default_value;
 	ZVAL_UNDEF(&property_baseURI_default_value);
 	zend_string *property_baseURI_name = zend_string_init("baseURI", sizeof("baseURI") - 1, true);
-	zend_declare_typed_property(class_entry, property_baseURI_name, &property_baseURI_default_value, ZEND_ACC_PUBLIC|ZEND_ACC_VIRTUAL, NULL, (zend_type) ZEND_TYPE_INIT_MASK(MAY_BE_STRING|MAY_BE_NULL));
+	zend_declare_typed_property(class_entry, property_baseURI_name, &property_baseURI_default_value, ZEND_ACC_PUBLIC|ZEND_ACC_PRIVATE_SET|ZEND_ACC_VIRTUAL, NULL, (zend_type) ZEND_TYPE_INIT_MASK(MAY_BE_STRING|MAY_BE_NULL));
 	zend_string_release_ex(property_baseURI_name, true);
 
 	zval property_textContent_default_value;
@@ -2137,64 +2137,64 @@ static zend_class_entry *register_class_DOMNameSpaceNode(void)
 	zval property_nodeName_default_value;
 	ZVAL_UNDEF(&property_nodeName_default_value);
 	zend_string *property_nodeName_name = zend_string_init("nodeName", sizeof("nodeName") - 1, true);
-	zend_declare_typed_property(class_entry, property_nodeName_name, &property_nodeName_default_value, ZEND_ACC_PUBLIC|ZEND_ACC_VIRTUAL, NULL, (zend_type) ZEND_TYPE_INIT_MASK(MAY_BE_STRING));
+	zend_declare_typed_property(class_entry, property_nodeName_name, &property_nodeName_default_value, ZEND_ACC_PUBLIC|ZEND_ACC_PRIVATE_SET|ZEND_ACC_VIRTUAL, NULL, (zend_type) ZEND_TYPE_INIT_MASK(MAY_BE_STRING));
 	zend_string_release_ex(property_nodeName_name, true);
 
 	zval property_nodeValue_default_value;
 	ZVAL_UNDEF(&property_nodeValue_default_value);
 	zend_string *property_nodeValue_name = zend_string_init("nodeValue", sizeof("nodeValue") - 1, true);
-	zend_declare_typed_property(class_entry, property_nodeValue_name, &property_nodeValue_default_value, ZEND_ACC_PUBLIC|ZEND_ACC_VIRTUAL, NULL, (zend_type) ZEND_TYPE_INIT_MASK(MAY_BE_STRING|MAY_BE_NULL));
+	zend_declare_typed_property(class_entry, property_nodeValue_name, &property_nodeValue_default_value, ZEND_ACC_PUBLIC|ZEND_ACC_PRIVATE_SET|ZEND_ACC_VIRTUAL, NULL, (zend_type) ZEND_TYPE_INIT_MASK(MAY_BE_STRING|MAY_BE_NULL));
 	zend_string_release_ex(property_nodeValue_name, true);
 
 	zval property_nodeType_default_value;
 	ZVAL_UNDEF(&property_nodeType_default_value);
 	zend_string *property_nodeType_name = zend_string_init("nodeType", sizeof("nodeType") - 1, true);
-	zend_declare_typed_property(class_entry, property_nodeType_name, &property_nodeType_default_value, ZEND_ACC_PUBLIC|ZEND_ACC_VIRTUAL, NULL, (zend_type) ZEND_TYPE_INIT_MASK(MAY_BE_LONG));
+	zend_declare_typed_property(class_entry, property_nodeType_name, &property_nodeType_default_value, ZEND_ACC_PUBLIC|ZEND_ACC_PRIVATE_SET|ZEND_ACC_VIRTUAL, NULL, (zend_type) ZEND_TYPE_INIT_MASK(MAY_BE_LONG));
 	zend_string_release_ex(property_nodeType_name, true);
 
 	zval property_prefix_default_value;
 	ZVAL_UNDEF(&property_prefix_default_value);
 	zend_string *property_prefix_name = zend_string_init("prefix", sizeof("prefix") - 1, true);
-	zend_declare_typed_property(class_entry, property_prefix_name, &property_prefix_default_value, ZEND_ACC_PUBLIC|ZEND_ACC_VIRTUAL, NULL, (zend_type) ZEND_TYPE_INIT_MASK(MAY_BE_STRING));
+	zend_declare_typed_property(class_entry, property_prefix_name, &property_prefix_default_value, ZEND_ACC_PUBLIC|ZEND_ACC_PRIVATE_SET|ZEND_ACC_VIRTUAL, NULL, (zend_type) ZEND_TYPE_INIT_MASK(MAY_BE_STRING));
 	zend_string_release_ex(property_prefix_name, true);
 
 	zval property_localName_default_value;
 	ZVAL_UNDEF(&property_localName_default_value);
 	zend_string *property_localName_name = zend_string_init("localName", sizeof("localName") - 1, true);
-	zend_declare_typed_property(class_entry, property_localName_name, &property_localName_default_value, ZEND_ACC_PUBLIC|ZEND_ACC_VIRTUAL, NULL, (zend_type) ZEND_TYPE_INIT_MASK(MAY_BE_STRING|MAY_BE_NULL));
+	zend_declare_typed_property(class_entry, property_localName_name, &property_localName_default_value, ZEND_ACC_PUBLIC|ZEND_ACC_PRIVATE_SET|ZEND_ACC_VIRTUAL, NULL, (zend_type) ZEND_TYPE_INIT_MASK(MAY_BE_STRING|MAY_BE_NULL));
 	zend_string_release_ex(property_localName_name, true);
 
 	zval property_namespaceURI_default_value;
 	ZVAL_UNDEF(&property_namespaceURI_default_value);
 	zend_string *property_namespaceURI_name = zend_string_init("namespaceURI", sizeof("namespaceURI") - 1, true);
-	zend_declare_typed_property(class_entry, property_namespaceURI_name, &property_namespaceURI_default_value, ZEND_ACC_PUBLIC|ZEND_ACC_VIRTUAL, NULL, (zend_type) ZEND_TYPE_INIT_MASK(MAY_BE_STRING|MAY_BE_NULL));
+	zend_declare_typed_property(class_entry, property_namespaceURI_name, &property_namespaceURI_default_value, ZEND_ACC_PUBLIC|ZEND_ACC_PRIVATE_SET|ZEND_ACC_VIRTUAL, NULL, (zend_type) ZEND_TYPE_INIT_MASK(MAY_BE_STRING|MAY_BE_NULL));
 	zend_string_release_ex(property_namespaceURI_name, true);
 
 	zval property_isConnected_default_value;
 	ZVAL_UNDEF(&property_isConnected_default_value);
 	zend_string *property_isConnected_name = zend_string_init("isConnected", sizeof("isConnected") - 1, true);
-	zend_declare_typed_property(class_entry, property_isConnected_name, &property_isConnected_default_value, ZEND_ACC_PUBLIC|ZEND_ACC_VIRTUAL, NULL, (zend_type) ZEND_TYPE_INIT_MASK(MAY_BE_BOOL));
+	zend_declare_typed_property(class_entry, property_isConnected_name, &property_isConnected_default_value, ZEND_ACC_PUBLIC|ZEND_ACC_PRIVATE_SET|ZEND_ACC_VIRTUAL, NULL, (zend_type) ZEND_TYPE_INIT_MASK(MAY_BE_BOOL));
 	zend_string_release_ex(property_isConnected_name, true);
 
 	zval property_ownerDocument_default_value;
 	ZVAL_UNDEF(&property_ownerDocument_default_value);
 	zend_string *property_ownerDocument_name = zend_string_init("ownerDocument", sizeof("ownerDocument") - 1, true);
 	zend_string *property_ownerDocument_class_DOMDocument = zend_string_init("DOMDocument", sizeof("DOMDocument")-1, 1);
-	zend_declare_typed_property(class_entry, property_ownerDocument_name, &property_ownerDocument_default_value, ZEND_ACC_PUBLIC|ZEND_ACC_VIRTUAL, NULL, (zend_type) ZEND_TYPE_INIT_CLASS(property_ownerDocument_class_DOMDocument, 0, MAY_BE_NULL));
+	zend_declare_typed_property(class_entry, property_ownerDocument_name, &property_ownerDocument_default_value, ZEND_ACC_PUBLIC|ZEND_ACC_PRIVATE_SET|ZEND_ACC_VIRTUAL, NULL, (zend_type) ZEND_TYPE_INIT_CLASS(property_ownerDocument_class_DOMDocument, 0, MAY_BE_NULL));
 	zend_string_release_ex(property_ownerDocument_name, true);
 
 	zval property_parentNode_default_value;
 	ZVAL_UNDEF(&property_parentNode_default_value);
 	zend_string *property_parentNode_name = zend_string_init("parentNode", sizeof("parentNode") - 1, true);
 	zend_string *property_parentNode_class_DOMNode = zend_string_init("DOMNode", sizeof("DOMNode")-1, 1);
-	zend_declare_typed_property(class_entry, property_parentNode_name, &property_parentNode_default_value, ZEND_ACC_PUBLIC|ZEND_ACC_VIRTUAL, NULL, (zend_type) ZEND_TYPE_INIT_CLASS(property_parentNode_class_DOMNode, 0, MAY_BE_NULL));
+	zend_declare_typed_property(class_entry, property_parentNode_name, &property_parentNode_default_value, ZEND_ACC_PUBLIC|ZEND_ACC_PRIVATE_SET|ZEND_ACC_VIRTUAL, NULL, (zend_type) ZEND_TYPE_INIT_CLASS(property_parentNode_class_DOMNode, 0, MAY_BE_NULL));
 	zend_string_release_ex(property_parentNode_name, true);
 
 	zval property_parentElement_default_value;
 	ZVAL_UNDEF(&property_parentElement_default_value);
 	zend_string *property_parentElement_name = zend_string_init("parentElement", sizeof("parentElement") - 1, true);
 	zend_string *property_parentElement_class_DOMElement = zend_string_init("DOMElement", sizeof("DOMElement")-1, 1);
-	zend_declare_typed_property(class_entry, property_parentElement_name, &property_parentElement_default_value, ZEND_ACC_PUBLIC|ZEND_ACC_VIRTUAL, NULL, (zend_type) ZEND_TYPE_INIT_CLASS(property_parentElement_class_DOMElement, 0, MAY_BE_NULL));
+	zend_declare_typed_property(class_entry, property_parentElement_name, &property_parentElement_default_value, ZEND_ACC_PUBLIC|ZEND_ACC_PRIVATE_SET|ZEND_ACC_VIRTUAL, NULL, (zend_type) ZEND_TYPE_INIT_CLASS(property_parentElement_class_DOMElement, 0, MAY_BE_NULL));
 	zend_string_release_ex(property_parentElement_name, true);
 
 	return class_entry;
@@ -2222,20 +2222,20 @@ static zend_class_entry *register_class_DOMDocumentFragment(zend_class_entry *cl
 	ZVAL_UNDEF(&property_firstElementChild_default_value);
 	zend_string *property_firstElementChild_name = zend_string_init("firstElementChild", sizeof("firstElementChild") - 1, true);
 	zend_string *property_firstElementChild_class_DOMElement = zend_string_init("DOMElement", sizeof("DOMElement")-1, 1);
-	zend_declare_typed_property(class_entry, property_firstElementChild_name, &property_firstElementChild_default_value, ZEND_ACC_PUBLIC|ZEND_ACC_VIRTUAL, NULL, (zend_type) ZEND_TYPE_INIT_CLASS(property_firstElementChild_class_DOMElement, 0, MAY_BE_NULL));
+	zend_declare_typed_property(class_entry, property_firstElementChild_name, &property_firstElementChild_default_value, ZEND_ACC_PUBLIC|ZEND_ACC_PRIVATE_SET|ZEND_ACC_VIRTUAL, NULL, (zend_type) ZEND_TYPE_INIT_CLASS(property_firstElementChild_class_DOMElement, 0, MAY_BE_NULL));
 	zend_string_release_ex(property_firstElementChild_name, true);
 
 	zval property_lastElementChild_default_value;
 	ZVAL_UNDEF(&property_lastElementChild_default_value);
 	zend_string *property_lastElementChild_name = zend_string_init("lastElementChild", sizeof("lastElementChild") - 1, true);
 	zend_string *property_lastElementChild_class_DOMElement = zend_string_init("DOMElement", sizeof("DOMElement")-1, 1);
-	zend_declare_typed_property(class_entry, property_lastElementChild_name, &property_lastElementChild_default_value, ZEND_ACC_PUBLIC|ZEND_ACC_VIRTUAL, NULL, (zend_type) ZEND_TYPE_INIT_CLASS(property_lastElementChild_class_DOMElement, 0, MAY_BE_NULL));
+	zend_declare_typed_property(class_entry, property_lastElementChild_name, &property_lastElementChild_default_value, ZEND_ACC_PUBLIC|ZEND_ACC_PRIVATE_SET|ZEND_ACC_VIRTUAL, NULL, (zend_type) ZEND_TYPE_INIT_CLASS(property_lastElementChild_class_DOMElement, 0, MAY_BE_NULL));
 	zend_string_release_ex(property_lastElementChild_name, true);
 
 	zval property_childElementCount_default_value;
 	ZVAL_UNDEF(&property_childElementCount_default_value);
 	zend_string *property_childElementCount_name = zend_string_init("childElementCount", sizeof("childElementCount") - 1, true);
-	zend_declare_typed_property(class_entry, property_childElementCount_name, &property_childElementCount_default_value, ZEND_ACC_PUBLIC|ZEND_ACC_VIRTUAL, NULL, (zend_type) ZEND_TYPE_INIT_MASK(MAY_BE_LONG));
+	zend_declare_typed_property(class_entry, property_childElementCount_name, &property_childElementCount_default_value, ZEND_ACC_PUBLIC|ZEND_ACC_PRIVATE_SET|ZEND_ACC_VIRTUAL, NULL, (zend_type) ZEND_TYPE_INIT_MASK(MAY_BE_LONG));
 	zend_string_release_ex(property_childElementCount_name, true);
 
 	return class_entry;
@@ -2252,7 +2252,7 @@ static zend_class_entry *register_class_DOMNodeList(zend_class_entry *class_entr
 	zval property_length_default_value;
 	ZVAL_UNDEF(&property_length_default_value);
 	zend_string *property_length_name = zend_string_init("length", sizeof("length") - 1, true);
-	zend_declare_typed_property(class_entry, property_length_name, &property_length_default_value, ZEND_ACC_PUBLIC|ZEND_ACC_VIRTUAL, NULL, (zend_type) ZEND_TYPE_INIT_MASK(MAY_BE_LONG));
+	zend_declare_typed_property(class_entry, property_length_name, &property_length_default_value, ZEND_ACC_PUBLIC|ZEND_ACC_PRIVATE_SET|ZEND_ACC_VIRTUAL, NULL, (zend_type) ZEND_TYPE_INIT_MASK(MAY_BE_LONG));
 	zend_string_release_ex(property_length_name, true);
 
 	return class_entry;
@@ -2275,21 +2275,21 @@ static zend_class_entry *register_class_DOMCharacterData(zend_class_entry *class
 	zval property_length_default_value;
 	ZVAL_UNDEF(&property_length_default_value);
 	zend_string *property_length_name = zend_string_init("length", sizeof("length") - 1, true);
-	zend_declare_typed_property(class_entry, property_length_name, &property_length_default_value, ZEND_ACC_PUBLIC|ZEND_ACC_VIRTUAL, NULL, (zend_type) ZEND_TYPE_INIT_MASK(MAY_BE_LONG));
+	zend_declare_typed_property(class_entry, property_length_name, &property_length_default_value, ZEND_ACC_PUBLIC|ZEND_ACC_PRIVATE_SET|ZEND_ACC_VIRTUAL, NULL, (zend_type) ZEND_TYPE_INIT_MASK(MAY_BE_LONG));
 	zend_string_release_ex(property_length_name, true);
 
 	zval property_previousElementSibling_default_value;
 	ZVAL_UNDEF(&property_previousElementSibling_default_value);
 	zend_string *property_previousElementSibling_name = zend_string_init("previousElementSibling", sizeof("previousElementSibling") - 1, true);
 	zend_string *property_previousElementSibling_class_DOMElement = zend_string_init("DOMElement", sizeof("DOMElement")-1, 1);
-	zend_declare_typed_property(class_entry, property_previousElementSibling_name, &property_previousElementSibling_default_value, ZEND_ACC_PUBLIC|ZEND_ACC_VIRTUAL, NULL, (zend_type) ZEND_TYPE_INIT_CLASS(property_previousElementSibling_class_DOMElement, 0, MAY_BE_NULL));
+	zend_declare_typed_property(class_entry, property_previousElementSibling_name, &property_previousElementSibling_default_value, ZEND_ACC_PUBLIC|ZEND_ACC_PRIVATE_SET|ZEND_ACC_VIRTUAL, NULL, (zend_type) ZEND_TYPE_INIT_CLASS(property_previousElementSibling_class_DOMElement, 0, MAY_BE_NULL));
 	zend_string_release_ex(property_previousElementSibling_name, true);
 
 	zval property_nextElementSibling_default_value;
 	ZVAL_UNDEF(&property_nextElementSibling_default_value);
 	zend_string *property_nextElementSibling_name = zend_string_init("nextElementSibling", sizeof("nextElementSibling") - 1, true);
 	zend_string *property_nextElementSibling_class_DOMElement = zend_string_init("DOMElement", sizeof("DOMElement")-1, 1);
-	zend_declare_typed_property(class_entry, property_nextElementSibling_name, &property_nextElementSibling_default_value, ZEND_ACC_PUBLIC|ZEND_ACC_VIRTUAL, NULL, (zend_type) ZEND_TYPE_INIT_CLASS(property_nextElementSibling_class_DOMElement, 0, MAY_BE_NULL));
+	zend_declare_typed_property(class_entry, property_nextElementSibling_name, &property_nextElementSibling_default_value, ZEND_ACC_PUBLIC|ZEND_ACC_PRIVATE_SET|ZEND_ACC_VIRTUAL, NULL, (zend_type) ZEND_TYPE_INIT_CLASS(property_nextElementSibling_class_DOMElement, 0, MAY_BE_NULL));
 	zend_string_release_ex(property_nextElementSibling_name, true);
 
 	return class_entry;
@@ -2304,12 +2304,12 @@ static zend_class_entry *register_class_DOMAttr(zend_class_entry *class_entry_DO
 
 	zval property_name_default_value;
 	ZVAL_UNDEF(&property_name_default_value);
-	zend_declare_typed_property(class_entry, ZSTR_KNOWN(ZEND_STR_NAME), &property_name_default_value, ZEND_ACC_PUBLIC|ZEND_ACC_VIRTUAL, NULL, (zend_type) ZEND_TYPE_INIT_MASK(MAY_BE_STRING));
+	zend_declare_typed_property(class_entry, ZSTR_KNOWN(ZEND_STR_NAME), &property_name_default_value, ZEND_ACC_PUBLIC|ZEND_ACC_PRIVATE_SET|ZEND_ACC_VIRTUAL, NULL, (zend_type) ZEND_TYPE_INIT_MASK(MAY_BE_STRING));
 
 	zval property_specified_default_value;
 	ZVAL_UNDEF(&property_specified_default_value);
 	zend_string *property_specified_name = zend_string_init("specified", sizeof("specified") - 1, true);
-	zend_declare_typed_property(class_entry, property_specified_name, &property_specified_default_value, ZEND_ACC_PUBLIC|ZEND_ACC_VIRTUAL, NULL, (zend_type) ZEND_TYPE_INIT_MASK(MAY_BE_BOOL));
+	zend_declare_typed_property(class_entry, property_specified_name, &property_specified_default_value, ZEND_ACC_PUBLIC|ZEND_ACC_PRIVATE_SET|ZEND_ACC_VIRTUAL, NULL, (zend_type) ZEND_TYPE_INIT_MASK(MAY_BE_BOOL));
 	zend_string_release_ex(property_specified_name, true);
 
 	zval property_value_default_value;
@@ -2320,13 +2320,13 @@ static zend_class_entry *register_class_DOMAttr(zend_class_entry *class_entry_DO
 	ZVAL_UNDEF(&property_ownerElement_default_value);
 	zend_string *property_ownerElement_name = zend_string_init("ownerElement", sizeof("ownerElement") - 1, true);
 	zend_string *property_ownerElement_class_DOMElement = zend_string_init("DOMElement", sizeof("DOMElement")-1, 1);
-	zend_declare_typed_property(class_entry, property_ownerElement_name, &property_ownerElement_default_value, ZEND_ACC_PUBLIC|ZEND_ACC_VIRTUAL, NULL, (zend_type) ZEND_TYPE_INIT_CLASS(property_ownerElement_class_DOMElement, 0, MAY_BE_NULL));
+	zend_declare_typed_property(class_entry, property_ownerElement_name, &property_ownerElement_default_value, ZEND_ACC_PUBLIC|ZEND_ACC_PRIVATE_SET|ZEND_ACC_VIRTUAL, NULL, (zend_type) ZEND_TYPE_INIT_CLASS(property_ownerElement_class_DOMElement, 0, MAY_BE_NULL));
 	zend_string_release_ex(property_ownerElement_name, true);
 
 	zval property_schemaTypeInfo_default_value;
 	ZVAL_UNDEF(&property_schemaTypeInfo_default_value);
 	zend_string *property_schemaTypeInfo_name = zend_string_init("schemaTypeInfo", sizeof("schemaTypeInfo") - 1, true);
-	zend_declare_typed_property(class_entry, property_schemaTypeInfo_name, &property_schemaTypeInfo_default_value, ZEND_ACC_PUBLIC|ZEND_ACC_VIRTUAL, NULL, (zend_type) ZEND_TYPE_INIT_MASK(MAY_BE_ANY));
+	zend_declare_typed_property(class_entry, property_schemaTypeInfo_name, &property_schemaTypeInfo_default_value, ZEND_ACC_PUBLIC|ZEND_ACC_PRIVATE_SET|ZEND_ACC_VIRTUAL, NULL, (zend_type) ZEND_TYPE_INIT_MASK(MAY_BE_ANY));
 	zend_string_release_ex(property_schemaTypeInfo_name, true);
 
 	return class_entry;
@@ -2343,7 +2343,7 @@ static zend_class_entry *register_class_DOMElement(zend_class_entry *class_entry
 	zval property_tagName_default_value;
 	ZVAL_UNDEF(&property_tagName_default_value);
 	zend_string *property_tagName_name = zend_string_init("tagName", sizeof("tagName") - 1, true);
-	zend_declare_typed_property(class_entry, property_tagName_name, &property_tagName_default_value, ZEND_ACC_PUBLIC|ZEND_ACC_VIRTUAL, NULL, (zend_type) ZEND_TYPE_INIT_MASK(MAY_BE_STRING));
+	zend_declare_typed_property(class_entry, property_tagName_name, &property_tagName_default_value, ZEND_ACC_PUBLIC|ZEND_ACC_PRIVATE_SET|ZEND_ACC_VIRTUAL, NULL, (zend_type) ZEND_TYPE_INIT_MASK(MAY_BE_STRING));
 	zend_string_release_ex(property_tagName_name, true);
 
 	zval property_className_default_value;
@@ -2361,41 +2361,41 @@ static zend_class_entry *register_class_DOMElement(zend_class_entry *class_entry
 	zval property_schemaTypeInfo_default_value;
 	ZVAL_UNDEF(&property_schemaTypeInfo_default_value);
 	zend_string *property_schemaTypeInfo_name = zend_string_init("schemaTypeInfo", sizeof("schemaTypeInfo") - 1, true);
-	zend_declare_typed_property(class_entry, property_schemaTypeInfo_name, &property_schemaTypeInfo_default_value, ZEND_ACC_PUBLIC|ZEND_ACC_VIRTUAL, NULL, (zend_type) ZEND_TYPE_INIT_MASK(MAY_BE_ANY));
+	zend_declare_typed_property(class_entry, property_schemaTypeInfo_name, &property_schemaTypeInfo_default_value, ZEND_ACC_PUBLIC|ZEND_ACC_PRIVATE_SET|ZEND_ACC_VIRTUAL, NULL, (zend_type) ZEND_TYPE_INIT_MASK(MAY_BE_ANY));
 	zend_string_release_ex(property_schemaTypeInfo_name, true);
 
 	zval property_firstElementChild_default_value;
 	ZVAL_UNDEF(&property_firstElementChild_default_value);
 	zend_string *property_firstElementChild_name = zend_string_init("firstElementChild", sizeof("firstElementChild") - 1, true);
 	zend_string *property_firstElementChild_class_DOMElement = zend_string_init("DOMElement", sizeof("DOMElement")-1, 1);
-	zend_declare_typed_property(class_entry, property_firstElementChild_name, &property_firstElementChild_default_value, ZEND_ACC_PUBLIC|ZEND_ACC_VIRTUAL, NULL, (zend_type) ZEND_TYPE_INIT_CLASS(property_firstElementChild_class_DOMElement, 0, MAY_BE_NULL));
+	zend_declare_typed_property(class_entry, property_firstElementChild_name, &property_firstElementChild_default_value, ZEND_ACC_PUBLIC|ZEND_ACC_PRIVATE_SET|ZEND_ACC_VIRTUAL, NULL, (zend_type) ZEND_TYPE_INIT_CLASS(property_firstElementChild_class_DOMElement, 0, MAY_BE_NULL));
 	zend_string_release_ex(property_firstElementChild_name, true);
 
 	zval property_lastElementChild_default_value;
 	ZVAL_UNDEF(&property_lastElementChild_default_value);
 	zend_string *property_lastElementChild_name = zend_string_init("lastElementChild", sizeof("lastElementChild") - 1, true);
 	zend_string *property_lastElementChild_class_DOMElement = zend_string_init("DOMElement", sizeof("DOMElement")-1, 1);
-	zend_declare_typed_property(class_entry, property_lastElementChild_name, &property_lastElementChild_default_value, ZEND_ACC_PUBLIC|ZEND_ACC_VIRTUAL, NULL, (zend_type) ZEND_TYPE_INIT_CLASS(property_lastElementChild_class_DOMElement, 0, MAY_BE_NULL));
+	zend_declare_typed_property(class_entry, property_lastElementChild_name, &property_lastElementChild_default_value, ZEND_ACC_PUBLIC|ZEND_ACC_PRIVATE_SET|ZEND_ACC_VIRTUAL, NULL, (zend_type) ZEND_TYPE_INIT_CLASS(property_lastElementChild_class_DOMElement, 0, MAY_BE_NULL));
 	zend_string_release_ex(property_lastElementChild_name, true);
 
 	zval property_childElementCount_default_value;
 	ZVAL_UNDEF(&property_childElementCount_default_value);
 	zend_string *property_childElementCount_name = zend_string_init("childElementCount", sizeof("childElementCount") - 1, true);
-	zend_declare_typed_property(class_entry, property_childElementCount_name, &property_childElementCount_default_value, ZEND_ACC_PUBLIC|ZEND_ACC_VIRTUAL, NULL, (zend_type) ZEND_TYPE_INIT_MASK(MAY_BE_LONG));
+	zend_declare_typed_property(class_entry, property_childElementCount_name, &property_childElementCount_default_value, ZEND_ACC_PUBLIC|ZEND_ACC_PRIVATE_SET|ZEND_ACC_VIRTUAL, NULL, (zend_type) ZEND_TYPE_INIT_MASK(MAY_BE_LONG));
 	zend_string_release_ex(property_childElementCount_name, true);
 
 	zval property_previousElementSibling_default_value;
 	ZVAL_UNDEF(&property_previousElementSibling_default_value);
 	zend_string *property_previousElementSibling_name = zend_string_init("previousElementSibling", sizeof("previousElementSibling") - 1, true);
 	zend_string *property_previousElementSibling_class_DOMElement = zend_string_init("DOMElement", sizeof("DOMElement")-1, 1);
-	zend_declare_typed_property(class_entry, property_previousElementSibling_name, &property_previousElementSibling_default_value, ZEND_ACC_PUBLIC|ZEND_ACC_VIRTUAL, NULL, (zend_type) ZEND_TYPE_INIT_CLASS(property_previousElementSibling_class_DOMElement, 0, MAY_BE_NULL));
+	zend_declare_typed_property(class_entry, property_previousElementSibling_name, &property_previousElementSibling_default_value, ZEND_ACC_PUBLIC|ZEND_ACC_PRIVATE_SET|ZEND_ACC_VIRTUAL, NULL, (zend_type) ZEND_TYPE_INIT_CLASS(property_previousElementSibling_class_DOMElement, 0, MAY_BE_NULL));
 	zend_string_release_ex(property_previousElementSibling_name, true);
 
 	zval property_nextElementSibling_default_value;
 	ZVAL_UNDEF(&property_nextElementSibling_default_value);
 	zend_string *property_nextElementSibling_name = zend_string_init("nextElementSibling", sizeof("nextElementSibling") - 1, true);
 	zend_string *property_nextElementSibling_class_DOMElement = zend_string_init("DOMElement", sizeof("DOMElement")-1, 1);
-	zend_declare_typed_property(class_entry, property_nextElementSibling_name, &property_nextElementSibling_default_value, ZEND_ACC_PUBLIC|ZEND_ACC_VIRTUAL, NULL, (zend_type) ZEND_TYPE_INIT_CLASS(property_nextElementSibling_class_DOMElement, 0, MAY_BE_NULL));
+	zend_declare_typed_property(class_entry, property_nextElementSibling_name, &property_nextElementSibling_default_value, ZEND_ACC_PUBLIC|ZEND_ACC_PRIVATE_SET|ZEND_ACC_VIRTUAL, NULL, (zend_type) ZEND_TYPE_INIT_CLASS(property_nextElementSibling_class_DOMElement, 0, MAY_BE_NULL));
 	zend_string_release_ex(property_nextElementSibling_name, true);
 
 	return class_entry;
@@ -2413,27 +2413,27 @@ static zend_class_entry *register_class_DOMDocument(zend_class_entry *class_entr
 	ZVAL_UNDEF(&property_doctype_default_value);
 	zend_string *property_doctype_name = zend_string_init("doctype", sizeof("doctype") - 1, true);
 	zend_string *property_doctype_class_DOMDocumentType = zend_string_init("DOMDocumentType", sizeof("DOMDocumentType")-1, 1);
-	zend_declare_typed_property(class_entry, property_doctype_name, &property_doctype_default_value, ZEND_ACC_PUBLIC|ZEND_ACC_VIRTUAL, NULL, (zend_type) ZEND_TYPE_INIT_CLASS(property_doctype_class_DOMDocumentType, 0, MAY_BE_NULL));
+	zend_declare_typed_property(class_entry, property_doctype_name, &property_doctype_default_value, ZEND_ACC_PUBLIC|ZEND_ACC_PRIVATE_SET|ZEND_ACC_VIRTUAL, NULL, (zend_type) ZEND_TYPE_INIT_CLASS(property_doctype_class_DOMDocumentType, 0, MAY_BE_NULL));
 	zend_string_release_ex(property_doctype_name, true);
 
 	zval property_implementation_default_value;
 	ZVAL_UNDEF(&property_implementation_default_value);
 	zend_string *property_implementation_name = zend_string_init("implementation", sizeof("implementation") - 1, true);
 	zend_string *property_implementation_class_DOMImplementation = zend_string_init("DOMImplementation", sizeof("DOMImplementation")-1, 1);
-	zend_declare_typed_property(class_entry, property_implementation_name, &property_implementation_default_value, ZEND_ACC_PUBLIC|ZEND_ACC_VIRTUAL, NULL, (zend_type) ZEND_TYPE_INIT_CLASS(property_implementation_class_DOMImplementation, 0, 0));
+	zend_declare_typed_property(class_entry, property_implementation_name, &property_implementation_default_value, ZEND_ACC_PUBLIC|ZEND_ACC_PRIVATE_SET|ZEND_ACC_VIRTUAL, NULL, (zend_type) ZEND_TYPE_INIT_CLASS(property_implementation_class_DOMImplementation, 0, 0));
 	zend_string_release_ex(property_implementation_name, true);
 
 	zval property_documentElement_default_value;
 	ZVAL_UNDEF(&property_documentElement_default_value);
 	zend_string *property_documentElement_name = zend_string_init("documentElement", sizeof("documentElement") - 1, true);
 	zend_string *property_documentElement_class_DOMElement = zend_string_init("DOMElement", sizeof("DOMElement")-1, 1);
-	zend_declare_typed_property(class_entry, property_documentElement_name, &property_documentElement_default_value, ZEND_ACC_PUBLIC|ZEND_ACC_VIRTUAL, NULL, (zend_type) ZEND_TYPE_INIT_CLASS(property_documentElement_class_DOMElement, 0, MAY_BE_NULL));
+	zend_declare_typed_property(class_entry, property_documentElement_name, &property_documentElement_default_value, ZEND_ACC_PUBLIC|ZEND_ACC_PRIVATE_SET|ZEND_ACC_VIRTUAL, NULL, (zend_type) ZEND_TYPE_INIT_CLASS(property_documentElement_class_DOMElement, 0, MAY_BE_NULL));
 	zend_string_release_ex(property_documentElement_name, true);
 
 	zval property_actualEncoding_default_value;
 	ZVAL_UNDEF(&property_actualEncoding_default_value);
 	zend_string *property_actualEncoding_name = zend_string_init("actualEncoding", sizeof("actualEncoding") - 1, true);
-	zend_declare_typed_property(class_entry, property_actualEncoding_name, &property_actualEncoding_default_value, ZEND_ACC_PUBLIC|ZEND_ACC_VIRTUAL, NULL, (zend_type) ZEND_TYPE_INIT_MASK(MAY_BE_STRING|MAY_BE_NULL));
+	zend_declare_typed_property(class_entry, property_actualEncoding_name, &property_actualEncoding_default_value, ZEND_ACC_PUBLIC|ZEND_ACC_PRIVATE_SET|ZEND_ACC_VIRTUAL, NULL, (zend_type) ZEND_TYPE_INIT_MASK(MAY_BE_STRING|MAY_BE_NULL));
 	zend_string_release_ex(property_actualEncoding_name, true);
 
 	zval property_encoding_default_value;
@@ -2445,7 +2445,7 @@ static zend_class_entry *register_class_DOMDocument(zend_class_entry *class_entr
 	zval property_xmlEncoding_default_value;
 	ZVAL_UNDEF(&property_xmlEncoding_default_value);
 	zend_string *property_xmlEncoding_name = zend_string_init("xmlEncoding", sizeof("xmlEncoding") - 1, true);
-	zend_declare_typed_property(class_entry, property_xmlEncoding_name, &property_xmlEncoding_default_value, ZEND_ACC_PUBLIC|ZEND_ACC_VIRTUAL, NULL, (zend_type) ZEND_TYPE_INIT_MASK(MAY_BE_STRING|MAY_BE_NULL));
+	zend_declare_typed_property(class_entry, property_xmlEncoding_name, &property_xmlEncoding_default_value, ZEND_ACC_PUBLIC|ZEND_ACC_PRIVATE_SET|ZEND_ACC_VIRTUAL, NULL, (zend_type) ZEND_TYPE_INIT_MASK(MAY_BE_STRING|MAY_BE_NULL));
 	zend_string_release_ex(property_xmlEncoding_name, true);
 
 	zval property_standalone_default_value;
@@ -2487,7 +2487,7 @@ static zend_class_entry *register_class_DOMDocument(zend_class_entry *class_entr
 	zval property_config_default_value;
 	ZVAL_UNDEF(&property_config_default_value);
 	zend_string *property_config_name = zend_string_init("config", sizeof("config") - 1, true);
-	zend_declare_typed_property(class_entry, property_config_name, &property_config_default_value, ZEND_ACC_PUBLIC|ZEND_ACC_VIRTUAL, NULL, (zend_type) ZEND_TYPE_INIT_MASK(MAY_BE_ANY));
+	zend_declare_typed_property(class_entry, property_config_name, &property_config_default_value, ZEND_ACC_PUBLIC|ZEND_ACC_PRIVATE_SET|ZEND_ACC_VIRTUAL, NULL, (zend_type) ZEND_TYPE_INIT_MASK(MAY_BE_ANY));
 	zend_string_release_ex(property_config_name, true);
 
 	zval property_formatOutput_default_value;
@@ -2530,20 +2530,20 @@ static zend_class_entry *register_class_DOMDocument(zend_class_entry *class_entr
 	ZVAL_UNDEF(&property_firstElementChild_default_value);
 	zend_string *property_firstElementChild_name = zend_string_init("firstElementChild", sizeof("firstElementChild") - 1, true);
 	zend_string *property_firstElementChild_class_DOMElement = zend_string_init("DOMElement", sizeof("DOMElement")-1, 1);
-	zend_declare_typed_property(class_entry, property_firstElementChild_name, &property_firstElementChild_default_value, ZEND_ACC_PUBLIC|ZEND_ACC_VIRTUAL, NULL, (zend_type) ZEND_TYPE_INIT_CLASS(property_firstElementChild_class_DOMElement, 0, MAY_BE_NULL));
+	zend_declare_typed_property(class_entry, property_firstElementChild_name, &property_firstElementChild_default_value, ZEND_ACC_PUBLIC|ZEND_ACC_PRIVATE_SET|ZEND_ACC_VIRTUAL, NULL, (zend_type) ZEND_TYPE_INIT_CLASS(property_firstElementChild_class_DOMElement, 0, MAY_BE_NULL));
 	zend_string_release_ex(property_firstElementChild_name, true);
 
 	zval property_lastElementChild_default_value;
 	ZVAL_UNDEF(&property_lastElementChild_default_value);
 	zend_string *property_lastElementChild_name = zend_string_init("lastElementChild", sizeof("lastElementChild") - 1, true);
 	zend_string *property_lastElementChild_class_DOMElement = zend_string_init("DOMElement", sizeof("DOMElement")-1, 1);
-	zend_declare_typed_property(class_entry, property_lastElementChild_name, &property_lastElementChild_default_value, ZEND_ACC_PUBLIC|ZEND_ACC_VIRTUAL, NULL, (zend_type) ZEND_TYPE_INIT_CLASS(property_lastElementChild_class_DOMElement, 0, MAY_BE_NULL));
+	zend_declare_typed_property(class_entry, property_lastElementChild_name, &property_lastElementChild_default_value, ZEND_ACC_PUBLIC|ZEND_ACC_PRIVATE_SET|ZEND_ACC_VIRTUAL, NULL, (zend_type) ZEND_TYPE_INIT_CLASS(property_lastElementChild_class_DOMElement, 0, MAY_BE_NULL));
 	zend_string_release_ex(property_lastElementChild_name, true);
 
 	zval property_childElementCount_default_value;
 	ZVAL_UNDEF(&property_childElementCount_default_value);
 	zend_string *property_childElementCount_name = zend_string_init("childElementCount", sizeof("childElementCount") - 1, true);
-	zend_declare_typed_property(class_entry, property_childElementCount_name, &property_childElementCount_default_value, ZEND_ACC_PUBLIC|ZEND_ACC_VIRTUAL, NULL, (zend_type) ZEND_TYPE_INIT_MASK(MAY_BE_LONG));
+	zend_declare_typed_property(class_entry, property_childElementCount_name, &property_childElementCount_default_value, ZEND_ACC_PUBLIC|ZEND_ACC_PRIVATE_SET|ZEND_ACC_VIRTUAL, NULL, (zend_type) ZEND_TYPE_INIT_MASK(MAY_BE_LONG));
 	zend_string_release_ex(property_childElementCount_name, true);
 
 	return class_entry;
@@ -2574,7 +2574,7 @@ static zend_class_entry *register_class_DOMText(zend_class_entry *class_entry_DO
 	zval property_wholeText_default_value;
 	ZVAL_UNDEF(&property_wholeText_default_value);
 	zend_string *property_wholeText_name = zend_string_init("wholeText", sizeof("wholeText") - 1, true);
-	zend_declare_typed_property(class_entry, property_wholeText_name, &property_wholeText_default_value, ZEND_ACC_PUBLIC|ZEND_ACC_VIRTUAL, NULL, (zend_type) ZEND_TYPE_INIT_MASK(MAY_BE_STRING));
+	zend_declare_typed_property(class_entry, property_wholeText_name, &property_wholeText_default_value, ZEND_ACC_PUBLIC|ZEND_ACC_PRIVATE_SET|ZEND_ACC_VIRTUAL, NULL, (zend_type) ZEND_TYPE_INIT_MASK(MAY_BE_STRING));
 	zend_string_release_ex(property_wholeText_name, true);
 
 	return class_entry;
@@ -2591,7 +2591,7 @@ static zend_class_entry *register_class_DOMNamedNodeMap(zend_class_entry *class_
 	zval property_length_default_value;
 	ZVAL_UNDEF(&property_length_default_value);
 	zend_string *property_length_name = zend_string_init("length", sizeof("length") - 1, true);
-	zend_declare_typed_property(class_entry, property_length_name, &property_length_default_value, ZEND_ACC_PUBLIC|ZEND_ACC_VIRTUAL, NULL, (zend_type) ZEND_TYPE_INIT_MASK(MAY_BE_LONG));
+	zend_declare_typed_property(class_entry, property_length_name, &property_length_default_value, ZEND_ACC_PUBLIC|ZEND_ACC_PRIVATE_SET|ZEND_ACC_VIRTUAL, NULL, (zend_type) ZEND_TYPE_INIT_MASK(MAY_BE_LONG));
 	zend_string_release_ex(property_length_name, true);
 
 	return class_entry;
@@ -2607,37 +2607,37 @@ static zend_class_entry *register_class_DOMEntity(zend_class_entry *class_entry_
 	zval property_publicId_default_value;
 	ZVAL_UNDEF(&property_publicId_default_value);
 	zend_string *property_publicId_name = zend_string_init("publicId", sizeof("publicId") - 1, true);
-	zend_declare_typed_property(class_entry, property_publicId_name, &property_publicId_default_value, ZEND_ACC_PUBLIC|ZEND_ACC_VIRTUAL, NULL, (zend_type) ZEND_TYPE_INIT_MASK(MAY_BE_STRING|MAY_BE_NULL));
+	zend_declare_typed_property(class_entry, property_publicId_name, &property_publicId_default_value, ZEND_ACC_PUBLIC|ZEND_ACC_PRIVATE_SET|ZEND_ACC_VIRTUAL, NULL, (zend_type) ZEND_TYPE_INIT_MASK(MAY_BE_STRING|MAY_BE_NULL));
 	zend_string_release_ex(property_publicId_name, true);
 
 	zval property_systemId_default_value;
 	ZVAL_UNDEF(&property_systemId_default_value);
 	zend_string *property_systemId_name = zend_string_init("systemId", sizeof("systemId") - 1, true);
-	zend_declare_typed_property(class_entry, property_systemId_name, &property_systemId_default_value, ZEND_ACC_PUBLIC|ZEND_ACC_VIRTUAL, NULL, (zend_type) ZEND_TYPE_INIT_MASK(MAY_BE_STRING|MAY_BE_NULL));
+	zend_declare_typed_property(class_entry, property_systemId_name, &property_systemId_default_value, ZEND_ACC_PUBLIC|ZEND_ACC_PRIVATE_SET|ZEND_ACC_VIRTUAL, NULL, (zend_type) ZEND_TYPE_INIT_MASK(MAY_BE_STRING|MAY_BE_NULL));
 	zend_string_release_ex(property_systemId_name, true);
 
 	zval property_notationName_default_value;
 	ZVAL_UNDEF(&property_notationName_default_value);
 	zend_string *property_notationName_name = zend_string_init("notationName", sizeof("notationName") - 1, true);
-	zend_declare_typed_property(class_entry, property_notationName_name, &property_notationName_default_value, ZEND_ACC_PUBLIC|ZEND_ACC_VIRTUAL, NULL, (zend_type) ZEND_TYPE_INIT_MASK(MAY_BE_STRING|MAY_BE_NULL));
+	zend_declare_typed_property(class_entry, property_notationName_name, &property_notationName_default_value, ZEND_ACC_PUBLIC|ZEND_ACC_PRIVATE_SET|ZEND_ACC_VIRTUAL, NULL, (zend_type) ZEND_TYPE_INIT_MASK(MAY_BE_STRING|MAY_BE_NULL));
 	zend_string_release_ex(property_notationName_name, true);
 
 	zval property_actualEncoding_default_value;
 	ZVAL_UNDEF(&property_actualEncoding_default_value);
 	zend_string *property_actualEncoding_name = zend_string_init("actualEncoding", sizeof("actualEncoding") - 1, true);
-	zend_declare_typed_property(class_entry, property_actualEncoding_name, &property_actualEncoding_default_value, ZEND_ACC_PUBLIC|ZEND_ACC_VIRTUAL, NULL, (zend_type) ZEND_TYPE_INIT_MASK(MAY_BE_STRING|MAY_BE_NULL));
+	zend_declare_typed_property(class_entry, property_actualEncoding_name, &property_actualEncoding_default_value, ZEND_ACC_PUBLIC|ZEND_ACC_PRIVATE_SET|ZEND_ACC_VIRTUAL, NULL, (zend_type) ZEND_TYPE_INIT_MASK(MAY_BE_STRING|MAY_BE_NULL));
 	zend_string_release_ex(property_actualEncoding_name, true);
 
 	zval property_encoding_default_value;
 	ZVAL_UNDEF(&property_encoding_default_value);
 	zend_string *property_encoding_name = zend_string_init("encoding", sizeof("encoding") - 1, true);
-	zend_declare_typed_property(class_entry, property_encoding_name, &property_encoding_default_value, ZEND_ACC_PUBLIC|ZEND_ACC_VIRTUAL, NULL, (zend_type) ZEND_TYPE_INIT_MASK(MAY_BE_STRING|MAY_BE_NULL));
+	zend_declare_typed_property(class_entry, property_encoding_name, &property_encoding_default_value, ZEND_ACC_PUBLIC|ZEND_ACC_PRIVATE_SET|ZEND_ACC_VIRTUAL, NULL, (zend_type) ZEND_TYPE_INIT_MASK(MAY_BE_STRING|MAY_BE_NULL));
 	zend_string_release_ex(property_encoding_name, true);
 
 	zval property_version_default_value;
 	ZVAL_UNDEF(&property_version_default_value);
 	zend_string *property_version_name = zend_string_init("version", sizeof("version") - 1, true);
-	zend_declare_typed_property(class_entry, property_version_name, &property_version_default_value, ZEND_ACC_PUBLIC|ZEND_ACC_VIRTUAL, NULL, (zend_type) ZEND_TYPE_INIT_MASK(MAY_BE_STRING|MAY_BE_NULL));
+	zend_declare_typed_property(class_entry, property_version_name, &property_version_default_value, ZEND_ACC_PUBLIC|ZEND_ACC_PRIVATE_SET|ZEND_ACC_VIRTUAL, NULL, (zend_type) ZEND_TYPE_INIT_MASK(MAY_BE_STRING|MAY_BE_NULL));
 	zend_string_release_ex(property_version_name, true);
 
 	return class_entry;
@@ -2663,13 +2663,13 @@ static zend_class_entry *register_class_DOMNotation(zend_class_entry *class_entr
 	zval property_publicId_default_value;
 	ZVAL_UNDEF(&property_publicId_default_value);
 	zend_string *property_publicId_name = zend_string_init("publicId", sizeof("publicId") - 1, true);
-	zend_declare_typed_property(class_entry, property_publicId_name, &property_publicId_default_value, ZEND_ACC_PUBLIC|ZEND_ACC_VIRTUAL, NULL, (zend_type) ZEND_TYPE_INIT_MASK(MAY_BE_STRING));
+	zend_declare_typed_property(class_entry, property_publicId_name, &property_publicId_default_value, ZEND_ACC_PUBLIC|ZEND_ACC_PRIVATE_SET|ZEND_ACC_VIRTUAL, NULL, (zend_type) ZEND_TYPE_INIT_MASK(MAY_BE_STRING));
 	zend_string_release_ex(property_publicId_name, true);
 
 	zval property_systemId_default_value;
 	ZVAL_UNDEF(&property_systemId_default_value);
 	zend_string *property_systemId_name = zend_string_init("systemId", sizeof("systemId") - 1, true);
-	zend_declare_typed_property(class_entry, property_systemId_name, &property_systemId_default_value, ZEND_ACC_PUBLIC|ZEND_ACC_VIRTUAL, NULL, (zend_type) ZEND_TYPE_INIT_MASK(MAY_BE_STRING));
+	zend_declare_typed_property(class_entry, property_systemId_name, &property_systemId_default_value, ZEND_ACC_PUBLIC|ZEND_ACC_PRIVATE_SET|ZEND_ACC_VIRTUAL, NULL, (zend_type) ZEND_TYPE_INIT_MASK(MAY_BE_STRING));
 	zend_string_release_ex(property_systemId_name, true);
 
 	return class_entry;
@@ -2685,7 +2685,7 @@ static zend_class_entry *register_class_DOMProcessingInstruction(zend_class_entr
 	zval property_target_default_value;
 	ZVAL_UNDEF(&property_target_default_value);
 	zend_string *property_target_name = zend_string_init("target", sizeof("target") - 1, true);
-	zend_declare_typed_property(class_entry, property_target_name, &property_target_default_value, ZEND_ACC_PUBLIC|ZEND_ACC_VIRTUAL, NULL, (zend_type) ZEND_TYPE_INIT_MASK(MAY_BE_STRING));
+	zend_declare_typed_property(class_entry, property_target_name, &property_target_default_value, ZEND_ACC_PUBLIC|ZEND_ACC_PRIVATE_SET|ZEND_ACC_VIRTUAL, NULL, (zend_type) ZEND_TYPE_INIT_MASK(MAY_BE_STRING));
 	zend_string_release_ex(property_target_name, true);
 
 	zval property_data_default_value;
@@ -2709,7 +2709,7 @@ static zend_class_entry *register_class_DOMXPath(void)
 	ZVAL_UNDEF(&property_document_default_value);
 	zend_string *property_document_name = zend_string_init("document", sizeof("document") - 1, true);
 	zend_string *property_document_class_DOMDocument = zend_string_init("DOMDocument", sizeof("DOMDocument")-1, 1);
-	zend_declare_typed_property(class_entry, property_document_name, &property_document_default_value, ZEND_ACC_PUBLIC|ZEND_ACC_VIRTUAL, NULL, (zend_type) ZEND_TYPE_INIT_CLASS(property_document_class_DOMDocument, 0, 0));
+	zend_declare_typed_property(class_entry, property_document_name, &property_document_default_value, ZEND_ACC_PUBLIC|ZEND_ACC_PRIVATE_SET|ZEND_ACC_VIRTUAL, NULL, (zend_type) ZEND_TYPE_INIT_CLASS(property_document_class_DOMDocument, 0, 0));
 	zend_string_release_ex(property_document_name, true);
 
 	zval property_registerNodeNamespaces_default_value;
@@ -2798,81 +2798,81 @@ static zend_class_entry *register_class_Dom_Node(void)
 	zval property_nodeType_default_value;
 	ZVAL_UNDEF(&property_nodeType_default_value);
 	zend_string *property_nodeType_name = zend_string_init("nodeType", sizeof("nodeType") - 1, true);
-	zend_declare_typed_property(class_entry, property_nodeType_name, &property_nodeType_default_value, ZEND_ACC_PUBLIC|ZEND_ACC_VIRTUAL, NULL, (zend_type) ZEND_TYPE_INIT_MASK(MAY_BE_LONG));
+	zend_declare_typed_property(class_entry, property_nodeType_name, &property_nodeType_default_value, ZEND_ACC_PUBLIC|ZEND_ACC_PRIVATE_SET|ZEND_ACC_VIRTUAL, NULL, (zend_type) ZEND_TYPE_INIT_MASK(MAY_BE_LONG));
 	zend_string_release_ex(property_nodeType_name, true);
 
 	zval property_nodeName_default_value;
 	ZVAL_UNDEF(&property_nodeName_default_value);
 	zend_string *property_nodeName_name = zend_string_init("nodeName", sizeof("nodeName") - 1, true);
-	zend_declare_typed_property(class_entry, property_nodeName_name, &property_nodeName_default_value, ZEND_ACC_PUBLIC|ZEND_ACC_VIRTUAL, NULL, (zend_type) ZEND_TYPE_INIT_MASK(MAY_BE_STRING));
+	zend_declare_typed_property(class_entry, property_nodeName_name, &property_nodeName_default_value, ZEND_ACC_PUBLIC|ZEND_ACC_PRIVATE_SET|ZEND_ACC_VIRTUAL, NULL, (zend_type) ZEND_TYPE_INIT_MASK(MAY_BE_STRING));
 	zend_string_release_ex(property_nodeName_name, true);
 
 	zval property_baseURI_default_value;
 	ZVAL_UNDEF(&property_baseURI_default_value);
 	zend_string *property_baseURI_name = zend_string_init("baseURI", sizeof("baseURI") - 1, true);
-	zend_declare_typed_property(class_entry, property_baseURI_name, &property_baseURI_default_value, ZEND_ACC_PUBLIC|ZEND_ACC_VIRTUAL, NULL, (zend_type) ZEND_TYPE_INIT_MASK(MAY_BE_STRING));
+	zend_declare_typed_property(class_entry, property_baseURI_name, &property_baseURI_default_value, ZEND_ACC_PUBLIC|ZEND_ACC_PRIVATE_SET|ZEND_ACC_VIRTUAL, NULL, (zend_type) ZEND_TYPE_INIT_MASK(MAY_BE_STRING));
 	zend_string_release_ex(property_baseURI_name, true);
 
 	zval property_isConnected_default_value;
 	ZVAL_UNDEF(&property_isConnected_default_value);
 	zend_string *property_isConnected_name = zend_string_init("isConnected", sizeof("isConnected") - 1, true);
-	zend_declare_typed_property(class_entry, property_isConnected_name, &property_isConnected_default_value, ZEND_ACC_PUBLIC|ZEND_ACC_VIRTUAL, NULL, (zend_type) ZEND_TYPE_INIT_MASK(MAY_BE_BOOL));
+	zend_declare_typed_property(class_entry, property_isConnected_name, &property_isConnected_default_value, ZEND_ACC_PUBLIC|ZEND_ACC_PRIVATE_SET|ZEND_ACC_VIRTUAL, NULL, (zend_type) ZEND_TYPE_INIT_MASK(MAY_BE_BOOL));
 	zend_string_release_ex(property_isConnected_name, true);
 
 	zval property_ownerDocument_default_value;
 	ZVAL_UNDEF(&property_ownerDocument_default_value);
 	zend_string *property_ownerDocument_name = zend_string_init("ownerDocument", sizeof("ownerDocument") - 1, true);
 	zend_string *property_ownerDocument_class_Dom_Document = zend_string_init("Dom\\Document", sizeof("Dom\\Document")-1, 1);
-	zend_declare_typed_property(class_entry, property_ownerDocument_name, &property_ownerDocument_default_value, ZEND_ACC_PUBLIC|ZEND_ACC_VIRTUAL, NULL, (zend_type) ZEND_TYPE_INIT_CLASS(property_ownerDocument_class_Dom_Document, 0, MAY_BE_NULL));
+	zend_declare_typed_property(class_entry, property_ownerDocument_name, &property_ownerDocument_default_value, ZEND_ACC_PUBLIC|ZEND_ACC_PRIVATE_SET|ZEND_ACC_VIRTUAL, NULL, (zend_type) ZEND_TYPE_INIT_CLASS(property_ownerDocument_class_Dom_Document, 0, MAY_BE_NULL));
 	zend_string_release_ex(property_ownerDocument_name, true);
 
 	zval property_parentNode_default_value;
 	ZVAL_UNDEF(&property_parentNode_default_value);
 	zend_string *property_parentNode_name = zend_string_init("parentNode", sizeof("parentNode") - 1, true);
 	zend_string *property_parentNode_class_Dom_Node = zend_string_init("Dom\\\116ode", sizeof("Dom\\\116ode")-1, 1);
-	zend_declare_typed_property(class_entry, property_parentNode_name, &property_parentNode_default_value, ZEND_ACC_PUBLIC|ZEND_ACC_VIRTUAL, NULL, (zend_type) ZEND_TYPE_INIT_CLASS(property_parentNode_class_Dom_Node, 0, MAY_BE_NULL));
+	zend_declare_typed_property(class_entry, property_parentNode_name, &property_parentNode_default_value, ZEND_ACC_PUBLIC|ZEND_ACC_PRIVATE_SET|ZEND_ACC_VIRTUAL, NULL, (zend_type) ZEND_TYPE_INIT_CLASS(property_parentNode_class_Dom_Node, 0, MAY_BE_NULL));
 	zend_string_release_ex(property_parentNode_name, true);
 
 	zval property_parentElement_default_value;
 	ZVAL_UNDEF(&property_parentElement_default_value);
 	zend_string *property_parentElement_name = zend_string_init("parentElement", sizeof("parentElement") - 1, true);
 	zend_string *property_parentElement_class_Dom_Element = zend_string_init("Dom\\Element", sizeof("Dom\\Element")-1, 1);
-	zend_declare_typed_property(class_entry, property_parentElement_name, &property_parentElement_default_value, ZEND_ACC_PUBLIC|ZEND_ACC_VIRTUAL, NULL, (zend_type) ZEND_TYPE_INIT_CLASS(property_parentElement_class_Dom_Element, 0, MAY_BE_NULL));
+	zend_declare_typed_property(class_entry, property_parentElement_name, &property_parentElement_default_value, ZEND_ACC_PUBLIC|ZEND_ACC_PRIVATE_SET|ZEND_ACC_VIRTUAL, NULL, (zend_type) ZEND_TYPE_INIT_CLASS(property_parentElement_class_Dom_Element, 0, MAY_BE_NULL));
 	zend_string_release_ex(property_parentElement_name, true);
 
 	zval property_childNodes_default_value;
 	ZVAL_UNDEF(&property_childNodes_default_value);
 	zend_string *property_childNodes_name = zend_string_init("childNodes", sizeof("childNodes") - 1, true);
 	zend_string *property_childNodes_class_Dom_NodeList = zend_string_init("Dom\\\116odeList", sizeof("Dom\\\116odeList")-1, 1);
-	zend_declare_typed_property(class_entry, property_childNodes_name, &property_childNodes_default_value, ZEND_ACC_PUBLIC|ZEND_ACC_VIRTUAL, NULL, (zend_type) ZEND_TYPE_INIT_CLASS(property_childNodes_class_Dom_NodeList, 0, 0));
+	zend_declare_typed_property(class_entry, property_childNodes_name, &property_childNodes_default_value, ZEND_ACC_PUBLIC|ZEND_ACC_PRIVATE_SET|ZEND_ACC_VIRTUAL, NULL, (zend_type) ZEND_TYPE_INIT_CLASS(property_childNodes_class_Dom_NodeList, 0, 0));
 	zend_string_release_ex(property_childNodes_name, true);
 
 	zval property_firstChild_default_value;
 	ZVAL_UNDEF(&property_firstChild_default_value);
 	zend_string *property_firstChild_name = zend_string_init("firstChild", sizeof("firstChild") - 1, true);
 	zend_string *property_firstChild_class_Dom_Node = zend_string_init("Dom\\\116ode", sizeof("Dom\\\116ode")-1, 1);
-	zend_declare_typed_property(class_entry, property_firstChild_name, &property_firstChild_default_value, ZEND_ACC_PUBLIC|ZEND_ACC_VIRTUAL, NULL, (zend_type) ZEND_TYPE_INIT_CLASS(property_firstChild_class_Dom_Node, 0, MAY_BE_NULL));
+	zend_declare_typed_property(class_entry, property_firstChild_name, &property_firstChild_default_value, ZEND_ACC_PUBLIC|ZEND_ACC_PRIVATE_SET|ZEND_ACC_VIRTUAL, NULL, (zend_type) ZEND_TYPE_INIT_CLASS(property_firstChild_class_Dom_Node, 0, MAY_BE_NULL));
 	zend_string_release_ex(property_firstChild_name, true);
 
 	zval property_lastChild_default_value;
 	ZVAL_UNDEF(&property_lastChild_default_value);
 	zend_string *property_lastChild_name = zend_string_init("lastChild", sizeof("lastChild") - 1, true);
 	zend_string *property_lastChild_class_Dom_Node = zend_string_init("Dom\\\116ode", sizeof("Dom\\\116ode")-1, 1);
-	zend_declare_typed_property(class_entry, property_lastChild_name, &property_lastChild_default_value, ZEND_ACC_PUBLIC|ZEND_ACC_VIRTUAL, NULL, (zend_type) ZEND_TYPE_INIT_CLASS(property_lastChild_class_Dom_Node, 0, MAY_BE_NULL));
+	zend_declare_typed_property(class_entry, property_lastChild_name, &property_lastChild_default_value, ZEND_ACC_PUBLIC|ZEND_ACC_PRIVATE_SET|ZEND_ACC_VIRTUAL, NULL, (zend_type) ZEND_TYPE_INIT_CLASS(property_lastChild_class_Dom_Node, 0, MAY_BE_NULL));
 	zend_string_release_ex(property_lastChild_name, true);
 
 	zval property_previousSibling_default_value;
 	ZVAL_UNDEF(&property_previousSibling_default_value);
 	zend_string *property_previousSibling_name = zend_string_init("previousSibling", sizeof("previousSibling") - 1, true);
 	zend_string *property_previousSibling_class_Dom_Node = zend_string_init("Dom\\\116ode", sizeof("Dom\\\116ode")-1, 1);
-	zend_declare_typed_property(class_entry, property_previousSibling_name, &property_previousSibling_default_value, ZEND_ACC_PUBLIC|ZEND_ACC_VIRTUAL, NULL, (zend_type) ZEND_TYPE_INIT_CLASS(property_previousSibling_class_Dom_Node, 0, MAY_BE_NULL));
+	zend_declare_typed_property(class_entry, property_previousSibling_name, &property_previousSibling_default_value, ZEND_ACC_PUBLIC|ZEND_ACC_PRIVATE_SET|ZEND_ACC_VIRTUAL, NULL, (zend_type) ZEND_TYPE_INIT_CLASS(property_previousSibling_class_Dom_Node, 0, MAY_BE_NULL));
 	zend_string_release_ex(property_previousSibling_name, true);
 
 	zval property_nextSibling_default_value;
 	ZVAL_UNDEF(&property_nextSibling_default_value);
 	zend_string *property_nextSibling_name = zend_string_init("nextSibling", sizeof("nextSibling") - 1, true);
 	zend_string *property_nextSibling_class_Dom_Node = zend_string_init("Dom\\\116ode", sizeof("Dom\\\116ode")-1, 1);
-	zend_declare_typed_property(class_entry, property_nextSibling_name, &property_nextSibling_default_value, ZEND_ACC_PUBLIC|ZEND_ACC_VIRTUAL, NULL, (zend_type) ZEND_TYPE_INIT_CLASS(property_nextSibling_class_Dom_Node, 0, MAY_BE_NULL));
+	zend_declare_typed_property(class_entry, property_nextSibling_name, &property_nextSibling_default_value, ZEND_ACC_PUBLIC|ZEND_ACC_PRIVATE_SET|ZEND_ACC_VIRTUAL, NULL, (zend_type) ZEND_TYPE_INIT_CLASS(property_nextSibling_class_Dom_Node, 0, MAY_BE_NULL));
 	zend_string_release_ex(property_nextSibling_name, true);
 
 	zval property_nodeValue_default_value;
@@ -2901,7 +2901,7 @@ static zend_class_entry *register_class_Dom_NodeList(zend_class_entry *class_ent
 	zval property_length_default_value;
 	ZVAL_UNDEF(&property_length_default_value);
 	zend_string *property_length_name = zend_string_init("length", sizeof("length") - 1, true);
-	zend_declare_typed_property(class_entry, property_length_name, &property_length_default_value, ZEND_ACC_PUBLIC|ZEND_ACC_VIRTUAL, NULL, (zend_type) ZEND_TYPE_INIT_MASK(MAY_BE_LONG));
+	zend_declare_typed_property(class_entry, property_length_name, &property_length_default_value, ZEND_ACC_PUBLIC|ZEND_ACC_PRIVATE_SET|ZEND_ACC_VIRTUAL, NULL, (zend_type) ZEND_TYPE_INIT_MASK(MAY_BE_LONG));
 	zend_string_release_ex(property_length_name, true);
 
 	return class_entry;
@@ -2918,7 +2918,7 @@ static zend_class_entry *register_class_Dom_NamedNodeMap(zend_class_entry *class
 	zval property_length_default_value;
 	ZVAL_UNDEF(&property_length_default_value);
 	zend_string *property_length_name = zend_string_init("length", sizeof("length") - 1, true);
-	zend_declare_typed_property(class_entry, property_length_name, &property_length_default_value, ZEND_ACC_PUBLIC|ZEND_ACC_VIRTUAL, NULL, (zend_type) ZEND_TYPE_INIT_MASK(MAY_BE_LONG));
+	zend_declare_typed_property(class_entry, property_length_name, &property_length_default_value, ZEND_ACC_PUBLIC|ZEND_ACC_PRIVATE_SET|ZEND_ACC_VIRTUAL, NULL, (zend_type) ZEND_TYPE_INIT_MASK(MAY_BE_LONG));
 	zend_string_release_ex(property_length_name, true);
 
 	return class_entry;
@@ -2935,7 +2935,7 @@ static zend_class_entry *register_class_Dom_DtdNamedNodeMap(zend_class_entry *cl
 	zval property_length_default_value;
 	ZVAL_UNDEF(&property_length_default_value);
 	zend_string *property_length_name = zend_string_init("length", sizeof("length") - 1, true);
-	zend_declare_typed_property(class_entry, property_length_name, &property_length_default_value, ZEND_ACC_PUBLIC|ZEND_ACC_VIRTUAL, NULL, (zend_type) ZEND_TYPE_INIT_MASK(MAY_BE_LONG));
+	zend_declare_typed_property(class_entry, property_length_name, &property_length_default_value, ZEND_ACC_PUBLIC|ZEND_ACC_PRIVATE_SET|ZEND_ACC_VIRTUAL, NULL, (zend_type) ZEND_TYPE_INIT_MASK(MAY_BE_LONG));
 	zend_string_release_ex(property_length_name, true);
 
 	return class_entry;
@@ -2952,7 +2952,7 @@ static zend_class_entry *register_class_Dom_HTMLCollection(zend_class_entry *cla
 	zval property_length_default_value;
 	ZVAL_UNDEF(&property_length_default_value);
 	zend_string *property_length_name = zend_string_init("length", sizeof("length") - 1, true);
-	zend_declare_typed_property(class_entry, property_length_name, &property_length_default_value, ZEND_ACC_PUBLIC|ZEND_ACC_VIRTUAL, NULL, (zend_type) ZEND_TYPE_INIT_MASK(MAY_BE_LONG));
+	zend_declare_typed_property(class_entry, property_length_name, &property_length_default_value, ZEND_ACC_PUBLIC|ZEND_ACC_PRIVATE_SET|ZEND_ACC_VIRTUAL, NULL, (zend_type) ZEND_TYPE_INIT_MASK(MAY_BE_LONG));
 	zend_string_release_ex(property_length_name, true);
 
 	return class_entry;
@@ -2996,66 +2996,66 @@ static zend_class_entry *register_class_Dom_Element(zend_class_entry *class_entr
 	zval property_namespaceURI_default_value;
 	ZVAL_UNDEF(&property_namespaceURI_default_value);
 	zend_string *property_namespaceURI_name = zend_string_init("namespaceURI", sizeof("namespaceURI") - 1, true);
-	zend_declare_typed_property(class_entry, property_namespaceURI_name, &property_namespaceURI_default_value, ZEND_ACC_PUBLIC|ZEND_ACC_VIRTUAL, NULL, (zend_type) ZEND_TYPE_INIT_MASK(MAY_BE_STRING|MAY_BE_NULL));
+	zend_declare_typed_property(class_entry, property_namespaceURI_name, &property_namespaceURI_default_value, ZEND_ACC_PUBLIC|ZEND_ACC_PRIVATE_SET|ZEND_ACC_VIRTUAL, NULL, (zend_type) ZEND_TYPE_INIT_MASK(MAY_BE_STRING|MAY_BE_NULL));
 	zend_string_release_ex(property_namespaceURI_name, true);
 
 	zval property_prefix_default_value;
 	ZVAL_UNDEF(&property_prefix_default_value);
 	zend_string *property_prefix_name = zend_string_init("prefix", sizeof("prefix") - 1, true);
-	zend_declare_typed_property(class_entry, property_prefix_name, &property_prefix_default_value, ZEND_ACC_PUBLIC|ZEND_ACC_VIRTUAL, NULL, (zend_type) ZEND_TYPE_INIT_MASK(MAY_BE_STRING|MAY_BE_NULL));
+	zend_declare_typed_property(class_entry, property_prefix_name, &property_prefix_default_value, ZEND_ACC_PUBLIC|ZEND_ACC_PRIVATE_SET|ZEND_ACC_VIRTUAL, NULL, (zend_type) ZEND_TYPE_INIT_MASK(MAY_BE_STRING|MAY_BE_NULL));
 	zend_string_release_ex(property_prefix_name, true);
 
 	zval property_localName_default_value;
 	ZVAL_UNDEF(&property_localName_default_value);
 	zend_string *property_localName_name = zend_string_init("localName", sizeof("localName") - 1, true);
-	zend_declare_typed_property(class_entry, property_localName_name, &property_localName_default_value, ZEND_ACC_PUBLIC|ZEND_ACC_VIRTUAL, NULL, (zend_type) ZEND_TYPE_INIT_MASK(MAY_BE_STRING));
+	zend_declare_typed_property(class_entry, property_localName_name, &property_localName_default_value, ZEND_ACC_PUBLIC|ZEND_ACC_PRIVATE_SET|ZEND_ACC_VIRTUAL, NULL, (zend_type) ZEND_TYPE_INIT_MASK(MAY_BE_STRING));
 	zend_string_release_ex(property_localName_name, true);
 
 	zval property_tagName_default_value;
 	ZVAL_UNDEF(&property_tagName_default_value);
 	zend_string *property_tagName_name = zend_string_init("tagName", sizeof("tagName") - 1, true);
-	zend_declare_typed_property(class_entry, property_tagName_name, &property_tagName_default_value, ZEND_ACC_PUBLIC|ZEND_ACC_VIRTUAL, NULL, (zend_type) ZEND_TYPE_INIT_MASK(MAY_BE_STRING));
+	zend_declare_typed_property(class_entry, property_tagName_name, &property_tagName_default_value, ZEND_ACC_PUBLIC|ZEND_ACC_PRIVATE_SET|ZEND_ACC_VIRTUAL, NULL, (zend_type) ZEND_TYPE_INIT_MASK(MAY_BE_STRING));
 	zend_string_release_ex(property_tagName_name, true);
 
 	zval property_children_default_value;
 	ZVAL_UNDEF(&property_children_default_value);
 	zend_string *property_children_name = zend_string_init("children", sizeof("children") - 1, true);
 	zend_string *property_children_class_Dom_HTMLCollection = zend_string_init("Dom\\HTMLCollection", sizeof("Dom\\HTMLCollection")-1, 1);
-	zend_declare_typed_property(class_entry, property_children_name, &property_children_default_value, ZEND_ACC_PUBLIC, NULL, (zend_type) ZEND_TYPE_INIT_CLASS(property_children_class_Dom_HTMLCollection, 0, 0));
+	zend_declare_typed_property(class_entry, property_children_name, &property_children_default_value, ZEND_ACC_PUBLIC|ZEND_ACC_PRIVATE_SET, NULL, (zend_type) ZEND_TYPE_INIT_CLASS(property_children_class_Dom_HTMLCollection, 0, 0));
 	zend_string_release_ex(property_children_name, true);
 
 	zval property_firstElementChild_default_value;
 	ZVAL_UNDEF(&property_firstElementChild_default_value);
 	zend_string *property_firstElementChild_name = zend_string_init("firstElementChild", sizeof("firstElementChild") - 1, true);
 	zend_string *property_firstElementChild_class_Dom_Element = zend_string_init("Dom\\Element", sizeof("Dom\\Element")-1, 1);
-	zend_declare_typed_property(class_entry, property_firstElementChild_name, &property_firstElementChild_default_value, ZEND_ACC_PUBLIC|ZEND_ACC_VIRTUAL, NULL, (zend_type) ZEND_TYPE_INIT_CLASS(property_firstElementChild_class_Dom_Element, 0, MAY_BE_NULL));
+	zend_declare_typed_property(class_entry, property_firstElementChild_name, &property_firstElementChild_default_value, ZEND_ACC_PUBLIC|ZEND_ACC_PRIVATE_SET|ZEND_ACC_VIRTUAL, NULL, (zend_type) ZEND_TYPE_INIT_CLASS(property_firstElementChild_class_Dom_Element, 0, MAY_BE_NULL));
 	zend_string_release_ex(property_firstElementChild_name, true);
 
 	zval property_lastElementChild_default_value;
 	ZVAL_UNDEF(&property_lastElementChild_default_value);
 	zend_string *property_lastElementChild_name = zend_string_init("lastElementChild", sizeof("lastElementChild") - 1, true);
 	zend_string *property_lastElementChild_class_Dom_Element = zend_string_init("Dom\\Element", sizeof("Dom\\Element")-1, 1);
-	zend_declare_typed_property(class_entry, property_lastElementChild_name, &property_lastElementChild_default_value, ZEND_ACC_PUBLIC|ZEND_ACC_VIRTUAL, NULL, (zend_type) ZEND_TYPE_INIT_CLASS(property_lastElementChild_class_Dom_Element, 0, MAY_BE_NULL));
+	zend_declare_typed_property(class_entry, property_lastElementChild_name, &property_lastElementChild_default_value, ZEND_ACC_PUBLIC|ZEND_ACC_PRIVATE_SET|ZEND_ACC_VIRTUAL, NULL, (zend_type) ZEND_TYPE_INIT_CLASS(property_lastElementChild_class_Dom_Element, 0, MAY_BE_NULL));
 	zend_string_release_ex(property_lastElementChild_name, true);
 
 	zval property_childElementCount_default_value;
 	ZVAL_UNDEF(&property_childElementCount_default_value);
 	zend_string *property_childElementCount_name = zend_string_init("childElementCount", sizeof("childElementCount") - 1, true);
-	zend_declare_typed_property(class_entry, property_childElementCount_name, &property_childElementCount_default_value, ZEND_ACC_PUBLIC|ZEND_ACC_VIRTUAL, NULL, (zend_type) ZEND_TYPE_INIT_MASK(MAY_BE_LONG));
+	zend_declare_typed_property(class_entry, property_childElementCount_name, &property_childElementCount_default_value, ZEND_ACC_PUBLIC|ZEND_ACC_PRIVATE_SET|ZEND_ACC_VIRTUAL, NULL, (zend_type) ZEND_TYPE_INIT_MASK(MAY_BE_LONG));
 	zend_string_release_ex(property_childElementCount_name, true);
 
 	zval property_previousElementSibling_default_value;
 	ZVAL_UNDEF(&property_previousElementSibling_default_value);
 	zend_string *property_previousElementSibling_name = zend_string_init("previousElementSibling", sizeof("previousElementSibling") - 1, true);
 	zend_string *property_previousElementSibling_class_Dom_Element = zend_string_init("Dom\\Element", sizeof("Dom\\Element")-1, 1);
-	zend_declare_typed_property(class_entry, property_previousElementSibling_name, &property_previousElementSibling_default_value, ZEND_ACC_PUBLIC|ZEND_ACC_VIRTUAL, NULL, (zend_type) ZEND_TYPE_INIT_CLASS(property_previousElementSibling_class_Dom_Element, 0, MAY_BE_NULL));
+	zend_declare_typed_property(class_entry, property_previousElementSibling_name, &property_previousElementSibling_default_value, ZEND_ACC_PUBLIC|ZEND_ACC_PRIVATE_SET|ZEND_ACC_VIRTUAL, NULL, (zend_type) ZEND_TYPE_INIT_CLASS(property_previousElementSibling_class_Dom_Element, 0, MAY_BE_NULL));
 	zend_string_release_ex(property_previousElementSibling_name, true);
 
 	zval property_nextElementSibling_default_value;
 	ZVAL_UNDEF(&property_nextElementSibling_default_value);
 	zend_string *property_nextElementSibling_name = zend_string_init("nextElementSibling", sizeof("nextElementSibling") - 1, true);
 	zend_string *property_nextElementSibling_class_Dom_Element = zend_string_init("Dom\\Element", sizeof("Dom\\Element")-1, 1);
-	zend_declare_typed_property(class_entry, property_nextElementSibling_name, &property_nextElementSibling_default_value, ZEND_ACC_PUBLIC|ZEND_ACC_VIRTUAL, NULL, (zend_type) ZEND_TYPE_INIT_CLASS(property_nextElementSibling_class_Dom_Element, 0, MAY_BE_NULL));
+	zend_declare_typed_property(class_entry, property_nextElementSibling_name, &property_nextElementSibling_default_value, ZEND_ACC_PUBLIC|ZEND_ACC_PRIVATE_SET|ZEND_ACC_VIRTUAL, NULL, (zend_type) ZEND_TYPE_INIT_CLASS(property_nextElementSibling_class_Dom_Element, 0, MAY_BE_NULL));
 	zend_string_release_ex(property_nextElementSibling_name, true);
 
 	zval property_id_default_value;
@@ -3074,14 +3074,14 @@ static zend_class_entry *register_class_Dom_Element(zend_class_entry *class_entr
 	ZVAL_UNDEF(&property_classList_default_value);
 	zend_string *property_classList_name = zend_string_init("classList", sizeof("classList") - 1, true);
 	zend_string *property_classList_class_Dom_TokenList = zend_string_init("Dom\\TokenList", sizeof("Dom\\TokenList")-1, 1);
-	zend_declare_typed_property(class_entry, property_classList_name, &property_classList_default_value, ZEND_ACC_PUBLIC, NULL, (zend_type) ZEND_TYPE_INIT_CLASS(property_classList_class_Dom_TokenList, 0, 0));
+	zend_declare_typed_property(class_entry, property_classList_name, &property_classList_default_value, ZEND_ACC_PUBLIC|ZEND_ACC_PRIVATE_SET, NULL, (zend_type) ZEND_TYPE_INIT_CLASS(property_classList_class_Dom_TokenList, 0, 0));
 	zend_string_release_ex(property_classList_name, true);
 
 	zval property_attributes_default_value;
 	ZVAL_UNDEF(&property_attributes_default_value);
 	zend_string *property_attributes_name = zend_string_init("attributes", sizeof("attributes") - 1, true);
 	zend_string *property_attributes_class_Dom_NamedNodeMap = zend_string_init("Dom\\\116amedNodeMap", sizeof("Dom\\\116amedNodeMap")-1, 1);
-	zend_declare_typed_property(class_entry, property_attributes_name, &property_attributes_default_value, ZEND_ACC_PUBLIC|ZEND_ACC_VIRTUAL, NULL, (zend_type) ZEND_TYPE_INIT_CLASS(property_attributes_class_Dom_NamedNodeMap, 0, 0));
+	zend_declare_typed_property(class_entry, property_attributes_name, &property_attributes_default_value, ZEND_ACC_PUBLIC|ZEND_ACC_PRIVATE_SET|ZEND_ACC_VIRTUAL, NULL, (zend_type) ZEND_TYPE_INIT_CLASS(property_attributes_class_Dom_NamedNodeMap, 0, 0));
 	zend_string_release_ex(property_attributes_name, true);
 
 	zval property_innerHTML_default_value;
@@ -3125,24 +3125,24 @@ static zend_class_entry *register_class_Dom_Attr(zend_class_entry *class_entry_D
 	zval property_namespaceURI_default_value;
 	ZVAL_UNDEF(&property_namespaceURI_default_value);
 	zend_string *property_namespaceURI_name = zend_string_init("namespaceURI", sizeof("namespaceURI") - 1, true);
-	zend_declare_typed_property(class_entry, property_namespaceURI_name, &property_namespaceURI_default_value, ZEND_ACC_PUBLIC|ZEND_ACC_VIRTUAL, NULL, (zend_type) ZEND_TYPE_INIT_MASK(MAY_BE_STRING|MAY_BE_NULL));
+	zend_declare_typed_property(class_entry, property_namespaceURI_name, &property_namespaceURI_default_value, ZEND_ACC_PUBLIC|ZEND_ACC_PRIVATE_SET|ZEND_ACC_VIRTUAL, NULL, (zend_type) ZEND_TYPE_INIT_MASK(MAY_BE_STRING|MAY_BE_NULL));
 	zend_string_release_ex(property_namespaceURI_name, true);
 
 	zval property_prefix_default_value;
 	ZVAL_UNDEF(&property_prefix_default_value);
 	zend_string *property_prefix_name = zend_string_init("prefix", sizeof("prefix") - 1, true);
-	zend_declare_typed_property(class_entry, property_prefix_name, &property_prefix_default_value, ZEND_ACC_PUBLIC|ZEND_ACC_VIRTUAL, NULL, (zend_type) ZEND_TYPE_INIT_MASK(MAY_BE_STRING|MAY_BE_NULL));
+	zend_declare_typed_property(class_entry, property_prefix_name, &property_prefix_default_value, ZEND_ACC_PUBLIC|ZEND_ACC_PRIVATE_SET|ZEND_ACC_VIRTUAL, NULL, (zend_type) ZEND_TYPE_INIT_MASK(MAY_BE_STRING|MAY_BE_NULL));
 	zend_string_release_ex(property_prefix_name, true);
 
 	zval property_localName_default_value;
 	ZVAL_UNDEF(&property_localName_default_value);
 	zend_string *property_localName_name = zend_string_init("localName", sizeof("localName") - 1, true);
-	zend_declare_typed_property(class_entry, property_localName_name, &property_localName_default_value, ZEND_ACC_PUBLIC|ZEND_ACC_VIRTUAL, NULL, (zend_type) ZEND_TYPE_INIT_MASK(MAY_BE_STRING));
+	zend_declare_typed_property(class_entry, property_localName_name, &property_localName_default_value, ZEND_ACC_PUBLIC|ZEND_ACC_PRIVATE_SET|ZEND_ACC_VIRTUAL, NULL, (zend_type) ZEND_TYPE_INIT_MASK(MAY_BE_STRING));
 	zend_string_release_ex(property_localName_name, true);
 
 	zval property_name_default_value;
 	ZVAL_UNDEF(&property_name_default_value);
-	zend_declare_typed_property(class_entry, ZSTR_KNOWN(ZEND_STR_NAME), &property_name_default_value, ZEND_ACC_PUBLIC|ZEND_ACC_VIRTUAL, NULL, (zend_type) ZEND_TYPE_INIT_MASK(MAY_BE_STRING));
+	zend_declare_typed_property(class_entry, ZSTR_KNOWN(ZEND_STR_NAME), &property_name_default_value, ZEND_ACC_PUBLIC|ZEND_ACC_PRIVATE_SET|ZEND_ACC_VIRTUAL, NULL, (zend_type) ZEND_TYPE_INIT_MASK(MAY_BE_STRING));
 
 	zval property_value_default_value;
 	ZVAL_UNDEF(&property_value_default_value);
@@ -3152,13 +3152,13 @@ static zend_class_entry *register_class_Dom_Attr(zend_class_entry *class_entry_D
 	ZVAL_UNDEF(&property_ownerElement_default_value);
 	zend_string *property_ownerElement_name = zend_string_init("ownerElement", sizeof("ownerElement") - 1, true);
 	zend_string *property_ownerElement_class_Dom_Element = zend_string_init("Dom\\Element", sizeof("Dom\\Element")-1, 1);
-	zend_declare_typed_property(class_entry, property_ownerElement_name, &property_ownerElement_default_value, ZEND_ACC_PUBLIC|ZEND_ACC_VIRTUAL, NULL, (zend_type) ZEND_TYPE_INIT_CLASS(property_ownerElement_class_Dom_Element, 0, MAY_BE_NULL));
+	zend_declare_typed_property(class_entry, property_ownerElement_name, &property_ownerElement_default_value, ZEND_ACC_PUBLIC|ZEND_ACC_PRIVATE_SET|ZEND_ACC_VIRTUAL, NULL, (zend_type) ZEND_TYPE_INIT_CLASS(property_ownerElement_class_Dom_Element, 0, MAY_BE_NULL));
 	zend_string_release_ex(property_ownerElement_name, true);
 
 	zval property_specified_default_value;
 	ZVAL_UNDEF(&property_specified_default_value);
 	zend_string *property_specified_name = zend_string_init("specified", sizeof("specified") - 1, true);
-	zend_declare_typed_property(class_entry, property_specified_name, &property_specified_default_value, ZEND_ACC_PUBLIC|ZEND_ACC_VIRTUAL, NULL, (zend_type) ZEND_TYPE_INIT_MASK(MAY_BE_BOOL));
+	zend_declare_typed_property(class_entry, property_specified_name, &property_specified_default_value, ZEND_ACC_PUBLIC|ZEND_ACC_PRIVATE_SET|ZEND_ACC_VIRTUAL, NULL, (zend_type) ZEND_TYPE_INIT_MASK(MAY_BE_BOOL));
 	zend_string_release_ex(property_specified_name, true);
 
 	return class_entry;
@@ -3176,14 +3176,14 @@ static zend_class_entry *register_class_Dom_CharacterData(zend_class_entry *clas
 	ZVAL_UNDEF(&property_previousElementSibling_default_value);
 	zend_string *property_previousElementSibling_name = zend_string_init("previousElementSibling", sizeof("previousElementSibling") - 1, true);
 	zend_string *property_previousElementSibling_class_Dom_Element = zend_string_init("Dom\\Element", sizeof("Dom\\Element")-1, 1);
-	zend_declare_typed_property(class_entry, property_previousElementSibling_name, &property_previousElementSibling_default_value, ZEND_ACC_PUBLIC|ZEND_ACC_VIRTUAL, NULL, (zend_type) ZEND_TYPE_INIT_CLASS(property_previousElementSibling_class_Dom_Element, 0, MAY_BE_NULL));
+	zend_declare_typed_property(class_entry, property_previousElementSibling_name, &property_previousElementSibling_default_value, ZEND_ACC_PUBLIC|ZEND_ACC_PRIVATE_SET|ZEND_ACC_VIRTUAL, NULL, (zend_type) ZEND_TYPE_INIT_CLASS(property_previousElementSibling_class_Dom_Element, 0, MAY_BE_NULL));
 	zend_string_release_ex(property_previousElementSibling_name, true);
 
 	zval property_nextElementSibling_default_value;
 	ZVAL_UNDEF(&property_nextElementSibling_default_value);
 	zend_string *property_nextElementSibling_name = zend_string_init("nextElementSibling", sizeof("nextElementSibling") - 1, true);
 	zend_string *property_nextElementSibling_class_Dom_Element = zend_string_init("Dom\\Element", sizeof("Dom\\Element")-1, 1);
-	zend_declare_typed_property(class_entry, property_nextElementSibling_name, &property_nextElementSibling_default_value, ZEND_ACC_PUBLIC|ZEND_ACC_VIRTUAL, NULL, (zend_type) ZEND_TYPE_INIT_CLASS(property_nextElementSibling_class_Dom_Element, 0, MAY_BE_NULL));
+	zend_declare_typed_property(class_entry, property_nextElementSibling_name, &property_nextElementSibling_default_value, ZEND_ACC_PUBLIC|ZEND_ACC_PRIVATE_SET|ZEND_ACC_VIRTUAL, NULL, (zend_type) ZEND_TYPE_INIT_CLASS(property_nextElementSibling_class_Dom_Element, 0, MAY_BE_NULL));
 	zend_string_release_ex(property_nextElementSibling_name, true);
 
 	zval property_data_default_value;
@@ -3195,7 +3195,7 @@ static zend_class_entry *register_class_Dom_CharacterData(zend_class_entry *clas
 	zval property_length_default_value;
 	ZVAL_UNDEF(&property_length_default_value);
 	zend_string *property_length_name = zend_string_init("length", sizeof("length") - 1, true);
-	zend_declare_typed_property(class_entry, property_length_name, &property_length_default_value, ZEND_ACC_PUBLIC|ZEND_ACC_VIRTUAL, NULL, (zend_type) ZEND_TYPE_INIT_MASK(MAY_BE_LONG));
+	zend_declare_typed_property(class_entry, property_length_name, &property_length_default_value, ZEND_ACC_PUBLIC|ZEND_ACC_PRIVATE_SET|ZEND_ACC_VIRTUAL, NULL, (zend_type) ZEND_TYPE_INIT_MASK(MAY_BE_LONG));
 	zend_string_release_ex(property_length_name, true);
 
 	return class_entry;
@@ -3211,7 +3211,7 @@ static zend_class_entry *register_class_Dom_Text(zend_class_entry *class_entry_D
 	zval property_wholeText_default_value;
 	ZVAL_UNDEF(&property_wholeText_default_value);
 	zend_string *property_wholeText_name = zend_string_init("wholeText", sizeof("wholeText") - 1, true);
-	zend_declare_typed_property(class_entry, property_wholeText_name, &property_wholeText_default_value, ZEND_ACC_PUBLIC|ZEND_ACC_VIRTUAL, NULL, (zend_type) ZEND_TYPE_INIT_MASK(MAY_BE_STRING));
+	zend_declare_typed_property(class_entry, property_wholeText_name, &property_wholeText_default_value, ZEND_ACC_PUBLIC|ZEND_ACC_PRIVATE_SET|ZEND_ACC_VIRTUAL, NULL, (zend_type) ZEND_TYPE_INIT_MASK(MAY_BE_STRING));
 	zend_string_release_ex(property_wholeText_name, true);
 
 	return class_entry;
@@ -3237,7 +3237,7 @@ static zend_class_entry *register_class_Dom_ProcessingInstruction(zend_class_ent
 	zval property_target_default_value;
 	ZVAL_UNDEF(&property_target_default_value);
 	zend_string *property_target_name = zend_string_init("target", sizeof("target") - 1, true);
-	zend_declare_typed_property(class_entry, property_target_name, &property_target_default_value, ZEND_ACC_PUBLIC|ZEND_ACC_VIRTUAL, NULL, (zend_type) ZEND_TYPE_INIT_MASK(MAY_BE_STRING));
+	zend_declare_typed_property(class_entry, property_target_name, &property_target_default_value, ZEND_ACC_PUBLIC|ZEND_ACC_PRIVATE_SET|ZEND_ACC_VIRTUAL, NULL, (zend_type) ZEND_TYPE_INIT_MASK(MAY_BE_STRING));
 	zend_string_release_ex(property_target_name, true);
 
 	return class_entry;
@@ -3263,38 +3263,38 @@ static zend_class_entry *register_class_Dom_DocumentType(zend_class_entry *class
 
 	zval property_name_default_value;
 	ZVAL_UNDEF(&property_name_default_value);
-	zend_declare_typed_property(class_entry, ZSTR_KNOWN(ZEND_STR_NAME), &property_name_default_value, ZEND_ACC_PUBLIC|ZEND_ACC_VIRTUAL, NULL, (zend_type) ZEND_TYPE_INIT_MASK(MAY_BE_STRING));
+	zend_declare_typed_property(class_entry, ZSTR_KNOWN(ZEND_STR_NAME), &property_name_default_value, ZEND_ACC_PUBLIC|ZEND_ACC_PRIVATE_SET|ZEND_ACC_VIRTUAL, NULL, (zend_type) ZEND_TYPE_INIT_MASK(MAY_BE_STRING));
 
 	zval property_entities_default_value;
 	ZVAL_UNDEF(&property_entities_default_value);
 	zend_string *property_entities_name = zend_string_init("entities", sizeof("entities") - 1, true);
 	zend_string *property_entities_class_Dom_DtdNamedNodeMap = zend_string_init("Dom\\DtdNamedNodeMap", sizeof("Dom\\DtdNamedNodeMap")-1, 1);
-	zend_declare_typed_property(class_entry, property_entities_name, &property_entities_default_value, ZEND_ACC_PUBLIC|ZEND_ACC_VIRTUAL, NULL, (zend_type) ZEND_TYPE_INIT_CLASS(property_entities_class_Dom_DtdNamedNodeMap, 0, 0));
+	zend_declare_typed_property(class_entry, property_entities_name, &property_entities_default_value, ZEND_ACC_PUBLIC|ZEND_ACC_PRIVATE_SET|ZEND_ACC_VIRTUAL, NULL, (zend_type) ZEND_TYPE_INIT_CLASS(property_entities_class_Dom_DtdNamedNodeMap, 0, 0));
 	zend_string_release_ex(property_entities_name, true);
 
 	zval property_notations_default_value;
 	ZVAL_UNDEF(&property_notations_default_value);
 	zend_string *property_notations_name = zend_string_init("notations", sizeof("notations") - 1, true);
 	zend_string *property_notations_class_Dom_DtdNamedNodeMap = zend_string_init("Dom\\DtdNamedNodeMap", sizeof("Dom\\DtdNamedNodeMap")-1, 1);
-	zend_declare_typed_property(class_entry, property_notations_name, &property_notations_default_value, ZEND_ACC_PUBLIC|ZEND_ACC_VIRTUAL, NULL, (zend_type) ZEND_TYPE_INIT_CLASS(property_notations_class_Dom_DtdNamedNodeMap, 0, 0));
+	zend_declare_typed_property(class_entry, property_notations_name, &property_notations_default_value, ZEND_ACC_PUBLIC|ZEND_ACC_PRIVATE_SET|ZEND_ACC_VIRTUAL, NULL, (zend_type) ZEND_TYPE_INIT_CLASS(property_notations_class_Dom_DtdNamedNodeMap, 0, 0));
 	zend_string_release_ex(property_notations_name, true);
 
 	zval property_publicId_default_value;
 	ZVAL_UNDEF(&property_publicId_default_value);
 	zend_string *property_publicId_name = zend_string_init("publicId", sizeof("publicId") - 1, true);
-	zend_declare_typed_property(class_entry, property_publicId_name, &property_publicId_default_value, ZEND_ACC_PUBLIC|ZEND_ACC_VIRTUAL, NULL, (zend_type) ZEND_TYPE_INIT_MASK(MAY_BE_STRING));
+	zend_declare_typed_property(class_entry, property_publicId_name, &property_publicId_default_value, ZEND_ACC_PUBLIC|ZEND_ACC_PRIVATE_SET|ZEND_ACC_VIRTUAL, NULL, (zend_type) ZEND_TYPE_INIT_MASK(MAY_BE_STRING));
 	zend_string_release_ex(property_publicId_name, true);
 
 	zval property_systemId_default_value;
 	ZVAL_UNDEF(&property_systemId_default_value);
 	zend_string *property_systemId_name = zend_string_init("systemId", sizeof("systemId") - 1, true);
-	zend_declare_typed_property(class_entry, property_systemId_name, &property_systemId_default_value, ZEND_ACC_PUBLIC|ZEND_ACC_VIRTUAL, NULL, (zend_type) ZEND_TYPE_INIT_MASK(MAY_BE_STRING));
+	zend_declare_typed_property(class_entry, property_systemId_name, &property_systemId_default_value, ZEND_ACC_PUBLIC|ZEND_ACC_PRIVATE_SET|ZEND_ACC_VIRTUAL, NULL, (zend_type) ZEND_TYPE_INIT_MASK(MAY_BE_STRING));
 	zend_string_release_ex(property_systemId_name, true);
 
 	zval property_internalSubset_default_value;
 	ZVAL_UNDEF(&property_internalSubset_default_value);
 	zend_string *property_internalSubset_name = zend_string_init("internalSubset", sizeof("internalSubset") - 1, true);
-	zend_declare_typed_property(class_entry, property_internalSubset_name, &property_internalSubset_default_value, ZEND_ACC_PUBLIC|ZEND_ACC_VIRTUAL, NULL, (zend_type) ZEND_TYPE_INIT_MASK(MAY_BE_STRING|MAY_BE_NULL));
+	zend_declare_typed_property(class_entry, property_internalSubset_name, &property_internalSubset_default_value, ZEND_ACC_PUBLIC|ZEND_ACC_PRIVATE_SET|ZEND_ACC_VIRTUAL, NULL, (zend_type) ZEND_TYPE_INIT_MASK(MAY_BE_STRING|MAY_BE_NULL));
 	zend_string_release_ex(property_internalSubset_name, true);
 
 	return class_entry;
@@ -3312,27 +3312,27 @@ static zend_class_entry *register_class_Dom_DocumentFragment(zend_class_entry *c
 	ZVAL_UNDEF(&property_children_default_value);
 	zend_string *property_children_name = zend_string_init("children", sizeof("children") - 1, true);
 	zend_string *property_children_class_Dom_HTMLCollection = zend_string_init("Dom\\HTMLCollection", sizeof("Dom\\HTMLCollection")-1, 1);
-	zend_declare_typed_property(class_entry, property_children_name, &property_children_default_value, ZEND_ACC_PUBLIC, NULL, (zend_type) ZEND_TYPE_INIT_CLASS(property_children_class_Dom_HTMLCollection, 0, 0));
+	zend_declare_typed_property(class_entry, property_children_name, &property_children_default_value, ZEND_ACC_PUBLIC|ZEND_ACC_PRIVATE_SET, NULL, (zend_type) ZEND_TYPE_INIT_CLASS(property_children_class_Dom_HTMLCollection, 0, 0));
 	zend_string_release_ex(property_children_name, true);
 
 	zval property_firstElementChild_default_value;
 	ZVAL_UNDEF(&property_firstElementChild_default_value);
 	zend_string *property_firstElementChild_name = zend_string_init("firstElementChild", sizeof("firstElementChild") - 1, true);
 	zend_string *property_firstElementChild_class_Dom_Element = zend_string_init("Dom\\Element", sizeof("Dom\\Element")-1, 1);
-	zend_declare_typed_property(class_entry, property_firstElementChild_name, &property_firstElementChild_default_value, ZEND_ACC_PUBLIC|ZEND_ACC_VIRTUAL, NULL, (zend_type) ZEND_TYPE_INIT_CLASS(property_firstElementChild_class_Dom_Element, 0, MAY_BE_NULL));
+	zend_declare_typed_property(class_entry, property_firstElementChild_name, &property_firstElementChild_default_value, ZEND_ACC_PUBLIC|ZEND_ACC_PRIVATE_SET|ZEND_ACC_VIRTUAL, NULL, (zend_type) ZEND_TYPE_INIT_CLASS(property_firstElementChild_class_Dom_Element, 0, MAY_BE_NULL));
 	zend_string_release_ex(property_firstElementChild_name, true);
 
 	zval property_lastElementChild_default_value;
 	ZVAL_UNDEF(&property_lastElementChild_default_value);
 	zend_string *property_lastElementChild_name = zend_string_init("lastElementChild", sizeof("lastElementChild") - 1, true);
 	zend_string *property_lastElementChild_class_Dom_Element = zend_string_init("Dom\\Element", sizeof("Dom\\Element")-1, 1);
-	zend_declare_typed_property(class_entry, property_lastElementChild_name, &property_lastElementChild_default_value, ZEND_ACC_PUBLIC|ZEND_ACC_VIRTUAL, NULL, (zend_type) ZEND_TYPE_INIT_CLASS(property_lastElementChild_class_Dom_Element, 0, MAY_BE_NULL));
+	zend_declare_typed_property(class_entry, property_lastElementChild_name, &property_lastElementChild_default_value, ZEND_ACC_PUBLIC|ZEND_ACC_PRIVATE_SET|ZEND_ACC_VIRTUAL, NULL, (zend_type) ZEND_TYPE_INIT_CLASS(property_lastElementChild_class_Dom_Element, 0, MAY_BE_NULL));
 	zend_string_release_ex(property_lastElementChild_name, true);
 
 	zval property_childElementCount_default_value;
 	ZVAL_UNDEF(&property_childElementCount_default_value);
 	zend_string *property_childElementCount_name = zend_string_init("childElementCount", sizeof("childElementCount") - 1, true);
-	zend_declare_typed_property(class_entry, property_childElementCount_name, &property_childElementCount_default_value, ZEND_ACC_PUBLIC|ZEND_ACC_VIRTUAL, NULL, (zend_type) ZEND_TYPE_INIT_MASK(MAY_BE_LONG));
+	zend_declare_typed_property(class_entry, property_childElementCount_name, &property_childElementCount_default_value, ZEND_ACC_PUBLIC|ZEND_ACC_PRIVATE_SET|ZEND_ACC_VIRTUAL, NULL, (zend_type) ZEND_TYPE_INIT_MASK(MAY_BE_LONG));
 	zend_string_release_ex(property_childElementCount_name, true);
 
 	return class_entry;
@@ -3348,19 +3348,19 @@ static zend_class_entry *register_class_Dom_Entity(zend_class_entry *class_entry
 	zval property_publicId_default_value;
 	ZVAL_UNDEF(&property_publicId_default_value);
 	zend_string *property_publicId_name = zend_string_init("publicId", sizeof("publicId") - 1, true);
-	zend_declare_typed_property(class_entry, property_publicId_name, &property_publicId_default_value, ZEND_ACC_PUBLIC|ZEND_ACC_VIRTUAL, NULL, (zend_type) ZEND_TYPE_INIT_MASK(MAY_BE_STRING|MAY_BE_NULL));
+	zend_declare_typed_property(class_entry, property_publicId_name, &property_publicId_default_value, ZEND_ACC_PUBLIC|ZEND_ACC_PRIVATE_SET|ZEND_ACC_VIRTUAL, NULL, (zend_type) ZEND_TYPE_INIT_MASK(MAY_BE_STRING|MAY_BE_NULL));
 	zend_string_release_ex(property_publicId_name, true);
 
 	zval property_systemId_default_value;
 	ZVAL_UNDEF(&property_systemId_default_value);
 	zend_string *property_systemId_name = zend_string_init("systemId", sizeof("systemId") - 1, true);
-	zend_declare_typed_property(class_entry, property_systemId_name, &property_systemId_default_value, ZEND_ACC_PUBLIC|ZEND_ACC_VIRTUAL, NULL, (zend_type) ZEND_TYPE_INIT_MASK(MAY_BE_STRING|MAY_BE_NULL));
+	zend_declare_typed_property(class_entry, property_systemId_name, &property_systemId_default_value, ZEND_ACC_PUBLIC|ZEND_ACC_PRIVATE_SET|ZEND_ACC_VIRTUAL, NULL, (zend_type) ZEND_TYPE_INIT_MASK(MAY_BE_STRING|MAY_BE_NULL));
 	zend_string_release_ex(property_systemId_name, true);
 
 	zval property_notationName_default_value;
 	ZVAL_UNDEF(&property_notationName_default_value);
 	zend_string *property_notationName_name = zend_string_init("notationName", sizeof("notationName") - 1, true);
-	zend_declare_typed_property(class_entry, property_notationName_name, &property_notationName_default_value, ZEND_ACC_PUBLIC|ZEND_ACC_VIRTUAL, NULL, (zend_type) ZEND_TYPE_INIT_MASK(MAY_BE_STRING|MAY_BE_NULL));
+	zend_declare_typed_property(class_entry, property_notationName_name, &property_notationName_default_value, ZEND_ACC_PUBLIC|ZEND_ACC_PRIVATE_SET|ZEND_ACC_VIRTUAL, NULL, (zend_type) ZEND_TYPE_INIT_MASK(MAY_BE_STRING|MAY_BE_NULL));
 	zend_string_release_ex(property_notationName_name, true);
 
 	return class_entry;
@@ -3386,13 +3386,13 @@ static zend_class_entry *register_class_Dom_Notation(zend_class_entry *class_ent
 	zval property_publicId_default_value;
 	ZVAL_UNDEF(&property_publicId_default_value);
 	zend_string *property_publicId_name = zend_string_init("publicId", sizeof("publicId") - 1, true);
-	zend_declare_typed_property(class_entry, property_publicId_name, &property_publicId_default_value, ZEND_ACC_PUBLIC|ZEND_ACC_VIRTUAL, NULL, (zend_type) ZEND_TYPE_INIT_MASK(MAY_BE_STRING));
+	zend_declare_typed_property(class_entry, property_publicId_name, &property_publicId_default_value, ZEND_ACC_PUBLIC|ZEND_ACC_PRIVATE_SET|ZEND_ACC_VIRTUAL, NULL, (zend_type) ZEND_TYPE_INIT_MASK(MAY_BE_STRING));
 	zend_string_release_ex(property_publicId_name, true);
 
 	zval property_systemId_default_value;
 	ZVAL_UNDEF(&property_systemId_default_value);
 	zend_string *property_systemId_name = zend_string_init("systemId", sizeof("systemId") - 1, true);
-	zend_declare_typed_property(class_entry, property_systemId_name, &property_systemId_default_value, ZEND_ACC_PUBLIC|ZEND_ACC_VIRTUAL, NULL, (zend_type) ZEND_TYPE_INIT_MASK(MAY_BE_STRING));
+	zend_declare_typed_property(class_entry, property_systemId_name, &property_systemId_default_value, ZEND_ACC_PUBLIC|ZEND_ACC_PRIVATE_SET|ZEND_ACC_VIRTUAL, NULL, (zend_type) ZEND_TYPE_INIT_MASK(MAY_BE_STRING));
 	zend_string_release_ex(property_systemId_name, true);
 
 	return class_entry;
@@ -3410,34 +3410,34 @@ static zend_class_entry *register_class_Dom_Document(zend_class_entry *class_ent
 	ZVAL_UNDEF(&property_children_default_value);
 	zend_string *property_children_name = zend_string_init("children", sizeof("children") - 1, true);
 	zend_string *property_children_class_Dom_HTMLCollection = zend_string_init("Dom\\HTMLCollection", sizeof("Dom\\HTMLCollection")-1, 1);
-	zend_declare_typed_property(class_entry, property_children_name, &property_children_default_value, ZEND_ACC_PUBLIC, NULL, (zend_type) ZEND_TYPE_INIT_CLASS(property_children_class_Dom_HTMLCollection, 0, 0));
+	zend_declare_typed_property(class_entry, property_children_name, &property_children_default_value, ZEND_ACC_PUBLIC|ZEND_ACC_PRIVATE_SET, NULL, (zend_type) ZEND_TYPE_INIT_CLASS(property_children_class_Dom_HTMLCollection, 0, 0));
 	zend_string_release_ex(property_children_name, true);
 
 	zval property_firstElementChild_default_value;
 	ZVAL_UNDEF(&property_firstElementChild_default_value);
 	zend_string *property_firstElementChild_name = zend_string_init("firstElementChild", sizeof("firstElementChild") - 1, true);
 	zend_string *property_firstElementChild_class_Dom_Element = zend_string_init("Dom\\Element", sizeof("Dom\\Element")-1, 1);
-	zend_declare_typed_property(class_entry, property_firstElementChild_name, &property_firstElementChild_default_value, ZEND_ACC_PUBLIC|ZEND_ACC_VIRTUAL, NULL, (zend_type) ZEND_TYPE_INIT_CLASS(property_firstElementChild_class_Dom_Element, 0, MAY_BE_NULL));
+	zend_declare_typed_property(class_entry, property_firstElementChild_name, &property_firstElementChild_default_value, ZEND_ACC_PUBLIC|ZEND_ACC_PRIVATE_SET|ZEND_ACC_VIRTUAL, NULL, (zend_type) ZEND_TYPE_INIT_CLASS(property_firstElementChild_class_Dom_Element, 0, MAY_BE_NULL));
 	zend_string_release_ex(property_firstElementChild_name, true);
 
 	zval property_lastElementChild_default_value;
 	ZVAL_UNDEF(&property_lastElementChild_default_value);
 	zend_string *property_lastElementChild_name = zend_string_init("lastElementChild", sizeof("lastElementChild") - 1, true);
 	zend_string *property_lastElementChild_class_Dom_Element = zend_string_init("Dom\\Element", sizeof("Dom\\Element")-1, 1);
-	zend_declare_typed_property(class_entry, property_lastElementChild_name, &property_lastElementChild_default_value, ZEND_ACC_PUBLIC|ZEND_ACC_VIRTUAL, NULL, (zend_type) ZEND_TYPE_INIT_CLASS(property_lastElementChild_class_Dom_Element, 0, MAY_BE_NULL));
+	zend_declare_typed_property(class_entry, property_lastElementChild_name, &property_lastElementChild_default_value, ZEND_ACC_PUBLIC|ZEND_ACC_PRIVATE_SET|ZEND_ACC_VIRTUAL, NULL, (zend_type) ZEND_TYPE_INIT_CLASS(property_lastElementChild_class_Dom_Element, 0, MAY_BE_NULL));
 	zend_string_release_ex(property_lastElementChild_name, true);
 
 	zval property_childElementCount_default_value;
 	ZVAL_UNDEF(&property_childElementCount_default_value);
 	zend_string *property_childElementCount_name = zend_string_init("childElementCount", sizeof("childElementCount") - 1, true);
-	zend_declare_typed_property(class_entry, property_childElementCount_name, &property_childElementCount_default_value, ZEND_ACC_PUBLIC|ZEND_ACC_VIRTUAL, NULL, (zend_type) ZEND_TYPE_INIT_MASK(MAY_BE_LONG));
+	zend_declare_typed_property(class_entry, property_childElementCount_name, &property_childElementCount_default_value, ZEND_ACC_PUBLIC|ZEND_ACC_PRIVATE_SET|ZEND_ACC_VIRTUAL, NULL, (zend_type) ZEND_TYPE_INIT_MASK(MAY_BE_LONG));
 	zend_string_release_ex(property_childElementCount_name, true);
 
 	zval property_implementation_default_value;
 	ZVAL_UNDEF(&property_implementation_default_value);
 	zend_string *property_implementation_name = zend_string_init("implementation", sizeof("implementation") - 1, true);
 	zend_string *property_implementation_class_Dom_Implementation = zend_string_init("Dom\\Implementation", sizeof("Dom\\Implementation")-1, 1);
-	zend_declare_typed_property(class_entry, property_implementation_name, &property_implementation_default_value, ZEND_ACC_PUBLIC, NULL, (zend_type) ZEND_TYPE_INIT_CLASS(property_implementation_class_Dom_Implementation, 0, 0));
+	zend_declare_typed_property(class_entry, property_implementation_name, &property_implementation_default_value, ZEND_ACC_PUBLIC|ZEND_ACC_PRIVATE_SET, NULL, (zend_type) ZEND_TYPE_INIT_CLASS(property_implementation_class_Dom_Implementation, 0, 0));
 	zend_string_release_ex(property_implementation_name, true);
 
 	zval property_URL_default_value;
@@ -3474,14 +3474,14 @@ static zend_class_entry *register_class_Dom_Document(zend_class_entry *class_ent
 	ZVAL_UNDEF(&property_doctype_default_value);
 	zend_string *property_doctype_name = zend_string_init("doctype", sizeof("doctype") - 1, true);
 	zend_string *property_doctype_class_Dom_DocumentType = zend_string_init("Dom\\DocumentType", sizeof("Dom\\DocumentType")-1, 1);
-	zend_declare_typed_property(class_entry, property_doctype_name, &property_doctype_default_value, ZEND_ACC_PUBLIC|ZEND_ACC_VIRTUAL, NULL, (zend_type) ZEND_TYPE_INIT_CLASS(property_doctype_class_Dom_DocumentType, 0, MAY_BE_NULL));
+	zend_declare_typed_property(class_entry, property_doctype_name, &property_doctype_default_value, ZEND_ACC_PUBLIC|ZEND_ACC_PRIVATE_SET|ZEND_ACC_VIRTUAL, NULL, (zend_type) ZEND_TYPE_INIT_CLASS(property_doctype_class_Dom_DocumentType, 0, MAY_BE_NULL));
 	zend_string_release_ex(property_doctype_name, true);
 
 	zval property_documentElement_default_value;
 	ZVAL_UNDEF(&property_documentElement_default_value);
 	zend_string *property_documentElement_name = zend_string_init("documentElement", sizeof("documentElement") - 1, true);
 	zend_string *property_documentElement_class_Dom_Element = zend_string_init("Dom\\Element", sizeof("Dom\\Element")-1, 1);
-	zend_declare_typed_property(class_entry, property_documentElement_name, &property_documentElement_default_value, ZEND_ACC_PUBLIC|ZEND_ACC_VIRTUAL, NULL, (zend_type) ZEND_TYPE_INIT_CLASS(property_documentElement_class_Dom_Element, 0, MAY_BE_NULL));
+	zend_declare_typed_property(class_entry, property_documentElement_name, &property_documentElement_default_value, ZEND_ACC_PUBLIC|ZEND_ACC_PRIVATE_SET|ZEND_ACC_VIRTUAL, NULL, (zend_type) ZEND_TYPE_INIT_CLASS(property_documentElement_class_Dom_Element, 0, MAY_BE_NULL));
 	zend_string_release_ex(property_documentElement_name, true);
 
 	zval property_body_default_value;
@@ -3495,7 +3495,7 @@ static zend_class_entry *register_class_Dom_Document(zend_class_entry *class_ent
 	ZVAL_UNDEF(&property_head_default_value);
 	zend_string *property_head_name = zend_string_init("head", sizeof("head") - 1, true);
 	zend_string *property_head_class_Dom_HTMLElement = zend_string_init("Dom\\HTMLElement", sizeof("Dom\\HTMLElement")-1, 1);
-	zend_declare_typed_property(class_entry, property_head_name, &property_head_default_value, ZEND_ACC_PUBLIC|ZEND_ACC_VIRTUAL, NULL, (zend_type) ZEND_TYPE_INIT_CLASS(property_head_class_Dom_HTMLElement, 0, MAY_BE_NULL));
+	zend_declare_typed_property(class_entry, property_head_name, &property_head_default_value, ZEND_ACC_PUBLIC|ZEND_ACC_PRIVATE_SET|ZEND_ACC_VIRTUAL, NULL, (zend_type) ZEND_TYPE_INIT_CLASS(property_head_class_Dom_HTMLElement, 0, MAY_BE_NULL));
 	zend_string_release_ex(property_head_name, true);
 
 	zval property_title_default_value;
@@ -3527,7 +3527,7 @@ static zend_class_entry *register_class_Dom_XMLDocument(zend_class_entry *class_
 	zval property_xmlEncoding_default_value;
 	ZVAL_UNDEF(&property_xmlEncoding_default_value);
 	zend_string *property_xmlEncoding_name = zend_string_init("xmlEncoding", sizeof("xmlEncoding") - 1, true);
-	zend_declare_typed_property(class_entry, property_xmlEncoding_name, &property_xmlEncoding_default_value, ZEND_ACC_PUBLIC|ZEND_ACC_VIRTUAL, NULL, (zend_type) ZEND_TYPE_INIT_MASK(MAY_BE_STRING));
+	zend_declare_typed_property(class_entry, property_xmlEncoding_name, &property_xmlEncoding_default_value, ZEND_ACC_PUBLIC|ZEND_ACC_PRIVATE_SET|ZEND_ACC_VIRTUAL, NULL, (zend_type) ZEND_TYPE_INIT_MASK(MAY_BE_STRING));
 	zend_string_release_ex(property_xmlEncoding_name, true);
 
 	zval property_xmlStandalone_default_value;
@@ -3562,7 +3562,7 @@ static zend_class_entry *register_class_Dom_TokenList(zend_class_entry *class_en
 	zval property_length_default_value;
 	ZVAL_UNDEF(&property_length_default_value);
 	zend_string *property_length_name = zend_string_init("length", sizeof("length") - 1, true);
-	zend_declare_typed_property(class_entry, property_length_name, &property_length_default_value, ZEND_ACC_PUBLIC|ZEND_ACC_VIRTUAL, NULL, (zend_type) ZEND_TYPE_INIT_MASK(MAY_BE_LONG));
+	zend_declare_typed_property(class_entry, property_length_name, &property_length_default_value, ZEND_ACC_PUBLIC|ZEND_ACC_PRIVATE_SET|ZEND_ACC_VIRTUAL, NULL, (zend_type) ZEND_TYPE_INIT_MASK(MAY_BE_LONG));
 	zend_string_release_ex(property_length_name, true);
 
 	zval property_value_default_value;
@@ -3613,7 +3613,7 @@ static zend_class_entry *register_class_Dom_XPath(void)
 	ZVAL_UNDEF(&property_document_default_value);
 	zend_string *property_document_name = zend_string_init("document", sizeof("document") - 1, true);
 	zend_string *property_document_class_Dom_Document = zend_string_init("Dom\\Document", sizeof("Dom\\Document")-1, 1);
-	zend_declare_typed_property(class_entry, property_document_name, &property_document_default_value, ZEND_ACC_PUBLIC|ZEND_ACC_VIRTUAL, NULL, (zend_type) ZEND_TYPE_INIT_CLASS(property_document_class_Dom_Document, 0, 0));
+	zend_declare_typed_property(class_entry, property_document_name, &property_document_default_value, ZEND_ACC_PUBLIC|ZEND_ACC_PRIVATE_SET|ZEND_ACC_VIRTUAL, NULL, (zend_type) ZEND_TYPE_INIT_CLASS(property_document_class_Dom_Document, 0, 0));
 	zend_string_release_ex(property_document_name, true);
 
 	zval property_registerNodeNamespaces_default_value;
diff --git a/ext/dom/php_dom_decl.h b/ext/dom/php_dom_decl.h
index f918637ab52d..e42fe5969595 100644
--- a/ext/dom/php_dom_decl.h
+++ b/ext/dom/php_dom_decl.h
@@ -1,8 +1,8 @@
 /* This is a generated file, edit php_dom.stub.php instead.
- * Stub hash: e00668999f4fe9afee1f78f6986467a315f831a5 */
+ * Stub hash: 8d7713834c924709155ed7acc554c9efc55e96c1 */
 
-#ifndef ZEND_PHP_DOM_DECL_e00668999f4fe9afee1f78f6986467a315f831a5_H
-#define ZEND_PHP_DOM_DECL_e00668999f4fe9afee1f78f6986467a315f831a5_H
+#ifndef ZEND_PHP_DOM_DECL_8d7713834c924709155ed7acc554c9efc55e96c1_H
+#define ZEND_PHP_DOM_DECL_8d7713834c924709155ed7acc554c9efc55e96c1_H
 
 typedef enum zend_enum_Dom_AdjacentPosition {
 	ZEND_ENUM_Dom_AdjacentPosition_BeforeBegin = 1,
@@ -11,4 +11,4 @@ typedef enum zend_enum_Dom_AdjacentPosition {
 	ZEND_ENUM_Dom_AdjacentPosition_AfterEnd = 4,
 } zend_enum_Dom_AdjacentPosition;
 
-#endif /* ZEND_PHP_DOM_DECL_e00668999f4fe9afee1f78f6986467a315f831a5_H */
+#endif /* ZEND_PHP_DOM_DECL_8d7713834c924709155ed7acc554c9efc55e96c1_H */
diff --git a/ext/dom/private_data.c b/ext/dom/private_data.c
index bb20093b8ebb..373a79cbe712 100644
--- a/ext/dom/private_data.c
+++ b/ext/dom/private_data.c
@@ -1,14 +1,12 @@
 /*
    +----------------------------------------------------------------------+
-   | Copyright (c) The PHP Group                                          |
+   | Copyright © The PHP Group and Contributors.                          |
    +----------------------------------------------------------------------+
-   | This source file is subject to version 3.01 of the PHP license,      |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | https://www.php.net/license/3_01.txt                                 |
-   | If you did not receive a copy of the PHP license and are unable to   |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@php.net so we can mail you a copy immediately.               |
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Authors: Niels Dossche                             |
    +----------------------------------------------------------------------+
diff --git a/ext/dom/private_data.h b/ext/dom/private_data.h
index ead6c75caf24..c64e96eb1a6d 100644
--- a/ext/dom/private_data.h
+++ b/ext/dom/private_data.h
@@ -1,14 +1,12 @@
 /*
    +----------------------------------------------------------------------+
-   | Copyright (c) The PHP Group                                          |
+   | Copyright © The PHP Group and Contributors.                          |
    +----------------------------------------------------------------------+
-   | This source file is subject to version 3.01 of the PHP license,      |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | https://www.php.net/license/3_01.txt                                 |
-   | If you did not receive a copy of the PHP license and are unable to   |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@php.net so we can mail you a copy immediately.               |
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Authors: Niels Dossche                             |
    +----------------------------------------------------------------------+
diff --git a/ext/dom/processinginstruction.c b/ext/dom/processinginstruction.c
index eda15720eab0..94e5d5b35067 100644
--- a/ext/dom/processinginstruction.c
+++ b/ext/dom/processinginstruction.c
@@ -1,14 +1,12 @@
 /*
    +----------------------------------------------------------------------+
-   | Copyright (c) The PHP Group                                          |
+   | Copyright © The PHP Group and Contributors.                          |
    +----------------------------------------------------------------------+
-   | This source file is subject to version 3.01 of the PHP license,      |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | https://www.php.net/license/3_01.txt                                 |
-   | If you did not receive a copy of the PHP license and are unable to   |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@php.net so we can mail you a copy immediately.               |
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Authors: Christian Stocker                           |
    |          Rob Richards                             |
diff --git a/ext/dom/serialize_common.h b/ext/dom/serialize_common.h
index ed967c98a9ee..88088558e90e 100644
--- a/ext/dom/serialize_common.h
+++ b/ext/dom/serialize_common.h
@@ -1,14 +1,12 @@
 /*
    +----------------------------------------------------------------------+
-   | Copyright (c) The PHP Group                                          |
+   | Copyright © The PHP Group and Contributors.                          |
    +----------------------------------------------------------------------+
-   | This source file is subject to version 3.01 of the PHP license,      |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | https://www.php.net/license/3_01.txt                                 |
-   | If you did not receive a copy of the PHP license and are unable to   |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@php.net so we can mail you a copy immediately.               |
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Authors: Niels Dossche                             |
    +----------------------------------------------------------------------+
diff --git a/ext/dom/tests/gh22077.phpt b/ext/dom/tests/gh22077.phpt
new file mode 100644
index 000000000000..fd4e42cc8aaf
--- /dev/null
+++ b/ext/dom/tests/gh22077.phpt
@@ -0,0 +1,20 @@
+--TEST--
+GH-22077 (UAF in custom XPath function)
+--FILE--
+registerNamespace("my", "my.ns");
+$xpath->registerPHPFunctionNS('my.ns', 'include', function(): DOMElement {
+    $includedDocument = new DOMDocument;
+    $includedDocument->loadXML('');
+    return $includedDocument->documentElement;
+});
+$nodeset = $xpath->query('my:include()/uaf');
+$node = $nodeset->item(0);
+var_dump($nodeset->length);
+var_dump($node->ownerDocument->saveXML($node));
+?>
+--EXPECT--
+int(2)
+string(6) ""
diff --git a/ext/dom/tests/gh22219.phpt b/ext/dom/tests/gh22219.phpt
new file mode 100644
index 000000000000..637a47039c35
--- /dev/null
+++ b/ext/dom/tests/gh22219.phpt
@@ -0,0 +1,54 @@
+--TEST--
+GH-22219 (Dom\XMLDocument::schemaValidate fails to resolve xs:QName value from an in-scope prefix)
+--EXTENSIONS--
+dom
+--SKIPIF--
+
+--FILE--
+
+
+  
+
+XML;
+
+// The 'ref' prefix is declared on  but only used inside the xs:QName
+// attribute value, never as an element or attribute namespace.
+$xsd = <<
+
+  
+    
+      
+        
+          
+            
+          
+        
+      
+    
+  
+
+XSD;
+
+libxml_use_internal_errors(true);
+
+$modern = Dom\XMLDocument::createFromString($xml, LIBXML_NSCLEAN);
+var_dump($modern->schemaValidateSource($xsd));
+
+$legacy = new DOMDocument();
+$legacy->loadXML($xml, LIBXML_NSCLEAN);
+var_dump($legacy->schemaValidateSource($xsd));
+
+foreach (libxml_get_errors() as $error) {
+    echo trim($error->message), PHP_EOL;
+}
+?>
+--EXPECT--
+bool(true)
+bool(true)
diff --git a/ext/dom/tests/modern/html/encoding/HTMLDocument_createFromFile_http_header.phpt b/ext/dom/tests/modern/html/encoding/HTMLDocument_createFromFile_http_header.phpt
index 5c602b87f23e..5164ac68041d 100644
--- a/ext/dom/tests/modern/html/encoding/HTMLDocument_createFromFile_http_header.phpt
+++ b/ext/dom/tests/modern/html/encoding/HTMLDocument_createFromFile_http_header.phpt
@@ -46,6 +46,7 @@ $tests = [
         "text/html; ;;   ; ;; Charset=\"ISO-8859-1\"",
         "text/html;Charset=\"ISO-8859-1",
         "tex.t/h#\$%!&'*%2B-.^_`|~tml;Charset=\"ISO-8859-1\"", // Note: have to encode + as 2B because of implementation details of http_server()
+        "text/html; abcd=ef;charset=ISO-8859-1",
     ],
     "Valid input, but invalid encoding name" => [
         "text/html;Charset=\"ISO-8859-1\\",
@@ -100,6 +101,7 @@ foreach ($tests as $name => $headers) {
 äöü
 äöü
 äöü
+äöü
 --- Valid input, but invalid encoding name ---
 ���
 ���
diff --git a/ext/dom/tests/modern/html/gh21688.phpt b/ext/dom/tests/modern/html/gh21688.phpt
new file mode 100644
index 000000000000..ddfb4d326c63
--- /dev/null
+++ b/ext/dom/tests/modern/html/gh21688.phpt
@@ -0,0 +1,13 @@
+--TEST--
+GH-21688 (SEGV in C14N on empty HTMLDocument)
+--CREDITS--
+YuanchengJiang
+--EXTENSIONS--
+dom
+--FILE--
+C14N());
+?>
+--EXPECT--
+string(0) ""
diff --git a/ext/dom/tests/modern/html/parser/Element_innerHTML.phpt b/ext/dom/tests/modern/html/parser/Element_innerHTML.phpt
index 058d4432b49d..89574b7a631f 100644
--- a/ext/dom/tests/modern/html/parser/Element_innerHTML.phpt
+++ b/ext/dom/tests/modern/html/parser/Element_innerHTML.phpt
@@ -60,6 +60,6 @@ echo $dom->saveXML(), "\n";
 
 
 
-
+
 
 
diff --git a/ext/dom/tests/modern/html/parser/gh21486.phpt b/ext/dom/tests/modern/html/parser/gh21486.phpt
new file mode 100644
index 000000000000..62df1e5ca6bd
--- /dev/null
+++ b/ext/dom/tests/modern/html/parser/gh21486.phpt
@@ -0,0 +1,18 @@
+--TEST--
+GH-21486 (Dom\HTMLDocument parser mangles xml:space and xml:lang attributes)
+--EXTENSIONS--
+dom
+--CREDITS--
+JKingweb
+--FILE--
+");
+$e = $d->getElementsByTagName("div")[0];
+$e->innerHTML = '';
+$svg = $d->querySelector("svg");
+echo $e->innerHTML."\n";
+echo $svg->attributes[0]->localName." ".var_export($svg->attributes[0]->namespaceURI, true)."\n";
+?>
+--EXPECT--
+
+space 'http://www.w3.org/XML/1998/namespace'
diff --git a/ext/dom/tests/modern/spec/Element_prefix_readonly.phpt b/ext/dom/tests/modern/spec/Element_prefix_readonly.phpt
index 78625fcb6f7d..cb623f702983 100644
--- a/ext/dom/tests/modern/spec/Element_prefix_readonly.phpt
+++ b/ext/dom/tests/modern/spec/Element_prefix_readonly.phpt
@@ -14,5 +14,5 @@ try {
 echo $dom->saveXml();
 ?>
 --EXPECT--
-Cannot modify readonly property Dom\HTMLElement::$prefix
+Cannot modify private(set) property Dom\Element::$prefix from global scope
 
diff --git a/ext/dom/tests/modern/xml/DTDNamedNodeMap.phpt b/ext/dom/tests/modern/xml/DTDNamedNodeMap.phpt
index f9bb1f7a996e..4ac15a029e37 100644
--- a/ext/dom/tests/modern/xml/DTDNamedNodeMap.phpt
+++ b/ext/dom/tests/modern/xml/DTDNamedNodeMap.phpt
@@ -21,7 +21,6 @@ var_dump($doctype);
 
 var_dump($doctype->entities["test"]);
 var_dump($doctype->entities["myimage"]);
-// TODO: isConnected returning false is a bug
 var_dump($doctype->notations["GIF"]);
 
 ?>
@@ -142,17 +141,19 @@ object(Dom\Entity)#3 (17) {
   ["textContent"]=>
   NULL
 }
-object(Dom\Notation)#4 (13) {
+object(Dom\Notation)#4 (14) {
   ["nodeType"]=>
   int(12)
   ["nodeName"]=>
   string(3) "GIF"
   ["baseURI"]=>
-  string(11) "about:blank"
+  string(%d) "%s"
   ["isConnected"]=>
-  bool(false)
+  bool(true)
+  ["ownerDocument"]=>
+  string(22) "(object value omitted)"
   ["parentNode"]=>
-  NULL
+  string(22) "(object value omitted)"
   ["parentElement"]=>
   NULL
   ["childNodes"]=>
@@ -168,5 +169,5 @@ object(Dom\Notation)#4 (13) {
   ["nodeValue"]=>
   NULL
   ["textContent"]=>
-  string(0) ""
+  NULL
 }
diff --git a/ext/dom/tests/modern/xml/XMLDocument_node_notation_wiring.phpt b/ext/dom/tests/modern/xml/XMLDocument_node_notation_wiring.phpt
new file mode 100644
index 000000000000..dd74a2737594
--- /dev/null
+++ b/ext/dom/tests/modern/xml/XMLDocument_node_notation_wiring.phpt
@@ -0,0 +1,101 @@
+--TEST--
+Dom\XMLDocument: Dom\Notation nodes are connected to their document and doctype
+--EXTENSIONS--
+dom
+--FILE--
+ '',
+    'JPEG' => '',
+    'HTML' => '',
+];
+
+foreach ($cases as $name => $declaration) {
+    $xml = <<
+
+XML;
+
+    $dom = Dom\XMLDocument::createFromString($xml);
+    $doctype = $dom->doctype;
+    $notations = $doctype->notations;
+
+    echo "=== $name ===\n";
+
+    $namedNotation = $notations->getNamedItem($name);
+    foreach ($notations as $iteratedNotation) {
+        // getNamedItem
+        var_dump($namedNotation->nodeName);
+        var_dump($namedNotation->textContent);
+        var_dump($namedNotation->nodeValue);
+        var_dump($namedNotation->isConnected);
+        var_dump($namedNotation->ownerDocument === $dom);
+        var_dump($namedNotation->parentNode === $doctype);
+        var_dump($namedNotation->parentElement);
+
+        // iteration
+        var_dump($iteratedNotation->nodeName);
+        var_dump($iteratedNotation->textContent);
+        var_dump($iteratedNotation->nodeValue);
+        var_dump($iteratedNotation->isConnected);
+        var_dump($iteratedNotation->ownerDocument === $dom);
+        var_dump($iteratedNotation->parentNode === $doctype);
+        var_dump($iteratedNotation->parentElement);
+
+        // wiring
+        // getNamedItem and iteration each allocate a fresh Notation instance                                                                                                 
+        var_dump($namedNotation !== $iteratedNotation);
+    }
+}
+?>
+--EXPECT--
+=== GIF ===
+string(3) "GIF"
+NULL
+NULL
+bool(true)
+bool(true)
+bool(true)
+NULL
+string(3) "GIF"
+NULL
+NULL
+bool(true)
+bool(true)
+bool(true)
+NULL
+bool(true)
+=== JPEG ===
+string(4) "JPEG"
+NULL
+NULL
+bool(true)
+bool(true)
+bool(true)
+NULL
+string(4) "JPEG"
+NULL
+NULL
+bool(true)
+bool(true)
+bool(true)
+NULL
+bool(true)
+=== HTML ===
+string(4) "HTML"
+NULL
+NULL
+bool(true)
+bool(true)
+bool(true)
+NULL
+string(4) "HTML"
+NULL
+NULL
+bool(true)
+bool(true)
+bool(true)
+NULL
+bool(true)
diff --git a/ext/dom/tests/modern/xml/gh21544.phpt b/ext/dom/tests/modern/xml/gh21544.phpt
new file mode 100644
index 000000000000..b76742ae84a5
--- /dev/null
+++ b/ext/dom/tests/modern/xml/gh21544.phpt
@@ -0,0 +1,28 @@
+--TEST--
+GH-21544 (Dom\XMLDocument::C14N() drops namespace declarations on DOM-built documents)
+--CREDITS--
+Toon Verwerft (veewee)
+--EXTENSIONS--
+dom
+--FILE--
+createElementNS("urn:envelope", "env:Root");
+$doc->appendChild($root);
+$child = $doc->createElementNS("urn:child", "x:Child");
+$root->appendChild($child);
+
+$parsed = Dom\XMLDocument::createFromString(
+    ''
+);
+
+echo "DOM-built C14N: " . $doc->C14N() . PHP_EOL;
+echo "Parsed C14N:    " . $parsed->C14N() . PHP_EOL;
+var_dump($doc->C14N() === $parsed->C14N());
+
+?>
+--EXPECT--
+DOM-built C14N: 
+Parsed C14N:    
+bool(true)
diff --git a/ext/dom/tests/modern/xml/gh21548.phpt b/ext/dom/tests/modern/xml/gh21548.phpt
new file mode 100644
index 000000000000..55299c8d6e67
--- /dev/null
+++ b/ext/dom/tests/modern/xml/gh21548.phpt
@@ -0,0 +1,17 @@
+--TEST--
+GH-21548 (Dom\XMLDocument::C14N() emits duplicate xmlns declarations after setAttributeNS())
+--CREDITS--
+Toon Verwerft (veewee)
+--EXTENSIONS--
+dom
+--FILE--
+');
+$doc->documentElement->setAttributeNS("http://www.w3.org/2000/xmlns/", "xmlns:ns1", "urn:a");
+
+echo $doc->C14N() . PHP_EOL;
+
+?>
+--EXPECT--
+
diff --git a/ext/dom/tests/property_write_errors.phpt b/ext/dom/tests/property_write_errors.phpt
index 58cf800728a6..7d2af3b10555 100644
--- a/ext/dom/tests/property_write_errors.phpt
+++ b/ext/dom/tests/property_write_errors.phpt
@@ -49,8 +49,8 @@ try {
 ?>
 --EXPECT--
 Cannot assign array to property DOMNode::$nodeValue of type ?string
-Cannot modify readonly property DOMDocument::$nodeType
-Cannot modify readonly property DOMDocument::$xmlEncoding
-Cannot modify readonly property DOMEntity::$actualEncoding
-Cannot modify readonly property DOMEntity::$encoding
-Cannot modify readonly property DOMEntity::$version
+Cannot modify private(set) property DOMNode::$nodeType from global scope
+Cannot modify private(set) property DOMDocument::$xmlEncoding from global scope
+Cannot modify private(set) property DOMEntity::$actualEncoding from global scope
+Cannot modify private(set) property DOMEntity::$encoding from global scope
+Cannot modify private(set) property DOMEntity::$version from global scope
diff --git a/ext/dom/text.c b/ext/dom/text.c
index 4c503201c8bf..357ff1969490 100644
--- a/ext/dom/text.c
+++ b/ext/dom/text.c
@@ -1,14 +1,12 @@
 /*
    +----------------------------------------------------------------------+
-   | Copyright (c) The PHP Group                                          |
+   | Copyright © The PHP Group and Contributors.                          |
    +----------------------------------------------------------------------+
-   | This source file is subject to version 3.01 of the PHP license,      |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | https://www.php.net/license/3_01.txt                                 |
-   | If you did not receive a copy of the PHP license and are unable to   |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@php.net so we can mail you a copy immediately.               |
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Authors: Christian Stocker                           |
    |          Rob Richards                             |
diff --git a/ext/dom/token_list.c b/ext/dom/token_list.c
index 84a3dc10afeb..2f1fa3c9e733 100644
--- a/ext/dom/token_list.c
+++ b/ext/dom/token_list.c
@@ -1,14 +1,12 @@
 /*
    +----------------------------------------------------------------------+
-   | Copyright (c) The PHP Group                                          |
+   | Copyright © The PHP Group and Contributors.                          |
    +----------------------------------------------------------------------+
-   | This source file is subject to version 3.01 of the PHP license,      |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | https://www.php.net/license/3_01.txt                                 |
-   | If you did not receive a copy of the PHP license and are unable to   |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@php.net so we can mail you a copy immediately.               |
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Authors: Niels Dossche                             |
    +----------------------------------------------------------------------+
@@ -486,7 +484,7 @@ static bool dom_validate_tokens_varargs(const zval *args, uint32_t argc)
 {
 	for (uint32_t i = 0; i < argc; i++) {
 		if (Z_TYPE(args[i]) != IS_STRING) {
-			zend_argument_type_error(i + 1, "must be of type string, %s given", zend_zval_value_name(&args[i]));
+			zend_wrong_parameter_type_error(i + 1, Z_EXPECTED_STRING, &args[i]);
 			return false;
 		}
 
@@ -577,7 +575,7 @@ PHP_METHOD(Dom_TokenList, toggle)
 	HashTable *token_set = TOKEN_LIST_GET_SET(intern);
 	zval *found_token = zend_hash_find(token_set, token);
 	if (found_token != NULL) {
-		ZEND_ASSERT(XtOffsetOf(Bucket, val) == 0 && "the cast only works if this is true");
+		ZEND_ASSERT(offsetof(Bucket, val) == 0 && "the cast only works if this is true");
 		Bucket *bucket = (Bucket *) found_token;
 
 		/* 3.1. If force is either not given or is false, then remove token from this’s token set,
@@ -627,7 +625,7 @@ PHP_METHOD(Dom_TokenList, replace)
 	}
 
 	/* 4. Replace token in this’s token set with newToken. */
-	ZEND_ASSERT(XtOffsetOf(Bucket, val) == 0 && "the cast only works if this is true");
+	ZEND_ASSERT(offsetof(Bucket, val) == 0 && "the cast only works if this is true");
 	Bucket *bucket = (Bucket *) found_token;
 	if (zend_hash_set_bucket_key(token_set, bucket, new_token) == NULL) {
 		/* It already exists, remove token instead. */
diff --git a/ext/dom/token_list.h b/ext/dom/token_list.h
index 7c8a6f612ffa..7bddd6c9b462 100644
--- a/ext/dom/token_list.h
+++ b/ext/dom/token_list.h
@@ -1,14 +1,12 @@
 /*
    +----------------------------------------------------------------------+
-   | Copyright (c) The PHP Group                                          |
+   | Copyright © The PHP Group and Contributors.                          |
    +----------------------------------------------------------------------+
-   | This source file is subject to version 3.01 of the PHP license,      |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | https://www.php.net/license/3_01.txt                                 |
-   | If you did not receive a copy of the PHP license and are unable to   |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@php.net so we can mail you a copy immediately.               |
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Authors: Niels Dossche                             |
    +----------------------------------------------------------------------+
@@ -27,12 +25,12 @@ typedef struct dom_token_list_object {
 
 static inline dom_token_list_object *php_dom_token_list_from_obj(zend_object *obj)
 {
-	return (dom_token_list_object *)((char *) obj - XtOffsetOf(dom_token_list_object, dom.std));
+	return (dom_token_list_object *)((char *) obj - offsetof(dom_token_list_object, dom.std));
 }
 
 static inline dom_token_list_object *php_dom_token_list_from_dom_obj(dom_object *obj)
 {
-	return (dom_token_list_object *)((char *) obj - XtOffsetOf(dom_token_list_object, dom));
+	return ZEND_CONTAINER_OF(obj, dom_token_list_object, dom);
 }
 
 void dom_ordered_set_parser(HashTable *token_set, const char *position, bool to_lowercase);
diff --git a/ext/dom/xml_common.h b/ext/dom/xml_common.h
index a63e43e92a77..ec45fcc08342 100644
--- a/ext/dom/xml_common.h
+++ b/ext/dom/xml_common.h
@@ -1,14 +1,12 @@
 /*
   +----------------------------------------------------------------------+
-  | Copyright (c) The PHP Group                                          |
+  | Copyright © The PHP Group and Contributors.                          |
   +----------------------------------------------------------------------+
-  | This source file is subject to version 3.01 of the PHP license,      |
-  | that is bundled with this package in the file LICENSE, and is        |
-  | available through the world-wide-web at the following url:           |
-  | https://www.php.net/license/3_01.txt                                 |
-  | If you did not receive a copy of the PHP license and are unable to   |
-  | obtain it through the world-wide-web, please send a note to          |
-  | license@php.net so we can mail you a copy immediately.               |
+  | This source file is subject to the Modified BSD License that is      |
+  | bundled with this package in the file LICENSE, and is available      |
+  | through the World Wide Web at .        |
+  |                                                                      |
+  | SPDX-License-Identifier: BSD-3-Clause                                |
   +----------------------------------------------------------------------+
   | Authors: Christian Stocker                           |
   |          Rob Richards                             |
@@ -29,9 +27,7 @@ typedef struct _dom_object {
 	zend_object std;
 } dom_object;
 
-static inline dom_object *php_dom_obj_from_obj(zend_object *obj) {
-	return (dom_object*)((char*)(obj) - XtOffsetOf(dom_object, std));
-}
+#define php_dom_obj_from_obj(obj) ZEND_CONTAINER_OF(obj, dom_object, std)
 
 #define Z_DOMOBJ_P(zv)  php_dom_obj_from_obj(Z_OBJ_P((zv)))
 
diff --git a/ext/dom/xml_document.c b/ext/dom/xml_document.c
index 66fd1d707aa0..e5966352dc72 100644
--- a/ext/dom/xml_document.c
+++ b/ext/dom/xml_document.c
@@ -1,14 +1,12 @@
 /*
    +----------------------------------------------------------------------+
-   | Copyright (c) The PHP Group                                          |
+   | Copyright © The PHP Group and Contributors.                          |
    +----------------------------------------------------------------------+
-   | This source file is subject to version 3.01 of the PHP license,      |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | https://www.php.net/license/3_01.txt                                 |
-   | If you did not receive a copy of the PHP license and are unable to   |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@php.net so we can mail you a copy immediately.               |
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Authors: Niels Dossche                             |
    +----------------------------------------------------------------------+
@@ -147,7 +145,7 @@ static void load_from_helper(INTERNAL_FUNCTION_PARAMETERS, int mode)
 	}
 
 	if (!source_len) {
-		zend_argument_value_error(1, "must not be empty");
+		zend_argument_must_not_be_empty_error(1);
 		RETURN_THROWS();
 	}
 
diff --git a/ext/dom/xml_serializer.c b/ext/dom/xml_serializer.c
index 7684057a391c..da43f24aab01 100644
--- a/ext/dom/xml_serializer.c
+++ b/ext/dom/xml_serializer.c
@@ -1,14 +1,12 @@
 /*
    +----------------------------------------------------------------------+
-   | Copyright (c) The PHP Group                                          |
+   | Copyright © The PHP Group and Contributors.                          |
    +----------------------------------------------------------------------+
-   | This source file is subject to version 3.01 of the PHP license,      |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | https://www.php.net/license/3_01.txt                                 |
-   | If you did not receive a copy of the PHP license and are unable to   |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@php.net so we can mail you a copy immediately.               |
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Authors: Niels Dossche                             |
    +----------------------------------------------------------------------+
diff --git a/ext/dom/xml_serializer.h b/ext/dom/xml_serializer.h
index 2d5c3bd84277..e686083a27aa 100644
--- a/ext/dom/xml_serializer.h
+++ b/ext/dom/xml_serializer.h
@@ -1,14 +1,12 @@
 /*
    +----------------------------------------------------------------------+
-   | Copyright (c) The PHP Group                                          |
+   | Copyright © The PHP Group and Contributors.                          |
    +----------------------------------------------------------------------+
-   | This source file is subject to version 3.01 of the PHP license,      |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | https://www.php.net/license/3_01.txt                                 |
-   | If you did not receive a copy of the PHP license and are unable to   |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@php.net so we can mail you a copy immediately.               |
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Authors: Niels Dossche                             |
    +----------------------------------------------------------------------+
diff --git a/ext/dom/xpath.c b/ext/dom/xpath.c
index ce17c0810835..bd9947b4ad10 100644
--- a/ext/dom/xpath.c
+++ b/ext/dom/xpath.c
@@ -1,14 +1,12 @@
 /*
    +----------------------------------------------------------------------+
-   | Copyright (c) The PHP Group                                          |
+   | Copyright © The PHP Group and Contributors.                          |
    +----------------------------------------------------------------------+
-   | This source file is subject to version 3.01 of the PHP license,      |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | https://www.php.net/license/3_01.txt                                 |
-   | If you did not receive a copy of the PHP license and are unable to   |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@php.net so we can mail you a copy immediately.               |
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Authors: Christian Stocker                           |
    |          Rob Richards                             |
@@ -35,6 +33,24 @@
 
 #ifdef LIBXML_XPATH_ENABLED
 
+static dom_object *dom_xpath_intern_for_doc(dom_xpath_object *xpath_obj, xmlDocPtr doc)
+{
+	if (xpath_obj->dom.document && xpath_obj->dom.document->ptr == doc) {
+		return &xpath_obj->dom;
+	}
+	HashTable *node_list = xpath_obj->xpath_callbacks.node_list;
+	if (node_list) {
+		zval *entry;
+		ZEND_HASH_PACKED_FOREACH_VAL(node_list, entry) {
+			dom_object *obj = Z_DOMOBJ_P(entry);
+			if (obj->document && obj->document->ptr == doc) {
+				return obj;
+			}
+		} ZEND_HASH_FOREACH_END();
+	}
+	return &xpath_obj->dom;
+}
+
 void dom_xpath_objects_free_storage(zend_object *object)
 {
 	dom_xpath_object *intern = php_xpath_obj_from_obj(object);
@@ -191,7 +207,7 @@ zend_result dom_xpath_document_read(dom_object *obj, zval *retval)
 
 /* {{{ registerNodeNamespaces bool*/
 static inline dom_xpath_object *php_xpath_obj_from_dom_obj(dom_object *obj) {
-	return (dom_xpath_object*)((char*)(obj) - XtOffsetOf(dom_xpath_object, dom));
+	return ZEND_CONTAINER_OF(obj, dom_xpath_object, dom);
 }
 
 zend_result dom_xpath_register_node_ns_read(dom_object *obj, zval *retval)
@@ -354,7 +370,8 @@ static void php_xpath_eval(INTERNAL_FUNCTION_PARAMETERS, int type, bool modern)
 
 						node = php_dom_create_fake_namespace_decl(nsparent, original, &child, parent_intern);
 					} else {
-						php_dom_create_object(node, &child, &intern->dom);
+						dom_object *parent = dom_xpath_intern_for_doc(intern, node->doc);
+						php_dom_create_object(node, &child, parent);
 					}
 					add_next_index_zval(&retval, &child);
 				}
diff --git a/ext/dom/xpath_callbacks.c b/ext/dom/xpath_callbacks.c
index 816c925435ae..90395dc15f2e 100644
--- a/ext/dom/xpath_callbacks.c
+++ b/ext/dom/xpath_callbacks.c
@@ -1,14 +1,12 @@
 /*
    +----------------------------------------------------------------------+
-   | Copyright (c) The PHP Group                                          |
+   | Copyright © The PHP Group and Contributors.                          |
    +----------------------------------------------------------------------+
-   | This source file is subject to version 3.01 of the PHP license,      |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | https://www.php.net/license/3_01.txt                                 |
-   | If you did not receive a copy of the PHP license and are unable to   |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@php.net so we can mail you a copy immediately.               |
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Authors: Christian Stocker                           |
    |          Rob Richards                             |
@@ -408,6 +406,7 @@ static zend_result php_dom_xpath_callback_dispatch(php_dom_xpath_callbacks *xpat
 		fci.param_count = param_count;
 		fci.params = params;
 		fci.named_params = NULL;
+		fci.consumed_args = 0;
 		ZVAL_STRINGL(&fci.function_name, function_name, function_name_length);
 
 		zend_call_function(&fci, NULL);
diff --git a/ext/dom/xpath_callbacks.h b/ext/dom/xpath_callbacks.h
index 3a4d8731f474..072f52196331 100644
--- a/ext/dom/xpath_callbacks.h
+++ b/ext/dom/xpath_callbacks.h
@@ -1,14 +1,12 @@
 /*
    +----------------------------------------------------------------------+
-   | Copyright (c) The PHP Group                                          |
+   | Copyright © The PHP Group and Contributors.                          |
    +----------------------------------------------------------------------+
-   | This source file is subject to version 3.01 of the PHP license,      |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | https://www.php.net/license/3_01.txt                                 |
-   | If you did not receive a copy of the PHP license and are unable to   |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@php.net so we can mail you a copy immediately.               |
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Authors: Niels Dossche                             |
    +----------------------------------------------------------------------+
diff --git a/ext/enchant/enchant.c b/ext/enchant/enchant.c
index 43547ab9b5dc..a109c24062f0 100644
--- a/ext/enchant/enchant.c
+++ b/ext/enchant/enchant.c
@@ -1,14 +1,12 @@
 /*
   +----------------------------------------------------------------------+
-  | Copyright (c) The PHP Group                                          |
+  | Copyright © The PHP Group and Contributors.                          |
   +----------------------------------------------------------------------+
-  | This source file is subject to version 3.01 of the PHP license,      |
-  | that is bundled with this package in the file LICENSE, and is        |
-  | available through the world-wide-web at the following url:           |
-  | https://www.php.net/license/3_01.txt                                 |
-  | If you did not receive a copy of the PHP license and are unable to   |
-  | obtain it through the world-wide-web, please send a note to          |
-  | license@php.net so we can mail you a copy immediately.               |
+  | This source file is subject to the Modified BSD License that is      |
+  | bundled with this package in the file LICENSE, and is available      |
+  | through the World Wide Web at .        |
+  |                                                                      |
+  | SPDX-License-Identifier: BSD-3-Clause                                |
   +----------------------------------------------------------------------+
   | Author: Pierre-Alain Joye                            |
   |         Ilia Alshanetsky                           |
@@ -50,9 +48,7 @@ typedef struct _dict_struct {
 zend_class_entry *enchant_broker_ce;
 static zend_object_handlers enchant_broker_handlers;
 
-static inline enchant_broker *enchant_broker_from_obj(zend_object *obj) {
-	return (enchant_broker *)((char *)(obj) - XtOffsetOf(enchant_broker, std));
-}
+#define enchant_broker_from_obj(obj) ZEND_CONTAINER_OF(obj, enchant_broker, std)
 
 #define Z_ENCHANT_BROKER_P(zv) enchant_broker_from_obj(Z_OBJ_P(zv))
 
@@ -68,9 +64,7 @@ static zend_object *enchant_broker_create_object(zend_class_entry *class_type) {
 zend_class_entry *enchant_dict_ce;
 static zend_object_handlers enchant_dict_handlers;
 
-static inline enchant_dict *enchant_dict_from_obj(zend_object *obj) {
-	return (enchant_dict *)((char *)(obj) - XtOffsetOf(enchant_dict, std));
-}
+#define enchant_dict_from_obj(obj) ZEND_CONTAINER_OF(obj, enchant_dict, std)
 
 #define Z_ENCHANT_DICT_P(zv) enchant_dict_from_obj(Z_OBJ_P(zv))
 
@@ -192,7 +186,7 @@ PHP_MINIT_FUNCTION(enchant)
 	enchant_broker_ce->default_object_handlers = &enchant_broker_handlers;
 
 	memcpy(&enchant_broker_handlers, &std_object_handlers, sizeof(zend_object_handlers));
-	enchant_broker_handlers.offset = XtOffsetOf(enchant_broker, std);
+	enchant_broker_handlers.offset = offsetof(enchant_broker, std);
 	enchant_broker_handlers.free_obj = php_enchant_broker_free;
 	enchant_broker_handlers.clone_obj = NULL;
 	enchant_broker_handlers.compare = zend_objects_not_comparable;
@@ -202,7 +196,7 @@ PHP_MINIT_FUNCTION(enchant)
 	enchant_dict_ce->default_object_handlers = &enchant_dict_handlers;
 
 	memcpy(&enchant_dict_handlers, &std_object_handlers, sizeof(zend_object_handlers));
-	enchant_dict_handlers.offset = XtOffsetOf(enchant_dict, std);
+	enchant_dict_handlers.offset = offsetof(enchant_dict, std);
 	enchant_dict_handlers.free_obj = php_enchant_dict_free;
 	enchant_dict_handlers.clone_obj = NULL;
 	enchant_dict_handlers.compare = zend_objects_not_comparable;
@@ -346,12 +340,10 @@ PHP_FUNCTION(enchant_broker_set_dict_path)
 		case PHP_ENCHANT_MYSPELL:
 			enchant_broker_set_param(pbroker->pbroker, "enchant.myspell.dictionary.path", value);
 			RETURN_TRUE;
-			break;
 
 		case PHP_ENCHANT_ISPELL:
 			enchant_broker_set_param(pbroker->pbroker, "enchant.ispell.dictionary.path", value);
 			RETURN_TRUE;
-			break;
 
 		default:
 			RETURN_FALSE;
diff --git a/ext/enchant/php_enchant.h b/ext/enchant/php_enchant.h
index 81150648d119..d87b2b6550ad 100644
--- a/ext/enchant/php_enchant.h
+++ b/ext/enchant/php_enchant.h
@@ -1,14 +1,12 @@
 /*
   +----------------------------------------------------------------------+
-  | Copyright (c) The PHP Group                                          |
+  | Copyright © The PHP Group and Contributors.                          |
   +----------------------------------------------------------------------+
-  | This source file is subject to version 3.01 of the PHP license,      |
-  | that is bundled with this package in the file LICENSE, and is        |
-  | available through the world-wide-web at the following url:           |
-  | https://www.php.net/license/3_01.txt                                 |
-  | If you did not receive a copy of the PHP license and are unable to   |
-  | obtain it through the world-wide-web, please send a note to          |
-  | license@php.net so we can mail you a copy immediately.               |
+  | This source file is subject to the Modified BSD License that is      |
+  | bundled with this package in the file LICENSE, and is available      |
+  | through the World Wide Web at .        |
+  |                                                                      |
+  | SPDX-License-Identifier: BSD-3-Clause                                |
   +----------------------------------------------------------------------+
   | Author: Pierre-Alain Joye                            |
   +----------------------------------------------------------------------+
diff --git a/ext/exif/exif.c b/ext/exif/exif.c
index 17dadc7539ba..a331cbd40cea 100644
--- a/ext/exif/exif.c
+++ b/ext/exif/exif.c
@@ -1,14 +1,12 @@
 /*
    +----------------------------------------------------------------------+
-   | Copyright (c) The PHP Group                                          |
+   | Copyright © The PHP Group and Contributors.                          |
    +----------------------------------------------------------------------+
-   | This source file is subject to version 3.01 of the PHP license,      |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | https://www.php.net/license/3_01.txt                                 |
-   | If you did not receive a copy of the PHP license and are unable to   |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@php.net so we can mail you a copy immediately.               |
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Authors: Rasmus Lerdorf                              |
    |          Marcus Boerger                               |
@@ -71,7 +69,7 @@ PHP_MINFO_FUNCTION(exif)
 	php_info_print_table_start();
 	php_info_print_table_row(2, "EXIF Support", "enabled");
 	php_info_print_table_row(2, "Supported EXIF Version", "0220");
-	php_info_print_table_row(2, "Supported filetypes", "JPEG, TIFF");
+	php_info_print_table_row(2, "Supported filetypes", "JPEG, TIFF, HEIF, WebP");
 
 	if (USE_MBSTRING) {
 		php_info_print_table_row(2, "Multibyte decoding support using mbstring", "enabled");
@@ -2320,13 +2318,13 @@ static void exif_iif_add_value(image_info_type *image_info, int section_index, c
 #ifdef EXIF_DEBUG
 						php_error_docref(NULL, E_WARNING, "Found value of type single");
 #endif
-						info_value->f = php_ifd_get_float(value);
+						info_value->f = php_ifd_get_float(vptr);
 						break;
 					case TAG_FMT_DOUBLE:
 #ifdef EXIF_DEBUG
 						php_error_docref(NULL, E_WARNING, "Found value of type double");
 #endif
-						info_value->d = php_ifd_get_double(value);
+						info_value->d = php_ifd_get_double(vptr);
 						break;
 				}
 			}
@@ -3752,7 +3750,7 @@ static void exif_process_TIFF_in_JPEG(image_info_type *ImageInfo, char *CharBuf,
 static void exif_process_APP1(image_info_type *ImageInfo, char *CharBuf, size_t length, size_t displacement)
 {
 	/* Check the APP1 for Exif Identifier Code */
-	static const uchar ExifHeader[] = {0x45, 0x78, 0x69, 0x66, 0x00, 0x00};
+	static const uchar ExifHeader[] = {'E', 'x', 'i', 'f', 0, 0};
 	if (length <= 8 || memcmp(CharBuf+2, ExifHeader, 6)) {
 		exif_error_docref(NULL EXIFERR_CC, ImageInfo, E_WARNING, "Incorrect APP1 Exif Identifier Code");
 		return;
@@ -4026,7 +4024,6 @@ static bool exif_scan_thumbnail(image_info_type *ImageInfo)
 			case M_EOI:
 				exif_error_docref(NULL EXIFERR_CC, ImageInfo, E_WARNING, "Could not compute size of thumbnail");
 				return false;
-				break;
 
 			default:
 				/* just skip */
@@ -4448,6 +4445,53 @@ static bool exif_scan_HEIF_header(image_info_type *ImageInfo, unsigned char *buf
 	return ret;
 }
 
+static bool exif_scan_WEBP_header(image_info_type *ImageInfo, size_t riff_size)
+{
+	static const uchar ExifHeader[] = {'E', 'x', 'i', 'f', 0, 0};
+	unsigned char chunk_header[8];
+	size_t offset = 12;
+	size_t riff_end = riff_size <= ImageInfo->FileSize - 8 ? riff_size + 8 : ImageInfo->FileSize;
+
+	while (offset + 8 <= riff_end) {
+		if ((php_stream_seek(ImageInfo->infile, offset, SEEK_SET) < 0) ||
+			(exif_read_from_stream_file_looped(ImageInfo->infile, (char*)chunk_header, 8) != 8)) {
+			return false;
+		}
+
+		size_t chunk_size = php_ifd_get32u(chunk_header + 4, 0);
+		size_t payload_offset = offset + 8;
+
+		if (chunk_size > riff_end - payload_offset) {
+			return false;
+		}
+
+		if (!memcmp(chunk_header, "EXIF", 4)) {
+			size_t skip = 0;
+			bool ret = false;
+
+			if (chunk_size < 8) {
+				return false;
+			}
+
+			char *data = emalloc(chunk_size);
+			if (exif_read_from_stream_file_looped(ImageInfo->infile, data, chunk_size) == chunk_size) {
+				if (chunk_size >= sizeof(ExifHeader) + 8 && !memcmp(data, ExifHeader, sizeof(ExifHeader))) {
+					skip = sizeof(ExifHeader);
+				}
+				exif_process_TIFF_in_JPEG(ImageInfo, data + skip, chunk_size - skip, payload_offset + skip);
+				ret = true;
+			}
+			efree(data);
+			return ret;
+		}
+
+		/* RIFF chunks are word-aligned: an odd payload is followed by a pad byte. */
+		offset = payload_offset + chunk_size + (chunk_size & 1);
+	}
+
+	return false;
+}
+
 /* {{{ exif_scan_FILE_header
  * Parse the marker stream until SOS or EOI is seen; */
 static bool exif_scan_FILE_header(image_info_type *ImageInfo)
@@ -4524,6 +4568,17 @@ static bool exif_scan_FILE_header(image_info_type *ImageInfo)
 				exif_error_docref(NULL EXIFERR_CC, ImageInfo, E_WARNING, "Invalid HEIF file");
 				return false;
 			}
+		} else if ((ImageInfo->FileSize >= 16) &&
+			   (!memcmp(file_header, "RIFF", 4)) &&
+			   (exif_read_from_stream_file_looped(ImageInfo->infile, (char*)(file_header + 8), 4) == 4) &&
+			   (!memcmp(file_header + 8, "WEBP", 4))) {
+			if (exif_scan_WEBP_header(ImageInfo, php_ifd_get32u(file_header + 4, 0))) {
+				ImageInfo->FileType = IMAGE_FILETYPE_WEBP;
+				return true;
+			} else {
+				exif_error_docref(NULL EXIFERR_CC, ImageInfo, E_WARNING, "Invalid WebP file");
+				return false;
+			}
 		} else {
 			exif_error_docref(NULL EXIFERR_CC, ImageInfo, E_WARNING, "File not supported");
 			return false;
diff --git a/ext/exif/php_exif.h b/ext/exif/php_exif.h
index 4ae5894f9036..5a4d2ec4d2a5 100644
--- a/ext/exif/php_exif.h
+++ b/ext/exif/php_exif.h
@@ -1,14 +1,12 @@
 /*
    +----------------------------------------------------------------------+
-   | Copyright (c) The PHP Group                                          |
+   | Copyright © The PHP Group and Contributors.                          |
    +----------------------------------------------------------------------+
-   | This source file is subject to version 3.01 of the PHP license,      |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | https://www.php.net/license/3_01.txt                                 |
-   | If you did not receive a copy of the PHP license and are unable to   |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@php.net so we can mail you a copy immediately.               |
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Authors: Rasmus Lerdorf                              |
    |          Marcus Boerger                               |
diff --git a/ext/exif/tests/gh19904.phpt b/ext/exif/tests/gh19904.phpt
new file mode 100644
index 000000000000..cc13d88dd98b
--- /dev/null
+++ b/ext/exif/tests/gh19904.phpt
@@ -0,0 +1,82 @@
+--TEST--
+GH-19904 (exif_read_data() reads EXIF metadata from WebP images)
+--EXTENSIONS--
+exif
+--INI--
+output_handler=
+zlib.output_compression=0
+--FILE--
+
+--EXPECTF--
+array(26) {
+  ["FileName"]=>
+  string(12) "gh19904.webp"
+  ["FileDateTime"]=>
+  int(%d)
+  ["FileSize"]=>
+  int(526)
+  ["FileType"]=>
+  int(18)
+  ["MimeType"]=>
+  string(10) "image/webp"
+  ["SectionsFound"]=>
+  string(24) "ANY_TAG, IFD0, EXIF, GPS"
+  ["COMPUTED"]=>
+  array(4) {
+    ["IsColor"]=>
+    int(0)
+    ["ByteOrderMotorola"]=>
+    int(0)
+    ["UserComment"]=>
+    string(17) "Created with GIMP"
+    ["UserCommentEncoding"]=>
+    string(9) "UNDEFINED"
+  }
+  ["ImageWidth"]=>
+  int(100)
+  ["ImageLength"]=>
+  int(100)
+  ["BitsPerSample"]=>
+  array(3) {
+    [0]=>
+    int(8)
+    [1]=>
+    int(8)
+    [2]=>
+    int(8)
+  }
+  ["ImageDescription"]=>
+  string(17) "Created with GIMP"
+  ["XResolution"]=>
+  string(5) "300/1"
+  ["YResolution"]=>
+  string(5) "300/1"
+  ["ResolutionUnit"]=>
+  int(2)
+  ["Software"]=>
+  string(10) "GIMP 3.0.4"
+  ["DateTime"]=>
+  string(19) "2025:09:21 15:30:30"
+  ["Exif_IFD_Pointer"]=>
+  int(250)
+  ["GPS_IFD_Pointer"]=>
+  int(430)
+  ["DateTimeOriginal"]=>
+  string(19) "2025:09:21 15:29:27"
+  ["DateTimeDigitized"]=>
+  string(19) "2025:09:21 15:29:27"
+  ["OffsetTime"]=>
+  string(6) "+02:00"
+  ["OffsetTimeOriginal"]=>
+  string(6) "+02:00"
+  ["OffsetTimeDigitized"]=>
+  string(6) "+02:00"
+  ["UserComment"]=>
+  string(25) "%sCreated with GIMP"
+  ["ColorSpace"]=>
+  int(1)
+  ["GPSAltitude"]=>
+  string(5) "0/100"
+}
diff --git a/ext/exif/tests/gh19904.webp b/ext/exif/tests/gh19904.webp
new file mode 100644
index 000000000000..12dbe96a845c
Binary files /dev/null and b/ext/exif/tests/gh19904.webp differ
diff --git a/ext/ext_skel.php b/ext/ext_skel.php
index d396dfa3da74..3237ca625c99 100755
--- a/ext/ext_skel.php
+++ b/ext/ext_skel.php
@@ -2,15 +2,13 @@
 .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Authors: Kalle Sommer Nielsen                         |
    +----------------------------------------------------------------------+
@@ -257,15 +255,13 @@ function process_source_tags($file, $short_name) {
                 $header = <<<"HEADER"
 /*
    +----------------------------------------------------------------------+
-   | Copyright (c) The PHP Group                                          |
+   | Copyright © The PHP Group and Contributors.                          |
    +----------------------------------------------------------------------+
-   | This source file is subject to version 3.01 of the PHP license,      |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | https://www.php.net/license/3_01.txt                                 |
-   | If you did not receive a copy of the PHP license and are unable to   |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@php.net so we can mail you a copy immediately.               |
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Author: $credits |
    +----------------------------------------------------------------------+
diff --git a/ext/ffi/ffi.c b/ext/ffi/ffi.c
index d5b8eb59f0c9..779b41fcad3d 100644
--- a/ext/ffi/ffi.c
+++ b/ext/ffi/ffi.c
@@ -1,14 +1,12 @@
 /*
    +----------------------------------------------------------------------+
-   | Copyright (c) The PHP Group                                          |
+   | Copyright © The PHP Group and Contributors.                          |
    +----------------------------------------------------------------------+
-   | This source file is subject to version 3.01 of the PHP license,      |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | https://www.php.net/license/3_01.txt                                 |
-   | If you did not receive a copy of the PHP license and are unable to   |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@php.net so we can mail you a copy immediately.               |
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Author: Dmitry Stogov                               |
    +----------------------------------------------------------------------+
@@ -950,6 +948,7 @@ static void zend_ffi_callback_trampoline(ffi_cif* cif, void* ret, void** args, v
 	fci.object = NULL;
 	fci.param_count = callback_data->arg_count;
 	fci.named_params = NULL;
+	fci.consumed_args = 0;
 
 	if (callback_data->type->func.args) {
 		int n = 0;
@@ -1253,10 +1252,8 @@ static zval *zend_ffi_cdata_read_field(zend_object *obj, zend_string *field_name
 			type = ZEND_FFI_TYPE(type->pointer.type);
 		}
 		if (UNEXPECTED(type->kind != ZEND_FFI_TYPE_STRUCT)) {
-			if (UNEXPECTED(type->kind != ZEND_FFI_TYPE_STRUCT)) {
-				zend_throw_error(zend_ffi_exception_ce, "Attempt to read field '%s' of non C struct/union", ZSTR_VAL(field_name));
-				return &EG(uninitialized_zval);
-			}
+			zend_throw_error(zend_ffi_exception_ce, "Attempt to read field '%s' of non C struct/union", ZSTR_VAL(field_name));
+			return &EG(uninitialized_zval);
 		}
 
 		field = zend_hash_find_ptr(&type->record.fields, field_name);
@@ -1331,10 +1328,8 @@ static zval *zend_ffi_cdata_write_field(zend_object *obj, zend_string *field_nam
 			type = ZEND_FFI_TYPE(type->pointer.type);
 		}
 		if (UNEXPECTED(type->kind != ZEND_FFI_TYPE_STRUCT)) {
-			if (UNEXPECTED(type->kind != ZEND_FFI_TYPE_STRUCT)) {
-				zend_throw_error(zend_ffi_exception_ce, "Attempt to assign field '%s' of non C struct/union", ZSTR_VAL(field_name));
-				return value;
-			}
+			zend_throw_error(zend_ffi_exception_ce, "Attempt to assign field '%s' of non C struct/union", ZSTR_VAL(field_name));
+			return value;
 		}
 
 		field = zend_hash_find_ptr(&type->record.fields, field_name);
@@ -2090,7 +2085,6 @@ static HashTable *zend_ffi_cdata_get_debug_info(zend_object *obj, int *is_temp)
 			zend_hash_str_add(ht, "cdata", sizeof("cdata")-1, &tmp);
 			*is_temp = 1;
 			return ht;
-			break;
 		case ZEND_FFI_TYPE_POINTER:
 			if (*(void**)ptr == NULL) {
 				ZVAL_NULL(&tmp);
@@ -2145,7 +2139,6 @@ static HashTable *zend_ffi_cdata_get_debug_info(zend_object *obj, int *is_temp)
 			// TODO: function name ???
 			*is_temp = 1;
 			return ht;
-			break;
 		default:
 			ZEND_UNREACHABLE();
 			break;
@@ -3107,17 +3100,7 @@ ZEND_METHOD(FFI, cdef) /* {{{ */
 		FFI_G(default_type_attr) = ZEND_FFI_ATTR_STORED;
 
 		if (zend_ffi_parse_decl(ZSTR_VAL(code), ZSTR_LEN(code)) == FAILURE) {
-			if (FFI_G(symbols)) {
-				zend_hash_destroy(FFI_G(symbols));
-				efree(FFI_G(symbols));
-				FFI_G(symbols) = NULL;
-			}
-			if (FFI_G(tags)) {
-				zend_hash_destroy(FFI_G(tags));
-				efree(FFI_G(tags));
-				FFI_G(tags) = NULL;
-			}
-			RETURN_THROWS();
+			goto cleanup;
 		}
 
 		if (FFI_G(symbols)) {
@@ -3130,7 +3113,7 @@ ZEND_METHOD(FFI, cdef) /* {{{ */
 					addr = DL_FETCH_SYMBOL(handle, ZSTR_VAL(name));
 					if (!addr) {
 						zend_throw_error(zend_ffi_exception_ce, "Failed resolving C variable '%s'", ZSTR_VAL(name));
-						RETURN_THROWS();
+						goto cleanup;
 					}
 					sym->addr = addr;
 				} else if (sym->kind == ZEND_FFI_SYM_FUNC) {
@@ -3140,7 +3123,7 @@ ZEND_METHOD(FFI, cdef) /* {{{ */
 					zend_string_release(mangled_name);
 					if (!addr) {
 						zend_throw_error(zend_ffi_exception_ce, "Failed resolving C function '%s'", ZSTR_VAL(name));
-						RETURN_THROWS();
+						goto cleanup;
 					}
 					sym->addr = addr;
 				}
@@ -3157,6 +3140,22 @@ ZEND_METHOD(FFI, cdef) /* {{{ */
 	FFI_G(tags) = NULL;
 
 	RETURN_OBJ(&ffi->std);
+
+cleanup:
+	if (lib && handle) {
+		DL_UNLOAD(handle);
+	}
+	if (FFI_G(symbols)) {
+		zend_hash_destroy(FFI_G(symbols));
+		efree(FFI_G(symbols));
+		FFI_G(symbols) = NULL;
+	}
+	if (FFI_G(tags)) {
+		zend_hash_destroy(FFI_G(tags));
+		efree(FFI_G(tags));
+		FFI_G(tags) = NULL;
+	}
+	RETURN_THROWS();
 }
 /* }}} */
 
@@ -7084,7 +7083,6 @@ static zend_result zend_ffi_nested_type(zend_ffi_type *type, zend_ffi_type *nest
 			nested_type->size = nested_type->array.length * ZEND_FFI_TYPE(nested_type->array.type)->size;
 			nested_type->align = ZEND_FFI_TYPE(nested_type->array.type)->align;
 			return SUCCESS;
-			break;
 		case ZEND_FFI_TYPE_FUNC:
 			/* "char" is used as a terminator of nested declaration */
 			if (nested_type->func.ret_type == &zend_ffi_type_char) {
diff --git a/ext/ffi/ffi.g b/ext/ffi/ffi.g
index 364837242890..9ab8ee404edf 100644
--- a/ext/ffi/ffi.g
+++ b/ext/ffi/ffi.g
@@ -1,14 +1,12 @@
 /*
    +----------------------------------------------------------------------+
-   | Copyright (c) The PHP Group                                          |
+   | Copyright © The PHP Group and Contributors.                          |
    +----------------------------------------------------------------------+
-   | This source file is subject to version 3.01 of the PHP license,      |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | https://www.php.net/license/3_01.txt                                 |
-   | If you did not receive a copy of the PHP license and are unable to   |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@php.net so we can mail you a copy immediately.               |
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Author: Dmitry Stogov                               |
    +----------------------------------------------------------------------+
@@ -30,15 +28,13 @@ php llk.php ffi.g
 %{
 /*
    +----------------------------------------------------------------------+
-   | Copyright (c) The PHP Group                                          |
+   | Copyright © The PHP Group and Contributors.                          |
    +----------------------------------------------------------------------+
-   | This source file is subject to version 3.01 of the PHP license,      |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | https://www.php.net/license/3_01.txt                                 |
-   | If you did not receive a copy of the PHP license and are unable to   |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@php.net so we can mail you a copy immediately.               |
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Author: Dmitry Stogov                               |
    +----------------------------------------------------------------------+
diff --git a/ext/ffi/ffi_parser.c b/ext/ffi/ffi_parser.c
index 1067f80939f3..27f1469133fe 100644
--- a/ext/ffi/ffi_parser.c
+++ b/ext/ffi/ffi_parser.c
@@ -1,14 +1,12 @@
 /*
    +----------------------------------------------------------------------+
-   | Copyright (c) The PHP Group                                          |
+   | Copyright © The PHP Group and Contributors.                          |
    +----------------------------------------------------------------------+
-   | This source file is subject to version 3.01 of the PHP license,      |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | https://www.php.net/license/3_01.txt                                 |
-   | If you did not receive a copy of the PHP license and are unable to   |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@php.net so we can mail you a copy immediately.               |
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Author: Dmitry Stogov                               |
    +----------------------------------------------------------------------+
diff --git a/ext/ffi/php_ffi.h b/ext/ffi/php_ffi.h
index ba92947e62bf..02fdb221c3df 100644
--- a/ext/ffi/php_ffi.h
+++ b/ext/ffi/php_ffi.h
@@ -1,14 +1,12 @@
 /*
    +----------------------------------------------------------------------+
-   | Copyright (c) The PHP Group                                          |
+   | Copyright © The PHP Group and Contributors.                          |
    +----------------------------------------------------------------------+
-   | This source file is subject to version 3.01 of the PHP license,      |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | https://www.php.net/license/3_01.txt                                 |
-   | If you did not receive a copy of the PHP license and are unable to   |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@php.net so we can mail you a copy immediately.               |
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Author: Dmitry Stogov                               |
    +----------------------------------------------------------------------+
diff --git a/ext/ffi/tests/gh10403.phpt b/ext/ffi/tests/gh10403.phpt
index 6bac0da92584..1c5c69113eef 100644
--- a/ext/ffi/tests/gh10403.phpt
+++ b/ext/ffi/tests/gh10403.phpt
@@ -3,7 +3,7 @@ GH-10403: Fix incorrect bitshifting and masking in ffi bitfield
 --EXTENSIONS--
 ffi
 --SKIPIF--
-
+
 --FILE--
 
 --INI--
 ffi.enable=1
 --FILE--
diff --git a/ext/ffi/tests/gh18629_cdef_resolve_func.phpt b/ext/ffi/tests/gh18629_cdef_resolve_func.phpt
new file mode 100644
index 000000000000..ae81412efa63
--- /dev/null
+++ b/ext/ffi/tests/gh18629_cdef_resolve_func.phpt
@@ -0,0 +1,16 @@
+--TEST--
+GH-18629 (FFI::cdef() leaks on function resolution failure)
+--EXTENSIONS--
+ffi
+--INI--
+ffi.enable=1
+--FILE--
+getMessage() . "\n";
+}
+?>
+--EXPECT--
+Failed resolving C function 'nonexistent_ffi_test_func'
diff --git a/ext/ffi/tests/gh18629_read_field_non_struct.phpt b/ext/ffi/tests/gh18629_read_field_non_struct.phpt
new file mode 100644
index 000000000000..307fde1a53b8
--- /dev/null
+++ b/ext/ffi/tests/gh18629_read_field_non_struct.phpt
@@ -0,0 +1,17 @@
+--TEST--
+GH-18629 (Read field of non C struct/union)
+--EXTENSIONS--
+ffi
+--INI--
+ffi.enable=1
+--FILE--
+new("int*");
+try {
+	$y = $x->foo;
+} catch (\FFI\Exception $e) {
+	echo $e->getMessage() . "\n";
+}
+?>
+--EXPECT--
+Attempt to read field 'foo' of non C struct/union
diff --git a/ext/fileinfo/config.m4 b/ext/fileinfo/config.m4
index 346061411e08..2d6139f06dff 100644
--- a/ext/fileinfo/config.m4
+++ b/ext/fileinfo/config.m4
@@ -29,11 +29,6 @@ if test "$PHP_FILEINFO" != "no"; then
 
   AC_CHECK_HEADERS([sys/sysmacros.h])
 
-  AC_CHECK_FUNCS([strcasestr],,[
-    AC_MSG_NOTICE([using libmagic strcasestr implementation])
-    libmagic_sources="$libmagic_sources libmagic/strcasestr.c"
-  ])
-
   AX_GCC_FUNC_ATTRIBUTE([visibility])
 
   PHP_NEW_EXTENSION([fileinfo],
diff --git a/ext/fileinfo/config.w32 b/ext/fileinfo/config.w32
index 2a42dc45a1d1..34670e7451e4 100644
--- a/ext/fileinfo/config.w32
+++ b/ext/fileinfo/config.w32
@@ -8,7 +8,7 @@ if (PHP_FILEINFO != 'no') {
 			encoding.c fsmagic.c funcs.c \
 			is_json.c is_tar.c is_simh.c magic.c print.c \
 			readcdf.c softmagic.c der.c \
-			strcasestr.c buffer.c is_csv.c";
+			buffer.c is_csv.c";
 
 	EXTENSION('fileinfo', 'fileinfo.c php_libmagic.c', true, "/I" + configure_module_dirname + "/libmagic /I" + configure_module_dirname);
 	ADD_EXTENSION_DEP('fileinfo', 'pcre');
diff --git a/ext/fileinfo/fileinfo.c b/ext/fileinfo/fileinfo.c
index 50695981796e..4c5c0e88c5ce 100644
--- a/ext/fileinfo/fileinfo.c
+++ b/ext/fileinfo/fileinfo.c
@@ -1,14 +1,12 @@
 /*
   +----------------------------------------------------------------------+
-  | Copyright (c) The PHP Group                                          |
+  | Copyright © The PHP Group and Contributors.                          |
   +----------------------------------------------------------------------+
-  | This source file is subject to version 3.01 of the PHP license,      |
-  | that is bundled with this package in the file LICENSE, and is        |
-  | available through the world-wide-web at the following url:           |
-  | https://www.php.net/license/3_01.txt                                 |
-  | If you did not receive a copy of the PHP license and are unable to   |
-  | obtain it through the world-wide-web, please send a note to          |
-  | license@php.net so we can mail you a copy immediately.               |
+  | This source file is subject to the Modified BSD License that is      |
+  | bundled with this package in the file LICENSE, and is available      |
+  | through the World Wide Web at .        |
+  |                                                                      |
+  | SPDX-License-Identifier: BSD-3-Clause                                |
   +----------------------------------------------------------------------+
   | Author: Ilia Alshanetsky                               |
   +----------------------------------------------------------------------+
@@ -45,9 +43,7 @@ typedef struct _finfo_object {
 	zend_object zo;
 } finfo_object;
 
-static inline finfo_object *php_finfo_fetch_object(zend_object *obj) {
-	return (finfo_object *)((char*)(obj) - XtOffsetOf(finfo_object, zo));
-}
+#define php_finfo_fetch_object(obj) ZEND_CONTAINER_OF(obj, finfo_object, zo)
 
 #define Z_FINFO_P(zv) php_finfo_fetch_object(Z_OBJ_P((zv)))
 
@@ -84,7 +80,7 @@ PHP_MINIT_FUNCTION(finfo)
 
 	/* copy the standard object handlers to you handler table */
 	memcpy(&finfo_object_handlers, &std_object_handlers, sizeof(zend_object_handlers));
-	finfo_object_handlers.offset = XtOffsetOf(finfo_object, zo);
+	finfo_object_handlers.offset = offsetof(finfo_object, zo);
 	finfo_object_handlers.free_obj = finfo_objects_free;
 	finfo_object_handlers.clone_obj = NULL;
 
diff --git a/ext/fileinfo/libmagic.patch b/ext/fileinfo/libmagic.patch
index 4eb7ccd336f8..0f69e732fdd5 100644
--- a/ext/fileinfo/libmagic.patch
+++ b/ext/fileinfo/libmagic.patch
@@ -1,6 +1,6 @@
 diff -u libmagic.orig/apprentice.c libmagic/apprentice.c
---- libmagic.orig/apprentice.c	2024-11-27 16:37:00.000000000 +0100
-+++ libmagic/apprentice.c	2025-02-09 02:25:02.364884555 +0100
+--- libmagic.orig/apprentice.c	2024-11-27 10:37:00.000000000 -0500
++++ libmagic/apprentice.c	2026-03-20 12:10:19.777614667 -0400
 @@ -32,7 +32,7 @@
  #include "file.h"
  
@@ -325,14 +325,14 @@ diff -u libmagic.orig/apprentice.c libmagic/apprentice.c
  			// Don't warn for DER
  			if (mpa.type == FILE_DER)
  				return 0;
-@@ -1151,6 +1075,7 @@
+@@ -1150,6 +1074,7 @@
+ 			    ma->mp->desc);
  			file_mdump(ma->mp);
  			file_mdump(mb->mp);
 +#endif
  			return 0;
  		}
  		return x > 0 ? -1 : 1;
- 	}
 @@ -1303,7 +1228,7 @@
  
  		size_t incr = mset[i].max + ALLOC_INCR;
@@ -954,8 +954,8 @@ diff -u libmagic.orig/apprentice.c libmagic/apprentice.c
  				    if (ma[j].cont_level == 0)
  					    break;
 diff -u libmagic.orig/ascmagic.c libmagic/ascmagic.c
---- libmagic.orig/ascmagic.c	2024-06-19 18:18:53.000000000 +0200
-+++ libmagic/ascmagic.c	2025-02-09 01:20:19.757840211 +0100
+--- libmagic.orig/ascmagic.c	2024-06-19 12:18:53.000000000 -0400
++++ libmagic/ascmagic.c	2026-03-19 16:25:42.998672674 -0400
 @@ -96,7 +96,7 @@
  		rv = file_ascmagic_with_encoding(ms, &bb,
  		    ubuf, ulen, code, type, text);
@@ -996,8 +996,8 @@ diff -u libmagic.orig/ascmagic.c libmagic/ascmagic.c
  	return rv;
  }
 diff -u libmagic.orig/buffer.c libmagic/buffer.c
---- libmagic.orig/buffer.c	2024-06-19 18:18:53.000000000 +0200
-+++ libmagic/buffer.c	2025-02-09 01:20:19.757910844 +0100
+--- libmagic.orig/buffer.c	2024-06-19 12:18:53.000000000 -0400
++++ libmagic/buffer.c	2026-03-19 16:25:42.998672674 -0400
 @@ -31,19 +31,21 @@
  #endif	/* lint */
  
@@ -1055,8 +1055,8 @@ diff -u libmagic.orig/buffer.c libmagic/buffer.c
  		goto out;
  	}
 diff -u libmagic.orig/cdf.c libmagic/cdf.c
---- libmagic.orig/cdf.c	2024-11-25 22:24:59.000000000 +0100
-+++ libmagic/cdf.c	2025-02-09 01:25:00.187641434 +0100
+--- libmagic.orig/cdf.c	2024-11-25 16:24:59.000000000 -0500
++++ libmagic/cdf.c	2026-03-19 16:25:42.998672674 -0400
 @@ -43,7 +43,9 @@
  #include 
  #endif
@@ -1286,8 +1286,8 @@ diff -u libmagic.orig/cdf.c libmagic/cdf.c
  
  #endif
 diff -u libmagic.orig/cdf.h libmagic/cdf.h
---- libmagic.orig/cdf.h	2024-11-25 22:18:55.000000000 +0100
-+++ libmagic/cdf.h	2025-02-09 01:23:35.871635744 +0100
+--- libmagic.orig/cdf.h	2024-11-25 16:18:55.000000000 -0500
++++ libmagic/cdf.h	2026-03-19 16:25:42.990672671 -0400
 @@ -37,8 +37,6 @@
  
  #ifdef WIN32
@@ -1439,8 +1439,8 @@ diff -u libmagic.orig/cdf.h libmagic/cdf.h
  
  
 diff -u libmagic.orig/compress.c libmagic/compress.c
---- libmagic.orig/compress.c	2024-11-10 17:52:27.000000000 +0100
-+++ libmagic/compress.c	2025-02-09 01:59:42.978538071 +0100
+--- libmagic.orig/compress.c	2024-11-10 11:52:27.000000000 -0500
++++ libmagic/compress.c	2026-03-20 12:10:19.777614667 -0400
 @@ -64,13 +64,14 @@
  #if defined(HAVE_SYS_TIME_H)
  #include 
@@ -1666,8 +1666,8 @@ diff -u libmagic.orig/compress.c libmagic/compress.c
  #endif
 +#endif
 diff -u libmagic.orig/der.c libmagic/der.c
---- libmagic.orig/der.c	2024-11-25 23:31:53.000000000 +0100
-+++ libmagic/der.c	2025-02-09 01:20:19.770853011 +0100
+--- libmagic.orig/der.c	2024-11-25 17:31:53.000000000 -0500
++++ libmagic/der.c	2026-03-19 16:25:43.002672676 -0400
 @@ -54,7 +54,9 @@
  #include "magic.h"
  #include "der.h"
@@ -1679,8 +1679,8 @@ diff -u libmagic.orig/der.c libmagic/der.c
  #include 
  #endif
 diff -u libmagic.orig/der.h libmagic/der.h
---- libmagic.orig/der.h	2024-11-25 22:26:18.000000000 +0100
-+++ libmagic/der.h	2023-04-09 22:21:58.195018580 +0200
+--- libmagic.orig/der.h	2024-11-25 16:26:18.000000000 -0500
++++ libmagic/der.h	2026-03-19 16:25:43.006672678 -0400
 @@ -24,5 +24,5 @@
   * POSSIBILITY OF SUCH DAMAGE.
   */
@@ -1690,8 +1690,8 @@ diff -u libmagic.orig/der.h libmagic/der.h
 +extern int der_offs(struct magic_set *, struct magic *, size_t);
 +extern int der_cmp(struct magic_set *, struct magic *);
 diff -u libmagic.orig/encoding.c libmagic/encoding.c
---- libmagic.orig/encoding.c	2024-10-29 21:56:48.000000000 +0100
-+++ libmagic/encoding.c	2025-02-09 01:20:19.770879123 +0100
+--- libmagic.orig/encoding.c	2024-10-29 16:56:48.000000000 -0400
++++ libmagic/encoding.c	2026-03-19 16:25:43.010672679 -0400
 @@ -97,7 +97,7 @@
  		nbytes = ms->encoding_max;
  
@@ -1726,8 +1726,8 @@ diff -u libmagic.orig/encoding.c libmagic/encoding.c
  	return rv;
  }
 diff -u libmagic.orig/file.h libmagic/file.h
---- libmagic.orig/file.h	2024-11-27 16:37:00.000000000 +0100
-+++ libmagic/file.h	2025-02-09 01:47:36.242811911 +0100
+--- libmagic.orig/file.h	2024-11-27 10:37:00.000000000 -0500
++++ libmagic/file.h	2026-03-25 16:14:40.128668705 -0400
 @@ -27,15 +27,13 @@
   */
  /*
@@ -1767,6 +1767,21 @@ diff -u libmagic.orig/file.h libmagic/file.h
  
  #define ENABLE_CONDITIONALS
  
+@@ -109,12 +102,12 @@
+ 
+ #if HAVE_VISIBILITY
+ # if defined(WIN32)
+-#  define file_public  __declspec(dllexport)
++#  define file_public
+ #  ifndef file_protected
+ #   define file_protected
+ #  endif
+ # else
+-#  define file_public  __attribute__((__visibility__("default")))
++#  define file_public  __attribute__((__visibility__("hidden")))
+ #  ifndef file_protected
+ #   define file_protected __attribute__((__visibility__("hidden")))
+ #  endif
 @@ -179,7 +172,7 @@
  #define MAXstring 128		/* max len of "string" types */
  
@@ -1883,7 +1898,7 @@ diff -u libmagic.orig/file.h libmagic/file.h
  typedef struct {
  	char *buf;
  	size_t blen;
-@@ -649,19 +629,6 @@
+@@ -649,28 +629,12 @@
  extern file_protected const size_t file_nnames;
  #endif
  
@@ -1903,7 +1918,16 @@ diff -u libmagic.orig/file.h libmagic/file.h
  #ifndef HAVE_STRLCPY
  size_t strlcpy(char *, const char *, size_t);
  #endif
-@@ -681,31 +648,6 @@
+ #ifndef HAVE_STRLCAT
+ size_t strlcat(char *, const char *, size_t);
+ #endif
+-#ifndef HAVE_STRCASESTR
+-char *strcasestr(const char *, const char *);
+-#endif
+ #ifndef HAVE_GETLINE
+ ssize_t getline(char **, size_t *, FILE *);
+ ssize_t getdelim(char **, size_t *, int, FILE *);
+@@ -681,31 +645,6 @@
  #ifndef HAVE_ASCTIME_R
  char   *asctime_r(const struct tm *, char *);
  #endif
@@ -1936,8 +1960,8 @@ diff -u libmagic.orig/file.h libmagic/file.h
  #if defined(HAVE_MMAP) && defined(HAVE_SYS_MMAN_H) && !defined(QUICK)
  #define QUICK
 diff -u libmagic.orig/fsmagic.c libmagic/fsmagic.c
---- libmagic.orig/fsmagic.c	2024-06-19 18:18:53.000000000 +0200
-+++ libmagic/fsmagic.c	2025-02-09 01:20:19.770987982 +0100
+--- libmagic.orig/fsmagic.c	2024-06-19 12:18:53.000000000 -0400
++++ libmagic/fsmagic.c	2026-03-19 16:25:43.006672678 -0400
 @@ -66,26 +66,10 @@
  # define minor(dev)  ((dev) & 0xff)
  #endif
@@ -2229,8 +2253,8 @@ diff -u libmagic.orig/fsmagic.c libmagic/fsmagic.c
  #ifndef __COHERENT__
  	case S_IFSOCK:
 diff -u libmagic.orig/funcs.c libmagic/funcs.c
---- libmagic.orig/funcs.c	2024-06-19 18:18:53.000000000 +0200
-+++ libmagic/funcs.c	2025-02-09 01:29:25.403659334 +0100
+--- libmagic.orig/funcs.c	2024-06-19 12:18:53.000000000 -0400
++++ libmagic/funcs.c	2026-03-19 16:25:42.990672671 -0400
 @@ -66,7 +66,7 @@
  file_private void
  file_clearbuf(struct magic_set *ms)
@@ -2592,8 +2616,8 @@ diff -u libmagic.orig/funcs.c libmagic/funcs.c
  file_protected int
  file_clear_closexec(int fd) {
 diff -u libmagic.orig/magic.c libmagic/magic.c
---- libmagic.orig/magic.c	2024-06-19 18:18:53.000000000 +0200
-+++ libmagic/magic.c	2025-02-09 01:20:19.771155033 +0100
+--- libmagic.orig/magic.c	2024-06-19 12:18:53.000000000 -0400
++++ libmagic/magic.c	2026-03-20 12:10:19.777614667 -0400
 @@ -25,11 +25,6 @@
   * SUCH DAMAGE.
   */
@@ -3066,8 +3090,8 @@ diff -u libmagic.orig/magic.c libmagic/magic.c
  	}
  	return file_getbuffer(ms);
 diff -u libmagic.orig/magic.h libmagic/magic.h
---- libmagic.orig/magic.h	2025-02-09 12:43:22.903059789 +0100
-+++ libmagic/magic.h	2025-02-09 01:39:57.110146603 +0100
+--- libmagic.orig/magic.h	2026-03-25 16:14:49.284673536 -0400
++++ libmagic/magic.h	2026-03-20 12:10:19.777614667 -0400
 @@ -47,8 +47,6 @@
  					   * extensions */
  #define MAGIC_COMPRESS_TRANSP	0x2000000 /* Check inside compressed files
@@ -3109,8 +3133,8 @@ diff -u libmagic.orig/magic.h libmagic/magic.h
  const char *magic_buffer(magic_t, const void *, size_t);
  
 diff -u libmagic.orig/print.c libmagic/print.c
---- libmagic.orig/print.c	2024-10-06 19:04:42.000000000 +0200
-+++ libmagic/print.c	2025-02-09 01:36:41.713156291 +0100
+--- libmagic.orig/print.c	2024-10-06 13:04:42.000000000 -0400
++++ libmagic/print.c	2026-03-19 16:25:42.982672668 -0400
 @@ -74,7 +74,7 @@
  	if (m->mask_op & FILE_OPINVERSE)
  		(void) fputc('~', stderr);
@@ -3187,8 +3211,8 @@ diff -u libmagic.orig/print.c libmagic/print.c
  	if (pp == NULL)
  		goto out;
 diff -u libmagic.orig/readcdf.c libmagic/readcdf.c
---- libmagic.orig/readcdf.c	2024-11-25 22:07:46.000000000 +0100
-+++ libmagic/readcdf.c	2025-02-09 01:20:19.771337672 +0100
+--- libmagic.orig/readcdf.c	2024-11-25 16:07:46.000000000 -0500
++++ libmagic/readcdf.c	2026-03-19 16:25:43.002672676 -0400
 @@ -31,7 +31,9 @@
  
  #include 
@@ -3307,8 +3331,8 @@ diff -u libmagic.orig/readcdf.c libmagic/readcdf.c
  	/* If we handled it already, return */
  	if (i != -1)
 diff -u libmagic.orig/softmagic.c libmagic/softmagic.c
---- libmagic.orig/softmagic.c	2024-11-27 16:37:00.000000000 +0100
-+++ libmagic/softmagic.c	2025-02-09 01:21:46.845689318 +0100
+--- libmagic.orig/softmagic.c	2024-11-27 10:37:00.000000000 -0500
++++ libmagic/softmagic.c	2026-03-19 16:25:42.986672670 -0400
 @@ -32,7 +32,7 @@
  #include "file.h"
  
diff --git a/ext/fileinfo/libmagic/file.h b/ext/fileinfo/libmagic/file.h
index f8fe58895002..5357578c6a77 100644
--- a/ext/fileinfo/libmagic/file.h
+++ b/ext/fileinfo/libmagic/file.h
@@ -102,12 +102,12 @@
 
 #if HAVE_VISIBILITY
 # if defined(WIN32)
-#  define file_public  __declspec(dllexport)
+#  define file_public
 #  ifndef file_protected
 #   define file_protected
 #  endif
 # else
-#  define file_public  __attribute__((__visibility__("default")))
+#  define file_public  __attribute__((__visibility__("hidden")))
 #  ifndef file_protected
 #   define file_protected __attribute__((__visibility__("hidden")))
 #  endif
@@ -635,9 +635,6 @@ size_t strlcpy(char *, const char *, size_t);
 #ifndef HAVE_STRLCAT
 size_t strlcat(char *, const char *, size_t);
 #endif
-#ifndef HAVE_STRCASESTR
-char *strcasestr(const char *, const char *);
-#endif
 #ifndef HAVE_GETLINE
 ssize_t getline(char **, size_t *, FILE *);
 ssize_t getdelim(char **, size_t *, int, FILE *);
diff --git a/ext/fileinfo/php_fileinfo.h b/ext/fileinfo/php_fileinfo.h
index a0536294429b..50de6f79a537 100644
--- a/ext/fileinfo/php_fileinfo.h
+++ b/ext/fileinfo/php_fileinfo.h
@@ -1,14 +1,12 @@
 /*
   +----------------------------------------------------------------------+
-  | Copyright (c) The PHP Group                                          |
+  | Copyright © The PHP Group and Contributors.                          |
   +----------------------------------------------------------------------+
-  | This source file is subject to version 3.01 of the PHP license,      |
-  | that is bundled with this package in the file LICENSE, and is        |
-  | available through the world-wide-web at the following url:           |
-  | https://www.php.net/license/3_01.txt                                 |
-  | If you did not receive a copy of the PHP license and are unable to   |
-  | obtain it through the world-wide-web, please send a note to          |
-  | license@php.net so we can mail you a copy immediately.               |
+  | This source file is subject to the Modified BSD License that is      |
+  | bundled with this package in the file LICENSE, and is available      |
+  | through the World Wide Web at .        |
+  |                                                                      |
+  | SPDX-License-Identifier: BSD-3-Clause                                |
   +----------------------------------------------------------------------+
   | Author: Ilia Alshanetsky                               |
   +----------------------------------------------------------------------+
diff --git a/ext/fileinfo/php_libmagic.c b/ext/fileinfo/php_libmagic.c
index 05123fa8133a..efb78653c211 100644
--- a/ext/fileinfo/php_libmagic.c
+++ b/ext/fileinfo/php_libmagic.c
@@ -1,14 +1,12 @@
 /*
   +----------------------------------------------------------------------+
-  | Copyright (c) The PHP Group                                          |
+  | Copyright © The PHP Group and Contributors.                          |
   +----------------------------------------------------------------------+
-  | This source file is subject to version 3.01 of the PHP license,      |
-  | that is bundled with this package in the file LICENSE, and is        |
-  | available through the world-wide-web at the following url:           |
-  | https://www.php.net/license/3_01.txt                                 |
-  | If you did not receive a copy of the PHP license and are unable to   |
-  | obtain it through the world-wide-web, please send a note to          |
-  | license@php.net so we can mail you a copy immediately.               |
+  | This source file is subject to the Modified BSD License that is      |
+  | bundled with this package in the file LICENSE, and is available      |
+  | through the World Wide Web at .        |
+  |                                                                      |
+  | SPDX-License-Identifier: BSD-3-Clause                                |
   +----------------------------------------------------------------------+
   | Author: Anatol Belski                                    |
   +----------------------------------------------------------------------+
diff --git a/ext/fileinfo/php_libmagic.h b/ext/fileinfo/php_libmagic.h
index 23d0c3e8eaa1..59e8e091a487 100644
--- a/ext/fileinfo/php_libmagic.h
+++ b/ext/fileinfo/php_libmagic.h
@@ -1,14 +1,12 @@
 /*
   +----------------------------------------------------------------------+
-  | Copyright (c) The PHP Group                                          |
+  | Copyright © The PHP Group and Contributors.                          |
   +----------------------------------------------------------------------+
-  | This source file is subject to version 3.01 of the PHP license,      |
-  | that is bundled with this package in the file LICENSE, and is        |
-  | available through the world-wide-web at the following url:           |
-  | https://www.php.net/license/3_01.txt                                 |
-  | If you did not receive a copy of the PHP license and are unable to   |
-  | obtain it through the world-wide-web, please send a note to          |
-  | license@php.net so we can mail you a copy immediately.               |
+  | This source file is subject to the Modified BSD License that is      |
+  | bundled with this package in the file LICENSE, and is available      |
+  | through the World Wide Web at .        |
+  |                                                                      |
+  | SPDX-License-Identifier: BSD-3-Clause                                |
   +----------------------------------------------------------------------+
   | Author: Anatol Belski                                    |
   +----------------------------------------------------------------------+
diff --git a/ext/filter/callback_filter.c b/ext/filter/callback_filter.c
index dea39c6cc7c3..688cbf072175 100644
--- a/ext/filter/callback_filter.c
+++ b/ext/filter/callback_filter.c
@@ -1,14 +1,12 @@
 /*
   +----------------------------------------------------------------------+
-  | Copyright (c) The PHP Group                                          |
+  | Copyright © The PHP Group and Contributors.                          |
   +----------------------------------------------------------------------+
-  | This source file is subject to version 3.01 of the PHP license,      |
-  | that is bundled with this package in the file LICENSE, and is        |
-  | available through the world-wide-web at the following url:           |
-  | https://www.php.net/license/3_01.txt                                 |
-  | If you did not receive a copy of the PHP license and are unable to   |
-  | obtain it through the world-wide-web, please send a note to          |
-  | license@php.net so we can mail you a copy immediately.               |
+  | This source file is subject to the Modified BSD License that is      |
+  | bundled with this package in the file LICENSE, and is available      |
+  | through the World Wide Web at .        |
+  |                                                                      |
+  | SPDX-License-Identifier: BSD-3-Clause                                |
   +----------------------------------------------------------------------+
   | Authors: Derick Rethans                              |
   +----------------------------------------------------------------------+
diff --git a/ext/filter/filter.c b/ext/filter/filter.c
index 03f0f7887f92..b6e6332381e9 100644
--- a/ext/filter/filter.c
+++ b/ext/filter/filter.c
@@ -1,14 +1,12 @@
 /*
   +----------------------------------------------------------------------+
-  | Copyright (c) The PHP Group                                          |
+  | Copyright © The PHP Group and Contributors.                          |
   +----------------------------------------------------------------------+
-  | This source file is subject to version 3.01 of the PHP license,      |
-  | that is bundled with this package in the file LICENSE, and is        |
-  | available through the world-wide-web at the following url:           |
-  | https://www.php.net/license/3_01.txt                                 |
-  | If you did not receive a copy of the PHP license and are unable to   |
-  | obtain it through the world-wide-web, please send a note to          |
-  | license@php.net so we can mail you a copy immediately.               |
+  | This source file is subject to the Modified BSD License that is      |
+  | bundled with this package in the file LICENSE, and is available      |
+  | through the World Wide Web at .        |
+  |                                                                      |
+  | SPDX-License-Identifier: BSD-3-Clause                                |
   +----------------------------------------------------------------------+
   | Authors: Rasmus Lerdorf                              |
   |          Derick Rethans                              |
@@ -298,10 +296,10 @@ static void php_zval_filter(zval *value, zend_long filter, zend_long flags, zval
 				filter_func.name,
 				ZSTR_VAL(copy_for_throwing)
 			);
-			zend_string_delref(copy_for_throwing);
+			zend_string_release(copy_for_throwing);
 			return;
 		}
-		zend_string_delref(copy_for_throwing);
+		zend_string_release(copy_for_throwing);
 		copy_for_throwing = NULL;
 	}
 
diff --git a/ext/filter/filter_private.h b/ext/filter/filter_private.h
index 709b7fbc45ed..14975e7911a4 100644
--- a/ext/filter/filter_private.h
+++ b/ext/filter/filter_private.h
@@ -1,14 +1,12 @@
 /*
   +----------------------------------------------------------------------+
-  | Copyright (c) The PHP Group                                          |
+  | Copyright © The PHP Group and Contributors.                          |
   +----------------------------------------------------------------------+
-  | This source file is subject to version 3.01 of the PHP license,      |
-  | that is bundled with this package in the file LICENSE, and is        |
-  | available through the world-wide-web at the following url:           |
-  | https://www.php.net/license/3_01.txt                                 |
-  | If you did not receive a copy of the PHP license and are unable to   |
-  | obtain it through the world-wide-web, please send a note to          |
-  | license@php.net so we can mail you a copy immediately.               |
+  | This source file is subject to the Modified BSD License that is      |
+  | bundled with this package in the file LICENSE, and is available      |
+  | through the World Wide Web at .        |
+  |                                                                      |
+  | SPDX-License-Identifier: BSD-3-Clause                                |
   +----------------------------------------------------------------------+
   | Authors: Derick Rethans                              |
   +----------------------------------------------------------------------+
diff --git a/ext/filter/logical_filters.c b/ext/filter/logical_filters.c
index 20760e656e76..45acf6d47541 100644
--- a/ext/filter/logical_filters.c
+++ b/ext/filter/logical_filters.c
@@ -1,14 +1,12 @@
 /*
   +----------------------------------------------------------------------+
-  | Copyright (c) The PHP Group                                          |
+  | Copyright © The PHP Group and Contributors.                          |
   +----------------------------------------------------------------------+
-  | This source file is subject to version 3.01 of the PHP license,      |
-  | that is bundled with this package in the file LICENSE, and is        |
-  | available through the world-wide-web at the following url:           |
-  | https://www.php.net/license/3_01.txt                                 |
-  | If you did not receive a copy of the PHP license and are unable to   |
-  | obtain it through the world-wide-web, please send a note to          |
-  | license@php.net so we can mail you a copy immediately.               |
+  | This source file is subject to the Modified BSD License that is      |
+  | bundled with this package in the file LICENSE, and is available      |
+  | through the World Wide Web at .        |
+  |                                                                      |
+  | SPDX-License-Identifier: BSD-3-Clause                                |
   +----------------------------------------------------------------------+
   | Authors: Derick Rethans                              |
   |          Pierre-A. Joye                              |
@@ -535,21 +533,21 @@ static bool php_filter_validate_domain_ex(const zend_string *domain, zend_long f
 	}
 
 	/* First char must be alphanumeric */
-	if(*s == '.' || (hostname && !isalnum((int)*(unsigned char *)s))) {
+	if(*s == '.' || (hostname && !isalnum((unsigned char)*s))) {
 		return false;
 	}
 
 	while (s < e) {
 		if (*s == '.') {
 			/* The first and the last character of a label must be alphanumeric */
-			if (*(s + 1) == '.' || (hostname && (!isalnum((int)*(unsigned char *)(s - 1)) || !isalnum((int)*(unsigned char *)(s + 1))))) {
+			if (*(s + 1) == '.' || (hostname && (!isalnum((unsigned char)s[-1]) || !isalnum((unsigned char)s[1])))) {
 				return false;
 			}
 
 			/* Reset label length counter */
 			i = 1;
 		} else {
-			if (i > 63 || (hostname && (*s != '-' || *(s + 1) == '\0') && !isalnum((int)*(unsigned char *)s))) {
+			if (i > 63 || (hostname && (*s != '-' || *(s + 1) == '\0') && !isalnum((unsigned char)*s))) {
 				return false;
 			}
 
@@ -577,9 +575,9 @@ static bool is_userinfo_valid(const zend_string *str)
 	const char *p = ZSTR_VAL(str);
 	while (p - ZSTR_VAL(str) < ZSTR_LEN(str)) {
 		static const char *valid = "-._~!$&'()*+,;=:";
-		if (isalpha(*p) || isdigit(*p) || strchr(valid, *p)) {
+		if (isalpha((unsigned char)*p) || isdigit((unsigned char)*p) || strchr(valid, *p)) {
 			p++;
-		} else if (*p == '%' && p - ZSTR_VAL(str) <= ZSTR_LEN(str) - 3 && isdigit(*(p+1)) && isxdigit(*(p+2))) {
+		} else if (*p == '%' && p - ZSTR_VAL(str) <= ZSTR_LEN(str) - 3 && isdigit((unsigned char)p[1]) && isxdigit((unsigned char)p[2])) {
 			p += 3;
 		} else {
 			return false;
diff --git a/ext/filter/php_filter.h b/ext/filter/php_filter.h
index 48ad5cc07943..ccf8b6b4883f 100644
--- a/ext/filter/php_filter.h
+++ b/ext/filter/php_filter.h
@@ -1,14 +1,12 @@
 /*
   +----------------------------------------------------------------------+
-  | Copyright (c) The PHP Group                                          |
+  | Copyright © The PHP Group and Contributors.                          |
   +----------------------------------------------------------------------+
-  | This source file is subject to version 3.01 of the PHP license,      |
-  | that is bundled with this package in the file LICENSE, and is        |
-  | available through the world-wide-web at the following url:           |
-  | https://www.php.net/license/3_01.txt                                 |
-  | If you did not receive a copy of the PHP license and are unable to   |
-  | obtain it through the world-wide-web, please send a note to          |
-  | license@php.net so we can mail you a copy immediately.               |
+  | This source file is subject to the Modified BSD License that is      |
+  | bundled with this package in the file LICENSE, and is available      |
+  | through the World Wide Web at .        |
+  |                                                                      |
+  | SPDX-License-Identifier: BSD-3-Clause                                |
   +----------------------------------------------------------------------+
   | Authors: Rasmus Lerdorf                              |
   |          Derick Rethans                              |
diff --git a/ext/filter/sanitizing_filters.c b/ext/filter/sanitizing_filters.c
index 94cbd0c34bba..456b138ca934 100644
--- a/ext/filter/sanitizing_filters.c
+++ b/ext/filter/sanitizing_filters.c
@@ -1,14 +1,12 @@
 /*
   +----------------------------------------------------------------------+
-  | Copyright (c) The PHP Group                                          |
+  | Copyright © The PHP Group and Contributors.                          |
   +----------------------------------------------------------------------+
-  | This source file is subject to version 3.01 of the PHP license,      |
-  | that is bundled with this package in the file LICENSE, and is        |
-  | available through the world-wide-web at the following url:           |
-  | https://www.php.net/license/3_01.txt                                 |
-  | If you did not receive a copy of the PHP license and are unable to   |
-  | obtain it through the world-wide-web, please send a note to          |
-  | license@php.net so we can mail you a copy immediately.               |
+  | This source file is subject to the Modified BSD License that is      |
+  | bundled with this package in the file LICENSE, and is available      |
+  | through the World Wide Web at .        |
+  |                                                                      |
+  | SPDX-License-Identifier: BSD-3-Clause                                |
   +----------------------------------------------------------------------+
   | Authors: Derick Rethans                              |
   +----------------------------------------------------------------------+
diff --git a/ext/filter/tests/filter_throw_on_failure_leak.phpt b/ext/filter/tests/filter_throw_on_failure_leak.phpt
new file mode 100644
index 000000000000..d42896a94e8f
--- /dev/null
+++ b/ext/filter/tests/filter_throw_on_failure_leak.phpt
@@ -0,0 +1,37 @@
+--TEST--
+filter: FILTER_THROW_ON_FAILURE does not leak the preserved input string
+--EXTENSIONS--
+filter
+--FILE--
+ exception thrown.
+var_dump(leakcheck(function () {
+    try {
+        filter_var(1.5, FILTER_VALIDATE_INT, ['flags' => FILTER_THROW_ON_FAILURE]);
+    } catch (\Filter\FilterFailedException $e) {
+    }
+}));
+
+// Validation succeeds.
+var_dump(leakcheck(function () {
+    filter_var(15, FILTER_VALIDATE_INT, ['flags' => FILTER_THROW_ON_FAILURE]);
+}));
+?>
+--EXPECT--
+bool(true)
+bool(true)
diff --git a/ext/ftp/ftp.c b/ext/ftp/ftp.c
index 0c1287a3e705..2ea93f979683 100644
--- a/ext/ftp/ftp.c
+++ b/ext/ftp/ftp.c
@@ -1,14 +1,12 @@
 /*
    +----------------------------------------------------------------------+
-   | Copyright (c) The PHP Group                                          |
+   | Copyright © The PHP Group and Contributors.                          |
    +----------------------------------------------------------------------+
-   | This source file is subject to version 3.01 of the PHP license,      |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | https://www.php.net/license/3_01.txt                                 |
-   | If you did not receive a copy of the PHP license and are unable to   |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@php.net so we can mail you a copy immediately.               |
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Authors: Andrew Skalski                           |
    |          Stefan Esser  (resume functions)            |
@@ -485,7 +483,7 @@ void ftp_raw(ftpbuf_t *ftp, const char *cmd, const size_t cmd_len, zval *return_
 	array_init(return_value);
 	while (ftp_readline(ftp)) {
 		add_next_index_string(return_value, ftp->inbuf);
-		if (isdigit(ftp->inbuf[0]) && isdigit(ftp->inbuf[1]) && isdigit(ftp->inbuf[2]) && ftp->inbuf[3] == ' ') {
+		if (isdigit((unsigned char)ftp->inbuf[0]) && isdigit((unsigned char)ftp->inbuf[1]) && isdigit((unsigned char)ftp->inbuf[2]) && ftp->inbuf[3] == ' ') {
 			return;
 		}
 	}
@@ -791,7 +789,7 @@ bool ftp_pasv(ftpbuf_t *ftp, int pasv)
 		return false;
 	}
 	/* parse out the IP and port */
-	for (ptr = ftp->inbuf; *ptr && !isdigit(*ptr); ptr++);
+	for (ptr = ftp->inbuf; *ptr && !isdigit((unsigned char)*ptr); ptr++);
 	n = sscanf(ptr, "%lu,%lu,%lu,%lu,%lu,%lu", &b[0], &b[1], &b[2], &b[3], &b[4], &b[5]);
 	if (n != 6) {
 		return false;
@@ -852,6 +850,7 @@ bool ftp_get(ftpbuf_t *ftp, php_stream *outstream, const char *path, const size_
 		goto bail;
 	}
 
+	bool pending_cr = false;
 	while ((rcvd = my_recv(ftp, data->fd, data->buf, FTP_BUFSIZE))) {
 		if (rcvd == (size_t)-1) {
 			goto bail;
@@ -871,13 +870,30 @@ bool ftp_get(ftpbuf_t *ftp, php_stream *outstream, const char *path, const size_
 			php_stream_write(outstream, ptr, (e - ptr));
 			ptr = e;
 #else
-			while (e > ptr && (s = memchr(ptr, '\r', (e - ptr)))) {
-				php_stream_write(outstream, ptr, (s - ptr));
-				if (*(s + 1) == '\n') {
-					s++;
+			if (pending_cr) {
+				pending_cr = false;
+				if (*ptr == '\n') {
 					php_stream_putc(outstream, '\n');
+					ptr++;
+				} else {
+					php_stream_putc(outstream, '\r');
+				}
+			}
+			while (e > ptr && (s = memchr(ptr, '\r', (e - ptr)))) {
+				if (s + 1 < e) {
+					if (*(s + 1) == '\n') {
+						php_stream_write(outstream, ptr, (s - ptr));
+						php_stream_putc(outstream, '\n');
+						ptr = s + 2;
+					} else {
+						php_stream_write(outstream, ptr, (s - ptr) + 1);
+						ptr = s + 1;
+					}
+				} else {
+					php_stream_write(outstream, ptr, (s - ptr));
+					pending_cr = true;
+					ptr = s + 1;
 				}
-				ptr = s + 1;
 			}
 #endif
 			if (ptr < e) {
@@ -887,6 +903,9 @@ bool ftp_get(ftpbuf_t *ftp, php_stream *outstream, const char *path, const size_
 			goto bail;
 		}
 	}
+	if (pending_cr) {
+		php_stream_putc(outstream, '\r');
+	}
 
 	data_close(ftp);
 
@@ -1102,7 +1121,7 @@ time_t ftp_mdtm(ftpbuf_t *ftp, const char *path, const size_t path_len)
 		return -1;
 	}
 	/* parse out the timestamp */
-	for (ptr = ftp->inbuf; *ptr && !isdigit(*ptr); ptr++);
+	for (ptr = ftp->inbuf; *ptr && !isdigit((unsigned char)*ptr); ptr++);
 	n = sscanf(ptr, "%4d%2d%2d%2d%2d%2d", &tm.tm_year, &tm.tm_mon, &tm.tm_mday, &tm.tm_hour, &tm.tm_min, &tm.tm_sec);
 	if (n != 6) {
 		return -1;
@@ -1254,7 +1273,7 @@ static bool ftp_readline(ftpbuf_t *ftp)
 		}
 
 		data = eol;
-		if ((rcvd = my_recv(ftp, ftp->fd, data, size)) < 1) {
+		if (size < 2 || (rcvd = my_recv(ftp, ftp->fd, data, size - 1)) < 1) {
 			*data = 0;
 			return false;
 		}
@@ -1278,13 +1297,13 @@ static bool ftp_getresp(ftpbuf_t *ftp)
 		}
 
 		/* Break out when the end-tag is found */
-		if (isdigit(ftp->inbuf[0]) && isdigit(ftp->inbuf[1]) && isdigit(ftp->inbuf[2]) && ftp->inbuf[3] == ' ') {
+		if (isdigit((unsigned char)ftp->inbuf[0]) && isdigit((unsigned char)ftp->inbuf[1]) && isdigit((unsigned char)ftp->inbuf[2]) && ftp->inbuf[3] == ' ') {
 			break;
 		}
 	}
 
 	/* translate the tag */
-	if (!isdigit(ftp->inbuf[0]) || !isdigit(ftp->inbuf[1]) || !isdigit(ftp->inbuf[2])) {
+	if (!isdigit((unsigned char)ftp->inbuf[0]) || !isdigit((unsigned char)ftp->inbuf[1]) || !isdigit((unsigned char)ftp->inbuf[2])) {
 		return false;
 	}
 
diff --git a/ext/ftp/ftp.h b/ext/ftp/ftp.h
index 241f92f57ec3..b336754c3f88 100644
--- a/ext/ftp/ftp.h
+++ b/ext/ftp/ftp.h
@@ -1,14 +1,12 @@
 /*
    +----------------------------------------------------------------------+
-   | Copyright (c) The PHP Group                                          |
+   | Copyright © The PHP Group and Contributors.                          |
    +----------------------------------------------------------------------+
-   | This source file is subject to version 3.01 of the PHP license,      |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | https://www.php.net/license/3_01.txt                                 |
-   | If you did not receive a copy of the PHP license and are unable to   |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@php.net so we can mail you a copy immediately.               |
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Authors: Andrew Skalski                           |
    |          Stefan Esser  (resume functions)            |
diff --git a/ext/ftp/php_ftp.c b/ext/ftp/php_ftp.c
index 245d95bf1260..501ce9bc68d7 100644
--- a/ext/ftp/php_ftp.c
+++ b/ext/ftp/php_ftp.c
@@ -1,14 +1,12 @@
 /*
    +----------------------------------------------------------------------+
-   | Copyright (c) The PHP Group                                          |
+   | Copyright © The PHP Group and Contributors.                          |
    +----------------------------------------------------------------------+
-   | This source file is subject to version 3.01 of the PHP license,      |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | https://www.php.net/license/3_01.txt                                 |
-   | If you did not receive a copy of the PHP license and are unable to   |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@php.net so we can mail you a copy immediately.               |
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Authors: Andrew Skalski                           |
    |          Stefan Esser  (resume functions)            |
@@ -101,7 +99,7 @@ PHP_MINIT_FUNCTION(ftp)
 	php_ftp_ce->create_object = ftp_object_create;
 
 	memcpy(&ftp_object_handlers, &std_object_handlers, sizeof(zend_object_handlers));
-	ftp_object_handlers.offset = XtOffsetOf(php_ftp_object, std);
+	ftp_object_handlers.offset = offsetof(php_ftp_object, std);
 	ftp_object_handlers.get_constructor = ftp_object_get_constructor;
 	ftp_object_handlers.free_obj = ftp_object_destroy;
 	ftp_object_handlers.clone_obj = NULL;
@@ -1264,7 +1262,6 @@ PHP_FUNCTION(ftp_set_option)
 			}
 			ftp->timeout_sec = Z_LVAL_P(z_value);
 			RETURN_TRUE;
-			break;
 		case PHP_FTP_OPT_AUTOSEEK:
 			if (Z_TYPE_P(z_value) != IS_TRUE && Z_TYPE_P(z_value) != IS_FALSE) {
 				zend_argument_type_error(3, "must be of type bool for the FTP_AUTOSEEK option, %s given", zend_zval_value_name(z_value));
@@ -1272,7 +1269,6 @@ PHP_FUNCTION(ftp_set_option)
 			}
 			ftp->autoseek = Z_TYPE_P(z_value) == IS_TRUE ? 1 : 0;
 			RETURN_TRUE;
-			break;
 		case PHP_FTP_OPT_USEPASVADDRESS:
 			if (Z_TYPE_P(z_value) != IS_TRUE && Z_TYPE_P(z_value) != IS_FALSE) {
 				zend_argument_type_error(3, "must be of type bool for the FTP_USEPASVADDRESS option, %s given", zend_zval_value_name(z_value));
@@ -1280,11 +1276,9 @@ PHP_FUNCTION(ftp_set_option)
 			}
 			ftp->usepasvaddress = Z_TYPE_P(z_value) == IS_TRUE ? 1 : 0;
 			RETURN_TRUE;
-			break;
 		default:
 			zend_argument_value_error(2, "must be one of FTP_TIMEOUT_SEC, FTP_AUTOSEEK, or FTP_USEPASVADDRESS");
 			RETURN_THROWS();
-			break;
 	}
 }
 /* }}} */
@@ -1304,13 +1298,10 @@ PHP_FUNCTION(ftp_get_option)
 	switch (option) {
 		case PHP_FTP_OPT_TIMEOUT_SEC:
 			RETURN_LONG(ftp->timeout_sec);
-			break;
 		case PHP_FTP_OPT_AUTOSEEK:
 			RETURN_BOOL(ftp->autoseek);
-			break;
 		case PHP_FTP_OPT_USEPASVADDRESS:
 			RETURN_BOOL(ftp->usepasvaddress);
-			break;
 		default:
 			zend_argument_value_error(2, "must be one of FTP_TIMEOUT_SEC, FTP_AUTOSEEK, or FTP_USEPASVADDRESS");
 			RETURN_THROWS();
diff --git a/ext/ftp/php_ftp.h b/ext/ftp/php_ftp.h
index b701f1331d0b..ee9cb50c4382 100644
--- a/ext/ftp/php_ftp.h
+++ b/ext/ftp/php_ftp.h
@@ -1,14 +1,12 @@
 /*
    +----------------------------------------------------------------------+
-   | Copyright (c) The PHP Group                                          |
+   | Copyright © The PHP Group and Contributors.                          |
    +----------------------------------------------------------------------+
-   | This source file is subject to version 3.01 of the PHP license,      |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | https://www.php.net/license/3_01.txt                                 |
-   | If you did not receive a copy of the PHP license and are unable to   |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@php.net so we can mail you a copy immediately.               |
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Authors: Andrew Skalski                           |
    |          Stefan Esser  (resume functions)            |
diff --git a/ext/ftp/tests/bug80901.phpt b/ext/ftp/tests/bug80901.phpt
index e2a58fa0668a..a1c0e479c6ae 100644
--- a/ext/ftp/tests/bug80901.phpt
+++ b/ext/ftp/tests/bug80901.phpt
@@ -16,4 +16,4 @@ ftp_systype($ftp);
 --EXPECTF--
 bool(true)
 
-Warning: ftp_systype(): **************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************** in %s on line %d
+Warning: ftp_systype(): *************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************** in %s on line %d
diff --git a/ext/ftp/tests/ftp_get_ascii_bare_cr.phpt b/ext/ftp/tests/ftp_get_ascii_bare_cr.phpt
new file mode 100644
index 000000000000..1fe92bf8de7e
--- /dev/null
+++ b/ext/ftp/tests/ftp_get_ascii_bare_cr.phpt
@@ -0,0 +1,32 @@
+--TEST--
+ftp_get() ASCII mode: bare CR is preserved, CRLF folds to LF
+--EXTENSIONS--
+ftp
+pcntl
+--FILE--
+
+--CLEAN--
+
+--EXPECT--
+bool(true)
+bool(true)
+bool(true)
+bool(true)
diff --git a/ext/ftp/tests/ftp_get_ascii_crlf_boundary.phpt b/ext/ftp/tests/ftp_get_ascii_crlf_boundary.phpt
new file mode 100644
index 000000000000..4c3a70b647c6
--- /dev/null
+++ b/ext/ftp/tests/ftp_get_ascii_crlf_boundary.phpt
@@ -0,0 +1,25 @@
+--TEST--
+ftp_get() ASCII mode: CRLF straddling the FTP_BUFSIZE read boundary
+--EXTENSIONS--
+ftp
+pcntl
+--FILE--
+
+--CLEAN--
+
+--EXPECT--
+bool(true)
+bool(true)
diff --git a/ext/ftp/tests/server.inc b/ext/ftp/tests/server.inc
index 97f4f07d0020..251536ff8202 100644
--- a/ext/ftp/tests/server.inc
+++ b/ext/ftp/tests/server.inc
@@ -391,6 +391,27 @@ if ($pid) {
                     // Just a side channel for getting the received file size.
                     fputs($s, "425 Can't open data connection (".$GLOBALS['rest_pos'].").\r\n");
                     break;
+                case "crlf_boundary":
+                    // A CRLF whose CR lands on the final byte of the first
+                    // FTP_BUFSIZE (4096) read, so the LF arrives in the next read.
+                    fputs($s, "150 File status okay; about to open data connection.\r\n");
+                    fputs($fs, str_repeat("A", 4095) . "\r\n" . str_repeat("B", 10));
+                    fputs($s, "226 Closing data Connection.\r\n");
+                    break;
+                case "bare_cr":
+                    // A bare CR (not part of CRLF) mid-stream, plus a bare CR on
+                    // the final byte of the first FTP_BUFSIZE (4096) read followed
+                    // by a non-LF byte in the next read.
+                    fputs($s, "150 File status okay; about to open data connection.\r\n");
+                    fputs($fs, "line1\r\nba\rre\r\nend" . str_repeat("X", 4078) . "\r" . str_repeat("Y", 10));
+                    fputs($s, "226 Closing data Connection.\r\n");
+                    break;
+                case "trailing_cr":
+                    // The whole transfer ends on a bare CR.
+                    fputs($s, "150 File status okay; about to open data connection.\r\n");
+                    fputs($fs, "trail\r");
+                    fputs($s, "226 Closing data Connection.\r\n");
+                    break;
 
                 default:
                     fputs($s, "550 {$matches[1]}: No such file or directory \r\n");
diff --git a/ext/gd/gd.c b/ext/gd/gd.c
index 81f442f33348..70a379dbe9be 100644
--- a/ext/gd/gd.c
+++ b/ext/gd/gd.c
@@ -1,14 +1,12 @@
 /*
    +----------------------------------------------------------------------+
-   | Copyright (c) The PHP Group                                          |
+   | Copyright © The PHP Group and Contributors.                          |
    +----------------------------------------------------------------------+
-   | This source file is subject to version 3.01 of the PHP license,      |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | https://www.php.net/license/3_01.txt                                 |
-   | If you did not receive a copy of the PHP license and are unable to   |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@php.net so we can mail you a copy immediately.               |
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Authors: Rasmus Lerdorf                              |
    |          Stig Bakken                                    |
@@ -146,14 +144,7 @@ static zend_function *php_gd_image_object_get_constructor(zend_object *object)
 	return NULL;
 }
 
-/**
- * Returns the underlying php_gd_image_object from a zend_object
- */
-
-static zend_always_inline php_gd_image_object* php_gd_exgdimage_from_zobj_p(zend_object* obj)
-{
-	return (php_gd_image_object *) ((char *) (obj) - XtOffsetOf(php_gd_image_object, std));
-}
+#define php_gd_exgdimage_from_zobj_p(obj) ZEND_CONTAINER_OF(obj, php_gd_image_object, std)
 
 /**
  * Converts an extension GdImage instance contained within a zval into the gdImagePtr
@@ -208,7 +199,7 @@ static void php_gd_object_minit_helper(void)
 	php_gd_image_object_handlers.free_obj = php_gd_image_object_free;
 	php_gd_image_object_handlers.get_constructor = php_gd_image_object_get_constructor;
 	php_gd_image_object_handlers.compare = zend_objects_not_comparable;
-	php_gd_image_object_handlers.offset = XtOffsetOf(php_gd_image_object, std);
+	php_gd_image_object_handlers.offset = offsetof(php_gd_image_object, std);
 }
 
 static zend_class_entry *gd_font_ce = NULL;
@@ -273,7 +264,7 @@ static void php_gd_font_minit_helper(void)
 	php_gd_font_object_handlers.clone_obj = NULL;
 	php_gd_font_object_handlers.free_obj = php_gd_font_object_free;
 	php_gd_font_object_handlers.get_constructor = php_gd_font_object_get_constructor;
-	php_gd_font_object_handlers.offset = XtOffsetOf(php_gd_font_object, std);
+	php_gd_font_object_handlers.offset = offsetof(php_gd_font_object, std);
 }
 
 /*********************************************************
@@ -542,7 +533,7 @@ PHP_FUNCTION(imageloadfont)
 	 */
 	font = (gdFontPtr) emalloc(sizeof(gdFont));
 	b = 0;
-	while (b < hdr_size && (n = php_stream_read(stream, (char*)&font[b], hdr_size - b)) > 0) {
+	while (b < hdr_size && (n = php_stream_read(stream, (char *) font + b, hdr_size - b)) > 0) {
 		b += n;
 	}
 
@@ -640,7 +631,20 @@ PHP_FUNCTION(imagesetstyle)
 	stylearr = safe_emalloc(num_styles, sizeof(int), 0);
 
 	ZEND_HASH_FOREACH_VAL(Z_ARRVAL_P(styles), item) {
-		stylearr[index++] = zval_get_long(item);
+		bool failed = false;
+		ZVAL_DEREF(item);
+		zend_long tmp = zval_try_get_long(item, &failed);
+		if (failed) {
+			efree(stylearr);
+			zend_argument_type_error(2, "must only have elements of type int, %s given", zend_zval_type_name(item));
+			RETURN_THROWS();
+		}
+		if (ZEND_LONG_EXCEEDS_INT(tmp)) {
+			efree(stylearr);
+			zend_argument_value_error(2, "elements must be between %d and %d", INT_MIN, INT_MAX);
+			RETURN_THROWS();
+		}
+		stylearr[index++] = (int) tmp;
 	} ZEND_HASH_FOREACH_END();
 
 	gdImageSetStyle(im, stylearr, index);
@@ -764,19 +768,15 @@ PHP_FUNCTION(imagecolormatch)
 		case -1:
 			zend_argument_value_error(1, "must be TrueColor");
 			RETURN_THROWS();
-			break;
 		case -2:
 			zend_argument_value_error(2, "must be Palette");
 			RETURN_THROWS();
-			break;
 		case -3:
 			zend_argument_value_error(2, "must be the same size as argument #1 ($im1)");
 			RETURN_THROWS();
-			break;
 		case -4:
 			zend_argument_value_error(2, "must have at least one color");
 			RETURN_THROWS();
-			break;
 	}
 
 	RETURN_TRUE;
@@ -1599,7 +1599,7 @@ static void _php_image_create_from(INTERNAL_FUNCTION_PARAMETERS, int image_type,
 
 #ifdef HAVE_GD_JPG
 			case PHP_GDIMG_TYPE_JPG:
-				ignore_warning = INI_INT("gd.jpeg_ignore_warning");
+				ignore_warning = zend_ini_bool_literal("gd.jpeg_ignore_warning");
 				im = gdImageCreateFromJpegEx(fp, ignore_warning);
 			break;
 #endif
@@ -1750,7 +1750,7 @@ static void _php_image_output(INTERNAL_FUNCTION_PARAMETERS, int image_type)
 				RETURN_THROWS();
 			}
 			break;
-		EMPTY_SWITCH_DEFAULT_CASE()
+		default: ZEND_UNREACHABLE();
 	}
 
 	/* quality must fit in an int */
@@ -1780,7 +1780,7 @@ static void _php_image_output(INTERNAL_FUNCTION_PARAMETERS, int image_type)
 				}
 				gdImageGd2(im, fp, quality, type);
 				break;
-			EMPTY_SWITCH_DEFAULT_CASE()
+			default: ZEND_UNREACHABLE();
 		}
 		fflush(fp);
 		fclose(fp);
@@ -1806,7 +1806,7 @@ static void _php_image_output(INTERNAL_FUNCTION_PARAMETERS, int image_type)
 				}
 				gdImageGd2(im, tmp, quality, type);
 				break;
-			EMPTY_SWITCH_DEFAULT_CASE()
+			default: ZEND_UNREACHABLE();
 		}
 
 		fseek(tmp, 0, SEEK_SET);
@@ -3599,7 +3599,20 @@ static void php_image_filter_scatter(INTERNAL_FUNCTION_PARAMETERS)
 		colors = safe_emalloc(num_colors, sizeof(int), 0);
 
 		ZEND_HASH_FOREACH_VAL(Z_ARRVAL_P(hash_colors), color) {
-			*(colors + i++) = (int) zval_get_long(color);
+			bool failed = false;
+			ZVAL_DEREF(color);
+			zend_long tmp = zval_try_get_long(color, &failed);
+			if (failed) {
+				efree(colors);
+				zend_argument_type_error(5, "must be of type int, %s given", zend_zval_type_name(color));
+				RETURN_THROWS();
+			}
+			if (tmp < 0 || ZEND_LONG_INT_OVFL(tmp)) {
+				efree(colors);
+				zend_argument_value_error(5, "value must be between 0 and %d", INT_MAX);
+				RETURN_THROWS();
+			}
+			colors[i++] = (int) tmp;
 		} ZEND_HASH_FOREACH_END();
 
 		RETVAL_BOOL(gdImageScatterColor(im, (int)scatter_sub, (int)scatter_plus, colors, num_colors));
@@ -3767,6 +3780,23 @@ PHP_FUNCTION(imageantialias)
 }
 /* }}} */
 
+static bool php_gd_zval_try_get_c_int(zval *tmp, const char *field, int *res) {
+	zend_long r;
+	bool failed = false;
+	ZVAL_DEREF(tmp);
+	r = zval_try_get_long(tmp, &failed);
+	if (failed) {
+		zend_argument_type_error(2, "\"%s\" key must be of type int, %s given", field, zend_zval_type_name(tmp));
+		return false;
+	}
+	if (UNEXPECTED(ZEND_LONG_EXCEEDS_INT(r))) {
+		zend_argument_value_error(2, "\"%s\" key must be between %d and %d", field, INT_MIN, INT_MAX);
+		return false;
+	}
+	*res = (int)r;
+	return true;
+}
+
 /* {{{ Crop an image using the given coordinates and size, x, y, width and height. */
 PHP_FUNCTION(imagecrop)
 {
@@ -3785,28 +3815,36 @@ PHP_FUNCTION(imagecrop)
 	im = php_gd_libgdimageptr_from_zval_p(IM);
 
 	if ((tmp = zend_hash_str_find(Z_ARRVAL_P(z_rect), "x", sizeof("x") -1)) != NULL) {
-		rect.x = zval_get_long(tmp);
+		if (!php_gd_zval_try_get_c_int(tmp, "x", &rect.x)) {
+			RETURN_THROWS();
+		}
 	} else {
 		zend_argument_value_error(2, "must have an \"x\" key");
 		RETURN_THROWS();
 	}
 
 	if ((tmp = zend_hash_str_find(Z_ARRVAL_P(z_rect), "y", sizeof("y") - 1)) != NULL) {
-		rect.y = zval_get_long(tmp);
+		if (!php_gd_zval_try_get_c_int(tmp, "y", &rect.y)) {
+			RETURN_THROWS();
+		}
 	} else {
 		zend_argument_value_error(2, "must have a \"y\" key");
 		RETURN_THROWS();
 	}
 
 	if ((tmp = zend_hash_str_find(Z_ARRVAL_P(z_rect), "width", sizeof("width") - 1)) != NULL) {
-		rect.width = zval_get_long(tmp);
+		if (!php_gd_zval_try_get_c_int(tmp, "width", &rect.width)) {
+			RETURN_THROWS();
+		}
 	} else {
 		zend_argument_value_error(2, "must have a \"width\" key");
 		RETURN_THROWS();
 	}
 
 	if ((tmp = zend_hash_str_find(Z_ARRVAL_P(z_rect), "height", sizeof("height") - 1)) != NULL) {
-		rect.height = zval_get_long(tmp);
+		if (!php_gd_zval_try_get_c_int(tmp, "height", &rect.height)) {
+			RETURN_THROWS();
+		}
 	} else {
 		zend_argument_value_error(2, "must have a \"height\" key");
 		RETURN_THROWS();
diff --git a/ext/gd/libgd/gd.c b/ext/gd/libgd/gd.c
index 71a0e9ea63f2..47c4dbc0d770 100644
--- a/ext/gd/libgd/gd.c
+++ b/ext/gd/libgd/gd.c
@@ -1783,6 +1783,9 @@ void gdImageEllipse(gdImagePtr im, int mx, int my, int w, int h, int c)
 
 	a=w>>1;
 	b=h>>1;
+	if (overflowMul3(a, b, b) || overflowMul3(b, a, a)) {
+		return;
+	}
 	gdImageSetPixel(im,mx+a, my, c);
 	gdImageSetPixel(im,mx-a, my, c);
 	mx1 = mx-a;my1 = my;
@@ -1824,7 +1827,9 @@ void gdImageFilledEllipse (gdImagePtr im, int mx, int my, int w, int h, int c)
 
 	a=w>>1;
 	b=h>>1;
-
+	if (overflowMul3(a, b, b) || overflowMul3(b, a, a)) {
+		return;
+	}
 	for (x = mx-a; x <= mx+a; x++) {
 		gdImageSetPixel(im, x, my, c);
 	}
@@ -2879,12 +2884,12 @@ void gdImageFilledPolygon (gdImagePtr im, gdPointPtr p, int n, int c)
 
 void gdImageSetStyle (gdImagePtr im, int *style, int noOfPixels)
 {
-	if (im->style) {
-		gdFree(im->style);
-	}
 	if (overflow2(sizeof (int), noOfPixels)) {
 		return;
 	}
+	if (im->style) {
+		gdFree(im->style);
+	}
 	im->style = (int *) gdMalloc(sizeof(int) * noOfPixels);
 	memcpy(im->style, style, sizeof(int) * noOfPixels);
 	im->styleLength = noOfPixels;
diff --git a/ext/gd/libgd/gd_filter.c b/ext/gd/libgd/gd_filter.c
index d567898548d2..97dea5c552cd 100644
--- a/ext/gd/libgd/gd_filter.c
+++ b/ext/gd/libgd/gd_filter.c
@@ -7,6 +7,7 @@
 #else
 # include 
 #endif
+#include 
 #include 
 #include 
 
@@ -20,6 +21,20 @@
 /* Begin filters function */
 #define GET_PIXEL_FUNCTION(src)(src->trueColor?gdImageGetTrueColorPixel:gdImageGetPixel)
 
+static int gdClampFloatToByte(float value)
+{
+	if (!isfinite(value)) {
+		return value > 0.0f ? 255 : 0;
+	}
+	if (value > 255.0f) {
+		return 255;
+	}
+	if (value < 0.0f) {
+		return 0;
+	}
+	return (int)value;
+}
+
 #ifdef _WIN32
 # define GD_SCATTER_SEED() (unsigned int)(time(0) * GetCurrentProcessId())
 #else
@@ -417,6 +432,7 @@ int gdImageConvolution(gdImagePtr src, float filter[3][3], float filter_div, flo
 
 	for ( y=0; ysy; y++) {
 		for(x=0; xsx; x++) {
+			int new_ri, new_gi, new_bi;
 			new_r = new_g = new_b = 0;
 			pxl = f(srcback, x, y);
 			new_a = gdImageAlpha(srcback, pxl);
@@ -435,13 +451,13 @@ int gdImageConvolution(gdImagePtr src, float filter[3][3], float filter_div, flo
 			new_g = (new_g/filter_div)+offset;
 			new_b = (new_b/filter_div)+offset;
 
-			new_r = (new_r > 255.0f)? 255.0f : ((new_r < 0.0f)? 0.0f:new_r);
-			new_g = (new_g > 255.0f)? 255.0f : ((new_g < 0.0f)? 0.0f:new_g);
-			new_b = (new_b > 255.0f)? 255.0f : ((new_b < 0.0f)? 0.0f:new_b);
+			new_ri = gdClampFloatToByte(new_r);
+			new_gi = gdClampFloatToByte(new_g);
+			new_bi = gdClampFloatToByte(new_b);
 
-			new_pxl = gdImageColorAllocateAlpha(src, (int)new_r, (int)new_g, (int)new_b, new_a);
+			new_pxl = gdImageColorAllocateAlpha(src, new_ri, new_gi, new_bi, new_a);
 			if (new_pxl == -1) {
-				new_pxl = gdImageColorClosestAlpha(src, (int)new_r, (int)new_g, (int)new_b, new_a);
+				new_pxl = gdImageColorClosestAlpha(src, new_ri, new_gi, new_bi, new_a);
 			}
 			gdImageSetPixel (src, x, y, new_pxl);
 		}
diff --git a/ext/gd/libgd/gd_interpolation.c b/ext/gd/libgd/gd_interpolation.c
index f8ba9087910f..7731d47a0c7c 100644
--- a/ext/gd/libgd/gd_interpolation.c
+++ b/ext/gd/libgd/gd_interpolation.c
@@ -57,6 +57,7 @@
 #include 
 #include 
 #include 
+#include 
 
 #include "gd.h"
 #include "gdhelpers.h"
@@ -1873,7 +1874,10 @@ int gdTransformAffineGetImage(gdImagePtr *dst,
 		src_area = &area_full;
 	}
 
-	gdTransformAffineBoundingBox(src_area, affine, &bbox);
+	if (gdTransformAffineBoundingBox(src_area, affine, &bbox) != GD_TRUE) {
+		*dst = NULL;
+		return GD_FALSE;
+	}
 
 	*dst = gdImageCreateTrueColor(bbox.width, bbox.height);
 	if (*dst == NULL) {
@@ -2049,6 +2053,8 @@ int gdTransformAffineCopy(gdImagePtr dst,
 int gdTransformAffineBoundingBox(gdRectPtr src, const double affine[6], gdRectPtr bbox)
 {
 	gdPointF extent[4], min, max, point;
+	double width, height;
+	int bbox_x, bbox_y, bbox_width, bbox_height;
 	int i;
 
 	extent[0].x=0.0;
@@ -2079,10 +2085,29 @@ int gdTransformAffineBoundingBox(gdRectPtr src, const double affine[6], gdRectPt
 		if (max.y < extent[i].y)
 			max.y=extent[i].y;
 	}
-	bbox->x = (int) min.x;
-	bbox->y = (int) min.y;
-	bbox->width  = (int) floor(max.x - min.x) - 1;
-	bbox->height = (int) floor(max.y - min.y);
+	width = floor(max.x - min.x);
+	height = floor(max.y - min.y);
+	if (!isfinite(min.x) || !isfinite(min.y) || !isfinite(width) || !isfinite(height)
+		|| min.x <= INT_MIN || min.x > INT_MAX
+		|| min.y <= INT_MIN || min.y > INT_MAX
+		|| width < 1.0 || width > INT_MAX
+		|| height < 0.0 || height > INT_MAX) {
+		return GD_FALSE;
+	}
+	bbox_x = (int) min.x;
+	bbox_y = (int) min.y;
+	bbox_width = (int) width - 1;
+	bbox_height = (int) height;
+	if ((bbox_x < 0 && bbox_width > INT_MAX + bbox_x)
+		|| (bbox_x > 0 && bbox_width > INT_MAX - bbox_x)
+		|| (bbox_y < 0 && bbox_height > INT_MAX + bbox_y)
+		|| (bbox_y > 0 && bbox_height > INT_MAX - bbox_y)) {
+		return GD_FALSE;
+	}
+	bbox->x = bbox_x;
+	bbox->y = bbox_y;
+	bbox->width  = bbox_width;
+	bbox->height = bbox_height;
 	return GD_TRUE;
 }
 
diff --git a/ext/gd/libgd/gd_security.c b/ext/gd/libgd/gd_security.c
index 438a564ff17c..cbc4872d2fce 100644
--- a/ext/gd/libgd/gd_security.c
+++ b/ext/gd/libgd/gd_security.c
@@ -14,6 +14,7 @@
 
 #include 
 #include 
+#include 
 #include 
 #include "gd.h"
 #include "gd_errors.h"
@@ -30,3 +31,20 @@ int overflow2(int a, int b)
 	}
 	return 0;
 }
+
+int overflowMul3(int a, int b, int c)
+{
+	if (a < 0 || b < 0 || c < 0) {
+		return 1;
+	}
+	if (a == 0 || b == 0 || c == 0) {
+		return 0;
+	}
+	if (a > INT_MAX / b) {
+		return 1;
+	}
+	if ((int64_t)a * b > INT64_MAX / c) {
+		return 1;
+	}
+	return 0;
+}
diff --git a/ext/gd/libgd/gd_xbm.c b/ext/gd/libgd/gd_xbm.c
index 3c655a2998c1..bd81b8685b20 100644
--- a/ext/gd/libgd/gd_xbm.c
+++ b/ext/gd/libgd/gd_xbm.c
@@ -1,14 +1,12 @@
 /*
    +----------------------------------------------------------------------+
-   | Copyright (c) The PHP Group                                          |
+   | Copyright © The PHP Group and Contributors.                          |
    +----------------------------------------------------------------------+
-   | This source file is subject to version 3.01 of the PHP license,      |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | https://www.php.net/license/3_01.txt                                 |
-   | If you did not receive a copy of the PHP license and are unable to   |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@php.net so we can mail you a copy immediately.               |
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Author: Marcus Boerger                                |
    +----------------------------------------------------------------------+
@@ -191,7 +189,7 @@ void gdImageXbmCtx(gdImagePtr image, char* file_name, int fg, gdIOCtx * out)
 	} else {
 		for (i=0; i.        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Authors: Rasmus Lerdorf                              |
    |          Stig Bakken                                    |
diff --git a/ext/gd/tests/bug66356.phpt b/ext/gd/tests/bug66356.phpt
index b65fb54f5718..616a270115c1 100644
--- a/ext/gd/tests/bug66356.phpt
+++ b/ext/gd/tests/bug66356.phpt
@@ -7,10 +7,14 @@ gd
 $img = imagecreatetruecolor(10, 10);
 
 // POC #1
-var_dump(imagecrop($img, array("x" => "a", "y" => 0, "width" => 10, "height" => 10)));
+var_dump(imagecrop($img, array("x" => 0, "y" => 0, "width" => 10, "height" => 10)));
 
-$arr = array("x" => "a", "y" => "12b", "width" => 10, "height" => 10);
-var_dump(imagecrop($img, $arr));
+$arr = array("x" => 2147483647, "y" => 2147483647, "width" => 10, "height" => 10);
+try {
+	imagecrop($img, $arr);
+} catch (\ValueError $e) {
+	echo $e->getMessage() . PHP_EOL;
+}
 print_r($arr);
 
 // POC #2
@@ -28,12 +32,11 @@ var_dump(imagecrop($img, array("x" => 0, "y" => 0, "width" => 65535, "height" =>
 --EXPECTF--
 object(GdImage)#2 (0) {
 }
-object(GdImage)#2 (0) {
-}
+imagecrop(): Argument #2 ($rectangle) overflow with "x" and "width" keys
 Array
 (
-    [x] => a
-    [y] => 12b
+    [x] => 2147483647
+    [y] => 2147483647
     [width] => 10
     [height] => 10
 )
@@ -41,9 +44,9 @@ Array
 Warning: imagecrop(): %cne parameter to a memory allocation multiplication is negative or zero, failing operation gracefully
  in %s on line %d
 bool(false)
-object(GdImage)#2 (0) {
+object(GdImage)#3 (0) {
 }
-object(GdImage)#2 (0) {
+object(GdImage)#3 (0) {
 }
 
 Warning: imagecrop(): %croduct of memory allocation multiplication would exceed INT_MAX, failing operation gracefully
diff --git a/ext/gd/tests/bug79945.phpt b/ext/gd/tests/bug79945.phpt
index 5db958e36d35..46dac358d8e2 100644
--- a/ext/gd/tests/bug79945.phpt
+++ b/ext/gd/tests/bug79945.phpt
@@ -9,17 +9,17 @@ if (!(imagetypes() & IMG_PNG)) {
 }
 set_error_handler(function($errno, $errstr) {
     if (str_contains($errstr, 'Cannot cast a filtered stream on this system')) {
-        die('skip: fopencookie not support on this system');
+        die('skip: fopencookie not supported on this system');
     }
 });
-imagecreatefrompng('php://filter/read=convert.base64-encode/resource=' . __DIR__ . '/test.png');
+imagecreatefrompng('php://filter/read=string.rot13/resource=' . __DIR__ . '/test.png');
 restore_error_handler();
 ?>
 --FILE--
 
 --CLEAN--
 --EXPECTF--
 
-Warning: imagecreatefrompng(): "php://filter/read=convert.base64-encode/resource=%s" is not a valid PNG file in %s on line %d
+Warning: imagecreatefrompng(): "php://filter/read=string.rot13/resource=%s" is not a valid PNG file in %s on line %d
diff --git a/ext/gd/tests/gh16559.phpt b/ext/gd/tests/gh16559.phpt
index 4481311c4c45..2bb5bab05642 100644
--- a/ext/gd/tests/gh16559.phpt
+++ b/ext/gd/tests/gh16559.phpt
@@ -2,6 +2,13 @@
 GH-16559 (UBSan abort in ext/gd/libgd/gd_interpolation.c:1007)
 --EXTENSIONS--
 gd
+--SKIPIF--
+
 --FILE--
 
 --FILE--
 
+--FILE--
+getMessage() . PHP_EOL;
+}
+try {
+	imagesetstyle($img, [0, PHP_INT_MIN]);
+} catch (\ValueError $e) {
+	echo $e->getMessage() . PHP_EOL;
+}
+try {
+	imagefilter($img, IMG_FILTER_SCATTER, 0, 0, [new A()]);
+} catch (\TypeError $e) {
+	echo $e->getMessage() . PHP_EOL;
+}
+try {
+	imagefilter($img, IMG_FILTER_SCATTER, 0, 0, [-1]);
+} catch (\ValueError $e) {
+	echo $e->getMessage() . PHP_EOL;
+}
+try {
+	imagecrop($img, ["x" => PHP_INT_MIN, "y" => 0, "width" => 0, "height" => 0]);
+} catch (\ValueError $e) {
+	echo $e->getMessage() . PHP_EOL;
+}
+try {
+	imagecrop($img, ["x" => 0, "y" => PHP_INT_MIN, "width" => 0, "height" => 0]);
+} catch (\ValueError $e) {
+	echo $e->getMessage() . PHP_EOL;
+}
+try {
+	imagecrop($img, ["x" => 0, "y" => 0, "width" => PHP_INT_MAX, "height" => 0]);
+} catch (\ValueError $e) {
+	echo $e->getMessage() . PHP_EOL;
+}
+try {
+	imagecrop($img, ["x" => 0, "y" => 0, "width" => 0, "height" => PHP_INT_MAX]);
+} catch (\ValueError $e) {
+	echo $e->getMessage() . PHP_EOL;
+}
+
+try {
+	imagecrop($img, ["x" => new A(), "y" => 0, "width" => 0, "height" => 0]);
+} catch (\TypeError $e) {
+	echo $e->getMessage() . PHP_EOL;
+}
+try {
+	imagecrop($img, ["x" => 0, "y" => new A(), "width" => 0, "height" => 0]);
+} catch (\TypeError $e) {
+	echo $e->getMessage() . PHP_EOL;
+}
+try {
+	imagecrop($img, ["x" => 0, "y" => 0, "width" => new A(), "height" => 0]);
+} catch (\TypeError $e) {
+	echo $e->getMessage() . PHP_EOL;
+}
+try {
+	imagecrop($img, ["x" => 0, "y" => 0, "width" => 0, "height" => new A()]);
+} catch (\TypeError $e) {
+	echo $e->getMessage() . PHP_EOL;
+}
+
+$one = 1;
+var_dump(imagecrop($img, ["x" => &$one, "y" => &$one, "width" => &$one, "height" => &$one]));
+?>
+--EXPECTF--
+imagesetstyle(): Argument #2 ($style) must only have elements of type int, A given
+imagesetstyle(): Argument #2 ($style) elements must be between %i and %d
+imagefilter(): Argument #5 must be of type int, A given
+imagefilter(): Argument #5 value must be between 0 and 2147483647
+imagecrop(): Argument #2 ($rectangle) "x" key must be between %i and %d
+imagecrop(): Argument #2 ($rectangle) "y" key must be between %i and %d
+imagecrop(): Argument #2 ($rectangle) "width" key must be between %i and %d
+imagecrop(): Argument #2 ($rectangle) "height" key must be between %i and %d
+imagecrop(): Argument #2 ($rectangle) "x" key must be of type int, A given
+imagecrop(): Argument #2 ($rectangle) "y" key must be of type int, A given
+imagecrop(): Argument #2 ($rectangle) "width" key must be of type int, A given
+imagecrop(): Argument #2 ($rectangle) "height" key must be of type int, A given
+object(GdImage)#2 (0) {
+}
diff --git a/ext/gd/tests/gh19666.phpt b/ext/gd/tests/gh19666.phpt
new file mode 100644
index 000000000000..ba9bf54f5661
--- /dev/null
+++ b/ext/gd/tests/gh19666.phpt
@@ -0,0 +1,32 @@
+--TEST--
+GH-19666 (Unexpected nan value in imageconvolution)
+--EXTENSIONS--
+gd
+--FILE--
+
+--EXPECT--
+bool(true)
+array(4) {
+  ["red"]=>
+  int(0)
+  ["green"]=>
+  int(0)
+  ["blue"]=>
+  int(0)
+  ["alpha"]=>
+  int(0)
+}
diff --git a/ext/gd/tests/gh19730.phpt b/ext/gd/tests/gh19730.phpt
new file mode 100644
index 000000000000..5ea4a2846a9e
--- /dev/null
+++ b/ext/gd/tests/gh19730.phpt
@@ -0,0 +1,18 @@
+--TEST--
+GH-19730 (undefined behavior in gd_interpolation.c)
+--EXTENSIONS--
+gd
+--SKIPIF--
+
+--FILE--
+
+--EXPECT--
+bool(false)
diff --git a/ext/gd/tests/gh19739.phpt b/ext/gd/tests/gh19739.phpt
new file mode 100644
index 000000000000..7dce387b780e
--- /dev/null
+++ b/ext/gd/tests/gh19739.phpt
@@ -0,0 +1,18 @@
+--TEST--
+GH-19739 (integer overflow in imageellipse / imagefilledellipse)
+--EXTENSIONS--
+gd
+--FILE--
+
+--EXPECT--
+bool(true)
+bool(true)
+done
diff --git a/ext/gd/tests/imagebmp_basic.phpt b/ext/gd/tests/imagebmp_basic.phpt
index ff302a8b0742..82b14f06b3cd 100644
--- a/ext/gd/tests/imagebmp_basic.phpt
+++ b/ext/gd/tests/imagebmp_basic.phpt
@@ -2,6 +2,12 @@
 imagebmp() - basic functionality
 --EXTENSIONS--
 gd
+--SKIPIF--
+
 --FILE--
 data = pack('V4', 1, 32, 1, 1) . "\x00";
+        return true;
+    }
+
+    public function stream_read($count): string
+    {
+        return $this->pos < strlen($this->data) ? $this->data[$this->pos++] : '';
+    }
+
+    public function stream_eof(): bool
+    {
+        return $this->pos >= strlen($this->data);
+    }
+
+    public function stream_stat()
+    {
+        return [];
+    }
+
+    public function stream_tell(): int
+    {
+        return $this->pos;
+    }
+
+    public function stream_seek($offset, $whence): bool
+    {
+        if ($whence === SEEK_CUR) {
+            $this->pos += $offset;
+        } elseif ($whence === SEEK_END) {
+            $this->pos = strlen($this->data) + $offset;
+        } else {
+            $this->pos = $offset;
+        }
+        return true;
+    }
+
+    public function stream_set_option($option, $arg1, $arg2): bool
+    {
+        return false;
+    }
+}
+
+stream_wrapper_register('drip', drip::class);
+var_dump(imageloadfont('drip://font') instanceof GdFont);
+?>
+--EXPECT--
+bool(true)
diff --git a/ext/gettext/gettext.c b/ext/gettext/gettext.c
index 6badea4a1769..172ae76d3876 100644
--- a/ext/gettext/gettext.c
+++ b/ext/gettext/gettext.c
@@ -1,14 +1,12 @@
 /*
    +----------------------------------------------------------------------+
-   | Copyright (c) The PHP Group                                          |
+   | Copyright © The PHP Group and Contributors.                          |
    +----------------------------------------------------------------------+
-   | This source file is subject to version 3.01 of the PHP license,      |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | https://www.php.net/license/3_01.txt                                 |
-   | If you did not receive a copy of the PHP license and are unable to   |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@php.net so we can mail you a copy immediately.               |
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Author: Alex Plotnick                                |
    +----------------------------------------------------------------------+
diff --git a/ext/gettext/php_gettext.h b/ext/gettext/php_gettext.h
index f98e459f127c..5799ecf1d89b 100644
--- a/ext/gettext/php_gettext.h
+++ b/ext/gettext/php_gettext.h
@@ -1,14 +1,12 @@
 /*
    +----------------------------------------------------------------------+
-   | Copyright (c) The PHP Group                                          |
+   | Copyright © The PHP Group and Contributors.                          |
    +----------------------------------------------------------------------+
-   | This source file is subject to version 3.01 of the PHP license,      |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | https://www.php.net/license/3_01.txt                                 |
-   | If you did not receive a copy of the PHP license and are unable to   |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@php.net so we can mail you a copy immediately.               |
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Author: Alex Plotnick                                |
    +----------------------------------------------------------------------+
diff --git a/ext/gmp/gmp.c b/ext/gmp/gmp.c
index b5451b8035e3..ef06d0fda30c 100644
--- a/ext/gmp/gmp.c
+++ b/ext/gmp/gmp.c
@@ -1,14 +1,12 @@
 /*
    +----------------------------------------------------------------------+
-   | Copyright (c) The PHP Group                                          |
+   | Copyright © The PHP Group and Contributors.                          |
    +----------------------------------------------------------------------+
-   | This source file is subject to version 3.01 of the PHP license,      |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | https://www.php.net/license/3_01.txt                                 |
-   | If you did not receive a copy of the PHP license and are unable to   |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@php.net so we can mail you a copy immediately.               |
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Author: Stanislav Malyshev                             |
    +----------------------------------------------------------------------+
@@ -285,7 +283,7 @@ static HashTable *gmp_get_debug_info(zend_object *obj, int *is_temp) /* {{{ */
 
 static zend_object *gmp_clone_obj(zend_object *obj) /* {{{ */
 {
-	gmp_object *old_object = GET_GMP_OBJECT_FROM_OBJ(obj);
+	const gmp_object *old_object = GET_GMP_OBJECT_FROM_OBJ(obj);
 	gmp_object *new_object = GET_GMP_OBJECT_FROM_OBJ(gmp_create_object(obj->ce));
 
 	zend_objects_clone_members( &new_object->std, &old_object->std);
@@ -334,11 +332,11 @@ static zend_result shift_operator_helper(gmp_binary_ui_op_t op, zval *return_val
 
 	if (UNEXPECTED(Z_TYPE_P(op2) != IS_LONG)) {
 		if (UNEXPECTED(!IS_GMP(op2))) {
-			// For PHP 8.3 and up use zend_try_get_long()
+			bool failed;
 			switch (Z_TYPE_P(op2)) {
 				case IS_DOUBLE:
-					shift = zval_get_long(op2);
-					if (UNEXPECTED(EG(exception))) {
+					shift = zval_try_get_long(op2, &failed);
+					if (UNEXPECTED(failed)) {
 						return FAILURE;
 					}
 					break;
@@ -358,10 +356,10 @@ static zend_result shift_operator_helper(gmp_binary_ui_op_t op, zval *return_val
 		shift = Z_LVAL_P(op2);
 	}
 
-	if (shift < 0) {
+	if (shift < 0 || shift > ULONG_MAX) {
 		zend_throw_error(
-			zend_ce_value_error, "%s must be greater than or equal to 0",
-			opcode == ZEND_POW ? "Exponent" : "Shift"
+			zend_ce_value_error, "%s must be between 0 and %lu",
+			opcode == ZEND_POW ? "Exponent" : "Shift", ULONG_MAX
 		);
 		ZVAL_UNDEF(return_value);
 		return FAILURE;
@@ -393,7 +391,7 @@ typeof_op_failure: ;
 		case ZEND_SR:
 			op_sigil = ">>";
 			break;
-		EMPTY_SWITCH_DEFAULT_CASE();
+		default: ZEND_UNREACHABLE();
 	}
 	zend_type_error("Unsupported operand types: %s %s %s", zend_zval_type_name(op1), op_sigil, zend_zval_type_name(op2));
 	return FAILURE;
@@ -588,7 +586,7 @@ ZEND_MINIT_FUNCTION(gmp)
 	gmp_ce->unserialize = gmp_unserialize;
 
 	memcpy(&gmp_object_handlers, &std_object_handlers, sizeof(zend_object_handlers));
-	gmp_object_handlers.offset = XtOffsetOf(gmp_object, std);
+	gmp_object_handlers.offset = offsetof(gmp_object, std);
 	gmp_object_handlers.free_obj = gmp_free_object_storage;
 	gmp_object_handlers.cast_object = gmp_cast_object;
 	gmp_object_handlers.get_debug_info = gmp_get_debug_info;
@@ -634,7 +632,7 @@ static zend_result convert_zstr_to_gmp(mpz_t gmp_number, const zend_string *val,
 	bool skip_lead = false;
 
 	size_t num_len = ZSTR_LEN(val);
-	while (isspace(*num_str)) {
+	while (isspace((unsigned char)*num_str)) {
 		++num_str;
 		--num_len;
 	}
@@ -929,7 +927,7 @@ ZEND_FUNCTION(gmp_div_qr)
 		case GMP_ROUND_MINUSINF:
 			mpz_fdiv_qr(gmpnum_result1, gmpnum_result2, gmpnum_a, gmpnum_b);
 			break;
-		EMPTY_SWITCH_DEFAULT_CASE()
+		default: ZEND_UNREACHABLE();
 	}
 }
 
@@ -1089,14 +1087,11 @@ ZEND_FUNCTION(gmp_fact)
 		GMP_Z_PARAM_INTO_MPZ_PTR(gmpnum)
 	ZEND_PARSE_PARAMETERS_END();
 
-	if (mpz_sgn(gmpnum) < 0) {
-		zend_argument_value_error(1, "must be greater than or equal to 0");
+	if (!mpz_fits_ulong_p(gmpnum)) {
+		zend_argument_value_error(1, "must be between 0 and %lu", ULONG_MAX);
 		RETURN_THROWS();
 	}
 
-	// TODO: Check that we don't an int that is larger than an unsigned long?
-	// Could use mpz_fits_slong_p() if we revert to using mpz_get_si()
-
 	INIT_GMP_RETVAL(gmpnum_result);
 	mpz_fac_ui(gmpnum_result, mpz_get_ui(gmpnum));
 }
@@ -1114,8 +1109,8 @@ ZEND_FUNCTION(gmp_binomial)
 		Z_PARAM_LONG(k)
 	ZEND_PARSE_PARAMETERS_END();
 
-	if (k < 0) {
-		zend_argument_value_error(2, "must be greater than or equal to 0");
+	if (k < 0 || k > ULONG_MAX) {
+		zend_argument_value_error(2, "must be between 0 and %lu", ULONG_MAX);
 		RETURN_THROWS();
 	}
 
@@ -1136,8 +1131,8 @@ ZEND_FUNCTION(gmp_pow)
 		Z_PARAM_LONG(exp)
 	ZEND_PARSE_PARAMETERS_END();
 
-	if (exp < 0) {
-		zend_argument_value_error(2, "must be greater than or equal to 0");
+	if (exp < 0 || exp > ULONG_MAX) {
+		zend_argument_value_error(2, "must be between 0 and %lu", ULONG_MAX);
 		RETURN_THROWS();
 	}
 
@@ -1163,7 +1158,7 @@ ZEND_FUNCTION(gmp_powm)
 	}
 
 	if (!mpz_cmp_ui(gmpnum_mod, 0)) {
-		zend_throw_exception_ex(zend_ce_division_by_zero_error, 0, "Modulo by zero");
+		zend_argument_error(zend_ce_division_by_zero_error, 3, "Modulo by zero");
 		RETURN_THROWS();
 	}
 
@@ -1226,8 +1221,8 @@ ZEND_FUNCTION(gmp_root)
 		Z_PARAM_LONG(nth)
 	ZEND_PARSE_PARAMETERS_END();
 
-	if (nth <= 0) {
-		zend_argument_value_error(2, "must be greater than 0");
+	if (nth <= 0 || nth > ULONG_MAX) {
+		zend_argument_value_error(2, "must be between 1 and %lu", ULONG_MAX);
 		RETURN_THROWS();
 	}
 
@@ -1253,8 +1248,8 @@ ZEND_FUNCTION(gmp_rootrem)
 		Z_PARAM_LONG(nth)
 	ZEND_PARSE_PARAMETERS_END();
 
-	if (nth <= 0) {
-		zend_argument_value_error(2, "must be greater than or equal to 1");
+	if (nth <= 0 || nth > ULONG_MAX) {
+		zend_argument_value_error(2, "must be between 1 and %lu", ULONG_MAX);
 		RETURN_THROWS();
 	}
 
diff --git a/ext/gmp/php_gmp.h b/ext/gmp/php_gmp.h
index 597c7a9146c2..220a36d64285 100644
--- a/ext/gmp/php_gmp.h
+++ b/ext/gmp/php_gmp.h
@@ -1,14 +1,12 @@
 /*
    +----------------------------------------------------------------------+
-   | Copyright (c) The PHP Group                                          |
+   | Copyright © The PHP Group and Contributors.                          |
    +----------------------------------------------------------------------+
-   | This source file is subject to version 3.01 of the PHP license,      |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | https://www.php.net/license/3_01.txt                                 |
-   | If you did not receive a copy of the PHP license and are unable to   |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@php.net so we can mail you a copy immediately.               |
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Author: Stanislav Malyshev                             |
    +----------------------------------------------------------------------+
diff --git a/ext/gmp/php_gmp_int.h b/ext/gmp/php_gmp_int.h
index 32f1d32f592a..d563a43ba553 100644
--- a/ext/gmp/php_gmp_int.h
+++ b/ext/gmp/php_gmp_int.h
@@ -1,3 +1,15 @@
+/*
+   +----------------------------------------------------------------------+
+   | Copyright © The PHP Group and Contributors.                          |
+   +----------------------------------------------------------------------+
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
+   +----------------------------------------------------------------------+
+ */
+
 /* interface header; needs to be installed; FIXME rename? */
 
 #ifndef incl_PHP_GMP_INT_H
@@ -23,9 +35,7 @@ typedef struct _gmp_object {
 	zend_object std;
 } gmp_object;
 
-static inline gmp_object *php_gmp_object_from_zend_object(zend_object *zobj) {
-	return (gmp_object *)( ((char *)zobj) - XtOffsetOf(gmp_object, std) );
-}
+#define php_gmp_object_from_zend_object(zobj) ZEND_CONTAINER_OF(zobj, gmp_object, std)
 
 PHP_GMP_API zend_class_entry *php_gmp_class_entry(void);
 
diff --git a/ext/gmp/tests/gmp_binomial.phpt b/ext/gmp/tests/gmp_binomial.phpt
index 4598a4c47ee8..1bf371e68a14 100644
--- a/ext/gmp/tests/gmp_binomial.phpt
+++ b/ext/gmp/tests/gmp_binomial.phpt
@@ -26,7 +26,7 @@ try {
     echo $e->getMessage() . \PHP_EOL;
 }
 ?>
---EXPECT--
+--EXPECTF--
 object(GMP)#1 (1) {
   ["num"]=>
   string(3) "252"
@@ -67,4 +67,4 @@ object(GMP)#2 (1) {
   ["num"]=>
   string(1) "7"
 }
-gmp_binomial(): Argument #2 ($k) must be greater than or equal to 0
+gmp_binomial(): Argument #2 ($k) must be between 0 and %d
diff --git a/ext/gmp/tests/gmp_fact.phpt b/ext/gmp/tests/gmp_fact.phpt
index e03931454940..b28f572c6975 100644
--- a/ext/gmp/tests/gmp_fact.phpt
+++ b/ext/gmp/tests/gmp_fact.phpt
@@ -45,17 +45,17 @@ try {
 
 echo "Done\n";
 ?>
---EXPECT--
+--EXPECTF--
 string(1) "1"
 gmp_fact(): Argument #1 ($num) is not an integer string
 string(1) "1"
-gmp_fact(): Argument #1 ($num) must be greater than or equal to 0
-gmp_fact(): Argument #1 ($num) must be greater than or equal to 0
+gmp_fact(): Argument #1 ($num) must be between 0 and %d
+gmp_fact(): Argument #1 ($num) must be between 0 and %d
 string(19) "2432902008176640000"
 string(65) "30414093201713378043612608166064768844377641568960512000000000000"
 string(7) "3628800"
 string(1) "1"
 string(9) "479001600"
-gmp_fact(): Argument #1 ($num) must be greater than or equal to 0
+gmp_fact(): Argument #1 ($num) must be between 0 and %d
 gmp_fact(): Argument #1 ($num) must be of type GMP|string|int, array given
 Done
diff --git a/ext/gmp/tests/gmp_fact_overflow.phpt b/ext/gmp/tests/gmp_fact_overflow.phpt
new file mode 100644
index 000000000000..2d22005818c5
--- /dev/null
+++ b/ext/gmp/tests/gmp_fact_overflow.phpt
@@ -0,0 +1,25 @@
+--TEST--
+gmp_fact() rejects values larger than unsigned long
+--EXTENSIONS--
+gmp
+--FILE--
+getMessage() . \PHP_EOL;
+}
+
+try {
+    var_dump(gmp_fact(gmp_init("18446744073709551616")));
+} catch (\ValueError $e) {
+    echo $e->getMessage() . \PHP_EOL;
+}
+
+echo "Done\n";
+?>
+--EXPECTF--
+gmp_fact(): Argument #1 ($num) must be between 0 and %d
+gmp_fact(): Argument #1 ($num) must be between 0 and %d
+Done
diff --git a/ext/gmp/tests/gmp_overflow_llp64.phpt b/ext/gmp/tests/gmp_overflow_llp64.phpt
new file mode 100644
index 000000000000..ea242bc52155
--- /dev/null
+++ b/ext/gmp/tests/gmp_overflow_llp64.phpt
@@ -0,0 +1,58 @@
+--TEST--
+GMP functions reject values larger than unsigned long on LLP64
+--EXTENSIONS--
+gmp
+--SKIPIF--
+
+--FILE--
+getMessage() . PHP_EOL;
+}
+
+try {
+    gmp_binomial(10, PHP_INT_MAX);
+} catch (ValueError $e) {
+    echo $e->getMessage() . PHP_EOL;
+}
+
+try {
+    gmp_root(10, PHP_INT_MAX);
+} catch (ValueError $e) {
+    echo $e->getMessage() . PHP_EOL;
+}
+
+try {
+    gmp_rootrem(10, PHP_INT_MAX);
+} catch (ValueError $e) {
+    echo $e->getMessage() . PHP_EOL;
+}
+
+$n = gmp_init(2);
+try {
+    $n << PHP_INT_MAX;
+} catch (ValueError $e) {
+    echo $e->getMessage() . PHP_EOL;
+}
+
+try {
+    $n ** PHP_INT_MAX;
+} catch (ValueError $e) {
+    echo $e->getMessage() . PHP_EOL;
+}
+
+echo "Done\n";
+?>
+--EXPECTF--
+gmp_pow(): Argument #2 ($exponent) must be between 0 and %d
+gmp_binomial(): Argument #2 ($k) must be between 0 and %d
+gmp_root(): Argument #2 ($nth) must be between 1 and %d
+gmp_rootrem(): Argument #2 ($nth) must be between 1 and %d
+Shift must be between 0 and %d
+Exponent must be between 0 and %d
+Done
diff --git a/ext/gmp/tests/gmp_php_int_max.phpt b/ext/gmp/tests/gmp_php_int_max.phpt
index a4974dac6057..d26d1b064897 100644
--- a/ext/gmp/tests/gmp_php_int_max.phpt
+++ b/ext/gmp/tests/gmp_php_int_max.phpt
@@ -4,7 +4,7 @@ PHP_INT_MAX tests
 gmp
 --SKIPIF--
 
 --FILE--
 
---EXPECT--
+--EXPECTF--
 string(4) "1024"
 string(4) "1024"
 string(5) "-2048"
 string(4) "1024"
 string(1) "1"
-gmp_pow(): Argument #2 ($exponent) must be greater than or equal to 0
+gmp_pow(): Argument #2 ($exponent) must be between 0 and %d
 string(4) "1024"
 string(14) "10240000000000"
 string(17) "97656250000000000"
-gmp_pow(): Argument #2 ($exponent) must be greater than or equal to 0
+gmp_pow(): Argument #2 ($exponent) must be between 0 and %d
 string(14) "10240000000000"
 string(14) "10240000000000"
 gmp_pow(): Argument #2 ($exponent) must be of type int, array given
diff --git a/ext/gmp/tests/gmp_pow2.phpt b/ext/gmp/tests/gmp_pow2.phpt
index 43bf9bb5aaa5..96f33e8c25ca 100644
--- a/ext/gmp/tests/gmp_pow2.phpt
+++ b/ext/gmp/tests/gmp_pow2.phpt
@@ -31,5 +31,5 @@ object(GMP)#%d (1) {
   ["num"]=>
   string(4) "1024"
 }
-Exponent must be greater than or equal to 0
-Exponent must be greater than or equal to 0
+Exponent must be between 0 and %d
+Exponent must be between 0 and %d
diff --git a/ext/gmp/tests/gmp_pown.phpt b/ext/gmp/tests/gmp_pown.phpt
index 0e7b3bd1fa5d..79709f272715 100644
--- a/ext/gmp/tests/gmp_pown.phpt
+++ b/ext/gmp/tests/gmp_pown.phpt
@@ -63,7 +63,7 @@ var_dump(gmp_powm(10, $n, 10));
 
 echo "Done\n";
 ?>
---EXPECT--
+--EXPECTF--
 string(1) "0"
 string(1) "5"
 string(1) "5"
@@ -73,8 +73,8 @@ string(3) "533"
 string(3) "331"
 string(3) "171"
 string(3) "371"
-Modulo by zero
-Modulo by zero
+gmp_powm(): Argument #3 ($modulus) Modulo by zero
+gmp_powm(): Argument #3 ($modulus) Modulo by zero
 gmp_powm(): Argument #1 ($num) must be of type GMP|string|int, array given
 gmp_powm(): Argument #2 ($exponent) must be of type GMP|string|int, array given
 gmp_powm(): Argument #2 ($exponent) must be of type GMP|string|int, TypeError given
diff --git a/ext/gmp/tests/gmp_remroot.phpt b/ext/gmp/tests/gmp_remroot.phpt
index 8e53858c6047..de54d0e91c3e 100644
--- a/ext/gmp/tests/gmp_remroot.phpt
+++ b/ext/gmp/tests/gmp_remroot.phpt
@@ -105,5 +105,5 @@ array(2) {
     string(1) "0"
   }
 }
-gmp_rootrem(): Argument #2 ($nth) must be greater than or equal to 1
-gmp_rootrem(): Argument #2 ($nth) must be greater than or equal to 1
+gmp_rootrem(): Argument #2 ($nth) must be between 1 and %d
+gmp_rootrem(): Argument #2 ($nth) must be between 1 and %d
diff --git a/ext/gmp/tests/gmp_root.phpt b/ext/gmp/tests/gmp_root.phpt
index 2313b207cc8d..36793e249721 100644
--- a/ext/gmp/tests/gmp_root.phpt
+++ b/ext/gmp/tests/gmp_root.phpt
@@ -58,5 +58,5 @@ object(GMP)#%d (1) {
   ["num"]=>
   string(1) "0"
 }
-gmp_root(): Argument #2 ($nth) must be greater than 0
-gmp_root(): Argument #2 ($nth) must be greater than 0
+gmp_root(): Argument #2 ($nth) must be between 1 and %d
+gmp_root(): Argument #2 ($nth) must be between 1 and %d
diff --git a/ext/gmp/tests/overloading.phpt b/ext/gmp/tests/overloading.phpt
index 14c35ea8470c..f55a83f0bd5f 100644
--- a/ext/gmp/tests/overloading.phpt
+++ b/ext/gmp/tests/overloading.phpt
@@ -123,7 +123,7 @@ $a .= '17';
 var_dump($a);
 
 ?>
---EXPECT--
+--EXPECTF--
 object(GMP)#3 (1) {
   ["num"]=>
   string(2) "59"
@@ -254,8 +254,8 @@ object(GMP)#5 (1) {
   ["num"]=>
   string(3) "-11"
 }
-Shift must be greater than or equal to 0
-Shift must be greater than or equal to 0
+Shift must be between 0 and %d
+Shift must be between 0 and %d
 object(GMP)#5 (1) {
   ["num"]=>
   string(3) "-43"
diff --git a/ext/gmp/tests/overloading_with_float_fractional.phpt b/ext/gmp/tests/overloading_with_float_fractional.phpt
index fc078eeec3e9..a86356a9dd54 100644
--- a/ext/gmp/tests/overloading_with_float_fractional.phpt
+++ b/ext/gmp/tests/overloading_with_float_fractional.phpt
@@ -100,6 +100,8 @@ object(GMP)#2 (1) {
   ["num"]=>
   string(1) "0"
 }
+
+Deprecated: Implicit conversion from float 42.5 to int loses precision in %s on line %d
 object(GMP)#2 (1) {
   ["num"]=>
   string(69) "150130937545296572356771972164254457814047970568738777235893533016064"
@@ -122,10 +124,14 @@ object(GMP)#2 (1) {
   ["num"]=>
   string(1) "0"
 }
+
+Deprecated: Implicit conversion from float 42.5 to int loses precision in %s on line %d
 object(GMP)#2 (1) {
   ["num"]=>
   string(15) "184717953466368"
 }
+
+Deprecated: Implicit conversion from float 42.5 to int loses precision in %s on line %d
 object(GMP)#2 (1) {
   ["num"]=>
   string(1) "0"
diff --git a/ext/hash/hash.c b/ext/hash/hash.c
index 8a9494fb62d0..3ba42c8ff85d 100644
--- a/ext/hash/hash.c
+++ b/ext/hash/hash.c
@@ -1,14 +1,12 @@
 /*
   +----------------------------------------------------------------------+
-  | Copyright (c) The PHP Group                                          |
+  | Copyright © The PHP Group and Contributors.                          |
   +----------------------------------------------------------------------+
-  | This source file is subject to version 3.01 of the PHP license,      |
-  | that is bundled with this package in the file LICENSE, and is        |
-  | available through the world-wide-web at the following url:           |
-  | https://www.php.net/license/3_01.txt                                 |
-  | If you did not receive a copy of the PHP license and are unable to   |
-  | obtain it through the world-wide-web, please send a note to          |
-  | license@php.net so we can mail you a copy immediately.               |
+  | This source file is subject to the Modified BSD License that is      |
+  | bundled with this package in the file LICENSE, and is available      |
+  | through the World Wide Web at .        |
+  |                                                                      |
+  | SPDX-License-Identifier: BSD-3-Clause                                |
   +----------------------------------------------------------------------+
   | Author: Sara Golemon                                |
   |         Scott MacVicar                             |
@@ -1114,12 +1112,12 @@ PHP_FUNCTION(hash_equals)
 
 	/* We only allow comparing string to prevent unexpected results. */
 	if (Z_TYPE_P(known_zval) != IS_STRING) {
-		zend_argument_type_error(1, "must be of type string, %s given", zend_zval_value_name(known_zval));
+		zend_wrong_parameter_type_error(1, Z_EXPECTED_STRING, known_zval);
 		RETURN_THROWS();
 	}
 
 	if (Z_TYPE_P(user_zval) != IS_STRING) {
-		zend_argument_type_error(2, "must be of type string, %s given", zend_zval_value_name(user_zval));
+		zend_wrong_parameter_type_error(2, Z_EXPECTED_STRING, user_zval);
 		RETURN_THROWS();
 	}
 
@@ -1399,7 +1397,7 @@ static void php_hashcontext_free(zend_object *obj) {
 
 /* {{{ php_hashcontext_clone */
 static zend_object *php_hashcontext_clone(zend_object *zobj) {
-	php_hashcontext_object *oldobj = php_hashcontext_from_object(zobj);
+	const php_hashcontext_object *oldobj = php_hashcontext_from_object(zobj);
 	zend_object *znew = php_hashcontext_create(zobj->ce);
 	php_hashcontext_object *newobj = php_hashcontext_from_object(znew);
 
@@ -1654,7 +1652,7 @@ PHP_MINIT_FUNCTION(hash)
 
 	memcpy(&php_hashcontext_handlers, &std_object_handlers,
 	       sizeof(zend_object_handlers));
-	php_hashcontext_handlers.offset = XtOffsetOf(php_hashcontext_object, std);
+	php_hashcontext_handlers.offset = offsetof(php_hashcontext_object, std);
 	php_hashcontext_handlers.free_obj = php_hashcontext_free;
 	php_hashcontext_handlers.clone_obj = php_hashcontext_clone;
 
diff --git a/ext/hash/hash_adler32.c b/ext/hash/hash_adler32.c
index 3898ea60e877..2a40b3318cd5 100644
--- a/ext/hash/hash_adler32.c
+++ b/ext/hash/hash_adler32.c
@@ -1,14 +1,12 @@
 /*
   +----------------------------------------------------------------------+
-  | Copyright (c) The PHP Group                                          |
+  | Copyright © The PHP Group and Contributors.                          |
   +----------------------------------------------------------------------+
-  | This source file is subject to version 3.01 of the PHP license,      |
-  | that is bundled with this package in the file LICENSE, and is        |
-  | available through the world-wide-web at the following url:           |
-  | https://www.php.net/license/3_01.txt                                 |
-  | If you did not receive a copy of the PHP license and are unable to   |
-  | obtain it through the world-wide-web, please send a note to          |
-  | license@php.net so we can mail you a copy immediately.               |
+  | This source file is subject to the Modified BSD License that is      |
+  | bundled with this package in the file LICENSE, and is available      |
+  | through the World Wide Web at .        |
+  |                                                                      |
+  | SPDX-License-Identifier: BSD-3-Clause                                |
   +----------------------------------------------------------------------+
   | Authors: Michael Wallner                               |
   |          Sara Golemon                               |
diff --git a/ext/hash/hash_crc32.c b/ext/hash/hash_crc32.c
index a770d0b55416..795cfcdf05b2 100644
--- a/ext/hash/hash_crc32.c
+++ b/ext/hash/hash_crc32.c
@@ -1,14 +1,12 @@
 /*
   +----------------------------------------------------------------------+
-  | Copyright (c) The PHP Group                                          |
+  | Copyright © The PHP Group and Contributors.                          |
   +----------------------------------------------------------------------+
-  | This source file is subject to version 3.01 of the PHP license,      |
-  | that is bundled with this package in the file LICENSE, and is        |
-  | available through the world-wide-web at the following url:           |
-  | https://www.php.net/license/3_01.txt                                 |
-  | If you did not receive a copy of the PHP license and are unable to   |
-  | obtain it through the world-wide-web, please send a note to          |
-  | license@php.net so we can mail you a copy immediately.               |
+  | This source file is subject to the Modified BSD License that is      |
+  | bundled with this package in the file LICENSE, and is available      |
+  | through the World Wide Web at .        |
+  |                                                                      |
+  | SPDX-License-Identifier: BSD-3-Clause                                |
   +----------------------------------------------------------------------+
   | Authors: Michael Wallner                               |
   |          Sara Golemon                               |
diff --git a/ext/hash/hash_fnv.c b/ext/hash/hash_fnv.c
index 92d4922bd810..58101c4f2e6c 100644
--- a/ext/hash/hash_fnv.c
+++ b/ext/hash/hash_fnv.c
@@ -1,14 +1,12 @@
 /*
   +----------------------------------------------------------------------+
-  | Copyright (c) The PHP Group                                          |
+  | Copyright © The PHP Group and Contributors.                          |
   +----------------------------------------------------------------------+
-  | This source file is subject to version 3.01 of the PHP license,      |
-  | that is bundled with this package in the file LICENSE, and is        |
-  | available through the world-wide-web at the following url:           |
-  | https://www.php.net/license/3_01.txt                                 |
-  | If you did not receive a copy of the PHP license and are unable to   |
-  | obtain it through the world-wide-web, please send a note to          |
-  | license@php.net so we can mail you a copy immediately.               |
+  | This source file is subject to the Modified BSD License that is      |
+  | bundled with this package in the file LICENSE, and is available      |
+  | through the World Wide Web at .        |
+  |                                                                      |
+  | SPDX-License-Identifier: BSD-3-Clause                                |
   +----------------------------------------------------------------------+
   | Author: Michael Maclean                                |
   +----------------------------------------------------------------------+
diff --git a/ext/hash/hash_gost.c b/ext/hash/hash_gost.c
index bba585a11f9f..ad87754970b9 100644
--- a/ext/hash/hash_gost.c
+++ b/ext/hash/hash_gost.c
@@ -1,14 +1,12 @@
 /*
   +----------------------------------------------------------------------+
-  | Copyright (c) The PHP Group                                          |
+  | Copyright © The PHP Group and Contributors.                          |
   +----------------------------------------------------------------------+
-  | This source file is subject to version 3.01 of the PHP license,      |
-  | that is bundled with this package in the file LICENSE, and is        |
-  | available through the world-wide-web at the following url:           |
-  | https://www.php.net/license/3_01.txt                                 |
-  | If you did not receive a copy of the PHP license and are unable to   |
-  | obtain it through the world-wide-web, please send a note to          |
-  | license@php.net so we can mail you a copy immediately.               |
+  | This source file is subject to the Modified BSD License that is      |
+  | bundled with this package in the file LICENSE, and is available      |
+  | through the World Wide Web at .        |
+  |                                                                      |
+  | SPDX-License-Identifier: BSD-3-Clause                                |
   +----------------------------------------------------------------------+
   | Authors: Michael Wallner                               |
   |          Sara Golemon                               |
diff --git a/ext/hash/hash_haval.c b/ext/hash/hash_haval.c
index 67bc2b2e4780..2adafdb189e2 100644
--- a/ext/hash/hash_haval.c
+++ b/ext/hash/hash_haval.c
@@ -1,14 +1,12 @@
 /*
   +----------------------------------------------------------------------+
-  | Copyright (c) The PHP Group                                          |
+  | Copyright © The PHP Group and Contributors.                          |
   +----------------------------------------------------------------------+
-  | This source file is subject to version 3.01 of the PHP license,      |
-  | that is bundled with this package in the file LICENSE, and is        |
-  | available through the world-wide-web at the following url:           |
-  | https://www.php.net/license/3_01.txt                                 |
-  | If you did not receive a copy of the PHP license and are unable to   |
-  | obtain it through the world-wide-web, please send a note to          |
-  | license@php.net so we can mail you a copy immediately.               |
+  | This source file is subject to the Modified BSD License that is      |
+  | bundled with this package in the file LICENSE, and is available      |
+  | through the World Wide Web at .        |
+  |                                                                      |
+  | SPDX-License-Identifier: BSD-3-Clause                                |
   +----------------------------------------------------------------------+
   | Author: Sara Golemon                                |
   +----------------------------------------------------------------------+
diff --git a/ext/hash/hash_joaat.c b/ext/hash/hash_joaat.c
index 328f9292c4ca..0d7b64092f47 100644
--- a/ext/hash/hash_joaat.c
+++ b/ext/hash/hash_joaat.c
@@ -1,14 +1,12 @@
 /*
   +----------------------------------------------------------------------+
-  | Copyright (c) The PHP Group                                          |
+  | Copyright © The PHP Group and Contributors.                          |
   +----------------------------------------------------------------------+
-  | This source file is subject to version 3.01 of the PHP license,      |
-  | that is bundled with this package in the file LICENSE, and is        |
-  | available through the world-wide-web at the following url:           |
-  | https://www.php.net/license/3_01.txt                                 |
-  | If you did not receive a copy of the PHP license and are unable to   |
-  | obtain it through the world-wide-web, please send a note to          |
-  | license@php.net so we can mail you a copy immediately.               |
+  | This source file is subject to the Modified BSD License that is      |
+  | bundled with this package in the file LICENSE, and is available      |
+  | through the World Wide Web at .        |
+  |                                                                      |
+  | SPDX-License-Identifier: BSD-3-Clause                                |
   +----------------------------------------------------------------------+
   | Author: Martin Jansen                                    |
   +----------------------------------------------------------------------+
diff --git a/ext/hash/hash_md.c b/ext/hash/hash_md.c
index dd299e695891..0bd48a9c823c 100644
--- a/ext/hash/hash_md.c
+++ b/ext/hash/hash_md.c
@@ -1,14 +1,12 @@
 /*
   +----------------------------------------------------------------------+
-  | Copyright (c) The PHP Group                                          |
+  | Copyright © The PHP Group and Contributors.                          |
   +----------------------------------------------------------------------+
-  | This source file is subject to version 3.01 of the PHP license,      |
-  | that is bundled with this package in the file LICENSE, and is        |
-  | available through the world-wide-web at the following url:           |
-  | https://www.php.net/license/3_01.txt                                 |
-  | If you did not receive a copy of the PHP license and are unable to   |
-  | obtain it through the world-wide-web, please send a note to          |
-  | license@php.net so we can mail you a copy immediately.               |
+  | This source file is subject to the Modified BSD License that is      |
+  | bundled with this package in the file LICENSE, and is available      |
+  | through the World Wide Web at .        |
+  |                                                                      |
+  | SPDX-License-Identifier: BSD-3-Clause                                |
   +----------------------------------------------------------------------+
   | Taken from: ext/standard/md5.c                                       |
   +----------------------------------------------------------------------+
diff --git a/ext/hash/hash_murmur.c b/ext/hash/hash_murmur.c
index 0117b2e57d36..cd5d5f4be520 100644
--- a/ext/hash/hash_murmur.c
+++ b/ext/hash/hash_murmur.c
@@ -1,14 +1,12 @@
 /*
    +----------------------------------------------------------------------+
-   | Copyright (c) The PHP Group                                          |
+   | Copyright © The PHP Group and Contributors.                          |
    +----------------------------------------------------------------------+
-   | This source file is subject to version 3.01 of the PHP license,      |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | https://www.php.net/license/3_01.txt                                 |
-   | If you did not receive a copy of the PHP license and are unable to   |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@php.net so we can mail you a copy immediately.               |
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Author: Anatol Belski                                    |
    +----------------------------------------------------------------------+
diff --git a/ext/hash/hash_ripemd.c b/ext/hash/hash_ripemd.c
index 4802fdf9a1fc..1b76f58ff098 100644
--- a/ext/hash/hash_ripemd.c
+++ b/ext/hash/hash_ripemd.c
@@ -1,14 +1,12 @@
 /*
   +----------------------------------------------------------------------+
-  | Copyright (c) The PHP Group                                          |
+  | Copyright © The PHP Group and Contributors.                          |
   +----------------------------------------------------------------------+
-  | This source file is subject to version 3.01 of the PHP license,      |
-  | that is bundled with this package in the file LICENSE, and is        |
-  | available through the world-wide-web at the following url:           |
-  | https://www.php.net/license/3_01.txt                                 |
-  | If you did not receive a copy of the PHP license and are unable to   |
-  | obtain it through the world-wide-web, please send a note to          |
-  | license@php.net so we can mail you a copy immediately.               |
+  | This source file is subject to the Modified BSD License that is      |
+  | bundled with this package in the file LICENSE, and is available      |
+  | through the World Wide Web at .        |
+  |                                                                      |
+  | SPDX-License-Identifier: BSD-3-Clause                                |
   +----------------------------------------------------------------------+
   | Author: Sara Golemon                                |
   +----------------------------------------------------------------------+
diff --git a/ext/hash/hash_sha.c b/ext/hash/hash_sha.c
index 3129446fcde4..fd4d8ce5a36a 100644
--- a/ext/hash/hash_sha.c
+++ b/ext/hash/hash_sha.c
@@ -1,14 +1,12 @@
 /*
   +----------------------------------------------------------------------+
-  | Copyright (c) The PHP Group                                          |
+  | Copyright © The PHP Group and Contributors.                          |
   +----------------------------------------------------------------------+
-  | This source file is subject to version 3.01 of the PHP license,      |
-  | that is bundled with this package in the file LICENSE, and is        |
-  | available through the world-wide-web at the following url:           |
-  | https://www.php.net/license/3_01.txt                                 |
-  | If you did not receive a copy of the PHP license and are unable to   |
-  | obtain it through the world-wide-web, please send a note to          |
-  | license@php.net so we can mail you a copy immediately.               |
+  | This source file is subject to the Modified BSD License that is      |
+  | bundled with this package in the file LICENSE, and is available      |
+  | through the World Wide Web at .        |
+  |                                                                      |
+  | SPDX-License-Identifier: BSD-3-Clause                                |
   +----------------------------------------------------------------------+
   | Authors: Steffan Esser                               |
   |          Sara Golemon                               |
diff --git a/ext/hash/hash_sha3.c b/ext/hash/hash_sha3.c
index 8fa0a4b4e522..d82840e81de6 100644
--- a/ext/hash/hash_sha3.c
+++ b/ext/hash/hash_sha3.c
@@ -1,14 +1,12 @@
 /*
    +----------------------------------------------------------------------+
-   | Copyright (c) The PHP Group                                          |
+   | Copyright © The PHP Group and Contributors.                          |
    +----------------------------------------------------------------------+
-   | This source file is subject to version 3.01 of the PHP license,      |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | https://www.php.net/license/3_01.txt                                 |
-   | If you did not receive a copy of the PHP license and are unable to   |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@php.net so we can mail you a copy immediately.               |
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Author: Sara Golemon                                |
    +----------------------------------------------------------------------+
diff --git a/ext/hash/hash_snefru.c b/ext/hash/hash_snefru.c
index b9b70f364208..5f08eb088229 100644
--- a/ext/hash/hash_snefru.c
+++ b/ext/hash/hash_snefru.c
@@ -1,14 +1,12 @@
 /*
   +----------------------------------------------------------------------+
-  | Copyright (c) The PHP Group                                          |
+  | Copyright © The PHP Group and Contributors.                          |
   +----------------------------------------------------------------------+
-  | This source file is subject to version 3.01 of the PHP license,      |
-  | that is bundled with this package in the file LICENSE, and is        |
-  | available through the world-wide-web at the following url:           |
-  | https://www.php.net/license/3_01.txt                                 |
-  | If you did not receive a copy of the PHP license and are unable to   |
-  | obtain it through the world-wide-web, please send a note to          |
-  | license@php.net so we can mail you a copy immediately.               |
+  | This source file is subject to the Modified BSD License that is      |
+  | bundled with this package in the file LICENSE, and is available      |
+  | through the World Wide Web at .        |
+  |                                                                      |
+  | SPDX-License-Identifier: BSD-3-Clause                                |
   +----------------------------------------------------------------------+
   | Authors: Michael Wallner                               |
   |          Sara Golemon                               |
diff --git a/ext/hash/hash_tiger.c b/ext/hash/hash_tiger.c
index 62d1b7347143..1153711d85d4 100644
--- a/ext/hash/hash_tiger.c
+++ b/ext/hash/hash_tiger.c
@@ -1,14 +1,12 @@
 /*
   +----------------------------------------------------------------------+
-  | Copyright (c) The PHP Group                                          |
+  | Copyright © The PHP Group and Contributors.                          |
   +----------------------------------------------------------------------+
-  | This source file is subject to version 3.01 of the PHP license,      |
-  | that is bundled with this package in the file LICENSE, and is        |
-  | available through the world-wide-web at the following url:           |
-  | https://www.php.net/license/3_01.txt                                 |
-  | If you did not receive a copy of the PHP license and are unable to   |
-  | obtain it through the world-wide-web, please send a note to          |
-  | license@php.net so we can mail you a copy immediately.               |
+  | This source file is subject to the Modified BSD License that is      |
+  | bundled with this package in the file LICENSE, and is available      |
+  | through the World Wide Web at .        |
+  |                                                                      |
+  | SPDX-License-Identifier: BSD-3-Clause                                |
   +----------------------------------------------------------------------+
   | Authors: Michael Wallner                               |
   |          Sara Golemon                               |
diff --git a/ext/hash/hash_whirlpool.c b/ext/hash/hash_whirlpool.c
index fa3c216a64c4..2a5b220d3a18 100644
--- a/ext/hash/hash_whirlpool.c
+++ b/ext/hash/hash_whirlpool.c
@@ -1,14 +1,12 @@
 /*
   +----------------------------------------------------------------------+
-  | Copyright (c) The PHP Group                                          |
+  | Copyright © The PHP Group and Contributors.                          |
   +----------------------------------------------------------------------+
-  | This source file is subject to version 3.01 of the PHP license,      |
-  | that is bundled with this package in the file LICENSE, and is        |
-  | available through the world-wide-web at the following url:           |
-  | https://www.php.net/license/3_01.txt                                 |
-  | If you did not receive a copy of the PHP license and are unable to   |
-  | obtain it through the world-wide-web, please send a note to          |
-  | license@php.net so we can mail you a copy immediately.               |
+  | This source file is subject to the Modified BSD License that is      |
+  | bundled with this package in the file LICENSE, and is available      |
+  | through the World Wide Web at .        |
+  |                                                                      |
+  | SPDX-License-Identifier: BSD-3-Clause                                |
   +----------------------------------------------------------------------+
   | Authors: Michael Wallner                               |
   |          Sara Golemon                               |
diff --git a/ext/hash/hash_xxhash.c b/ext/hash/hash_xxhash.c
index add922e8e84f..b6177905e691 100644
--- a/ext/hash/hash_xxhash.c
+++ b/ext/hash/hash_xxhash.c
@@ -1,14 +1,12 @@
 /*
    +----------------------------------------------------------------------+
-   | Copyright (c) The PHP Group                                          |
+   | Copyright © The PHP Group and Contributors.                          |
    +----------------------------------------------------------------------+
-   | This source file is subject to version 3.01 of the PHP license,      |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | https://www.php.net/license/3_01.txt                                 |
-   | If you did not receive a copy of the PHP license and are unable to   |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@php.net so we can mail you a copy immediately.               |
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Author: Anatol Belski                                    |
    +----------------------------------------------------------------------+
diff --git a/ext/hash/php_hash.h b/ext/hash/php_hash.h
index f56605a33be6..9eac5da78c8d 100644
--- a/ext/hash/php_hash.h
+++ b/ext/hash/php_hash.h
@@ -1,14 +1,12 @@
 /*
   +----------------------------------------------------------------------+
-  | Copyright (c) The PHP Group                                          |
+  | Copyright © The PHP Group and Contributors.                          |
   +----------------------------------------------------------------------+
-  | This source file is subject to version 3.01 of the PHP license,      |
-  | that is bundled with this package in the file LICENSE, and is        |
-  | available through the world-wide-web at the following url:           |
-  | https://www.php.net/license/3_01.txt                                 |
-  | If you did not receive a copy of the PHP license and are unable to   |
-  | obtain it through the world-wide-web, please send a note to          |
-  | license@php.net so we can mail you a copy immediately.               |
+  | This source file is subject to the Modified BSD License that is      |
+  | bundled with this package in the file LICENSE, and is available      |
+  | through the World Wide Web at .        |
+  |                                                                      |
+  | SPDX-License-Identifier: BSD-3-Clause                                |
   +----------------------------------------------------------------------+
   | Author: Sara Golemon                                |
   +----------------------------------------------------------------------+
diff --git a/ext/hash/php_hash_adler32.h b/ext/hash/php_hash_adler32.h
index bacb47ff1c91..c076893cb76f 100644
--- a/ext/hash/php_hash_adler32.h
+++ b/ext/hash/php_hash_adler32.h
@@ -1,14 +1,12 @@
 /*
    +----------------------------------------------------------------------+
-   | Copyright (c) The PHP Group                                          |
+   | Copyright © The PHP Group and Contributors.                          |
    +----------------------------------------------------------------------+
-   | This source file is subject to version 3.01 of the PHP license,      |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | https://www.php.net/license/3_01.txt                                 |
-   | If you did not receive a copy of the PHP license and are unable to   |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@php.net so we can mail you a copy immediately.               |
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Author: Michael Wallner                                |
    +----------------------------------------------------------------------+
diff --git a/ext/hash/php_hash_crc32.h b/ext/hash/php_hash_crc32.h
index b6accea17bb6..f50bff1c69ea 100644
--- a/ext/hash/php_hash_crc32.h
+++ b/ext/hash/php_hash_crc32.h
@@ -1,14 +1,12 @@
 /*
    +----------------------------------------------------------------------+
-   | Copyright (c) The PHP Group                                          |
+   | Copyright © The PHP Group and Contributors.                          |
    +----------------------------------------------------------------------+
-   | This source file is subject to version 3.01 of the PHP license,      |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | https://www.php.net/license/3_01.txt                                 |
-   | If you did not receive a copy of the PHP license and are unable to   |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@php.net so we can mail you a copy immediately.               |
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Author: Michael Wallner                                |
    +----------------------------------------------------------------------+
diff --git a/ext/hash/php_hash_crc32_tables.h b/ext/hash/php_hash_crc32_tables.h
index d126f177bdbe..28b70e4226b3 100644
--- a/ext/hash/php_hash_crc32_tables.h
+++ b/ext/hash/php_hash_crc32_tables.h
@@ -1,14 +1,12 @@
 /*
    +----------------------------------------------------------------------+
-   | Copyright (c) The PHP Group                                          |
+   | Copyright © The PHP Group and Contributors.                          |
    +----------------------------------------------------------------------+
-   | This source file is subject to version 3.01 of the PHP license,      |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | https://www.php.net/license/3_01.txt                                 |
-   | If you did not receive a copy of the PHP license and are unable to   |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@php.net so we can mail you a copy immediately.               |
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Author: Michael Wallner                                |
    +----------------------------------------------------------------------+
diff --git a/ext/hash/php_hash_fnv.h b/ext/hash/php_hash_fnv.h
index e9d1ce8d0b44..5e82bc4dab66 100644
--- a/ext/hash/php_hash_fnv.h
+++ b/ext/hash/php_hash_fnv.h
@@ -1,14 +1,12 @@
 /*
   +----------------------------------------------------------------------+
-  | Copyright (c) The PHP Group                                          |
+  | Copyright © The PHP Group and Contributors.                          |
   +----------------------------------------------------------------------+
-  | This source file is subject to version 3.01 of the PHP license,      |
-  | that is bundled with this package in the file LICENSE, and is        |
-  | available through the world-wide-web at the following url:           |
-  | https://www.php.net/license/3_01.txt                                 |
-  | If you did not receive a copy of the PHP license and are unable to   |
-  | obtain it through the world-wide-web, please send a note to          |
-  | license@php.net so we can mail you a copy immediately.               |
+  | This source file is subject to the Modified BSD License that is      |
+  | bundled with this package in the file LICENSE, and is available      |
+  | through the World Wide Web at .        |
+  |                                                                      |
+  | SPDX-License-Identifier: BSD-3-Clause                                |
   +----------------------------------------------------------------------+
   | Author: Michael Maclean                                |
   +----------------------------------------------------------------------+
diff --git a/ext/hash/php_hash_gost.h b/ext/hash/php_hash_gost.h
index 66992b09b976..f1116c3852d6 100644
--- a/ext/hash/php_hash_gost.h
+++ b/ext/hash/php_hash_gost.h
@@ -1,14 +1,12 @@
 /*
    +----------------------------------------------------------------------+
-   | Copyright (c) The PHP Group                                          |
+   | Copyright © The PHP Group and Contributors.                          |
    +----------------------------------------------------------------------+
-   | This source file is subject to version 3.01 of the PHP license,      |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | https://www.php.net/license/3_01.txt                                 |
-   | If you did not receive a copy of the PHP license and are unable to   |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@php.net so we can mail you a copy immediately.               |
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Author: Michael Wallner                                |
    +----------------------------------------------------------------------+
diff --git a/ext/hash/php_hash_haval.h b/ext/hash/php_hash_haval.h
index e3a3a31b3685..c857d84b0abd 100644
--- a/ext/hash/php_hash_haval.h
+++ b/ext/hash/php_hash_haval.h
@@ -1,14 +1,12 @@
 /*
    +----------------------------------------------------------------------+
-   | Copyright (c) The PHP Group                                          |
+   | Copyright © The PHP Group and Contributors.                          |
    +----------------------------------------------------------------------+
-   | This source file is subject to version 3.01 of the PHP license,      |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | https://www.php.net/license/3_01.txt                                 |
-   | If you did not receive a copy of the PHP license and are unable to   |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@php.net so we can mail you a copy immediately.               |
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Author: Sara Golemon                                |
    +----------------------------------------------------------------------+
diff --git a/ext/hash/php_hash_joaat.h b/ext/hash/php_hash_joaat.h
index fcc4cc3911bb..26e5adc03532 100644
--- a/ext/hash/php_hash_joaat.h
+++ b/ext/hash/php_hash_joaat.h
@@ -1,14 +1,12 @@
 /*
   +----------------------------------------------------------------------+
-  | Copyright (c) The PHP Group                                          |
+  | Copyright © The PHP Group and Contributors.                          |
   +----------------------------------------------------------------------+
-  | This source file is subject to version 3.01 of the PHP license,      |
-  | that is bundled with this package in the file LICENSE, and is        |
-  | available through the world-wide-web at the following url:           |
-  | https://www.php.net/license/3_01.txt                                 |
-  | If you did not receive a copy of the PHP license and are unable to   |
-  | obtain it through the world-wide-web, please send a note to          |
-  | license@php.net so we can mail you a copy immediately.               |
+  | This source file is subject to the Modified BSD License that is      |
+  | bundled with this package in the file LICENSE, and is available      |
+  | through the World Wide Web at .        |
+  |                                                                      |
+  | SPDX-License-Identifier: BSD-3-Clause                                |
   +----------------------------------------------------------------------+
   | Author: Martin Jansen                                    |
   +----------------------------------------------------------------------+
diff --git a/ext/hash/php_hash_md.h b/ext/hash/php_hash_md.h
index f648fbf7c3c2..f9abbd5583b5 100644
--- a/ext/hash/php_hash_md.h
+++ b/ext/hash/php_hash_md.h
@@ -1,14 +1,12 @@
 /*
    +----------------------------------------------------------------------+
-   | Copyright (c) The PHP Group                                          |
+   | Copyright © The PHP Group and Contributors.                          |
    +----------------------------------------------------------------------+
-   | This source file is subject to version 3.01 of the PHP license,      |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | https://www.php.net/license/3_01.txt                                 |
-   | If you did not receive a copy of the PHP license and are unable to   |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@php.net so we can mail you a copy immediately.               |
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Original Author: Rasmus Lerdorf                |
    | Modified for pHASH by: Sara Golemon 
diff --git a/ext/hash/php_hash_murmur.h b/ext/hash/php_hash_murmur.h
index 6180a9b8f341..1539011156b3 100644
--- a/ext/hash/php_hash_murmur.h
+++ b/ext/hash/php_hash_murmur.h
@@ -1,14 +1,12 @@
 /*
    +----------------------------------------------------------------------+
-   | Copyright (c) The PHP Group                                          |
+   | Copyright © The PHP Group and Contributors.                          |
    +----------------------------------------------------------------------+
-   | This source file is subject to version 3.01 of the PHP license,      |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | https://www.php.net/license/3_01.txt                                 |
-   | If you did not receive a copy of the PHP license and are unable to   |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@php.net so we can mail you a copy immediately.               |
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Author: Anatol Belski                                    |
    +----------------------------------------------------------------------+
diff --git a/ext/hash/php_hash_ripemd.h b/ext/hash/php_hash_ripemd.h
index 0065450d21bb..1d30330d9e7f 100644
--- a/ext/hash/php_hash_ripemd.h
+++ b/ext/hash/php_hash_ripemd.h
@@ -1,14 +1,12 @@
 /*
    +----------------------------------------------------------------------+
-   | Copyright (c) The PHP Group                                          |
+   | Copyright © The PHP Group and Contributors.                          |
    +----------------------------------------------------------------------+
-   | This source file is subject to version 3.01 of the PHP license,      |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | https://www.php.net/license/3_01.txt                                 |
-   | If you did not receive a copy of the PHP license and are unable to   |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@php.net so we can mail you a copy immediately.               |
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Author: Sara Golemon                                |
    +----------------------------------------------------------------------+
diff --git a/ext/hash/php_hash_sha.h b/ext/hash/php_hash_sha.h
index 50eef82e858a..e2c6eac30b4c 100644
--- a/ext/hash/php_hash_sha.h
+++ b/ext/hash/php_hash_sha.h
@@ -1,14 +1,12 @@
 /*
    +----------------------------------------------------------------------+
-   | Copyright (c) The PHP Group                                          |
+   | Copyright © The PHP Group and Contributors.                          |
    +----------------------------------------------------------------------+
-   | This source file is subject to version 3.01 of the PHP license,      |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | https://www.php.net/license/3_01.txt                                 |
-   | If you did not receive a copy of the PHP license and are unable to   |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@php.net so we can mail you a copy immediately.               |
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | SHA1 Author: Stefan Esser                            |
    | SHA256 Author: Sara Golemon                         |
diff --git a/ext/hash/php_hash_sha3.h b/ext/hash/php_hash_sha3.h
index 8381a8943b4d..2692fd5de766 100644
--- a/ext/hash/php_hash_sha3.h
+++ b/ext/hash/php_hash_sha3.h
@@ -1,14 +1,12 @@
 /*
    +----------------------------------------------------------------------+
-   | Copyright (c) The PHP Group                                          |
+   | Copyright © The PHP Group and Contributors.                          |
    +----------------------------------------------------------------------+
-   | This source file is subject to version 3.01 of the PHP license,      |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | https://www.php.net/license/3_01.txt                                 |
-   | If you did not receive a copy of the PHP license and are unable to   |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@php.net so we can mail you a copy immediately.               |
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Author: Sara Golemon                                |
    +----------------------------------------------------------------------+
diff --git a/ext/hash/php_hash_snefru.h b/ext/hash/php_hash_snefru.h
index df90e8e46968..2fbeb7c42ebe 100644
--- a/ext/hash/php_hash_snefru.h
+++ b/ext/hash/php_hash_snefru.h
@@ -1,14 +1,12 @@
 /*
    +----------------------------------------------------------------------+
-   | Copyright (c) The PHP Group                                          |
+   | Copyright © The PHP Group and Contributors.                          |
    +----------------------------------------------------------------------+
-   | This source file is subject to version 3.01 of the PHP license,      |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | https://www.php.net/license/3_01.txt                                 |
-   | If you did not receive a copy of the PHP license and are unable to   |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@php.net so we can mail you a copy immediately.               |
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Author: Michael Wallner                                |
    +----------------------------------------------------------------------+
diff --git a/ext/hash/php_hash_snefru_tables.h b/ext/hash/php_hash_snefru_tables.h
index 0fc186b14cbe..075b2fe3e620 100644
--- a/ext/hash/php_hash_snefru_tables.h
+++ b/ext/hash/php_hash_snefru_tables.h
@@ -1,14 +1,12 @@
 /*
    +----------------------------------------------------------------------+
-   | Copyright (c) The PHP Group                                          |
+   | Copyright © The PHP Group and Contributors.                          |
    +----------------------------------------------------------------------+
-   | This source file is subject to version 3.01 of the PHP license,      |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | https://www.php.net/license/3_01.txt                                 |
-   | If you did not receive a copy of the PHP license and are unable to   |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@php.net so we can mail you a copy immediately.               |
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Author: Michael Wallner                                |
    +----------------------------------------------------------------------+
diff --git a/ext/hash/php_hash_tiger.h b/ext/hash/php_hash_tiger.h
index 92515c4dbf75..aa0f6cafbe8d 100644
--- a/ext/hash/php_hash_tiger.h
+++ b/ext/hash/php_hash_tiger.h
@@ -1,14 +1,12 @@
 /*
    +----------------------------------------------------------------------+
-   | Copyright (c) The PHP Group                                          |
+   | Copyright © The PHP Group and Contributors.                          |
    +----------------------------------------------------------------------+
-   | This source file is subject to version 3.01 of the PHP license,      |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | https://www.php.net/license/3_01.txt                                 |
-   | If you did not receive a copy of the PHP license and are unable to   |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@php.net so we can mail you a copy immediately.               |
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Author: Michael Wallner                                |
    +----------------------------------------------------------------------+
diff --git a/ext/hash/php_hash_tiger_tables.h b/ext/hash/php_hash_tiger_tables.h
index 594bf836fd04..f2d1bb69f1ec 100644
--- a/ext/hash/php_hash_tiger_tables.h
+++ b/ext/hash/php_hash_tiger_tables.h
@@ -1,14 +1,12 @@
 /*
   +----------------------------------------------------------------------+
-  | Copyright (c) The PHP Group                                          |
+  | Copyright © The PHP Group and Contributors.                          |
   +----------------------------------------------------------------------+
-  | This source file is subject to version 3.01 of the PHP license,      |
-  | that is bundled with this package in the file LICENSE, and is        |
-  | available through the world-wide-web at the following url:           |
-  | https://www.php.net/license/3_01.txt                                 |
-  | If you did not receive a copy of the PHP license and are unable to   |
-  | obtain it through the world-wide-web, please send a note to          |
-  | license@php.net so we can mail you a copy immediately.               |
+  | This source file is subject to the Modified BSD License that is      |
+  | bundled with this package in the file LICENSE, and is available      |
+  | through the World Wide Web at .        |
+  |                                                                      |
+  | SPDX-License-Identifier: BSD-3-Clause                                |
   +----------------------------------------------------------------------+
   | Authors: Michael Wallner                               |
   |          Sara Golemon                               |
diff --git a/ext/hash/php_hash_whirlpool.h b/ext/hash/php_hash_whirlpool.h
index f28ab234861b..b12e6c50a9f6 100644
--- a/ext/hash/php_hash_whirlpool.h
+++ b/ext/hash/php_hash_whirlpool.h
@@ -1,14 +1,12 @@
 /*
    +----------------------------------------------------------------------+
-   | Copyright (c) The PHP Group                                          |
+   | Copyright © The PHP Group and Contributors.                          |
    +----------------------------------------------------------------------+
-   | This source file is subject to version 3.01 of the PHP license,      |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | https://www.php.net/license/3_01.txt                                 |
-   | If you did not receive a copy of the PHP license and are unable to   |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@php.net so we can mail you a copy immediately.               |
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Author: Michael Wallner                                |
    +----------------------------------------------------------------------+
diff --git a/ext/hash/php_hash_whirlpool_tables.h b/ext/hash/php_hash_whirlpool_tables.h
index ef121efe9449..cd58d6c53a3e 100644
--- a/ext/hash/php_hash_whirlpool_tables.h
+++ b/ext/hash/php_hash_whirlpool_tables.h
@@ -1,14 +1,12 @@
 /*
    +----------------------------------------------------------------------+
-   | Copyright (c) The PHP Group                                          |
+   | Copyright © The PHP Group and Contributors.                          |
    +----------------------------------------------------------------------+
-   | This source file is subject to version 3.01 of the PHP license,      |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | https://www.php.net/license/3_01.txt                                 |
-   | If you did not receive a copy of the PHP license and are unable to   |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@php.net so we can mail you a copy immediately.               |
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Author: Michael Wallner                                |
    +----------------------------------------------------------------------+
diff --git a/ext/hash/php_hash_xxhash.h b/ext/hash/php_hash_xxhash.h
index f099039f3711..e2003ba4c584 100644
--- a/ext/hash/php_hash_xxhash.h
+++ b/ext/hash/php_hash_xxhash.h
@@ -1,14 +1,12 @@
 /*
    +----------------------------------------------------------------------+
-   | Copyright (c) The PHP Group                                          |
+   | Copyright © The PHP Group and Contributors.                          |
    +----------------------------------------------------------------------+
-   | This source file is subject to version 3.01 of the PHP license,      |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | https://www.php.net/license/3_01.txt                                 |
-   | If you did not receive a copy of the PHP license and are unable to   |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@php.net so we can mail you a copy immediately.               |
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Author: Anatol Belski                                    |
    +----------------------------------------------------------------------+
diff --git a/ext/iconv/iconv.c b/ext/iconv/iconv.c
index 7c812f5af44b..d9b54388a8f8 100644
--- a/ext/iconv/iconv.c
+++ b/ext/iconv/iconv.c
@@ -1,14 +1,12 @@
 /*
    +----------------------------------------------------------------------+
-   | Copyright (c) The PHP Group                                          |
+   | Copyright © The PHP Group and Contributors.                          |
    +----------------------------------------------------------------------+
-   | This source file is subject to version 3.01 of the PHP license,      |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | https://www.php.net/license/3_01.txt                                 |
-   | If you did not receive a copy of the PHP license and are unable to   |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@php.net so we can mail you a copy immediately.               |
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Authors: Rui Hirokawa                        |
    |          Stig Bakken                                    |
@@ -460,59 +458,65 @@ PHP_ICONV_API php_iconv_err_t php_iconv_string(const char *in_p, size_t in_len,
 	out_left = in_len + 32; /* Avoid realloc() most cases */
 	out_size = 0;
 	bsz = out_left;
-	out_buf = zend_string_alloc(bsz, 0);
-	out_p = ZSTR_VAL(out_buf);
-
-	while (in_left > 0) {
-		result = iconv(cd, (ICONV_CONST char **) &in_p, &in_left, (char **) &out_p, &out_left);
-		out_size = bsz - out_left;
-		if (result == (size_t)(-1)) {
-			if (ignore_ilseq && errno == EILSEQ) {
-				if (in_left <= 1) {
-					result = 0;
-				} else {
-					errno = 0;
-					in_p++;
-					in_left--;
-					continue;
+
+	zend_try {
+		out_buf = zend_string_alloc(bsz, 0);
+		out_p = ZSTR_VAL(out_buf);
+
+		while (in_left > 0) {
+			result = iconv(cd, (ICONV_CONST char **) &in_p, &in_left, (char **) &out_p, &out_left);
+			out_size = bsz - out_left;
+			if (result == (size_t)(-1)) {
+				if (ignore_ilseq && errno == EILSEQ) {
+					if (in_left <= 1) {
+						result = 0;
+					} else {
+						errno = 0;
+						in_p++;
+						in_left--;
+						continue;
+					}
 				}
-			}
 
-			if (errno == E2BIG && in_left > 0) {
-				/* converted string is longer than out buffer */
-				bsz += in_len;
+				if (errno == E2BIG && in_left > 0) {
+					/* converted string is longer than out buffer */
+					bsz += in_len;
 
-				out_buf = zend_string_extend(out_buf, bsz, 0);
-				out_p = ZSTR_VAL(out_buf);
-				out_p += out_size;
-				out_left = bsz - out_size;
-				continue;
+					out_buf = zend_string_extend(out_buf, bsz, 0);
+					out_p = ZSTR_VAL(out_buf);
+					out_p += out_size;
+					out_left = bsz - out_size;
+					continue;
+				}
 			}
+			break;
 		}
-		break;
-	}
 
-	if (result != (size_t)(-1)) {
-		/* flush the shift-out sequences */
-		for (;;) {
-		   	result = iconv(cd, NULL, NULL, (char **) &out_p, &out_left);
-			out_size = bsz - out_left;
+		if (result != (size_t)(-1)) {
+			/* flush the shift-out sequences */
+			for (;;) {
+				result = iconv(cd, NULL, NULL, (char **) &out_p, &out_left);
+				out_size = bsz - out_left;
 
-			if (result != (size_t)(-1)) {
-				break;
-			}
+				if (result != (size_t)(-1)) {
+					break;
+				}
 
-			if (errno == E2BIG) {
-				bsz += 16;
-				out_buf = zend_string_extend(out_buf, bsz, 0);
-				out_p = ZSTR_VAL(out_buf);
-				out_p += out_size;
-				out_left = bsz - out_size;
-			} else {
-				break;
+				if (errno == E2BIG) {
+					bsz += 16;
+					out_buf = zend_string_extend(out_buf, bsz, 0);
+					out_p = ZSTR_VAL(out_buf);
+					out_p += out_size;
+					out_left = bsz - out_size;
+				} else {
+					break;
+				}
 			}
 		}
-	}
+	} zend_catch {
+		iconv_close(cd);
+		zend_bailout();
+	} zend_end_try();
 
 	iconv_close(cd);
 
@@ -685,58 +689,63 @@ static php_iconv_err_t _php_iconv_substr(smart_str *pretval,
 	errno = 0;
 	more = nbytes > 0 && len > 0;
 
-	for (in_p = str, in_left = nbytes, cnt = 0; more; ++cnt) {
-		out_p = buf;
-		out_left = sizeof(buf);
+	bool bailout = false;
+	zend_try {
+		for (in_p = str, in_left = nbytes, cnt = 0; more; ++cnt) {
+			out_p = buf;
+			out_left = sizeof(buf);
 
-		more = in_left > 0 && len > 0;
+			more = in_left > 0 && len > 0;
 
-		iconv(cd1, more ? (ICONV_CONST char **)&in_p : NULL, more ? &in_left : NULL, (char **) &out_p, &out_left);
-		if (out_left == sizeof(buf)) {
-			break;
-		}
+			iconv(cd1, more ? (ICONV_CONST char **)&in_p : NULL, more ? &in_left : NULL, (char **) &out_p, &out_left);
+			if (out_left == sizeof(buf)) {
+				break;
+			}
 
-		if ((zend_long)cnt >= offset) {
-			if (cd2 == (iconv_t)NULL) {
-				cd2 = iconv_open(enc, GENERIC_SUPERSET_NAME);
+			if ((zend_long)cnt >= offset) {
+				if (cd2 == (iconv_t)NULL) {
+					cd2 = iconv_open(enc, GENERIC_SUPERSET_NAME);
 
-				if (cd2 == (iconv_t)(-1)) {
-					cd2 = (iconv_t)NULL;
-					if (errno == EINVAL) {
-						err = PHP_ICONV_ERR_WRONG_CHARSET;
-					} else {
-						err = PHP_ICONV_ERR_CONVERTER;
+					if (cd2 == (iconv_t)(-1)) {
+						cd2 = (iconv_t)NULL;
+						if (errno == EINVAL) {
+							err = PHP_ICONV_ERR_WRONG_CHARSET;
+						} else {
+							err = PHP_ICONV_ERR_CONVERTER;
+						}
+						break;
 					}
+				}
+
+				if (_php_iconv_appendl(pretval, buf, sizeof(buf), cd2) != PHP_ICONV_ERR_SUCCESS) {
 					break;
 				}
+				--len;
 			}
 
-			if (_php_iconv_appendl(pretval, buf, sizeof(buf), cd2) != PHP_ICONV_ERR_SUCCESS) {
-				break;
-			}
-			--len;
 		}
 
-	}
-
-	switch (errno) {
-		case EINVAL:
-			err = PHP_ICONV_ERR_ILLEGAL_CHAR;
-			break;
+		switch (errno) {
+			case EINVAL:
+				err = PHP_ICONV_ERR_ILLEGAL_CHAR;
+				break;
 
-		case EILSEQ:
-			err = PHP_ICONV_ERR_ILLEGAL_SEQ;
-			break;
+			case EILSEQ:
+				err = PHP_ICONV_ERR_ILLEGAL_SEQ;
+				break;
 
-		case E2BIG:
-			break;
-	}
-	if (err == PHP_ICONV_ERR_SUCCESS) {
-		if (cd2 != (iconv_t)NULL) {
-			_php_iconv_appendl(pretval, NULL, 0, cd2);
+			case E2BIG:
+				break;
 		}
-		smart_str_0(pretval);
-	}
+		if (err == PHP_ICONV_ERR_SUCCESS) {
+			if (cd2 != (iconv_t)NULL) {
+				_php_iconv_appendl(pretval, NULL, 0, cd2);
+			}
+			smart_str_0(pretval);
+		}
+	} zend_catch {
+		bailout = true;
+	} zend_end_try();
 
 	if (cd1 != (iconv_t)NULL) {
 		iconv_close(cd1);
@@ -745,6 +754,9 @@ static php_iconv_err_t _php_iconv_substr(smart_str *pretval,
 	if (cd2 != (iconv_t)NULL) {
 		iconv_close(cd2);
 	}
+	if (bailout) {
+		zend_bailout();
+	}
 	return err;
 }
 
@@ -904,6 +916,7 @@ static php_iconv_err_t _php_iconv_mime_encode(smart_str *pretval, const char *fn
 {
 	php_iconv_err_t err = PHP_ICONV_ERR_SUCCESS;
 	iconv_t cd = (iconv_t)(-1), cd_pl = (iconv_t)(-1);
+	bool bailout = false;
 	size_t char_cnt = 0;
 	size_t out_charset_len;
 	size_t lfchars_len;
@@ -962,215 +975,221 @@ static php_iconv_err_t _php_iconv_mime_encode(smart_str *pretval, const char *fn
 		goto out;
 	}
 
-	buf = safe_emalloc(1, max_line_len, 5);
+	zend_try {
+		buf = safe_emalloc(1, max_line_len, 5);
 
-	char_cnt = max_line_len;
+		char_cnt = max_line_len;
 
-	_php_iconv_appendl(pretval, fname, fname_nbytes, cd_pl);
-	char_cnt -= fname_nbytes;
-	smart_str_appendl(pretval, ": ", sizeof(": ") - 1);
-	char_cnt -= 2;
+		_php_iconv_appendl(pretval, fname, fname_nbytes, cd_pl);
+		char_cnt -= fname_nbytes;
+		smart_str_appendl(pretval, ": ", sizeof(": ") - 1);
+		char_cnt -= 2;
 
-	in_p = fval;
-	in_left = fval_nbytes;
+		in_p = fval;
+		in_left = fval_nbytes;
 
-	do {
-		size_t prev_in_left;
-		size_t out_size;
-		size_t encoded_word_min_len = sizeof("=\?\?X\?\?=")-1 + out_charset_len + (enc_scheme == PHP_ICONV_ENC_SCHEME_BASE64 ? 4 : 3);
+		do {
+			size_t prev_in_left;
+			size_t out_size;
+			size_t encoded_word_min_len = sizeof("=\?\?X\?\?=")-1 + out_charset_len + (enc_scheme == PHP_ICONV_ENC_SCHEME_BASE64 ? 4 : 3);
 
-		if (char_cnt < encoded_word_min_len + lfchars_len + 1) {
-			/* lfchars must be encoded in ASCII here*/
-			smart_str_appendl(pretval, lfchars, lfchars_len);
-			smart_str_appendc(pretval, ' ');
-			char_cnt = max_line_len - 1;
-		}
+			if (char_cnt < encoded_word_min_len + lfchars_len + 1) {
+				/* lfchars must be encoded in ASCII here*/
+				smart_str_appendl(pretval, lfchars, lfchars_len);
+				smart_str_appendc(pretval, ' ');
+				char_cnt = max_line_len - 1;
+			}
 
-		smart_str_appendl(pretval, "=?", sizeof("=?") - 1);
-		char_cnt -= 2;
-		smart_str_appendl(pretval, out_charset, out_charset_len);
-		char_cnt -= out_charset_len;
-		smart_str_appendc(pretval, '?');
-		char_cnt --;
+			smart_str_appendl(pretval, "=?", sizeof("=?") - 1);
+			char_cnt -= 2;
+			smart_str_appendl(pretval, out_charset, out_charset_len);
+			char_cnt -= out_charset_len;
+			smart_str_appendc(pretval, '?');
+			char_cnt --;
 
-		switch (enc_scheme) {
-			case PHP_ICONV_ENC_SCHEME_BASE64: {
-				size_t ini_in_left;
-				const char *ini_in_p;
-				size_t out_reserved = 4;
+			switch (enc_scheme) {
+				case PHP_ICONV_ENC_SCHEME_BASE64: {
+					size_t ini_in_left;
+					const char *ini_in_p;
+					size_t out_reserved = 4;
 
-				smart_str_appendc(pretval, 'B');
-				char_cnt--;
-				smart_str_appendc(pretval, '?');
-				char_cnt--;
+					smart_str_appendc(pretval, 'B');
+					char_cnt--;
+					smart_str_appendc(pretval, '?');
+					char_cnt--;
 
-				prev_in_left = ini_in_left = in_left;
-				ini_in_p = in_p;
+					prev_in_left = ini_in_left = in_left;
+					ini_in_p = in_p;
 
-				out_size = (char_cnt - 2) / 4 * 3;
+					out_size = (char_cnt - 2) / 4 * 3;
 
-				for (;;) {
-					out_p = buf;
+					for (;;) {
+						out_p = buf;
 
-					if (out_size <= out_reserved) {
-						err = PHP_ICONV_ERR_TOO_BIG;
-						goto out;
-					}
+						if (out_size <= out_reserved) {
+							err = PHP_ICONV_ERR_TOO_BIG;
+							goto out_try;
+						}
 
-					out_left = out_size - out_reserved;
+						out_left = out_size - out_reserved;
 
-					if (iconv(cd, (ICONV_CONST char **)&in_p, &in_left, (char **) &out_p, &out_left) == (size_t)-1) {
-						switch (errno) {
-							case EINVAL:
-								err = PHP_ICONV_ERR_ILLEGAL_CHAR;
-								goto out;
+						if (iconv(cd, (ICONV_CONST char **)&in_p, &in_left, (char **) &out_p, &out_left) == (size_t)-1) {
+							switch (errno) {
+								case EINVAL:
+									err = PHP_ICONV_ERR_ILLEGAL_CHAR;
+									goto out_try;
 
-							case EILSEQ:
-								err = PHP_ICONV_ERR_ILLEGAL_SEQ;
-								goto out;
+								case EILSEQ:
+									err = PHP_ICONV_ERR_ILLEGAL_SEQ;
+									goto out_try;
 
-							case E2BIG:
-								if (prev_in_left == in_left) {
-									err = PHP_ICONV_ERR_TOO_BIG;
-									goto out;
-								}
-								break;
+								case E2BIG:
+									if (prev_in_left == in_left) {
+										err = PHP_ICONV_ERR_TOO_BIG;
+										goto out_try;
+									}
+									break;
 
-							default:
-								err = PHP_ICONV_ERR_UNKNOWN;
-								goto out;
+								default:
+									err = PHP_ICONV_ERR_UNKNOWN;
+									goto out_try;
+							}
 						}
-					}
 
-					out_left += out_reserved;
+						out_left += out_reserved;
 
-					if (iconv(cd, NULL, NULL, (char **) &out_p, &out_left) == (size_t)-1) {
-						if (errno != E2BIG) {
+						if (iconv(cd, NULL, NULL, (char **) &out_p, &out_left) == (size_t)-1) {
+							if (errno != E2BIG) {
+								err = PHP_ICONV_ERR_UNKNOWN;
+								goto out_try;
+							}
+						} else {
+							break;
+						}
+
+						if (iconv(cd, NULL, NULL, NULL, NULL) == (size_t)-1) {
 							err = PHP_ICONV_ERR_UNKNOWN;
-							goto out;
+							goto out_try;
 						}
-					} else {
-						break;
-					}
 
-					if (iconv(cd, NULL, NULL, NULL, NULL) == (size_t)-1) {
-						err = PHP_ICONV_ERR_UNKNOWN;
-						goto out;
+						out_reserved += 4;
+						in_left = ini_in_left;
+						in_p = ini_in_p;
 					}
 
-					out_reserved += 4;
-					in_left = ini_in_left;
-					in_p = ini_in_p;
-				}
+					prev_in_left = in_left;
 
-				prev_in_left = in_left;
+					encoded = php_base64_encode((unsigned char *) buf, (out_size - out_left));
 
-				encoded = php_base64_encode((unsigned char *) buf, (out_size - out_left));
+					if (char_cnt < ZSTR_LEN(encoded)) {
+						/* something went wrong! */
+						err = PHP_ICONV_ERR_UNKNOWN;
+						goto out_try;
+					}
 
-				if (char_cnt < ZSTR_LEN(encoded)) {
-					/* something went wrong! */
-					err = PHP_ICONV_ERR_UNKNOWN;
-					goto out;
-				}
+					smart_str_append(pretval, encoded);
+					char_cnt -= ZSTR_LEN(encoded);
+					smart_str_appendl(pretval, "?=", sizeof("?=") - 1);
+					char_cnt -= 2;
 
-				smart_str_appendl(pretval, ZSTR_VAL(encoded), ZSTR_LEN(encoded));
-				char_cnt -= ZSTR_LEN(encoded);
-				smart_str_appendl(pretval, "?=", sizeof("?=") - 1);
-				char_cnt -= 2;
+					zend_string_release_ex(encoded, 0);
+					encoded = NULL;
+				} break; /* case PHP_ICONV_ENC_SCHEME_BASE64: */
 
-				zend_string_release_ex(encoded, 0);
-				encoded = NULL;
-			} break; /* case PHP_ICONV_ENC_SCHEME_BASE64: */
+				case PHP_ICONV_ENC_SCHEME_QPRINT: {
+					size_t ini_in_left;
+					const char *ini_in_p;
+					const unsigned char *p;
+					size_t nbytes_required;
 
-			case PHP_ICONV_ENC_SCHEME_QPRINT: {
-				size_t ini_in_left;
-				const char *ini_in_p;
-				const unsigned char *p;
-				size_t nbytes_required;
+					smart_str_appendc(pretval, 'Q');
+					char_cnt--;
+					smart_str_appendc(pretval, '?');
+					char_cnt--;
 
-				smart_str_appendc(pretval, 'Q');
-				char_cnt--;
-				smart_str_appendc(pretval, '?');
-				char_cnt--;
+					prev_in_left = ini_in_left = in_left;
+					ini_in_p = in_p;
 
-				prev_in_left = ini_in_left = in_left;
-				ini_in_p = in_p;
+					for (out_size = (char_cnt - 2); out_size > 0;) {
 
-				for (out_size = (char_cnt - 2); out_size > 0;) {
+						nbytes_required = 0;
 
-					nbytes_required = 0;
+						out_p = buf;
+						out_left = out_size;
 
-					out_p = buf;
-					out_left = out_size;
+						if (iconv(cd, (ICONV_CONST char **)&in_p, &in_left, (char **) &out_p, &out_left) == (size_t)-1) {
+							switch (errno) {
+								case EINVAL:
+									err = PHP_ICONV_ERR_ILLEGAL_CHAR;
+									goto out_try;
 
-					if (iconv(cd, (ICONV_CONST char **)&in_p, &in_left, (char **) &out_p, &out_left) == (size_t)-1) {
-						switch (errno) {
-							case EINVAL:
-								err = PHP_ICONV_ERR_ILLEGAL_CHAR;
-								goto out;
+								case EILSEQ:
+									err = PHP_ICONV_ERR_ILLEGAL_SEQ;
+									goto out_try;
 
-							case EILSEQ:
-								err = PHP_ICONV_ERR_ILLEGAL_SEQ;
-								goto out;
+								case E2BIG:
+									if (prev_in_left == in_left) {
+										err = PHP_ICONV_ERR_UNKNOWN;
+										goto out_try;
+									}
+									break;
 
-							case E2BIG:
-								if (prev_in_left == in_left) {
+								default:
 									err = PHP_ICONV_ERR_UNKNOWN;
-									goto out;
-								}
-								break;
-
-							default:
+									goto out_try;
+							}
+						}
+						if (iconv(cd, NULL, NULL, (char **) &out_p, &out_left) == (size_t)-1) {
+							if (errno != E2BIG) {
 								err = PHP_ICONV_ERR_UNKNOWN;
-								goto out;
+								goto out_try;
+							}
 						}
-					}
-					if (iconv(cd, NULL, NULL, (char **) &out_p, &out_left) == (size_t)-1) {
-						if (errno != E2BIG) {
-							err = PHP_ICONV_ERR_UNKNOWN;
-							goto out;
+
+						for (p = (unsigned char *)buf; p < (unsigned char *)out_p; p++) {
+							nbytes_required += qp_table[*p];
 						}
-					}
 
-					for (p = (unsigned char *)buf; p < (unsigned char *)out_p; p++) {
-						nbytes_required += qp_table[*p];
+						if (nbytes_required <= char_cnt - 2) {
+							break;
+						}
+
+						out_size -= ((nbytes_required - (char_cnt - 2)) + 2) / 3;
+						in_left = ini_in_left;
+						in_p = ini_in_p;
 					}
 
-					if (nbytes_required <= char_cnt - 2) {
-						break;
+					for (p = (unsigned char *)buf; p < (unsigned char *)out_p; p++) {
+						if (qp_table[*p] == 1) {
+							smart_str_appendc(pretval, *(char *)p);
+							char_cnt--;
+						} else {
+							static const char qp_digits[] = "0123456789ABCDEF";
+							smart_str_appendc(pretval, '=');
+							smart_str_appendc(pretval, qp_digits[(*p >> 4) & 0x0f]);
+							smart_str_appendc(pretval, qp_digits[(*p & 0x0f)]);
+							char_cnt -= 3;
+						}
 					}
 
-					out_size -= ((nbytes_required - (char_cnt - 2)) + 2) / 3;
-					in_left = ini_in_left;
-					in_p = ini_in_p;
-				}
+					smart_str_appendl(pretval, "?=", sizeof("?=") - 1);
+					char_cnt -= 2;
 
-				for (p = (unsigned char *)buf; p < (unsigned char *)out_p; p++) {
-					if (qp_table[*p] == 1) {
-						smart_str_appendc(pretval, *(char *)p);
-						char_cnt--;
-					} else {
-						static const char qp_digits[] = "0123456789ABCDEF";
-						smart_str_appendc(pretval, '=');
-						smart_str_appendc(pretval, qp_digits[(*p >> 4) & 0x0f]);
-						smart_str_appendc(pretval, qp_digits[(*p & 0x0f)]);
-						char_cnt -= 3;
+					if (iconv(cd, NULL, NULL, NULL, NULL) == (size_t)-1) {
+						err = PHP_ICONV_ERR_UNKNOWN;
+						goto out_try;
 					}
-				}
-
-				smart_str_appendl(pretval, "?=", sizeof("?=") - 1);
-				char_cnt -= 2;
 
-				if (iconv(cd, NULL, NULL, NULL, NULL) == (size_t)-1) {
-					err = PHP_ICONV_ERR_UNKNOWN;
-					goto out;
-				}
+				} break; /* case PHP_ICONV_ENC_SCHEME_QPRINT: */
+			}
+		} while (in_left > 0);
 
-			} break; /* case PHP_ICONV_ENC_SCHEME_QPRINT: */
-		}
-	} while (in_left > 0);
+		smart_str_0(pretval);
 
-	smart_str_0(pretval);
+out_try: ;
+	} zend_catch {
+		bailout = true;
+	} zend_end_try();
 
 out:
 	if (cd != (iconv_t)(-1)) {
@@ -1185,6 +1204,9 @@ static php_iconv_err_t _php_iconv_mime_encode(smart_str *pretval, const char *fn
 	if (buf != NULL) {
 		efree(buf);
 	}
+	if (bailout) {
+		zend_bailout();
+	}
 	return err;
 }
 /* }}} */
@@ -1193,6 +1215,7 @@ static php_iconv_err_t _php_iconv_mime_encode(smart_str *pretval, const char *fn
 static php_iconv_err_t _php_iconv_mime_decode(smart_str *pretval, const char *str, size_t str_nbytes, const char *enc, const char **next_pos, int mode)
 {
 	php_iconv_err_t err = PHP_ICONV_ERR_SUCCESS;
+	bool bailout = false;
 
 	iconv_t cd = (iconv_t)(-1), cd_pl = (iconv_t)(-1);
 
@@ -1224,206 +1247,229 @@ static php_iconv_err_t _php_iconv_mime_decode(smart_str *pretval, const char *st
 	}
 
 	p1 = str;
-	for (str_left = str_nbytes; str_left > 0; str_left--, p1++) {
-		int eos = 0;
-
-		switch (scan_stat) {
-			case 0: /* expecting any character */
-				switch (*p1) {
-					case '\r': /* part of an EOL sequence? */
-						scan_stat = 7;
-						break;
+	zend_try {
+		for (str_left = str_nbytes; str_left > 0; str_left--, p1++) {
+			int eos = 0;
+
+			switch (scan_stat) {
+				case 0: /* expecting any character */
+					switch (*p1) {
+						case '\r': /* part of an EOL sequence? */
+							scan_stat = 7;
+							break;
 
-					case '\n':
-						scan_stat = 8;
-						break;
+						case '\n':
+							scan_stat = 8;
+							break;
 
-					case '=': /* first letter of an encoded chunk */
-						encoded_word = p1;
-						scan_stat = 1;
-						break;
+						case '=': /* first letter of an encoded chunk */
+							encoded_word = p1;
+							scan_stat = 1;
+							break;
 
-					case ' ': case '\t': /* a chunk of whitespaces */
-						spaces = p1;
-						scan_stat = 11;
-						break;
+						case ' ': case '\t': /* a chunk of whitespaces */
+							spaces = p1;
+							scan_stat = 11;
+							break;
 
-					default: /* first letter of a non-encoded word */
-						err = _php_iconv_appendc(pretval, *p1, cd_pl);
-						if (err != PHP_ICONV_ERR_SUCCESS) {
-							if (mode & PHP_ICONV_MIME_DECODE_CONTINUE_ON_ERROR) {
-								err = PHP_ICONV_ERR_SUCCESS;
-							} else {
-								goto out;
+						default: /* first letter of a non-encoded word */
+							err = _php_iconv_appendc(pretval, *p1, cd_pl);
+							if (err != PHP_ICONV_ERR_SUCCESS) {
+								if (mode & PHP_ICONV_MIME_DECODE_CONTINUE_ON_ERROR) {
+									err = PHP_ICONV_ERR_SUCCESS;
+								} else {
+									goto out_try;
+								}
 							}
-						}
-						encoded_word = NULL;
-						if ((mode & PHP_ICONV_MIME_DECODE_STRICT)) {
-							scan_stat = 12;
-						}
-						break;
-				}
-				break;
-
-			case 1: /* expecting a delimiter */
-				if (*p1 != '?') {
-					if (*p1 == '\r' || *p1 == '\n') {
-						--p1;
-					}
-					err = _php_iconv_appendl(pretval, encoded_word, (size_t)((p1 + 1) - encoded_word), cd_pl);
-					if (err != PHP_ICONV_ERR_SUCCESS) {
-						goto out;
-					}
-					encoded_word = NULL;
-					if ((mode & PHP_ICONV_MIME_DECODE_STRICT)) {
-						scan_stat = 12;
-					} else {
-						scan_stat = 0;
+							encoded_word = NULL;
+							if ((mode & PHP_ICONV_MIME_DECODE_STRICT)) {
+								scan_stat = 12;
+							}
+							break;
 					}
 					break;
-				}
-				csname = p1 + 1;
-				scan_stat = 2;
-				break;
-
-			case 2: /* expecting a charset name */
-				switch (*p1) {
-					case '?': /* normal delimiter: encoding scheme follows */
-						scan_stat = 3;
-						break;
-
-					case '*': /* new style delimiter: locale id follows */
-						scan_stat = 10;
-						break;
 
-					case '\r': case '\n': /* not an encoded-word */
-						--p1;
-						_php_iconv_appendc(pretval, '=', cd_pl);
-						_php_iconv_appendc(pretval, '?', cd_pl);
-						err = _php_iconv_appendl(pretval, csname, (size_t)((p1 + 1) - csname), cd_pl);
+				case 1: /* expecting a delimiter */
+					if (*p1 != '?') {
+						if (*p1 == '\r' || *p1 == '\n') {
+							--p1;
+						}
+						err = _php_iconv_appendl(pretval, encoded_word, (size_t)((p1 + 1) - encoded_word), cd_pl);
 						if (err != PHP_ICONV_ERR_SUCCESS) {
-							goto out;
+							goto out_try;
 						}
-						csname = NULL;
+						encoded_word = NULL;
 						if ((mode & PHP_ICONV_MIME_DECODE_STRICT)) {
 							scan_stat = 12;
-						}
-						else {
+						} else {
 							scan_stat = 0;
 						}
-						continue;
-				}
-				if (scan_stat != 2) {
-					char tmpbuf[80];
-
-					if (csname == NULL) {
-						err = PHP_ICONV_ERR_MALFORMED;
-						goto out;
+						break;
 					}
+					csname = p1 + 1;
+					scan_stat = 2;
+					break;
 
-					csname_len = (size_t)(p1 - csname);
+				case 2: /* expecting a charset name */
+					switch (*p1) {
+						case '?': /* normal delimiter: encoding scheme follows */
+							scan_stat = 3;
+							break;
 
-					if (csname_len > sizeof(tmpbuf) - 1) {
-						if ((mode & PHP_ICONV_MIME_DECODE_CONTINUE_ON_ERROR)) {
-							err = _php_iconv_appendl(pretval, encoded_word, (size_t)((p1 + 1) - encoded_word), cd_pl);
+						case '*': /* new style delimiter: locale id follows */
+							scan_stat = 10;
+							break;
+
+						case '\r': case '\n': /* not an encoded-word */
+							--p1;
+							_php_iconv_appendc(pretval, '=', cd_pl);
+							_php_iconv_appendc(pretval, '?', cd_pl);
+							err = _php_iconv_appendl(pretval, csname, (size_t)((p1 + 1) - csname), cd_pl);
 							if (err != PHP_ICONV_ERR_SUCCESS) {
-								goto out;
+								goto out_try;
 							}
-							encoded_word = NULL;
+							csname = NULL;
 							if ((mode & PHP_ICONV_MIME_DECODE_STRICT)) {
 								scan_stat = 12;
-							} else {
+							}
+							else {
 								scan_stat = 0;
 							}
-							break;
-						} else {
-							err = PHP_ICONV_ERR_MALFORMED;
-							goto out;
-						}
+							continue;
 					}
+					if (scan_stat != 2) {
+						char tmpbuf[80];
 
-					memcpy(tmpbuf, csname, csname_len);
-					tmpbuf[csname_len] = '\0';
-
-					if (cd != (iconv_t)(-1)) {
-						iconv_close(cd);
-					}
+						if (csname == NULL) {
+							err = PHP_ICONV_ERR_MALFORMED;
+							goto out_try;
+						}
 
-					cd = iconv_open(enc, tmpbuf);
+						csname_len = (size_t)(p1 - csname);
 
-					if (cd == (iconv_t)(-1)) {
-						if ((mode & PHP_ICONV_MIME_DECODE_CONTINUE_ON_ERROR)) {
-							/* Bad character set, but the user wants us to
-							 * press on. In this case, we'll just insert the
-							 * undecoded encoded word, since there isn't really
-							 * a more sensible behaviour available; the only
-							 * other options are to swallow the encoded word
-							 * entirely or decode it with an arbitrarily chosen
-							 * single byte encoding, both of which seem to have
-							 * a higher WTF factor than leaving it undecoded.
-							 *
-							 * Given this approach, we need to skip ahead to
-							 * the end of the encoded word. */
-							int qmarks = 2;
-							while (qmarks > 0 && str_left > 1) {
-								if (*(++p1) == '?') {
-									--qmarks;
+						if (csname_len > sizeof(tmpbuf) - 1) {
+							if ((mode & PHP_ICONV_MIME_DECODE_CONTINUE_ON_ERROR)) {
+								err = _php_iconv_appendl(pretval, encoded_word, (size_t)((p1 + 1) - encoded_word), cd_pl);
+								if (err != PHP_ICONV_ERR_SUCCESS) {
+									goto out_try;
 								}
-								--str_left;
+								encoded_word = NULL;
+								if ((mode & PHP_ICONV_MIME_DECODE_STRICT)) {
+									scan_stat = 12;
+								} else {
+									scan_stat = 0;
+								}
+								break;
+							} else {
+								err = PHP_ICONV_ERR_MALFORMED;
+								goto out_try;
 							}
+						}
+
+						memcpy(tmpbuf, csname, csname_len);
+						tmpbuf[csname_len] = '\0';
 
-							/* Look ahead to check for the terminating = that
-							 * should be there as well; if it's there, we'll
-							 * also include that. If it's not, there isn't much
-							 * we can do at this point. */
-							if (*(p1 + 1) == '=') {
-								++p1;
-								if (str_left > 1) {
+						if (cd != (iconv_t)(-1)) {
+							iconv_close(cd);
+						}
+
+						cd = iconv_open(enc, tmpbuf);
+
+						if (cd == (iconv_t)(-1)) {
+							if ((mode & PHP_ICONV_MIME_DECODE_CONTINUE_ON_ERROR)) {
+								/* Bad character set, but the user wants us to
+								 * press on. In this case, we'll just insert the
+								 * undecoded encoded word, since there isn't really
+								 * a more sensible behaviour available; the only
+								 * other options are to swallow the encoded word
+								 * entirely or decode it with an arbitrarily chosen
+								 * single byte encoding, both of which seem to have
+								 * a higher WTF factor than leaving it undecoded.
+								 *
+								 * Given this approach, we need to skip ahead to
+								 * the end of the encoded word. */
+								int qmarks = 2;
+								while (qmarks > 0 && str_left > 1) {
+									if (*(++p1) == '?') {
+										--qmarks;
+									}
 									--str_left;
 								}
-							}
 
-							err = _php_iconv_appendl(pretval, encoded_word, (size_t)((p1 + 1) - encoded_word), cd_pl);
-							if (err != PHP_ICONV_ERR_SUCCESS) {
-								goto out;
-							}
+								/* Look ahead to check for the terminating = that
+								 * should be there as well; if it's there, we'll
+								 * also include that. If it's not, there isn't much
+								 * we can do at this point. */
+								if (*(p1 + 1) == '=') {
+									++p1;
+									if (str_left > 1) {
+										--str_left;
+									}
+								}
 
-							/* Let's go back and see if there are further
-							 * encoded words or bare content, and hope they
-							 * might actually have a valid character set. */
-							scan_stat = 12;
-							break;
-						} else {
-							if (errno == EINVAL) {
-								err = PHP_ICONV_ERR_WRONG_CHARSET;
+								err = _php_iconv_appendl(pretval, encoded_word, (size_t)((p1 + 1) - encoded_word), cd_pl);
+								if (err != PHP_ICONV_ERR_SUCCESS) {
+									goto out_try;
+								}
+
+								/* Let's go back and see if there are further
+								 * encoded words or bare content, and hope they
+								 * might actually have a valid character set. */
+								scan_stat = 12;
+								break;
 							} else {
-								err = PHP_ICONV_ERR_CONVERTER;
+								if (errno == EINVAL) {
+									err = PHP_ICONV_ERR_WRONG_CHARSET;
+								} else {
+									err = PHP_ICONV_ERR_CONVERTER;
+								}
+								goto out_try;
 							}
-							goto out;
 						}
 					}
-				}
-				break;
+					break;
 
-			case 3: /* expecting a encoding scheme specifier */
-				switch (*p1) {
-					case 'b':
-					case 'B':
-						enc_scheme = PHP_ICONV_ENC_SCHEME_BASE64;
-						scan_stat = 4;
-						break;
+				case 3: /* expecting a encoding scheme specifier */
+					switch (*p1) {
+						case 'b':
+						case 'B':
+							enc_scheme = PHP_ICONV_ENC_SCHEME_BASE64;
+							scan_stat = 4;
+							break;
 
-					case 'q':
-					case 'Q':
-						enc_scheme = PHP_ICONV_ENC_SCHEME_QPRINT;
-						scan_stat = 4;
-						break;
+						case 'q':
+						case 'Q':
+							enc_scheme = PHP_ICONV_ENC_SCHEME_QPRINT;
+							scan_stat = 4;
+							break;
 
-					default:
+						default:
+							if ((mode & PHP_ICONV_MIME_DECODE_CONTINUE_ON_ERROR)) {
+								err = _php_iconv_appendl(pretval, encoded_word, (size_t)((p1 + 1) - encoded_word), cd_pl);
+								if (err != PHP_ICONV_ERR_SUCCESS) {
+									goto out_try;
+								}
+								encoded_word = NULL;
+								if ((mode & PHP_ICONV_MIME_DECODE_STRICT)) {
+									scan_stat = 12;
+								} else {
+									scan_stat = 0;
+								}
+								break;
+							} else {
+								err = PHP_ICONV_ERR_MALFORMED;
+								goto out_try;
+							}
+					}
+					break;
+
+				case 4: /* expecting a delimiter */
+					if (*p1 != '?') {
 						if ((mode & PHP_ICONV_MIME_DECODE_CONTINUE_ON_ERROR)) {
+							/* pass the entire chunk through the converter */
 							err = _php_iconv_appendl(pretval, encoded_word, (size_t)((p1 + 1) - encoded_word), cd_pl);
 							if (err != PHP_ICONV_ERR_SUCCESS) {
-								goto out;
+								goto out_try;
 							}
 							encoded_word = NULL;
 							if ((mode & PHP_ICONV_MIME_DECODE_STRICT)) {
@@ -1434,301 +1480,285 @@ static php_iconv_err_t _php_iconv_mime_decode(smart_str *pretval, const char *st
 							break;
 						} else {
 							err = PHP_ICONV_ERR_MALFORMED;
-							goto out;
+							goto out_try;
 						}
-				}
-				break;
-
-			case 4: /* expecting a delimiter */
-				if (*p1 != '?') {
-					if ((mode & PHP_ICONV_MIME_DECODE_CONTINUE_ON_ERROR)) {
-						/* pass the entire chunk through the converter */
-						err = _php_iconv_appendl(pretval, encoded_word, (size_t)((p1 + 1) - encoded_word), cd_pl);
-						if (err != PHP_ICONV_ERR_SUCCESS) {
-							goto out;
-						}
-						encoded_word = NULL;
-						if ((mode & PHP_ICONV_MIME_DECODE_STRICT)) {
-							scan_stat = 12;
-						} else {
-							scan_stat = 0;
-						}
-						break;
-					} else {
-						err = PHP_ICONV_ERR_MALFORMED;
-						goto out;
 					}
-				}
-				encoded_text = p1 + 1;
-				scan_stat = 5;
-				break;
-
-			case 5: /* expecting an encoded portion */
-				if (*p1 == '?') {
-					encoded_text_len = (size_t)(p1 - encoded_text);
-					scan_stat = 6;
-				}
-				break;
+					encoded_text = p1 + 1;
+					scan_stat = 5;
+					break;
 
-			case 7: /* expecting a "\n" character */
-				if (*p1 == '\n') {
-					scan_stat = 8;
-				} else {
-					/* bare CR */
-					_php_iconv_appendc(pretval, '\r', cd_pl);
-					_php_iconv_appendc(pretval, *p1, cd_pl);
-					scan_stat = 0;
-				}
-				break;
+				case 5: /* expecting an encoded portion */
+					if (*p1 == '?') {
+						encoded_text_len = (size_t)(p1 - encoded_text);
+						scan_stat = 6;
+					}
+					break;
 
-			case 8: /* checking whether the following line is part of a
-					   folded header */
-				if (*p1 != ' ' && *p1 != '\t') {
-					--p1;
-					str_left = 1; /* quit_loop */
+				case 7: /* expecting a "\n" character */
+					if (*p1 == '\n') {
+						scan_stat = 8;
+					} else {
+						/* bare CR */
+						_php_iconv_appendc(pretval, '\r', cd_pl);
+						_php_iconv_appendc(pretval, *p1, cd_pl);
+						scan_stat = 0;
+					}
 					break;
-				}
-				if (encoded_word == NULL) {
-					_php_iconv_appendc(pretval, ' ', cd_pl);
-				}
-				spaces = NULL;
-				scan_stat = 11;
-				break;
 
-			case 6: /* expecting a End-Of-Chunk character "=" */
-				if (*p1 != '=') {
-					if ((mode & PHP_ICONV_MIME_DECODE_CONTINUE_ON_ERROR)) {
-						/* pass the entire chunk through the converter */
-						err = _php_iconv_appendl(pretval, encoded_word, (size_t)((p1 + 1) - encoded_word), cd_pl);
-						if (err != PHP_ICONV_ERR_SUCCESS) {
-							goto out;
-						}
-						encoded_word = NULL;
-						if ((mode & PHP_ICONV_MIME_DECODE_STRICT)) {
-							scan_stat = 12;
-						} else {
-							scan_stat = 0;
-						}
+				case 8: /* checking whether the following line is part of a
+						   folded header */
+					if (*p1 != ' ' && *p1 != '\t') {
+						--p1;
+						str_left = 1; /* quit_loop */
 						break;
-					} else {
-						err = PHP_ICONV_ERR_MALFORMED;
-						goto out;
 					}
-				}
-				scan_stat = 9;
-				if (str_left == 1) {
-					eos = 1;
-				} else {
+					if (encoded_word == NULL) {
+						_php_iconv_appendc(pretval, ' ', cd_pl);
+					}
+					spaces = NULL;
+					scan_stat = 11;
 					break;
-				}
-				/* TODO might want to rearrange logic so this is more obvious */
-				ZEND_FALLTHROUGH;
 
-			case 9: /* choice point, seeing what to do next.*/
-				switch (*p1) {
-					default:
-						/* Handle non-RFC-compliant formats
-						 *
-						 * RFC2047 requires the character that comes right
-						 * after an encoded word (chunk) to be a whitespace,
-						 * while there are lots of broken implementations that
-						 * generate such malformed headers that don't fulfill
-						 * that requirement.
-						 */
-						if (!eos) {
+				case 6: /* expecting a End-Of-Chunk character "=" */
+					if (*p1 != '=') {
+						if ((mode & PHP_ICONV_MIME_DECODE_CONTINUE_ON_ERROR)) {
+							/* pass the entire chunk through the converter */
+							err = _php_iconv_appendl(pretval, encoded_word, (size_t)((p1 + 1) - encoded_word), cd_pl);
+							if (err != PHP_ICONV_ERR_SUCCESS) {
+								goto out_try;
+							}
+							encoded_word = NULL;
 							if ((mode & PHP_ICONV_MIME_DECODE_STRICT)) {
-								/* pass the entire chunk through the converter */
-								err = _php_iconv_appendl(pretval, encoded_word, (size_t)((p1 + 1) - encoded_word), cd_pl);
-								if (err != PHP_ICONV_ERR_SUCCESS) {
-									goto out;
-								}
 								scan_stat = 12;
-								break;
+							} else {
+								scan_stat = 0;
 							}
+							break;
+						} else {
+							err = PHP_ICONV_ERR_MALFORMED;
+							goto out_try;
 						}
-						ZEND_FALLTHROUGH;
-
-					case '\r': case '\n': case ' ': case '\t': {
-						zend_string *decoded_text;
-
-						switch (enc_scheme) {
-							case PHP_ICONV_ENC_SCHEME_BASE64:
-								decoded_text = php_base64_decode((unsigned char*)encoded_text, encoded_text_len);
-								break;
-
-							case PHP_ICONV_ENC_SCHEME_QPRINT:
-								decoded_text = php_quot_print_decode((unsigned char*)encoded_text, encoded_text_len, 1);
-								break;
-							default:
-								decoded_text = NULL;
-								break;
-						}
+					}
+					scan_stat = 9;
+					if (str_left == 1) {
+						eos = 1;
+					} else {
+						break;
+					}
+					/* TODO might want to rearrange logic so this is more obvious */
+					ZEND_FALLTHROUGH;
 
-						if (decoded_text == NULL) {
-							if ((mode & PHP_ICONV_MIME_DECODE_CONTINUE_ON_ERROR)) {
-								/* pass the entire chunk through the converter */
-								err = _php_iconv_appendl(pretval, encoded_word, (size_t)((p1 + 1) - encoded_word), cd_pl);
-								if (err != PHP_ICONV_ERR_SUCCESS) {
-									goto out;
-								}
-								encoded_word = NULL;
+				case 9: /* choice point, seeing what to do next.*/
+					switch (*p1) {
+						default:
+							/* Handle non-RFC-compliant formats
+							 *
+							 * RFC2047 requires the character that comes right
+							 * after an encoded word (chunk) to be a whitespace,
+							 * while there are lots of broken implementations that
+							 * generate such malformed headers that don't fulfill
+							 * that requirement.
+							 */
+							if (!eos) {
 								if ((mode & PHP_ICONV_MIME_DECODE_STRICT)) {
+									/* pass the entire chunk through the converter */
+									err = _php_iconv_appendl(pretval, encoded_word, (size_t)((p1 + 1) - encoded_word), cd_pl);
+									if (err != PHP_ICONV_ERR_SUCCESS) {
+										goto out_try;
+									}
 									scan_stat = 12;
-								} else {
-									scan_stat = 0;
+									break;
 								}
-								break;
-							} else {
-								err = PHP_ICONV_ERR_UNKNOWN;
-								goto out;
 							}
-						}
+							ZEND_FALLTHROUGH;
 
-						err = _php_iconv_appendl(pretval, ZSTR_VAL(decoded_text), ZSTR_LEN(decoded_text), cd);
-						if (err == PHP_ICONV_ERR_SUCCESS) {
-							err = _php_iconv_appendl(pretval, NULL, 0, cd);
-						}
-						zend_string_release_ex(decoded_text, 0);
+						case '\r': case '\n': case ' ': case '\t': {
+							zend_string *decoded_text;
 
-						if (err != PHP_ICONV_ERR_SUCCESS) {
-							if ((mode & PHP_ICONV_MIME_DECODE_CONTINUE_ON_ERROR)) {
-								/* pass the entire chunk through the converter */
-								err = _php_iconv_appendl(pretval, encoded_word, (size_t)(p1 - encoded_word), cd_pl);
-								encoded_word = NULL;
-								if (err != PHP_ICONV_ERR_SUCCESS) {
+							switch (enc_scheme) {
+								case PHP_ICONV_ENC_SCHEME_BASE64:
+									decoded_text = php_base64_decode((unsigned char*)encoded_text, encoded_text_len);
+									break;
+
+								case PHP_ICONV_ENC_SCHEME_QPRINT:
+									decoded_text = php_quot_print_decode((unsigned char*)encoded_text, encoded_text_len, 1);
+									break;
+								default:
+									decoded_text = NULL;
+									break;
+							}
+
+							if (decoded_text == NULL) {
+								if ((mode & PHP_ICONV_MIME_DECODE_CONTINUE_ON_ERROR)) {
+									/* pass the entire chunk through the converter */
+									err = _php_iconv_appendl(pretval, encoded_word, (size_t)((p1 + 1) - encoded_word), cd_pl);
+									if (err != PHP_ICONV_ERR_SUCCESS) {
+										goto out_try;
+									}
+									encoded_word = NULL;
+									if ((mode & PHP_ICONV_MIME_DECODE_STRICT)) {
+										scan_stat = 12;
+									} else {
+										scan_stat = 0;
+									}
 									break;
+								} else {
+									err = PHP_ICONV_ERR_UNKNOWN;
+									goto out_try;
 								}
-							} else {
-								goto out;
 							}
-						}
 
-						if (eos) { /* reached end-of-string. done. */
-							scan_stat = 0;
-							break;
-						}
+							err = _php_iconv_appendl(pretval, ZSTR_VAL(decoded_text), ZSTR_LEN(decoded_text), cd);
+							if (err == PHP_ICONV_ERR_SUCCESS) {
+								err = _php_iconv_appendl(pretval, NULL, 0, cd);
+							}
+							zend_string_release_ex(decoded_text, 0);
 
-						switch (*p1) {
-							case '\r': /* part of an EOL sequence? */
-								scan_stat = 7;
-								break;
+							if (err != PHP_ICONV_ERR_SUCCESS) {
+								if ((mode & PHP_ICONV_MIME_DECODE_CONTINUE_ON_ERROR)) {
+									/* pass the entire chunk through the converter */
+									err = _php_iconv_appendl(pretval, encoded_word, (size_t)(p1 - encoded_word), cd_pl);
+									encoded_word = NULL;
+									if (err != PHP_ICONV_ERR_SUCCESS) {
+										break;
+									}
+								} else {
+									goto out_try;
+								}
+							}
 
-							case '\n':
-								scan_stat = 8;
+							if (eos) { /* reached end-of-string. done. */
+								scan_stat = 0;
 								break;
+							}
 
-							case '=': /* first letter of an encoded chunk */
-								scan_stat = 1;
-								break;
+							switch (*p1) {
+								case '\r': /* part of an EOL sequence? */
+									scan_stat = 7;
+									break;
 
-							case ' ': case '\t': /* medial whitespaces */
-								spaces = p1;
-								scan_stat = 11;
-								break;
+								case '\n':
+									scan_stat = 8;
+									break;
 
-							default: /* first letter of a non-encoded word */
-								_php_iconv_appendc(pretval, *p1, cd_pl);
-								scan_stat = 12;
-								break;
-						}
-					} break;
-				}
-				break;
+								case '=': /* first letter of an encoded chunk */
+									scan_stat = 1;
+									break;
 
-			case 10: /* expects a language specifier. dismiss it for now */
-				if (*p1 == '?') {
-					scan_stat = 3;
-				}
-				break;
+								case ' ': case '\t': /* medial whitespaces */
+									spaces = p1;
+									scan_stat = 11;
+									break;
 
-			case 11: /* expecting a chunk of whitespaces */
-				switch (*p1) {
-					case '\r': /* part of an EOL sequence? */
-						scan_stat = 7;
-						break;
+								default: /* first letter of a non-encoded word */
+									_php_iconv_appendc(pretval, *p1, cd_pl);
+									scan_stat = 12;
+									break;
+							}
+						} break;
+					}
+					break;
 
-					case '\n':
-						scan_stat = 8;
-						break;
+				case 10: /* expects a language specifier. dismiss it for now */
+					if (*p1 == '?') {
+						scan_stat = 3;
+					}
+					break;
 
-					case '=': /* first letter of an encoded chunk */
-						if (spaces != NULL && encoded_word == NULL) {
-							_php_iconv_appendl(pretval, spaces, (size_t)(p1 - spaces), cd_pl);
-							spaces = NULL;
-						}
-						encoded_word = p1;
-						scan_stat = 1;
-						break;
+				case 11: /* expecting a chunk of whitespaces */
+					switch (*p1) {
+						case '\r': /* part of an EOL sequence? */
+							scan_stat = 7;
+							break;
 
-					case ' ': case '\t':
-						break;
+						case '\n':
+							scan_stat = 8;
+							break;
 
-					default: /* first letter of a non-encoded word */
-						if (spaces != NULL) {
-							_php_iconv_appendl(pretval, spaces, (size_t)(p1 - spaces), cd_pl);
-							spaces = NULL;
-						}
-						_php_iconv_appendc(pretval, *p1, cd_pl);
-						encoded_word = NULL;
-						if ((mode & PHP_ICONV_MIME_DECODE_STRICT)) {
-							scan_stat = 12;
-						} else {
-							scan_stat = 0;
-						}
-						break;
-				}
-				break;
+						case '=': /* first letter of an encoded chunk */
+							if (spaces != NULL && encoded_word == NULL) {
+								_php_iconv_appendl(pretval, spaces, (size_t)(p1 - spaces), cd_pl);
+								spaces = NULL;
+							}
+							encoded_word = p1;
+							scan_stat = 1;
+							break;
 
-			case 12: /* expecting a non-encoded word */
-				switch (*p1) {
-					case '\r': /* part of an EOL sequence? */
-						scan_stat = 7;
-						break;
+						case ' ': case '\t':
+							break;
 
-					case '\n':
-						scan_stat = 8;
-						break;
+						default: /* first letter of a non-encoded word */
+							if (spaces != NULL) {
+								_php_iconv_appendl(pretval, spaces, (size_t)(p1 - spaces), cd_pl);
+								spaces = NULL;
+							}
+							_php_iconv_appendc(pretval, *p1, cd_pl);
+							encoded_word = NULL;
+							if ((mode & PHP_ICONV_MIME_DECODE_STRICT)) {
+								scan_stat = 12;
+							} else {
+								scan_stat = 0;
+							}
+							break;
+					}
+					break;
 
-					case ' ': case '\t':
-						spaces = p1;
-						scan_stat = 11;
-						break;
+				case 12: /* expecting a non-encoded word */
+					switch (*p1) {
+						case '\r': /* part of an EOL sequence? */
+							scan_stat = 7;
+							break;
 
-					case '=': /* first letter of an encoded chunk */
-						if (!(mode & PHP_ICONV_MIME_DECODE_STRICT)) {
-							encoded_word = p1;
-							scan_stat = 1;
+						case '\n':
+							scan_stat = 8;
 							break;
-						}
-						ZEND_FALLTHROUGH;
 
-					default:
-						_php_iconv_appendc(pretval, *p1, cd_pl);
-						break;
-				}
-				break;
+						case ' ': case '\t':
+							spaces = p1;
+							scan_stat = 11;
+							break;
+
+						case '=': /* first letter of an encoded chunk */
+							if (!(mode & PHP_ICONV_MIME_DECODE_STRICT)) {
+								encoded_word = p1;
+								scan_stat = 1;
+								break;
+							}
+							ZEND_FALLTHROUGH;
+
+						default:
+							_php_iconv_appendc(pretval, *p1, cd_pl);
+							break;
+					}
+					break;
+			}
 		}
-	}
-	switch (scan_stat) {
-		case 0: case 8: case 11: case 12:
-			break;
-		default:
-			if ((mode & PHP_ICONV_MIME_DECODE_CONTINUE_ON_ERROR)) {
-				if (scan_stat == 1) {
-					_php_iconv_appendc(pretval, '=', cd_pl);
+		switch (scan_stat) {
+			case 0: case 8: case 11: case 12:
+				break;
+			default:
+				if ((mode & PHP_ICONV_MIME_DECODE_CONTINUE_ON_ERROR)) {
+					if (scan_stat == 1) {
+						_php_iconv_appendc(pretval, '=', cd_pl);
+					}
+					err = PHP_ICONV_ERR_SUCCESS;
+				} else {
+					err = PHP_ICONV_ERR_MALFORMED;
+					goto out_try;
 				}
-				err = PHP_ICONV_ERR_SUCCESS;
-			} else {
-				err = PHP_ICONV_ERR_MALFORMED;
-				goto out;
-			}
-	}
+		}
 
-	if (next_pos != NULL) {
-		*next_pos = p1;
-	}
+		if (next_pos != NULL) {
+			*next_pos = p1;
+		}
+
+		smart_str_0(pretval);
+
+out_try: ;
+	} zend_catch {
+		bailout = true;
+	} zend_end_try();
 
-	smart_str_0(pretval);
 out:
 	if (cd != (iconv_t)(-1)) {
 		iconv_close(cd);
@@ -1736,6 +1766,9 @@ static php_iconv_err_t _php_iconv_mime_decode(smart_str *pretval, const char *st
 	if (cd_pl != (iconv_t)(-1)) {
 		iconv_close(cd_pl);
 	}
+	if (bailout) {
+		zend_bailout();
+	}
 	return err;
 }
 /* }}} */
@@ -2554,6 +2587,33 @@ static php_stream_filter_status_t php_iconv_stream_filter_do_filter(
 }
 /* }}} */
 
+/* {{{ php_iconv_stream_filter_seek */
+static zend_result php_iconv_stream_filter_seek(
+		php_stream *stream,
+		php_stream_filter *filter,
+		zend_off_t offset,
+		int whence)
+{
+	php_iconv_stream_filter *self = (php_iconv_stream_filter *)Z_PTR(filter->abstract);
+
+	/* Reset stub buffer */
+	self->stub_len = 0;
+
+	/* Reset iconv conversion state by closing and reopening the converter */
+	iconv_close(self->cd);
+
+	self->cd = iconv_open(self->to_charset, self->from_charset);
+	if ((iconv_t)-1 == self->cd) {
+		php_error_docref(NULL, E_WARNING,
+				"iconv stream filter (\"%s\"=>\"%s\"): failed to reset conversion state",
+				self->from_charset, self->to_charset);
+		return FAILURE;
+	}
+
+	return SUCCESS;
+}
+/* }}} */
+
 /* {{{ php_iconv_stream_filter_cleanup */
 static void php_iconv_stream_filter_cleanup(php_stream_filter *filter)
 {
@@ -2564,17 +2624,23 @@ static void php_iconv_stream_filter_cleanup(php_stream_filter *filter)
 
 static const php_stream_filter_ops php_iconv_stream_filter_ops = {
 	php_iconv_stream_filter_do_filter,
+	php_iconv_stream_filter_seek,
 	php_iconv_stream_filter_cleanup,
 	"convert.iconv.*"
 };
 
 /* {{{ php_iconv_stream_filter_create */
-static php_stream_filter *php_iconv_stream_filter_factory_create(const char *name, zval *params, uint8_t persistent)
+static php_stream_filter *php_iconv_stream_filter_factory_create(const char *name, zval *params, bool persistent)
 {
 	php_iconv_stream_filter *inst;
+	php_stream_filter_seekable_t write_seekable;
 	const char *from_charset = NULL, *to_charset = NULL;
 	size_t from_charset_len, to_charset_len;
 
+	if (php_stream_filter_parse_write_seek_mode(params, &write_seekable) == FAILURE) {
+		return NULL;
+	}
+
 	if ((from_charset = strchr(name, '.')) == NULL) {
 		return NULL;
 	}
@@ -2601,7 +2667,8 @@ static php_stream_filter *php_iconv_stream_filter_factory_create(const char *nam
 		return NULL;
 	}
 
-	return php_stream_filter_alloc(&php_iconv_stream_filter_ops, inst, persistent);
+	return php_stream_filter_alloc(&php_iconv_stream_filter_ops, inst, persistent,
+			PSFS_SEEKABLE_START, write_seekable);
 }
 /* }}} */
 
diff --git a/ext/iconv/php_iconv.h b/ext/iconv/php_iconv.h
index fcabdfaf6449..84a934e1e98b 100644
--- a/ext/iconv/php_iconv.h
+++ b/ext/iconv/php_iconv.h
@@ -1,14 +1,12 @@
 /*
    +----------------------------------------------------------------------+
-   | Copyright (c) The PHP Group                                          |
+   | Copyright © The PHP Group and Contributors.                          |
    +----------------------------------------------------------------------+
-   | This source file is subject to version 3.01 of the PHP license,      |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | https://www.php.net/license/3_01.txt                                 |
-   | If you did not receive a copy of the PHP license and are unable to   |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@php.net so we can mail you a copy immediately.               |
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Authors: Rui Hirokawa                        |
    |          Stig Bakken                                    |
diff --git a/ext/iconv/tests/gh17399.phpt b/ext/iconv/tests/gh17399.phpt
new file mode 100644
index 000000000000..b93fc638e84c
--- /dev/null
+++ b/ext/iconv/tests/gh17399.phpt
@@ -0,0 +1,13 @@
+--TEST--
+GH-17399 (iconv memory leak with large line-length in iconv_mime_encode)
+--EXTENSIONS--
+iconv
+--FILE--
+ PHP_INT_MAX,
+];
+iconv_mime_encode('Subject', 'test', $options);
+?>
+--EXPECTF--
+Fatal error: Allowed memory size of %d bytes exhausted %s in %s on line %d
diff --git a/ext/iconv/tests/gh17399_iconv.phpt b/ext/iconv/tests/gh17399_iconv.phpt
new file mode 100644
index 000000000000..2cdd0e176b20
--- /dev/null
+++ b/ext/iconv/tests/gh17399_iconv.phpt
@@ -0,0 +1,13 @@
+--TEST--
+GH-17399 (iconv() leak on bailout)
+--EXTENSIONS--
+iconv
+--INI--
+memory_limit=2M
+--FILE--
+
+--EXPECTF--
+Fatal error: Allowed memory size of %d bytes exhausted %s in %s on line %d
diff --git a/ext/iconv/tests/gh17399_mime_decode.phpt b/ext/iconv/tests/gh17399_mime_decode.phpt
new file mode 100644
index 000000000000..95a37d364f33
--- /dev/null
+++ b/ext/iconv/tests/gh17399_mime_decode.phpt
@@ -0,0 +1,13 @@
+--TEST--
+GH-17399 (iconv_mime_decode() leak on bailout)
+--EXTENSIONS--
+iconv
+--INI--
+memory_limit=2M
+--FILE--
+
+--EXPECTF--
+Fatal error: Allowed memory size of %d bytes exhausted %s in %s on line %d
diff --git a/ext/iconv/tests/gh17399_substr.phpt b/ext/iconv/tests/gh17399_substr.phpt
new file mode 100644
index 000000000000..12d4cff28eac
--- /dev/null
+++ b/ext/iconv/tests/gh17399_substr.phpt
@@ -0,0 +1,17 @@
+--TEST--
+GH-17399 (iconv_substr() leak on bailout)
+--EXTENSIONS--
+iconv
+--INI--
+memory_limit=2M
+--SKIPIF--
+
+--FILE--
+
+--EXPECTF--
+Fatal error: Allowed memory size of %d bytes exhausted %s in %s on line %d
diff --git a/ext/iconv/tests/gh21664.phpt b/ext/iconv/tests/gh21664.phpt
new file mode 100644
index 000000000000..92c66049c8dd
--- /dev/null
+++ b/ext/iconv/tests/gh21664.phpt
@@ -0,0 +1,21 @@
+--TEST--
+GH-21664 (iconv_mime_decode/iconv_mime_encode bailout corruption)
+--EXTENSIONS--
+iconv
+--FILE--
+ "UTF-8", "output-charset" => "UTF-8"]);
+var_dump($r);
+
+echo "Done\n";
+?>
+--EXPECTF--
+Notice: iconv_mime_decode(): Detected an illegal character in input string in %s on line %d
+bool(false)
+
+Notice: iconv_mime_encode(): Detected an illegal character in input string in %s on line %d
+bool(false)
+Done
diff --git a/ext/iconv/tests/iconv_stream_filter_seek.phpt b/ext/iconv/tests/iconv_stream_filter_seek.phpt
new file mode 100644
index 000000000000..97519ec7853d
--- /dev/null
+++ b/ext/iconv/tests/iconv_stream_filter_seek.phpt
@@ -0,0 +1,43 @@
+--TEST--
+iconv stream filter with seek to start
+--EXTENSIONS--
+iconv
+--FILE--
+
+--CLEAN--
+
+--EXPECTF--
+First read (20 bytes): Hello, this is a tes
+Seek to start: SUCCESS
+Content after seek matches: YES
+
+Warning: fseek(): Stream filter convert.iconv.* is seekable only to start position in %s on line %d
+Seek to middle: FAILURE
diff --git a/ext/intl/ERROR_CONVENTIONS.md b/ext/intl/ERROR_CONVENTIONS.md
index 432862afd685..5c1b4eca86b8 100644
--- a/ext/intl/ERROR_CONVENTIONS.md
+++ b/ext/intl/ERROR_CONVENTIONS.md
@@ -6,14 +6,14 @@ conventions are enumerated in this document.
 * The last error is always stored globally.
 
 The global error code can be obtained in userland with `intl_get_error_code()`.
-This is a `U_*` error code defined by ICU, but it does not have necessarily to
-be returned obtained after a call to an ICU function. That is to say, the
+This is a `U_*` error code defined by ICU, but it is not necessarily obtained
+from a call to an ICU function. That is to say, the
 internal PHP wrapper functions can set these error codes when appropriate. For
 instance, in response to bad arguments (e.g. `zend_parse_parameters()` failure),
 the PHP wrapper function should set the global error code to
-`U_ILLEGAL_ARGUMENT_ERROR`).
+`U_ILLEGAL_ARGUMENT_ERROR`.
 
-The error code (an integer) can be converter to the corresponding enum name
+The error code (an integer) can be converted to the corresponding enum name
 string in userland with `intl_error_name()`.
 
 The associated message can be obtained with `intl_get_error_message()`. This is
@@ -40,7 +40,7 @@ no way to pass ownership of the string without it being copied.
   unless the error is due to bad arguments, in which case only the global error
   should be set.
 
-Objects store an intl_error structed in their private data. For instance:
+Objects store an intl_error in their private data. For instance:
 
 ```c
 typedef struct {
@@ -59,8 +59,8 @@ void intl_errors_set_code(intl_error* err, UErrorCode err_code);
 void intl_errors_set(intl_error* err, UErrorCode code, char* msg, int copyMsg);
 ```
 
-by passing a pointer to the object's `intl_error` structed as the first parameter.
-Node the extra `s` in the functions' names (`errors`, not `error`).
+by passing a pointer to the object's `intl_error` as the first parameter.
+Note the extra `s` in the functions' names (`errors`, not `error`).
 
 Static methods should only set the global error.
 
@@ -68,15 +68,15 @@ Static methods should only set the global error.
   `getErrorMessage()` methods.
 
 These methods are used to retrieve the error codes stored in the object's
-private `intl_error` structured and mirror the global `intl_get_error_code()`
+private `intl_error` structure and mirror the global `intl_get_error_code()`
 and `intl_get_error_message()`.
 
 * Intl methods and functions should return `FALSE` on error (even argument
   parsing errors), not `NULL`. Constructors and factory methods are the
   exception; these should return `NULL`, not `FALSE`.
 
-Note that constructors in Intl generally (always?) don't throws exceptions. They
-instead destroy the object to that the result of new `IntlClass()` can be
+Note that constructors in Intl generally (always?) do not throw exceptions. They
+instead destroy the object so that the result of new `IntlClass()` can be
 `NULL`. This may be surprising.
 
 * Intl functions and methods should reset the global error before doing anything
diff --git a/ext/intl/breakiterator/breakiterator_class.cpp b/ext/intl/breakiterator/breakiterator_class.cpp
index 4976d4ff675b..4d5793696cbb 100644
--- a/ext/intl/breakiterator/breakiterator_class.cpp
+++ b/ext/intl/breakiterator/breakiterator_class.cpp
@@ -1,12 +1,12 @@
 /*
    +----------------------------------------------------------------------+
-   | This source file is subject to version 3.01 of the PHP license,      |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | https://www.php.net/license/3_01.txt                                 |
-   | If you did not receive a copy of the PHP license and are unable to   |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@php.net so we can mail you a copy immediately.               |
+   | Copyright © The PHP Group and Contributors.                          |
+   +----------------------------------------------------------------------+
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Authors: Gustavo Lopes                           |
    +----------------------------------------------------------------------+
@@ -96,7 +96,7 @@ static int BreakIterator_compare_objects(zval *object1,
 /* {{{ clone handler for BreakIterator */
 static zend_object *BreakIterator_clone_obj(zend_object *object)
 {
-	BreakIterator_object *bio_orig = php_intl_breakiterator_fetch_object(object);
+	const BreakIterator_object *bio_orig = php_intl_breakiterator_fetch_object(object);
 	zend_object *ret_val           = BreakIterator_ce_ptr->create_object(object->ce);
 	BreakIterator_object *bio_new  = php_intl_breakiterator_fetch_object(ret_val);
 
@@ -212,7 +212,7 @@ U_CFUNC void breakiterator_register_BreakIterator_class(void)
 
 	memcpy(&BreakIterator_handlers, &std_object_handlers,
 		sizeof BreakIterator_handlers);
-	BreakIterator_handlers.offset = XtOffsetOf(BreakIterator_object, zo);
+	BreakIterator_handlers.offset = offsetof(BreakIterator_object, zo);
 	BreakIterator_handlers.compare = BreakIterator_compare_objects;
 	BreakIterator_handlers.clone_obj = BreakIterator_clone_obj;
 	BreakIterator_handlers.get_debug_info = BreakIterator_get_debug_info;
diff --git a/ext/intl/breakiterator/breakiterator_class.h b/ext/intl/breakiterator/breakiterator_class.h
index 0852d86e2a82..cb4f072139ec 100644
--- a/ext/intl/breakiterator/breakiterator_class.h
+++ b/ext/intl/breakiterator/breakiterator_class.h
@@ -1,12 +1,12 @@
 /*
    +----------------------------------------------------------------------+
-   | This source file is subject to version 3.01 of the PHP license,      |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | https://www.php.net/license/3_01.txt                                 |
-   | If you did not receive a copy of the PHP license and are unable to   |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@php.net so we can mail you a copy immediately.               |
+   | Copyright © The PHP Group and Contributors.                          |
+   +----------------------------------------------------------------------+
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Authors: Gustavo Lopes                           |
    +----------------------------------------------------------------------+
@@ -41,9 +41,7 @@ typedef struct {
 	zend_object	zo;
 } BreakIterator_object;
 
-static inline BreakIterator_object *php_intl_breakiterator_fetch_object(zend_object *obj) {
-	return (BreakIterator_object *)((char*)(obj) - XtOffsetOf(BreakIterator_object, zo));
-}
+#define php_intl_breakiterator_fetch_object(obj) ZEND_CONTAINER_OF(obj, BreakIterator_object, zo)
 #define Z_INTL_BREAKITERATOR_P(zv) php_intl_breakiterator_fetch_object(Z_OBJ_P(zv))
 
 #define BREAKITER_ERROR(bio)		(bio)->err
diff --git a/ext/intl/breakiterator/breakiterator_iterators.cpp b/ext/intl/breakiterator/breakiterator_iterators.cpp
index 34176bf90e52..805057489013 100644
--- a/ext/intl/breakiterator/breakiterator_iterators.cpp
+++ b/ext/intl/breakiterator/breakiterator_iterators.cpp
@@ -1,12 +1,12 @@
 /*
    +----------------------------------------------------------------------+
-   | This source file is subject to version 3.01 of the PHP license,      |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | https://www.php.net/license/3_01.txt                                 |
-   | If you did not receive a copy of the PHP license and are unable to   |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@php.net so we can mail you a copy immediately.               |
+   | Copyright © The PHP Group and Contributors.                          |
+   +----------------------------------------------------------------------+
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Authors: Gustavo Lopes                           |
    +----------------------------------------------------------------------+
diff --git a/ext/intl/breakiterator/breakiterator_iterators.h b/ext/intl/breakiterator/breakiterator_iterators.h
index e52d066ac9ed..3ac07cd271c8 100644
--- a/ext/intl/breakiterator/breakiterator_iterators.h
+++ b/ext/intl/breakiterator/breakiterator_iterators.h
@@ -1,12 +1,12 @@
 /*
    +----------------------------------------------------------------------+
-   | This source file is subject to version 3.01 of the PHP license,      |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | https://www.php.net/license/3_01.txt                                 |
-   | If you did not receive a copy of the PHP license and are unable to   |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@php.net so we can mail you a copy immediately.               |
+   | Copyright © The PHP Group and Contributors.                          |
+   +----------------------------------------------------------------------+
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Authors: Gustavo Lopes                           |
    +----------------------------------------------------------------------+
diff --git a/ext/intl/breakiterator/breakiterator_methods.cpp b/ext/intl/breakiterator/breakiterator_methods.cpp
index c9791d4b23ae..66a35e65ac6a 100644
--- a/ext/intl/breakiterator/breakiterator_methods.cpp
+++ b/ext/intl/breakiterator/breakiterator_methods.cpp
@@ -1,12 +1,12 @@
 /*
    +----------------------------------------------------------------------+
-   | This source file is subject to version 3.01 of the PHP license,      |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | https://www.php.net/license/3_01.txt                                 |
-   | If you did not receive a copy of the PHP license and are unable to   |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@php.net so we can mail you a copy immediately.               |
+   | Copyright © The PHP Group and Contributors.                          |
+   +----------------------------------------------------------------------+
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Authors: Gustavo Lopes                           |
    +----------------------------------------------------------------------+
@@ -297,11 +297,9 @@ U_CFUNC PHP_METHOD(IntlBreakIterator, getLocale)
 		Z_PARAM_LONG(locale_type)
 	ZEND_PARSE_PARAMETERS_END();
 
-	/* TODO: Change to ValueError? */
 	if (locale_type != ULOC_ACTUAL_LOCALE && locale_type != ULOC_VALID_LOCALE) {
-		intl_error_set(NULL, U_ILLEGAL_ARGUMENT_ERROR,
-			"invalid locale type");
-		RETURN_FALSE;
+		zend_argument_value_error(1, "must be either Locale::ACTUAL_LOCALE or Locale::VALID_LOCALE");
+		RETURN_THROWS();
 	}
 
 	BREAKITER_METHOD_FETCH_OBJECT;
diff --git a/ext/intl/breakiterator/codepointiterator_internal.cpp b/ext/intl/breakiterator/codepointiterator_internal.cpp
index 3982a599af38..47d5df00c1be 100644
--- a/ext/intl/breakiterator/codepointiterator_internal.cpp
+++ b/ext/intl/breakiterator/codepointiterator_internal.cpp
@@ -1,12 +1,12 @@
 /*
    +----------------------------------------------------------------------+
-   | This source file is subject to version 3.01 of the PHP license,      |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | https://www.php.net/license/3_01.txt                                 |
-   | If you did not receive a copy of the PHP license and are unable to   |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@php.net so we can mail you a copy immediately.               |
+   | Copyright © The PHP Group and Contributors.                          |
+   +----------------------------------------------------------------------+
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Authors: Gustavo Lopes                           |
    +----------------------------------------------------------------------+
diff --git a/ext/intl/breakiterator/codepointiterator_internal.h b/ext/intl/breakiterator/codepointiterator_internal.h
index 8090bfbbd3cc..a64d49e24d5e 100644
--- a/ext/intl/breakiterator/codepointiterator_internal.h
+++ b/ext/intl/breakiterator/codepointiterator_internal.h
@@ -1,12 +1,12 @@
 /*
    +----------------------------------------------------------------------+
-   | This source file is subject to version 3.01 of the PHP license,      |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | https://www.php.net/license/3_01.txt                                 |
-   | If you did not receive a copy of the PHP license and are unable to   |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@php.net so we can mail you a copy immediately.               |
+   | Copyright © The PHP Group and Contributors.                          |
+   +----------------------------------------------------------------------+
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Authors: Gustavo Lopes                           |
    +----------------------------------------------------------------------+
diff --git a/ext/intl/breakiterator/codepointiterator_methods.cpp b/ext/intl/breakiterator/codepointiterator_methods.cpp
index 49beb41be4e9..3b5044cb45a1 100644
--- a/ext/intl/breakiterator/codepointiterator_methods.cpp
+++ b/ext/intl/breakiterator/codepointiterator_methods.cpp
@@ -1,12 +1,12 @@
 /*
    +----------------------------------------------------------------------+
-   | This source file is subject to version 3.01 of the PHP license,      |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | https://www.php.net/license/3_01.txt                                 |
-   | If you did not receive a copy of the PHP license and are unable to   |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@php.net so we can mail you a copy immediately.               |
+   | Copyright © The PHP Group and Contributors.                          |
+   +----------------------------------------------------------------------+
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Authors: Gustavo Lopes                           |
    +----------------------------------------------------------------------+
diff --git a/ext/intl/breakiterator/rulebasedbreakiterator_methods.cpp b/ext/intl/breakiterator/rulebasedbreakiterator_methods.cpp
index a7c322b1d816..1e1c2f0f6e5c 100644
--- a/ext/intl/breakiterator/rulebasedbreakiterator_methods.cpp
+++ b/ext/intl/breakiterator/rulebasedbreakiterator_methods.cpp
@@ -1,12 +1,12 @@
 /*
    +----------------------------------------------------------------------+
-   | This source file is subject to version 3.01 of the PHP license,      |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | https://www.php.net/license/3_01.txt                                 |
-   | If you did not receive a copy of the PHP license and are unable to   |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@php.net so we can mail you a copy immediately.               |
+   | Copyright © The PHP Group and Contributors.                          |
+   +----------------------------------------------------------------------+
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Authors: Gustavo Lopes                           |
    +----------------------------------------------------------------------+
diff --git a/ext/intl/calendar/calendar_class.cpp b/ext/intl/calendar/calendar_class.cpp
index 326b5475b73a..63b203d08d44 100644
--- a/ext/intl/calendar/calendar_class.cpp
+++ b/ext/intl/calendar/calendar_class.cpp
@@ -1,12 +1,12 @@
 /*
    +----------------------------------------------------------------------+
-   | This source file is subject to version 3.01 of the PHP license,      |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | https://www.php.net/license/3_01.txt                                 |
-   | If you did not receive a copy of the PHP license and are unable to   |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@php.net so we can mail you a copy immediately.               |
+   | Copyright © The PHP Group and Contributors.                          |
+   +----------------------------------------------------------------------+
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Authors: Gustavo Lopes                           |
    +----------------------------------------------------------------------+
@@ -77,7 +77,7 @@ U_CFUNC void calendar_object_construct(zval *object,
 /* {{{ clone handler for Calendar */
 static zend_object *Calendar_clone_obj(zend_object *object)
 {
-	Calendar_object *co_orig = php_intl_calendar_fetch_object(object);
+	const Calendar_object *co_orig = php_intl_calendar_fetch_object(object);
 	zend_object     *ret_val = Calendar_ce_ptr->create_object(object->ce);
 	Calendar_object  *co_new = php_intl_calendar_fetch_object(ret_val);
 
@@ -256,7 +256,7 @@ void calendar_register_IntlCalendar_class(void)
 
 	memcpy( &Calendar_handlers, &std_object_handlers,
 		sizeof Calendar_handlers);
-	Calendar_handlers.offset = XtOffsetOf(Calendar_object, zo);
+	Calendar_handlers.offset = offsetof(Calendar_object, zo);
 	Calendar_handlers.clone_obj = Calendar_clone_obj;
 	Calendar_handlers.get_debug_info = Calendar_get_debug_info;
 	Calendar_handlers.free_obj = Calendar_objects_free;
diff --git a/ext/intl/calendar/calendar_class.h b/ext/intl/calendar/calendar_class.h
index 167bded8f31b..7c74aede9475 100644
--- a/ext/intl/calendar/calendar_class.h
+++ b/ext/intl/calendar/calendar_class.h
@@ -1,12 +1,12 @@
 /*
    +----------------------------------------------------------------------+
-   | This source file is subject to version 3.01 of the PHP license,      |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | https://www.php.net/license/3_01.txt                                 |
-   | If you did not receive a copy of the PHP license and are unable to   |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@php.net so we can mail you a copy immediately.               |
+   | Copyright © The PHP Group and Contributors.                          |
+   +----------------------------------------------------------------------+
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Authors: Gustavo Lopes                           |
    +----------------------------------------------------------------------+
@@ -38,9 +38,7 @@ typedef struct {
 	zend_object	zo;
 } Calendar_object;
 
-static inline Calendar_object *php_intl_calendar_fetch_object(zend_object *obj) {
-	return (Calendar_object *)((char*)(obj) - XtOffsetOf(Calendar_object, zo));
-}
+#define php_intl_calendar_fetch_object(obj) ZEND_CONTAINER_OF(obj, Calendar_object, zo)
 #define Z_INTL_CALENDAR_P(zv) php_intl_calendar_fetch_object(Z_OBJ_P(zv))
 
 #define CALENDAR_ERROR(co)		(co)->err
diff --git a/ext/intl/calendar/calendar_methods.cpp b/ext/intl/calendar/calendar_methods.cpp
index c404286fe094..fe4749d6d62d 100644
--- a/ext/intl/calendar/calendar_methods.cpp
+++ b/ext/intl/calendar/calendar_methods.cpp
@@ -1,12 +1,12 @@
 /*
    +----------------------------------------------------------------------+
-   | This source file is subject to version 3.01 of the PHP license,      |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | https://www.php.net/license/3_01.txt                                 |
-   | If you did not receive a copy of the PHP license and are unable to   |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@php.net so we can mail you a copy immediately.               |
+   | Copyright © The PHP Group and Contributors.                          |
+   +----------------------------------------------------------------------+
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Authors: Gustavo Lopes                           |
    +----------------------------------------------------------------------+
@@ -85,7 +85,7 @@ U_CFUNC PHP_FUNCTION(intlcal_create_instance)
 		Z_PARAM_STRING_OR_NULL(locale_str, locale_len)
 	ZEND_PARSE_PARAMETERS_END();
 
-	TimeZone *timeZone = timezone_process_timezone_argument(timezone_object, timezone_string, nullptr);
+	TimeZone *timeZone = timezone_process_timezone_argument(timezone_object, timezone_string, nullptr, 1);
 	if (timeZone == nullptr) {
 		RETURN_NULL();
 	}
@@ -203,7 +203,7 @@ U_CFUNC PHP_FUNCTION(intlcal_get_available_locales)
 
 	int32_t count;
 	const Locale *availLocales = Calendar::getAvailableLocales(count);
-	array_init(return_value);
+	array_init_size(return_value, count);
 	for (int i = 0; i < count; i++) {
 		Locale locale = availLocales[i];
 		add_next_index_string(return_value, locale.getName());
@@ -316,7 +316,7 @@ U_CFUNC PHP_FUNCTION(intlcal_set_time_zone)
 	}
 
 	TimeZone *timeZone = timezone_process_timezone_argument(
-		timezone_object, timezone_string, CALENDAR_ERROR_P(co));
+		timezone_object, timezone_string, CALENDAR_ERROR_P(co), 2);
 	if (timeZone == nullptr) {
 		RETURN_FALSE;
 	}
@@ -345,7 +345,7 @@ U_CFUNC PHP_METHOD(IntlCalendar, setTimeZone)
 	}
 
 	TimeZone *timeZone = timezone_process_timezone_argument(
-		timezone_object, timezone_string, CALENDAR_ERROR_P(co));
+		timezone_object, timezone_string, CALENDAR_ERROR_P(co), 1);
 	if (timeZone == nullptr) {
 		RETURN_FALSE;
 	}
@@ -373,7 +373,7 @@ static void _php_intlcal_before_after(
 
 	when_co = Z_INTL_CALENDAR_P(when_object);
 	if (when_co->ucal == NULL) {
-		zend_argument_error(NULL, 2, "is uninitialized");
+		zend_argument_error(NULL, hasThis() ? 1 : 2, "is uninitialized");
 		RETURN_THROWS();
 	}
 
@@ -419,8 +419,8 @@ U_CFUNC PHP_FUNCTION(intlcal_set)
 	}
 
 	for (int i = 0; i < arg_num; i++) {
-		/* Arguments start at 1 */
-		ZEND_VALUE_ERROR_OUT_OF_BOUND_VALUE(args[i], i + 1);
+		/* Count from intlcal_set($calendar, ...), so date/time arguments start at #2. */
+		ZEND_VALUE_ERROR_OUT_OF_BOUND_VALUE(args[i], i + 2);
 	}
 
 	CALENDAR_METHOD_FETCH_OBJECT;
@@ -455,9 +455,10 @@ U_CFUNC PHP_METHOD(IntlCalendar, setDate)
 		RETURN_THROWS();
 	}
 
-	ZEND_VALUE_ERROR_OUT_OF_BOUND_VALUE(year, 1);
-	ZEND_VALUE_ERROR_OUT_OF_BOUND_VALUE(month, 2);
-	ZEND_VALUE_ERROR_OUT_OF_BOUND_VALUE(day, 3);
+	/* These method-only APIs parse the object first, so the API argument positions are offset by +1. */
+	ZEND_VALUE_ERROR_OUT_OF_BOUND_VALUE(year, 2);
+	ZEND_VALUE_ERROR_OUT_OF_BOUND_VALUE(month, 3);
+	ZEND_VALUE_ERROR_OUT_OF_BOUND_VALUE(day, 4);
 
 	CALENDAR_METHOD_FETCH_OBJECT;
 
@@ -478,18 +479,19 @@ U_CFUNC PHP_METHOD(IntlCalendar, setDateTime)
 		RETURN_THROWS();
 	}
 
-	ZEND_VALUE_ERROR_OUT_OF_BOUND_VALUE(year, 1);
-	ZEND_VALUE_ERROR_OUT_OF_BOUND_VALUE(month, 2);
-	ZEND_VALUE_ERROR_OUT_OF_BOUND_VALUE(day, 3);
-	ZEND_VALUE_ERROR_OUT_OF_BOUND_VALUE(hour, 4);
-	ZEND_VALUE_ERROR_OUT_OF_BOUND_VALUE(minute, 5);
+	/* These method-only APIs parse the object first, so the API argument positions are offset by +1. */
+	ZEND_VALUE_ERROR_OUT_OF_BOUND_VALUE(year, 2);
+	ZEND_VALUE_ERROR_OUT_OF_BOUND_VALUE(month, 3);
+	ZEND_VALUE_ERROR_OUT_OF_BOUND_VALUE(day, 4);
+	ZEND_VALUE_ERROR_OUT_OF_BOUND_VALUE(hour, 5);
+	ZEND_VALUE_ERROR_OUT_OF_BOUND_VALUE(minute, 6);
 
 	CALENDAR_METHOD_FETCH_OBJECT;
 
 	if (second_is_null) {
 		co->ucal->set((int32_t) year, (int32_t) month, (int32_t) day, (int32_t) hour, (int32_t) minute);
 	} else {
-		ZEND_VALUE_ERROR_OUT_OF_BOUND_VALUE(second, 6);
+		ZEND_VALUE_ERROR_OUT_OF_BOUND_VALUE(second, 7);
 		co->ucal->set((int32_t) year, (int32_t) month, (int32_t) day, (int32_t) hour, (int32_t) minute, (int32_t) second);
 	}
 }
@@ -794,7 +796,7 @@ U_CFUNC PHP_FUNCTION(intlcal_is_equivalent_to)
 
 	other_co = Z_INTL_CALENDAR_P(other_object);
 	if (other_co->ucal == NULL) {
-		zend_argument_error(NULL, 2, "is uninitialized");
+		zend_argument_error(NULL, hasThis() ? 1 : 2, "is uninitialized");
 		RETURN_THROWS();
 	}
 
@@ -931,7 +933,7 @@ U_CFUNC PHP_FUNCTION(intlcal_equals)
 	CALENDAR_METHOD_FETCH_OBJECT;
 	other_co = Z_INTL_CALENDAR_P(other_object);
 	if (other_co->ucal == NULL) {
-		zend_argument_error(NULL, 2, "is uninitialized");
+		zend_argument_error(NULL, hasThis() ? 1 : 2, "is uninitialized");
 		RETURN_THROWS();
 	}
 
diff --git a/ext/intl/calendar/gregoriancalendar_methods.cpp b/ext/intl/calendar/gregoriancalendar_methods.cpp
index 0cc3a94d4c56..aeb728e29de1 100644
--- a/ext/intl/calendar/gregoriancalendar_methods.cpp
+++ b/ext/intl/calendar/gregoriancalendar_methods.cpp
@@ -1,12 +1,12 @@
 /*
    +----------------------------------------------------------------------+
-   | This source file is subject to version 3.01 of the PHP license,      |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | https://www.php.net/license/3_01.txt                                 |
-   | If you did not receive a copy of the PHP license and are unable to   |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@php.net so we can mail you a copy immediately.               |
+   | Copyright © The PHP Group and Contributors.                          |
+   +----------------------------------------------------------------------+
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Authors: Gustavo Lopes                           |
    +----------------------------------------------------------------------+
@@ -143,7 +143,7 @@ static void _php_intlgregcal_constructor_body(INTERNAL_FUNCTION_PARAMETERS, bool
 
 	if (variant <= 2) {
 		// From timezone and locale (0 to 2 arguments)
-		TimeZone *tz = timezone_process_timezone_argument(timezone_object, timezone_string, nullptr);
+		TimeZone *tz = timezone_process_timezone_argument(timezone_object, timezone_string, nullptr, 1);
 		if (tz == nullptr) {
 			// TODO: Exception should always occur already?
 			if (!EG(exception)) {
@@ -176,7 +176,7 @@ static void _php_intlgregcal_constructor_body(INTERNAL_FUNCTION_PARAMETERS, bool
 		// From date/time (3, 5 or 6 arguments)
 		GregorianCalendar *tmp;
 		for (int i = 0; i < variant; i++) {
-			ZEND_VALUE_ERROR_OUT_OF_BOUND_VALUE(largs[i], hasThis() ? (i-1) : i);
+			ZEND_VALUE_ERROR_OUT_OF_BOUND_VALUE(largs[i], i + 1);
 		}
 
 		if (variant == 3) {
diff --git a/ext/intl/collator/collator.h b/ext/intl/collator/collator.h
index e92429f51179..959da9063e09 100644
--- a/ext/intl/collator/collator.h
+++ b/ext/intl/collator/collator.h
@@ -1,12 +1,12 @@
 /*
    +----------------------------------------------------------------------+
-   | This source file is subject to version 3.01 of the PHP license,      |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | https://www.php.net/license/3_01.txt                                 |
-   | If you did not receive a copy of the PHP license and are unable to   |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@php.net so we can mail you a copy immediately.               |
+   | Copyright © The PHP Group and Contributors.                          |
+   +----------------------------------------------------------------------+
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Authors: Vadim Savchuk                   |
    |          Dmitry Lakhtyuk                |
diff --git a/ext/intl/collator/collator_attr.cpp b/ext/intl/collator/collator_attr.cpp
index f56596deb6b0..14b8abf497b4 100644
--- a/ext/intl/collator/collator_attr.cpp
+++ b/ext/intl/collator/collator_attr.cpp
@@ -1,12 +1,12 @@
 /*
    +----------------------------------------------------------------------+
-   | This source file is subject to version 3.01 of the PHP license,      |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | https://www.php.net/license/3_01.txt                                 |
-   | If you did not receive a copy of the PHP license and are unable to   |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@php.net so we can mail you a copy immediately.               |
+   | Copyright © The PHP Group and Contributors.                          |
+   +----------------------------------------------------------------------+
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Authors: Vadim Savchuk                   |
    |          Dmitry Lakhtyuk                |
diff --git a/ext/intl/collator/collator_class.cpp b/ext/intl/collator/collator_class.cpp
index 293a089c2679..4fd991bd156c 100644
--- a/ext/intl/collator/collator_class.cpp
+++ b/ext/intl/collator/collator_class.cpp
@@ -1,12 +1,12 @@
 /*
    +----------------------------------------------------------------------+
-   | This source file is subject to version 3.01 of the PHP license,      |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | https://www.php.net/license/3_01.txt                                 |
-   | If you did not receive a copy of the PHP license and are unable to   |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@php.net so we can mail you a copy immediately.               |
+   | Copyright © The PHP Group and Contributors.                          |
+   +----------------------------------------------------------------------+
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Authors: Vadim Savchuk                   |
    |          Dmitry Lakhtyuk                |
@@ -76,7 +76,7 @@ U_CFUNC void collator_register_Collator_symbols(int module_number)
 		sizeof Collator_handlers);
 	/* Collator has no usable clone semantics - ucol_cloneBinary/ucol_openBinary require binary buffer
 	   for which we don't have the place to keep */
-	Collator_handlers.offset = XtOffsetOf(Collator_object, zo);
+	Collator_handlers.offset = offsetof(Collator_object, zo);
 	Collator_handlers.clone_obj = nullptr;
 	Collator_handlers.free_obj = Collator_objects_free;
 }
diff --git a/ext/intl/collator/collator_class.h b/ext/intl/collator/collator_class.h
index a281b2bec8ad..637d5dc490ae 100644
--- a/ext/intl/collator/collator_class.h
+++ b/ext/intl/collator/collator_class.h
@@ -1,12 +1,12 @@
 /*
    +----------------------------------------------------------------------+
-   | This source file is subject to version 3.01 of the PHP license,      |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | https://www.php.net/license/3_01.txt                                 |
-   | If you did not receive a copy of the PHP license and are unable to   |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@php.net so we can mail you a copy immediately.               |
+   | Copyright © The PHP Group and Contributors.                          |
+   +----------------------------------------------------------------------+
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Authors: Vadim Savchuk                   |
    |          Dmitry Lakhtyuk                |
@@ -47,9 +47,7 @@ typedef struct {
 #define COLLATOR_ERROR_CODE(co)   INTL_ERROR_CODE(COLLATOR_ERROR(co))
 #define COLLATOR_ERROR_CODE_P(co) &(INTL_ERROR_CODE(COLLATOR_ERROR(co)))
 
-static inline Collator_object *php_intl_collator_fetch_object(zend_object *obj) {
-	return (Collator_object *)((char*)(obj) - XtOffsetOf(Collator_object, zo));
-}
+#define php_intl_collator_fetch_object(obj) ZEND_CONTAINER_OF(obj, Collator_object, zo)
 #define Z_INTL_COLLATOR_P(zv) php_intl_collator_fetch_object(Z_OBJ_P(zv))
 
 #ifdef __cplusplus
diff --git a/ext/intl/collator/collator_compare.cpp b/ext/intl/collator/collator_compare.cpp
index 38e283a6d853..bac0bbf50b21 100644
--- a/ext/intl/collator/collator_compare.cpp
+++ b/ext/intl/collator/collator_compare.cpp
@@ -1,12 +1,12 @@
 /*
    +----------------------------------------------------------------------+
-   | This source file is subject to version 3.01 of the PHP license,      |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | https://www.php.net/license/3_01.txt                                 |
-   | If you did not receive a copy of the PHP license and are unable to   |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@php.net so we can mail you a copy immediately.               |
+   | Copyright © The PHP Group and Contributors.                          |
+   +----------------------------------------------------------------------+
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Authors: Vadim Savchuk                   |
    |          Dmitry Lakhtyuk                |
diff --git a/ext/intl/collator/collator_convert.cpp b/ext/intl/collator/collator_convert.cpp
index d4de15aa0b82..dd3360a69092 100644
--- a/ext/intl/collator/collator_convert.cpp
+++ b/ext/intl/collator/collator_convert.cpp
@@ -1,12 +1,12 @@
 /*
    +----------------------------------------------------------------------+
-   | This source file is subject to version 3.01 of the PHP license,      |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | https://www.php.net/license/3_01.txt                                 |
-   | If you did not receive a copy of the PHP license and are unable to   |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@php.net so we can mail you a copy immediately.               |
+   | Copyright © The PHP Group and Contributors.                          |
+   +----------------------------------------------------------------------+
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Authors: Vadim Savchuk                   |
    |          Dmitry Lakhtyuk                |
@@ -289,7 +289,7 @@ U_CFUNC zval* collator_convert_string_to_double( zval* str, zval *rv )
 
 /* {{{ collator_convert_string_to_number_if_possible
  *
- * Convert string to numer.
+ * Convert string to number.
  *
  * @param  zval* str String to convert.
  *
diff --git a/ext/intl/collator/collator_convert.h b/ext/intl/collator/collator_convert.h
index 8c5356095b7a..1d65d9d2d76b 100644
--- a/ext/intl/collator/collator_convert.h
+++ b/ext/intl/collator/collator_convert.h
@@ -1,12 +1,12 @@
 /*
    +----------------------------------------------------------------------+
-   | This source file is subject to version 3.01 of the PHP license,      |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | https://www.php.net/license/3_01.txt                                 |
-   | If you did not receive a copy of the PHP license and are unable to   |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@php.net so we can mail you a copy immediately.               |
+   | Copyright © The PHP Group and Contributors.                          |
+   +----------------------------------------------------------------------+
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Authors: Vadim Savchuk                   |
    |          Dmitry Lakhtyuk                |
diff --git a/ext/intl/collator/collator_create.cpp b/ext/intl/collator/collator_create.cpp
index 59280bcdbed5..d2f16b67a26f 100644
--- a/ext/intl/collator/collator_create.cpp
+++ b/ext/intl/collator/collator_create.cpp
@@ -1,12 +1,12 @@
 /*
    +----------------------------------------------------------------------+
-   | This source file is subject to version 3.01 of the PHP license,      |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | https://www.php.net/license/3_01.txt                                 |
-   | If you did not receive a copy of the PHP license and are unable to   |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@php.net so we can mail you a copy immediately.               |
+   | Copyright © The PHP Group and Contributors.                          |
+   +----------------------------------------------------------------------+
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Authors: Vadim Savchuk                   |
    |          Dmitry Lakhtyuk                |
@@ -44,6 +44,10 @@ static int collator_ctor(INTERNAL_FUNCTION_PARAMETERS)
 
 	INTL_CHECK_LOCALE_LEN_OR_FAILURE(locale_len);
 	COLLATOR_METHOD_FETCH_OBJECT;
+	if (co->ucoll) {
+		zend_throw_error(NULL, "Collator object is already constructed");
+		return FAILURE;
+	}
 
 	if(locale_len == 0) {
 		locale = (char *)intl_locale_get_default();
diff --git a/ext/intl/collator/collator_error.cpp b/ext/intl/collator/collator_error.cpp
index aa333b5098a0..2a1eda8f9f36 100644
--- a/ext/intl/collator/collator_error.cpp
+++ b/ext/intl/collator/collator_error.cpp
@@ -1,12 +1,12 @@
 /*
    +----------------------------------------------------------------------+
-   | This source file is subject to version 3.01 of the PHP license,      |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | https://www.php.net/license/3_01.txt                                 |
-   | If you did not receive a copy of the PHP license and are unable to   |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@php.net so we can mail you a copy immediately.               |
+   | Copyright © The PHP Group and Contributors.                          |
+   +----------------------------------------------------------------------+
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Authors: Vadim Savchuk                   |
    |          Dmitry Lakhtyuk                |
diff --git a/ext/intl/collator/collator_is_numeric.cpp b/ext/intl/collator/collator_is_numeric.cpp
index b3cc52085dea..85a6eb695c0b 100644
--- a/ext/intl/collator/collator_is_numeric.cpp
+++ b/ext/intl/collator/collator_is_numeric.cpp
@@ -1,12 +1,12 @@
 /*
    +----------------------------------------------------------------------+
-   | This source file is subject to version 3.01 of the PHP license,      |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | https://www.php.net/license/3_01.txt                                 |
-   | If you did not receive a copy of the PHP license and are unable to   |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@php.net so we can mail you a copy immediately.               |
+   | Copyright © The PHP Group and Contributors.                          |
+   +----------------------------------------------------------------------+
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Authors: Vadim Savchuk                   |
    |          Dmitry Lakhtyuk                |
diff --git a/ext/intl/collator/collator_is_numeric.h b/ext/intl/collator/collator_is_numeric.h
index d30acd0b5843..e2f6ed83a178 100644
--- a/ext/intl/collator/collator_is_numeric.h
+++ b/ext/intl/collator/collator_is_numeric.h
@@ -1,12 +1,12 @@
 /*
    +----------------------------------------------------------------------+
-   | This source file is subject to version 3.01 of the PHP license,      |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | https://www.php.net/license/3_01.txt                                 |
-   | If you did not receive a copy of the PHP license and are unable to   |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@php.net so we can mail you a copy immediately.               |
+   | Copyright © The PHP Group and Contributors.                          |
+   +----------------------------------------------------------------------+
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Authors: Vadim Savchuk                   |
    |          Dmitry Lakhtyuk                |
diff --git a/ext/intl/collator/collator_locale.cpp b/ext/intl/collator/collator_locale.cpp
index 67b3d1342cc7..ea1393779846 100644
--- a/ext/intl/collator/collator_locale.cpp
+++ b/ext/intl/collator/collator_locale.cpp
@@ -1,12 +1,12 @@
 /*
    +----------------------------------------------------------------------+
-   | This source file is subject to version 3.01 of the PHP license,      |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | https://www.php.net/license/3_01.txt                                 |
-   | If you did not receive a copy of the PHP license and are unable to   |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@php.net so we can mail you a copy immediately.               |
+   | Copyright © The PHP Group and Contributors.                          |
+   +----------------------------------------------------------------------+
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Authors: Vadim Savchuk                   |
    |          Dmitry Lakhtyuk                |
diff --git a/ext/intl/collator/collator_sort.cpp b/ext/intl/collator/collator_sort.cpp
index 003d7f45a837..2b1122cb747a 100644
--- a/ext/intl/collator/collator_sort.cpp
+++ b/ext/intl/collator/collator_sort.cpp
@@ -1,12 +1,12 @@
 /*
    +----------------------------------------------------------------------+
-   | This source file is subject to version 3.01 of the PHP license,      |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | https://www.php.net/license/3_01.txt                                 |
-   | If you did not receive a copy of the PHP license and are unable to   |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@php.net so we can mail you a copy immediately.               |
+   | Copyright © The PHP Group and Contributors.                          |
+   +----------------------------------------------------------------------+
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Authors: Vadim Savchuk                   |
    |          Dmitry Lakhtyuk                |
@@ -380,7 +380,7 @@ U_CFUNC PHP_FUNCTION( collator_sort_with_sort_keys )
 	if( !hash || zend_hash_num_elements( hash ) == 0 )
 		RETURN_TRUE;
 
-	/* Create bufers */
+	/* Create buffers */
 	sortKeyBuf     = reinterpret_cast(ecalloc( sortKeyBufSize,     sizeof( char    ) ));
 	sortKeyIndxBuf = reinterpret_cast(ecalloc( sortKeyIndxBufSize, sizeof( uint8_t ) ));
 	utf16_buf      = eumalloc( utf16_buf_size );
diff --git a/ext/intl/collator/collator_sort.h b/ext/intl/collator/collator_sort.h
index 53abc1028a0e..6b4c5766da6b 100644
--- a/ext/intl/collator/collator_sort.h
+++ b/ext/intl/collator/collator_sort.h
@@ -1,12 +1,12 @@
 /*
    +----------------------------------------------------------------------+
-   | This source file is subject to version 3.01 of the PHP license,      |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | https://www.php.net/license/3_01.txt                                 |
-   | If you did not receive a copy of the PHP license and are unable to   |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@php.net so we can mail you a copy immediately.               |
+   | Copyright © The PHP Group and Contributors.                          |
+   +----------------------------------------------------------------------+
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Authors: Vadim Savchuk                   |
    |          Dmitry Lakhtyuk                |
diff --git a/ext/intl/common/common_date.cpp b/ext/intl/common/common_date.cpp
index f2ca077554b4..fb5ca6edaebe 100644
--- a/ext/intl/common/common_date.cpp
+++ b/ext/intl/common/common_date.cpp
@@ -1,12 +1,12 @@
 /*
    +----------------------------------------------------------------------+
-   | This source file is subject to version 3.01 of the PHP license,      |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | https://www.php.net/license/3_01.txt                                 |
-   | If you did not receive a copy of the PHP license and are unable to   |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@php.net so we can mail you a copy immediately.               |
+   | Copyright © The PHP Group and Contributors.                          |
+   +----------------------------------------------------------------------+
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Authors: Gustavo Lopes                           |
    +----------------------------------------------------------------------+
@@ -202,7 +202,6 @@ U_CFUNC double intl_zval_to_millis(zval *z, intl_error *err)
 				}
 			}
 		} else {
-			/* TODO: try with cast(), get() to obtain a number */
 			intl_errors_set(err, U_ILLEGAL_ARGUMENT_ERROR,
 				"invalid object type for date/time "
 				"(only IntlCalendar and DateTimeInterface permitted)");
diff --git a/ext/intl/common/common_date.h b/ext/intl/common/common_date.h
index 988f279294c3..a3a58eb3b037 100644
--- a/ext/intl/common/common_date.h
+++ b/ext/intl/common/common_date.h
@@ -1,12 +1,12 @@
 /*
    +----------------------------------------------------------------------+
-   | This source file is subject to version 3.01 of the PHP license,      |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | https://www.php.net/license/3_01.txt                                 |
-   | If you did not receive a copy of the PHP license and are unable to   |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@php.net so we can mail you a copy immediately.               |
+   | Copyright © The PHP Group and Contributors.                          |
+   +----------------------------------------------------------------------+
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Authors: Gustavo Lopes                           |
    +----------------------------------------------------------------------+
diff --git a/ext/intl/common/common_enum.cpp b/ext/intl/common/common_enum.cpp
index 8cf9796717f4..379561866941 100644
--- a/ext/intl/common/common_enum.cpp
+++ b/ext/intl/common/common_enum.cpp
@@ -1,12 +1,12 @@
 /*
    +----------------------------------------------------------------------+
-   | This source file is subject to version 3.01 of the PHP license,      |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | https://www.php.net/license/3_01.txt                                 |
-   | If you did not receive a copy of the PHP license and are unable to   |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@php.net so we can mail you a copy immediately.               |
+   | Copyright © The PHP Group and Contributors.                          |
+   +----------------------------------------------------------------------+
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Authors: Gustavo Lopes                           |
    +----------------------------------------------------------------------+
@@ -294,7 +294,7 @@ U_CFUNC void intl_register_common_symbols(int module_number)
 
 	memcpy(&IntlIterator_handlers, &std_object_handlers,
 		sizeof IntlIterator_handlers);
-	IntlIterator_handlers.offset = XtOffsetOf(IntlIterator_object, zo);
+	IntlIterator_handlers.offset = offsetof(IntlIterator_object, zo);
 	IntlIterator_handlers.clone_obj = NULL;
 	IntlIterator_handlers.dtor_obj = IntlIterator_objects_dtor;
 	IntlIterator_handlers.free_obj = IntlIterator_objects_free;
diff --git a/ext/intl/common/common_enum.h b/ext/intl/common/common_enum.h
index 6f0828528901..e4a8b5461df6 100644
--- a/ext/intl/common/common_enum.h
+++ b/ext/intl/common/common_enum.h
@@ -1,12 +1,12 @@
 /*
    +----------------------------------------------------------------------+
-   | This source file is subject to version 3.01 of the PHP license,      |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | https://www.php.net/license/3_01.txt                                 |
-   | If you did not receive a copy of the PHP license and are unable to   |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@php.net so we can mail you a copy immediately.               |
+   | Copyright © The PHP Group and Contributors.                          |
+   +----------------------------------------------------------------------+
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Authors: Vadim Savchuk                   |
    |          Dmitry Lakhtyuk                |
@@ -51,10 +51,7 @@ typedef struct {
 	zend_object				zo;
 } IntlIterator_object;
 
-
-static inline IntlIterator_object *php_intl_iterator_fetch_object(zend_object *obj) {
-	return (IntlIterator_object *)((char*)(obj) - XtOffsetOf(IntlIterator_object, zo));
-}
+#define php_intl_iterator_fetch_object(obj) ZEND_CONTAINER_OF(obj, IntlIterator_object, zo)
 #define Z_INTL_ITERATOR_P(zv) php_intl_iterator_fetch_object(Z_OBJ_P(zv))
 
 typedef struct {
diff --git a/ext/intl/common/common_error.cpp b/ext/intl/common/common_error.cpp
index cb12d8dff8f3..8d0cca52bb77 100644
--- a/ext/intl/common/common_error.cpp
+++ b/ext/intl/common/common_error.cpp
@@ -1,12 +1,12 @@
 /*
    +----------------------------------------------------------------------+
-   | This source file is subject to version 3.01 of the PHP license,      |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | https://www.php.net/license/3_01.txt                                 |
-   | If you did not receive a copy of the PHP license and are unable to   |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@php.net so we can mail you a copy immediately.               |
+   | Copyright © The PHP Group and Contributors.                          |
+   +----------------------------------------------------------------------+
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Authors: Vadim Savchuk                   |
    |          Dmitry Lakhtyuk                |
diff --git a/ext/intl/config.w32 b/ext/intl/config.w32
index da8285b50d0c..9e2f695532d3 100644
--- a/ext/intl/config.w32
+++ b/ext/intl/config.w32
@@ -92,13 +92,11 @@ if (PHP_INTL != "no") {
 				resourcebundle_iterator.cpp",
 				"intl");
 
-		if (CHECK_HEADER("unicode/uspoof.h", "CFLAGS_INTL")) {
-			ADD_SOURCES(configure_module_dirname + "/spoofchecker", "\
-					spoofchecker_class.cpp \
-					spoofchecker_create.cpp \
-					spoofchecker_main.cpp",
-					"intl");
-		}
+		ADD_SOURCES(configure_module_dirname + "/spoofchecker", "\
+				spoofchecker_class.cpp \
+				spoofchecker_create.cpp \
+				spoofchecker_main.cpp",
+				"intl");
 
 		ADD_SOURCES(configure_module_dirname + "/transliterator", "\
 				transliterator_class.cpp \
diff --git a/ext/intl/converter/converter.cpp b/ext/intl/converter/converter.cpp
index ad68909b5ea3..88f05136bbbd 100644
--- a/ext/intl/converter/converter.cpp
+++ b/ext/intl/converter/converter.cpp
@@ -1,12 +1,12 @@
 /*
    +----------------------------------------------------------------------+
-   | This source file is subject to version 3.01 of the PHP license,      |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | https://www.php.net/license/3_01.txt                                 |
-   | If you did not receive a copy of the PHP license and are unable to   |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@php.net so we can mail you a copy immediately.               |
+   | Copyright © The PHP Group and Contributors.                          |
+   +----------------------------------------------------------------------+
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Authors: Sara Golemon                               |
    +----------------------------------------------------------------------+
@@ -37,7 +37,7 @@ typedef struct _php_converter_object {
 
 
 static inline php_converter_object *php_converter_fetch_object(zend_object *obj) {
-	return (php_converter_object *)((char*)(obj) - XtOffsetOf(php_converter_object, obj));
+	return (php_converter_object *)((char*)(obj) - offsetof(php_converter_object, obj));
 }
 #define Z_INTL_CONVERTER_P(zv) php_converter_fetch_object(Z_OBJ_P(zv))
 
@@ -167,9 +167,9 @@ static void php_converter_append_toUnicode_target(zval *val, UConverterToUnicode
 			if (lval > 0xFFFF) {
 				/* Supplemental planes U+010000 - U+10FFFF */
 				if (TARGET_CHECK(args, 2)) {
-					/* TODO: Find the ICU call which does this properly */
-					*(args->target++) = (UChar)(((lval - 0x10000) >> 10)   | 0xD800);
-					*(args->target++) = (UChar)(((lval - 0x10000) & 0x3FF) | 0xDC00);
+					int32_t offset = 0;
+					U16_APPEND_UNSAFE(args->target, offset, lval);
+					args->target += offset;
 				}
 				return;
 			}
@@ -682,6 +682,16 @@ static zend_string* php_converter_do_convert(UConverter *dest_cnv,
 }
 /* }}} */
 
+static void php_converter_set_subst_chars(UConverter *cnv, zend_string *subst, UErrorCode *error)
+{
+	if (ZSTR_LEN(subst) > SCHAR_MAX) {
+		*error = U_ILLEGAL_ARGUMENT_ERROR;
+		return;
+	}
+
+	ucnv_setSubstChars(cnv, ZSTR_VAL(subst), (int8_t) ZSTR_LEN(subst), error);
+}
+
 /* {{{ */
 #define UCNV_REASON_CASE(v) case (UCNV_ ## v) : RETURN_STRINGL( "REASON_" #v , sizeof( "REASON_" #v ) - 1);
 PHP_METHOD(UConverter, reasonText) {
@@ -761,13 +771,13 @@ PHP_METHOD(UConverter, transcode) {
 				(tmpzval = zend_hash_str_find_deref(Z_ARRVAL_P(options), "from_subst", sizeof("from_subst") - 1)) != NULL &&
 				Z_TYPE_P(tmpzval) == IS_STRING) {
 				error = U_ZERO_ERROR;
-				ucnv_setSubstChars(src_cnv, Z_STRVAL_P(tmpzval), Z_STRLEN_P(tmpzval) & 0x7F, &error);
+				php_converter_set_subst_chars(src_cnv, Z_STR_P(tmpzval), &error);
 			}
 			if (U_SUCCESS(error) &&
 				(tmpzval = zend_hash_str_find_deref(Z_ARRVAL_P(options), "to_subst", sizeof("to_subst") - 1)) != NULL &&
 				Z_TYPE_P(tmpzval) == IS_STRING) {
 				error = U_ZERO_ERROR;
-				ucnv_setSubstChars(dest_cnv, Z_STRVAL_P(tmpzval), Z_STRLEN_P(tmpzval) & 0x7F, &error);
+				php_converter_set_subst_chars(dest_cnv, Z_STR_P(tmpzval), &error);
 			}
 		}
 
@@ -934,7 +944,8 @@ static zend_object *php_converter_create_object(zend_class_entry *ce) {
 }
 
 static zend_object *php_converter_clone_object(zend_object *object) {
-	php_converter_object *objval, *oldobj = php_converter_fetch_object(object);
+	const php_converter_object *oldobj = php_converter_fetch_object(object);
+	php_converter_object *objval;
 	zend_object *retval = php_converter_object_ctor(object->ce, &objval);
 	UErrorCode error = U_ZERO_ERROR;
 
@@ -975,7 +986,7 @@ U_CFUNC int php_converter_minit(INIT_FUNC_ARGS) {
 	php_converter_ce->create_object = php_converter_create_object;
 	php_converter_ce->default_object_handlers = &php_converter_object_handlers;
 	memcpy(&php_converter_object_handlers, &std_object_handlers, sizeof(zend_object_handlers));
-	php_converter_object_handlers.offset = XtOffsetOf(php_converter_object, obj);
+	php_converter_object_handlers.offset = offsetof(php_converter_object, obj);
 	php_converter_object_handlers.clone_obj = php_converter_clone_object;
 	php_converter_object_handlers.free_obj = php_converter_free_object;
 
diff --git a/ext/intl/converter/converter.h b/ext/intl/converter/converter.h
index 5d779560811d..60967d196723 100644
--- a/ext/intl/converter/converter.h
+++ b/ext/intl/converter/converter.h
@@ -1,12 +1,12 @@
 /*
  +----------------------------------------------------------------------+
- | This source file is subject to version 3.01 of the PHP license,      |
- | that is bundled with this package in the file LICENSE, and is        |
- | available through the world-wide-web at the following url:           |
- | https://www.php.net/license/3_01.txt                                 |
- | If you did not receive a copy of the PHP license and are unable to   |
- | obtain it through the world-wide-web, please send a note to          |
- | license@php.net so we can mail you a copy immediately.               |
+ | Copyright © The PHP Group and Contributors.                          |
+ +----------------------------------------------------------------------+
+ | This source file is subject to the Modified BSD License that is      |
+ | bundled with this package in the file LICENSE, and is available      |
+ | through the World Wide Web at .        |
+ |                                                                      |
+ | SPDX-License-Identifier: BSD-3-Clause                                |
  +----------------------------------------------------------------------+
  | Authors: Sara Golemon                               |
  +----------------------------------------------------------------------+
diff --git a/ext/intl/dateformat/dateformat.cpp b/ext/intl/dateformat/dateformat.cpp
index cf2b445590bb..64454a8afde9 100644
--- a/ext/intl/dateformat/dateformat.cpp
+++ b/ext/intl/dateformat/dateformat.cpp
@@ -1,12 +1,12 @@
 /*
    +----------------------------------------------------------------------+
-   | This source file is subject to version 3.01 of the PHP license,      |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | https://www.php.net/license/3_01.txt                                 |
-   | If you did not receive a copy of the PHP license and are unable to   |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@php.net so we can mail you a copy immediately.               |
+   | Copyright © The PHP Group and Contributors.                          |
+   +----------------------------------------------------------------------+
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Authors: Kirti Velankar                        |
    +----------------------------------------------------------------------+
diff --git a/ext/intl/dateformat/dateformat.h b/ext/intl/dateformat/dateformat.h
index 3e0b14cf6c0d..bff8d4e1ed72 100644
--- a/ext/intl/dateformat/dateformat.h
+++ b/ext/intl/dateformat/dateformat.h
@@ -1,12 +1,12 @@
 /*
    +----------------------------------------------------------------------+
-   | This source file is subject to version 3.01 of the PHP license,      |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | https://www.php.net/license/3_01.txt                                 |
-   | If you did not receive a copy of the PHP license and are unable to   |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@php.net so we can mail you a copy immediately.               |
+   | Copyright © The PHP Group and Contributors.                          |
+   +----------------------------------------------------------------------+
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Authors: Kirti Velankar                        |
    +----------------------------------------------------------------------+
diff --git a/ext/intl/dateformat/dateformat_attr.cpp b/ext/intl/dateformat/dateformat_attr.cpp
index 1ec55a806a7c..170a85889d53 100644
--- a/ext/intl/dateformat/dateformat_attr.cpp
+++ b/ext/intl/dateformat/dateformat_attr.cpp
@@ -1,12 +1,12 @@
 /*
    +----------------------------------------------------------------------+
-   | This source file is subject to version 3.01 of the PHP license,      |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | https://www.php.net/license/3_01.txt                                 |
-   | If you did not receive a copy of the PHP license and are unable to   |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@php.net so we can mail you a copy immediately.               |
+   | Copyright © The PHP Group and Contributors.                          |
+   +----------------------------------------------------------------------+
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Authors: Kirti Velankar                        |
    +----------------------------------------------------------------------+
diff --git a/ext/intl/dateformat/dateformat_attrcpp.cpp b/ext/intl/dateformat/dateformat_attrcpp.cpp
index 13dadc9c9697..1c8fb88a3d51 100644
--- a/ext/intl/dateformat/dateformat_attrcpp.cpp
+++ b/ext/intl/dateformat/dateformat_attrcpp.cpp
@@ -1,12 +1,12 @@
 /*
    +----------------------------------------------------------------------+
-   | This source file is subject to version 3.01 of the PHP license,      |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | https://www.php.net/license/3_01.txt                                 |
-   | If you did not receive a copy of the PHP license and are unable to   |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@php.net so we can mail you a copy immediately.               |
+   | Copyright © The PHP Group and Contributors.                          |
+   +----------------------------------------------------------------------+
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Authors: Gustavo Lopes                           |
    +----------------------------------------------------------------------+
@@ -94,7 +94,7 @@ U_CFUNC PHP_FUNCTION(datefmt_set_timezone)
 	DATE_FORMAT_METHOD_FETCH_OBJECT;
 
 	TimeZone *timezone = timezone_process_timezone_argument(
-		timezone_object, timezone_string, INTL_DATA_ERROR_P(dfo));
+		timezone_object, timezone_string, INTL_DATA_ERROR_P(dfo), 2);
 	if (timezone == nullptr) {
 		RETURN_FALSE;
 	}
@@ -119,7 +119,7 @@ U_CFUNC PHP_METHOD(IntlDateFormatter, setTimeZone)
 	DATE_FORMAT_METHOD_FETCH_OBJECT;
 
 	TimeZone *timezone = timezone_process_timezone_argument(
-		timezone_object, timezone_string, INTL_DATA_ERROR_P(dfo));
+		timezone_object, timezone_string, INTL_DATA_ERROR_P(dfo), 1);
 	if (timezone == nullptr) {
 		RETURN_FALSE;
 	}
diff --git a/ext/intl/dateformat/dateformat_class.cpp b/ext/intl/dateformat/dateformat_class.cpp
index b6ccf9799007..e9869612b873 100644
--- a/ext/intl/dateformat/dateformat_class.cpp
+++ b/ext/intl/dateformat/dateformat_class.cpp
@@ -1,12 +1,12 @@
 /*
    +----------------------------------------------------------------------+
-   | This source file is subject to version 3.01 of the PHP license,      |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | https://www.php.net/license/3_01.txt                                 |
-   | If you did not receive a copy of the PHP license and are unable to   |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@php.net so we can mail you a copy immediately.               |
+   | Copyright © The PHP Group and Contributors.                          |
+   +----------------------------------------------------------------------+
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Authors: Kirti Velankar                        |
    +----------------------------------------------------------------------+
@@ -66,7 +66,7 @@ zend_object *IntlDateFormatter_object_create(zend_class_entry *ce)
 /* {{{ IntlDateFormatter_object_clone */
 zend_object *IntlDateFormatter_object_clone(zend_object *object)
 {
-	IntlDateFormatter_object     *dfo = php_intl_dateformatter_fetch_object(object);
+	const IntlDateFormatter_object     *dfo = php_intl_dateformatter_fetch_object(object);
 	zend_object              *new_obj = IntlDateFormatter_ce_ptr->create_object(object->ce);
 	IntlDateFormatter_object *new_dfo = php_intl_dateformatter_fetch_object(new_obj);
 
@@ -104,7 +104,7 @@ void dateformat_register_IntlDateFormatter_class( void )
 
 	memcpy(&IntlDateFormatter_handlers, &std_object_handlers,
 		sizeof IntlDateFormatter_handlers);
-	IntlDateFormatter_handlers.offset = XtOffsetOf(IntlDateFormatter_object, zo);
+	IntlDateFormatter_handlers.offset = offsetof(IntlDateFormatter_object, zo);
 	IntlDateFormatter_handlers.clone_obj = IntlDateFormatter_object_clone;
 	IntlDateFormatter_handlers.free_obj = IntlDateFormatter_object_free;
 }
diff --git a/ext/intl/dateformat/dateformat_class.h b/ext/intl/dateformat/dateformat_class.h
index e722c40b4bd9..bef8f6dd6146 100644
--- a/ext/intl/dateformat/dateformat_class.h
+++ b/ext/intl/dateformat/dateformat_class.h
@@ -1,12 +1,12 @@
 /*
    +----------------------------------------------------------------------+
-   | This source file is subject to version 3.01 of the PHP license,      |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | https://www.php.net/license/3_01.txt                                 |
-   | If you did not receive a copy of the PHP license and are unable to   |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@php.net so we can mail you a copy immediately.               |
+   | Copyright © The PHP Group and Contributors.                          |
+   +----------------------------------------------------------------------+
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Authors: Kirti Velankar                        |
    +----------------------------------------------------------------------+
@@ -36,9 +36,7 @@ typedef struct {
 	zend_object		zo;
 } IntlDateFormatter_object;
 
-static inline IntlDateFormatter_object *php_intl_dateformatter_fetch_object(zend_object *obj) {
-	return (IntlDateFormatter_object *)((char*)(obj) - XtOffsetOf(IntlDateFormatter_object, zo));
-}
+#define php_intl_dateformatter_fetch_object(obj) ZEND_CONTAINER_OF(obj, IntlDateFormatter_object, zo)
 #define Z_INTL_DATEFORMATTER_P(zv) php_intl_dateformatter_fetch_object(Z_OBJ_P(zv))
 
 #ifdef __cplusplus
diff --git a/ext/intl/dateformat/dateformat_create.cpp b/ext/intl/dateformat/dateformat_create.cpp
index 251f6f3fbc9b..df98c7178fc6 100644
--- a/ext/intl/dateformat/dateformat_create.cpp
+++ b/ext/intl/dateformat/dateformat_create.cpp
@@ -1,12 +1,12 @@
 /*
    +----------------------------------------------------------------------+
-   | This source file is subject to version 3.01 of the PHP license,      |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | https://www.php.net/license/3_01.txt                                 |
-   | If you did not receive a copy of the PHP license and are unable to   |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@php.net so we can mail you a copy immediately.               |
+   | Copyright © The PHP Group and Contributors.                          |
+   +----------------------------------------------------------------------+
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Authors: Kirti Velankar                        |
    |          Gustavo Lopes                           |
@@ -99,7 +99,7 @@ static zend_result datefmt_ctor(INTERNAL_FUNCTION_PARAMETERS)
 		return FAILURE;
 	}
 	if (date_type == UDAT_PATTERN && time_type != UDAT_PATTERN) {
-		intl_error_set(NULL, U_ILLEGAL_ARGUMENT_ERROR, "time format must be UDAT_PATTERN if date format is UDAT_PATTERN");
+		intl_error_set(NULL, U_ILLEGAL_ARGUMENT_ERROR, "datefmt_create: time format must be IntlDateFormatter::PATTERN if date format is IntlDateFormatter::PATTERN");
 		return FAILURE;
 	}
 
@@ -131,7 +131,7 @@ static zend_result datefmt_ctor(INTERNAL_FUNCTION_PARAMETERS)
 
 	if (explicit_tz || calendar_owned ) {
 		//we have an explicit time zone or a non-object calendar
-		timezone = timezone_process_timezone_argument(timezone_object, timezone_string, INTL_DATA_ERROR_P(dfo));
+		timezone = timezone_process_timezone_argument(timezone_object, timezone_string, INTL_DATA_ERROR_P(dfo), 4);
 		if (timezone == nullptr) {
 			goto error;
 		}
diff --git a/ext/intl/dateformat/dateformat_create.h b/ext/intl/dateformat/dateformat_create.h
index a15828e7794c..440f91d261d9 100644
--- a/ext/intl/dateformat/dateformat_create.h
+++ b/ext/intl/dateformat/dateformat_create.h
@@ -1,12 +1,12 @@
 /*
    +----------------------------------------------------------------------+
-   | This source file is subject to version 3.01 of the PHP license,      |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | https://www.php.net/license/3_01.txt                                 |
-   | If you did not receive a copy of the PHP license and are unable to   |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@php.net so we can mail you a copy immediately.               |
+   | Copyright © The PHP Group and Contributors.                          |
+   +----------------------------------------------------------------------+
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Authors: Gustavo Lopes                           |
    +----------------------------------------------------------------------+
diff --git a/ext/intl/dateformat/dateformat_data.cpp b/ext/intl/dateformat/dateformat_data.cpp
index 42e7c9522055..6246257732c1 100644
--- a/ext/intl/dateformat/dateformat_data.cpp
+++ b/ext/intl/dateformat/dateformat_data.cpp
@@ -1,12 +1,12 @@
 /*
    +----------------------------------------------------------------------+
-   | This source file is subject to version 3.01 of the PHP license,      |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | https://www.php.net/license/3_01.txt                                 |
-   | If you did not receive a copy of the PHP license and are unable to   |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@php.net so we can mail you a copy immediately.               |
+   | Copyright © The PHP Group and Contributors.                          |
+   +----------------------------------------------------------------------+
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Authors: Kirti Velankar                        |
    +----------------------------------------------------------------------+
diff --git a/ext/intl/dateformat/dateformat_data.h b/ext/intl/dateformat/dateformat_data.h
index 962ffbade31d..a8dcef4c500b 100644
--- a/ext/intl/dateformat/dateformat_data.h
+++ b/ext/intl/dateformat/dateformat_data.h
@@ -1,12 +1,12 @@
 /*
    +----------------------------------------------------------------------+
-   | This source file is subject to version 3.01 of the PHP license,      |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | https://www.php.net/license/3_01.txt                                 |
-   | If you did not receive a copy of the PHP license and are unable to   |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@php.net so we can mail you a copy immediately.               |
+   | Copyright © The PHP Group and Contributors.                          |
+   +----------------------------------------------------------------------+
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Authors: Kirti Velankar                        |
    +----------------------------------------------------------------------+
diff --git a/ext/intl/dateformat/dateformat_format.cpp b/ext/intl/dateformat/dateformat_format.cpp
index 30570a5887c1..8b2a28d5c4d2 100644
--- a/ext/intl/dateformat/dateformat_format.cpp
+++ b/ext/intl/dateformat/dateformat_format.cpp
@@ -1,12 +1,12 @@
 /*
    +----------------------------------------------------------------------+
-   | This source file is subject to version 3.01 of the PHP license,      |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | https://www.php.net/license/3_01.txt                                 |
-   | If you did not receive a copy of the PHP license and are unable to   |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@php.net so we can mail you a copy immediately.               |
+   | Copyright © The PHP Group and Contributors.                          |
+   +----------------------------------------------------------------------+
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Authors: Kirti Velankar                        |
    +----------------------------------------------------------------------+
diff --git a/ext/intl/dateformat/dateformat_format_object.cpp b/ext/intl/dateformat/dateformat_format_object.cpp
index a5113ce4cf9e..5b0950094d51 100644
--- a/ext/intl/dateformat/dateformat_format_object.cpp
+++ b/ext/intl/dateformat/dateformat_format_object.cpp
@@ -1,12 +1,12 @@
 /*
    +----------------------------------------------------------------------+
-   | This source file is subject to version 3.01 of the PHP license,      |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | https://www.php.net/license/3_01.txt                                 |
-   | If you did not receive a copy of the PHP license and are unable to   |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@php.net so we can mail you a copy immediately.               |
+   | Copyright © The PHP Group and Contributors.                          |
+   +----------------------------------------------------------------------+
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Authors: Gustavo Lopes                           |
    +----------------------------------------------------------------------+
diff --git a/ext/intl/dateformat/dateformat_helpers.cpp b/ext/intl/dateformat/dateformat_helpers.cpp
index 18dc594deddd..747105bb4f90 100644
--- a/ext/intl/dateformat/dateformat_helpers.cpp
+++ b/ext/intl/dateformat/dateformat_helpers.cpp
@@ -1,12 +1,12 @@
 /*
    +----------------------------------------------------------------------+
-   | This source file is subject to version 3.01 of the PHP license,      |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | https://www.php.net/license/3_01.txt                                 |
-   | If you did not receive a copy of the PHP license and are unable to   |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@php.net so we can mail you a copy immediately.               |
+   | Copyright © The PHP Group and Contributors.                          |
+   +----------------------------------------------------------------------+
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Authors: Gustavo Lopes                           |
    +----------------------------------------------------------------------+
diff --git a/ext/intl/dateformat/dateformat_helpers.h b/ext/intl/dateformat/dateformat_helpers.h
index b931d9667e5f..f71e7f368706 100644
--- a/ext/intl/dateformat/dateformat_helpers.h
+++ b/ext/intl/dateformat/dateformat_helpers.h
@@ -1,12 +1,12 @@
 /*
    +----------------------------------------------------------------------+
-   | This source file is subject to version 3.01 of the PHP license,      |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | https://www.php.net/license/3_01.txt                                 |
-   | If you did not receive a copy of the PHP license and are unable to   |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@php.net so we can mail you a copy immediately.               |
+   | Copyright © The PHP Group and Contributors.                          |
+   +----------------------------------------------------------------------+
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Authors: Gustavo Lopes                           |
    +----------------------------------------------------------------------+
diff --git a/ext/intl/dateformat/dateformat_parse.cpp b/ext/intl/dateformat/dateformat_parse.cpp
index a82a20a42f96..13cf56ad7d82 100644
--- a/ext/intl/dateformat/dateformat_parse.cpp
+++ b/ext/intl/dateformat/dateformat_parse.cpp
@@ -1,12 +1,12 @@
 /*
    +----------------------------------------------------------------------+
-   | This source file is subject to version 3.01 of the PHP license,      |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | https://www.php.net/license/3_01.txt                                 |
-   | If you did not receive a copy of the PHP license and are unable to   |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@php.net so we can mail you a copy immediately.               |
+   | Copyright © The PHP Group and Contributors.                          |
+   +----------------------------------------------------------------------+
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Authors: Kirti Velankar                        |
    +----------------------------------------------------------------------+
@@ -108,7 +108,7 @@ static void internal_parse_to_localtime(IntlDateFormatter_object *dfo, char* tex
 	INTL_METHOD_CHECK_STATUS( dfo, "Date parsing failed" );
 
 
-	array_init( return_value );
+	array_init_size( return_value, 9 );
 	/* Add  entries from various fields of the obtained parsed_calendar */
 	add_to_localtime_arr( dfo, return_value, parsed_calendar, UCAL_SECOND, CALENDAR_SEC);
 	add_to_localtime_arr( dfo, return_value, parsed_calendar, UCAL_MINUTE, CALENDAR_MIN);
diff --git a/ext/intl/dateformat/datepatterngenerator_class.cpp b/ext/intl/dateformat/datepatterngenerator_class.cpp
index 38faff751fb7..4a137d916f12 100644
--- a/ext/intl/dateformat/datepatterngenerator_class.cpp
+++ b/ext/intl/dateformat/datepatterngenerator_class.cpp
@@ -1,12 +1,12 @@
 /*
    +----------------------------------------------------------------------+
-   | This source file is subject to version 3.01 of the PHP license,      |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | https://www.php.net/license/3_01.txt                                 |
-   | If you did not receive a copy of the PHP license and are unable to   |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@php.net so we can mail you a copy immediately.               |
+   | Copyright © The PHP Group and Contributors.                          |
+   +----------------------------------------------------------------------+
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Authors: Mel Dafert (mel@dafert.at)                                  |
    +----------------------------------------------------------------------+
@@ -36,7 +36,7 @@ zend_object_handlers IntlDatePatternGenerator_handlers;
 
 static zend_object *IntlDatePatternGenerator_object_clone(zend_object *object)
 {
-	IntlDatePatternGenerator_object *dtpgo_orig = php_intl_datepatterngenerator_fetch_object(object);
+	const IntlDatePatternGenerator_object *dtpgo_orig = php_intl_datepatterngenerator_fetch_object(object);
 	zend_object                        *ret_val = IntlDatePatternGenerator_ce_ptr->create_object(object->ce);
 	IntlDatePatternGenerator_object  *dtpgo_new = php_intl_datepatterngenerator_fetch_object(ret_val);
 
@@ -106,7 +106,7 @@ void dateformat_register_IntlDatePatternGenerator_class( void )
 
 	memcpy(&IntlDatePatternGenerator_handlers, &std_object_handlers,
 		sizeof IntlDatePatternGenerator_handlers);
-	IntlDatePatternGenerator_handlers.offset = XtOffsetOf(IntlDatePatternGenerator_object, zo);
+	IntlDatePatternGenerator_handlers.offset = offsetof(IntlDatePatternGenerator_object, zo);
 	IntlDatePatternGenerator_handlers.clone_obj = IntlDatePatternGenerator_object_clone;
 	IntlDatePatternGenerator_handlers.free_obj = IntlDatePatternGenerator_object_free;
 }
diff --git a/ext/intl/dateformat/datepatterngenerator_class.h b/ext/intl/dateformat/datepatterngenerator_class.h
index eb8f7c433d0e..c2c280e2df2c 100644
--- a/ext/intl/dateformat/datepatterngenerator_class.h
+++ b/ext/intl/dateformat/datepatterngenerator_class.h
@@ -1,12 +1,12 @@
 /*
    +----------------------------------------------------------------------+
-   | This source file is subject to version 3.01 of the PHP license,      |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | https://www.php.net/license/3_01.txt                                 |
-   | If you did not receive a copy of the PHP license and are unable to   |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@php.net so we can mail you a copy immediately.               |
+   | Copyright © The PHP Group and Contributors.                          |
+   +----------------------------------------------------------------------+
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Authors: Mel Dafert (mel@dafert.at)                                  |
    +----------------------------------------------------------------------+
@@ -36,9 +36,7 @@ typedef struct {
 	zend_object	zo;
 } IntlDatePatternGenerator_object;
 
-static inline IntlDatePatternGenerator_object *php_intl_datepatterngenerator_fetch_object(zend_object *obj) {
-	return (IntlDatePatternGenerator_object *)((char*)(obj) - XtOffsetOf(IntlDatePatternGenerator_object, zo));
-}
+#define php_intl_datepatterngenerator_fetch_object(obj) ZEND_CONTAINER_OF(obj, IntlDatePatternGenerator_object, zo)
 #define Z_INTL_DATEPATTERNGENERATOR_P(zv) php_intl_datepatterngenerator_fetch_object(Z_OBJ_P(zv))
 
 #define DTPATTERNGEN_ERROR(dtpgo)		(dtpgo)->err
diff --git a/ext/intl/dateformat/datepatterngenerator_methods.cpp b/ext/intl/dateformat/datepatterngenerator_methods.cpp
index beaf10d9f507..f22be1c21fc1 100644
--- a/ext/intl/dateformat/datepatterngenerator_methods.cpp
+++ b/ext/intl/dateformat/datepatterngenerator_methods.cpp
@@ -1,12 +1,12 @@
 /*
    +----------------------------------------------------------------------+
-   | This source file is subject to version 3.01 of the PHP license,      |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | https://www.php.net/license/3_01.txt                                 |
-   | If you did not receive a copy of the PHP license and are unable to   |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@php.net so we can mail you a copy immediately.               |
+   | Copyright © The PHP Group and Contributors.                          |
+   +----------------------------------------------------------------------+
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Authors: Mel Dafert (mel@dafert.at)                                  |
    +----------------------------------------------------------------------+
diff --git a/ext/intl/formatter/formatter_attr.cpp b/ext/intl/formatter/formatter_attr.cpp
index 905a4415ef59..d21873ecdabc 100644
--- a/ext/intl/formatter/formatter_attr.cpp
+++ b/ext/intl/formatter/formatter_attr.cpp
@@ -1,12 +1,12 @@
 /*
    +----------------------------------------------------------------------+
-   | This source file is subject to version 3.01 of the PHP license,      |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | https://www.php.net/license/3_01.txt                                 |
-   | If you did not receive a copy of the PHP license and are unable to   |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@php.net so we can mail you a copy immediately.               |
+   | Copyright © The PHP Group and Contributors.                          |
+   +----------------------------------------------------------------------+
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Authors: Stanislav Malyshev                           |
    +----------------------------------------------------------------------+
@@ -16,13 +16,16 @@
 #include 
 #endif
 
+#include 
+#include "../intl_convertcpp.h"
+#include "formatter_class.h"
+
 extern "C" {
 #include "php_intl.h"
 #include "intl_convert.h"
 }
-#include "formatter_class.h"
 
-#include 
+#define FORMATTER_UNUM(nfo) reinterpret_cast(FORMATTER_OBJECT(nfo))
 
 /* {{{ Get formatter attribute value. */
 U_CFUNC PHP_FUNCTION( numfmt_get_attribute )
@@ -62,7 +65,7 @@ U_CFUNC PHP_FUNCTION( numfmt_get_attribute )
 		case UNUM_MIN_SIGNIFICANT_DIGITS:
 		case UNUM_MAX_SIGNIFICANT_DIGITS:
 		case UNUM_LENIENT_PARSE:
-			value = unum_getAttribute(FORMATTER_OBJECT(nfo), attribute);
+			value = unum_getAttribute(FORMATTER_UNUM(nfo), attribute);
 			if(value == -1) {
 				INTL_DATA_ERROR_CODE(nfo) = U_UNSUPPORTED_ERROR;
 			} else {
@@ -71,7 +74,7 @@ U_CFUNC PHP_FUNCTION( numfmt_get_attribute )
 			break;
 		case UNUM_ROUNDING_INCREMENT:
 		{
-			double value_double = unum_getDoubleAttribute(FORMATTER_OBJECT(nfo), attribute);
+			double value_double = unum_getDoubleAttribute(FORMATTER_UNUM(nfo), attribute);
 			if(value_double == -1) {
 				INTL_DATA_ERROR_CODE(nfo) = U_UNSUPPORTED_ERROR;
 			} else {
@@ -110,12 +113,12 @@ U_CFUNC PHP_FUNCTION( numfmt_get_text_attribute )
 
 	UNumberFormatTextAttribute attribute = static_cast(lattribute);
 
-	length = unum_getTextAttribute( FORMATTER_OBJECT(nfo), attribute, value, value_buf_size, &INTL_DATA_ERROR_CODE(nfo) );
+	length = unum_getTextAttribute( FORMATTER_UNUM(nfo), attribute, value, value_buf_size, &INTL_DATA_ERROR_CODE(nfo) );
 	if(INTL_DATA_ERROR_CODE(nfo) == U_BUFFER_OVERFLOW_ERROR && length >= value_buf_size) {
 		++length; /* to avoid U_STRING_NOT_TERMINATED_WARNING */
 		INTL_DATA_ERROR_CODE(nfo) = U_ZERO_ERROR;
 		value = eumalloc(length);
-		length = unum_getTextAttribute( FORMATTER_OBJECT(nfo), attribute, value, length, &INTL_DATA_ERROR_CODE(nfo) );
+		length = unum_getTextAttribute( FORMATTER_UNUM(nfo), attribute, value, length, &INTL_DATA_ERROR_CODE(nfo) );
 		if(U_FAILURE(INTL_DATA_ERROR_CODE(nfo))) {
 			efree(value);
 			value = value_buf;
@@ -166,10 +169,10 @@ U_CFUNC PHP_FUNCTION( numfmt_set_attribute )
 		case UNUM_MIN_SIGNIFICANT_DIGITS:
 		case UNUM_MAX_SIGNIFICANT_DIGITS:
 		case UNUM_LENIENT_PARSE:
-			unum_setAttribute(FORMATTER_OBJECT(nfo), attribute, zval_get_long(value));
+			unum_setAttribute(FORMATTER_UNUM(nfo), attribute, zval_get_long(value));
 			break;
 		case UNUM_ROUNDING_INCREMENT:
-			unum_setDoubleAttribute(FORMATTER_OBJECT(nfo), attribute, zval_get_double(value));
+			unum_setDoubleAttribute(FORMATTER_UNUM(nfo), attribute, zval_get_double(value));
 			break;
 		default:
 			INTL_DATA_ERROR_CODE(nfo) = U_UNSUPPORTED_ERROR;
@@ -185,8 +188,6 @@ U_CFUNC PHP_FUNCTION( numfmt_set_attribute )
 /* {{{ Get formatter attribute value. */
 U_CFUNC PHP_FUNCTION( numfmt_set_text_attribute )
 {
-	int32_t slength = 0;
-	UChar *svalue = NULL;
 	zend_long attribute;
 	char *value;
 	size_t len;
@@ -203,14 +204,12 @@ U_CFUNC PHP_FUNCTION( numfmt_set_text_attribute )
 	FORMATTER_METHOD_FETCH_OBJECT;
 
 	/* Convert given attribute value to UTF-16. */
-	intl_convert_utf8_to_utf16(&svalue, &slength, value, len, &INTL_DATA_ERROR_CODE(nfo));
+	UnicodeString svalue;
+	intl_stringFromChar(svalue, value, len, &INTL_DATA_ERROR_CODE(nfo));
 	INTL_METHOD_CHECK_STATUS( nfo, "Error converting attribute value to UTF-16" );
 
 	/* Actually set new attribute value. */
-	unum_setTextAttribute(FORMATTER_OBJECT(nfo), static_cast(attribute), svalue, slength, &INTL_DATA_ERROR_CODE(nfo));
-	if (svalue) {
-		efree(svalue);
-	}
+	unum_setTextAttribute(FORMATTER_UNUM(nfo), static_cast(attribute), svalue.getBuffer(), svalue.length(), &INTL_DATA_ERROR_CODE(nfo));
 	INTL_METHOD_CHECK_STATUS( nfo, "Error setting text attribute" );
 
 	RETURN_TRUE;
@@ -243,12 +242,12 @@ U_CFUNC PHP_FUNCTION( numfmt_get_symbol )
 	/* Fetch the object. */
 	FORMATTER_METHOD_FETCH_OBJECT;
 
-	length = unum_getSymbol(FORMATTER_OBJECT(nfo), symbol, value_buf, length, &INTL_DATA_ERROR_CODE(nfo));
+	length = unum_getSymbol(FORMATTER_UNUM(nfo), symbol, value_buf, length, &INTL_DATA_ERROR_CODE(nfo));
 	if(INTL_DATA_ERROR_CODE(nfo) == U_BUFFER_OVERFLOW_ERROR && length >= USIZE( value_buf )) {
 		++length; /* to avoid U_STRING_NOT_TERMINATED_WARNING */
 		INTL_DATA_ERROR_CODE(nfo) = U_ZERO_ERROR;
 		value = eumalloc(length);
-		length = unum_getSymbol(FORMATTER_OBJECT(nfo), symbol, value, length, &INTL_DATA_ERROR_CODE(nfo));
+		length = unum_getSymbol(FORMATTER_UNUM(nfo), symbol, value, length, &INTL_DATA_ERROR_CODE(nfo));
 		if(U_FAILURE(INTL_DATA_ERROR_CODE(nfo))) {
 			efree(value);
 			value = value_buf;
@@ -266,8 +265,6 @@ U_CFUNC PHP_FUNCTION( numfmt_set_symbol )
 	zend_long  lsymbol;
 	char*      value     = NULL;
 	size_t     value_len = 0;
-	UChar*     svalue  = 0;
-	int32_t    slength = 0;
 	FORMATTER_METHOD_INIT_VARS;
 
 	/* Parse parameters. */
@@ -288,14 +285,12 @@ U_CFUNC PHP_FUNCTION( numfmt_set_symbol )
 	FORMATTER_METHOD_FETCH_OBJECT;
 
 	/* Convert given symbol to UTF-16. */
-	intl_convert_utf8_to_utf16(&svalue, &slength, value, value_len, &INTL_DATA_ERROR_CODE(nfo));
+	UnicodeString svalue;
+	intl_stringFromChar(svalue, value, value_len, &INTL_DATA_ERROR_CODE(nfo));
 	INTL_METHOD_CHECK_STATUS( nfo, "Error converting symbol value to UTF-16" );
 
 	/* Actually set the symbol. */
-	unum_setSymbol(FORMATTER_OBJECT(nfo), symbol, svalue, slength, &INTL_DATA_ERROR_CODE(nfo));
-	if (svalue) {
-		efree(svalue);
-	}
+	unum_setSymbol(FORMATTER_UNUM(nfo), symbol, svalue.getBuffer(), svalue.length(), &INTL_DATA_ERROR_CODE(nfo));
 	INTL_METHOD_CHECK_STATUS( nfo, "Error setting symbol value" );
 
 	RETURN_TRUE;
@@ -320,12 +315,12 @@ U_CFUNC PHP_FUNCTION( numfmt_get_pattern )
 	/* Fetch the object. */
 	FORMATTER_METHOD_FETCH_OBJECT;
 
-	length = unum_toPattern(FORMATTER_OBJECT(nfo), 0, value, length, &INTL_DATA_ERROR_CODE(nfo));
+	length = unum_toPattern(FORMATTER_UNUM(nfo), 0, value, length, &INTL_DATA_ERROR_CODE(nfo));
 	if(INTL_DATA_ERROR_CODE(nfo) == U_BUFFER_OVERFLOW_ERROR && length >= USIZE( value_buf )) {
 		++length; /* to avoid U_STRING_NOT_TERMINATED_WARNING */
 		INTL_DATA_ERROR_CODE(nfo) = U_ZERO_ERROR;
 		value = eumalloc(length);
-		length = unum_toPattern( FORMATTER_OBJECT(nfo), 0, value, length, &INTL_DATA_ERROR_CODE(nfo) );
+		length = unum_toPattern( FORMATTER_UNUM(nfo), 0, value, length, &INTL_DATA_ERROR_CODE(nfo) );
 		if(U_FAILURE(INTL_DATA_ERROR_CODE(nfo))) {
 			efree(value);
 			value = value_buf;
@@ -342,8 +337,6 @@ U_CFUNC PHP_FUNCTION( numfmt_set_pattern )
 {
 	char*       value = NULL;
 	size_t      value_len = 0;
-	int32_t     slength = 0;
-	UChar*	    svalue  = NULL;
 	UParseError spattern_error = {0};
 	FORMATTER_METHOD_INIT_VARS;
 
@@ -357,13 +350,11 @@ U_CFUNC PHP_FUNCTION( numfmt_set_pattern )
 	FORMATTER_METHOD_FETCH_OBJECT;
 
 	/* Convert given pattern to UTF-16. */
-	intl_convert_utf8_to_utf16(&svalue, &slength, value, value_len, &INTL_DATA_ERROR_CODE(nfo));
+	UnicodeString svalue;
+	intl_stringFromChar(svalue, value, value_len, &INTL_DATA_ERROR_CODE(nfo));
 	INTL_METHOD_CHECK_STATUS( nfo, "Error converting pattern to UTF-16" );
 
-	unum_applyPattern(FORMATTER_OBJECT(nfo), 0, svalue, slength, &spattern_error, &INTL_DATA_ERROR_CODE(nfo));
-	if (svalue) {
-		efree(svalue);
-	}
+	unum_applyPattern(FORMATTER_UNUM(nfo), 0, svalue.getBuffer(), svalue.length(), &spattern_error, &INTL_DATA_ERROR_CODE(nfo));
 	if (U_FAILURE(INTL_DATA_ERROR_CODE(nfo))) {
 		char *msg;
 		spprintf(&msg, 0, "Error setting pattern value at line %d, offset %d", spattern_error.line, spattern_error.offset);
@@ -393,7 +384,7 @@ U_CFUNC PHP_FUNCTION( numfmt_get_locale )
 	/* Fetch the object. */
 	FORMATTER_METHOD_FETCH_OBJECT;
 
-	loc = unum_getLocaleByType(FORMATTER_OBJECT(nfo), static_cast(type), &INTL_DATA_ERROR_CODE(nfo));
+	loc = unum_getLocaleByType(FORMATTER_UNUM(nfo), static_cast(type), &INTL_DATA_ERROR_CODE(nfo));
 	INTL_METHOD_CHECK_STATUS( nfo, "Error getting locale" );
 	RETURN_STRING(loc);
 }
diff --git a/ext/intl/formatter/formatter_class.cpp b/ext/intl/formatter/formatter_class.cpp
index 214e1e57dae8..5b82b53c6d62 100644
--- a/ext/intl/formatter/formatter_class.cpp
+++ b/ext/intl/formatter/formatter_class.cpp
@@ -1,19 +1,17 @@
 /*
    +----------------------------------------------------------------------+
-   | This source file is subject to version 3.01 of the PHP license,      |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | https://www.php.net/license/3_01.txt                                 |
-   | If you did not receive a copy of the PHP license and are unable to   |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@php.net so we can mail you a copy immediately.               |
+   | Copyright © The PHP Group and Contributors.                          |
+   +----------------------------------------------------------------------+
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Authors: Stanislav Malyshev                           |
    +----------------------------------------------------------------------+
  */
 
-#include 
-
 #include "formatter_class.h"
 extern "C" {
 #include "php_intl.h"
@@ -64,7 +62,7 @@ U_CFUNC zend_object *NumberFormatter_object_create(zend_class_entry *ce)
 /* {{{ NumberFormatter_object_clone */
 U_CFUNC zend_object *NumberFormatter_object_clone(zend_object *object)
 {
-	NumberFormatter_object     *nfo = php_intl_number_format_fetch_object(object);
+	const NumberFormatter_object     *nfo = php_intl_number_format_fetch_object(object);
 	zend_object            *new_obj = NumberFormatter_ce_ptr->create_object(object->ce);
 	NumberFormatter_object *new_nfo = php_intl_number_format_fetch_object(new_obj);
 
@@ -72,10 +70,9 @@ U_CFUNC zend_object *NumberFormatter_object_clone(zend_object *object)
 	zend_objects_clone_members(&new_nfo->zo, &nfo->zo);
 
 	/* clone formatter object. It may fail, the destruction code must handle this case */
-	if (FORMATTER_OBJECT(nfo) != NULL) {
-		UErrorCode error = U_ZERO_ERROR;
-		FORMATTER_OBJECT(new_nfo) = unum_clone(FORMATTER_OBJECT(nfo), &error);
-		if (U_FAILURE(error)) {
+	if (FORMATTER_OBJECT(nfo) != nullptr) {
+		FORMATTER_OBJECT(new_nfo) = FORMATTER_OBJECT(nfo)->clone();
+		if (FORMATTER_OBJECT(new_nfo) == nullptr) {
 			zend_throw_error(NULL, "Failed to clone NumberFormatter");
 		}
 	} else {
@@ -101,7 +98,7 @@ U_CFUNC void formatter_register_class( void )
 
 	memcpy(&NumberFormatter_handlers, &std_object_handlers,
 		sizeof(NumberFormatter_handlers));
-	NumberFormatter_handlers.offset = XtOffsetOf(NumberFormatter_object, zo);
+	NumberFormatter_handlers.offset = offsetof(NumberFormatter_object, zo);
 	NumberFormatter_handlers.clone_obj = NumberFormatter_object_clone;
 	NumberFormatter_handlers.free_obj = NumberFormatter_object_free;
 }
diff --git a/ext/intl/formatter/formatter_class.h b/ext/intl/formatter/formatter_class.h
index bf21825b5f5f..44bdfae8debe 100644
--- a/ext/intl/formatter/formatter_class.h
+++ b/ext/intl/formatter/formatter_class.h
@@ -1,12 +1,12 @@
 /*
    +----------------------------------------------------------------------+
-   | This source file is subject to version 3.01 of the PHP license,      |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | https://www.php.net/license/3_01.txt                                 |
-   | If you did not receive a copy of the PHP license and are unable to   |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@php.net so we can mail you a copy immediately.               |
+   | Copyright © The PHP Group and Contributors.                          |
+   +----------------------------------------------------------------------+
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Authors: Stanislav Malyshev                           |
    +----------------------------------------------------------------------+
@@ -15,7 +15,7 @@
 #ifndef FORMATTER_CLASS_H
 #define FORMATTER_CLASS_H
 
-#include 
+#include "formatter_data.h"
 
 #ifdef __cplusplus
 extern "C" {
@@ -23,7 +23,6 @@ extern "C" {
 #include "intl_common.h"
 #include "intl_error.h"
 #include "intl_data.h"
-#include "formatter_data.h"
 #ifdef __cplusplus
 }
 #endif
@@ -33,9 +32,7 @@ typedef struct {
 	zend_object     zo;
 } NumberFormatter_object;
 
-static inline NumberFormatter_object *php_intl_number_format_fetch_object(zend_object *obj) {
-	return (NumberFormatter_object *)((char*)(obj) - XtOffsetOf(NumberFormatter_object, zo));
-}
+#define php_intl_number_format_fetch_object(obj) ZEND_CONTAINER_OF(obj, NumberFormatter_object, zo)
 #define Z_INTL_NUMBERFORMATTER_P(zv) php_intl_number_format_fetch_object(Z_OBJ_P(zv))
 
 #ifdef __cplusplus
diff --git a/ext/intl/formatter/formatter_data.cpp b/ext/intl/formatter/formatter_data.cpp
index 095be92ed29e..506972e72088 100644
--- a/ext/intl/formatter/formatter_data.cpp
+++ b/ext/intl/formatter/formatter_data.cpp
@@ -1,12 +1,12 @@
 /*
    +----------------------------------------------------------------------+
-   | This source file is subject to version 3.01 of the PHP license,      |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | https://www.php.net/license/3_01.txt                                 |
-   | If you did not receive a copy of the PHP license and are unable to   |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@php.net so we can mail you a copy immediately.               |
+   | Copyright © The PHP Group and Contributors.                          |
+   +----------------------------------------------------------------------+
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Authors: Stanislav Malyshev                           |
    +----------------------------------------------------------------------+
@@ -26,23 +26,21 @@ void formatter_data_init( formatter_data* nf_data )
 	if( !nf_data )
 		return;
 
-	nf_data->unum                = NULL;
+	nf_data->unum                = nullptr;
 	intl_error_reset( &nf_data->error );
 }
 /* }}} */
 
 /* {{{ void formatter_data_free( formatter_data* nf_data )
- * Clean up mem allocted by internals of formatter_data
+ * Clean up mem allocated by internals of formatter_data
  */
 void formatter_data_free( formatter_data* nf_data )
 {
 	if( !nf_data )
 		return;
 
-	if( nf_data->unum )
-		unum_close( nf_data->unum );
-
-	nf_data->unum = NULL;
+	delete nf_data->unum;
+	nf_data->unum = nullptr;
 	intl_error_reset( &nf_data->error );
 }
 /* }}} */
diff --git a/ext/intl/formatter/formatter_data.h b/ext/intl/formatter/formatter_data.h
index 35acc242a8db..1208970471bf 100644
--- a/ext/intl/formatter/formatter_data.h
+++ b/ext/intl/formatter/formatter_data.h
@@ -1,12 +1,12 @@
 /*
    +----------------------------------------------------------------------+
-   | This source file is subject to version 3.01 of the PHP license,      |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | https://www.php.net/license/3_01.txt                                 |
-   | If you did not receive a copy of the PHP license and are unable to   |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@php.net so we can mail you a copy immediately.               |
+   | Copyright © The PHP Group and Contributors.                          |
+   +----------------------------------------------------------------------+
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Authors: Stanislav Malyshev                           |
    +----------------------------------------------------------------------+
@@ -15,9 +15,21 @@
 #ifndef FORMATTER_DATA_H
 #define FORMATTER_DATA_H
 
+#ifdef __cplusplus
+extern "C" {
+#endif
 #include 
+#ifdef __cplusplus
+}
+#endif
+
+#include 
 
-#include 
+#ifdef __cplusplus
+using icu::NumberFormat;
+#else
+typedef void NumberFormat;
+#endif
 
 #ifdef __cplusplus
 extern "C" {
@@ -32,7 +44,7 @@ typedef struct {
 	intl_error      error;
 
 	// formatter handling
-	UNumberFormat*  unum;
+	NumberFormat*    unum;
 } formatter_data;
 
 #ifdef __cplusplus
diff --git a/ext/intl/formatter/formatter_format.cpp b/ext/intl/formatter/formatter_format.cpp
index f28ea30b9ff8..48edabc8ccde 100644
--- a/ext/intl/formatter/formatter_format.cpp
+++ b/ext/intl/formatter/formatter_format.cpp
@@ -1,12 +1,12 @@
 /*
    +----------------------------------------------------------------------+
-   | This source file is subject to version 3.01 of the PHP license,      |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | https://www.php.net/license/3_01.txt                                 |
-   | If you did not receive a copy of the PHP license and are unable to   |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@php.net so we can mail you a copy immediately.               |
+   | Copyright © The PHP Group and Contributors.                          |
+   +----------------------------------------------------------------------+
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Authors: Stanislav Malyshev                           |
    +----------------------------------------------------------------------+
@@ -16,24 +16,21 @@
 #include 
 #endif
 
+#include 
+#include 
+#include "../intl_convertcpp.h"
+#include "formatter_class.h"
+#include "formatter_format.h"
+
 extern "C" {
 #include "php_intl.h"
-#include "intl_convert.h"
 }
 
-#include 
-
-#include "formatter_class.h"
-#include "formatter_format.h"
-
 /* {{{ Format a number. */
 U_CFUNC PHP_FUNCTION( numfmt_format )
 {
 	zval *number;
 	zend_long type = FORMAT_TYPE_DEFAULT;
-	UChar format_buf[32];
-	UChar* formatted = format_buf;
-	int32_t formatted_len = USIZE(format_buf);
 	FORMATTER_METHOD_INIT_VARS;
 
 	/* Parse parameters. */
@@ -55,54 +52,31 @@ U_CFUNC PHP_FUNCTION( numfmt_format )
 			case IS_DOUBLE:
 				type = FORMAT_TYPE_DOUBLE;
 				break;
-			EMPTY_SWITCH_DEFAULT_CASE();
+			default: ZEND_UNREACHABLE();
 		}
 	}
 
+	icu::UnicodeString result;
+	icu::FieldPosition pos;
+
 	switch(type) {
 		case FORMAT_TYPE_INT32:
 			convert_to_long(number);
-			formatted_len = unum_format(FORMATTER_OBJECT(nfo), (int32_t)Z_LVAL_P(number),
-				formatted, formatted_len, NULL, &INTL_DATA_ERROR_CODE(nfo));
-			if (INTL_DATA_ERROR_CODE(nfo) == U_BUFFER_OVERFLOW_ERROR) {
-				intl_error_reset(INTL_DATA_ERROR_P(nfo));
-				formatted = eumalloc(formatted_len);
-				formatted_len = unum_format(FORMATTER_OBJECT(nfo), (int32_t)Z_LVAL_P(number),
-					formatted, formatted_len, NULL, &INTL_DATA_ERROR_CODE(nfo));
-				if (U_FAILURE( INTL_DATA_ERROR_CODE(nfo) ) ) {
-					efree(formatted);
-				}
-			}
+			FORMATTER_OBJECT(nfo)->format((int32_t)Z_LVAL_P(number), result, pos, INTL_DATA_ERROR_CODE(nfo));
 			INTL_METHOD_CHECK_STATUS( nfo, "Number formatting failed" );
 			break;
 
 		case FORMAT_TYPE_INT64:
 		{
 			int64_t value = (Z_TYPE_P(number) == IS_DOUBLE)?(int64_t)Z_DVAL_P(number):Z_LVAL_P(number);
-			formatted_len = unum_formatInt64(FORMATTER_OBJECT(nfo), value, formatted, formatted_len, NULL, &INTL_DATA_ERROR_CODE(nfo));
-			if (INTL_DATA_ERROR_CODE(nfo) == U_BUFFER_OVERFLOW_ERROR) {
-				intl_error_reset(INTL_DATA_ERROR_P(nfo));
-				formatted = eumalloc(formatted_len);
-				formatted_len = unum_formatInt64(FORMATTER_OBJECT(nfo), value, formatted, formatted_len, NULL, &INTL_DATA_ERROR_CODE(nfo));
-				if (U_FAILURE( INTL_DATA_ERROR_CODE(nfo) ) ) {
-					efree(formatted);
-				}
-			}
+			FORMATTER_OBJECT(nfo)->format(value, result, pos, INTL_DATA_ERROR_CODE(nfo));
 			INTL_METHOD_CHECK_STATUS( nfo, "Number formatting failed" );
 		}
 			break;
 
 		case FORMAT_TYPE_DOUBLE:
 			convert_to_double(number);
-			formatted_len = unum_formatDouble(FORMATTER_OBJECT(nfo), Z_DVAL_P(number), formatted, formatted_len, NULL, &INTL_DATA_ERROR_CODE(nfo));
-			if (INTL_DATA_ERROR_CODE(nfo) == U_BUFFER_OVERFLOW_ERROR) {
-				intl_error_reset(INTL_DATA_ERROR_P(nfo));
-				formatted = eumalloc(formatted_len);
-				unum_formatDouble(FORMATTER_OBJECT(nfo), Z_DVAL_P(number), formatted, formatted_len, NULL, &INTL_DATA_ERROR_CODE(nfo));
-				if (U_FAILURE( INTL_DATA_ERROR_CODE(nfo) ) ) {
-					efree(formatted);
-				}
-			}
+			FORMATTER_OBJECT(nfo)->format(Z_DVAL_P(number), result, pos, INTL_DATA_ERROR_CODE(nfo));
 			INTL_METHOD_CHECK_STATUS( nfo, "Number formatting failed" );
 			break;
 		case FORMAT_TYPE_CURRENCY:
@@ -120,7 +94,9 @@ U_CFUNC PHP_FUNCTION( numfmt_format )
 			RETURN_THROWS();
 	}
 
-	INTL_METHOD_RETVAL_UTF8( nfo, formatted, formatted_len, ( formatted != format_buf ) );
+	zend_string *u8str = intl_charFromString(result, &INTL_DATA_ERROR_CODE(nfo));
+	INTL_METHOD_CHECK_STATUS(nfo, "Error converting result to UTF-8");
+	RETVAL_STR(u8str);
 }
 /* }}} */
 
@@ -128,13 +104,8 @@ U_CFUNC PHP_FUNCTION( numfmt_format )
 U_CFUNC PHP_FUNCTION( numfmt_format_currency )
 {
 	double     number;
-	UChar      format_buf[32];
-	UChar*     formatted     = format_buf;
-	int32_t    formatted_len = USIZE(format_buf);
 	char*      currency      = NULL;
 	size_t     currency_len  = 0;
-	UChar*     scurrency     = NULL;
-	int32_t    scurrency_len = 0;
 	FORMATTER_METHOD_INIT_VARS;
 
 	/* Parse parameters. */
@@ -148,36 +119,31 @@ U_CFUNC PHP_FUNCTION( numfmt_format_currency )
 	FORMATTER_METHOD_FETCH_OBJECT;
 
 	/* Convert currency to UTF-16. */
-	intl_convert_utf8_to_utf16(&scurrency, &scurrency_len, currency, currency_len, &INTL_DATA_ERROR_CODE(nfo));
+	icu::UnicodeString ucurrency;
+	intl_stringFromChar(ucurrency, currency, currency_len, &INTL_DATA_ERROR_CODE(nfo));
 	INTL_METHOD_CHECK_STATUS( nfo, "Currency conversion to UTF-16 failed" );
 
-	/* Format the number using a fixed-length buffer. */
-	formatted_len = unum_formatDoubleCurrency(FORMATTER_OBJECT(nfo), number, scurrency, formatted, formatted_len, NULL, &INTL_DATA_ERROR_CODE(nfo));
-
-	/* If the buffer turned out to be too small
-	 * then allocate another buffer dynamically
-	 * and use it to format the number.
-	 */
-	if (INTL_DATA_ERROR_CODE(nfo) == U_BUFFER_OVERFLOW_ERROR) {
-		intl_error_reset(INTL_DATA_ERROR_P(nfo));
-		formatted = eumalloc(formatted_len);
-		unum_formatDoubleCurrency(FORMATTER_OBJECT(nfo), number, scurrency, formatted, formatted_len, NULL, &INTL_DATA_ERROR_CODE(nfo));
+	/* Format using CurrencyAmount. */
+	icu::CurrencyAmount *currAmt = new icu::CurrencyAmount(number, ucurrency.getTerminatedBuffer(), INTL_DATA_ERROR_CODE(nfo));
+	if (U_FAILURE(INTL_DATA_ERROR_CODE(nfo))) {
+		delete currAmt;
+		intl_errors_set_custom_msg(INTL_DATA_ERROR_P(nfo), "Number formatting failed");
+		RETURN_FALSE;
 	}
-
-	if( U_FAILURE( INTL_DATA_ERROR_CODE((nfo)) ) ) {
-		intl_error_set_code( NULL, INTL_DATA_ERROR_CODE((nfo)) );
-		intl_errors_set_custom_msg( INTL_DATA_ERROR_P(nfo), "Number formatting failed");
-		RETVAL_FALSE;
-		if (formatted != format_buf) {
-			efree(formatted);
-		}
-	} else {
-		INTL_METHOD_RETVAL_UTF8( nfo, formatted, formatted_len, ( formatted != format_buf ) );
+	icu::Formattable fmt;
+	fmt.adoptObject(currAmt);
+	icu::UnicodeString result;
+	icu::FieldPosition pos;
+	FORMATTER_OBJECT(nfo)->format(fmt, result, pos, INTL_DATA_ERROR_CODE(nfo));
+
+	if (U_FAILURE(INTL_DATA_ERROR_CODE(nfo))) {
+		intl_errors_set_custom_msg(INTL_DATA_ERROR_P(nfo), "Number formatting failed");
+		RETURN_FALSE;
 	}
 
-	if(scurrency) {
-		efree(scurrency);
-	}
+	zend_string *u8str = intl_charFromString(result, &INTL_DATA_ERROR_CODE(nfo));
+	INTL_METHOD_CHECK_STATUS(nfo, "Error converting result to UTF-8");
+	RETVAL_STR(u8str);
 }
 
 /* }}} */
diff --git a/ext/intl/formatter/formatter_format.h b/ext/intl/formatter/formatter_format.h
index 0238d5d4b8b0..14aa91193ba2 100644
--- a/ext/intl/formatter/formatter_format.h
+++ b/ext/intl/formatter/formatter_format.h
@@ -1,12 +1,12 @@
 /*
    +----------------------------------------------------------------------+
-   | This source file is subject to version 3.01 of the PHP license,      |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | https://www.php.net/license/3_01.txt                                 |
-   | If you did not receive a copy of the PHP license and are unable to   |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@php.net so we can mail you a copy immediately.               |
+   | Copyright © The PHP Group and Contributors.                          |
+   +----------------------------------------------------------------------+
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Authors: Stanislav Malyshev                           |
    +----------------------------------------------------------------------+
diff --git a/ext/intl/formatter/formatter_main.cpp b/ext/intl/formatter/formatter_main.cpp
index a014323089a7..79750714a5f0 100644
--- a/ext/intl/formatter/formatter_main.cpp
+++ b/ext/intl/formatter/formatter_main.cpp
@@ -1,12 +1,12 @@
 /*
    +----------------------------------------------------------------------+
-   | This source file is subject to version 3.01 of the PHP license,      |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | https://www.php.net/license/3_01.txt                                 |
-   | If you did not receive a copy of the PHP license and are unable to   |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@php.net so we can mail you a copy immediately.               |
+   | Copyright © The PHP Group and Contributors.                          |
+   +----------------------------------------------------------------------+
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Authors: Stanislav Malyshev                           |
    +----------------------------------------------------------------------+
@@ -16,14 +16,17 @@
 #include 
 #endif
 
-#include 
-#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include "../intl_convertcpp.h"
+#include "formatter_class.h"
 
 extern "C" {
 #include "php_intl.h"
-#include "intl_convert.h"
 }
-#include "formatter_class.h"
 
 /* {{{ */
 static int numfmt_ctor(INTERNAL_FUNCTION_PARAMETERS)
@@ -32,8 +35,7 @@ static int numfmt_ctor(INTERNAL_FUNCTION_PARAMETERS)
 	char*       pattern = NULL;
 	size_t      locale_len = 0, pattern_len = 0;
 	zend_long   style;
-	UChar*      spattern     = NULL;
-	int32_t     spattern_len = 0;
+	UnicodeString upattern;
 	FORMATTER_METHOD_INIT_VARS;
 
 	ZEND_PARSE_PARAMETERS_START(2, 3)
@@ -53,7 +55,7 @@ static int numfmt_ctor(INTERNAL_FUNCTION_PARAMETERS)
 
 	/* Convert pattern (if specified) to UTF-16. */
 	if(pattern && pattern_len) {
-		intl_convert_utf8_to_utf16(&spattern, &spattern_len, pattern, pattern_len, &INTL_DATA_ERROR_CODE(nfo));
+		intl_stringFromChar(upattern, pattern, pattern_len, &INTL_DATA_ERROR_CODE(nfo));
 		INTL_CTOR_CHECK_STATUS(nfo, "error converting pattern to UTF-16");
 	}
 
@@ -61,7 +63,7 @@ static int numfmt_ctor(INTERNAL_FUNCTION_PARAMETERS)
 		locale = (char *)intl_locale_get_default();
 	}
 
-	if (strlen(uloc_getISO3Language(locale)) == 0) {
+	if (icu::Locale(locale).getISO3Language()[0] == '\0') {
 		zend_argument_value_error(1, "\"%s\" is invalid", locale);
 		return FAILURE;
 	}
@@ -70,12 +72,55 @@ static int numfmt_ctor(INTERNAL_FUNCTION_PARAMETERS)
 	const char* final_locale = canonicalized_locale ? canonicalized_locale : locale;
 
 	/* Create an ICU number formatter. */
-	FORMATTER_OBJECT(nfo) = unum_open(static_cast(style), spattern, spattern_len, final_locale, nullptr, &INTL_DATA_ERROR_CODE(nfo));
-
-	if (spattern) {
-		efree(spattern);
+	icu::Locale loc(final_locale);
+	switch (style) {
+		case UNUM_PATTERN_DECIMAL: {
+			icu::DecimalFormatSymbols *syms = new icu::DecimalFormatSymbols(loc, INTL_DATA_ERROR_CODE(nfo));
+			if (U_FAILURE(INTL_DATA_ERROR_CODE(nfo))) {
+				delete syms;
+				break;
+			}
+			FORMATTER_OBJECT(nfo) = new icu::DecimalFormat(upattern, syms, INTL_DATA_ERROR_CODE(nfo));
+			if (FORMATTER_OBJECT(nfo) == nullptr) {
+				delete syms;
+			}
+			break;
+		}
+		case UNUM_PATTERN_RULEBASED: {
+			UParseError parseError;
+			FORMATTER_OBJECT(nfo) = new icu::RuleBasedNumberFormat(upattern, loc, parseError, INTL_DATA_ERROR_CODE(nfo));
+			break;
+		}
+		case UNUM_SPELLOUT:
+			FORMATTER_OBJECT(nfo) = new icu::RuleBasedNumberFormat(icu::URBNF_SPELLOUT, loc, INTL_DATA_ERROR_CODE(nfo));
+			break;
+		case UNUM_ORDINAL:
+			FORMATTER_OBJECT(nfo) = new icu::RuleBasedNumberFormat(icu::URBNF_ORDINAL, loc, INTL_DATA_ERROR_CODE(nfo));
+			break;
+		case UNUM_DURATION:
+			FORMATTER_OBJECT(nfo) = new icu::RuleBasedNumberFormat(icu::URBNF_DURATION, loc, INTL_DATA_ERROR_CODE(nfo));
+			break;
+		case UNUM_NUMBERING_SYSTEM: {
+			UErrorCode localErr = U_ZERO_ERROR;
+			int32_t keywordLength = loc.getKeywordValue("numbers", nullptr, 0, localErr);
+			if (keywordLength > 0) {
+				FORMATTER_OBJECT(nfo) = NumberFormat::createInstance(loc, UNUM_DEFAULT, INTL_DATA_ERROR_CODE(nfo));
+			} else {
+				FORMATTER_OBJECT(nfo) = new icu::RuleBasedNumberFormat(icu::URBNF_NUMBERING_SYSTEM, loc, INTL_DATA_ERROR_CODE(nfo));
+			}
+			break;
+		}
+		case UNUM_DECIMAL_COMPACT_SHORT:
+			FORMATTER_OBJECT(nfo) = icu::CompactDecimalFormat::createInstance(loc, UNUM_SHORT, INTL_DATA_ERROR_CODE(nfo));
+			break;
+		case UNUM_DECIMAL_COMPACT_LONG:
+			FORMATTER_OBJECT(nfo) = icu::CompactDecimalFormat::createInstance(loc, UNUM_LONG, INTL_DATA_ERROR_CODE(nfo));
+			break;
+		default:
+			FORMATTER_OBJECT(nfo) = NumberFormat::createInstance(loc, static_cast(style), INTL_DATA_ERROR_CODE(nfo));
+			break;
 	}
-	
+
 	if (canonicalized_locale) {
 		efree(canonicalized_locale);
 	}
diff --git a/ext/intl/formatter/formatter_parse.cpp b/ext/intl/formatter/formatter_parse.cpp
index c7d0df8cbda0..7bbc461516bc 100644
--- a/ext/intl/formatter/formatter_parse.cpp
+++ b/ext/intl/formatter/formatter_parse.cpp
@@ -1,12 +1,12 @@
 /*
    +----------------------------------------------------------------------+
-   | This source file is subject to version 3.01 of the PHP license,      |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | https://www.php.net/license/3_01.txt                                 |
-   | If you did not receive a copy of the PHP license and are unable to   |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@php.net so we can mail you a copy immediately.               |
+   | Copyright © The PHP Group and Contributors.                          |
+   +----------------------------------------------------------------------+
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Authors: Stanislav Malyshev                           |
    +----------------------------------------------------------------------+
@@ -16,16 +16,18 @@
 #include 
 #endif
 
+#include 
+#include 
+#include "../intl_convertcpp.h"
+#include "formatter_class.h"
+#include "formatter_format.h"
+
 extern "C" {
 #include "php_intl.h"
-#include "intl_convert.h"
 }
 
-#include 
 #include 
-
-#include "formatter_class.h"
-#include "formatter_format.h"
+#include 
 
 #define ICU_LOCALE_BUG 1
 
@@ -33,14 +35,9 @@ extern "C" {
 U_CFUNC PHP_FUNCTION( numfmt_parse )
 {
 	zend_long type = FORMAT_TYPE_DOUBLE;
-	UChar* sstr = NULL;
-	int32_t sstr_len = 0;
 	char* str = NULL;
 	size_t str_len;
-	int32_t val32, position = 0;
-	int64_t val64;
-	double val_double;
-	int32_t* position_p = NULL;
+	int32_t position = 0;
 	zval *zposition = NULL;
 	char *oldlocale;
 	FORMATTER_METHOD_INIT_VARS;
@@ -54,14 +51,14 @@ U_CFUNC PHP_FUNCTION( numfmt_parse )
 
 	if (zposition) {
 		position = (int32_t) zval_get_long(zposition);
-		position_p = &position;
 	}
 
 	/* Fetch the object. */
 	FORMATTER_METHOD_FETCH_OBJECT;
 
 	/* Convert given string to UTF-16. */
-	intl_convert_utf8_to_utf16(&sstr, &sstr_len, str, str_len, &INTL_DATA_ERROR_CODE(nfo));
+	icu::UnicodeString ustr;
+	intl_stringFromChar(ustr, str, str_len, &INTL_DATA_ERROR_CODE(nfo));
 	INTL_METHOD_CHECK_STATUS( nfo, "String conversion to UTF-16 failed" );
 
 #if ICU_LOCALE_BUG && defined(LC_NUMERIC)
@@ -72,21 +69,38 @@ U_CFUNC PHP_FUNCTION( numfmt_parse )
 
 	switch(type) {
 		case FORMAT_TYPE_INT32:
-			val32 = unum_parse(FORMATTER_OBJECT(nfo), sstr, sstr_len, position_p, &INTL_DATA_ERROR_CODE(nfo));
-			RETVAL_LONG(val32);
-			break;
 		case FORMAT_TYPE_INT64:
-			val64 = unum_parseInt64(FORMATTER_OBJECT(nfo), sstr, sstr_len, position_p, &INTL_DATA_ERROR_CODE(nfo));
-			if(val64 > ZEND_LONG_MAX || val64 < ZEND_LONG_MIN) {
-				RETVAL_DOUBLE(val64);
+		case FORMAT_TYPE_DOUBLE:
+		{
+			icu::Formattable result;
+			icu::ParsePosition pp(position);
+			FORMATTER_OBJECT(nfo)->parse(ustr, result, pp);
+
+			if (pp.getErrorIndex() >= 0) {
+				INTL_DATA_ERROR_CODE(nfo) = U_PARSE_ERROR;
 			} else {
-				RETVAL_LONG((zend_long)val64);
+				position = pp.getIndex();
+				switch(type) {
+					case FORMAT_TYPE_INT32:
+						RETVAL_LONG(result.getLong(INTL_DATA_ERROR_CODE(nfo)));
+						break;
+					case FORMAT_TYPE_INT64:
+					{
+						int64_t val64 = result.getInt64(INTL_DATA_ERROR_CODE(nfo));
+						if(val64 > ZEND_LONG_MAX || val64 < ZEND_LONG_MIN) {
+							RETVAL_DOUBLE(val64);
+						} else {
+							RETVAL_LONG((zend_long)val64);
+						}
+						break;
+					}
+					case FORMAT_TYPE_DOUBLE:
+						RETVAL_DOUBLE(result.getDouble(INTL_DATA_ERROR_CODE(nfo)));
+						break;
+				}
 			}
 			break;
-		case FORMAT_TYPE_DOUBLE:
-			val_double = unum_parseDouble(FORMATTER_OBJECT(nfo), sstr, sstr_len, position_p, &INTL_DATA_ERROR_CODE(nfo));
-			RETVAL_DOUBLE(val_double);
-			break;
+		}
 		case FORMAT_TYPE_CURRENCY:
 			if (hasThis()) {
 				const char *space;
@@ -113,10 +127,6 @@ U_CFUNC PHP_FUNCTION( numfmt_parse )
 	efree(oldlocale);
 #endif
 
-	if (sstr) {
-		efree(sstr);
-	}
-
 	INTL_METHOD_CHECK_STATUS( nfo, "Number parsing failed" );
 }
 /* }}} */
@@ -124,14 +134,8 @@ U_CFUNC PHP_FUNCTION( numfmt_parse )
 /* {{{ Parse a number as currency. */
 U_CFUNC PHP_FUNCTION( numfmt_parse_currency )
 {
-	double number;
-	UChar currency[5] = {0};
-	UChar* sstr = NULL;
-	int32_t sstr_len = 0;
-	zend_string *u8str;
 	char *str;
 	size_t str_len;
-	int32_t* position_p = NULL;
 	int32_t position = 0;
 	zval *zcurrency, *zposition = NULL;
 	FORMATTER_METHOD_INIT_VARS;
@@ -147,27 +151,34 @@ U_CFUNC PHP_FUNCTION( numfmt_parse_currency )
 	FORMATTER_METHOD_FETCH_OBJECT;
 
 	/* Convert given string to UTF-16. */
-	intl_convert_utf8_to_utf16(&sstr, &sstr_len, str, str_len, &INTL_DATA_ERROR_CODE(nfo));
+	icu::UnicodeString ustr;
+	intl_stringFromChar(ustr, str, str_len, &INTL_DATA_ERROR_CODE(nfo));
 	INTL_METHOD_CHECK_STATUS( nfo, "String conversion to UTF-16 failed" );
 
 	if(zposition) {
 		position = (int32_t) zval_get_long(zposition);
-		position_p = &position;
 	}
 
-	number = unum_parseDoubleCurrency(FORMATTER_OBJECT(nfo), sstr, sstr_len, position_p, currency, &INTL_DATA_ERROR_CODE(nfo));
-	if(zposition) {
-		ZEND_TRY_ASSIGN_REF_LONG(zposition, position);
+	icu::ParsePosition pp(position);
+	std::unique_ptr currAmt(FORMATTER_OBJECT(nfo)->parseCurrency(ustr, pp));
+
+	if (currAmt == nullptr || pp.getErrorIndex() >= 0) {
+		INTL_DATA_ERROR_CODE(nfo) = U_PARSE_ERROR;
+		INTL_METHOD_CHECK_STATUS( nfo, "Number parsing failed" );
 	}
-	if (sstr) {
-		efree(sstr);
+
+	if(zposition) {
+		ZEND_TRY_ASSIGN_REF_LONG(zposition, pp.getIndex());
 	}
-	INTL_METHOD_CHECK_STATUS( nfo, "Number parsing failed" );
+
+	double number = currAmt->getNumber().getDouble(INTL_DATA_ERROR_CODE(nfo));
 
 	/* Convert parsed currency to UTF-8 and pass it back to caller. */
-	u8str = intl_convert_utf16_to_utf8(currency, u_strlen(currency), &INTL_DATA_ERROR_CODE(nfo));
+	icu::UnicodeString ucurrency(currAmt->getISOCurrency());
+
+	zend_string *u8str = intl_charFromString(ucurrency, &INTL_DATA_ERROR_CODE(nfo));
 	INTL_METHOD_CHECK_STATUS( nfo, "Currency conversion to UTF-8 failed" );
-	ZEND_TRY_ASSIGN_REF_NEW_STR(zcurrency, u8str);
+	ZEND_TRY_ASSIGN_REF_STR(zcurrency, u8str);
 
 	RETVAL_DOUBLE( number );
 }
diff --git a/ext/intl/grapheme/grapheme.h b/ext/intl/grapheme/grapheme.h
index 8ec470d47927..b52f48f9d142 100644
--- a/ext/intl/grapheme/grapheme.h
+++ b/ext/intl/grapheme/grapheme.h
@@ -1,12 +1,12 @@
 /*
    +----------------------------------------------------------------------+
-   | This source file is subject to version 3.01 of the PHP license,      |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | https://www.php.net/license/3_01.txt                                 |
-   | If you did not receive a copy of the PHP license and are unable to   |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@php.net so we can mail you a copy immediately.               |
+   | Copyright © The PHP Group and Contributors.                          |
+   +----------------------------------------------------------------------+
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Authors: Ed Batutis                                  |
    +----------------------------------------------------------------------+
diff --git a/ext/intl/grapheme/grapheme_string.cpp b/ext/intl/grapheme/grapheme_string.cpp
index 36c0cc0f732c..9b463fcd94cf 100644
--- a/ext/intl/grapheme/grapheme_string.cpp
+++ b/ext/intl/grapheme/grapheme_string.cpp
@@ -1,12 +1,12 @@
 /*
    +----------------------------------------------------------------------+
-   | This source file is subject to version 3.01 of the PHP license,      |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | https://www.php.net/license/3_01.txt                                 |
-   | If you did not receive a copy of the PHP license and are unable to   |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@php.net so we can mail you a copy immediately.               |
+   | Copyright © The PHP Group and Contributors.                          |
+   +----------------------------------------------------------------------+
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Author: Ed Batutis 								  |
    +----------------------------------------------------------------------+
diff --git a/ext/intl/grapheme/grapheme_util.cpp b/ext/intl/grapheme/grapheme_util.cpp
index a04f3db0b8a6..d5bbef6009cd 100644
--- a/ext/intl/grapheme/grapheme_util.cpp
+++ b/ext/intl/grapheme/grapheme_util.cpp
@@ -1,12 +1,12 @@
 /*
    +----------------------------------------------------------------------+
-   | This source file is subject to version 3.01 of the PHP license,      |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | https://www.php.net/license/3_01.txt                                 |
-   | If you did not receive a copy of the PHP license and are unable to   |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@php.net so we can mail you a copy immediately.               |
+   | Copyright © The PHP Group and Contributors.                          |
+   +----------------------------------------------------------------------+
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Author: Ed Batutis                                   |
    +----------------------------------------------------------------------+
diff --git a/ext/intl/grapheme/grapheme_util.h b/ext/intl/grapheme/grapheme_util.h
index 57d2ace384f8..a1d67981d270 100644
--- a/ext/intl/grapheme/grapheme_util.h
+++ b/ext/intl/grapheme/grapheme_util.h
@@ -1,12 +1,12 @@
 /*
    +----------------------------------------------------------------------+
-   | This source file is subject to version 3.01 of the PHP license,      |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | https://www.php.net/license/3_01.txt                                 |
-   | If you did not receive a copy of the PHP license and are unable to   |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@php.net so we can mail you a copy immediately.               |
+   | Copyright © The PHP Group and Contributors.                          |
+   +----------------------------------------------------------------------+
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Authors: Ed Batutis                                  |
    +----------------------------------------------------------------------+
diff --git a/ext/intl/idn/idn.cpp b/ext/intl/idn/idn.cpp
index 6c7e4d8c6d68..28708eb93508 100644
--- a/ext/intl/idn/idn.cpp
+++ b/ext/intl/idn/idn.cpp
@@ -1,14 +1,12 @@
 /*
    +----------------------------------------------------------------------+
-   | Copyright (c) The PHP Group                                          |
+   | Copyright © The PHP Group and Contributors.                          |
    +----------------------------------------------------------------------+
-   | This source file is subject to version 3.01 of the PHP license,      |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | https://www.php.net/license/3_01.txt                                 |
-   | If you did not receive a copy of the PHP license and are unable to   |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@php.net so we can mail you a copy immediately.               |
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Author: Pierre A. Joye                               |
    |         Gustavo Lopes                            |
diff --git a/ext/intl/idn/idn.h b/ext/intl/idn/idn.h
index 596e63f207e0..cf3af63a26ae 100644
--- a/ext/intl/idn/idn.h
+++ b/ext/intl/idn/idn.h
@@ -1,14 +1,12 @@
 /*
    +----------------------------------------------------------------------+
-   | Copyright (c) The PHP Group                                          |
+   | Copyright © The PHP Group and Contributors.                          |
    +----------------------------------------------------------------------+
-   | This source file is subject to version 3.01 of the PHP license,      |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | https://www.php.net/license/3_01.txt                                 |
-   | If you did not receive a copy of the PHP license and are unable to   |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@php.net so we can mail you a copy immediately.               |
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Author: Pierre A. Joye                               |
    +----------------------------------------------------------------------+
diff --git a/ext/intl/intl_common.h b/ext/intl/intl_common.h
index cef96325e9af..1fdb1c16efed 100644
--- a/ext/intl/intl_common.h
+++ b/ext/intl/intl_common.h
@@ -1,12 +1,12 @@
 /*
    +----------------------------------------------------------------------+
-   | This source file is subject to version 3.01 of the PHP license,      |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | https://www.php.net/license/3_01.txt                                 |
-   | If you did not receive a copy of the PHP license and are unable to   |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@php.net so we can mail you a copy immediately.               |
+   | Copyright © The PHP Group and Contributors.                          |
+   +----------------------------------------------------------------------+
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Authors: Vadim Savchuk                   |
    |          Dmitry Lakhtyuk                |
diff --git a/ext/intl/intl_convert.c b/ext/intl/intl_convert.c
index 39f70821e117..abbcc6c1fa73 100644
--- a/ext/intl/intl_convert.c
+++ b/ext/intl/intl_convert.c
@@ -1,12 +1,12 @@
 /*
    +----------------------------------------------------------------------+
-   | This source file is subject to version 3.01 of the PHP license,      |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | https://www.php.net/license/3_01.txt                                 |
-   | If you did not receive a copy of the PHP license and are unable to   |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@php.net so we can mail you a copy immediately.               |
+   | Copyright © The PHP Group and Contributors.                          |
+   +----------------------------------------------------------------------+
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Authors: Vadim Savchuk                   |
    |          Dmitry Lakhtyuk                |
diff --git a/ext/intl/intl_convert.h b/ext/intl/intl_convert.h
index 5cc3a671333d..443d373d55c2 100644
--- a/ext/intl/intl_convert.h
+++ b/ext/intl/intl_convert.h
@@ -1,12 +1,12 @@
 /*
    +----------------------------------------------------------------------+
-   | This source file is subject to version 3.01 of the PHP license,      |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | https://www.php.net/license/3_01.txt                                 |
-   | If you did not receive a copy of the PHP license and are unable to   |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@php.net so we can mail you a copy immediately.               |
+   | Copyright © The PHP Group and Contributors.                          |
+   +----------------------------------------------------------------------+
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Authors: Vadim Savchuk                   |
    |          Dmitry Lakhtyuk                |
diff --git a/ext/intl/intl_convertcpp.cpp b/ext/intl/intl_convertcpp.cpp
index b919c3fb4087..70d28e5c23ca 100644
--- a/ext/intl/intl_convertcpp.cpp
+++ b/ext/intl/intl_convertcpp.cpp
@@ -1,12 +1,12 @@
 /*
    +----------------------------------------------------------------------+
-   | This source file is subject to version 3.01 of the PHP license,      |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | https://www.php.net/license/3_01.txt                                 |
-   | If you did not receive a copy of the PHP license and are unable to   |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@php.net so we can mail you a copy immediately.               |
+   | Copyright © The PHP Group and Contributors.                          |
+   +----------------------------------------------------------------------+
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Authors: Gustavo Lopes                           |
    +----------------------------------------------------------------------+
@@ -72,7 +72,7 @@ zend_string* intl_charFromString(const UnicodeString &from, UErrorCode *status)
 
 	const UChar *utf16buf = from.getBuffer();
 	int32_t actual_len;
-	u_strToUTF8WithSub(ZSTR_VAL(u8res), capacity, &actual_len, utf16buf, from.length(),
+	u_strToUTF8WithSub(ZSTR_VAL(u8res), capacity + 1, &actual_len, utf16buf, from.length(),
 		U_SENTINEL, NULL, status);
 
 	if (U_FAILURE(*status)) {
diff --git a/ext/intl/intl_convertcpp.h b/ext/intl/intl_convertcpp.h
index 28948c2e01ca..ef4310bac4ff 100644
--- a/ext/intl/intl_convertcpp.h
+++ b/ext/intl/intl_convertcpp.h
@@ -1,12 +1,12 @@
 /*
    +----------------------------------------------------------------------+
-   | This source file is subject to version 3.01 of the PHP license,      |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | https://www.php.net/license/3_01.txt                                 |
-   | If you did not receive a copy of the PHP license and are unable to   |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@php.net so we can mail you a copy immediately.               |
+   | Copyright © The PHP Group and Contributors.                          |
+   +----------------------------------------------------------------------+
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Authors: Gustavo Lopes                           |
    +----------------------------------------------------------------------+
diff --git a/ext/intl/intl_cppshims.h b/ext/intl/intl_cppshims.h
index 169448a2edf3..d2bc5f9a240d 100644
--- a/ext/intl/intl_cppshims.h
+++ b/ext/intl/intl_cppshims.h
@@ -1,12 +1,12 @@
 /*
    +----------------------------------------------------------------------+
-   | This source file is subject to version 3.01 of the PHP license,      |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | https://www.php.net/license/3_01.txt                                 |
-   | If you did not receive a copy of the PHP license and are unable to   |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@php.net so we can mail you a copy immediately.               |
+   | Copyright © The PHP Group and Contributors.                          |
+   +----------------------------------------------------------------------+
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Authors: Gustavo Lopes                           |
    +----------------------------------------------------------------------+
diff --git a/ext/intl/intl_data.h b/ext/intl/intl_data.h
index c818427e07e1..c36f0adf5665 100644
--- a/ext/intl/intl_data.h
+++ b/ext/intl/intl_data.h
@@ -1,12 +1,12 @@
 /*
    +----------------------------------------------------------------------+
-   | This source file is subject to version 3.01 of the PHP license,      |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | https://www.php.net/license/3_01.txt                                 |
-   | If you did not receive a copy of the PHP license and are unable to   |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@php.net so we can mail you a copy immediately.               |
+   | Copyright © The PHP Group and Contributors.                          |
+   +----------------------------------------------------------------------+
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Authors: Vadim Savchuk                   |
    |          Dmitry Lakhtyuk                |
diff --git a/ext/intl/intl_error.c b/ext/intl/intl_error.c
index be6e53fb5439..f19a5ec617dc 100644
--- a/ext/intl/intl_error.c
+++ b/ext/intl/intl_error.c
@@ -1,12 +1,12 @@
 /*
    +----------------------------------------------------------------------+
-   | This source file is subject to version 3.01 of the PHP license,      |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | https://www.php.net/license/3_01.txt                                 |
-   | If you did not receive a copy of the PHP license and are unable to   |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@php.net so we can mail you a copy immediately.               |
+   | Copyright © The PHP Group and Contributors.                          |
+   +----------------------------------------------------------------------+
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Authors: Vadim Savchuk                   |
    |          Dmitry Lakhtyuk                |
diff --git a/ext/intl/intl_error.h b/ext/intl/intl_error.h
index 8a9bff0b271c..dd13cf84ebd2 100644
--- a/ext/intl/intl_error.h
+++ b/ext/intl/intl_error.h
@@ -1,12 +1,12 @@
 /*
    +----------------------------------------------------------------------+
-   | This source file is subject to version 3.01 of the PHP license,      |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | https://www.php.net/license/3_01.txt                                 |
-   | If you did not receive a copy of the PHP license and are unable to   |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@php.net so we can mail you a copy immediately.               |
+   | Copyright © The PHP Group and Contributors.                          |
+   +----------------------------------------------------------------------+
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Authors: Vadim Savchuk                   |
    |          Dmitry Lakhtyuk                |
@@ -37,7 +37,7 @@ void        intl_error_set( intl_error* err, UErrorCode code, const char* msg);
 UErrorCode  intl_error_get_code( intl_error* err );
 zend_string* intl_error_get_message( intl_error* err );
 
-// Wrappers to synchonize object's and global error structures.
+// Wrappers to synchronize object's and global error structures.
 void        intl_errors_reset( intl_error* err );
 void        intl_errors_set_custom_msg( intl_error* err, const char* msg);
 void        intl_errors_set_code( intl_error* err, UErrorCode err_code );
diff --git a/ext/intl/listformatter/listformatter_class.cpp b/ext/intl/listformatter/listformatter_class.cpp
index 8a7f9ffef9c2..221dadfcd3b5 100644
--- a/ext/intl/listformatter/listformatter_class.cpp
+++ b/ext/intl/listformatter/listformatter_class.cpp
@@ -1,12 +1,12 @@
 /*
    +----------------------------------------------------------------------+
-   | This source file is subject to version 3.01 of the PHP license,      |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | https://www.php.net/license/3_01.txt                                 |
-   | If you did not receive a copy of the PHP license and are unable to   |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@php.net so we can mail you a copy immediately.               |
+   | Copyright © The PHP Group and Contributors.                          |
+   +----------------------------------------------------------------------+
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Authors: Bogdan Ungureanu               |
    +----------------------------------------------------------------------+
@@ -14,22 +14,27 @@
 
 extern "C" {
 #include "php.h"
+}
+
+#include 
+#include 
+#include "../intl_convertcpp.h"
+
+extern "C" {
 #include "php_intl.h"
-#include "intl_convert.h"
 }
-#include 
 #include "listformatter_class.h"
 #include "listformatter_arginfo.h"
 
+#include 
+
 static zend_object_handlers listformatter_handlers;
 
 static void listformatter_free_obj(zend_object *object)
 {
     ListFormatter_object *obj = php_intl_listformatter_fetch_object(object);
 
-    if( obj->lf_data.ulistfmt )
-        ulistfmt_close( obj->lf_data.ulistfmt );
-
+    delete obj->lf_data.ulistfmt;
     obj->lf_data.ulistfmt = nullptr;
     intl_error_reset( &obj->lf_data.error );
 
@@ -69,6 +74,11 @@ PHP_METHOD(IntlListFormatter, __construct)
         Z_PARAM_LONG(width)
     ZEND_PARSE_PARAMETERS_END();
 
+    if (LISTFORMATTER_OBJECT(obj)) {
+        zend_throw_error(NULL, "IntlListFormatter object is already constructed");
+        RETURN_THROWS();
+    }
+
     if(locale_len == 0) {
         locale = (char *)intl_locale_get_default();
     }
@@ -78,7 +88,7 @@ PHP_METHOD(IntlListFormatter, __construct)
         RETURN_THROWS();
     }
 
-    if (strlen(uloc_getISO3Language(locale)) == 0) {
+    if (icu::Locale(locale).getISO3Language()[0] == '\0') {
         zend_argument_value_error(1, "\"%s\" is invalid", locale);
         RETURN_THROWS();
     }
@@ -89,13 +99,13 @@ PHP_METHOD(IntlListFormatter, __construct)
             zend_argument_value_error(2, "must be one of IntlListFormatter::TYPE_AND, IntlListFormatter::TYPE_OR, or IntlListFormatter::TYPE_UNITS");
             RETURN_THROWS();
         }
-        
+
         if (width != ULISTFMT_WIDTH_WIDE && width != ULISTFMT_WIDTH_SHORT && width != ULISTFMT_WIDTH_NARROW) {
             zend_argument_value_error(3, "must be one of IntlListFormatter::WIDTH_WIDE, IntlListFormatter::WIDTH_SHORT, or IntlListFormatter::WIDTH_NARROW");
             RETURN_THROWS();
         }
 
-        LISTFORMATTER_OBJECT(obj) = ulistfmt_openForType(locale, static_cast(type), static_cast(width), &status);
+        LISTFORMATTER_OBJECT(obj) = ListFormatter::createInstance(icu::Locale(locale), static_cast(type), static_cast(width), status);
     #else
         if (type != INTL_LISTFORMATTER_FALLBACK_TYPE_AND) {
             zend_argument_value_error(2, "contains an unsupported type. ICU 66 and below only support IntlListFormatter::TYPE_AND");
@@ -107,7 +117,7 @@ PHP_METHOD(IntlListFormatter, __construct)
             RETURN_THROWS();
         }
 
-        LISTFORMATTER_OBJECT(obj) = ulistfmt_open(locale, &status);
+        LISTFORMATTER_OBJECT(obj) = ListFormatter::createInstance(icu::Locale(locale), status);
     #endif
 
     if (U_FAILURE(status)) {
@@ -126,89 +136,54 @@ PHP_METHOD(IntlListFormatter, format)
         Z_PARAM_ARRAY_HT(ht)
     ZEND_PARSE_PARAMETERS_END();
 
+    intl_errors_reset(LISTFORMATTER_ERROR_P(obj));
+
     uint32_t count = zend_hash_num_elements(ht);
     if (count == 0) {
         RETURN_EMPTY_STRING();
     }
 
-    const UChar **items = (const UChar **)safe_emalloc(count, sizeof(const UChar *), 0);
-    int32_t *itemLengths = (int32_t *)safe_emalloc(count, sizeof(int32_t), 0);
+    std::unique_ptr items(new UnicodeString[count]);
     uint32_t i = 0;
     zval *val;
 
     ZEND_HASH_FOREACH_VAL(ht, val) {
         zend_string *str_val, *tmp_str;
-        
-        str_val = zval_get_tmp_string(val, &tmp_str);
-        
-        // Convert PHP string to UTF-16
-        UChar *ustr = nullptr;
-        int32_t ustr_len = 0;
-        UErrorCode status = U_ZERO_ERROR;
-        
-        intl_convert_utf8_to_utf16(&ustr, &ustr_len, ZSTR_VAL(str_val), ZSTR_LEN(str_val), &status);
+        UErrorCode conv_status = U_ZERO_ERROR;
+
+        str_val = zval_try_get_tmp_string(val, &tmp_str);
+        if (UNEXPECTED(!str_val)) {
+            RETURN_THROWS();
+        }
+        intl_stringFromChar(items[i], ZSTR_VAL(str_val), ZSTR_LEN(str_val), &conv_status);
         zend_tmp_string_release(tmp_str);
 
-        if (U_FAILURE(status)) {
-            // We can't use goto cleanup because items and itemLengths are incompletely allocated
-            for (uint32_t j = 0; j < i; j++) {
-                efree((void *)items[j]);
-            }
-            efree(items);
-            efree(itemLengths);
-            intl_error_set(nullptr, status, "Failed to convert string to UTF-16");
+        if (U_FAILURE(conv_status)) {
+            intl_errors_set(LISTFORMATTER_ERROR_P(obj), conv_status, "Failed to convert string to UTF-16");
             RETURN_FALSE;
         }
-        
-        items[i] = ustr;
-        itemLengths[i] = ustr_len;
+
         i++;
     } ZEND_HASH_FOREACH_END();
 
     UErrorCode status = U_ZERO_ERROR;
-    int32_t resultLength;
-    UChar *result = nullptr;
-    zend_string *ret = nullptr;
-
-    resultLength = ulistfmt_format(LISTFORMATTER_OBJECT(obj), items, itemLengths, count, nullptr, 0, &status);
+    UnicodeString result;
 
-    if (U_FAILURE(status) && status != U_BUFFER_OVERFLOW_ERROR) {
-        intl_error_set(nullptr, status, "Failed to format list");
-        RETVAL_FALSE;
-        goto cleanup;
-    }
-
-    // Allocate buffer and try again
-    status = U_ZERO_ERROR;
-    result = (UChar *)safe_emalloc(resultLength + 1, sizeof(UChar), 0);
-    ulistfmt_format(LISTFORMATTER_OBJECT(obj), items, itemLengths, count, result, resultLength, &status);
+    LISTFORMATTER_OBJECT(obj)->format(items.get(), count, result, status);
 
     if (U_FAILURE(status)) {
-        if (result) {
-            efree(result);
-        }
-        intl_error_set(nullptr, status, "Failed to format list");
-        RETVAL_FALSE;
-        goto cleanup;
+        intl_errors_set(LISTFORMATTER_ERROR_P(obj), status, "Failed to format list");
+        RETURN_FALSE;
     }
 
-    // Convert result back to UTF-8
-    ret = intl_convert_utf16_to_utf8(result, resultLength, &status);
-    efree(result);
-    
+    zend_string *ret = intl_charFromString(result, &status);
+
     if (!ret) {
-        intl_error_set(nullptr, status, "Failed to convert result to UTF-8");
-        RETVAL_FALSE;
-    } else {
-        RETVAL_NEW_STR(ret);
+        intl_errors_set(LISTFORMATTER_ERROR_P(obj), status, "Failed to convert result to UTF-8");
+        RETURN_FALSE;
     }
 
-cleanup:
-    for (i = 0; i < count; i++) {
-        efree((void *)items[i]);
-    }
-    efree(items);
-    efree(itemLengths);
+    RETVAL_STR(ret);
 }
 
 PHP_METHOD(IntlListFormatter, getErrorCode)
@@ -236,9 +211,9 @@ void listformatter_register_class(void)
 {
     zend_class_entry *class_entry = register_class_IntlListFormatter();
     class_entry->create_object = listformatter_create_object;
-    
+
     memcpy(&listformatter_handlers, zend_get_std_object_handlers(), sizeof(zend_object_handlers));
-    listformatter_handlers.offset = XtOffsetOf(ListFormatter_object, zo);
+    listformatter_handlers.offset = offsetof(ListFormatter_object, zo);
     listformatter_handlers.free_obj = listformatter_free_obj;
     listformatter_handlers.clone_obj = nullptr;
 }
diff --git a/ext/intl/listformatter/listformatter_class.h b/ext/intl/listformatter/listformatter_class.h
index 8edbf8d63e2d..7e7fd29207fc 100644
--- a/ext/intl/listformatter/listformatter_class.h
+++ b/ext/intl/listformatter/listformatter_class.h
@@ -1,12 +1,12 @@
 /*
    +----------------------------------------------------------------------+
-   | This source file is subject to version 3.01 of the PHP license,      |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | https://www.php.net/license/3_01.txt                                 |
-   | If you did not receive a copy of the PHP license and are unable to   |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@php.net so we can mail you a copy immediately.               |
+   | Copyright © The PHP Group and Contributors.                          |
+   +----------------------------------------------------------------------+
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Authors: Bogdan Ungureanu               |
    +----------------------------------------------------------------------+
@@ -21,14 +21,20 @@
 #include "intl_error.h"
 #include "intl_data.h"
 
-#include 
+#include 
+
+#ifdef __cplusplus
+using icu::ListFormatter;
+#else
+typedef void ListFormatter;
+#endif
 
 typedef struct {
     // error handling
     intl_error      error;
 
     // formatter handling
-    UListFormatter*  ulistfmt;
+    ListFormatter*  ulistfmt;
 } listformatter_data;
 
 typedef struct {
@@ -36,9 +42,7 @@ typedef struct {
     zend_object     zo;
 } ListFormatter_object;
 
-static inline ListFormatter_object *php_intl_listformatter_fetch_object(zend_object *obj) {
-    return (ListFormatter_object *)((char*)(obj) - XtOffsetOf(ListFormatter_object, zo));
-}
+#define php_intl_listformatter_fetch_object(obj) ZEND_CONTAINER_OF(obj, ListFormatter_object, zo)
 #define Z_INTL_LISTFORMATTER_P(zv) php_intl_listformatter_fetch_object(Z_OBJ_P(zv))
 
 #define LISTFORMATTER_ERROR(lfo) (lfo)->lf_data.error
diff --git a/ext/intl/locale/locale.cpp b/ext/intl/locale/locale.cpp
index 76b269ca85e3..bad1c775c1b0 100644
--- a/ext/intl/locale/locale.cpp
+++ b/ext/intl/locale/locale.cpp
@@ -1,12 +1,12 @@
 /*
    +----------------------------------------------------------------------+
-   | This source file is subject to version 3.01 of the PHP license,      |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | https://www.php.net/license/3_01.txt                                 |
-   | If you did not receive a copy of the PHP license and are unable to   |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@php.net so we can mail you a copy immediately.               |
+   | Copyright © The PHP Group and Contributors.                          |
+   +----------------------------------------------------------------------+
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Author: Kirti Velankar                         |
    +----------------------------------------------------------------------+
diff --git a/ext/intl/locale/locale.h b/ext/intl/locale/locale.h
index 31aef035050d..1c40871d2065 100644
--- a/ext/intl/locale/locale.h
+++ b/ext/intl/locale/locale.h
@@ -1,12 +1,12 @@
 /*
    +----------------------------------------------------------------------+
-   | This source file is subject to version 3.01 of the PHP license,      |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | https://www.php.net/license/3_01.txt                                 |
-   | If you did not receive a copy of the PHP license and are unable to   |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@php.net so we can mail you a copy immediately.               |
+   | Copyright © The PHP Group and Contributors.                          |
+   +----------------------------------------------------------------------+
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Authors: Kirti Velankar                        |
    +----------------------------------------------------------------------+
diff --git a/ext/intl/locale/locale_class.cpp b/ext/intl/locale/locale_class.cpp
index 75fde45d53d6..a8d34f2e9f24 100644
--- a/ext/intl/locale/locale_class.cpp
+++ b/ext/intl/locale/locale_class.cpp
@@ -1,12 +1,12 @@
 /*
    +----------------------------------------------------------------------+
-   | This source file is subject to version 3.01 of the PHP license,      |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | https://www.php.net/license/3_01.txt                                 |
-   | If you did not receive a copy of the PHP license and are unable to   |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@php.net so we can mail you a copy immediately.               |
+   | Copyright © The PHP Group and Contributors.                          |
+   +----------------------------------------------------------------------+
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Authors: Kirti Velankar                        |
    +----------------------------------------------------------------------+
diff --git a/ext/intl/locale/locale_class.h b/ext/intl/locale/locale_class.h
index 64a661ca2b44..86cbc6ed9421 100644
--- a/ext/intl/locale/locale_class.h
+++ b/ext/intl/locale/locale_class.h
@@ -1,12 +1,12 @@
 /*
    +----------------------------------------------------------------------+
-   | This source file is subject to version 3.01 of the PHP license,      |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | https://www.php.net/license/3_01.txt                                 |
-   | If you did not receive a copy of the PHP license and are unable to   |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@php.net so we can mail you a copy immediately.               |
+   | Copyright © The PHP Group and Contributors.                          |
+   +----------------------------------------------------------------------+
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Authors: Kirti Velankar                        |
    +----------------------------------------------------------------------+
diff --git a/ext/intl/locale/locale_methods.cpp b/ext/intl/locale/locale_methods.cpp
index 5cf6928a8cd3..ffcba02d322d 100644
--- a/ext/intl/locale/locale_methods.cpp
+++ b/ext/intl/locale/locale_methods.cpp
@@ -1,12 +1,12 @@
 /*
    +----------------------------------------------------------------------+
-   | This source file is subject to version 3.01 of the PHP license,      |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | https://www.php.net/license/3_01.txt                                 |
-   | If you did not receive a copy of the PHP license and are unable to   |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@php.net so we can mail you a copy immediately.               |
+   | Copyright © The PHP Group and Contributors.                          |
+   +----------------------------------------------------------------------+
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Authors: Kirti Velankar                        |
    +----------------------------------------------------------------------+
@@ -254,7 +254,7 @@ static zend_off_t getStrrtokenPos(char* str, zend_off_t savedPos)
 		}
 	}
 	if(result < 1){
-		/* Just in case inavlid locale e.g. '-x-xyz' or '-sl_Latn' */
+		/* Just in case invalid locale e.g. '-x-xyz' or '-sl_Latn' */
 		result =-1;
 	}
 	return result;
@@ -362,7 +362,7 @@ static zend_string* get_icu_value_internal( const char* loc_name , const char* t
 			if( strcmp(tag_name , LOC_LANG_TAG)==0 ){
 				return zend_string_init(loc_name, strlen(loc_name), 0);
 			} else {
-				/* Since Grandfathered , no value , do nothing , retutn NULL */
+				/* Since Grandfathered , no value , do nothing , return NULL */
 				return NULL;
 			}
 		}
@@ -457,7 +457,7 @@ static zend_string* get_icu_value_internal( const char* loc_name , const char* t
 		efree( mod_loc_name);
 	}
 
-	tag_value->len = strlen(tag_value->val);
+	tag_value->len = buflen;
 	return tag_value;
 }
 /* }}} */
@@ -736,7 +736,7 @@ U_CFUNC PHP_FUNCTION( locale_get_keywords )
 		Z_PARAM_PATH(loc_name, loc_name_len)
 	ZEND_PARSE_PARAMETERS_END();
 
-	INTL_CHECK_LOCALE_LEN(strlen(loc_name));
+	INTL_CHECK_LOCALE_LEN(loc_name_len);
 
 	if(loc_name_len == 0) {
 		loc_name = (char *)intl_locale_get_default();
@@ -815,7 +815,7 @@ static int append_key_value(smart_str* loc_name, HashTable* hash_arr, const char
 			/* not lang or grandfathered tag */
 			smart_str_appendl(loc_name, SEPARATOR , sizeof(SEPARATOR)-1);
 		}
-		smart_str_appendl(loc_name, Z_STRVAL_P(ele_value) , Z_STRLEN_P(ele_value));
+		smart_str_append(loc_name, Z_STR_P(ele_value));
 		return SUCCESS;
 	}
 
@@ -853,7 +853,7 @@ static int append_multiple_key_values(smart_str* loc_name, HashTable* hash_arr,
 			add_prefix( loc_name , key_name);
 
 			smart_str_appendl(loc_name, SEPARATOR , sizeof(SEPARATOR)-1);
-			smart_str_appendl(loc_name, Z_STRVAL_P(ele_value) , Z_STRLEN_P(ele_value));
+			smart_str_append(loc_name, Z_STR_P(ele_value));
 			return SUCCESS;
 		} else if(Z_TYPE_P(ele_value) == IS_ARRAY ) {
 			HashTable *arr = Z_ARRVAL_P(ele_value);
@@ -868,7 +868,7 @@ static int append_multiple_key_values(smart_str* loc_name, HashTable* hash_arr,
 					add_prefix(loc_name , key_name);
 				}
 				smart_str_appendl(loc_name, SEPARATOR , sizeof(SEPARATOR)-1);
-				smart_str_appendl(loc_name, Z_STRVAL_P(data) , Z_STRLEN_P(data));
+				smart_str_append(loc_name, Z_STR_P(data));
 			} ZEND_HASH_FOREACH_END();
 			return SUCCESS;
 		} else {
@@ -902,7 +902,7 @@ static int append_multiple_key_values(smart_str* loc_name, HashTable* hash_arr,
 					add_prefix(loc_name , cur_key_name);
 				}
 				smart_str_appendl(loc_name, SEPARATOR , sizeof(SEPARATOR)-1);
-				smart_str_appendl(loc_name, Z_STRVAL_P(ele_value) , Z_STRLEN_P(ele_value));
+				smart_str_append(loc_name, Z_STR_P(ele_value));
 			}
 		} /* end of for */
 	} /* end of else */
@@ -1127,7 +1127,7 @@ U_CFUNC PHP_FUNCTION(locale_parse)
 		Z_PARAM_PATH(loc_name, loc_name_len)
 	ZEND_PARSE_PARAMETERS_END();
 
-	INTL_CHECK_LOCALE_LEN(strlen(loc_name));
+	INTL_CHECK_LOCALE_LEN(loc_name_len);
 
 	if(loc_name_len == 0) {
 		loc_name = (char *)intl_locale_get_default();
@@ -1217,7 +1217,7 @@ static int strToMatch(const char* str ,char *retstr)
 			if( *str == '-' ){
 				*retstr =  '_';
 			} else {
-				*retstr = tolower(*str);
+				*retstr = tolower((unsigned char)*str);
 			}
 				str++;
 				retstr++;
@@ -1318,7 +1318,7 @@ U_CFUNC PHP_FUNCTION(locale_filter_matches)
 
 		if( token && (token==cur_lang_tag) ){
 			/* check if the char. after match is SEPARATOR */
-			chrcheck = token + (strlen(cur_loc_range));
+			chrcheck = token + can_loc_range->len;
 			if( isIDSeparator(*chrcheck) || isKeywordSeparator(*chrcheck) || isEndOfTag(*chrcheck) ){
 				efree( cur_lang_tag );
 				efree( cur_loc_range );
@@ -1350,14 +1350,14 @@ U_CFUNC PHP_FUNCTION(locale_filter_matches)
 	} /* end of if isCanonical */
 	else{
 		/* Convert to lower case for case-insensitive comparison */
-		cur_lang_tag = reinterpret_cast(ecalloc( 1, strlen(lang_tag ) + 1));
+		cur_lang_tag = reinterpret_cast(ecalloc(1, lang_tag_len + 1));
 
 		result = strToMatch( lang_tag , cur_lang_tag);
 		if( result == 0) {
 			efree( cur_lang_tag );
 			RETURN_FALSE;
 		}
-		cur_loc_range = reinterpret_cast(ecalloc( 1, strlen(loc_range ) + 1));
+		cur_loc_range = reinterpret_cast(ecalloc(1, loc_range_len + 1));
 		result = strToMatch( loc_range , cur_loc_range );
 		if( result == 0) {
 			efree( cur_lang_tag );
@@ -1370,7 +1370,7 @@ U_CFUNC PHP_FUNCTION(locale_filter_matches)
 
 		if( token && (token==cur_lang_tag) ){
 			/* check if the char. after match is SEPARATOR */
-			chrcheck = token + (strlen(cur_loc_range));
+			chrcheck = token + loc_range_len;
 			if( isIDSeparator(*chrcheck) || isEndOfTag(*chrcheck) ){
 				efree( cur_lang_tag );
 				efree( cur_loc_range );
@@ -1435,14 +1435,15 @@ static zend_string* lookup_loc_range(const char* loc_range, HashTable* hash_arr,
 			zend_argument_value_error(2, "must not contain any null bytes");
 			LOOKUP_CLEAN_RETURN(NULL);
 		}
-		cur_arr[cur_arr_len*2] = estrndup(Z_STRVAL_P(ele_value), Z_STRLEN_P(ele_value));
-		result = strToMatch(Z_STRVAL_P(ele_value), cur_arr[cur_arr_len*2]);
+		i = cur_arr_len*2;
+		cur_arr[i] = estrndup(Z_STRVAL_P(ele_value), Z_STRLEN_P(ele_value));
+		cur_arr_len++;
+		result = strToMatch(Z_STRVAL_P(ele_value), cur_arr[i]);
 		if(result == 0) {
 			intl_error_set(NULL, U_ILLEGAL_ARGUMENT_ERROR, "unable to canonicalize lang_tag");
 			LOOKUP_CLEAN_RETURN(NULL);
 		}
-		cur_arr[cur_arr_len*2+1] = Z_STRVAL_P(ele_value);
-		cur_arr_len++ ;
+		cur_arr[i+1] = Z_STRVAL_P(ele_value);
 	} ZEND_HASH_FOREACH_END(); /* end of for */
 
 	/* Canonicalize array elements */
@@ -1562,6 +1563,15 @@ U_CFUNC PHP_FUNCTION(locale_lookup)
 	}
 
 	result_str = lookup_loc_range(loc_range, hash_arr, boolCanonical);
+	if (EG(exception)) {
+		RETURN_THROWS();
+	}
+	if (U_FAILURE(intl_error_get_code(NULL))) {
+		if (result_str) {
+			zend_string_release_ex(result_str, 0);
+		}
+		RETURN_NULL();
+	}
 	if(result_str == NULL || ZSTR_VAL(result_str)[0] == '\0') {
 		if( fallback_loc_str ) {
 			result_str = zend_string_copy(fallback_loc_str);
diff --git a/ext/intl/msgformat/msgformat.cpp b/ext/intl/msgformat/msgformat.cpp
index a9e1f71bfc60..3857e97b4a4a 100644
--- a/ext/intl/msgformat/msgformat.cpp
+++ b/ext/intl/msgformat/msgformat.cpp
@@ -1,12 +1,12 @@
 /*
    +----------------------------------------------------------------------+
-   | This source file is subject to version 3.01 of the PHP license,      |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | https://www.php.net/license/3_01.txt                                 |
-   | If you did not receive a copy of the PHP license and are unable to   |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@php.net so we can mail you a copy immediately.               |
+   | Copyright © The PHP Group and Contributors.                          |
+   +----------------------------------------------------------------------+
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Authors: Stanislav Malyshev                           |
    +----------------------------------------------------------------------+
diff --git a/ext/intl/msgformat/msgformat_attr.cpp b/ext/intl/msgformat/msgformat_attr.cpp
index e7ec006e5e79..15c3525b858f 100644
--- a/ext/intl/msgformat/msgformat_attr.cpp
+++ b/ext/intl/msgformat/msgformat_attr.cpp
@@ -1,12 +1,12 @@
 /*
    +----------------------------------------------------------------------+
-   | This source file is subject to version 3.01 of the PHP license,      |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | https://www.php.net/license/3_01.txt                                 |
-   | If you did not receive a copy of the PHP license and are unable to   |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@php.net so we can mail you a copy immediately.               |
+   | Copyright © The PHP Group and Contributors.                          |
+   +----------------------------------------------------------------------+
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Authors: Stanislav Malyshev                           |
    +----------------------------------------------------------------------+
diff --git a/ext/intl/msgformat/msgformat_class.cpp b/ext/intl/msgformat/msgformat_class.cpp
index e762febf0d1b..c4d74924b04a 100644
--- a/ext/intl/msgformat/msgformat_class.cpp
+++ b/ext/intl/msgformat/msgformat_class.cpp
@@ -1,12 +1,12 @@
 /*
    +----------------------------------------------------------------------+
-   | This source file is subject to version 3.01 of the PHP license,      |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | https://www.php.net/license/3_01.txt                                 |
-   | If you did not receive a copy of the PHP license and are unable to   |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@php.net so we can mail you a copy immediately.               |
+   | Copyright © The PHP Group and Contributors.                          |
+   +----------------------------------------------------------------------+
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Authors: Stanislav Malyshev                           |
    +----------------------------------------------------------------------+
@@ -58,7 +58,7 @@ U_CFUNC zend_object *MessageFormatter_object_create(zend_class_entry *ce)
 /* {{{ MessageFormatter_object_clone */
 U_CFUNC zend_object *MessageFormatter_object_clone(zend_object *object)
 {
-	MessageFormatter_object     *mfo = php_intl_messageformatter_fetch_object(object);
+	const MessageFormatter_object     *mfo = php_intl_messageformatter_fetch_object(object);
 	zend_object             *new_obj = MessageFormatter_ce_ptr->create_object(object->ce);
 	MessageFormatter_object *new_mfo = php_intl_messageformatter_fetch_object(new_obj);
 
@@ -96,7 +96,7 @@ void msgformat_register_class( void )
 
 	memcpy(&MessageFormatter_handlers, &std_object_handlers,
 		sizeof MessageFormatter_handlers);
-	MessageFormatter_handlers.offset = XtOffsetOf(MessageFormatter_object, zo);
+	MessageFormatter_handlers.offset = offsetof(MessageFormatter_object, zo);
 	MessageFormatter_handlers.clone_obj = MessageFormatter_object_clone;
 	MessageFormatter_handlers.free_obj = MessageFormatter_object_free;
 }
diff --git a/ext/intl/msgformat/msgformat_class.h b/ext/intl/msgformat/msgformat_class.h
index 809fdec65418..849c45c14729 100644
--- a/ext/intl/msgformat/msgformat_class.h
+++ b/ext/intl/msgformat/msgformat_class.h
@@ -1,12 +1,12 @@
 /*
    +----------------------------------------------------------------------+
-   | This source file is subject to version 3.01 of the PHP license,      |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | https://www.php.net/license/3_01.txt                                 |
-   | If you did not receive a copy of the PHP license and are unable to   |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@php.net so we can mail you a copy immediately.               |
+   | Copyright © The PHP Group and Contributors.                          |
+   +----------------------------------------------------------------------+
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Authors: Stanislav Malyshev                           |
    +----------------------------------------------------------------------+
@@ -30,10 +30,7 @@ typedef struct {
 	zend_object     zo;
 } MessageFormatter_object;
 
-
-static inline MessageFormatter_object *php_intl_messageformatter_fetch_object(zend_object *obj) {
-	return (MessageFormatter_object *)((char*)(obj) - XtOffsetOf(MessageFormatter_object, zo));
-}
+#define php_intl_messageformatter_fetch_object(obj) ZEND_CONTAINER_OF(obj, MessageFormatter_object, zo)
 #define Z_INTL_MESSAGEFORMATTER_P(zv) php_intl_messageformatter_fetch_object(Z_OBJ_P(zv))
 
 void msgformat_register_class( void );
diff --git a/ext/intl/msgformat/msgformat_data.cpp b/ext/intl/msgformat/msgformat_data.cpp
index f8b7ec39601e..c629e8a3d818 100644
--- a/ext/intl/msgformat/msgformat_data.cpp
+++ b/ext/intl/msgformat/msgformat_data.cpp
@@ -1,12 +1,12 @@
 /*
    +----------------------------------------------------------------------+
-   | This source file is subject to version 3.01 of the PHP license,      |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | https://www.php.net/license/3_01.txt                                 |
-   | If you did not receive a copy of the PHP license and are unable to   |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@php.net so we can mail you a copy immediately.               |
+   | Copyright © The PHP Group and Contributors.                          |
+   +----------------------------------------------------------------------+
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Authors: Stanislav Malyshev                           |
    +----------------------------------------------------------------------+
diff --git a/ext/intl/msgformat/msgformat_data.h b/ext/intl/msgformat/msgformat_data.h
index bac94cbec34c..121c8360efea 100644
--- a/ext/intl/msgformat/msgformat_data.h
+++ b/ext/intl/msgformat/msgformat_data.h
@@ -1,12 +1,12 @@
 /*
    +----------------------------------------------------------------------+
-   | This source file is subject to version 3.01 of the PHP license,      |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | https://www.php.net/license/3_01.txt                                 |
-   | If you did not receive a copy of the PHP license and are unable to   |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@php.net so we can mail you a copy immediately.               |
+   | Copyright © The PHP Group and Contributors.                          |
+   +----------------------------------------------------------------------+
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Authors: Stanislav Malyshev                           |
    +----------------------------------------------------------------------+
diff --git a/ext/intl/msgformat/msgformat_format.cpp b/ext/intl/msgformat/msgformat_format.cpp
index 8e3ec28b389e..c0a02ad8db17 100644
--- a/ext/intl/msgformat/msgformat_format.cpp
+++ b/ext/intl/msgformat/msgformat_format.cpp
@@ -1,12 +1,12 @@
 /*
    +----------------------------------------------------------------------+
-   | This source file is subject to version 3.01 of the PHP license,      |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | https://www.php.net/license/3_01.txt                                 |
-   | If you did not receive a copy of the PHP license and are unable to   |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@php.net so we can mail you a copy immediately.               |
+   | Copyright © The PHP Group and Contributors.                          |
+   +----------------------------------------------------------------------+
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Authors: Stanislav Malyshev                           |
    +----------------------------------------------------------------------+
diff --git a/ext/intl/msgformat/msgformat_helpers.cpp b/ext/intl/msgformat/msgformat_helpers.cpp
index 25e8dbf86968..12e05af57219 100644
--- a/ext/intl/msgformat/msgformat_helpers.cpp
+++ b/ext/intl/msgformat/msgformat_helpers.cpp
@@ -1,12 +1,12 @@
 /*
    +----------------------------------------------------------------------+
-   | This source file is subject to version 3.01 of the PHP license,      |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | https://www.php.net/license/3_01.txt                                 |
-   | If you did not receive a copy of the PHP license and are unable to   |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@php.net so we can mail you a copy immediately.               |
+   | Copyright © The PHP Group and Contributors.                          |
+   +----------------------------------------------------------------------+
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Authors: Stanislav Malyshev                           |
    +----------------------------------------------------------------------+
@@ -341,7 +341,7 @@ static void umsg_set_timezone(MessageFormatter_object *mfo,
 		}
 
 		if (used_tz == NULL) {
-			used_tz = timezone_process_timezone_argument(nullptr, nullptr, &err);
+			used_tz = timezone_process_timezone_argument(nullptr, nullptr, &err, 1);
 			if (used_tz == NULL) {
 				continue;
 			}
@@ -411,7 +411,7 @@ U_CFUNC void umsg_format_helper(MessageFormatter_object *mfo,
 		   int32_t len = u_sprintf(temp, "%u", (uint32_t)num_index);
 		   key.append(temp, len);
 
-		   storedArgType = (Formattable::Type*)zend_hash_index_find_ptr(types, (zend_ulong)num_index);
+		   storedArgType = (Formattable::Type*)zend_hash_index_find_ptr(types, num_index);
 		} else { //string; assumed to be in UTF-8
 			intl_stringFromChar(key, ZSTR_VAL(str_index), ZSTR_LEN(str_index), &err.code);
 
@@ -649,7 +649,7 @@ U_CFUNC void umsg_parse_helper(UMessageFormat *fmt, int *count, zval **args, UCh
 
         case Formattable::kInt64:
             aInt64 = fargs[i].getInt64();
-			if(aInt64 > ZEND_LONG_MAX || aInt64 < -ZEND_LONG_MAX) {
+			if(aInt64 > ZEND_LONG_MAX || aInt64 < ZEND_LONG_MIN) {
 				ZVAL_DOUBLE(&(*args)[i], (double)aInt64);
 			} else {
 				ZVAL_LONG(&(*args)[i], (zend_long)aInt64);
diff --git a/ext/intl/msgformat/msgformat_helpers.h b/ext/intl/msgformat/msgformat_helpers.h
index 20282526cbfb..c1a153783511 100644
--- a/ext/intl/msgformat/msgformat_helpers.h
+++ b/ext/intl/msgformat/msgformat_helpers.h
@@ -1,12 +1,12 @@
 /*
    +----------------------------------------------------------------------+
-   | This source file is subject to version 3.01 of the PHP license,      |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | https://www.php.net/license/3_01.txt                                 |
-   | If you did not receive a copy of the PHP license and are unable to   |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@php.net so we can mail you a copy immediately.               |
+   | Copyright © The PHP Group and Contributors.                          |
+   +----------------------------------------------------------------------+
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Authors: Stanislav Malyshev                           |
    +----------------------------------------------------------------------+
diff --git a/ext/intl/msgformat/msgformat_parse.cpp b/ext/intl/msgformat/msgformat_parse.cpp
index 28d7ce710802..b50dc1efed41 100644
--- a/ext/intl/msgformat/msgformat_parse.cpp
+++ b/ext/intl/msgformat/msgformat_parse.cpp
@@ -1,12 +1,12 @@
 /*
    +----------------------------------------------------------------------+
-   | This source file is subject to version 3.01 of the PHP license,      |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | https://www.php.net/license/3_01.txt                                 |
-   | If you did not receive a copy of the PHP license and are unable to   |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@php.net so we can mail you a copy immediately.               |
+   | Copyright © The PHP Group and Contributors.                          |
+   +----------------------------------------------------------------------+
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Authors: Stanislav Malyshev                           |
    +----------------------------------------------------------------------+
diff --git a/ext/intl/normalizer/normalizer.h b/ext/intl/normalizer/normalizer.h
index 3c6aa0e6eafc..c6feaa106eb1 100644
--- a/ext/intl/normalizer/normalizer.h
+++ b/ext/intl/normalizer/normalizer.h
@@ -1,12 +1,12 @@
 /*
    +----------------------------------------------------------------------+
-   | This source file is subject to version 3.01 of the PHP license,      |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | https://www.php.net/license/3_01.txt                                 |
-   | If you did not receive a copy of the PHP license and are unable to   |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@php.net so we can mail you a copy immediately.               |
+   | Copyright © The PHP Group and Contributors.                          |
+   +----------------------------------------------------------------------+
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Authors: Ed Batutis                                  |
    +----------------------------------------------------------------------+
diff --git a/ext/intl/normalizer/normalizer_class.cpp b/ext/intl/normalizer/normalizer_class.cpp
index 3838f7546325..1898df04e2e1 100644
--- a/ext/intl/normalizer/normalizer_class.cpp
+++ b/ext/intl/normalizer/normalizer_class.cpp
@@ -1,12 +1,12 @@
 /*
    +----------------------------------------------------------------------+
-   | This source file is subject to version 3.01 of the PHP license,      |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | https://www.php.net/license/3_01.txt                                 |
-   | If you did not receive a copy of the PHP license and are unable to   |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@php.net so we can mail you a copy immediately.               |
+   | Copyright © The PHP Group and Contributors.                          |
+   +----------------------------------------------------------------------+
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Authors: Ed Batutis                                  |
    +----------------------------------------------------------------------+
diff --git a/ext/intl/normalizer/normalizer_class.h b/ext/intl/normalizer/normalizer_class.h
index 8f88f215abcc..e30c29237041 100644
--- a/ext/intl/normalizer/normalizer_class.h
+++ b/ext/intl/normalizer/normalizer_class.h
@@ -1,12 +1,12 @@
 /*
    +----------------------------------------------------------------------+
-   | This source file is subject to version 3.01 of the PHP license,      |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | https://www.php.net/license/3_01.txt                                 |
-   | If you did not receive a copy of the PHP license and are unable to   |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@php.net so we can mail you a copy immediately.               |
+   | Copyright © The PHP Group and Contributors.                          |
+   +----------------------------------------------------------------------+
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Authors: Ed Batutis                                  |
    +----------------------------------------------------------------------+
diff --git a/ext/intl/normalizer/normalizer_normalize.cpp b/ext/intl/normalizer/normalizer_normalize.cpp
index 92e8f1166ad0..846eda64b4c8 100644
--- a/ext/intl/normalizer/normalizer_normalize.cpp
+++ b/ext/intl/normalizer/normalizer_normalize.cpp
@@ -1,12 +1,12 @@
 /*
    +----------------------------------------------------------------------+
-   | This source file is subject to version 3.01 of the PHP license,	  |
-   | that is bundled with this package in the file LICENSE, and is		  |
-   | available through the world-wide-web at the following url:			  |
-   | https://www.php.net/license/3_01.txt                                 |
-   | If you did not receive a copy of the PHP license and are unable to   |
-   | obtain it through the world-wide-web, please send a note to		  |
-   | license@php.net so we can mail you a copy immediately.				  |
+   | Copyright © The PHP Group and Contributors.                          |
+   +----------------------------------------------------------------------+
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Authors: Ed Batutis 								  |
    +----------------------------------------------------------------------+
@@ -37,19 +37,14 @@ static const UNormalizer2 *intl_get_normalizer(zend_long form, UErrorCode *err)
 	{
 		case NORMALIZER_FORM_C:
 			return unorm2_getNFCInstance(err);
-			break;
 		case NORMALIZER_FORM_D:
 			return unorm2_getNFDInstance(err);
-			break;
 		case NORMALIZER_FORM_KC:
 			return unorm2_getNFKCInstance(err);
-			break;
 		case NORMALIZER_FORM_KD:
 			return unorm2_getNFKDInstance(err);
-			break;
 		case NORMALIZER_FORM_KC_CF:
 			return unorm2_getNFKCCasefoldInstance(err);
-			break;
 	}
 
 	*err = U_ILLEGAL_ARGUMENT_ERROR;
diff --git a/ext/intl/php_intl.c b/ext/intl/php_intl.c
index 441b26ae088d..9882309c6f46 100644
--- a/ext/intl/php_intl.c
+++ b/ext/intl/php_intl.c
@@ -1,12 +1,12 @@
 /*
    +----------------------------------------------------------------------+
-   | This source file is subject to version 3.01 of the PHP license,      |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | https://www.php.net/license/3_01.txt                                 |
-   | If you did not receive a copy of the PHP license and are unable to   |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@php.net so we can mail you a copy immediately.               |
+   | Copyright © The PHP Group and Contributors.                          |
+   +----------------------------------------------------------------------+
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Authors: Vadim Savchuk                   |
    |          Dmitry Lakhtyuk                |
diff --git a/ext/intl/php_intl.h b/ext/intl/php_intl.h
index a56c34f3dce4..1a9b4f769e86 100644
--- a/ext/intl/php_intl.h
+++ b/ext/intl/php_intl.h
@@ -1,12 +1,12 @@
 /*
    +----------------------------------------------------------------------+
-   | This source file is subject to version 3.01 of the PHP license,      |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | https://www.php.net/license/3_01.txt                                 |
-   | If you did not receive a copy of the PHP license and are unable to   |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@php.net so we can mail you a copy immediately.               |
+   | Copyright © The PHP Group and Contributors.                          |
+   +----------------------------------------------------------------------+
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Authors: Vadim Savchuk                   |
    |          Dmitry Lakhtyuk                |
diff --git a/ext/intl/rangeformatter/rangeformatter_class.cpp b/ext/intl/rangeformatter/rangeformatter_class.cpp
index 2042966177cb..2df252d1986b 100644
--- a/ext/intl/rangeformatter/rangeformatter_class.cpp
+++ b/ext/intl/rangeformatter/rangeformatter_class.cpp
@@ -1,12 +1,12 @@
 /*
    +----------------------------------------------------------------------+
-   | This source file is subject to version 3.01 of the PHP license,      |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | https://www.php.net/license/3_01.txt                                 |
-   | If you did not receive a copy of the PHP license and are unable to   |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@php.net so we can mail you a copy immediately.               |
+   | Copyright © The PHP Group and Contributors.                          |
+   +----------------------------------------------------------------------+
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Authors: Bogdan Ungureanu               |
    +----------------------------------------------------------------------+
@@ -22,6 +22,7 @@ extern "C" {
 #include 
 #include 
 #include 
+#include 
 #include "../intl_convertcpp.h"
 
 extern "C" {
@@ -30,7 +31,6 @@ extern "C" {
     #include "../intl_data.h"
     #include "rangeformatter_arginfo.h"
     #include "rangeformatter_class.h"
-    #include "intl_convert.h"
 }
 
 using icu::number::NumberRangeFormatter;
@@ -60,6 +60,19 @@ zend_object *IntlNumberRangeFormatter_object_create(zend_class_entry *ce)
     return &intern->zo;
 }
 
+static icu::Formattable rangeformatter_create_formattable(zval *number)
+{
+    icu::Formattable formattable;
+
+    if (Z_TYPE_P(number) == IS_DOUBLE) {
+        formattable.setDouble(Z_DVAL_P(number));
+    } else {
+        formattable.setInt64(static_cast(Z_LVAL_P(number)));
+    }
+
+    return formattable;
+}
+
 U_CFUNC PHP_METHOD(IntlNumberRangeFormatter, __construct)
 {
     ZEND_PARSE_PARAMETERS_NONE();
@@ -91,7 +104,7 @@ U_CFUNC PHP_METHOD(IntlNumberRangeFormatter, createFromSkeleton)
         RETURN_THROWS();
     }
 
-    if (strlen(uloc_getISO3Language(locale)) == 0) {
+    if (icu::Locale(locale).getISO3Language()[0] == '\0') {
         zend_argument_value_error(2, "\"%s\" is invalid", locale);
         RETURN_THROWS();
     }
@@ -154,8 +167,8 @@ U_CFUNC PHP_METHOD(IntlNumberRangeFormatter, format)
 
     UErrorCode error = U_ZERO_ERROR;
 
-    icu::Formattable start_formattable(Z_TYPE_P(start) == IS_DOUBLE ? Z_DVAL_P(start) : Z_LVAL_P(start));
-    icu::Formattable end_formattable(Z_TYPE_P(end) == IS_DOUBLE ? Z_DVAL_P(end) : Z_LVAL_P(end));
+    icu::Formattable start_formattable = rangeformatter_create_formattable(start);
+    icu::Formattable end_formattable = rangeformatter_create_formattable(end);
 
     UnicodeString result = RANGEFORMATTER_OBJECT(obj)->formatFormattableRange(start_formattable, end_formattable, error).toString(error);
 
@@ -219,7 +232,7 @@ void rangeformatter_register_class(void)
     class_entry_IntlNumberRangeFormatter->create_object = IntlNumberRangeFormatter_object_create;
 
     memcpy(&rangeformatter_handlers, zend_get_std_object_handlers(), sizeof(zend_object_handlers));
-    rangeformatter_handlers.offset = XtOffsetOf(IntlNumberRangeFormatter_object, zo);
+    rangeformatter_handlers.offset = offsetof(IntlNumberRangeFormatter_object, zo);
     rangeformatter_handlers.free_obj = IntlNumberRangeFormatter_object_free;
     rangeformatter_handlers.clone_obj = NULL;
 }
diff --git a/ext/intl/rangeformatter/rangeformatter_class.h b/ext/intl/rangeformatter/rangeformatter_class.h
index 661641c2ce0f..494a6d09a05f 100644
--- a/ext/intl/rangeformatter/rangeformatter_class.h
+++ b/ext/intl/rangeformatter/rangeformatter_class.h
@@ -1,12 +1,12 @@
 /*
    +----------------------------------------------------------------------+
-   | This source file is subject to version 3.01 of the PHP license,      |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | https://www.php.net/license/3_01.txt                                 |
-   | If you did not receive a copy of the PHP license and are unable to   |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@php.net so we can mail you a copy immediately.               |
+   | Copyright © The PHP Group and Contributors.                          |
+   +----------------------------------------------------------------------+
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Authors: Bogdan Ungureanu               |
    +----------------------------------------------------------------------+
@@ -36,9 +36,7 @@ typedef struct {
     zend_object     zo;
 } IntlNumberRangeFormatter_object;
 
-static inline IntlNumberRangeFormatter_object *php_intl_numberrangeformatter_fetch_object(zend_object *obj) {
-    return (IntlNumberRangeFormatter_object *)((char*)(obj) - XtOffsetOf(IntlNumberRangeFormatter_object, zo));
-}
+#define php_intl_numberrangeformatter_fetch_object(obj) ZEND_CONTAINER_OF(obj, IntlNumberRangeFormatter_object, zo)
 
 #define Z_INTL_RANGEFORMATTER_P(zv) php_intl_numberrangeformatter_fetch_object(Z_OBJ_P(zv))
 
diff --git a/ext/intl/resourcebundle/resourcebundle.cpp b/ext/intl/resourcebundle/resourcebundle.cpp
index b8c5c00efaba..d3a41b7c8d92 100644
--- a/ext/intl/resourcebundle/resourcebundle.cpp
+++ b/ext/intl/resourcebundle/resourcebundle.cpp
@@ -1,12 +1,12 @@
 /*
    +----------------------------------------------------------------------+
-   | This source file is subject to version 3.01 of the PHP license,      |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | https://www.php.net/license/3_01.txt                                 |
-   | If you did not receive a copy of the PHP license and are unable to   |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@php.net so we can mail you a copy immediately.               |
+   | Copyright © The PHP Group and Contributors.                          |
+   +----------------------------------------------------------------------+
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Authors: Hans-Peter Oeri (University of St.Gallen)       |
    +----------------------------------------------------------------------+
@@ -74,7 +74,7 @@ U_CFUNC void resourcebundle_extract_value( zval *return_value, ResourceBundle_ob
 			source->child = NULL;
 			intl_errors_reset(INTL_DATA_ERROR_P(source));
 			break;
-		EMPTY_SWITCH_DEFAULT_CASE();
+		default: ZEND_UNREACHABLE();
 	}
 }
 /* }}} */
diff --git a/ext/intl/resourcebundle/resourcebundle.h b/ext/intl/resourcebundle/resourcebundle.h
index c46908a8edff..e7c79c480d35 100644
--- a/ext/intl/resourcebundle/resourcebundle.h
+++ b/ext/intl/resourcebundle/resourcebundle.h
@@ -1,12 +1,12 @@
 /*
    +----------------------------------------------------------------------+
-   | This source file is subject to version 3.01 of the PHP license,      |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | https://www.php.net/license/3_01.txt                                 |
-   | If you did not receive a copy of the PHP license and are unable to   |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@php.net so we can mail you a copy immediately.               |
+   | Copyright © The PHP Group and Contributors.                          |
+   +----------------------------------------------------------------------+
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Authors: Hans-Peter Oeri (University of St.Gallen)       |
    +----------------------------------------------------------------------+
diff --git a/ext/intl/resourcebundle/resourcebundle_class.cpp b/ext/intl/resourcebundle/resourcebundle_class.cpp
index d88ba2ad1317..2a89b14cc6e5 100644
--- a/ext/intl/resourcebundle/resourcebundle_class.cpp
+++ b/ext/intl/resourcebundle/resourcebundle_class.cpp
@@ -1,12 +1,12 @@
 /*
    +----------------------------------------------------------------------+
-   | This source file is subject to version 3.01 of the PHP license,      |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | https://www.php.net/license/3_01.txt                                 |
-   | If you did not receive a copy of the PHP license and are unable to   |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@php.net so we can mail you a copy immediately.               |
+   | Copyright © The PHP Group and Contributors.                          |
+   +----------------------------------------------------------------------+
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Authors: Hans-Peter Oeri (University of St.Gallen)       |
    +----------------------------------------------------------------------+
@@ -220,12 +220,12 @@ static zval *resource_bundle_array_fetch(
 	}
 
 	if (!fallback && (INTL_DATA_ERROR_CODE(rb) == U_USING_FALLBACK_WARNING || INTL_DATA_ERROR_CODE(rb) == U_USING_DEFAULT_WARNING)) {
-		UErrorCode icuerror;
+		UErrorCode icuerror = U_ZERO_ERROR;
 		const char * locale = ures_getLocaleByType( rb->me, ULOC_ACTUAL_LOCALE, &icuerror );
 		if (is_numeric) {
-			spprintf(&pbuf, 0, "Cannot load element %d without fallback from to %s", index, locale);
+			spprintf(&pbuf, 0, "Cannot load element %d without fallback to %s", index, locale);
 		} else {
-			spprintf(&pbuf, 0, "Cannot load element '%s' without fallback from to %s", key, locale);
+			spprintf(&pbuf, 0, "Cannot load element '%s' without fallback to %s", key, locale);
 		}
 		intl_errors_set_custom_msg( INTL_DATA_ERROR_P(rb), pbuf);
 		efree(pbuf);
@@ -424,7 +424,7 @@ U_CFUNC void resourcebundle_register_class( void )
 	ResourceBundle_ce_ptr->get_iterator = resourcebundle_get_iterator;
 
 	ResourceBundle_object_handlers = std_object_handlers;
-	ResourceBundle_object_handlers.offset = XtOffsetOf(ResourceBundle_object, zend);
+	ResourceBundle_object_handlers.offset = offsetof(ResourceBundle_object, zend);
 	ResourceBundle_object_handlers.clone_obj	  = NULL; /* ICU ResourceBundle has no clone implementation */
 	ResourceBundle_object_handlers.free_obj = ResourceBundle_object_free;
 	ResourceBundle_object_handlers.read_dimension = resourcebundle_array_get;
diff --git a/ext/intl/resourcebundle/resourcebundle_class.h b/ext/intl/resourcebundle/resourcebundle_class.h
index 334532bde99b..1ec2ac592222 100644
--- a/ext/intl/resourcebundle/resourcebundle_class.h
+++ b/ext/intl/resourcebundle/resourcebundle_class.h
@@ -1,12 +1,12 @@
 /*
    +----------------------------------------------------------------------+
-   | This source file is subject to version 3.01 of the PHP license,      |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | https://www.php.net/license/3_01.txt                                 |
-   | If you did not receive a copy of the PHP license and are unable to   |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@php.net so we can mail you a copy immediately.               |
+   | Copyright © The PHP Group and Contributors.                          |
+   +----------------------------------------------------------------------+
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Authors: Hans-Peter Oeri (University of St.Gallen)       |
    +----------------------------------------------------------------------+
@@ -36,7 +36,7 @@ typedef struct {
 } ResourceBundle_object;
 
 static inline ResourceBundle_object *php_intl_resourcebundle_fetch_object(zend_object *obj) {
-	return (ResourceBundle_object *)((char*)(obj) - XtOffsetOf(ResourceBundle_object, zend));
+	return ZEND_CONTAINER_OF(obj, ResourceBundle_object, zend);
 }
 #define Z_INTL_RESOURCEBUNDLE_P(zv) php_intl_resourcebundle_fetch_object(Z_OBJ_P(zv))
 
diff --git a/ext/intl/resourcebundle/resourcebundle_iterator.cpp b/ext/intl/resourcebundle/resourcebundle_iterator.cpp
index 7747b34adbd4..29288418437a 100644
--- a/ext/intl/resourcebundle/resourcebundle_iterator.cpp
+++ b/ext/intl/resourcebundle/resourcebundle_iterator.cpp
@@ -1,12 +1,12 @@
 /*
    +----------------------------------------------------------------------+
-   | This source file is subject to version 3.01 of the PHP license,      |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | https://www.php.net/license/3_01.txt                                 |
-   | If you did not receive a copy of the PHP license and are unable to   |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@php.net so we can mail you a copy immediately.               |
+   | Copyright © The PHP Group and Contributors.                          |
+   +----------------------------------------------------------------------+
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Authors: Hans-Peter Oeri (University of St.Gallen)       |
    +----------------------------------------------------------------------+
diff --git a/ext/intl/resourcebundle/resourcebundle_iterator.h b/ext/intl/resourcebundle/resourcebundle_iterator.h
index c323d4e17b4c..762c12f363b5 100644
--- a/ext/intl/resourcebundle/resourcebundle_iterator.h
+++ b/ext/intl/resourcebundle/resourcebundle_iterator.h
@@ -1,12 +1,12 @@
 /*
    +----------------------------------------------------------------------+
-   | This source file is subject to version 3.01 of the PHP license,      |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | https://www.php.net/license/3_01.txt                                 |
-   | If you did not receive a copy of the PHP license and are unable to   |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@php.net so we can mail you a copy immediately.               |
+   | Copyright © The PHP Group and Contributors.                          |
+   +----------------------------------------------------------------------+
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Authors: Hans-Peter Oeri (University of St.Gallen)       |
    +----------------------------------------------------------------------+
diff --git a/ext/intl/spoofchecker/spoofchecker.stub.php b/ext/intl/spoofchecker/spoofchecker.stub.php
index 0141252d478d..51a9c7d39074 100644
--- a/ext/intl/spoofchecker/spoofchecker.stub.php
+++ b/ext/intl/spoofchecker/spoofchecker.stub.php
@@ -19,7 +19,6 @@ class Spoofchecker
     public const int INVISIBLE = UNKNOWN;
     /** @cvalue USPOOF_CHAR_LIMIT */
     public const int CHAR_LIMIT = UNKNOWN;
-#if U_ICU_VERSION_MAJOR_NUM >= 58
     /** @cvalue USPOOF_ASCII */
     public const int ASCII = UNKNOWN;
     /** @cvalue USPOOF_HIGHLY_RESTRICTIVE */
@@ -34,7 +33,6 @@ class Spoofchecker
     public const int SINGLE_SCRIPT_RESTRICTIVE = UNKNOWN;
     /** @cvalue USPOOF_MIXED_NUMBERS */
     public const int MIXED_NUMBERS = UNKNOWN;
-#endif
 #if U_ICU_VERSION_MAJOR_NUM >= 62
     /** @cvalue USPOOF_HIDDEN_OVERLAY */
     public const int HIDDEN_OVERLAY = UNKNOWN;
@@ -71,9 +69,7 @@ public function setAllowedLocales(string $locales): void {}
     /** @tentative-return-type */
     public function setChecks(int $checks): void {}
 
-#if U_ICU_VERSION_MAJOR_NUM >= 58
     /** @tentative-return-type */
     public function setRestrictionLevel(int $level): void {}
-#endif
     public function setAllowedChars(string $pattern, int $patternOptions = 0): void {}
 }
diff --git a/ext/intl/spoofchecker/spoofchecker_arginfo.h b/ext/intl/spoofchecker/spoofchecker_arginfo.h
index 536798914428..8704065e479b 100644
--- a/ext/intl/spoofchecker/spoofchecker_arginfo.h
+++ b/ext/intl/spoofchecker/spoofchecker_arginfo.h
@@ -1,5 +1,5 @@
 /* This is a generated file, edit spoofchecker.stub.php instead.
- * Stub hash: 4834be57a3f0cb74dbc4422e609846139f09f6cb */
+ * Stub hash: 4634f8ef9157fb3670a2ddc5e3246340660fc68c */
 
 ZEND_BEGIN_ARG_INFO_EX(arginfo_class_Spoofchecker___construct, 0, 0, 0)
 ZEND_END_ARG_INFO()
@@ -23,11 +23,9 @@ ZEND_BEGIN_ARG_WITH_TENTATIVE_RETURN_TYPE_INFO_EX(arginfo_class_Spoofchecker_set
 	ZEND_ARG_TYPE_INFO(0, checks, IS_LONG, 0)
 ZEND_END_ARG_INFO()
 
-#if U_ICU_VERSION_MAJOR_NUM >= 58
 ZEND_BEGIN_ARG_WITH_TENTATIVE_RETURN_TYPE_INFO_EX(arginfo_class_Spoofchecker_setRestrictionLevel, 0, 1, IS_VOID, 0)
 	ZEND_ARG_TYPE_INFO(0, level, IS_LONG, 0)
 ZEND_END_ARG_INFO()
-#endif
 
 ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_class_Spoofchecker_setAllowedChars, 0, 1, IS_VOID, 0)
 	ZEND_ARG_TYPE_INFO(0, pattern, IS_STRING, 0)
@@ -39,9 +37,7 @@ ZEND_METHOD(Spoofchecker, isSuspicious);
 ZEND_METHOD(Spoofchecker, areConfusable);
 ZEND_METHOD(Spoofchecker, setAllowedLocales);
 ZEND_METHOD(Spoofchecker, setChecks);
-#if U_ICU_VERSION_MAJOR_NUM >= 58
 ZEND_METHOD(Spoofchecker, setRestrictionLevel);
-#endif
 ZEND_METHOD(Spoofchecker, setAllowedChars);
 
 static const zend_function_entry class_Spoofchecker_methods[] = {
@@ -50,9 +46,7 @@ static const zend_function_entry class_Spoofchecker_methods[] = {
 	ZEND_ME(Spoofchecker, areConfusable, arginfo_class_Spoofchecker_areConfusable, ZEND_ACC_PUBLIC)
 	ZEND_ME(Spoofchecker, setAllowedLocales, arginfo_class_Spoofchecker_setAllowedLocales, ZEND_ACC_PUBLIC)
 	ZEND_ME(Spoofchecker, setChecks, arginfo_class_Spoofchecker_setChecks, ZEND_ACC_PUBLIC)
-#if U_ICU_VERSION_MAJOR_NUM >= 58
 	ZEND_ME(Spoofchecker, setRestrictionLevel, arginfo_class_Spoofchecker_setRestrictionLevel, ZEND_ACC_PUBLIC)
-#endif
 	ZEND_ME(Spoofchecker, setAllowedChars, arginfo_class_Spoofchecker_setAllowedChars, ZEND_ACC_PUBLIC)
 	ZEND_FE_END
 };
@@ -105,7 +99,6 @@ static zend_class_entry *register_class_Spoofchecker(void)
 	zend_string *const_CHAR_LIMIT_name = zend_string_init_interned("CHAR_LIMIT", sizeof("CHAR_LIMIT") - 1, true);
 	zend_declare_typed_class_constant(class_entry, const_CHAR_LIMIT_name, &const_CHAR_LIMIT_value, ZEND_ACC_PUBLIC, NULL, (zend_type) ZEND_TYPE_INIT_MASK(MAY_BE_LONG));
 	zend_string_release_ex(const_CHAR_LIMIT_name, true);
-#if U_ICU_VERSION_MAJOR_NUM >= 58
 
 	zval const_ASCII_value;
 	ZVAL_LONG(&const_ASCII_value, USPOOF_ASCII);
@@ -148,7 +141,6 @@ static zend_class_entry *register_class_Spoofchecker(void)
 	zend_string *const_MIXED_NUMBERS_name = zend_string_init_interned("MIXED_NUMBERS", sizeof("MIXED_NUMBERS") - 1, true);
 	zend_declare_typed_class_constant(class_entry, const_MIXED_NUMBERS_name, &const_MIXED_NUMBERS_value, ZEND_ACC_PUBLIC, NULL, (zend_type) ZEND_TYPE_INIT_MASK(MAY_BE_LONG));
 	zend_string_release_ex(const_MIXED_NUMBERS_name, true);
-#endif
 #if U_ICU_VERSION_MAJOR_NUM >= 62
 
 	zval const_HIDDEN_OVERLAY_value;
diff --git a/ext/intl/spoofchecker/spoofchecker_class.cpp b/ext/intl/spoofchecker/spoofchecker_class.cpp
index ba4c64321f14..6f072081fa78 100644
--- a/ext/intl/spoofchecker/spoofchecker_class.cpp
+++ b/ext/intl/spoofchecker/spoofchecker_class.cpp
@@ -1,12 +1,12 @@
 /*
    +----------------------------------------------------------------------+
-   | This source file is subject to version 3.01 of the PHP license,      |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | https://www.php.net/license/3_01.txt                                 |
-   | If you did not receive a copy of the PHP license and are unable to   |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@php.net so we can mail you a copy immediately.               |
+   | Copyright © The PHP Group and Contributors.                          |
+   +----------------------------------------------------------------------+
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Authors: Scott MacVicar                            |
    +----------------------------------------------------------------------+
@@ -63,7 +63,7 @@ U_CFUNC zend_object *Spoofchecker_object_create(zend_class_entry *ce)
 
 static zend_object *spoofchecker_clone_obj(zend_object *object) /* {{{ */
 {
-	Spoofchecker_object *spoofchecker_orig = php_intl_spoofchecker_fetch_object(object);
+	const Spoofchecker_object *spoofchecker_orig = php_intl_spoofchecker_fetch_object(object);
 	zend_object *new_obj_val               = Spoofchecker_ce_ptr->create_object(object->ce);
 	Spoofchecker_object *spoofchecker_new  = php_intl_spoofchecker_fetch_object(new_obj_val);
 
@@ -98,7 +98,7 @@ U_CFUNC void spoofchecker_register_Spoofchecker_class(void)
 
 	memcpy(&Spoofchecker_handlers, &std_object_handlers,
 		sizeof Spoofchecker_handlers);
-	Spoofchecker_handlers.offset = XtOffsetOf(Spoofchecker_object, zo);
+	Spoofchecker_handlers.offset = offsetof(Spoofchecker_object, zo);
 	Spoofchecker_handlers.clone_obj = spoofchecker_clone_obj;
 	Spoofchecker_handlers.free_obj = Spoofchecker_objects_free;
 }
diff --git a/ext/intl/spoofchecker/spoofchecker_class.h b/ext/intl/spoofchecker/spoofchecker_class.h
index 06701eb60e36..8871ca2a5b24 100644
--- a/ext/intl/spoofchecker/spoofchecker_class.h
+++ b/ext/intl/spoofchecker/spoofchecker_class.h
@@ -1,12 +1,12 @@
 /*
    +----------------------------------------------------------------------+
-   | This source file is subject to version 3.01 of the PHP license,      |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | https://www.php.net/license/3_01.txt                                 |
-   | If you did not receive a copy of the PHP license and are unable to   |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@php.net so we can mail you a copy immediately.               |
+   | Copyright © The PHP Group and Contributors.                          |
+   +----------------------------------------------------------------------+
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Authors: Scott MacVicar                            |
    +----------------------------------------------------------------------+
@@ -42,9 +42,7 @@ typedef struct {
 	zend_object     zo;
 } Spoofchecker_object;
 
-static inline Spoofchecker_object *php_intl_spoofchecker_fetch_object(zend_object *obj) {
-	    return (Spoofchecker_object *)((char*)(obj) - XtOffsetOf(Spoofchecker_object, zo));
-}
+#define php_intl_spoofchecker_fetch_object(obj) ZEND_CONTAINER_OF(obj, Spoofchecker_object, zo)
 #define Z_INTL_SPOOFCHECKER_P(zv) php_intl_spoofchecker_fetch_object((Z_OBJ_P(zv)))
 
 #define SPOOFCHECKER_ERROR(co) (co)->err
diff --git a/ext/intl/spoofchecker/spoofchecker_create.cpp b/ext/intl/spoofchecker/spoofchecker_create.cpp
index 1ed4055cccd1..df032f91035e 100644
--- a/ext/intl/spoofchecker/spoofchecker_create.cpp
+++ b/ext/intl/spoofchecker/spoofchecker_create.cpp
@@ -1,12 +1,12 @@
 /*
    +----------------------------------------------------------------------+
-   | This source file is subject to version 3.01 of the PHP license,      |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | https://www.php.net/license/3_01.txt                                 |
-   | If you did not receive a copy of the PHP license and are unable to   |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@php.net so we can mail you a copy immediately.               |
+   | Copyright © The PHP Group and Contributors.                          |
+   +----------------------------------------------------------------------+
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Authors: Scott MacVicar                            |
    +----------------------------------------------------------------------+
@@ -38,6 +38,10 @@ U_CFUNC PHP_METHOD(Spoofchecker, __construct)
 	ZEND_PARSE_PARAMETERS_NONE();
 
 	SPOOFCHECKER_METHOD_FETCH_OBJECT_NO_CHECK;
+	if (co->uspoof) {
+		zend_throw_error(NULL, "Spoofchecker object is already constructed");
+		RETURN_THROWS();
+	}
 
 	co->uspoof = uspoof_open(SPOOFCHECKER_ERROR_CODE_P(co));
 	if (U_FAILURE(INTL_DATA_ERROR_CODE(co))) {
diff --git a/ext/intl/spoofchecker/spoofchecker_main.cpp b/ext/intl/spoofchecker/spoofchecker_main.cpp
index e49ddec87a3c..73e14cabeaf1 100644
--- a/ext/intl/spoofchecker/spoofchecker_main.cpp
+++ b/ext/intl/spoofchecker/spoofchecker_main.cpp
@@ -1,12 +1,12 @@
 /*
    +----------------------------------------------------------------------+
-   | This source file is subject to version 3.01 of the PHP license,      |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | https://www.php.net/license/3_01.txt                                 |
-   | If you did not receive a copy of the PHP license and are unable to   |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@php.net so we can mail you a copy immediately.               |
+   | Copyright © The PHP Group and Contributors.                          |
+   +----------------------------------------------------------------------+
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Authors: Scott MacVicar                            |
    +----------------------------------------------------------------------+
@@ -142,7 +142,7 @@ U_CFUNC PHP_METHOD(Spoofchecker, setChecks)
 }
 /* }}} */
 
-#if U_ICU_VERSION_MAJOR_NUM >= 58
+/* TODO Document this method on PHP.net */
 /* {{{ Set the loosest restriction level allowed for strings. */
 U_CFUNC PHP_METHOD(Spoofchecker, setRestrictionLevel)
 {
@@ -170,7 +170,6 @@ U_CFUNC PHP_METHOD(Spoofchecker, setRestrictionLevel)
 	uspoof_setRestrictionLevel(co->uspoof, (URestrictionLevel)level);
 }
 /* }}} */
-#endif
 
 U_CFUNC PHP_METHOD(Spoofchecker, setAllowedChars)
 {
@@ -214,9 +213,9 @@ U_CFUNC PHP_METHOD(Spoofchecker, setAllowedChars)
 #endif
             pattern_option != (USET_IGNORE_SPACE|USET_CASE_INSENSITIVE) &&
             pattern_option != (USET_IGNORE_SPACE|USET_ADD_CASE_MAPPINGS)) {
-		zend_argument_value_error(2, "must be a valid pattern option, 0 or (SpoofChecker::IGNORE_SPACE|( or SpoofChecker::USET_CASE_INSENSITIVE or SpoofChecker::USET_ADD_CASE_MAPPINGS"
+		zend_argument_value_error(2, "must be a valid pattern option, 0 or (SpoofChecker::IGNORE_SPACE|( or SpoofChecker::CASE_INSENSITIVE or SpoofChecker::ADD_CASE_MAPPINGS"
 #if U_ICU_VERSION_MAJOR_NUM >= 73
-				" or SpoofChecker::USET_SIMPLE_CASE_INSENSITIVE"
+				" or SpoofChecker::SIMPLE_CASE_INSENSITIVE"
 #endif
 				"))"
 		);
diff --git a/ext/intl/tests/breakiter_getLocale_error.phpt b/ext/intl/tests/breakiter_getLocale_error.phpt
new file mode 100644
index 000000000000..07d57dbc4265
--- /dev/null
+++ b/ext/intl/tests/breakiter_getLocale_error.phpt
@@ -0,0 +1,25 @@
+--TEST--
+IntlBreakIterator::getLocale(): bad arguments
+--EXTENSIONS--
+intl
+--FILE--
+getLocale(2);
+} catch (Throwable $e) {
+	echo $e::class, ': ', $e->getMessage(), PHP_EOL;
+}
+
+try {
+	$bi->getLocale(-1);
+} catch (Throwable $e) {
+	echo $e::class, ': ', $e->getMessage(), PHP_EOL;
+}
+
+?>
+--EXPECT--
+ValueError: IntlBreakIterator::getLocale(): Argument #1 ($type) must be either Locale::ACTUAL_LOCALE or Locale::VALID_LOCALE
+ValueError: IntlBreakIterator::getLocale(): Argument #1 ($type) must be either Locale::ACTUAL_LOCALE or Locale::VALID_LOCALE
diff --git a/ext/intl/tests/bug75317.phpt b/ext/intl/tests/bug75317.phpt
index 4df45f37bf80..a38fa2578b9c 100644
--- a/ext/intl/tests/bug75317.phpt
+++ b/ext/intl/tests/bug75317.phpt
@@ -29,7 +29,7 @@ var_dump($c->setSourceEncoding('utf-32'));
 printResult($c->getDestinationEncoding(), $utf8);
 printResult($c->getSourceEncoding(), $utf32);
 
-// test invalid inputs dont change values
+// test invalid inputs don't change values
 var_dump($c->setDestinationEncoding('foobar') === false);
 var_dump($c->setSourceEncoding('foobar') === false);
 printResult($c->getDestinationEncoding(), $utf8);
diff --git a/ext/intl/tests/calendar_set_date_out_of_bounds.phpt b/ext/intl/tests/calendar_set_date_out_of_bounds.phpt
new file mode 100644
index 000000000000..db9d18275ae8
--- /dev/null
+++ b/ext/intl/tests/calendar_set_date_out_of_bounds.phpt
@@ -0,0 +1,32 @@
+--TEST--
+IntlCalendar::setDate(): out-of-bounds arguments report correct positions
+--EXTENSIONS--
+intl
+--SKIPIF--
+
+--FILE--
+setDate(99999999999, 1, 1);
+} catch (Throwable $e) {
+    echo $e->getMessage(), "\n";
+}
+
+try {
+    $cal->setDate(1, 99999999999, 1);
+} catch (Throwable $e) {
+    echo $e->getMessage(), "\n";
+}
+
+try {
+    $cal->setDate(1, 1, 99999999999);
+} catch (Throwable $e) {
+    echo $e->getMessage(), "\n";
+}
+?>
+--EXPECT--
+IntlCalendar::setDate(): Argument #1 ($year) must be between -2147483648 and 2147483647
+IntlCalendar::setDate(): Argument #2 ($month) must be between -2147483648 and 2147483647
+IntlCalendar::setDate(): Argument #3 ($dayOfMonth) must be between -2147483648 and 2147483647
diff --git a/ext/intl/tests/calendar_set_date_time_out_of_bounds.phpt b/ext/intl/tests/calendar_set_date_time_out_of_bounds.phpt
new file mode 100644
index 000000000000..798ab1ebb01f
--- /dev/null
+++ b/ext/intl/tests/calendar_set_date_time_out_of_bounds.phpt
@@ -0,0 +1,53 @@
+--TEST--
+IntlCalendar::setDateTime(): out-of-bounds arguments report correct positions
+--EXTENSIONS--
+intl
+--SKIPIF--
+
+--FILE--
+setDateTime(99999999999, 1, 1, 1, 1, 1);
+} catch (Throwable $e) {
+    echo $e->getMessage(), "\n";
+}
+
+try {
+    $cal->setDateTime(1, 99999999999, 1, 1, 1, 1);
+} catch (Throwable $e) {
+    echo $e->getMessage(), "\n";
+}
+
+try {
+    $cal->setDateTime(1, 1, 99999999999, 1, 1, 1);
+} catch (Throwable $e) {
+    echo $e->getMessage(), "\n";
+}
+
+try {
+    $cal->setDateTime(1, 1, 1, 99999999999, 1, 1);
+} catch (Throwable $e) {
+    echo $e->getMessage(), "\n";
+}
+
+try {
+    $cal->setDateTime(1, 1, 1, 1, 99999999999, 1);
+} catch (Throwable $e) {
+    echo $e->getMessage(), "\n";
+}
+
+try {
+    $cal->setDateTime(1, 1, 1, 1, 1, 99999999999);
+} catch (Throwable $e) {
+    echo $e->getMessage(), "\n";
+}
+?>
+--EXPECT--
+IntlCalendar::setDateTime(): Argument #1 ($year) must be between -2147483648 and 2147483647
+IntlCalendar::setDateTime(): Argument #2 ($month) must be between -2147483648 and 2147483647
+IntlCalendar::setDateTime(): Argument #3 ($dayOfMonth) must be between -2147483648 and 2147483647
+IntlCalendar::setDateTime(): Argument #4 ($hour) must be between -2147483648 and 2147483647
+IntlCalendar::setDateTime(): Argument #5 ($minute) must be between -2147483648 and 2147483647
+IntlCalendar::setDateTime(): Argument #6 ($second) must be between -2147483648 and 2147483647
diff --git a/ext/intl/tests/calendar_set_out_of_bounds.phpt b/ext/intl/tests/calendar_set_out_of_bounds.phpt
new file mode 100644
index 000000000000..1ca407d3f713
--- /dev/null
+++ b/ext/intl/tests/calendar_set_out_of_bounds.phpt
@@ -0,0 +1,55 @@
+--TEST--
+IntlCalendar::set(): out-of-bounds date/time arguments report correct positions
+--EXTENSIONS--
+intl
+--SKIPIF--
+
+--FILE--
+set(99999999999, 1, 1);
+} catch (Throwable $e) {
+    echo $e->getMessage(), "\n";
+}
+
+try {
+    intlcal_set($cal, 1, 99999999999, 1);
+} catch (Throwable $e) {
+    echo $e->getMessage(), "\n";
+}
+
+try {
+    $cal->set(1, 1, 1, 99999999999, 1);
+} catch (Throwable $e) {
+    echo $e->getMessage(), "\n";
+}
+
+try {
+    $cal->set(1, 1, 1, 1, 99999999999, 1);
+} catch (Throwable $e) {
+    echo $e->getMessage(), "\n";
+}
+
+try {
+    intlcal_set($cal, 1, 1, 1, 1, 1, 99999999999);
+} catch (Throwable $e) {
+    echo $e->getMessage(), "\n";
+}
+?>
+--EXPECTF--
+Deprecated: Calling IntlCalendar::set() with more than 2 arguments is deprecated, use either IntlCalendar::setDate() or IntlCalendar::setDateTime() instead in %s on line %d
+IntlCalendar::set(): Argument #1 ($year) must be between -2147483648 and 2147483647
+
+Deprecated: Function intlcal_set() is deprecated since 8.4, use IntlCalendar::set(), IntlCalendar::setDate(), or IntlCalendar::setDateTime() instead in %s on line %d
+intlcal_set(): Argument #3 ($month) must be between -2147483648 and 2147483647
+
+Deprecated: Calling IntlCalendar::set() with more than 2 arguments is deprecated, use either IntlCalendar::setDate() or IntlCalendar::setDateTime() instead in %s on line %d
+IntlCalendar::set(): Argument #4 ($hour) must be between -2147483648 and 2147483647
+
+Deprecated: Calling IntlCalendar::set() with more than 2 arguments is deprecated, use either IntlCalendar::setDate() or IntlCalendar::setDateTime() instead in %s on line %d
+IntlCalendar::set(): Argument #5 ($minute) must be between -2147483648 and 2147483647
+
+Deprecated: Function intlcal_set() is deprecated since 8.4, use IntlCalendar::set(), IntlCalendar::setDate(), or IntlCalendar::setDateTime() instead in %s on line %d
+intlcal_set(): Argument #7 ($second) must be between -2147483648 and 2147483647
diff --git a/ext/intl/tests/calendar_uninitialized_argument_position.phpt b/ext/intl/tests/calendar_uninitialized_argument_position.phpt
new file mode 100644
index 000000000000..f92367180549
--- /dev/null
+++ b/ext/intl/tests/calendar_uninitialized_argument_position.phpt
@@ -0,0 +1,36 @@
+--TEST--
+IntlCalendar methods report the correct argument position for uninitialized calendar arguments
+--EXTENSIONS--
+intl
+--FILE--
+newInstanceWithoutConstructor();
+
+foreach (['equals', 'before', 'after', 'isEquivalentTo'] as $method) {
+    try {
+        $calendar->$method($uninitialized);
+    } catch (Error $e) {
+        echo $method, ': ', $e->getMessage(), PHP_EOL;
+    }
+}
+
+foreach (['intlcal_equals', 'intlcal_before', 'intlcal_after', 'intlcal_is_equivalent_to'] as $function) {
+    try {
+        $function($calendar, $uninitialized);
+    } catch (Error $e) {
+        echo $function, ': ', $e->getMessage(), PHP_EOL;
+    }
+}
+
+?>
+--EXPECT--
+equals: IntlCalendar::equals(): Argument #1 ($other) is uninitialized
+before: IntlCalendar::before(): Argument #1 ($other) is uninitialized
+after: IntlCalendar::after(): Argument #1 ($other) is uninitialized
+isEquivalentTo: IntlCalendar::isEquivalentTo(): Argument #1 ($other) is uninitialized
+intlcal_equals: intlcal_equals(): Argument #2 ($other) is uninitialized
+intlcal_before: intlcal_before(): Argument #2 ($other) is uninitialized
+intlcal_after: intlcal_after(): Argument #2 ($other) is uninitialized
+intlcal_is_equivalent_to: intlcal_is_equivalent_to(): Argument #2 ($other) is uninitialized
diff --git a/ext/intl/tests/collator_double_ctor.phpt b/ext/intl/tests/collator_double_ctor.phpt
new file mode 100644
index 000000000000..93b72f7392b3
--- /dev/null
+++ b/ext/intl/tests/collator_double_ctor.phpt
@@ -0,0 +1,16 @@
+--TEST--
+Collator double construction should not be allowed
+--EXTENSIONS--
+intl
+--FILE--
+__construct('en_US');
+} catch (Error $e) {
+    echo $e->getMessage(), "\n";
+}
+?>
+--EXPECT--
+Collator object is already constructed
diff --git a/ext/intl/tests/formatter_fail.phpt b/ext/intl/tests/formatter_fail.phpt
index 53f6b4ac7c7b..678b87b8c1b8 100644
--- a/ext/intl/tests/formatter_fail.phpt
+++ b/ext/intl/tests/formatter_fail.phpt
@@ -137,9 +137,9 @@ TypeError: numfmt_create(): Argument #1 ($locale) must be of type string, array
 'U_ZERO_ERROR'
 
 IntlException: NumberFormatter::__construct(): number formatter creation failed
-'NumberFormatter::__construct(): number formatter creation failed: U_UNSUPPORTED_ERROR'
-'NumberFormatter::create(): number formatter creation failed: U_UNSUPPORTED_ERROR'
-'numfmt_create(): number formatter creation failed: U_UNSUPPORTED_ERROR'
+'NumberFormatter::__construct(): number formatter creation failed: U_ILLEGAL_ARGUMENT_ERROR'
+'NumberFormatter::create(): number formatter creation failed: U_ILLEGAL_ARGUMENT_ERROR'
+'numfmt_create(): number formatter creation failed: U_ILLEGAL_ARGUMENT_ERROR'
 
 IntlException: NumberFormatter::__construct(): number formatter creation failed
 'NumberFormatter::__construct(): number formatter creation failed: U_MEMORY_ALLOCATION_ERROR'
diff --git a/ext/intl/tests/gh12243.phpt b/ext/intl/tests/gh12243.phpt
index 786a9bd1ee8f..324ed9a65661 100644
--- a/ext/intl/tests/gh12243.phpt
+++ b/ext/intl/tests/gh12243.phpt
@@ -1,5 +1,5 @@
 --TEST--
-GitHub #12043 segfault with IntlDateFormatter::dateType where it equals to UDAT_PATTERN (icu 50) but
+GitHub #12043 segfault with IntlDateFormatter::dateType where it equals to IntlDateFormatter::PATTERN (icu 50) but
 IntldateFormatter::timeType needs to be set as such.
 --EXTENSIONS--
 intl
@@ -21,4 +21,4 @@ try {
 
 ?>
 --EXPECT--
-IntlDateFormatter::__construct(): time format must be UDAT_PATTERN if date format is UDAT_PATTERN
+IntlDateFormatter::__construct(): datefmt_create: time format must be IntlDateFormatter::PATTERN if date format is IntlDateFormatter::PATTERN
diff --git a/ext/intl/tests/gh21998.phpt b/ext/intl/tests/gh21998.phpt
new file mode 100644
index 000000000000..392336dab522
--- /dev/null
+++ b/ext/intl/tests/gh21998.phpt
@@ -0,0 +1,15 @@
+--TEST--
+GH-21998 (NumberFormatter::format(INF) leaves a non-NUL-terminated zend_string)
+--EXTENSIONS--
+intl
+--FILE--
+format(INF));
+var_dump($fmt->format(-INF));
+var_dump($fmt->format(NAN));
+?>
+--EXPECT--
+string(3) "∞"
+string(4) "-∞"
+string(3) "NaN"
diff --git a/ext/intl/tests/gregoriancalendar___construct_out_of_bounds.phpt b/ext/intl/tests/gregoriancalendar___construct_out_of_bounds.phpt
new file mode 100644
index 000000000000..5b084b25d869
--- /dev/null
+++ b/ext/intl/tests/gregoriancalendar___construct_out_of_bounds.phpt
@@ -0,0 +1,53 @@
+--TEST--
+IntlGregorianCalendar::__construct(): out-of-bounds date/time arguments report correct positions
+--EXTENSIONS--
+intl
+--SKIPIF--
+
+--FILE--
+getMessage(), "\n";
+}
+
+try {
+    intlgregcal_create_instance(1, 99999999999, 1);
+} catch (Throwable $e) {
+    echo $e->getMessage(), "\n";
+}
+
+try {
+    new IntlGregorianCalendar(1, 1, 1, 99999999999, 1);
+} catch (Throwable $e) {
+    echo $e->getMessage(), "\n";
+}
+
+try {
+    new IntlGregorianCalendar(1, 1, 1, 1, 99999999999);
+} catch (Throwable $e) {
+    echo $e->getMessage(), "\n";
+}
+
+try {
+    intlgregcal_create_instance(1, 1, 1, 1, 1, 99999999999);
+} catch (Throwable $e) {
+    echo $e->getMessage(), "\n";
+}
+?>
+--EXPECTF--
+Deprecated: Calling IntlGregorianCalendar::__construct() with more than 2 arguments is deprecated, use either IntlGregorianCalendar::createFromDate() or IntlGregorianCalendar::createFromDateTime() instead in %s on line %d
+IntlGregorianCalendar::__construct(): Argument #1 ($timezoneOrYear) must be between -2147483648 and 2147483647
+
+Deprecated: Function intlgregcal_create_instance() is deprecated since 8.4, use IntlGregorianCalendar::__construct(), IntlGregorianCalendar::createFromDate(), or IntlGregorianCalendar::createFromDateTime() instead in %s on line %d
+intlgregcal_create_instance(): Argument #2 ($localeOrMonth) must be between -2147483648 and 2147483647
+
+Deprecated: Calling IntlGregorianCalendar::__construct() with more than 2 arguments is deprecated, use either IntlGregorianCalendar::createFromDate() or IntlGregorianCalendar::createFromDateTime() instead in %s on line %d
+IntlGregorianCalendar::__construct(): Argument #4 ($hour) must be between -2147483648 and 2147483647
+
+Deprecated: Calling IntlGregorianCalendar::__construct() with more than 2 arguments is deprecated, use either IntlGregorianCalendar::createFromDate() or IntlGregorianCalendar::createFromDateTime() instead in %s on line %d
+IntlGregorianCalendar::__construct(): Argument #5 ($minute) must be between -2147483648 and 2147483647
+
+Deprecated: Function intlgregcal_create_instance() is deprecated since 8.4, use IntlGregorianCalendar::__construct(), IntlGregorianCalendar::createFromDate(), or IntlGregorianCalendar::createFromDateTime() instead in %s on line %d
+intlgregcal_create_instance(): Argument #6 ($second) must be between -2147483648 and 2147483647
diff --git a/ext/intl/tests/listformatter/listformatter_double_ctor.phpt b/ext/intl/tests/listformatter/listformatter_double_ctor.phpt
new file mode 100644
index 000000000000..f8b0ca1e1633
--- /dev/null
+++ b/ext/intl/tests/listformatter/listformatter_double_ctor.phpt
@@ -0,0 +1,16 @@
+--TEST--
+IntlListFormatter double construction should not be allowed
+--EXTENSIONS--
+intl
+--FILE--
+__construct('en_US');
+} catch (Error $e) {
+    echo $e->getMessage(), "\n";
+}
+?>
+--EXPECT--
+IntlListFormatter object is already constructed
diff --git a/ext/intl/tests/listformatter/listformatter_get_error.phpt b/ext/intl/tests/listformatter/listformatter_get_error.phpt
new file mode 100644
index 000000000000..a2a23b3473d2
--- /dev/null
+++ b/ext/intl/tests/listformatter/listformatter_get_error.phpt
@@ -0,0 +1,25 @@
+--TEST--
+IntlListFormatter getErrorCode()/getErrorMessage() reflect format() failures
+--EXTENSIONS--
+intl
+--FILE--
+format(["\x80"]));
+var_dump($formatter->getErrorCode() === U_INVALID_CHAR_FOUND);
+var_dump($formatter->getErrorMessage());
+
+var_dump($formatter->format(['a', 'b']));
+var_dump($formatter->getErrorCode() === U_ZERO_ERROR);
+var_dump($formatter->getErrorMessage());
+
+?>
+--EXPECT--
+bool(false)
+bool(true)
+string(85) "IntlListFormatter::format(): Failed to convert string to UTF-16: U_INVALID_CHAR_FOUND"
+string(7) "a and b"
+bool(true)
+string(12) "U_ZERO_ERROR"
diff --git a/ext/intl/tests/locale_lookup_invalid_language_tag.phpt b/ext/intl/tests/locale_lookup_invalid_language_tag.phpt
new file mode 100644
index 000000000000..3ba48f61334b
--- /dev/null
+++ b/ext/intl/tests/locale_lookup_invalid_language_tag.phpt
@@ -0,0 +1,35 @@
+--TEST--
+Locale::lookup() returns null for invalid language tags
+--EXTENSIONS--
+intl
+--FILE--
+getMessage(), PHP_EOL;
+}
+
+try {
+    locale_lookup([''], 'de-DE', false, 'en-US');
+} catch (IntlException $e) {
+    echo $e->getMessage(), PHP_EOL;
+}
+
+?>
+--EXPECT--
+NULL
+string(75) "Locale::lookup(): unable to canonicalize lang_tag: U_ILLEGAL_ARGUMENT_ERROR"
+NULL
+string(74) "locale_lookup(): unable to canonicalize lang_tag: U_ILLEGAL_ARGUMENT_ERROR"
+Locale::lookup(): unable to canonicalize lang_tag
+locale_lookup(): unable to canonicalize lang_tag
diff --git a/ext/intl/tests/msgfmt_parse_int64_min_64.phpt b/ext/intl/tests/msgfmt_parse_int64_min_64.phpt
new file mode 100644
index 000000000000..2d003667813c
--- /dev/null
+++ b/ext/intl/tests/msgfmt_parse_int64_min_64.phpt
@@ -0,0 +1,26 @@
+--TEST--
+MessageFormatter::parse() with PHP_INT_MIN on 64-bit platform
+--EXTENSIONS--
+intl
+--SKIPIF--
+
+--FILE--
+parse('-9,223,372,036,854,775,808');
+var_dump($parsed);
+
+$parsed = MessageFormatter::parseMessage('en_US', '{0,number,integer}', '-9,223,372,036,854,775,808');
+var_dump($parsed);
+
+?>
+--EXPECT--
+array(1) {
+  [0]=>
+  int(-9223372036854775808)
+}
+array(1) {
+  [0]=>
+  int(-9223372036854775808)
+}
diff --git a/ext/intl/tests/rangeformatter/rangeformatter_format_int64.phpt b/ext/intl/tests/rangeformatter/rangeformatter_format_int64.phpt
new file mode 100644
index 000000000000..9cefbcfb1ea8
--- /dev/null
+++ b/ext/intl/tests/rangeformatter/rangeformatter_format_int64.phpt
@@ -0,0 +1,27 @@
+--TEST--
+IntlNumberRangeFormatter::format() preserves int64 precision
+--EXTENSIONS--
+intl
+--SKIPIF--
+
+--FILE--
+format(9007199254740993, 9007199254740993);
+var_dump(preg_replace('/[^0-9]/', '', $formatted));
+?>
+--EXPECT--
+string(16) "9007199254740993"
diff --git a/ext/intl/tests/resourcebundle_get_without_fallback.phpt b/ext/intl/tests/resourcebundle_get_without_fallback.phpt
new file mode 100644
index 000000000000..9f9941227972
--- /dev/null
+++ b/ext/intl/tests/resourcebundle_get_without_fallback.phpt
@@ -0,0 +1,48 @@
+--TEST--
+ResourceBundle::get() rejects fallback results when fallback is disabled with correct error message
+--EXTENSIONS--
+intl
+--FILE--
+get('teststring', false));
+
+$bundle = resourcebundle_create('en', $fixture);
+echo debug(resourcebundle_get($bundle, 'teststring', false));
+?>
+--EXPECTF--
+NULL
+ %i: ResourceBundle::get(): Cannot load element 'teststring' without fallback to %s: U_USING_%s_WARNING
+NULL
+ %i: resourcebundle_get(): Cannot load element 'teststring' without fallback to %s: U_USING_%s_WARNING
+--CLEAN--
+
diff --git a/ext/intl/tests/spoofchecker_007.phpt b/ext/intl/tests/spoofchecker_007.phpt
index b5fc5814ddf8..5f3dbb47f192 100644
--- a/ext/intl/tests/spoofchecker_007.phpt
+++ b/ext/intl/tests/spoofchecker_007.phpt
@@ -4,12 +4,6 @@ spoofchecker with restriction level
 intl
 --SKIPIF--
 
-getConstant("SINGLE_SCRIPT_RESTRICTIVE")) {
-        die("skip Incompatible ICU version");
-    }
-?>
 --FILE--
  or SpoofChecker::USET_CASE_INSENSITIVE%s))
+Spoofchecker::setAllowedChars(): Argument #2 ($patternOptions) must be a valid pattern option, 0 or (SpoofChecker::IGNORE_SPACE|( or SpoofChecker::CASE_INSENSITIVE%s))
 Spoofchecker::setAllowedChars(): Argument #1 ($pattern) must be a valid regular expression character set pattern
 Spoofchecker::setAllowedChars(): Argument #1 ($pattern) must be a valid regular expression character set pattern
diff --git a/ext/intl/tests/spoofchecker_double_ctor.phpt b/ext/intl/tests/spoofchecker_double_ctor.phpt
new file mode 100644
index 000000000000..01dae5ab4bc5
--- /dev/null
+++ b/ext/intl/tests/spoofchecker_double_ctor.phpt
@@ -0,0 +1,18 @@
+--TEST--
+Spoofchecker double construction should not be allowed
+--EXTENSIONS--
+intl
+--SKIPIF--
+
+--FILE--
+__construct();
+} catch (Error $e) {
+    echo $e->getMessage(), "\n";
+}
+?>
+--EXPECT--
+Spoofchecker object is already constructed
diff --git a/ext/intl/tests/spoofchecker_supported_icu57_apis.phpt b/ext/intl/tests/spoofchecker_supported_icu57_apis.phpt
new file mode 100644
index 000000000000..56cc194991ee
--- /dev/null
+++ b/ext/intl/tests/spoofchecker_supported_icu57_apis.phpt
@@ -0,0 +1,36 @@
+--TEST--
+Spoofchecker exposes restriction-level APIs on all supported ICU versions
+--EXTENSIONS--
+intl
+--SKIPIF--
+
+--FILE--
+getConstant("ASCII");
+$singleScriptRestrictive = $r->getConstant("SINGLE_SCRIPT_RESTRICTIVE");
+$mixedNumbers = $r->getConstant("MIXED_NUMBERS");
+
+var_dump($ascii !== false);
+var_dump($singleScriptRestrictive !== false);
+var_dump($mixedNumbers !== false);
+var_dump(is_int($ascii));
+var_dump(is_int($singleScriptRestrictive));
+var_dump(is_int($mixedNumbers));
+var_dump($ascii !== $singleScriptRestrictive);
+var_dump($ascii !== $mixedNumbers);
+var_dump($singleScriptRestrictive !== $mixedNumbers);
+var_dump($r->hasMethod("setRestrictionLevel"));
+?>
+--EXPECT--
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
diff --git a/ext/intl/tests/spoofchecker_unknown_restriction_level.phpt b/ext/intl/tests/spoofchecker_unknown_restriction_level.phpt
index 6b7e9474755d..187be350f594 100644
--- a/ext/intl/tests/spoofchecker_unknown_restriction_level.phpt
+++ b/ext/intl/tests/spoofchecker_unknown_restriction_level.phpt
@@ -5,8 +5,6 @@ intl
 --SKIPIF--
 
 --FILE--
 getMessage(), PHP_EOL;
+	}
+}
+
+$std = new stdClass();
+$calendar = IntlCalendar::createInstance();
+$formatter = new IntlDateFormatter(null, IntlDateFormatter::NONE, IntlDateFormatter::NONE);
+
+dump_exception(fn() => intlcal_create_instance($std));
+dump_exception(fn() => IntlCalendar::createInstance($std));
+dump_exception(fn() => intlcal_set_time_zone($calendar, $std));
+dump_exception(fn() => $calendar->setTimeZone($std));
+dump_exception(fn() => new IntlGregorianCalendar($std));
+dump_exception(fn() => datefmt_create(null, IntlDateFormatter::NONE, IntlDateFormatter::NONE, $std));
+dump_exception(fn() => IntlDateFormatter::create(null, IntlDateFormatter::NONE, IntlDateFormatter::NONE, $std));
+dump_exception(fn() => new IntlDateFormatter(null, IntlDateFormatter::NONE, IntlDateFormatter::NONE, $std));
+dump_exception(fn() => datefmt_set_timezone($formatter, $std));
+dump_exception(fn() => $formatter->setTimeZone($std));
+
+?>
+--EXPECT--
+TypeError: intlcal_create_instance(): Argument #1 ($timezone) Object of class stdClass could not be converted to string
+TypeError: IntlCalendar::createInstance(): Argument #1 ($timezone) Object of class stdClass could not be converted to string
+TypeError: intlcal_set_time_zone(): Argument #2 ($timezone) Object of class stdClass could not be converted to string
+TypeError: IntlCalendar::setTimeZone(): Argument #1 ($timezone) Object of class stdClass could not be converted to string
+TypeError: IntlGregorianCalendar::__construct(): Argument #1 ($timezoneOrYear) Object of class stdClass could not be converted to string
+TypeError: datefmt_create(): Argument #4 ($timezone) Object of class stdClass could not be converted to string
+TypeError: IntlDateFormatter::create(): Argument #4 ($timezone) Object of class stdClass could not be converted to string
+TypeError: IntlDateFormatter::__construct(): Argument #4 ($timezone) Object of class stdClass could not be converted to string
+TypeError: datefmt_set_timezone(): Argument #2 ($timezone) Object of class stdClass could not be converted to string
+TypeError: IntlDateFormatter::setTimeZone(): Argument #1 ($timezone) Object of class stdClass could not be converted to string
diff --git a/ext/intl/tests/timezone_getDisplayName_error.phpt b/ext/intl/tests/timezone_getDisplayName_error.phpt
index ca845b2830ed..032b22e50908 100644
--- a/ext/intl/tests/timezone_getDisplayName_error.phpt
+++ b/ext/intl/tests/timezone_getDisplayName_error.phpt
@@ -8,8 +8,12 @@ intl
 $tz = IntlTimeZone::createTimeZone('Europe/Lisbon');
 var_dump($tz->getDisplayName(false, -1));
 echo intl_get_error_message(), PHP_EOL;
+var_dump($tz->getErrorCode());
+echo $tz->getErrorMessage(), PHP_EOL;
 
 ?>
 --EXPECT--
 bool(false)
 IntlTimeZone::getDisplayName(): wrong display type: U_ILLEGAL_ARGUMENT_ERROR
+int(1)
+IntlTimeZone::getDisplayName(): wrong display type: U_ILLEGAL_ARGUMENT_ERROR
diff --git a/ext/intl/tests/transliterator_transliterate_error.phpt b/ext/intl/tests/transliterator_transliterate_error.phpt
index e11de9333d4c..61190abc6d33 100644
--- a/ext/intl/tests/transliterator_transliterate_error.phpt
+++ b/ext/intl/tests/transliterator_transliterate_error.phpt
@@ -9,17 +9,38 @@ intl.use_exceptions=true
 
 $tr = Transliterator::create("latin");
 
-try {
-	var_dump(transliterator_transliterate($tr, "str", 7));
-} catch (Throwable $e) {
-	echo $e::class, ': ', $e->getMessage(), PHP_EOL;
+function dump_throwable(callable $callback): void {
+    try {
+        $callback();
+    } catch (Throwable $e) {
+        echo $e::class, ': ', $e->getMessage(), PHP_EOL;
+    }
 }
 
-try {
+//Arguments
+dump_throwable(function() use ($tr) {
+    var_dump(transliterator_transliterate($tr, "str", 7));
+});
+
+dump_throwable(function() use ($tr) {
     transliterator_transliterate($tr, "str", 7, 6);
-} catch (Throwable $e) {
-	echo $e::class, ': ', $e->getMessage(), PHP_EOL;
-}
+});
+
+dump_throwable(function() use ($tr) {
+    transliterator_transliterate($tr, "str", 0, -2);
+});
+
+dump_throwable(function() use ($tr) {
+    transliterator_transliterate($tr, "str", -1);
+});
+
+dump_throwable(function() {
+    transliterator_transliterate("latin", "str", -1);
+});
+
+dump_throwable(function() use ($tr) {
+    $tr->transliterate("str", 7, 6);
+});
 
 //bad UTF-8
 try {
@@ -31,5 +52,9 @@ try {
 ?>
 --EXPECT--
 IntlException: transliterator_transliterate(): Neither "start" nor the "end" arguments can exceed the number of UTF-16 code units (in this case, 3)
-ValueError: transliterator_transliterate(): Argument #2 ($string) must be less than or equal to argument #3 ($end)
+ValueError: transliterator_transliterate(): Argument #3 ($start) must be less than or equal to argument #4 ($end)
+ValueError: transliterator_transliterate(): Argument #4 ($end) must be greater than or equal to -1
+ValueError: transliterator_transliterate(): Argument #3 ($start) must be greater than or equal to 0
+ValueError: transliterator_transliterate(): Argument #3 ($start) must be greater than or equal to 0
+ValueError: Transliterator::transliterate(): Argument #2 ($start) must be less than or equal to argument #3 ($end)
 IntlException: transliterator_transliterate(): String conversion of string to UTF-16 failed
diff --git a/ext/intl/tests/uconverter_transcode_subst_length.phpt b/ext/intl/tests/uconverter_transcode_subst_length.phpt
new file mode 100644
index 000000000000..93001b16680c
--- /dev/null
+++ b/ext/intl/tests/uconverter_transcode_subst_length.phpt
@@ -0,0 +1,20 @@
+--TEST--
+UConverter::transcode() rejects too long substitution strings
+--EXTENSIONS--
+intl
+--INI--
+intl.use_exceptions=false
+--FILE--
+ $subst]));
+echo intl_get_error_message(), "\n";
+var_dump(UConverter::transcode('abc', 'UTF-8', 'ASCII', ['to_subst' => $subst]));
+echo intl_get_error_message(), "\n";
+?>
+--EXPECT--
+bool(false)
+UConverter::transcode(): returned error 1: U_ILLEGAL_ARGUMENT_ERROR: U_ILLEGAL_ARGUMENT_ERROR
+bool(false)
+UConverter::transcode(): returned error 1: U_ILLEGAL_ARGUMENT_ERROR: U_ILLEGAL_ARGUMENT_ERROR
diff --git a/ext/intl/timezone/timezone_class.cpp b/ext/intl/timezone/timezone_class.cpp
index c613edf5585f..319e81c9a77d 100644
--- a/ext/intl/timezone/timezone_class.cpp
+++ b/ext/intl/timezone/timezone_class.cpp
@@ -1,12 +1,12 @@
 /*
    +----------------------------------------------------------------------+
-   | This source file is subject to version 3.01 of the PHP license,      |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | https://www.php.net/license/3_01.txt                                 |
-   | If you did not receive a copy of the PHP license and are unable to   |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@php.net so we can mail you a copy immediately.               |
+   | Copyright © The PHP Group and Contributors.                          |
+   +----------------------------------------------------------------------+
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Authors: Gustavo Lopes                           |
    +----------------------------------------------------------------------+
@@ -121,7 +121,7 @@ static void timezone_throw_exception_with_call_location(const char *msg, const c
 /* {{{ timezone_process_timezone_argument
  * TimeZone argument processor. outside_error may be nullptr (for static functions/constructors) */
 U_CFUNC TimeZone *timezone_process_timezone_argument(
-	zend_object *timezone_object, zend_string *timezone_string, intl_error *outside_error)
+	zend_object *timezone_object, zend_string *timezone_string, intl_error *outside_error, uint32_t arg_num)
 {
 	std::unique_ptr	timeZone;
 	bool free_string = false;
@@ -160,8 +160,9 @@ U_CFUNC TimeZone *timezone_process_timezone_argument(
 				free_string = true;
 			} else {
 				if (!EG(exception)) {
-					// TODO Proper type error
-					zend_throw_error(nullptr, "Object of class %s could not be converted to string", ZSTR_VAL(timezone_object->ce->name));
+					zend_argument_type_error(arg_num,
+						"Object of class %s could not be converted to string",
+						ZSTR_VAL(timezone_object->ce->name));
 				}
 				return nullptr;
 			}
@@ -206,7 +207,7 @@ U_CFUNC TimeZone *timezone_process_timezone_argument(
 /* {{{ clone handler for TimeZone */
 static zend_object *TimeZone_clone_obj(zend_object *object)
 {
-	TimeZone_object *to_orig = php_intl_timezone_fetch_object(object);
+	const TimeZone_object *to_orig = php_intl_timezone_fetch_object(object);
 	zend_object     *ret_val = TimeZone_ce_ptr->create_object(object->ce);
 	TimeZone_object  *to_new = php_intl_timezone_fetch_object(ret_val);
 
@@ -357,7 +358,7 @@ U_CFUNC void timezone_register_IntlTimeZone_class(void)
 
 	memcpy(&TimeZone_handlers, &std_object_handlers,
 		sizeof TimeZone_handlers);
-	TimeZone_handlers.offset = XtOffsetOf(TimeZone_object, zo);
+	TimeZone_handlers.offset = offsetof(TimeZone_object, zo);
 	TimeZone_handlers.clone_obj = TimeZone_clone_obj;
 	TimeZone_handlers.compare = TimeZone_compare_objects;
 	TimeZone_handlers.get_debug_info = TimeZone_get_debug_info;
diff --git a/ext/intl/timezone/timezone_class.h b/ext/intl/timezone/timezone_class.h
index bbfd8adcae23..cb74709c965a 100644
--- a/ext/intl/timezone/timezone_class.h
+++ b/ext/intl/timezone/timezone_class.h
@@ -1,12 +1,12 @@
 /*
    +----------------------------------------------------------------------+
-   | This source file is subject to version 3.01 of the PHP license,      |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | https://www.php.net/license/3_01.txt                                 |
-   | If you did not receive a copy of the PHP license and are unable to   |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@php.net so we can mail you a copy immediately.               |
+   | Copyright © The PHP Group and Contributors.                          |
+   +----------------------------------------------------------------------+
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Authors: Gustavo Lopes                        |
    +----------------------------------------------------------------------+
@@ -46,9 +46,7 @@ typedef struct {
 	zend_object		zo;
 } TimeZone_object;
 
-static inline TimeZone_object *php_intl_timezone_fetch_object(zend_object *obj) {
-	return (TimeZone_object *)((char*)(obj) - XtOffsetOf(TimeZone_object, zo));
-}
+#define php_intl_timezone_fetch_object(obj) ZEND_CONTAINER_OF(obj, TimeZone_object, zo)
 #define Z_INTL_TIMEZONE_P(zv) php_intl_timezone_fetch_object(Z_OBJ_P(zv))
 
 #define TIMEZONE_ERROR(to)						(to)->err
@@ -67,7 +65,7 @@ static inline TimeZone_object *php_intl_timezone_fetch_object(zend_object *obj)
 	}
 
 zval *timezone_convert_to_datetimezone(const TimeZone *timeZone, intl_error *outside_error, zval *ret);
-TimeZone *timezone_process_timezone_argument(zend_object *timezone_object, zend_string *timezone_string, intl_error *error);
+TimeZone *timezone_process_timezone_argument(zend_object *timezone_object, zend_string *timezone_string, intl_error *error, uint32_t arg_num);
 
 void timezone_object_construct(const TimeZone *zone, zval *object, int owned);
 
diff --git a/ext/intl/timezone/timezone_methods.cpp b/ext/intl/timezone/timezone_methods.cpp
index 3de186a9ca03..8f70a87487ac 100644
--- a/ext/intl/timezone/timezone_methods.cpp
+++ b/ext/intl/timezone/timezone_methods.cpp
@@ -1,12 +1,12 @@
 /*
    +----------------------------------------------------------------------+
-   | This source file is subject to version 3.01 of the PHP license,      |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | https://www.php.net/license/3_01.txt                                 |
-   | If you did not receive a copy of the PHP license and are unable to   |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@php.net so we can mail you a copy immediately.               |
+   | Copyright © The PHP Group and Contributors.                          |
+   +----------------------------------------------------------------------+
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Authors: Gustavo Lopes                           |
    +----------------------------------------------------------------------+
@@ -483,13 +483,16 @@ U_CFUNC PHP_FUNCTION(intltz_get_display_name)
 		RETURN_THROWS();
 	}
 
+	TIMEZONE_METHOD_FETCH_OBJECT;
+
 	bool found = false;
 	for (int i = 0; !found && i < sizeof(display_types)/sizeof(*display_types); i++) {
 		if (display_types[i] == display_type)
 			found = true;
 	}
 	if (!found) {
-		intl_error_set(NULL, U_ILLEGAL_ARGUMENT_ERROR, "wrong display type");
+		intl_errors_set(TIMEZONE_ERROR_P(to), U_ILLEGAL_ARGUMENT_ERROR,
+			"wrong display type");
 		RETURN_FALSE;
 	}
 
@@ -497,8 +500,6 @@ U_CFUNC PHP_FUNCTION(intltz_get_display_name)
 		locale_str = intl_locale_get_default();
 	}
 
-	TIMEZONE_METHOD_FETCH_OBJECT;
-
 	UnicodeString result;
 	to->utimezone->getDisplayName((UBool)daylight, (TimeZone::EDisplayType)display_type,
 		Locale::createFromName(locale_str), result);
diff --git a/ext/intl/transliterator/transliterator.h b/ext/intl/transliterator/transliterator.h
index f98ca0682965..2a86eb6781be 100644
--- a/ext/intl/transliterator/transliterator.h
+++ b/ext/intl/transliterator/transliterator.h
@@ -1,12 +1,12 @@
 /*
    +----------------------------------------------------------------------+
-   | This source file is subject to version 3.01 of the PHP license,      |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | https://www.php.net/license/3_01.txt                                 |
-   | If you did not receive a copy of the PHP license and are unable to   |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@php.net so we can mail you a copy immediately.               |
+   | Copyright © The PHP Group and Contributors.                          |
+   +----------------------------------------------------------------------+
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Authors: Gustavo Lopes                        |
    +----------------------------------------------------------------------+
diff --git a/ext/intl/transliterator/transliterator_class.cpp b/ext/intl/transliterator/transliterator_class.cpp
index fd0cd4f3c3e6..737c51fcf4dd 100644
--- a/ext/intl/transliterator/transliterator_class.cpp
+++ b/ext/intl/transliterator/transliterator_class.cpp
@@ -1,12 +1,12 @@
 /*
    +----------------------------------------------------------------------+
-   | This source file is subject to version 3.01 of the PHP license,      |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | https://www.php.net/license/3_01.txt                                 |
-   | If you did not receive a copy of the PHP license and are unable to   |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@php.net so we can mail you a copy immediately.               |
+   | Copyright © The PHP Group and Contributors.                          |
+   +----------------------------------------------------------------------+
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Authors: Gustavo Lopes                           |
    +----------------------------------------------------------------------+
@@ -80,7 +80,7 @@ static void transliterator_object_init( Transliterator_object* to )
 /* }}} */
 
 /* {{{ void transliterator_object_destroy( Transliterator_object* to )
- * Clean up mem allocted by internals of Transliterator_object
+ * Clean up mem allocated by internals of Transliterator_object
  */
 static void transliterator_object_destroy( Transliterator_object* to )
 {
@@ -130,7 +130,7 @@ static zend_object *Transliterator_object_create( zend_class_entry *ce )
 /* {{{ clone handler for Transliterator */
 static zend_object *Transliterator_clone_obj( zend_object *object )
 {
-	Transliterator_object *to_orig = php_intl_transliterator_fetch_object(object);
+	const Transliterator_object *to_orig = php_intl_transliterator_fetch_object(object);
 	zend_object           *ret_val = Transliterator_ce_ptr->create_object(object->ce);
 	Transliterator_object  *to_new = php_intl_transliterator_fetch_object(ret_val);
 
@@ -167,7 +167,7 @@ U_CFUNC void transliterator_register_Transliterator_class( void )
 	Transliterator_ce_ptr->create_object = Transliterator_object_create;
 	Transliterator_ce_ptr->default_object_handlers = &Transliterator_handlers;
 	memcpy( &Transliterator_handlers, &std_object_handlers, sizeof Transliterator_handlers );
-	Transliterator_handlers.offset = XtOffsetOf(Transliterator_object, zo);
+	Transliterator_handlers.offset = offsetof(Transliterator_object, zo);
 	Transliterator_handlers.free_obj = Transliterator_objects_free;
 	Transliterator_handlers.clone_obj = Transliterator_clone_obj;
 }
diff --git a/ext/intl/transliterator/transliterator_class.h b/ext/intl/transliterator/transliterator_class.h
index 7e02d6fa5e28..1bdcd60eadc5 100644
--- a/ext/intl/transliterator/transliterator_class.h
+++ b/ext/intl/transliterator/transliterator_class.h
@@ -1,12 +1,12 @@
 /*
    +----------------------------------------------------------------------+
-   | This source file is subject to version 3.01 of the PHP license,      |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | https://www.php.net/license/3_01.txt                                 |
-   | If you did not receive a copy of the PHP license and are unable to   |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@php.net so we can mail you a copy immediately.               |
+   | Copyright © The PHP Group and Contributors.                          |
+   +----------------------------------------------------------------------+
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Authors: Gustavo Lopes                        |
    +----------------------------------------------------------------------+
@@ -38,9 +38,7 @@ typedef struct {
 	zend_object     zo;
 } Transliterator_object;
 
-static inline Transliterator_object *php_intl_transliterator_fetch_object(zend_object *obj) {
-	return (Transliterator_object *)((char*)(obj) - XtOffsetOf(Transliterator_object, zo));
-}
+#define php_intl_transliterator_fetch_object(obj) ZEND_CONTAINER_OF(obj, Transliterator_object, zo)
 #define Z_INTL_TRANSLITERATOR_P(zv) php_intl_transliterator_fetch_object(Z_OBJ_P(zv))
 
 #define TRANSLITERATOR_FORWARD UTRANS_FORWARD
diff --git a/ext/intl/transliterator/transliterator_methods.cpp b/ext/intl/transliterator/transliterator_methods.cpp
index d8a8cbb7a49e..16e5cf8b95d3 100644
--- a/ext/intl/transliterator/transliterator_methods.cpp
+++ b/ext/intl/transliterator/transliterator_methods.cpp
@@ -1,12 +1,12 @@
 /*
    +----------------------------------------------------------------------+
-   | This source file is subject to version 3.01 of the PHP license,      |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | https://www.php.net/license/3_01.txt                                 |
-   | If you did not receive a copy of the PHP license and are unable to   |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@php.net so we can mail you a copy immediately.               |
+   | Copyright © The PHP Group and Contributors.                          |
+   +----------------------------------------------------------------------+
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Authors: Gustavo Lopes                           |
    +----------------------------------------------------------------------+
@@ -276,14 +276,16 @@ U_CFUNC PHP_FUNCTION( transliterator_transliterate )
 	zend_long	start		= 0,
 				limit		= -1;
 	int			success     = 0;
+	bool		is_method;
 	zval 		tmp_object;
 	TRANSLITERATOR_METHOD_INIT_VARS;
 
 	object = getThis();
+	is_method = object != NULL;
 
 	ZVAL_UNDEF(&tmp_object);
 
-	if (object == nullptr) {
+	if (!is_method) {
 		/* in non-OOP version, accept both a transliterator and a string */
 		zend_string *arg1_str;
 		zend_object *arg1_obj;
@@ -320,17 +322,17 @@ U_CFUNC PHP_FUNCTION( transliterator_transliterate )
 	}
 
 	if (limit < -1) {
-		zend_argument_value_error(object ? 3 : 4, "must be greater than or equal to -1");
+		zend_argument_value_error(is_method ? 3 : 4, "must be greater than or equal to -1");
 		goto cleanup_object;
 	}
 
 	if (start < 0) {
-		zend_argument_value_error(object ? 2 : 3, "must be greater than or equal to 0");
+		zend_argument_value_error(is_method ? 2 : 3, "must be greater than or equal to 0");
 		goto cleanup_object;
 	}
 
 	if (limit != -1 && start > limit) {
-		zend_argument_value_error(object ? 2 : 3, "must be less than or equal to argument #%d ($end)", object ? 3 : 4);
+		zend_argument_value_error(is_method ? 2 : 3, "must be less than or equal to argument #%d ($end)", is_method ? 3 : 4);
 		goto cleanup_object;
 	}
 
diff --git a/ext/intl/uchar/uchar.cpp b/ext/intl/uchar/uchar.cpp
index f1f777f0ea3e..4f403cba818e 100644
--- a/ext/intl/uchar/uchar.cpp
+++ b/ext/intl/uchar/uchar.cpp
@@ -1,3 +1,17 @@
+/*
+   +----------------------------------------------------------------------+
+   | Copyright © The PHP Group and Contributors.                          |
+   +----------------------------------------------------------------------+
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
+   +----------------------------------------------------------------------+
+   | Authors: Sara Golemon                               |
+   +----------------------------------------------------------------------+
+ */
+
 extern "C" {
 #include "uchar.h"
 #include "intl_data.h"
@@ -527,8 +541,8 @@ IC_METHOD(getFC_NFKC_Closure) {
 
 	error = U_ZERO_ERROR;
 	u8str = intl_convert_utf16_to_utf8(closure, closure_len, &error);
-	INTL_CHECK_STATUS(error, "Failed converting output to UTF8");
 	efree(closure);
+	INTL_CHECK_STATUS(error, "Failed converting output to UTF8");
 	RETVAL_NEW_STR(u8str);
 }
 /* }}} */
diff --git a/ext/intl/uchar/uchar.h b/ext/intl/uchar/uchar.h
index 25bab1f2156f..7b472163ab0f 100644
--- a/ext/intl/uchar/uchar.h
+++ b/ext/intl/uchar/uchar.h
@@ -1,3 +1,17 @@
+/*
+   +----------------------------------------------------------------------+
+   | Copyright © The PHP Group and Contributors.                          |
+   +----------------------------------------------------------------------+
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
+   +----------------------------------------------------------------------+
+   | Authors: Sara Golemon                               |
+   +----------------------------------------------------------------------+
+ */
+
 #ifndef incl_PHP_INTL_UCHAR_H
 #define incl_PHP_INTL_UCHAR_H
 
diff --git a/ext/json/json.c b/ext/json/json.c
index 079f67a5c400..3ba53e959c5d 100644
--- a/ext/json/json.c
+++ b/ext/json/json.c
@@ -1,14 +1,12 @@
 /*
   +----------------------------------------------------------------------+
-  | Copyright (c) The PHP Group                                          |
+  | Copyright © The PHP Group and Contributors.                          |
   +----------------------------------------------------------------------+
-  | This source file is subject to version 3.01 of the PHP license,      |
-  | that is bundled with this package in the file LICENSE, and is        |
-  | available through the world-wide-web at the following url:           |
-  | https://www.php.net/license/3_01.txt                                 |
-  | If you did not receive a copy of the PHP license and are unable to   |
-  | obtain it through the world-wide-web, please send a note to          |
-  | license@php.net so we can mail you a copy immediately.               |
+  | This source file is subject to the Modified BSD License that is      |
+  | bundled with this package in the file LICENSE, and is available      |
+  | through the World Wide Web at .        |
+  |                                                                      |
+  | SPDX-License-Identifier: BSD-3-Clause                                |
   +----------------------------------------------------------------------+
   | Author: Omar Kilani                                    |
   |         Jakub Zelenka                                 |
diff --git a/ext/json/json_encoder.c b/ext/json/json_encoder.c
index 186485c05c6f..424315eca7ec 100644
--- a/ext/json/json_encoder.c
+++ b/ext/json/json_encoder.c
@@ -1,14 +1,12 @@
 /*
   +----------------------------------------------------------------------+
-  | Copyright (c) The PHP Group                                          |
+  | Copyright © The PHP Group and Contributors.                          |
   +----------------------------------------------------------------------+
-  | This source file is subject to version 3.01 of the PHP license,      |
-  | that is bundled with this package in the file LICENSE, and is        |
-  | available through the world-wide-web at the following url:           |
-  | https://www.php.net/license/3_01.txt                                 |
-  | If you did not receive a copy of the PHP license and are unable to   |
-  | obtain it through the world-wide-web, please send a note to          |
-  | license@php.net so we can mail you a copy immediately.               |
+  | This source file is subject to the Modified BSD License that is      |
+  | bundled with this package in the file LICENSE, and is available      |
+  | through the World Wide Web at .        |
+  |                                                                      |
+  | SPDX-License-Identifier: BSD-3-Clause                                |
   +----------------------------------------------------------------------+
   | Author: Omar Kilani                                    |
   |         Jakub Zelenka                                 |
@@ -54,6 +52,7 @@ static inline void php_json_pretty_print_char(smart_str *buf, int options, char
 static inline void php_json_pretty_print_indent(smart_str *buf, int options, const php_json_encoder *encoder) /* {{{ */
 {
 	if (options & PHP_JSON_PRETTY_PRINT) {
+		smart_str_alloc(buf, encoder->depth * 4, 0);
 		for (int i = 0; i < encoder->depth; ++i) {
 			smart_str_appendl(buf, "    ", 4);
 		}
diff --git a/ext/json/json_parser.y b/ext/json/json_parser.y
index 2fd4edfe3693..cf296ed9db62 100644
--- a/ext/json/json_parser.y
+++ b/ext/json/json_parser.y
@@ -2,15 +2,13 @@
 %code top {
 /*
   +----------------------------------------------------------------------+
-  | Copyright (c) The PHP Group                                          |
+  | Copyright © The PHP Group and Contributors.                          |
   +----------------------------------------------------------------------+
-  | This source file is subject to version 3.01 of the PHP license,      |
-  | that is bundled with this package in the file LICENSE, and is        |
-  | available through the world-wide-web at the following url:           |
-  | https://www.php.net/license/3_01.txt                                 |
-  | If you did not receive a copy of the PHP license and are unable to   |
-  | obtain it through the world-wide-web, please send a note to          |
-  | license@php.net so we can mail you a copy immediately.               |
+  | This source file is subject to the Modified BSD License that is      |
+  | bundled with this package in the file LICENSE, and is available      |
+  | through the World Wide Web at .        |
+  |                                                                      |
+  | SPDX-License-Identifier: BSD-3-Clause                                |
   +----------------------------------------------------------------------+
   | Author: Jakub Zelenka                                 |
   +----------------------------------------------------------------------+
diff --git a/ext/json/json_scanner.re b/ext/json/json_scanner.re
index d6eaaf65b2e1..e4d25009132a 100644
--- a/ext/json/json_scanner.re
+++ b/ext/json/json_scanner.re
@@ -1,14 +1,12 @@
 /*
   +----------------------------------------------------------------------+
-  | Copyright (c) The PHP Group                                          |
+  | Copyright © The PHP Group and Contributors.                          |
   +----------------------------------------------------------------------+
-  | This source file is subject to version 3.01 of the PHP license,      |
-  | that is bundled with this package in the file LICENSE, and is        |
-  | available through the world-wide-web at the following url:           |
-  | https://www.php.net/license/3_01.txt                                 |
-  | If you did not receive a copy of the PHP license and are unable to   |
-  | obtain it through the world-wide-web, please send a note to          |
-  | license@php.net so we can mail you a copy immediately.               |
+  | This source file is subject to the Modified BSD License that is      |
+  | bundled with this package in the file LICENSE, and is available      |
+  | through the World Wide Web at .        |
+  |                                                                      |
+  | SPDX-License-Identifier: BSD-3-Clause                                |
   +----------------------------------------------------------------------+
   | Author: Jakub Zelenka                                 |
   +----------------------------------------------------------------------+
diff --git a/ext/json/php_json.h b/ext/json/php_json.h
index bbe8be9d60ad..e2728835ed42 100644
--- a/ext/json/php_json.h
+++ b/ext/json/php_json.h
@@ -1,14 +1,12 @@
 /*
   +----------------------------------------------------------------------+
-  | Copyright (c) The PHP Group                                          |
+  | Copyright © The PHP Group and Contributors.                          |
   +----------------------------------------------------------------------+
-  | This source file is subject to version 3.01 of the PHP license,      |
-  | that is bundled with this package in the file LICENSE, and is        |
-  | available through the world-wide-web at the following url:           |
-  | https://www.php.net/license/3_01.txt                                 |
-  | If you did not receive a copy of the PHP license and are unable to   |
-  | obtain it through the world-wide-web, please send a note to          |
-  | license@php.net so we can mail you a copy immediately.               |
+  | This source file is subject to the Modified BSD License that is      |
+  | bundled with this package in the file LICENSE, and is available      |
+  | through the World Wide Web at .        |
+  |                                                                      |
+  | SPDX-License-Identifier: BSD-3-Clause                                |
   +----------------------------------------------------------------------+
   | Author: Omar Kilani                                    |
   |         Jakub Zelenka                                 |
diff --git a/ext/json/php_json_encoder.h b/ext/json/php_json_encoder.h
index d66d71cb5538..30cc1d564fa5 100644
--- a/ext/json/php_json_encoder.h
+++ b/ext/json/php_json_encoder.h
@@ -1,14 +1,12 @@
 /*
   +----------------------------------------------------------------------+
-  | Copyright (c) The PHP Group                                          |
+  | Copyright © The PHP Group and Contributors.                          |
   +----------------------------------------------------------------------+
-  | This source file is subject to version 3.01 of the PHP license,      |
-  | that is bundled with this package in the file LICENSE, and is        |
-  | available through the world-wide-web at the following url:           |
-  | https://www.php.net/license/3_01.txt                                 |
-  | If you did not receive a copy of the PHP license and are unable to   |
-  | obtain it through the world-wide-web, please send a note to          |
-  | license@php.net so we can mail you a copy immediately.               |
+  | This source file is subject to the Modified BSD License that is      |
+  | bundled with this package in the file LICENSE, and is available      |
+  | through the World Wide Web at .        |
+  |                                                                      |
+  | SPDX-License-Identifier: BSD-3-Clause                                |
   +----------------------------------------------------------------------+
   | Author: Jakub Zelenka                                 |
   +----------------------------------------------------------------------+
diff --git a/ext/json/php_json_parser.h b/ext/json/php_json_parser.h
index 8fee3d11c6bf..4a7d64307c43 100644
--- a/ext/json/php_json_parser.h
+++ b/ext/json/php_json_parser.h
@@ -1,14 +1,12 @@
 /*
   +----------------------------------------------------------------------+
-  | Copyright (c) The PHP Group                                          |
+  | Copyright © The PHP Group and Contributors.                          |
   +----------------------------------------------------------------------+
-  | This source file is subject to version 3.01 of the PHP license,      |
-  | that is bundled with this package in the file LICENSE, and is        |
-  | available through the world-wide-web at the following url:           |
-  | https://www.php.net/license/3_01.txt                                 |
-  | If you did not receive a copy of the PHP license and are unable to   |
-  | obtain it through the world-wide-web, please send a note to          |
-  | license@php.net so we can mail you a copy immediately.               |
+  | This source file is subject to the Modified BSD License that is      |
+  | bundled with this package in the file LICENSE, and is available      |
+  | through the World Wide Web at .        |
+  |                                                                      |
+  | SPDX-License-Identifier: BSD-3-Clause                                |
   +----------------------------------------------------------------------+
   | Author: Jakub Zelenka                                 |
   +----------------------------------------------------------------------+
diff --git a/ext/json/php_json_scanner.h b/ext/json/php_json_scanner.h
index a6de149391dc..90460cf9952a 100644
--- a/ext/json/php_json_scanner.h
+++ b/ext/json/php_json_scanner.h
@@ -1,14 +1,12 @@
 /*
   +----------------------------------------------------------------------+
-  | Copyright (c) The PHP Group                                          |
+  | Copyright © The PHP Group and Contributors.                          |
   +----------------------------------------------------------------------+
-  | This source file is subject to version 3.01 of the PHP license,      |
-  | that is bundled with this package in the file LICENSE, and is        |
-  | available through the world-wide-web at the following url:           |
-  | https://www.php.net/license/3_01.txt                                 |
-  | If you did not receive a copy of the PHP license and are unable to   |
-  | obtain it through the world-wide-web, please send a note to          |
-  | license@php.net so we can mail you a copy immediately.               |
+  | This source file is subject to the Modified BSD License that is      |
+  | bundled with this package in the file LICENSE, and is available      |
+  | through the World Wide Web at .        |
+  |                                                                      |
+  | SPDX-License-Identifier: BSD-3-Clause                                |
   +----------------------------------------------------------------------+
   | Author: Jakub Zelenka                                 |
   +----------------------------------------------------------------------+
diff --git a/ext/ldap/config.w32 b/ext/ldap/config.w32
index 7dbb353dd80b..c6a7049aa1c6 100644
--- a/ext/ldap/config.w32
+++ b/ext/ldap/config.w32
@@ -24,7 +24,7 @@ if (PHP_LDAP != "no") {
 		AC_DEFINE('HAVE_LDAP_WHOAMI_S', 1);
 		AC_DEFINE('HAVE_LDAP_REFRESH_S', 1);
 		AC_DEFINE('HAVE_LDAP_EXTENDED_OPERATION', 1);
-
+		AC_DEFINE('HAVE_3ARG_SETREBINDPROC', 1);
 	} else {
 		WARNING("ldap not enabled; libraries and headers not found");
 	}
diff --git a/ext/ldap/ldap.c b/ext/ldap/ldap.c
index 5cc462d624ac..da0c4b216ffe 100644
--- a/ext/ldap/ldap.c
+++ b/ext/ldap/ldap.c
@@ -1,14 +1,12 @@
 /*
    +----------------------------------------------------------------------+
-   | Copyright (c) The PHP Group                                          |
+   | Copyright © The PHP Group and Contributors.                          |
    +----------------------------------------------------------------------+
-   | This source file is subject to version 3.01 of the PHP license,      |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | https://www.php.net/license/3_01.txt                                 |
-   | If you did not receive a copy of the PHP license and are unable to   |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@php.net so we can mail you a copy immediately.               |
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Authors: Amitay Isaacs                             |
    |          Eric Warnke                               |
@@ -102,9 +100,7 @@ ZEND_TSRMLS_CACHE_DEFINE()
 ZEND_GET_MODULE(ldap)
 #endif
 
-static inline ldap_linkdata *ldap_link_from_obj(zend_object *obj) {
-	return (ldap_linkdata *)((char *)(obj) - XtOffsetOf(ldap_linkdata, std));
-}
+#define ldap_link_from_obj(obj) ZEND_CONTAINER_OF(obj, ldap_linkdata, std)
 
 #define Z_LDAP_LINK_P(zv) ldap_link_from_obj(Z_OBJ_P(zv))
 
@@ -149,9 +145,7 @@ static void ldap_link_free_obj(zend_object *obj)
 	zend_object_std_dtor(&ld->std);
 }
 
-static inline ldap_resultdata *ldap_result_from_obj(zend_object *obj) {
-	return (ldap_resultdata *)((char *)(obj) - XtOffsetOf(ldap_resultdata, std));
-}
+#define ldap_result_from_obj(obj) ZEND_CONTAINER_OF(obj, ldap_resultdata, std)
 
 #define Z_LDAP_RESULT_P(zv) ldap_result_from_obj(Z_OBJ_P(zv))
 
@@ -186,9 +180,7 @@ static void ldap_result_free_obj(zend_object *obj)
 	zend_object_std_dtor(&result->std);
 }
 
-static inline ldap_result_entry *ldap_result_entry_from_obj(zend_object *obj) {
-	return (ldap_result_entry *)((char *)(obj) - XtOffsetOf(ldap_result_entry, std));
-}
+#define ldap_result_entry_from_obj(obj) ZEND_CONTAINER_OF(obj, ldap_result_entry, std)
 
 #define Z_LDAP_RESULT_ENTRY_P(zv) ldap_result_entry_from_obj(Z_OBJ_P(zv))
 
@@ -273,7 +265,7 @@ static zend_string* php_ldap_try_get_ldap_value_from_zval(zval *zv) {
 
 /* The char pointer MUST refer to the char* of a zend_string struct */
 static void php_ldap_zend_string_release_from_char_pointer(char *ptr) {
-	zend_string_release((zend_string*) (ptr - XtOffsetOf(zend_string, val)));
+	zend_string_release((zend_string*) (ptr - offsetof(zend_string, val)));
 }
 
 /* {{{ Parse controls from and to arrays */
@@ -879,7 +871,7 @@ PHP_MINIT_FUNCTION(ldap)
 	ldap_link_ce->default_object_handlers = &ldap_link_object_handlers;
 
 	memcpy(&ldap_link_object_handlers, &std_object_handlers, sizeof(zend_object_handlers));
-	ldap_link_object_handlers.offset = XtOffsetOf(ldap_linkdata, std);
+	ldap_link_object_handlers.offset = offsetof(ldap_linkdata, std);
 	ldap_link_object_handlers.free_obj = ldap_link_free_obj;
 	ldap_link_object_handlers.get_constructor = ldap_link_get_constructor;
 	ldap_link_object_handlers.clone_obj = NULL;
@@ -890,7 +882,7 @@ PHP_MINIT_FUNCTION(ldap)
 	ldap_result_ce->default_object_handlers = &ldap_result_object_handlers;
 
 	memcpy(&ldap_result_object_handlers, &std_object_handlers, sizeof(zend_object_handlers));
-	ldap_result_object_handlers.offset = XtOffsetOf(ldap_resultdata, std);
+	ldap_result_object_handlers.offset = offsetof(ldap_resultdata, std);
 	ldap_result_object_handlers.free_obj = ldap_result_free_obj;
 	ldap_result_object_handlers.get_constructor = ldap_result_get_constructor;
 	ldap_result_object_handlers.clone_obj = NULL;
@@ -901,7 +893,7 @@ PHP_MINIT_FUNCTION(ldap)
 	ldap_result_entry_ce->default_object_handlers = &ldap_result_entry_object_handlers;
 
 	memcpy(&ldap_result_entry_object_handlers, &std_object_handlers, sizeof(zend_object_handlers));
-	ldap_result_entry_object_handlers.offset = XtOffsetOf(ldap_result_entry, std);
+	ldap_result_entry_object_handlers.offset = offsetof(ldap_result_entry, std);
 	ldap_result_entry_object_handlers.free_obj = ldap_result_entry_free_obj;
 	ldap_result_entry_object_handlers.get_constructor = ldap_result_entry_get_constructor;
 	ldap_result_entry_object_handlers.clone_obj = NULL;
@@ -2434,7 +2426,9 @@ static void php_ldap_do_modify(INTERNAL_FUNCTION_PARAMETERS, int oper, bool ext)
 			object_init_ex(return_value, ldap_result_ce);
 			result = Z_LDAP_RESULT_P(return_value);
 			result->result = ldap_res;
-		} else RETVAL_TRUE;
+		} else {
+			RETVAL_TRUE;
+		}
 	}
 
 cleanup:
@@ -2781,7 +2775,7 @@ PHP_FUNCTION(ldap_modify_batch)
 			case LDAP_MODIFY_BATCH_REPLACE:
 				ldap_operation = LDAP_MOD_REPLACE;
 				break;
-			EMPTY_SWITCH_DEFAULT_CASE();
+			default: ZEND_UNREACHABLE();
 		}
 
 		/* fill in the basic info */
diff --git a/ext/ldap/ldap.stub.php b/ext/ldap/ldap.stub.php
index 84befe3f43f8..52cf3828dba3 100644
--- a/ext/ldap/ldap.stub.php
+++ b/ext/ldap/ldap.stub.php
@@ -659,7 +659,7 @@ function ldap_list($ldap, array|string $base, array|string $filter, array $attri
     /** @param LDAP\Connection|array $ldap */
     function ldap_search($ldap, array|string $base, array|string $filter, array $attributes = [], int $attributes_only = 0, int $sizelimit = -1, int $timelimit = -1, int $deref = LDAP_DEREF_NEVER, ?array $controls = null): LDAP\Result|array|false {}
 
-    function ldap_free_result(LDAP\Result $result): bool {}
+    function ldap_free_result(LDAP\Result $result): true {}
 
     function ldap_count_entries(LDAP\Connection $ldap, LDAP\Result $result): int {}
 
diff --git a/ext/ldap/ldap_arginfo.h b/ext/ldap/ldap_arginfo.h
index aa371b7a8d49..8f5e7e34ba32 100644
--- a/ext/ldap/ldap_arginfo.h
+++ b/ext/ldap/ldap_arginfo.h
@@ -1,5 +1,5 @@
 /* This is a generated file, edit ldap.stub.php instead.
- * Stub hash: 9e47a0d85336f0e149abbdf56468513c5d31780f */
+ * Stub hash: 0dde8fd813f43640dee842c03365d7431858a56d */
 
 #if defined(HAVE_ORALDAP)
 ZEND_BEGIN_ARG_WITH_RETURN_OBJ_TYPE_MASK_EX(arginfo_ldap_connect, 0, 0, LDAP\\Connection, MAY_BE_FALSE)
@@ -75,7 +75,7 @@ ZEND_END_ARG_INFO()
 
 #define arginfo_ldap_search arginfo_ldap_read
 
-ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_ldap_free_result, 0, 1, _IS_BOOL, 0)
+ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_ldap_free_result, 0, 1, IS_TRUE, 0)
 	ZEND_ARG_OBJ_INFO(0, result, LDAP\\Result, 0)
 ZEND_END_ARG_INFO()
 
diff --git a/ext/ldap/php_ldap.h b/ext/ldap/php_ldap.h
index a8c4a77af801..a8591888fa83 100644
--- a/ext/ldap/php_ldap.h
+++ b/ext/ldap/php_ldap.h
@@ -1,14 +1,12 @@
 /*
    +----------------------------------------------------------------------+
-   | Copyright (c) The PHP Group                                          |
+   | Copyright © The PHP Group and Contributors.                          |
    +----------------------------------------------------------------------+
-   | This source file is subject to version 3.01 of the PHP license,      |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | https://www.php.net/license/3_01.txt                                 |
-   | If you did not receive a copy of the PHP license and are unable to   |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@php.net so we can mail you a copy immediately.               |
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Authors: Amitay Isaacs                             |
    |          Eric Warnke                               |
diff --git a/ext/lexbor/config.m4 b/ext/lexbor/config.m4
index 3e67c10fdfc3..a75f490e77cc 100644
--- a/ext/lexbor/config.m4
+++ b/ext/lexbor/config.m4
@@ -1,8 +1,7 @@
-PHP_LEXBOR_CFLAGS="-I@ext_srcdir@/"
+PHP_LEXBOR_CFLAGS="-Wno-unknown-warning-option -Wno-unterminated-string-initialization -I@ext_srcdir@/"
 LEXBOR_DIR="lexbor"
 
 AC_DEFINE([HAVE_LEXBOR], [1], [Define to 1 if the PHP extension 'lexbor' is available.])
-AC_DEFINE([LEXBOR_VERSION], ["2.5.0"], [Define the main Lexbor version])
 
 PHP_NEW_EXTENSION([lexbor], m4_normalize([
     php_lexbor.c
@@ -23,15 +22,23 @@ PHP_NEW_EXTENSION([lexbor], m4_normalize([
     $LEXBOR_DIR/core/shs.c
     $LEXBOR_DIR/core/str.c
     $LEXBOR_DIR/core/strtod.c
+    $LEXBOR_DIR/css/at_rule.c
+    $LEXBOR_DIR/css/at_rule/state.c
+    $LEXBOR_DIR/css/blank.c
     $LEXBOR_DIR/css/css.c
+    $LEXBOR_DIR/css/declaration.c
     $LEXBOR_DIR/css/log.c
     $LEXBOR_DIR/css/parser.c
+    $LEXBOR_DIR/css/property.c
+    $LEXBOR_DIR/css/property/state.c
+    $LEXBOR_DIR/css/rule.c
     $LEXBOR_DIR/css/selectors/pseudo_state.c
     $LEXBOR_DIR/css/selectors/pseudo.c
     $LEXBOR_DIR/css/selectors/selector.c
     $LEXBOR_DIR/css/selectors/selectors.c
     $LEXBOR_DIR/css/selectors/state.c
     $LEXBOR_DIR/css/state.c
+    $LEXBOR_DIR/css/stylesheet.c
     $LEXBOR_DIR/css/syntax/anb.c
     $LEXBOR_DIR/css/syntax/parser.c
     $LEXBOR_DIR/css/syntax/state.c
@@ -39,6 +46,8 @@ PHP_NEW_EXTENSION([lexbor], m4_normalize([
     $LEXBOR_DIR/css/syntax/token.c
     $LEXBOR_DIR/css/syntax/tokenizer.c
     $LEXBOR_DIR/css/syntax/tokenizer/error.c
+    $LEXBOR_DIR/css/unit.c
+    $LEXBOR_DIR/css/value.c
     $LEXBOR_DIR/dom/interface.c
     $LEXBOR_DIR/dom/interfaces/attr.c
     $LEXBOR_DIR/dom/interfaces/cdata_section.c
@@ -114,7 +123,9 @@ PHP_NEW_EXTENSION([lexbor], m4_normalize([
     $LEXBOR_DIR/html/interfaces/progress_element.c
     $LEXBOR_DIR/html/interfaces/quote_element.c
     $LEXBOR_DIR/html/interfaces/script_element.c
+    $LEXBOR_DIR/html/interfaces/search_element.c
     $LEXBOR_DIR/html/interfaces/select_element.c
+    $LEXBOR_DIR/html/interfaces/selectedcontent_element.c
     $LEXBOR_DIR/html/interfaces/slot_element.c
     $LEXBOR_DIR/html/interfaces/source_element.c
     $LEXBOR_DIR/html/interfaces/span_element.c
@@ -135,6 +146,7 @@ PHP_NEW_EXTENSION([lexbor], m4_normalize([
     $LEXBOR_DIR/html/interfaces/video_element.c
     $LEXBOR_DIR/html/interfaces/window.c
     $LEXBOR_DIR/html/parser.c
+    $LEXBOR_DIR/html/tag.c
     $LEXBOR_DIR/html/token_attr.c
     $LEXBOR_DIR/html/token.c
     $LEXBOR_DIR/html/tokenizer.c
@@ -164,8 +176,6 @@ PHP_NEW_EXTENSION([lexbor], m4_normalize([
     $LEXBOR_DIR/html/tree/insertion_mode/in_head_noscript.c
     $LEXBOR_DIR/html/tree/insertion_mode/in_head.c
     $LEXBOR_DIR/html/tree/insertion_mode/in_row.c
-    $LEXBOR_DIR/html/tree/insertion_mode/in_select_in_table.c
-    $LEXBOR_DIR/html/tree/insertion_mode/in_select.c
     $LEXBOR_DIR/html/tree/insertion_mode/in_table_body.c
     $LEXBOR_DIR/html/tree/insertion_mode/in_table_text.c
     $LEXBOR_DIR/html/tree/insertion_mode/in_table.c
@@ -187,6 +197,8 @@ PHP_NEW_EXTENSION([lexbor], m4_normalize([
 PHP_ADD_BUILD_DIR([
   $ext_builddir/
   $ext_builddir/$LEXBOR_DIR/core
+  $ext_builddir/$LEXBOR_DIR/css/at_rule
+  $ext_builddir/$LEXBOR_DIR/css/property
   $ext_builddir/$LEXBOR_DIR/css/selectors
   $ext_builddir/$LEXBOR_DIR/css/syntax/tokenizer
   $ext_builddir/$LEXBOR_DIR/css/tokenizer
diff --git a/ext/lexbor/config.w32 b/ext/lexbor/config.w32
index bd1f3b383a7e..e75798e06187 100644
--- a/ext/lexbor/config.w32
+++ b/ext/lexbor/config.w32
@@ -8,11 +8,13 @@ ADD_SOURCES("ext/lexbor/lexbor/dom", "interface.c", "lexbor");
 ADD_SOURCES("ext/lexbor/lexbor/dom/interfaces", "attr.c cdata_section.c character_data.c comment.c document.c document_fragment.c document_type.c element.c node.c processing_instruction.c shadow_root.c text.c", "lexbor");
 ADD_SOURCES("ext/lexbor/lexbor/html/tokenizer", "error.c state_comment.c state_doctype.c state_rawtext.c state_rcdata.c state_script.c state.c", "lexbor");
 ADD_SOURCES("ext/lexbor/lexbor/html/tree", "active_formatting.c open_elements.c error.c","lexbor");
-ADD_SOURCES("ext/lexbor/lexbor/html/tree/insertion_mode", "after_after_body.c after_after_frameset.c after_body.c after_frameset.c after_head.c before_head.c before_html.c foreign_content.c in_body.c in_caption.c in_cell.c in_column_group.c in_frameset.c in_head.c in_head_noscript.c initial.c in_row.c in_select.c in_select_in_table.c in_table_body.c in_table.c in_table_text.c in_template.c text.c","lexbor");
-ADD_SOURCES("ext/lexbor/lexbor/html", "encoding.c interface.c parser.c token.c token_attr.c tokenizer.c tree.c","lexbor");
+ADD_SOURCES("ext/lexbor/lexbor/html/tree/insertion_mode", "after_after_body.c after_after_frameset.c after_body.c after_frameset.c after_head.c before_head.c before_html.c foreign_content.c in_body.c in_caption.c in_cell.c in_column_group.c in_frameset.c in_head.c in_head_noscript.c initial.c in_row.c in_table_body.c in_table.c in_table_text.c in_template.c text.c","lexbor");
+ADD_SOURCES("ext/lexbor/lexbor/html", "encoding.c interface.c parser.c tag.c token.c token_attr.c tokenizer.c tree.c","lexbor");
 ADD_SOURCES("ext/lexbor/lexbor/encoding", "decode.c encode.c encoding.c multi.c range.c res.c single.c","lexbor");
-ADD_SOURCES("ext/lexbor/lexbor/html/interfaces", "anchor_element.c area_element.c audio_element.c base_element.c body_element.c br_element.c button_element.c canvas_element.c data_element.c data_list_element.c details_element.c dialog_element.c directory_element.c div_element.c d_list_element.c document.c element.c embed_element.c field_set_element.c font_element.c form_element.c frame_element.c frame_set_element.c head_element.c heading_element.c hr_element.c html_element.c iframe_element.c image_element.c input_element.c label_element.c legend_element.c li_element.c link_element.c map_element.c marquee_element.c media_element.c menu_element.c meta_element.c meter_element.c mod_element.c object_element.c o_list_element.c opt_group_element.c option_element.c output_element.c paragraph_element.c param_element.c picture_element.c pre_element.c progress_element.c quote_element.c script_element.c select_element.c slot_element.c source_element.c span_element.c style_element.c table_caption_element.c table_cell_element.c table_col_element.c table_element.c table_row_element.c table_section_element.c template_element.c text_area_element.c time_element.c title_element.c track_element.c u_list_element.c unknown_element.c video_element.c window.c","lexbor");
-ADD_SOURCES("ext/lexbor/lexbor/css", "state.c log.c parser.c css.c","lexbor");
+ADD_SOURCES("ext/lexbor/lexbor/html/interfaces", "anchor_element.c area_element.c audio_element.c base_element.c body_element.c br_element.c button_element.c canvas_element.c data_element.c data_list_element.c details_element.c dialog_element.c directory_element.c div_element.c d_list_element.c document.c element.c embed_element.c field_set_element.c font_element.c form_element.c frame_element.c frame_set_element.c head_element.c heading_element.c hr_element.c html_element.c iframe_element.c image_element.c input_element.c label_element.c legend_element.c li_element.c link_element.c map_element.c marquee_element.c media_element.c menu_element.c meta_element.c meter_element.c mod_element.c object_element.c o_list_element.c opt_group_element.c option_element.c output_element.c paragraph_element.c param_element.c picture_element.c pre_element.c progress_element.c quote_element.c script_element.c search_element.c select_element.c selectedcontent_element.c slot_element.c source_element.c span_element.c style_element.c table_caption_element.c table_cell_element.c table_col_element.c table_element.c table_row_element.c table_section_element.c template_element.c text_area_element.c time_element.c title_element.c track_element.c u_list_element.c unknown_element.c video_element.c window.c", "lexbor");
+ADD_SOURCES("ext/lexbor/lexbor/css", "at_rule.c blank.c css.c declaration.c log.c parser.c property.c rule.c state.c stylesheet.c unit.c value.c", "lexbor");
+ADD_SOURCES("ext/lexbor/lexbor/css/at_rule", "state.c", "lexbor");
+ADD_SOURCES("ext/lexbor/lexbor/css/property", "state.c", "lexbor");
 ADD_SOURCES("ext/lexbor/lexbor/css/selectors", "state.c selectors.c selector.c pseudo_state.c pseudo.c","lexbor");
 ADD_SOURCES("ext/lexbor/lexbor/css/syntax", "state.c parser.c syntax.c anb.c tokenizer.c token.c","lexbor");
 ADD_SOURCES("ext/lexbor/lexbor/css/syntax/tokenizer", "error.c","lexbor");
@@ -24,6 +26,5 @@ ADD_SOURCES("ext/lexbor/lexbor/url", "url.c","lexbor");
 ADD_FLAG("CFLAGS_LEXBOR", "/D LEXBOR_BUILDING /utf-8");
 
 AC_DEFINE("HAVE_LEXBOR", 1, "Define to 1 if the PHP extension 'lexbor' is available.");
-AC_DEFINE("LEXBOR_VERSION", "2.5.0", "Define the main Lexbor version")
 
 PHP_INSTALL_HEADERS("ext/lexbor", "php_lexbor.h lexbor/");
diff --git a/ext/lexbor/lexbor/core/base.h b/ext/lexbor/lexbor/core/base.h
index d3a04880f220..e488dcf7334b 100644
--- a/ext/lexbor/lexbor/core/base.h
+++ b/ext/lexbor/lexbor/core/base.h
@@ -27,7 +27,7 @@ extern "C" {
 #include "lexbor/core/lexbor.h"
 
 #define LEXBOR_VERSION_MAJOR 2
-#define LEXBOR_VERSION_MINOR 0
+#define LEXBOR_VERSION_MINOR 7
 #define LEXBOR_VERSION_PATCH 0
 
 #define LEXBOR_VERSION_STRING LEXBOR_STRINGIZE(LEXBOR_VERSION_MAJOR) "."       \
@@ -39,6 +39,10 @@ extern "C" {
 #define lexbor_max(val1, val2) ((val1) > (val2) ? (val1) : (val2))
 #define lexbor_min(val1, val2) ((val1) < (val2) ? (val1) : (val2))
 
+#define LEXBOR_STR_RES_MAP_CHAR_OTHER      0x00
+#define LEXBOR_STR_RES_MAP_CHAR_A_Z_a_z    0x01
+#define LEXBOR_STR_RES_MAP_CHAR_WHITESPACE 0x02
+#define LEXBOR_STR_RES_SLIP                0xFF
 
 /*
  * Very important!!!
diff --git a/ext/lexbor/lexbor/core/def.h b/ext/lexbor/lexbor/core/def.h
index 5a48f59e994d..c8b94400a2df 100644
--- a/ext/lexbor/lexbor/core/def.h
+++ b/ext/lexbor/lexbor/core/def.h
@@ -54,4 +54,6 @@
 
 #define LXB_EXTERN extern LXB_API
 
+#define lxb_size(_size) ((size_t) (_size))
+
 #endif /* LEXBOR_DEF_H */
diff --git a/ext/lexbor/lexbor/core/diyfp.c b/ext/lexbor/lexbor/core/diyfp.c
index 62020bbc645e..7bdbcbbcb08f 100644
--- a/ext/lexbor/lexbor/core/diyfp.c
+++ b/ext/lexbor/lexbor/core/diyfp.c
@@ -1,16 +1,44 @@
 /*
- * Copyright (C) Alexander Borisov
+ * Copyright (C) 2015-2019 NGINX, Inc.
+ * Copyright (C) 2019-2025 F5, Inc.
+ * Copyright (C) 2015-2021 Igor Sysoev
+ * Copyright (C) 2017-2025 Dmitry Volyntsev
+ * Copyright (C) 2019-2022 Alexander Borisov
+ * Copyright (C) 2022-2025 Vadim Zhestikov
+ * All rights reserved.
  *
- * Based on nxt_diyfp.c from NGINX NJS project
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
  *
- * Copyright (C) Dmitry Volyntsev
- * Copyright (C) NGINX, Inc.
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+/*
+ * Copyright (C) Alexander Borisov
  *
+ * Based on nxt_diyfp.h from NGINX NJS project
  * An internal diy_fp implementation.
  * For details, see Loitsch, Florian. "Printing floating-point numbers quickly
  * and accurately with integers." ACM Sigplan Notices 45.6 (2010): 233-243.
  */
 
+
 #include "lexbor/core/diyfp.h"
 
 
diff --git a/ext/lexbor/lexbor/core/diyfp.h b/ext/lexbor/lexbor/core/diyfp.h
index 47fedb9da997..86c5336f2e03 100644
--- a/ext/lexbor/lexbor/core/diyfp.h
+++ b/ext/lexbor/lexbor/core/diyfp.h
@@ -1,11 +1,38 @@
 /*
- * Copyright (C) Alexander Borisov
+ * Copyright (C) 2015-2019 NGINX, Inc.
+ * Copyright (C) 2019-2025 F5, Inc.
+ * Copyright (C) 2015-2021 Igor Sysoev
+ * Copyright (C) 2017-2025 Dmitry Volyntsev
+ * Copyright (C) 2019-2022 Alexander Borisov
+ * Copyright (C) 2022-2025 Vadim Zhestikov
+ * All rights reserved.
  *
- * Based on nxt_diyfp.h from NGINX NJS project
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
  *
- * Copyright (C) Dmitry Volyntsev
- * Copyright (C) NGINX, Inc.
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+/*
+ * Copyright (C) Alexander Borisov
  *
+ * Based on nxt_diyfp.h from NGINX NJS project
  * An internal diy_fp implementation.
  * For details, see Loitsch, Florian. "Printing floating-point numbers quickly
  * and accurately with integers." ACM Sigplan Notices 45.6 (2010): 233-243.
diff --git a/ext/lexbor/lexbor/core/dtoa.c b/ext/lexbor/lexbor/core/dtoa.c
index b1a4ee03258d..7da7ce013227 100644
--- a/ext/lexbor/lexbor/core/dtoa.c
+++ b/ext/lexbor/lexbor/core/dtoa.c
@@ -1,39 +1,36 @@
 /*
- * Copyright (C) Alexander Borisov
- *
- * Based on nxt_dtoa.c from NGINX NJS project
- *
- * Copyright (C) Dmitry Volyntsev
- * Copyright (C) NGINX, Inc.
- *
- * Grisu2 algorithm implementation for printing floating-point numbers based
- * upon the work of Milo Yip and Doug Currie.
- *
- * For algorithm information, see Loitsch, Florian. "Printing
- * floating-point numbers quickly and accurately with integers." ACM Sigplan
- * Notices 45.6 (2010): 233-243.
- *
- * Copyright (C) 2015 Doug Currie
- * based on dtoa_milo.h
- * Copyright (C) 2014 Milo Yip
+ * Copyright (C) 2015-2019 NGINX, Inc.
+ * Copyright (C) 2019-2025 F5, Inc.
+ * Copyright (C) 2015-2021 Igor Sysoev
+ * Copyright (C) 2017-2025 Dmitry Volyntsev
+ * Copyright (C) 2019-2022 Alexander Borisov
+ * Copyright (C) 2022-2025 Vadim Zhestikov
+ * All rights reserved.
  *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
  *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+/*
+ * Copyright (C) Alexander Borisov
  */
 
 #include "lexbor/core/str.h"
diff --git a/ext/lexbor/lexbor/core/dtoa.h b/ext/lexbor/lexbor/core/dtoa.h
index c60c28803b7b..2d569cfff973 100644
--- a/ext/lexbor/lexbor/core/dtoa.h
+++ b/ext/lexbor/lexbor/core/dtoa.h
@@ -1,10 +1,36 @@
 /*
- * Copyright (C) Alexander Borisov
+ * Copyright (C) 2015-2019 NGINX, Inc.
+ * Copyright (C) 2019-2025 F5, Inc.
+ * Copyright (C) 2015-2021 Igor Sysoev
+ * Copyright (C) 2017-2025 Dmitry Volyntsev
+ * Copyright (C) 2019-2022 Alexander Borisov
+ * Copyright (C) 2022-2025 Vadim Zhestikov
+ * All rights reserved.
  *
- * Based on nxt_dtoa.h from NGINX NJS project
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
  *
- * Copyright (C) Dmitry Volyntsev
- * Copyright (C) Nginx, Inc.
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+/*
+ * Copyright (C) Alexander Borisov
  */
 
 #ifndef LEXBOR_DTOA_H
diff --git a/ext/lexbor/lexbor/core/hash.c b/ext/lexbor/lexbor/core/hash.c
index 2fdd4caa9d98..c16466effd35 100644
--- a/ext/lexbor/lexbor/core/hash.c
+++ b/ext/lexbor/lexbor/core/hash.c
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2019 Alexander Borisov
+ * Copyright (C) 2019-2026 Alexander Borisov
  *
  * Author: Alexander Borisov 
  */
@@ -10,9 +10,10 @@
 
 #include "lexbor/core/str.h"
 
-#define LEXBOR_STR_RES_MAP_LOWERCASE
-#define LEXBOR_STR_RES_MAP_UPPERCASE
-#include "lexbor/core/str_res.h"
+#ifndef LEXBOR_DISABLE_INTERNAL_EXTERN
+    LXB_EXTERN const lxb_char_t lexbor_str_res_map_lowercase[256];
+    LXB_EXTERN const lxb_char_t lexbor_str_res_map_uppercase[256];
+#endif
 
 
 /* Insert variable. */
diff --git a/ext/lexbor/lexbor/core/in.c b/ext/lexbor/lexbor/core/in.c
index 951e585cbd39..363256b732a4 100644
--- a/ext/lexbor/lexbor/core/in.c
+++ b/ext/lexbor/lexbor/core/in.c
@@ -1,11 +1,10 @@
 /*
- * Copyright (C) 2018 Alexander Borisov
+ * Copyright (C) 2018-2026 Alexander Borisov
  *
  * Author: Alexander Borisov 
  */
 
 #include "lexbor/core/in.h"
-#include "lexbor/core/str_res.h"
 
 
 lexbor_in_t *
diff --git a/ext/lexbor/lexbor/core/shs.c b/ext/lexbor/lexbor/core/shs.c
index 679143bf45cc..c2753457d74a 100644
--- a/ext/lexbor/lexbor/core/shs.c
+++ b/ext/lexbor/lexbor/core/shs.c
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2018-2019 Alexander Borisov
+ * Copyright (C) 2018-2026 Alexander Borisov
  *
  * Author: Alexander Borisov 
  */
@@ -7,10 +7,10 @@
 #include "lexbor/core/shs.h"
 #include "lexbor/core/str.h"
 
-#define LEXBOR_STR_RES_MAP_LOWERCASE
-#define LEXBOR_STR_RES_MAP_UPPERCASE
-#include "lexbor/core/str_res.h"
-
+#ifndef LEXBOR_DISABLE_INTERNAL_EXTERN
+    LXB_EXTERN const lxb_char_t lexbor_str_res_map_lowercase[256];
+    LXB_EXTERN const lxb_char_t lexbor_str_res_map_uppercase[256];
+#endif
 
 #define lexbor_shs_make_id_m(key, size, table_size)                            \
     (((((key[0] * key[size - 1]) * key[0]) + size) % table_size) + 0x01)
diff --git a/ext/lexbor/lexbor/core/str.c b/ext/lexbor/lexbor/core/str.c
index bf8fc547d88d..3d164ebf82dd 100644
--- a/ext/lexbor/lexbor/core/str.c
+++ b/ext/lexbor/lexbor/core/str.c
@@ -1,14 +1,10 @@
 /*
- * Copyright (C) 2018 Alexander Borisov
+ * Copyright (C) 2018-2026 Alexander Borisov
  *
  * Author: Alexander Borisov 
  */
 
 #include "lexbor/core/str.h"
-
-#define LEXBOR_STR_RES_ANSI_REPLACEMENT_CHARACTER
-#define LEXBOR_STR_RES_MAP_LOWERCASE
-#define LEXBOR_STR_RES_MAP_UPPERCASE
 #include "lexbor/core/str_res.h"
 
 
@@ -381,6 +377,30 @@ lexbor_str_whitespace_from_end(lexbor_str_t *target)
     return 0;
 }
 
+lxb_char_t *
+lexbor_str_copy_to(lexbor_str_t *str, const lxb_char_t *buff, size_t length)
+{
+    lxb_char_t *data_begin;
+
+    data_begin = &str->data[str->length];
+    memcpy(data_begin, buff, sizeof(lxb_char_t) * length);
+
+    str->length += length;
+
+    return data_begin;
+}
+
+lxb_char_t *
+lexbor_str_copy_to_with_null(lexbor_str_t *str,
+                             const lxb_char_t *buff, size_t length)
+{
+    lxb_char_t *data_begin = lexbor_str_copy_to(str, buff, length);
+
+    str->data[str->length] = '\0';
+
+    return data_begin;
+}
+
 /*
  * Data utils
  * TODO: All functions need optimization.
diff --git a/ext/lexbor/lexbor/core/str.h b/ext/lexbor/lexbor/core/str.h
index 3bee14537387..8e5f3806fe93 100644
--- a/ext/lexbor/lexbor/core/str.h
+++ b/ext/lexbor/lexbor/core/str.h
@@ -21,7 +21,6 @@ extern "C" {
 #define lexbor_str_len(str) lexbor_str_get(str, length)
 #define lexbor_str(p) {.data = (lxb_char_t *) (p), sizeof(p) - 1}
 
-
 #define lexbor_str_check_size_arg_m(str, size, mraw, plus_len, return_fail)    \
     do {                                                                       \
         void *tmp;                                                             \
@@ -117,6 +116,12 @@ lexbor_str_whitespace_from_begin(lexbor_str_t *target);
 LXB_API size_t
 lexbor_str_whitespace_from_end(lexbor_str_t *target);
 
+LXB_API lxb_char_t *
+lexbor_str_copy_to(lexbor_str_t *str, const lxb_char_t *buff, size_t length);
+
+LXB_API lxb_char_t *
+lexbor_str_copy_to_with_null(lexbor_str_t *str,
+                             const lxb_char_t *buff, size_t length);
 
 /* Data utils */
 /*
diff --git a/ext/lexbor/lexbor/core/str_res.h b/ext/lexbor/lexbor/core/str_res.h
index cebbda8aa534..be34a0eeb42c 100644
--- a/ext/lexbor/lexbor/core/str_res.h
+++ b/ext/lexbor/lexbor/core/str_res.h
@@ -1,32 +1,16 @@
 /*
- * Copyright (C) 2018 Alexander Borisov
+ * Copyright (C) 2018-2026 Alexander Borisov
  *
  * Author: Alexander Borisov 
  */
 
-#ifndef LEXBOR_STR_RES_H
-#define LEXBOR_STR_RES_H
 
-#define LEXBOR_STR_RES_MAP_CHAR_OTHER      '\00'
-#define LEXBOR_STR_RES_MAP_CHAR_A_Z_a_z    '\01'
-#define LEXBOR_STR_RES_MAP_CHAR_WHITESPACE '\02'
+LXB_API const lxb_char_t
+lexbor_str_res_ansi_replacement_character[4] = "\xEF\xBF\xBD";
 
-#define LEXBOR_STR_RES_SLIP 0xFF
-
-#endif /* LEXBOR_STR_RES_H */
-
-#ifdef LEXBOR_STR_RES_ANSI_REPLACEMENT_CHARACTER
-#ifndef LEXBOR_STR_RES_ANSI_REPLACEMENT_CHARACTER_ENABLED
-#define LEXBOR_STR_RES_ANSI_REPLACEMENT_CHARACTER_ENABLED
-static const lxb_char_t
-lexbor_str_res_ansi_replacement_character[] = "\xEF\xBF\xBD";
-#endif /* LEXBOR_STR_RES_ANSI_REPLACEMENT_CHARACTER_ENABLED */
-#endif /* LEXBOR_STR_RES_ANSI_REPLACEMENT_CHARACTER */
-
-#ifdef LEXBOR_STR_RES_MAP_NUM
-#ifndef LEXBOR_STR_RES_MAP_NUM_ENABLED
-#define LEXBOR_STR_RES_MAP_NUM_ENABLED
-static const lxb_char_t lexbor_str_res_map_num[] = {
+LXB_API const lxb_char_t
+lexbor_str_res_map_num[256] =
+{
     0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
     0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
     0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
@@ -57,14 +41,10 @@ static const lxb_char_t lexbor_str_res_map_num[] = {
     0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
     0xff, 0xff, 0xff, 0xff
 };
-#endif /* LEXBOR_STR_RES_MAP_NUM_ENABLED */
-#endif /* LEXBOR_STR_RES_MAP_NUM */
 
-
-#ifdef LEXBOR_STR_RES_MAP_HEX
-#ifndef LEXBOR_STR_RES_MAP_HEX_ENABLED
-#define LEXBOR_STR_RES_MAP_HEX_ENABLED
-static const lxb_char_t lexbor_str_res_map_hex[] = {
+LXB_API const lxb_char_t
+lexbor_str_res_map_hex[256] =
+{
     0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
     0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
     0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
@@ -95,14 +75,10 @@ static const lxb_char_t lexbor_str_res_map_hex[] = {
     0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
     0xff, 0xff, 0xff, 0xff
 };
-#endif /* LEXBOR_STR_RES_MAP_HEX_ENABLED */
-#endif /* LEXBOR_STR_RES_MAP_HEX */
-
 
-#ifdef LEXBOR_STR_RES_MAP_LOWERCASE
-#ifndef LEXBOR_STR_RES_MAP_LOWERCASE_ENABLED
-#define LEXBOR_STR_RES_MAP_LOWERCASE_ENABLED
-static const lxb_char_t lexbor_str_res_map_lowercase[] = {
+LXB_API const lxb_char_t
+lexbor_str_res_map_lowercase[256] =
+{
     0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08,
     0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11,
     0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a,
@@ -133,14 +109,10 @@ static const lxb_char_t lexbor_str_res_map_lowercase[] = {
     0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 0xf8, 0xf9, 0xfa, 0xfb,
     0xfc, 0xfd, 0xfe, 0xff
 };
-#endif /* LEXBOR_STR_RES_MAP_LOWERCASE_ENABLED */
-#endif /* LEXBOR_STR_RES_MAP_LOWERCASE */
-
 
-#ifdef LEXBOR_STR_RES_MAP_UPPERCASE
-#ifndef LEXBOR_STR_RES_MAP_UPPERCASE_ENABLED
-#define LEXBOR_STR_RES_MAP_UPPERCASE_ENABLED
-static const lxb_char_t lexbor_str_res_map_uppercase[] = {
+LXB_API const lxb_char_t
+lexbor_str_res_map_uppercase[256] =
+{
     0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08,
     0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11,
     0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a,
@@ -171,14 +143,10 @@ static const lxb_char_t lexbor_str_res_map_uppercase[] = {
     0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 0xf8, 0xf9, 0xfa, 0xfb,
     0xfc, 0xfd, 0xfe, 0xff
 };
-#endif /* LEXBOR_STR_RES_MAP_UPPERCASE_ENABLED */
-#endif /* LEXBOR_STR_RES_MAP_UPPERCASE */
 
-
-#ifdef LEXBOR_STR_RES_REPLACEMENT_CHARACTER
-#ifndef LEXBOR_STR_RES_REPLACEMENT_CHARACTER_ENABLED
-#define LEXBOR_STR_RES_REPLACEMENT_CHARACTER_ENABLED
-static const size_t lexbor_str_res_replacement_character[] = {
+LXB_API const size_t
+lexbor_str_res_replacement_character[160] =
+{
     65533, 1, 2, 3, 4, 5, 6, 7, 8,
     9, 10, 11, 12, 13, 14, 15, 16, 17,
     18, 19, 20, 21, 22, 23, 24, 25, 26,
@@ -198,14 +166,10 @@ static const size_t lexbor_str_res_replacement_character[] = {
     144, 8216, 8217, 8220, 8221, 8226, 8211, 8212, 732,
     8482, 353, 8250, 339, 157, 382, 376
 };
-#endif /* LEXBOR_STR_RES_REPLACEMENT_CHARACTER_ENABLED */
-#endif /* LEXBOR_STR_RES_REPLACEMENT_CHARACTER */
-
 
-#ifdef LEXBOR_STR_RES_ALPHANUMERIC_CHARACTER
-#ifndef LEXBOR_STR_RES_ALPHANUMERIC_CHARACTER_ENABLED
-#define LEXBOR_STR_RES_ALPHANUMERIC_CHARACTER_ENABLED
-static const size_t lexbor_str_res_alphanumeric_character[] = {
+LXB_API const size_t
+lexbor_str_res_alphanumeric_character[256] =
+{
     0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
     0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
     0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
@@ -236,14 +200,10 @@ static const size_t lexbor_str_res_alphanumeric_character[] = {
     0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
     0xff, 0xff, 0xff, 0xff
 };
-#endif /* LEXBOR_STR_RES_ALPHANUMERIC_CHARACTER_ENABLED */
-#endif /* LEXBOR_STR_RES_ALPHANUMERIC_CHARACTER */
-
 
-#ifdef LEXBOR_STR_RES_ALPHA_CHARACTER
-#ifndef LEXBOR_STR_RES_ALPHA_CHARACTER_ENABLED
-#define LEXBOR_STR_RES_ALPHA_CHARACTER_ENABLED
-static const size_t lexbor_str_res_alpha_character[] = {
+LXB_API const size_t
+lexbor_str_res_alpha_character[256] =
+{
     0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
     0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
     0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
@@ -274,14 +234,10 @@ static const size_t lexbor_str_res_alpha_character[] = {
     0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
     0xff, 0xff, 0xff, 0xff
 };
-#endif /* LEXBOR_STR_RES_ALPHA_CHARACTER_ENABLED */
-#endif /* LEXBOR_STR_RES_ALPHA_CHARACTER */
 
-
-#ifdef LEXBOR_TOKENIZER_CHARS_MAP
-#ifndef LEXBOR_TOKENIZER_CHARS_MAP_ENABLED
-#define LEXBOR_TOKENIZER_CHARS_MAP_ENABLED
-static const unsigned char lexbor_tokenizer_chars_map[] = {
+LXB_API const unsigned char
+lexbor_tokenizer_chars_map[256] =
+{
     0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
     0x02, 0x02, 0xff, 0x02, 0x02, 0xff, 0xff, 0xff, 0xff,
     0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
@@ -312,35 +268,24 @@ static const unsigned char lexbor_tokenizer_chars_map[] = {
     0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
     0xff, 0xff, 0xff, 0xff
 };
-#endif /* LEXBOR_TOKENIZER_CHARS_MAP_ENABLED */
-#endif /* LEXBOR_TOKENIZER_CHARS_MAP */
-
 
-#ifdef LEXBOR_STR_RES_MAP_HEX_TO_CHAR
-#ifndef LEXBOR_STR_RES_MAP_HEX_TO_CHAR_ENABLED
-#define LEXBOR_STR_RES_MAP_HEX_TO_CHAR_ENABLED
-static const lxb_char_t lexbor_str_res_map_hex_to_char[] = {
+LXB_API const lxb_char_t
+lexbor_str_res_map_hex_to_char[17] =
+{
     0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38,
     0x39, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x00
 };
-#endif /* LEXBOR_STR_RES_MAP_HEX_TO_CHAR_ENABLED */
-#endif /* LEXBOR_STR_RES_MAP_HEX_TO_CHAR */
 
-#ifdef LEXBOR_STR_RES_MAP_HEX_TO_CHAR_LOWERCASE
-#ifndef LEXBOR_STR_RES_MAP_HEX_TO_CHAR_LOWERCASE_ENABLED
-#define LEXBOR_STR_RES_MAP_HEX_TO_CHAR_LOWERCASE_ENABLED
-static const lxb_char_t lexbor_str_res_map_hex_to_char_lowercase[] = {
+LXB_API const lxb_char_t
+lexbor_str_res_map_hex_to_char_lowercase[17] =
+{
     0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38,
     0x39, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x00
 };
-#endif /* LEXBOR_STR_RES_MAP_HEX_TO_CHAR_LOWERCASE_ENABLED */
-#endif /* LEXBOR_STR_RES_MAP_HEX_TO_CHAR_LOWERCASE */
-
 
-#ifdef LEXBOR_STR_RES_CHAR_TO_TWO_HEX_VALUE
-#ifndef LEXBOR_STR_RES_CHAR_TO_TWO_HEX_VALUE_ENABLED
-#define LEXBOR_STR_RES_CHAR_TO_TWO_HEX_VALUE_ENABLED
-static const char * lexbor_str_res_char_to_two_hex_value[257] = {
+LXB_API const char *
+lexbor_str_res_char_to_two_hex_value[257] =
+{
     "00", "01", "02", "03", "04", "05", "06", "07",
     "08", "09", "0A", "0B", "0C", "0D", "0E", "0F",
     "10", "11", "12", "13", "14", "15", "16", "17",
@@ -375,13 +320,10 @@ static const char * lexbor_str_res_char_to_two_hex_value[257] = {
     "F8", "F9", "FA", "FB", "FC", "FD", "FE", "FF",
     NULL
 };
-#endif /* LEXBOR_STR_RES_CHAR_TO_TWO_HEX_VALUE_ENABLED */
-#endif /* LEXBOR_STR_RES_CHAR_TO_TWO_HEX_VALUE */
 
-#ifdef LEXBOR_STR_RES_CHAR_TO_TWO_HEX_VALUE_LOWERCASE
-#ifndef LEXBOR_STR_RES_CHAR_TO_TWO_HEX_VALUE_LOWERCASE_ENABLED
-#define LEXBOR_STR_RES_CHAR_TO_TWO_HEX_VALUE_LOWERCASE_ENABLED
-static const char * lexbor_str_res_char_to_two_hex_value_lowercase[257] = {
+LXB_API const char *
+lexbor_str_res_char_to_two_hex_value_lowercase[257] =
+{
     "00", "01", "02", "03", "04", "05", "06", "07",
     "08", "09", "0a", "0b", "0c", "0d", "0e", "0f",
     "10", "11", "12", "13", "14", "15", "16", "17",
@@ -416,5 +358,3 @@ static const char * lexbor_str_res_char_to_two_hex_value_lowercase[257] = {
     "f8", "f9", "fa", "fb", "fc", "fd", "fe", "ff",
     NULL
 };
-#endif /* LEXBOR_STR_RES_CHAR_TO_TWO_HEX_VALUE_LOWERCASE_ENABLED */
-#endif /* LEXBOR_STR_RES_CHAR_TO_TWO_HEX_VALUE_LOWERCASE */
diff --git a/ext/lexbor/lexbor/core/strtod.c b/ext/lexbor/lexbor/core/strtod.c
index 6389fc3156fc..2dad45c109b5 100644
--- a/ext/lexbor/lexbor/core/strtod.c
+++ b/ext/lexbor/lexbor/core/strtod.c
@@ -1,14 +1,36 @@
 /*
- * Copyright (C) Alexander Borisov
- *
- * Based on nxt_strtod.c from NGINX NJS project
+ * Copyright (C) 2015-2019 NGINX, Inc.
+ * Copyright (C) 2019-2025 F5, Inc.
+ * Copyright (C) 2015-2021 Igor Sysoev
+ * Copyright (C) 2017-2025 Dmitry Volyntsev
+ * Copyright (C) 2019-2022 Alexander Borisov
+ * Copyright (C) 2022-2025 Vadim Zhestikov
+ * All rights reserved.
  *
- * An internal strtod() implementation based upon V8 src/strtod.cc
- * without bignum support.
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
  *
- * Copyright 2012 the V8 project authors. All rights reserved.
- * Use of this source code is governed by a BSD-style license
- * that can be found in the LICENSE file.
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+/*
+ * Copyright (C) Alexander Borisov
  */
 
 #include 
diff --git a/ext/lexbor/lexbor/core/strtod.h b/ext/lexbor/lexbor/core/strtod.h
index 7f15706bc946..0f834bab4868 100644
--- a/ext/lexbor/lexbor/core/strtod.h
+++ b/ext/lexbor/lexbor/core/strtod.h
@@ -1,10 +1,36 @@
 /*
- * Copyright (C) Alexander Borisov
+ * Copyright (C) 2015-2019 NGINX, Inc.
+ * Copyright (C) 2019-2025 F5, Inc.
+ * Copyright (C) 2015-2021 Igor Sysoev
+ * Copyright (C) 2017-2025 Dmitry Volyntsev
+ * Copyright (C) 2019-2022 Alexander Borisov
+ * Copyright (C) 2022-2025 Vadim Zhestikov
+ * All rights reserved.
  *
- * Based on nxt_strtod.h from NGINX NJS project
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
  *
- * Copyright (C) Dmitry Volyntsev
- * Copyright (C) Nginx, Inc.
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+/*
+ * Copyright (C) Alexander Borisov
  */
 
 #ifndef LEXBOR_STRTOD_H
diff --git a/ext/lexbor/lexbor/css/at_rule.c b/ext/lexbor/lexbor/css/at_rule.c
new file mode 100644
index 000000000000..6c5435d22e06
--- /dev/null
+++ b/ext/lexbor/lexbor/css/at_rule.c
@@ -0,0 +1,449 @@
+/*
+ * Copyright (C) 2021-2026 Alexander Borisov
+ *
+ * Author: Alexander Borisov 
+ */
+
+#include "lexbor/css/at_rule.h"
+#include "lexbor/css/css.h"
+#include "lexbor/css/parser.h"
+#include "lexbor/css/stylesheet.h"
+#include "lexbor/css/at_rule/state.h"
+#include "lexbor/css/at_rule/types.h"
+#include "lexbor/css/at_rule/res.h"
+#include "lexbor/core/serialize.h"
+
+
+const lxb_css_entry_at_rule_data_t *
+lxb_css_at_rule_by_name(const lxb_char_t *name, size_t length)
+{
+    const lexbor_shs_entry_t *entry;
+
+    entry = lexbor_shs_entry_get_lower_static(lxb_css_at_rule_shs,
+                                              name, length);
+    if (entry == NULL) {
+        return NULL;
+    }
+
+    return entry->value;
+}
+
+const lxb_css_entry_at_rule_data_t *
+lxb_css_at_rule_by_id(uintptr_t id)
+{
+    return &lxb_css_at_rule_data[id];
+}
+
+lxb_css_rule_at_t *
+lxb_css_at_rule_create(lxb_css_parser_t *parser,
+                       const lxb_char_t *name, size_t length,
+                       const lxb_css_entry_at_rule_data_t **out_entry)
+{
+    void *prop;
+    const lxb_css_entry_at_rule_data_t *entry;
+    lxb_css_at_rule__custom_t *custom;
+    lxb_css_rule_at_t *at;
+
+    at = lxb_css_rule_at_create(parser->memory);
+    if (at == NULL) {
+        return NULL;
+    }
+
+    entry = lxb_css_at_rule_by_name(name, length);
+    if (entry == NULL) {
+        entry = lxb_css_at_rule_by_id(LXB_CSS_AT_RULE__CUSTOM);
+
+        prop = entry->create(parser->memory);
+        if (prop == NULL) {
+            goto failed;
+        }
+
+        custom = prop;
+
+        (void) lexbor_str_init(&custom->name, parser->memory->mraw, length);
+        if (custom->name.data == NULL) {
+            goto failed;
+        }
+
+        memcpy(custom->name.data, name, length);
+
+        custom->name.length = length;
+        custom->name.data[custom->name.length] = 0x00;
+    }
+    else {
+        prop = entry->create(parser->memory);
+        if (prop == NULL) {
+            goto failed;
+        }
+    }
+
+    at->type = entry->unique;
+    at->u.user = prop;
+
+    if (out_entry != NULL) {
+        *out_entry = entry;
+    }
+
+    return at;
+
+failed:
+
+    if (prop != NULL) {
+        (void) entry->destroy(parser->memory, prop, true);
+    }
+
+    if (at != NULL) {
+        (void) lxb_css_rule_at_destroy(at, true);
+    }
+
+    if (out_entry != NULL) {
+        *out_entry = NULL;
+    }
+
+    return NULL;
+}
+
+void *
+lxb_css_at_rule_destroy(lxb_css_memory_t *memory, void *value,
+                        lxb_css_at_rule_type_t type, bool self_destroy)
+{
+    const lxb_css_entry_at_rule_data_t *data;
+
+    data = lxb_css_at_rule_by_id(type);
+    if (data == NULL) {
+        return value;
+    }
+
+    return data->destroy(memory, value, self_destroy);
+}
+
+lxb_status_t
+lxb_css_at_rule_convert_to_undef(lxb_css_parser_t *parser,
+                                 lxb_css_rule_at_t *at)
+{
+    lxb_css_at_rule__undef_t *undef;
+
+    undef = lxb_css_at_rule__undef_create(parser->memory);
+    if (undef == NULL) {
+        return LXB_STATUS_ERROR_MEMORY_ALLOCATION;
+    }
+
+    undef->type = at->type;
+
+    (void) lxb_css_at_rule_destroy(parser->memory, at, undef->type, false);
+
+    at->type = LXB_CSS_AT_RULE__UNDEF;
+    at->u.undef = undef;
+
+    return lxb_css_make_data(parser, &at->u.undef->prelude,
+                             at->prelude_begin, at->prelude_end);
+}
+
+lxb_status_t
+lxb_css_at_rule_serialize(const void *style, lxb_css_at_rule_type_t type,
+                          lexbor_serialize_cb_f cb, void *ctx)
+{
+    const lxb_css_entry_at_rule_data_t *data;
+
+    data = lxb_css_at_rule_by_id(type);
+    if (data == NULL) {
+        return LXB_STATUS_ERROR_UNEXPECTED_DATA;
+    }
+
+    return data->serialize(style, cb, ctx);
+}
+
+lxb_status_t
+lxb_css_at_rule_serialize_str(const void *style, lxb_css_at_rule_type_t type,
+                              lexbor_mraw_t *mraw, lexbor_str_t *str)
+{
+    const lxb_css_entry_at_rule_data_t *data;
+
+    data = lxb_css_at_rule_by_id(type);
+    if (data == NULL) {
+        return LXB_STATUS_ERROR_UNEXPECTED_DATA;
+    }
+
+    return lxb_css_serialize_str_handler(style, str, mraw, data->serialize);
+}
+
+lxb_status_t
+lxb_css_at_rule_serialize_name(const void *style, lxb_css_at_rule_type_t type,
+                               lexbor_serialize_cb_f cb, void *ctx)
+{
+    const lxb_css_entry_at_rule_data_t *data;
+
+    if (type == LXB_CSS_AT_RULE__UNDEF) {
+        return lxb_css_at_rule__undef_serialize_name(style, cb, ctx);
+    }
+    else if (type == LXB_CSS_AT_RULE__CUSTOM) {
+        return lxb_css_at_rule__custom_serialize_name(style, cb, ctx);
+    }
+
+    data = lxb_css_at_rule_by_id(type);
+    if (data == NULL) {
+        return LXB_STATUS_ERROR_UNEXPECTED_DATA;
+    }
+
+    return cb(data->name, data->length, ctx);
+}
+
+lxb_status_t
+lxb_css_at_rule_serialize_name_str(const void *style, lxb_css_at_rule_type_t type,
+                                   lexbor_mraw_t *mraw, lexbor_str_t *str)
+{
+    const lxb_css_entry_at_rule_data_t *data;
+
+    if (type == LXB_CSS_AT_RULE__UNDEF) {
+        return lxb_css_serialize_str_handler(style, str, mraw,
+                                        lxb_css_at_rule__undef_serialize_name);
+    }
+    else if (type == LXB_CSS_AT_RULE__CUSTOM) {
+        return lxb_css_serialize_str_handler(style, str, mraw,
+                                       lxb_css_at_rule__custom_serialize_name);
+    }
+
+    data = lxb_css_at_rule_by_id(type);
+    if (data == NULL) {
+        return LXB_STATUS_ERROR_UNEXPECTED_DATA;
+    }
+
+    if (str->data == NULL) {
+        lexbor_str_init(str, mraw, data->length);
+        if (str->data == NULL) {
+            return LXB_STATUS_ERROR_MEMORY_ALLOCATION;
+        }
+    }
+
+    (void) lexbor_str_append(str, mraw, data->name, data->length);
+
+    return LXB_STATUS_OK;
+}
+
+/* _undef. */
+
+void *
+lxb_css_at_rule__undef_create(lxb_css_memory_t *memory)
+{
+    return lexbor_mraw_calloc(memory->mraw, sizeof(lxb_css_at_rule__undef_t));
+}
+
+void *
+lxb_css_at_rule__undef_destroy(lxb_css_memory_t *memory,
+                               void *style, bool self_destroy)
+{
+    if (style == NULL) {
+        return NULL;
+    }
+
+    if (self_destroy) {
+        return lexbor_mraw_free(memory->mraw, style);
+    }
+
+    return style;
+}
+
+lxb_status_t
+lxb_css_at_rule__undef_serialize(const void *at, lexbor_serialize_cb_f cb,
+                                 void *ctx)
+{
+    lxb_status_t status;
+    const lxb_css_entry_at_rule_data_t *data;
+    const lxb_css_at_rule__undef_t *undef = at;
+
+    static const lxb_char_t wc_str[] = " ";
+    static const lxb_char_t lb_str[] = "{";
+    static const lxb_char_t rb_str[] = "}";
+    static const lxb_char_t sm_str[] = ";";
+
+    data = lxb_css_at_rule_by_id(undef->type);
+    if (data == NULL) {
+        return LXB_STATUS_ERROR_UNEXPECTED_DATA;
+    }
+
+    if (undef->prelude.data != NULL) {
+        lexbor_serialize_write(cb, wc_str, (sizeof(wc_str) - 1), ctx, status);
+        lexbor_serialize_write(cb, undef->prelude.data, undef->prelude.length,
+                               ctx, status);
+    }
+
+    if (undef->block != NULL) {
+        lexbor_serialize_write(cb, lb_str, (sizeof(lb_str) - 1), ctx, status);
+
+        status = lxb_css_rule_list_serialize(undef->block, cb, ctx);
+        if (status != LXB_STATUS_OK) {
+            return status;
+        }
+
+        lexbor_serialize_write(cb, rb_str, (sizeof(rb_str) - 1), ctx, status);
+    }
+    else {
+        lexbor_serialize_write(cb, sm_str, (sizeof(sm_str) - 1), ctx, status);
+    }
+
+    return LXB_STATUS_OK;
+}
+
+lxb_status_t
+lxb_css_at_rule__undef_serialize_name(const void *at, lexbor_serialize_cb_f cb,
+                                      void *ctx)
+{
+    const lxb_css_entry_at_rule_data_t *data;
+    const lxb_css_at_rule__undef_t *undef = at;
+
+    data = lxb_css_at_rule_by_id(undef->type);
+    if (data == NULL) {
+        return LXB_STATUS_ERROR_UNEXPECTED_DATA;
+    }
+
+    return cb(data->name, data->length, ctx);
+}
+
+/* _custom. */
+
+void *
+lxb_css_at_rule__custom_create(lxb_css_memory_t *memory)
+{
+    return lexbor_mraw_calloc(memory->mraw, sizeof(lxb_css_at_rule__custom_t));
+}
+
+void *
+lxb_css_at_rule__custom_destroy(lxb_css_memory_t *memory,
+                                void *style, bool self_destroy)
+{
+    if (style == NULL) {
+        return NULL;
+    }
+
+    if (self_destroy) {
+        return lexbor_mraw_free(memory->mraw, style);
+    }
+
+    return style;
+}
+
+lxb_status_t
+lxb_css_at_rule__custom_serialize(const void *at, lexbor_serialize_cb_f cb,
+                                  void *ctx)
+{
+    lxb_status_t status;
+    const lxb_css_at_rule__custom_t *custom = at;
+
+    static const lxb_char_t ws_str[] = " ";
+    static const lxb_char_t lb_str[] = "{";
+    static const lxb_char_t rb_str[] = "}";
+
+
+    if (custom->prelude.data != NULL) {
+        lexbor_serialize_write(cb, ws_str, (sizeof(ws_str) - 1), ctx, status);
+        lexbor_serialize_write(cb, custom->prelude.data, custom->prelude.length,
+                               ctx, status);
+    }
+
+    if (custom->block != NULL) {
+        lexbor_serialize_write(cb, lb_str, (sizeof(lb_str) - 1), ctx, status);
+
+        status = lxb_css_rule_list_serialize(custom->block, cb, ctx);
+        if (status != LXB_STATUS_OK) {
+            return status;
+        }
+
+        lexbor_serialize_write(cb, rb_str, (sizeof(rb_str) - 1), ctx, status);
+    }
+
+    return LXB_STATUS_OK;
+}
+
+lxb_status_t
+lxb_css_at_rule__custom_serialize_name(const void *at, lexbor_serialize_cb_f cb,
+                                       void *ctx)
+{
+    const lxb_css_at_rule__custom_t *custom = at;
+
+    return cb(custom->name.data, custom->name.length, ctx);
+}
+
+/* Media. */
+
+void *
+lxb_css_at_rule_media_create(lxb_css_memory_t *memory)
+{
+    return lexbor_mraw_calloc(memory->mraw, sizeof(lxb_css_at_rule_media_t));
+}
+
+void *
+lxb_css_at_rule_media_destroy(lxb_css_memory_t *memory,
+                              void *style, bool self_destroy)
+{
+    return lxb_css_at_rule__undef_destroy(memory, style, self_destroy);
+}
+
+lxb_status_t
+lxb_css_at_rule_media_serialize(const void *style, lexbor_serialize_cb_f cb,
+                                void *ctx)
+{
+    return LXB_STATUS_OK;
+}
+
+/* Namespace. */
+
+void *
+lxb_css_at_rule_namespace_create(lxb_css_memory_t *memory)
+{
+    return lexbor_mraw_calloc(memory->mraw,
+                              sizeof(lxb_css_at_rule_namespace_t));
+}
+
+void *
+lxb_css_at_rule_namespace_destroy(lxb_css_memory_t *memory,
+                                  void *style, bool self_destroy)
+{
+    return lxb_css_at_rule__undef_destroy(memory, style, self_destroy);
+}
+
+lxb_status_t
+lxb_css_at_rule_namespace_serialize(const void *style, lexbor_serialize_cb_f cb,
+                                    void *ctx)
+{
+    return LXB_STATUS_OK;
+}
+
+/* Font-face. */
+
+void *
+lxb_css_at_rule_font_face_create(lxb_css_memory_t *memory)
+{
+    return lexbor_mraw_calloc(memory->mraw,
+                              sizeof(lxb_css_at_rule_font_face_t));
+}
+
+void *
+lxb_css_at_rule_font_face_destroy(lxb_css_memory_t *memory,
+                                  void *style, bool self_destroy)
+{
+    return lxb_css_at_rule__undef_destroy(memory, style, self_destroy);
+}
+
+lxb_status_t
+lxb_css_at_rule_font_face_serialize(const void *font_face,
+                                    lexbor_serialize_cb_f cb, void *ctx)
+{
+    lxb_status_t status;
+    const lxb_css_at_rule_font_face_t *ff = font_face;
+
+    static const lxb_char_t lb_str[] = " {";
+    static const lxb_char_t rb_str[] = "}";
+
+    if (ff->block != NULL) {
+        lexbor_serialize_write(cb, lb_str, (sizeof(lb_str) - 1), ctx, status);
+
+        status = lxb_css_rule_list_serialize(ff->block, cb, ctx);
+        if (status != LXB_STATUS_OK) {
+            return status;
+        }
+
+        lexbor_serialize_write(cb, rb_str, (sizeof(rb_str) - 1), ctx, status);
+    }
+
+    return LXB_STATUS_OK;
+}
diff --git a/ext/lexbor/lexbor/css/at_rule.h b/ext/lexbor/lexbor/css/at_rule.h
index a11455c14cd0..cacfa4c8cf2d 100644
--- a/ext/lexbor/lexbor/css/at_rule.h
+++ b/ext/lexbor/lexbor/css/at_rule.h
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2021-2022 Alexander Borisov
+ * Copyright (C) 2021-2026 Alexander Borisov
  *
  * Author: Alexander Borisov 
  */
@@ -19,19 +19,19 @@ extern "C" {
 typedef struct {
     lxb_css_at_rule_type_t type;
     lexbor_str_t           prelude;
-    lexbor_str_t           block;
+    lxb_css_rule_list_t    *block;
 }
 lxb_css_at_rule__undef_t;
 
 typedef struct {
-    lexbor_str_t name;
-    lexbor_str_t prelude;
-    lexbor_str_t block;
+    lexbor_str_t        name;
+    lexbor_str_t        prelude;
+    lxb_css_rule_list_t *block;
 }
 lxb_css_at_rule__custom_t;
 
 typedef struct {
-    uintptr_t reserved;
+    lxb_css_rule_list_t *block;
 }
 lxb_css_at_rule_media_t;
 
@@ -40,17 +40,31 @@ typedef struct {
 }
 lxb_css_at_rule_namespace_t;
 
+typedef struct {
+    lxb_css_rule_list_t *block;
+}
+lxb_css_at_rule_font_face_t;
 
-LXB_API const lxb_css_entry_data_t *
+
+LXB_API const lxb_css_entry_at_rule_data_t *
 lxb_css_at_rule_by_name(const lxb_char_t *name, size_t length);
 
-LXB_API const lxb_css_entry_data_t *
+LXB_API const lxb_css_entry_at_rule_data_t *
 lxb_css_at_rule_by_id(uintptr_t id);
 
+LXB_API lxb_css_rule_at_t *
+lxb_css_at_rule_create(lxb_css_parser_t *parser,
+                       const lxb_char_t *name, size_t length,
+                       const lxb_css_entry_at_rule_data_t **out_entry);
+
 LXB_API void *
 lxb_css_at_rule_destroy(lxb_css_memory_t *memory, void *value,
                         lxb_css_at_rule_type_t type, bool self_destroy);
 
+LXB_API lxb_status_t
+lxb_css_at_rule_convert_to_undef(lxb_css_parser_t *parser,
+                                 lxb_css_rule_at_t *at);
+
 LXB_API lxb_status_t
 lxb_css_at_rule_serialize(const void *style, lxb_css_at_rule_type_t type,
                           lexbor_serialize_cb_f cb, void *ctx);
@@ -73,10 +87,6 @@ LXB_API void *
 lxb_css_at_rule__undef_destroy(lxb_css_memory_t *memory,
                                void *style, bool self_destroy);
 LXB_API lxb_status_t
-lxb_css_at_rule__undef_make(lxb_css_parser_t *parser,
-                            lxb_css_at_rule__undef_t *undef,
-                            const lxb_css_syntax_at_rule_offset_t *at_rule);
-LXB_API lxb_status_t
 lxb_css_at_rule__undef_serialize(const void *style, lexbor_serialize_cb_f cb,
                                  void *ctx);
 LXB_API lxb_status_t
@@ -92,10 +102,6 @@ LXB_API void *
 lxb_css_at_rule__custom_destroy(lxb_css_memory_t *memory,
                                 void *style, bool self_destroy);
 LXB_API lxb_status_t
-lxb_css_at_rule__custom_make(lxb_css_parser_t *parser,
-                             lxb_css_at_rule__custom_t *custom,
-                             const lxb_css_syntax_at_rule_offset_t *at_rule);
-LXB_API lxb_status_t
 lxb_css_at_rule__custom_serialize(const void *style, lexbor_serialize_cb_f cb,
                                   void *ctx);
 LXB_API lxb_status_t
@@ -126,6 +132,18 @@ LXB_API lxb_status_t
 lxb_css_at_rule_namespace_serialize(const void *style, lexbor_serialize_cb_f cb,
                                     void *ctx);
 
+/* Font-face. */
+
+LXB_API void *
+lxb_css_at_rule_font_face_create(lxb_css_memory_t *memory);
+
+LXB_API void *
+lxb_css_at_rule_font_face_destroy(lxb_css_memory_t *memory,
+                                  void *style, bool self_destroy);
+
+LXB_API lxb_status_t
+lxb_css_at_rule_font_face_serialize(const void *style, lexbor_serialize_cb_f cb,
+                                    void *ctx);
 
 #ifdef __cplusplus
 } /* extern "C" */
diff --git a/ext/lexbor/lexbor/css/at_rule/const.h b/ext/lexbor/lexbor/css/at_rule/const.h
index 961f933a2367..29ba3dd95488 100644
--- a/ext/lexbor/lexbor/css/at_rule/const.h
+++ b/ext/lexbor/lexbor/css/at_rule/const.h
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2023 Alexander Borisov
+ * Copyright (C) 2026 Alexander Borisov
  *
  * Author: Alexander Borisov 
  */
@@ -21,9 +21,10 @@
 enum {
     LXB_CSS_AT_RULE__UNDEF      = 0x0000,
     LXB_CSS_AT_RULE__CUSTOM     = 0x0001,
-    LXB_CSS_AT_RULE_MEDIA       = 0x0002,
-    LXB_CSS_AT_RULE_NAMESPACE   = 0x0003,
-    LXB_CSS_AT_RULE__LAST_ENTRY = 0x0004
+    LXB_CSS_AT_RULE_FONT_FACE   = 0x0002,
+    LXB_CSS_AT_RULE_MEDIA       = 0x0003,
+    LXB_CSS_AT_RULE_NAMESPACE   = 0x0004,
+    LXB_CSS_AT_RULE__LAST_ENTRY = 0x0005
 };
 typedef uintptr_t lxb_css_at_rule_type_t;
 
diff --git a/ext/lexbor/lexbor/css/at_rule/res.h b/ext/lexbor/lexbor/css/at_rule/res.h
index 026a88ae0dd6..6604fb923f40 100644
--- a/ext/lexbor/lexbor/css/at_rule/res.h
+++ b/ext/lexbor/lexbor/css/at_rule/res.h
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2023 Alexander Borisov
+ * Copyright (C) 2026 Alexander Borisov
  *
  * Author: Alexander Borisov 
  */
@@ -18,16 +18,19 @@
 #include "lexbor/css/at_rule/const.h"
 
 
-static const lxb_css_entry_data_t lxb_css_at_rule_data[LXB_CSS_AT_RULE__LAST_ENTRY] = 
+static const lxb_css_entry_at_rule_data_t lxb_css_at_rule_data[LXB_CSS_AT_RULE__LAST_ENTRY] = 
 {
-    {(lxb_char_t *) "#undef", 6, LXB_CSS_AT_RULE__UNDEF, lxb_css_at_rule_state__undef,
+    {(lxb_char_t *) "#undef", 6, LXB_CSS_AT_RULE__UNDEF, &lxb_css_at_rule__undef_cb,
      lxb_css_at_rule__undef_create, lxb_css_at_rule__undef_destroy, lxb_css_at_rule__undef_serialize, (void *) (uintptr_t) LXB_CSS_AT_RULE__UNDEF},
-    {(lxb_char_t *) "#сustom", 7, LXB_CSS_AT_RULE__CUSTOM, lxb_css_at_rule_state__custom,
+    {(lxb_char_t *) "#сustom", 7, LXB_CSS_AT_RULE__CUSTOM, &lxb_css_at_rule__custom_cb,
      lxb_css_at_rule__custom_create, lxb_css_at_rule__custom_destroy, lxb_css_at_rule__custom_serialize, (void *) (uintptr_t) LXB_CSS_AT_RULE__CUSTOM},
-    {(lxb_char_t *) "media", 5, LXB_CSS_AT_RULE_MEDIA, lxb_css_at_rule_state_media,
+    {(lxb_char_t *) "font-face", 9, LXB_CSS_AT_RULE_FONT_FACE, &lxb_css_at_rule_font_face_cb,
+     lxb_css_at_rule_font_face_create, lxb_css_at_rule_font_face_destroy, lxb_css_at_rule_font_face_serialize,
+     NULL},
+    {(lxb_char_t *) "media", 5, LXB_CSS_AT_RULE_MEDIA, &lxb_css_at_rule_media_cb,
      lxb_css_at_rule_media_create, lxb_css_at_rule_media_destroy, lxb_css_at_rule_media_serialize,
      NULL},
-    {(lxb_char_t *) "namespace", 9, LXB_CSS_AT_RULE_NAMESPACE, lxb_css_at_rule_state_namespace,
+    {(lxb_char_t *) "namespace", 9, LXB_CSS_AT_RULE_NAMESPACE, &lxb_css_at_rule_namespace_cb,
      lxb_css_at_rule_namespace_create, lxb_css_at_rule_namespace_destroy, lxb_css_at_rule_namespace_serialize,
      NULL}
 };
@@ -38,7 +41,7 @@ static const lexbor_shs_entry_t lxb_css_at_rule_shs[6] =
     {NULL, NULL, 0, 0}, 
     {NULL, NULL, 0, 0}, 
     {"media", (void *) &lxb_css_at_rule_data[LXB_CSS_AT_RULE_MEDIA], 5, 0}, 
-    {NULL, NULL, 0, 0}, 
+    {"font-face", (void *) &lxb_css_at_rule_data[LXB_CSS_AT_RULE_FONT_FACE], 9, 0}, 
     {"namespace", (void *) &lxb_css_at_rule_data[LXB_CSS_AT_RULE_NAMESPACE], 9, 0}
 };
 
diff --git a/ext/lexbor/lexbor/css/at_rule/state.c b/ext/lexbor/lexbor/css/at_rule/state.c
new file mode 100644
index 000000000000..4df2f6085adf
--- /dev/null
+++ b/ext/lexbor/lexbor/css/at_rule/state.c
@@ -0,0 +1,374 @@
+/*
+ * Copyright (C) 2021-2026 Alexander Borisov
+ *
+ * Author: Alexander Borisov 
+ */
+
+#include "lexbor/css/css.h"
+#include "lexbor/css/at_rule.h"
+#include "lexbor/css/parser.h"
+#include "lexbor/css/rule.h"
+#include "lexbor/css/blank.h"
+#include "lexbor/css/at_rule/state.h"
+
+
+/* Undef */
+
+bool
+lxb_css_at_rule__undef_prelude(lxb_css_parser_t *parser,
+                               const lxb_css_syntax_token_t *token, void *ctx)
+{
+    lxb_css_rule_at_t *at = ctx;
+
+    at->prelude_begin = token->offset;
+
+    /* Skip all prelude. */
+
+    while (token != NULL && token->type != LXB_CSS_SYNTAX_TOKEN__END) {
+        lxb_css_syntax_parser_consume(parser);
+        token = lxb_css_syntax_parser_token(parser);
+    }
+
+    return lxb_css_parser_success(parser);
+}
+
+lxb_status_t
+lxb_css_at_rule__undef_prelude_end(lxb_css_parser_t *parser,
+                                   const lxb_css_syntax_token_t *token,
+                                   void *ctx, bool failed)
+{
+    lxb_status_t status;
+    lxb_css_rule_at_t *at = ctx;
+
+    at->prelude_end = token->offset;
+
+    status = lxb_css_make_data(parser, &at->u.undef->prelude,
+                               at->prelude_begin, at->prelude_end);
+    if (status != LXB_STATUS_OK) {
+        return lxb_css_parser_memory_fail_status(parser);
+    }
+
+    return LXB_STATUS_OK;
+}
+
+const lxb_css_syntax_cb_block_t *
+lxb_css_at_rule__undef_block(lxb_css_parser_t *parser,
+                             const lxb_css_syntax_token_t *token,
+                             void *ctx, void **out_rule)
+{
+    return lxb_css_state_at_rule_block_begin(parser, token, ctx, out_rule);
+}
+
+bool
+lxb_css_at_rule__undef_prelude_failed(lxb_css_parser_t *parser,
+                                      const lxb_css_syntax_token_t *token,
+                                      void *ctx)
+{
+    /* For _UNDEF and _CUSTOM, access here is not possible. */
+
+    while (token != NULL && token->type != LXB_CSS_SYNTAX_TOKEN__END) {
+        lxb_css_syntax_parser_consume(parser);
+        token = lxb_css_syntax_parser_token(parser);
+    }
+
+    return lxb_css_parser_success(parser);
+}
+
+lxb_status_t
+lxb_css_at_rule__undef_end(lxb_css_parser_t *parser,
+                           const lxb_css_syntax_token_t *token,
+                           void *ctx, bool failed)
+{
+    lxb_css_rule_at_t *at = ctx;
+    lxb_css_rule_list_t *block = lxb_css_syntax_returned(parser);
+
+    /*
+     * Here we do not check for failed because it cannot happen; we do not call
+     * failed anywhere in _UNDEF and _CUSTOM, we simply skip the tokens.
+     */
+
+    at->u.undef->block = block;
+
+    lxb_css_syntax_set_return(parser, at);
+
+    return LXB_STATUS_OK;
+}
+
+/* Custom */
+
+bool
+lxb_css_at_rule__custom_prelude(lxb_css_parser_t *parser,
+                                const lxb_css_syntax_token_t *token, void *ctx)
+{
+    return lxb_css_at_rule__undef_prelude(parser, token, ctx);
+}
+
+lxb_status_t
+lxb_css_at_rule__custom_prelude_end(lxb_css_parser_t *parser,
+                                    const lxb_css_syntax_token_t *token,
+                                    void *ctx, bool failed)
+{
+    lxb_status_t status;
+    lxb_css_rule_at_t *at = ctx;
+
+    at->prelude_end = token->offset;
+
+    status = lxb_css_make_data(parser, &at->u.custom->prelude,
+                               at->prelude_begin, at->prelude_end);
+    if (status != LXB_STATUS_OK) {
+        return lxb_css_parser_memory_fail_status(parser);
+    }
+
+    return LXB_STATUS_OK;
+}
+
+const lxb_css_syntax_cb_block_t *
+lxb_css_at_rule__custom_block(lxb_css_parser_t *parser,
+                             const lxb_css_syntax_token_t *token,
+                             void *ctx, void **out_rule)
+{
+    return lxb_css_state_at_rule_block_begin(parser, token, ctx, out_rule);
+}
+
+bool
+lxb_css_at_rule__custom_prelude_failed(lxb_css_parser_t *parser,
+                                       const lxb_css_syntax_token_t *token,
+                                       void *ctx)
+{
+    return lxb_css_at_rule__undef_prelude_failed(parser, token, ctx);
+}
+
+lxb_status_t
+lxb_css_at_rule__custom_end(lxb_css_parser_t *parser,
+                            const lxb_css_syntax_token_t *token,
+                            void *ctx, bool failed)
+{
+    lxb_css_rule_at_t *at = ctx;
+    lxb_css_rule_list_t *block = lxb_css_syntax_returned(parser);
+
+    /*
+     * Here we do not check for failed because it cannot happen; we do not call
+     * failed anywhere in _UNDEF and _CUSTOM, we simply skip the tokens.
+     */
+
+    at->u.custom->block = block;
+
+    lxb_css_syntax_set_return(parser, at);
+
+    return LXB_STATUS_OK;
+}
+
+/* Namespace */
+
+bool
+lxb_css_at_rule_namespace_prelude(lxb_css_parser_t *parser,
+                                  const lxb_css_syntax_token_t *token,
+                                  void *ctx)
+{
+    lxb_css_rule_at_t *at = ctx;
+
+    at->prelude_begin = token->offset;
+
+    while (token != NULL && token->type != LXB_CSS_SYNTAX_TOKEN__END) {
+        lxb_css_syntax_parser_consume(parser);
+        token = lxb_css_syntax_parser_token(parser);
+    }
+
+    return lxb_css_parser_success(parser);
+}
+
+lxb_status_t
+lxb_css_at_rule_namespace_prelude_end(lxb_css_parser_t *parser,
+                                      const lxb_css_syntax_token_t *token,
+                                      void *ctx, bool failed)
+{
+    lxb_css_rule_at_t *at = ctx;
+
+    at->prelude_end = token->offset;
+
+    return LXB_STATUS_OK;
+}
+
+const lxb_css_syntax_cb_block_t *
+lxb_css_at_rule_namespace_block(lxb_css_parser_t *parser,
+                                const lxb_css_syntax_token_t *token,
+                                void *ctx, void **out_rule)
+{
+    lxb_css_parser_failed_set(parser, true);
+
+    return lxb_css_state_at_rule_block_begin(parser, token, ctx, out_rule);
+}
+
+bool
+lxb_css_at_rule_namespace_prelude_failed(lxb_css_parser_t *parser,
+                                         const lxb_css_syntax_token_t *token,
+                                         void *ctx)
+{
+    return lxb_css_at_rule__undef_prelude_failed(parser, token, ctx);
+}
+
+lxb_status_t
+lxb_css_at_rule_namespace_end(lxb_css_parser_t *parser,
+                              const lxb_css_syntax_token_t *token,
+                              void *ctx, bool failed)
+{
+    lxb_status_t status;
+    lxb_css_rule_at_t *at = ctx;
+
+    if (failed) {
+        status = lxb_css_at_rule_convert_to_undef(parser, at);
+        if (status != LXB_STATUS_OK) {
+            return status;
+        }
+
+        at->u.undef->block = lxb_css_syntax_returned(parser);
+    }
+
+    lxb_css_syntax_set_return(parser, at);
+
+    return LXB_STATUS_OK;
+}
+
+/* Media */
+
+bool
+lxb_css_at_rule_media_prelude(lxb_css_parser_t *parser,
+                              const lxb_css_syntax_token_t *token, void *ctx)
+{
+    lxb_css_rule_at_t *at = ctx;
+
+    at->prelude_begin = token->offset;
+
+    while (token != NULL && token->type != LXB_CSS_SYNTAX_TOKEN__END) {
+        lxb_css_syntax_parser_consume(parser);
+        token = lxb_css_syntax_parser_token(parser);
+    }
+
+    return lxb_css_parser_success(parser);
+}
+
+lxb_status_t
+lxb_css_at_rule_media_prelude_end(lxb_css_parser_t *parser,
+                                  const lxb_css_syntax_token_t *token,
+                                  void *ctx, bool failed)
+{
+    lxb_css_rule_at_t *at = ctx;
+
+    at->prelude_end = token->offset;
+
+    return LXB_STATUS_OK;
+}
+
+const lxb_css_syntax_cb_block_t *
+lxb_css_at_rule_media_block(lxb_css_parser_t *parser,
+                            const lxb_css_syntax_token_t *token,
+                            void *ctx, void **out_rule)
+{
+    return lxb_css_state_at_rule_block_begin(parser, token, ctx, out_rule);
+}
+
+bool
+lxb_css_at_rule_media_prelude_failed(lxb_css_parser_t *parser,
+                                     const lxb_css_syntax_token_t *token,
+                                     void *ctx)
+{
+    return lxb_css_at_rule__undef_prelude_failed(parser, token, ctx);
+}
+
+lxb_status_t
+lxb_css_at_rule_media_end(lxb_css_parser_t *parser,
+                          const lxb_css_syntax_token_t *token,
+                          void *ctx, bool failed)
+{
+    lxb_status_t status;
+    lxb_css_rule_at_t *at = ctx;
+    lxb_css_rule_list_t *list = lxb_css_syntax_returned(parser);
+
+    if (list != NULL && !failed) {
+        at->u.media->block = list;
+    }
+    else {
+        status = lxb_css_at_rule_convert_to_undef(parser, at);
+        if (status != LXB_STATUS_OK) {
+            return status;
+        }
+
+        at->u.undef->block = list;
+    }
+
+    lxb_css_syntax_set_return(parser, at);
+
+    return LXB_STATUS_OK;
+}
+
+/* Font-face */
+
+bool
+lxb_css_at_rule_font_face_prelude(lxb_css_parser_t *parser,
+                                  const lxb_css_syntax_token_t *token,
+                                  void *ctx)
+{
+    lxb_css_rule_at_t *at = ctx;
+
+    at->prelude_begin = token->offset;
+
+    if (token->type != LXB_CSS_SYNTAX_TOKEN__END) {
+        return lxb_css_parser_failed(parser);
+    }
+
+    return lxb_css_parser_success(parser);
+}
+
+lxb_status_t
+lxb_css_at_rule_font_face_prelude_end(lxb_css_parser_t *parser,
+                                      const lxb_css_syntax_token_t *token,
+                                      void *ctx, bool failed)
+{
+    lxb_css_rule_at_t *at = ctx;
+
+    at->prelude_end = token->offset;
+
+    return LXB_STATUS_OK;
+}
+
+const lxb_css_syntax_cb_block_t *
+lxb_css_at_rule_font_face_block(lxb_css_parser_t *parser,
+                                const lxb_css_syntax_token_t *token,
+                                void *ctx, void **out_rule)
+{
+    return lxb_css_state_at_rule_block_begin(parser, token, ctx, out_rule);
+}
+
+bool
+lxb_css_at_rule_font_face_prelude_failed(lxb_css_parser_t *parser,
+                                         const lxb_css_syntax_token_t *token,
+                                         void *ctx)
+{
+    return lxb_css_at_rule__undef_prelude_failed(parser, token, ctx);
+}
+
+lxb_status_t
+lxb_css_at_rule_font_face_end(lxb_css_parser_t *parser,
+                              const lxb_css_syntax_token_t *token,
+                              void *ctx, bool failed)
+{
+    lxb_status_t status;
+    lxb_css_rule_at_t *at = ctx;
+    lxb_css_rule_list_t *block = lxb_css_syntax_returned(parser);
+
+    if (!failed) {
+        at->u.font_face->block = block;
+    }
+    else {
+        status = lxb_css_at_rule_convert_to_undef(parser, at);
+        if (status != LXB_STATUS_OK) {
+            return status;
+        }
+
+        at->u.undef->block = block;
+    }
+
+    lxb_css_syntax_set_return(parser, at);
+
+    return LXB_STATUS_OK;
+}
diff --git a/ext/lexbor/lexbor/css/at_rule/state.h b/ext/lexbor/lexbor/css/at_rule/state.h
index 65e17e40d0ff..337a23c86714 100644
--- a/ext/lexbor/lexbor/css/at_rule/state.h
+++ b/ext/lexbor/lexbor/css/at_rule/state.h
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2021-2022 Alexander Borisov
+ * Copyright (C) 2021-2026 Alexander Borisov
  *
  * Author: Alexander Borisov 
  */
@@ -15,18 +15,110 @@ extern "C" {
 
 
 LXB_API bool
-lxb_css_at_rule_state__undef(lxb_css_parser_t *parser,
-                             const lxb_css_syntax_token_t *token, void *ctx);
+lxb_css_at_rule__undef_prelude(lxb_css_parser_t *parser,
+                               const lxb_css_syntax_token_t *token, void *ctx);
+LXB_API lxb_status_t
+lxb_css_at_rule__undef_prelude_end(lxb_css_parser_t *parser,
+                                   const lxb_css_syntax_token_t *token,
+                                   void *ctx, bool failed);
 
+LXB_API const lxb_css_syntax_cb_block_t *
+lxb_css_at_rule__undef_block(lxb_css_parser_t *parser,
+                             const lxb_css_syntax_token_t *token,
+                             void *ctx, void **out_rule);
 LXB_API bool
-lxb_css_at_rule_state__custom(lxb_css_parser_t *parser,
+lxb_css_at_rule__undef_prelude_failed(lxb_css_parser_t *parser,
+                                      const lxb_css_syntax_token_t *token,
+                                      void *ctx);
+LXB_API lxb_status_t
+lxb_css_at_rule__undef_end(lxb_css_parser_t *parser,
+                           const lxb_css_syntax_token_t *token,
+                           void *ctx, bool failed);
+
+LXB_API bool
+lxb_css_at_rule__custom_prelude(lxb_css_parser_t *parser,
+                                const lxb_css_syntax_token_t *token, void *ctx);
+LXB_API lxb_status_t
+lxb_css_at_rule__custom_prelude_end(lxb_css_parser_t *parser,
+                                    const lxb_css_syntax_token_t *token,
+                                    void *ctx, bool failed);
+
+LXB_API const lxb_css_syntax_cb_block_t *
+lxb_css_at_rule__custom_block(lxb_css_parser_t *parser,
+                              const lxb_css_syntax_token_t *token,
+                              void *ctx, void **out_rule);
+LXB_API bool
+lxb_css_at_rule__custom_prelude_failed(lxb_css_parser_t *parser,
+                                       const lxb_css_syntax_token_t *token,
+                                       void *ctx);
+LXB_API lxb_status_t
+lxb_css_at_rule__custom_end(lxb_css_parser_t *parser,
+                            const lxb_css_syntax_token_t *token,
+                            void *ctx, bool failed);
+
+LXB_API bool
+lxb_css_at_rule_namespace_prelude(lxb_css_parser_t *parser,
+                                  const lxb_css_syntax_token_t *token, void *ctx);
+LXB_API lxb_status_t
+lxb_css_at_rule_namespace_prelude_end(lxb_css_parser_t *parser,
+                                      const lxb_css_syntax_token_t *token,
+                                      void *ctx, bool failed);
+
+LXB_API const lxb_css_syntax_cb_block_t *
+lxb_css_at_rule_namespace_block(lxb_css_parser_t *parser,
+                                const lxb_css_syntax_token_t *token,
+                                void *ctx, void **out_rule);
+LXB_API bool
+lxb_css_at_rule_namespace_prelude_failed(lxb_css_parser_t *parser,
+                                         const lxb_css_syntax_token_t *token,
+                                         void *ctx);
+LXB_API lxb_status_t
+lxb_css_at_rule_namespace_end(lxb_css_parser_t *parser,
+                              const lxb_css_syntax_token_t *token,
+                              void *ctx, bool failed);
+
+LXB_API bool
+lxb_css_at_rule_media_prelude(lxb_css_parser_t *parser,
                               const lxb_css_syntax_token_t *token, void *ctx);
+LXB_API lxb_status_t
+lxb_css_at_rule_media_prelude_end(lxb_css_parser_t *parser,
+                                  const lxb_css_syntax_token_t *token,
+                                  void *ctx, bool failed);
+
+LXB_API const lxb_css_syntax_cb_block_t *
+lxb_css_at_rule_media_block(lxb_css_parser_t *parser,
+                            const lxb_css_syntax_token_t *token,
+                            void *ctx, void **out_rule);
 LXB_API bool
-lxb_css_at_rule_state_media(lxb_css_parser_t *parser,
-                            const lxb_css_syntax_token_t *token, void *ctx);
+lxb_css_at_rule_media_prelude_failed(lxb_css_parser_t *parser,
+                                     const lxb_css_syntax_token_t *token,
+                                     void *ctx);
+LXB_API lxb_status_t
+lxb_css_at_rule_media_end(lxb_css_parser_t *parser,
+                          const lxb_css_syntax_token_t *token,
+                          void *ctx, bool failed);
+
 LXB_API bool
-lxb_css_at_rule_state_namespace(lxb_css_parser_t *parser,
-                                const lxb_css_syntax_token_t *token, void *ctx);
+lxb_css_at_rule_font_face_prelude(lxb_css_parser_t *parser,
+                                  const lxb_css_syntax_token_t *token,
+                                  void *ctx);
+LXB_API lxb_status_t
+lxb_css_at_rule_font_face_prelude_end(lxb_css_parser_t *parser,
+                                      const lxb_css_syntax_token_t *token,
+                                      void *ctx, bool failed);
+
+LXB_API const lxb_css_syntax_cb_block_t *
+lxb_css_at_rule_font_face_block(lxb_css_parser_t *parser,
+                                const lxb_css_syntax_token_t *token,
+                                void *ctx, void **out_rule);
+LXB_API bool
+lxb_css_at_rule_font_face_prelude_failed(lxb_css_parser_t *parser,
+                                         const lxb_css_syntax_token_t *token,
+                                         void *ctx);
+LXB_API lxb_status_t
+lxb_css_at_rule_font_face_end(lxb_css_parser_t *parser,
+                              const lxb_css_syntax_token_t *token,
+                              void *ctx, bool failed);
 
 
 #ifdef __cplusplus
diff --git a/ext/lexbor/lexbor/css/at_rule/types.h b/ext/lexbor/lexbor/css/at_rule/types.h
new file mode 100644
index 000000000000..1079bb632230
--- /dev/null
+++ b/ext/lexbor/lexbor/css/at_rule/types.h
@@ -0,0 +1,60 @@
+/*
+ * Copyright (C) 2026 Alexander Borisov
+ *
+ * Author: Alexander Borisov 
+ */
+
+/*
+ * Caution!
+ * This file generated by the script "utils/lexbor/css/names.py"!
+ * Do not change this file!
+ */
+
+
+#ifndef LXB_CSS_AT_RULE_TYPES_H
+#define LXB_CSS_AT_RULE_TYPES_H
+
+
+static const lxb_css_syntax_cb_at_rule_t lxb_css_at_rule__undef_cb = {
+    .prelude = lxb_css_at_rule__undef_prelude,
+    .prelude_end = lxb_css_at_rule__undef_prelude_end,
+    .block = lxb_css_at_rule__undef_block,
+    .cb.failed = lxb_css_at_rule__undef_prelude_failed,
+    .cb.end = lxb_css_at_rule__undef_end
+};
+
+static const lxb_css_syntax_cb_at_rule_t lxb_css_at_rule__custom_cb = {
+    .prelude = lxb_css_at_rule__custom_prelude,
+    .prelude_end = lxb_css_at_rule__custom_prelude_end,
+    .block = lxb_css_at_rule__custom_block,
+    .cb.failed = lxb_css_at_rule__custom_prelude_failed,
+    .cb.end = lxb_css_at_rule__custom_end
+};
+
+static const lxb_css_syntax_cb_at_rule_t lxb_css_at_rule_font_face_cb = {
+    .prelude = lxb_css_at_rule_font_face_prelude,
+    .prelude_end = lxb_css_at_rule_font_face_prelude_end,
+    .block = lxb_css_at_rule_font_face_block,
+    .cb.failed = lxb_css_at_rule_font_face_prelude_failed,
+    .cb.end = lxb_css_at_rule_font_face_end
+};
+
+static const lxb_css_syntax_cb_at_rule_t lxb_css_at_rule_media_cb = {
+    .prelude = lxb_css_at_rule_media_prelude,
+    .prelude_end = lxb_css_at_rule_media_prelude_end,
+    .block = lxb_css_at_rule_media_block,
+    .cb.failed = lxb_css_at_rule_media_prelude_failed,
+    .cb.end = lxb_css_at_rule_media_end
+};
+
+static const lxb_css_syntax_cb_at_rule_t lxb_css_at_rule_namespace_cb = {
+    .prelude = lxb_css_at_rule_namespace_prelude,
+    .prelude_end = lxb_css_at_rule_namespace_prelude_end,
+    .block = lxb_css_at_rule_namespace_block,
+    .cb.failed = lxb_css_at_rule_namespace_prelude_failed,
+    .cb.end = lxb_css_at_rule_namespace_end
+};
+
+
+
+#endif /* LXB_CSS_AT_RULE_TYPES_H */
diff --git a/ext/lexbor/lexbor/css/base.h b/ext/lexbor/lexbor/css/base.h
index 3d3cdc6a7f28..26712ce7048f 100644
--- a/ext/lexbor/lexbor/css/base.h
+++ b/ext/lexbor/lexbor/css/base.h
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2019-2025 Alexander Borisov
+ * Copyright (C) 2019-2026 Alexander Borisov
  *
  * Author: Alexander Borisov 
  */
@@ -18,7 +18,7 @@ extern "C" {
 
 
 #define LXB_CSS_VERSION_MAJOR 1
-#define LXB_CSS_VERSION_MINOR 3
+#define LXB_CSS_VERSION_MINOR 4
 #define LXB_CSS_VERSION_PATCH 0
 
 #define LXB_CSS_VERSION_STRING                                                 \
@@ -45,6 +45,8 @@ typedef struct lxb_css_parser_error lxb_css_parser_error_t;
 typedef struct lxb_css_syntax_tokenizer lxb_css_syntax_tokenizer_t;
 typedef struct lxb_css_syntax_token lxb_css_syntax_token_t;
 
+/* Callbacks. */
+
 typedef bool
 (*lxb_css_parser_state_f)(lxb_css_parser_t *parser,
                           const lxb_css_syntax_token_t *token, void *ctx);
@@ -82,6 +84,21 @@ typedef struct {
 }
 lxb_css_entry_data_t;
 
+typedef struct {
+    lxb_char_t                        *name;
+    size_t                            length;
+    uintptr_t                         unique;
+
+    /* const lxb_css_syntax_cb_at_rule_t */
+    const void                        *cbs;
+
+    lxb_css_style_create_f            create;
+    lxb_css_style_destroy_f           destroy;
+    lxb_css_style_serialize_f         serialize;
+    void                              *initial;
+}
+lxb_css_entry_at_rule_data_t;
+
 typedef struct {
     lxb_char_t *name;
     size_t     length;
diff --git a/ext/lexbor/lexbor/css/blank.c b/ext/lexbor/lexbor/css/blank.c
new file mode 100644
index 000000000000..80e60f76e198
--- /dev/null
+++ b/ext/lexbor/lexbor/css/blank.c
@@ -0,0 +1,389 @@
+/*
+ * Copyright (C) 2026 Alexander Borisov
+ *
+ * Author: Alexander Borisov 
+ */
+
+#include "lexbor/css/blank.h"
+#include "lexbor/css/state.h"
+#include "lexbor/css/css.h"
+#include "lexbor/css/at_rule/state.h"
+
+
+static bool
+lxb_css_blank_list_rules_next(lxb_css_parser_t *parser,
+                              const lxb_css_syntax_token_t *token, void *ctx);
+
+static lxb_status_t
+lxb_css_blank_list_rules_end(lxb_css_parser_t *parser,
+                             const lxb_css_syntax_token_t *token,
+                             void *ctx, bool failed);
+
+static const lxb_css_syntax_cb_at_rule_t *
+lxb_css_blank_at_rule_begin(lxb_css_parser_t *parser,
+                            const lxb_css_syntax_token_t *token, void *ctx,
+                            void **out_rule);
+
+static bool
+lxb_css_blank_at_rule_prelude(lxb_css_parser_t *parser,
+                              const lxb_css_syntax_token_t *token,
+                              void *ctx);
+
+static lxb_status_t
+lxb_css_blank_at_rule_prelude_end(lxb_css_parser_t *parser,
+                                  const lxb_css_syntax_token_t *token,
+                                  void *ctx, bool failed);
+
+static const lxb_css_syntax_cb_block_t *
+lxb_css_blank_at_rule_block_begin(lxb_css_parser_t *parser,
+                                  const lxb_css_syntax_token_t *token,
+                                  void *ctx, void **out_rule);
+static bool
+lxb_css_blank_at_rule_prelude_failed(lxb_css_parser_t *parser,
+                                     const lxb_css_syntax_token_t *token,
+                                     void *ctx);
+static lxb_status_t
+lxb_css_blank_at_rule_end(lxb_css_parser_t *parser,
+                          const lxb_css_syntax_token_t *token,
+                          void *ctx, bool failed);
+
+static const lxb_css_syntax_cb_qualified_rule_t *
+lxb_css_blank_qualified_rule_begin(lxb_css_parser_t *parser,
+                                   const lxb_css_syntax_token_t *token,
+                                   void *ctx, void **out_rule);
+
+static bool
+lxb_css_blank_qualified_rule_prelude(lxb_css_parser_t *parser,
+                                     const lxb_css_syntax_token_t *token,
+                                     void *ctx);
+
+static lxb_status_t
+lxb_css_blank_qualified_rule_prelude_end(lxb_css_parser_t *parser,
+                                         const lxb_css_syntax_token_t *token,
+                                         void *ctx, bool failed);
+
+static const lxb_css_syntax_cb_block_t *
+lxb_css_blank_qualified_rule_block_begin(lxb_css_parser_t *parser,
+                                         const lxb_css_syntax_token_t *token,
+                                         void *ctx, void **out_rule);
+
+static bool
+lxb_css_blank_qualified_rule_prelude_failed(lxb_css_parser_t *parser,
+                                            const lxb_css_syntax_token_t *token,
+                                            void *ctx);
+static lxb_status_t
+lxb_css_blank_qualified_rule_end(lxb_css_parser_t *parser,
+                                 const lxb_css_syntax_token_t *token,
+                                 void *ctx, bool failed);
+static bool
+lxb_css_blank_block_next(lxb_css_parser_t *parser,
+                         const lxb_css_syntax_token_t *token, void *ctx);
+
+static lxb_status_t
+lxb_css_blank_block_end(lxb_css_parser_t *parser,
+                        const lxb_css_syntax_token_t *token,
+                        void *ctx, bool failed);
+
+static const lxb_css_syntax_cb_declarations_t *
+lxb_css_blank_declarations_begin(lxb_css_parser_t *parser,
+                                 const lxb_css_syntax_token_t *token,
+                                 void *ctx, void **out_rule);
+
+static lxb_css_parser_state_f
+lxb_css_blank_declaration_name(lxb_css_parser_t *parser,
+                               const lxb_css_syntax_token_t *token,
+                               void *ctx, void **out_rule);
+static bool
+lxb_css_blank_declaration_value(lxb_css_parser_t *parser,
+                                const lxb_css_syntax_token_t *token, void *ctx);
+
+static lxb_status_t
+lxb_css_blank_declaration_end(lxb_css_parser_t *parser,
+                              void *declarations, void *ctx,
+                              const lxb_css_syntax_token_t *token,
+                              lxb_css_syntax_declaration_offset_t *offset,
+                              bool important, bool failed);
+
+static lxb_status_t
+lxb_css_blank_declarations_end(lxb_css_parser_t *parser,
+                               const lxb_css_syntax_token_t *token,
+                               void *ctx, bool failed);
+
+static bool
+lxb_css_blank_declarations_bad(lxb_css_parser_t *parser,
+                               const lxb_css_syntax_token_t *token, void *ctx);
+
+
+static const lxb_css_syntax_cb_list_rules_t lxb_css_blank_list_rules = {
+    .at_rule = lxb_css_blank_at_rule_begin,
+    .qualified_rule = lxb_css_blank_qualified_rule_begin,
+    .next = lxb_css_blank_list_rules_next,
+    .cb.failed = lxb_css_state_failed,
+    .cb.end = lxb_css_blank_list_rules_end
+};
+
+static const lxb_css_syntax_cb_at_rule_t lxb_css_blank_at_rule = {
+    .prelude = lxb_css_blank_at_rule_prelude,
+    .prelude_end = lxb_css_blank_at_rule_prelude_end,
+    .block = lxb_css_blank_at_rule_block_begin,
+    .cb.failed = lxb_css_blank_at_rule_prelude_failed,
+    .cb.end = lxb_css_blank_at_rule_end
+};
+
+static const lxb_css_syntax_cb_qualified_rule_t lxb_css_blank_qualified_rule = {
+    .prelude = lxb_css_blank_qualified_rule_prelude,
+    .prelude_end = lxb_css_blank_qualified_rule_prelude_end,
+    .block = lxb_css_blank_qualified_rule_block_begin,
+    .cb.failed = lxb_css_blank_qualified_rule_prelude_failed,
+    .cb.end = lxb_css_blank_qualified_rule_end
+};
+
+static const lxb_css_syntax_cb_block_t lxb_css_blank_block = {
+    .at_rule = lxb_css_blank_at_rule_begin,
+    .declarations = lxb_css_blank_declarations_begin,
+    .qualified_rule = lxb_css_blank_qualified_rule_begin,
+    .next = lxb_css_blank_block_next,
+    .cb.failed = lxb_css_state_failed,
+    .cb.end = lxb_css_blank_block_end,
+};
+
+static const lxb_css_syntax_cb_declarations_t lxb_css_blank_declaration = {
+    .name = lxb_css_blank_declaration_name,
+    .end = lxb_css_blank_declaration_end,
+    .cb.failed = lxb_css_blank_declarations_bad,
+    .cb.end = lxb_css_blank_declarations_end
+};
+
+
+const lxb_css_syntax_cb_list_rules_t *
+lxb_css_blank_cb_list_rules(void)
+{
+    return &lxb_css_blank_list_rules;
+}
+
+const lxb_css_syntax_cb_at_rule_t *
+lxb_css_blank_cb_at_rule(void)
+{
+    return &lxb_css_blank_at_rule;
+}
+
+const lxb_css_syntax_cb_qualified_rule_t *
+lxb_css_blank_cb_qualified_rule(void)
+{
+    return &lxb_css_blank_qualified_rule;
+}
+
+const lxb_css_syntax_cb_block_t *
+lxb_css_blank_cb_block(void)
+{
+    return &lxb_css_blank_block;
+}
+
+const lxb_css_syntax_cb_declarations_t *
+lxb_css_blank_cb_declarations(void)
+{
+    return &lxb_css_blank_declaration;
+}
+
+static bool
+lxb_css_blank_list_rules_next(lxb_css_parser_t *parser,
+                              const lxb_css_syntax_token_t *token, void *ctx)
+{
+    return lxb_css_parser_success(parser);
+}
+
+static lxb_status_t
+lxb_css_blank_list_rules_end(lxb_css_parser_t *parser,
+                             const lxb_css_syntax_token_t *token,
+                             void *ctx, bool failed)
+{
+    return LXB_STATUS_OK;
+}
+
+static const lxb_css_syntax_cb_at_rule_t *
+lxb_css_blank_at_rule_begin(lxb_css_parser_t *parser,
+                            const lxb_css_syntax_token_t *token, void *ctx,
+                            void **out_rule)
+{
+    return &lxb_css_blank_at_rule;
+}
+
+static bool
+lxb_css_blank_at_rule_prelude(lxb_css_parser_t *parser,
+                              const lxb_css_syntax_token_t *token, void *ctx)
+{
+    while (token != NULL && token->type != LXB_CSS_SYNTAX_TOKEN__END) {
+        lxb_css_syntax_parser_consume(parser);
+        token = lxb_css_syntax_parser_token(parser);
+    }
+
+    return lxb_css_parser_success(parser);
+}
+
+static lxb_status_t
+lxb_css_blank_at_rule_prelude_end(lxb_css_parser_t *parser,
+                                  const lxb_css_syntax_token_t *token,
+                                  void *ctx, bool failed)
+{
+    return LXB_STATUS_OK;
+}
+
+static const lxb_css_syntax_cb_block_t *
+lxb_css_blank_at_rule_block_begin(lxb_css_parser_t *parser,
+                                  const lxb_css_syntax_token_t *token,
+                                  void *ctx, void **out_rule)
+{
+    return &lxb_css_blank_block;
+}
+
+static bool
+lxb_css_blank_at_rule_prelude_failed(lxb_css_parser_t *parser,
+                                     const lxb_css_syntax_token_t *token,
+                                     void *ctx)
+{
+    while (token != NULL && token->type != LXB_CSS_SYNTAX_TOKEN__END) {
+        lxb_css_syntax_parser_consume(parser);
+        token = lxb_css_syntax_parser_token(parser);
+    }
+
+    return lxb_css_parser_success(parser);
+}
+
+static lxb_status_t
+lxb_css_blank_at_rule_end(lxb_css_parser_t *parser,
+                          const lxb_css_syntax_token_t *token,
+                          void *ctx, bool failed)
+{
+    return LXB_STATUS_OK;
+}
+
+static const lxb_css_syntax_cb_qualified_rule_t *
+lxb_css_blank_qualified_rule_begin(lxb_css_parser_t *parser,
+                                   const lxb_css_syntax_token_t *token,
+                                   void *ctx, void **out_rule)
+{
+    return &lxb_css_blank_qualified_rule;
+}
+
+static bool
+lxb_css_blank_qualified_rule_prelude(lxb_css_parser_t *parser,
+                                     const lxb_css_syntax_token_t *token,
+                                     void *ctx)
+{
+    while (token != NULL && token->type != LXB_CSS_SYNTAX_TOKEN__END) {
+        lxb_css_syntax_parser_consume(parser);
+        token = lxb_css_syntax_parser_token(parser);
+    }
+
+    return lxb_css_parser_success(parser);
+}
+
+static lxb_status_t
+lxb_css_blank_qualified_rule_prelude_end(lxb_css_parser_t *parser,
+                                         const lxb_css_syntax_token_t *token,
+                                         void *ctx, bool failed)
+{
+    return LXB_STATUS_OK;
+}
+
+static const lxb_css_syntax_cb_block_t *
+lxb_css_blank_qualified_rule_block_begin(lxb_css_parser_t *parser,
+                                         const lxb_css_syntax_token_t *token,
+                                         void *ctx, void **out_rule)
+{
+    return &lxb_css_blank_block;
+}
+
+static bool
+lxb_css_blank_qualified_rule_prelude_failed(lxb_css_parser_t *parser,
+                                            const lxb_css_syntax_token_t *token,
+                                            void *ctx)
+{
+    while (token != NULL && token->type != LXB_CSS_SYNTAX_TOKEN__END) {
+        lxb_css_syntax_parser_consume(parser);
+        token = lxb_css_syntax_parser_token(parser);
+    }
+
+    return lxb_css_parser_success(parser);
+}
+
+static lxb_status_t
+lxb_css_blank_qualified_rule_end(lxb_css_parser_t *parser,
+                                 const lxb_css_syntax_token_t *token,
+                                 void *ctx, bool failed)
+{
+    return LXB_STATUS_OK;
+}
+
+static bool
+lxb_css_blank_block_next(lxb_css_parser_t *parser,
+                         const lxb_css_syntax_token_t *token, void *ctx)
+{
+    return lxb_css_parser_success(parser);
+}
+
+static lxb_status_t
+lxb_css_blank_block_end(lxb_css_parser_t *parser,
+                        const lxb_css_syntax_token_t *token,
+                        void *ctx, bool failed)
+{
+    return LXB_STATUS_OK;
+}
+
+static const lxb_css_syntax_cb_declarations_t *
+lxb_css_blank_declarations_begin(lxb_css_parser_t *parser,
+                                 const lxb_css_syntax_token_t *token,
+                                 void *ctx, void **out_rule)
+{
+    return &lxb_css_blank_declaration;
+}
+
+static lxb_css_parser_state_f
+lxb_css_blank_declaration_name(lxb_css_parser_t *parser,
+                               const lxb_css_syntax_token_t *token,
+                               void *ctx, void **out_rule)
+{
+    return lxb_css_blank_declaration_value;
+}
+
+static bool
+lxb_css_blank_declaration_value(lxb_css_parser_t *parser,
+                                const lxb_css_syntax_token_t *token, void *ctx)
+{
+    while (token != NULL && token->type != LXB_CSS_SYNTAX_TOKEN__END) {
+        lxb_css_syntax_parser_consume(parser);
+        token = lxb_css_syntax_parser_token(parser);
+    }
+
+    return lxb_css_parser_success(parser);
+}
+
+static lxb_status_t
+lxb_css_blank_declaration_end(lxb_css_parser_t *parser,
+                              void *declarations, void *ctx,
+                              const lxb_css_syntax_token_t *token,
+                              lxb_css_syntax_declaration_offset_t *offset,
+                              bool important, bool failed)
+{
+    return LXB_STATUS_OK;
+}
+
+static lxb_status_t
+lxb_css_blank_declarations_end(lxb_css_parser_t *parser,
+                               const lxb_css_syntax_token_t *token,
+                               void *ctx, bool failed)
+{
+    return LXB_STATUS_OK;
+}
+
+static bool
+lxb_css_blank_declarations_bad(lxb_css_parser_t *parser,
+                               const lxb_css_syntax_token_t *token, void *ctx)
+{
+    while (token != NULL && token->type != LXB_CSS_SYNTAX_TOKEN__END) {
+        lxb_css_syntax_parser_consume(parser);
+        token = lxb_css_syntax_parser_token(parser);
+    }
+
+    return lxb_css_parser_success(parser);
+}
diff --git a/ext/lexbor/lexbor/css/blank.h b/ext/lexbor/lexbor/css/blank.h
new file mode 100644
index 000000000000..05a13bfa1207
--- /dev/null
+++ b/ext/lexbor/lexbor/css/blank.h
@@ -0,0 +1,38 @@
+/*
+ * Copyright (C) 2026 Alexander Borisov
+ *
+ * Author: Alexander Borisov 
+ */
+
+#ifndef LXB_CSS_BLANK_H
+#define LXB_CSS_BLANK_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include "lexbor/css/base.h"
+#include "lexbor/css/syntax/syntax.h"
+
+
+LXB_API const lxb_css_syntax_cb_list_rules_t *
+lxb_css_blank_cb_list_rules(void);
+
+LXB_API const lxb_css_syntax_cb_at_rule_t *
+lxb_css_blank_cb_at_rule(void);
+
+LXB_API const lxb_css_syntax_cb_qualified_rule_t *
+lxb_css_blank_cb_qualified_rule(void);
+
+LXB_API const lxb_css_syntax_cb_block_t *
+lxb_css_blank_cb_block(void);
+
+LXB_API const lxb_css_syntax_cb_declarations_t *
+lxb_css_blank_cb_declarations(void);
+
+
+#ifdef __cplusplus
+} /* extern "C" */
+#endif
+
+#endif /* LXB_CSS_BLANK_H */
diff --git a/ext/lexbor/lexbor/css/css.c b/ext/lexbor/lexbor/css/css.c
index 3b6f0cb0f2f4..68c6c977e834 100644
--- a/ext/lexbor/lexbor/css/css.c
+++ b/ext/lexbor/lexbor/css/css.c
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2021-2022 Alexander Borisov
+ * Copyright (C) 2021-2026 Alexander Borisov
  *
  * Author: Alexander Borisov 
  */
@@ -155,15 +155,12 @@ lxb_css_memory_ref_dec_destroy(lxb_css_memory_t *memory)
 
 lxb_status_t
 lxb_css_make_data(lxb_css_parser_t *parser, lexbor_str_t *str,
-                  uintptr_t begin, uintptr_t end)
+                  size_t begin, size_t end)
 {
-    size_t length, offlen, len;
-    const lxb_char_t *pos;
-    const lexbor_str_t *tmp;
+    size_t length;
+    const lxb_char_t *p;
 
-    tmp = &parser->str;
-
-    offlen = begin - parser->offset;
+    p = parser->tkz->in_begin;
     length = end - begin;
 
     if (str->data == NULL) {
@@ -173,31 +170,9 @@ lxb_css_make_data(lxb_css_parser_t *parser, lexbor_str_t *str,
         }
     }
 
-    if (tmp->length > offlen) {
-        len = tmp->length - offlen;
-
-        if (len >= length) {
-            memcpy(str->data + str->length, tmp->data + offlen, length);
-            goto done;
-        }
-        else {
-            memcpy(str->data + str->length, tmp->data + offlen, len);
-        }
-
-        str->length += len;
-
-        pos = parser->pos;
-        length -= len;
-    }
-    else {
-        pos = parser->pos + (offlen - tmp->length);
-    }
-
-    memcpy(str->data + str->length, pos, length);
-
-done:
+    memcpy(str->data, p + begin, length);
 
-    str->length += length;
+    str->length = length;
     str->data[str->length] = '\0';
 
     return LXB_STATUS_OK;
diff --git a/ext/lexbor/lexbor/css/css.h b/ext/lexbor/lexbor/css/css.h
index bb12978e3ee2..4ba7152334ba 100644
--- a/ext/lexbor/lexbor/css/css.h
+++ b/ext/lexbor/lexbor/css/css.h
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2020-2022 Alexander Borisov
+ * Copyright (C) 2020-2026 Alexander Borisov
  *
  * Author: Alexander Borisov 
  */
@@ -35,7 +35,7 @@ extern "C" {
 
 LXB_API lxb_status_t
 lxb_css_make_data(lxb_css_parser_t *parser, lexbor_str_t *str,
-                  uintptr_t begin, uintptr_t end);
+                  size_t begin, size_t end);
 
 LXB_API lxb_char_t *
 lxb_css_serialize_char_handler(const void *style, lxb_css_style_serialize_f cb,
diff --git a/ext/lexbor/lexbor/css/declaration.c b/ext/lexbor/lexbor/css/declaration.c
new file mode 100644
index 000000000000..e27571486f1f
--- /dev/null
+++ b/ext/lexbor/lexbor/css/declaration.c
@@ -0,0 +1,86 @@
+/*
+ * Copyright (C) 2022-2026 Alexander Borisov
+ *
+ * Author: Alexander Borisov 
+ */
+
+#include "lexbor/css/declaration.h"
+
+
+lxb_css_rule_declaration_t *
+lxb_css_declaration_create(lxb_css_parser_t *parser,
+                           const lxb_char_t *name, size_t length,
+                           const lxb_css_entry_data_t **out_entry)
+{
+    void *prop;
+    const lxb_css_entry_data_t *entry;
+    lxb_css_property__custom_t *custom;
+    lxb_css_rule_declaration_t *declar;
+
+    declar = lxb_css_rule_declaration_create(parser->memory);
+    if (declar == NULL) {
+        return NULL;
+    }
+
+    entry = lxb_css_property_by_name(name, length);
+    if (entry == NULL) {
+        entry = lxb_css_property_by_id(LXB_CSS_PROPERTY__CUSTOM);
+
+        prop = entry->create(parser->memory);
+        if (prop == NULL) {
+            goto failed;
+        }
+
+        custom = prop;
+
+        (void) lexbor_str_init(&custom->name, parser->memory->mraw, length);
+        if (custom->name.data == NULL) {
+            goto failed;
+        }
+
+        memcpy(custom->name.data, name, length);
+
+        custom->name.length = length;
+        custom->name.data[custom->name.length] = 0x00;
+    }
+    else {
+        prop = entry->create(parser->memory);
+        if (prop == NULL) {
+            goto failed;
+        }
+    }
+
+    declar->type = entry->unique;
+    declar->u.user = prop;
+
+    if (out_entry != NULL) {
+        *out_entry = entry;
+    }
+
+    return declar;
+
+failed:
+
+    if (prop != NULL) {
+        (void) entry->destroy(parser->memory, prop, true);
+    }
+
+    if (declar != NULL) {
+        (void) lxb_css_rule_declaration_destroy(declar, true);
+    }
+
+    if (out_entry != NULL) {
+        *out_entry = NULL;
+    }
+
+    return NULL;
+}
+
+lxb_css_rule_declaration_list_t *
+lxb_css_declaration_list_parse(lxb_css_parser_t *parser,
+                               const lxb_char_t *data, size_t length)
+{
+    return lxb_css_syntax_parse_declarations(parser,
+                                             lxb_css_state_cb_declarations(),
+                                             data, length);
+}
diff --git a/ext/lexbor/lexbor/css/declaration.h b/ext/lexbor/lexbor/css/declaration.h
index 1ea414e10bc7..53ab061aaa4c 100644
--- a/ext/lexbor/lexbor/css/declaration.h
+++ b/ext/lexbor/lexbor/css/declaration.h
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2022 Alexander Borisov
+ * Copyright (C) 2022-2026 Alexander Borisov
  *
  * Author: Alexander Borisov 
  */
@@ -15,19 +15,14 @@ extern "C" {
 #include "lexbor/core/mraw.h"
 
 
-LXB_API lxb_status_t
-lxb_css_declaration_list_prepare(lxb_css_parser_t *parser,
-                                 lxb_css_memory_t *mem);
+LXB_API lxb_css_rule_declaration_t *
+lxb_css_declaration_create(lxb_css_parser_t *parser,
+                           const lxb_char_t *name, size_t length,
+                           const lxb_css_entry_data_t **out_entry);
 
-LXB_API lxb_css_rule_declaration_list_t *
-lxb_css_declaration_list_process(lxb_css_parser_t *parser,
-                                 const lxb_char_t *data, size_t length);
-
-LXB_API void
-lxb_css_declaration_list_finish(lxb_css_parser_t *parser);
 
 LXB_API lxb_css_rule_declaration_list_t *
-lxb_css_declaration_list_parse(lxb_css_parser_t *parser, lxb_css_memory_t *mem,
+lxb_css_declaration_list_parse(lxb_css_parser_t *parser,
                                const lxb_char_t *data, size_t length);
 
 
diff --git a/ext/lexbor/lexbor/css/log.c b/ext/lexbor/lexbor/css/log.c
index 08f6fc4fc5a1..d993e4715c62 100644
--- a/ext/lexbor/lexbor/css/log.c
+++ b/ext/lexbor/lexbor/css/log.c
@@ -152,7 +152,7 @@ lxb_css_log_format(lxb_css_log_t *log, lxb_css_log_type_t type,
         return NULL;
     }
 
-    msg = lxb_css_log_push(log, LXB_CSS_LOG_SYNTAX_ERROR, psize);
+    msg = lxb_css_log_push(log, type, psize);
     if (msg == NULL) {
         return NULL;
     }
diff --git a/ext/lexbor/lexbor/css/parser.c b/ext/lexbor/lexbor/css/parser.c
index 5ceffed0f970..625143864888 100644
--- a/ext/lexbor/lexbor/css/parser.c
+++ b/ext/lexbor/lexbor/css/parser.c
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2021 Alexander Borisov
+ * Copyright (C) 2021-2026 Alexander Borisov
  *
  * Author: Alexander Borisov 
  */
@@ -73,7 +73,6 @@ lxb_css_parser_init(lxb_css_parser_t *parser, lxb_css_syntax_tokenizer_t *tkz)
     parser->rules->context = NULL;
 
     /* Temp */
-    parser->pos = NULL;
     parser->str.length = 0;
     parser->str_size = 4096;
 
@@ -93,13 +92,35 @@ lxb_css_parser_init(lxb_css_parser_t *parser, lxb_css_syntax_tokenizer_t *tkz)
     parser->types_pos = NULL;
     parser->types_end = NULL;
     parser->stage = LXB_CSS_PARSER_CLEAN;
-    parser->receive_endings = false;
     parser->status = LXB_STATUS_OK;
     parser->fake_null = false;
+    parser->token_end.type = LXB_CSS_SYNTAX_TOKEN__END;
 
     return LXB_STATUS_OK;
 }
 
+lxb_status_t
+lxb_css_parser_selectors_init(lxb_css_parser_t *parser)
+{
+    lxb_status_t status;
+
+    parser->selectors = lxb_css_selectors_create();
+    status = lxb_css_selectors_init(parser->selectors);
+    if (status != LXB_STATUS_OK) {
+        parser->selectors = lxb_css_selectors_destroy(parser->selectors, true);
+    }
+
+    return status;
+}
+
+void
+lxb_css_parser_selectors_destroy(lxb_css_parser_t *parser)
+{
+    if (parser->selectors != NULL) {
+        parser->selectors = lxb_css_selectors_destroy(parser->selectors, true);
+    }
+}
+
 void
 lxb_css_parser_clean(lxb_css_parser_t *parser)
 {
@@ -111,7 +132,6 @@ lxb_css_parser_clean(lxb_css_parser_t *parser)
     parser->types_pos = parser->types_begin;
     parser->stage = LXB_CSS_PARSER_CLEAN;
     parser->status = LXB_STATUS_OK;
-    parser->pos = NULL;
     parser->str.length = 0;
     parser->fake_null = false;
 }
@@ -331,6 +351,14 @@ lxb_css_parser_unexpected_data_status(lxb_css_parser_t *parser,
     return LXB_STATUS_ERROR_UNEXPECTED_DATA;
 }
 
+void *
+lxb_css_parser_memory_fail_null(lxb_css_parser_t *parser)
+{
+    parser->status = LXB_STATUS_ERROR_MEMORY_ALLOCATION;
+    parser->loop = false;
+    return NULL;
+}
+
 bool
 lxb_css_parser_memory_fail(lxb_css_parser_t *parser)
 {
@@ -347,3 +375,189 @@ lxb_css_parser_memory_fail_status(lxb_css_parser_t *parser)
 
     return LXB_STATUS_ERROR_MEMORY_ALLOCATION;
 }
+
+/*
+ * No-inline functions for ABI.
+ */
+lxb_status_t
+lxb_css_parser_status_noi(lxb_css_parser_t *parser)
+{
+    return lxb_css_parser_status(parser);
+}
+
+lxb_css_memory_t *
+lxb_css_parser_memory_noi(lxb_css_parser_t *parser)
+{
+    return lxb_css_parser_memory(parser);
+}
+
+void
+lxb_css_parser_memory_set_noi(lxb_css_parser_t *parser, lxb_css_memory_t *memory)
+{
+    lxb_css_parser_memory_set(parser, memory);
+}
+
+lxb_css_selectors_t *
+lxb_css_parser_selectors_noi(lxb_css_parser_t *parser)
+{
+    return lxb_css_parser_selectors(parser);
+}
+
+void
+lxb_css_parser_selectors_set_noi(lxb_css_parser_t *parser,
+                                 lxb_css_selectors_t *selectors)
+{
+    lxb_css_parser_selectors_set(parser, selectors);
+}
+
+bool
+lxb_css_parser_is_running_noi(lxb_css_parser_t *parser)
+{
+    return lxb_css_parser_is_running(parser);
+}
+
+bool
+lxb_css_parser_status_is_unexpected_data_noi(lxb_css_parser_t *parser)
+{
+    return lxb_css_parser_status_is_unexpected_data(parser);
+}
+
+void
+lxb_css_parser_failed_set_noi(lxb_css_parser_t *parser, bool is)
+{
+    lxb_css_parser_failed_set(parser, is);
+}
+
+void
+lxb_css_parser_failed_set_by_id_noi(lxb_css_parser_t *parser, int idx, bool is)
+{
+    lxb_css_parser_failed_set_by_id(parser, idx, is);
+}
+
+bool
+lxb_css_parser_is_failed_noi(lxb_css_parser_t *parser)
+{
+    return lxb_css_parser_is_failed(parser);
+}
+
+void
+lxb_css_parser_set_ok_noi(lxb_css_parser_t *parser)
+{
+    lxb_css_parser_set_ok(parser);
+}
+
+const lxb_char_t *
+lxb_css_parser_buffer_noi(lxb_css_parser_t *parser, size_t *length)
+{
+    return lxb_css_parser_buffer(parser, length);
+}
+
+void
+lxb_css_parser_buffer_set_noi(lxb_css_parser_t *parser,
+                              const lxb_char_t *data, size_t length)
+{
+    lxb_css_parser_buffer_set(parser, data, length);
+}
+
+lxb_css_parser_state_f
+lxb_css_parser_state_noi(lxb_css_parser_t *parser)
+{
+    return lxb_css_parser_state(parser);
+}
+
+void
+lxb_css_parser_state_set_noi(lxb_css_parser_t *parser, lxb_css_parser_state_f state)
+{
+    lxb_css_parser_state_set(parser, state);
+}
+
+lxb_css_syntax_rule_t *
+lxb_css_parser_current_rule_noi(lxb_css_parser_t *parser)
+{
+    return lxb_css_parser_current_rule(parser);
+}
+
+size_t
+lxb_css_parser_rule_deep_noi(lxb_css_parser_t *parser)
+{
+    return lxb_css_parser_rule_deep(parser);
+}
+
+lxb_css_parser_state_t *
+lxb_css_parser_states_pop_noi(lxb_css_parser_t *parser)
+{
+    return lxb_css_parser_states_pop(parser);
+}
+
+lxb_css_parser_state_t *
+lxb_css_parser_states_to_root_noi(lxb_css_parser_t *parser)
+{
+    return lxb_css_parser_states_to_root(parser);
+}
+
+bool
+lxb_css_parser_states_set_back_noi(lxb_css_parser_t *parser)
+{
+    return lxb_css_parser_states_set_back(parser);
+}
+
+void
+lxb_css_parser_states_clean_noi(lxb_css_parser_t *parser)
+{
+    lxb_css_parser_states_clean(parser);
+}
+
+lxb_css_parser_state_t *
+lxb_css_parser_states_current_noi(lxb_css_parser_t *parser)
+{
+    return lxb_css_parser_states_current(parser);
+}
+
+void
+lxb_css_parser_states_set_noi(lxb_css_parser_state_t *states,
+                              lxb_css_parser_state_f state, void *context)
+{
+    lxb_css_parser_states_set(states, state, context);
+}
+
+void
+lxb_css_parser_states_up_noi(lxb_css_parser_t *parser)
+{
+    lxb_css_parser_states_up(parser);
+}
+
+void
+lxb_css_parser_states_down_noi(lxb_css_parser_t *parser)
+{
+    lxb_css_parser_states_down(parser);
+}
+
+lxb_css_log_t *
+lxb_css_parser_log_noi(lxb_css_parser_t *parser)
+{
+    return lxb_css_parser_log(parser);
+}
+
+const lxb_css_syntax_token_t *
+lxb_css_parser_token_end_noi(lxb_css_parser_t *parser, size_t offset)
+{
+    return lxb_css_parser_token_end(parser, offset);
+}
+
+void
+lxb_css_parser_set_context_noi(lxb_css_parser_t *parser, void *ctx)
+{
+    lxb_css_parser_set_context(parser, ctx);
+}
+
+void
+lxb_css_syntax_set_return_noi(lxb_css_parser_t *parser, void *value)
+{
+    lxb_css_syntax_set_return(parser, value);
+}
+
+void *
+lxb_css_syntax_returned_noi(lxb_css_parser_t *parser)
+{
+    return lxb_css_syntax_returned(parser);
+}
diff --git a/ext/lexbor/lexbor/css/parser.h b/ext/lexbor/lexbor/css/parser.h
index 9a4dfae0b702..d703dcc2f13d 100644
--- a/ext/lexbor/lexbor/css/parser.h
+++ b/ext/lexbor/lexbor/css/parser.h
@@ -1,6 +1,5 @@
 /*
-
- * Copyright (C) 2021-2022 Alexander Borisov
+ * Copyright (C) 2021-2026 Alexander Borisov
  *
  * Author: Alexander Borisov 
  */
@@ -70,7 +69,6 @@ extern "C" {
     }                                                                          \
     while (false)
 
-
 #define lxb_css_parser_token_status_wo_ws_m(parser, token)                     \
     do {                                                                       \
         if ((token = lxb_css_syntax_parser_token(parser)) == NULL) {           \
@@ -129,49 +127,44 @@ typedef enum {
 lxb_css_parser_stage_t;
 
 struct lxb_css_parser {
-    lxb_css_parser_state_f           block;
-    void                             *context;
-
     /* Modules */
-    lxb_css_syntax_tokenizer_t       *tkz;
-    lxb_css_selectors_t              *selectors;
-    lxb_css_selectors_t              *old_selectors;
+    lxb_css_syntax_tokenizer_t          *tkz;
+    lxb_css_selectors_t                 *selectors;
 
     /* Memory for all structures. */
-    lxb_css_memory_t                 *memory;
-    lxb_css_memory_t                 *old_memory;
+    lxb_css_memory_t                    *memory;
 
     /* Syntax parse rules. */
-    lxb_css_syntax_rule_t            *rules_begin;
-    lxb_css_syntax_rule_t            *rules_end;
-    lxb_css_syntax_rule_t            *rules;
+    lxb_css_syntax_rule_t               *rules_begin;
+    lxb_css_syntax_rule_t               *rules_end;
+    lxb_css_syntax_rule_t               *rules;
 
     /* States */
-    lxb_css_parser_state_t           *states_begin;
-    lxb_css_parser_state_t           *states_end;
-    lxb_css_parser_state_t           *states;
+    lxb_css_parser_state_t              *states_begin;
+    lxb_css_parser_state_t              *states_end;
+    lxb_css_parser_state_t              *states;
 
     /* Types */
-    lxb_css_syntax_token_type_t      *types_begin;
-    lxb_css_syntax_token_type_t      *types_end;
-    lxb_css_syntax_token_type_t      *types_pos;
+    lxb_css_syntax_token_type_t         *types_begin;
+    lxb_css_syntax_token_type_t         *types_end;
+    lxb_css_syntax_token_type_t         *types_pos;
 
-    const lxb_char_t                 *pos;
-    uintptr_t                        offset;
+    lxb_css_syntax_token_t              token_end;
 
-    lexbor_str_t                     str;
-    size_t                           str_size;
+    lexbor_str_t                        str;
+    size_t                              str_size;
 
-    lxb_css_log_t                    *log;
+    lxb_css_log_t                       *log;
 
-    lxb_css_parser_stage_t           stage;
+    lxb_css_parser_stage_t              stage;
 
-    bool                             loop;
-    bool                             fake_null;
-    bool                             my_tkz;
-    bool                             receive_endings;
+    lxb_css_syntax_declaration_offset_t offset;
 
-    lxb_status_t                     status;
+    bool                                loop;
+    bool                                fake_null;
+    bool                                my_tkz;
+
+    lxb_status_t                        status;
 };
 
 struct lxb_css_parser_state {
@@ -185,47 +178,197 @@ struct lxb_css_parser_error {
 };
 
 
+/*
+ * Create a new CSS parser object.
+ *
+ * @return lxb_css_parser_t* if successful, otherwise NULL.
+ */
 LXB_API lxb_css_parser_t *
 lxb_css_parser_create(void);
 
+/*
+ * Initialize the CSS parser with a tokenizer.
+ *
+ * @param[in] parser Required. The CSS parser object.
+ *                   If NULL, the function returns
+ *                   LXB_STATUS_ERROR_OBJECT_IS_NULL.
+ * @param[in] tkz    Optional. The tokenizer object.
+ *                   If NULL, a new tokenizer will be created and used.
+ *                   (In that case the parser manages the tokenizer lifetime.)
+ *
+ * @return LXB_STATUS_OK if successful, otherwise an error status value.
+ */
 LXB_API lxb_status_t
 lxb_css_parser_init(lxb_css_parser_t *parser, lxb_css_syntax_tokenizer_t *tkz);
 
+/*
+ * Initialize the Selectors module in the parser.
+ *
+ * Note:
+ *   Be sure to destroy the Selectors object you created yourself using
+ *   the lxb_css_parser_selectors_destroy() function.
+ *
+ * @param[in] parser Required. The CSS parser object.
+ *
+ * @return LXB_STATUS_OK if successful, otherwise an error status value.
+ */
+LXB_API lxb_status_t
+lxb_css_parser_selectors_init(lxb_css_parser_t *parser);
+
+/*
+ * Destroy the selectors module in the parser.
+ *
+ * @param[in] parser Required. The CSS parser object.
+ */
+LXB_API void
+lxb_css_parser_selectors_destroy(lxb_css_parser_t *parser);
+
+/*
+ * Clean the parser object.
+ *
+ * This resets internal parser state, but keeps allocated memory so the parser
+ * can be reused.
+ *
+ * @param[in] parser Required. The CSS parser object.
+ */
 LXB_API void
 lxb_css_parser_clean(lxb_css_parser_t *parser);
 
+/*
+ * Erase the parser object.
+ *
+ * This resets internal parser state and releases internal allocations owned by
+ * the parser so it can be re-initialized.
+ *
+ * @param[in] parser Required. The CSS parser object.
+ */
 LXB_API void
 lxb_css_parser_erase(lxb_css_parser_t *parser);
 
+/*
+ * Destroy the parser object.
+ *
+ * @param[in] parser        Optional. The CSS parser object.
+ *                          If NULL, the function returns NULL.
+ * @param[in] self_destroy  Optional flag.
+ *                          If true, also frees the parser object itself.
+ *                          If false, only inner resources are freed and the
+ *                          parser object remains valid.
+ *
+ * @return parser if self_destroy is false, otherwise NULL.
+ */
 LXB_API lxb_css_parser_t *
 lxb_css_parser_destroy(lxb_css_parser_t *parser, bool self_destroy);
 
-LXB_API lxb_css_parser_state_t *
-lxb_css_parser_states_push(lxb_css_parser_t *parser,
-                           lxb_css_parser_state_f state,
-                           void *context, bool stop);
-
-LXB_API lxb_css_parser_state_t *
-lxb_css_parser_states_next(lxb_css_parser_t *parser,
-                           lxb_css_parser_state_f next,
-                           lxb_css_parser_state_f back, void *ctx, bool root);
-
-LXB_API lxb_status_t
-lxb_css_parser_types_push(lxb_css_parser_t *parser,
-                          lxb_css_syntax_token_type_t type);
-
+/*
+ * Stop the parser main loop.
+ *
+ * This is a helper for state callbacks that want to immediately stop parsing
+ * without marking the current rule as failed.
+ *
+ * @param[in] parser Required. The CSS parser object.
+ *
+ * @return true (convenience return value, useful for state callbacks).
+ */
 LXB_API bool
 lxb_css_parser_stop(lxb_css_parser_t *parser);
 
+/*
+ * Fail the parser with a status and stop the main loop.
+ *
+ * This is used for hard errors (OOM, overflow, etc.). It sets parser->status
+ * and stops the parser loop.
+ *
+ * @param[in] parser  Required. The CSS parser object.
+ * @param[in] status  Required. Status code describing the failure.
+ *
+ * @return true (convenience return value, useful for state callbacks).
+ */
 LXB_API bool
 lxb_css_parser_fail(lxb_css_parser_t *parser, lxb_status_t status);
 
+/*
+ * Mark the current token as unexpected.
+ *
+ * This is a specialized helper for the common "unexpected data" parse error.
+ * It sets parser->status to LXB_STATUS_ERROR_UNEXPECTED_DATA and marks the
+ * current rule as failed.
+ *
+ * @param[in] parser Required. The CSS parser object.
+ *
+ * @return true (convenience return value, useful for state callbacks).
+ */
 LXB_API bool
 lxb_css_parser_unexpected(lxb_css_parser_t *parser);
 
+/*
+ * Mark parsing of the current grammar/rule as successful.
+ *
+ * Why this function exists:
+ * - Most callbacks in the CSS parser work as a state machine: each callback
+ *   receives the current token and returns bool to decide what to do next.
+ * - "Success" is not just a bool. The parser must switch to a special
+ *   lxb_css_state_success state to properly handle trailing whitespace and
+ *   the end-of-input token.
+ * - If you don't consume all tokens up to LXB_CSS_SYNTAX_TOKEN__END in the
+ *   current rule and call this function, the parser will switch to "failed"
+ *   mode. This is the same as calling the lxb_css_parser_failed() function.
+ *   The exception is the LXB_CSS_SYNTAX_TOKEN_WHITESPACE token. If you are
+ *   sure that only this token remains, the parser will simply exclude it.
+ *
+ * What it does:
+ * - Sets the current rule state to lxb_css_state_success.
+ * - Does not stop the parser loop by itself.
+ *
+ * Typical usage:
+ * - In css/property/state.c, after you have parsed and consumed the last token
+ *   of a property value, you do:
+ *   return lxb_css_parser_success(parser);
+ * - That transfers control to lxb_css_state_success, which consumes any
+ *   whitespace and completes on LXB_CSS_SYNTAX_TOKEN__END.
+ *
+ * @param[in] parser Required. The CSS parser object.
+ *
+ * @return true (convenience return value, useful for state callbacks).
+ */
 LXB_API bool
 lxb_css_parser_success(lxb_css_parser_t *parser);
 
+/*
+ * Mark parsing of the current grammar/rule as failed.
+ *
+ * Why this function exists:
+ * - In the state machine, failure is also not "just return false". The parser
+ *   needs to switch to a rule-specific recovery state so it can safely skip
+ *   input until it is allowed to stop (usually until end-of-input or a known
+ *   synchronisation point).
+ *
+ * What it does:
+ * - Sets the current rule state to the rule-specific "failed" handler
+ *   (rule->cbx.cb->failed).
+ * - Sets rule->failed = true.
+ * - Does not directly change parser->status. Use lxb_css_parser_fail() or
+ *   lxb_css_parser_unexpected() when you need a concrete status code.
+ *
+ * Typical usage:
+ * - In css/property/state.c, if a token doesn't match the expected grammar,
+ *   you do:
+ *   return lxb_css_parser_failed(parser);
+ * - That switches the parser into the failed handler. For properties this lets
+ *   the parser consume/skip tokens until it reaches LXB_CSS_SYNTAX_TOKEN__END.
+ *   (See lxb_css_state_failed(): it consumes tokens until end, then calls
+ *   lxb_css_parser_success() to finish.)
+ *
+ * Important!
+ *   The user sets the callback to "failed" and must decide what to do in this
+ *   situation. If the user does not consume all tokens before
+ *   LXB_CSS_SYNTAX_TOKEN__END, there will be an infinite loop.
+ *
+ * @param[in] parser Required. The CSS parser object.
+ *
+ * @return true (convenience return value, useful for state callbacks).
+ */
+
 LXB_API bool
 lxb_css_parser_failed(lxb_css_parser_t *parser);
 
@@ -240,12 +383,64 @@ LXB_API lxb_status_t
 lxb_css_parser_unexpected_data_status(lxb_css_parser_t *parser,
                                       const lxb_css_syntax_token_t *token);
 
+LXB_API void *
+lxb_css_parser_memory_fail_null(lxb_css_parser_t *parser);
+
 LXB_API bool
 lxb_css_parser_memory_fail(lxb_css_parser_t *parser);
 
-lxb_status_t
+LXB_API lxb_status_t
 lxb_css_parser_memory_fail_status(lxb_css_parser_t *parser);
 
+/*
+ * Push a new state to the parser.
+ *
+ * @param[in] parser   Required. The CSS parser object.
+ * @param[in] state    Required. State callback to execute.
+ * @param[in] context  Optional user pointer associated with this state.
+ *                     Stored as-is; the parser doesn't own it.
+ * @param[in] stop     If true, the pushed state is marked as a "stop point".
+ *                     This is used by the parser to stop/return control when
+ *                     this state is reached.
+ *
+ * @return lxb_css_parser_state_t* if successful, otherwise NULL.
+ */
+LXB_API lxb_css_parser_state_t *
+lxb_css_parser_states_push(lxb_css_parser_t *parser,
+                           lxb_css_parser_state_f state,
+                           void *context, bool stop);
+
+/*
+ * Go to the next state in the parser.
+ *
+ * @param[in] parser  Required. The CSS parser object.
+ * @param[in] next    Required. Next state callback.
+ * @param[in] back    Required. State callback to return to.
+ * @param[in] ctx     Optional user pointer for the next state.
+ *                    Stored as-is; the parser doesn't own it.
+ * @param[in] root    If true, marks this state as a "root" state. Root states
+ *                    are used by helper functions (e.g. to rewind to root).
+ *
+ * @return lxb_css_parser_state_t* if successful, otherwise NULL.
+ */
+LXB_API lxb_css_parser_state_t *
+lxb_css_parser_states_next(lxb_css_parser_t *parser,
+                           lxb_css_parser_state_f next,
+                           lxb_css_parser_state_f back, void *ctx, bool root);
+
+/*
+ * Push a token type to the parser.
+ *
+ * @param[in] parser Required. The CSS parser object.
+ * @param[in] type   Required. Token type to push.
+ *
+ * @return LXB_STATUS_OK if successful, otherwise an error status value.
+ */
+LXB_API lxb_status_t
+lxb_css_parser_types_push(lxb_css_parser_t *parser,
+                          lxb_css_syntax_token_type_t type);
+
+
 /*
  * Inline functions
  */
@@ -350,32 +545,6 @@ lxb_css_parser_state_set(lxb_css_parser_t *parser, lxb_css_parser_state_f state)
     parser->rules->state = state;
 }
 
-lxb_inline void
-lxb_css_parser_state_block_set(lxb_css_parser_t *parser,
-                               lxb_css_parser_state_f state)
-{
-    parser->block = state;
-}
-
-lxb_inline void
-lxb_css_parser_state_value_set(lxb_css_parser_t *parser,
-                               lxb_css_parser_state_f state)
-{
-    lxb_css_parser_state_block_set(parser, state);
-}
-
-lxb_inline void *
-lxb_css_parser_context(lxb_css_parser_t *parser)
-{
-    return parser->context;
-}
-
-lxb_inline void
-lxb_css_parser_context_set(lxb_css_parser_t *parser, void *context)
-{
-    parser->context = context;
-}
-
 lxb_inline lxb_css_syntax_rule_t *
 lxb_css_parser_current_rule(lxb_css_parser_t *parser)
 {
@@ -420,13 +589,6 @@ lxb_css_parser_states_set_back(lxb_css_parser_t *parser)
     return true;
 }
 
-lxb_inline void
-lxb_css_parser_states_change_back(lxb_css_parser_t *parser,
-                                  lxb_css_parser_state_f state)
-{
-    parser->rules->state_back = state;
-}
-
 lxb_inline void
 lxb_css_parser_states_clean(lxb_css_parser_t *parser)
 {
@@ -465,47 +627,127 @@ lxb_css_parser_log(lxb_css_parser_t *parser)
     return parser->log;
 }
 
-lxb_inline void
-lxb_css_parser_offset_set(lxb_css_parser_t *parser,
-                          const lxb_css_syntax_token_t *token)
+lxb_inline const lxb_css_syntax_token_t *
+lxb_css_parser_token_end(lxb_css_parser_t *parser, size_t offset)
 {
-    if (parser->pos == NULL) {
-        if (token == NULL) {
-            parser->pos = parser->tkz->in_begin;
-            parser->offset = 0;
-        }
-        else {
-            parser->pos = lxb_css_syntax_token_base(token)->begin
-                          + lxb_css_syntax_token_base(token)->length;
-            parser->offset = token->offset + lxb_css_syntax_token_base(token)->length;
-        }
-    }
+    parser->token_end.offset = offset;
+    return &parser->token_end;
 }
 
-lxb_inline const lxb_css_syntax_list_rules_offset_t *
-lxb_css_parser_list_rules_offset(lxb_css_parser_t *parser)
+lxb_inline void
+lxb_css_parser_set_context(lxb_css_parser_t *parser, void *ctx)
 {
-    return &parser->rules->u.list_rules;
+    parser->rules->context = ctx;
 }
 
-lxb_inline const lxb_css_syntax_at_rule_offset_t *
-lxb_css_parser_at_rule_offset(lxb_css_parser_t *parser)
+lxb_inline void
+lxb_css_syntax_set_return(lxb_css_parser_t *parser, void *value)
 {
-    return &parser->rules->u.at_rule;
+    parser->rules[-1].returned = value;
 }
 
-lxb_inline const lxb_css_syntax_qualified_offset_t *
-lxb_css_parser_qualified_rule_offset(lxb_css_parser_t *parser)
+lxb_inline void *
+lxb_css_syntax_returned(lxb_css_parser_t *parser)
 {
-    return &parser->rules->u.qualified;
+    return parser->rules->returned;
 }
 
-lxb_inline const lxb_css_syntax_declarations_offset_t *
-lxb_css_parser_declarations_offset(lxb_css_parser_t *parser)
-{
-    return &parser->rules->u.declarations;
-}
+/*
+ * No-inline functions for ABI.
+ */
+LXB_API lxb_status_t
+lxb_css_parser_status_noi(lxb_css_parser_t *parser);
+
+LXB_API lxb_css_memory_t *
+lxb_css_parser_memory_noi(lxb_css_parser_t *parser);
+
+LXB_API void
+lxb_css_parser_memory_set_noi(lxb_css_parser_t *parser, lxb_css_memory_t *memory);
+
+LXB_API lxb_css_selectors_t *
+lxb_css_parser_selectors_noi(lxb_css_parser_t *parser);
+
+LXB_API void
+lxb_css_parser_selectors_set_noi(lxb_css_parser_t *parser,
+                                 lxb_css_selectors_t *selectors);
+
+LXB_API bool
+lxb_css_parser_is_running_noi(lxb_css_parser_t *parser);
+
+LXB_API bool
+lxb_css_parser_status_is_unexpected_data_noi(lxb_css_parser_t *parser);
+
+LXB_API void
+lxb_css_parser_failed_set_noi(lxb_css_parser_t *parser, bool is);
+
+LXB_API void
+lxb_css_parser_failed_set_by_id_noi(lxb_css_parser_t *parser, int idx, bool is);
+
+LXB_API bool
+lxb_css_parser_is_failed_noi(lxb_css_parser_t *parser);
+
+LXB_API void
+lxb_css_parser_set_ok_noi(lxb_css_parser_t *parser);
+
+LXB_API const lxb_char_t *
+lxb_css_parser_buffer_noi(lxb_css_parser_t *parser, size_t *length);
+
+LXB_API void
+lxb_css_parser_buffer_set_noi(lxb_css_parser_t *parser,
+                              const lxb_char_t *data, size_t length);
+
+LXB_API lxb_css_parser_state_f
+lxb_css_parser_state_noi(lxb_css_parser_t *parser);
+
+LXB_API void
+lxb_css_parser_state_set_noi(lxb_css_parser_t *parser,
+                             lxb_css_parser_state_f state);
+
+LXB_API lxb_css_syntax_rule_t *
+lxb_css_parser_current_rule_noi(lxb_css_parser_t *parser);
+
+LXB_API size_t
+lxb_css_parser_rule_deep_noi(lxb_css_parser_t *parser);
+
+LXB_API lxb_css_parser_state_t *
+lxb_css_parser_states_pop_noi(lxb_css_parser_t *parser);
+
+LXB_API lxb_css_parser_state_t *
+lxb_css_parser_states_to_root_noi(lxb_css_parser_t *parser);
+
+LXB_API bool
+lxb_css_parser_states_set_back_noi(lxb_css_parser_t *parser);
+
+LXB_API void
+lxb_css_parser_states_clean_noi(lxb_css_parser_t *parser);
+
+LXB_API lxb_css_parser_state_t *
+lxb_css_parser_states_current_noi(lxb_css_parser_t *parser);
+
+LXB_API void
+lxb_css_parser_states_set_noi(lxb_css_parser_state_t *states,
+                              lxb_css_parser_state_f state, void *context);
+
+LXB_API void
+lxb_css_parser_states_up_noi(lxb_css_parser_t *parser);
+
+LXB_API void
+lxb_css_parser_states_down_noi(lxb_css_parser_t *parser);
+
+LXB_API lxb_css_log_t *
+lxb_css_parser_log_noi(lxb_css_parser_t *parser);
+
+LXB_API const lxb_css_syntax_token_t *
+lxb_css_parser_token_end_noi(lxb_css_parser_t *parser, size_t offset);
+
+LXB_API void
+lxb_css_parser_set_context_noi(lxb_css_parser_t *parser, void *ctx);
+
+LXB_API void
+lxb_css_syntax_set_return_noi(lxb_css_parser_t *parser, void *value);
 
+LXB_API void *
+lxb_css_syntax_returned_noi(lxb_css_parser_t *parser);
 
 #ifdef __cplusplus
 } /* extern "C" */
diff --git a/ext/lexbor/lexbor/css/property.c b/ext/lexbor/lexbor/css/property.c
new file mode 100644
index 000000000000..6e460c3492f8
--- /dev/null
+++ b/ext/lexbor/lexbor/css/property.c
@@ -0,0 +1,3171 @@
+/*
+ * Copyright (C) 2021-2023 Alexander Borisov
+ *
+ * Author: Alexander Borisov 
+ */
+
+#include "lexbor/css/css.h"
+#include "lexbor/css/property.h"
+#include "lexbor/css/parser.h"
+#include "lexbor/css/stylesheet.h"
+#include "lexbor/css/property/state.h"
+#include "lexbor/css/property/res.h"
+#include "lexbor/core/serialize.h"
+#include "lexbor/core/conv.h"
+
+
+const lxb_css_entry_data_t *
+lxb_css_property_by_name(const lxb_char_t *name, size_t length)
+{
+    const lexbor_shs_entry_t *entry;
+
+    entry = lexbor_shs_entry_get_lower_static(lxb_css_property_shs,
+                                              name, length);
+    if (entry == NULL) {
+        return NULL;
+    }
+
+    return entry->value;
+}
+
+const lxb_css_entry_data_t *
+lxb_css_property_by_id(uintptr_t id)
+{
+    return &lxb_css_property_data[id];
+}
+
+const void *
+lxb_css_property_initial_by_id(uintptr_t id)
+{
+    if (id >= LXB_CSS_PROPERTY__LAST_ENTRY) {
+        return NULL;
+    }
+
+    return lxb_css_property_data[id].initial;
+}
+
+void *
+lxb_css_property_destroy(lxb_css_memory_t *memory, void *style,
+                         lxb_css_property_type_t type, bool self_destroy)
+{
+    const lxb_css_entry_data_t *data;
+
+    data = lxb_css_property_by_id(type);
+    if (data == NULL) {
+        return style;
+    }
+
+    return data->destroy(memory, style, self_destroy);
+}
+
+lxb_status_t
+lxb_css_property_serialize(const void *style, lxb_css_property_type_t type,
+                           lexbor_serialize_cb_f cb, void *ctx)
+{
+    const lxb_css_entry_data_t *data;
+
+    data = lxb_css_property_by_id(type);
+    if (data == NULL) {
+        return LXB_STATUS_ERROR_NOT_EXISTS;
+    }
+
+    return data->serialize(style, cb, ctx);
+}
+
+lxb_status_t
+lxb_css_property_serialize_str(const void *style, lxb_css_property_type_t type,
+                               lexbor_mraw_t *mraw, lexbor_str_t *str)
+{
+    const lxb_css_entry_data_t *data;
+
+    data = lxb_css_property_by_id(type);
+    if (data == NULL) {
+        return LXB_STATUS_ERROR_NOT_EXISTS;
+    }
+
+    return lxb_css_serialize_str_handler(style, str, mraw, data->serialize);
+}
+
+lxb_status_t
+lxb_css_property_serialize_name(const void *style, lxb_css_property_type_t type,
+                                lexbor_serialize_cb_f cb, void *ctx)
+{
+    const lxb_css_entry_data_t *data;
+
+    switch (type) {
+        case LXB_CSS_PROPERTY__UNDEF:
+            return lxb_css_property__undef_serialize_name(style, cb, ctx);
+
+        case LXB_CSS_PROPERTY__CUSTOM:
+            return lxb_css_property__custom_serialize_name(style, cb, ctx);
+
+        default:
+            break;
+    }
+
+    data = lxb_css_property_by_id(type);
+    if (data == NULL) {
+        return LXB_STATUS_ERROR_NOT_EXISTS;
+    }
+
+    return cb(data->name, data->length, ctx);
+}
+
+lxb_status_t
+lxb_css_property_serialize_name_str(const void *style, lxb_css_property_type_t type,
+                                    lexbor_mraw_t *mraw, lexbor_str_t *str)
+{
+    const lxb_css_entry_data_t *data;
+
+    switch (type) {
+        case LXB_CSS_PROPERTY__UNDEF:
+            return lxb_css_serialize_str_handler(style, str, mraw,
+                                       lxb_css_property__undef_serialize_name);
+
+        case LXB_CSS_PROPERTY__CUSTOM:
+            return lxb_css_serialize_str_handler(style, str, mraw,
+                                      lxb_css_property__custom_serialize_name);
+
+        default:
+            break;
+    }
+
+    data = lxb_css_property_by_id(type);
+    if (data == NULL) {
+        return LXB_STATUS_ERROR_NOT_EXISTS;
+    }
+
+    if (str->data == NULL) {
+        lexbor_str_init(str, mraw, data->length);
+        if (str->data == NULL) {
+            return LXB_STATUS_ERROR_MEMORY_ALLOCATION;
+        }
+    }
+
+    (void) lexbor_str_append(str, mraw, data->name, data->length);
+
+    return LXB_STATUS_OK;
+}
+
+/* _undef. */
+
+void *
+lxb_css_property__undef_create(lxb_css_memory_t *memory)
+{
+    return lexbor_mraw_calloc(memory->mraw, sizeof(lxb_css_property__undef_t));
+}
+
+void *
+lxb_css_property__undef_destroy(lxb_css_memory_t *memory,
+                                void *style, bool self_destroy)
+{
+    if (style == NULL) {
+        return NULL;
+    }
+
+    if (self_destroy) {
+        return lexbor_mraw_free(memory->mraw, style);
+    }
+
+    return style;
+}
+
+lxb_status_t
+lxb_css_property__undef_serialize(const void *style,
+                                  lexbor_serialize_cb_f cb, void *ctx)
+{
+    const lxb_css_property__undef_t *undef = style;
+
+    return cb(undef->value.data, undef->value.length, ctx);
+}
+
+lxb_status_t
+lxb_css_property__undef_serialize_name(const void *style,
+                                       lexbor_serialize_cb_f cb, void *ctx)
+{
+    const lxb_css_property__undef_t *undef = style;
+    const lxb_css_entry_data_t *data;
+
+    if (undef->type == LXB_CSS_PROPERTY__UNDEF) {
+        return LXB_STATUS_OK;
+    }
+
+    data = lxb_css_property_by_id(undef->type);
+    if (data == NULL) {
+        return LXB_STATUS_ERROR_NOT_EXISTS;
+    }
+
+    return cb(data->name, data->length, ctx);
+}
+
+lxb_status_t
+lxb_css_property__undef_serialize_value(const void *style,
+                                        lexbor_serialize_cb_f cb, void *ctx)
+{
+    const lxb_css_property__undef_t *undef = style;
+
+    if (undef->type == LXB_CSS_PROPERTY__UNDEF) {
+        return cb(undef->value.data, undef->value.length, ctx);
+    }
+
+    return LXB_STATUS_OK;
+}
+
+/* _custom. */
+
+void *
+lxb_css_property__custom_create(lxb_css_memory_t *memory)
+{
+    return lexbor_mraw_calloc(memory->mraw, sizeof(lxb_css_property__custom_t));
+}
+
+void *
+lxb_css_property__custom_destroy(lxb_css_memory_t *memory,
+                                 void *style, bool self_destroy)
+{
+    if (style == NULL) {
+        return NULL;
+    }
+
+    if (self_destroy) {
+        return lexbor_mraw_free(memory->mraw, style);
+    }
+
+    return style;
+}
+
+lxb_status_t
+lxb_css_property__custom_serialize(const void *style,
+                                   lexbor_serialize_cb_f cb, void *ctx)
+{
+    const lxb_css_property__custom_t *custom = style;
+
+    if (custom->value.data == NULL) {
+        return LXB_STATUS_OK;
+    }
+
+    return cb(custom->value.data, custom->value.length, ctx);
+}
+
+lxb_status_t
+lxb_css_property__custom_serialize_name(const void *style,
+                                        lexbor_serialize_cb_f cb, void *ctx)
+{
+    const lxb_css_property__custom_t *custom = style;
+
+    return cb(custom->name.data, custom->name.length, ctx);
+}
+
+lxb_status_t
+lxb_css_property__custom_serialize_value(const void *style,
+                                         lexbor_serialize_cb_f cb, void *ctx)
+{
+    const lxb_css_property__custom_t *custom = style;
+
+    if (custom->value.data == NULL) {
+        return LXB_STATUS_OK;
+    }
+
+    return cb(custom->value.data, custom->value.length, ctx);
+}
+
+/* Display. */
+
+void *
+lxb_css_property_display_create(lxb_css_memory_t *memory)
+{
+    return lexbor_mraw_calloc(memory->mraw, sizeof(lxb_css_property_display_t));
+}
+
+void *
+lxb_css_property_display_destroy(lxb_css_memory_t *memory,
+                                 void *property, bool self_destroy)
+{
+    return lxb_css_property__undef_destroy(memory, property, self_destroy);
+}
+
+lxb_status_t
+lxb_css_property_display_serialize(const void *property,
+                                   lexbor_serialize_cb_f cb, void *ctx)
+{
+    lxb_status_t status;
+    const lxb_css_data_t *data;
+    const lxb_css_property_display_t *display = property;
+
+    static const lexbor_str_t str_ws = lexbor_str(" ");
+
+    data = lxb_css_value_by_id(display->a);
+    if (data == NULL) {
+        return LXB_STATUS_ERROR_NOT_EXISTS;
+    }
+
+    lexbor_serialize_write(cb, data->name, data->length, ctx, status);
+
+    if (display->b == LXB_CSS_PROPERTY__UNDEF) {
+        return LXB_STATUS_OK;
+    }
+
+    lexbor_serialize_write(cb, str_ws.data, str_ws.length, ctx, status);
+
+    data = lxb_css_value_by_id(display->b);
+    if (data == NULL) {
+        return LXB_STATUS_ERROR_NOT_EXISTS;
+    }
+
+    lexbor_serialize_write(cb, data->name, data->length, ctx, status);
+
+    if (display->c == LXB_CSS_PROPERTY__UNDEF) {
+        return LXB_STATUS_OK;
+    }
+
+    lexbor_serialize_write(cb, str_ws.data, str_ws.length, ctx, status);
+
+    data = lxb_css_value_by_id(display->c);
+    if (data == NULL) {
+        return LXB_STATUS_ERROR_NOT_EXISTS;
+    }
+
+    lexbor_serialize_write(cb, data->name, data->length, ctx, status);
+
+    return LXB_STATUS_OK;
+}
+
+/* Order. */
+
+void *
+lxb_css_property_order_create(lxb_css_memory_t *memory)
+{
+    return lexbor_mraw_calloc(memory->mraw, sizeof(lxb_css_property_order_t));
+}
+
+void *
+lxb_css_property_order_destroy(lxb_css_memory_t *memory,
+                               void *style, bool self_destroy)
+{
+    return lxb_css_property__undef_destroy(memory, style, self_destroy);
+}
+
+lxb_status_t
+lxb_css_property_order_serialize(const void *style,
+                                 lexbor_serialize_cb_f cb, void *ctx)
+{
+    return lxb_css_value_integer_type_sr(style, cb, ctx);
+}
+
+/* Visibility. */
+
+void *
+lxb_css_property_visibility_create(lxb_css_memory_t *memory)
+{
+    return lexbor_mraw_calloc(memory->mraw,
+                              sizeof(lxb_css_property_visibility_t));
+}
+
+void *
+lxb_css_property_visibility_destroy(lxb_css_memory_t *memory,
+                                    void *style, bool self_destroy)
+{
+    return lxb_css_property__undef_destroy(memory, style, self_destroy);
+}
+
+lxb_status_t
+lxb_css_property_visibility_serialize(const void *style,
+                                      lexbor_serialize_cb_f cb, void *ctx)
+{
+    const lxb_css_property_visibility_t *vb = style;
+
+    return lxb_css_value_serialize(vb->type, cb, ctx);
+}
+
+/* Width. */
+
+void *
+lxb_css_property_width_create(lxb_css_memory_t *memory)
+{
+    return lexbor_mraw_calloc(memory->mraw, sizeof(lxb_css_property_width_t));
+}
+
+void *
+lxb_css_property_width_destroy(lxb_css_memory_t *memory,
+                               void *property, bool self_destroy)
+{
+    return lxb_css_property__undef_destroy(memory, property, self_destroy);
+}
+
+lxb_status_t
+lxb_css_property_width_serialize(const void *property,
+                                 lexbor_serialize_cb_f cb, void *ctx)
+{
+    const lxb_css_property_width_t *width = property;
+
+    switch (width->type) {
+        case LXB_CSS_VALUE__LENGTH:
+        case LXB_CSS_VALUE__NUMBER:
+            return lxb_css_value_length_sr(&width->u.length, cb, ctx);
+
+        case LXB_CSS_VALUE__PERCENTAGE:
+            return lxb_css_value_percentage_sr(&width->u.percentage, cb, ctx);
+
+        case LXB_CSS_VALUE__UNDEF:
+            /* FIXME: ???? */
+            break;
+
+        default:
+            return lxb_css_value_serialize(width->type, cb, ctx);
+    }
+
+    return LXB_STATUS_OK;
+}
+
+/* Height. */
+
+void *
+lxb_css_property_height_create(lxb_css_memory_t *memory)
+{
+    return lexbor_mraw_calloc(memory->mraw, sizeof(lxb_css_property_height_t));
+}
+
+void *
+lxb_css_property_height_destroy(lxb_css_memory_t *memory,
+                                void *property, bool self_destroy)
+{
+    return lxb_css_property__undef_destroy(memory, property, self_destroy);
+}
+
+lxb_status_t
+lxb_css_property_height_serialize(const void *property,
+                                  lexbor_serialize_cb_f cb, void *ctx)
+{
+    return lxb_css_property_width_serialize(property, cb, ctx);
+}
+
+/* Box-sizing. */
+
+void *
+lxb_css_property_box_sizing_create(lxb_css_memory_t *memory)
+{
+    return lexbor_mraw_calloc(memory->mraw, sizeof(lxb_css_property_box_sizing_t));
+}
+
+void *
+lxb_css_property_box_sizing_destroy(lxb_css_memory_t *memory,
+                                    void *property, bool self_destroy)
+{
+    return lxb_css_property__undef_destroy(memory, property, self_destroy);
+}
+
+lxb_status_t
+lxb_css_property_box_sizing_serialize(const void *property,
+                                      lexbor_serialize_cb_f cb, void *ctx)
+{
+    const lxb_css_property_box_sizing_t *bsize = property;
+
+    return lxb_css_value_serialize(bsize->type, cb, ctx);
+}
+
+/* Min-width. */
+
+void *
+lxb_css_property_min_width_create(lxb_css_memory_t *memory)
+{
+    return lexbor_mraw_calloc(memory->mraw, sizeof(lxb_css_property_min_width_t));
+}
+
+void *
+lxb_css_property_min_width_destroy(lxb_css_memory_t *memory,
+                                   void *property, bool self_destroy)
+{
+    return lxb_css_property__undef_destroy(memory, property, self_destroy);
+}
+
+lxb_status_t
+lxb_css_property_min_width_serialize(const void *property,
+                                     lexbor_serialize_cb_f cb, void *ctx)
+{
+    return lxb_css_property_width_serialize(property, cb, ctx);
+}
+
+/* Min-height. */
+
+void *
+lxb_css_property_min_height_create(lxb_css_memory_t *memory)
+{
+    return lexbor_mraw_calloc(memory->mraw, sizeof(lxb_css_property_min_height_t));
+}
+
+void *
+lxb_css_property_min_height_destroy(lxb_css_memory_t *memory,
+                                    void *property, bool self_destroy)
+{
+    return lxb_css_property__undef_destroy(memory, property, self_destroy);
+}
+
+lxb_status_t
+lxb_css_property_min_height_serialize(const void *property,
+                                      lexbor_serialize_cb_f cb, void *ctx)
+{
+    return lxb_css_property_width_serialize(property, cb, ctx);
+}
+
+/* Max-width. */
+
+void *
+lxb_css_property_max_width_create(lxb_css_memory_t *memory)
+{
+    return lexbor_mraw_calloc(memory->mraw, sizeof(lxb_css_property_max_width_t));
+}
+
+void *
+lxb_css_property_max_width_destroy(lxb_css_memory_t *memory,
+                                   void *property, bool self_destroy)
+{
+    return lxb_css_property__undef_destroy(memory, property, self_destroy);
+}
+
+lxb_status_t
+lxb_css_property_max_width_serialize(const void *property,
+                                     lexbor_serialize_cb_f cb, void *ctx)
+{
+    return lxb_css_property_width_serialize(property, cb, ctx);
+}
+
+/* Max-height. */
+
+void *
+lxb_css_property_max_height_create(lxb_css_memory_t *memory)
+{
+    return lexbor_mraw_calloc(memory->mraw, sizeof(lxb_css_property_max_height_t));
+}
+
+void *
+lxb_css_property_max_height_destroy(lxb_css_memory_t *memory,
+                                    void *property, bool self_destroy)
+{
+    return lxb_css_property__undef_destroy(memory, property, self_destroy);
+}
+
+lxb_status_t
+lxb_css_property_max_height_serialize(const void *property,
+                                      lexbor_serialize_cb_f cb, void *ctx)
+{
+    return lxb_css_property_width_serialize(property, cb, ctx);
+}
+
+/* Margin. */
+
+void *
+lxb_css_property_margin_create(lxb_css_memory_t *memory)
+{
+    return lexbor_mraw_calloc(memory->mraw, sizeof(lxb_css_property_margin_t));
+}
+
+void *
+lxb_css_property_margin_destroy(lxb_css_memory_t *memory,
+                                void *property, bool self_destroy)
+{
+    return lxb_css_property__undef_destroy(memory, property, self_destroy);
+}
+
+lxb_status_t
+lxb_css_property_margin_serialize(const void *property,
+                                  lexbor_serialize_cb_f cb, void *ctx)
+{
+    lxb_status_t status;
+    const lxb_css_property_margin_t *margin = property;
+
+    static const lexbor_str_t str_ws = lexbor_str(" ");
+
+    /* Top. */
+
+    status = lxb_css_value_length_percentage_sr(&margin->top, cb, ctx);
+    if (status != LXB_STATUS_OK) {
+        return status;
+    }
+
+    if (margin->right.type == LXB_CSS_VALUE__UNDEF) {
+        return LXB_STATUS_OK;
+    }
+
+    /* Right. */
+
+    lexbor_serialize_write(cb, str_ws.data, str_ws.length, ctx, status);
+
+    status = lxb_css_value_length_percentage_sr(&margin->right, cb, ctx);
+    if (status != LXB_STATUS_OK) {
+        return status;
+    }
+
+    if (margin->bottom.type == LXB_CSS_VALUE__UNDEF) {
+        return LXB_STATUS_OK;
+    }
+
+    /* Bottom. */
+
+    lexbor_serialize_write(cb, str_ws.data, str_ws.length, ctx, status);
+
+    status = lxb_css_value_length_percentage_sr(&margin->bottom, cb, ctx);
+    if (status != LXB_STATUS_OK) {
+        return status;
+    }
+
+    if (margin->left.type == LXB_CSS_VALUE__UNDEF) {
+        return LXB_STATUS_OK;
+    }
+
+    /* Left. */
+
+    lexbor_serialize_write(cb, str_ws.data, str_ws.length, ctx, status);
+
+    return lxb_css_value_length_percentage_sr(&margin->left, cb, ctx);
+}
+
+/* Margin-top. */
+
+void *
+lxb_css_property_margin_top_create(lxb_css_memory_t *memory)
+{
+    return lexbor_mraw_calloc(memory->mraw, sizeof(lxb_css_property_margin_top_t));
+}
+
+void *
+lxb_css_property_margin_top_destroy(lxb_css_memory_t *memory,
+                                    void *property, bool self_destroy)
+{
+    return lxb_css_property__undef_destroy(memory, property, self_destroy);
+}
+
+lxb_status_t
+lxb_css_property_margin_top_serialize(const void *property,
+                                      lexbor_serialize_cb_f cb, void *ctx)
+{
+    return lxb_css_value_length_percentage_sr(property, cb, ctx);
+}
+
+/* Margin-right. */
+
+void *
+lxb_css_property_margin_right_create(lxb_css_memory_t *memory)
+{
+    return lexbor_mraw_calloc(memory->mraw, sizeof(lxb_css_property_margin_right_t));
+}
+
+void *
+lxb_css_property_margin_right_destroy(lxb_css_memory_t *memory,
+                                      void *property, bool self_destroy)
+{
+    return lxb_css_property__undef_destroy(memory, property, self_destroy);
+}
+
+lxb_status_t
+lxb_css_property_margin_right_serialize(const void *property,
+                                        lexbor_serialize_cb_f cb, void *ctx)
+{
+    return lxb_css_value_length_percentage_sr(property, cb, ctx);
+}
+
+/* Margin-bottom. */
+
+void *
+lxb_css_property_margin_bottom_create(lxb_css_memory_t *memory)
+{
+    return lexbor_mraw_calloc(memory->mraw, sizeof(lxb_css_property_margin_bottom_t));
+}
+
+void *
+lxb_css_property_margin_bottom_destroy(lxb_css_memory_t *memory,
+                                       void *property, bool self_destroy)
+{
+    return lxb_css_property__undef_destroy(memory, property, self_destroy);
+}
+
+lxb_status_t
+lxb_css_property_margin_bottom_serialize(const void *property,
+                                         lexbor_serialize_cb_f cb, void *ctx)
+{
+    return lxb_css_value_length_percentage_sr(property, cb, ctx);
+}
+
+/* Margin-left. */
+
+void *
+lxb_css_property_margin_left_create(lxb_css_memory_t *memory)
+{
+    return lexbor_mraw_calloc(memory->mraw, sizeof(lxb_css_property_margin_left_t));
+}
+
+void *
+lxb_css_property_margin_left_destroy(lxb_css_memory_t *memory,
+                                     void *property, bool self_destroy)
+{
+    return lxb_css_property__undef_destroy(memory, property, self_destroy);
+}
+
+lxb_status_t
+lxb_css_property_margin_left_serialize(const void *property,
+                                       lexbor_serialize_cb_f cb, void *ctx)
+{
+    return lxb_css_value_length_percentage_sr(property, cb, ctx);
+}
+
+/* Padding. */
+
+void *
+lxb_css_property_padding_create(lxb_css_memory_t *memory)
+{
+    return lexbor_mraw_calloc(memory->mraw, sizeof(lxb_css_property_padding_t));
+}
+
+void *
+lxb_css_property_padding_destroy(lxb_css_memory_t *memory,
+                                 void *property, bool self_destroy)
+{
+    return lxb_css_property__undef_destroy(memory, property, self_destroy);
+}
+
+lxb_status_t
+lxb_css_property_padding_serialize(const void *property,
+                                   lexbor_serialize_cb_f cb, void *ctx)
+{
+    return lxb_css_property_margin_serialize(property, cb, ctx);
+}
+
+/* Padding-top. */
+
+void *
+lxb_css_property_padding_top_create(lxb_css_memory_t *memory)
+{
+    return lexbor_mraw_calloc(memory->mraw, sizeof(lxb_css_property_padding_top_t));
+}
+
+void *
+lxb_css_property_padding_top_destroy(lxb_css_memory_t *memory,
+                                     void *property, bool self_destroy)
+{
+    return lxb_css_property__undef_destroy(memory, property, self_destroy);
+}
+
+lxb_status_t
+lxb_css_property_padding_top_serialize(const void *property,
+                                       lexbor_serialize_cb_f cb, void *ctx)
+{
+    return lxb_css_value_length_percentage_sr(property, cb, ctx);
+}
+
+/* Padding-right. */
+
+void *
+lxb_css_property_padding_right_create(lxb_css_memory_t *memory)
+{
+    return lexbor_mraw_calloc(memory->mraw, sizeof(lxb_css_property_padding_right_t));
+}
+
+void *
+lxb_css_property_padding_right_destroy(lxb_css_memory_t *memory,
+                                       void *property, bool self_destroy)
+{
+    return lxb_css_property__undef_destroy(memory, property, self_destroy);
+}
+
+lxb_status_t
+lxb_css_property_padding_right_serialize(const void *property,
+                                         lexbor_serialize_cb_f cb, void *ctx)
+{
+    return lxb_css_value_length_percentage_sr(property, cb, ctx);
+}
+
+/* Padding-bottom. */
+
+void *
+lxb_css_property_padding_bottom_create(lxb_css_memory_t *memory)
+{
+    return lexbor_mraw_calloc(memory->mraw, sizeof(lxb_css_property_padding_bottom_t));
+}
+
+void *
+lxb_css_property_padding_bottom_destroy(lxb_css_memory_t *memory,
+                                        void *property, bool self_destroy)
+{
+    return lxb_css_property__undef_destroy(memory, property, self_destroy);
+}
+
+lxb_status_t
+lxb_css_property_padding_bottom_serialize(const void *property,
+                                          lexbor_serialize_cb_f cb, void *ctx)
+{
+    return lxb_css_value_length_percentage_sr(property, cb, ctx);
+}
+
+/* Padding-left. */
+
+void *
+lxb_css_property_padding_left_create(lxb_css_memory_t *memory)
+{
+    return lexbor_mraw_calloc(memory->mraw, sizeof(lxb_css_property_padding_left_t));
+}
+
+void *
+lxb_css_property_padding_left_destroy(lxb_css_memory_t *memory,
+                                      void *property, bool self_destroy)
+{
+    return lxb_css_property__undef_destroy(memory, property, self_destroy);
+}
+
+lxb_status_t
+lxb_css_property_padding_left_serialize(const void *property,
+                                        lexbor_serialize_cb_f cb, void *ctx)
+{
+    return lxb_css_value_length_percentage_sr(property, cb, ctx);
+}
+
+/* Border. */
+
+void *
+lxb_css_property_border_create(lxb_css_memory_t *memory)
+{
+    return lexbor_mraw_calloc(memory->mraw, sizeof(lxb_css_property_border_t));
+}
+
+void *
+lxb_css_property_border_destroy(lxb_css_memory_t *memory,
+                                void *property, bool self_destroy)
+{
+    return lxb_css_property__undef_destroy(memory, property, self_destroy);
+}
+
+lxb_status_t
+lxb_css_property_border_serialize(const void *property,
+                                  lexbor_serialize_cb_f cb, void *ctx)
+{
+    bool ws_print;
+    lxb_status_t status;
+    const lxb_css_property_border_t *border = property;
+
+    static const lexbor_str_t str_ws = lexbor_str(" ");
+
+    ws_print = false;
+
+    if (border->width.type != LXB_CSS_VALUE__UNDEF) {
+        status = lxb_css_value_length_type_sr(&border->width, cb, ctx);
+        if (status != LXB_STATUS_OK) {
+            return status;
+        }
+
+        ws_print = true;
+    }
+
+    if (border->style != LXB_CSS_VALUE__UNDEF) {
+        if (ws_print) {
+            lexbor_serialize_write(cb, str_ws.data, str_ws.length, ctx, status);
+        }
+
+        status = lxb_css_value_serialize(border->style, cb, ctx);
+        if (status != LXB_STATUS_OK) {
+            return status;
+        }
+
+        ws_print = true;
+    }
+
+    if (border->color.type != LXB_CSS_VALUE__UNDEF) {
+        if (ws_print) {
+            lexbor_serialize_write(cb, str_ws.data, str_ws.length, ctx, status);
+        }
+
+        return lxb_css_value_color_serialize(&border->color, cb, ctx);
+    }
+
+    return LXB_STATUS_OK;
+}
+
+/* Border-top. */
+
+void *
+lxb_css_property_border_top_create(lxb_css_memory_t *memory)
+{
+    return lexbor_mraw_calloc(memory->mraw, sizeof(lxb_css_property_border_top_t));
+}
+
+void *
+lxb_css_property_border_top_destroy(lxb_css_memory_t *memory,
+                                    void *property, bool self_destroy)
+{
+    return lxb_css_property__undef_destroy(memory, property, self_destroy);
+}
+
+lxb_status_t
+lxb_css_property_border_top_serialize(const void *property,
+                                      lexbor_serialize_cb_f cb, void *ctx)
+{
+    return lxb_css_property_border_serialize(property, cb, ctx);
+}
+
+/* Border-right. */
+
+void *
+lxb_css_property_border_right_create(lxb_css_memory_t *memory)
+{
+    return lexbor_mraw_calloc(memory->mraw, sizeof(lxb_css_property_border_right_t));
+}
+
+void *
+lxb_css_property_border_right_destroy(lxb_css_memory_t *memory,
+                                      void *property, bool self_destroy)
+{
+    return lxb_css_property__undef_destroy(memory, property, self_destroy);
+}
+
+lxb_status_t
+lxb_css_property_border_right_serialize(const void *property,
+                                        lexbor_serialize_cb_f cb, void *ctx)
+{
+    return lxb_css_property_border_serialize(property, cb, ctx);
+}
+
+/* Border-bottom. */
+
+void *
+lxb_css_property_border_bottom_create(lxb_css_memory_t *memory)
+{
+    return lexbor_mraw_calloc(memory->mraw, sizeof(lxb_css_property_border_bottom_t));
+}
+
+void *
+lxb_css_property_border_bottom_destroy(lxb_css_memory_t *memory,
+                                       void *property, bool self_destroy)
+{
+    return lxb_css_property__undef_destroy(memory, property, self_destroy);
+}
+
+lxb_status_t
+lxb_css_property_border_bottom_serialize(const void *property,
+                                         lexbor_serialize_cb_f cb, void *ctx)
+{
+    return lxb_css_property_border_serialize(property, cb, ctx);
+}
+
+/* Border-left. */
+
+void *
+lxb_css_property_border_left_create(lxb_css_memory_t *memory)
+{
+    return lexbor_mraw_calloc(memory->mraw, sizeof(lxb_css_property_border_left_t));
+}
+
+void *
+lxb_css_property_border_left_destroy(lxb_css_memory_t *memory,
+                                     void *property, bool self_destroy)
+{
+    return lxb_css_property__undef_destroy(memory, property, self_destroy);
+}
+
+lxb_status_t
+lxb_css_property_border_left_serialize(const void *property,
+                                       lexbor_serialize_cb_f cb, void *ctx)
+{
+    return lxb_css_property_border_serialize(property, cb, ctx);
+}
+
+void *
+lxb_css_property_border_top_color_create(lxb_css_memory_t *memory)
+{
+    return lexbor_mraw_calloc(memory->mraw,
+                              sizeof(lxb_css_property_border_top_color_t));
+}
+
+void *
+lxb_css_property_border_top_color_destroy(lxb_css_memory_t *memory,
+                                          void *style, bool self_destroy)
+{
+    return lxb_css_property__undef_destroy(memory, style, self_destroy);
+}
+
+lxb_status_t
+lxb_css_property_border_top_color_serialize(const void *style,
+                                            lexbor_serialize_cb_f cb, void *ctx)
+{
+    return lxb_css_value_color_serialize(style, cb, ctx);
+}
+
+void *
+lxb_css_property_border_right_color_create(lxb_css_memory_t *memory)
+{
+    return lexbor_mraw_calloc(memory->mraw,
+                              sizeof(lxb_css_property_border_right_color_t));
+}
+
+void *
+lxb_css_property_border_right_color_destroy(lxb_css_memory_t *memory,
+                                            void *style, bool self_destroy)
+{
+    return lxb_css_property__undef_destroy(memory, style, self_destroy);
+}
+
+lxb_status_t
+lxb_css_property_border_right_color_serialize(const void *style,
+                                              lexbor_serialize_cb_f cb, void *ctx)
+{
+    return lxb_css_value_color_serialize(style, cb, ctx);
+}
+
+void *
+lxb_css_property_border_bottom_color_create(lxb_css_memory_t *memory)
+{
+    return lexbor_mraw_calloc(memory->mraw,
+                              sizeof(lxb_css_property_border_bottom_color_t));
+}
+
+void *
+lxb_css_property_border_bottom_color_destroy(lxb_css_memory_t *memory,
+                                             void *style, bool self_destroy)
+{
+    return lxb_css_property__undef_destroy(memory, style, self_destroy);
+}
+
+lxb_status_t
+lxb_css_property_border_bottom_color_serialize(const void *style,
+                                               lexbor_serialize_cb_f cb, void *ctx)
+{
+    return lxb_css_value_color_serialize(style, cb, ctx);
+}
+
+void *
+lxb_css_property_border_left_color_create(lxb_css_memory_t *memory)
+{
+    return lexbor_mraw_calloc(memory->mraw,
+                              sizeof(lxb_css_property_border_left_color_t));
+}
+
+void *
+lxb_css_property_border_left_color_destroy(lxb_css_memory_t *memory,
+                                           void *style, bool self_destroy)
+{
+    return lxb_css_property__undef_destroy(memory, style, self_destroy);
+}
+
+lxb_status_t
+lxb_css_property_border_left_color_serialize(const void *style,
+                                             lexbor_serialize_cb_f cb, void *ctx)
+{
+    return lxb_css_value_color_serialize(style, cb, ctx);
+}
+
+void *
+lxb_css_property_background_color_create(lxb_css_memory_t *memory)
+{
+    return lexbor_mraw_calloc(memory->mraw,
+                              sizeof(lxb_css_property_background_color_t));
+}
+
+void *
+lxb_css_property_background_color_destroy(lxb_css_memory_t *memory,
+                                          void *style, bool self_destroy)
+{
+    return lxb_css_property__undef_destroy(memory, style, self_destroy);
+}
+
+lxb_status_t
+lxb_css_property_background_color_serialize(const void *style,
+                                            lexbor_serialize_cb_f cb, void *ctx)
+{
+    return lxb_css_value_color_serialize(style, cb, ctx);
+}
+
+/* Color. */
+
+void *
+lxb_css_property_color_create(lxb_css_memory_t *memory)
+{
+    return lexbor_mraw_calloc(memory->mraw, sizeof(lxb_css_property_color_t));
+}
+
+void *
+lxb_css_property_color_destroy(lxb_css_memory_t *memory,
+                               void *property, bool self_destroy)
+{
+    return lxb_css_property__undef_destroy(memory, property, self_destroy);
+}
+
+lxb_status_t
+lxb_css_property_color_serialize(const void *property,
+                                 lexbor_serialize_cb_f cb, void *ctx)
+{
+    return lxb_css_value_color_serialize(property, cb, ctx);
+}
+
+void *
+lxb_css_property_opacity_create(lxb_css_memory_t *memory)
+{
+    return lexbor_mraw_calloc(memory->mraw, sizeof(lxb_css_property_opacity_t));
+}
+
+void *
+lxb_css_property_opacity_destroy(lxb_css_memory_t *memory,
+                                 void *style, bool self_destroy)
+{
+    return lxb_css_property__undef_destroy(memory, style, self_destroy);
+}
+
+lxb_status_t
+lxb_css_property_opacity_serialize(const void *style,
+                                   lexbor_serialize_cb_f cb, void *ctx)
+{
+    return lxb_css_value_number_percentage_sr(style, cb, ctx);
+}
+
+void *
+lxb_css_property_position_create(lxb_css_memory_t *memory)
+{
+    return lexbor_mraw_calloc(memory->mraw, sizeof(lxb_css_property_position_t));
+}
+
+void *
+lxb_css_property_position_destroy(lxb_css_memory_t *memory,
+                                  void *style, bool self_destroy)
+{
+    return lxb_css_property__undef_destroy(memory, style, self_destroy);
+}
+
+lxb_status_t
+lxb_css_property_position_serialize(const void *style,
+                                    lexbor_serialize_cb_f cb, void *ctx)
+{
+    const lxb_css_property_position_t *position = style;
+
+    return lxb_css_value_serialize(position->type, cb, ctx);
+}
+
+void *
+lxb_css_property_top_create(lxb_css_memory_t *memory)
+{
+    return lexbor_mraw_calloc(memory->mraw, sizeof(lxb_css_property_top_t));
+}
+
+void *
+lxb_css_property_top_destroy(lxb_css_memory_t *memory,
+                             void *style, bool self_destroy)
+{
+    return lxb_css_property__undef_destroy(memory, style, self_destroy);
+}
+
+lxb_status_t
+lxb_css_property_top_serialize(const void *style,
+                               lexbor_serialize_cb_f cb, void *ctx)
+{
+    return lxb_css_value_length_percentage_sr(style, cb, ctx);
+}
+
+void *
+lxb_css_property_right_create(lxb_css_memory_t *memory)
+{
+    return lexbor_mraw_calloc(memory->mraw, sizeof(lxb_css_property_right_t));
+}
+
+void *
+lxb_css_property_right_destroy(lxb_css_memory_t *memory,
+                               void *style, bool self_destroy)
+{
+    return lxb_css_property__undef_destroy(memory, style, self_destroy);
+}
+
+lxb_status_t
+lxb_css_property_right_serialize(const void *style,
+                                 lexbor_serialize_cb_f cb, void *ctx)
+{
+    return lxb_css_property_top_serialize(style, cb, ctx);
+}
+
+void *
+lxb_css_property_bottom_create(lxb_css_memory_t *memory)
+{
+    return lexbor_mraw_calloc(memory->mraw, sizeof(lxb_css_property_bottom_t));
+}
+
+void *
+lxb_css_property_bottom_destroy(lxb_css_memory_t *memory,
+                                void *style, bool self_destroy)
+{
+    return lxb_css_property__undef_destroy(memory, style, self_destroy);
+}
+
+lxb_status_t
+lxb_css_property_bottom_serialize(const void *style,
+                                  lexbor_serialize_cb_f cb, void *ctx)
+{
+    return lxb_css_property_top_serialize(style, cb, ctx);
+}
+
+void *
+lxb_css_property_left_create(lxb_css_memory_t *memory)
+{
+    return lexbor_mraw_calloc(memory->mraw, sizeof(lxb_css_property_left_t));
+}
+
+void *
+lxb_css_property_left_destroy(lxb_css_memory_t *memory,
+                              void *style, bool self_destroy)
+{
+    return lxb_css_property__undef_destroy(memory, style, self_destroy);
+}
+
+lxb_status_t
+lxb_css_property_left_serialize(const void *style,
+                                lexbor_serialize_cb_f cb, void *ctx)
+{
+    return lxb_css_property_top_serialize(style, cb, ctx);
+}
+
+void *
+lxb_css_property_inset_block_start_create(lxb_css_memory_t *memory)
+{
+    return lexbor_mraw_calloc(memory->mraw,
+                              sizeof(lxb_css_property_inset_block_start_t));
+}
+
+void *
+lxb_css_property_inset_block_start_destroy(lxb_css_memory_t *memory,
+                                           void *style, bool self_destroy)
+{
+    return lxb_css_property__undef_destroy(memory, style, self_destroy);
+}
+
+lxb_status_t
+lxb_css_property_inset_block_start_serialize(const void *style,
+                                             lexbor_serialize_cb_f cb, void *ctx)
+{
+    return lxb_css_property_top_serialize(style, cb, ctx);
+}
+
+void *
+lxb_css_property_inset_inline_start_create(lxb_css_memory_t *memory)
+{
+    return lexbor_mraw_calloc(memory->mraw,
+                              sizeof(lxb_css_property_inset_inline_start_t));
+}
+
+void *
+lxb_css_property_inset_inline_start_destroy(lxb_css_memory_t *memory,
+                                            void *style, bool self_destroy)
+{
+    return lxb_css_property__undef_destroy(memory, style, self_destroy);
+}
+
+lxb_status_t
+lxb_css_property_inset_inline_start_serialize(const void *style,
+                                              lexbor_serialize_cb_f cb, void *ctx)
+{
+    return lxb_css_property_top_serialize(style, cb, ctx);
+}
+
+void *
+lxb_css_property_inset_block_end_create(lxb_css_memory_t *memory)
+{
+    return lexbor_mraw_calloc(memory->mraw,
+                              sizeof(lxb_css_property_inset_block_end_t));
+}
+
+void *
+lxb_css_property_inset_block_end_destroy(lxb_css_memory_t *memory,
+                                         void *style, bool self_destroy)
+{
+    return lxb_css_property__undef_destroy(memory, style, self_destroy);
+}
+
+lxb_status_t
+lxb_css_property_inset_block_end_serialize(const void *style,
+                                           lexbor_serialize_cb_f cb, void *ctx)
+{
+    return lxb_css_property_top_serialize(style, cb, ctx);
+}
+
+void *
+lxb_css_property_inset_inline_end_create(lxb_css_memory_t *memory)
+{
+    return lexbor_mraw_calloc(memory->mraw,
+                              sizeof(lxb_css_property_inset_inline_end_t));
+}
+
+void *
+lxb_css_property_inset_inline_end_destroy(lxb_css_memory_t *memory,
+                                          void *style, bool self_destroy)
+{
+    return lxb_css_property__undef_destroy(memory, style, self_destroy);
+}
+
+lxb_status_t
+lxb_css_property_inset_inline_end_serialize(const void *style,
+                                            lexbor_serialize_cb_f cb, void *ctx)
+{
+    return lxb_css_property_top_serialize(style, cb, ctx);
+}
+
+/* Text-transform. */
+
+LXB_API void *
+lxb_css_property_text_transform_create(lxb_css_memory_t *memory)
+{
+    return lexbor_mraw_calloc(memory->mraw,
+                              sizeof(lxb_css_property_text_transform_t));
+}
+
+LXB_API void *
+lxb_css_property_text_transform_destroy(lxb_css_memory_t *memory,
+                                        void *style, bool self_destroy)
+{
+    return lxb_css_property__undef_destroy(memory, style, self_destroy);
+}
+
+LXB_API lxb_status_t
+lxb_css_property_text_transform_serialize(const void *style,
+                                          lexbor_serialize_cb_f cb, void *ctx)
+{
+    bool ws_print;
+    lxb_status_t status;
+    const lxb_css_property_text_transform_t *tt = style;
+
+    static const lexbor_str_t str_ws = lexbor_str(" ");
+
+    ws_print = false;
+
+    if (tt->type_case != LXB_CSS_VALUE__UNDEF) {
+        status = lxb_css_value_serialize(tt->type_case, cb, ctx);
+        if (status != LXB_STATUS_OK) {
+            return status;
+        }
+
+        ws_print = true;
+    }
+
+    if (tt->full_width != LXB_CSS_VALUE__UNDEF) {
+        if (ws_print) {
+            lexbor_serialize_write(cb, str_ws.data, str_ws.length, ctx, status);
+        }
+
+        status = lxb_css_value_serialize(tt->full_width, cb, ctx);
+        if (status != LXB_STATUS_OK) {
+            return status;
+        }
+
+        ws_print = true;
+    }
+
+    if (tt->full_size_kana != LXB_CSS_VALUE__UNDEF) {
+        if (ws_print) {
+            lexbor_serialize_write(cb, str_ws.data, str_ws.length, ctx, status);
+        }
+
+        return lxb_css_value_serialize(tt->full_size_kana, cb, ctx);
+    }
+
+    return LXB_STATUS_OK;
+}
+
+/* Text-align. */
+
+LXB_API void *
+lxb_css_property_text_align_create(lxb_css_memory_t *memory)
+{
+    return lexbor_mraw_calloc(memory->mraw,
+                              sizeof(lxb_css_property_text_align_t));
+}
+
+LXB_API void *
+lxb_css_property_text_align_destroy(lxb_css_memory_t *memory,
+                                    void *style, bool self_destroy)
+{
+    return lxb_css_property__undef_destroy(memory, style, self_destroy);
+}
+
+LXB_API lxb_status_t
+lxb_css_property_text_align_serialize(const void *style,
+                                      lexbor_serialize_cb_f cb, void *ctx)
+{
+    const lxb_css_property_text_align_t *ta = style;
+
+    return lxb_css_value_serialize(ta->type, cb, ctx);
+}
+
+/* Text-align-all. */
+
+LXB_API void *
+lxb_css_property_text_align_all_create(lxb_css_memory_t *memory)
+{
+    return lexbor_mraw_calloc(memory->mraw,
+                              sizeof(lxb_css_property_text_align_all_t));
+}
+
+LXB_API void *
+lxb_css_property_text_align_all_destroy(lxb_css_memory_t *memory,
+                                        void *style, bool self_destroy)
+{
+    return lxb_css_property__undef_destroy(memory, style, self_destroy);
+}
+
+LXB_API lxb_status_t
+lxb_css_property_text_align_all_serialize(const void *style,
+                                          lexbor_serialize_cb_f cb, void *ctx)
+{
+    const lxb_css_property_text_align_all_t *taa = style;
+
+    return lxb_css_value_serialize(taa->type, cb, ctx);
+}
+
+/* Text-align-last. */
+
+LXB_API void *
+lxb_css_property_text_align_last_create(lxb_css_memory_t *memory)
+{
+    return lexbor_mraw_calloc(memory->mraw,
+                              sizeof(lxb_css_property_text_align_last_t));
+}
+
+LXB_API void *
+lxb_css_property_text_align_last_destroy(lxb_css_memory_t *memory,
+                                         void *style, bool self_destroy)
+{
+    return lxb_css_property__undef_destroy(memory, style, self_destroy);
+}
+
+LXB_API lxb_status_t
+lxb_css_property_text_align_last_serialize(const void *style,
+                                           lexbor_serialize_cb_f cb, void *ctx)
+{
+    const lxb_css_property_text_align_last_t *tal = style;
+
+    return lxb_css_value_serialize(tal->type, cb, ctx);
+}
+
+/* Text-justify. */
+
+LXB_API void *
+lxb_css_property_text_justify_create(lxb_css_memory_t *memory)
+{
+    return lexbor_mraw_calloc(memory->mraw,
+                              sizeof(lxb_css_property_text_justify_t));
+}
+
+LXB_API void *
+lxb_css_property_text_justify_destroy(lxb_css_memory_t *memory,
+                                      void *style, bool self_destroy)
+{
+    return lxb_css_property__undef_destroy(memory, style, self_destroy);
+}
+
+LXB_API lxb_status_t
+lxb_css_property_text_justify_serialize(const void *style,
+                                        lexbor_serialize_cb_f cb, void *ctx)
+{
+    const lxb_css_property_text_justify_t *tj = style;
+
+    return lxb_css_value_serialize(tj->type, cb, ctx);
+}
+
+/* Text-indent. */
+
+LXB_API void *
+lxb_css_property_text_indent_create(lxb_css_memory_t *memory)
+{
+    return lexbor_mraw_calloc(memory->mraw,
+                              sizeof(lxb_css_property_text_indent_t));
+}
+
+LXB_API void *
+lxb_css_property_text_indent_destroy(lxb_css_memory_t *memory,
+                                     void *style, bool self_destroy)
+{
+    return lxb_css_property__undef_destroy(memory, style, self_destroy);
+}
+
+LXB_API lxb_status_t
+lxb_css_property_text_indent_serialize(const void *style,
+                                       lexbor_serialize_cb_f cb, void *ctx)
+{
+    lxb_status_t status;
+    const lxb_css_property_text_indent_t *ti = style;
+
+    static const lexbor_str_t str_ws = lexbor_str(" ");
+
+    if (ti->type == LXB_CSS_VALUE__LENGTH) {
+        status = lxb_css_value_length_percentage_sr(&ti->length, cb, ctx);
+        if (status != LXB_STATUS_OK) {
+            return status;
+        }
+    }
+    else if (ti->type != LXB_CSS_VALUE__UNDEF) {
+        status = lxb_css_value_serialize(ti->type, cb, ctx);
+        if (status != LXB_STATUS_OK) {
+            return status;
+        }
+    }
+
+    if (ti->hanging != LXB_CSS_VALUE__UNDEF) {
+        lexbor_serialize_write(cb, str_ws.data, str_ws.length, ctx, status);
+
+        status = lxb_css_value_serialize(ti->hanging, cb, ctx);
+        if (status != LXB_STATUS_OK) {
+            return status;
+        }
+    }
+
+    if (ti->each_line != LXB_CSS_VALUE__UNDEF) {
+        lexbor_serialize_write(cb, str_ws.data, str_ws.length, ctx, status);
+
+        return lxb_css_value_serialize(ti->each_line, cb, ctx);
+    }
+
+    return LXB_STATUS_OK;
+}
+
+/* White-space. */
+
+LXB_API void *
+lxb_css_property_white_space_create(lxb_css_memory_t *memory)
+{
+    return lexbor_mraw_calloc(memory->mraw,
+                              sizeof(lxb_css_property_white_space_t));
+}
+
+LXB_API void *
+lxb_css_property_white_space_destroy(lxb_css_memory_t *memory,
+                                     void *style, bool self_destroy)
+{
+    return lxb_css_property__undef_destroy(memory, style, self_destroy);
+}
+
+LXB_API lxb_status_t
+lxb_css_property_white_space_serialize(const void *style,
+                                       lexbor_serialize_cb_f cb, void *ctx)
+{
+    const lxb_css_property_white_space_t *ws = style;
+
+    return lxb_css_value_serialize(ws->type, cb, ctx);
+}
+
+/* Tab-size. */
+
+LXB_API void *
+lxb_css_property_tab_size_create(lxb_css_memory_t *memory)
+{
+    return lexbor_mraw_calloc(memory->mraw,
+                              sizeof(lxb_css_property_tab_size_t));
+}
+
+LXB_API void *
+lxb_css_property_tab_size_destroy(lxb_css_memory_t *memory,
+                                  void *style, bool self_destroy)
+{
+    return lxb_css_property__undef_destroy(memory, style, self_destroy);
+}
+
+LXB_API lxb_status_t
+lxb_css_property_tab_size_serialize(const void *style,
+                                    lexbor_serialize_cb_f cb, void *ctx)
+{
+    return lxb_css_value_number_length_sr(style, cb, ctx);
+}
+
+/* Word-break. */
+
+LXB_API void *
+lxb_css_property_word_break_create(lxb_css_memory_t *memory)
+{
+    return lexbor_mraw_calloc(memory->mraw,
+                              sizeof(lxb_css_property_word_break_t));
+}
+
+LXB_API void *
+lxb_css_property_word_break_destroy(lxb_css_memory_t *memory,
+                                    void *style, bool self_destroy)
+{
+    return lxb_css_property__undef_destroy(memory, style, self_destroy);
+}
+
+LXB_API lxb_status_t
+lxb_css_property_word_break_serialize(const void *style,
+                                      lexbor_serialize_cb_f cb, void *ctx)
+{
+    const lxb_css_property_word_break_t *wb = style;
+
+    return lxb_css_value_serialize(wb->type, cb, ctx);
+}
+
+/* Line-break. */
+
+LXB_API void *
+lxb_css_property_line_break_create(lxb_css_memory_t *memory)
+{
+    return lexbor_mraw_calloc(memory->mraw,
+                              sizeof(lxb_css_property_line_break_t));
+}
+
+LXB_API void *
+lxb_css_property_line_break_destroy(lxb_css_memory_t *memory,
+                                    void *style, bool self_destroy)
+{
+    return lxb_css_property__undef_destroy(memory, style, self_destroy);
+}
+
+LXB_API lxb_status_t
+lxb_css_property_line_break_serialize(const void *style,
+                                      lexbor_serialize_cb_f cb, void *ctx)
+{
+    const lxb_css_property_line_break_t *lb = style;
+
+    return lxb_css_value_serialize(lb->type, cb, ctx);
+}
+
+/* Hyphens. */
+
+LXB_API void *
+lxb_css_property_hyphens_create(lxb_css_memory_t *memory)
+{
+    return lexbor_mraw_calloc(memory->mraw,
+                              sizeof(lxb_css_property_hyphens_t));
+}
+
+LXB_API void *
+lxb_css_property_hyphens_destroy(lxb_css_memory_t *memory,
+                                 void *style, bool self_destroy)
+{
+    return lxb_css_property__undef_destroy(memory, style, self_destroy);
+}
+
+LXB_API lxb_status_t
+lxb_css_property_hyphens_serialize(const void *style,
+                                   lexbor_serialize_cb_f cb, void *ctx)
+{
+    const lxb_css_property_hyphens_t *hpns = style;
+
+    return lxb_css_value_serialize(hpns->type, cb, ctx);
+}
+
+/* Overflow-wrap. */
+
+LXB_API void *
+lxb_css_property_overflow_wrap_create(lxb_css_memory_t *memory)
+{
+    return lexbor_mraw_calloc(memory->mraw,
+                              sizeof(lxb_css_property_overflow_wrap_t));
+}
+
+LXB_API void *
+lxb_css_property_overflow_wrap_destroy(lxb_css_memory_t *memory,
+                                       void *style, bool self_destroy)
+{
+    return lxb_css_property__undef_destroy(memory, style, self_destroy);
+}
+
+LXB_API lxb_status_t
+lxb_css_property_overflow_wrap_serialize(const void *style,
+                                         lexbor_serialize_cb_f cb, void *ctx)
+{
+    const lxb_css_property_overflow_wrap_t *ow = style;
+
+    return lxb_css_value_serialize(ow->type, cb, ctx);
+}
+
+/* Word-wrap. */
+
+LXB_API void *
+lxb_css_property_word_wrap_create(lxb_css_memory_t *memory)
+{
+    return lexbor_mraw_calloc(memory->mraw,
+                              sizeof(lxb_css_property_word_wrap_t));
+}
+
+LXB_API void *
+lxb_css_property_word_wrap_destroy(lxb_css_memory_t *memory,
+                                   void *style, bool self_destroy)
+{
+    return lxb_css_property__undef_destroy(memory, style, self_destroy);
+}
+
+LXB_API lxb_status_t
+lxb_css_property_word_wrap_serialize(const void *style,
+                                     lexbor_serialize_cb_f cb, void *ctx)
+{
+    const lxb_css_property_word_wrap_t *ww = style;
+
+    return lxb_css_value_serialize(ww->type, cb, ctx);
+}
+
+/* Word-spacing. */
+
+LXB_API void *
+lxb_css_property_word_spacing_create(lxb_css_memory_t *memory)
+{
+    return lexbor_mraw_calloc(memory->mraw,
+                              sizeof(lxb_css_property_word_spacing_t));
+}
+
+LXB_API void *
+lxb_css_property_word_spacing_destroy(lxb_css_memory_t *memory,
+                                      void *style, bool self_destroy)
+{
+    return lxb_css_property__undef_destroy(memory, style, self_destroy);
+}
+
+LXB_API lxb_status_t
+lxb_css_property_word_spacing_serialize(const void *style,
+                                        lexbor_serialize_cb_f cb, void *ctx)
+{
+    return lxb_css_value_length_type_sr(style, cb, ctx);
+}
+
+/* Letter-spacing. */
+
+LXB_API void *
+lxb_css_property_letter_spacing_create(lxb_css_memory_t *memory)
+{
+    return lexbor_mraw_calloc(memory->mraw,
+                              sizeof(lxb_css_property_letter_spacing_t));
+}
+
+LXB_API void *
+lxb_css_property_letter_spacing_destroy(lxb_css_memory_t *memory,
+                                        void *style, bool self_destroy)
+{
+    return lxb_css_property__undef_destroy(memory, style, self_destroy);
+}
+
+LXB_API lxb_status_t
+lxb_css_property_letter_spacing_serialize(const void *style,
+                                          lexbor_serialize_cb_f cb, void *ctx)
+{
+    return lxb_css_value_length_type_sr(style, cb, ctx);
+}
+
+/* Hanging-punctuation. */
+
+LXB_API void *
+lxb_css_property_hanging_punctuation_create(lxb_css_memory_t *memory)
+{
+    return lexbor_mraw_calloc(memory->mraw,
+                              sizeof(lxb_css_property_hanging_punctuation_t));
+}
+
+LXB_API void *
+lxb_css_property_hanging_punctuation_destroy(lxb_css_memory_t *memory,
+                                             void *style, bool self_destroy)
+{
+    return lxb_css_property__undef_destroy(memory, style, self_destroy);
+}
+
+LXB_API lxb_status_t
+lxb_css_property_hanging_punctuation_serialize(const void *style,
+                                               lexbor_serialize_cb_f cb, void *ctx)
+{
+    bool ws_print;
+    lxb_status_t status;
+    const lxb_css_property_hanging_punctuation_t *hp = style;
+
+    static const lexbor_str_t str_ws = lexbor_str(" ");
+
+    ws_print = false;
+
+    if (hp->type_first != LXB_CSS_VALUE__UNDEF) {
+        status = lxb_css_value_serialize(hp->type_first, cb, ctx);
+        if (status != LXB_STATUS_OK) {
+            return status;
+        }
+
+        ws_print = true;
+    }
+
+    if (hp->force_allow != LXB_CSS_VALUE__UNDEF) {
+        if (ws_print) {
+            lexbor_serialize_write(cb, str_ws.data, str_ws.length, ctx, status);
+        }
+
+        status = lxb_css_value_serialize(hp->force_allow, cb, ctx);
+        if (status != LXB_STATUS_OK) {
+            return status;
+        }
+
+        ws_print = true;
+    }
+
+    if (hp->last != LXB_CSS_VALUE__UNDEF) {
+        if (ws_print) {
+            lexbor_serialize_write(cb, str_ws.data, str_ws.length, ctx, status);
+        }
+
+        return lxb_css_value_serialize(hp->last, cb, ctx);
+    }
+
+    return LXB_STATUS_OK;
+}
+
+/* Font-family. */
+
+void *
+lxb_css_property_font_family_create(lxb_css_memory_t *memory)
+{
+    return lexbor_mraw_calloc(memory->mraw,
+                              sizeof(lxb_css_property_font_family_t));
+}
+
+void *
+lxb_css_property_font_family_destroy(lxb_css_memory_t *memory,
+                                     void *style, bool self_destroy)
+{
+    lxb_css_property_font_family_t *ff = style;
+    lxb_css_property_family_name_t *name, *next;
+
+    name = ff->first;
+
+    while (name != NULL) {
+        next = name->next;
+
+        if (!name->generic) {
+            (void) lexbor_str_destroy(&name->u.str, memory->mraw, false);
+        }
+
+        lexbor_mraw_free(memory->mraw, name);
+
+        name = next;
+    }
+
+    return lxb_css_property__undef_destroy(memory, style, self_destroy);
+}
+
+lxb_status_t
+lxb_css_property_font_family_serialize(const void *style,
+                                       lexbor_serialize_cb_f cb, void *ctx)
+{
+    lxb_status_t status;
+    const lxb_css_property_font_family_t *ff = style;
+    const lxb_css_property_family_name_t *name;
+
+    static const lexbor_str_t str_comma = lexbor_str(", ");
+
+    name = ff->first;
+
+    while (name != NULL) {
+        if (name->generic) {
+            status = lxb_css_value_serialize(name->u.type, cb, ctx);
+        }
+        else {
+            status = lxb_css_syntax_ident_or_string_serialize(name->u.str.data,
+                                                              name->u.str.length,
+                                                              cb, ctx);
+        }
+
+        if (status != LXB_STATUS_OK) {
+            return status;
+        }
+
+        name = name->next;
+
+        if (name != NULL) {
+            lexbor_serialize_write(cb, str_comma.data, str_comma.length,
+                                   ctx, status);
+        }
+    }
+
+    return LXB_STATUS_OK;
+}
+
+/* Font-weight. */
+
+void *
+lxb_css_property_font_weight_create(lxb_css_memory_t *memory)
+{
+    return lexbor_mraw_calloc(memory->mraw,
+                              sizeof(lxb_css_property_font_weight_t));
+}
+
+void *
+lxb_css_property_font_weight_destroy(lxb_css_memory_t *memory,
+                                     void *style, bool self_destroy)
+{
+    return lxb_css_property__undef_destroy(memory, style, self_destroy);
+}
+
+lxb_status_t
+lxb_css_property_font_weight_serialize(const void *style,
+                                       lexbor_serialize_cb_f cb, void *ctx)
+{
+    return lxb_css_value_number_type_sr(style, cb, ctx);
+}
+
+/* Font-stretch. */
+
+void *
+lxb_css_property_font_stretch_create(lxb_css_memory_t *memory)
+{
+    return lexbor_mraw_calloc(memory->mraw,
+                              sizeof(lxb_css_property_font_stretch_t));
+}
+
+void *
+lxb_css_property_font_stretch_destroy(lxb_css_memory_t *memory,
+                                      void *style, bool self_destroy)
+{
+    return lxb_css_property__undef_destroy(memory, style, self_destroy);
+}
+
+lxb_status_t
+lxb_css_property_font_stretch_serialize(const void *style,
+                                        lexbor_serialize_cb_f cb, void *ctx)
+{
+    return lxb_css_value_percentage_type_sr(style, cb, ctx);
+}
+
+/* Font-style. */
+
+void *
+lxb_css_property_font_style_create(lxb_css_memory_t *memory)
+{
+    return lexbor_mraw_calloc(memory->mraw,
+                              sizeof(lxb_css_property_font_style_t));
+}
+
+void *
+lxb_css_property_font_style_destroy(lxb_css_memory_t *memory,
+                                    void *style, bool self_destroy)
+{
+    return lxb_css_property__undef_destroy(memory, style, self_destroy);
+}
+
+lxb_status_t
+lxb_css_property_font_style_serialize(const void *style,
+                                      lexbor_serialize_cb_f cb, void *ctx)
+{
+    lxb_status_t status;
+    const lxb_css_property_font_style_t *fs = style;
+
+    static const lexbor_str_t str_ws = lexbor_str(" ");
+
+    status = lxb_css_value_serialize(fs->type, cb, ctx);
+    if (status != LXB_STATUS_OK) {
+        return status;
+    }
+
+    if (fs->angle.unit != (lxb_css_unit_angle_t) LXB_CSS_UNIT__UNDEF) {
+        lexbor_serialize_write(cb, str_ws.data, str_ws.length, ctx, status);
+
+        status = lxb_css_value_angle_sr(&fs->angle, cb, ctx);
+        if (status != LXB_STATUS_OK) {
+            return status;
+        }
+    }
+
+    return LXB_STATUS_OK;
+}
+
+/* Font-size. */
+
+LXB_API void *
+lxb_css_property_font_size_create(lxb_css_memory_t *memory)
+{
+    return lexbor_mraw_calloc(memory->mraw,
+                              sizeof(lxb_css_property_font_size_t));
+}
+
+LXB_API void *
+lxb_css_property_font_size_destroy(lxb_css_memory_t *memory,
+                                   void *style, bool self_destroy)
+{
+    return lxb_css_property__undef_destroy(memory, style, self_destroy);
+}
+
+LXB_API lxb_status_t
+lxb_css_property_font_size_serialize(const void *style,
+                                     lexbor_serialize_cb_f cb, void *ctx)
+{
+    return lxb_css_value_length_percentage_type_sr(style, cb, ctx);
+}
+
+/* Float-reference. */
+
+LXB_API void *
+lxb_css_property_float_reference_create(lxb_css_memory_t *memory)
+{
+    return lexbor_mraw_calloc(memory->mraw,
+                              sizeof(lxb_css_property_float_reference_t));
+}
+
+LXB_API void *
+lxb_css_property_float_reference_destroy(lxb_css_memory_t *memory,
+                                         void *style, bool self_destroy)
+{
+    return lxb_css_property__undef_destroy(memory, style, self_destroy);
+}
+
+LXB_API lxb_status_t
+lxb_css_property_float_reference_serialize(const void *style,
+                                           lexbor_serialize_cb_f cb, void *ctx)
+{
+    const lxb_css_property_float_reference_t *fr = style;
+
+    return lxb_css_value_serialize(fr->type, cb, ctx);
+}
+
+/* Float. */
+
+LXB_API void *
+lxb_css_property_float_create(lxb_css_memory_t *memory)
+{
+    return lexbor_mraw_calloc(memory->mraw, sizeof(lxb_css_property_float_t));
+}
+
+LXB_API void *
+lxb_css_property_float_destroy(lxb_css_memory_t *memory,
+                               void *style, bool self_destroy)
+{
+    return lxb_css_property__undef_destroy(memory, style, self_destroy);
+}
+
+LXB_API lxb_status_t
+lxb_css_property_float_serialize(const void *style,
+                                 lexbor_serialize_cb_f cb, void *ctx)
+{
+    lxb_status_t status;
+    const lxb_css_property_float_t *flt = style;
+
+    static const lexbor_str_t str_o = lexbor_str("(");
+    static const lexbor_str_t str_cm = lexbor_str(", ");
+    static const lexbor_str_t str_c = lexbor_str(")");
+
+    status = lxb_css_value_serialize(flt->type, cb, ctx);
+    if (status != LXB_STATUS_OK) {
+        return status;
+    }
+
+    if (flt->length.type != LXB_CSS_VALUE__LENGTH) {
+        return LXB_STATUS_OK;
+    }
+
+    lexbor_serialize_write(cb, str_o.data, str_o.length, ctx, status);
+
+    status = lxb_css_value_length_sr(&flt->length.length, cb, ctx);
+    if (status != LXB_STATUS_OK) {
+        return status;
+    }
+
+    if (flt->snap_type == LXB_CSS_VALUE__UNDEF) {
+        return cb(str_c.data, str_c.length, ctx);
+    }
+
+    lexbor_serialize_write(cb, str_cm.data, str_cm.length, ctx, status);
+
+    status = lxb_css_value_serialize(flt->snap_type, cb, ctx);
+    if (status != LXB_STATUS_OK) {
+        return status;
+    }
+
+    return cb(str_c.data, str_c.length, ctx);
+}
+
+/* Clear. */
+
+LXB_API void *
+lxb_css_property_clear_create(lxb_css_memory_t *memory)
+{
+    return lexbor_mraw_calloc(memory->mraw, sizeof(lxb_css_property_clear_t));
+}
+
+LXB_API void *
+lxb_css_property_clear_destroy(lxb_css_memory_t *memory,
+                               void *style, bool self_destroy)
+{
+    return lxb_css_property__undef_destroy(memory, style, self_destroy);
+}
+
+LXB_API lxb_status_t
+lxb_css_property_clear_serialize(const void *style,
+                                 lexbor_serialize_cb_f cb, void *ctx)
+{
+    const lxb_css_property_clear_t *cls = style;
+
+    return lxb_css_value_serialize(cls->type, cb, ctx);
+}
+
+/* Float-defer. */
+
+LXB_API void *
+lxb_css_property_float_defer_create(lxb_css_memory_t *memory)
+{
+    return lexbor_mraw_calloc(memory->mraw,
+                              sizeof(lxb_css_property_float_defer_t));
+}
+
+LXB_API void *
+lxb_css_property_float_defer_destroy(lxb_css_memory_t *memory,
+                                     void *style, bool self_destroy)
+{
+    return lxb_css_property__undef_destroy(memory, style, self_destroy);
+}
+
+LXB_API lxb_status_t
+lxb_css_property_float_defer_serialize(const void *style,
+                                       lexbor_serialize_cb_f cb, void *ctx)
+{
+    const lxb_css_property_float_defer_t *def = style;
+
+    if (def->type == LXB_CSS_FLOAT_DEFER__INTEGER) {
+        return lxb_css_value_integer_sr(&def->integer, cb, ctx);
+    }
+
+    return lxb_css_value_serialize(def->type, cb, ctx);
+}
+
+/* Float-offset. */
+
+LXB_API void *
+lxb_css_property_float_offset_create(lxb_css_memory_t *memory)
+{
+    return lexbor_mraw_calloc(memory->mraw,
+                              sizeof(lxb_css_property_float_offset_t));
+}
+
+LXB_API void *
+lxb_css_property_float_offset_destroy(lxb_css_memory_t *memory,
+                                      void *style, bool self_destroy)
+{
+    return lxb_css_property__undef_destroy(memory, style, self_destroy);
+}
+
+LXB_API lxb_status_t
+lxb_css_property_float_offset_serialize(const void *style,
+                                        lexbor_serialize_cb_f cb, void *ctx)
+{
+    return lxb_css_value_length_percentage_sr(style, cb, ctx);
+}
+
+/* Wrap-flow. */
+
+LXB_API void *
+lxb_css_property_wrap_flow_create(lxb_css_memory_t *memory)
+{
+    return lexbor_mraw_calloc(memory->mraw,
+                              sizeof(lxb_css_property_wrap_flow_t));
+}
+
+LXB_API void *
+lxb_css_property_wrap_flow_destroy(lxb_css_memory_t *memory,
+                                   void *style, bool self_destroy)
+{
+    return lxb_css_property__undef_destroy(memory, style, self_destroy);
+}
+
+LXB_API lxb_status_t
+lxb_css_property_wrap_flow_serialize(const void *style,
+                                     lexbor_serialize_cb_f cb, void *ctx)
+{
+    const lxb_css_property_wrap_flow_t *wf = style;
+
+    return lxb_css_value_serialize(wf->type, cb, ctx);
+}
+
+/* Wrap-through. */
+
+LXB_API void *
+lxb_css_property_wrap_through_create(lxb_css_memory_t *memory)
+{
+    return lexbor_mraw_calloc(memory->mraw,
+                              sizeof(lxb_css_property_wrap_through_t));
+}
+
+LXB_API void *
+lxb_css_property_wrap_through_destroy(lxb_css_memory_t *memory,
+                                      void *style, bool self_destroy)
+{
+    return lxb_css_property__undef_destroy(memory, style, self_destroy);
+}
+
+LXB_API lxb_status_t
+lxb_css_property_wrap_through_serialize(const void *style,
+                                        lexbor_serialize_cb_f cb, void *ctx)
+{
+    const lxb_css_property_wrap_through_t *wt = style;
+
+    return lxb_css_value_serialize(wt->type, cb, ctx);
+}
+
+/* Flex-direction. */
+
+LXB_API void *
+lxb_css_property_flex_direction_create(lxb_css_memory_t *memory)
+{
+    return lexbor_mraw_calloc(memory->mraw,
+                              sizeof(lxb_css_property_flex_direction_t));
+}
+
+LXB_API void *
+lxb_css_property_flex_direction_destroy(lxb_css_memory_t *memory,
+                                        void *style, bool self_destroy)
+{
+    return lxb_css_property__undef_destroy(memory, style, self_destroy);
+}
+
+LXB_API lxb_status_t
+lxb_css_property_flex_direction_serialize(const void *style,
+                                          lexbor_serialize_cb_f cb, void *ctx)
+{
+    const lxb_css_property_flex_direction_t *fd = style;
+
+    return lxb_css_value_serialize(fd->type, cb, ctx);
+}
+
+/* Flex-wrap. */
+
+LXB_API void *
+lxb_css_property_flex_wrap_create(lxb_css_memory_t *memory)
+{
+    return lexbor_mraw_calloc(memory->mraw,
+                              sizeof(lxb_css_property_flex_wrap_t));
+}
+
+LXB_API void *
+lxb_css_property_flex_wrap_destroy(lxb_css_memory_t *memory,
+                                   void *style, bool self_destroy)
+{
+    return lxb_css_property__undef_destroy(memory, style, self_destroy);
+}
+
+LXB_API lxb_status_t
+lxb_css_property_flex_wrap_serialize(const void *style,
+                                     lexbor_serialize_cb_f cb, void *ctx)
+{
+    const lxb_css_property_flex_wrap_t *fw = style;
+
+    return lxb_css_value_serialize(fw->type, cb, ctx);
+}
+
+/* Flex-flow. */
+
+LXB_API void *
+lxb_css_property_flex_flow_create(lxb_css_memory_t *memory)
+{
+    return lexbor_mraw_calloc(memory->mraw,
+                              sizeof(lxb_css_property_flex_flow_t));
+}
+
+LXB_API void *
+lxb_css_property_flex_flow_destroy(lxb_css_memory_t *memory,
+                                   void *style, bool self_destroy)
+{
+    return lxb_css_property__undef_destroy(memory, style, self_destroy);
+}
+
+LXB_API lxb_status_t
+lxb_css_property_flex_flow_serialize(const void *style,
+                                     lexbor_serialize_cb_f cb, void *ctx)
+{
+    lxb_status_t status;
+    const lxb_css_property_flex_flow_t *ff = style;
+
+    static const lexbor_str_t str_ws = lexbor_str(" ");
+
+    if (ff->type_direction != LXB_CSS_VALUE__UNDEF) {
+        status = lxb_css_value_serialize(ff->type_direction, cb, ctx);
+        if (status != LXB_STATUS_OK) {
+            return status;
+        }
+    }
+
+    if (ff->wrap != LXB_CSS_VALUE__UNDEF) {
+        if (ff->type_direction != LXB_CSS_VALUE__UNDEF) {
+            lexbor_serialize_write(cb, str_ws.data, str_ws.length, ctx, status);
+        }
+
+        return lxb_css_value_serialize(ff->wrap, cb, ctx);
+    }
+
+    return LXB_STATUS_OK;
+}
+
+/* Flex. */
+
+LXB_API void *
+lxb_css_property_flex_create(lxb_css_memory_t *memory)
+{
+    return lexbor_mraw_calloc(memory->mraw, sizeof(lxb_css_property_flex_t));
+}
+
+LXB_API void *
+lxb_css_property_flex_destroy(lxb_css_memory_t *memory,
+                              void *style, bool self_destroy)
+{
+    return lxb_css_property__undef_destroy(memory, style, self_destroy);
+}
+
+LXB_API lxb_status_t
+lxb_css_property_flex_serialize(const void *style,
+                                lexbor_serialize_cb_f cb, void *ctx)
+{
+    lxb_status_t status;
+    const lxb_css_property_flex_t *flex = style;
+
+    static const lexbor_str_t str_ws = lexbor_str(" ");
+
+    if (flex->type != LXB_CSS_VALUE__UNDEF) {
+        return lxb_css_value_serialize(flex->type, cb, ctx);
+    }
+
+    if (flex->grow.type != LXB_CSS_VALUE__UNDEF) {
+        status = lxb_css_value_number_sr(&flex->grow.number, cb, ctx);
+        if (status != LXB_STATUS_OK) {
+            return status;
+        }
+
+        if (flex->shrink.type != LXB_CSS_VALUE__UNDEF) {
+            lexbor_serialize_write(cb, str_ws.data, str_ws.length, ctx, status);
+
+            status = lxb_css_value_number_sr(&flex->shrink.number, cb, ctx);
+            if (status != LXB_STATUS_OK) {
+                return status;
+            }
+        }
+    }
+
+    if (flex->basis.type == LXB_CSS_VALUE__UNDEF) {
+        return LXB_STATUS_OK;
+    }
+
+    if (flex->grow.type != LXB_CSS_VALUE__UNDEF) {
+        lexbor_serialize_write(cb, str_ws.data, str_ws.length, ctx, status);
+    }
+
+    return lxb_css_property_flex_basis_serialize(&flex->basis, cb, ctx);
+}
+
+/* Flex-grow. */
+
+LXB_API void *
+lxb_css_property_flex_grow_create(lxb_css_memory_t *memory)
+{
+    return lexbor_mraw_calloc(memory->mraw,
+                              sizeof(lxb_css_property_flex_grow_t));
+}
+
+LXB_API void *
+lxb_css_property_flex_grow_destroy(lxb_css_memory_t *memory,
+                                   void *style, bool self_destroy)
+{
+    return lxb_css_property__undef_destroy(memory, style, self_destroy);
+}
+
+LXB_API lxb_status_t
+lxb_css_property_flex_grow_serialize(const void *style,
+                                     lexbor_serialize_cb_f cb, void *ctx)
+{
+    return lxb_css_value_number_type_sr(style, cb, ctx);
+}
+
+/* Flex-shrink. */
+
+LXB_API void *
+lxb_css_property_flex_shrink_create(lxb_css_memory_t *memory)
+{
+    return lexbor_mraw_calloc(memory->mraw,
+                              sizeof(lxb_css_property_flex_shrink_t));
+}
+
+LXB_API void *
+lxb_css_property_flex_shrink_destroy(lxb_css_memory_t *memory,
+                                     void *style, bool self_destroy)
+{
+    return lxb_css_property__undef_destroy(memory, style, self_destroy);
+}
+
+LXB_API lxb_status_t
+lxb_css_property_flex_shrink_serialize(const void *style,
+                                       lexbor_serialize_cb_f cb, void *ctx)
+{
+    return lxb_css_value_number_type_sr(style, cb, ctx);
+}
+
+/* Flex-basis. */
+
+LXB_API void *
+lxb_css_property_flex_basis_create(lxb_css_memory_t *memory)
+{
+    return lexbor_mraw_calloc(memory->mraw,
+                              sizeof(lxb_css_property_flex_basis_t));
+}
+
+LXB_API void *
+lxb_css_property_flex_basis_destroy(lxb_css_memory_t *memory,
+                                    void *style, bool self_destroy)
+{
+    return lxb_css_property__undef_destroy(memory, style, self_destroy);
+}
+
+LXB_API lxb_status_t
+lxb_css_property_flex_basis_serialize(const void *style,
+                                      lexbor_serialize_cb_f cb, void *ctx)
+{
+    return lxb_css_property_width_serialize(style, cb, ctx);
+}
+
+/* Justify-content. */
+
+LXB_API void *
+lxb_css_property_justify_content_create(lxb_css_memory_t *memory)
+{
+    return lexbor_mraw_calloc(memory->mraw,
+                              sizeof(lxb_css_property_justify_content_t));
+}
+
+LXB_API void *
+lxb_css_property_justify_content_destroy(lxb_css_memory_t *memory,
+                                         void *style, bool self_destroy)
+{
+    return lxb_css_property__undef_destroy(memory, style, self_destroy);
+}
+
+LXB_API lxb_status_t
+lxb_css_property_justify_content_serialize(const void *style,
+                                           lexbor_serialize_cb_f cb, void *ctx)
+{
+    const lxb_css_property_justify_content_t *jc = style;
+
+    return lxb_css_value_serialize(jc->type, cb, ctx);
+}
+
+/* Align-items. */
+
+LXB_API void *
+lxb_css_property_align_items_create(lxb_css_memory_t *memory)
+{
+    return lexbor_mraw_calloc(memory->mraw,
+                              sizeof(lxb_css_property_align_items_t));
+}
+
+LXB_API void *
+lxb_css_property_align_items_destroy(lxb_css_memory_t *memory,
+                                     void *style, bool self_destroy)
+{
+    return lxb_css_property__undef_destroy(memory, style, self_destroy);
+}
+
+LXB_API lxb_status_t
+lxb_css_property_align_items_serialize(const void *style,
+                                       lexbor_serialize_cb_f cb, void *ctx)
+{
+    const lxb_css_property_align_items_t *ai = style;
+
+    return lxb_css_value_serialize(ai->type, cb, ctx);
+}
+
+/* Align-self. */
+
+LXB_API void *
+lxb_css_property_align_self_create(lxb_css_memory_t *memory)
+{
+    return lexbor_mraw_calloc(memory->mraw,
+                              sizeof(lxb_css_property_align_self_t));
+}
+
+LXB_API void *
+lxb_css_property_align_self_destroy(lxb_css_memory_t *memory,
+                                    void *style, bool self_destroy)
+{
+    return lxb_css_property__undef_destroy(memory, style, self_destroy);
+}
+
+LXB_API lxb_status_t
+lxb_css_property_align_self_serialize(const void *style,
+                                      lexbor_serialize_cb_f cb, void *ctx)
+{
+    const lxb_css_property_align_self_t *as = style;
+
+    return lxb_css_value_serialize(as->type, cb, ctx);
+}
+
+/* Align-content. */
+
+LXB_API void *
+lxb_css_property_align_content_create(lxb_css_memory_t *memory)
+{
+    return lexbor_mraw_calloc(memory->mraw,
+                              sizeof(lxb_css_property_align_content_t));
+}
+
+LXB_API void *
+lxb_css_property_align_content_destroy(lxb_css_memory_t *memory,
+                                       void *style, bool self_destroy)
+{
+    return lxb_css_property__undef_destroy(memory, style, self_destroy);
+}
+
+LXB_API lxb_status_t
+lxb_css_property_align_content_serialize(const void *style,
+                                         lexbor_serialize_cb_f cb, void *ctx)
+{
+    const lxb_css_property_align_content_t *ac = style;
+
+    return lxb_css_value_serialize(ac->type, cb, ctx);
+}
+
+/* Dominant-baseline. */
+
+LXB_API void *
+lxb_css_property_dominant_baseline_create(lxb_css_memory_t *memory)
+{
+    return lexbor_mraw_calloc(memory->mraw,
+                              sizeof(lxb_css_property_dominant_baseline_t));
+}
+
+LXB_API void *
+lxb_css_property_dominant_baseline_destroy(lxb_css_memory_t *memory,
+                                           void *style, bool self_destroy)
+{
+    return lxb_css_property__undef_destroy(memory, style, self_destroy);
+}
+
+LXB_API lxb_status_t
+lxb_css_property_dominant_baseline_serialize(const void *style,
+                                             lexbor_serialize_cb_f cb, void *ctx)
+{
+    const lxb_css_property_dominant_baseline_t *db = style;
+
+    return lxb_css_value_serialize(db->type, cb, ctx);
+}
+
+/* Vertical-align. */
+
+LXB_API void *
+lxb_css_property_vertical_align_create(lxb_css_memory_t *memory)
+{
+    return lexbor_mraw_calloc(memory->mraw,
+                              sizeof(lxb_css_property_vertical_align_t));
+}
+
+LXB_API void *
+lxb_css_property_vertical_align_destroy(lxb_css_memory_t *memory,
+                                        void *style, bool self_destroy)
+{
+    return lxb_css_property__undef_destroy(memory, style, self_destroy);
+}
+
+LXB_API lxb_status_t
+lxb_css_property_vertical_align_serialize(const void *style,
+                                          lexbor_serialize_cb_f cb, void *ctx)
+{
+    bool is;
+    lxb_status_t status;
+    const lxb_css_property_vertical_align_t *va = style;
+
+    static const lexbor_str_t str_ws = lexbor_str(" ");
+
+    is = false;
+
+    if (va->type != LXB_CSS_VALUE__UNDEF) {
+        status = lxb_css_value_serialize(va->type, cb, ctx);
+        if (status != LXB_STATUS_OK) {
+            return status;
+        }
+
+        is = true;
+    }
+
+    if (va->alignment.type != LXB_CSS_VALUE__UNDEF) {
+        if (is) {
+            lexbor_serialize_write(cb, str_ws.data, str_ws.length, ctx, status);
+        }
+
+        status = lxb_css_value_serialize(va->alignment.type, cb, ctx);
+        if (status != LXB_STATUS_OK) {
+            return status;
+        }
+
+        is = true;
+    }
+
+    if (va->shift.type != LXB_CSS_VALUE__UNDEF) {
+        if (is) {
+            lexbor_serialize_write(cb, str_ws.data, str_ws.length, ctx, status);
+        }
+
+        status = lxb_css_value_length_percentage_sr(&va->shift, cb, ctx);
+        if (status != LXB_STATUS_OK) {
+            return status;
+        }
+    }
+
+    return LXB_STATUS_OK;
+}
+
+/* Baseline-source. */
+
+LXB_API void *
+lxb_css_property_baseline_source_create(lxb_css_memory_t *memory)
+{
+    return lexbor_mraw_calloc(memory->mraw,
+                              sizeof(lxb_css_property_baseline_source_t));
+}
+
+LXB_API void *
+lxb_css_property_baseline_source_destroy(lxb_css_memory_t *memory,
+                                         void *style, bool self_destroy)
+{
+    return lxb_css_property__undef_destroy(memory, style, self_destroy);
+}
+
+LXB_API lxb_status_t
+lxb_css_property_baseline_source_serialize(const void *style,
+                                           lexbor_serialize_cb_f cb, void *ctx)
+{
+    const lxb_css_property_baseline_source_t *bs = style;
+
+    return lxb_css_value_serialize(bs->type, cb, ctx);
+}
+
+/* Alignment-baseline. */
+
+LXB_API void *
+lxb_css_property_alignment_baseline_create(lxb_css_memory_t *memory)
+{
+    return lexbor_mraw_calloc(memory->mraw,
+                              sizeof(lxb_css_property_alignment_baseline_t));
+}
+
+LXB_API void *
+lxb_css_property_alignment_baseline_destroy(lxb_css_memory_t *memory,
+                                            void *style, bool self_destroy)
+{
+    return lxb_css_property__undef_destroy(memory, style, self_destroy);
+}
+
+LXB_API lxb_status_t
+lxb_css_property_alignment_baseline_serialize(const void *style,
+                                              lexbor_serialize_cb_f cb, void *ctx)
+{
+    const lxb_css_property_alignment_baseline_t *ab = style;
+
+    return lxb_css_value_serialize(ab->type, cb, ctx);
+}
+
+/* Baseline-shift. */
+
+LXB_API void *
+lxb_css_property_baseline_shift_create(lxb_css_memory_t *memory)
+{
+    return lexbor_mraw_calloc(memory->mraw,
+                              sizeof(lxb_css_property_baseline_shift_t));
+}
+
+LXB_API void *
+lxb_css_property_baseline_shift_destroy(lxb_css_memory_t *memory,
+                                        void *style, bool self_destroy)
+{
+    return lxb_css_property__undef_destroy(memory, style, self_destroy);
+}
+
+LXB_API lxb_status_t
+lxb_css_property_baseline_shift_serialize(const void *style,
+                                          lexbor_serialize_cb_f cb, void *ctx)
+{
+    return lxb_css_value_length_percentage_sr(style, cb, ctx);
+}
+
+/* Line-height. */
+
+LXB_API void *
+lxb_css_property_line_height_create(lxb_css_memory_t *memory)
+{
+    return lexbor_mraw_calloc(memory->mraw,
+                              sizeof(lxb_css_property_line_height_t));
+}
+
+LXB_API void *
+lxb_css_property_line_height_destroy(lxb_css_memory_t *memory,
+                                     void *style, bool self_destroy)
+{
+    return lxb_css_property__undef_destroy(memory, style, self_destroy);
+}
+
+LXB_API lxb_status_t
+lxb_css_property_line_height_serialize(const void *style,
+                                       lexbor_serialize_cb_f cb, void *ctx)
+{
+    return lxb_css_value_number_length_percentage_type_sr(style, cb, ctx);
+}
+
+/* Z-index. */
+
+LXB_API void *
+lxb_css_property_z_index_create(lxb_css_memory_t *memory)
+{
+    return lexbor_mraw_calloc(memory->mraw, sizeof(lxb_css_property_z_index_t));
+}
+
+LXB_API void *
+lxb_css_property_z_index_destroy(lxb_css_memory_t *memory,
+                                 void *style, bool self_destroy)
+{
+    return lxb_css_property__undef_destroy(memory, style, self_destroy);
+}
+
+LXB_API lxb_status_t
+lxb_css_property_z_index_serialize(const void *style,
+                                   lexbor_serialize_cb_f cb, void *ctx)
+{
+    return lxb_css_value_integer_type_sr(style, cb, ctx);
+}
+
+/* Direction. */
+
+LXB_API void *
+lxb_css_property_direction_create(lxb_css_memory_t *memory)
+{
+    return lexbor_mraw_calloc(memory->mraw,
+                              sizeof(lxb_css_property_direction_t));
+}
+
+LXB_API void *
+lxb_css_property_direction_destroy(lxb_css_memory_t *memory,
+                                   void *style, bool self_destroy)
+{
+    return lxb_css_property__undef_destroy(memory, style, self_destroy);
+}
+
+LXB_API lxb_status_t
+lxb_css_property_direction_serialize(const void *style,
+                                     lexbor_serialize_cb_f cb, void *ctx)
+{
+    const lxb_css_property_direction_t *dr = style;
+
+    return lxb_css_value_serialize(dr->type, cb, ctx);
+}
+
+/* Unicode-bidi. */
+
+LXB_API void *
+lxb_css_property_unicode_bidi_create(lxb_css_memory_t *memory)
+{
+    return lexbor_mraw_calloc(memory->mraw,
+                              sizeof(lxb_css_property_unicode_bidi_t));
+}
+
+LXB_API void *
+lxb_css_property_unicode_bidi_destroy(lxb_css_memory_t *memory,
+                                      void *style, bool self_destroy)
+{
+    return lxb_css_property__undef_destroy(memory, style, self_destroy);
+}
+
+LXB_API lxb_status_t
+lxb_css_property_unicode_bidi_serialize(const void *style,
+                                        lexbor_serialize_cb_f cb, void *ctx)
+{
+    const lxb_css_property_unicode_bidi_t *ub = style;
+
+    return lxb_css_value_serialize(ub->type, cb, ctx);
+}
+
+/* Writing-mode. */
+
+LXB_API void *
+lxb_css_property_writing_mode_create(lxb_css_memory_t *memory)
+{
+    return lexbor_mraw_calloc(memory->mraw,
+                              sizeof(lxb_css_property_writing_mode_t));
+}
+
+LXB_API void *
+lxb_css_property_writing_mode_destroy(lxb_css_memory_t *memory,
+                                      void *style, bool self_destroy)
+{
+    return lxb_css_property__undef_destroy(memory, style, self_destroy);
+}
+
+LXB_API lxb_status_t
+lxb_css_property_writing_mode_serialize(const void *style,
+                                        lexbor_serialize_cb_f cb, void *ctx)
+{
+    const lxb_css_property_writing_mode_t *wm = style;
+
+    return lxb_css_value_serialize(wm->type, cb, ctx);
+}
+
+/* Text-orientation. */
+
+LXB_API void *
+lxb_css_property_text_orientation_create(lxb_css_memory_t *memory)
+{
+    return lexbor_mraw_calloc(memory->mraw,
+                              sizeof(lxb_css_property_text_orientation_t));
+}
+
+LXB_API void *
+lxb_css_property_text_orientation_destroy(lxb_css_memory_t *memory,
+                                          void *style, bool self_destroy)
+{
+    return lxb_css_property__undef_destroy(memory, style, self_destroy);
+}
+
+LXB_API lxb_status_t
+lxb_css_property_text_orientation_serialize(const void *style,
+                                            lexbor_serialize_cb_f cb, void *ctx)
+{
+    const lxb_css_property_text_orientation_t *to = style;
+
+    return lxb_css_value_serialize(to->type, cb, ctx);
+}
+
+/* Text-combine-upright. */
+
+LXB_API void *
+lxb_css_property_text_combine_upright_create(lxb_css_memory_t *memory)
+{
+    return lexbor_mraw_calloc(memory->mraw,
+                              sizeof(lxb_css_property_text_combine_upright_t));
+}
+
+LXB_API void *
+lxb_css_property_text_combine_upright_destroy(lxb_css_memory_t *memory,
+                                              void *style, bool self_destroy)
+{
+    return lxb_css_property__undef_destroy(memory, style, self_destroy);
+}
+
+LXB_API lxb_status_t
+lxb_css_property_text_combine_upright_serialize(const void *style,
+                                                lexbor_serialize_cb_f cb, void *ctx)
+{
+    lxb_status_t status;
+    const lxb_css_property_text_combine_upright_t *tcu = style;
+
+    static const lexbor_str_t str_ws = lexbor_str(" ");
+
+    if (tcu->type == LXB_CSS_TEXT_COMBINE_UPRIGHT_DIGITS) {
+        status = lxb_css_value_serialize(tcu->type, cb, ctx);
+        if (status != LXB_STATUS_OK) {
+            return status;
+        }
+
+        if (tcu->digits.num != 0) {
+            lexbor_serialize_write(cb, str_ws.data, str_ws.length, ctx, status);
+
+            return lxb_css_value_integer_sr(&tcu->digits, cb, ctx);
+        }
+
+        return LXB_STATUS_OK;
+    }
+
+    return lxb_css_value_serialize(tcu->type, cb, ctx);
+}
+
+/* Overflow-x. */
+
+LXB_API void *
+lxb_css_property_overflow_x_create(lxb_css_memory_t *memory)
+{
+    return lexbor_mraw_calloc(memory->mraw,
+                              sizeof(lxb_css_property_overflow_x_t));
+}
+
+LXB_API void *
+lxb_css_property_overflow_x_destroy(lxb_css_memory_t *memory,
+                                    void *style, bool self_destroy)
+{
+    return lxb_css_property__undef_destroy(memory, style, self_destroy);
+}
+
+LXB_API lxb_status_t
+lxb_css_property_overflow_x_serialize(const void *style,
+                                      lexbor_serialize_cb_f cb, void *ctx)
+{
+    const lxb_css_property_overflow_x_t *ox = style;
+
+    return lxb_css_value_serialize(ox->type, cb, ctx);
+}
+
+/* Overflow-y. */
+
+LXB_API void *
+lxb_css_property_overflow_y_create(lxb_css_memory_t *memory)
+{
+    return lexbor_mraw_calloc(memory->mraw,
+                              sizeof(lxb_css_property_overflow_y_t));
+}
+
+LXB_API void *
+lxb_css_property_overflow_y_destroy(lxb_css_memory_t *memory,
+                                    void *style, bool self_destroy)
+{
+    return lxb_css_property__undef_destroy(memory, style, self_destroy);
+}
+
+LXB_API lxb_status_t
+lxb_css_property_overflow_y_serialize(const void *style,
+                                      lexbor_serialize_cb_f cb, void *ctx)
+{
+    const lxb_css_property_overflow_y_t *oy = style;
+
+    return lxb_css_value_serialize(oy->type, cb, ctx);
+}
+
+/* Overflow-block. */
+
+LXB_API void *
+lxb_css_property_overflow_block_create(lxb_css_memory_t *memory)
+{
+    return lexbor_mraw_calloc(memory->mraw,
+                              sizeof(lxb_css_property_overflow_block_t));
+}
+
+LXB_API void *
+lxb_css_property_overflow_block_destroy(lxb_css_memory_t *memory,
+                                        void *style, bool self_destroy)
+{
+    return lxb_css_property__undef_destroy(memory, style, self_destroy);
+}
+
+LXB_API lxb_status_t
+lxb_css_property_overflow_block_serialize(const void *style,
+                                          lexbor_serialize_cb_f cb, void *ctx)
+{
+    const lxb_css_property_overflow_block_t *ob = style;
+
+    return lxb_css_value_serialize(ob->type, cb, ctx);
+}
+
+/* Overflow-inline. */
+
+LXB_API void *
+lxb_css_property_overflow_inline_create(lxb_css_memory_t *memory)
+{
+    return lexbor_mraw_calloc(memory->mraw,
+                              sizeof(lxb_css_property_overflow_inline_t));
+}
+
+LXB_API void *
+lxb_css_property_overflow_inline_destroy(lxb_css_memory_t *memory,
+                                         void *style, bool self_destroy)
+{
+    return lxb_css_property__undef_destroy(memory, style, self_destroy);
+}
+
+LXB_API lxb_status_t
+lxb_css_property_overflow_inline_serialize(const void *style,
+                                           lexbor_serialize_cb_f cb, void *ctx)
+{
+    const lxb_css_property_overflow_inline_t *oi = style;
+
+    return lxb_css_value_serialize(oi->type, cb, ctx);
+}
+
+/* Text-overflow. */
+
+LXB_API void *
+lxb_css_property_text_overflow_create(lxb_css_memory_t *memory)
+{
+    return lexbor_mraw_calloc(memory->mraw,
+                              sizeof(lxb_css_property_text_overflow_t));
+}
+
+LXB_API void *
+lxb_css_property_text_overflow_destroy(lxb_css_memory_t *memory,
+                                       void *style, bool self_destroy)
+{
+    return lxb_css_property__undef_destroy(memory, style, self_destroy);
+}
+
+LXB_API lxb_status_t
+lxb_css_property_text_overflow_serialize(const void *style,
+                                         lexbor_serialize_cb_f cb, void *ctx)
+{
+    const lxb_css_property_text_overflow_t *to = style;
+
+    return lxb_css_value_serialize(to->type, cb, ctx);
+}
+
+/* Text-decoration-line. */
+
+LXB_API void *
+lxb_css_property_text_decoration_line_create(lxb_css_memory_t *memory)
+{
+    return lexbor_mraw_calloc(memory->mraw,
+                              sizeof(lxb_css_property_text_decoration_line_t));
+}
+
+LXB_API void *
+lxb_css_property_text_decoration_line_destroy(lxb_css_memory_t *memory,
+                                              void *style, bool self_destroy)
+{
+    return lxb_css_property__undef_destroy(memory, style, self_destroy);
+}
+
+LXB_API lxb_status_t
+lxb_css_property_text_decoration_line_serialize(const void *style,
+                                                lexbor_serialize_cb_f cb, void *ctx)
+{
+    bool itis;
+    lxb_status_t status;
+    const lxb_css_property_text_decoration_line_t *tdl = style;
+
+    static const lexbor_str_t str_ws = lexbor_str(" ");
+
+    itis = false;
+
+    if (tdl->underline != LXB_CSS_VALUE__UNDEF) {
+        status = lxb_css_value_serialize(tdl->underline, cb, ctx);
+        if (status != LXB_STATUS_OK) {
+            return status;
+        }
+
+        itis = true;
+    }
+
+    if (tdl->overline != LXB_CSS_VALUE__UNDEF) {
+        if (itis) {
+            lexbor_serialize_write(cb, str_ws.data, str_ws.length, ctx, status);
+        }
+
+        status = lxb_css_value_serialize(tdl->overline, cb, ctx);
+        if (status != LXB_STATUS_OK) {
+            return status;
+        }
+
+        itis = true;
+    }
+
+    if (tdl->line_through != LXB_CSS_VALUE__UNDEF) {
+        if (itis) {
+            lexbor_serialize_write(cb, str_ws.data, str_ws.length, ctx, status);
+        }
+
+        status = lxb_css_value_serialize(tdl->line_through, cb, ctx);
+        if (status != LXB_STATUS_OK) {
+            return status;
+        }
+
+        itis = true;
+    }
+
+    if (tdl->blink != LXB_CSS_VALUE__UNDEF) {
+        if (itis) {
+            lexbor_serialize_write(cb, str_ws.data, str_ws.length, ctx, status);
+        }
+
+        return lxb_css_value_serialize(tdl->blink, cb, ctx);
+    }
+
+    if (itis) {
+        return LXB_STATUS_OK;
+    }
+
+    return lxb_css_value_serialize(tdl->type, cb, ctx);
+}
+
+/* Text-decoration-style. */
+
+LXB_API void *
+lxb_css_property_text_decoration_style_create(lxb_css_memory_t *memory)
+{
+    return lexbor_mraw_calloc(memory->mraw,
+                              sizeof(lxb_css_property_text_decoration_style_t));
+}
+
+LXB_API void *
+lxb_css_property_text_decoration_style_destroy(lxb_css_memory_t *memory,
+                                               void *style, bool self_destroy)
+{
+    return lxb_css_property__undef_destroy(memory, style, self_destroy);
+}
+
+LXB_API lxb_status_t
+lxb_css_property_text_decoration_style_serialize(const void *style,
+                                                 lexbor_serialize_cb_f cb, void *ctx)
+{
+    const lxb_css_property_text_decoration_style_t *tds = style;
+
+    return lxb_css_value_serialize(tds->type, cb, ctx);
+}
+
+/* Text-decoration-color. */
+
+LXB_API void *
+lxb_css_property_text_decoration_color_create(lxb_css_memory_t *memory)
+{
+    return lexbor_mraw_calloc(memory->mraw,
+                              sizeof(lxb_css_property_text_decoration_color_t));
+}
+
+LXB_API void *
+lxb_css_property_text_decoration_color_destroy(lxb_css_memory_t *memory,
+                                               void *style, bool self_destroy)
+{
+    return lxb_css_property__undef_destroy(memory, style, self_destroy);
+}
+
+LXB_API lxb_status_t
+lxb_css_property_text_decoration_color_serialize(const void *style,
+                                                 lexbor_serialize_cb_f cb, void *ctx)
+{
+    return lxb_css_property_color_serialize(style, cb, ctx);
+}
+
+/* Text-decoration. */
+
+LXB_API void *
+lxb_css_property_text_decoration_create(lxb_css_memory_t *memory)
+{
+    return lexbor_mraw_calloc(memory->mraw,
+                              sizeof(lxb_css_property_text_decoration_t));
+}
+
+LXB_API void *
+lxb_css_property_text_decoration_destroy(lxb_css_memory_t *memory,
+                                         void *style, bool self_destroy)
+{
+    return lxb_css_property__undef_destroy(memory, style, self_destroy);
+}
+
+LXB_API lxb_status_t
+lxb_css_property_text_decoration_serialize(const void *style,
+                                           lexbor_serialize_cb_f cb, void *ctx)
+{
+    bool itis;
+    lxb_status_t status;
+    const lxb_css_property_text_decoration_t *td = style;
+
+    static const lexbor_str_t str_ws = lexbor_str(" ");
+
+    itis = false;
+
+    if (td->line.type != LXB_CSS_VALUE__UNDEF
+        || td->line.underline != LXB_CSS_VALUE__UNDEF
+        || td->line.overline != LXB_CSS_VALUE__UNDEF
+        || td->line.line_through != LXB_CSS_VALUE__UNDEF
+        || td->line.blink != LXB_CSS_VALUE__UNDEF)
+    {
+        status = lxb_css_property_text_decoration_line_serialize(&td->line,
+                                                                 cb, ctx);
+        if (status != LXB_STATUS_OK) {
+            return status;
+        }
+
+        itis = true;
+    }
+
+    if (td->style.type != LXB_CSS_VALUE__UNDEF) {
+        if (itis) {
+            lexbor_serialize_write(cb, str_ws.data, str_ws.length, ctx, status);
+        }
+
+        status = lxb_css_property_text_decoration_style_serialize(&td->style,
+                                                                  cb, ctx);
+        if (status != LXB_STATUS_OK) {
+            return status;
+        }
+
+        itis = true;
+    }
+
+    if (td->color.type != LXB_CSS_VALUE__UNDEF) {
+        if (itis) {
+            lexbor_serialize_write(cb, str_ws.data, str_ws.length, ctx, status);
+        }
+
+        return lxb_css_property_text_decoration_color_serialize(&td->color,
+                                                                cb, ctx);
+    }
+
+    return LXB_STATUS_OK;
+}
diff --git a/ext/lexbor/lexbor/css/property/const.h b/ext/lexbor/lexbor/css/property/const.h
index 8ee24481c6a3..4f90bc1c107b 100644
--- a/ext/lexbor/lexbor/css/property/const.h
+++ b/ext/lexbor/lexbor/css/property/const.h
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2023 Alexander Borisov
+ * Copyright (C) 2026 Alexander Borisov
  *
  * Author: Alexander Borisov 
  */
diff --git a/ext/lexbor/lexbor/css/property/res.h b/ext/lexbor/lexbor/css/property/res.h
index 35cce1959013..eb5b90304a09 100644
--- a/ext/lexbor/lexbor/css/property/res.h
+++ b/ext/lexbor/lexbor/css/property/res.h
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2023 Alexander Borisov
+ * Copyright (C) 2026 Alexander Borisov
  *
  * Author: Alexander Borisov 
  */
diff --git a/ext/lexbor/lexbor/css/property/state.c b/ext/lexbor/lexbor/css/property/state.c
new file mode 100644
index 000000000000..198ef145615d
--- /dev/null
+++ b/ext/lexbor/lexbor/css/property/state.c
@@ -0,0 +1,5343 @@
+/*
+ * Copyright (C) 2021-2026 Alexander Borisov
+ *
+ * Author: Alexander Borisov 
+ */
+
+#include "lexbor/css/property.h"
+#include "lexbor/css/parser.h"
+#include "lexbor/css/rule.h"
+#include "lexbor/css/value.h"
+#include "lexbor/css/unit.h"
+#include "lexbor/css/property/state.h"
+#include "lexbor/css/property/res.h"
+
+
+#ifndef LEXBOR_DISABLE_INTERNAL_EXTERN
+    LXB_EXTERN const lxb_char_t lexbor_str_res_map_hex[256];
+    LXB_EXTERN const lxb_char_t lexbor_str_res_map_lowercase[256];
+#endif
+
+#include "lexbor/core/conv.h"
+
+
+#define lxb_css_property_state_check_token(parser, token)                     \
+    if ((token) == NULL) {                                                    \
+        return lxb_css_parser_memory_fail(parser);                            \
+    }
+
+#define lxb_css_property_state_get_type(parser, token, type)                  \
+    do {                                                                      \
+        lxb_css_syntax_parser_consume(parser);                                \
+                                                                              \
+        token = lxb_css_syntax_parser_token_wo_ws(parser);                    \
+        lxb_css_property_state_check_token(parser, token);                    \
+                                                                              \
+        if (token->type != LXB_CSS_SYNTAX_TOKEN_IDENT) {                      \
+            return lxb_css_parser_success(parser);                            \
+        }                                                                     \
+                                                                              \
+        type = lxb_css_value_by_name(lxb_css_syntax_token_ident(token)->data, \
+                                  lxb_css_syntax_token_ident(token)->length); \
+    }                                                                         \
+    while (false)
+
+#define LXB_CSS_PROPERTY_STATE_HEX_MASK(n)                                    \
+    ((((uint32_t) 1 << (32 - (n))) - 1) << (n))
+
+
+static bool
+lxb_css_property_state_color_rgba_old(lxb_css_parser_t *parser,
+                                      const lxb_css_syntax_token_t *token,
+                                      lxb_css_value_color_t *color);
+static bool
+lxb_css_property_state_color_hsla_old(lxb_css_parser_t *parser,
+                                      const lxb_css_syntax_token_t *token,
+                                      lxb_css_value_color_hsla_t *hsl);
+
+static bool
+lxb_css_property_state_length(lxb_css_parser_t *parser,
+                              const lxb_css_syntax_token_t *token,
+                              lxb_css_value_length_t *length)
+{
+    const lxb_css_data_t *unit;
+
+    switch (token->type) {
+        case LXB_CSS_SYNTAX_TOKEN_DIMENSION:
+            unit = lxb_css_unit_absolute_relative_by_name(lxb_css_syntax_token_dimension(token)->str.data,
+                                                          lxb_css_syntax_token_dimension(token)->str.length);
+            if (unit == NULL) {
+                return false;
+            }
+
+            length->num = lxb_css_syntax_token_dimension(token)->num.num;
+            length->is_float = lxb_css_syntax_token_dimension(token)->num.is_float;
+            length->unit = (lxb_css_unit_t) unit->unique;
+            break;
+
+        case LXB_CSS_SYNTAX_TOKEN_NUMBER:
+            if (lxb_css_syntax_token_number(token)->num != 0) {
+                return false;
+            }
+
+            length->num = lxb_css_syntax_token_number(token)->num;
+            length->is_float = lxb_css_syntax_token_number(token)->is_float;
+            length->unit = LXB_CSS_UNIT__UNDEF;
+            break;
+
+        default:
+            return false;
+    }
+
+    lxb_css_syntax_parser_consume(parser);
+
+    return true;
+}
+
+static bool
+lxb_css_property_state_length_percentage(lxb_css_parser_t *parser,
+                                         const lxb_css_syntax_token_t *token,
+                                         lxb_css_value_length_percentage_t *lp)
+{
+    const lxb_css_data_t *unit;
+
+    switch (token->type) {
+        case LXB_CSS_SYNTAX_TOKEN_DIMENSION:
+            unit = lxb_css_unit_absolute_relative_by_name(lxb_css_syntax_token_dimension(token)->str.data,
+                                                          lxb_css_syntax_token_dimension(token)->str.length);
+            if (unit == NULL) {
+                return false;
+            }
+
+            lp->type = LXB_CSS_VALUE__LENGTH;
+            lp->u.length.num = lxb_css_syntax_token_dimension(token)->num.num;
+            lp->u.length.is_float = lxb_css_syntax_token_dimension(token)->num.is_float;
+            lp->u.length.unit = (lxb_css_unit_t) unit->unique;
+            break;
+
+        case LXB_CSS_SYNTAX_TOKEN_NUMBER:
+            if (lxb_css_syntax_token_number(token)->num != 0) {
+                return false;
+            }
+
+            lp->type = LXB_CSS_VALUE__NUMBER;
+            lp->u.length.num = lxb_css_syntax_token_number(token)->num;
+            lp->u.length.is_float = lxb_css_syntax_token_number(token)->is_float;
+            lp->u.length.unit = LXB_CSS_UNIT__UNDEF;
+            break;
+
+        case LXB_CSS_SYNTAX_TOKEN_PERCENTAGE:
+            lp->type = LXB_CSS_VALUE__PERCENTAGE;
+            lp->u.percentage.num = lxb_css_syntax_token_percentage(token)->num;
+            lp->u.percentage.is_float = lxb_css_syntax_token_percentage(token)->is_float;
+            break;
+
+        default:
+            return false;
+    }
+
+    lxb_css_syntax_parser_consume(parser);
+
+    return true;
+}
+
+static bool
+lxb_css_property_state_number_length_percentage(lxb_css_parser_t *parser,
+                                                const lxb_css_syntax_token_t *token,
+                                                lxb_css_value_number_length_percentage_t *nlp)
+{
+    const lxb_css_data_t *unit;
+
+    switch (token->type) {
+        case LXB_CSS_SYNTAX_TOKEN_DIMENSION:
+            unit = lxb_css_unit_absolute_relative_by_name(lxb_css_syntax_token_dimension(token)->str.data,
+                                                          lxb_css_syntax_token_dimension(token)->str.length);
+            if (unit == NULL) {
+                return false;
+            }
+
+            nlp->type = LXB_CSS_VALUE__LENGTH;
+            nlp->u.length.num = lxb_css_syntax_token_dimension(token)->num.num;
+            nlp->u.length.is_float = lxb_css_syntax_token_dimension(token)->num.is_float;
+            nlp->u.length.unit = (lxb_css_unit_t) unit->unique;
+            break;
+
+        case LXB_CSS_SYNTAX_TOKEN_NUMBER:
+            nlp->type = LXB_CSS_VALUE__NUMBER;
+            nlp->u.number.num = lxb_css_syntax_token_number(token)->num;
+            nlp->u.number.is_float = lxb_css_syntax_token_number(token)->is_float;
+            break;
+
+        case LXB_CSS_SYNTAX_TOKEN_PERCENTAGE:
+            nlp->type = LXB_CSS_VALUE__PERCENTAGE;
+            nlp->u.percentage.num = lxb_css_syntax_token_percentage(token)->num;
+            nlp->u.percentage.is_float = lxb_css_syntax_token_percentage(token)->is_float;
+            break;
+
+        default:
+            return false;
+    }
+
+    lxb_css_syntax_parser_consume(parser);
+
+    return true;
+}
+
+static bool
+lxb_css_property_state_number_length(lxb_css_parser_t *parser,
+                                     const lxb_css_syntax_token_t *token,
+                                     lxb_css_value_number_length_t *nl)
+{
+    const lxb_css_data_t *unit;
+
+    switch (token->type) {
+        case LXB_CSS_SYNTAX_TOKEN_DIMENSION:
+            unit = lxb_css_unit_absolute_relative_by_name(lxb_css_syntax_token_dimension(token)->str.data,
+                                                          lxb_css_syntax_token_dimension(token)->str.length);
+            if (unit == NULL) {
+                return false;
+            }
+
+            nl->type = LXB_CSS_VALUE__LENGTH;
+            nl->u.length.num = lxb_css_syntax_token_dimension(token)->num.num;
+            nl->u.length.is_float = lxb_css_syntax_token_dimension(token)->num.is_float;
+            nl->u.length.unit = (lxb_css_unit_t) unit->unique;
+            break;
+
+        case LXB_CSS_SYNTAX_TOKEN_NUMBER:
+            nl->type = LXB_CSS_VALUE__NUMBER;
+            nl->u.number.num = lxb_css_syntax_token_number(token)->num;
+            nl->u.number.is_float = lxb_css_syntax_token_number(token)->is_float;
+            break;
+
+        default:
+            return false;
+    }
+
+    lxb_css_syntax_parser_consume(parser);
+
+    return true;
+}
+
+static bool
+lxb_css_property_state_number(lxb_css_parser_t *parser,
+                              const lxb_css_syntax_token_t *token,
+                              lxb_css_value_number_t *number)
+{
+    if (token->type != LXB_CSS_SYNTAX_TOKEN_NUMBER) {
+        return false;
+    }
+
+    number->num = lxb_css_syntax_token_number(token)->num;
+    number->is_float = lxb_css_syntax_token_number(token)->is_float;
+
+    lxb_css_syntax_parser_consume(parser);
+
+    return true;
+}
+
+static bool
+lxb_css_property_state_integer(lxb_css_parser_t *parser,
+                               const lxb_css_syntax_token_t *token,
+                               lxb_css_value_integer_t *intg)
+{
+    long ln;
+    double num;
+
+    if (token->type != LXB_CSS_SYNTAX_TOKEN_NUMBER) {
+        return false;
+    }
+
+    num = lxb_css_syntax_token_number(token)->num;
+    ln = lexbor_conv_double_to_long(num);
+
+    num = num - (double) ln;
+
+    if (num < 0.0 || num > 0.0) {
+        return false;
+    }
+
+    intg->num = ln;
+
+    lxb_css_syntax_parser_consume(parser);
+
+    return true;
+}
+
+static bool
+lxb_css_property_state_percentage(lxb_css_parser_t *parser,
+                                  const lxb_css_syntax_token_t *token,
+                                  lxb_css_value_percentage_t *perc)
+{
+    if (token->type != LXB_CSS_SYNTAX_TOKEN_PERCENTAGE) {
+        return false;
+    }
+
+    perc->num = lxb_css_syntax_token_percentage(token)->num;
+    perc->is_float = lxb_css_syntax_token_percentage(token)->is_float;
+
+    lxb_css_syntax_parser_consume(parser);
+
+    return true;
+}
+
+static bool
+lxb_css_property_state_number_percentage_none(lxb_css_parser_t *parser,
+                                              const lxb_css_syntax_token_t *token,
+                                              lxb_css_value_number_percentage_t *np)
+{
+    double num;
+    lxb_css_value_type_t type;
+
+    if (token->type == LXB_CSS_SYNTAX_TOKEN_NUMBER) {
+        np->type = LXB_CSS_VALUE__NUMBER;
+    }
+    else if (token->type == LXB_CSS_SYNTAX_TOKEN_PERCENTAGE) {
+        np->type = LXB_CSS_VALUE__PERCENTAGE;
+    }
+    else if (token->type == LXB_CSS_SYNTAX_TOKEN_IDENT) {
+        type = lxb_css_value_by_name(lxb_css_syntax_token_ident(token)->data,
+                                     lxb_css_syntax_token_ident(token)->length);
+        if (type != LXB_CSS_VALUE_NONE) {
+            return false;
+        }
+
+        np->type = LXB_CSS_VALUE_NONE;
+
+        lxb_css_syntax_parser_consume(parser);
+
+        return true;
+    }
+    else {
+        return false;
+    }
+
+    num = lxb_css_syntax_token_number(token)->num;
+
+    np->u.number.num = num;
+    np->u.number.is_float = lxb_css_syntax_token_number(token)->is_float;
+
+    lxb_css_syntax_parser_consume(parser);
+
+    return true;
+}
+
+static bool
+lxb_css_property_state_percentage_none(lxb_css_parser_t *parser,
+                                       const lxb_css_syntax_token_t *token,
+                                       lxb_css_value_percentage_type_t *np)
+{
+    double num;
+    lxb_css_value_type_t type;
+
+    if (token->type == LXB_CSS_SYNTAX_TOKEN_PERCENTAGE) {
+        np->type = LXB_CSS_VALUE__PERCENTAGE;
+    }
+    else if (token->type == LXB_CSS_SYNTAX_TOKEN_IDENT) {
+        type = lxb_css_value_by_name(lxb_css_syntax_token_ident(token)->data,
+                                     lxb_css_syntax_token_ident(token)->length);
+        if (type != LXB_CSS_VALUE_NONE) {
+            return false;
+        }
+
+        np->type = LXB_CSS_VALUE_NONE;
+
+        lxb_css_syntax_parser_consume(parser);
+
+        return true;
+    }
+    else {
+        return false;
+    }
+
+    num = lxb_css_syntax_token_number(token)->num;
+
+    np->percentage.num = num;
+    np->percentage.is_float = lxb_css_syntax_token_number(token)->is_float;
+
+    lxb_css_syntax_parser_consume(parser);
+
+    return true;
+}
+
+static bool
+lxb_css_property_state_number_percentage(lxb_css_parser_t *parser,
+                                         const lxb_css_syntax_token_t *token,
+                                         lxb_css_value_number_percentage_t *np)
+{
+    double num;
+
+    if (token->type == LXB_CSS_SYNTAX_TOKEN_NUMBER) {
+        np->type = LXB_CSS_VALUE__NUMBER;
+    }
+    else if (token->type == LXB_CSS_SYNTAX_TOKEN_PERCENTAGE) {
+        np->type = LXB_CSS_VALUE__PERCENTAGE;
+    }
+    else {
+        return false;
+    }
+
+    num = lxb_css_syntax_token_number(token)->num;
+
+    np->u.number.num = num;
+    np->u.number.is_float = lxb_css_syntax_token_number(token)->is_float;
+
+    lxb_css_syntax_parser_consume(parser);
+
+    return true;
+}
+
+static bool
+lxb_css_property_state_angle(lxb_css_parser_t *parser,
+                             const lxb_css_syntax_token_t *token,
+                             lxb_css_value_angle_t *angle)
+{
+    const lxb_css_data_t *unit;
+
+    if (token->type != LXB_CSS_SYNTAX_TOKEN_DIMENSION) {
+        return false;
+    }
+
+    unit = lxb_css_unit_angle_by_name(lxb_css_syntax_token_dimension(token)->str.data,
+                                      lxb_css_syntax_token_dimension(token)->str.length);
+    if (unit == NULL) {
+        return false;
+    }
+
+    angle->num = lxb_css_syntax_token_dimension(token)->num.num;
+    angle->is_float = lxb_css_syntax_token_dimension(token)->num.is_float;
+    angle->unit = (lxb_css_unit_angle_t) unit->unique;
+
+    lxb_css_syntax_parser_consume(parser);
+
+    return true;
+}
+
+bool
+lxb_css_property_state_width_handler(lxb_css_parser_t *parser,
+                                     const lxb_css_syntax_token_t *token,
+                                     lxb_css_property_width_t *width)
+{
+    lxb_css_value_type_t type;
+
+    if (token->type == LXB_CSS_SYNTAX_TOKEN_IDENT) {
+        type = lxb_css_value_by_name(lxb_css_syntax_token_ident(token)->data,
+                                     lxb_css_syntax_token_ident(token)->length);
+        switch (type) {
+            case LXB_CSS_VALUE_AUTO:
+            case LXB_CSS_VALUE_MIN_CONTENT:
+            case LXB_CSS_VALUE_MAX_CONTENT:
+                width->type = type;
+                break;
+
+            default:
+                return false;
+        }
+
+        lxb_css_syntax_parser_consume(parser);
+
+        return true;
+    }
+
+    return lxb_css_property_state_length_percentage(parser, token,
+                                   (lxb_css_value_length_percentage_t *)width);
+}
+
+static bool
+lxb_css_property_state_hue(lxb_css_parser_t *parser,
+                           const lxb_css_syntax_token_t *token,
+                           lxb_css_value_hue_t *hue)
+{
+    const lxb_css_data_t *unit;
+
+    switch (token->type) {
+        case LXB_CSS_SYNTAX_TOKEN_DIMENSION:
+            unit = lxb_css_unit_angle_by_name(lxb_css_syntax_token_dimension(token)->str.data,
+                                              lxb_css_syntax_token_dimension(token)->str.length);
+            if (unit == NULL) {
+                return false;
+            }
+
+            hue->type = LXB_CSS_VALUE__ANGLE;
+            hue->u.angle.num = lxb_css_syntax_token_dimension(token)->num.num;
+            hue->u.angle.is_float = lxb_css_syntax_token_dimension(token)->num.is_float;
+            hue->u.angle.unit = (lxb_css_unit_angle_t) unit->unique;
+            break;
+
+        case LXB_CSS_SYNTAX_TOKEN_NUMBER:
+            hue->type = LXB_CSS_VALUE__NUMBER;
+            hue->u.number.num = lxb_css_syntax_token_number(token)->num;
+            hue->u.number.is_float = lxb_css_syntax_token_number(token)->is_float;
+            break;
+
+        default:
+            return false;
+    }
+
+    lxb_css_syntax_parser_consume(parser);
+
+    return true;
+}
+
+lxb_inline bool
+lxb_css_property_state_hue_none(lxb_css_parser_t *parser,
+                                const lxb_css_syntax_token_t *token,
+                                lxb_css_value_hue_t *hue)
+{
+    lxb_css_value_type_t type;
+
+    if (token->type != LXB_CSS_SYNTAX_TOKEN_IDENT) {
+        return lxb_css_property_state_hue(parser, token, hue);
+    }
+
+    type = lxb_css_value_by_name(lxb_css_syntax_token_ident(token)->data,
+                                 lxb_css_syntax_token_ident(token)->length);
+    if (type != LXB_CSS_VALUE_NONE) {
+        return false;
+    }
+
+    hue->type = LXB_CSS_VALUE_NONE;
+
+    lxb_css_syntax_parser_consume(parser);
+
+    return true;
+}
+
+static bool
+lxb_css_property_state_color_hex(lxb_css_parser_t *parser,
+                                 const lxb_css_syntax_token_t *token,
+                                 lxb_css_value_color_t *color)
+{
+    size_t length;
+    uint32_t chex;
+    lxb_char_t ch;
+    const lxb_char_t *end, *p;
+    lxb_css_value_color_hex_rgba_t *rgba;
+
+    length = token->types.hash.length;
+
+    if (length > 8) {
+        return false;
+    }
+
+    p = token->types.hash.data;
+    end = p + length;
+
+    chex = 0;
+
+    while (p < end) {
+        ch = lexbor_str_res_map_lowercase[lexbor_str_res_map_hex[*p]];
+
+        if (ch == 0xff) {
+            return false;
+        }
+
+        chex = chex << 4 | ch;
+
+        p++;
+    }
+
+    rgba = &color->u.hex.rgba;
+
+    switch (length) {
+        case 3:
+            rgba->r = chex >> 8;
+            rgba->g = chex >> 4 & ~LXB_CSS_PROPERTY_STATE_HEX_MASK(4);
+            rgba->b = chex & ~LXB_CSS_PROPERTY_STATE_HEX_MASK(4);
+            rgba->a = 0xff;
+
+            color->u.hex.type = LXB_CSS_PROPERTY_COLOR_HEX_TYPE_3;
+            break;
+
+        case 4:
+            rgba->r = chex >> 12;
+            rgba->g = chex >> 8 & ~LXB_CSS_PROPERTY_STATE_HEX_MASK(4);
+            rgba->b = chex >> 4 & ~LXB_CSS_PROPERTY_STATE_HEX_MASK(4);
+            rgba->a = chex & ~LXB_CSS_PROPERTY_STATE_HEX_MASK(4);
+
+            color->u.hex.type = LXB_CSS_PROPERTY_COLOR_HEX_TYPE_4;
+            break;
+
+        case 6:
+            rgba->r = chex >> 16;
+            rgba->g = chex >> 8 & ~LXB_CSS_PROPERTY_STATE_HEX_MASK(8);
+            rgba->b = chex & ~LXB_CSS_PROPERTY_STATE_HEX_MASK(8);
+            rgba->a = 0xff;
+
+            color->u.hex.type = LXB_CSS_PROPERTY_COLOR_HEX_TYPE_6;
+            break;
+
+        case 8:
+            rgba->r = chex >> 24;
+            rgba->g = chex >> 16 & ~LXB_CSS_PROPERTY_STATE_HEX_MASK(8);
+            rgba->b = chex >> 8 & ~LXB_CSS_PROPERTY_STATE_HEX_MASK(8);
+            rgba->a = chex & ~LXB_CSS_PROPERTY_STATE_HEX_MASK(8);
+
+            color->u.hex.type = LXB_CSS_PROPERTY_COLOR_HEX_TYPE_8;
+            break;
+
+        default:
+            return false;
+    }
+
+    color->type = LXB_CSS_COLOR_HEX;
+
+    lxb_css_syntax_parser_consume(parser);
+
+    return true;
+}
+
+static bool
+lxb_css_property_state_color_rgba(lxb_css_parser_t *parser,
+                                  lxb_css_value_color_t *color)
+{
+    bool res;
+    lxb_css_color_type_t type;
+    lxb_css_value_color_rgba_t *rgb;
+    const lxb_css_syntax_token_t *token;
+
+    rgb = &color->u.rgb;
+
+    lxb_css_syntax_parser_consume(parser);
+    token = lxb_css_syntax_parser_token_wo_ws(parser);
+    lxb_css_property_state_check_token(parser, token);
+
+    res = lxb_css_property_state_number_percentage_none(parser, token, &rgb->r);
+    if (res == false) {
+        return false;
+    }
+
+    type = rgb->r.type;
+
+    token = lxb_css_syntax_parser_token_wo_ws(parser);
+    lxb_css_property_state_check_token(parser, token);
+
+    if (token->type == LXB_CSS_SYNTAX_TOKEN_COMMA) {
+        /* Deprecated format. */
+
+        if (type == LXB_CSS_VALUE_NONE) {
+            return false;
+        }
+
+        lxb_css_syntax_parser_consume(parser);
+        token = lxb_css_syntax_parser_token_wo_ws(parser);
+        lxb_css_property_state_check_token(parser, token);
+
+        rgb->old = true;
+
+        return lxb_css_property_state_color_rgba_old(parser, token, color);
+    }
+
+    res = lxb_css_property_state_number_percentage_none(parser, token, &rgb->g);
+    if (res == false) {
+        return false;
+    }
+
+    if (type != rgb->g.type) {
+        if (type == LXB_CSS_VALUE_NONE) {
+            type = rgb->g.type;
+        }
+        else if (rgb->g.type != LXB_CSS_VALUE_NONE) {
+            return false;
+        }
+    }
+
+    token = lxb_css_syntax_parser_token_wo_ws(parser);
+    lxb_css_property_state_check_token(parser, token);
+
+    res = lxb_css_property_state_number_percentage_none(parser, token, &rgb->b);
+    if (res == false) {
+        return false;
+    }
+
+    if (type != rgb->b.type && type != LXB_CSS_VALUE_NONE
+        && rgb->b.type != LXB_CSS_VALUE_NONE)
+    {
+            return false;
+    }
+
+    token = lxb_css_syntax_parser_token_wo_ws(parser);
+    lxb_css_property_state_check_token(parser, token);
+
+    if (token->type == LXB_CSS_SYNTAX_TOKEN_DELIM) {
+        if (lxb_css_syntax_token_delim(token)->character != '/') {
+            return false;
+        }
+
+        lxb_css_syntax_parser_consume(parser);
+        token = lxb_css_syntax_parser_token_wo_ws(parser);
+        lxb_css_property_state_check_token(parser, token);
+    }
+    else if (token->type == LXB_CSS_SYNTAX_TOKEN_R_PARENTHESIS) {
+        lxb_css_syntax_parser_consume(parser);
+        return true;
+    }
+    else {
+        return false;
+    }
+
+    res = lxb_css_property_state_number_percentage_none(parser, token, &rgb->a);
+    if (res == false) {
+        return false;
+    }
+
+    token = lxb_css_syntax_parser_token_wo_ws(parser);
+    lxb_css_property_state_check_token(parser, token);
+
+    if (token->type != LXB_CSS_SYNTAX_TOKEN_R_PARENTHESIS) {
+        return false;
+    }
+
+    lxb_css_syntax_parser_consume(parser);
+
+    return true;
+}
+
+static bool
+lxb_css_property_state_color_rgba_old(lxb_css_parser_t *parser,
+                                      const lxb_css_syntax_token_t *token,
+                                      lxb_css_value_color_t *color)
+{
+    bool res;
+    lxb_css_value_color_rgba_t *rgb;
+
+    rgb = &color->u.rgb;
+
+    res = lxb_css_property_state_number_percentage(parser, token, &rgb->g);
+    if (res == false) {
+        return false;
+    }
+
+    if (rgb->r.type != rgb->g.type) {
+        return false;
+    }
+
+    token = lxb_css_syntax_parser_token_wo_ws(parser);
+    lxb_css_property_state_check_token(parser, token);
+
+    if (token->type != LXB_CSS_SYNTAX_TOKEN_COMMA) {
+        return false;
+    }
+
+    lxb_css_syntax_parser_consume(parser);
+    token = lxb_css_syntax_parser_token_wo_ws(parser);
+    lxb_css_property_state_check_token(parser, token);
+
+    res = lxb_css_property_state_number_percentage(parser, token, &rgb->b);
+    if (res == false) {
+        return false;
+    }
+
+    if (rgb->r.type != rgb->b.type) {
+        return false;
+    }
+
+    token = lxb_css_syntax_parser_token_wo_ws(parser);
+    lxb_css_property_state_check_token(parser, token);
+
+    if (token->type == LXB_CSS_SYNTAX_TOKEN_R_PARENTHESIS) {
+        lxb_css_syntax_parser_consume(parser);
+        return true;
+    }
+    else if (token->type != LXB_CSS_SYNTAX_TOKEN_COMMA) {
+        return false;
+    }
+
+    lxb_css_syntax_parser_consume(parser);
+    token = lxb_css_syntax_parser_token_wo_ws(parser);
+    lxb_css_property_state_check_token(parser, token);
+
+    res = lxb_css_property_state_number_percentage(parser, token, &rgb->a);
+    if (res == false) {
+        return false;
+    }
+
+    token = lxb_css_syntax_parser_token_wo_ws(parser);
+    lxb_css_property_state_check_token(parser, token);
+
+    if (token->type != LXB_CSS_SYNTAX_TOKEN_R_PARENTHESIS) {
+        return false;
+    }
+
+    lxb_css_syntax_parser_consume(parser);
+
+    return true;
+}
+
+static bool
+lxb_css_property_state_color_hsla(lxb_css_parser_t *parser,
+                                  lxb_css_value_color_t *color)
+{
+    bool res;
+    lxb_css_value_color_hsla_t *hsl;
+    const lxb_css_syntax_token_t *token;
+
+    lxb_css_syntax_parser_consume(parser);
+    token = lxb_css_syntax_parser_token_wo_ws(parser);
+    lxb_css_property_state_check_token(parser, token);
+
+    hsl = &color->u.hsl;
+
+    res = lxb_css_property_state_hue_none(parser, token, &hsl->h);
+    if (res == false) {
+        return false;
+    }
+
+    token = lxb_css_syntax_parser_token_wo_ws(parser);
+    lxb_css_property_state_check_token(parser, token);
+
+    if (token->type == LXB_CSS_SYNTAX_TOKEN_COMMA) {
+        /* Deprecated format. */
+
+        if (hsl->h.type == LXB_CSS_VALUE_NONE) {
+            return false;
+        }
+
+        lxb_css_syntax_parser_consume(parser);
+        token = lxb_css_syntax_parser_token_wo_ws(parser);
+        lxb_css_property_state_check_token(parser, token);
+
+        hsl->old = true;
+
+        return lxb_css_property_state_color_hsla_old(parser, token, hsl);
+    }
+
+    res = lxb_css_property_state_percentage_none(parser, token, &hsl->s);
+    if (res == false) {
+        return false;
+    }
+
+    token = lxb_css_syntax_parser_token_wo_ws(parser);
+    lxb_css_property_state_check_token(parser, token);
+
+    res = lxb_css_property_state_percentage_none(parser, token, &hsl->l);
+    if (res == false) {
+        return false;
+    }
+
+    token = lxb_css_syntax_parser_token_wo_ws(parser);
+    lxb_css_property_state_check_token(parser, token);
+
+    if (token->type == LXB_CSS_SYNTAX_TOKEN_DELIM) {
+        if (lxb_css_syntax_token_delim(token)->character != '/') {
+            return false;
+        }
+
+        lxb_css_syntax_parser_consume(parser);
+        token = lxb_css_syntax_parser_token_wo_ws(parser);
+        lxb_css_property_state_check_token(parser, token);
+    }
+    else if (token->type == LXB_CSS_SYNTAX_TOKEN_R_PARENTHESIS) {
+        lxb_css_syntax_parser_consume(parser);
+        return true;
+    }
+
+    res = lxb_css_property_state_number_percentage_none(parser, token, &hsl->a);
+    if (res == false) {
+        return false;
+    }
+
+    token = lxb_css_syntax_parser_token_wo_ws(parser);
+    lxb_css_property_state_check_token(parser, token);
+
+    if (token->type != LXB_CSS_SYNTAX_TOKEN_R_PARENTHESIS) {
+        return false;
+    }
+
+    lxb_css_syntax_parser_consume(parser);
+
+    return true;
+}
+
+static bool
+lxb_css_property_state_color_hsla_old(lxb_css_parser_t *parser,
+                                      const lxb_css_syntax_token_t *token,
+                                      lxb_css_value_color_hsla_t *hsl)
+{
+    bool res;
+
+    res = lxb_css_property_state_percentage(parser, token, &hsl->s.percentage);
+    if (res == false) {
+        return false;
+    }
+
+    token = lxb_css_syntax_parser_token_wo_ws(parser);
+    lxb_css_property_state_check_token(parser, token);
+
+    if (token->type != LXB_CSS_SYNTAX_TOKEN_COMMA) {
+        return false;
+    }
+
+    lxb_css_syntax_parser_consume(parser);
+    token = lxb_css_syntax_parser_token_wo_ws(parser);
+    lxb_css_property_state_check_token(parser, token);
+
+    res = lxb_css_property_state_percentage(parser, token, &hsl->l.percentage);
+    if (res == false) {
+        return false;
+    }
+
+    lxb_css_syntax_parser_consume(parser);
+    token = lxb_css_syntax_parser_token_wo_ws(parser);
+    lxb_css_property_state_check_token(parser, token);
+
+    if (token->type == LXB_CSS_SYNTAX_TOKEN_R_PARENTHESIS) {
+        goto done;
+    }
+    else if (token->type != LXB_CSS_SYNTAX_TOKEN_COMMA) {
+        return false;
+    }
+
+    lxb_css_syntax_parser_consume(parser);
+    token = lxb_css_syntax_parser_token_wo_ws(parser);
+    lxb_css_property_state_check_token(parser, token);
+
+    res = lxb_css_property_state_number_percentage(parser, token, &hsl->a);
+    if (res == false) {
+        return false;
+    }
+
+    token = lxb_css_syntax_parser_token_wo_ws(parser);
+    lxb_css_property_state_check_token(parser, token);
+
+    if (token->type != LXB_CSS_SYNTAX_TOKEN_R_PARENTHESIS) {
+        return false;
+    }
+
+done:
+
+    lxb_css_syntax_parser_consume(parser);
+
+    hsl->s.type = LXB_CSS_VALUE__PERCENTAGE;
+    hsl->l.type = LXB_CSS_VALUE__PERCENTAGE;
+
+    return true;
+}
+
+static bool
+lxb_css_property_state_color_lab(lxb_css_parser_t *parser,
+                                 lxb_css_value_color_t *color)
+{
+    bool res;
+    lxb_css_value_color_lab_t *lab;
+    const lxb_css_syntax_token_t *token;
+
+    lab = &color->u.lab;
+
+    lxb_css_syntax_parser_consume(parser);
+    token = lxb_css_syntax_parser_token_wo_ws(parser);
+    lxb_css_property_state_check_token(parser, token);
+
+    res = lxb_css_property_state_number_percentage_none(parser, token, &lab->l);
+    if (res == false) {
+        return false;
+    }
+
+    token = lxb_css_syntax_parser_token_wo_ws(parser);
+    lxb_css_property_state_check_token(parser, token);
+
+    res = lxb_css_property_state_number_percentage_none(parser, token, &lab->a);
+    if (res == false) {
+        return false;
+    }
+
+    token = lxb_css_syntax_parser_token_wo_ws(parser);
+    lxb_css_property_state_check_token(parser, token);
+
+    res = lxb_css_property_state_number_percentage_none(parser, token, &lab->b);
+    if (res == false) {
+        return false;
+    }
+
+    token = lxb_css_syntax_parser_token_wo_ws(parser);
+    lxb_css_property_state_check_token(parser, token);
+
+    if (token->type == LXB_CSS_SYNTAX_TOKEN_DELIM) {
+        if (lxb_css_syntax_token_delim(token)->character != '/') {
+            return false;
+        }
+
+        lxb_css_syntax_parser_consume(parser);
+        token = lxb_css_syntax_parser_token_wo_ws(parser);
+        lxb_css_property_state_check_token(parser, token);
+    }
+    else if (token->type == LXB_CSS_SYNTAX_TOKEN_R_PARENTHESIS) {
+        lxb_css_syntax_parser_consume(parser);
+        return true;
+    }
+    else {
+        return false;
+    }
+
+    res = lxb_css_property_state_number_percentage_none(parser, token,
+                                                        &lab->alpha);
+    if (res == false) {
+        return false;
+    }
+
+    token = lxb_css_syntax_parser_token_wo_ws(parser);
+    lxb_css_property_state_check_token(parser, token);
+
+    if (token->type != LXB_CSS_SYNTAX_TOKEN_R_PARENTHESIS) {
+        return false;
+    }
+
+    lxb_css_syntax_parser_consume(parser);
+
+    return true;
+}
+
+static bool
+lxb_css_property_state_color_lch(lxb_css_parser_t *parser,
+                                 lxb_css_value_color_t *color)
+{
+    bool res;
+    lxb_css_value_color_lch_t *lch;
+    const lxb_css_syntax_token_t *token;
+
+    lch = &color->u.lch;
+
+    lxb_css_syntax_parser_consume(parser);
+    token = lxb_css_syntax_parser_token_wo_ws(parser);
+    lxb_css_property_state_check_token(parser, token);
+
+    res = lxb_css_property_state_number_percentage_none(parser, token, &lch->l);
+    if (res == false) {
+        return false;
+    }
+
+    token = lxb_css_syntax_parser_token_wo_ws(parser);
+    lxb_css_property_state_check_token(parser, token);
+
+    res = lxb_css_property_state_number_percentage_none(parser, token, &lch->c);
+    if (res == false) {
+        return false;
+    }
+
+    token = lxb_css_syntax_parser_token_wo_ws(parser);
+    lxb_css_property_state_check_token(parser, token);
+
+    res = lxb_css_property_state_hue_none(parser, token, &lch->h);
+    if (res == false) {
+        return false;
+    }
+
+    token = lxb_css_syntax_parser_token_wo_ws(parser);
+    lxb_css_property_state_check_token(parser, token);
+
+    if (token->type == LXB_CSS_SYNTAX_TOKEN_DELIM) {
+        if (lxb_css_syntax_token_delim(token)->character != '/') {
+            return false;
+        }
+
+        lxb_css_syntax_parser_consume(parser);
+        token = lxb_css_syntax_parser_token_wo_ws(parser);
+        lxb_css_property_state_check_token(parser, token);
+    }
+    else if (token->type == LXB_CSS_SYNTAX_TOKEN_R_PARENTHESIS) {
+        lxb_css_syntax_parser_consume(parser);
+        return true;
+    }
+    else {
+        return false;
+    }
+
+    res = lxb_css_property_state_number_percentage_none(parser, token, &lch->a);
+    if (res == false) {
+        return false;
+    }
+
+    token = lxb_css_syntax_parser_token_wo_ws(parser);
+    lxb_css_property_state_check_token(parser, token);
+
+    if (token->type != LXB_CSS_SYNTAX_TOKEN_R_PARENTHESIS) {
+        return false;
+    }
+
+    lxb_css_syntax_parser_consume(parser);
+
+    return true;
+}
+
+/*
+ * Return:
+ *     true  and status always LXB_STATUS_OK — token consumed, ok.
+ *     false and status != LXB_STATUS_OK     — token consumed, not ok.
+ *     false and status == LXB_STATUS_OK     — token not consumed, not ok.
+ */
+static bool
+lxb_css_property_state_color_handler(lxb_css_parser_t *parser,
+                                     const lxb_css_syntax_token_t *token,
+                                     lxb_css_value_color_t *color,
+                                     lxb_status_t *status)
+{
+    bool res;
+    lxb_css_value_type_t type;
+
+    *status = LXB_STATUS_OK;
+
+    switch (token->type) {
+        case LXB_CSS_SYNTAX_TOKEN_HASH:
+            color->type = LXB_CSS_VALUE_HEX;
+
+            return lxb_css_property_state_color_hex(parser, token, color);
+
+        case LXB_CSS_SYNTAX_TOKEN_FUNCTION:
+            type = lxb_css_value_by_name(lxb_css_syntax_token_function(token)->data,
+                                         lxb_css_syntax_token_function(token)->length);
+            color->type = type;
+
+            switch (type) {
+                /*  */
+                case LXB_CSS_VALUE_RGB:
+                case LXB_CSS_VALUE_RGBA:
+                    res = lxb_css_property_state_color_rgba(parser, color);
+                    break;
+
+                case LXB_CSS_VALUE_HSL:
+                case LXB_CSS_VALUE_HSLA:
+                case LXB_CSS_VALUE_HWB:
+                    res = lxb_css_property_state_color_hsla(parser, color);
+                    break;
+
+                case LXB_CSS_VALUE_LAB:
+                case LXB_CSS_VALUE_OKLAB:
+                    res = lxb_css_property_state_color_lab(parser, color);
+                    break;
+
+                case LXB_CSS_VALUE_LCH:
+                case LXB_CSS_VALUE_OKLCH:
+                    res = lxb_css_property_state_color_lch(parser, color);
+                    break;
+
+                case LXB_CSS_VALUE_COLOR:
+                default:
+                    *status = LXB_STATUS_OK;
+                    return false;
+            }
+
+            if (!res) {
+                *status = LXB_STATUS_ERROR_UNEXPECTED_DATA;
+            }
+
+            return res;
+
+        case LXB_CSS_SYNTAX_TOKEN_IDENT:
+            type = lxb_css_value_by_name(lxb_css_syntax_token_ident(token)->data,
+                                         lxb_css_syntax_token_ident(token)->length);
+            switch (type) {
+                /*  */
+                case LXB_CSS_VALUE_CURRENTCOLOR:
+                /*  */
+                case LXB_CSS_VALUE_CANVAS:
+                case LXB_CSS_VALUE_CANVASTEXT:
+                case LXB_CSS_VALUE_LINKTEXT:
+                case LXB_CSS_VALUE_VISITEDTEXT:
+                case LXB_CSS_VALUE_ACTIVETEXT:
+                case LXB_CSS_VALUE_BUTTONFACE:
+                case LXB_CSS_VALUE_BUTTONTEXT:
+                case LXB_CSS_VALUE_BUTTONBORDER:
+                case LXB_CSS_VALUE_FIELD:
+                case LXB_CSS_VALUE_FIELDTEXT:
+                case LXB_CSS_VALUE_HIGHLIGHT:
+                case LXB_CSS_VALUE_HIGHLIGHTTEXT:
+                case LXB_CSS_VALUE_SELECTEDITEM:
+                case LXB_CSS_VALUE_SELECTEDITEMTEXT:
+                case LXB_CSS_VALUE_MARK:
+                case LXB_CSS_VALUE_MARKTEXT:
+                case LXB_CSS_VALUE_GRAYTEXT:
+                case LXB_CSS_VALUE_ACCENTCOLOR:
+                case LXB_CSS_VALUE_ACCENTCOLORTEXT:
+                /*  */
+                case LXB_CSS_VALUE_TRANSPARENT:
+                /*  */
+                case LXB_CSS_VALUE_ALICEBLUE:
+                case LXB_CSS_VALUE_ANTIQUEWHITE:
+                case LXB_CSS_VALUE_AQUA:
+                case LXB_CSS_VALUE_AQUAMARINE:
+                case LXB_CSS_VALUE_AZURE:
+                case LXB_CSS_VALUE_BEIGE:
+                case LXB_CSS_VALUE_BISQUE:
+                case LXB_CSS_VALUE_BLACK:
+                case LXB_CSS_VALUE_BLANCHEDALMOND:
+                case LXB_CSS_VALUE_BLUE:
+                case LXB_CSS_VALUE_BLUEVIOLET:
+                case LXB_CSS_VALUE_BROWN:
+                case LXB_CSS_VALUE_BURLYWOOD:
+                case LXB_CSS_VALUE_CADETBLUE:
+                case LXB_CSS_VALUE_CHARTREUSE:
+                case LXB_CSS_VALUE_CHOCOLATE:
+                case LXB_CSS_VALUE_CORAL:
+                case LXB_CSS_VALUE_CORNFLOWERBLUE:
+                case LXB_CSS_VALUE_CORNSILK:
+                case LXB_CSS_VALUE_CRIMSON:
+                case LXB_CSS_VALUE_CYAN:
+                case LXB_CSS_VALUE_DARKBLUE:
+                case LXB_CSS_VALUE_DARKCYAN:
+                case LXB_CSS_VALUE_DARKGOLDENROD:
+                case LXB_CSS_VALUE_DARKGRAY:
+                case LXB_CSS_VALUE_DARKGREEN:
+                case LXB_CSS_VALUE_DARKGREY:
+                case LXB_CSS_VALUE_DARKKHAKI:
+                case LXB_CSS_VALUE_DARKMAGENTA:
+                case LXB_CSS_VALUE_DARKOLIVEGREEN:
+                case LXB_CSS_VALUE_DARKORANGE:
+                case LXB_CSS_VALUE_DARKORCHID:
+                case LXB_CSS_VALUE_DARKRED:
+                case LXB_CSS_VALUE_DARKSALMON:
+                case LXB_CSS_VALUE_DARKSEAGREEN:
+                case LXB_CSS_VALUE_DARKSLATEBLUE:
+                case LXB_CSS_VALUE_DARKSLATEGRAY:
+                case LXB_CSS_VALUE_DARKSLATEGREY:
+                case LXB_CSS_VALUE_DARKTURQUOISE:
+                case LXB_CSS_VALUE_DARKVIOLET:
+                case LXB_CSS_VALUE_DEEPPINK:
+                case LXB_CSS_VALUE_DEEPSKYBLUE:
+                case LXB_CSS_VALUE_DIMGRAY:
+                case LXB_CSS_VALUE_DIMGREY:
+                case LXB_CSS_VALUE_DODGERBLUE:
+                case LXB_CSS_VALUE_FIREBRICK:
+                case LXB_CSS_VALUE_FLORALWHITE:
+                case LXB_CSS_VALUE_FORESTGREEN:
+                case LXB_CSS_VALUE_FUCHSIA:
+                case LXB_CSS_VALUE_GAINSBORO:
+                case LXB_CSS_VALUE_GHOSTWHITE:
+                case LXB_CSS_VALUE_GOLD:
+                case LXB_CSS_VALUE_GOLDENROD:
+                case LXB_CSS_VALUE_GRAY:
+                case LXB_CSS_VALUE_GREEN:
+                case LXB_CSS_VALUE_GREENYELLOW:
+                case LXB_CSS_VALUE_GREY:
+                case LXB_CSS_VALUE_HONEYDEW:
+                case LXB_CSS_VALUE_HOTPINK:
+                case LXB_CSS_VALUE_INDIANRED:
+                case LXB_CSS_VALUE_INDIGO:
+                case LXB_CSS_VALUE_IVORY:
+                case LXB_CSS_VALUE_KHAKI:
+                case LXB_CSS_VALUE_LAVENDER:
+                case LXB_CSS_VALUE_LAVENDERBLUSH:
+                case LXB_CSS_VALUE_LAWNGREEN:
+                case LXB_CSS_VALUE_LEMONCHIFFON:
+                case LXB_CSS_VALUE_LIGHTBLUE:
+                case LXB_CSS_VALUE_LIGHTCORAL:
+                case LXB_CSS_VALUE_LIGHTCYAN:
+                case LXB_CSS_VALUE_LIGHTGOLDENRODYELLOW:
+                case LXB_CSS_VALUE_LIGHTGRAY:
+                case LXB_CSS_VALUE_LIGHTGREEN:
+                case LXB_CSS_VALUE_LIGHTGREY:
+                case LXB_CSS_VALUE_LIGHTPINK:
+                case LXB_CSS_VALUE_LIGHTSALMON:
+                case LXB_CSS_VALUE_LIGHTSEAGREEN:
+                case LXB_CSS_VALUE_LIGHTSKYBLUE:
+                case LXB_CSS_VALUE_LIGHTSLATEGRAY:
+                case LXB_CSS_VALUE_LIGHTSLATEGREY:
+                case LXB_CSS_VALUE_LIGHTSTEELBLUE:
+                case LXB_CSS_VALUE_LIGHTYELLOW:
+                case LXB_CSS_VALUE_LIME:
+                case LXB_CSS_VALUE_LIMEGREEN:
+                case LXB_CSS_VALUE_LINEN:
+                case LXB_CSS_VALUE_MAGENTA:
+                case LXB_CSS_VALUE_MAROON:
+                case LXB_CSS_VALUE_MEDIUMAQUAMARINE:
+                case LXB_CSS_VALUE_MEDIUMBLUE:
+                case LXB_CSS_VALUE_MEDIUMORCHID:
+                case LXB_CSS_VALUE_MEDIUMPURPLE:
+                case LXB_CSS_VALUE_MEDIUMSEAGREEN:
+                case LXB_CSS_VALUE_MEDIUMSLATEBLUE:
+                case LXB_CSS_VALUE_MEDIUMSPRINGGREEN:
+                case LXB_CSS_VALUE_MEDIUMTURQUOISE:
+                case LXB_CSS_VALUE_MEDIUMVIOLETRED:
+                case LXB_CSS_VALUE_MIDNIGHTBLUE:
+                case LXB_CSS_VALUE_MINTCREAM:
+                case LXB_CSS_VALUE_MISTYROSE:
+                case LXB_CSS_VALUE_MOCCASIN:
+                case LXB_CSS_VALUE_NAVAJOWHITE:
+                case LXB_CSS_VALUE_NAVY:
+                case LXB_CSS_VALUE_OLDLACE:
+                case LXB_CSS_VALUE_OLIVE:
+                case LXB_CSS_VALUE_OLIVEDRAB:
+                case LXB_CSS_VALUE_ORANGE:
+                case LXB_CSS_VALUE_ORANGERED:
+                case LXB_CSS_VALUE_ORCHID:
+                case LXB_CSS_VALUE_PALEGOLDENROD:
+                case LXB_CSS_VALUE_PALEGREEN:
+                case LXB_CSS_VALUE_PALETURQUOISE:
+                case LXB_CSS_VALUE_PALEVIOLETRED:
+                case LXB_CSS_VALUE_PAPAYAWHIP:
+                case LXB_CSS_VALUE_PEACHPUFF:
+                case LXB_CSS_VALUE_PERU:
+                case LXB_CSS_VALUE_PINK:
+                case LXB_CSS_VALUE_PLUM:
+                case LXB_CSS_VALUE_POWDERBLUE:
+                case LXB_CSS_VALUE_PURPLE:
+                case LXB_CSS_VALUE_REBECCAPURPLE:
+                case LXB_CSS_VALUE_RED:
+                case LXB_CSS_VALUE_ROSYBROWN:
+                case LXB_CSS_VALUE_ROYALBLUE:
+                case LXB_CSS_VALUE_SADDLEBROWN:
+                case LXB_CSS_VALUE_SALMON:
+                case LXB_CSS_VALUE_SANDYBROWN:
+                case LXB_CSS_VALUE_SEAGREEN:
+                case LXB_CSS_VALUE_SEASHELL:
+                case LXB_CSS_VALUE_SIENNA:
+                case LXB_CSS_VALUE_SILVER:
+                case LXB_CSS_VALUE_SKYBLUE:
+                case LXB_CSS_VALUE_SLATEBLUE:
+                case LXB_CSS_VALUE_SLATEGRAY:
+                case LXB_CSS_VALUE_SLATEGREY:
+                case LXB_CSS_VALUE_SNOW:
+                case LXB_CSS_VALUE_SPRINGGREEN:
+                case LXB_CSS_VALUE_STEELBLUE:
+                case LXB_CSS_VALUE_TAN:
+                case LXB_CSS_VALUE_TEAL:
+                case LXB_CSS_VALUE_THISTLE:
+                case LXB_CSS_VALUE_TOMATO:
+                case LXB_CSS_VALUE_TURQUOISE:
+                case LXB_CSS_VALUE_VIOLET:
+                case LXB_CSS_VALUE_WHEAT:
+                case LXB_CSS_VALUE_WHITE:
+                case LXB_CSS_VALUE_WHITESMOKE:
+                case LXB_CSS_VALUE_YELLOW:
+                case LXB_CSS_VALUE_YELLOWGREEN:
+                    color->type = type;
+                    break;
+
+                default:
+                    return false;
+            }
+
+            break;
+
+        default:
+            return false;
+    }
+
+    lxb_css_syntax_parser_consume(parser);
+
+    return true;
+}
+
+bool
+lxb_css_property_state__undef(lxb_css_parser_t *parser,
+                              const lxb_css_syntax_token_t *token, void *ctx)
+{
+    return lxb_css_parser_failed(parser);
+}
+
+bool
+lxb_css_property_state__custom(lxb_css_parser_t *parser,
+                               const lxb_css_syntax_token_t *token, void *ctx)
+{
+    lxb_status_t status;
+    lxb_css_rule_declaration_t *declar = ctx;
+    lxb_css_property__custom_t *custom = declar->u.custom;
+
+    (void) lexbor_str_init(&custom->value, parser->memory->mraw, 0);
+    if (custom->value.data == NULL) {
+        return lxb_css_parser_memory_fail(parser);
+    }
+
+    while (token != NULL && token->type != LXB_CSS_SYNTAX_TOKEN__END) {
+        status = lxb_css_syntax_token_serialize_str(token, &custom->value,
+                                                    parser->memory->mraw);
+        if (status != LXB_STATUS_OK) {
+            return lxb_css_parser_memory_fail(parser);
+        }
+
+        lxb_css_syntax_parser_consume(parser);
+        token = lxb_css_syntax_parser_token(parser);
+    }
+
+    return lxb_css_parser_success(parser);
+}
+
+bool
+lxb_css_property_state_display(lxb_css_parser_t *parser,
+                               const lxb_css_syntax_token_t *token, void *ctx)
+{
+    lxb_css_value_type_t type;
+    lxb_css_property_display_t *display;
+    lxb_css_rule_declaration_t *declar = ctx;
+
+    if (token->type != LXB_CSS_SYNTAX_TOKEN_IDENT) {
+        return lxb_css_parser_failed(parser);
+    }
+
+    display = declar->u.display;
+
+    type = lxb_css_value_by_name(lxb_css_syntax_token_ident(token)->data,
+                                 lxb_css_syntax_token_ident(token)->length);
+
+    switch (type) {
+        /*  */
+        case LXB_CSS_DISPLAY_BLOCK:
+        case LXB_CSS_DISPLAY_INLINE:
+        case LXB_CSS_DISPLAY_RUN_IN:
+            display->a = type;
+            goto inside_listitem;
+
+        /*  */
+        case LXB_CSS_DISPLAY_FLOW:
+        case LXB_CSS_DISPLAY_FLOW_ROOT:
+            display->a = type;
+            goto outside_listitem;
+
+        case LXB_CSS_DISPLAY_TABLE:
+        case LXB_CSS_DISPLAY_FLEX:
+        case LXB_CSS_DISPLAY_GRID:
+        case LXB_CSS_DISPLAY_RUBY:
+            display->a = type;
+            goto outside;
+
+        /*  */
+        case LXB_CSS_DISPLAY_LIST_ITEM:
+            display->a = type;
+            goto listitem_only;
+
+        /*  */
+        case LXB_CSS_DISPLAY_TABLE_ROW_GROUP:
+        case LXB_CSS_DISPLAY_TABLE_HEADER_GROUP:
+        case LXB_CSS_DISPLAY_TABLE_FOOTER_GROUP:
+        case LXB_CSS_DISPLAY_TABLE_ROW:
+        case LXB_CSS_DISPLAY_TABLE_CELL:
+        case LXB_CSS_DISPLAY_TABLE_COLUMN_GROUP:
+        case LXB_CSS_DISPLAY_TABLE_COLUMN:
+        case LXB_CSS_DISPLAY_TABLE_CAPTION:
+        case LXB_CSS_DISPLAY_RUBY_BASE:
+        case LXB_CSS_DISPLAY_RUBY_TEXT:
+        case LXB_CSS_DISPLAY_RUBY_BASE_CONTAINER:
+        case LXB_CSS_DISPLAY_RUBY_TEXT_CONTAINER:
+        /*  */
+        case LXB_CSS_DISPLAY_CONTENTS:
+        case LXB_CSS_DISPLAY_NONE:
+        /*  */
+        case LXB_CSS_DISPLAY_INLINE_BLOCK:
+        case LXB_CSS_DISPLAY_INLINE_TABLE:
+        case LXB_CSS_DISPLAY_INLINE_FLEX:
+        case LXB_CSS_DISPLAY_INLINE_GRID:
+            display->a = type;
+            goto done;
+
+        /* Global. */
+        case LXB_CSS_VALUE_INITIAL:
+        case LXB_CSS_VALUE_INHERIT:
+        case LXB_CSS_VALUE_UNSET:
+        case LXB_CSS_VALUE_REVERT:
+            display->a = type;
+            goto done;
+
+        default:
+            return lxb_css_parser_failed(parser);
+    }
+
+inside_listitem:
+
+    lxb_css_property_state_get_type(parser, token, type);
+
+    switch (type) {
+        /*  */
+        case LXB_CSS_DISPLAY_FLOW:
+        case LXB_CSS_DISPLAY_FLOW_ROOT:
+            display->b = type;
+            break;
+
+        case LXB_CSS_DISPLAY_TABLE:
+        case LXB_CSS_DISPLAY_FLEX:
+        case LXB_CSS_DISPLAY_GRID:
+        case LXB_CSS_DISPLAY_RUBY:
+            display->b = type;
+            goto done;
+
+        case LXB_CSS_DISPLAY_LIST_ITEM:
+            display->b = type;
+            goto flow_only;
+
+        default:
+            return lxb_css_parser_failed(parser);
+    }
+
+listitem:
+
+    lxb_css_property_state_get_type(parser, token, type);
+
+    if (type == LXB_CSS_DISPLAY_LIST_ITEM) {
+        display->c = type;
+        goto done;
+    }
+
+    return lxb_css_parser_failed(parser);
+
+outside:
+
+    lxb_css_property_state_get_type(parser, token, type);
+
+    switch (type) {
+        /*  */
+        case LXB_CSS_DISPLAY_BLOCK:
+        case LXB_CSS_DISPLAY_INLINE:
+        case LXB_CSS_DISPLAY_RUN_IN:
+            if (display->b == LXB_CSS_PROPERTY__UNDEF) {
+                display->b = type;
+            }
+            else {
+                display->c = type;
+            }
+
+            goto done;
+
+        default:
+            return lxb_css_parser_failed(parser);
+    }
+
+outside_listitem:
+
+    lxb_css_property_state_get_type(parser, token, type);
+
+    switch (type) {
+        /*  */
+        case LXB_CSS_DISPLAY_BLOCK:
+        case LXB_CSS_DISPLAY_INLINE:
+        case LXB_CSS_DISPLAY_RUN_IN:
+            display->b = type;
+            goto listitem;
+
+        case LXB_CSS_DISPLAY_LIST_ITEM:
+            display->b = type;
+            goto outside;
+
+        default:
+            return lxb_css_parser_failed(parser);
+    }
+
+listitem_only:
+
+    lxb_css_property_state_get_type(parser, token, type);
+
+    switch (type) {
+        /*  */
+        case LXB_CSS_DISPLAY_BLOCK:
+        case LXB_CSS_DISPLAY_INLINE:
+        case LXB_CSS_DISPLAY_RUN_IN:
+            display->b = type;
+            break;
+
+        /*  */
+        case LXB_CSS_DISPLAY_FLOW:
+        case LXB_CSS_DISPLAY_FLOW_ROOT:
+            display->b = type;
+            goto outside;
+
+        default:
+            return lxb_css_parser_failed(parser);
+    }
+
+flow_only:
+
+    lxb_css_property_state_get_type(parser, token, type);
+
+    switch (type) {
+        /*  */
+        case LXB_CSS_DISPLAY_FLOW:
+        case LXB_CSS_DISPLAY_FLOW_ROOT:
+            display->c = type;
+            break;
+
+        default:
+            return lxb_css_parser_failed(parser);
+    }
+
+done:
+
+    lxb_css_syntax_parser_consume(parser);
+
+    return lxb_css_parser_success(parser);
+}
+
+bool
+lxb_css_property_state_order(lxb_css_parser_t *parser,
+                             const lxb_css_syntax_token_t *token, void *ctx)
+{
+    bool res;
+    lxb_css_value_type_t type;
+    lxb_css_rule_declaration_t *declar = ctx;
+
+    res = lxb_css_property_state_integer(parser, token,
+                                         &declar->u.order->integer);
+    if (res) {
+        declar->u.order->type = LXB_CSS_ORDER__INTEGER;
+
+        return lxb_css_parser_success(parser);
+    }
+
+    if (token->type != LXB_CSS_SYNTAX_TOKEN_IDENT) {
+        return lxb_css_parser_failed(parser);
+    }
+
+    type = lxb_css_value_by_name(lxb_css_syntax_token_ident(token)->data,
+                                 lxb_css_syntax_token_ident(token)->length);
+    switch (type) {
+        case LXB_CSS_VALUE_INITIAL:
+        case LXB_CSS_VALUE_INHERIT:
+        case LXB_CSS_VALUE_UNSET:
+        case LXB_CSS_VALUE_REVERT:
+            declar->u.order->type = type;
+            break;
+
+        default:
+            return lxb_css_parser_failed(parser);
+    }
+
+    lxb_css_syntax_parser_consume(parser);
+
+    return lxb_css_parser_success(parser);
+}
+
+bool
+lxb_css_property_state_visibility(lxb_css_parser_t *parser,
+                                  const lxb_css_syntax_token_t *token, void *ctx)
+{
+    lxb_css_value_type_t type;
+    lxb_css_rule_declaration_t *declar = ctx;
+
+    if (token->type != LXB_CSS_SYNTAX_TOKEN_IDENT) {
+        return lxb_css_parser_failed(parser);
+    }
+
+    type = lxb_css_value_by_name(lxb_css_syntax_token_ident(token)->data,
+                                 lxb_css_syntax_token_ident(token)->length);
+    switch (type) {
+        /* Global. */
+        case LXB_CSS_VALUE_INITIAL:
+        case LXB_CSS_VALUE_INHERIT:
+        case LXB_CSS_VALUE_UNSET:
+        case LXB_CSS_VALUE_REVERT:
+        /* Local. */
+        case LXB_CSS_VISIBILITY_VISIBLE:
+        case LXB_CSS_VISIBILITY_HIDDEN:
+        case LXB_CSS_VISIBILITY_COLLAPSE:
+            declar->u.visibility->type = type;
+            break;
+
+        default:
+            return lxb_css_parser_failed(parser);
+    }
+
+    lxb_css_syntax_parser_consume(parser);
+
+    return lxb_css_parser_success(parser);
+}
+
+bool
+lxb_css_property_state_width(lxb_css_parser_t *parser,
+                             const lxb_css_syntax_token_t *token, void *ctx)
+{
+    lxb_css_value_type_t type;
+    lxb_css_rule_declaration_t *declar = ctx;
+
+    if (token->type == LXB_CSS_SYNTAX_TOKEN_IDENT) {
+        type = lxb_css_value_by_name(lxb_css_syntax_token_ident(token)->data,
+                                     lxb_css_syntax_token_ident(token)->length);
+        switch (type) {
+            case LXB_CSS_VALUE_INITIAL:
+            case LXB_CSS_VALUE_INHERIT:
+            case LXB_CSS_VALUE_UNSET:
+            case LXB_CSS_VALUE_REVERT:
+            case LXB_CSS_VALUE_AUTO:
+            case LXB_CSS_VALUE_MIN_CONTENT:
+            case LXB_CSS_VALUE_MAX_CONTENT:
+                declar->u.width->type = type;
+                break;
+
+            default:
+                return lxb_css_parser_failed(parser);
+        }
+
+        lxb_css_syntax_parser_consume(parser);
+
+        return lxb_css_parser_success(parser);
+    }
+
+    if (!lxb_css_property_state_length_percentage(parser, token,
+                                                  declar->u.user))
+    {
+        return lxb_css_parser_failed(parser);
+    }
+
+    return lxb_css_parser_success(parser);
+}
+
+bool
+lxb_css_property_state_height(lxb_css_parser_t *parser,
+                              const lxb_css_syntax_token_t *token, void *ctx)
+{
+    return lxb_css_property_state_width(parser, token, ctx);
+}
+
+bool
+lxb_css_property_state_box_sizing(lxb_css_parser_t *parser,
+                                  const lxb_css_syntax_token_t *token, void *ctx)
+{
+    lxb_css_value_type_t type;
+    lxb_css_rule_declaration_t *declar = ctx;
+
+    if (token->type != LXB_CSS_SYNTAX_TOKEN_IDENT) {
+        return lxb_css_parser_failed(parser);
+    }
+
+    type = lxb_css_value_by_name(lxb_css_syntax_token_ident(token)->data,
+                                 lxb_css_syntax_token_ident(token)->length);
+    switch (type) {
+        case LXB_CSS_VALUE_INITIAL:
+        case LXB_CSS_VALUE_INHERIT:
+        case LXB_CSS_VALUE_UNSET:
+        case LXB_CSS_VALUE_REVERT:
+        case LXB_CSS_VALUE_CONTENT_BOX:
+        case LXB_CSS_VALUE_BORDER_BOX:
+            declar->u.box_sizing->type = type;
+            break;
+
+        default:
+            return lxb_css_parser_failed(parser);
+    }
+
+    lxb_css_syntax_parser_consume(parser);
+
+    return lxb_css_parser_success(parser);
+}
+
+bool
+lxb_css_property_state_min_width(lxb_css_parser_t *parser,
+                                 const lxb_css_syntax_token_t *token, void *ctx)
+{
+    return lxb_css_property_state_width(parser, token, ctx);
+}
+
+bool
+lxb_css_property_state_min_height(lxb_css_parser_t *parser,
+                                  const lxb_css_syntax_token_t *token, void *ctx)
+{
+    return lxb_css_property_state_width(parser, token, ctx);
+}
+
+bool
+lxb_css_property_state_max_width(lxb_css_parser_t *parser,
+                                 const lxb_css_syntax_token_t *token, void *ctx)
+{
+    lxb_css_value_type_t type;
+    lxb_css_rule_declaration_t *declar = ctx;
+
+    if (token->type == LXB_CSS_SYNTAX_TOKEN_IDENT) {
+        type = lxb_css_value_by_name(lxb_css_syntax_token_ident(token)->data,
+                                     lxb_css_syntax_token_ident(token)->length);
+        switch (type) {
+            case LXB_CSS_VALUE_INITIAL:
+            case LXB_CSS_VALUE_INHERIT:
+            case LXB_CSS_VALUE_UNSET:
+            case LXB_CSS_VALUE_REVERT:
+            case LXB_CSS_VALUE_NONE:
+            case LXB_CSS_VALUE_MIN_CONTENT:
+            case LXB_CSS_VALUE_MAX_CONTENT:
+                declar->u.width->type = type;
+                break;
+
+            default:
+                return lxb_css_parser_failed(parser);
+        }
+
+        lxb_css_syntax_parser_consume(parser);
+
+        return lxb_css_parser_success(parser);
+    }
+
+    if (!lxb_css_property_state_length_percentage(parser, token,
+                                                  declar->u.user))
+    {
+        return lxb_css_parser_failed(parser);
+    }
+
+    return lxb_css_parser_success(parser);
+}
+
+bool
+lxb_css_property_state_max_height(lxb_css_parser_t *parser,
+                                  const lxb_css_syntax_token_t *token, void *ctx)
+{
+    return lxb_css_property_state_max_width(parser, token, ctx);
+}
+
+static bool
+lxb_css_property_state_mp(lxb_css_parser_t *parser,
+                          const lxb_css_syntax_token_t *token,
+                          lxb_css_rule_declaration_t *declar, bool with_auto)
+{
+    unsigned int state;
+    lxb_css_value_type_t type;
+    lxb_css_property_margin_top_t *top;
+
+    state = 1;
+
+next:
+
+    switch (state) {
+        case 1:
+            top = &declar->u.margin->top;
+            break;
+
+        case 2:
+            top = &declar->u.margin->right;
+            break;
+
+        case 3:
+            top = &declar->u.margin->bottom;
+            break;
+
+        case 4:
+            top = &declar->u.margin->left;
+            break;
+
+        default:
+            return lxb_css_parser_failed(parser);
+    }
+
+    if (token->type == LXB_CSS_SYNTAX_TOKEN_IDENT) {
+        type = lxb_css_value_by_name(lxb_css_syntax_token_ident(token)->data,
+                                     lxb_css_syntax_token_ident(token)->length);
+        switch (type) {
+            case LXB_CSS_VALUE_INITIAL:
+            case LXB_CSS_VALUE_INHERIT:
+            case LXB_CSS_VALUE_UNSET:
+            case LXB_CSS_VALUE_REVERT:
+                top->type = type;
+                break;
+
+            case LXB_CSS_VALUE_AUTO:
+                if (with_auto) {
+                    top->type = type;
+                    break;
+                }
+
+                /* Fall through. */
+
+            default:
+                return lxb_css_parser_failed(parser);
+        }
+
+        lxb_css_syntax_parser_consume(parser);
+    }
+    else if (!lxb_css_property_state_length_percentage(parser, token,
+                                    (lxb_css_value_length_percentage_t *) top))
+    {
+        return lxb_css_parser_failed(parser);
+    }
+
+    token = lxb_css_syntax_parser_token_wo_ws(parser);
+    lxb_css_property_state_check_token(parser, token);
+
+    if (token->type == LXB_CSS_SYNTAX_TOKEN__END) {
+        return lxb_css_parser_success(parser);
+    }
+
+    state++;
+
+    goto next;
+}
+
+static bool
+lxb_css_property_state_mp_top(lxb_css_parser_t *parser,
+                              const lxb_css_syntax_token_t *token,
+                              lxb_css_rule_declaration_t *declar, bool with_auto)
+{
+    lxb_css_value_type_t type;
+
+    if (token->type == LXB_CSS_SYNTAX_TOKEN_IDENT) {
+        type = lxb_css_value_by_name(lxb_css_syntax_token_ident(token)->data,
+                                     lxb_css_syntax_token_ident(token)->length);
+        switch (type) {
+            case LXB_CSS_VALUE_INITIAL:
+            case LXB_CSS_VALUE_INHERIT:
+            case LXB_CSS_VALUE_UNSET:
+            case LXB_CSS_VALUE_REVERT:
+                declar->u.margin_top->type = type;
+                break;
+
+            case LXB_CSS_VALUE_AUTO:
+                if (with_auto) {
+                    declar->u.margin_top->type = type;
+                    break;
+                }
+
+                /* Fall through. */
+
+            default:
+                return lxb_css_parser_failed(parser);
+        }
+
+        lxb_css_syntax_parser_consume(parser);
+
+        return lxb_css_parser_success(parser);
+    }
+
+    if (!lxb_css_property_state_length_percentage(parser, token,
+                                                  declar->u.user))
+    {
+        return lxb_css_parser_failed(parser);
+    }
+
+    return lxb_css_parser_success(parser);
+}
+
+bool
+lxb_css_property_state_margin(lxb_css_parser_t *parser,
+                              const lxb_css_syntax_token_t *token, void *ctx)
+{
+    return lxb_css_property_state_mp(parser, token, ctx, true);
+}
+
+bool
+lxb_css_property_state_margin_top(lxb_css_parser_t *parser,
+                                  const lxb_css_syntax_token_t *token, void *ctx)
+{
+    return lxb_css_property_state_mp_top(parser, token, ctx, true);
+}
+
+bool
+lxb_css_property_state_margin_right(lxb_css_parser_t *parser,
+                                    const lxb_css_syntax_token_t *token, void *ctx)
+{
+    return lxb_css_property_state_mp_top(parser, token, ctx, true);
+}
+
+bool
+lxb_css_property_state_margin_bottom(lxb_css_parser_t *parser,
+                                     const lxb_css_syntax_token_t *token, void *ctx)
+{
+    return lxb_css_property_state_mp_top(parser, token, ctx, true);
+}
+
+bool
+lxb_css_property_state_margin_left(lxb_css_parser_t *parser,
+                                   const lxb_css_syntax_token_t *token, void *ctx)
+{
+    return lxb_css_property_state_mp_top(parser, token, ctx, true);
+}
+
+bool
+lxb_css_property_state_padding(lxb_css_parser_t *parser,
+                               const lxb_css_syntax_token_t *token, void *ctx)
+{
+    return lxb_css_property_state_mp(parser, token, ctx, false);
+}
+
+bool
+lxb_css_property_state_padding_top(lxb_css_parser_t *parser,
+                                   const lxb_css_syntax_token_t *token, void *ctx)
+{
+    return lxb_css_property_state_mp_top(parser, token, ctx, false);
+}
+
+bool
+lxb_css_property_state_padding_right(lxb_css_parser_t *parser,
+                                     const lxb_css_syntax_token_t *token, void *ctx)
+{
+    return lxb_css_property_state_mp_top(parser, token, ctx, false);
+}
+
+bool
+lxb_css_property_state_padding_bottom(lxb_css_parser_t *parser,
+                                      const lxb_css_syntax_token_t *token, void *ctx)
+{
+    return lxb_css_property_state_mp_top(parser, token, ctx, false);
+}
+
+bool
+lxb_css_property_state_padding_left(lxb_css_parser_t *parser,
+                                    const lxb_css_syntax_token_t *token, void *ctx)
+{
+    return lxb_css_property_state_mp_top(parser, token, ctx, false);
+}
+
+static bool
+lxb_css_property_state_line_width_style_color(lxb_css_parser_t *parser,
+                                              const lxb_css_syntax_token_t *token,
+                                              lxb_css_property_border_t *border)
+{
+    lxb_status_t status;
+    lxb_css_value_type_t type;
+    const lxb_css_data_t *unit;
+    lxb_css_value_length_t *length;
+    lxb_css_syntax_token_string_t *str;
+
+    switch (token->type) {
+        case LXB_CSS_SYNTAX_TOKEN_DIMENSION:
+            if (border->width.type != LXB_CSS_VALUE__UNDEF) {
+                return false;
+            }
+
+            str = &lxb_css_syntax_token_dimension(token)->str;
+
+            unit = lxb_css_unit_absolute_relative_by_name(str->data,
+                                                          str->length);
+            if (unit == NULL) {
+                return false;
+            }
+
+            length = &border->width.length;
+
+            border->width.type = LXB_CSS_VALUE__LENGTH;
+            length->num = lxb_css_syntax_token_dimension(token)->num.num;
+            length->is_float = lxb_css_syntax_token_dimension(token)->num.is_float;
+            length->unit = (lxb_css_unit_t) unit->unique;
+            break;
+
+        case LXB_CSS_SYNTAX_TOKEN_NUMBER:
+            if (border->width.type != LXB_CSS_VALUE__UNDEF) {
+                return false;
+            }
+
+            length = &border->width.length;
+
+            border->width.type = LXB_CSS_VALUE__NUMBER;
+            length->num = lxb_css_syntax_token_number(token)->num;
+            length->is_float = lxb_css_syntax_token_number(token)->is_float;
+            break;
+
+        case LXB_CSS_SYNTAX_TOKEN_IDENT:
+            type = lxb_css_value_by_name(lxb_css_syntax_token_ident(token)->data,
+                                         lxb_css_syntax_token_ident(token)->length);
+            switch (type) {
+                case LXB_CSS_VALUE_THIN:
+                case LXB_CSS_VALUE_MEDIUM:
+                case LXB_CSS_VALUE_THICK:
+                    if (border->width.type != LXB_CSS_VALUE__UNDEF) {
+                        return false;
+                    }
+
+                    border->width.type = type;
+                    break;
+
+                case LXB_CSS_VALUE_NONE:
+                case LXB_CSS_VALUE_HIDDEN:
+                case LXB_CSS_VALUE_DOTTED:
+                case LXB_CSS_VALUE_DASHED:
+                case LXB_CSS_VALUE_SOLID:
+                case LXB_CSS_VALUE_DOUBLE:
+                case LXB_CSS_VALUE_GROOVE:
+                case LXB_CSS_VALUE_RIDGE:
+                case LXB_CSS_VALUE_INSET:
+                case LXB_CSS_VALUE_OUTSET:
+                    if (border->style != LXB_CSS_VALUE__UNDEF) {
+                        return false;
+                    }
+
+                    border->style = type;
+                    break;
+
+                default:
+                    goto color;
+            }
+
+            break;
+
+        default:
+            goto color;
+    }
+
+    lxb_css_syntax_parser_consume(parser);
+
+    return true;
+
+color:
+
+    if (border->color.type != LXB_CSS_VALUE__UNDEF) {
+        return false;
+    }
+
+    return lxb_css_property_state_color_handler(parser, token, &border->color,
+                                                &status);
+}
+
+bool
+lxb_css_property_state_border(lxb_css_parser_t *parser,
+                              const lxb_css_syntax_token_t *token, void *ctx)
+{
+    bool res;
+    lxb_css_value_type_t type;
+    lxb_css_rule_declaration_t *declar = ctx;
+
+    if (token->type == LXB_CSS_SYNTAX_TOKEN_IDENT) {
+        type = lxb_css_value_by_name(lxb_css_syntax_token_ident(token)->data,
+                                     lxb_css_syntax_token_ident(token)->length);
+        switch (type) {
+            case LXB_CSS_VALUE_INITIAL:
+            case LXB_CSS_VALUE_INHERIT:
+            case LXB_CSS_VALUE_UNSET:
+            case LXB_CSS_VALUE_REVERT:
+                declar->u.border->style = type;
+
+                lxb_css_syntax_parser_consume(parser);
+                return lxb_css_parser_success(parser);
+
+            default:
+                break;
+        }
+    }
+
+    res = lxb_css_property_state_line_width_style_color(parser, token,
+                                                        declar->u.border);
+    if (!res) {
+        return lxb_css_parser_failed(parser);
+    }
+
+    token = lxb_css_syntax_parser_token_wo_ws(parser);
+    lxb_css_property_state_check_token(parser, token);
+
+    if (token->type == LXB_CSS_SYNTAX_TOKEN__END) {
+        return lxb_css_parser_success(parser);
+    }
+
+    res = lxb_css_property_state_line_width_style_color(parser, token,
+                                                        declar->u.border);
+    if (!res) {
+        return lxb_css_parser_failed(parser);
+    }
+
+    token = lxb_css_syntax_parser_token_wo_ws(parser);
+    lxb_css_property_state_check_token(parser, token);
+
+    if (token->type == LXB_CSS_SYNTAX_TOKEN__END) {
+        return lxb_css_parser_success(parser);
+    }
+
+    res = lxb_css_property_state_line_width_style_color(parser, token,
+                                                        declar->u.border);
+    if (!res) {
+        return lxb_css_parser_failed(parser);
+    }
+
+    return lxb_css_parser_success(parser);
+}
+
+bool
+lxb_css_property_state_border_top(lxb_css_parser_t *parser,
+                                  const lxb_css_syntax_token_t *token, void *ctx)
+{
+    return lxb_css_property_state_border(parser, token, ctx);
+}
+
+bool
+lxb_css_property_state_border_right(lxb_css_parser_t *parser,
+                                    const lxb_css_syntax_token_t *token, void *ctx)
+{
+    return lxb_css_property_state_border(parser, token, ctx);
+}
+
+bool
+lxb_css_property_state_border_bottom(lxb_css_parser_t *parser,
+                                     const lxb_css_syntax_token_t *token, void *ctx)
+{
+    return lxb_css_property_state_border(parser, token, ctx);
+}
+
+bool
+lxb_css_property_state_border_left(lxb_css_parser_t *parser,
+                                   const lxb_css_syntax_token_t *token, void *ctx)
+{
+    return lxb_css_property_state_border(parser, token, ctx);
+}
+
+bool
+lxb_css_property_state_border_top_color(lxb_css_parser_t *parser,
+                                        const lxb_css_syntax_token_t *token, void *ctx)
+{
+    return lxb_css_property_state_color(parser, token, ctx);
+}
+
+bool
+lxb_css_property_state_border_right_color(lxb_css_parser_t *parser,
+                                          const lxb_css_syntax_token_t *token, void *ctx)
+{
+    return lxb_css_property_state_color(parser, token, ctx);
+}
+
+bool
+lxb_css_property_state_border_bottom_color(lxb_css_parser_t *parser,
+                                           const lxb_css_syntax_token_t *token, void *ctx)
+{
+    return lxb_css_property_state_color(parser, token, ctx);
+}
+
+bool
+lxb_css_property_state_border_left_color(lxb_css_parser_t *parser,
+                                         const lxb_css_syntax_token_t *token, void *ctx)
+{
+    return lxb_css_property_state_color(parser, token, ctx);
+}
+
+bool
+lxb_css_property_state_background_color(lxb_css_parser_t *parser,
+                                        const lxb_css_syntax_token_t *token, void *ctx)
+{
+    return lxb_css_property_state_color(parser, token, ctx);
+}
+
+bool
+lxb_css_property_state_color(lxb_css_parser_t *parser,
+                             const lxb_css_syntax_token_t *token, void *ctx)
+{
+    bool res;
+    lxb_status_t status;
+    lxb_css_value_type_t type;
+    lxb_css_rule_declaration_t *declar = ctx;
+
+    if (token->type == LXB_CSS_SYNTAX_TOKEN_IDENT) {
+        type = lxb_css_value_by_name(lxb_css_syntax_token_ident(token)->data,
+                                     lxb_css_syntax_token_ident(token)->length);
+        switch (type) {
+            /* Global. */
+            case LXB_CSS_VALUE_INITIAL:
+            case LXB_CSS_VALUE_INHERIT:
+            case LXB_CSS_VALUE_UNSET:
+            case LXB_CSS_VALUE_REVERT:
+                declar->u.color->type = type;
+
+                lxb_css_syntax_parser_consume(parser);
+                return lxb_css_parser_success(parser);
+
+            default:
+                break;
+        }
+    }
+
+    res = lxb_css_property_state_color_handler(parser, token,
+                                    (lxb_css_value_color_t *) declar->u.color,
+                                    &status);
+    if (!res) {
+        return lxb_css_parser_failed(parser);
+    }
+
+    return lxb_css_parser_success(parser);
+}
+
+bool
+lxb_css_property_state_opacity(lxb_css_parser_t *parser,
+                               const lxb_css_syntax_token_t *token, void *ctx)
+{
+    bool res;
+    lxb_css_value_type_t type;
+    lxb_css_rule_declaration_t *declar = ctx;
+    lxb_css_property_opacity_t *opacity = declar->u.opacity;
+
+    res = lxb_css_property_state_number_percentage(parser, token,
+                                (lxb_css_value_number_percentage_t *) opacity);
+    if (res) {
+        return lxb_css_parser_success(parser);
+    }
+
+    if (token->type != LXB_CSS_SYNTAX_TOKEN_IDENT) {
+        return lxb_css_parser_failed(parser);
+    }
+
+    type = lxb_css_value_by_name(lxb_css_syntax_token_ident(token)->data,
+                                 lxb_css_syntax_token_ident(token)->length);
+    switch (type) {
+        /* Global. */
+        case LXB_CSS_VALUE_INITIAL:
+        case LXB_CSS_VALUE_INHERIT:
+        case LXB_CSS_VALUE_UNSET:
+        case LXB_CSS_VALUE_REVERT:
+            opacity->type = type;
+            break;
+
+        default:
+            return lxb_css_parser_failed(parser);
+    }
+
+    lxb_css_syntax_parser_consume(parser);
+
+    return lxb_css_parser_success(parser);
+}
+
+bool
+lxb_css_property_state_position(lxb_css_parser_t *parser,
+                                const lxb_css_syntax_token_t *token, void *ctx)
+{
+    lxb_css_value_type_t type;
+    lxb_css_rule_declaration_t *declar = ctx;
+
+    if (token->type != LXB_CSS_SYNTAX_TOKEN_IDENT) {
+        return lxb_css_parser_failed(parser);
+    }
+
+    type = lxb_css_value_by_name(lxb_css_syntax_token_ident(token)->data,
+                                 lxb_css_syntax_token_ident(token)->length);
+    switch (type) {
+        /* Global. */
+        case LXB_CSS_VALUE_INITIAL:
+        case LXB_CSS_VALUE_INHERIT:
+        case LXB_CSS_VALUE_UNSET:
+        case LXB_CSS_VALUE_REVERT:
+        /* Local. */
+        case LXB_CSS_POSITION_STATIC:
+        case LXB_CSS_POSITION_RELATIVE:
+        case LXB_CSS_POSITION_ABSOLUTE:
+        case LXB_CSS_POSITION_STICKY:
+        case LXB_CSS_POSITION_FIXED:
+            declar->u.position->type = type;
+            break;
+
+        default:
+            return lxb_css_parser_failed(parser);
+    }
+
+    lxb_css_syntax_parser_consume(parser);
+
+    return lxb_css_parser_success(parser);
+}
+
+bool
+lxb_css_property_state_top(lxb_css_parser_t *parser,
+                           const lxb_css_syntax_token_t *token, void *ctx)
+{
+    return lxb_css_property_state_mp_top(parser, token, ctx, true);
+}
+
+bool
+lxb_css_property_state_right(lxb_css_parser_t *parser,
+                             const lxb_css_syntax_token_t *token, void *ctx)
+{
+    return lxb_css_property_state_top(parser, token, ctx);
+}
+
+bool
+lxb_css_property_state_bottom(lxb_css_parser_t *parser,
+                              const lxb_css_syntax_token_t *token, void *ctx)
+{
+    return lxb_css_property_state_top(parser, token, ctx);
+}
+
+bool
+lxb_css_property_state_left(lxb_css_parser_t *parser,
+                            const lxb_css_syntax_token_t *token, void *ctx)
+{
+    return lxb_css_property_state_top(parser, token, ctx);
+}
+
+bool
+lxb_css_property_state_inset_block_start(lxb_css_parser_t *parser,
+                                         const lxb_css_syntax_token_t *token, void *ctx)
+{
+    return lxb_css_property_state_top(parser, token, ctx);
+}
+
+bool
+lxb_css_property_state_inset_inline_start(lxb_css_parser_t *parser,
+                                          const lxb_css_syntax_token_t *token, void *ctx)
+{
+    return lxb_css_property_state_top(parser, token, ctx);
+}
+
+bool
+lxb_css_property_state_inset_block_end(lxb_css_parser_t *parser,
+                                       const lxb_css_syntax_token_t *token, void *ctx)
+{
+    return lxb_css_property_state_top(parser, token, ctx);
+}
+
+bool
+lxb_css_property_state_inset_inline_end(lxb_css_parser_t *parser,
+                                        const lxb_css_syntax_token_t *token, void *ctx)
+{
+    return lxb_css_property_state_top(parser, token, ctx);
+}
+
+bool
+lxb_css_property_state_text_transform(lxb_css_parser_t *parser,
+                                      const lxb_css_syntax_token_t *token, void *ctx)
+{
+    lxb_css_value_type_t type;
+    lxb_css_rule_declaration_t *declar = ctx;
+    lxb_css_property_text_transform_t *tt;
+
+    if (token->type != LXB_CSS_SYNTAX_TOKEN_IDENT) {
+        return lxb_css_parser_failed(parser);
+    }
+
+    tt = declar->u.text_transform;
+
+    type = lxb_css_value_by_name(lxb_css_syntax_token_ident(token)->data,
+                                 lxb_css_syntax_token_ident(token)->length);
+    switch (type) {
+        /* Global. */
+        case LXB_CSS_VALUE_INITIAL:
+        case LXB_CSS_VALUE_INHERIT:
+        case LXB_CSS_VALUE_UNSET:
+        case LXB_CSS_VALUE_REVERT:
+        /* Local. */
+        case LXB_CSS_TEXT_TRANSFORM_NONE:
+            tt->type_case = type;
+            break;
+
+        case LXB_CSS_TEXT_TRANSFORM_CAPITALIZE:
+        case LXB_CSS_TEXT_TRANSFORM_UPPERCASE:
+        case LXB_CSS_TEXT_TRANSFORM_LOWERCASE:
+            tt->type_case = type;
+            goto next;
+
+        case LXB_CSS_TEXT_TRANSFORM_FULL_WIDTH:
+            tt->full_width = type;
+            goto next;
+
+        case LXB_CSS_TEXT_TRANSFORM_FULL_SIZE_KANA:
+            tt->full_size_kana = type;
+            goto next;
+
+        default:
+            return lxb_css_parser_failed(parser);
+    }
+
+    lxb_css_syntax_parser_consume(parser);
+
+    return lxb_css_parser_success(parser);
+
+next:
+
+    lxb_css_syntax_parser_consume(parser);
+    token = lxb_css_syntax_parser_token_wo_ws(parser);
+    lxb_css_property_state_check_token(parser, token);
+
+    if (token->type != LXB_CSS_SYNTAX_TOKEN_IDENT) {
+        return lxb_css_parser_success(parser);
+    }
+
+    type = lxb_css_value_by_name(lxb_css_syntax_token_ident(token)->data,
+                                 lxb_css_syntax_token_ident(token)->length);
+
+    switch (type) {
+        case LXB_CSS_TEXT_TRANSFORM_CAPITALIZE:
+        case LXB_CSS_TEXT_TRANSFORM_UPPERCASE:
+        case LXB_CSS_TEXT_TRANSFORM_LOWERCASE:
+            if (tt->type_case != LXB_CSS_VALUE__UNDEF) {
+                return lxb_css_parser_failed(parser);
+            }
+
+            tt->type_case = type;
+            goto next;
+
+        case LXB_CSS_TEXT_TRANSFORM_FULL_WIDTH:
+            if (tt->full_width != LXB_CSS_VALUE__UNDEF) {
+                return lxb_css_parser_failed(parser);
+            }
+
+            tt->full_width = type;
+            goto next;
+
+        case LXB_CSS_TEXT_TRANSFORM_FULL_SIZE_KANA:
+            if (tt->full_size_kana != LXB_CSS_VALUE__UNDEF) {
+                return lxb_css_parser_failed(parser);
+            }
+
+            tt->full_size_kana = type;
+            goto next;
+
+        default:
+            return lxb_css_parser_failed(parser);
+    }
+}
+
+bool
+lxb_css_property_state_text_align(lxb_css_parser_t *parser,
+                                  const lxb_css_syntax_token_t *token, void *ctx)
+{
+    lxb_css_value_type_t type;
+    lxb_css_rule_declaration_t *declar = ctx;
+
+    if (token->type != LXB_CSS_SYNTAX_TOKEN_IDENT) {
+        return lxb_css_parser_failed(parser);
+    }
+
+    type = lxb_css_value_by_name(lxb_css_syntax_token_ident(token)->data,
+                                 lxb_css_syntax_token_ident(token)->length);
+    switch (type) {
+        /* Global. */
+        case LXB_CSS_VALUE_INITIAL:
+        case LXB_CSS_VALUE_INHERIT:
+        case LXB_CSS_VALUE_UNSET:
+        case LXB_CSS_VALUE_REVERT:
+        /* Local. */
+        case LXB_CSS_TEXT_ALIGN_START:
+        case LXB_CSS_TEXT_ALIGN_END:
+        case LXB_CSS_TEXT_ALIGN_LEFT:
+        case LXB_CSS_TEXT_ALIGN_RIGHT:
+        case LXB_CSS_TEXT_ALIGN_CENTER:
+        case LXB_CSS_TEXT_ALIGN_JUSTIFY:
+        case LXB_CSS_TEXT_ALIGN_MATCH_PARENT:
+        case LXB_CSS_TEXT_ALIGN_JUSTIFY_ALL:
+            declar->u.text_align->type = type;
+            break;
+
+        default:
+            return lxb_css_parser_failed(parser);
+    }
+
+    lxb_css_syntax_parser_consume(parser);
+
+    return lxb_css_parser_success(parser);
+}
+
+bool
+lxb_css_property_state_text_align_all(lxb_css_parser_t *parser,
+                                      const lxb_css_syntax_token_t *token, void *ctx)
+{
+    lxb_css_value_type_t type;
+    lxb_css_rule_declaration_t *declar = ctx;
+
+    if (token->type != LXB_CSS_SYNTAX_TOKEN_IDENT) {
+        return lxb_css_parser_failed(parser);
+    }
+
+    type = lxb_css_value_by_name(lxb_css_syntax_token_ident(token)->data,
+                                 lxb_css_syntax_token_ident(token)->length);
+    switch (type) {
+        /* Global. */
+        case LXB_CSS_VALUE_INITIAL:
+        case LXB_CSS_VALUE_INHERIT:
+        case LXB_CSS_VALUE_UNSET:
+        case LXB_CSS_VALUE_REVERT:
+        /* Local. */
+        case LXB_CSS_TEXT_ALIGN_ALL_START:
+        case LXB_CSS_TEXT_ALIGN_ALL_END:
+        case LXB_CSS_TEXT_ALIGN_ALL_LEFT:
+        case LXB_CSS_TEXT_ALIGN_ALL_RIGHT:
+        case LXB_CSS_TEXT_ALIGN_ALL_CENTER:
+        case LXB_CSS_TEXT_ALIGN_ALL_JUSTIFY:
+        case LXB_CSS_TEXT_ALIGN_ALL_MATCH_PARENT:
+            declar->u.text_align_all->type = type;
+            break;
+
+        default:
+            return lxb_css_parser_failed(parser);
+    }
+
+    lxb_css_syntax_parser_consume(parser);
+
+    return lxb_css_parser_success(parser);
+}
+
+bool
+lxb_css_property_state_text_align_last(lxb_css_parser_t *parser,
+                                       const lxb_css_syntax_token_t *token, void *ctx)
+{
+    lxb_css_value_type_t type;
+    lxb_css_rule_declaration_t *declar = ctx;
+
+    if (token->type != LXB_CSS_SYNTAX_TOKEN_IDENT) {
+        return lxb_css_parser_failed(parser);
+    }
+
+    type = lxb_css_value_by_name(lxb_css_syntax_token_ident(token)->data,
+                                 lxb_css_syntax_token_ident(token)->length);
+    switch (type) {
+        /* Global. */
+        case LXB_CSS_VALUE_INITIAL:
+        case LXB_CSS_VALUE_INHERIT:
+        case LXB_CSS_VALUE_UNSET:
+        case LXB_CSS_VALUE_REVERT:
+        /* Local. */
+        case LXB_CSS_TEXT_ALIGN_LAST_AUTO:
+        case LXB_CSS_TEXT_ALIGN_LAST_START:
+        case LXB_CSS_TEXT_ALIGN_LAST_END:
+        case LXB_CSS_TEXT_ALIGN_LAST_LEFT:
+        case LXB_CSS_TEXT_ALIGN_LAST_RIGHT:
+        case LXB_CSS_TEXT_ALIGN_LAST_CENTER:
+        case LXB_CSS_TEXT_ALIGN_LAST_JUSTIFY:
+        case LXB_CSS_TEXT_ALIGN_LAST_MATCH_PARENT:
+            declar->u.text_align_last->type = type;
+            break;
+
+        default:
+            return lxb_css_parser_failed(parser);
+    }
+
+    lxb_css_syntax_parser_consume(parser);
+
+    return lxb_css_parser_success(parser);
+}
+
+bool
+lxb_css_property_state_text_justify(lxb_css_parser_t *parser,
+                                    const lxb_css_syntax_token_t *token, void *ctx)
+{
+    lxb_css_value_type_t type;
+    lxb_css_rule_declaration_t *declar = ctx;
+
+    if (token->type != LXB_CSS_SYNTAX_TOKEN_IDENT) {
+        return lxb_css_parser_failed(parser);
+    }
+
+    type = lxb_css_value_by_name(lxb_css_syntax_token_ident(token)->data,
+                                 lxb_css_syntax_token_ident(token)->length);
+    switch (type) {
+        /* Global. */
+        case LXB_CSS_VALUE_INITIAL:
+        case LXB_CSS_VALUE_INHERIT:
+        case LXB_CSS_VALUE_UNSET:
+        case LXB_CSS_VALUE_REVERT:
+        /* Local. */
+        case LXB_CSS_TEXT_JUSTIFY_AUTO:
+        case LXB_CSS_TEXT_JUSTIFY_NONE:
+        case LXB_CSS_TEXT_JUSTIFY_INTER_WORD:
+        case LXB_CSS_TEXT_JUSTIFY_INTER_CHARACTER:
+            declar->u.text_justify->type = type;
+            break;
+
+        default:
+            return lxb_css_parser_failed(parser);
+    }
+
+    lxb_css_syntax_parser_consume(parser);
+
+    return lxb_css_parser_success(parser);
+}
+
+bool
+lxb_css_property_state_text_indent(lxb_css_parser_t *parser,
+                                   const lxb_css_syntax_token_t *token, void *ctx)
+{
+    bool res;
+    lxb_css_value_type_t type;
+    lxb_css_rule_declaration_t *declar = ctx;
+    lxb_css_property_text_indent_t *text_indent;
+
+    text_indent = declar->u.text_indent;
+
+    res = lxb_css_property_state_length_percentage(parser, token,
+                                                   &text_indent->length);
+    if (res) {
+        token = lxb_css_syntax_parser_token_wo_ws(parser);
+        lxb_css_property_state_check_token(parser, token);
+
+        text_indent->type = LXB_CSS_VALUE__LENGTH;
+    }
+
+    if (token->type != LXB_CSS_SYNTAX_TOKEN_IDENT) {
+        if (!res) {
+            return lxb_css_parser_failed(parser);
+        }
+
+        return lxb_css_parser_success(parser);
+    }
+
+    type = lxb_css_value_by_name(lxb_css_syntax_token_ident(token)->data,
+                                 lxb_css_syntax_token_ident(token)->length);
+    switch (type) {
+        /* Global. */
+        case LXB_CSS_VALUE_INITIAL:
+        case LXB_CSS_VALUE_INHERIT:
+        case LXB_CSS_VALUE_UNSET:
+        case LXB_CSS_VALUE_REVERT:
+            if (res) {
+                return lxb_css_parser_failed(parser);
+            }
+
+            text_indent->type = type;
+            break;
+
+        /* Local. */
+        case LXB_CSS_TEXT_INDENT_HANGING:
+            text_indent->hanging = type;
+            goto next;
+
+        case LXB_CSS_TEXT_INDENT_EACH_LINE:
+            text_indent->each_line = type;
+            goto next;
+
+        default:
+            return lxb_css_parser_failed(parser);
+    }
+
+    lxb_css_syntax_parser_consume(parser);
+
+    return lxb_css_parser_success(parser);
+
+next:
+
+    lxb_css_syntax_parser_consume(parser);
+    token = lxb_css_syntax_parser_token_wo_ws(parser);
+    lxb_css_property_state_check_token(parser, token);
+
+    res = lxb_css_property_state_length_percentage(parser, token,
+                                                   &text_indent->length);
+    if (res) {
+        if (text_indent->type != LXB_CSS_VALUE__UNDEF) {
+            return lxb_css_parser_failed(parser);
+        }
+
+        token = lxb_css_syntax_parser_token_wo_ws(parser);
+        lxb_css_property_state_check_token(parser, token);
+
+        text_indent->type = LXB_CSS_VALUE__LENGTH;
+    }
+
+    if (token->type != LXB_CSS_SYNTAX_TOKEN_IDENT) {
+        if (text_indent->type == LXB_CSS_VALUE__UNDEF) {
+            return lxb_css_parser_failed(parser);
+        }
+
+        return lxb_css_parser_success(parser);
+    }
+
+    type = lxb_css_value_by_name(lxb_css_syntax_token_ident(token)->data,
+                                 lxb_css_syntax_token_ident(token)->length);
+
+    switch (type) {
+        case LXB_CSS_TEXT_INDENT_HANGING:
+            if (text_indent->hanging != LXB_CSS_VALUE__UNDEF) {
+                return lxb_css_parser_failed(parser);
+            }
+
+            text_indent->hanging = type;
+            goto next;
+
+        case LXB_CSS_TEXT_INDENT_EACH_LINE:
+            if (text_indent->each_line != LXB_CSS_VALUE__UNDEF) {
+                return lxb_css_parser_failed(parser);
+            }
+
+            text_indent->each_line = type;
+            goto next;
+
+        default:
+            return lxb_css_parser_failed(parser);
+    }
+}
+
+bool
+lxb_css_property_state_white_space(lxb_css_parser_t *parser,
+                                   const lxb_css_syntax_token_t *token, void *ctx)
+{
+    lxb_css_value_type_t type;
+    lxb_css_rule_declaration_t *declar = ctx;
+
+    if (token->type != LXB_CSS_SYNTAX_TOKEN_IDENT) {
+        return lxb_css_parser_failed(parser);
+    }
+
+    type = lxb_css_value_by_name(lxb_css_syntax_token_ident(token)->data,
+                                 lxb_css_syntax_token_ident(token)->length);
+    switch (type) {
+        /* Global. */
+        case LXB_CSS_VALUE_INITIAL:
+        case LXB_CSS_VALUE_INHERIT:
+        case LXB_CSS_VALUE_UNSET:
+        case LXB_CSS_VALUE_REVERT:
+        /* Local. */
+        case LXB_CSS_WHITE_SPACE_NORMAL:
+        case LXB_CSS_WHITE_SPACE_PRE:
+        case LXB_CSS_WHITE_SPACE_NOWRAP:
+        case LXB_CSS_WHITE_SPACE_PRE_WRAP:
+        case LXB_CSS_WHITE_SPACE_BREAK_SPACES:
+        case LXB_CSS_WHITE_SPACE_PRE_LINE:
+            declar->u.white_space->type = type;
+            break;
+
+        default:
+            return lxb_css_parser_failed(parser);
+    }
+
+    lxb_css_syntax_parser_consume(parser);
+
+    return lxb_css_parser_success(parser);
+}
+
+bool
+lxb_css_property_state_tab_size(lxb_css_parser_t *parser,
+                                const lxb_css_syntax_token_t *token, void *ctx)
+{
+    bool res;
+    lxb_css_value_type_t type;
+    lxb_css_rule_declaration_t *declar = ctx;
+
+    res = lxb_css_property_state_number_length(parser, token,
+                         (lxb_css_value_number_length_t *) declar->u.tab_size);
+    if (res) {
+        return lxb_css_parser_success(parser);
+    }
+
+    if (token->type != LXB_CSS_SYNTAX_TOKEN_IDENT) {
+        return lxb_css_parser_failed(parser);
+    }
+
+    type = lxb_css_value_by_name(lxb_css_syntax_token_ident(token)->data,
+                                 lxb_css_syntax_token_ident(token)->length);
+    switch (type) {
+        /* Global. */
+        case LXB_CSS_VALUE_INITIAL:
+        case LXB_CSS_VALUE_INHERIT:
+        case LXB_CSS_VALUE_UNSET:
+        case LXB_CSS_VALUE_REVERT:
+            declar->u.tab_size->type = type;
+            break;
+
+        default:
+            return lxb_css_parser_failed(parser);
+    }
+
+    lxb_css_syntax_parser_consume(parser);
+
+    return lxb_css_parser_success(parser);
+}
+
+bool
+lxb_css_property_state_word_break(lxb_css_parser_t *parser,
+                                  const lxb_css_syntax_token_t *token, void *ctx)
+{
+    lxb_css_value_type_t type;
+    lxb_css_rule_declaration_t *declar = ctx;
+
+    if (token->type != LXB_CSS_SYNTAX_TOKEN_IDENT) {
+        return lxb_css_parser_failed(parser);
+    }
+
+    type = lxb_css_value_by_name(lxb_css_syntax_token_ident(token)->data,
+                                 lxb_css_syntax_token_ident(token)->length);
+    switch (type) {
+        /* Global. */
+        case LXB_CSS_VALUE_INITIAL:
+        case LXB_CSS_VALUE_INHERIT:
+        case LXB_CSS_VALUE_UNSET:
+        case LXB_CSS_VALUE_REVERT:
+        /* Local. */
+        case LXB_CSS_WORD_BREAK_NORMAL:
+        case LXB_CSS_WORD_BREAK_KEEP_ALL:
+        case LXB_CSS_WORD_BREAK_BREAK_ALL:
+        case LXB_CSS_WORD_BREAK_BREAK_WORD:
+            declar->u.word_break->type = type;
+            break;
+
+        default:
+            return lxb_css_parser_failed(parser);
+    }
+
+    lxb_css_syntax_parser_consume(parser);
+
+    return lxb_css_parser_success(parser);
+}
+
+bool
+lxb_css_property_state_line_break(lxb_css_parser_t *parser,
+                                  const lxb_css_syntax_token_t *token, void *ctx)
+{
+    lxb_css_value_type_t type;
+    lxb_css_rule_declaration_t *declar = ctx;
+
+    if (token->type != LXB_CSS_SYNTAX_TOKEN_IDENT) {
+        return lxb_css_parser_failed(parser);
+    }
+
+    type = lxb_css_value_by_name(lxb_css_syntax_token_ident(token)->data,
+                                 lxb_css_syntax_token_ident(token)->length);
+    switch (type) {
+        /* Global. */
+        case LXB_CSS_VALUE_INITIAL:
+        case LXB_CSS_VALUE_INHERIT:
+        case LXB_CSS_VALUE_UNSET:
+        case LXB_CSS_VALUE_REVERT:
+        /* Local. */
+        case LXB_CSS_LINE_BREAK_AUTO:
+        case LXB_CSS_LINE_BREAK_LOOSE:
+        case LXB_CSS_LINE_BREAK_NORMAL:
+        case LXB_CSS_LINE_BREAK_STRICT:
+        case LXB_CSS_LINE_BREAK_ANYWHERE:
+            declar->u.line_break->type = type;
+            break;
+
+        default:
+            return lxb_css_parser_failed(parser);
+    }
+
+    lxb_css_syntax_parser_consume(parser);
+
+    return lxb_css_parser_success(parser);
+}
+
+bool
+lxb_css_property_state_hyphens(lxb_css_parser_t *parser,
+                               const lxb_css_syntax_token_t *token, void *ctx)
+{
+    lxb_css_value_type_t type;
+    lxb_css_rule_declaration_t *declar = ctx;
+
+    if (token->type != LXB_CSS_SYNTAX_TOKEN_IDENT) {
+        return lxb_css_parser_failed(parser);
+    }
+
+    type = lxb_css_value_by_name(lxb_css_syntax_token_ident(token)->data,
+                                 lxb_css_syntax_token_ident(token)->length);
+    switch (type) {
+        /* Global. */
+        case LXB_CSS_VALUE_INITIAL:
+        case LXB_CSS_VALUE_INHERIT:
+        case LXB_CSS_VALUE_UNSET:
+        case LXB_CSS_VALUE_REVERT:
+        /* Local. */
+        case LXB_CSS_HYPHENS_NONE:
+        case LXB_CSS_HYPHENS_MANUAL:
+        case LXB_CSS_HYPHENS_AUTO:
+            declar->u.hyphens->type = type;
+            break;
+
+        default:
+            return lxb_css_parser_failed(parser);
+    }
+
+    lxb_css_syntax_parser_consume(parser);
+
+    return lxb_css_parser_success(parser);
+}
+
+bool
+lxb_css_property_state_overflow_wrap(lxb_css_parser_t *parser,
+                                     const lxb_css_syntax_token_t *token, void *ctx)
+{
+    lxb_css_value_type_t type;
+    lxb_css_rule_declaration_t *declar = ctx;
+
+    if (token->type != LXB_CSS_SYNTAX_TOKEN_IDENT) {
+        return lxb_css_parser_failed(parser);
+    }
+
+    type = lxb_css_value_by_name(lxb_css_syntax_token_ident(token)->data,
+                                 lxb_css_syntax_token_ident(token)->length);
+    switch (type) {
+        /* Global. */
+        case LXB_CSS_VALUE_INITIAL:
+        case LXB_CSS_VALUE_INHERIT:
+        case LXB_CSS_VALUE_UNSET:
+        case LXB_CSS_VALUE_REVERT:
+        /* Local. */
+        case LXB_CSS_OVERFLOW_WRAP_NORMAL:
+        case LXB_CSS_OVERFLOW_WRAP_BREAK_WORD:
+        case LXB_CSS_OVERFLOW_WRAP_ANYWHERE:
+            declar->u.overflow_wrap->type = type;
+            break;
+
+        default:
+            return lxb_css_parser_failed(parser);
+    }
+
+    lxb_css_syntax_parser_consume(parser);
+
+    return lxb_css_parser_success(parser);
+}
+
+bool
+lxb_css_property_state_word_wrap(lxb_css_parser_t *parser,
+                                 const lxb_css_syntax_token_t *token, void *ctx)
+{
+    return lxb_css_property_state_overflow_wrap(parser, token, ctx);
+}
+
+bool
+lxb_css_property_state_word_spacing(lxb_css_parser_t *parser,
+                                    const lxb_css_syntax_token_t *token, void *ctx)
+{
+    bool res;
+    lxb_css_value_type_t type;
+    lxb_css_rule_declaration_t *declar = ctx;
+
+    res = lxb_css_property_state_length(parser, token,
+                                        &declar->u.word_spacing->length);
+    if (res) {
+        declar->u.word_spacing->type = LXB_CSS_VALUE__LENGTH;
+
+        return lxb_css_parser_success(parser);
+    }
+
+    if (token->type != LXB_CSS_SYNTAX_TOKEN_IDENT) {
+        return lxb_css_parser_failed(parser);
+    }
+
+    type = lxb_css_value_by_name(lxb_css_syntax_token_ident(token)->data,
+                                 lxb_css_syntax_token_ident(token)->length);
+    switch (type) {
+        /* Global. */
+        case LXB_CSS_VALUE_INITIAL:
+        case LXB_CSS_VALUE_INHERIT:
+        case LXB_CSS_VALUE_UNSET:
+        case LXB_CSS_VALUE_REVERT:
+        /* Local. */
+        case LXB_CSS_WORD_SPACING_NORMAL:
+            declar->u.word_spacing->type = type;
+            break;
+
+        default:
+            return lxb_css_parser_failed(parser);
+    }
+
+    lxb_css_syntax_parser_consume(parser);
+
+    return lxb_css_parser_success(parser);
+}
+
+bool
+lxb_css_property_state_letter_spacing(lxb_css_parser_t *parser,
+                                      const lxb_css_syntax_token_t *token, void *ctx)
+{
+    return lxb_css_property_state_word_spacing(parser, token, ctx);
+}
+
+bool
+lxb_css_property_state_hanging_punctuation(lxb_css_parser_t *parser,
+                                           const lxb_css_syntax_token_t *token, void *ctx)
+{
+    lxb_css_value_type_t type;
+    lxb_css_rule_declaration_t *declar = ctx;
+    lxb_css_property_hanging_punctuation_t *hp;
+
+    if (token->type != LXB_CSS_SYNTAX_TOKEN_IDENT) {
+        return lxb_css_parser_failed(parser);
+    }
+
+    hp = declar->u.hanging_punctuation;
+
+    type = lxb_css_value_by_name(lxb_css_syntax_token_ident(token)->data,
+                                 lxb_css_syntax_token_ident(token)->length);
+    switch (type) {
+            /* Global. */
+        case LXB_CSS_VALUE_INITIAL:
+        case LXB_CSS_VALUE_INHERIT:
+        case LXB_CSS_VALUE_UNSET:
+        case LXB_CSS_VALUE_REVERT:
+            /* Local. */
+        case LXB_CSS_HANGING_PUNCTUATION_NONE:
+            hp->type_first = type;
+            break;
+
+        case LXB_CSS_HANGING_PUNCTUATION_FIRST:
+            hp->type_first = type;
+            goto next;
+
+        case LXB_CSS_HANGING_PUNCTUATION_FORCE_END:
+        case LXB_CSS_HANGING_PUNCTUATION_ALLOW_END:
+            hp->force_allow = type;
+            goto next;
+
+        case LXB_CSS_HANGING_PUNCTUATION_LAST:
+            hp->last = type;
+            goto next;
+
+        default:
+            return lxb_css_parser_failed(parser);
+    }
+
+    lxb_css_syntax_parser_consume(parser);
+
+    return lxb_css_parser_success(parser);
+
+next:
+
+    lxb_css_syntax_parser_consume(parser);
+    token = lxb_css_syntax_parser_token_wo_ws(parser);
+    lxb_css_property_state_check_token(parser, token);
+
+    if (token->type != LXB_CSS_SYNTAX_TOKEN_IDENT) {
+        return lxb_css_parser_success(parser);
+    }
+
+    type = lxb_css_value_by_name(lxb_css_syntax_token_ident(token)->data,
+                                 lxb_css_syntax_token_ident(token)->length);
+
+    switch (type) {
+        case LXB_CSS_HANGING_PUNCTUATION_FIRST:
+            if (hp->type_first != LXB_CSS_VALUE__UNDEF) {
+                return lxb_css_parser_failed(parser);
+            }
+
+            hp->type_first = type;
+            goto next;
+
+        case LXB_CSS_HANGING_PUNCTUATION_FORCE_END:
+        case LXB_CSS_HANGING_PUNCTUATION_ALLOW_END:
+            if (hp->force_allow != LXB_CSS_VALUE__UNDEF) {
+                return lxb_css_parser_failed(parser);
+            }
+
+            hp->force_allow = type;
+            goto next;
+
+        case LXB_CSS_HANGING_PUNCTUATION_LAST:
+            if (hp->last != LXB_CSS_VALUE__UNDEF) {
+                return lxb_css_parser_failed(parser);
+            }
+
+            hp->last = type;
+            goto next;
+
+        default:
+            return lxb_css_parser_failed(parser);
+    }
+}
+
+bool
+lxb_css_property_state_font_family(lxb_css_parser_t *parser,
+                                   const lxb_css_syntax_token_t *token, void *ctx)
+{
+    size_t length;
+    const lxb_char_t *data;
+    lexbor_str_t *str;
+    lexbor_mraw_t *mraw;
+    lxb_css_value_type_t type;
+    lxb_css_rule_declaration_t *declar = ctx;
+    lxb_css_property_font_family_t *ff;
+    lxb_css_property_family_name_t *name;
+
+    mraw = parser->memory->mraw;
+    ff = declar->u.font_family;
+
+    while (token != NULL) {
+        name = lexbor_mraw_alloc(mraw, sizeof(lxb_css_property_family_name_t));
+        if (name == NULL) {
+            return lxb_css_parser_memory_fail(parser);
+        }
+
+        if (token->type == LXB_CSS_SYNTAX_TOKEN_IDENT) {
+            data = lxb_css_syntax_token_ident(token)->data;
+            length = lxb_css_syntax_token_ident(token)->length;
+
+            type = lxb_css_value_by_name(data, length);
+            if (type != LXB_CSS_VALUE__UNDEF) {
+                name->generic = true;
+                name->u.type = type;
+
+                goto next;
+            }
+        }
+        else if (token->type == LXB_CSS_SYNTAX_TOKEN_STRING) {
+            data = lxb_css_syntax_token_string(token)->data;
+            length = lxb_css_syntax_token_string(token)->length;
+        }
+        else {
+            return lxb_css_parser_failed(parser);
+        }
+
+        name->generic = false;
+
+        str = &name->u.str;
+
+        (void) lexbor_str_init(str, mraw, length);
+        if (name->u.str.data == NULL) {
+            return lxb_css_parser_memory_fail(parser);
+        }
+
+        memcpy(str->data, data, length);
+
+        str->data[length] = '\0';
+        str->length = length;
+
+    next:
+
+        if (ff->first == NULL) {
+            ff->first = name;
+        }
+        else {
+            ff->last->next = name;
+        }
+
+        name->next = NULL;
+        name->prev = ff->last;
+        ff->last = name;
+
+        lxb_css_syntax_parser_consume(parser);
+        token = lxb_css_syntax_parser_token_wo_ws(parser);
+        lxb_css_property_state_check_token(parser, token);
+
+        if (token->type != LXB_CSS_SYNTAX_TOKEN_COMMA) {
+            if (token->type == LXB_CSS_SYNTAX_TOKEN__END) {
+                return lxb_css_parser_success(parser);
+            }
+
+            return lxb_css_parser_failed(parser);
+        }
+
+        lxb_css_syntax_parser_consume(parser);
+        token = lxb_css_syntax_parser_token_wo_ws(parser);
+    }
+
+    lxb_css_property_state_check_token(parser, token);
+
+    return lxb_css_parser_success(parser);
+}
+
+bool
+lxb_css_property_state_font_weight(lxb_css_parser_t *parser,
+                                   const lxb_css_syntax_token_t *token, void *ctx)\
+{
+    bool res;
+    lxb_css_value_type_t type;
+    lxb_css_rule_declaration_t *declar = ctx;
+    lxb_css_property_font_weight_t *fw = declar->u.font_weight;
+
+    res = lxb_css_property_state_number(parser, token, &fw->number);
+
+    if (res) {
+        if (fw->number.num < 1 || fw->number.num > 1000) {
+            return lxb_css_parser_failed(parser);
+        }
+
+        fw->type = LXB_CSS_FONT_WEIGHT__NUMBER;
+        return lxb_css_parser_success(parser);
+    }
+
+    if (token->type != LXB_CSS_SYNTAX_TOKEN_IDENT) {
+        return lxb_css_parser_failed(parser);
+    }
+
+    type = lxb_css_value_by_name(lxb_css_syntax_token_ident(token)->data,
+                                 lxb_css_syntax_token_ident(token)->length);
+    switch (type) {
+        /* Global. */
+        case LXB_CSS_VALUE_INITIAL:
+        case LXB_CSS_VALUE_INHERIT:
+        case LXB_CSS_VALUE_UNSET:
+        case LXB_CSS_VALUE_REVERT:
+        /* Local. */
+        case LXB_CSS_FONT_WEIGHT_NORMAL:
+        case LXB_CSS_FONT_WEIGHT_BOLD:
+        case LXB_CSS_FONT_WEIGHT_BOLDER:
+        case LXB_CSS_FONT_WEIGHT_LIGHTER:
+            fw->type = type;
+            break;
+
+        default:
+            return lxb_css_parser_failed(parser);
+    }
+
+    lxb_css_syntax_parser_consume(parser);
+
+    return lxb_css_parser_success(parser);
+}
+
+bool
+lxb_css_property_state_font_stretch(lxb_css_parser_t *parser,
+                                    const lxb_css_syntax_token_t *token, void *ctx)
+{
+    bool res;
+    lxb_css_value_type_t type;
+    lxb_css_rule_declaration_t *declar = ctx;
+    lxb_css_property_font_stretch_t *fs = declar->u.font_stretch;
+
+    res = lxb_css_property_state_percentage(parser, token, &fs->percentage);
+
+    if (res) {
+        if (fs->percentage.num < 0) {
+            return lxb_css_parser_failed(parser);
+        }
+
+        fs->type = LXB_CSS_FONT_STRETCH__PERCENTAGE;
+        return lxb_css_parser_success(parser);
+    }
+
+    if (token->type != LXB_CSS_SYNTAX_TOKEN_IDENT) {
+        return lxb_css_parser_failed(parser);
+    }
+
+    type = lxb_css_value_by_name(lxb_css_syntax_token_ident(token)->data,
+                                 lxb_css_syntax_token_ident(token)->length);
+    switch (type) {
+        /* Global. */
+        case LXB_CSS_VALUE_INITIAL:
+        case LXB_CSS_VALUE_INHERIT:
+        case LXB_CSS_VALUE_UNSET:
+        case LXB_CSS_VALUE_REVERT:
+        /* Local. */
+        case LXB_CSS_FONT_STRETCH_NORMAL:
+        case LXB_CSS_FONT_STRETCH_ULTRA_CONDENSED:
+        case LXB_CSS_FONT_STRETCH_EXTRA_CONDENSED:
+        case LXB_CSS_FONT_STRETCH_CONDENSED:
+        case LXB_CSS_FONT_STRETCH_SEMI_CONDENSED:
+        case LXB_CSS_FONT_STRETCH_SEMI_EXPANDED:
+        case LXB_CSS_FONT_STRETCH_EXPANDED:
+        case LXB_CSS_FONT_STRETCH_EXTRA_EXPANDED:
+        case LXB_CSS_FONT_STRETCH_ULTRA_EXPANDED:
+            fs->type = type;
+            break;
+
+        default:
+            return lxb_css_parser_failed(parser);
+    }
+
+    lxb_css_syntax_parser_consume(parser);
+
+    return lxb_css_parser_success(parser);
+}
+
+bool
+lxb_css_property_state_font_style(lxb_css_parser_t *parser,
+                                  const lxb_css_syntax_token_t *token, void *ctx)
+{
+    bool res;
+    lxb_css_value_type_t type;
+    lxb_css_rule_declaration_t *declar = ctx;
+    lxb_css_property_font_style_t *fs = declar->u.font_style;
+
+    if (token->type != LXB_CSS_SYNTAX_TOKEN_IDENT) {
+        return lxb_css_parser_failed(parser);
+    }
+
+    type = lxb_css_value_by_name(lxb_css_syntax_token_ident(token)->data,
+                                 lxb_css_syntax_token_ident(token)->length);
+    switch (type) {
+            /* Global. */
+        case LXB_CSS_VALUE_INITIAL:
+        case LXB_CSS_VALUE_INHERIT:
+        case LXB_CSS_VALUE_UNSET:
+        case LXB_CSS_VALUE_REVERT:
+            /* Local. */
+        case LXB_CSS_FONT_STYLE_NORMAL:
+        case LXB_CSS_FONT_STYLE_ITALIC:
+            fs->type = type;
+            break;
+
+        case LXB_CSS_FONT_STYLE_OBLIQUE:
+            fs->type = type;
+
+            lxb_css_syntax_parser_consume(parser);
+            token = lxb_css_syntax_parser_token_wo_ws(parser);
+            lxb_css_property_state_check_token(parser, token);
+
+            res = lxb_css_property_state_angle(parser, token, &fs->angle);
+
+            if (res) {
+                if (fs->angle.num < -90 || fs->angle.num > 90) {
+                    return lxb_css_parser_failed(parser);
+                }
+
+                return lxb_css_parser_success(parser);
+            }
+            else {
+                fs->angle.unit = (lxb_css_unit_angle_t) LXB_CSS_UNIT__UNDEF;
+            }
+
+            break;
+
+        default:
+            return lxb_css_parser_failed(parser);
+    }
+
+    lxb_css_syntax_parser_consume(parser);
+
+    return lxb_css_parser_success(parser);
+}
+
+bool
+lxb_css_property_state_font_size(lxb_css_parser_t *parser,
+                                 const lxb_css_syntax_token_t *token, void *ctx)
+{
+    bool res;
+    lxb_css_value_type_t type;
+    lxb_css_rule_declaration_t *declar = ctx;
+    lxb_css_property_font_size_t *fs = declar->u.font_size;
+
+    res = lxb_css_property_state_length_percentage(parser, token, &fs->length);
+
+    if (res) {
+        if (fs->length.u.length.num < 0) {
+            return lxb_css_parser_failed(parser);
+        }
+
+        fs->type = LXB_CSS_FONT_SIZE__LENGTH;
+
+        return lxb_css_parser_success(parser);
+    }
+
+    if (token->type != LXB_CSS_SYNTAX_TOKEN_IDENT) {
+        return lxb_css_parser_failed(parser);
+    }
+
+    type = lxb_css_value_by_name(lxb_css_syntax_token_ident(token)->data,
+                                 lxb_css_syntax_token_ident(token)->length);
+    switch (type) {
+        /* Global. */
+        case LXB_CSS_VALUE_INITIAL:
+        case LXB_CSS_VALUE_INHERIT:
+        case LXB_CSS_VALUE_UNSET:
+        case LXB_CSS_VALUE_REVERT:
+        /* Local. */
+        case LXB_CSS_FONT_SIZE_XX_SMALL:
+        case LXB_CSS_FONT_SIZE_X_SMALL:
+        case LXB_CSS_FONT_SIZE_SMALL:
+        case LXB_CSS_FONT_SIZE_MEDIUM:
+        case LXB_CSS_FONT_SIZE_LARGE:
+        case LXB_CSS_FONT_SIZE_X_LARGE:
+        case LXB_CSS_FONT_SIZE_XX_LARGE:
+        case LXB_CSS_FONT_SIZE_XXX_LARGE:
+        case LXB_CSS_FONT_SIZE_MATH:
+        case LXB_CSS_FONT_SIZE_LARGER:
+        case LXB_CSS_FONT_SIZE_SMALLER:
+            fs->type = type;
+            break;
+
+        default:
+            return lxb_css_parser_failed(parser);
+    }
+
+    lxb_css_syntax_parser_consume(parser);
+
+    return lxb_css_parser_success(parser);
+}
+
+bool
+lxb_css_property_state_float_reference(lxb_css_parser_t *parser,
+                                       const lxb_css_syntax_token_t *token, void *ctx)
+{
+    lxb_css_value_type_t type;
+    lxb_css_rule_declaration_t *declar = ctx;
+
+    if (token->type != LXB_CSS_SYNTAX_TOKEN_IDENT) {
+        return lxb_css_parser_failed(parser);
+    }
+
+    type = lxb_css_value_by_name(lxb_css_syntax_token_ident(token)->data,
+                                 lxb_css_syntax_token_ident(token)->length);
+    switch (type) {
+        /* Global. */
+        case LXB_CSS_VALUE_INITIAL:
+        case LXB_CSS_VALUE_INHERIT:
+        case LXB_CSS_VALUE_UNSET:
+        case LXB_CSS_VALUE_REVERT:
+        /* Local. */
+        case LXB_CSS_FLOAT_REFERENCE_INLINE:
+        case LXB_CSS_FLOAT_REFERENCE_COLUMN:
+        case LXB_CSS_FLOAT_REFERENCE_REGION:
+        case LXB_CSS_FLOAT_REFERENCE_PAGE:
+            declar->u.float_reference->type = type;
+            break;
+
+        default:
+            return lxb_css_parser_failed(parser);
+    }
+
+    lxb_css_syntax_parser_consume(parser);
+
+    return lxb_css_parser_success(parser);
+}
+
+bool
+lxb_css_property_state_float(lxb_css_parser_t *parser,
+                             const lxb_css_syntax_token_t *token, void *ctx)
+{
+    bool res;
+    lxb_css_value_type_t type;
+    lxb_css_rule_declaration_t *declar = ctx;
+    lxb_css_property_float_t *fp = declar->u.floatp;
+
+    if (token->type != LXB_CSS_SYNTAX_TOKEN_IDENT) {
+        if (token->type == LXB_CSS_SYNTAX_TOKEN_FUNCTION) {
+            goto snap;
+        }
+
+        return lxb_css_parser_failed(parser);
+    }
+
+    type = lxb_css_value_by_name(lxb_css_syntax_token_ident(token)->data,
+                                 lxb_css_syntax_token_ident(token)->length);
+    switch (type) {
+        /* Global. */
+        case LXB_CSS_VALUE_INITIAL:
+        case LXB_CSS_VALUE_INHERIT:
+        case LXB_CSS_VALUE_UNSET:
+        case LXB_CSS_VALUE_REVERT:
+        /* Local. */
+        case LXB_CSS_FLOAT_BLOCK_START:
+        case LXB_CSS_FLOAT_BLOCK_END:
+        case LXB_CSS_FLOAT_INLINE_START:
+        case LXB_CSS_FLOAT_INLINE_END:
+        case LXB_CSS_FLOAT_SNAP_BLOCK:
+        case LXB_CSS_FLOAT_SNAP_INLINE:
+        case LXB_CSS_FLOAT_LEFT:
+        case LXB_CSS_FLOAT_RIGHT:
+        case LXB_CSS_FLOAT_TOP:
+        case LXB_CSS_FLOAT_BOTTOM:
+        case LXB_CSS_FLOAT_NONE:
+            fp->type = type;
+            break;
+
+        default:
+            return lxb_css_parser_failed(parser);
+    }
+
+    lxb_css_syntax_parser_consume(parser);
+
+    return lxb_css_parser_success(parser);
+
+snap:
+
+    type = lxb_css_value_by_name(lxb_css_syntax_token_function(token)->data,
+                                 lxb_css_syntax_token_function(token)->length);
+
+    if (type != LXB_CSS_FLOAT_SNAP_BLOCK
+        && type != LXB_CSS_FLOAT_SNAP_INLINE)
+    {
+        return lxb_css_parser_failed(parser);
+    }
+
+    fp->type = type;
+
+    lxb_css_syntax_parser_consume(parser);
+    token = lxb_css_syntax_parser_token_wo_ws(parser);
+    lxb_css_property_state_check_token(parser, token);
+
+    res = lxb_css_property_state_length(parser, token, &fp->length.length);
+    if (!res) {
+        return lxb_css_parser_failed(parser);
+    }
+
+    fp->length.type = LXB_CSS_VALUE__LENGTH;
+
+    lxb_css_syntax_parser_consume(parser);
+    token = lxb_css_syntax_parser_token_wo_ws(parser);
+    lxb_css_property_state_check_token(parser, token);
+
+    if (token->type != LXB_CSS_SYNTAX_TOKEN_COMMA) {
+        if (token->type == LXB_CSS_SYNTAX_TOKEN_R_PARENTHESIS) {
+            fp->snap_type = LXB_CSS_VALUE__UNDEF;
+
+            lxb_css_syntax_parser_consume(parser);
+            return lxb_css_parser_success(parser);
+        }
+
+        return lxb_css_parser_failed(parser);
+    }
+
+    lxb_css_syntax_parser_consume(parser);
+    token = lxb_css_syntax_parser_token_wo_ws(parser);
+    lxb_css_property_state_check_token(parser, token);
+
+    if (token->type != LXB_CSS_SYNTAX_TOKEN_IDENT) {
+        return lxb_css_parser_failed(parser);
+    }
+
+    type = lxb_css_value_by_name(lxb_css_syntax_token_ident(token)->data,
+                                 lxb_css_syntax_token_ident(token)->length);
+    switch (type) {
+        case LXB_CSS_FLOAT_START:
+        case LXB_CSS_FLOAT_END:
+            if (fp->type != LXB_CSS_FLOAT_SNAP_BLOCK) {
+                return lxb_css_parser_failed(parser);
+            }
+
+            fp->snap_type = type;
+            break;
+
+        case LXB_CSS_FLOAT_LEFT:
+        case LXB_CSS_FLOAT_RIGHT:
+            if (fp->type != LXB_CSS_FLOAT_SNAP_INLINE) {
+                return lxb_css_parser_failed(parser);
+            }
+
+            fp->snap_type = type;
+            break;
+
+        case LXB_CSS_FLOAT_NEAR:
+            fp->snap_type = type;
+            break;
+
+        default:
+            return lxb_css_parser_failed(parser);
+    }
+
+    lxb_css_syntax_parser_consume(parser);
+    token = lxb_css_syntax_parser_token_wo_ws(parser);
+    lxb_css_property_state_check_token(parser, token);
+
+    if (token->type == LXB_CSS_SYNTAX_TOKEN_R_PARENTHESIS) {
+        lxb_css_syntax_parser_consume(parser);
+
+        return lxb_css_parser_success(parser);
+    }
+
+    return lxb_css_parser_failed(parser);
+}
+
+bool
+lxb_css_property_state_clear(lxb_css_parser_t *parser,
+                             const lxb_css_syntax_token_t *token, void *ctx)
+{
+    lxb_css_value_type_t type;
+    lxb_css_rule_declaration_t *declar = ctx;
+
+    if (token->type != LXB_CSS_SYNTAX_TOKEN_IDENT) {
+        return lxb_css_parser_failed(parser);
+    }
+
+    type = lxb_css_value_by_name(lxb_css_syntax_token_ident(token)->data,
+                                 lxb_css_syntax_token_ident(token)->length);
+    switch (type) {
+        /* Global. */
+        case LXB_CSS_VALUE_INITIAL:
+        case LXB_CSS_VALUE_INHERIT:
+        case LXB_CSS_VALUE_UNSET:
+        case LXB_CSS_VALUE_REVERT:
+        /* Local. */
+        case LXB_CSS_CLEAR_INLINE_START:
+        case LXB_CSS_CLEAR_INLINE_END:
+        case LXB_CSS_CLEAR_BLOCK_START:
+        case LXB_CSS_CLEAR_BLOCK_END:
+        case LXB_CSS_CLEAR_LEFT:
+        case LXB_CSS_CLEAR_RIGHT:
+        case LXB_CSS_CLEAR_TOP:
+        case LXB_CSS_CLEAR_BOTTOM:
+        case LXB_CSS_CLEAR_NONE:
+            declar->u.clear->type = type;
+            break;
+
+        default:
+            return lxb_css_parser_failed(parser);
+    }
+
+    lxb_css_syntax_parser_consume(parser);
+
+    return lxb_css_parser_success(parser);
+}
+
+bool
+lxb_css_property_state_float_defer(lxb_css_parser_t *parser,
+                                   const lxb_css_syntax_token_t *token, void *ctx)
+{
+    bool res;
+    lxb_css_value_type_t type;
+    lxb_css_rule_declaration_t *declar = ctx;
+    lxb_css_property_float_defer_t *fd = declar->u.float_defer;
+
+    res = lxb_css_property_state_integer(parser, token, &fd->integer);
+    if (res) {
+        fd->type = LXB_CSS_FLOAT_DEFER__INTEGER;
+
+        return lxb_css_parser_success(parser);
+    }
+
+    if (token->type != LXB_CSS_SYNTAX_TOKEN_IDENT) {
+        return lxb_css_parser_failed(parser);
+    }
+
+    type = lxb_css_value_by_name(lxb_css_syntax_token_ident(token)->data,
+                                 lxb_css_syntax_token_ident(token)->length);
+    switch (type) {
+        /* Global. */
+        case LXB_CSS_VALUE_INITIAL:
+        case LXB_CSS_VALUE_INHERIT:
+        case LXB_CSS_VALUE_UNSET:
+        case LXB_CSS_VALUE_REVERT:
+        /* Local. */
+        case LXB_CSS_FLOAT_DEFER_LAST:
+        case LXB_CSS_FLOAT_DEFER_NONE:
+            fd->type = type;
+            break;
+
+        default:
+            return lxb_css_parser_failed(parser);
+    }
+
+    lxb_css_syntax_parser_consume(parser);
+
+    return lxb_css_parser_success(parser);
+}
+
+bool
+lxb_css_property_state_float_offset(lxb_css_parser_t *parser,
+                                    const lxb_css_syntax_token_t *token, void *ctx)
+{
+    bool res;
+    lxb_css_value_type_t type;
+    lxb_css_rule_declaration_t *declar = ctx;
+    lxb_css_property_float_offset_t *fo = declar->u.float_offset;
+
+    res = lxb_css_property_state_length_percentage(parser, token,
+                                     (lxb_css_value_length_percentage_t *) fo);
+    if (res) {
+        return lxb_css_parser_success(parser);
+    }
+
+    if (token->type != LXB_CSS_SYNTAX_TOKEN_IDENT) {
+        return lxb_css_parser_failed(parser);
+    }
+
+    type = lxb_css_value_by_name(lxb_css_syntax_token_ident(token)->data,
+                                 lxb_css_syntax_token_ident(token)->length);
+    switch (type) {
+        /* Global. */
+        case LXB_CSS_VALUE_INITIAL:
+        case LXB_CSS_VALUE_INHERIT:
+        case LXB_CSS_VALUE_UNSET:
+        case LXB_CSS_VALUE_REVERT:
+            fo->type = type;
+            break;
+
+        default:
+            return lxb_css_parser_failed(parser);
+    }
+
+    lxb_css_syntax_parser_consume(parser);
+
+    return lxb_css_parser_success(parser);
+}
+
+bool
+lxb_css_property_state_wrap_flow(lxb_css_parser_t *parser,
+                                 const lxb_css_syntax_token_t *token, void *ctx)
+{
+    lxb_css_value_type_t type;
+    lxb_css_rule_declaration_t *declar = ctx;
+
+    if (token->type != LXB_CSS_SYNTAX_TOKEN_IDENT) {
+        return lxb_css_parser_failed(parser);
+    }
+
+    type = lxb_css_value_by_name(lxb_css_syntax_token_ident(token)->data,
+                                 lxb_css_syntax_token_ident(token)->length);
+    switch (type) {
+        /* Global. */
+        case LXB_CSS_VALUE_INITIAL:
+        case LXB_CSS_VALUE_INHERIT:
+        case LXB_CSS_VALUE_UNSET:
+        case LXB_CSS_VALUE_REVERT:
+        /* Local. */
+        case LXB_CSS_WRAP_FLOW_AUTO:
+        case LXB_CSS_WRAP_FLOW_BOTH:
+        case LXB_CSS_WRAP_FLOW_START:
+        case LXB_CSS_WRAP_FLOW_END:
+        case LXB_CSS_WRAP_FLOW_MINIMUM:
+        case LXB_CSS_WRAP_FLOW_MAXIMUM:
+        case LXB_CSS_WRAP_FLOW_CLEAR:
+            declar->u.wrap_flow->type = type;
+            break;
+
+        default:
+            return lxb_css_parser_failed(parser);
+    }
+
+    lxb_css_syntax_parser_consume(parser);
+
+    return lxb_css_parser_success(parser);
+}
+
+bool
+lxb_css_property_state_wrap_through(lxb_css_parser_t *parser,
+                                    const lxb_css_syntax_token_t *token, void *ctx)
+{
+    lxb_css_value_type_t type;
+    lxb_css_rule_declaration_t *declar = ctx;
+
+    if (token->type != LXB_CSS_SYNTAX_TOKEN_IDENT) {
+        return lxb_css_parser_failed(parser);
+    }
+
+    type = lxb_css_value_by_name(lxb_css_syntax_token_ident(token)->data,
+                                 lxb_css_syntax_token_ident(token)->length);
+    switch (type) {
+        /* Global. */
+        case LXB_CSS_VALUE_INITIAL:
+        case LXB_CSS_VALUE_INHERIT:
+        case LXB_CSS_VALUE_UNSET:
+        case LXB_CSS_VALUE_REVERT:
+        /* Local. */
+        case LXB_CSS_WRAP_THROUGH_WRAP:
+        case LXB_CSS_WRAP_THROUGH_NONE:
+            declar->u.wrap_through->type = type;
+            break;
+
+        default:
+            return lxb_css_parser_failed(parser);
+    }
+
+    lxb_css_syntax_parser_consume(parser);
+
+    return lxb_css_parser_success(parser);
+}
+
+bool
+lxb_css_property_state_flex_direction(lxb_css_parser_t *parser,
+                                      const lxb_css_syntax_token_t *token, void *ctx)
+{
+    lxb_css_value_type_t type;
+    lxb_css_rule_declaration_t *declar = ctx;
+
+    if (token->type != LXB_CSS_SYNTAX_TOKEN_IDENT) {
+        return lxb_css_parser_failed(parser);
+    }
+
+    type = lxb_css_value_by_name(lxb_css_syntax_token_ident(token)->data,
+                                 lxb_css_syntax_token_ident(token)->length);
+    switch (type) {
+        /* Global. */
+        case LXB_CSS_VALUE_INITIAL:
+        case LXB_CSS_VALUE_INHERIT:
+        case LXB_CSS_VALUE_UNSET:
+        case LXB_CSS_VALUE_REVERT:
+        /* Local. */
+        case LXB_CSS_FLEX_DIRECTION_ROW:
+        case LXB_CSS_FLEX_DIRECTION_ROW_REVERSE:
+        case LXB_CSS_FLEX_DIRECTION_COLUMN:
+        case LXB_CSS_FLEX_DIRECTION_COLUMN_REVERSE:
+            declar->u.flex_direction->type = type;
+            break;
+
+        default:
+            return lxb_css_parser_failed(parser);
+    }
+
+    lxb_css_syntax_parser_consume(parser);
+
+    return lxb_css_parser_success(parser);
+}
+
+bool
+lxb_css_property_state_flex_wrap(lxb_css_parser_t *parser,
+                                 const lxb_css_syntax_token_t *token, void *ctx)
+{
+    lxb_css_value_type_t type;
+    lxb_css_rule_declaration_t *declar = ctx;
+
+    if (token->type != LXB_CSS_SYNTAX_TOKEN_IDENT) {
+        return lxb_css_parser_failed(parser);
+    }
+
+    type = lxb_css_value_by_name(lxb_css_syntax_token_ident(token)->data,
+                                 lxb_css_syntax_token_ident(token)->length);
+    switch (type) {
+            /* Global. */
+        case LXB_CSS_VALUE_INITIAL:
+        case LXB_CSS_VALUE_INHERIT:
+        case LXB_CSS_VALUE_UNSET:
+        case LXB_CSS_VALUE_REVERT:
+            /* Local. */
+        case LXB_CSS_FLEX_WRAP_NOWRAP:
+        case LXB_CSS_FLEX_WRAP_WRAP:
+        case LXB_CSS_FLEX_WRAP_WRAP_REVERSE:
+            declar->u.flex_wrap->type = type;
+            break;
+
+        default:
+            return lxb_css_parser_failed(parser);
+    }
+
+    lxb_css_syntax_parser_consume(parser);
+
+    return lxb_css_parser_success(parser);
+}
+
+bool
+lxb_css_property_state_flex_flow(lxb_css_parser_t *parser,
+                                 const lxb_css_syntax_token_t *token, void *ctx)
+{
+    lxb_css_value_type_t type;
+    lxb_css_rule_declaration_t *declar = ctx;
+    lxb_css_property_flex_flow_t *ff = declar->u.flex_flow;
+
+    if (token->type != LXB_CSS_SYNTAX_TOKEN_IDENT) {
+        return lxb_css_parser_failed(parser);
+    }
+
+    type = lxb_css_value_by_name(lxb_css_syntax_token_ident(token)->data,
+                                 lxb_css_syntax_token_ident(token)->length);
+    switch (type) {
+        /* Global. */
+        case LXB_CSS_VALUE_INITIAL:
+        case LXB_CSS_VALUE_INHERIT:
+        case LXB_CSS_VALUE_UNSET:
+        case LXB_CSS_VALUE_REVERT:
+        /* Local. */
+        case LXB_CSS_FLEX_DIRECTION_ROW:
+        case LXB_CSS_FLEX_DIRECTION_ROW_REVERSE:
+        case LXB_CSS_FLEX_DIRECTION_COLUMN:
+        case LXB_CSS_FLEX_DIRECTION_COLUMN_REVERSE:
+            ff->type_direction = type;
+            goto direction;
+
+        case LXB_CSS_FLEX_WRAP_NOWRAP:
+        case LXB_CSS_FLEX_WRAP_WRAP:
+        case LXB_CSS_FLEX_WRAP_WRAP_REVERSE:
+            ff->wrap = type;
+            goto wrap;
+
+        default:
+            return lxb_css_parser_failed(parser);
+    }
+
+direction:
+
+    lxb_css_syntax_parser_consume(parser);
+    token = lxb_css_syntax_parser_token_wo_ws(parser);
+    lxb_css_property_state_check_token(parser, token);
+
+    if (token->type != LXB_CSS_SYNTAX_TOKEN_IDENT) {
+        return lxb_css_parser_success(parser);
+    }
+
+    type = lxb_css_value_by_name(lxb_css_syntax_token_ident(token)->data,
+                                 lxb_css_syntax_token_ident(token)->length);
+    switch (type) {
+        case LXB_CSS_FLEX_WRAP_NOWRAP:
+        case LXB_CSS_FLEX_WRAP_WRAP:
+        case LXB_CSS_FLEX_WRAP_WRAP_REVERSE:
+            ff->wrap = type;
+            break;
+
+        default:
+            return lxb_css_parser_failed(parser);
+    }
+
+    goto done;
+
+wrap:
+
+    lxb_css_syntax_parser_consume(parser);
+    token = lxb_css_syntax_parser_token_wo_ws(parser);
+    lxb_css_property_state_check_token(parser, token);
+
+    if (token->type != LXB_CSS_SYNTAX_TOKEN_IDENT) {
+        return lxb_css_parser_success(parser);
+    }
+
+    type = lxb_css_value_by_name(lxb_css_syntax_token_ident(token)->data,
+                                 lxb_css_syntax_token_ident(token)->length);
+    switch (type) {
+        case LXB_CSS_FLEX_DIRECTION_ROW:
+        case LXB_CSS_FLEX_DIRECTION_ROW_REVERSE:
+        case LXB_CSS_FLEX_DIRECTION_COLUMN:
+        case LXB_CSS_FLEX_DIRECTION_COLUMN_REVERSE:
+            ff->type_direction = type;
+            break;
+
+        default:
+            return lxb_css_parser_failed(parser);
+    }
+
+done:
+
+    lxb_css_syntax_parser_consume(parser);
+
+    return lxb_css_parser_success(parser);
+}
+
+lxb_inline bool
+lxb_css_property_state_flex_grow_shrink(lxb_css_parser_t *parser,
+                                        const lxb_css_syntax_token_t *token,
+                                        lxb_css_property_flex_t *flex)
+{
+    bool res;
+
+    res = lxb_css_property_state_number(parser, token, &flex->grow.number);
+    if (!res) {
+        return false;
+    }
+
+    flex->grow.type = LXB_CSS_FLEX_GROW__NUMBER;
+
+    lxb_css_syntax_parser_consume(parser);
+    token = lxb_css_syntax_parser_token_wo_ws(parser);
+    lxb_css_property_state_check_token(parser, token);
+
+    res = lxb_css_property_state_number(parser, token, &flex->shrink.number);
+    if (res) {
+        flex->shrink.type = LXB_CSS_FLEX_SHRINK__NUMBER;
+    }
+
+    return true;
+}
+
+lxb_inline bool
+lxb_css_property_state_flex_grow_basis(lxb_css_parser_t *parser,
+                                       const lxb_css_syntax_token_t *token,
+                                       lxb_css_property_flex_t *flex)
+{
+    bool res;
+    lxb_css_value_type_t type;
+
+    res = lxb_css_property_state_width_handler(parser, token,
+                               (lxb_css_property_flex_basis_t *) &flex->basis);
+    if (res) {
+        return true;
+    }
+
+    if (token->type != LXB_CSS_SYNTAX_TOKEN_IDENT) {
+        return false;
+    }
+
+    type = lxb_css_value_by_name(lxb_css_syntax_token_ident(token)->data,
+                                 lxb_css_syntax_token_ident(token)->length);
+
+    if (type == LXB_CSS_FLEX_BASIS_CONTENT) {
+        flex->basis.type = type;
+
+        lxb_css_syntax_parser_consume(parser);
+        return true;
+    }
+
+    return false;
+}
+
+bool
+lxb_css_property_state_flex(lxb_css_parser_t *parser,
+                            const lxb_css_syntax_token_t *token, void *ctx)
+{
+    bool res;
+    lxb_css_value_type_t type;
+    lxb_css_rule_declaration_t *declar = ctx;
+    lxb_css_property_flex_t *flex = declar->u.flex;
+
+    res = lxb_css_property_state_flex_grow_shrink(parser, token, flex);
+
+    if (res) {
+        token = lxb_css_syntax_parser_token_wo_ws(parser);
+        lxb_css_property_state_check_token(parser, token);
+
+        res = lxb_css_property_state_flex_grow_basis(parser, token, flex);
+
+        if (!res && token->type != LXB_CSS_SYNTAX_TOKEN__END) {
+            flex->basis.type = LXB_CSS_VALUE__NUMBER;
+            flex->basis.u.length.num = flex->grow.number.num;
+            flex->basis.u.length.unit = LXB_CSS_UNIT__UNDEF;
+            flex->basis.u.length.is_float = flex->grow.number.is_float;
+
+            flex->grow.type = LXB_CSS_VALUE__UNDEF;
+
+            if (flex->shrink.type != LXB_CSS_VALUE__UNDEF) {
+                flex->grow = flex->shrink;
+                flex->shrink.type = LXB_CSS_VALUE__UNDEF;
+
+                goto try_shrink_last;
+            }
+
+            res = lxb_css_property_state_flex_grow_shrink(parser, token, flex);
+            if (!res) {
+                return lxb_css_parser_failed(parser);
+            }
+        }
+
+        return lxb_css_parser_success(parser);
+    }
+    else {
+        res = lxb_css_property_state_flex_grow_basis(parser, token, flex);
+
+        if (res) {
+            token = lxb_css_syntax_parser_token_wo_ws(parser);
+            lxb_css_property_state_check_token(parser, token);
+
+            (void) lxb_css_property_state_flex_grow_shrink(parser, token, flex);
+
+            return lxb_css_parser_success(parser);
+        }
+    }
+
+    if (token->type != LXB_CSS_SYNTAX_TOKEN_IDENT) {
+        return lxb_css_parser_failed(parser);
+    }
+
+    type = lxb_css_value_by_name(lxb_css_syntax_token_ident(token)->data,
+                                 lxb_css_syntax_token_ident(token)->length);
+    switch (type) {
+        /* Global. */
+        case LXB_CSS_VALUE_INITIAL:
+        case LXB_CSS_VALUE_INHERIT:
+        case LXB_CSS_VALUE_UNSET:
+        case LXB_CSS_VALUE_REVERT:
+        /* Local. */
+        case LXB_CSS_FLEX_NONE:
+            flex->type = type;
+            break;
+
+        default:
+            return lxb_css_parser_failed(parser);
+    }
+
+    lxb_css_syntax_parser_consume(parser);
+
+    return lxb_css_parser_success(parser);
+
+try_shrink_last:
+
+    res = lxb_css_property_state_number(parser, token, &flex->shrink.number);
+    if (res) {
+        flex->shrink.type = LXB_CSS_FLEX_SHRINK__NUMBER;
+    }
+
+    return lxb_css_parser_success(parser);
+}
+
+bool
+lxb_css_property_state_flex_grow(lxb_css_parser_t *parser,
+                                 const lxb_css_syntax_token_t *token, void *ctx)
+{
+    bool res;
+    lxb_css_value_type_t type;
+    lxb_css_rule_declaration_t *declar = ctx;
+    lxb_css_property_flex_grow_t *fg = declar->u.flex_grow;
+
+    res = lxb_css_property_state_number(parser, token, &fg->number);
+    if (res) {
+        if (fg->number.num < 0) {
+            return lxb_css_parser_failed(parser);
+        }
+
+        fg->type = LXB_CSS_FLEX_GROW__NUMBER;
+
+        return lxb_css_parser_success(parser);
+    }
+
+    if (token->type != LXB_CSS_SYNTAX_TOKEN_IDENT) {
+        return lxb_css_parser_failed(parser);
+    }
+
+    type = lxb_css_value_by_name(lxb_css_syntax_token_ident(token)->data,
+                                 lxb_css_syntax_token_ident(token)->length);
+    switch (type) {
+        /* Global. */
+        case LXB_CSS_VALUE_INITIAL:
+        case LXB_CSS_VALUE_INHERIT:
+        case LXB_CSS_VALUE_UNSET:
+        case LXB_CSS_VALUE_REVERT:
+            fg->type = type;
+            break;
+
+        default:
+            return lxb_css_parser_failed(parser);
+    }
+
+    lxb_css_syntax_parser_consume(parser);
+
+    return lxb_css_parser_success(parser);
+}
+
+bool
+lxb_css_property_state_flex_shrink(lxb_css_parser_t *parser,
+                                   const lxb_css_syntax_token_t *token, void *ctx)
+{
+    bool res;
+    lxb_css_value_type_t type;
+    lxb_css_rule_declaration_t *declar = ctx;
+    lxb_css_property_flex_grow_t *fs = declar->u.flex_shrink;
+
+    res = lxb_css_property_state_number(parser, token, &fs->number);
+    if (res) {
+        if (fs->number.num < 0) {
+            return lxb_css_parser_failed(parser);
+        }
+
+        fs->type = LXB_CSS_FLEX_SHRINK__NUMBER;
+
+        return lxb_css_parser_success(parser);
+    }
+
+    if (token->type != LXB_CSS_SYNTAX_TOKEN_IDENT) {
+        return lxb_css_parser_failed(parser);
+    }
+
+    type = lxb_css_value_by_name(lxb_css_syntax_token_ident(token)->data,
+                                 lxb_css_syntax_token_ident(token)->length);
+    switch (type) {
+        /* Global. */
+        case LXB_CSS_VALUE_INITIAL:
+        case LXB_CSS_VALUE_INHERIT:
+        case LXB_CSS_VALUE_UNSET:
+        case LXB_CSS_VALUE_REVERT:
+            fs->type = type;
+            break;
+
+        default:
+            return lxb_css_parser_failed(parser);
+    }
+
+    lxb_css_syntax_parser_consume(parser);
+
+    return lxb_css_parser_success(parser);
+}
+
+bool
+lxb_css_property_state_flex_basis(lxb_css_parser_t *parser,
+                                  const lxb_css_syntax_token_t *token, void *ctx)
+{
+    bool res;
+    lxb_css_value_type_t type;
+    lxb_css_rule_declaration_t *declar = ctx;
+    lxb_css_property_flex_basis_t *fb = declar->u.flex_basis;
+
+    res = lxb_css_property_state_width_handler(parser, token,
+                                               (lxb_css_property_width_t *) fb);
+    if (res) {
+        return lxb_css_parser_success(parser);
+    }
+
+    if (token->type != LXB_CSS_SYNTAX_TOKEN_IDENT) {
+        return lxb_css_parser_failed(parser);
+    }
+
+    type = lxb_css_value_by_name(lxb_css_syntax_token_ident(token)->data,
+                                 lxb_css_syntax_token_ident(token)->length);
+    switch (type) {
+        /* Global. */
+        case LXB_CSS_VALUE_INITIAL:
+        case LXB_CSS_VALUE_INHERIT:
+        case LXB_CSS_VALUE_UNSET:
+        case LXB_CSS_VALUE_REVERT:
+        case LXB_CSS_FLEX_BASIS_CONTENT:
+            fb->type = type;
+            break;
+
+        default:
+            return lxb_css_parser_failed(parser);
+    }
+
+    lxb_css_syntax_parser_consume(parser);
+
+    return lxb_css_parser_success(parser);
+}
+
+bool
+lxb_css_property_state_justify_content(lxb_css_parser_t *parser,
+                                       const lxb_css_syntax_token_t *token, void *ctx)
+{
+    lxb_css_value_type_t type;
+    lxb_css_rule_declaration_t *declar = ctx;
+
+    if (token->type != LXB_CSS_SYNTAX_TOKEN_IDENT) {
+        return lxb_css_parser_failed(parser);
+    }
+
+    type = lxb_css_value_by_name(lxb_css_syntax_token_ident(token)->data,
+                                 lxb_css_syntax_token_ident(token)->length);
+    switch (type) {
+        /* Global. */
+        case LXB_CSS_VALUE_INITIAL:
+        case LXB_CSS_VALUE_INHERIT:
+        case LXB_CSS_VALUE_UNSET:
+        case LXB_CSS_VALUE_REVERT:
+        /* Local. */
+        case LXB_CSS_JUSTIFY_CONTENT_FLEX_START:
+        case LXB_CSS_JUSTIFY_CONTENT_FLEX_END:
+        case LXB_CSS_JUSTIFY_CONTENT_CENTER:
+        case LXB_CSS_JUSTIFY_CONTENT_SPACE_BETWEEN:
+        case LXB_CSS_JUSTIFY_CONTENT_SPACE_AROUND:
+            declar->u.justify_content->type = type;
+            break;
+
+        default:
+            return lxb_css_parser_failed(parser);
+    }
+
+    lxb_css_syntax_parser_consume(parser);
+
+    return lxb_css_parser_success(parser);
+}
+
+bool
+lxb_css_property_state_align_items(lxb_css_parser_t *parser,
+                                   const lxb_css_syntax_token_t *token, void *ctx)
+{
+    lxb_css_value_type_t type;
+    lxb_css_rule_declaration_t *declar = ctx;
+
+    if (token->type != LXB_CSS_SYNTAX_TOKEN_IDENT) {
+        return lxb_css_parser_failed(parser);
+    }
+
+    type = lxb_css_value_by_name(lxb_css_syntax_token_ident(token)->data,
+                                 lxb_css_syntax_token_ident(token)->length);
+    switch (type) {
+        /* Global. */
+        case LXB_CSS_VALUE_INITIAL:
+        case LXB_CSS_VALUE_INHERIT:
+        case LXB_CSS_VALUE_UNSET:
+        case LXB_CSS_VALUE_REVERT:
+        /* Local. */
+        case LXB_CSS_ALIGN_ITEMS_FLEX_START:
+        case LXB_CSS_ALIGN_ITEMS_FLEX_END:
+        case LXB_CSS_ALIGN_ITEMS_CENTER:
+        case LXB_CSS_ALIGN_ITEMS_BASELINE:
+        case LXB_CSS_ALIGN_ITEMS_STRETCH:
+            declar->u.align_items->type = type;
+            break;
+
+        default:
+            return lxb_css_parser_failed(parser);
+    }
+
+    lxb_css_syntax_parser_consume(parser);
+
+    return lxb_css_parser_success(parser);
+}
+
+bool
+lxb_css_property_state_align_self(lxb_css_parser_t *parser,
+                                  const lxb_css_syntax_token_t *token, void *ctx)
+{
+    lxb_css_value_type_t type;
+    lxb_css_rule_declaration_t *declar = ctx;
+
+    if (token->type != LXB_CSS_SYNTAX_TOKEN_IDENT) {
+        return lxb_css_parser_failed(parser);
+    }
+
+    type = lxb_css_value_by_name(lxb_css_syntax_token_ident(token)->data,
+                                 lxb_css_syntax_token_ident(token)->length);
+    switch (type) {
+        /* Global. */
+        case LXB_CSS_VALUE_INITIAL:
+        case LXB_CSS_VALUE_INHERIT:
+        case LXB_CSS_VALUE_UNSET:
+        case LXB_CSS_VALUE_REVERT:
+        /* Local. */
+        case LXB_CSS_ALIGN_SELF_AUTO:
+        case LXB_CSS_ALIGN_SELF_FLEX_START:
+        case LXB_CSS_ALIGN_SELF_FLEX_END:
+        case LXB_CSS_ALIGN_SELF_CENTER:
+        case LXB_CSS_ALIGN_SELF_BASELINE:
+        case LXB_CSS_ALIGN_SELF_STRETCH:
+            declar->u.align_self->type = type;
+            break;
+
+        default:
+            return lxb_css_parser_failed(parser);
+    }
+
+    lxb_css_syntax_parser_consume(parser);
+
+    return lxb_css_parser_success(parser);
+}
+
+bool
+lxb_css_property_state_align_content(lxb_css_parser_t *parser,
+                                     const lxb_css_syntax_token_t *token, void *ctx)
+{
+    lxb_css_value_type_t type;
+    lxb_css_rule_declaration_t *declar = ctx;
+
+    if (token->type != LXB_CSS_SYNTAX_TOKEN_IDENT) {
+        return lxb_css_parser_failed(parser);
+    }
+
+    type = lxb_css_value_by_name(lxb_css_syntax_token_ident(token)->data,
+                                 lxb_css_syntax_token_ident(token)->length);
+    switch (type) {
+        /* Global. */
+        case LXB_CSS_VALUE_INITIAL:
+        case LXB_CSS_VALUE_INHERIT:
+        case LXB_CSS_VALUE_UNSET:
+        case LXB_CSS_VALUE_REVERT:
+        /* Local. */
+        case LXB_CSS_ALIGN_CONTENT_FLEX_START:
+        case LXB_CSS_ALIGN_CONTENT_FLEX_END:
+        case LXB_CSS_ALIGN_CONTENT_CENTER:
+        case LXB_CSS_ALIGN_CONTENT_SPACE_BETWEEN:
+        case LXB_CSS_ALIGN_CONTENT_SPACE_AROUND:
+        case LXB_CSS_ALIGN_CONTENT_STRETCH:
+            declar->u.align_content->type = type;
+            break;
+
+        default:
+            return lxb_css_parser_failed(parser);
+    }
+
+    lxb_css_syntax_parser_consume(parser);
+
+    return lxb_css_parser_success(parser);
+}
+
+bool
+lxb_css_property_state_dominant_baseline(lxb_css_parser_t *parser,
+                                         const lxb_css_syntax_token_t *token, void *ctx)
+{
+    lxb_css_value_type_t type;
+    lxb_css_rule_declaration_t *declar = ctx;
+
+    if (token->type != LXB_CSS_SYNTAX_TOKEN_IDENT) {
+        return lxb_css_parser_failed(parser);
+    }
+
+    type = lxb_css_value_by_name(lxb_css_syntax_token_ident(token)->data,
+                                 lxb_css_syntax_token_ident(token)->length);
+    switch (type) {
+        /* Global. */
+        case LXB_CSS_VALUE_INITIAL:
+        case LXB_CSS_VALUE_INHERIT:
+        case LXB_CSS_VALUE_UNSET:
+        case LXB_CSS_VALUE_REVERT:
+        /* Local. */
+        case LXB_CSS_DOMINANT_BASELINE_AUTO:
+        case LXB_CSS_DOMINANT_BASELINE_TEXT_BOTTOM:
+        case LXB_CSS_DOMINANT_BASELINE_ALPHABETIC:
+        case LXB_CSS_DOMINANT_BASELINE_IDEOGRAPHIC:
+        case LXB_CSS_DOMINANT_BASELINE_MIDDLE:
+        case LXB_CSS_DOMINANT_BASELINE_CENTRAL:
+        case LXB_CSS_DOMINANT_BASELINE_MATHEMATICAL:
+        case LXB_CSS_DOMINANT_BASELINE_HANGING:
+        case LXB_CSS_DOMINANT_BASELINE_TEXT_TOP:
+            declar->u.dominant_baseline->type = type;
+            break;
+
+        default:
+            return lxb_css_parser_failed(parser);
+    }
+
+    lxb_css_syntax_parser_consume(parser);
+
+    return lxb_css_parser_success(parser);
+}
+
+bool
+lxb_css_property_state_alignment_baseline_h(lxb_css_parser_t *parser,
+                                            const lxb_css_syntax_token_t *token,
+                                            lxb_css_property_alignment_baseline_t *ab)
+{
+    lxb_css_value_type_t type;
+
+    if (token->type != LXB_CSS_SYNTAX_TOKEN_IDENT) {
+        return false;
+    }
+
+    type = lxb_css_value_by_name(lxb_css_syntax_token_ident(token)->data,
+                                 lxb_css_syntax_token_ident(token)->length);
+    switch (type) {
+        case LXB_CSS_ALIGNMENT_BASELINE_BASELINE:
+        case LXB_CSS_ALIGNMENT_BASELINE_TEXT_BOTTOM:
+        case LXB_CSS_ALIGNMENT_BASELINE_ALPHABETIC:
+        case LXB_CSS_ALIGNMENT_BASELINE_IDEOGRAPHIC:
+        case LXB_CSS_ALIGNMENT_BASELINE_MIDDLE:
+        case LXB_CSS_ALIGNMENT_BASELINE_CENTRAL:
+        case LXB_CSS_ALIGNMENT_BASELINE_MATHEMATICAL:
+        case LXB_CSS_ALIGNMENT_BASELINE_TEXT_TOP:
+            ab->type = type;
+
+            lxb_css_syntax_parser_consume(parser);
+            return true;
+
+        default:
+            return false;
+    }
+}
+
+bool
+lxb_css_property_state_baseline_shift_h(lxb_css_parser_t *parser,
+                                        const lxb_css_syntax_token_t *token,
+                                        lxb_css_property_baseline_shift_t *bs)
+{
+    bool res;
+    lxb_css_value_type_t type;
+
+    res = lxb_css_property_state_length_percentage(parser, token, bs);
+
+    if (res) {
+        return true;
+    }
+
+    if (token->type != LXB_CSS_SYNTAX_TOKEN_IDENT) {
+        return false;
+    }
+
+    type = lxb_css_value_by_name(lxb_css_syntax_token_ident(token)->data,
+                                 lxb_css_syntax_token_ident(token)->length);
+    switch (type) {
+        case LXB_CSS_BASELINE_SHIFT_SUB:
+        case LXB_CSS_BASELINE_SHIFT_SUPER:
+        case LXB_CSS_BASELINE_SHIFT_TOP:
+        case LXB_CSS_BASELINE_SHIFT_CENTER:
+        case LXB_CSS_BASELINE_SHIFT_BOTTOM:
+            bs->type = type;
+
+            lxb_css_syntax_parser_consume(parser);
+            return true;
+
+        default:
+            return false;
+    }
+}
+
+bool
+lxb_css_property_state_vertical_align(lxb_css_parser_t *parser,
+                                      const lxb_css_syntax_token_t *token, void *ctx)
+{
+    bool res;
+    uint8_t maps;
+    lxb_css_value_type_t type;
+    lxb_css_rule_declaration_t *declar = ctx;
+    lxb_css_property_vertical_align_t *va = declar->u.vertical_align;
+
+    maps = 0;
+
+again:
+
+    res = lxb_css_property_state_alignment_baseline_h(parser, token,
+                                                      &va->alignment);
+    if (res) {
+        if (maps & 1 << 1) {
+            return lxb_css_parser_failed(parser);
+        }
+
+        maps |= 1 << 1;
+
+        token = lxb_css_syntax_parser_token_wo_ws(parser);
+        lxb_css_property_state_check_token(parser, token);
+
+        res = lxb_css_property_state_baseline_shift_h(parser, token,
+                                                      &va->shift);
+        if (res) {
+            if (maps & 1 << 2) {
+                return lxb_css_parser_failed(parser);
+            }
+
+            maps |= 1 << 2;
+
+            token = lxb_css_syntax_parser_token_wo_ws(parser);
+            lxb_css_property_state_check_token(parser, token);
+        }
+    }
+    else {
+        res = lxb_css_property_state_baseline_shift_h(parser, token,
+                                                      &va->shift);
+        if (res) {
+            if (maps & 1 << 2) {
+                return lxb_css_parser_failed(parser);
+            }
+
+            maps |= 1 << 2;
+
+            token = lxb_css_syntax_parser_token_wo_ws(parser);
+            lxb_css_property_state_check_token(parser, token);
+
+            res = lxb_css_property_state_alignment_baseline_h(parser, token,
+                                                              &va->alignment);
+            if (res) {
+                if (maps & 1 << 1) {
+                    return lxb_css_parser_failed(parser);
+                }
+
+                maps |= 1 << 1;
+
+                token = lxb_css_syntax_parser_token_wo_ws(parser);
+                lxb_css_property_state_check_token(parser, token);
+            }
+        }
+    }
+
+    if (token->type != LXB_CSS_SYNTAX_TOKEN_IDENT) {
+        if (maps != 0) {
+            return lxb_css_parser_success(parser);
+        }
+
+        return lxb_css_parser_failed(parser);
+    }
+
+    if (maps & 1 << 3) {
+        return lxb_css_parser_failed(parser);
+    }
+
+    type = lxb_css_value_by_name(lxb_css_syntax_token_ident(token)->data,
+                                 lxb_css_syntax_token_ident(token)->length);
+    switch (type) {
+        /* Global. */
+        case LXB_CSS_VALUE_INITIAL:
+        case LXB_CSS_VALUE_INHERIT:
+        case LXB_CSS_VALUE_UNSET:
+        case LXB_CSS_VALUE_REVERT:
+        /* Local. */
+        case LXB_CSS_VERTICAL_ALIGN_FIRST:
+        case LXB_CSS_VERTICAL_ALIGN_LAST:
+            va->type = type;
+            break;
+
+        default:
+            return lxb_css_parser_failed(parser);
+    }
+
+    lxb_css_syntax_parser_consume(parser);
+
+    token = lxb_css_syntax_parser_token_wo_ws(parser);
+    lxb_css_property_state_check_token(parser, token);
+
+    maps = 1 << 3;
+
+    goto again;
+}
+
+bool
+lxb_css_property_state_baseline_source(lxb_css_parser_t *parser,
+                                       const lxb_css_syntax_token_t *token, void *ctx)
+{
+    lxb_css_value_type_t type;
+    lxb_css_rule_declaration_t *declar = ctx;
+
+    if (token->type != LXB_CSS_SYNTAX_TOKEN_IDENT) {
+        return lxb_css_parser_failed(parser);
+    }
+
+    type = lxb_css_value_by_name(lxb_css_syntax_token_ident(token)->data,
+                                 lxb_css_syntax_token_ident(token)->length);
+    switch (type) {
+        /* Global. */
+        case LXB_CSS_VALUE_INITIAL:
+        case LXB_CSS_VALUE_INHERIT:
+        case LXB_CSS_VALUE_UNSET:
+        case LXB_CSS_VALUE_REVERT:
+        /* Local. */
+        case LXB_CSS_BASELINE_SOURCE_AUTO:
+        case LXB_CSS_BASELINE_SOURCE_FIRST:
+        case LXB_CSS_BASELINE_SOURCE_LAST:
+            declar->u.baseline_source->type = type;
+            break;
+
+        default:
+            return lxb_css_parser_failed(parser);
+    }
+
+    lxb_css_syntax_parser_consume(parser);
+
+    return lxb_css_parser_success(parser);
+}
+
+bool
+lxb_css_property_state_alignment_baseline(lxb_css_parser_t *parser,
+                                          const lxb_css_syntax_token_t *token, void *ctx)
+{
+    lxb_css_value_type_t type;
+    lxb_css_rule_declaration_t *declar = ctx;
+
+    if (token->type != LXB_CSS_SYNTAX_TOKEN_IDENT) {
+        return lxb_css_parser_failed(parser);
+    }
+
+    type = lxb_css_value_by_name(lxb_css_syntax_token_ident(token)->data,
+                                 lxb_css_syntax_token_ident(token)->length);
+    switch (type) {
+        /* Global. */
+        case LXB_CSS_VALUE_INITIAL:
+        case LXB_CSS_VALUE_INHERIT:
+        case LXB_CSS_VALUE_UNSET:
+        case LXB_CSS_VALUE_REVERT:
+        /* Local. */
+        case LXB_CSS_ALIGNMENT_BASELINE_BASELINE:
+        case LXB_CSS_ALIGNMENT_BASELINE_TEXT_BOTTOM:
+        case LXB_CSS_ALIGNMENT_BASELINE_ALPHABETIC:
+        case LXB_CSS_ALIGNMENT_BASELINE_IDEOGRAPHIC:
+        case LXB_CSS_ALIGNMENT_BASELINE_MIDDLE:
+        case LXB_CSS_ALIGNMENT_BASELINE_CENTRAL:
+        case LXB_CSS_ALIGNMENT_BASELINE_MATHEMATICAL:
+        case LXB_CSS_ALIGNMENT_BASELINE_TEXT_TOP:
+            declar->u.alignment_baseline->type = type;
+            break;
+
+        default:
+            return lxb_css_parser_failed(parser);
+    }
+
+    lxb_css_syntax_parser_consume(parser);
+
+    return lxb_css_parser_success(parser);
+}
+
+bool
+lxb_css_property_state_baseline_shift(lxb_css_parser_t *parser,
+                                      const lxb_css_syntax_token_t *token, void *ctx)
+{
+    bool res;
+    lxb_css_value_type_t type;
+    lxb_css_rule_declaration_t *declar = ctx;
+
+    res = lxb_css_property_state_length_percentage(parser, token,
+                                                   declar->u.baseline_shift);
+    if (res) {
+        return lxb_css_parser_success(parser);
+    }
+
+    if (token->type != LXB_CSS_SYNTAX_TOKEN_IDENT) {
+        return lxb_css_parser_failed(parser);
+    }
+
+    type = lxb_css_value_by_name(lxb_css_syntax_token_ident(token)->data,
+                                 lxb_css_syntax_token_ident(token)->length);
+    switch (type) {
+        /* Global. */
+        case LXB_CSS_VALUE_INITIAL:
+        case LXB_CSS_VALUE_INHERIT:
+        case LXB_CSS_VALUE_UNSET:
+        case LXB_CSS_VALUE_REVERT:
+        /* Local. */
+        case LXB_CSS_BASELINE_SHIFT_SUB:
+        case LXB_CSS_BASELINE_SHIFT_SUPER:
+        case LXB_CSS_BASELINE_SHIFT_TOP:
+        case LXB_CSS_BASELINE_SHIFT_CENTER:
+        case LXB_CSS_BASELINE_SHIFT_BOTTOM:
+            declar->u.baseline_shift->type = type;
+            break;
+
+        default:
+            return lxb_css_parser_failed(parser);
+    }
+
+    lxb_css_syntax_parser_consume(parser);
+
+    return lxb_css_parser_success(parser);
+}
+
+bool
+lxb_css_property_state_line_height(lxb_css_parser_t *parser,
+                                   const lxb_css_syntax_token_t *token, void *ctx)
+{
+    bool res;
+    lxb_css_value_type_t type;
+    lxb_css_rule_declaration_t *declar = ctx;
+
+    res = lxb_css_property_state_number_length_percentage(parser, token,
+                                                          declar->u.line_height);
+    if (res) {
+        return lxb_css_parser_success(parser);
+    }
+
+    if (token->type != LXB_CSS_SYNTAX_TOKEN_IDENT) {
+        return lxb_css_parser_failed(parser);
+    }
+
+    type = lxb_css_value_by_name(lxb_css_syntax_token_ident(token)->data,
+                                 lxb_css_syntax_token_ident(token)->length);
+    switch (type) {
+        /* Global. */
+        case LXB_CSS_VALUE_INITIAL:
+        case LXB_CSS_VALUE_INHERIT:
+        case LXB_CSS_VALUE_UNSET:
+        case LXB_CSS_VALUE_REVERT:
+        /* Local. */
+        case LXB_CSS_LINE_HEIGHT_NORMAL:
+            declar->u.line_height->type = type;
+            break;
+
+        default:
+            return lxb_css_parser_failed(parser);
+    }
+
+    lxb_css_syntax_parser_consume(parser);
+
+    return lxb_css_parser_success(parser);
+}
+
+bool
+lxb_css_property_state_z_index(lxb_css_parser_t *parser,
+                               const lxb_css_syntax_token_t *token, void *ctx)
+{
+    bool res;
+    lxb_css_value_type_t type;
+    lxb_css_rule_declaration_t *declar = ctx;
+
+    res = lxb_css_property_state_integer(parser, token,
+                                         &declar->u.z_index->integer);
+    if (res) {
+        declar->u.z_index->type = LXB_CSS_VALUE__INTEGER;
+        return lxb_css_parser_success(parser);
+    }
+
+    if (token->type != LXB_CSS_SYNTAX_TOKEN_IDENT) {
+        return lxb_css_parser_failed(parser);
+    }
+
+    type = lxb_css_value_by_name(lxb_css_syntax_token_ident(token)->data,
+                                 lxb_css_syntax_token_ident(token)->length);
+    switch (type) {
+        /* Global. */
+        case LXB_CSS_VALUE_INITIAL:
+        case LXB_CSS_VALUE_INHERIT:
+        case LXB_CSS_VALUE_UNSET:
+        case LXB_CSS_VALUE_REVERT:
+        /* Local. */
+        case LXB_CSS_Z_INDEX_AUTO:
+            declar->u.line_height->type = type;
+            break;
+
+        default:
+            return lxb_css_parser_failed(parser);
+    }
+
+    lxb_css_syntax_parser_consume(parser);
+
+    return lxb_css_parser_success(parser);
+}
+
+bool
+lxb_css_property_state_direction(lxb_css_parser_t *parser,
+                                 const lxb_css_syntax_token_t *token, void *ctx)
+{
+    lxb_css_value_type_t type;
+    lxb_css_rule_declaration_t *declar = ctx;
+
+    if (token->type != LXB_CSS_SYNTAX_TOKEN_IDENT) {
+        return lxb_css_parser_failed(parser);
+    }
+
+    type = lxb_css_value_by_name(lxb_css_syntax_token_ident(token)->data,
+                                 lxb_css_syntax_token_ident(token)->length);
+    switch (type) {
+        /* Global. */
+        case LXB_CSS_VALUE_INITIAL:
+        case LXB_CSS_VALUE_INHERIT:
+        case LXB_CSS_VALUE_UNSET:
+        case LXB_CSS_VALUE_REVERT:
+        /* Local. */
+        case LXB_CSS_DIRECTION_LTR:
+        case LXB_CSS_DIRECTION_RTL:
+            declar->u.direction->type = type;
+            break;
+
+        default:
+            return lxb_css_parser_failed(parser);
+    }
+
+    lxb_css_syntax_parser_consume(parser);
+
+    return lxb_css_parser_success(parser);
+}
+
+bool
+lxb_css_property_state_unicode_bidi(lxb_css_parser_t *parser,
+                                    const lxb_css_syntax_token_t *token, void *ctx)
+{
+    lxb_css_value_type_t type;
+    lxb_css_rule_declaration_t *declar = ctx;
+
+    if (token->type != LXB_CSS_SYNTAX_TOKEN_IDENT) {
+        return lxb_css_parser_failed(parser);
+    }
+
+    type = lxb_css_value_by_name(lxb_css_syntax_token_ident(token)->data,
+                                 lxb_css_syntax_token_ident(token)->length);
+    switch (type) {
+        /* Global. */
+        case LXB_CSS_VALUE_INITIAL:
+        case LXB_CSS_VALUE_INHERIT:
+        case LXB_CSS_VALUE_UNSET:
+        case LXB_CSS_VALUE_REVERT:
+        /* Local. */
+        case LXB_CSS_UNICODE_BIDI_NORMAL:
+        case LXB_CSS_UNICODE_BIDI_EMBED:
+        case LXB_CSS_UNICODE_BIDI_ISOLATE:
+        case LXB_CSS_UNICODE_BIDI_BIDI_OVERRIDE:
+        case LXB_CSS_UNICODE_BIDI_ISOLATE_OVERRIDE:
+        case LXB_CSS_UNICODE_BIDI_PLAINTEXT:
+            declar->u.unicode_bidi->type = type;
+            break;
+
+        default:
+            return lxb_css_parser_failed(parser);
+    }
+
+    lxb_css_syntax_parser_consume(parser);
+
+    return lxb_css_parser_success(parser);
+}
+
+bool
+lxb_css_property_state_writing_mode(lxb_css_parser_t *parser,
+                                    const lxb_css_syntax_token_t *token, void *ctx)
+{
+    lxb_css_value_type_t type;
+    lxb_css_rule_declaration_t *declar = ctx;
+
+    if (token->type != LXB_CSS_SYNTAX_TOKEN_IDENT) {
+        return lxb_css_parser_failed(parser);
+    }
+
+    type = lxb_css_value_by_name(lxb_css_syntax_token_ident(token)->data,
+                                 lxb_css_syntax_token_ident(token)->length);
+    switch (type) {
+        /* Global. */
+        case LXB_CSS_VALUE_INITIAL:
+        case LXB_CSS_VALUE_INHERIT:
+        case LXB_CSS_VALUE_UNSET:
+        case LXB_CSS_VALUE_REVERT:
+        /* Local. */
+        case LXB_CSS_WRITING_MODE_HORIZONTAL_TB:
+        case LXB_CSS_WRITING_MODE_VERTICAL_RL:
+        case LXB_CSS_WRITING_MODE_VERTICAL_LR:
+        case LXB_CSS_WRITING_MODE_SIDEWAYS_RL:
+        case LXB_CSS_WRITING_MODE_SIDEWAYS_LR:
+            declar->u.writing_mode->type = type;
+            break;
+
+        default:
+            return lxb_css_parser_failed(parser);
+    }
+
+    lxb_css_syntax_parser_consume(parser);
+
+    return lxb_css_parser_success(parser);
+}
+
+bool
+lxb_css_property_state_text_orientation(lxb_css_parser_t *parser,
+                                        const lxb_css_syntax_token_t *token, void *ctx)
+{
+    lxb_css_value_type_t type;
+    lxb_css_rule_declaration_t *declar = ctx;
+
+    if (token->type != LXB_CSS_SYNTAX_TOKEN_IDENT) {
+        return lxb_css_parser_failed(parser);
+    }
+
+    type = lxb_css_value_by_name(lxb_css_syntax_token_ident(token)->data,
+                                 lxb_css_syntax_token_ident(token)->length);
+    switch (type) {
+        /* Global. */
+        case LXB_CSS_VALUE_INITIAL:
+        case LXB_CSS_VALUE_INHERIT:
+        case LXB_CSS_VALUE_UNSET:
+        case LXB_CSS_VALUE_REVERT:
+        /* Local. */
+        case LXB_CSS_TEXT_ORIENTATION_MIXED:
+        case LXB_CSS_TEXT_ORIENTATION_UPRIGHT:
+        case LXB_CSS_TEXT_ORIENTATION_SIDEWAYS:
+            declar->u.text_orientation->type = type;
+            break;
+
+        default:
+            return lxb_css_parser_failed(parser);
+    }
+
+    lxb_css_syntax_parser_consume(parser);
+
+    return lxb_css_parser_success(parser);
+}
+
+bool
+lxb_css_property_state_text_combine_upright(lxb_css_parser_t *parser,
+                                            const lxb_css_syntax_token_t *token, void *ctx)
+{
+    bool res;
+    lxb_css_value_type_t type;
+    lxb_css_rule_declaration_t *declar = ctx;
+    lxb_css_property_text_combine_upright_t *tcu = declar->u.text_combine_upright;
+
+    if (token->type != LXB_CSS_SYNTAX_TOKEN_IDENT) {
+        return lxb_css_parser_failed(parser);
+    }
+
+    type = lxb_css_value_by_name(lxb_css_syntax_token_ident(token)->data,
+                                 lxb_css_syntax_token_ident(token)->length);
+    switch (type) {
+        /* Global. */
+        case LXB_CSS_VALUE_INITIAL:
+        case LXB_CSS_VALUE_INHERIT:
+        case LXB_CSS_VALUE_UNSET:
+        case LXB_CSS_VALUE_REVERT:
+        /* Local. */
+        case LXB_CSS_TEXT_COMBINE_UPRIGHT_NONE:
+        case LXB_CSS_TEXT_COMBINE_UPRIGHT_ALL:
+            tcu->type = type;
+            break;
+
+        case LXB_CSS_TEXT_COMBINE_UPRIGHT_DIGITS:
+            tcu->type = type;
+
+            lxb_css_syntax_parser_consume(parser);
+            token = lxb_css_syntax_parser_token_wo_ws(parser);
+            lxb_css_property_state_check_token(parser, token);
+
+            res = lxb_css_property_state_integer(parser, token,
+                                                 &tcu->digits);
+            if (res) {
+                if (tcu->digits.num != 2 && tcu->digits.num != 4) {
+                    return lxb_css_parser_failed(parser);
+                }
+            }
+
+            return lxb_css_parser_success(parser);
+
+        default:
+            return lxb_css_parser_failed(parser);
+    }
+
+    lxb_css_syntax_parser_consume(parser);
+
+    return lxb_css_parser_success(parser);
+}
+
+bool
+lxb_css_property_state_overflow_x(lxb_css_parser_t *parser,
+                                  const lxb_css_syntax_token_t *token, void *ctx)
+{
+    lxb_css_value_type_t type;
+    lxb_css_rule_declaration_t *declar = ctx;
+
+    if (token->type != LXB_CSS_SYNTAX_TOKEN_IDENT) {
+        return lxb_css_parser_failed(parser);
+    }
+
+    type = lxb_css_value_by_name(lxb_css_syntax_token_ident(token)->data,
+                                 lxb_css_syntax_token_ident(token)->length);
+    switch (type) {
+        /* Global. */
+        case LXB_CSS_VALUE_INITIAL:
+        case LXB_CSS_VALUE_INHERIT:
+        case LXB_CSS_VALUE_UNSET:
+        case LXB_CSS_VALUE_REVERT:
+        /* Local. */
+        case LXB_CSS_OVERFLOW_X_VISIBLE:
+        case LXB_CSS_OVERFLOW_X_HIDDEN:
+        case LXB_CSS_OVERFLOW_X_CLIP:
+        case LXB_CSS_OVERFLOW_X_SCROLL:
+        case LXB_CSS_OVERFLOW_X_AUTO:
+            declar->u.overflow_x->type = type;
+            break;
+
+        default:
+            return lxb_css_parser_failed(parser);
+    }
+
+    lxb_css_syntax_parser_consume(parser);
+
+    return lxb_css_parser_success(parser);
+}
+
+bool
+lxb_css_property_state_overflow_y(lxb_css_parser_t *parser,
+                                  const lxb_css_syntax_token_t *token, void *ctx)
+{
+    return lxb_css_property_state_overflow_x(parser, token, ctx);
+}
+
+bool
+lxb_css_property_state_overflow_block(lxb_css_parser_t *parser,
+                                      const lxb_css_syntax_token_t *token, void *ctx)
+{
+    return lxb_css_property_state_overflow_x(parser, token, ctx);
+}
+
+bool
+lxb_css_property_state_overflow_inline(lxb_css_parser_t *parser,
+                                       const lxb_css_syntax_token_t *token, void *ctx)
+{
+    return lxb_css_property_state_overflow_x(parser, token, ctx);
+}
+
+bool
+lxb_css_property_state_text_overflow(lxb_css_parser_t *parser,
+                                     const lxb_css_syntax_token_t *token, void *ctx)
+{
+    lxb_css_value_type_t type;
+    lxb_css_rule_declaration_t *declar = ctx;
+
+    if (token->type != LXB_CSS_SYNTAX_TOKEN_IDENT) {
+        return lxb_css_parser_failed(parser);
+    }
+
+    type = lxb_css_value_by_name(lxb_css_syntax_token_ident(token)->data,
+                                 lxb_css_syntax_token_ident(token)->length);
+    switch (type) {
+        /* Global. */
+        case LXB_CSS_VALUE_INITIAL:
+        case LXB_CSS_VALUE_INHERIT:
+        case LXB_CSS_VALUE_UNSET:
+        case LXB_CSS_VALUE_REVERT:
+        /* Local. */
+        case LXB_CSS_TEXT_OVERFLOW_CLIP:
+        case LXB_CSS_TEXT_OVERFLOW_ELLIPSIS:
+            declar->u.text_overflow->type = type;
+            break;
+
+        default:
+            return lxb_css_parser_failed(parser);
+    }
+
+    lxb_css_syntax_parser_consume(parser);
+
+    return lxb_css_parser_success(parser);
+}
+
+lxb_status_t
+lxb_css_property_state_text_decoration_line_h(lxb_css_parser_t *parser,
+                                              const lxb_css_syntax_token_t *token,
+                                              lxb_css_property_text_decoration_line_t *tdl)
+{
+    lxb_css_value_type_t type;
+
+    if (token->type != LXB_CSS_SYNTAX_TOKEN_IDENT) {
+        return LXB_STATUS_NEXT;
+    }
+
+    type = lxb_css_value_by_name(lxb_css_syntax_token_ident(token)->data,
+                                 lxb_css_syntax_token_ident(token)->length);
+    switch (type) {
+        case LXB_CSS_TEXT_DECORATION_LINE_NONE:
+            tdl->type = type;
+
+            lxb_css_syntax_parser_consume(parser);
+            return LXB_STATUS_OK;
+
+        default:
+            goto first;
+    }
+
+next:
+
+    lxb_css_syntax_parser_consume(parser);
+    token = lxb_css_syntax_parser_token_wo_ws(parser);
+    if (token == NULL) {
+        return LXB_STATUS_ERROR_MEMORY_ALLOCATION;
+    }
+
+    if (token->type != LXB_CSS_SYNTAX_TOKEN_IDENT) {
+        return LXB_STATUS_OK;
+    }
+
+    type = lxb_css_value_by_name(lxb_css_syntax_token_ident(token)->data,
+                                 lxb_css_syntax_token_ident(token)->length);
+
+first:
+
+    switch (type) {
+        case LXB_CSS_TEXT_DECORATION_LINE_UNDERLINE:
+            if (tdl->underline != LXB_CSS_VALUE__UNDEF) {
+                return LXB_STATUS_STOP;
+            }
+
+            tdl->underline = type;
+            goto next;
+
+        case LXB_CSS_TEXT_DECORATION_LINE_OVERLINE:
+            if (tdl->overline != LXB_CSS_VALUE__UNDEF) {
+                return LXB_STATUS_STOP;
+            }
+
+            tdl->overline = type;
+            goto next;
+
+        case LXB_CSS_TEXT_DECORATION_LINE_LINE_THROUGH:
+            if (tdl->line_through != LXB_CSS_VALUE__UNDEF) {
+                return LXB_STATUS_STOP;
+            }
+
+            tdl->line_through = type;
+            goto next;
+
+        case LXB_CSS_TEXT_DECORATION_LINE_BLINK:
+            if (tdl->blink != LXB_CSS_VALUE__UNDEF) {
+                return LXB_STATUS_STOP;
+            }
+
+            tdl->blink = type;
+            goto next;
+
+        default:
+            if (tdl->underline != LXB_CSS_VALUE__UNDEF
+                || tdl->overline != LXB_CSS_VALUE__UNDEF
+                || tdl->line_through != LXB_CSS_VALUE__UNDEF
+                || tdl->blink != LXB_CSS_VALUE__UNDEF)
+            {
+                return LXB_STATUS_OK;
+            }
+
+            return LXB_STATUS_NEXT;
+    }
+}
+
+bool
+lxb_css_property_state_text_decoration_line(lxb_css_parser_t *parser,
+                                            const lxb_css_syntax_token_t *token, void *ctx)
+{
+    lxb_status_t status;
+    lxb_css_value_type_t type;
+    lxb_css_rule_declaration_t *declar = ctx;
+    lxb_css_property_text_decoration_line_t *tdl = declar->u.text_decoration_line;
+
+    status = lxb_css_property_state_text_decoration_line_h(parser, token, tdl);
+
+    if (status == LXB_STATUS_OK) {
+        return lxb_css_parser_success(parser);
+    }
+    else if (status == LXB_STATUS_STOP) {
+        return lxb_css_parser_failed(parser);
+    }
+    else if (status != LXB_STATUS_NEXT) {
+        return lxb_css_parser_memory_fail(parser);
+    }
+
+    if (token->type != LXB_CSS_SYNTAX_TOKEN_IDENT) {
+        return lxb_css_parser_failed(parser);
+    }
+
+    type = lxb_css_value_by_name(lxb_css_syntax_token_ident(token)->data,
+                                 lxb_css_syntax_token_ident(token)->length);
+    switch (type) {
+        /* Global. */
+        case LXB_CSS_VALUE_INITIAL:
+        case LXB_CSS_VALUE_INHERIT:
+        case LXB_CSS_VALUE_UNSET:
+        case LXB_CSS_VALUE_REVERT:
+            tdl->type = type;
+
+            lxb_css_syntax_parser_consume(parser);
+            return lxb_css_parser_success(parser);
+
+        default:
+            return lxb_css_parser_failed(parser);
+    }
+}
+
+bool
+lxb_css_property_state_text_decoration_style_h(lxb_css_parser_t *parser,
+                            const lxb_css_syntax_token_t *token,
+                            lxb_css_property_text_decoration_style_t *tds)
+{
+    lxb_css_value_type_t type;
+
+    if (token->type != LXB_CSS_SYNTAX_TOKEN_IDENT) {
+        return false;
+    }
+
+    type = lxb_css_value_by_name(lxb_css_syntax_token_ident(token)->data,
+                                 lxb_css_syntax_token_ident(token)->length);
+    switch (type) {
+        case LXB_CSS_TEXT_DECORATION_STYLE_SOLID:
+        case LXB_CSS_TEXT_DECORATION_STYLE_DOUBLE:
+        case LXB_CSS_TEXT_DECORATION_STYLE_DOTTED:
+        case LXB_CSS_TEXT_DECORATION_STYLE_DASHED:
+        case LXB_CSS_TEXT_DECORATION_STYLE_WAVY:
+            tds->type = type;
+
+            lxb_css_syntax_parser_consume(parser);
+            return true;
+
+        default:
+            return false;
+    }
+}
+
+bool
+lxb_css_property_state_text_decoration_style(lxb_css_parser_t *parser,
+                                             const lxb_css_syntax_token_t *token, void *ctx)
+{
+    lxb_css_value_type_t type;
+    lxb_css_rule_declaration_t *declar = ctx;
+
+    if (token->type != LXB_CSS_SYNTAX_TOKEN_IDENT) {
+        return lxb_css_parser_failed(parser);
+    }
+
+    type = lxb_css_value_by_name(lxb_css_syntax_token_ident(token)->data,
+                                 lxb_css_syntax_token_ident(token)->length);
+    switch (type) {
+        /* Global. */
+        case LXB_CSS_VALUE_INITIAL:
+        case LXB_CSS_VALUE_INHERIT:
+        case LXB_CSS_VALUE_UNSET:
+        case LXB_CSS_VALUE_REVERT:
+        /* Local. */
+        case LXB_CSS_TEXT_DECORATION_STYLE_SOLID:
+        case LXB_CSS_TEXT_DECORATION_STYLE_DOUBLE:
+        case LXB_CSS_TEXT_DECORATION_STYLE_DOTTED:
+        case LXB_CSS_TEXT_DECORATION_STYLE_DASHED:
+        case LXB_CSS_TEXT_DECORATION_STYLE_WAVY:
+            declar->u.text_decoration_style->type = type;
+            break;
+
+        default:
+            return lxb_css_parser_failed(parser);
+    }
+
+    lxb_css_syntax_parser_consume(parser);
+
+    return lxb_css_parser_success(parser);
+}
+
+bool
+lxb_css_property_state_text_decoration_color(lxb_css_parser_t *parser,
+                                             const lxb_css_syntax_token_t *token, void *ctx)
+{
+    return lxb_css_property_state_color(parser, token, ctx);
+}
+
+bool
+lxb_css_property_state_text_decoration(lxb_css_parser_t *parser,
+                                       const lxb_css_syntax_token_t *token, void *ctx)
+{
+    bool res, line, style, color;
+    lxb_status_t status;
+    lxb_css_value_type_t type;
+    lxb_css_rule_declaration_t *declar = ctx;
+    lxb_css_property_text_decoration_t *td = declar->u.text_decoration;
+
+    if (token->type != LXB_CSS_SYNTAX_TOKEN_IDENT) {
+        goto lsc;
+    }
+
+    type = lxb_css_value_by_name(lxb_css_syntax_token_ident(token)->data,
+                                 lxb_css_syntax_token_ident(token)->length);
+    switch (type) {
+        /* Global. */
+        case LXB_CSS_VALUE_INITIAL:
+        case LXB_CSS_VALUE_INHERIT:
+        case LXB_CSS_VALUE_UNSET:
+        case LXB_CSS_VALUE_REVERT:
+            td->line.type = type;
+
+            lxb_css_syntax_parser_consume(parser);
+            return lxb_css_parser_success(parser);
+
+        default:
+            break;
+    }
+
+lsc:
+
+    line = false;
+    style = false;
+    color = false;
+
+    for (size_t i = 0; i < 3; i++) {
+        if (!line) {
+            status = lxb_css_property_state_text_decoration_line_h(parser, token,
+                                                                   &td->line);
+            if (status == LXB_STATUS_OK) {
+                token = lxb_css_syntax_parser_token_wo_ws(parser);
+                lxb_css_property_state_check_token(parser, token);
+
+                line = true;
+            }
+            else if (status == LXB_STATUS_STOP) {
+                return lxb_css_parser_failed(parser);
+            }
+            else if (status != LXB_STATUS_NEXT) {
+                return lxb_css_parser_memory_fail(parser);
+            }
+        }
+
+        if (!style) {
+            res = lxb_css_property_state_text_decoration_style_h(parser, token,
+                                                                 &td->style);
+            if (res) {
+                token = lxb_css_syntax_parser_token_wo_ws(parser);
+                lxb_css_property_state_check_token(parser, token);
+
+                style = true;
+            }
+        }
+
+        if (!color) {
+            res = lxb_css_property_state_color_handler(parser, token,
+                                         (lxb_css_value_color_t *) &td->color,
+                                         &status);
+            if (res) {
+                token = lxb_css_syntax_parser_token_wo_ws(parser);
+                lxb_css_property_state_check_token(parser, token);
+
+                color = true;
+            }
+            else {
+                if (status != LXB_STATUS_OK) {
+                    return lxb_css_parser_failed(parser);
+                }
+            }
+        }
+    }
+
+    if (!line && !style && !color) {
+        return lxb_css_parser_failed(parser);
+    }
+
+    return lxb_css_parser_success(parser);
+}
diff --git a/ext/lexbor/lexbor/css/property/types.h b/ext/lexbor/lexbor/css/property/types.h
new file mode 100644
index 000000000000..3a23f125a698
--- /dev/null
+++ b/ext/lexbor/lexbor/css/property/types.h
@@ -0,0 +1,21 @@
+/*
+ * Copyright (C) 2025 Alexander Borisov
+ *
+ * Author: Alexander Borisov 
+ */
+
+/*
+ * Caution!
+ * This file generated by the script "utils/lexbor/css/names.py"!
+ * Do not change this file!
+ */
+
+
+#ifndef LXB_CSS_PROPERTY_TYPES_H
+#define LXB_CSS_PROPERTY_TYPES_H
+
+
+
+
+
+#endif /* LXB_CSS_PROPERTY_TYPES_H */
diff --git a/ext/lexbor/lexbor/css/rule.c b/ext/lexbor/lexbor/css/rule.c
new file mode 100644
index 000000000000..5ee938730ea8
--- /dev/null
+++ b/ext/lexbor/lexbor/css/rule.c
@@ -0,0 +1,598 @@
+/*
+ * Copyright (C) 2021-2026 Alexander Borisov
+ *
+ * Author: Alexander Borisov 
+ */
+
+#include "lexbor/css/rule.h"
+#include "lexbor/css/parser.h"
+#include "lexbor/core/serialize.h"
+#include "lexbor/css/stylesheet.h"
+#include "lexbor/css/selectors/selectors.h"
+
+
+void *
+lxb_css_rule_destroy(lxb_css_rule_t *rule, bool self_destroy)
+{
+    switch (rule->type) {
+        case LXB_CSS_RULE_LIST:
+            return lxb_css_rule_list_destroy(lxb_css_rule_list(rule),
+                                             self_destroy);
+        case LXB_CSS_RULE_AT_RULE:
+            return lxb_css_rule_at_destroy(lxb_css_rule_at(rule),
+                                           self_destroy);
+        case LXB_CSS_RULE_STYLE:
+            return lxb_css_rule_style_destroy(lxb_css_rule_style(rule),
+                                              self_destroy);
+        case LXB_CSS_RULE_BAD_STYLE:
+            return lxb_css_rule_bad_style_destroy(lxb_css_rule_bad_style(rule),
+                                                  self_destroy);
+        case LXB_CSS_RULE_DECLARATION:
+            return lxb_css_rule_declaration_destroy(lxb_css_rule_declaration(rule),
+                                                    self_destroy);
+        case LXB_CSS_RULE_DECLARATION_LIST:
+            return lxb_css_rule_declaration_list_destroy(lxb_css_rule_declaration_list(rule),
+                                                         self_destroy);
+        case LXB_CSS_RULE_STYLESHEET:
+        case LXB_CSS_RULE_UNDEF:
+            return NULL;
+    }
+
+    return NULL;
+}
+
+lxb_status_t
+lxb_css_rule_serialize(const lxb_css_rule_t *rule,
+                       lexbor_serialize_cb_f cb, void *ctx)
+{
+    switch (rule->type) {
+        case LXB_CSS_RULE_LIST:
+            return lxb_css_rule_list_serialize(lxb_css_rule_list(rule), cb, ctx);
+
+        case LXB_CSS_RULE_AT_RULE:
+            return lxb_css_rule_at_serialize(lxb_css_rule_at(rule), cb, ctx);
+
+        case LXB_CSS_RULE_STYLE:
+            return lxb_css_rule_style_serialize(lxb_css_rule_style(rule),
+                                                cb, ctx);
+        case LXB_CSS_RULE_BAD_STYLE:
+            return lxb_css_rule_bad_style_serialize(lxb_css_rule_bad_style(rule),
+                                                    cb, ctx);
+        case LXB_CSS_RULE_DECLARATION:
+            return lxb_css_rule_declaration_serialize(lxb_css_rule_declaration(rule),
+                                                      cb, ctx);
+        case LXB_CSS_RULE_DECLARATION_LIST:
+            return lxb_css_rule_declaration_list_serialize(lxb_css_rule_declaration_list(rule),
+                                                           cb, ctx);
+        case LXB_CSS_RULE_STYLESHEET:
+        case LXB_CSS_RULE_UNDEF:
+            break;
+    }
+
+    return LXB_STATUS_ERROR_WRONG_ARGS;
+}
+
+lxb_status_t
+lxb_css_rule_serialize_chain(const lxb_css_rule_t *rule,
+                             lexbor_serialize_cb_f cb, void *ctx)
+{
+    lxb_status_t status;
+
+    static const lxb_char_t ws_str[] = "\n";
+
+    status = lxb_css_rule_serialize(rule, cb, ctx);
+    if (status != LXB_STATUS_OK) {
+        return status;
+    }
+
+    rule = rule->next;
+
+    while (rule != NULL) {
+        lexbor_serialize_write(cb, ws_str, (sizeof(ws_str) - 1), ctx, status);
+
+        status = lxb_css_rule_serialize(rule, cb, ctx);
+        if (status != LXB_STATUS_OK) {
+            return status;
+        }
+
+        rule = rule->next;
+    }
+
+    return LXB_STATUS_OK;
+}
+
+lxb_css_rule_list_t *
+lxb_css_rule_list_destroy(lxb_css_rule_list_t *list, bool self_destroy)
+{
+    lxb_css_rule_t *rule, *next, *parent;
+    lxb_css_rule_t *child_rule;
+    lxb_css_memory_t *memory;
+    lxb_css_rule_at_t *at;
+    lxb_css_rule_style_t *style;
+    lxb_css_rule_bad_style_t *bad;
+    lxb_css_rule_list_t *sub_list;
+    lxb_css_rule_declaration_list_t *declr_list;
+
+    if (list == NULL) {
+        return NULL;
+    }
+
+    rule = list->first;
+    memory = lxb_css_rule(list)->memory;
+
+    while (rule != NULL) {
+        child_rule = NULL;
+
+        switch (rule->type) {
+            case LXB_CSS_RULE_LIST:
+                sub_list = lxb_css_rule_list(rule);
+
+                if (sub_list->first != NULL) {
+                    child_rule = sub_list->first;
+
+                    sub_list->first = NULL;
+                    sub_list->last = NULL;
+                }
+                break;
+
+            case LXB_CSS_RULE_STYLE:
+                style = lxb_css_rule_style(rule);
+
+                if (style->child != NULL) {
+                    child_rule = lxb_css_rule(style->child);
+                    style->child = NULL;
+                }
+                break;
+
+            case LXB_CSS_RULE_BAD_STYLE:
+                bad = lxb_css_rule_bad_style(rule);
+
+                if (bad->child != NULL) {
+                    child_rule = lxb_css_rule(bad->child);
+                    bad->child = NULL;
+                }
+                break;
+
+            case LXB_CSS_RULE_AT_RULE:
+                at = lxb_css_rule_at(rule);
+
+                if (at->type == LXB_CSS_AT_RULE_MEDIA) {
+                    if (at->u.media != NULL && at->u.media->block != NULL) {
+                        child_rule = lxb_css_rule(at->u.media->block);
+                        at->u.media->block = NULL;
+                    }
+                }
+                else if (at->type == LXB_CSS_AT_RULE__UNDEF) {
+                    if (at->u.undef != NULL && at->u.undef->block != NULL) {
+                        child_rule = lxb_css_rule(at->u.undef->block);
+                        at->u.undef->block = NULL;
+                    }
+                }
+                else if (at->type == LXB_CSS_AT_RULE__CUSTOM) {
+                    if (at->u.custom != NULL && at->u.custom->block != NULL) {
+                        child_rule = lxb_css_rule(at->u.custom->block);
+                        at->u.custom->block = NULL;
+                    }
+                }
+                else if (at->type == LXB_CSS_AT_RULE_FONT_FACE) {
+                    if (at->u.font_face != NULL && at->u.font_face->block != NULL) {
+                        child_rule = lxb_css_rule(at->u.font_face->block);
+                        at->u.font_face->block = NULL;
+                    }
+                }
+                break;
+
+            case LXB_CSS_RULE_DECLARATION_LIST:
+                declr_list = lxb_css_rule_declaration_list(rule);
+
+                if (declr_list->first != NULL) {
+                    child_rule = declr_list->first;
+
+                    declr_list->first = NULL;
+                    declr_list->last = NULL;
+                }
+                break;
+
+            default:
+                break;
+        }
+
+        if (child_rule != NULL) {
+            rule = child_rule;
+            continue;
+        }
+
+        next = rule->next;
+        parent = rule->parent;
+
+        (void) lxb_css_rule_destroy(rule, true);
+
+        if (next != NULL) {
+            rule = next;
+        }
+        else {
+            if (parent == lxb_css_rule(list)) {
+                break;
+            }
+
+            rule = parent;
+        }
+    }
+
+    if (self_destroy) {
+        return lexbor_mraw_free(memory->tree, list);
+    }
+
+    list->first = NULL;
+    list->last = NULL;
+
+    return list;
+}
+
+lxb_status_t
+lxb_css_rule_list_serialize(const lxb_css_rule_list_t *list,
+                            lexbor_serialize_cb_f cb, void *ctx)
+{
+    lxb_status_t status;
+    lxb_css_rule_t *rule;
+
+    static const lxb_char_t nl_str[] = "\n";
+
+    rule = list->first;
+
+    if (rule == NULL) {
+        return LXB_STATUS_OK;
+    }
+
+    status = lxb_css_rule_serialize(rule, cb, ctx);
+    if (status != LXB_STATUS_OK) {
+        return status;
+    }
+
+    rule = rule->next;
+
+    while (rule != NULL) {
+        lexbor_serialize_write(cb, nl_str, (sizeof(nl_str) - 1), ctx, status);
+
+        status = lxb_css_rule_serialize(rule, cb, ctx);
+        if (status != LXB_STATUS_OK) {
+            return status;
+        }
+
+        rule = rule->next;
+    }
+
+    return LXB_STATUS_OK;
+}
+
+lxb_css_rule_at_t *
+lxb_css_rule_at_destroy(lxb_css_rule_at_t *at, bool self_destroy)
+{
+    lxb_css_memory_t *memory = lxb_css_rule(at)->memory;
+
+    switch (at->type) {
+        case LXB_CSS_AT_RULE__UNDEF:
+            (void) lxb_css_at_rule__undef_destroy(memory, at->u.undef, true);
+            break;
+
+        case LXB_CSS_AT_RULE_MEDIA:
+            (void) lxb_css_at_rule_media_destroy(memory, at->u.media, true);
+            break;
+
+        case LXB_CSS_AT_RULE_NAMESPACE:
+            (void) lxb_css_at_rule_namespace_destroy(memory, at->u.ns, true);
+            break;
+
+        case LXB_CSS_AT_RULE__LAST_ENTRY:
+            break;
+    }
+
+    if (self_destroy) {
+        return lexbor_mraw_free(memory->tree, at);
+    }
+
+    return at;
+}
+
+lxb_status_t
+lxb_css_rule_at_serialize(const lxb_css_rule_at_t *at, lexbor_serialize_cb_f cb,
+                          void *ctx)
+{
+    lxb_status_t status;
+    const lxb_css_at_rule__undef_t *undef;
+    const lxb_css_at_rule__custom_t *custom;
+    const lxb_css_entry_at_rule_data_t *data, *undata;
+
+    static const lxb_char_t at_str[] = "@";
+
+    data = lxb_css_at_rule_by_id(at->type);
+    if (data == NULL) {
+        return LXB_STATUS_ERROR_NOT_EXISTS;
+    }
+
+    lexbor_serialize_write(cb, at_str, (sizeof(at_str) - 1), ctx, status);
+
+    if (at->type == LXB_CSS_AT_RULE__UNDEF) {
+        undef = at->u.undef;
+
+        undata = lxb_css_at_rule_by_id(undef->type);
+        if (undata == NULL) {
+            return LXB_STATUS_ERROR_NOT_EXISTS;
+        }
+
+        lexbor_serialize_write(cb, undata->name, undata->length, ctx, status);
+    }
+    else if (at->type == LXB_CSS_AT_RULE__CUSTOM) {
+        custom = at->u.custom;
+
+        lexbor_serialize_write(cb, custom->name.data,
+                               custom->name.length, ctx, status);
+    }
+    else {
+        lexbor_serialize_write(cb, data->name, data->length, ctx, status);
+    }
+
+    return data->serialize(at->u.user, cb, ctx);
+}
+
+lxb_status_t
+lxb_css_rule_at_serialize_name(const lxb_css_rule_at_t *at,
+                               lexbor_serialize_cb_f cb, void *ctx)
+{
+    return lxb_css_at_rule_serialize_name(at->u.user, at->type, cb, ctx);
+}
+
+lxb_css_rule_style_t *
+lxb_css_rule_style_destroy(lxb_css_rule_style_t *style, bool self_destroy)
+{
+    lxb_css_memory_t *memory = lxb_css_rule(style)->memory;
+
+    lxb_css_selector_list_destroy(style->selector);
+    (void) lxb_css_rule_declaration_list_destroy(style->declarations, true);
+    (void) lxb_css_rule_list_destroy(style->child, true);
+
+    style->selector = NULL;
+    style->declarations = NULL;
+    style->child = NULL;
+
+    if (self_destroy) {
+        return lexbor_mraw_free(memory->tree, style);
+    }
+
+    return style;
+}
+
+lxb_status_t
+lxb_css_rule_style_serialize(const lxb_css_rule_style_t *style,
+                             lexbor_serialize_cb_f cb, void *ctx)
+{
+    lxb_status_t status;
+
+    static const lxb_char_t lc_str[] = " {";
+    static const lxb_char_t rc_str[] = "}";
+    static const lxb_char_t cm_str[] = "; ";
+
+    status = lxb_css_selector_serialize_list_chain(style->selector, cb, ctx);
+    if (status != LXB_STATUS_OK) {
+        return status;
+    }
+
+    if (style->declarations != NULL) {
+        lexbor_serialize_write(cb, lc_str, (sizeof(lc_str) - 1), ctx, status);
+
+        status = lxb_css_rule_declaration_list_serialize(style->declarations,
+                                                         cb, ctx);
+        if (status != LXB_STATUS_OK) {
+            return status;
+        }
+
+        if (style->child == NULL) {
+            lexbor_serialize_write(cb, rc_str, (sizeof(rc_str) - 1),
+                                   ctx, status);
+        }
+    }
+
+    if (style->child != NULL && style->child->first != NULL) {
+        lexbor_serialize_write(cb, cm_str, (sizeof(cm_str) - 1), ctx, status);
+
+        status = lxb_css_rule_list_serialize(style->child, cb, ctx);
+        if (status != LXB_STATUS_OK) {
+            return status;
+        }
+    }
+
+    if (style->declarations != NULL) {
+        lexbor_serialize_write(cb, rc_str, (sizeof(rc_str) - 1), ctx, status);
+    }
+
+    return LXB_STATUS_OK;
+}
+
+lxb_css_rule_bad_style_t *
+lxb_css_rule_bad_style_destroy(lxb_css_rule_bad_style_t *bad, bool self_destroy)
+{
+    lxb_css_memory_t *memory = lxb_css_rule(bad)->memory;
+
+    (void) lexbor_str_destroy(&bad->selectors, memory->mraw, false);
+    bad->declarations = lxb_css_rule_declaration_list_destroy(bad->declarations,
+                                                              true);
+    bad->child = lxb_css_rule_list_destroy(bad->child, true);
+
+    if (self_destroy) {
+        return lexbor_mraw_free(memory->tree, bad);
+    }
+
+    return bad;
+}
+
+lxb_status_t
+lxb_css_rule_bad_style_serialize(const lxb_css_rule_bad_style_t *bad,
+                                 lexbor_serialize_cb_f cb, void *ctx)
+{
+    lxb_status_t status;
+
+    static const lxb_char_t lc_str[] = "{";
+    static const lxb_char_t rc_str[] = "}";
+
+    if (bad->selectors.data != NULL) {
+        lexbor_serialize_write(cb, bad->selectors.data, bad->selectors.length,
+                               ctx, status);
+    }
+
+    if (bad->declarations != NULL) {
+        lexbor_serialize_write(cb, lc_str, (sizeof(lc_str) - 1), ctx, status);
+
+        status = lxb_css_rule_declaration_list_serialize(bad->declarations,
+                                                         cb, ctx);
+        if (status != LXB_STATUS_OK) {
+            return status;
+        }
+
+        return cb(rc_str, (sizeof(rc_str) - 1), ctx);
+    }
+
+    return LXB_STATUS_OK;
+}
+
+lxb_css_rule_declaration_list_t *
+lxb_css_rule_declaration_list_destroy(lxb_css_rule_declaration_list_t *list,
+                                      bool self_destroy)
+{
+    lxb_css_rule_t *declr, *next;
+
+    if (list == NULL) {
+        return NULL;
+    }
+
+    declr = list->first;
+
+    while (declr != NULL) {
+        next = declr->next;
+        (void) lxb_css_rule_destroy(declr, true);
+        declr = next;
+    }
+
+    if (self_destroy) {
+        return lexbor_mraw_free(lxb_css_rule(list)->memory->tree, list);
+    }
+
+    list->first = NULL;
+    list->last = NULL;
+
+    return list;
+}
+
+lxb_status_t
+lxb_css_rule_declaration_list_serialize(const lxb_css_rule_declaration_list_t *list,
+                                        lexbor_serialize_cb_f cb, void *ctx)
+{
+    lxb_status_t status;
+    const lxb_css_rule_t *declr;
+
+    static const lxb_char_t sm_str[] = "; ";
+
+    declr = list->first;
+
+    if (declr == NULL) {
+        return LXB_STATUS_OK;
+    }
+
+    status = lxb_css_rule_serialize(declr, cb, ctx);
+    if (status != LXB_STATUS_OK) {
+        return status;
+    }
+
+    declr = declr->next;
+
+    while (declr != NULL) {
+        lexbor_serialize_write(cb, sm_str, (sizeof(sm_str) - 1), ctx, status);
+
+        status = lxb_css_rule_serialize(declr, cb, ctx);
+        if (status != LXB_STATUS_OK) {
+            return status;
+        }
+
+        declr = declr->next;
+    }
+
+    return LXB_STATUS_OK;
+}
+
+lxb_css_rule_declaration_t *
+lxb_css_rule_declaration_destroy(lxb_css_rule_declaration_t *declr,
+                                 bool self_destroy)
+{
+    lxb_css_memory_t *memory = lxb_css_rule(declr)->memory;
+
+    if (declr->u.user != NULL) {
+        declr->u.user = lxb_css_property_destroy(memory, declr->u.user,
+                                                 declr->type, true);
+    }
+
+    if (self_destroy) {
+        return lexbor_mraw_free(memory->tree, declr);
+    }
+
+    return declr;
+}
+
+lxb_status_t
+lxb_css_rule_declaration_serialize(const lxb_css_rule_declaration_t *declaration,
+                                   lexbor_serialize_cb_f cb, void *ctx)
+{
+    lxb_status_t status;
+    const lxb_css_entry_data_t *data, *undata;
+    const lxb_css_property__undef_t *undef;
+    const lxb_css_property__custom_t *custom;
+
+    static const lxb_char_t cl_str[] = ": ";
+    static const lxb_char_t imp_str[] = " !important";
+
+    data = lxb_css_property_by_id(declaration->type);
+    if (data == NULL) {
+        return LXB_STATUS_ERROR_NOT_EXISTS;
+    }
+
+    if (declaration->type == LXB_CSS_PROPERTY__UNDEF) {
+        undef = declaration->u.undef;
+
+        if (undef->type > LXB_CSS_PROPERTY__CUSTOM) {
+            undata = lxb_css_property_by_id(undef->type);
+            if (undata == NULL) {
+                return LXB_STATUS_ERROR_NOT_EXISTS;
+            }
+
+            lexbor_serialize_write(cb, undata->name, undata->length, ctx, status);
+            lexbor_serialize_write(cb, cl_str, (sizeof(cl_str) - 1), ctx, status);
+        }
+    }
+    else if (declaration->type == LXB_CSS_PROPERTY__CUSTOM) {
+        custom = declaration->u.custom;
+
+        lexbor_serialize_write(cb, custom->name.data, custom->name.length,
+                               ctx, status);
+        lexbor_serialize_write(cb, cl_str, (sizeof(cl_str) - 1), ctx, status);
+    }
+    else {
+        lexbor_serialize_write(cb, data->name, data->length, ctx, status);
+        lexbor_serialize_write(cb, cl_str, (sizeof(cl_str) - 1), ctx, status);
+    }
+
+    status = data->serialize(declaration->u.user, cb, ctx);
+    if (status != LXB_STATUS_OK) {
+        return status;
+    }
+
+    if (declaration->important && declaration->type != LXB_CSS_PROPERTY__UNDEF) {
+        lexbor_serialize_write(cb, imp_str, (sizeof(imp_str) - 1), ctx, status);
+    }
+
+    return LXB_STATUS_OK;
+}
+
+lxb_status_t
+lxb_css_rule_declaration_serialize_name(const lxb_css_rule_declaration_t *declr,
+                                        lexbor_serialize_cb_f cb, void *ctx)
+{
+    return lxb_css_property_serialize_name(declr->u.user, declr->type, cb, ctx);
+}
diff --git a/ext/lexbor/lexbor/css/rule.h b/ext/lexbor/lexbor/css/rule.h
index bd191f9b6519..d192a0161ccd 100644
--- a/ext/lexbor/lexbor/css/rule.h
+++ b/ext/lexbor/lexbor/css/rule.h
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2021-2023 Alexander Borisov
+ * Copyright (C) 2021-2026 Alexander Borisov
  *
  * Author: Alexander Borisov 
  */
@@ -46,9 +46,6 @@ struct lxb_css_rule {
     lxb_css_rule_t      *prev;
     lxb_css_rule_t      *parent;
 
-    const lxb_char_t    *begin;
-    const lxb_char_t    *end;
-
     lxb_css_memory_t    *memory;
     size_t              ref_count;
 };
@@ -68,10 +65,15 @@ struct lxb_css_rule_at {
     union {
         lxb_css_at_rule__undef_t    *undef;
         lxb_css_at_rule__custom_t   *custom;
+        lxb_css_at_rule_font_face_t *font_face;
         lxb_css_at_rule_media_t     *media;
         lxb_css_at_rule_namespace_t *ns;
         void                        *user;
     } u;
+
+    size_t         name_begin;
+    size_t         prelude_begin;
+    size_t         prelude_end;
 };
 
 struct lxb_css_rule_style {
@@ -79,6 +81,10 @@ struct lxb_css_rule_style {
 
     lxb_css_selector_list_t         *selector;
     lxb_css_rule_declaration_list_t *declarations;
+    lxb_css_rule_list_t             *child;
+
+    size_t                          prelude_begin;
+    size_t                          prelude_end;
 };
 
 struct lxb_css_rule_bad_style {
@@ -86,6 +92,10 @@ struct lxb_css_rule_bad_style {
 
     lexbor_str_t                    selectors;
     lxb_css_rule_declaration_list_t *declarations;
+    lxb_css_rule_list_t             *child;
+
+    size_t                          prelude_begin;
+    size_t                          prelude_end;
 };
 
 struct lxb_css_rule_declaration_list {
@@ -97,6 +107,16 @@ struct lxb_css_rule_declaration_list {
     size_t         count;
 };
 
+typedef struct {
+    size_t name_begin;
+    size_t name_end;
+    size_t value_begin;
+    size_t value_end;
+    size_t important_begin;
+    size_t important_end;
+}
+lxb_css_rule_declaration_offset_t;
+
 struct lxb_css_rule_declaration {
     lxb_css_rule_t rule;
     uintptr_t      type;
@@ -204,7 +224,9 @@ struct lxb_css_rule_declaration {
         void                                     *user;
     } u;
 
-    bool            important;
+    lxb_css_rule_declaration_offset_t offset;
+
+    bool                              important;
 };
 
 
diff --git a/ext/lexbor/lexbor/css/selectors/base.h b/ext/lexbor/lexbor/css/selectors/base.h
index 279c1e5f68c3..3151f74b04ee 100644
--- a/ext/lexbor/lexbor/css/selectors/base.h
+++ b/ext/lexbor/lexbor/css/selectors/base.h
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2021-2024 Alexander Borisov
+ * Copyright (C) 2021-2025 Alexander Borisov
  *
  * Author: Alexander Borisov 
  */
@@ -16,7 +16,7 @@ extern "C" {
 
 
 #define LXB_CSS_SELECTORS_VERSION_MAJOR 1
-#define LXB_CSS_SELECTORS_VERSION_MINOR 1
+#define LXB_CSS_SELECTORS_VERSION_MINOR 3
 #define LXB_CSS_SELECTORS_VERSION_PATCH 0
 
 #define LXB_CSS_SELECTORS_VERSION_STRING                                       \
diff --git a/ext/lexbor/lexbor/css/selectors/pseudo_const.h b/ext/lexbor/lexbor/css/selectors/pseudo_const.h
index 2b19f1888147..9fa5bb2177c7 100644
--- a/ext/lexbor/lexbor/css/selectors/pseudo_const.h
+++ b/ext/lexbor/lexbor/css/selectors/pseudo_const.h
@@ -69,15 +69,16 @@ typedef enum {
     LXB_CSS_SELECTOR_PSEUDO_CLASS_FUNCTION_HAS              = 0x0003,
     LXB_CSS_SELECTOR_PSEUDO_CLASS_FUNCTION_IS               = 0x0004,
     LXB_CSS_SELECTOR_PSEUDO_CLASS_FUNCTION_LANG             = 0x0005,
-    LXB_CSS_SELECTOR_PSEUDO_CLASS_FUNCTION_NOT              = 0x0006,
-    LXB_CSS_SELECTOR_PSEUDO_CLASS_FUNCTION_NTH_CHILD        = 0x0007,
-    LXB_CSS_SELECTOR_PSEUDO_CLASS_FUNCTION_NTH_COL          = 0x0008,
-    LXB_CSS_SELECTOR_PSEUDO_CLASS_FUNCTION_NTH_LAST_CHILD   = 0x0009,
-    LXB_CSS_SELECTOR_PSEUDO_CLASS_FUNCTION_NTH_LAST_COL     = 0x000a,
-    LXB_CSS_SELECTOR_PSEUDO_CLASS_FUNCTION_NTH_LAST_OF_TYPE = 0x000b,
-    LXB_CSS_SELECTOR_PSEUDO_CLASS_FUNCTION_NTH_OF_TYPE      = 0x000c,
-    LXB_CSS_SELECTOR_PSEUDO_CLASS_FUNCTION_WHERE            = 0x000d,
-    LXB_CSS_SELECTOR_PSEUDO_CLASS_FUNCTION__LAST_ENTRY      = 0x000e
+    LXB_CSS_SELECTOR_PSEUDO_CLASS_FUNCTION_LEXBOR_CONTAINS  = 0x0006,
+    LXB_CSS_SELECTOR_PSEUDO_CLASS_FUNCTION_NOT              = 0x0007,
+    LXB_CSS_SELECTOR_PSEUDO_CLASS_FUNCTION_NTH_CHILD        = 0x0008,
+    LXB_CSS_SELECTOR_PSEUDO_CLASS_FUNCTION_NTH_COL          = 0x0009,
+    LXB_CSS_SELECTOR_PSEUDO_CLASS_FUNCTION_NTH_LAST_CHILD   = 0x000a,
+    LXB_CSS_SELECTOR_PSEUDO_CLASS_FUNCTION_NTH_LAST_COL     = 0x000b,
+    LXB_CSS_SELECTOR_PSEUDO_CLASS_FUNCTION_NTH_LAST_OF_TYPE = 0x000c,
+    LXB_CSS_SELECTOR_PSEUDO_CLASS_FUNCTION_NTH_OF_TYPE      = 0x000d,
+    LXB_CSS_SELECTOR_PSEUDO_CLASS_FUNCTION_WHERE            = 0x000e,
+    LXB_CSS_SELECTOR_PSEUDO_CLASS_FUNCTION__LAST_ENTRY      = 0x000f
 }
 lxb_css_selector_pseudo_class_function_id_t;
 
diff --git a/ext/lexbor/lexbor/css/selectors/pseudo_res.h b/ext/lexbor/lexbor/css/selectors/pseudo_res.h
index 5ae6e048064c..108257406069 100644
--- a/ext/lexbor/lexbor/css/selectors/pseudo_res.h
+++ b/ext/lexbor/lexbor/css/selectors/pseudo_res.h
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2020-2021 Alexander Borisov
+ * Copyright (C) 2020-2026 Alexander Borisov
  *
  * Author: Alexander Borisov 
  */
@@ -68,60 +68,64 @@ static const lxb_css_selectors_pseudo_data_func_t lxb_css_selectors_pseudo_data_
 {
     {(lxb_char_t *) "#undef", 6, LXB_CSS_SELECTOR_PSEUDO_CLASS_FUNCTION__UNDEF,
      false, LXB_CSS_SELECTOR_COMBINATOR_CLOSE,
-     {.state = lxb_css_selectors_state_pseudo_class_function__undef, .block = NULL,
-      .failed = lxb_css_state_failed, .end = lxb_css_selectors_state_function_end}, false, false},
+     {.value = lxb_css_selectors_state_pseudo_class_function__undef,
+      .cb.failed = lxb_css_state_failed, .cb.end = lxb_css_selectors_state_function_end}, false, false},
     {(lxb_char_t *) "current", 7, LXB_CSS_SELECTOR_PSEUDO_CLASS_FUNCTION_CURRENT,
      false, LXB_CSS_SELECTOR_COMBINATOR_CLOSE,
-     {.state = lxb_css_selectors_state_pseudo_class_function_current, .block = NULL,
-      .failed = lxb_css_state_failed, .end = lxb_css_selectors_state_function_end}, false, true},
+     {.value = lxb_css_selectors_state_pseudo_class_function_current,
+      .cb.failed = lxb_css_state_failed, .cb.end = lxb_css_selectors_state_function_end}, false, true},
     {(lxb_char_t *) "dir", 3, LXB_CSS_SELECTOR_PSEUDO_CLASS_FUNCTION_DIR,
      false, LXB_CSS_SELECTOR_COMBINATOR_CLOSE,
-     {.state = lxb_css_selectors_state_pseudo_class_function_dir, .block = NULL,
-      .failed = lxb_css_state_failed, .end = lxb_css_selectors_state_function_end}, false, false},
+     {.value = lxb_css_selectors_state_pseudo_class_function_dir,
+      .cb.failed = lxb_css_state_failed, .cb.end = lxb_css_selectors_state_function_end}, false, false},
     {(lxb_char_t *) "has", 3, LXB_CSS_SELECTOR_PSEUDO_CLASS_FUNCTION_HAS,
      false, LXB_CSS_SELECTOR_COMBINATOR_DESCENDANT,
-     {.state = lxb_css_selectors_state_pseudo_class_function_has, .block = NULL,
-      .failed = lxb_css_state_failed, .end = lxb_css_selectors_state_function_forgiving_relative}, true, true},
+     {.value = lxb_css_selectors_state_pseudo_class_function_has,
+      .cb.failed = lxb_css_state_failed, .cb.end = lxb_css_selectors_state_function_forgiving_relative}, true, true},
     {(lxb_char_t *) "is", 2, LXB_CSS_SELECTOR_PSEUDO_CLASS_FUNCTION_IS,
      false, LXB_CSS_SELECTOR_COMBINATOR_CLOSE,
-     {.state = lxb_css_selectors_state_pseudo_class_function_is, .block = NULL,
-      .failed = lxb_css_state_failed, .end = lxb_css_selectors_state_function_forgiving}, true, true},
+     {.value = lxb_css_selectors_state_pseudo_class_function_is,
+      .cb.failed = lxb_css_state_failed, .cb.end = lxb_css_selectors_state_function_forgiving}, true, true},
     {(lxb_char_t *) "lang", 4, LXB_CSS_SELECTOR_PSEUDO_CLASS_FUNCTION_LANG,
      false, LXB_CSS_SELECTOR_COMBINATOR_CLOSE,
-     {.state = lxb_css_selectors_state_pseudo_class_function_lang, .block = NULL,
-      .failed = lxb_css_state_failed, .end = lxb_css_selectors_state_function_end}, false, false},
+     {.value = lxb_css_selectors_state_pseudo_class_function_lang,
+      .cb.failed = lxb_css_state_failed, .cb.end = lxb_css_selectors_state_function_end}, false, false},
+    {(lxb_char_t *) "lexbor-contains", 15, LXB_CSS_SELECTOR_PSEUDO_CLASS_FUNCTION_LEXBOR_CONTAINS,
+     false, LXB_CSS_SELECTOR_COMBINATOR_CLOSE,
+     {.value = lxb_css_selectors_state_pseudo_class_function_lexbor_contains,
+      .cb.failed = lxb_css_state_failed, .cb.end = lxb_css_selectors_state_function_end}, false, false},
     {(lxb_char_t *) "not", 3, LXB_CSS_SELECTOR_PSEUDO_CLASS_FUNCTION_NOT,
      false, LXB_CSS_SELECTOR_COMBINATOR_CLOSE,
-     {.state = lxb_css_selectors_state_pseudo_class_function_not, .block = NULL,
-      .failed = lxb_css_state_failed, .end = lxb_css_selectors_state_function_end}, false, true},
+     {.value = lxb_css_selectors_state_pseudo_class_function_not,
+      .cb.failed = lxb_css_state_failed, .cb.end = lxb_css_selectors_state_function_end}, false, true},
     {(lxb_char_t *) "nth-child", 9, LXB_CSS_SELECTOR_PSEUDO_CLASS_FUNCTION_NTH_CHILD,
      false, LXB_CSS_SELECTOR_COMBINATOR_CLOSE,
-     {.state = lxb_css_selectors_state_pseudo_class_function_nth_child, .block = NULL,
-      .failed = lxb_css_state_failed, .end = lxb_css_selectors_state_function_end}, false, true},
+     {.value = lxb_css_selectors_state_pseudo_class_function_nth_child,
+      .cb.failed = lxb_css_state_failed, .cb.end = lxb_css_selectors_state_function_end}, false, true},
     {(lxb_char_t *) "nth-col", 7, LXB_CSS_SELECTOR_PSEUDO_CLASS_FUNCTION_NTH_COL,
      false, LXB_CSS_SELECTOR_COMBINATOR_CLOSE,
-     {.state = lxb_css_selectors_state_pseudo_class_function_nth_col, .block = NULL,
-      .failed = lxb_css_state_failed, .end = lxb_css_selectors_state_function_end}, false, false},
+     {.value = lxb_css_selectors_state_pseudo_class_function_nth_col,
+      .cb.failed = lxb_css_state_failed, .cb.end = lxb_css_selectors_state_function_end}, false, false},
     {(lxb_char_t *) "nth-last-child", 14, LXB_CSS_SELECTOR_PSEUDO_CLASS_FUNCTION_NTH_LAST_CHILD,
      false, LXB_CSS_SELECTOR_COMBINATOR_CLOSE,
-     {.state = lxb_css_selectors_state_pseudo_class_function_nth_last_child, .block = NULL,
-      .failed = lxb_css_state_failed, .end = lxb_css_selectors_state_function_end}, false, true},
+     {.value = lxb_css_selectors_state_pseudo_class_function_nth_last_child,
+      .cb.failed = lxb_css_state_failed, .cb.end = lxb_css_selectors_state_function_end}, false, true},
     {(lxb_char_t *) "nth-last-col", 12, LXB_CSS_SELECTOR_PSEUDO_CLASS_FUNCTION_NTH_LAST_COL,
      false, LXB_CSS_SELECTOR_COMBINATOR_CLOSE,
-     {.state = lxb_css_selectors_state_pseudo_class_function_nth_last_col, .block = NULL,
-      .failed = lxb_css_state_failed, .end = lxb_css_selectors_state_function_end}, false, false},
+     {.value = lxb_css_selectors_state_pseudo_class_function_nth_last_col,
+      .cb.failed = lxb_css_state_failed, .cb.end = lxb_css_selectors_state_function_end}, false, false},
     {(lxb_char_t *) "nth-last-of-type", 16, LXB_CSS_SELECTOR_PSEUDO_CLASS_FUNCTION_NTH_LAST_OF_TYPE,
      false, LXB_CSS_SELECTOR_COMBINATOR_CLOSE,
-     {.state = lxb_css_selectors_state_pseudo_class_function_nth_last_of_type, .block = NULL,
-      .failed = lxb_css_state_failed, .end = lxb_css_selectors_state_function_end}, false, false},
+     {.value = lxb_css_selectors_state_pseudo_class_function_nth_last_of_type,
+      .cb.failed = lxb_css_state_failed, .cb.end = lxb_css_selectors_state_function_end}, false, false},
     {(lxb_char_t *) "nth-of-type", 11, LXB_CSS_SELECTOR_PSEUDO_CLASS_FUNCTION_NTH_OF_TYPE,
      false, LXB_CSS_SELECTOR_COMBINATOR_CLOSE,
-     {.state = lxb_css_selectors_state_pseudo_class_function_nth_of_type, .block = NULL,
-      .failed = lxb_css_state_failed, .end = lxb_css_selectors_state_function_end}, false, false},
+     {.value = lxb_css_selectors_state_pseudo_class_function_nth_of_type,
+      .cb.failed = lxb_css_state_failed, .cb.end = lxb_css_selectors_state_function_end}, false, false},
     {(lxb_char_t *) "where", 5, LXB_CSS_SELECTOR_PSEUDO_CLASS_FUNCTION_WHERE,
      false, LXB_CSS_SELECTOR_COMBINATOR_CLOSE,
-     {.state = lxb_css_selectors_state_pseudo_class_function_where, .block = NULL,
-      .failed = lxb_css_state_failed, .end = lxb_css_selectors_state_function_forgiving}, true, true}
+     {.value = lxb_css_selectors_state_pseudo_class_function_where,
+      .cb.failed = lxb_css_state_failed, .cb.end = lxb_css_selectors_state_function_forgiving}, true, true}
 };
 
 static const lxb_css_selectors_pseudo_data_t lxb_css_selectors_pseudo_data_pseudo_element[LXB_CSS_SELECTOR_PSEUDO_ELEMENT__LAST_ENTRY] = 
@@ -145,8 +149,8 @@ static const lxb_css_selectors_pseudo_data_func_t lxb_css_selectors_pseudo_data_
 {
     {(lxb_char_t *) "#undef", 6, LXB_CSS_SELECTOR_PSEUDO_ELEMENT_FUNCTION__UNDEF,
      false, LXB_CSS_SELECTOR_COMBINATOR_CLOSE,
-     {.state = lxb_css_selectors_state_pseudo_element_function__undef, .block = NULL,
-      .failed = lxb_css_state_failed, .end = lxb_css_selectors_state_function_end}, false, false}
+     {.value = lxb_css_selectors_state_pseudo_element_function__undef,
+      .cb.failed = lxb_css_state_failed, .cb.end = lxb_css_selectors_state_function_end}, false, false}
 };
 
 static const lexbor_shs_entry_t lxb_css_selectors_pseudo_class_shs[79] = 
@@ -232,46 +236,50 @@ static const lexbor_shs_entry_t lxb_css_selectors_pseudo_class_shs[79] =
     {NULL, NULL, 0, 0}
 };
 
-static const lexbor_shs_entry_t lxb_css_selectors_pseudo_class_function_shs[39] = 
+static const lexbor_shs_entry_t lxb_css_selectors_pseudo_class_function_shs[43] = 
 {
-    {NULL, NULL, 38, 0}, 
+    {NULL, NULL, 42, 0}, 
+    {"nth-last-of-type", (void *) &lxb_css_selectors_pseudo_data_pseudo_class_function[LXB_CSS_SELECTOR_PSEUDO_CLASS_FUNCTION_NTH_LAST_OF_TYPE], 16, 0}, 
     {NULL, NULL, 0, 0}, 
-    {"current", (void *) &lxb_css_selectors_pseudo_data_pseudo_class_function[LXB_CSS_SELECTOR_PSEUDO_CLASS_FUNCTION_CURRENT], 7, 0}, 
     {NULL, NULL, 0, 0}, 
-    {"dir", (void *) &lxb_css_selectors_pseudo_data_pseudo_class_function[LXB_CSS_SELECTOR_PSEUDO_CLASS_FUNCTION_DIR], 3, 0}, 
     {NULL, NULL, 0, 0}, 
     {NULL, NULL, 0, 0}, 
+    {"not", (void *) &lxb_css_selectors_pseudo_data_pseudo_class_function[LXB_CSS_SELECTOR_PSEUDO_CLASS_FUNCTION_NOT], 3, 0}, 
     {NULL, NULL, 0, 0}, 
-    {"is", (void *) &lxb_css_selectors_pseudo_data_pseudo_class_function[LXB_CSS_SELECTOR_PSEUDO_CLASS_FUNCTION_IS], 2, 0}, 
     {NULL, NULL, 0, 0}, 
     {NULL, NULL, 0, 0}, 
     {NULL, NULL, 0, 0}, 
     {NULL, NULL, 0, 0}, 
     {NULL, NULL, 0, 0}, 
-    {"nth-child", (void *) &lxb_css_selectors_pseudo_data_pseudo_class_function[LXB_CSS_SELECTOR_PSEUDO_CLASS_FUNCTION_NTH_CHILD], 9, 0}, 
     {NULL, NULL, 0, 0}, 
+    {"has", (void *) &lxb_css_selectors_pseudo_data_pseudo_class_function[LXB_CSS_SELECTOR_PSEUDO_CLASS_FUNCTION_HAS], 3, 0}, 
     {NULL, NULL, 0, 0}, 
     {NULL, NULL, 0, 0}, 
     {NULL, NULL, 0, 0}, 
-    {"nth-last-child", (void *) &lxb_css_selectors_pseudo_data_pseudo_class_function[LXB_CSS_SELECTOR_PSEUDO_CLASS_FUNCTION_NTH_LAST_CHILD], 14, 0}, 
     {NULL, NULL, 0, 0}, 
     {NULL, NULL, 0, 0}, 
+    {"nth-col", (void *) &lxb_css_selectors_pseudo_data_pseudo_class_function[LXB_CSS_SELECTOR_PSEUDO_CLASS_FUNCTION_NTH_COL], 7, 0}, 
     {NULL, NULL, 0, 0}, 
-    {"where", (void *) &lxb_css_selectors_pseudo_data_pseudo_class_function[LXB_CSS_SELECTOR_PSEUDO_CLASS_FUNCTION_WHERE], 5, 0}, 
+    {"lexbor-contains", (void *) &lxb_css_selectors_pseudo_data_pseudo_class_function[LXB_CSS_SELECTOR_PSEUDO_CLASS_FUNCTION_LEXBOR_CONTAINS], 15, 0}, 
+    {NULL, NULL, 0, 0}, 
+    {"is", (void *) &lxb_css_selectors_pseudo_data_pseudo_class_function[LXB_CSS_SELECTOR_PSEUDO_CLASS_FUNCTION_IS], 2, 0}, 
+    {"nth-last-col", (void *) &lxb_css_selectors_pseudo_data_pseudo_class_function[LXB_CSS_SELECTOR_PSEUDO_CLASS_FUNCTION_NTH_LAST_COL], 12, 0}, 
+    {"current", (void *) &lxb_css_selectors_pseudo_data_pseudo_class_function[LXB_CSS_SELECTOR_PSEUDO_CLASS_FUNCTION_CURRENT], 7, 0}, 
     {NULL, NULL, 0, 0}, 
     {NULL, NULL, 0, 0}, 
-    {"nth-col", (void *) &lxb_css_selectors_pseudo_data_pseudo_class_function[LXB_CSS_SELECTOR_PSEUDO_CLASS_FUNCTION_NTH_COL], 7, 0}, 
     {"lang", (void *) &lxb_css_selectors_pseudo_data_pseudo_class_function[LXB_CSS_SELECTOR_PSEUDO_CLASS_FUNCTION_LANG], 4, 0}, 
-    {"has", (void *) &lxb_css_selectors_pseudo_data_pseudo_class_function[LXB_CSS_SELECTOR_PSEUDO_CLASS_FUNCTION_HAS], 3, 0}, 
     {NULL, NULL, 0, 0}, 
     {NULL, NULL, 0, 0}, 
-    {"nth-last-col", (void *) &lxb_css_selectors_pseudo_data_pseudo_class_function[LXB_CSS_SELECTOR_PSEUDO_CLASS_FUNCTION_NTH_LAST_COL], 12, 0}, 
-    {"nth-of-type", (void *) &lxb_css_selectors_pseudo_data_pseudo_class_function[LXB_CSS_SELECTOR_PSEUDO_CLASS_FUNCTION_NTH_OF_TYPE], 11, 0}, 
+    {"nth-child", (void *) &lxb_css_selectors_pseudo_data_pseudo_class_function[LXB_CSS_SELECTOR_PSEUDO_CLASS_FUNCTION_NTH_CHILD], 9, 0}, 
     {NULL, NULL, 0, 0}, 
     {NULL, NULL, 0, 0}, 
     {NULL, NULL, 0, 0}, 
-    {"not", (void *) &lxb_css_selectors_pseudo_data_pseudo_class_function[LXB_CSS_SELECTOR_PSEUDO_CLASS_FUNCTION_NOT], 3, 0}, 
-    {"nth-last-of-type", (void *) &lxb_css_selectors_pseudo_data_pseudo_class_function[LXB_CSS_SELECTOR_PSEUDO_CLASS_FUNCTION_NTH_LAST_OF_TYPE], 16, 0}, 
+    {NULL, NULL, 0, 0}, 
+    {"nth-last-child", (void *) &lxb_css_selectors_pseudo_data_pseudo_class_function[LXB_CSS_SELECTOR_PSEUDO_CLASS_FUNCTION_NTH_LAST_CHILD], 14, 0}, 
+    {"nth-of-type", (void *) &lxb_css_selectors_pseudo_data_pseudo_class_function[LXB_CSS_SELECTOR_PSEUDO_CLASS_FUNCTION_NTH_OF_TYPE], 11, 0}, 
+    {NULL, NULL, 0, 0}, 
+    {"dir", (void *) &lxb_css_selectors_pseudo_data_pseudo_class_function[LXB_CSS_SELECTOR_PSEUDO_CLASS_FUNCTION_DIR], 3, 0}, 
+    {"where", (void *) &lxb_css_selectors_pseudo_data_pseudo_class_function[LXB_CSS_SELECTOR_PSEUDO_CLASS_FUNCTION_WHERE], 5, 0}, 
     {NULL, NULL, 0, 0}
 };
 
diff --git a/ext/lexbor/lexbor/css/selectors/pseudo_state.c b/ext/lexbor/lexbor/css/selectors/pseudo_state.c
index f40b089d1300..263ca52f35e4 100644
--- a/ext/lexbor/lexbor/css/selectors/pseudo_state.c
+++ b/ext/lexbor/lexbor/css/selectors/pseudo_state.c
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2020-2022 Alexander Borisov
+ * Copyright (C) 2020-2026 Alexander Borisov
  *
  * Author: Alexander Borisov 
  */
@@ -27,10 +27,9 @@ lxb_css_selectors_state_pseudo_of_back(lxb_css_parser_t *parser,
 
 
 static const lxb_css_syntax_cb_components_t lxb_css_selectors_comp = {
-    .state = lxb_css_selectors_state_complex_list,
-    .block = NULL,
-    .failed = lxb_css_state_failed,
-    .end = lxb_css_selectors_state_pseudo_of_end
+    .prelude = lxb_css_selectors_state_complex_list,
+    .cb.failed = lxb_css_state_failed,
+    .cb.end = lxb_css_selectors_state_pseudo_of_end
 };
 
 
@@ -182,6 +181,117 @@ lxb_css_selectors_state_pseudo_element_function__undef(lxb_css_parser_t *parser,
     return true;
 }
 
+bool
+lxb_css_selectors_state_pseudo_class_function_lexbor_contains(lxb_css_parser_t *parser,
+                                const lxb_css_syntax_token_t *token, void *ctx)
+{
+    lxb_css_selectors_t *selectors;
+    lxb_css_selector_t *selector;
+    lxb_css_selector_contains_t *contains;
+    lexbor_str_t *str;
+    const lxb_char_t *data;
+    size_t length;
+
+    selectors = parser->selectors;
+    selector = selectors->list_last->last;
+
+again:
+
+    switch (token->type) {
+        case LXB_CSS_SYNTAX_TOKEN_STRING:
+            data = token->types.string.data;
+            length = token->types.string.length;
+            break;
+
+        case LXB_CSS_SYNTAX_TOKEN_IDENT:
+            data = token->types.ident.data;
+            length = token->types.ident.length;
+            break;
+
+        case LXB_CSS_SYNTAX_TOKEN_WHITESPACE:
+            lxb_css_syntax_parser_consume(parser);
+            lxb_css_parser_token_status_m(parser, token);
+            goto again;
+
+        default:
+            lxb_css_parser_unexpected_data(parser, token);
+            return lxb_css_parser_failed(parser);
+    }
+
+    contains = lexbor_mraw_alloc(parser->memory->mraw,
+                            sizeof(lxb_css_selector_contains_t));
+    if (contains == NULL) {
+        return lxb_css_parser_memory_fail(parser);
+    }
+
+    contains->insensitive = false;
+    str = &contains->str;
+
+    str->data = lexbor_mraw_alloc(parser->memory->mraw,
+                                  sizeof(lexbor_str_t));
+    if (str->data == NULL) {
+        return lxb_css_parser_memory_fail(parser);
+    }
+
+    memcpy(str->data, data, length + 1);
+
+    str->length = length;
+    str->data[length] = '\0';
+
+    selector->u.pseudo.data = contains;
+
+again_end:
+
+    lxb_css_syntax_parser_consume(parser);
+    lxb_css_parser_token_status_m(parser, token);
+
+    switch (token->type) {
+        case LXB_CSS_SYNTAX_TOKEN__END:
+            break;
+
+        case LXB_CSS_SYNTAX_TOKEN_WHITESPACE:
+            goto again_end;
+
+        case LXB_CSS_SYNTAX_TOKEN_IDENT:
+            data = token->types.ident.data;
+            length = token->types.ident.length;
+
+            if (length == 1 && (*data == 'i' || *data == 'I')) {
+                contains->insensitive = true;
+
+                lxb_css_syntax_parser_consume(parser);
+                lxb_css_parser_token_status_m(parser, token);
+
+                if (token->type == LXB_CSS_SYNTAX_TOKEN_WHITESPACE) {
+                    lxb_css_syntax_parser_consume(parser);
+                    lxb_css_parser_token_status_m(parser, token);
+                }
+
+                if (token->type != LXB_CSS_SYNTAX_TOKEN__END) {
+                    goto failed;
+                }
+
+                break;
+            }
+            /* Fall through. */
+
+        default:
+            goto failed;
+    }
+
+    parser->selectors->list = NULL;
+
+    return lxb_css_parser_success(parser);
+
+failed:
+
+    lexbor_mraw_free(parser->memory->mraw, contains->str.data);
+    lexbor_mraw_free(parser->memory->mraw, contains);
+
+    lxb_css_parser_unexpected_data(parser, token);
+    return lxb_css_parser_failed(parser);
+}
+
 static bool
 lxb_css_selectors_state_pseudo_anb(lxb_css_parser_t *parser,
                                    const lxb_css_syntax_token_t *token,
@@ -268,10 +378,14 @@ lxb_css_selectors_state_pseudo_of_begin(lxb_css_parser_t *parser,
                 return lxb_css_parser_memory_fail(parser);
             }
 
-            rule = lxb_css_syntax_parser_components_push(parser, token,
+            rule = lxb_css_syntax_parser_components_push(parser,
+                                                         &lxb_css_selectors_comp,
                                                          lxb_css_selectors_state_pseudo_of_back,
-                                                         &lxb_css_selectors_comp, list,
-                                                         LXB_CSS_SYNTAX_TOKEN_R_PARENTHESIS);
+                                                         list, LXB_CSS_SYNTAX_TOKEN_R_PARENTHESIS);
+//            rule = lxb_css_syntax_parser_components_push(parser, token,
+//                                                         lxb_css_selectors_state_pseudo_of_back,
+//                                                         &lxb_css_selectors_comp, list,
+//                                                         LXB_CSS_SYNTAX_TOKEN_R_PARENTHESIS);
             if (rule == NULL) {
                 lexbor_mraw_free(parser->memory->mraw,
                                  list->last->u.pseudo.data);
diff --git a/ext/lexbor/lexbor/css/selectors/pseudo_state.h b/ext/lexbor/lexbor/css/selectors/pseudo_state.h
index 5c5a31f94585..652e455f1f13 100644
--- a/ext/lexbor/lexbor/css/selectors/pseudo_state.h
+++ b/ext/lexbor/lexbor/css/selectors/pseudo_state.h
@@ -77,6 +77,10 @@ LXB_API bool
 lxb_css_selectors_state_pseudo_element_function__undef(lxb_css_parser_t *parser,
     const lxb_css_syntax_token_t *token, void *ctx);
 
+LXB_API bool
+lxb_css_selectors_state_pseudo_class_function_lexbor_contains(lxb_css_parser_t *parser,
+    const lxb_css_syntax_token_t *token, void *ctx);
+
 
 #ifdef __cplusplus
 } /* extern "C" */
diff --git a/ext/lexbor/lexbor/css/selectors/selector.c b/ext/lexbor/lexbor/css/selectors/selector.c
index e8bf96ba88cf..160d19fa45a2 100644
--- a/ext/lexbor/lexbor/css/selectors/selector.c
+++ b/ext/lexbor/lexbor/css/selectors/selector.c
@@ -638,11 +638,45 @@ lxb_css_selector_serialize_class(lxb_css_selector_t *selector,
     return LXB_STATUS_OK;
 }
 
+static lxb_status_t
+lxb_css_selector_serialize_escape_write(lxb_char_t *p, lxb_char_t *end,
+                                        lexbor_serialize_cb_f cb, void *ctx)
+{
+    lxb_char_t *begin;
+    lxb_status_t status;
+
+    begin = p;
+
+    lxb_css_selector_serialize_write("\"", 1);
+
+    while (p < end) {
+        if (*p == '"') {
+            if (begin < p) {
+                lxb_css_selector_serialize_write(begin, p - begin);
+            }
+
+            lxb_css_selector_serialize_write("\\000022", 7);
+
+            begin = p + 1;
+        }
+
+        p++;
+    }
+
+    if (begin < p) {
+        lxb_css_selector_serialize_write(begin, p - begin);
+    }
+
+    lxb_css_selector_serialize_write("\"", 1);
+
+    return LXB_STATUS_OK;
+}
+
 static lxb_status_t
 lxb_css_selector_serialize_attribute(lxb_css_selector_t *selector,
                                      lexbor_serialize_cb_f cb, void *ctx)
 {
-    lxb_char_t *p, *begin, *end;
+    lxb_char_t *p, *end;
     lxb_status_t status;
     lxb_css_selector_attribute_t *attr;
 
@@ -686,30 +720,11 @@ lxb_css_selector_serialize_attribute(lxb_css_selector_t *selector,
     p = attr->value.data;
     end = attr->value.data + attr->value.length;
 
-    begin = p;
-
-    lxb_css_selector_serialize_write("\"", 1);
-
-    while (p < end) {
-        if (*p == '"') {
-            if (begin < p) {
-                lxb_css_selector_serialize_write(begin, p - begin);
-            }
-
-            lxb_css_selector_serialize_write("\\000022", 7);
-
-            begin = p + 1;
-        }
-
-        p++;
-    }
-
-    if (begin < p) {
-        lxb_css_selector_serialize_write(begin, p - begin);
+    status = lxb_css_selector_serialize_escape_write(p, end, cb, ctx);
+    if (status != LXB_STATUS_OK) {
+        return status;
     }
 
-    lxb_css_selector_serialize_write("\"", 1);
-
     if (attr->modifier != LXB_CSS_SELECTOR_MODIFIER_UNSET) {
         switch (attr->modifier) {
             case LXB_CSS_SELECTOR_MODIFIER_I:
@@ -740,7 +755,9 @@ lxb_css_selector_serialize_pseudo_class_function(lxb_css_selector_t *selector,
                                                  lexbor_serialize_cb_f cb, void *ctx)
 {
     lxb_status_t status;
+    lxb_char_t *p, *end;
     lxb_css_selector_pseudo_t *pseudo;
+    lxb_css_selector_contains_t *contains;
     const lxb_css_selectors_pseudo_data_func_t *pfunc;
 
     pseudo = &selector->u.pseudo;
@@ -789,6 +806,22 @@ lxb_css_selector_serialize_pseudo_class_function(lxb_css_selector_t *selector,
                                                            cb, ctx);
             break;
 
+        case LXB_CSS_SELECTOR_PSEUDO_CLASS_FUNCTION_LEXBOR_CONTAINS:
+            contains = pseudo->data;
+            p = contains->str.data;
+            end = p + contains->str.length;
+
+            status = lxb_css_selector_serialize_escape_write(p, end, cb, ctx);
+            if (status != LXB_STATUS_OK) {
+                return status;
+            }
+
+            if (contains->insensitive) {
+                lxb_css_selector_serialize_write(" i", 2);
+            }
+
+            break;
+
         default:
             status = LXB_STATUS_OK;
             break;
diff --git a/ext/lexbor/lexbor/css/selectors/selector.h b/ext/lexbor/lexbor/css/selectors/selector.h
index 52dbabc7ba5c..1862c868c8ce 100644
--- a/ext/lexbor/lexbor/css/selectors/selector.h
+++ b/ext/lexbor/lexbor/css/selectors/selector.h
@@ -80,6 +80,12 @@ typedef struct {
 }
 lxb_css_selector_anb_of_t;
 
+typedef struct {
+    lexbor_str_t str;
+    bool         insensitive;
+}
+lxb_css_selector_contains_t;
+
 struct lxb_css_selector {
     lxb_css_selector_type_t       type;
     lxb_css_selector_combinator_t combinator;
diff --git a/ext/lexbor/lexbor/css/selectors/selectors.c b/ext/lexbor/lexbor/css/selectors/selectors.c
index 52537873ef08..77586f4a65c6 100644
--- a/ext/lexbor/lexbor/css/selectors/selectors.c
+++ b/ext/lexbor/lexbor/css/selectors/selectors.c
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2020-2022 Alexander Borisov
+ * Copyright (C) 2020-2026 Alexander Borisov
  *
  * Author: Alexander Borisov 
  */
@@ -20,59 +20,51 @@ lxb_css_selectors_components_end(lxb_css_parser_t *parser,
 
 
 static const lxb_css_syntax_cb_components_t lxb_css_selectors_complex_list_cb = {
-    .state = lxb_css_selectors_state_complex_list,
-    .block = NULL,
-    .failed = lxb_css_state_failed,
-    .end = lxb_css_selectors_components_end
+    .prelude = lxb_css_selectors_state_complex_list,
+    .cb.failed = lxb_css_state_failed,
+    .cb.end = lxb_css_selectors_components_end
 };
 
 static const lxb_css_syntax_cb_components_t lxb_css_selectors_compound_list_cb = {
-    .state = lxb_css_selectors_state_compound_list,
-    .block = NULL,
-    .failed = lxb_css_state_failed,
-    .end = lxb_css_selectors_components_end
+    .prelude = lxb_css_selectors_state_compound_list,
+    .cb.failed = lxb_css_state_failed,
+    .cb.end = lxb_css_selectors_components_end
 };
 
 static const lxb_css_syntax_cb_components_t lxb_css_selectors_simple_list_cb = {
-    .state = lxb_css_selectors_state_simple_list,
-    .block = NULL,
-    .failed = lxb_css_state_failed,
-    .end = lxb_css_selectors_components_end
+    .prelude = lxb_css_selectors_state_simple_list,
+    .cb.failed = lxb_css_state_failed,
+    .cb.end = lxb_css_selectors_components_end
 };
 
 static const lxb_css_syntax_cb_components_t lxb_css_selectors_relative_list_cb = {
-    .state = lxb_css_selectors_state_relative_list,
-    .block = NULL,
-    .failed = lxb_css_state_failed,
-    .end = lxb_css_selectors_components_end
+    .prelude = lxb_css_selectors_state_relative_list,
+    .cb.failed = lxb_css_state_failed,
+    .cb.end = lxb_css_selectors_components_end
 };
 
 static const lxb_css_syntax_cb_components_t lxb_css_selectors_complex_cb = {
-    .state = lxb_css_selectors_state_complex,
-    .block = NULL,
-    .failed = lxb_css_state_failed,
-    .end = lxb_css_selectors_components_end
+    .prelude = lxb_css_selectors_state_complex,
+    .cb.failed = lxb_css_state_failed,
+    .cb.end = lxb_css_selectors_components_end
 };
 
 static const lxb_css_syntax_cb_components_t lxb_css_selectors_compound_cb = {
-    .state = lxb_css_selectors_state_compound,
-    .block = NULL,
-    .failed = lxb_css_state_failed,
-    .end = lxb_css_selectors_components_end
+    .prelude = lxb_css_selectors_state_compound,
+    .cb.failed = lxb_css_state_failed,
+    .cb.end = lxb_css_selectors_components_end
 };
 
 static const lxb_css_syntax_cb_components_t lxb_css_selectors_simple_cb = {
-    .state = lxb_css_selectors_state_simple,
-    .block = NULL,
-    .failed = lxb_css_state_failed,
-    .end = lxb_css_selectors_components_end
+    .prelude = lxb_css_selectors_state_simple,
+    .cb.failed = lxb_css_state_failed,
+    .cb.end = lxb_css_selectors_components_end
 };
 
 static const lxb_css_syntax_cb_components_t lxb_css_selectors_relative_cb = {
-    .state = lxb_css_selectors_state_relative,
-    .block = NULL,
-    .failed = lxb_css_state_failed,
-    .end = lxb_css_selectors_components_end
+    .prelude = lxb_css_selectors_state_relative,
+    .cb.failed = lxb_css_state_failed,
+    .cb.end = lxb_css_selectors_components_end
 };
 
 
@@ -170,9 +162,7 @@ lxb_css_selectors_parse_relative_list(lxb_css_parser_t *parser,
 }
 
 static lxb_status_t
-lxb_css_selectors_parse_prepare(lxb_css_parser_t *parser,
-                                lxb_css_memory_t *memory,
-                                lxb_css_selectors_t *selectors)
+lxb_css_selectors_parse_prepare(lxb_css_parser_t *parser)
 {
     if (parser->stage != LXB_CSS_PARSER_CLEAN) {
         if (parser->stage == LXB_CSS_PARSER_RUN) {
@@ -185,12 +175,6 @@ lxb_css_selectors_parse_prepare(lxb_css_parser_t *parser,
     parser->tkz->with_comment = false;
     parser->stage = LXB_CSS_PARSER_RUN;
 
-    parser->old_memory = parser->memory;
-    parser->old_selectors = parser->selectors;
-
-    parser->memory = memory;
-    parser->selectors = selectors;
-
     return LXB_STATUS_OK;
 }
 
@@ -203,8 +187,7 @@ lxb_css_selectors_parse_process(lxb_css_parser_t *parser,
 
     lxb_css_parser_buffer_set(parser, data, length);
 
-    rule = lxb_css_syntax_parser_components_push(parser, NULL, NULL,
-                                                 components, NULL,
+    rule = lxb_css_syntax_parser_components_push(parser, components, NULL, NULL,
                                                  LXB_CSS_SYNTAX_TOKEN_UNDEF);
     if (rule == NULL) {
         return NULL;
@@ -222,9 +205,6 @@ static void
 lxb_css_selectors_parse_finish(lxb_css_parser_t *parser)
 {
     parser->stage = LXB_CSS_PARSER_END;
-
-    parser->memory = parser->old_memory;
-    parser->selectors = parser->old_selectors;
 }
 
 static lxb_css_selector_list_t *
@@ -232,41 +212,45 @@ lxb_css_selectors_parse_list(lxb_css_parser_t *parser,
                              const lxb_css_syntax_cb_components_t *components,
                              const lxb_char_t *data, size_t length)
 {
-    lxb_css_memory_t *memory;
-    lxb_css_selectors_t *selectors;
+    bool my_mem, my_selectors;
     lxb_css_selector_list_t *list;
 
-    memory = parser->memory;
-    selectors = parser->selectors;
+    my_mem = false;
+    my_selectors = false;
 
-    if (selectors == NULL) {
-        selectors = lxb_css_selectors_create();
-        parser->status = lxb_css_selectors_init(selectors);
+    if (parser->selectors == NULL) {
+        parser->selectors = lxb_css_selectors_create();
+        parser->status = lxb_css_selectors_init(parser->selectors);
 
         if (parser->status != LXB_STATUS_OK) {
-            (void) lxb_css_selectors_destroy(selectors, true);
+            (void) lxb_css_selectors_destroy(parser->selectors, true);
             return NULL;
         }
+
+        my_selectors = true;
     }
     else {
-        lxb_css_selectors_clean(selectors);
+        lxb_css_selectors_clean(parser->selectors);
     }
 
-    if (memory == NULL) {
-        memory = lxb_css_memory_create();
-        parser->status = lxb_css_memory_init(memory, 256);
+    if (parser->memory == NULL) {
+        parser->memory = lxb_css_memory_create();
+        parser->status = lxb_css_memory_init(parser->memory, 256);
 
         if (parser->status != LXB_STATUS_OK) {
-            if (selectors != parser->selectors) {
-                (void) lxb_css_selectors_destroy(selectors, true);
+            if (my_selectors) {
+                parser->selectors = lxb_css_selectors_destroy(parser->selectors,
+                                                              true);
             }
 
-            (void) lxb_css_memory_destroy(memory, true);
+            (void) lxb_css_memory_destroy(parser->memory, true);
             return NULL;
         }
+
+        my_mem = true;
     }
 
-    parser->status = lxb_css_selectors_parse_prepare(parser, memory, selectors);
+    parser->status = lxb_css_selectors_parse_prepare(parser);
     if (parser->status != LXB_STATUS_OK) {
         list = NULL;
         goto end;
@@ -278,12 +262,12 @@ lxb_css_selectors_parse_list(lxb_css_parser_t *parser,
 
 end:
 
-    if (list == NULL && memory != parser->memory) {
-        (void) lxb_css_memory_destroy(memory, true);
+    if (list == NULL && my_mem) {
+        parser->memory = lxb_css_memory_destroy(parser->memory, true);
     }
 
-    if (selectors != parser->selectors) {
-        (void) lxb_css_selectors_destroy(selectors, true);
+    if (my_selectors) {
+        parser->selectors = lxb_css_selectors_destroy(parser->selectors, true);
     }
 
     return list;
diff --git a/ext/lexbor/lexbor/css/selectors/state.c b/ext/lexbor/lexbor/css/selectors/state.c
index 873e7d31cfda..1f0a391ac29a 100644
--- a/ext/lexbor/lexbor/css/selectors/state.c
+++ b/ext/lexbor/lexbor/css/selectors/state.c
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2020-2022 Alexander Borisov
+ * Copyright (C) 2020-2026 Alexander Borisov
  *
  * Author: Alexander Borisov 
  */
@@ -1557,8 +1557,8 @@ lxb_css_selectors_state_pseudo_class_function(lxb_css_parser_t *parser,
     selectors->comb_default = func->combinator;
     selectors->parent = selector;
 
-    rule = lxb_css_syntax_parser_function_push(parser, token, success,
-                                               &func->cb, selectors->list_last);
+    rule = lxb_css_syntax_consume_function(parser, token, &func->cb,
+                                           success, selectors->list_last);
     if (rule == NULL) {
         goto failed;
     }
@@ -1663,8 +1663,8 @@ lxb_css_selectors_state_pseudo_element_function(lxb_css_parser_t *parser,
     selectors->comb_default = func->combinator;
     selectors->parent = selector;
 
-    rule = lxb_css_syntax_parser_function_push(parser, token, success,
-                                               &func->cb, selectors->list_last);
+    rule = lxb_css_syntax_consume_function(parser, token, &func->cb,
+                                           success, selectors->list_last);
     if (rule == NULL) {
         (void) lxb_css_parser_memory_fail(parser);
         return parser->status;
@@ -1711,7 +1711,7 @@ lxb_css_selectors_state_function_end(lxb_css_parser_t *parser,
     lxb_css_selectors_t *selectors = parser->selectors;
 
     if (token->type == LXB_CSS_SYNTAX_TOKEN__EOF) {
-        (void) lxb_css_log_format(parser->log, LXB_CSS_LOG_ERROR,
+        (void) lxb_css_log_format(parser->log, LXB_CSS_LOG_SYNTAX_ERROR,
                                   "%s. End Of File in pseudo function",
                                   lxb_css_selectors_module_name);
     }
@@ -1737,7 +1737,7 @@ lxb_css_selectors_state_function_end(lxb_css_parser_t *parser,
         return LXB_STATUS_OK;
     }
 
-    (void) lxb_css_log_format(parser->log, LXB_CSS_LOG_ERROR,
+    (void) lxb_css_log_format(parser->log, LXB_CSS_LOG_SYNTAX_ERROR,
                               "%s. Pseudo function can't be empty: %S()",
                               lxb_css_selectors_module_name, &selector->name);
 
@@ -1783,7 +1783,7 @@ lxb_css_selectors_state_forgiving_cb(lxb_css_parser_t *parser,
     lxb_css_parser_set_ok(parser);
 
     if (token->type == LXB_CSS_SYNTAX_TOKEN__EOF) {
-        (void) lxb_css_log_format(parser->log, LXB_CSS_LOG_ERROR,
+        (void) lxb_css_log_format(parser->log, LXB_CSS_LOG_SYNTAX_ERROR,
                                   "%s. End Of File in pseudo function",
                                   lxb_css_selectors_module_name);
     }
@@ -1814,7 +1814,7 @@ lxb_css_selectors_state_forgiving_cb(lxb_css_parser_t *parser,
         return LXB_STATUS_OK;
     }
 
-    (void) lxb_css_log_format(parser->log, LXB_CSS_LOG_ERROR,
+    (void) lxb_css_log_format(parser->log, LXB_CSS_LOG_SYNTAX_ERROR,
                               "%s. Pseudo function can't be empty: %S()",
                               lxb_css_selectors_module_name, &selector->name);
 
diff --git a/ext/lexbor/lexbor/css/state.c b/ext/lexbor/lexbor/css/state.c
index 15a9614948f2..dda5310a9676 100644
--- a/ext/lexbor/lexbor/css/state.c
+++ b/ext/lexbor/lexbor/css/state.c
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2021-2022 Alexander Borisov
+ * Copyright (C) 2021-2026 Alexander Borisov
  *
  * Author: Alexander Borisov 
  */
@@ -9,6 +9,143 @@
 #include "lexbor/css/at_rule/state.h"
 
 
+static bool
+lxb_css_state_list_rules_next(lxb_css_parser_t *parser,
+                              const lxb_css_syntax_token_t *token, void *ctx);
+
+static lxb_status_t
+lxb_css_state_list_rules_end(lxb_css_parser_t *parser,
+                             const lxb_css_syntax_token_t *token,
+                             void *ctx, bool failed);
+
+static const lxb_css_syntax_cb_at_rule_t *
+lxb_css_state_at_rule_begin(lxb_css_parser_t *parser,
+                            const lxb_css_syntax_token_t *token, void *ctx,
+                            void **out_rule);
+
+static bool
+lxb_css_state_at_rule_prelude(lxb_css_parser_t *parser,
+                              const lxb_css_syntax_token_t *token,
+                              void *ctx);
+
+static lxb_status_t
+lxb_css_state_at_rule_prelude_end(lxb_css_parser_t *parser,
+                                  const lxb_css_syntax_token_t *token,
+                                  void *ctx, bool failed);
+static bool
+lxb_css_state_at_rule_prelude_failed(lxb_css_parser_t *parser,
+                                     const lxb_css_syntax_token_t *token,
+                                     void *ctx);
+static lxb_status_t
+lxb_css_state_at_rule_end(lxb_css_parser_t *parser,
+                          const lxb_css_syntax_token_t *token,
+                          void *ctx, bool failed);
+
+static const lxb_css_syntax_cb_qualified_rule_t *
+lxb_css_state_qualified_rule_begin(lxb_css_parser_t *parser,
+                                   const lxb_css_syntax_token_t *token,
+                                   void *ctx, void **out_rule);
+
+static bool
+lxb_css_state_qualified_rule_prelude(lxb_css_parser_t *parser,
+                                     const lxb_css_syntax_token_t *token,
+                                     void *ctx);
+
+static lxb_status_t
+lxb_css_state_qualified_rule_prelude_end(lxb_css_parser_t *parser,
+                                         const lxb_css_syntax_token_t *token,
+                                         void *ctx, bool failed);
+
+static const lxb_css_syntax_cb_block_t *
+lxb_css_state_qualified_rule_block_begin(lxb_css_parser_t *parser,
+                                         const lxb_css_syntax_token_t *token,
+                                         void *ctx, void **out_rule);
+
+static bool
+lxb_css_state_qualified_rule_prelude_failed(lxb_css_parser_t *parser,
+                                            const lxb_css_syntax_token_t *token,
+                                            void *ctx);
+static lxb_status_t
+lxb_css_state_qualified_rule_end(lxb_css_parser_t *parser,
+                                 const lxb_css_syntax_token_t *token,
+                                 void *ctx, bool failed);
+static bool
+lxb_css_state_block_next(lxb_css_parser_t *parser,
+                         const lxb_css_syntax_token_t *token, void *ctx);
+
+static lxb_status_t
+lxb_css_state_block_end(lxb_css_parser_t *parser,
+                        const lxb_css_syntax_token_t *token,
+                        void *ctx, bool failed);
+
+static const lxb_css_syntax_cb_declarations_t *
+lxb_css_state_declarations_begin(lxb_css_parser_t *parser,
+                                 const lxb_css_syntax_token_t *token,
+                                 void *ctx, void **out_rule);
+
+static lxb_css_parser_state_f
+lxb_css_state_declaration_name(lxb_css_parser_t *parser,
+                               const lxb_css_syntax_token_t *token,
+                               void *ctx, void **out_rule);
+
+static lxb_status_t
+lxb_css_state_declaration_end(lxb_css_parser_t *parser,
+                              void *declarations, void *ctx,
+                              const lxb_css_syntax_token_t *token,
+                              lxb_css_syntax_declaration_offset_t *offset,
+                              bool important, bool failed);
+
+static lxb_status_t
+lxb_css_state_declarations_end(lxb_css_parser_t *parser,
+                               const lxb_css_syntax_token_t *token,
+                               void *ctx, bool failed);
+
+static bool
+lxb_css_state_declarations_bad(lxb_css_parser_t *parser,
+                               const lxb_css_syntax_token_t *token, void *ctx);
+
+
+static const lxb_css_syntax_cb_list_rules_t lxb_css_state_list_rules = {
+    .at_rule = lxb_css_state_at_rule_begin,
+    .qualified_rule = lxb_css_state_qualified_rule_begin,
+    .next = lxb_css_state_list_rules_next,
+    .cb.failed = lxb_css_state_failed,
+    .cb.end = lxb_css_state_list_rules_end
+};
+
+static const lxb_css_syntax_cb_at_rule_t lxb_css_state_at_rule = {
+    .prelude = lxb_css_state_at_rule_prelude,
+    .prelude_end = lxb_css_state_at_rule_prelude_end,
+    .block = lxb_css_state_at_rule_block_begin,
+    .cb.failed = lxb_css_state_at_rule_prelude_failed,
+    .cb.end = lxb_css_state_at_rule_end
+};
+
+static const lxb_css_syntax_cb_qualified_rule_t lxb_css_state_qualified_rule = {
+    .prelude = lxb_css_state_qualified_rule_prelude,
+    .prelude_end = lxb_css_state_qualified_rule_prelude_end,
+    .block = lxb_css_state_qualified_rule_block_begin,
+    .cb.failed = lxb_css_state_qualified_rule_prelude_failed,
+    .cb.end = lxb_css_state_qualified_rule_end
+};
+
+static const lxb_css_syntax_cb_block_t lxb_css_state_block = {
+    .at_rule = lxb_css_state_at_rule_begin,
+    .declarations = lxb_css_state_declarations_begin,
+    .qualified_rule = lxb_css_state_qualified_rule_begin,
+    .next = lxb_css_state_block_next,
+    .cb.failed = lxb_css_state_failed,
+    .cb.end = lxb_css_state_block_end,
+};
+
+static const lxb_css_syntax_cb_declarations_t lxb_css_state_declaration = {
+    .name = lxb_css_state_declaration_name,
+    .end = lxb_css_state_declaration_end,
+    .cb.failed = lxb_css_state_declarations_bad,
+    .cb.end = lxb_css_state_declarations_end
+};
+
+
 bool
 lxb_css_state_success(lxb_css_parser_t *parser,
                       const lxb_css_syntax_token_t *token, void *ctx)
@@ -49,3 +186,491 @@ lxb_css_state_stop(lxb_css_parser_t *parser,
 {
     return lxb_css_parser_stop(parser);
 }
+
+bool
+lxb_css_state_blank(lxb_css_parser_t *parser,
+                    const lxb_css_syntax_token_t *token, void *ctx)
+{
+    return lxb_css_parser_success(parser);
+}
+
+const lxb_css_syntax_cb_list_rules_t *
+lxb_css_state_cb_list_rules(void)
+{
+    return &lxb_css_state_list_rules;
+}
+
+const lxb_css_syntax_cb_at_rule_t *
+lxb_css_state_cb_at_rule(void)
+{
+    return &lxb_css_state_at_rule;
+}
+
+const lxb_css_syntax_cb_qualified_rule_t *
+lxb_css_state_cb_qualified_rule(void)
+{
+    return &lxb_css_state_qualified_rule;
+}
+
+const lxb_css_syntax_cb_block_t *
+lxb_css_state_cb_block(void)
+{
+    return &lxb_css_state_block;
+}
+
+const lxb_css_syntax_cb_declarations_t *
+lxb_css_state_cb_declarations(void)
+{
+    return &lxb_css_state_declaration;
+}
+
+static bool
+lxb_css_state_list_rules_next(lxb_css_parser_t *parser,
+                              const lxb_css_syntax_token_t *token, void *ctx)
+{
+    void *returned = lxb_css_syntax_returned(parser);
+    lxb_css_rule_list_t *list = ctx;
+
+    if (returned != NULL) {
+        lxb_css_rule_list_append(list, returned);
+    }
+
+    return lxb_css_parser_success(parser);
+}
+
+static lxb_status_t
+lxb_css_state_list_rules_end(lxb_css_parser_t *parser,
+                             const lxb_css_syntax_token_t *token,
+                             void *ctx, bool failed)
+{
+    lxb_css_rule_list_t *list = ctx;
+
+    lxb_css_syntax_set_return(parser, list);
+
+    return LXB_STATUS_OK;
+}
+
+static const lxb_css_syntax_cb_at_rule_t *
+lxb_css_state_at_rule_begin(lxb_css_parser_t *parser,
+                            const lxb_css_syntax_token_t *token, void *ctx,
+                            void **out_rule)
+{
+    lxb_css_rule_at_t *at;
+    const lxb_css_entry_at_rule_data_t *entry;
+
+    at = lxb_css_at_rule_create(parser, lxb_css_syntax_token_ident(token)->data,
+                                lxb_css_syntax_token_ident(token)->length,
+                                &entry);
+    if (at == NULL) {
+        return lxb_css_parser_memory_fail_null(parser);
+    }
+
+    *out_rule = at;
+
+    return entry->cbs;
+}
+
+static bool
+lxb_css_state_at_rule_prelude(lxb_css_parser_t *parser,
+                              const lxb_css_syntax_token_t *token, void *ctx)
+{
+    lxb_css_rule_at_t *at = ctx;
+
+    at->prelude_begin = token->offset;
+
+    while (token != NULL && token->type != LXB_CSS_SYNTAX_TOKEN__END) {
+        lxb_css_syntax_parser_consume(parser);
+        token = lxb_css_syntax_parser_token(parser);
+    }
+
+    return lxb_css_parser_success(parser);
+}
+
+static lxb_status_t
+lxb_css_state_at_rule_prelude_end(lxb_css_parser_t *parser,
+                                  const lxb_css_syntax_token_t *token,
+                                  void *ctx, bool failed)
+{
+    lxb_status_t status;
+    lxb_css_rule_at_t *at = ctx;
+    lxb_css_at_rule__custom_t *custom;
+
+    at->prelude_end = token->offset;
+
+    custom = at->u.custom;
+
+    status = lxb_css_make_data(parser, &custom->prelude, at->prelude_begin,
+                               at->prelude_end);
+    if (status != LXB_STATUS_OK) {
+        return lxb_css_parser_memory_fail_status(parser);
+    }
+
+    return LXB_STATUS_OK;
+}
+
+const lxb_css_syntax_cb_block_t *
+lxb_css_state_at_rule_block_begin(lxb_css_parser_t *parser,
+                                  const lxb_css_syntax_token_t *token,
+                                  void *ctx, void **out_rule)
+{
+    lxb_css_rule_list_t *list;
+
+    list = lxb_css_rule_list_create(parser->memory);
+    if (list == NULL) {
+        return lxb_css_parser_memory_fail_null(parser);
+    }
+
+    *out_rule = list;
+
+    return &lxb_css_state_block;
+}
+
+static bool
+lxb_css_state_at_rule_prelude_failed(lxb_css_parser_t *parser,
+                                     const lxb_css_syntax_token_t *token,
+                                     void *ctx)
+{
+    while (token != NULL && token->type != LXB_CSS_SYNTAX_TOKEN__END) {
+        lxb_css_syntax_parser_consume(parser);
+        token = lxb_css_syntax_parser_token(parser);
+    }
+
+    return lxb_css_parser_success(parser);
+}
+
+static lxb_status_t
+lxb_css_state_at_rule_end(lxb_css_parser_t *parser,
+                          const lxb_css_syntax_token_t *token,
+                          void *ctx, bool failed)
+{
+    lxb_css_rule_at_t *at = ctx;
+    lxb_css_rule_list_t *block = lxb_css_syntax_returned(parser);
+
+    at->u.custom->block = block;
+
+    lxb_css_syntax_set_return(parser, at);
+
+    return LXB_STATUS_OK;
+}
+
+static const lxb_css_syntax_cb_qualified_rule_t *
+lxb_css_state_qualified_rule_begin(lxb_css_parser_t *parser,
+                                   const lxb_css_syntax_token_t *token,
+                                   void *ctx, void **out_rule)
+{
+    lxb_css_rule_style_t *style;
+
+    style = lxb_css_rule_style_create(parser->memory);
+    if (style == NULL) {
+        return lxb_css_parser_memory_fail_null(parser);
+    }
+
+    *out_rule = style;
+
+    return &lxb_css_state_qualified_rule;
+}
+
+static bool
+lxb_css_state_qualified_rule_prelude(lxb_css_parser_t *parser,
+                                     const lxb_css_syntax_token_t *token,
+                                     void *ctx)
+{
+    lxb_css_rule_style_t *style = ctx;
+
+    lxb_css_selectors_clean(parser->selectors);
+    lxb_css_parser_state_set(parser, lxb_css_selectors_state_complex_list);
+
+    style->prelude_begin = token->offset;
+
+    return false;
+}
+
+static lxb_status_t
+lxb_css_state_qualified_rule_prelude_end(lxb_css_parser_t *parser,
+                                         const lxb_css_syntax_token_t *token,
+                                         void *ctx, bool failed)
+{
+    size_t begin;
+    lxb_status_t status;
+    lxb_css_rule_style_t *style = ctx;
+    lxb_css_rule_bad_style_t *bad;
+
+    if (!failed) {
+        style->selector = parser->selectors->list;
+        style->prelude_end = token->offset;
+
+        return LXB_STATUS_OK;
+    }
+
+    begin = style->prelude_begin;
+
+    (void) lxb_css_rule_style_destroy(style, true);
+
+    bad = lxb_css_rule_bad_style_create(parser->memory);
+    if (bad == NULL) {
+        return lxb_css_parser_memory_fail_status(parser);
+    }
+
+    bad->prelude_begin = begin;
+    bad->prelude_end = token->offset;
+
+    status = lxb_css_make_data(parser, &bad->selectors, bad->prelude_begin,
+                               bad->prelude_end);
+    if (status != LXB_STATUS_OK) {
+        return lxb_css_parser_memory_fail_status(parser);
+    }
+
+    lxb_css_parser_set_context(parser, bad);
+
+    return LXB_STATUS_OK;
+}
+
+static const lxb_css_syntax_cb_block_t *
+lxb_css_state_qualified_rule_block_begin(lxb_css_parser_t *parser,
+                                         const lxb_css_syntax_token_t *token,
+                                         void *ctx, void **out_rule)
+{
+    lxb_css_rule_list_t *list;
+
+    list = lxb_css_rule_list_create(parser->memory);
+    if (list == NULL) {
+        return lxb_css_parser_memory_fail_null(parser);
+    }
+
+    *out_rule = list;
+
+    return &lxb_css_state_block;
+}
+
+static bool
+lxb_css_state_qualified_rule_prelude_failed(lxb_css_parser_t *parser,
+                                            const lxb_css_syntax_token_t *token,
+                                            void *ctx)
+{
+    while (token != NULL && token->type != LXB_CSS_SYNTAX_TOKEN__END) {
+        lxb_css_syntax_parser_consume(parser);
+        token = lxb_css_syntax_parser_token(parser);
+    }
+
+    return lxb_css_parser_success(parser);
+}
+
+static lxb_status_t
+lxb_css_state_qualified_rule_end(lxb_css_parser_t *parser,
+                                 const lxb_css_syntax_token_t *token,
+                                 void *ctx, bool failed)
+{
+    lxb_css_rule_t *declrs;
+    lxb_css_rule_list_t *list;
+    lxb_css_rule_style_t *style;
+    lxb_css_rule_bad_style_t *bad;
+
+    list = lxb_css_syntax_returned(parser);
+
+    if (!failed) {
+        style = ctx;
+
+        if (list != NULL && list->first != NULL
+            && list->first->type == LXB_CSS_RULE_DECLARATION_LIST)
+        {
+            declrs = list->first;
+            style->declarations = lxb_css_rule_declaration_list(declrs);
+
+            declrs->parent = lxb_css_rule(style);
+
+            if (list->first == list->last) {
+                list->last = NULL;
+            }
+
+            if (declrs->next != NULL) {
+                declrs->next->prev = NULL;
+            }
+
+            list->first = declrs->next;
+            declrs->next = NULL;
+        }
+
+        style->child = list;
+
+        lxb_css_syntax_set_return(parser, style);
+    }
+    else {
+        bad = ctx;
+
+        if (list != NULL && list->first != NULL
+            && list->first->type == LXB_CSS_RULE_DECLARATION_LIST)
+        {
+            declrs = list->first;
+            bad->declarations = lxb_css_rule_declaration_list(declrs);
+
+            declrs->parent = lxb_css_rule(bad);
+
+            if (list->first == list->last) {
+                list->last = NULL;
+            }
+
+            if (declrs->next != NULL) {
+                declrs->next->prev = NULL;
+            }
+
+            list->first = declrs->next;
+            declrs->next = NULL;
+        }
+
+        bad->child = list;
+
+        lxb_css_syntax_set_return(parser, bad);
+    }
+
+    return LXB_STATUS_OK;
+}
+
+static bool
+lxb_css_state_block_next(lxb_css_parser_t *parser,
+                         const lxb_css_syntax_token_t *token, void *ctx)
+{
+    /* rule can be either a declaration list or an at rule.  */
+
+    lxb_css_rule_t *rule = lxb_css_syntax_returned(parser);
+    lxb_css_rule_list_t *list = ctx;
+
+    lxb_css_rule_list_append(list, rule);
+
+    return lxb_css_parser_success(parser);
+}
+
+static lxb_status_t
+lxb_css_state_block_end(lxb_css_parser_t *parser,
+                        const lxb_css_syntax_token_t *token,
+                        void *ctx, bool failed)
+{
+    lxb_css_rule_list_t *list = ctx;
+
+    lxb_css_syntax_set_return(parser, list);
+
+    return LXB_STATUS_OK;
+}
+
+static const lxb_css_syntax_cb_declarations_t *
+lxb_css_state_declarations_begin(lxb_css_parser_t *parser,
+                                 const lxb_css_syntax_token_t *token,
+                                 void *ctx, void **out_rule)
+{
+    lxb_css_rule_declaration_list_t *list;
+
+    list = lxb_css_rule_declaration_list_create(parser->memory);
+    if (list == NULL) {
+        return lxb_css_parser_memory_fail_null(parser);
+    }
+
+    *out_rule = list;
+
+    return &lxb_css_state_declaration;
+}
+
+static lxb_css_parser_state_f
+lxb_css_state_declaration_name(lxb_css_parser_t *parser,
+                               const lxb_css_syntax_token_t *token,
+                               void *ctx, void **out_rule)
+{
+    const lxb_css_entry_data_t *entry;
+    lxb_css_rule_declaration_t *declar;
+
+    declar = lxb_css_declaration_create(parser,
+                                        lxb_css_syntax_token_ident(token)->data,
+                                        lxb_css_syntax_token_ident(token)->length,
+                                        &entry);
+    if (declar == NULL) {
+        (void) lxb_css_parser_memory_fail_null(parser);
+        return NULL;
+    }
+
+    /* We present an original position. */
+
+    declar->offset.name_begin = token->offset;
+    declar->offset.name_end = token->offset
+                                + lxb_css_syntax_token_base(token)->length;
+    *out_rule = declar;
+
+    return entry->state;
+}
+
+static lxb_status_t
+lxb_css_state_declaration_end(lxb_css_parser_t *parser,
+                              void *declarations, void *ctx,
+                              const lxb_css_syntax_token_t *token,
+                              lxb_css_syntax_declaration_offset_t *offset,
+                              bool important, bool failed)
+{
+    lxb_status_t status;
+    lxb_css_property__undef_t *undef;
+    lxb_css_rule_declaration_t *declar = ctx;
+    lxb_css_rule_declaration_list_t *list = declarations;
+
+    declar->offset.value_begin = offset->value_begin;
+    declar->offset.value_end = offset->value_end;
+    declar->offset.important_begin = offset->important_begin;
+    declar->offset.important_end = offset->important_end;
+    declar->important = important;
+
+    if (failed) {
+        lxb_css_rule_declaration_destroy(declar, false);
+
+        undef = lxb_css_property__undef_create(parser->memory);
+        if (undef == NULL) {
+            return lxb_css_parser_memory_fail_status(parser);
+        }
+
+        undef->type = declar->type;
+
+        status = lxb_css_make_data(parser, &undef->value,
+                                   declar->offset.value_begin,
+                                   declar->offset.value_end);
+        if (status != LXB_STATUS_OK) {
+            return lxb_css_parser_memory_fail_status(parser);
+        }
+
+        declar->u.undef = undef;
+        declar->type = LXB_CSS_PROPERTY__UNDEF;
+    }
+
+    lxb_css_rule_declaration_list_append(list, lxb_css_rule(declar));
+
+    return LXB_STATUS_OK;
+}
+
+static lxb_status_t
+lxb_css_state_declarations_end(lxb_css_parser_t *parser,
+                               const lxb_css_syntax_token_t *token,
+                               void *ctx, bool failed)
+{
+    lxb_css_rule_declaration_list_t *list = ctx;
+
+    lxb_css_syntax_set_return(parser, list);
+
+    return LXB_STATUS_OK;
+}
+
+static bool
+lxb_css_state_declarations_bad(lxb_css_parser_t *parser,
+                               const lxb_css_syntax_token_t *token, void *ctx)
+{
+    lxb_css_rule_declaration_t *declar;
+
+    if (ctx == NULL) {
+        declar = lxb_css_rule_declaration_create(parser->memory);
+        if (declar == NULL) {
+            return lxb_css_parser_memory_fail(parser);
+        }
+
+        lxb_css_parser_current_rule(parser)->context = declar;
+        declar->type = LXB_CSS_PROPERTY__UNDEF;
+    }
+
+    while (token != NULL && token->type != LXB_CSS_SYNTAX_TOKEN__END) {
+        lxb_css_syntax_parser_consume(parser);
+        token = lxb_css_syntax_parser_token(parser);
+    }
+
+    return lxb_css_parser_success(parser);
+}
diff --git a/ext/lexbor/lexbor/css/state.h b/ext/lexbor/lexbor/css/state.h
index 0a2abd803634..6ecd50343928 100644
--- a/ext/lexbor/lexbor/css/state.h
+++ b/ext/lexbor/lexbor/css/state.h
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2021-2022 Alexander Borisov
+ * Copyright (C) 2021-2026 Alexander Borisov
  *
  * Author: Alexander Borisov 
  */
@@ -12,6 +12,7 @@ extern "C" {
 #endif
 
 #include "lexbor/css/base.h"
+#include "lexbor/css/syntax/syntax.h"
 
 
 LXB_API bool
@@ -26,6 +27,30 @@ LXB_API bool
 lxb_css_state_stop(lxb_css_parser_t *parser,
                    const lxb_css_syntax_token_t *token, void *ctx);
 
+LXB_API bool
+lxb_css_state_blank(lxb_css_parser_t *parser,
+                    const lxb_css_syntax_token_t *token, void *ctx);
+
+LXB_API const lxb_css_syntax_cb_list_rules_t *
+lxb_css_state_cb_list_rules(void);
+
+LXB_API const lxb_css_syntax_cb_at_rule_t *
+lxb_css_state_cb_at_rule(void);
+
+LXB_API const lxb_css_syntax_cb_qualified_rule_t *
+lxb_css_state_cb_qualified_rule(void);
+
+LXB_API const lxb_css_syntax_cb_block_t *
+lxb_css_state_cb_block(void);
+
+LXB_API const lxb_css_syntax_cb_declarations_t *
+lxb_css_state_cb_declarations(void);
+
+const lxb_css_syntax_cb_block_t *
+lxb_css_state_at_rule_block_begin(lxb_css_parser_t *parser,
+                                  const lxb_css_syntax_token_t *token,
+                                  void *ctx, void **out_rule);
+
 
 #ifdef __cplusplus
 } /* extern "C" */
diff --git a/ext/lexbor/lexbor/css/stylesheet.c b/ext/lexbor/lexbor/css/stylesheet.c
new file mode 100644
index 000000000000..f03f145721c4
--- /dev/null
+++ b/ext/lexbor/lexbor/css/stylesheet.c
@@ -0,0 +1,110 @@
+/*
+ * Copyright (C) 2021-2026 Alexander Borisov
+ *
+ * Author: Alexander Borisov 
+ */
+
+#include "lexbor/css/css.h"
+#include "lexbor/css/stylesheet.h"
+#include "lexbor/css/parser.h"
+#include "lexbor/css/at_rule.h"
+#include "lexbor/css/property.h"
+#include "lexbor/css/rule.h"
+#include "lexbor/css/state.h"
+#include "lexbor/css/selectors/selectors.h"
+#include "lexbor/css/selectors/state.h"
+
+
+lxb_css_stylesheet_t *
+lxb_css_stylesheet_create(lxb_css_memory_t *memory)
+{
+    lxb_status_t status;
+    lxb_css_stylesheet_t *stylesheet;
+
+    if (memory == NULL) {
+        memory = lxb_css_memory_create();
+        status = lxb_css_memory_init(memory, 1024);
+
+        if (status != LXB_STATUS_OK) {
+            (void) lxb_css_memory_destroy(memory, true);
+            return NULL;
+        }
+    }
+    else {
+        (void) lxb_css_memory_ref_inc(memory);
+    }
+
+    stylesheet = lexbor_mraw_calloc(memory->mraw, sizeof(lxb_css_stylesheet_t));
+    if (stylesheet == NULL) {
+        return NULL;
+    }
+
+    stylesheet->memory = memory;
+
+    return stylesheet;
+}
+
+lxb_css_stylesheet_t *
+lxb_css_stylesheet_destroy(lxb_css_stylesheet_t *sst, bool destroy_memory)
+{
+    if (sst == NULL) {
+        return NULL;
+    }
+
+    if (destroy_memory) {
+        (void) lxb_css_memory_ref_dec_destroy(sst->memory);
+        return NULL;
+    }
+
+    if (sst->root != NULL) {
+        (void) lxb_css_rule_destroy(sst->root, true);
+    }
+
+    (void) lexbor_mraw_free(sst->memory->mraw, sst);
+
+    return NULL;
+}
+
+lxb_status_t
+lxb_css_stylesheet_parse(lxb_css_stylesheet_t *sst, lxb_css_parser_t *parser,
+                         const lxb_char_t *data, size_t length)
+{
+    lxb_status_t status;
+    lxb_css_rule_list_t *list;
+    lxb_css_selectors_t selectors;
+
+    if (sst == NULL || parser == NULL) {
+        return LXB_STATUS_ERROR_WRONG_ARGS;
+    }
+
+    if (parser->selectors == NULL) {
+        status = lxb_css_selectors_init(&selectors);
+        if (status != LXB_STATUS_OK) {
+            return status;
+        }
+
+        parser->selectors = &selectors;
+    }
+    else {
+        lxb_css_selectors_clean(parser->selectors);
+    }
+
+    parser->memory = sst->memory;
+
+    list = lxb_css_syntax_parse_list_rules(parser,
+                                           lxb_css_state_cb_list_rules(),
+                                           data, length);
+
+    if (parser->selectors == &selectors) {
+        parser->selectors = lxb_css_selectors_destroy(&selectors, false);
+    }
+
+    if (list == NULL) {
+        sst->root = NULL;
+        return parser->status;
+    }
+
+    sst->root = &list->rule;
+
+    return LXB_STATUS_OK;
+}
diff --git a/ext/lexbor/lexbor/css/stylesheet.h b/ext/lexbor/lexbor/css/stylesheet.h
index 5f3e37d82e45..9d52f9897cc5 100644
--- a/ext/lexbor/lexbor/css/stylesheet.h
+++ b/ext/lexbor/lexbor/css/stylesheet.h
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2020-2023 Alexander Borisov
+ * Copyright (C) 2020-2026 Alexander Borisov
  *
  * Author: Alexander Borisov 
  */
@@ -25,26 +25,62 @@ struct lxb_css_stylesheet {
     void                     *element; /* lxb_html_style_element_t * */
 };
 
+/*
+ * Create a new CSS stylesheet object.
+ *
+ * This function creates a stylesheet object which holds the parsed CSS rules.
+ *
+ * @param[in] memory  Optional. A memory pool to use for allocations.
+ *                    If NULL, a new internal memory pool is created/managed
+ *                    by the stylesheet.
+ *
+ * @return A new lxb_css_stylesheet_t * or NULL on failure.
+ */
 LXB_API lxb_css_stylesheet_t *
 lxb_css_stylesheet_create(lxb_css_memory_t *memory);
 
+/*
+ * Destroy a CSS stylesheet object.
+ *
+ * @param[in] sst             Optional. The stylesheet object to destroy.
+ *                            If NULL, the function returns NULL.
+ * @param[in] destroy_memory  If true, the memory pool attached to
+ *                            the stylesheet is also destroyed.
+ *
+ * @return Always NULL.
+ */
 LXB_API lxb_css_stylesheet_t *
 lxb_css_stylesheet_destroy(lxb_css_stylesheet_t *sst, bool destroy_memory);
 
-LXB_API lxb_css_stylesheet_t *
-lxb_css_stylesheet_parse(lxb_css_parser_t *parser,
-                         const lxb_char_t *data, size_t length);
-
+/*
+ * Parse CSS content into the stylesheet.
+ *
+ * This function takes CSS text and builds the rule tree in the stylesheet.
+ *
+ * The function returns an error only in extremely unforeseen circumstances,
+ * such as the inability to allocate memory for objects. Any broken CSS will
+ * not cause an error.
+ *
+ * Selectors note:
+ *   If the provided parser does not have an initialized selectors module, one
+ *   will be created temporarily for this call. For better performance when
+ *   parsing multiple stylesheets, initialize the selectors module in
+ *   the parser once:
+ *
+ *     lxb_css_parser_t *parser = lxb_css_parser_create();
+ *     lxb_css_parser_init(parser, NULL);
+ *     lxb_css_parser_selectors_init(parser);
+ *
+ * @param[in] sst     Required. The target stylesheet.
+ * @param[in] parser  Required. An initialized CSS parser.
+ * @param[in] data    Optional. The CSS text data.
+ * @param[in] length  Required. Length of the data in bytes.
+ *
+ * @return LXB_STATUS_OK on success, or an error code on failure.
+ */
 LXB_API lxb_status_t
-lxb_css_stylesheet_prepare(lxb_css_parser_t *parser, lxb_css_memory_t *memory,
-                           lxb_css_selectors_t *selectors);
-
-LXB_API lxb_css_stylesheet_t *
-lxb_css_stylesheet_process(lxb_css_parser_t *parser,
-                           const lxb_char_t *data, size_t length);
-
-LXB_API void
-lxb_css_stylesheet_finish(lxb_css_parser_t *parser);
+lxb_css_stylesheet_parse(lxb_css_stylesheet_t *sst, lxb_css_parser_t *parser,
+                         const lxb_char_t *data, size_t length);
 
 
 #ifdef __cplusplus
diff --git a/ext/lexbor/lexbor/css/syntax/anb.c b/ext/lexbor/lexbor/css/syntax/anb.c
index ffd1751cdabf..d3f7c7bfe0a6 100644
--- a/ext/lexbor/lexbor/css/syntax/anb.c
+++ b/ext/lexbor/lexbor/css/syntax/anb.c
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2021-2022 Alexander Borisov
+ * Copyright (C) 2021-2026 Alexander Borisov
  *
  * Author: Alexander Borisov 
  */
@@ -38,10 +38,9 @@ lxb_css_syntax_anb_state_ident_data(lxb_css_parser_t *parser,
 
 
 static const lxb_css_syntax_cb_pipe_t lxb_css_syntax_anb_pipe = {
-    .state = lxb_css_syntax_anb_state,
-    .block = NULL,
-    .failed = lxb_css_state_failed,
-    .end = lxb_css_syntax_anb_end
+    .prelude = lxb_css_syntax_anb_state,
+    .cb.failed = lxb_css_state_failed,
+    .cb.end = lxb_css_syntax_anb_end
 };
 
 
@@ -66,8 +65,8 @@ lxb_css_syntax_anb_parse(lxb_css_parser_t *parser,
 
     lxb_css_parser_buffer_set(parser, data, length);
 
-    rule = lxb_css_syntax_parser_pipe_push(parser, NULL,
-                                           &lxb_css_syntax_anb_pipe, &anb,
+    rule = lxb_css_syntax_parser_pipe_push(parser, &lxb_css_syntax_anb_pipe,
+                                           NULL, &anb,
                                            LXB_CSS_SYNTAX_TOKEN_UNDEF);
     if (rule == NULL) {
         return anb;
diff --git a/ext/lexbor/lexbor/css/syntax/base.h b/ext/lexbor/lexbor/css/syntax/base.h
index 3dc981ba3da2..627fce4c7fa5 100644
--- a/ext/lexbor/lexbor/css/syntax/base.h
+++ b/ext/lexbor/lexbor/css/syntax/base.h
@@ -17,7 +17,7 @@ extern "C" {
 
 
 #define LXB_CSS_SYNTAX_VERSION_MAJOR 1
-#define LXB_CSS_SYNTAX_VERSION_MINOR 3
+#define LXB_CSS_SYNTAX_VERSION_MINOR 4
 #define LXB_CSS_SYNTAX_VERSION_PATCH 0
 
 #define LXB_CSS_SYNTAX_VERSION_STRING                                          \
diff --git a/ext/lexbor/lexbor/css/syntax/parser.c b/ext/lexbor/lexbor/css/syntax/parser.c
index 5a3c7abf24f8..7e7e973f75d6 100644
--- a/ext/lexbor/lexbor/css/syntax/parser.c
+++ b/ext/lexbor/lexbor/css/syntax/parser.c
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2020-2025 Alexander Borisov
+ * Copyright (C) 2020-2026 Alexander Borisov
  *
  * Author: Alexander Borisov 
  */
@@ -11,14 +11,11 @@
 #include "lexbor/css/at_rule/state.h"
 
 
-static const lxb_css_syntax_token_t lxb_css_syntax_token_terminated =
-{
-    .types.terminated = {.begin = NULL, .length = 0, .user_id = 0},
-    .type = LXB_CSS_SYNTAX_TOKEN__END,
-    .offset = 0,
-    .cloned = false
-};
+static const lexbor_str_t lxb_css_err_rc = lexbor_str("Unexpected token in "
+                                                      "qualified rule: RC_BRACKET");
 
+static lxb_css_syntax_rule_t *
+lxb_css_syntax_parser_stack_pop(lxb_css_parser_t *parser);
 
 static const lxb_css_syntax_token_t *
 lxb_css_syntax_parser_list_rules(lxb_css_parser_t *parser,
@@ -35,28 +32,105 @@ lxb_css_syntax_parser_list_rules_qualified(lxb_css_parser_t *parser,
                                            const lxb_css_syntax_token_t *token,
                                            lxb_css_syntax_rule_t *rule);
 
-static bool
+static const lxb_css_syntax_token_t *
 lxb_css_syntax_parser_list_rules_back(lxb_css_parser_t *parser,
-                                      const lxb_css_syntax_token_t *token, void *ctx);
+                                      const lxb_css_syntax_token_t *token,
+                                      lxb_css_syntax_rule_t *rule);
+
+static const lxb_css_syntax_token_t *
+lxb_css_syntax_parser_at_begin(lxb_css_parser_t *parser,
+                               const lxb_css_syntax_token_t *token,
+                               lxb_css_syntax_rule_t *rule,
+                               lxb_css_parser_state_f back_state,
+                               lxb_css_syntax_begin_at_rule_f cb,
+                               bool nested);
 
 static const lxb_css_syntax_token_t *
 lxb_css_syntax_parser_at_rule(lxb_css_parser_t *parser,
                               const lxb_css_syntax_token_t *token,
                               lxb_css_syntax_rule_t *rule);
 
+static const lxb_css_syntax_token_t *
+lxb_css_syntax_parser_at_block(lxb_css_parser_t *parser,
+                               const lxb_css_syntax_token_t *token,
+                               lxb_css_syntax_rule_t *rule);
+
+static const lxb_css_syntax_token_t *
+lxb_css_syntax_parser_at_prelude_end(lxb_css_parser_t *parser,
+                                     const lxb_css_syntax_token_t *token,
+                                     lxb_css_syntax_rule_t *rule);
+
+static const lxb_css_syntax_token_t *
+lxb_css_syntax_parser_at_prelude_end_consule_token(lxb_css_parser_t *parser,
+                                                   const lxb_css_syntax_token_t *token,
+                                                   lxb_css_syntax_rule_t *rule);
+
+static const lxb_css_syntax_token_t *
+lxb_css_syntax_parser_at_back_to_prelude(lxb_css_parser_t *parser,
+                                         const lxb_css_syntax_token_t *token,
+                                         lxb_css_syntax_rule_t *rule);
+
 static const lxb_css_syntax_token_t *
 lxb_css_syntax_parser_qualified_rule(lxb_css_parser_t *parser,
                                      const lxb_css_syntax_token_t *token,
                                      lxb_css_syntax_rule_t *rule);
 
 static const lxb_css_syntax_token_t *
-lxb_css_syntax_parser_declarations(lxb_css_parser_t *parser,
-                                   const lxb_css_syntax_token_t *token,
-                                   lxb_css_syntax_rule_t *rule);
+lxb_css_syntax_parser_qualified_rule_block(lxb_css_parser_t *parser,
+                                           const lxb_css_syntax_token_t *token,
+                                           lxb_css_syntax_rule_t *rule);
+
+static const lxb_css_syntax_token_t *
+lxb_css_syntax_parser_qualified_prelude_end(lxb_css_parser_t *parser,
+                                            const lxb_css_syntax_token_t *token,
+                                            lxb_css_syntax_rule_t *rule);
+
+static const lxb_css_syntax_token_t *
+lxb_css_syntax_parser_qualified_back_to_prelude(lxb_css_parser_t *parser,
+                                                const lxb_css_syntax_token_t *token,
+                                                lxb_css_syntax_rule_t *rule);
+
+static const lxb_css_syntax_token_t *
+lxb_css_syntax_parser_block_begin(lxb_css_parser_t *parser,
+                                  const lxb_css_syntax_token_t *token,
+                                  lxb_css_syntax_rule_t *rule,
+                                  lxb_css_parser_state_f back_state,
+                                  lxb_css_syntax_begin_block_f cb);
+
+static const lxb_css_syntax_token_t *
+lxb_css_syntax_parser_block(lxb_css_parser_t *parser,
+                            const lxb_css_syntax_token_t *token,
+                            lxb_css_syntax_rule_t *rule);
+
+static const lxb_css_syntax_token_t *
+lxb_css_syntax_parser_block_at(lxb_css_parser_t *parser,
+                               const lxb_css_syntax_token_t *token,
+                               lxb_css_syntax_rule_t *rule);
+
+static const lxb_css_syntax_token_t *
+lxb_css_syntax_parser_block_declarations(lxb_css_parser_t *parser,
+                                         const lxb_css_syntax_token_t *token,
+                                         lxb_css_syntax_rule_t *rule);
+
+static const lxb_css_syntax_token_t *
+lxb_css_syntax_parser_block_qualified(lxb_css_parser_t *parser,
+                                      const lxb_css_syntax_token_t *token,
+                                      lxb_css_syntax_rule_t *rule);
+
+static const lxb_css_syntax_token_t *
+lxb_css_syntax_parser_block_back(lxb_css_parser_t *parser,
+                                 const lxb_css_syntax_token_t *token,
+                                 lxb_css_syntax_rule_t *rule);
+
+static const lxb_css_syntax_token_t *
+lxb_css_syntax_parser_declarations_validate(lxb_css_parser_t *parser,
+                                            const lxb_css_syntax_token_t *token,
+                                            lxb_css_syntax_rule_t *rule);
 
-static bool
-lxb_css_syntax_parser_declarations_back(lxb_css_parser_t *parser,
-                                        const lxb_css_syntax_token_t *token, void *ctx);
+static const lxb_css_syntax_token_t *
+lxb_css_syntax_parser_declarations_begin(lxb_css_parser_t *parser,
+                                         const lxb_css_syntax_token_t *token,
+                                         lxb_css_syntax_rule_t *rule);
 
 static const lxb_css_syntax_token_t *
 lxb_css_syntax_parser_declarations_name(lxb_css_parser_t *parser,
@@ -69,40 +143,77 @@ lxb_css_syntax_parser_declarations_value(lxb_css_parser_t *parser,
                                          lxb_css_syntax_rule_t *rule);
 
 static const lxb_css_syntax_token_t *
-lxb_css_syntax_parser_declarations_next(lxb_css_parser_t *parser,
+lxb_css_syntax_parser_declarations_drop(lxb_css_parser_t *parser,
                                         const lxb_css_syntax_token_t *token,
                                         lxb_css_syntax_rule_t *rule);
 
 static const lxb_css_syntax_token_t *
-lxb_css_syntax_parser_declarations_drop(lxb_css_parser_t *parser,
+lxb_css_syntax_parser_declarations_next(lxb_css_parser_t *parser,
                                         const lxb_css_syntax_token_t *token,
                                         lxb_css_syntax_rule_t *rule);
 
+static const lxb_css_syntax_token_t *
+lxb_css_syntax_parser_declaration_back_to_value(lxb_css_parser_t *parser,
+                                                const lxb_css_syntax_token_t *token,
+                                                lxb_css_syntax_rule_t *rule);
+
+static const lxb_css_syntax_token_t *
+lxb_css_syntax_parser_declaration_end(lxb_css_parser_t *parser,
+                                      const lxb_css_syntax_token_t *token,
+                                      lxb_css_syntax_rule_t *rule);
+
+static const lxb_css_syntax_token_t *
+lxb_css_syntax_parser_declaration_end_handler(lxb_css_parser_t *parser,
+                                              const lxb_css_syntax_token_t *token,
+                                              lxb_css_syntax_rule_t *rule,
+                                              bool skip_token);
+
 static const lxb_css_syntax_token_t *
 lxb_css_syntax_parser_declarations_end(lxb_css_parser_t *parser,
                                        const lxb_css_syntax_token_t *token,
                                        lxb_css_syntax_rule_t *rule);
 
+static const lxb_css_syntax_token_t *
+lxb_css_syntax_parser_declarations_end_h(lxb_css_parser_t *parser,
+                                         const lxb_css_syntax_token_t *token,
+                                         lxb_css_syntax_rule_t *rule,
+                                         bool skip_token);
+
 static const lxb_css_syntax_token_t *
 lxb_css_syntax_parser_components(lxb_css_parser_t *parser,
                                  const lxb_css_syntax_token_t *token,
                                  lxb_css_syntax_rule_t *rule);
 
+static const lxb_css_syntax_token_t *
+lxb_css_syntax_parser_components_back_to_value(lxb_css_parser_t *parser,
+                                               const lxb_css_syntax_token_t *token,
+                                               lxb_css_syntax_rule_t *rule);
+
 static const lxb_css_syntax_token_t *
 lxb_css_syntax_parser_function(lxb_css_parser_t *parser,
                                const lxb_css_syntax_token_t *token,
                                lxb_css_syntax_rule_t *rule);
 
 static const lxb_css_syntax_token_t *
-lxb_css_syntax_parser_block(lxb_css_parser_t *parser,
-                            const lxb_css_syntax_token_t *token,
-                            lxb_css_syntax_rule_t *rule);
+lxb_css_syntax_parser_function_back(lxb_css_parser_t *parser,
+                                    const lxb_css_syntax_token_t *token,
+                                    lxb_css_syntax_rule_t *rule);
 
 static const lxb_css_syntax_token_t *
 lxb_css_syntax_parser_pipe(lxb_css_parser_t *parser,
                            const lxb_css_syntax_token_t *token,
                            lxb_css_syntax_rule_t *rule);
 
+static const lxb_css_syntax_token_t *
+lxb_css_syntax_parser_pipe_back(lxb_css_parser_t *parser,
+                                const lxb_css_syntax_token_t *token,
+                                lxb_css_syntax_rule_t *rule);
+
+static const lxb_css_syntax_token_t *
+lxb_css_syntax_parser_end_back(lxb_css_parser_t *parser,
+                               const lxb_css_syntax_token_t *token,
+                               lxb_css_syntax_rule_t *rule);
+
 
 lxb_inline const lxb_css_syntax_token_t *
 lxb_css_syntax_parser_failed(lxb_css_parser_t *parser, lxb_status_t status)
@@ -111,6 +222,31 @@ lxb_css_syntax_parser_failed(lxb_css_parser_t *parser, lxb_status_t status)
     return NULL;
 }
 
+lxb_inline const lxb_css_syntax_token_t *
+lxb_css_syntax_token_parser_do_phase_again(lxb_css_parser_t *parser)
+{
+    parser->fake_null = true;
+    return NULL;
+}
+
+lxb_inline const lxb_css_syntax_token_t *
+lxb_css_syntax_parser_call_back(lxb_css_parser_t *parser,
+                                const lxb_css_syntax_token_t *token)
+{
+    lxb_css_syntax_rule_t *rules;
+
+    (void) lxb_css_syntax_parser_stack_pop(parser);
+
+    rules = parser->rules;
+
+    if (parser->rules <= parser->rules_begin) {
+        rules->state = lxb_css_state_stop;
+        return token;
+    }
+
+    return rules->back(parser, token, rules);
+}
+
 
 lxb_status_t
 lxb_css_syntax_parser_run(lxb_css_parser_t *parser)
@@ -177,369 +313,259 @@ lxb_css_syntax_parser_consume(lxb_css_parser_t *parser)
 
 lxb_css_syntax_rule_t *
 lxb_css_syntax_parser_list_rules_push(lxb_css_parser_t *parser,
-                                      const lxb_css_syntax_token_t *token,
-                                      lxb_css_parser_state_f state_back,
                                       const lxb_css_syntax_cb_list_rules_t *cb_rules,
-                                      void *ctx, bool top_level,
-                                      lxb_css_syntax_token_type_t stop)
+                                      lxb_css_parser_state_f back,
+                                      void *ctx, lxb_css_syntax_token_type_t stop)
 {
-    lxb_status_t status;
     lxb_css_syntax_rule_t *rule;
 
-    lxb_css_parser_offset_set(parser, token);
-
-    status = lxb_css_syntax_stack_expand(parser, 1);
-    if (status != LXB_STATUS_OK) {
-        parser->status = status;
-        return NULL;
+    if ((parser->rules + 1) >= parser->rules_end) {
+        parser->status = lxb_css_syntax_stack_expand(parser, 1);
+        if (parser->status != LXB_STATUS_OK) {
+            return NULL;
+        }
     }
-
-    parser->rules->state = lxb_css_state_success;
+ 
+    parser->rules->back_state = back;
 
     rule = ++parser->rules;
 
-    memset(rule, 0x00, sizeof(lxb_css_syntax_rule_t));
-
-    rule->phase = lxb_css_syntax_parser_list_rules;
-    rule->state = cb_rules->cb.state;
-    rule->state_back = state_back;
-    rule->back = lxb_css_syntax_parser_list_rules;
-    rule->cbx.list_rules = cb_rules;
-    rule->context = ctx;
-    rule->block_end = stop;
-    rule->top_level = top_level;
-
-    if (token != NULL) {
-        rule->u.list_rules.begin = token->offset;
-    }
-
-    parser->context = NULL;
+    *rule = (lxb_css_syntax_rule_t) {
+        .phase = lxb_css_syntax_parser_list_rules,
+        .state = lxb_css_state_blank,
+        .back = lxb_css_syntax_parser_list_rules_back,
+        .cbx.list_rules = cb_rules,
+        .context = ctx,
+        .block_end = stop
+    };
 
     return rule;
 }
 
 lxb_css_syntax_rule_t *
 lxb_css_syntax_parser_at_rule_push(lxb_css_parser_t *parser,
-                                   const lxb_css_syntax_token_t *token,
-                                   lxb_css_parser_state_f state_back,
                                    const lxb_css_syntax_cb_at_rule_t *at_rule,
-                                   void *ctx, lxb_css_syntax_token_type_t stop)
+                                   lxb_css_parser_state_f back, void *ctx,
+                                   lxb_css_syntax_token_type_t stop,
+                                   bool nested)
 {
-    lxb_status_t status;
-    lxb_css_syntax_at_rule_offset_t *at;
     lxb_css_syntax_rule_t *rule;
 
-    lxb_css_parser_offset_set(parser, token);
-
-    status = lxb_css_syntax_stack_expand(parser, 1);
-    if (status != LXB_STATUS_OK) {
-        parser->status = status;
-        return NULL;
+    if ((parser->rules + 1) >= parser->rules_end) {
+        parser->status = lxb_css_syntax_stack_expand(parser, 1);
+        if (parser->status != LXB_STATUS_OK) {
+            return NULL;
+        }
     }
 
-    parser->rules->state = lxb_css_state_success;
+    parser->rules->back_state = back;
 
     rule = ++parser->rules;
 
-    memset(rule, 0x00, sizeof(lxb_css_syntax_rule_t));
-
-    rule->phase = lxb_css_syntax_parser_at_rule;
-    rule->state = at_rule->state;
-    rule->state_back = state_back;
-    rule->back = lxb_css_syntax_parser_at_rule;
-    rule->cbx.at_rule = at_rule;
-    rule->context = ctx;
-    rule->block_end = stop;
-
-    if (token != NULL) {
-        at = &rule->u.at_rule;
-
-        at->name = token->offset;
-        at->prelude = token->offset + lxb_css_syntax_token_base(token)->length;
-    }
-
-    parser->context = NULL;
+    *rule = (lxb_css_syntax_rule_t) {
+        .phase = lxb_css_syntax_parser_at_rule,
+        .state = at_rule->prelude,
+        .back = lxb_css_syntax_parser_at_back_to_prelude,
+        .cbx.at_rule = at_rule,
+        .context = ctx,
+        .block_end = stop,
+        .nested = nested
+    };
 
     return rule;
 }
 
 lxb_css_syntax_rule_t *
 lxb_css_syntax_parser_qualified_push(lxb_css_parser_t *parser,
-                                     const lxb_css_syntax_token_t *token,
-                                     lxb_css_parser_state_f state_back,
                                      const lxb_css_syntax_cb_qualified_rule_t *qualified,
-                                     void *ctx, lxb_css_syntax_token_type_t stop)
+                                     lxb_css_parser_state_f back, void *ctx,
+                                     lxb_css_syntax_token_type_t stop,
+                                     bool nested)
 {
-    lxb_status_t status;
     lxb_css_syntax_rule_t *rule;
 
-    lxb_css_parser_offset_set(parser, token);
-
-    status = lxb_css_syntax_stack_expand(parser, 1);
-    if (status != LXB_STATUS_OK) {
-        parser->status = status;
-        return NULL;
+    if ((parser->rules + 1) >= parser->rules_end) {
+        parser->status = lxb_css_syntax_stack_expand(parser, 1);
+        if (parser->status != LXB_STATUS_OK) {
+            return NULL;
+        }
     }
 
-    parser->rules->state = lxb_css_state_success;
+    parser->rules->back_state = back;
 
     rule = ++parser->rules;
 
-    memset(rule, 0x00, sizeof(lxb_css_syntax_rule_t));
-
-    rule->phase = lxb_css_syntax_parser_qualified_rule;
-    rule->state = qualified->state;
-    rule->state_back = state_back;
-    rule->back = lxb_css_syntax_parser_qualified_rule;
-    rule->cbx.qualified_rule = qualified;
-    rule->context = ctx;
-    rule->block_end = stop;
-
-    if (token != NULL) {
-        rule->u.qualified.prelude = token->offset;
-    }
-
-    parser->context = NULL;
+    *rule = (lxb_css_syntax_rule_t) {
+        .phase = lxb_css_syntax_parser_qualified_rule,
+        .state = qualified->prelude,
+        .back = lxb_css_syntax_parser_qualified_back_to_prelude,
+        .cbx.qualified_rule = qualified,
+        .context = ctx,
+        .block_end = stop,
+        .nested = nested
+    };
 
     return rule;
 }
 
 lxb_css_syntax_rule_t *
-lxb_css_syntax_parser_declarations_push(lxb_css_parser_t *parser,
-                                        const lxb_css_syntax_token_t *token,
-                                        lxb_css_parser_state_f state_back,
-                                        const lxb_css_syntax_cb_declarations_t *declarations,
-                                        void *ctx, lxb_css_syntax_token_type_t stop)
+lxb_css_syntax_parser_block_push(lxb_css_parser_t *parser,
+                                 const lxb_css_syntax_cb_block_t *block,
+                                 lxb_css_parser_state_f back, void *ctx)
 {
-    lxb_status_t status;
     lxb_css_syntax_rule_t *rule;
 
-    lxb_css_parser_offset_set(parser, token);
-
-    status = lxb_css_syntax_stack_expand(parser, 1);
-    if (status != LXB_STATUS_OK) {
-        parser->status = status;
-        return NULL;
+    if ((parser->rules + 1) >= parser->rules_end) {
+        parser->status = lxb_css_syntax_stack_expand(parser, 1);
+        if (parser->status != LXB_STATUS_OK) {
+            return NULL;
+        }
     }
 
-    parser->rules->state = lxb_css_state_success;
+    parser->rules->back_state = back;
 
     rule = ++parser->rules;
 
-    memset(rule, 0x00, sizeof(lxb_css_syntax_rule_t));
-
-    rule->phase = lxb_css_syntax_parser_declarations;
-    rule->state = declarations->cb.state;
-    rule->state_back = state_back;
-    rule->back = lxb_css_syntax_parser_declarations;
-    rule->cbx.declarations = declarations;
-    rule->context = ctx;
-    rule->block_end = stop;
-
-    if (token != NULL) {
-        rule->u.declarations.begin = token->offset;
-    }
-
-    parser->context = NULL;
+    *rule = (lxb_css_syntax_rule_t) {
+        .phase = lxb_css_syntax_parser_block,
+        .state = lxb_css_state_blank,
+        .back = lxb_css_syntax_parser_block_back,
+        .cbx.block = block,
+        .context = ctx
+    };
 
     return rule;
 }
 
 lxb_css_syntax_rule_t *
-lxb_css_syntax_parser_components_push(lxb_css_parser_t *parser,
-                                      const lxb_css_syntax_token_t *token,
-                                      lxb_css_parser_state_f state_back,
-                                      const lxb_css_syntax_cb_components_t *comp,
-                                      void *ctx, lxb_css_syntax_token_type_t stop)
+lxb_css_syntax_parser_declarations_push(lxb_css_parser_t *parser,
+                                        const lxb_css_syntax_cb_declarations_t *declr,
+                                        lxb_css_parser_state_f back, void *ctx,
+                                        lxb_css_syntax_token_type_t stop,
+                                        bool name_validate, bool nested)
 {
-    lxb_status_t status;
     lxb_css_syntax_rule_t *rule;
+    lxb_css_syntax_state_f phase;
 
-    lxb_css_parser_offset_set(parser, token);
-
-    status = lxb_css_syntax_stack_expand(parser, 1);
-    if (status != LXB_STATUS_OK) {
-        parser->status = status;
-        return NULL;
+    if ((parser->rules + 1) >= parser->rules_end) {
+        parser->status = lxb_css_syntax_stack_expand(parser, 1);
+        if (parser->status != LXB_STATUS_OK) {
+            return NULL;
+        }
     }
 
-    parser->rules->state = lxb_css_state_success;
+    parser->rules->back_state = back;
 
     rule = ++parser->rules;
 
-    memset(rule, 0x00, sizeof(lxb_css_syntax_rule_t));
-
-    rule->phase = lxb_css_syntax_parser_components;
-    rule->state = comp->state;
-    rule->state_back = state_back;
-    rule->back = lxb_css_syntax_parser_components;
-    rule->cbx.components = comp;
-    rule->context = ctx;
-    rule->block_end = stop;
+    phase = (!name_validate) ? lxb_css_syntax_parser_declarations_begin
+                             : lxb_css_syntax_parser_declarations_validate;
 
-    parser->context = NULL;
+    *rule = (lxb_css_syntax_rule_t) {
+        .phase = phase,
+        .state = lxb_css_state_blank,
+        .back = lxb_css_syntax_parser_declaration_back_to_value,
+        .cbx.declarations = declr,
+        .context = ctx,
+        .block_end = stop,
+        .nested = nested
+    };
 
     return rule;
 }
 
 lxb_css_syntax_rule_t *
-lxb_css_syntax_parser_function_push(lxb_css_parser_t *parser,
-                                    const lxb_css_syntax_token_t *token,
-                                    lxb_css_parser_state_f state_back,
-                                    const lxb_css_syntax_cb_function_t *func,
-                                    void *ctx)
+lxb_css_syntax_parser_components_push(lxb_css_parser_t *parser,
+                                      const lxb_css_syntax_cb_components_t *comp,
+                                      lxb_css_parser_state_f back, void *ctx,
+                                      lxb_css_syntax_token_type_t stop)
 {
-    lxb_status_t status;
     lxb_css_syntax_rule_t *rule;
 
-    if (token == NULL || token->type != LXB_CSS_SYNTAX_TOKEN_FUNCTION) {
-        parser->status = LXB_STATUS_ERROR_WRONG_ARGS;
-        return NULL;
-    }
-
-    if (parser->rules > parser->rules_begin) {
-        rule = parser->rules;
-
-        if (rule->deep != 0
-            && parser->types_pos[-1] == LXB_CSS_SYNTAX_TOKEN_R_PARENTHESIS)
-        {
-            rule->deep--;
-            parser->types_pos--;
+    if ((parser->rules + 1) >= parser->rules_end) {
+        parser->status = lxb_css_syntax_stack_expand(parser, 1);
+        if (parser->status != LXB_STATUS_OK) {
+            return NULL;
         }
     }
 
-    parser->rules->state = lxb_css_state_success;
-
-    lxb_css_parser_offset_set(parser, token);
-
-    status = lxb_css_syntax_stack_expand(parser, 1);
-    if (status != LXB_STATUS_OK) {
-        parser->status = status;
-        return NULL;
-    }
+    parser->rules->back_state = back;
 
     rule = ++parser->rules;
 
-    memset(rule, 0x00, sizeof(lxb_css_syntax_rule_t));
-
-    rule->phase = lxb_css_syntax_parser_function;
-    rule->state = func->state;
-    rule->state_back = state_back;
-    rule->back = lxb_css_syntax_parser_function;
-    rule->cbx.func = func;
-    rule->context = ctx;
-
-    parser->context = NULL;
+    *rule = (lxb_css_syntax_rule_t) {
+        .phase = lxb_css_syntax_parser_components,
+        .state = comp->prelude,
+        .back = lxb_css_syntax_parser_components_back_to_value,
+        .cbx.components = comp,
+        .context = ctx,
+        .block_end = stop
+    };
 
     return rule;
 }
 
 lxb_css_syntax_rule_t *
-lxb_css_syntax_parser_block_push(lxb_css_parser_t *parser,
-                                 const lxb_css_syntax_token_t *token,
-                                 lxb_css_parser_state_f state_back,
-                                 const lxb_css_syntax_cb_block_t *block,
-                                 void *ctx)
+lxb_css_syntax_parser_function_push(lxb_css_parser_t *parser,
+                                    const lxb_css_syntax_cb_function_t *func,
+                                    lxb_css_parser_state_f back, void *ctx)
 {
-    lxb_status_t status;
     lxb_css_syntax_rule_t *rule;
-    lxb_css_syntax_token_type_t block_end;
-
-    if (token == NULL) {
-        parser->status = LXB_STATUS_ERROR_WRONG_ARGS;
-        return NULL;
-    }
-
-    switch (token->type) {
-        case LXB_CSS_SYNTAX_TOKEN_LS_BRACKET:
-            block_end = LXB_CSS_SYNTAX_TOKEN_RS_BRACKET;
-            break;
-
-        case LXB_CSS_SYNTAX_TOKEN_FUNCTION:
-        case LXB_CSS_SYNTAX_TOKEN_L_PARENTHESIS:
-            block_end = LXB_CSS_SYNTAX_TOKEN_R_PARENTHESIS;
-            break;
-
-        case LXB_CSS_SYNTAX_TOKEN_LC_BRACKET:
-            block_end = LXB_CSS_SYNTAX_TOKEN_RC_BRACKET;
-            break;
 
-        default:
-            parser->status = LXB_STATUS_ERROR_WRONG_ARGS;
+    if ((parser->rules + 1) >= parser->rules_end) {
+        parser->status = lxb_css_syntax_stack_expand(parser, 1);
+        if (parser->status != LXB_STATUS_OK) {
             return NULL;
-    }
-
-    if (parser->rules > parser->rules_begin) {
-        rule = parser->rules;
-
-        if (rule->deep != 0 && parser->types_pos[-1] == block_end) {
-            rule->deep--;
-            parser->types_pos--;
         }
     }
 
-    parser->rules->state = lxb_css_state_success;
-
-    lxb_css_parser_offset_set(parser, token);
-
-    status = lxb_css_syntax_stack_expand(parser, 1);
-    if (status != LXB_STATUS_OK) {
-        parser->status = status;
-        return NULL;
-    }
+    parser->rules->back_state = back;
 
     rule = ++parser->rules;
 
-    memset(rule, 0x00, sizeof(lxb_css_syntax_rule_t));
-
-    rule->phase = lxb_css_syntax_parser_block;
-    rule->state = block->state;
-    rule->state_back = state_back;
-    rule->back = lxb_css_syntax_parser_block;
-    rule->cbx.block = block;
-    rule->context = ctx;
-    rule->block_end = block_end;
-
-    parser->context = NULL;
+    *rule = (lxb_css_syntax_rule_t) {
+        .phase = lxb_css_syntax_parser_function,
+        .state = func->value,
+        .back = lxb_css_syntax_parser_function_back,
+        .cbx.func = func,
+        .context = ctx
+    };
 
     return rule;
 }
 
 lxb_css_syntax_rule_t *
 lxb_css_syntax_parser_pipe_push(lxb_css_parser_t *parser,
-                                lxb_css_parser_state_f state_back,
                                 const lxb_css_syntax_cb_pipe_t *pipe,
-                                void *ctx, lxb_css_syntax_token_type_t stop)
+                                lxb_css_parser_state_f back, void *ctx,
+                                lxb_css_syntax_token_type_t stop)
 {
-    lxb_status_t status;
     lxb_css_syntax_rule_t *rule;
 
-    status = lxb_css_syntax_stack_expand(parser, 1);
-    if (status != LXB_STATUS_OK) {
-        parser->status = status;
-        return NULL;
+    if ((parser->rules + 1) >= parser->rules_end) {
+        parser->status = lxb_css_syntax_stack_expand(parser, 1);
+        if (parser->status != LXB_STATUS_OK) {
+            return NULL;
+        }
     }
 
-    parser->rules->state = lxb_css_state_success;
+    parser->rules->back_state = back;
 
     rule = ++parser->rules;
 
-    memset(rule, 0x00, sizeof(lxb_css_syntax_rule_t));
-
-    rule->phase = lxb_css_syntax_parser_pipe;
-    rule->state = pipe->state;
-    rule->state_back = state_back;
-    rule->back = lxb_css_syntax_parser_pipe;
-    rule->cbx.pipe = pipe;
-    rule->context = ctx;
-    rule->block_end = stop;
-
-    parser->context = NULL;
+    *rule = (lxb_css_syntax_rule_t) {
+        .phase = lxb_css_syntax_parser_pipe,
+        .state = pipe->prelude,
+        .back = lxb_css_syntax_parser_pipe_back,
+        .cbx.pipe = pipe,
+        .context = ctx,
+        .block_end = stop
+    };
 
     return rule;
 }
 
-lxb_css_syntax_rule_t *
+static lxb_css_syntax_rule_t *
 lxb_css_syntax_parser_stack_pop(lxb_css_parser_t *parser)
 {
     return parser->rules--;
@@ -554,12 +580,16 @@ lxb_css_syntax_parser_list_rules(lxb_css_parser_t *parser,
         return token;
     }
 
+    rule->skip_consume = true;
+
 begin:
 
     rule->offset = token->offset + lxb_css_syntax_token_base(token)->length;
 
     switch (token->type) {
         case LXB_CSS_SYNTAX_TOKEN_WHITESPACE:
+        case LXB_CSS_SYNTAX_TOKEN_CDC:
+        case LXB_CSS_SYNTAX_TOKEN_CDO:
             lxb_css_syntax_token_consume(parser->tkz);
 
             token = lxb_css_syntax_token(parser->tkz);
@@ -577,22 +607,6 @@ lxb_css_syntax_parser_list_rules(lxb_css_parser_t *parser,
         case LXB_CSS_SYNTAX_TOKEN__EOF:
             goto done;
 
-        case LXB_CSS_SYNTAX_TOKEN_CDC:
-        case LXB_CSS_SYNTAX_TOKEN_CDO:
-            if (rule->top_level) {
-                lxb_css_syntax_token_consume(parser->tkz);
-
-                token = lxb_css_syntax_token(parser->tkz);
-                if (token == NULL) {
-                    return lxb_css_syntax_parser_failed(parser,
-                                                        parser->tkz->status);
-                }
-
-                goto begin;
-            }
-
-            /* fall through */
-
         default:
             if (rule->block_end == token->type && rule->deep == 0) {
                 goto done;
@@ -607,79 +621,136 @@ lxb_css_syntax_parser_list_rules(lxb_css_parser_t *parser,
 done:
 
     rule->phase = lxb_css_syntax_parser_end;
-    rule->skip_consume = true;
 
-    rule->u.list_rules.end = token->offset;
-
-    return &lxb_css_syntax_token_terminated;
+    return lxb_css_parser_token_end(parser, 0);
 }
 
+/*
+ * This code will be called before rule->state is called.
+ * Exclusively from the lxb_css_parser_run(...).
+ */
 static const lxb_css_syntax_token_t *
 lxb_css_syntax_parser_list_rules_at(lxb_css_parser_t *parser,
                                     const lxb_css_syntax_token_t *token,
                                     lxb_css_syntax_rule_t *rule)
 {
-    if (rule->state != lxb_css_state_success) {
-        return token;
-    }
+    const lxb_css_syntax_cb_list_rules_t *list_rules = rule->cbx.list_rules;
 
-    rule = lxb_css_syntax_parser_at_rule_push(parser, token,
-                                              lxb_css_syntax_parser_list_rules_back,
-                                              rule->cbx.list_rules->at_rule,
-                                              rule->context, rule->block_end);
-    if (rule == NULL) {
-        return NULL;
-    }
-
-    parser->fake_null = true;
-
-    return NULL;
+    return lxb_css_syntax_parser_at_begin(parser, token, rule, list_rules->next,
+                                          list_rules->at_rule, false);
 }
 
+/*
+ * This code will be called before rule->state is called.
+ * Exclusively from the lxb_css_parser_run(...).
+ */
 static const lxb_css_syntax_token_t *
 lxb_css_syntax_parser_list_rules_qualified(lxb_css_parser_t *parser,
                                            const lxb_css_syntax_token_t *token,
                                            lxb_css_syntax_rule_t *rule)
 {
-    if (rule->state != lxb_css_state_success) {
-        return token;
-    }
+    void *qualified_ctx;
+    lxb_css_syntax_rule_t *qualified;
+    lxb_css_syntax_begin_qualified_rule_f cb;
+    const lxb_css_syntax_cb_list_rules_t *list_rules;
+    const lxb_css_syntax_cb_qualified_rule_t *cb_qualified;
 
-    rule = lxb_css_syntax_parser_qualified_push(parser, token,
-                                                lxb_css_syntax_parser_list_rules_back,
-                                                rule->cbx.list_rules->qualified_rule,
-                                                rule->context, rule->block_end);
-    if (rule == NULL) {
-        return NULL;
+    qualified_ctx = NULL;
+    list_rules = rule->cbx.list_rules;
+    cb = list_rules->qualified_rule;
+
+    rule->skip_consume = false;
+
+    cb_qualified = cb(parser, token, rule->context, &qualified_ctx);
+    if (cb_qualified == NULL) {
+        return lxb_css_syntax_parser_failed(parser,
+                                            LXB_STATUS_ERROR_UNEXPECTED_DATA);
     }
 
-    parser->fake_null = true;
+    qualified = lxb_css_syntax_parser_qualified_push(parser, cb_qualified,
+                                                     list_rules->next,
+                                                     qualified_ctx,
+                                                     rule->block_end,
+                                                     false);
+    if (qualified == NULL) {
+        return lxb_css_syntax_parser_failed(parser,
+                                            LXB_STATUS_ERROR_MEMORY_ALLOCATION);
+    }
 
-    return NULL;
+    return lxb_css_syntax_token_parser_do_phase_again(parser);
 }
 
-static bool
+/*
+ * This code will be called before rule->state is called.
+ * Exclusively from the lxb_css_parser_run(...).
+ */
+static const lxb_css_syntax_token_t *
 lxb_css_syntax_parser_list_rules_back(lxb_css_parser_t *parser,
-                                      const lxb_css_syntax_token_t *token, void *ctx)
+                                      const lxb_css_syntax_token_t *token,
+                                      lxb_css_syntax_rule_t *rule)
 {
-    lxb_css_syntax_rule_t *rule;
+    rule->phase = lxb_css_syntax_parser_list_rules;
+    rule->state = rule->back_state;
+    rule->skip_consume = true;
 
-    if (token->type == LXB_CSS_SYNTAX_TOKEN__END) {
-        return lxb_css_parser_success(parser);
+    return token;
+}
+
+static const lxb_css_syntax_token_t *
+lxb_css_syntax_parser_at_begin(lxb_css_parser_t *parser,
+                               const lxb_css_syntax_token_t *token,
+                               lxb_css_syntax_rule_t *rule,
+                               lxb_css_parser_state_f back_state,
+                               lxb_css_syntax_begin_at_rule_f cb,
+                               bool nested)
+{
+    void *at_rule_ctx;
+    lxb_css_syntax_rule_t *at_rule;
+    const lxb_css_syntax_cb_at_rule_t *cb_at_rule;
+
+    at_rule_ctx = NULL;
+    rule->skip_consume = false;
+
+    cb_at_rule = cb(parser, token, rule->context, &at_rule_ctx);
+    if (cb_at_rule == NULL) {
+        return lxb_css_syntax_parser_failed(parser,
+                                            LXB_STATUS_ERROR_UNEXPECTED_DATA);
     }
 
-    rule = parser->rules;
-    rule->state = rule->cbx.list_rules->next;
+    at_rule = lxb_css_syntax_parser_at_rule_push(parser, cb_at_rule,
+                                                 back_state, at_rule_ctx,
+                                                 rule->block_end, nested);
+    if (at_rule == NULL) {
+        return lxb_css_syntax_parser_failed(parser,
+                                            LXB_STATUS_ERROR_MEMORY_ALLOCATION);
+    }
+
+    lxb_css_syntax_token_consume(parser->tkz);
+
+    token = lxb_css_syntax_token(parser->tkz);
+    if (token == NULL) {
+        return lxb_css_syntax_parser_failed(parser, parser->tkz->status);
+    }
 
-    return false;
+    if (token->type == LXB_CSS_SYNTAX_TOKEN_WHITESPACE) {
+        lxb_css_syntax_token_consume(parser->tkz);
+    }
+
+    return lxb_css_syntax_token_parser_do_phase_again(parser);
 }
 
+/*
+ * First call for this code will be called before rule->state is called.
+ * Exclusively from the lxb_css_parser_run(...).
+ * Rule -- lxb_css_syntax_rule_t with at_rule callbacks.
+ */
 static const lxb_css_syntax_token_t *
 lxb_css_syntax_parser_at_rule(lxb_css_parser_t *parser,
                               const lxb_css_syntax_token_t *token,
                               lxb_css_syntax_rule_t *rule)
 {
     lxb_status_t status;
+    const lxb_css_log_message_t *msg;
 
     if (rule->offset > token->offset) {
         return token;
@@ -688,7 +759,7 @@ lxb_css_syntax_parser_at_rule(lxb_css_parser_t *parser,
     rule->offset = token->offset + lxb_css_syntax_token_base(token)->length;
 
     if (rule->block_end == token->type && rule->deep == 0) {
-        rule->skip_ending = true;
+        rule->phase = lxb_css_syntax_parser_at_prelude_end;
         goto done;
     }
 
@@ -706,25 +777,11 @@ lxb_css_syntax_parser_at_rule(lxb_css_parser_t *parser,
 
         case LXB_CSS_SYNTAX_TOKEN_LC_BRACKET:
             if (rule->deep == 0) {
-                rule->phase = lxb_css_syntax_parser_start_block;
-
-                rule->u.at_rule.prelude_end = token->offset;
-                rule->u.at_rule.block = token->offset
-                    + lxb_css_syntax_token_base(token)->length;
-
+                rule->phase = lxb_css_syntax_parser_at_block;
+                rule->back = lxb_css_syntax_parser_end_back;
                 rule->skip_consume = true;
 
-                parser->block = rule->cbx.cb->block;
-
-                lxb_css_syntax_token_consume(parser->tkz);
-
-                token = lxb_css_syntax_token(parser->tkz);
-                if (token == NULL) {
-                    return lxb_css_syntax_parser_failed(parser,
-                                                        parser->tkz->status);
-                }
-
-                token = &lxb_css_syntax_token_terminated;
+                return lxb_css_parser_token_end(parser, token->offset);
             }
 
             status = lxb_css_parser_types_push(parser,
@@ -732,13 +789,25 @@ lxb_css_syntax_parser_at_rule(lxb_css_parser_t *parser,
             break;
 
         case LXB_CSS_SYNTAX_TOKEN_RC_BRACKET:
-            if (rule->deep != 0 && parser->types_pos[-1] == token->type) {
-                if (rule->deep == 1) {
-                    goto done;
+            if (rule->deep != 0) {
+                if (parser->types_pos[-1] == token->type) {
+                    parser->types_pos--;
+                    rule->deep--;
+                }
+            }
+            else {
+                msg = lxb_css_log_format(parser->log,
+                                         LXB_CSS_LOG_SYNTAX_ERROR,
+                                         "%S", &lxb_css_err_rc);
+                if (msg == NULL) {
+                    return lxb_css_syntax_parser_failed(parser,
+                                           LXB_STATUS_ERROR_MEMORY_ALLOCATION);
                 }
 
-                parser->types_pos--;
-                rule->deep--;
+                if (rule->nested) {
+                    rule->phase = lxb_css_syntax_parser_at_prelude_end;
+                    goto done;
+                }
             }
 
             return token;
@@ -754,12 +823,14 @@ lxb_css_syntax_parser_at_rule(lxb_css_parser_t *parser,
 
         case LXB_CSS_SYNTAX_TOKEN_SEMICOLON:
             if (rule->deep == 0) {
+                rule->phase = lxb_css_syntax_parser_at_prelude_end_consule_token;
                 goto done;
             }
 
             return token;
 
         case LXB_CSS_SYNTAX_TOKEN__EOF:
+            rule->phase = lxb_css_syntax_parser_at_prelude_end;
             goto done;
 
         default:
@@ -776,17 +847,91 @@ lxb_css_syntax_parser_at_rule(lxb_css_parser_t *parser,
 
 done:
 
-    rule->phase = lxb_css_syntax_parser_end;
     rule->skip_consume = true;
 
-    if (rule->u.at_rule.prelude_end != 0) {
-        rule->u.at_rule.block_end = token->offset;
+    return lxb_css_parser_token_end(parser, token->offset);
+}
+
+/*
+ * This code will be called before rule->state is called.
+ * Exclusively from the lxb_css_parser_run(...).
+ */
+static const lxb_css_syntax_token_t *
+lxb_css_syntax_parser_at_block(lxb_css_parser_t *parser,
+                               const lxb_css_syntax_token_t *token,
+                               lxb_css_syntax_rule_t *rule)
+{
+    lxb_status_t status;
+    const lxb_css_syntax_cb_at_rule_t *at_rule = rule->cbx.at_rule;
+
+    status = at_rule->prelude_end(parser, token, rule->context, rule->failed);
+    if (status != LXB_STATUS_OK) {
+        return lxb_css_syntax_parser_failed(parser, status);
     }
-    else {
-        rule->u.at_rule.prelude_end = token->offset;
+
+    return lxb_css_syntax_parser_block_begin(parser, token, rule,
+                                             at_rule->prelude, at_rule->block);
+}
+
+/*
+ * This code will be called before rule->state is called.
+ * Exclusively from the lxb_css_parser_run(...).
+ */
+static const lxb_css_syntax_token_t *
+lxb_css_syntax_parser_at_prelude_end(lxb_css_parser_t *parser,
+                                     const lxb_css_syntax_token_t *token,
+                                     lxb_css_syntax_rule_t *rule)
+{
+    lxb_status_t status;
+    const lxb_css_syntax_cb_at_rule_t *at_rule = rule->cbx.at_rule;
+
+    rule->phase = lxb_css_syntax_parser_end;
+    rule->state = lxb_css_state_success;
+
+    status = at_rule->prelude_end(parser, token, rule->context, rule->failed);
+    if (status != LXB_STATUS_OK) {
+        return lxb_css_syntax_parser_failed(parser, status);
     }
 
-    return &lxb_css_syntax_token_terminated;
+    return lxb_css_syntax_token_parser_do_phase_again(parser);
+}
+
+/*
+ * This code will be called before rule->state is called.
+ * Exclusively from the lxb_css_parser_run(...).
+ */
+static const lxb_css_syntax_token_t *
+lxb_css_syntax_parser_at_prelude_end_consule_token(lxb_css_parser_t *parser,
+                                                   const lxb_css_syntax_token_t *token,
+                                                   lxb_css_syntax_rule_t *rule)
+{
+    lxb_status_t status;
+    const lxb_css_syntax_cb_at_rule_t *at_rule = rule->cbx.at_rule;
+
+    rule->phase = lxb_css_syntax_parser_end_consume_token;
+
+    status = at_rule->prelude_end(parser, token, rule->context, rule->failed);
+    if (status != LXB_STATUS_OK) {
+        return lxb_css_syntax_parser_failed(parser, status);
+    }
+
+    return lxb_css_syntax_token_parser_do_phase_again(parser);
+}
+
+/*
+ * This code will be called before rule->state is called.
+ * Exclusively from the lxb_css_parser_run(...).
+ */
+static const lxb_css_syntax_token_t *
+lxb_css_syntax_parser_at_back_to_prelude(lxb_css_parser_t *parser,
+                                         const lxb_css_syntax_token_t *token,
+                                         lxb_css_syntax_rule_t *rule)
+{
+    rule->phase = lxb_css_syntax_parser_at_rule;
+    rule->state = rule->back_state;
+    rule->skip_consume = false;
+
+    return token;
 }
 
 static const lxb_css_syntax_token_t *
@@ -795,8 +940,7 @@ lxb_css_syntax_parser_qualified_rule(lxb_css_parser_t *parser,
                                      lxb_css_syntax_rule_t *rule)
 {
     lxb_status_t status;
-
-    /* It is necessary to avoid re-entry of the token into the phase. */
+    const lxb_css_log_message_t *msg;
 
     if (rule->offset > token->offset) {
         return token;
@@ -805,7 +949,6 @@ lxb_css_syntax_parser_qualified_rule(lxb_css_parser_t *parser,
     rule->offset = token->offset + lxb_css_syntax_token_base(token)->length;
 
     if (rule->block_end == token->type && rule->deep == 0) {
-        rule->skip_ending = true;
         goto done;
     }
 
@@ -823,25 +966,11 @@ lxb_css_syntax_parser_qualified_rule(lxb_css_parser_t *parser,
 
         case LXB_CSS_SYNTAX_TOKEN_LC_BRACKET:
             if (rule->deep == 0) {
-                rule->phase = lxb_css_syntax_parser_start_block;
-
-                rule->u.qualified.prelude_end = token->offset;
-                rule->u.qualified.block = token->offset
-                                    + lxb_css_syntax_token_base(token)->length;
-
+                rule->phase = lxb_css_syntax_parser_qualified_rule_block;
+                rule->back = lxb_css_syntax_parser_end_back;
                 rule->skip_consume = true;
 
-                parser->block = rule->cbx.cb->block;
-
-                lxb_css_syntax_token_consume(parser->tkz);
-
-                token = lxb_css_syntax_token(parser->tkz);
-                if (token == NULL) {
-                    return lxb_css_syntax_parser_failed(parser,
-                                                        parser->tkz->status);
-                }
-
-                token = &lxb_css_syntax_token_terminated;
+                return lxb_css_parser_token_end(parser, token->offset);
             }
 
             status = lxb_css_parser_types_push(parser,
@@ -849,13 +978,24 @@ lxb_css_syntax_parser_qualified_rule(lxb_css_parser_t *parser,
             break;
 
         case LXB_CSS_SYNTAX_TOKEN_RC_BRACKET:
-            if (rule->deep != 0 && parser->types_pos[-1] == token->type) {
-                if (rule->deep == 1) {
-                    goto done;
+            if (rule->deep != 0) {
+                if (parser->types_pos[-1] == token->type) {
+                    parser->types_pos--;
+                    rule->deep--;
+                }
+            }
+            else {
+                msg = lxb_css_log_format(parser->log,
+                                         LXB_CSS_LOG_SYNTAX_ERROR,
+                                         "%S", &lxb_css_err_rc);
+                if (msg == NULL) {
+                    return lxb_css_syntax_parser_failed(parser,
+                                        LXB_STATUS_ERROR_MEMORY_ALLOCATION);
                 }
 
-                parser->types_pos--;
-                rule->deep--;
+                if (rule->nested) {
+                    goto done;
+                }
             }
 
             return token;
@@ -868,7 +1008,7 @@ lxb_css_syntax_parser_qualified_rule(lxb_css_parser_t *parser,
             }
 
             return token;
-
+ 
         case LXB_CSS_SYNTAX_TOKEN__EOF:
             goto done;
 
@@ -886,23 +1026,113 @@ lxb_css_syntax_parser_qualified_rule(lxb_css_parser_t *parser,
 
 done:
 
-    rule->phase = lxb_css_syntax_parser_end;
+    rule->phase = lxb_css_syntax_parser_qualified_prelude_end;
     rule->skip_consume = true;
 
-    if (rule->u.qualified.block != 0) {
-        rule->u.qualified.block_end = token->offset;
+    return lxb_css_parser_token_end(parser, token->offset);
+}
+
+/*
+ * This code will be called before rule->state is called.
+ * Exclusively from the lxb_css_parser_run(...).
+ */
+static const lxb_css_syntax_token_t *
+lxb_css_syntax_parser_qualified_rule_block(lxb_css_parser_t *parser,
+                                           const lxb_css_syntax_token_t *token,
+                                           lxb_css_syntax_rule_t *rule)
+{
+    const lxb_css_syntax_cb_qualified_rule_t *qualified_rule;
+
+    qualified_rule = rule->cbx.qualified_rule;
+
+    parser->status = qualified_rule->prelude_end(parser, token,
+                                                 rule->context, rule->failed);
+    if (parser->status != LXB_STATUS_OK) {
+        return NULL;
     }
-    else {
-        rule->u.qualified.prelude_end = token->offset;
+
+    return lxb_css_syntax_parser_block_begin(parser, token, rule,
+                                             qualified_rule->prelude,
+                                             qualified_rule->block);
+}
+
+/*
+ * This code will be called before rule->state is called.
+ * Exclusively from the lxb_css_parser_run(...).
+ */
+static const lxb_css_syntax_token_t *
+lxb_css_syntax_parser_qualified_prelude_end(lxb_css_parser_t *parser,
+                                            const lxb_css_syntax_token_t *token,
+                                            lxb_css_syntax_rule_t *rule)
+{
+    const lxb_css_syntax_cb_qualified_rule_t *qualified_rule;
+
+    qualified_rule = rule->cbx.qualified_rule;
+
+    parser->status = qualified_rule->prelude_end(parser, token,
+                                                 rule->context, rule->failed);
+    if (parser->status != LXB_STATUS_OK) {
+        return NULL;
+    }
+
+    rule->phase = lxb_css_syntax_parser_end;
+    rule->state = lxb_css_state_success;
+
+    return lxb_css_syntax_token_parser_do_phase_again(parser);
+}
+
+/*
+ * This code will be called before rule->state is called.
+ * Exclusively from the lxb_css_parser_run(...).
+ */
+static const lxb_css_syntax_token_t *
+lxb_css_syntax_parser_qualified_back_to_prelude(lxb_css_parser_t *parser,
+                                                const lxb_css_syntax_token_t *token,
+                                                lxb_css_syntax_rule_t *rule)
+{
+    rule->phase = lxb_css_syntax_parser_qualified_rule;
+    rule->state = rule->back_state;
+    rule->skip_consume = false;
+
+    return token;
+}
+
+static const lxb_css_syntax_token_t *
+lxb_css_syntax_parser_block_begin(lxb_css_parser_t *parser,
+                                  const lxb_css_syntax_token_t *token,
+                                  lxb_css_syntax_rule_t *rule,
+                                  lxb_css_parser_state_f back_state,
+                                  lxb_css_syntax_begin_block_f cb)
+{
+    void *block_ctx;
+    lxb_css_syntax_rule_t *block;
+    const lxb_css_syntax_cb_block_t *cb_block;
+
+    block_ctx = NULL;
+    rule->skip_consume = false;
+
+    cb_block = cb(parser, token, rule->context, &block_ctx);
+    if (cb_block == NULL) {
+        return lxb_css_syntax_parser_failed(parser,
+                                            LXB_STATUS_ERROR_UNEXPECTED_DATA);
+    }
+
+    block = lxb_css_syntax_parser_block_push(parser, cb_block, back_state,
+                                             block_ctx);
+    if (block == NULL) {
+        return lxb_css_syntax_parser_failed(parser,
+                                            LXB_STATUS_ERROR_MEMORY_ALLOCATION);
     }
 
-    return &lxb_css_syntax_token_terminated;
+    lxb_css_syntax_token_consume(parser->tkz);
+
+    return lxb_css_syntax_token_parser_do_phase_again(parser);
 }
 
 static const lxb_css_syntax_token_t *
-lxb_css_syntax_parser_declarations(lxb_css_parser_t *parser,
-                                   const lxb_css_syntax_token_t *token,
-                                   lxb_css_syntax_rule_t *rule)
+lxb_css_syntax_parser_block(lxb_css_parser_t *parser,
+                            const lxb_css_syntax_token_t *token,
+                            lxb_css_syntax_rule_t *rule)
 {
     if (rule->offset > token->offset) {
         return token;
@@ -912,11 +1142,6 @@ lxb_css_syntax_parser_declarations(lxb_css_parser_t *parser,
 
     rule->offset = token->offset + lxb_css_syntax_token_base(token)->length;
 
-    if (rule->block_end == token->type && rule->deep == 0) {
-        rule->skip_ending = true;
-        goto done;
-    }
-
     switch (token->type) {
         case LXB_CSS_SYNTAX_TOKEN_SEMICOLON:
         case LXB_CSS_SYNTAX_TOKEN_WHITESPACE:
@@ -930,93 +1155,221 @@ lxb_css_syntax_parser_declarations(lxb_css_parser_t *parser,
 
             goto begin;
 
-        case LXB_CSS_SYNTAX_TOKEN_IDENT:
-            rule->u.declarations.name_begin = token->offset;
-
-            if (lxb_css_syntax_tokenizer_lookup_colon(parser->tkz)) {
-                rule->phase = lxb_css_syntax_parser_declarations_name;
-                parser->block = rule->cbx.cb->block;
+        case LXB_CSS_SYNTAX_TOKEN_RC_BRACKET:
+            if (rule->deep == 0) {
+                rule->phase = lxb_css_syntax_parser_end_consume_token;
+                break;
+            }
 
-                return token;
+            if (parser->types_pos[-1] == token->type) {
+                parser->types_pos--;
+                rule->deep--;
             }
 
-            rule->state = rule->cbx.cb->failed;
-            rule->phase = lxb_css_syntax_parser_declarations_drop;
-            rule->failed = true;
+            return token;
 
+        case LXB_CSS_SYNTAX_TOKEN__EOF:
+            rule->phase = lxb_css_syntax_parser_end;
             break;
 
         case LXB_CSS_SYNTAX_TOKEN_AT_KEYWORD:
-            rule->u.declarations.name_begin = 0;
-
-            rule = lxb_css_syntax_parser_at_rule_push(parser, token,
-                             lxb_css_syntax_parser_declarations_back,
-                             rule->cbx.declarations->at_rule, rule->context,
-                             rule->block_end);
-            if (rule != NULL) {
-                parser->fake_null = true;
-            }
+            rule->phase = lxb_css_syntax_parser_block_at;
+            break;
 
-            return NULL;
+        case LXB_CSS_SYNTAX_TOKEN_IDENT:
+            if (lxb_css_syntax_tokenizer_lookup_colon(parser->tkz)) {
+                rule->phase = lxb_css_syntax_parser_block_declarations;
+                break;
+            }
 
-        case LXB_CSS_SYNTAX_TOKEN__EOF:
-            goto done;
+            /* Fall Through. */
 
         default:
-            rule->state = rule->cbx.cb->failed;
-            rule->phase = lxb_css_syntax_parser_declarations_drop;
-            rule->failed = true;
-
-            rule->u.declarations.name_begin = token->offset;
+            rule->phase = lxb_css_syntax_parser_block_qualified;
             break;
     }
 
-    parser->fake_null = true;
+    rule->skip_consume = true;
 
-    return NULL;
+    return lxb_css_parser_token_end(parser, 0);
+}
 
-done:
+/*
+ * This code will be called before rule->state is called.
+ * Exclusively from the lxb_css_parser_run(...).
+ */
+static const lxb_css_syntax_token_t *
+lxb_css_syntax_parser_block_at(lxb_css_parser_t *parser,
+                               const lxb_css_syntax_token_t *token,
+                               lxb_css_syntax_rule_t *rule)
+{
+    const lxb_css_syntax_cb_block_t *block = rule->cbx.block;
 
-    rule->phase = lxb_css_syntax_parser_end;
-    rule->state = lxb_css_state_success;
-    rule->skip_consume = true;
+    return lxb_css_syntax_parser_at_begin(parser, token, rule,
+                                          block->next, block->at_rule, true);
+}
 
-    rule->u.declarations.name_begin = 0;
-    rule->u.declarations.end = token->offset;
+/*
+ * This code will be called before rule->state is called.
+ * Exclusively from the lxb_css_parser_run(...).
+ */
+static const lxb_css_syntax_token_t *
+lxb_css_syntax_parser_block_declarations(lxb_css_parser_t *parser,
+                                         const lxb_css_syntax_token_t *token,
+                                         lxb_css_syntax_rule_t *rule)
+{
+    void *declr_ctx;
+    lxb_css_syntax_rule_t *declr_rule;
+    lxb_css_syntax_begin_declarations_f cb;
+    const lxb_css_syntax_cb_block_t *block;
+    const lxb_css_syntax_cb_declarations_t *cb_declr;
 
-    parser->fake_null = true;
+    declr_ctx = NULL;
+    block = rule->cbx.block;
+    cb = block->declarations;
 
-    return NULL;
+    rule->skip_consume = false;
+
+    cb_declr = cb(parser, token, rule->context, &declr_ctx);
+    if (cb_declr == NULL) {
+        return lxb_css_syntax_parser_failed(parser,
+                                            LXB_STATUS_ERROR_UNEXPECTED_DATA);
+    }
+
+    declr_rule = lxb_css_syntax_parser_declarations_push(parser, cb_declr,
+                                                         block->next, declr_ctx,
+                                                         LXB_CSS_SYNTAX_TOKEN_RC_BRACKET,
+                                                         false, true);
+    if (declr_rule == NULL) {
+        return lxb_css_syntax_parser_failed(parser,
+                                            LXB_STATUS_ERROR_MEMORY_ALLOCATION);
+    }
+
+    return lxb_css_syntax_token_parser_do_phase_again(parser);
 }
 
-static bool
-lxb_css_syntax_parser_declarations_back(lxb_css_parser_t *parser,
-                                        const lxb_css_syntax_token_t *token, void *ctx)
+/*
+ * This code will be called before rule->state is called.
+ * Exclusively from the lxb_css_parser_run(...).
+ */
+static const lxb_css_syntax_token_t *
+lxb_css_syntax_parser_block_qualified(lxb_css_parser_t *parser,
+                                      const lxb_css_syntax_token_t *token,
+                                      lxb_css_syntax_rule_t *rule)
 {
-    lxb_css_syntax_rule_t *rules = parser->rules;
+    void *qualified_ctx;
+    lxb_css_syntax_rule_t *qualified;
+    const lxb_css_syntax_cb_block_t *block;
+    lxb_css_syntax_begin_qualified_rule_f cb;
+    const lxb_css_syntax_cb_qualified_rule_t *cb_qualified;
 
-    rules->state = rules->cbx.declarations->cb.state;
+    qualified_ctx = NULL;
+    block = rule->cbx.block;
+    cb = block->qualified_rule;
+
+    rule->skip_consume = false;
 
-    return rules->state(parser, token, ctx);
+    cb_qualified = cb(parser, token, rule->context, &qualified_ctx);
+    if (cb_qualified == NULL) {
+        return lxb_css_syntax_parser_failed(parser,
+                                            LXB_STATUS_ERROR_UNEXPECTED_DATA);
+    }
+
+    qualified = lxb_css_syntax_parser_qualified_push(parser, cb_qualified,
+                                                     block->next, qualified_ctx,
+                                                     LXB_CSS_SYNTAX_TOKEN_SEMICOLON,
+                                                     true);
+    if (qualified == NULL) {
+        return lxb_css_syntax_parser_failed(parser,
+                                            LXB_STATUS_ERROR_MEMORY_ALLOCATION);
+    }
+
+    return lxb_css_syntax_token_parser_do_phase_again(parser);
 }
 
+/*
+ * This code will be called before rule->state is called.
+ * Exclusively from the lxb_css_parser_run(...).
+ */
 static const lxb_css_syntax_token_t *
-lxb_css_syntax_parser_declarations_name(lxb_css_parser_t *parser,
-                                        const lxb_css_syntax_token_t *token,
-                                        lxb_css_syntax_rule_t *rule)
+lxb_css_syntax_parser_block_back(lxb_css_parser_t *parser,
+                                 const lxb_css_syntax_token_t *token,
+                                 lxb_css_syntax_rule_t *rule)
 {
-    if (rule->offset > token->offset) {
-        return token;
+    rule->phase = lxb_css_syntax_parser_block;
+    rule->state = rule->back_state;
+    rule->skip_consume = true;
+
+    return token;
+}
+
+/*
+ * This code will be called before rule->state is called.
+ * Exclusively from the lxb_css_parser_run(...).
+ */
+static const lxb_css_syntax_token_t *
+lxb_css_syntax_parser_declarations_validate(lxb_css_parser_t *parser,
+                                            const lxb_css_syntax_token_t *token,
+                                            lxb_css_syntax_rule_t *rule)
+{
+    if (token->type != LXB_CSS_SYNTAX_TOKEN_IDENT
+        || !lxb_css_syntax_tokenizer_lookup_colon(parser->tkz))
+    {
+        rule->phase = lxb_css_syntax_parser_declarations_drop;
+        rule->state = rule->cbx.cb->failed;
+        rule->begin = token->offset;
+        rule->context_old = rule->context;
+        rule->context = NULL;
+        rule->failed = true;
+
+        parser->offset.value_end = 0;
+
+        return lxb_css_syntax_token_parser_do_phase_again(parser);
     }
 
-    if (rule->state != lxb_css_state_success) {
-        rule->skip_consume = true;
+    return lxb_css_syntax_parser_declarations_begin(parser, token, rule);
+}
+
+/*
+ * This code will be called before rule->state is called.
+ * Exclusively from the lxb_css_parser_run(...).
+ */
+static const lxb_css_syntax_token_t *
+lxb_css_syntax_parser_declarations_begin(lxb_css_parser_t *parser,
+                                         const lxb_css_syntax_token_t *token,
+                                         lxb_css_syntax_rule_t *rule)
+{
+    void *declr_ctx;
+    lxb_css_syntax_declaration_name_f cb;
 
-        return &lxb_css_syntax_token_terminated;
+    declr_ctx = NULL;
+    cb = rule->cbx.declarations->name;
+
+    rule->state = cb(parser, token, rule->context, &declr_ctx);
+    if (rule->state == NULL) {
+        return lxb_css_syntax_parser_failed(parser,
+                                            LXB_STATUS_ERROR_UNEXPECTED_DATA);
     }
 
+    rule->phase = lxb_css_syntax_parser_declarations_name;
+    rule->context_old = rule->context;
+    rule->context = declr_ctx;
     rule->skip_consume = false;
 
+    lxb_css_syntax_token_consume(parser->tkz);
+
+    return lxb_css_syntax_token_parser_do_phase_again(parser);
+}
+
+/*
+ * This code will be called before rule->state is called.
+ * Exclusively from the lxb_css_parser_run(...).
+ */
+static const lxb_css_syntax_token_t *
+lxb_css_syntax_parser_declarations_name(lxb_css_parser_t *parser,
+                                        const lxb_css_syntax_token_t *token,
+                                        lxb_css_syntax_rule_t *rule)
+{
     /* 1. */
 
     if (token->type == LXB_CSS_SYNTAX_TOKEN_WHITESPACE) {
@@ -1049,8 +1402,6 @@ lxb_css_syntax_parser_declarations_name(lxb_css_parser_t *parser,
         return NULL;
     }
 
-    rule->u.declarations.name_end = token->offset;
-
     lxb_css_syntax_token_consume(parser->tkz);
 
     token = lxb_css_syntax_token(parser->tkz);
@@ -1069,12 +1420,12 @@ lxb_css_syntax_parser_declarations_name(lxb_css_parser_t *parser,
         }
     }
 
-    rule->u.declarations.value_begin = token->offset;
+    rule->begin = token->offset;
+    parser->offset.value_end = 0;
 
     /* 4. */
 
     rule->phase = lxb_css_syntax_parser_declarations_value;
-    rule->state = parser->block;
 
     return lxb_css_syntax_parser_declarations_value(parser, token, rule);
 }
@@ -1085,7 +1436,7 @@ lxb_css_syntax_parser_declarations_value(lxb_css_parser_t *parser,
                                          lxb_css_syntax_rule_t *rule)
 {
     bool imp;
-    uintptr_t before_important;
+    size_t offset;
     lxb_status_t status;
 
     if (rule->offset > token->offset) {
@@ -1097,7 +1448,6 @@ lxb_css_syntax_parser_declarations_value(lxb_css_parser_t *parser,
     rule->offset = token->offset + lxb_css_syntax_token_base(token)->length;
 
     if (rule->block_end == token->type && rule->deep == 0) {
-        rule->skip_ending = true;
         goto done;
     }
 
@@ -1115,7 +1465,7 @@ lxb_css_syntax_parser_declarations_value(lxb_css_parser_t *parser,
                 return token;
             }
 
-            before_important = token->offset;
+            parser->offset.value_end = token->offset;
 
             lxb_css_syntax_token_consume(parser->tkz);
 
@@ -1128,7 +1478,7 @@ lxb_css_syntax_parser_declarations_value(lxb_css_parser_t *parser,
 
             if (token->type == LXB_CSS_SYNTAX_TOKEN_DELIM) {
                 rule->important = true;
-                rule->u.declarations.before_important = before_important;
+                parser->offset.important_begin = token->offset;
 
                 lxb_css_syntax_token_consume(parser->tkz);
 
@@ -1138,6 +1488,10 @@ lxb_css_syntax_parser_declarations_value(lxb_css_parser_t *parser,
                 if (token == NULL) {
                     return lxb_css_syntax_parser_failed(parser, parser->tkz->status);
                 }
+
+                parser->offset.important_end = token->offset
+                    + lxb_css_syntax_token_base(token)->length;
+
                 lxb_css_syntax_token_consume(parser->tkz);
 
                 token = lxb_css_syntax_token(parser->tkz);
@@ -1155,6 +1509,10 @@ lxb_css_syntax_parser_declarations_value(lxb_css_parser_t *parser,
                     }
                 }
             }
+            else {
+                parser->offset.important_begin = 0;
+                parser->offset.important_end = 0;
+            }
 
             goto again;
 
@@ -1162,17 +1520,20 @@ lxb_css_syntax_parser_declarations_value(lxb_css_parser_t *parser,
             if (rule->deep == 0) {
                 rule->phase = lxb_css_syntax_parser_declarations_next;
 
-                rule->u.declarations.value_end = token->offset;
+                offset = token->offset;
 
-                lxb_css_syntax_token_consume(parser->tkz);
+                parser->offset.value_begin = rule->begin;
+                parser->offset.end = offset;
 
-                token = lxb_css_syntax_token(parser->tkz);
-                if (token == NULL) {
-                    return lxb_css_syntax_parser_failed(parser,
-                                                        parser->tkz->status);
+                if (parser->offset.value_end == 0) {
+                    parser->offset.value_end = offset;
+                    parser->offset.important_begin = 0;
+                    parser->offset.important_end = 0;
                 }
 
-                return &lxb_css_syntax_token_terminated;
+                lxb_css_syntax_token_consume(parser->tkz);
+
+                return lxb_css_parser_token_end(parser, offset);
             }
 
             return token;
@@ -1190,9 +1551,11 @@ lxb_css_syntax_parser_declarations_value(lxb_css_parser_t *parser,
                 return token;
             }
 
-            rule->u.declarations.before_important = token->offset;
             rule->important = true;
 
+            parser->offset.value_end = token->offset;
+            parser->offset.important_begin = token->offset;
+
             lxb_css_syntax_token_consume(parser->tkz);
 
             token = lxb_css_syntax_token(parser->tkz);
@@ -1200,6 +1563,9 @@ lxb_css_syntax_parser_declarations_value(lxb_css_parser_t *parser,
                 return lxb_css_syntax_parser_failed(parser, parser->tkz->status);
             }
 
+            parser->offset.important_end = token->offset
+                + lxb_css_syntax_token_base(token)->length;
+
             lxb_css_syntax_token_consume(parser->tkz);
 
             token = lxb_css_syntax_token(parser->tkz);
@@ -1262,177 +1628,304 @@ lxb_css_syntax_parser_declarations_value(lxb_css_parser_t *parser,
 
 done:
 
-    rule->phase = lxb_css_syntax_parser_declarations_end;
-    rule->skip_consume = true;
+    parser->offset.value_begin = rule->begin;
+    parser->offset.end = token->offset;
+
+    if (parser->offset.value_end == 0) {
+        parser->offset.value_end = token->offset;
+        parser->offset.important_begin = 0;
+        parser->offset.important_end = 0;
+    }
 
-    rule->u.declarations.value_end = token->offset;
-    rule->u.declarations.end = token->offset;
+    rule->phase = lxb_css_syntax_parser_declaration_end;
+    rule->skip_consume = true;
 
-    return &lxb_css_syntax_token_terminated;
+    return lxb_css_parser_token_end(parser, token->offset);
 }
 
 static const lxb_css_syntax_token_t *
-lxb_css_syntax_parser_declarations_next(lxb_css_parser_t *parser,
+lxb_css_syntax_parser_declarations_drop(lxb_css_parser_t *parser,
                                         const lxb_css_syntax_token_t *token,
                                         lxb_css_syntax_rule_t *rule)
 {
+    size_t offset;
     lxb_status_t status;
-    lxb_css_syntax_declarations_offset_t *decl;
 
-    if (rule->state != lxb_css_state_success) {
-        rule->skip_consume = true;
+    if (rule->offset > token->offset) {
+        return token;
+    }
 
-        return &lxb_css_syntax_token_terminated;
+    rule->offset = token->offset + lxb_css_syntax_token_base(token)->length;
+
+    if (rule->block_end == token->type && rule->deep == 0) {
+        goto done;
+    }
+
+    switch (token->type) {
+        case LXB_CSS_SYNTAX_TOKEN_SEMICOLON:
+            if (rule->deep == 0) {
+                rule->phase = lxb_css_syntax_parser_declarations_next;
+
+                offset = token->offset;
+
+                parser->offset.value_begin = rule->begin;
+                parser->offset.end = offset;
+
+                if (parser->offset.value_end == 0) {
+                    parser->offset.value_end = offset;
+                    parser->offset.important_begin = 0;
+                    parser->offset.important_end = 0;
+                }
+
+                lxb_css_syntax_token_consume(parser->tkz);
+
+                return lxb_css_parser_token_end(parser, offset);
+            }
+
+            return token;
+
+        case LXB_CSS_SYNTAX_TOKEN_LS_BRACKET:
+            status = lxb_css_parser_types_push(parser,
+                                               LXB_CSS_SYNTAX_TOKEN_RS_BRACKET);
+            break;
+
+        case LXB_CSS_SYNTAX_TOKEN_FUNCTION:
+        case LXB_CSS_SYNTAX_TOKEN_L_PARENTHESIS:
+            status = lxb_css_parser_types_push(parser,
+                                               LXB_CSS_SYNTAX_TOKEN_R_PARENTHESIS);
+            break;
+
+        case LXB_CSS_SYNTAX_TOKEN_LC_BRACKET:
+            status = lxb_css_parser_types_push(parser,
+                                               LXB_CSS_SYNTAX_TOKEN_RC_BRACKET);
+            break;
+
+        case LXB_CSS_SYNTAX_TOKEN_RC_BRACKET:
+            if (rule->deep == 0) {
+                if (rule->nested) {
+                    goto done;
+                }
+            }
+            else if (parser->types_pos[-1] == token->type) {
+                parser->types_pos--;
+                rule->deep--;
+            }
+
+            return token;
+
+        case LXB_CSS_SYNTAX_TOKEN_RS_BRACKET:
+        case LXB_CSS_SYNTAX_TOKEN_R_PARENTHESIS:
+            if (rule->deep != 0 && parser->types_pos[-1] == token->type) {
+                parser->types_pos--;
+                rule->deep--;
+            }
+
+            return token;
+
+        case LXB_CSS_SYNTAX_TOKEN__EOF:
+            goto done;
+
+        default:
+            return token;
     }
 
-    status = rule->cbx.declarations->declaration_end(parser, rule->context,
-                                                     rule->important,
-                                                     rule->failed);
     if (status != LXB_STATUS_OK) {
         return lxb_css_syntax_parser_failed(parser, status);
     }
 
-    rule->phase = lxb_css_syntax_parser_declarations;
-    rule->state = rule->cbx.cb->state;
+    rule->deep++;
 
-    rule->skip_consume = false;
-    rule->important = false;
-    rule->failed = false;
+    return token;
+
+done:
+
+    parser->offset.value_begin = rule->begin;
+    parser->offset.end = token->offset;
 
-    decl = &rule->u.declarations;
+    if (parser->offset.value_end == 0) {
+        parser->offset.value_end = token->offset;
+        parser->offset.important_begin = 0;
+        parser->offset.important_end = 0;
+    }
 
-    decl->name_begin = 0;
-    decl->name_end = 0;
-    decl->value_begin = 0;
-    decl->before_important = 0;
-    decl->value_end = 0;
+    rule->phase = lxb_css_syntax_parser_declaration_end;
+    rule->skip_consume = true;
 
-    return lxb_css_syntax_parser_declarations(parser, token, rule);
+    return lxb_css_parser_token_end(parser, token->offset);
 }
 
+/*
+ * This code will be called before rule->state is called.
+ * Exclusively from the lxb_css_parser_run(...).
+ */
 static const lxb_css_syntax_token_t *
-lxb_css_syntax_parser_declarations_drop(lxb_css_parser_t *parser,
+lxb_css_syntax_parser_declarations_next(lxb_css_parser_t *parser,
                                         const lxb_css_syntax_token_t *token,
                                         lxb_css_syntax_rule_t *rule)
 {
+    void *out_rule;
     lxb_status_t status;
+    lxb_css_syntax_declaration_name_f name;
 
-    /* It is necessary to avoid re-entry of the token into the phase. */
+    if (rule->state != lxb_css_state_success) {
+        rule->skip_consume = true;
 
-    if (rule->offset > token->offset) {
-        return token;
+        return lxb_css_parser_token_end(parser, token->offset);
     }
 
-    rule->offset = token->offset + lxb_css_syntax_token_base(token)->length;
-
-    if (rule->block_end == token->type && rule->deep == 0) {
-        rule->skip_ending = true;
-        goto done;
+    status = rule->cbx.declarations->end(parser, rule->context_old,
+                                         rule->context, token, &parser->offset,
+                                         rule->important, rule->failed);
+    if (status != LXB_STATUS_OK) {
+        return lxb_css_syntax_parser_failed(parser, status);
     }
 
-    switch (token->type) {
-        case LXB_CSS_SYNTAX_TOKEN_SEMICOLON:
-            if (rule->deep == 0) {
-                rule->phase = lxb_css_syntax_parser_declarations_next;
+begin:
+
+    switch (token->type) {
+        case LXB_CSS_SYNTAX_TOKEN_SEMICOLON:
+        case LXB_CSS_SYNTAX_TOKEN_WHITESPACE:
+            lxb_css_syntax_token_consume(parser->tkz);
+
+            token = lxb_css_syntax_token(parser->tkz);
+            if (token == NULL) {
+                return lxb_css_syntax_parser_failed(parser,
+                                                    parser->tkz->status);
+            }
+
+            goto begin;
 
-                rule->u.declarations.name_end = token->offset;
+        case LXB_CSS_SYNTAX_TOKEN__EOF:
+            rule->phase = lxb_css_syntax_parser_declarations_end;
+            break;
 
-                lxb_css_syntax_token_consume(parser->tkz);
+        case LXB_CSS_SYNTAX_TOKEN_IDENT:
+            if (lxb_css_syntax_tokenizer_lookup_colon(parser->tkz)) {
+                out_rule = NULL;
+                name = rule->cbx.declarations->name;
+                rule->skip_consume = true;
 
-                token = lxb_css_syntax_token(parser->tkz);
-                if (token == NULL) {
+                rule->state = name(parser, token, rule->context, &out_rule);
+                if (rule->state == NULL) {
                     return lxb_css_syntax_parser_failed(parser,
-                                                        parser->tkz->status);
+                                                        LXB_STATUS_ERROR_UNEXPECTED_DATA);
                 }
 
-                rule->skip_consume = true;
-
-                return &lxb_css_syntax_token_terminated;
-            }
+                rule->context = out_rule;
 
-            return token;
+                lxb_css_syntax_token_consume(parser->tkz);
 
-        case LXB_CSS_SYNTAX_TOKEN_LS_BRACKET:
-            status = lxb_css_parser_types_push(parser,
-                                               LXB_CSS_SYNTAX_TOKEN_RS_BRACKET);
-            break;
+                rule->phase = lxb_css_syntax_parser_declarations_name;
+                rule->context = out_rule;
 
-        case LXB_CSS_SYNTAX_TOKEN_FUNCTION:
-        case LXB_CSS_SYNTAX_TOKEN_L_PARENTHESIS:
-            status = lxb_css_parser_types_push(parser,
-                                               LXB_CSS_SYNTAX_TOKEN_R_PARENTHESIS);
-            break;
+                break;
+            }
 
-        case LXB_CSS_SYNTAX_TOKEN_LC_BRACKET:
-            status = lxb_css_parser_types_push(parser,
-                                               LXB_CSS_SYNTAX_TOKEN_RC_BRACKET);
-            break;
+            /* Fall through. */
 
-        case LXB_CSS_SYNTAX_TOKEN_RC_BRACKET:
-        case LXB_CSS_SYNTAX_TOKEN_RS_BRACKET:
-        case LXB_CSS_SYNTAX_TOKEN_R_PARENTHESIS:
-            if (rule->deep != 0 && parser->types_pos[-1] == token->type) {
-                parser->types_pos--;
-                rule->deep--;
+        default:
+            if (rule->nested) {
+                rule->phase = lxb_css_syntax_parser_declarations_end;
             }
+            else {
+                rule->phase = lxb_css_syntax_parser_declarations_drop;
+                rule->state = rule->cbx.cb->failed;
+                rule->begin = token->offset;
+                rule->context = NULL;
+                rule->failed = true;
 
-            return token;
-
-        case LXB_CSS_SYNTAX_TOKEN__EOF:
-            goto done;
+                parser->offset.value_end = 0;
 
-        default:
-            return token;
-    }
+                return lxb_css_syntax_token_parser_do_phase_again(parser);
+            }
 
-    if (status != LXB_STATUS_OK) {
-        return lxb_css_syntax_parser_failed(parser, status);
+            break;
     }
 
-    rule->deep++;
-
-    return token;
+    rule->skip_consume = false;
+    rule->important = false;
+    rule->failed = false;
 
-done:
+    return lxb_css_syntax_token_parser_do_phase_again(parser);
+}
 
-    rule->phase = lxb_css_syntax_parser_declarations_end;
-    rule->skip_consume = true;
+/*
+ * This code will be called before rule->state is called.
+ * Exclusively from the lxb_css_parser_run(...).
+ */
+static const lxb_css_syntax_token_t *
+lxb_css_syntax_parser_declaration_back_to_value(lxb_css_parser_t *parser,
+                                                const lxb_css_syntax_token_t *token,
+                                                lxb_css_syntax_rule_t *rule)
+{
+    rule->phase = lxb_css_syntax_parser_declarations_value;
+    rule->state = rule->back_state;
+    rule->skip_consume = false;
 
-    rule->u.declarations.name_end = token->offset;
-    rule->u.declarations.end = token->offset;
+    return token;
+}
 
-    return &lxb_css_syntax_token_terminated;
+static const lxb_css_syntax_token_t *
+lxb_css_syntax_parser_declaration_end(lxb_css_parser_t *parser,
+                                      const lxb_css_syntax_token_t *token,
+                                      lxb_css_syntax_rule_t *rule)
+{
+    return lxb_css_syntax_parser_declaration_end_handler(parser, token,
+                                                         rule, false);
 }
 
 static const lxb_css_syntax_token_t *
-lxb_css_syntax_parser_declarations_end(lxb_css_parser_t *parser,
-                                       const lxb_css_syntax_token_t *token,
-                                       lxb_css_syntax_rule_t *rule)
+lxb_css_syntax_parser_declaration_end_handler(lxb_css_parser_t *parser,
+                                              const lxb_css_syntax_token_t *token,
+                                              lxb_css_syntax_rule_t *rule,
+                                              bool skip_token)
 {
     lxb_status_t status;
-    lxb_css_syntax_rule_t *rules;
 
     if (rule->state != lxb_css_state_success) {
         rule->skip_consume = true;
 
-        return &lxb_css_syntax_token_terminated;
+        return lxb_css_parser_token_end(parser, token->offset);
     }
 
-    status = rule->cbx.declarations->declaration_end(parser, rule->context,
-                                                     rule->important,
-                                                     rule->failed);
+    status = rule->cbx.declarations->end(parser, rule->context_old,
+                                         rule->context, token, &parser->offset,
+                                         rule->important, rule->failed);
     if (status != LXB_STATUS_OK) {
         return lxb_css_syntax_parser_failed(parser, status);
     }
 
+    return lxb_css_syntax_parser_declarations_end_h(parser, token,
+                                                    rule, skip_token);
+}
+
+static const lxb_css_syntax_token_t *
+lxb_css_syntax_parser_declarations_end(lxb_css_parser_t *parser,
+                                       const lxb_css_syntax_token_t *token,
+                                       lxb_css_syntax_rule_t *rule)
+{
+    return lxb_css_syntax_parser_declarations_end_h(parser, token,
+                                                    rule, false);
+}
+
+static const lxb_css_syntax_token_t *
+lxb_css_syntax_parser_declarations_end_h(lxb_css_parser_t *parser,
+                                         const lxb_css_syntax_token_t *token,
+                                         lxb_css_syntax_rule_t *rule,
+                                         bool skip_token)
+{
+    lxb_status_t status;
+
     /* This code will be called exclusively from the lxb_css_parser_run(...). */
 
+    rule->context = rule->context_old;
+
     status = rule->cbx.cb->end(parser, token, rule->context, false);
     if (status != LXB_STATUS_OK) {
         return lxb_css_syntax_parser_failed(parser, status);
     }
 
-    if (!rule->skip_ending) {
+    if (skip_token) {
         lxb_css_syntax_token_consume(parser->tkz);
 
         token = lxb_css_syntax_token(parser->tkz);
@@ -1442,18 +1935,7 @@ lxb_css_syntax_parser_declarations_end(lxb_css_parser_t *parser,
         }
     }
 
-    (void) lxb_css_syntax_parser_stack_pop(parser);
-
-    rules = parser->rules;
-
-    if (parser->rules <= parser->rules_begin) {
-        rules->state = lxb_css_state_stop;
-        return token;
-    }
-
-    rules->phase = rules->back;
-
-    return rules->phase(parser, token, rules);
+    return lxb_css_syntax_parser_call_back(parser, token);
 }
 
 static const lxb_css_syntax_token_t *
@@ -1470,7 +1952,6 @@ lxb_css_syntax_parser_components(lxb_css_parser_t *parser,
     rule->offset = token->offset + lxb_css_syntax_token_base(token)->length;
 
     if (rule->block_end == token->type && rule->deep == 0) {
-        rule->skip_ending = true;
         goto done;
     }
 
@@ -1521,7 +2002,23 @@ lxb_css_syntax_parser_components(lxb_css_parser_t *parser,
     rule->phase = lxb_css_syntax_parser_end;
     rule->skip_consume = true;
 
-    return &lxb_css_syntax_token_terminated;
+    return lxb_css_parser_token_end(parser, token->offset);
+}
+
+/*
+ * This code will be called before rule->state is called.
+ * Exclusively from the lxb_css_parser_run(...).
+ */
+static const lxb_css_syntax_token_t *
+lxb_css_syntax_parser_components_back_to_value(lxb_css_parser_t *parser,
+                                               const lxb_css_syntax_token_t *token,
+                                               lxb_css_syntax_rule_t *rule)
+{
+    rule->phase = lxb_css_syntax_parser_components;
+    rule->state = rule->back_state;
+    rule->skip_consume = false;
+
+    return token;
 }
 
 static const lxb_css_syntax_token_t *
@@ -1555,16 +2052,16 @@ lxb_css_syntax_parser_function(lxb_css_parser_t *parser,
             break;
 
         case LXB_CSS_SYNTAX_TOKEN_R_PARENTHESIS:
-            if (rule->deep != 0) {
-                if (parser->types_pos[-1] == token->type) {
-                    parser->types_pos--;
-                    rule->deep--;
-                }
-            }
-            else {
+            if (rule->deep == 0)  {
+                rule->phase = lxb_css_syntax_parser_end_consume_token;
                 goto done;
             }
 
+            if (parser->types_pos[-1] == token->type) {
+                parser->types_pos--;
+                rule->deep--;
+            }
+
             return token;
 
         case LXB_CSS_SYNTAX_TOKEN_RC_BRACKET:
@@ -1577,6 +2074,7 @@ lxb_css_syntax_parser_function(lxb_css_parser_t *parser,
             return token;
 
         case LXB_CSS_SYNTAX_TOKEN__EOF:
+            rule->phase = lxb_css_syntax_parser_end;
             goto done;
 
         default:
@@ -1593,77 +2091,25 @@ lxb_css_syntax_parser_function(lxb_css_parser_t *parser,
 
 done:
 
-    rule->phase = lxb_css_syntax_parser_end;
     rule->skip_consume = true;
 
-    return &lxb_css_syntax_token_terminated;
+    return lxb_css_parser_token_end(parser, token->offset);
 }
 
+/*
+ * This code will be called before rule->state is called.
+ * Exclusively from the lxb_css_parser_run(...).
+ */
 static const lxb_css_syntax_token_t *
-lxb_css_syntax_parser_block(lxb_css_parser_t *parser,
-                            const lxb_css_syntax_token_t *token,
-                            lxb_css_syntax_rule_t *rule)
+lxb_css_syntax_parser_function_back(lxb_css_parser_t *parser,
+                                    const lxb_css_syntax_token_t *token,
+                                    lxb_css_syntax_rule_t *rule)
 {
-    lxb_status_t status;
-
-    if (rule->offset > token->offset) {
-        return token;
-    }
-
-    rule->offset = token->offset + lxb_css_syntax_token_base(token)->length;
-
-    if (rule->block_end == token->type && rule->deep == 0) {
-        goto done;
-    }
-
-    switch (token->type) {
-        case LXB_CSS_SYNTAX_TOKEN_LS_BRACKET:
-            status = lxb_css_parser_types_push(parser,
-                                               LXB_CSS_SYNTAX_TOKEN_RS_BRACKET);
-            break;
-
-        case LXB_CSS_SYNTAX_TOKEN_FUNCTION:
-        case LXB_CSS_SYNTAX_TOKEN_L_PARENTHESIS:
-            status = lxb_css_parser_types_push(parser,
-                                               LXB_CSS_SYNTAX_TOKEN_R_PARENTHESIS);
-            break;
-
-        case LXB_CSS_SYNTAX_TOKEN_LC_BRACKET:
-            status = lxb_css_parser_types_push(parser,
-                                               LXB_CSS_SYNTAX_TOKEN_RC_BRACKET);
-            break;
-
-        case LXB_CSS_SYNTAX_TOKEN_R_PARENTHESIS:
-        case LXB_CSS_SYNTAX_TOKEN_RS_BRACKET:
-        case LXB_CSS_SYNTAX_TOKEN_RC_BRACKET:
-            if (rule->deep != 0 && parser->types_pos[-1] == token->type) {
-                parser->types_pos--;
-                rule->deep--;
-            }
-
-            return token;
-
-        case LXB_CSS_SYNTAX_TOKEN__EOF:
-            goto done;
-
-        default:
-            return token;
-    }
-
-    if (status != LXB_STATUS_OK) {
-        return lxb_css_syntax_parser_failed(parser, status);
-    }
-
-    rule->deep++;
+    rule->phase = lxb_css_syntax_parser_function;
+    rule->state = rule->back_state;
+    rule->skip_consume = false;
 
     return token;
-
-done:
-
-    rule->phase = lxb_css_syntax_parser_end;
-    rule->skip_consume = true;
-
-    return &lxb_css_syntax_token_terminated;
 }
 
 static const lxb_css_syntax_token_t *
@@ -1677,31 +2123,41 @@ lxb_css_syntax_parser_pipe(lxb_css_parser_t *parser,
         rule->phase = lxb_css_syntax_parser_end;
         rule->skip_consume = true;
 
-        return &lxb_css_syntax_token_terminated;
+        return lxb_css_parser_token_end(parser, token->offset);
     }
 
     return token;
 }
 
-const lxb_css_syntax_token_t *
-lxb_css_syntax_parser_start_block(lxb_css_parser_t *parser,
-                                  const lxb_css_syntax_token_t *token,
-                                  lxb_css_syntax_rule_t *rule)
+/*
+ * This code will be called before rule->state is called.
+ * Exclusively from the lxb_css_parser_run(...).
+ */
+static const lxb_css_syntax_token_t *
+lxb_css_syntax_parser_pipe_back(lxb_css_parser_t *parser,
+                                const lxb_css_syntax_token_t *token,
+                                lxb_css_syntax_rule_t *rule)
 {
-    if (rule->state != lxb_css_state_success) {
-        rule->skip_consume = true;
-
-        return &lxb_css_syntax_token_terminated;
-    }
-
-    /* This code will be called exclusively from the lxb_css_parser_run(...). */
-
+    rule->phase = lxb_css_syntax_parser_pipe;
+    rule->state = rule->back_state;
     rule->skip_consume = false;
 
-    rule->phase = rule->back;
-    rule->state = parser->block;
+    return token;
+}
+
+/*
+ * This code will be called before rule->state is called.
+ * Exclusively from the lxb_css_parser_run(...).
+ */
+static const lxb_css_syntax_token_t *
+lxb_css_syntax_parser_end_back(lxb_css_parser_t *parser,
+                               const lxb_css_syntax_token_t *token,
+                               lxb_css_syntax_rule_t *rule)
+{
+    rule->phase = lxb_css_syntax_parser_end;
+    rule->state = lxb_css_state_blank;
 
-    return rule->back(parser, token, rule);
+    return token;
 }
 
 const lxb_css_syntax_token_t *
@@ -1710,13 +2166,12 @@ lxb_css_syntax_parser_end(lxb_css_parser_t *parser,
                           lxb_css_syntax_rule_t *rule)
 {
     lxb_status_t status;
-    lxb_css_syntax_rule_t *rules;
     lxb_css_syntax_cb_base_t *base;
 
-    if (rule->state != lxb_css_state_success) {
-        rule->skip_consume = true;
+    rule->skip_consume = true;
 
-        return &lxb_css_syntax_token_terminated;
+    if (rule->state != lxb_css_state_success) {
+        return lxb_css_parser_token_end(parser, token->offset);
     }
 
     /* This code will be called exclusively from the lxb_css_parser_run(...). */
@@ -1728,27 +2183,43 @@ lxb_css_syntax_parser_end(lxb_css_parser_t *parser,
         return lxb_css_syntax_parser_failed(parser, status);
     }
 
-    if (!rule->skip_ending) {
-        lxb_css_syntax_token_consume(parser->tkz);
+    rule->skip_consume = false;
 
-        token = lxb_css_syntax_token(parser->tkz);
-        if (token == NULL) {
-            return lxb_css_syntax_parser_failed(parser,
-                                                parser->tkz->status);
-        }
+    return lxb_css_syntax_parser_call_back(parser, token);
+}
+
+const lxb_css_syntax_token_t *
+lxb_css_syntax_parser_end_consume_token(lxb_css_parser_t *parser,
+                                        const lxb_css_syntax_token_t *token,
+                                        lxb_css_syntax_rule_t *rule)
+{
+    lxb_status_t status;
+    lxb_css_syntax_cb_base_t *base;
+
+    rule->skip_consume = true;
+
+    if (rule->state != lxb_css_state_success) {
+        return lxb_css_parser_token_end(parser, token->offset);
     }
 
-    (void) lxb_css_syntax_parser_stack_pop(parser);
+    /* This code will be called exclusively from the lxb_css_parser_run(...). */
 
-    rules = parser->rules;
+    base = rule->cbx.user;
 
-    if (parser->rules <= parser->rules_begin) {
-        rules->state = lxb_css_state_stop;
-        return token;
+    status = base->end(parser, token, rule->context, rule->failed);
+    if (status != LXB_STATUS_OK) {
+        return lxb_css_syntax_parser_failed(parser, status);
     }
 
-    rules->phase = rules->back;
-    rules->state = rule->state_back;
+    rule->skip_consume = false;
+
+    lxb_css_syntax_token_consume(parser->tkz);
+
+    token = lxb_css_syntax_token(parser->tkz);
+    if (token == NULL) {
+        return lxb_css_syntax_parser_failed(parser,
+                                            parser->tkz->status);
+    }
 
-    return rules->phase(parser, token, rules);
+    return lxb_css_syntax_parser_call_back(parser, token);
 }
diff --git a/ext/lexbor/lexbor/css/syntax/parser.h b/ext/lexbor/lexbor/css/syntax/parser.h
index f41d62f1ff87..2e7aff644509 100644
--- a/ext/lexbor/lexbor/css/syntax/parser.h
+++ b/ext/lexbor/lexbor/css/syntax/parser.h
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2020-2025 Alexander Borisov
+ * Copyright (C) 2020-2026 Alexander Borisov
  *
  * Author: Alexander Borisov 
  */
@@ -30,70 +30,63 @@ lxb_css_syntax_parser_consume(lxb_css_parser_t *parser);
 
 LXB_API lxb_css_syntax_rule_t *
 lxb_css_syntax_parser_list_rules_push(lxb_css_parser_t *parser,
-                                      const lxb_css_syntax_token_t *token,
-                                      lxb_css_parser_state_f state_back,
                                       const lxb_css_syntax_cb_list_rules_t *list_rules,
-                                      void *ctx, bool top_level,
-                                      lxb_css_syntax_token_type_t stop);
+                                      lxb_css_parser_state_f back,
+                                      void *ctx, lxb_css_syntax_token_type_t stop);
 
 LXB_API lxb_css_syntax_rule_t *
 lxb_css_syntax_parser_at_rule_push(lxb_css_parser_t *parser,
-                                   const lxb_css_syntax_token_t *token,
-                                   lxb_css_parser_state_f state_back,
                                    const lxb_css_syntax_cb_at_rule_t *at_rule,
-                                   void *ctx, lxb_css_syntax_token_type_t stop);
+                                   lxb_css_parser_state_f back,
+                                   void *ctx, lxb_css_syntax_token_type_t stop,
+                                   bool nested);
 
 LXB_API lxb_css_syntax_rule_t *
 lxb_css_syntax_parser_qualified_push(lxb_css_parser_t *parser,
-                                     const lxb_css_syntax_token_t *token,
-                                     lxb_css_parser_state_f state_back,
                                      const lxb_css_syntax_cb_qualified_rule_t *qualified,
-                                     void *ctx, lxb_css_syntax_token_type_t stop);
+                                     lxb_css_parser_state_f back,
+                                     void *ctx, lxb_css_syntax_token_type_t stop,
+                                     bool nested);
+
+LXB_API lxb_css_syntax_rule_t *
+lxb_css_syntax_parser_block_push(lxb_css_parser_t *parser,
+                                 const lxb_css_syntax_cb_block_t *block,
+                                 lxb_css_parser_state_f back, void *ctx);
 
 LXB_API lxb_css_syntax_rule_t *
 lxb_css_syntax_parser_declarations_push(lxb_css_parser_t *parser,
-                                        const lxb_css_syntax_token_t *token,
-                                        lxb_css_parser_state_f state_back,
-                                        const lxb_css_syntax_cb_declarations_t *declarations,
-                                        void *ctx, lxb_css_syntax_token_type_t stop);
+                                        const lxb_css_syntax_cb_declarations_t *declr,
+                                        lxb_css_parser_state_f back, void *ctx,
+                                        lxb_css_syntax_token_type_t stop,
+                                        bool name_validate, bool nested);
 
 LXB_API lxb_css_syntax_rule_t *
 lxb_css_syntax_parser_components_push(lxb_css_parser_t *parser,
-                                      const lxb_css_syntax_token_t *token,
-                                      lxb_css_parser_state_f state_back,
                                       const lxb_css_syntax_cb_components_t *comp,
+                                      lxb_css_parser_state_f back,
                                       void *ctx, lxb_css_syntax_token_type_t stop);
 
 LXB_API lxb_css_syntax_rule_t *
 lxb_css_syntax_parser_function_push(lxb_css_parser_t *parser,
-                                    const lxb_css_syntax_token_t *token,
-                                    lxb_css_parser_state_f state_back,
                                     const lxb_css_syntax_cb_function_t *func,
-                                    void *ctx);
-
-LXB_API lxb_css_syntax_rule_t *
-lxb_css_syntax_parser_block_push(lxb_css_parser_t *parser,
-                                 const lxb_css_syntax_token_t *token,
-                                 lxb_css_parser_state_f state_back,
-                                 const lxb_css_syntax_cb_block_t *block,
-                                 void *ctx);
+                                    lxb_css_parser_state_f back, void *ctx);
 
 LXB_API lxb_css_syntax_rule_t *
 lxb_css_syntax_parser_pipe_push(lxb_css_parser_t *parser,
-                                lxb_css_parser_state_f state_back,
                                 const lxb_css_syntax_cb_pipe_t *pipe,
-                                void *ctx, lxb_css_syntax_token_type_t stop);
-
-LXB_API const lxb_css_syntax_token_t *
-lxb_css_syntax_parser_start_block(lxb_css_parser_t *parser,
-                                  const lxb_css_syntax_token_t *token,
-                                  lxb_css_syntax_rule_t *rule);
+                                lxb_css_parser_state_f back, void *ctx,
+                                lxb_css_syntax_token_type_t stop);
 
 LXB_API const lxb_css_syntax_token_t *
 lxb_css_syntax_parser_end(lxb_css_parser_t *parser,
                           const lxb_css_syntax_token_t *token,
                           lxb_css_syntax_rule_t *rule);
 
+LXB_API const lxb_css_syntax_token_t *
+lxb_css_syntax_parser_end_consume_token(lxb_css_parser_t *parser,
+                                        const lxb_css_syntax_token_t *token,
+                                        lxb_css_syntax_rule_t *rule);
+
 
 #ifdef __cplusplus
 } /* extern "C" */
diff --git a/ext/lexbor/lexbor/css/syntax/res.h b/ext/lexbor/lexbor/css/syntax/res.h
index cd33446f81d5..7fa2f8ba705f 100644
--- a/ext/lexbor/lexbor/css/syntax/res.h
+++ b/ext/lexbor/lexbor/css/syntax/res.h
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2018-2025 Alexander Borisov
+ * Copyright (C) 2018-2026 Alexander Borisov
  *
  * Author: Alexander Borisov 
  */
@@ -7,12 +7,9 @@
 #ifndef LEXBOR_CSS_SYNTAX_RES_H
 #define LEXBOR_CSS_SYNTAX_RES_H
 
-#ifdef LXB_CSS_SYNTAX_RES_NAME_MAP
-#ifndef LXB_CSS_SYNTAX_RES_NAME_MAP_ENABLED
-#define LXB_CSS_SYNTAX_RES_NAME_MAP_ENABLED
 #define LXB_CSS_SYNTAX_RES_NAME_START 0x01
 
-static const lxb_char_t lxb_css_syntax_res_name_map[256] =
+LXB_API const lxb_char_t lxb_css_syntax_res_name_map[256] =
 {
     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
@@ -42,7 +39,4 @@ static const lxb_char_t lxb_css_syntax_res_name_map[256] =
     0x01, 0x01, 0x01, 0x01, 0x01
 };
 
-#endif /* LXB_CSS_SYNTAX_RES_NAME_MAP_ENABLED */
-#endif /* LXB_CSS_SYNTAX_RES_NAME_MAP */
-
 #endif /* LEXBOR_CSS_SYNTAX_RES_H */
diff --git a/ext/lexbor/lexbor/css/syntax/state.c b/ext/lexbor/lexbor/css/syntax/state.c
index 99cd30c1868f..a93731e11235 100644
--- a/ext/lexbor/lexbor/css/syntax/state.c
+++ b/ext/lexbor/lexbor/css/syntax/state.c
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2018-2025 Alexander Borisov
+ * Copyright (C) 2018-2026 Alexander Borisov
  *
  * Author: Alexander Borisov 
  */
@@ -14,12 +14,11 @@
 #include "lexbor/css/syntax/syntax.h"
 #include "lexbor/css/syntax/tokenizer/error.h"
 
-#define LXB_CSS_SYNTAX_RES_NAME_MAP
 #include "lexbor/css/syntax/res.h"
 
-#define LEXBOR_STR_RES_MAP_HEX
-#include "lexbor/core/str_res.h"
-
+#ifndef LEXBOR_DISABLE_INTERNAL_EXTERN
+    LXB_EXTERN const lxb_char_t lexbor_str_res_map_hex[256];
+#endif
 
 #define LXB_CSS_SYNTAX_ERROR_CODEPOINT 0x1FFFFF
 
@@ -1101,7 +1100,9 @@ lxb_css_syntax_state_consume_numeric(lxb_css_syntax_tokenizer_t *tkz,
 
     /* U+0030 DIGIT ZERO (0) and U+0039 DIGIT NINE (9) */
     do {
-        e_digit = (*data - 0x30) + e_digit * 0x0A;
+        if (e_digit < INT_MAX / 10) {
+            e_digit = (*data - 0x30) + e_digit * 0x0A;
+        }
 
         data += 1;
 
@@ -1523,7 +1524,7 @@ lxb_css_syntax_state_url(lxb_css_syntax_tokenizer_t *tkz,
                 lxb_css_syntax_tokenizer_error_add(tkz->parse_errors, data,
                                         LXB_CSS_SYNTAX_TOKENIZER_ERROR_EOINUR);
 
-                return lxb_css_syntax_state_string_set(tkz, token, data);
+                goto done;
 
             default:
                 if (*data >= 0x80) {
diff --git a/ext/lexbor/lexbor/css/syntax/state_res.h b/ext/lexbor/lexbor/css/syntax/state_res.h
index 2f6e2899fdc0..e98909a5bff4 100644
--- a/ext/lexbor/lexbor/css/syntax/state_res.h
+++ b/ext/lexbor/lexbor/css/syntax/state_res.h
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2018-2025 Alexander Borisov
+ * Copyright (C) 2018-2026 Alexander Borisov
  *
  * Author: Alexander Borisov 
  */
diff --git a/ext/lexbor/lexbor/css/syntax/syntax.c b/ext/lexbor/lexbor/css/syntax/syntax.c
index b148d8a043c1..f8a1e944df23 100644
--- a/ext/lexbor/lexbor/css/syntax/syntax.c
+++ b/ext/lexbor/lexbor/css/syntax/syntax.c
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2018-2023 Alexander Borisov
+ * Copyright (C) 2018-2026 Alexander Borisov
  *
  * Author: Alexander Borisov 
  */
@@ -9,58 +9,315 @@
 
 #include "lexbor/core/str.h"
 
-#define LEXBOR_STR_RES_MAP_HEX
-#define LEXBOR_STR_RES_MAP_HEX_TO_CHAR_LOWERCASE
-#define LEXBOR_STR_RES_CHAR_TO_TWO_HEX_VALUE_LOWERCASE
-#define LEXBOR_STR_RES_ANSI_REPLACEMENT_CHARACTER
-#include "lexbor/core/str_res.h"
+#ifndef LEXBOR_DISABLE_INTERNAL_EXTERN
+    LXB_EXTERN const lxb_char_t lexbor_str_res_ansi_replacement_character[4];
+    LXB_EXTERN const lxb_char_t lexbor_str_res_map_hex[256];
+    LXB_EXTERN const lxb_char_t lexbor_str_res_map_hex_to_char_lowercase[17];
+    LXB_EXTERN const char *lexbor_str_res_char_to_two_hex_value_lowercase[257];
+    LXB_EXTERN const lxb_char_t lxb_css_syntax_res_name_map[256];
+#endif
 
-#define LXB_CSS_SYNTAX_RES_NAME_MAP
-#include "lexbor/css/syntax/res.h"
+static const lexbor_str_t lxb_css_syntax_str_ws = lexbor_str(" ");
 
 
-static const lexbor_str_t lxb_str_ws = lexbor_str(" ");
-
-
-lxb_status_t
+lxb_css_rule_list_t *
 lxb_css_syntax_parse_list_rules(lxb_css_parser_t *parser,
                                 const lxb_css_syntax_cb_list_rules_t *cb,
-                                const lxb_char_t *data, size_t length,
-                                void *ctx, bool top_level)
+                                const lxb_char_t *data, size_t length)
 {
-    lxb_status_t status;
+    lxb_css_rule_list_t *list;
     lxb_css_syntax_rule_t *rule;
 
     if (lxb_css_parser_is_running(parser)) {
         parser->status = LXB_STATUS_ERROR_WRONG_STAGE;
-        return parser->status;
+        return NULL;
     }
 
     lxb_css_parser_clean(parser);
-
     lxb_css_parser_buffer_set(parser, data, length);
 
-    rule = lxb_css_syntax_parser_list_rules_push(parser, NULL, NULL, cb,
-                                                 ctx, top_level,
+    list = lxb_css_rule_list_create(parser->memory);
+    if (list == NULL) {
+        parser->status = LXB_STATUS_ERROR_MEMORY_ALLOCATION;
+        goto failed;
+    }
+
+    rule = lxb_css_syntax_parser_list_rules_push(parser, cb, NULL, list,
                                                  LXB_CSS_SYNTAX_TOKEN_UNDEF);
     if (rule == NULL) {
-        status = parser->status;
-        goto end;
+        goto failed;
+    }
+
+    parser->tkz->with_comment = false;
+    parser->stage = LXB_CSS_PARSER_RUN;
+
+    parser->status = lxb_css_syntax_parser_run(parser);
+    if (parser->status != LXB_STATUS_OK) {
+        goto failed;
+    }
+
+    parser->stage = LXB_CSS_PARSER_END;
+
+    return list;
+
+failed:
+
+    if (list != NULL) {
+        lxb_css_rule_list_destroy(list, true);
+    }
+
+    parser->stage = LXB_CSS_PARSER_END;
+
+    return NULL;
+}
+
+lxb_css_rule_declaration_list_t *
+lxb_css_syntax_parse_declarations(lxb_css_parser_t *parser,
+                                  const lxb_css_syntax_cb_declarations_t *cb,
+                                  const lxb_char_t *data, size_t length)
+{
+    lxb_css_rule_declaration_list_t *list;
+    lxb_css_syntax_rule_t *rule;
+
+    if (lxb_css_parser_is_running(parser)) {
+        parser->status = LXB_STATUS_ERROR_WRONG_STAGE;
+        return NULL;
+    }
+
+    lxb_css_parser_clean(parser);
+    lxb_css_parser_buffer_set(parser, data, length);
+
+    list = lxb_css_rule_declaration_list_create(parser->memory);
+    if (list == NULL) {
+        parser->status = LXB_STATUS_ERROR_MEMORY_ALLOCATION;
+        goto failed;
+    }
+
+    rule = lxb_css_syntax_parser_declarations_push(parser, cb, NULL, list,
+                                                   LXB_CSS_SYNTAX_TOKEN_UNDEF,
+                                                   true, false);
+    if (rule == NULL) {
+        goto failed;
     }
 
     parser->tkz->with_comment = false;
     parser->stage = LXB_CSS_PARSER_RUN;
 
-    status = lxb_css_syntax_parser_run(parser);
-    if (status != LXB_STATUS_OK) {
-        /* Destroy StyleSheet. */
+    parser->status = lxb_css_syntax_parser_run(parser);
+    if (parser->status != LXB_STATUS_OK) {
+        goto failed;
     }
 
-end:
+    parser->stage = LXB_CSS_PARSER_END;
+
+    return list;
+
+failed:
+
+    if (list != NULL) {
+        lxb_css_rule_declaration_list_destroy(list, true);
+    }
 
     parser->stage = LXB_CSS_PARSER_END;
 
-    return status;
+    return NULL;
+}
+
+lxb_css_syntax_rule_t *
+lxb_css_syntax_consume_list_rules(lxb_css_parser_t *parser,
+                                  const lxb_css_syntax_cb_list_rules_t *list_rules,
+                                  lxb_css_parser_state_f back,
+                                  void *ctx, lxb_css_syntax_token_type_t stop)
+{
+    return lxb_css_syntax_parser_list_rules_push(parser, list_rules, back,
+                                                 ctx, stop);
+}
+
+lxb_css_syntax_rule_t *
+lxb_css_syntax_consume_at_rule(lxb_css_parser_t *parser,
+                               const lxb_css_syntax_token_t *token,
+                               const lxb_css_syntax_cb_at_rule_t *at_rule,
+                               lxb_css_parser_state_f back,
+                               void *ctx, lxb_css_syntax_token_type_t stop)
+{
+    if (token->type != LXB_CSS_SYNTAX_TOKEN_AT_KEYWORD) {
+        return NULL;
+    }
+
+    if (parser->rules > parser->rules_begin && parser->rules->deep != 0
+        && parser->types_pos[-1] == LXB_CSS_SYNTAX_TOKEN_R_PARENTHESIS)
+    {
+        parser->types_pos -= 1;
+        parser->rules->deep -= 1;
+    }
+
+    lxb_css_syntax_parser_consume(parser);
+
+    return lxb_css_syntax_parser_at_rule_push(parser, at_rule, back, ctx,
+                                              stop, false);
+}
+
+lxb_css_syntax_rule_t *
+lxb_css_syntax_consume_qualified_rule(lxb_css_parser_t *parser,
+                                      const lxb_css_syntax_token_t *token,
+                                      const lxb_css_syntax_cb_qualified_rule_t *qualified,
+                                      lxb_css_parser_state_f back,
+                                      void *ctx, lxb_css_syntax_token_type_t stop)
+{
+    lxb_css_syntax_token_type_t type;
+
+    if (parser->rules > parser->rules_begin && parser->rules->deep != 0) {
+        switch (token->type) {
+            case LXB_CSS_SYNTAX_TOKEN_LS_BRACKET:
+                type = LXB_CSS_SYNTAX_TOKEN_RS_BRACKET;
+                break;
+
+            case LXB_CSS_SYNTAX_TOKEN_FUNCTION:
+            case LXB_CSS_SYNTAX_TOKEN_L_PARENTHESIS:
+                type = LXB_CSS_SYNTAX_TOKEN_R_PARENTHESIS;
+                break;
+
+            case LXB_CSS_SYNTAX_TOKEN_LC_BRACKET:
+                type = LXB_CSS_SYNTAX_TOKEN_RC_BRACKET;
+                break;
+
+            default:
+                type = LXB_CSS_SYNTAX_TOKEN_UNDEF;
+                break;
+        }
+
+
+        if (parser->types_pos[-1] == type) {
+            parser->types_pos -= 1;
+            parser->rules->deep -= 1;
+        }
+    }
+
+    return lxb_css_syntax_parser_qualified_push(parser, qualified, back,
+                                                ctx, stop, false);
+}
+
+lxb_css_syntax_rule_t *
+lxb_css_syntax_consume_block(lxb_css_parser_t *parser,
+                             const lxb_css_syntax_token_t *token,
+                             const lxb_css_syntax_cb_block_t *block,
+                             lxb_css_parser_state_f back, void *ctx)
+{
+    if (token->type != LXB_CSS_SYNTAX_TOKEN_LC_BRACKET) {
+        return NULL;
+    }
+
+    if (parser->rules > parser->rules_begin && parser->rules->deep != 0
+        && parser->types_pos[-1] == LXB_CSS_SYNTAX_TOKEN_RC_BRACKET)
+    {
+        parser->types_pos -= 1;
+        parser->rules->deep -= 1;
+    }
+
+    lxb_css_syntax_parser_consume(parser);
+
+    return lxb_css_syntax_parser_block_push(parser, block, back, ctx);
+}
+
+lxb_css_syntax_rule_t *
+lxb_css_syntax_consume_declarations(lxb_css_parser_t *parser,
+                                    const lxb_css_syntax_token_t *token,
+                                    const lxb_css_syntax_cb_declarations_t *declr,
+                                    lxb_css_parser_state_f back, void *ctx,
+                                    lxb_css_syntax_token_type_t stop)
+{
+    lxb_css_syntax_token_type_t type;
+
+    if (parser->rules > parser->rules_begin && parser->rules->deep != 0) {
+        switch (token->type) {
+            case LXB_CSS_SYNTAX_TOKEN_LS_BRACKET:
+                type = LXB_CSS_SYNTAX_TOKEN_RS_BRACKET;
+                break;
+
+            case LXB_CSS_SYNTAX_TOKEN_FUNCTION:
+            case LXB_CSS_SYNTAX_TOKEN_L_PARENTHESIS:
+                type = LXB_CSS_SYNTAX_TOKEN_R_PARENTHESIS;
+                break;
+
+            case LXB_CSS_SYNTAX_TOKEN_LC_BRACKET:
+                type = LXB_CSS_SYNTAX_TOKEN_RC_BRACKET;
+                break;
+
+            default:
+                type = LXB_CSS_SYNTAX_TOKEN_UNDEF;
+                break;
+        }
+
+
+        if (parser->types_pos[-1] == type) {
+            parser->types_pos -= 1;
+            parser->rules->deep -= 1;
+        }
+    }
+
+    return lxb_css_syntax_parser_declarations_push(parser, declr, back,
+                                                   ctx, stop, true, false);
+}
+
+lxb_css_syntax_rule_t *
+lxb_css_syntax_consume_components(lxb_css_parser_t *parser,
+                                  const lxb_css_syntax_token_t *token,
+                                  const lxb_css_syntax_cb_components_t *comp,
+                                  lxb_css_parser_state_f back,
+                                  void *ctx, lxb_css_syntax_token_type_t stop)
+{
+    lxb_css_syntax_token_type_t type;
+
+    if (parser->rules > parser->rules_begin && parser->rules->deep != 0) {
+        switch (token->type) {
+            case LXB_CSS_SYNTAX_TOKEN_LS_BRACKET:
+                type = LXB_CSS_SYNTAX_TOKEN_RS_BRACKET;
+                break;
+
+            case LXB_CSS_SYNTAX_TOKEN_FUNCTION:
+            case LXB_CSS_SYNTAX_TOKEN_L_PARENTHESIS:
+                type = LXB_CSS_SYNTAX_TOKEN_R_PARENTHESIS;
+                break;
+
+            case LXB_CSS_SYNTAX_TOKEN_LC_BRACKET:
+                type = LXB_CSS_SYNTAX_TOKEN_RC_BRACKET;
+                break;
+
+            default:
+                type = LXB_CSS_SYNTAX_TOKEN_UNDEF;
+                break;
+        }
+
+
+        if (parser->types_pos[-1] == type) {
+            parser->types_pos -= 1;
+            parser->rules->deep -= 1;
+        }
+    }
+
+    return lxb_css_syntax_parser_components_push(parser, comp, back, ctx, stop);
+}
+
+lxb_css_syntax_rule_t *
+lxb_css_syntax_consume_function(lxb_css_parser_t *parser,
+                                const lxb_css_syntax_token_t *token,
+                                const lxb_css_syntax_cb_function_t *func,
+                                lxb_css_parser_state_f back, void *ctx)
+{
+    if (token->type != LXB_CSS_SYNTAX_TOKEN_FUNCTION) {
+        return NULL;
+    }
+
+    if (parser->rules > parser->rules_begin && parser->rules->deep != 0
+        && parser->types_pos[-1] == LXB_CSS_SYNTAX_TOKEN_R_PARENTHESIS)
+    {
+        parser->types_pos -= 1;
+        parser->rules->deep -= 1;
+    }
+
+    lxb_css_syntax_parser_consume(parser);
+
+    return lxb_css_syntax_parser_function_push(parser, func, back, ctx);
 }
 
 lxb_status_t
@@ -69,22 +326,20 @@ lxb_css_syntax_stack_expand(lxb_css_parser_t *parser, size_t count)
     size_t length, cur_len, size;
     lxb_css_syntax_rule_t *p;
 
-    if ((parser->rules + count) >= parser->rules_end) {
-        cur_len = parser->rules - parser->rules_begin;
+    cur_len = parser->rules - parser->rules_begin;
 
-        length = cur_len + count + 1024;
-        size = length * sizeof(lxb_css_syntax_rule_t);
+    length = cur_len + count + 1024;
+    size = length * sizeof(lxb_css_syntax_rule_t);
 
-        p = lexbor_realloc(parser->rules_begin, size);
-        if (p == NULL) {
-            return LXB_STATUS_ERROR_MEMORY_ALLOCATION;
-        }
-
-        parser->rules_begin = p;
-        parser->rules_end = p + length;
-        parser->rules = p + cur_len;
+    p = lexbor_realloc(parser->rules_begin, size);
+    if (p == NULL) {
+        return LXB_STATUS_ERROR_MEMORY_ALLOCATION;
     }
 
+    parser->rules_begin = p;
+    parser->rules_end = p + length;
+    parser->rules = p + cur_len;
+
     return LXB_STATUS_OK;
 }
 
@@ -166,8 +421,9 @@ lxb_css_syntax_ident_serialize(const lxb_char_t *data, size_t length,
             data = ++p;
 
             if (p < end && lexbor_str_res_map_hex[*p] != 0xff) {
-                lexbor_serialize_write(cb, lxb_str_ws.data,
-                                       lxb_str_ws.length, ctx, status);
+                lexbor_serialize_write(cb, lxb_css_syntax_str_ws.data,
+                                       lxb_css_syntax_str_ws.length,
+                                       ctx, status);
             }
 
             continue;
@@ -231,8 +487,9 @@ lxb_css_syntax_string_serialize(const lxb_char_t *data, size_t length,
                     p++;
 
                     if (p < end && lexbor_str_res_map_hex[*p] != 0xff) {
-                        lexbor_serialize_write(cb, lxb_str_ws.data,
-                                               lxb_str_ws.length, ctx, status);
+                        lexbor_serialize_write(cb, lxb_css_syntax_str_ws.data,
+                                               lxb_css_syntax_str_ws.length,
+                                               ctx, status);
                     }
 
                     data = p;
diff --git a/ext/lexbor/lexbor/css/syntax/syntax.h b/ext/lexbor/lexbor/css/syntax/syntax.h
index 91ed9088f29a..08e9c5c8618d 100644
--- a/ext/lexbor/lexbor/css/syntax/syntax.h
+++ b/ext/lexbor/lexbor/css/syntax/syntax.h
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2022 Alexander Borisov
+ * Copyright (C) 2022-2026 Alexander Borisov
  *
  * Author: Alexander Borisov 
  */
@@ -12,6 +12,7 @@ extern "C" {
 #endif
 
 #include "lexbor/css/syntax/tokenizer.h"
+#include "lexbor/css/syntax/tokenizer.h"
 
 
 typedef struct lxb_css_syntax_rule lxb_css_syntax_rule_t;
@@ -21,124 +22,211 @@ typedef const lxb_css_syntax_token_t *
                           const lxb_css_syntax_token_t *token,
                           lxb_css_syntax_rule_t *rule);
 
-typedef lxb_status_t
-(*lxb_css_syntax_declaration_end_f)(lxb_css_parser_t *parser, void *ctx,
-                                    bool important, bool failed);
+
+typedef struct lxb_css_syntax_cb_base lxb_css_syntax_cb_base_t;
+typedef struct lxb_css_syntax_cb_list_rules lxb_css_syntax_cb_list_rules_t;
+typedef struct lxb_css_syntax_cb_at_rule lxb_css_syntax_cb_at_rule_t;
+typedef struct lxb_css_syntax_cb_qualified_rule lxb_css_syntax_cb_qualified_rule_t;
+typedef struct lxb_css_syntax_cb_block lxb_css_syntax_cb_block_t;
+typedef struct lxb_css_syntax_cb_declarations lxb_css_syntax_cb_declarations_t;
+typedef struct lxb_css_syntax_cb_function lxb_css_syntax_cb_function_t;
+typedef struct lxb_css_syntax_cb_components lxb_css_syntax_cb_components_t;
+typedef struct lxb_css_syntax_cb_pipe lxb_css_syntax_cb_pipe_t;
+
+typedef struct lxb_css_syntax_declaration_offset lxb_css_syntax_declaration_offset_t;
 
 typedef lxb_status_t
 (*lxb_css_syntax_cb_done_f)(lxb_css_parser_t *parser,
                             const lxb_css_syntax_token_t *token,
                             void *ctx, bool failed);
 
-typedef struct {
-    uintptr_t begin;
-    uintptr_t end;
-}
-lxb_css_syntax_list_rules_offset_t;
-
-typedef struct {
-    uintptr_t name;
-    uintptr_t prelude;
-    uintptr_t prelude_end;
-    uintptr_t block;
-    uintptr_t block_end;
-}
-lxb_css_syntax_at_rule_offset_t;
-
-typedef struct {
-    uintptr_t prelude;
-    uintptr_t prelude_end;
-    uintptr_t block;
-    uintptr_t block_end;
-}
-lxb_css_syntax_qualified_offset_t;
-
-typedef struct {
-    uintptr_t begin;
-    uintptr_t end;
-    uintptr_t name_begin;
-    uintptr_t name_end;
-    uintptr_t value_begin;
-    uintptr_t before_important;
-    uintptr_t value_end;
-}
-lxb_css_syntax_declarations_offset_t;
-
-typedef struct {
-    lxb_css_parser_state_f   state;
-    lxb_css_parser_state_f   block;
+typedef const lxb_css_syntax_cb_at_rule_t *
+(*lxb_css_syntax_begin_at_rule_f)(lxb_css_parser_t *parser,
+                                  const lxb_css_syntax_token_t *token,
+                                  void *ctx, void **out_rule);
+
+typedef const lxb_css_syntax_cb_qualified_rule_t *
+(*lxb_css_syntax_begin_qualified_rule_f)(lxb_css_parser_t *parser,
+                                         const lxb_css_syntax_token_t *token,
+                                         void *ctx, void **out_rule);
+
+typedef const lxb_css_syntax_cb_block_t *
+(*lxb_css_syntax_begin_block_f)(lxb_css_parser_t *parser,
+                                const lxb_css_syntax_token_t *token,
+                                void *ctx, void **out_rule);
+
+typedef const lxb_css_syntax_cb_declarations_t *
+(*lxb_css_syntax_begin_declarations_f)(lxb_css_parser_t *parser,
+                                       const lxb_css_syntax_token_t *token,
+                                       void *ctx, void **out_rule);
+typedef lxb_css_parser_state_f
+(*lxb_css_syntax_declaration_name_f)(lxb_css_parser_t *parser,
+                                     const lxb_css_syntax_token_t *token,
+                                     void *ctx, void **out_rule);
+typedef lxb_status_t
+(*lxb_css_syntax_declaration_end_f)(lxb_css_parser_t *parser,
+                                    void *declaration, void *ctx,
+                                    const lxb_css_syntax_token_t *token,
+                                    lxb_css_syntax_declaration_offset_t *offset,
+                                    bool important, bool failed);
+
+struct lxb_css_syntax_cb_base {
     lxb_css_parser_state_f   failed;
     lxb_css_syntax_cb_done_f end;
-}
-lxb_css_syntax_cb_base_t;
+};
 
-typedef lxb_css_syntax_cb_base_t lxb_css_syntax_cb_pipe_t;
-typedef lxb_css_syntax_cb_base_t lxb_css_syntax_cb_block_t;
-typedef lxb_css_syntax_cb_base_t lxb_css_syntax_cb_function_t;
-typedef lxb_css_syntax_cb_base_t lxb_css_syntax_cb_components_t;
-typedef lxb_css_syntax_cb_base_t lxb_css_syntax_cb_at_rule_t;
-typedef lxb_css_syntax_cb_base_t lxb_css_syntax_cb_qualified_rule_t;
+struct lxb_css_syntax_cb_list_rules {
+    lxb_css_syntax_cb_base_t              cb;
+    lxb_css_parser_state_f                next;
+    lxb_css_syntax_begin_at_rule_f        at_rule;
+    lxb_css_syntax_begin_qualified_rule_f qualified_rule;
+};
+
+struct lxb_css_syntax_cb_at_rule {
+    lxb_css_syntax_cb_base_t     cb;
+    lxb_css_parser_state_f       prelude;
+    lxb_css_syntax_cb_done_f     prelude_end;
+    lxb_css_syntax_begin_block_f block;
+};
+
+struct lxb_css_syntax_cb_qualified_rule {
+    lxb_css_syntax_cb_base_t     cb;
+    lxb_css_parser_state_f       prelude;
+    lxb_css_syntax_cb_done_f     prelude_end;
+    lxb_css_syntax_begin_block_f block;
+};
+
+struct lxb_css_syntax_cb_block {
+    lxb_css_syntax_cb_base_t              cb;
+    lxb_css_parser_state_f                next;
+    lxb_css_syntax_begin_at_rule_f        at_rule;
+    lxb_css_syntax_begin_declarations_f   declarations;
+    lxb_css_syntax_begin_qualified_rule_f qualified_rule;
+};
 
-typedef struct {
+struct lxb_css_syntax_cb_declarations {
     lxb_css_syntax_cb_base_t          cb;
-    lxb_css_syntax_declaration_end_f  declaration_end;
-    const lxb_css_syntax_cb_at_rule_t *at_rule;
-}
-lxb_css_syntax_cb_declarations_t;
-
-typedef struct {
-    lxb_css_syntax_cb_base_t                 cb;
-    lxb_css_parser_state_f                   next;
-    const lxb_css_syntax_cb_at_rule_t        *at_rule;
-    const lxb_css_syntax_cb_qualified_rule_t *qualified_rule;
-}
-lxb_css_syntax_cb_list_rules_t;
+    lxb_css_syntax_declaration_name_f name;
+    lxb_css_syntax_declaration_end_f  end;
+};
+
+struct lxb_css_syntax_cb_function {
+    lxb_css_syntax_cb_base_t cb;
+    lxb_css_parser_state_f   value;
+};
+
+struct lxb_css_syntax_cb_components {
+    lxb_css_syntax_cb_base_t cb;
+    lxb_css_parser_state_f   prelude;
+};
+
+struct lxb_css_syntax_cb_pipe {
+    lxb_css_syntax_cb_base_t cb;
+    lxb_css_parser_state_f   prelude;
+};
+
+struct lxb_css_syntax_declaration_offset {
+    size_t value_begin;
+    size_t value_end;
+    size_t important_begin;
+    size_t important_end;
+    size_t end;
+};
 
 struct lxb_css_syntax_rule {
     lxb_css_syntax_state_f       phase;
     lxb_css_parser_state_f       state;
-    lxb_css_parser_state_f       state_back;
+
+    /*
+     * This callback will be called before rule->state is called.
+     * Exclusively from the lxb_css_parser_run(...).
+     */
     lxb_css_syntax_state_f       back;
+    lxb_css_parser_state_f       back_state;
+    void                         *context;
+    void                         *context_old;
+    void                         *returned;
 
     union {
         const lxb_css_syntax_cb_base_t           *cb;
         const lxb_css_syntax_cb_list_rules_t     *list_rules;
         const lxb_css_syntax_cb_at_rule_t        *at_rule;
         const lxb_css_syntax_cb_qualified_rule_t *qualified_rule;
-        const lxb_css_syntax_cb_declarations_t   *declarations;
         const lxb_css_syntax_cb_components_t     *components;
+        const lxb_css_syntax_cb_declarations_t   *declarations;
         const lxb_css_syntax_cb_function_t       *func;
         const lxb_css_syntax_cb_block_t          *block;
         const lxb_css_syntax_cb_pipe_t           *pipe;
         void                                     *user;
     } cbx;
 
-    void                        *context;
-
-    uintptr_t                   offset;
-    size_t                      deep;
-    lxb_css_syntax_token_type_t block_end;
-    bool                        skip_ending;
-    bool                        skip_consume;
-    bool                        important;
-    bool                        failed;
-    bool                        top_level;
-
-    union {
-        lxb_css_syntax_list_rules_offset_t   list_rules;
-        lxb_css_syntax_at_rule_offset_t      at_rule;
-        lxb_css_syntax_qualified_offset_t    qualified;
-        lxb_css_syntax_declarations_offset_t declarations;
-        void                                 *user;
-    } u;
+    size_t                       offset;
+    size_t                       deep;
+    size_t                       begin;
+    lxb_css_syntax_token_type_t  block_end;
+    bool                         nested;
+    bool                         skip_consume;
+    bool                         important;
+    bool                         failed;
 };
 
 
-LXB_API lxb_status_t
+LXB_API lxb_css_rule_list_t *
 lxb_css_syntax_parse_list_rules(lxb_css_parser_t *parser,
                                 const lxb_css_syntax_cb_list_rules_t *cb,
-                                const lxb_char_t *data, size_t length,
-                                void *ctx, bool top_level);
+                                const lxb_char_t *data, size_t length);
+
+LXB_API lxb_css_rule_declaration_list_t *
+lxb_css_syntax_parse_declarations(lxb_css_parser_t *parser,
+                                  const lxb_css_syntax_cb_declarations_t *cb,
+                                  const lxb_char_t *data, size_t length);
+
+LXB_API lxb_css_syntax_rule_t *
+lxb_css_syntax_consume_list_rules(lxb_css_parser_t *parser,
+                                  const lxb_css_syntax_cb_list_rules_t *list_rules,
+                                  lxb_css_parser_state_f back,
+                                  void *ctx, lxb_css_syntax_token_type_t stop);
+
+LXB_API lxb_css_syntax_rule_t *
+lxb_css_syntax_consume_at_rule(lxb_css_parser_t *parser,
+                               const lxb_css_syntax_token_t *token,
+                               const lxb_css_syntax_cb_at_rule_t *at_rule,
+                               lxb_css_parser_state_f back,
+                               void *ctx, lxb_css_syntax_token_type_t stop);
+
+LXB_API lxb_css_syntax_rule_t *
+lxb_css_syntax_consume_qualified_rule(lxb_css_parser_t *parser,
+                                      const lxb_css_syntax_token_t *token,
+                                      const lxb_css_syntax_cb_qualified_rule_t *qualified,
+                                      lxb_css_parser_state_f back,
+                                      void *ctx, lxb_css_syntax_token_type_t stop);
+
+LXB_API lxb_css_syntax_rule_t *
+lxb_css_syntax_consume_block(lxb_css_parser_t *parser,
+                             const lxb_css_syntax_token_t *token,
+                             const lxb_css_syntax_cb_block_t *block,
+                             lxb_css_parser_state_f back, void *ctx);
+
+LXB_API lxb_css_syntax_rule_t *
+lxb_css_syntax_consume_declarations(lxb_css_parser_t *parser,
+                                    const lxb_css_syntax_token_t *token,
+                                    const lxb_css_syntax_cb_declarations_t *declr,
+                                    lxb_css_parser_state_f back, void *ctx,
+                                    lxb_css_syntax_token_type_t stop);
+
+LXB_API lxb_css_syntax_rule_t *
+lxb_css_syntax_consume_components(lxb_css_parser_t *parser,
+                                  const lxb_css_syntax_token_t *token,
+                                  const lxb_css_syntax_cb_components_t *comp,
+                                  lxb_css_parser_state_f back,
+                                  void *ctx, lxb_css_syntax_token_type_t stop);
+
+LXB_API lxb_css_syntax_rule_t *
+lxb_css_syntax_consume_function(lxb_css_parser_t *parser,
+                                const lxb_css_syntax_token_t *token,
+                                const lxb_css_syntax_cb_function_t *func,
+                                lxb_css_parser_state_f back, void *ctx);
+
 
 LXB_API lxb_status_t
 lxb_css_syntax_stack_expand(lxb_css_parser_t *parser, size_t count);
@@ -159,6 +247,7 @@ LXB_API lxb_status_t
 lxb_css_syntax_ident_or_string_serialize(const lxb_char_t *data, size_t length,
                                          lexbor_serialize_cb_f cb, void *ctx);
 
+
 #ifdef __cplusplus
 } /* extern "C" */
 #endif
diff --git a/ext/lexbor/lexbor/css/syntax/token.c b/ext/lexbor/lexbor/css/syntax/token.c
index be1cc7809c43..ff53c4531e8b 100644
--- a/ext/lexbor/lexbor/css/syntax/token.c
+++ b/ext/lexbor/lexbor/css/syntax/token.c
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2018-2025 Alexander Borisov
+ * Copyright (C) 2018-2026 Alexander Borisov
  *
  * Author: Alexander Borisov 
  */
@@ -12,15 +12,12 @@
 #include "lexbor/css/parser.h"
 #include "lexbor/css/syntax/token.h"
 #include "lexbor/css/syntax/state.h"
-#include "lexbor/css/syntax/state_res.h"
-
-#define LXB_CSS_SYNTAX_TOKEN_RES_NAME_SHS_MAP
 #include "lexbor/css/syntax/token_res.h"
 
-#define LEXBOR_STR_RES_MAP_HEX
-#define LEXBOR_STR_RES_ANSI_REPLACEMENT_CHARACTER
-#include "lexbor/core/str_res.h"
-
+#ifndef LEXBOR_DISABLE_INTERNAL_EXTERN
+    LXB_EXTERN const lxb_char_t lexbor_str_res_ansi_replacement_character[4];
+    LXB_EXTERN const lxb_char_t lexbor_str_res_map_hex[256];
+#endif
 
 lxb_css_syntax_token_t *
 lxb_css_syntax_tokenizer_token(lxb_css_syntax_tokenizer_t *tkz);
diff --git a/ext/lexbor/lexbor/css/syntax/token_res.h b/ext/lexbor/lexbor/css/syntax/token_res.h
index 7a8e1c4d2594..d5ee29cf3b22 100644
--- a/ext/lexbor/lexbor/css/syntax/token_res.h
+++ b/ext/lexbor/lexbor/css/syntax/token_res.h
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2018-2025 Alexander Borisov
+ * Copyright (C) 2018-2026 Alexander Borisov
  *
  * Author: Alexander Borisov 
  */
@@ -7,10 +7,6 @@
 #ifndef LEXBOR_CSS_SYNTAX_TOKEN_RES_H
 #define LEXBOR_CSS_SYNTAX_TOKEN_RES_H
 
-
-#ifdef LXB_CSS_SYNTAX_TOKEN_RES_NAME_SHS_MAP
-#ifndef LXB_CSS_SYNTAX_TOKEN_RES_NAME_SHS_MAP_ENABLED
-#define LXB_CSS_SYNTAX_TOKEN_RES_NAME_SHS_MAP_ENABLED
 static const lexbor_shs_entry_t lxb_css_syntax_token_res_name_shs_map[136] =
 {
     {NULL, NULL, 135, 0}, {NULL, NULL, 0, 0},
@@ -83,8 +79,4 @@ static const lexbor_shs_entry_t lxb_css_syntax_token_res_name_shs_map[136] =
     {NULL, NULL, 0, 0}, {"semicolon", (void *) LXB_CSS_SYNTAX_TOKEN_SEMICOLON, 9, 0}
 };
 
-#endif /* LXB_CSS_SYNTAX_TOKEN_RES_NAME_SHS_MAP_ENABLED */
-#endif /* LXB_CSS_SYNTAX_TOKEN_RES_NAME_SHS_MAP */
-
-
 #endif /* LEXBOR_CSS_SYNTAX_TOKEN_RES_H */
diff --git a/ext/lexbor/lexbor/css/syntax/tokenizer.c b/ext/lexbor/lexbor/css/syntax/tokenizer.c
index 9eecac657546..a44b2c7194a6 100644
--- a/ext/lexbor/lexbor/css/syntax/tokenizer.c
+++ b/ext/lexbor/lexbor/css/syntax/tokenizer.c
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2018-2025 Alexander Borisov
+ * Copyright (C) 2018-2026 Alexander Borisov
  *
  * Author: Alexander Borisov 
  */
@@ -12,9 +12,10 @@
 
 #include "lexbor/core/array.h"
 
-#define LEXBOR_STR_RES_MAP_LOWERCASE
-#include "lexbor/core/str_res.h"
 
+#ifndef LEXBOR_DISABLE_INTERNAL_EXTERN
+    LXB_EXTERN const lxb_char_t lexbor_str_res_map_lowercase[256];
+#endif
 
 static const lxb_char_t lxb_css_syntax_tokenizer_important[] = "important";
 
@@ -297,7 +298,7 @@ lxb_css_syntax_tokenizer_lookup_important_ch(lxb_css_syntax_tokenizer_t *tkz,
 {
     static const size_t length = sizeof(lxb_css_syntax_tokenizer_important) - 1;
 
-    if (!(end - p >= length
+    if (!(lxb_size(end - p) >= length
            && lexbor_str_data_ncasecmp(p, lxb_css_syntax_tokenizer_important,
                                        length)))
     {
diff --git a/ext/lexbor/lexbor/css/unit.c b/ext/lexbor/lexbor/css/unit.c
new file mode 100644
index 000000000000..f3cc9c8ef28e
--- /dev/null
+++ b/ext/lexbor/lexbor/css/unit.c
@@ -0,0 +1,113 @@
+/*
+ * Copyright (C) 2021 Alexander Borisov
+ *
+ * Author: Alexander Borisov 
+ */
+
+#include "lexbor/css/css.h"
+#include "lexbor/css/unit/res.h"
+
+
+const lxb_css_data_t *
+lxb_css_unit_absolute_relative_by_name(const lxb_char_t *name, size_t length)
+{
+    const lexbor_shs_entry_t *entry;
+
+    entry = lexbor_shs_entry_get_lower_static(lxb_css_unit_absolute_relative_shs,
+                                              name, length);
+    if (entry == NULL) {
+        return NULL;
+    }
+
+    return entry->value;
+}
+
+const lxb_css_data_t *
+lxb_css_unit_absolute_by_name(const lxb_char_t *name, size_t length)
+{
+    const lexbor_shs_entry_t *entry;
+
+    entry = lexbor_shs_entry_get_lower_static(lxb_css_unit_absolute_shs,
+                                              name, length);
+    if (entry == NULL) {
+        return NULL;
+    }
+
+    return entry->value;
+}
+
+const lxb_css_data_t *
+lxb_css_unit_relative_by_name(const lxb_char_t *name, size_t length)
+{
+    const lexbor_shs_entry_t *entry;
+
+    entry = lexbor_shs_entry_get_lower_static(lxb_css_unit_relative_shs,
+                                              name, length);
+    if (entry == NULL) {
+        return NULL;
+    }
+
+    return entry->value;
+}
+
+const lxb_css_data_t *
+lxb_css_unit_angle_by_name(const lxb_char_t *name, size_t length)
+{
+    const lexbor_shs_entry_t *entry;
+
+    entry = lexbor_shs_entry_get_lower_static(lxb_css_unit_angle_shs,
+                                              name, length);
+    if (entry == NULL) {
+        return NULL;
+    }
+
+    return entry->value;
+}
+
+const lxb_css_data_t *
+lxb_css_unit_frequency_by_name(const lxb_char_t *name, size_t length)
+{
+    const lexbor_shs_entry_t *entry;
+
+    entry = lexbor_shs_entry_get_lower_static(lxb_css_unit_frequency_shs,
+                                              name, length);
+    if (entry == NULL) {
+        return NULL;
+    }
+
+    return entry->value;
+}
+
+const lxb_css_data_t *
+lxb_css_unit_resolution_by_name(const lxb_char_t *name, size_t length)
+{
+    const lexbor_shs_entry_t *entry;
+
+    entry = lexbor_shs_entry_get_lower_static(lxb_css_unit_resolution_shs,
+                                              name, length);
+    if (entry == NULL) {
+        return NULL;
+    }
+
+    return entry->value;
+}
+
+const lxb_css_data_t *
+lxb_css_unit_duration_by_name(const lxb_char_t *name, size_t length)
+{
+    const lexbor_shs_entry_t *entry;
+
+    entry = lexbor_shs_entry_get_lower_static(lxb_css_unit_duration_shs,
+                                              name, length);
+    if (entry == NULL) {
+        return NULL;
+    }
+
+    return entry->value;
+}
+
+const lxb_css_data_t *
+lxb_css_unit_by_id(lxb_css_type_t id)
+{
+    return &lxb_css_unit_data[id];
+}
diff --git a/ext/lexbor/lexbor/css/unit/const.h b/ext/lexbor/lexbor/css/unit/const.h
index 9b7ba1c311b1..9f5e515834e8 100644
--- a/ext/lexbor/lexbor/css/unit/const.h
+++ b/ext/lexbor/lexbor/css/unit/const.h
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2023 Alexander Borisov
+ * Copyright (C) 2026 Alexander Borisov
  *
  * Author: Alexander Borisov 
  */
diff --git a/ext/lexbor/lexbor/css/unit/res.h b/ext/lexbor/lexbor/css/unit/res.h
index 4cca189b6f45..ac24503d1a6f 100644
--- a/ext/lexbor/lexbor/css/unit/res.h
+++ b/ext/lexbor/lexbor/css/unit/res.h
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2023 Alexander Borisov
+ * Copyright (C) 2026 Alexander Borisov
  *
  * Author: Alexander Borisov 
  */
diff --git a/ext/lexbor/lexbor/css/value.c b/ext/lexbor/lexbor/css/value.c
new file mode 100644
index 000000000000..23e2472d625c
--- /dev/null
+++ b/ext/lexbor/lexbor/css/value.c
@@ -0,0 +1,678 @@
+/*
+ * Copyright (C) 2022-2026 Alexander Borisov
+ *
+ * Author: Alexander Borisov 
+ */
+
+#include "lexbor/css/css.h"
+#include "lexbor/css/value/res.h"
+
+#include "lexbor/core/serialize.h"
+#include "lexbor/core/conv.h"
+
+
+#ifndef LEXBOR_DISABLE_INTERNAL_EXTERN
+    LXB_EXTERN const lxb_char_t lexbor_str_res_map_hex_to_char_lowercase[17];
+    LXB_EXTERN const char *lexbor_str_res_char_to_two_hex_value_lowercase[257];
+#endif
+
+static const lexbor_str_t lxb_css_value_str_ws = lexbor_str(" ");
+static const lexbor_str_t lxb_str_comma = lexbor_str(", ");
+static const lexbor_str_t lxb_str_alpha = lexbor_str(" / ");
+static const lexbor_str_t lxb_str_rp = lexbor_str(")");
+
+
+const lxb_css_data_t *
+lxb_css_value_by_id(uintptr_t id)
+{
+    if (id < LXB_CSS_VALUE__LAST_ENTRY) {
+        return &lxb_css_value_data[id];
+    }
+
+    return NULL;
+}
+
+lxb_css_value_type_t
+lxb_css_value_by_name(const lxb_char_t *name, size_t length)
+{
+    const lexbor_shs_entry_t *entry;
+
+    entry = lexbor_shs_entry_get_lower_static(lxb_css_value_shs, name, length);
+    if (entry == NULL) {
+        return LXB_CSS_VALUE__UNDEF;
+    }
+
+    return (lxb_css_value_type_t) (uintptr_t) entry->value;
+}
+
+lxb_status_t
+lxb_css_value_serialize(lxb_css_value_type_t type,
+                        lexbor_serialize_cb_f cb, void *ctx)
+{
+    const lxb_css_data_t *data;
+
+    if (type >= LXB_CSS_VALUE__LAST_ENTRY) {
+        return LXB_STATUS_ERROR_WRONG_ARGS;
+    }
+
+    data = &lxb_css_value_data[type];
+
+    return cb(data->name, data->length, ctx);
+}
+
+lxb_status_t
+lxb_css_value_percentage_sr(const lxb_css_value_percentage_t *percent,
+                               lexbor_serialize_cb_f cb, void *ctx)
+{
+    size_t length;
+    lxb_char_t buf[128];
+    lxb_status_t status;
+
+    static const lexbor_str_t str_per = lexbor_str("%");
+
+    /* FIXME: If length != sizeof(buf)? */
+    length = lexbor_conv_float_to_data(percent->num, buf, sizeof(buf));
+
+    lexbor_serialize_write(cb, buf, length, ctx, status);
+    lexbor_serialize_write(cb, str_per.data, str_per.length, ctx, status);
+
+    return LXB_STATUS_OK;
+}
+
+lxb_status_t
+lxb_css_value_length_sr(const lxb_css_value_length_t *len,
+                        lexbor_serialize_cb_f cb, void *ctx)
+{
+    size_t length;
+    lxb_char_t buf[128];
+    lxb_status_t status;
+    const lxb_css_data_t *unit;
+
+    /* FIXME: If length != sizeof(buf)? */
+    length = lexbor_conv_float_to_data(len->num, buf, sizeof(buf));
+
+    lexbor_serialize_write(cb, buf, length, ctx, status);
+
+    if (len->unit == LXB_CSS_UNIT__UNDEF) {
+        return LXB_STATUS_OK;
+    }
+
+    unit = lxb_css_unit_by_id(len->unit);
+    if (unit == NULL) {
+        return LXB_STATUS_OK;
+    }
+
+    lexbor_serialize_write(cb, unit->name, unit->length, ctx, status);
+
+    return LXB_STATUS_OK;
+}
+
+lxb_status_t
+lxb_css_value_number_sr(const lxb_css_value_number_t *number,
+                        lexbor_serialize_cb_f cb, void *ctx)
+{
+    size_t length;
+    lxb_char_t buf[128];
+    lxb_status_t status;
+
+    /* FIXME: If length != sizeof(buf)? */
+    length = lexbor_conv_float_to_data(number->num, buf, sizeof(buf));
+
+    lexbor_serialize_write(cb, buf, length, ctx, status);
+
+    return LXB_STATUS_OK;
+}
+
+lxb_status_t
+lxb_css_value_integer_sr(const lxb_css_value_integer_t *integer,
+                         lexbor_serialize_cb_f cb, void *ctx)
+{
+    size_t length;
+    lxb_char_t buf[128];
+    lxb_status_t status;
+
+    /* FIXME: If length != sizeof(buf)? */
+    length = lexbor_conv_long_to_data(integer->num, buf, sizeof(buf));
+
+    lexbor_serialize_write(cb, buf, length, ctx, status);
+
+    return LXB_STATUS_OK;
+}
+
+lxb_status_t
+lxb_css_value_length_percentage_sr(const lxb_css_value_length_percentage_t *lp,
+                                   lexbor_serialize_cb_f cb, void *ctx)
+{
+    switch (lp->type) {
+        case LXB_CSS_VALUE__LENGTH:
+        case LXB_CSS_VALUE__NUMBER:
+            return lxb_css_value_length_sr(&lp->u.length, cb, ctx);
+
+        case LXB_CSS_VALUE__PERCENTAGE:
+            return lxb_css_value_percentage_sr(&lp->u.percentage, cb, ctx);
+
+        case LXB_CSS_VALUE__UNDEF:
+            /* FIXME: ???? */
+            break;
+
+        default:
+            return lxb_css_value_serialize(lp->type, cb, ctx);
+    }
+
+    return LXB_STATUS_OK;
+}
+
+lxb_status_t
+lxb_css_value_number_length_sr(const lxb_css_value_number_length_t *nl,
+                               lexbor_serialize_cb_f cb, void *ctx)
+{
+    switch (nl->type) {
+        case LXB_CSS_VALUE__LENGTH:
+        case LXB_CSS_VALUE__NUMBER:
+            return lxb_css_value_length_sr(&nl->u.length, cb, ctx);
+
+        default:
+            return lxb_css_value_serialize(nl->type, cb, ctx);
+    }
+
+    return LXB_STATUS_OK;
+}
+
+lxb_status_t
+lxb_css_value_number_percentage_sr(const lxb_css_value_number_percentage_t *np,
+                                   lexbor_serialize_cb_f cb, void *ctx)
+{
+    switch (np->type) {
+        case LXB_CSS_VALUE__NUMBER:
+            return lxb_css_value_number_sr(&np->u.number, cb, ctx);
+
+        case LXB_CSS_VALUE__PERCENTAGE:
+            return lxb_css_value_percentage_sr(&np->u.percentage, cb, ctx);
+
+        case LXB_CSS_VALUE__UNDEF:
+            /* FIXME: ???? */
+            break;
+
+        default:
+            return lxb_css_value_serialize(np->type, cb, ctx);
+    }
+
+    return LXB_STATUS_OK;
+}
+
+lxb_status_t
+lxb_css_value_length_type_sr(const lxb_css_value_length_type_t *lt,
+                             lexbor_serialize_cb_f cb, void *ctx)
+{
+    switch (lt->type) {
+        case LXB_CSS_VALUE__LENGTH:
+        case LXB_CSS_VALUE__NUMBER:
+            return lxb_css_value_length_sr(<->length, cb, ctx);
+
+        case LXB_CSS_VALUE__UNDEF:
+            /* FIXME: ???? */
+            break;
+
+        default:
+            return lxb_css_value_serialize(lt->type, cb, ctx);
+    }
+
+    return LXB_STATUS_OK;
+}
+
+lxb_status_t
+lxb_css_value_percentage_type_sr(const lxb_css_value_percentage_type_t *pt,
+                                 lexbor_serialize_cb_f cb, void *ctx)
+{
+    switch (pt->type) {
+        case LXB_CSS_VALUE__PERCENTAGE:
+            return lxb_css_value_percentage_sr(&pt->percentage, cb, ctx);
+
+        case LXB_CSS_VALUE__UNDEF:
+            /* FIXME: ???? */
+            break;
+
+        default:
+            return lxb_css_value_serialize(pt->type, cb, ctx);
+    }
+
+    return LXB_STATUS_OK;
+}
+
+lxb_status_t
+lxb_css_value_number_type_sr(const lxb_css_value_number_type_t *num,
+                             lexbor_serialize_cb_f cb, void *ctx)
+{
+    switch (num->type) {
+        case LXB_CSS_VALUE__NUMBER:
+            return lxb_css_value_number_sr(&num->number, cb, ctx);
+
+        default:
+            return lxb_css_value_serialize(num->type, cb, ctx);
+    }
+
+    return LXB_STATUS_OK;
+}
+
+lxb_status_t
+lxb_css_value_integer_type_sr(const lxb_css_value_integer_type_t *num,
+                              lexbor_serialize_cb_f cb, void *ctx)
+{
+    switch (num->type) {
+        case LXB_CSS_VALUE__INTEGER:
+            return lxb_css_value_integer_sr(&num->integer, cb, ctx);
+
+        default:
+            return lxb_css_value_serialize(num->type, cb, ctx);
+    }
+
+    return LXB_STATUS_OK;
+}
+
+lxb_status_t
+lxb_css_value_length_percentage_type_sr(const lxb_css_value_length_percentage_type_t *lpt,
+                                        lexbor_serialize_cb_f cb, void *ctx)
+{
+    switch (lpt->type) {
+        case LXB_CSS_VALUE__LENGTH:
+            return lxb_css_value_length_percentage_sr(&lpt->length, cb, ctx);
+
+        default:
+            return lxb_css_value_serialize(lpt->type, cb, ctx);
+    }
+
+    return LXB_STATUS_OK;
+}
+
+lxb_status_t
+lxb_css_value_number_length_percentage_type_sr(const lxb_css_value_number_length_percentage_t *nlp,
+                                               lexbor_serialize_cb_f cb, void *ctx)
+{
+    switch (nlp->type) {
+        case LXB_CSS_VALUE__NUMBER:
+            return lxb_css_value_number_sr(&nlp->u.number, cb, ctx);
+
+        case LXB_CSS_VALUE__LENGTH:
+            return lxb_css_value_length_sr(&nlp->u.length, cb, ctx);
+
+        case LXB_CSS_VALUE__PERCENTAGE:
+            return lxb_css_value_percentage_sr(&nlp->u.percentage, cb, ctx);
+
+        default:
+            return lxb_css_value_serialize(nlp->type, cb, ctx);
+    }
+
+    return LXB_STATUS_OK;
+}
+
+lxb_status_t
+lxb_css_value_angle_sr(const lxb_css_value_angle_t *angle,
+                       lexbor_serialize_cb_f cb, void *ctx)
+{
+    size_t length;
+    lxb_char_t buf[128];
+    lxb_status_t status;
+    const lxb_css_data_t *data;
+
+    /* FIXME: If length != sizeof(buf)? */
+    length = lexbor_conv_float_to_data(angle->num, buf, sizeof(buf));
+
+    lexbor_serialize_write(cb, buf, length, ctx, status);
+
+    data = lxb_css_unit_by_id(angle->unit);
+
+    return cb(data->name, data->length, ctx);
+}
+
+lxb_status_t
+lxb_css_value_hue_sr(const lxb_css_value_hue_t *hue,
+                     lexbor_serialize_cb_f cb, void *ctx)
+{
+    switch (hue->type) {
+        case LXB_CSS_VALUE__NUMBER:
+            return lxb_css_value_number_sr(&hue->u.number, cb, ctx);
+
+        case LXB_CSS_VALUE__ANGLE:
+            return lxb_css_value_angle_sr(&hue->u.angle, cb, ctx);
+
+        case LXB_CSS_VALUE__UNDEF:
+            /* FIXME: ???? */
+            break;
+
+        default:
+            return lxb_css_value_serialize(hue->type, cb, ctx);
+    }
+
+    return LXB_STATUS_OK;
+}
+
+static lxb_status_t
+lxb_css_value_color_hex_sr(const lxb_css_value_color_hex_t *hex,
+                           lexbor_serialize_cb_f cb, void *ctx)
+{
+    lxb_status_t status;
+    static const lexbor_str_t str_hash = lexbor_str("#");
+    const lxb_css_value_color_hex_rgba_t *rgba = &hex->rgba;
+
+    const lxb_char_t *hmo = lexbor_str_res_map_hex_to_char_lowercase;
+    const char **hmt = lexbor_str_res_char_to_two_hex_value_lowercase;
+
+    lexbor_serialize_write(cb, str_hash.data, str_hash.length, ctx, status);
+
+    switch (hex->type) {
+        case LXB_CSS_PROPERTY_COLOR_HEX_TYPE_3:
+        case LXB_CSS_PROPERTY_COLOR_HEX_TYPE_4:
+            lexbor_serialize_write(cb, &hmo[rgba->r], 1, ctx, status);
+            lexbor_serialize_write(cb, &hmo[rgba->g], 1, ctx, status);
+            lexbor_serialize_write(cb, &hmo[rgba->b], 1, ctx, status);
+
+            if (hex->type == LXB_CSS_PROPERTY_COLOR_HEX_TYPE_4) {
+                lexbor_serialize_write(cb, &hmo[rgba->a], 1, ctx, status);
+            }
+
+            break;
+
+        case LXB_CSS_PROPERTY_COLOR_HEX_TYPE_6:
+        case LXB_CSS_PROPERTY_COLOR_HEX_TYPE_8:
+            lexbor_serialize_write(cb, hmt[rgba->r], 2, ctx, status);
+            lexbor_serialize_write(cb, hmt[rgba->g], 2, ctx, status);
+            lexbor_serialize_write(cb, hmt[rgba->b], 2, ctx, status);
+
+            if (hex->type == LXB_CSS_PROPERTY_COLOR_HEX_TYPE_8) {
+                lexbor_serialize_write(cb, hmt[rgba->a], 2, ctx, status);
+            }
+
+            break;
+
+        default:
+            break;
+    }
+
+    return LXB_STATUS_OK;
+}
+
+static lxb_status_t
+lxb_css_value_color_rgb_sr(const lxb_css_value_color_rgba_t *rgb,
+                           lexbor_serialize_cb_f cb, void *ctx,
+                           lxb_css_value_type_t type)
+{
+    lxb_status_t status;
+    const lexbor_str_t *sep;
+    static const lexbor_str_t str_rgb = lexbor_str("rgb(");
+    static const lexbor_str_t str_rgba = lexbor_str("rgba(");
+
+    if (type == LXB_CSS_COLOR_RGB) {
+        lexbor_serialize_write(cb, str_rgb.data, str_rgb.length, ctx, status);
+    }
+    else {
+        lexbor_serialize_write(cb, str_rgba.data, str_rgba.length, ctx, status);
+    }
+
+    sep = (rgb->old) ? &lxb_str_comma : &lxb_css_value_str_ws;
+
+    status = lxb_css_value_number_percentage_sr(&rgb->r, cb, ctx);
+    if (status != LXB_STATUS_OK) {
+        return status;
+    }
+
+    lexbor_serialize_write(cb, sep->data, sep->length, ctx, status);
+
+    status = lxb_css_value_number_percentage_sr(&rgb->g, cb, ctx);
+    if (status != LXB_STATUS_OK) {
+        return status;
+    }
+
+    lexbor_serialize_write(cb, sep->data, sep->length, ctx, status);
+
+    status = lxb_css_value_number_percentage_sr(&rgb->b, cb, ctx);
+    if (status != LXB_STATUS_OK) {
+        return status;
+    }
+
+    if (rgb->a.type == LXB_CSS_VALUE__UNDEF) {
+        return cb(lxb_str_rp.data, lxb_str_rp.length, ctx);
+    }
+
+    sep = (rgb->old) ? &lxb_str_comma : &lxb_str_alpha;
+
+    lexbor_serialize_write(cb, sep->data, sep->length, ctx, status);
+
+    status = lxb_css_value_number_percentage_sr(&rgb->a, cb, ctx);
+    if (status != LXB_STATUS_OK) {
+        return status;
+    }
+
+    return cb(lxb_str_rp.data, lxb_str_rp.length, ctx);
+}
+
+static lxb_status_t
+lxb_css_value_color_hsl_sr(const lxb_css_value_color_hsla_t *hsl,
+                           lexbor_serialize_cb_f cb, void *ctx,
+                           lxb_css_value_type_t type)
+{
+    lxb_status_t status;
+    const lexbor_str_t *sep;
+    static const lexbor_str_t str_hsl = lexbor_str("hsl(");
+    static const lexbor_str_t str_hsla = lexbor_str("hsla(");
+    static const lexbor_str_t str_hwb = lexbor_str("hwb(");
+
+    switch (type) {
+        case LXB_CSS_COLOR_HSL:
+            status = cb(str_hsl.data, str_hsl.length, ctx);
+            break;
+
+        case LXB_CSS_COLOR_HSLA:
+            status = cb(str_hsla.data, str_hsla.length, ctx);
+            break;
+
+        case LXB_CSS_COLOR_HWB:
+            status = cb(str_hwb.data, str_hwb.length, ctx);
+            break;
+
+        default:
+            return LXB_STATUS_ERROR_WRONG_ARGS;
+    }
+
+    if (status != LXB_STATUS_OK) {
+        return status;
+    }
+
+    sep = (hsl->old) ? &lxb_str_comma : &lxb_css_value_str_ws;
+
+    status = lxb_css_value_hue_sr(&hsl->h, cb, ctx);
+    if (status != LXB_STATUS_OK) {
+        return status;
+    }
+
+    lexbor_serialize_write(cb, sep->data, sep->length, ctx, status);
+
+    status = lxb_css_value_percentage_type_sr(&hsl->s, cb, ctx);
+    if (status != LXB_STATUS_OK) {
+        return status;
+    }
+
+    lexbor_serialize_write(cb, sep->data, sep->length, ctx, status);
+
+    status = lxb_css_value_percentage_type_sr(&hsl->l, cb, ctx);
+    if (status != LXB_STATUS_OK) {
+        return status;
+    }
+
+    if (hsl->a.type == LXB_CSS_VALUE__UNDEF) {
+        return cb(lxb_str_rp.data, lxb_str_rp.length, ctx);
+    }
+
+    sep = (hsl->old) ? &lxb_str_comma : &lxb_str_alpha;
+
+    lexbor_serialize_write(cb, sep->data, sep->length, ctx, status);
+
+    status = lxb_css_value_number_percentage_sr(&hsl->a, cb, ctx);
+    if (status != LXB_STATUS_OK) {
+        return status;
+    }
+
+    return cb(lxb_str_rp.data, lxb_str_rp.length, ctx);
+}
+
+static lxb_status_t
+lxb_css_value_color_lab_sr(const lxb_css_value_color_lab_t *lab,
+                           lexbor_serialize_cb_f cb, void *ctx,
+                           lxb_css_value_type_t type)
+{
+    lxb_status_t status;
+    static const lexbor_str_t str_lab = lexbor_str("lab(");
+    static const lexbor_str_t str_oklab = lexbor_str("oklab(");
+
+    switch (type) {
+        case LXB_CSS_COLOR_LAB:
+            status = cb(str_lab.data, str_lab.length, ctx);
+            break;
+
+        case LXB_CSS_COLOR_OKLAB:
+            status = cb(str_oklab.data, str_oklab.length, ctx);
+            break;
+
+        default:
+            return LXB_STATUS_ERROR_WRONG_ARGS;
+    }
+
+    if (status != LXB_STATUS_OK) {
+        return status;
+    }
+
+    status = lxb_css_value_number_percentage_sr(&lab->l, cb, ctx);
+    if (status != LXB_STATUS_OK) {
+        return status;
+    }
+
+    lexbor_serialize_write(cb, lxb_css_value_str_ws.data,
+                           lxb_css_value_str_ws.length, ctx, status);
+
+    status = lxb_css_value_number_percentage_sr(&lab->a, cb, ctx);
+    if (status != LXB_STATUS_OK) {
+        return status;
+    }
+
+    lexbor_serialize_write(cb, lxb_css_value_str_ws.data,
+                           lxb_css_value_str_ws.length, ctx, status);
+
+    status = lxb_css_value_number_percentage_sr(&lab->b, cb, ctx);
+    if (status != LXB_STATUS_OK) {
+        return status;
+    }
+
+    if (lab->alpha.type == LXB_CSS_VALUE__UNDEF) {
+        return cb(lxb_str_rp.data, lxb_str_rp.length, ctx);
+    }
+
+    lexbor_serialize_write(cb, lxb_str_alpha.data, lxb_str_alpha.length,
+                           ctx, status);
+
+    status = lxb_css_value_number_percentage_sr(&lab->alpha, cb, ctx);
+    if (status != LXB_STATUS_OK) {
+        return status;
+    }
+
+    return cb(lxb_str_rp.data, lxb_str_rp.length, ctx);
+}
+
+static lxb_status_t
+lxb_css_value_color_lch_sr(const lxb_css_value_color_lch_t *lch,
+                           lexbor_serialize_cb_f cb, void *ctx,
+                           lxb_css_value_type_t type)
+{
+    lxb_status_t status;
+    static const lexbor_str_t str_lch = lexbor_str("lch(");
+    static const lexbor_str_t str_oklch = lexbor_str("oklch(");
+
+    switch (type) {
+        case LXB_CSS_COLOR_LCH:
+            status = cb(str_lch.data, str_lch.length, ctx);
+            break;
+
+        case LXB_CSS_COLOR_OKLCH:
+            status = cb(str_oklch.data, str_oklch.length, ctx);
+            break;
+
+        default:
+            return LXB_STATUS_ERROR_WRONG_ARGS;
+    }
+
+    if (status != LXB_STATUS_OK) {
+        return status;
+    }
+
+    status = lxb_css_value_number_percentage_sr(&lch->l, cb, ctx);
+    if (status != LXB_STATUS_OK) {
+        return status;
+    }
+
+    lexbor_serialize_write(cb, lxb_css_value_str_ws.data,
+                           lxb_css_value_str_ws.length, ctx, status);
+
+    status = lxb_css_value_number_percentage_sr(&lch->c, cb, ctx);
+    if (status != LXB_STATUS_OK) {
+        return status;
+    }
+
+    lexbor_serialize_write(cb, lxb_css_value_str_ws.data,
+                           lxb_css_value_str_ws.length, ctx, status);
+
+    status = lxb_css_value_hue_sr(&lch->h, cb, ctx);
+    if (status != LXB_STATUS_OK) {
+        return status;
+    }
+
+    if (lch->a.type == LXB_CSS_VALUE__UNDEF) {
+        return cb(lxb_str_rp.data, lxb_str_rp.length, ctx);
+    }
+
+    lexbor_serialize_write(cb, lxb_str_alpha.data, lxb_str_alpha.length,
+                           ctx, status);
+
+    status = lxb_css_value_number_percentage_sr(&lch->a, cb, ctx);
+    if (status != LXB_STATUS_OK) {
+        return status;
+    }
+
+    return cb(lxb_str_rp.data, lxb_str_rp.length, ctx);
+}
+
+lxb_status_t
+lxb_css_value_color_serialize(const lxb_css_value_color_t *color,
+                              lexbor_serialize_cb_f cb, void *ctx)
+{
+    switch (color->type) {
+        case LXB_CSS_COLOR_HEX:
+            return lxb_css_value_color_hex_sr(&color->u.hex, cb, ctx);
+
+        case LXB_CSS_COLOR_RGB:
+        case LXB_CSS_COLOR_RGBA:
+            return lxb_css_value_color_rgb_sr(&color->u.rgb, cb, ctx,
+                                              color->type);
+
+        case LXB_CSS_COLOR_HSL:
+        case LXB_CSS_COLOR_HSLA:
+        case LXB_CSS_COLOR_HWB:
+            return lxb_css_value_color_hsl_sr(&color->u.hsl, cb, ctx,
+                                              color->type);
+
+        case LXB_CSS_COLOR_LAB:
+        case LXB_CSS_COLOR_OKLAB:
+            return lxb_css_value_color_lab_sr(&color->u.lab, cb, ctx,
+                                              color->type);
+
+        case LXB_CSS_COLOR_LCH:
+        case LXB_CSS_COLOR_OKLCH:
+            return lxb_css_value_color_lch_sr(&color->u.lch, cb, ctx,
+                                              color->type);
+
+        case LXB_CSS_VALUE__UNDEF:
+            break;
+
+        default:
+            return lxb_css_value_serialize(color->type, cb, ctx);
+    }
+
+    return LXB_STATUS_OK;
+}
diff --git a/ext/lexbor/lexbor/css/value/const.h b/ext/lexbor/lexbor/css/value/const.h
index c9b5241e1d73..a7bd64c60349 100644
--- a/ext/lexbor/lexbor/css/value/const.h
+++ b/ext/lexbor/lexbor/css/value/const.h
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2023 Alexander Borisov
+ * Copyright (C) 2026 Alexander Borisov
  *
  * Author: Alexander Borisov 
  */
diff --git a/ext/lexbor/lexbor/css/value/res.h b/ext/lexbor/lexbor/css/value/res.h
index 79b3c6b0322f..180dc95f10e9 100644
--- a/ext/lexbor/lexbor/css/value/res.h
+++ b/ext/lexbor/lexbor/css/value/res.h
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2023 Alexander Borisov
+ * Copyright (C) 2026 Alexander Borisov
  *
  * Author: Alexander Borisov 
  */
diff --git a/ext/lexbor/lexbor/dom/base.h b/ext/lexbor/lexbor/dom/base.h
index 167e43d7691c..3894aa13ca6c 100644
--- a/ext/lexbor/lexbor/dom/base.h
+++ b/ext/lexbor/lexbor/dom/base.h
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2019-2024 Alexander Borisov
+ * Copyright (C) 2019-2026 Alexander Borisov
  *
  * Author: Alexander Borisov 
  */
@@ -15,8 +15,8 @@ extern "C" {
 #include "lexbor/core/base.h"
 
 
-#define LXB_DOM_VERSION_MAJOR 1
-#define LXB_DOM_VERSION_MINOR 8
+#define LXB_DOM_VERSION_MAJOR 2
+#define LXB_DOM_VERSION_MINOR 0
 #define LXB_DOM_VERSION_PATCH 0
 
 #define LXB_DOM_VERSION_STRING                                                 \
diff --git a/ext/lexbor/lexbor/dom/exception.c b/ext/lexbor/lexbor/dom/exception.c
index 44fcf65d6b4e..5433ce42aac6 100644
--- a/ext/lexbor/lexbor/dom/exception.c
+++ b/ext/lexbor/lexbor/dom/exception.c
@@ -1,18 +1,372 @@
 /*
- * Copyright (C) 2018 Alexander Borisov
+ * Copyright (C) 2018-2025 Alexander Borisov
  *
  * Author: Alexander Borisov 
  */
 
 #include "lexbor/dom/exception.h"
+#include "lexbor/dom/interfaces/document.h"
 
 
-/*
- * No inline functions for ABI.
- */
-void *
-lxb_dom_exception_code_ref_set_noi(lxb_dom_exception_code_t *var,
-                                   lxb_dom_exception_code_t code)
+typedef struct {
+    lexbor_str_t name;
+    lexbor_str_t message;
+}
+lxb_dom_exception_data_t;
+
+
+static const lxb_dom_exception_data_t lxb_dom_exception_data[LXB_DOM_EXCEPTION__LAST_ENTRY] =
+{
+    {
+        lexbor_str("Error"),
+        lexbor_str("")
+    },
+    {
+        lexbor_str("IndexSizeError"),
+        lexbor_str("Deprecated. Use RangeError instead.")
+    },
+    {
+        lexbor_str("DOMStringSizeError"),
+        lexbor_str("")
+    },
+    {
+        lexbor_str("HierarchyRequestError"),
+        lexbor_str("The operation would yield an incorrect node tree.")
+    },
+    {
+        lexbor_str("WrongDocumentError"),
+        lexbor_str("The object is in the wrong document.")
+    },
+    {
+        lexbor_str("InvalidCharacterError"),
+        lexbor_str("The string contains invalid characters.")
+    },
+    {
+        lexbor_str("NoDataAllowedError"),
+        lexbor_str("")
+    },
+    {
+        lexbor_str("NoModificationAllowedError"),
+        lexbor_str("The object can not be modified.")
+    },
+    {
+        lexbor_str("NotFoundError"),
+        lexbor_str("The object can not be found here.")
+    },
+    {
+        lexbor_str("NotSupportedError"),
+        lexbor_str("The operation is not supported.")
+    },
+    {
+        lexbor_str("InUseAttributeError"),
+        lexbor_str("The attribute is in use by another element.")
+    },
+    {
+        lexbor_str("InvalidStateError"),
+        lexbor_str("The object is in an invalid state.")
+    },
+    {
+        lexbor_str("SyntaxError"),
+        lexbor_str("The string did not match the expected pattern.")
+    },
+    {
+        lexbor_str("InvalidModificationError"),
+        lexbor_str("The object can not be modified in this way.")
+    },
+    {
+        lexbor_str("NamespaceError"),
+        lexbor_str("The operation is not allowed by Namespaces in XML.")
+    },
+    {
+        lexbor_str("InvalidAccessError"),
+        lexbor_str("Deprecated. Use TypeError for invalid arguments, "
+                   "\"NotSupportedError\" DOMException for unsupported operations, "
+                   "and \"NotAllowedError\" DOMException for denied requests instead.")
+    },
+    {
+        lexbor_str("ValidationError"),
+        lexbor_str("")
+    },
+    {
+        lexbor_str("TypeMismatchError"),
+        lexbor_str("Deprecated. Use TypeError instead.")
+    },
+    {
+        lexbor_str("SecurityError"),
+        lexbor_str("The operation is insecure.")
+    },
+    {
+        lexbor_str("NetworkError"),
+        lexbor_str("A network error occurred.")
+    },
+    {
+        lexbor_str("AbortError"),
+        lexbor_str("The operation was aborted.")
+    },
+    {
+        lexbor_str("URLMismatchError"),
+        lexbor_str("Deprecated.")
+    },
+    {
+        lexbor_str("QuotaExceededError"),
+        lexbor_str("Deprecated. Use the QuotaExceededError DOMException-derived "
+                   "interface instead.")
+    },
+    {
+        lexbor_str("TimeoutError"),
+        lexbor_str("The operation timed out.")
+    },
+    {
+        lexbor_str("InvalidNodeTypeError"),
+        lexbor_str("The supplied node is incorrect or has an incorrect ancestor "
+                   "for this operation.")
+    },
+    {
+        lexbor_str("DataCloneError"),
+        lexbor_str("The object can not be cloned.")
+    },
+    {
+        lexbor_str("EncodingError"),
+        lexbor_str("The encoding operation (either encoded or decoding) failed.")
+    },
+    {
+        lexbor_str("NotReadableError"),
+        lexbor_str("The I/O read operation failed.")
+    },
+    {
+        lexbor_str("UnknownError"),
+        lexbor_str("The operation failed for an unknown transient reason "
+                   "(e.g. out of memory).")
+    },
+    {
+        lexbor_str("ConstraintError"),
+        lexbor_str("A mutation operation in a transaction failed because a "
+                   "constraint was not satisfied.")
+    },
+    {
+        lexbor_str("DataError"),
+        lexbor_str("Provided data is inadequate.")
+    },
+    {
+        lexbor_str("TransactionInactiveError"),
+        lexbor_str("A request was placed against a transaction which is currently"
+                   " not active, or which is finished.")
+    },
+    {
+        lexbor_str("ReadOnlyError"),
+        lexbor_str("The mutating operation was attempted in a \"readonly\" transaction.")
+    },
+    {
+        lexbor_str("VersionError"),
+        lexbor_str("An attempt was made to open a database using a lower version"
+                   " than the existing version.")
+    },
+    {
+        lexbor_str("OperationError"),
+        lexbor_str("The operation failed for an operation-specific reason.")
+    },
+    {
+        lexbor_str("NotAllowedError"),
+        lexbor_str("The request is not allowed by the user agent or the platform"
+                   " in the current context, possibly because the user denied permission.")
+    },
+    {
+        lexbor_str("OptOutError"),
+        lexbor_str("The user opted out of the process.")
+    }
+};
+
+
+lxb_dom_exception_t *
+lxb_dom_exception_create(lxb_dom_document_t *document,
+                         const lxb_char_t *message, size_t message_length,
+                         const lxb_char_t *name, size_t name_length)
+{
+    lexbor_str_t *str;
+    const lxb_dom_exception_data_t *data;
+    lxb_dom_exception_t *exception;
+
+    exception = lexbor_mraw_alloc(document->mraw, sizeof(lxb_dom_exception_t));
+    if (exception == NULL) {
+        return NULL;
+    }
+
+    exception->document = document;
+
+    if (name != NULL && name_length > 0) {
+        exception->code = lxb_dom_exception_code_by_name(name, name_length);
+    }
+    else {
+        exception->code = LXB_DOM_EXCEPTION_ERR;
+    }
+
+    /* Message. */
+
+    if (message == NULL || message_length == 0) {
+        data = &lxb_dom_exception_data[exception->code];
+        exception->message = *((lexbor_str_t *) &data->message);
+    }
+    else {
+        str = &exception->message;
+        str->data = lexbor_mraw_alloc(document->mraw, message_length + 1);
+        if (str->data == NULL) {
+            goto failed;
+        }
+
+        memcpy(str->data, message, message_length);
+
+        str->data[message_length] = '\0';
+        str->length = message_length;
+    }
+
+    /* Name. */
+
+    if (exception->code != LXB_DOM_EXCEPTION_ERR
+        || name == NULL || name_length == 0)
+    {
+        data = &lxb_dom_exception_data[exception->code];
+        exception->name = *((lexbor_str_t *) &data->name);
+    }
+    else {
+        str = &exception->name;
+        str->data = lexbor_mraw_alloc(document->mraw, name_length + 1);
+        if (str->data == NULL) {
+            if (exception->message.length != 0) {
+                lexbor_mraw_free(document->mraw, exception->message.data);
+            }
+
+            goto failed;
+        }
+
+        memcpy(str->data, name, name_length);
+
+        str->data[name_length] = '\0';
+        str->length = name_length;
+    }
+
+    return exception;
+
+failed:
+
+    lexbor_mraw_free(document->mraw, exception);
+
+    return NULL;
+}
+
+lxb_dom_exception_t *
+lxb_dom_exception_create_by_code(lxb_dom_document_t *document,
+                                 const lxb_char_t *message, size_t length,
+                                 lxb_dom_exception_code_t code)
 {
-    return lxb_dom_exception_code_ref_set(var, code);
+    lexbor_str_t *str;
+    const lxb_dom_exception_data_t *data;
+    lxb_dom_exception_t *exception;
+
+    if (code <= LXB_DOM_EXCEPTION_OK || code >= LXB_DOM_EXCEPTION__LAST_ENTRY) {
+        return NULL;
+    }
+
+    exception = lexbor_mraw_alloc(document->mraw, sizeof(lxb_dom_exception_t));
+    if (exception == NULL) {
+        return NULL;
+    }
+
+    exception->document = document;
+    exception->code = code;
+
+    data = &lxb_dom_exception_data[code];
+
+    /* Message. */
+
+    if (message == NULL || length == 0) {
+        exception->message = *((lexbor_str_t *) &data->message);
+    }
+    else {
+        str = &exception->message;
+        str->data = lexbor_mraw_alloc(document->mraw, length + 1);
+        if (str->data == NULL) {
+            goto failed;
+        }
+
+        memcpy(str->data, message, length);
+
+        str->data[length] = '\0';
+        str->length = length;
+    }
+
+    /* Name. */
+
+    exception->name = *((lexbor_str_t *) &data->name);
+
+    return exception;
+
+failed:
+
+    lexbor_mraw_free(document->mraw, exception);
+
+    return NULL;
+}
+
+lxb_dom_exception_t *
+lxb_dom_exception_destroy(lxb_dom_exception_t *exception)
+{
+    const lxb_dom_exception_data_t *data;
+    lxb_dom_document_t *document = exception->document;
+
+    data = &lxb_dom_exception_data[exception->code];
+
+    if (exception->message.data != NULL
+        && exception->message.data != data->message.data)
+    {
+        lexbor_mraw_free(document->mraw, exception->message.data);
+    }
+
+    if (exception->name.data != NULL
+        && exception->name.data != data->name.data)
+    {
+        lexbor_mraw_free(document->mraw, exception->name.data);
+    }
+
+    lexbor_mraw_free(document->mraw, exception);
+
+    return NULL;
+}
+
+const lexbor_str_t *
+lxb_dom_exception_message_by_code(lxb_dom_exception_code_t code)
+{
+    if (code <= LXB_DOM_EXCEPTION_OK || code >= LXB_DOM_EXCEPTION__LAST_ENTRY) {
+        return NULL;
+    }
+
+    return &lxb_dom_exception_data[code].message;
+}
+
+const lexbor_str_t *
+lxb_dom_exception_name_by_code(lxb_dom_exception_code_t code)
+{
+    if (code <= LXB_DOM_EXCEPTION_OK || code >= LXB_DOM_EXCEPTION__LAST_ENTRY) {
+        return NULL;
+    }
+
+    return &lxb_dom_exception_data[code].name;
+}
+
+lxb_dom_exception_code_t
+lxb_dom_exception_code_by_name(const lxb_char_t *name, size_t length)
+{
+    const lexbor_str_t *str;
+    lxb_dom_exception_code_t code;
+
+    for (code = 0; code < LXB_DOM_EXCEPTION__LAST_ENTRY; code++) {
+        str = &lxb_dom_exception_data[code].name;
+
+        if (length == str->length
+            && lexbor_str_data_ncasecmp(str->data, name, length))
+        {
+            return code;
+        }
+    }
+
+    return LXB_DOM_EXCEPTION_ERR;
 }
diff --git a/ext/lexbor/lexbor/dom/exception.h b/ext/lexbor/lexbor/dom/exception.h
index 47a7cfee040c..b306ed1443a3 100644
--- a/ext/lexbor/lexbor/dom/exception.h
+++ b/ext/lexbor/lexbor/dom/exception.h
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2018 Alexander Borisov
+ * Copyright (C) 2018-2025 Alexander Borisov
  *
  * Author: Alexander Borisov 
  */
@@ -12,58 +12,84 @@ extern "C" {
 #endif
 
 #include "lexbor/core/base.h"
+#include "lexbor/core/str.h"
+#include "lexbor/dom/interface.h"
 
 
 typedef enum {
-    LXB_DOM_INDEX_SIZE_ERR = 0x00,
-    LXB_DOM_DOMSTRING_SIZE_ERR,
-    LXB_DOM_HIERARCHY_REQUEST_ERR,
-    LXB_DOM_WRONG_DOCUMENT_ERR,
-    LXB_DOM_INVALID_CHARACTER_ERR,
-    LXB_DOM_NO_DATA_ALLOWED_ERR,
-    LXB_DOM_NO_MODIFICATION_ALLOWED_ERR,
-    LXB_DOM_NOT_FOUND_ERR,
-    LXB_DOM_NOT_SUPPORTED_ERR,
-    LXB_DOM_INUSE_ATTRIBUTE_ERR,
-    LXB_DOM_INVALID_STATE_ERR,
-    LXB_DOM_SYNTAX_ERR,
-    LXB_DOM_INVALID_MODIFICATION_ERR,
-    LXB_DOM_NAMESPACE_ERR,
-    LXB_DOM_INVALID_ACCESS_ERR,
-    LXB_DOM_VALIDATION_ERR,
-    LXB_DOM_TYPE_MISMATCH_ERR,
-    LXB_DOM_SECURITY_ERR,
-    LXB_DOM_NETWORK_ERR,
-    LXB_DOM_ABORT_ERR,
-    LXB_DOM_URL_MISMATCH_ERR,
-    LXB_DOM_QUOTA_EXCEEDED_ERR,
-    LXB_DOM_TIMEOUT_ERR,
-    LXB_DOM_INVALID_NODE_TYPE_ERR,
-    LXB_DOM_DATA_CLONE_ERR
+    LXB_DOM_EXCEPTION_OK = -1,
+    LXB_DOM_EXCEPTION_ERR = 0,
+    LXB_DOM_EXCEPTION_INDEX_SIZE_ERR = 1, /* Deprecated. */
+    LXB_DOM_EXCEPTION_DOMSTRING_SIZE_ERR,
+    LXB_DOM_EXCEPTION_HIERARCHY_REQUEST_ERR,
+    LXB_DOM_EXCEPTION_WRONG_DOCUMENT_ERR,
+    LXB_DOM_EXCEPTION_INVALID_CHARACTER_ERR,
+    LXB_DOM_EXCEPTION_NO_DATA_ALLOWED_ERR,
+    LXB_DOM_EXCEPTION_NO_MODIFICATION_ALLOWED_ERR,
+    LXB_DOM_EXCEPTION_NOT_FOUND_ERR,
+    LXB_DOM_EXCEPTION_NOT_SUPPORTED_ERR,
+    LXB_DOM_EXCEPTION_INUSE_ATTRIBUTE_ERR,
+    LXB_DOM_EXCEPTION_INVALID_STATE_ERR,
+    LXB_DOM_EXCEPTION_SYNTAX_ERR,
+    LXB_DOM_EXCEPTION_INVALID_MODIFICATION_ERR,
+    LXB_DOM_EXCEPTION_NAMESPACE_ERR,
+    LXB_DOM_EXCEPTION_INVALID_ACCESS_ERR, /* Deprecated. */
+    LXB_DOM_EXCEPTION_VALIDATION_ERR,
+    LXB_DOM_EXCEPTION_TYPE_MISMATCH_ERR, /* Deprecated. */
+    LXB_DOM_EXCEPTION_SECURITY_ERR,
+    LXB_DOM_EXCEPTION_NETWORK_ERR,
+    LXB_DOM_EXCEPTION_ABORT_ERR,
+    LXB_DOM_EXCEPTION_URL_MISMATCH_ERR, /* Deprecated. */
+    LXB_DOM_EXCEPTION_QUOTA_EXCEEDED_ERR, /* Deprecated. */
+    LXB_DOM_EXCEPTION_TIMEOUT_ERR,
+    LXB_DOM_EXCEPTION_INVALID_NODE_TYPE_ERR,
+    LXB_DOM_EXCEPTION_DATA_CLONE_ERR,
+    LXB_DOM_EXCEPTION_ENCODING_ERR,
+    LXB_DOM_EXCEPTION_NOT_READABLE_ERR,
+    LXB_DOM_EXCEPTION_UNKNOWN_ERR,
+    LXB_DOM_EXCEPTION_CONSTRAINT_ERR,
+    LXB_DOM_EXCEPTION_DATA_ERR,
+    LXB_DOM_EXCEPTION_TRANSACTION_INACTIVE_ERR,
+    LXB_DOM_EXCEPTION_READ_ONLY_ERR,
+    LXB_DOM_EXCEPTION_VERSION_ERR,
+    LXB_DOM_EXCEPTION_OPERATION_ERR,
+    LXB_DOM_EXCEPTION_NOT_ALLOWED_ERR,
+    LXB_DOM_EXCEPTION_OPT_OUT_ERR,
+    LXB_DOM_EXCEPTION__LAST_ENTRY
 }
 lxb_dom_exception_code_t;
 
-
-/*
- * Inline functions
- */
-lxb_inline void *
-lxb_dom_exception_code_ref_set(lxb_dom_exception_code_t *var,
-                               lxb_dom_exception_code_t code)
-{
-    if (var != NULL) {
-        *var = code;
-    }
-
-    return NULL;
+typedef struct {
+    lexbor_str_t             name;
+    lexbor_str_t             message;
+    lxb_dom_exception_code_t code;
+    lxb_dom_document_t       *document;
 }
+lxb_dom_exception_t;
 
-/*
- * No inline functions for ABI.
- */
-LXB_API void *
-lxb_dom_exception_code_ref_set_noi(lxb_dom_exception_code_t *var,
-                                   lxb_dom_exception_code_t code);
+
+LXB_API lxb_dom_exception_t *
+lxb_dom_exception_create(lxb_dom_document_t *document,
+                         const lxb_char_t *message, size_t message_length,
+                         const lxb_char_t *name, size_t name_length);
+
+LXB_API lxb_dom_exception_t *
+lxb_dom_exception_create_by_code(lxb_dom_document_t *document,
+                                 const lxb_char_t *message, size_t length,
+                                 lxb_dom_exception_code_t code);
+
+LXB_API lxb_dom_exception_t *
+lxb_dom_exception_destroy(lxb_dom_exception_t *exception);
+
+
+LXB_API const lexbor_str_t *
+lxb_dom_exception_message_by_code(lxb_dom_exception_code_t code);
+
+LXB_API const lexbor_str_t *
+lxb_dom_exception_name_by_code(lxb_dom_exception_code_t code);
+
+LXB_API lxb_dom_exception_code_t
+lxb_dom_exception_code_by_name(const lxb_char_t *name, size_t length);
 
 
 #ifdef __cplusplus
diff --git a/ext/lexbor/lexbor/dom/interface.h b/ext/lexbor/lexbor/dom/interface.h
index 3eb4b133e9cd..30753e0b43ab 100644
--- a/ext/lexbor/lexbor/dom/interface.h
+++ b/ext/lexbor/lexbor/dom/interface.h
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2018-2021 Alexander Borisov
+ * Copyright (C) 2018-2025 Alexander Borisov
  *
  * Author: Alexander Borisov 
  */
@@ -16,8 +16,6 @@ extern "C" {
 #include "lexbor/tag/const.h"
 #include "lexbor/ns/const.h"
 
-#include "lexbor/dom/exception.h"
-
 
 #define lxb_dom_interface_cdata_section(obj) ((lxb_dom_cdata_section_t *) (obj))
 #define lxb_dom_interface_character_data(obj) ((lxb_dom_character_data_t *) (obj))
diff --git a/ext/lexbor/lexbor/dom/interfaces/attr_const.h b/ext/lexbor/lexbor/dom/interfaces/attr_const.h
index 756ad5548e45..28afac5e0bdd 100644
--- a/ext/lexbor/lexbor/dom/interfaces/attr_const.h
+++ b/ext/lexbor/lexbor/dom/interfaces/attr_const.h
@@ -39,22 +39,23 @@ typedef enum {
     LXB_DOM_ATTR_ID          = 0x0012,
     LXB_DOM_ATTR_IS          = 0x0013,
     LXB_DOM_ATTR_MAXLENGTH   = 0x0014,
-    LXB_DOM_ATTR_PLACEHOLDER = 0x0015,
-    LXB_DOM_ATTR_POOL        = 0x0016,
-    LXB_DOM_ATTR_PUBLIC      = 0x0017,
-    LXB_DOM_ATTR_READONLY    = 0x0018,
-    LXB_DOM_ATTR_REQUIRED    = 0x0019,
-    LXB_DOM_ATTR_SCHEME      = 0x001a,
-    LXB_DOM_ATTR_SELECTED    = 0x001b,
-    LXB_DOM_ATTR_SIZE        = 0x001c,
-    LXB_DOM_ATTR_SLOT        = 0x001d,
-    LXB_DOM_ATTR_SRC         = 0x001e,
-    LXB_DOM_ATTR_STYLE       = 0x001f,
-    LXB_DOM_ATTR_SYSTEM      = 0x0020,
-    LXB_DOM_ATTR_TITLE       = 0x0021,
-    LXB_DOM_ATTR_TYPE        = 0x0022,
-    LXB_DOM_ATTR_WIDTH       = 0x0023,
-    LXB_DOM_ATTR__LAST_ENTRY = 0x0024
+    LXB_DOM_ATTR_MULTIPLE    = 0x0015,
+    LXB_DOM_ATTR_PLACEHOLDER = 0x0016,
+    LXB_DOM_ATTR_POOL        = 0x0017,
+    LXB_DOM_ATTR_PUBLIC      = 0x0018,
+    LXB_DOM_ATTR_READONLY    = 0x0019,
+    LXB_DOM_ATTR_REQUIRED    = 0x001a,
+    LXB_DOM_ATTR_SCHEME      = 0x001b,
+    LXB_DOM_ATTR_SELECTED    = 0x001c,
+    LXB_DOM_ATTR_SIZE        = 0x001d,
+    LXB_DOM_ATTR_SLOT        = 0x001e,
+    LXB_DOM_ATTR_SRC         = 0x001f,
+    LXB_DOM_ATTR_STYLE       = 0x0020,
+    LXB_DOM_ATTR_SYSTEM      = 0x0021,
+    LXB_DOM_ATTR_TITLE       = 0x0022,
+    LXB_DOM_ATTR_TYPE        = 0x0023,
+    LXB_DOM_ATTR_WIDTH       = 0x0024,
+    LXB_DOM_ATTR__LAST_ENTRY = 0x0025
 }
 lxb_dom_attr_id_enum_t;
 
diff --git a/ext/lexbor/lexbor/dom/interfaces/attr_res.h b/ext/lexbor/lexbor/dom/interfaces/attr_res.h
index 85aa2c5061fc..0796043cafd7 100644
--- a/ext/lexbor/lexbor/dom/interfaces/attr_res.h
+++ b/ext/lexbor/lexbor/dom/interfaces/attr_res.h
@@ -63,6 +63,8 @@ static const lxb_dom_attr_data_t lxb_dom_attr_res_data_default[LXB_DOM_ATTR__LAS
      LXB_DOM_ATTR_IS, 1, true},
     {{.u.short_str = "maxlength", .length = 9, .next = NULL},
      LXB_DOM_ATTR_MAXLENGTH, 1, true},
+    {{.u.short_str = "multiple", .length = 8, .next = NULL},
+     LXB_DOM_ATTR_MULTIPLE, 1, true},
     {{.u.short_str = "placeholder", .length = 11, .next = NULL},
      LXB_DOM_ATTR_PLACEHOLDER, 1, true},
     {{.u.short_str = "pool", .length = 4, .next = NULL},
@@ -127,7 +129,7 @@ static const lexbor_shs_entry_t lxb_dom_attr_res_shs_data[40] =
     {"is", (void *) &lxb_dom_attr_res_data_default[LXB_DOM_ATTR_IS], 2, 0}, 
     {"type", (void *) &lxb_dom_attr_res_data_default[LXB_DOM_ATTR_TYPE], 4, 0}, 
     {"title", (void *) &lxb_dom_attr_res_data_default[LXB_DOM_ATTR_TITLE], 5, 0}, 
-    {NULL, NULL, 0, 0}, 
+    {"multiple", (void *) &lxb_dom_attr_res_data_default[LXB_DOM_ATTR_MULTIPLE], 8, 0}, 
     {"for", (void *) &lxb_dom_attr_res_data_default[LXB_DOM_ATTR_FOR], 3, 0}, 
     {"face", (void *) &lxb_dom_attr_res_data_default[LXB_DOM_ATTR_FACE], 4, 22}, 
     {"alt", (void *) &lxb_dom_attr_res_data_default[LXB_DOM_ATTR_ALT], 3, 23}, 
@@ -135,7 +137,7 @@ static const lexbor_shs_entry_t lxb_dom_attr_res_shs_data[40] =
     {"charset", (void *) &lxb_dom_attr_res_data_default[LXB_DOM_ATTR_CHARSET], 7, 26}, 
     {"maxlength", (void *) &lxb_dom_attr_res_data_default[LXB_DOM_ATTR_MAXLENGTH], 9, 0}, 
     {NULL, NULL, 0, 0}, 
-    {"checked", (void *) &lxb_dom_attr_res_data_default[LXB_DOM_ATTR_CHECKED], 7, 0}, 
+    {"checked", (void *) &lxb_dom_attr_res_data_default[LXB_DOM_ATTR_CHECKED], 7, 30}, 
     {NULL, NULL, 0, 0}
 };
 
diff --git a/ext/lexbor/lexbor/dom/interfaces/character_data.c b/ext/lexbor/lexbor/dom/interfaces/character_data.c
index bbca1865b39d..12c7dfdd0d6c 100644
--- a/ext/lexbor/lexbor/dom/interfaces/character_data.c
+++ b/ext/lexbor/lexbor/dom/interfaces/character_data.c
@@ -22,7 +22,7 @@ lxb_dom_character_data_interface_create(lxb_dom_document_t *document)
     lxb_dom_node_t *node = lxb_dom_interface_node(element);
 
     node->owner_document = lxb_dom_document_owner(document);
-    node->type = LXB_DOM_NODE_TYPE_UNDEF;
+    node->type = LXB_DOM_NODE_TYPE_CHARACTER_DATA;
 
     return element;
 }
diff --git a/ext/lexbor/lexbor/dom/interfaces/document_type.c b/ext/lexbor/lexbor/dom/interfaces/document_type.c
index 8c7465f4d62b..46889162717f 100644
--- a/ext/lexbor/lexbor/dom/interfaces/document_type.c
+++ b/ext/lexbor/lexbor/dom/interfaces/document_type.c
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2018-2021 Alexander Borisov
+ * Copyright (C) 2018-2025 Alexander Borisov
  *
  * Author: Alexander Borisov 
  */
@@ -12,6 +12,10 @@ LXB_API lxb_dom_attr_data_t *
 lxb_dom_attr_qualified_name_append(lexbor_hash_t *hash, const lxb_char_t *name,
                                    size_t length);
 
+LXB_API lxb_dom_attr_data_t *
+lxb_dom_attr_local_name_append(lexbor_hash_t *hash,
+                               const lxb_char_t *name, size_t length);
+
 
 lxb_dom_document_type_t *
 lxb_dom_document_type_interface_create(lxb_dom_document_t *document)
@@ -29,6 +33,8 @@ lxb_dom_document_type_interface_create(lxb_dom_document_t *document)
     node->owner_document = lxb_dom_document_owner(document);
     node->type = LXB_DOM_NODE_TYPE_DOCUMENT_TYPE;
 
+    element->name = LXB_DOM_ATTR_HTML;
+
     return element;
 }
 
@@ -105,6 +111,103 @@ lxb_dom_document_type_interface_destroy(lxb_dom_document_type_t *document_type)
     return NULL;
 }
 
+lxb_dom_document_type_t *
+lxb_dom_document_type_create(lxb_dom_document_t *document,
+                             const lxb_char_t *name, size_t name_len,
+                             const lxb_char_t *pub, size_t pub_len,
+                             const lxb_char_t *sys, size_t sys_len,
+                             lxb_dom_exception_code_t *code)
+{
+    lxb_dom_attr_data_t *data;
+    lxb_dom_document_type_t *doctype;
+
+    if (!lxb_dom_document_type_valid_name(name, name_len)) {
+        if (code != NULL) {
+            *code = LXB_DOM_EXCEPTION_INVALID_CHARACTER_ERR;
+        }
+
+        return NULL;
+    }
+
+    doctype = lxb_dom_document_type_interface_create(document);
+    if (doctype == NULL) {
+        goto failed;
+    }
+
+    data = lxb_dom_attr_local_name_append(document->attrs, name, name_len);
+    if (data == NULL) {
+        goto failed;
+    }
+
+    doctype->name = data->attr_id;
+
+    if (pub != NULL && pub_len != 0) {
+        doctype->public_id.data = lxb_dom_document_create_text(document,
+                                                               pub_len + 1);
+        if (doctype->public_id.data == NULL) {
+            goto failed;
+        }
+
+        (void) lexbor_str_copy_to_with_null(&doctype->public_id, pub, pub_len);
+    }
+
+    if (sys != NULL && sys_len != 0) {
+        doctype->system_id.data = lxb_dom_document_create_text(document,
+                                                               sys_len + 1);
+        if (doctype->system_id.data == NULL) {
+            goto failed;
+        }
+
+        (void) lexbor_str_copy_to_with_null(&doctype->system_id, sys, sys_len);
+    }
+
+    if (code != NULL) {
+        *code = LXB_DOM_EXCEPTION_OK;
+    }
+
+    return doctype;
+
+failed:
+
+    if (doctype != NULL && doctype->public_id.data != NULL) {
+        lxb_dom_document_destroy_text(document, doctype->public_id.data);
+    }
+
+    if (code != NULL) {
+        *code = LXB_DOM_EXCEPTION_ERR;
+    }
+
+    return NULL;
+}
+
+bool
+lxb_dom_document_type_valid_name(const lxb_char_t *name, size_t length)
+{
+    lxb_char_t c;
+    const lxb_char_t *end;
+
+    if (name == NULL || length == 0) {
+        return false;
+    }
+
+    end = name + length;
+
+    while (name < end) {
+        c = *name++;
+        /*
+         * U+0009 TAB, U+000A LF, U+000C FF, U+000D CR, or U+0020 SPACE,
+         * or U+0000 NULL, or U+003E (>)
+         */
+        if (c == 0x09 || c == 0x0A || c == 0x0C || c == 0x0D || c == 0x20
+            || c == 0x00 || c == 0x3E)
+        {
+            return false;
+        }
+    }
+
+    return true;
+}
+
 /*
  * No inline functions for ABI.
  */
diff --git a/ext/lexbor/lexbor/dom/interfaces/document_type.h b/ext/lexbor/lexbor/dom/interfaces/document_type.h
index 366aaba409ac..c7a1960af668 100644
--- a/ext/lexbor/lexbor/dom/interfaces/document_type.h
+++ b/ext/lexbor/lexbor/dom/interfaces/document_type.h
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2018-2021 Alexander Borisov
+ * Copyright (C) 2018-2025 Alexander Borisov
  *
  * Author: Alexander Borisov 
  */
@@ -37,6 +37,34 @@ lxb_dom_document_type_interface_clone(lxb_dom_document_t *document,
 LXB_API lxb_dom_document_type_t *
 lxb_dom_document_type_interface_destroy(lxb_dom_document_type_t *document_type);
 
+/*
+ * Create DocumentType by specification.
+ *
+ * https://dom.spec.whatwg.org/#dom-domimplementation-createdocumenttype
+ *
+ * @param[in] lxb_dom_document_t *. Not NULL.
+ * @param[in] const lxb_char_t *. Name. May be NULL, but then the return value
+ *            will be NULL and an exception code will be recorded.
+ * @param[in] size_t. Length of name. May be 0, but then the return value
+ *            will be NULL and an exception code will be recorded.
+ * @param[in] const lxb_char_t *. PublicID. Can be NULL.
+ * @param[in] size_t. Length of PublicID. Can be 0.
+ * @param[in] const lxb_char_t *. SystemID. Can be NULL.
+ * @param[in] size_t. Length of SystemID. Can be 0.
+ * @param[out] lxb_dom_exception_code_t. Can be NULL. If the variable is passed,
+ *             the code will definitely be assigned. LXB_DOM_EXCEPTION_OK
+ *             if successful.
+ *
+ * @return lxb_dom_document_type_t * if successful, otherwise NULL.
+ */
+LXB_API lxb_dom_document_type_t *
+lxb_dom_document_type_create(lxb_dom_document_t *document,
+                             const lxb_char_t *name, size_t name_len,
+                             const lxb_char_t *pub, size_t pub_len,
+                             const lxb_char_t *sys, size_t sys_len,
+                             lxb_dom_exception_code_t *code);
+LXB_API bool
+lxb_dom_document_type_valid_name(const lxb_char_t *ame, size_t name_len);
 
 /*
  * Inline functions
diff --git a/ext/lexbor/lexbor/dom/interfaces/element.c b/ext/lexbor/lexbor/dom/interfaces/element.c
index 09d9736e5d8c..90d707d078bb 100644
--- a/ext/lexbor/lexbor/dom/interfaces/element.c
+++ b/ext/lexbor/lexbor/dom/interfaces/element.c
@@ -581,6 +581,18 @@ lxb_dom_element_is_set(lxb_dom_element_t *element,
     return LXB_STATUS_OK;
 }
 
+lxb_dom_element_t *
+lxb_dom_element_by_id(lxb_dom_element_t *root,
+                      const lxb_char_t *qualified_name, size_t len)
+{
+    lxb_dom_node_t *node;
+
+    node = lxb_dom_node_by_id(lxb_dom_interface_node(root),
+                              qualified_name, len);
+
+    return lxb_dom_interface_element(node);
+}
+
 lxb_status_t
 lxb_dom_elements_by_tag_name(lxb_dom_element_t *root,
                              lxb_dom_collection_t *collection,
diff --git a/ext/lexbor/lexbor/dom/interfaces/element.h b/ext/lexbor/lexbor/dom/interfaces/element.h
index dd661d439cce..50d814fd3765 100644
--- a/ext/lexbor/lexbor/dom/interfaces/element.h
+++ b/ext/lexbor/lexbor/dom/interfaces/element.h
@@ -135,6 +135,10 @@ LXB_API lxb_status_t
 lxb_dom_element_is_set(lxb_dom_element_t *element,
                        const lxb_char_t *is, size_t is_len);
 
+LXB_API lxb_dom_element_t *
+lxb_dom_element_by_id(lxb_dom_element_t *root,
+                      const lxb_char_t *qualified_name, size_t len);
+
 LXB_API lxb_status_t
 lxb_dom_elements_by_tag_name(lxb_dom_element_t *root,
                              lxb_dom_collection_t *collection,
diff --git a/ext/lexbor/lexbor/dom/interfaces/node.c b/ext/lexbor/lexbor/dom/interfaces/node.c
index a588ed388e48..f2bbaa391e39 100644
--- a/ext/lexbor/lexbor/dom/interfaces/node.c
+++ b/ext/lexbor/lexbor/dom/interfaces/node.c
@@ -10,6 +10,7 @@
 #include "lexbor/dom/interfaces/document_type.h"
 #include "lexbor/dom/interfaces/element.h"
 #include "lexbor/dom/interfaces/processing_instruction.h"
+#include "lexbor/dom/interfaces/shadow_root.h"
 
 
 typedef struct lxb_dom_node_cb_ctx lxb_dom_node_cb_ctx_t;
@@ -29,6 +30,13 @@ struct lxb_dom_node_cb_ctx {
     size_t                     value_length;
 };
 
+typedef struct {
+    lxb_dom_node_t   *node;
+    const lxb_char_t *value;
+    size_t           length;
+}
+lxb_dom_node_id_cb_ctx_t;
+
 
 LXB_API lxb_dom_attr_data_t *
 lxb_dom_attr_local_name_append(lexbor_hash_t *hash,
@@ -44,6 +52,9 @@ lxb_ns_append(lexbor_hash_t *hash, const lxb_char_t *link, size_t length);
 static lexbor_action_t
 lxb_dom_node_by_tag_name_cb(lxb_dom_node_t *node, void *ctx);
 
+static lexbor_action_t
+lxb_dom_node_by_id_cb(lxb_dom_node_t *node, void *ctx);
+
 static lexbor_action_t
 lxb_dom_node_by_tag_name_cb_all(lxb_dom_node_t *node, void *ctx);
 
@@ -443,6 +454,373 @@ lxb_dom_node_insert_after(lxb_dom_node_t *to, lxb_dom_node_t *node)
     }
 }
 
+lxb_dom_exception_code_t
+lxb_dom_node_pre_insert_validity(lxb_dom_node_t *parent, lxb_dom_node_t *node,
+                                 lxb_dom_node_t *child)
+{
+    size_t count;
+    lxb_dom_node_t *tmp;
+
+    /*
+     * If parent is not a Document, DocumentFragment, or Element node, then
+     * throw a "HierarchyRequestError" DOMException.
+     */
+    if (parent == NULL) {
+        return LXB_DOM_EXCEPTION_HIERARCHY_REQUEST_ERR;
+    }
+
+    switch (parent->type) {
+        case LXB_DOM_NODE_TYPE_ELEMENT:
+        case LXB_DOM_NODE_TYPE_DOCUMENT:
+        case LXB_DOM_NODE_TYPE_DOCUMENT_FRAGMENT:
+            break;
+
+        default:
+            return LXB_DOM_EXCEPTION_HIERARCHY_REQUEST_ERR;
+    }
+
+    if (lxb_dom_node_host_including_inclusive_ancestor(node, parent)) {
+        return LXB_DOM_EXCEPTION_HIERARCHY_REQUEST_ERR;
+    }
+
+    /*
+     * If child is non-null and its parent is not parent,
+     * then throw a "NotFoundError" DOMException.
+     */
+    if (child != NULL && parent != child->parent) {
+        return LXB_DOM_EXCEPTION_NOT_FOUND_ERR;
+    }
+
+    /*
+     * If node is not a DocumentFragment, DocumentType, Element,
+     * or CharacterData node, then throw a "HierarchyRequestError" DOMException.
+     */
+    if (node == NULL) {
+        return LXB_DOM_EXCEPTION_HIERARCHY_REQUEST_ERR;
+    }
+
+    switch (parent->type) {
+        case LXB_DOM_NODE_TYPE_ELEMENT:
+        case LXB_DOM_NODE_TYPE_DOCUMENT:
+        case LXB_DOM_NODE_TYPE_DOCUMENT_TYPE:
+        case LXB_DOM_NODE_TYPE_DOCUMENT_FRAGMENT:
+        case LXB_DOM_NODE_TYPE_CHARACTER_DATA:
+        case LXB_DOM_NODE_TYPE_TEXT:
+            break;
+
+        default:
+            return LXB_DOM_EXCEPTION_HIERARCHY_REQUEST_ERR;
+    }
+
+    /*
+     * If either node is a Text node and parent is a document, or node is
+     * a doctype and parent is not a document, then throw
+     * a "HierarchyRequestError" DOMException.
+     */
+    if ((node->type == LXB_DOM_NODE_TYPE_TEXT
+        && parent->type == LXB_DOM_NODE_TYPE_DOCUMENT)
+        || (node->type == LXB_DOM_NODE_TYPE_DOCUMENT_TYPE
+            && parent->type != LXB_DOM_NODE_TYPE_DOCUMENT))
+    {
+        return LXB_DOM_EXCEPTION_HIERARCHY_REQUEST_ERR;
+    }
+
+    if (parent->type != LXB_DOM_NODE_TYPE_DOCUMENT) {
+        return LXB_DOM_EXCEPTION_OK;
+    }
+
+    switch (node->type) {
+        case LXB_DOM_NODE_TYPE_DOCUMENT_FRAGMENT:
+            tmp = node->first_child;
+
+            if (tmp == NULL) {
+                return LXB_DOM_EXCEPTION_OK;
+            }
+
+            count = 0;
+
+            do {
+                if (tmp->type == LXB_DOM_NODE_TYPE_TEXT) {
+                    return LXB_DOM_EXCEPTION_HIERARCHY_REQUEST_ERR;
+                }
+                else if (tmp->type == LXB_DOM_NODE_TYPE_ELEMENT) {
+                    count += 1;
+
+                    if (count > 1) {
+                        return LXB_DOM_EXCEPTION_HIERARCHY_REQUEST_ERR;
+                    }
+                }
+
+                tmp = tmp->next;
+            }
+            while (tmp != NULL);
+
+            if (count != 1) {
+                return LXB_DOM_EXCEPTION_OK;
+            }
+
+            /* Fall Through. */
+
+        case LXB_DOM_NODE_TYPE_ELEMENT:
+            tmp = parent->first_child;
+
+            while (tmp != NULL) {
+                if (tmp->type == LXB_DOM_NODE_TYPE_ELEMENT) {
+                    return LXB_DOM_EXCEPTION_HIERARCHY_REQUEST_ERR;
+                }
+
+                tmp = tmp->next;
+            }
+
+            if (child == NULL) {
+                return LXB_DOM_EXCEPTION_OK;
+            }
+
+            if (child->type == LXB_DOM_NODE_TYPE_DOCUMENT_TYPE) {
+                return LXB_DOM_EXCEPTION_HIERARCHY_REQUEST_ERR;
+            }
+
+            tmp = child->next;
+
+            while (tmp != NULL) {
+                if (tmp->type == LXB_DOM_NODE_TYPE_DOCUMENT_TYPE) {
+                    return LXB_DOM_EXCEPTION_HIERARCHY_REQUEST_ERR;
+                }
+
+                tmp = tmp->next;
+            }
+
+            break;
+
+        case LXB_DOM_NODE_TYPE_DOCUMENT_TYPE:
+            tmp = parent->first_child;
+
+            while (tmp != NULL) {
+                if (tmp->type == LXB_DOM_NODE_TYPE_DOCUMENT_TYPE) {
+                    return LXB_DOM_EXCEPTION_HIERARCHY_REQUEST_ERR;
+                }
+                else if (tmp->type == LXB_DOM_NODE_TYPE_ELEMENT
+                         && child == NULL)
+                {
+                    return LXB_DOM_EXCEPTION_HIERARCHY_REQUEST_ERR;
+                }
+
+                tmp = tmp->next;
+            }
+
+            if (child == NULL) {
+                return LXB_DOM_EXCEPTION_OK;
+            }
+
+            tmp = child->prev;
+
+            while (tmp != NULL) {
+                if (tmp->type == LXB_DOM_NODE_TYPE_ELEMENT) {
+                    return LXB_DOM_EXCEPTION_HIERARCHY_REQUEST_ERR;
+                }
+
+                tmp = tmp->prev;
+            }
+
+            break;
+
+        default:
+            break;
+    }
+
+    return LXB_DOM_EXCEPTION_OK;
+}
+
+lxb_dom_exception_code_t
+lxb_dom_node_pre_insert(lxb_dom_node_t *parent, lxb_dom_node_t *node,
+                        lxb_dom_node_t *child)
+{
+    lxb_dom_exception_code_t ex_code;
+
+    ex_code = lxb_dom_node_pre_insert_validity(parent, node, child);
+    if (ex_code != LXB_DOM_EXCEPTION_OK) {
+        return ex_code;
+    }
+
+    if (child == node) {
+        child = node->next;
+    }
+
+    return lxb_dom_node_insert(parent, node, child, false);
+}
+
+lxb_inline lxb_dom_exception_code_t
+lxb_dom_node_insert_node(lxb_dom_node_t *parent, lxb_dom_node_t *node,
+                         lxb_dom_node_t *child, bool suppress_observers)
+{
+    lxb_dom_exception_code_t code;
+
+    code = lxb_dom_node_adopt(node);
+    if (code != LXB_DOM_EXCEPTION_OK) {
+        return code;
+    }
+
+    if (child == NULL) {
+        lxb_dom_node_insert_child(parent, node);
+    }
+    else {
+        lxb_dom_node_insert_before(child, node);
+    }
+
+    return LXB_DOM_EXCEPTION_OK;
+}
+
+lxb_dom_exception_code_t
+lxb_dom_node_insert(lxb_dom_node_t *parent, lxb_dom_node_t *node,
+                    lxb_dom_node_t *child, bool suppress_observers)
+{
+    lxb_dom_node_t *tmp, *next;
+    lxb_dom_exception_code_t code;
+
+    if (node->type == LXB_DOM_NODE_TYPE_DOCUMENT_FRAGMENT) {
+        if (node->first_child == NULL) {
+            return LXB_DOM_EXCEPTION_OK;
+        }
+    }
+
+    /* TODO: live range. */
+
+    if (node->type != LXB_DOM_NODE_TYPE_DOCUMENT_FRAGMENT) {
+        return lxb_dom_node_insert_node(parent, node, child,
+                                        suppress_observers);
+    }
+
+    tmp = node->first_child;
+
+    while (tmp != NULL) {
+        next = tmp->next;
+
+        code = lxb_dom_node_insert_node(parent, tmp, child,
+                                        suppress_observers);
+        if (code != LXB_DOM_EXCEPTION_OK) {
+            return code;
+        }
+
+        tmp = next;
+    }
+
+    /* TODO: Shadow and queue a tree mutation record. */
+
+    return LXB_DOM_EXCEPTION_OK;
+}
+
+lxb_dom_exception_code_t
+lxb_dom_node_insert_before_spec(lxb_dom_node_t *dst, lxb_dom_node_t *node,
+                                lxb_dom_node_t *child)
+{
+    return lxb_dom_node_pre_insert(dst, node, child);
+}
+
+lxb_dom_exception_code_t
+lxb_dom_node_append_child(lxb_dom_node_t *parent, lxb_dom_node_t *node)
+{
+    return lxb_dom_node_pre_insert(parent, node, NULL);
+}
+
+lxb_dom_exception_code_t
+lxb_dom_node_remove_child(lxb_dom_node_t *parent, lxb_dom_node_t *child)
+{
+    if (parent != child->parent) {
+        return LXB_DOM_EXCEPTION_NOT_FOUND_ERR;
+    }
+
+    return lxb_dom_node_remove_spec(child, false);
+}
+
+lxb_dom_exception_code_t
+lxb_dom_node_replace_child(lxb_dom_node_t *parent, lxb_dom_node_t *node,
+                           lxb_dom_node_t *child)
+{
+    lxb_dom_node_t *tmp, *next;
+    lxb_dom_node_t *before;
+    lxb_dom_exception_code_t code;
+
+    code = lxb_dom_node_pre_insert_validity(parent, node, child);
+    if (code != LXB_DOM_EXCEPTION_OK) {
+        return code;
+    }
+
+    before = child->prev;
+    if (before == NULL) {
+        before = child->next;
+    }
+
+    if (child->parent != NULL) {
+        code = lxb_dom_node_remove_spec(child, true);
+        if (code != LXB_DOM_EXCEPTION_OK) {
+            return code;
+        }
+    }
+
+    if (node->type != LXB_DOM_NODE_TYPE_DOCUMENT_FRAGMENT) {
+        return lxb_dom_node_insert_node(parent, node, before, true);
+    }
+
+    tmp = node->first_child;
+
+    while (tmp != NULL) {
+        next = tmp->next;
+
+        code = lxb_dom_node_insert_node(parent, tmp, before, true);
+        if (code != LXB_DOM_EXCEPTION_OK) {
+            return code;
+        }
+
+        tmp = next;
+    }
+
+    return LXB_DOM_EXCEPTION_OK;
+}
+
+lxb_dom_exception_code_t
+lxb_dom_node_replace_all_spec(lxb_dom_node_t *parent, lxb_dom_node_t *node)
+{
+    lxb_dom_node_t *child, *next;
+    lxb_dom_exception_code_t code;
+
+    child = parent->first_child;
+
+    while (child != NULL) {
+        next = child->next;
+
+        code = lxb_dom_node_remove_spec(child, true);
+        if (code != LXB_DOM_EXCEPTION_OK) {
+            return code;
+        }
+
+        child = next;
+    }
+
+    return lxb_dom_node_append_child(parent, node);
+}
+
+lxb_dom_exception_code_t
+lxb_dom_node_remove_spec(lxb_dom_node_t *node, bool suppress_observers)
+{
+    if (node->parent == NULL) {
+        return LXB_DOM_EXCEPTION_OK;
+    }
+
+    /* TODO: 3. Run the live range pre-remove steps, given node. */
+
+    /*
+     * TODO: For each NodeIterator object iterator whose root’s node document
+     * is node’s node document, run the NodeIterator pre-remove steps given
+     * node and iterator.
+     */
+
+    lxb_dom_node_remove(node);
+
+    /* TODO: finish everything else. */
+
+    return LXB_DOM_EXCEPTION_OK;
+}
+
 void
 lxb_dom_node_remove_wo_events(lxb_dom_node_t *node)
 {
@@ -617,6 +995,52 @@ lxb_dom_node_prepare_by(lxb_dom_document_t *document,
     return LXB_STATUS_OK;
 }
 
+lxb_dom_node_t *
+lxb_dom_node_by_id(lxb_dom_node_t *root,
+                   const lxb_char_t *qualified_name, size_t len)
+{
+    lxb_dom_node_id_cb_ctx_t ctx;
+
+    ctx.node = NULL;
+    ctx.value = qualified_name;
+    ctx.length = len;
+
+    lxb_dom_node_simple_walk(root, lxb_dom_node_by_id_cb, &ctx);
+
+    return ctx.node;
+}
+
+static lexbor_action_t
+lxb_dom_node_by_id_cb(lxb_dom_node_t *node, void *ctx)
+{
+    lxb_dom_node_id_cb_ctx_t *context;
+    const lxb_dom_attr_t *attr_id;
+
+    if (node->type != LXB_DOM_NODE_TYPE_ELEMENT) {
+        return LEXBOR_ACTION_OK;
+    }
+
+    context = ctx;
+    attr_id = lxb_dom_interface_element(node)->attr_id;
+
+    if (attr_id == NULL
+        || attr_id->value == NULL
+        || attr_id->value->length != context->length)
+    {
+        return LEXBOR_ACTION_OK;
+    }
+
+    const lxb_char_t *data = attr_id->value->data;
+    size_t length = attr_id->value->length;
+
+    if (lexbor_str_data_ncmp(context->value, data, length)) {
+        context->node = node;
+        return LEXBOR_ACTION_STOP;
+    }
+
+    return LEXBOR_ACTION_OK;
+}
+
 lxb_status_t
 lxb_dom_node_by_tag_name(lxb_dom_node_t *root,
                          lxb_dom_collection_t *collection,
@@ -1278,6 +1702,47 @@ lxb_dom_node_is_empty(const lxb_dom_node_t *root)
     return true;
 }
 
+bool
+lxb_dom_node_host_including_inclusive_ancestor(const lxb_dom_node_t *node,
+                                               const lxb_dom_node_t *parent)
+{
+    const lxb_dom_shadow_root_t *root;
+
+    while (parent != NULL) {
+        if (parent == node) {
+            return true;
+        }
+
+        if (parent->type == LXB_DOM_NODE_TYPE_SHADOW_ROOT) {
+            root = lxb_dom_interface_shadow_root(parent);
+            parent = &root->host->node;
+
+            continue;
+        }
+
+        parent = parent->parent;
+    }
+
+    return false;
+}
+
+lxb_dom_exception_code_t
+lxb_dom_node_adopt(lxb_dom_node_t *node)
+{
+    lxb_dom_exception_code_t code;
+
+    if (node->parent != NULL) {
+        code = lxb_dom_node_remove_spec(node, false);
+        if (code != LXB_DOM_EXCEPTION_OK) {
+            return code;
+        }
+    }
+
+    /* TODO: If document is not oldDocument steps. */
+
+    return LXB_DOM_EXCEPTION_OK;
+}
+
 lxb_tag_id_t
 lxb_dom_node_tag_id_noi(lxb_dom_node_t *node)
 {
@@ -1313,3 +1778,9 @@ lxb_dom_node_last_child_noi(lxb_dom_node_t *node)
 {
     return lxb_dom_node_last_child(node);
 }
+
+lxb_dom_node_type_t
+lxb_dom_node_type_noi(lxb_dom_node_t *node)
+{
+    return lxb_dom_node_type(node);
+}
diff --git a/ext/lexbor/lexbor/dom/interfaces/node.h b/ext/lexbor/lexbor/dom/interfaces/node.h
index b5d2c5069f0d..b95373c51952 100644
--- a/ext/lexbor/lexbor/dom/interfaces/node.h
+++ b/ext/lexbor/lexbor/dom/interfaces/node.h
@@ -13,6 +13,7 @@ extern "C" {
 
 #include "lexbor/dom/interface.h"
 #include "lexbor/dom/collection.h"
+#include "lexbor/dom/exception.h"
 #include "lexbor/dom/interfaces/event_target.h"
 
 
@@ -59,7 +60,9 @@ typedef enum {
     LXB_DOM_NODE_TYPE_DOCUMENT_TYPE          = 0x0A,
     LXB_DOM_NODE_TYPE_DOCUMENT_FRAGMENT      = 0x0B,
     LXB_DOM_NODE_TYPE_NOTATION               = 0x0C, // historical
-    LXB_DOM_NODE_TYPE_LAST_ENTRY             = 0x0D
+    LXB_DOM_NODE_TYPE_CHARACTER_DATA,
+    LXB_DOM_NODE_TYPE_SHADOW_ROOT,
+    LXB_DOM_NODE_TYPE_LAST_ENTRY
 }
 lxb_dom_node_type_t;
 
@@ -135,12 +138,106 @@ lxb_dom_node_insert_after_wo_events(lxb_dom_node_t *to, lxb_dom_node_t *node);
 LXB_API void
 lxb_dom_node_insert_after(lxb_dom_node_t *to, lxb_dom_node_t *node);
 
+LXB_API lxb_dom_exception_code_t
+lxb_dom_node_pre_insert_validity(lxb_dom_node_t *parent, lxb_dom_node_t *node,
+                                 lxb_dom_node_t *child);
+
+LXB_API lxb_dom_exception_code_t
+lxb_dom_node_pre_insert(lxb_dom_node_t *parent, lxb_dom_node_t *node,
+                        lxb_dom_node_t *child);
+
+LXB_API lxb_dom_exception_code_t
+lxb_dom_node_insert(lxb_dom_node_t *parent, lxb_dom_node_t *node,
+                    lxb_dom_node_t *child, bool suppress_observers);
+
+/*
+ * Add a node as a child.
+ *
+ * Function according to specification. Node.appendChild(node).
+ *
+ * The function not only adds a node as a child, but also validates
+ * the possibility of adding it.
+ * For example, the lxb_dom_node_insert_child() function does not perform
+ * any validation.
+ *
+ * @param[in] lxb_dom_node_t *. Where to add. Not NULL.
+ * @param[in] lxb_dom_node_t *. Who to add. Not NULL.
+ *
+ * @return LXB_DOM_EXCEPTION_OK if successful, otherwise an error exception code.
+ */
+LXB_API lxb_dom_exception_code_t
+lxb_dom_node_append_child(lxb_dom_node_t *parent, lxb_dom_node_t *node);
+
+/*
+ * Insert before child.
+ *
+ * Function according to specification. Node.insertBefore(node, child).
+ *
+ * The function not only insert a node as a child, but also validates
+ * the possibility of adding it.
+ * For example, the lxb_dom_node_insert_before() function does not perform
+ * any validation.
+ *
+ * @param[in] lxb_dom_node_t *. Where to add. Not NULL.
+ * @param[in] lxb_dom_node_t *. Who to add. Not NULL.
+ * @param[in] lxb_dom_node_t *. The child before need to insert. Not NULL.
+ *
+ * @return LXB_DOM_EXCEPTION_OK if successful, otherwise an error exception code.
+ */
+LXB_API lxb_dom_exception_code_t
+lxb_dom_node_insert_before_spec(lxb_dom_node_t *dst, lxb_dom_node_t *node,
+                                lxb_dom_node_t *child);
+
+LXB_API lxb_dom_exception_code_t
+lxb_dom_node_remove_spec(lxb_dom_node_t *node, bool suppress_observers);
+
 LXB_API void
 lxb_dom_node_remove_wo_events(lxb_dom_node_t *node);
 
 LXB_API void
 lxb_dom_node_remove(lxb_dom_node_t *node);
 
+/*
+ * Removing a node.
+ *
+ * Function according to specification. Node.removeChild(node).
+ *
+ * The function not only removing a node, but also validates the possibility
+ * of adding it.
+ * For example, the lxb_dom_node_remove() function does not perform
+ * any validation.
+ *
+ * @param[in] lxb_dom_node_t *. Where remove. Not NULL.
+ * @param[in] lxb_dom_node_t *. Who remove. Not NULL.
+ *
+ * @return LXB_DOM_EXCEPTION_OK if successful, otherwise an error exception code.
+ */
+LXB_API lxb_dom_exception_code_t
+lxb_dom_node_remove_child(lxb_dom_node_t *parent, lxb_dom_node_t *child);
+
+/*
+ * The function replaces the child with a node.
+ *
+ * Function according to specification. Node.replaceChild(node, child).
+ *
+ * The function not only replace a node, but also validates the possibility
+ * of adding it.
+ * For example, the lxb_dom_node_replace_all() function does not perform
+ * any validation.
+ *
+ * @param[in] lxb_dom_node_t *. Where replace. Not NULL.
+ * @param[in] lxb_dom_node_t *. Who replace. Not NULL.
+ * @param[in] lxb_dom_node_t *. Replaceable child. Not NULL.
+ *
+ * @return LXB_DOM_EXCEPTION_OK if successful, otherwise an error exception code.
+ */
+LXB_API lxb_dom_exception_code_t
+lxb_dom_node_replace_child(lxb_dom_node_t *parent, lxb_dom_node_t *node,
+                           lxb_dom_node_t *child);
+
+LXB_API lxb_dom_exception_code_t
+lxb_dom_node_replace_all_spec(lxb_dom_node_t *parent, lxb_dom_node_t *node);
+
 LXB_API lxb_status_t
 lxb_dom_node_replace_all(lxb_dom_node_t *parent, lxb_dom_node_t *node);
 
@@ -148,6 +245,10 @@ LXB_API void
 lxb_dom_node_simple_walk(lxb_dom_node_t *root,
                          lxb_dom_node_simple_walker_f walker_cb, void *ctx);
 
+LXB_API lxb_dom_node_t *
+lxb_dom_node_by_id(lxb_dom_node_t *root,
+                   const lxb_char_t *qualified_name, size_t len);
+
 LXB_API lxb_status_t
 lxb_dom_node_by_tag_name(lxb_dom_node_t *root, lxb_dom_collection_t *collection,
                          const lxb_char_t *qualified_name, size_t len);
@@ -193,6 +294,12 @@ lxb_dom_node_text_content_set(lxb_dom_node_t *node,
 LXB_API bool
 lxb_dom_node_is_empty(const lxb_dom_node_t *root);
 
+LXB_API bool
+lxb_dom_node_host_including_inclusive_ancestor(const lxb_dom_node_t *node,
+                                               const lxb_dom_node_t *parent);
+
+LXB_API lxb_dom_exception_code_t
+lxb_dom_node_adopt(lxb_dom_node_t *node);
 
 /*
  * Inline functions
@@ -233,6 +340,12 @@ lxb_dom_node_last_child(lxb_dom_node_t *node)
     return node->last_child;
 }
 
+lxb_inline lxb_dom_node_type_t
+lxb_dom_node_type(lxb_dom_node_t *node)
+{
+    return node->type;
+}
+
 /*
  * No inline functions for ABI.
  */
@@ -254,6 +367,9 @@ lxb_dom_node_first_child_noi(lxb_dom_node_t *node);
 LXB_API lxb_dom_node_t *
 lxb_dom_node_last_child_noi(lxb_dom_node_t *node);
 
+LXB_API lxb_dom_node_type_t
+lxb_dom_node_type_noi(lxb_dom_node_t *node);
+
 
 #ifdef __cplusplus
 } /* extern "C" */
diff --git a/ext/lexbor/lexbor/dom/interfaces/shadow_root.c b/ext/lexbor/lexbor/dom/interfaces/shadow_root.c
index a7145bcec0d8..e2c332d58b28 100644
--- a/ext/lexbor/lexbor/dom/interfaces/shadow_root.c
+++ b/ext/lexbor/lexbor/dom/interfaces/shadow_root.c
@@ -22,7 +22,7 @@ lxb_dom_shadow_root_interface_create(lxb_dom_document_t *document)
     lxb_dom_node_t *node = lxb_dom_interface_node(element);
 
     node->owner_document = lxb_dom_document_owner(document);
-    node->type = LXB_DOM_NODE_TYPE_UNDEF;
+    node->type = LXB_DOM_NODE_TYPE_SHADOW_ROOT;
 
     return element;
 }
diff --git a/ext/lexbor/lexbor/encoding/base.h b/ext/lexbor/lexbor/encoding/base.h
index 88d74cc9bf8f..459287df3832 100644
--- a/ext/lexbor/lexbor/encoding/base.h
+++ b/ext/lexbor/lexbor/encoding/base.h
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2019-2024 Alexander Borisov
+ * Copyright (C) 2019-2026 Alexander Borisov
  *
  * Author: Alexander Borisov 
  */
@@ -16,7 +16,7 @@ extern "C" {
 
 
 #define LXB_ENCODING_VERSION_MAJOR 2
-#define LXB_ENCODING_VERSION_MINOR 2
+#define LXB_ENCODING_VERSION_MINOR 3
 #define LXB_ENCODING_VERSION_PATCH 0
 
 #define LXB_ENCODING_VERSION_STRING                                            \
diff --git a/ext/lexbor/lexbor/encoding/encode.c b/ext/lexbor/lexbor/encoding/encode.c
index 4377fb31f58a..f9a4f9f8effb 100644
--- a/ext/lexbor/lexbor/encoding/encode.c
+++ b/ext/lexbor/lexbor/encoding/encode.c
@@ -111,6 +111,122 @@
     return 1
 
 
+lxb_inline uint16_t
+lxb_encoding_multi_big5_index(lxb_codepoint_t cp)
+{
+    if (cp > 0x2F8A7) {
+        return UINT16_MAX;
+    }
+
+    if (cp < 65518) {
+        if (cp >= 167 && cp < 1106) {
+            return lxb_encoding_multi_big5_167_1106_map[cp - 167];
+        }
+        else if (cp >= 8211) {
+            if (cp < 40882) {
+                return lxb_encoding_multi_big5_8211_40882_map[cp - 8211];
+            }
+            else if (cp >= 64012) {
+                return lxb_encoding_multi_big5_64012_65518_map[cp - 64012];
+            }
+        }
+    }
+    else if (cp >= 131210) {
+        if (cp < 172369) {
+            return lxb_encoding_multi_big5_131210_172369_map[cp - 131210];
+        }
+        else if (cp >= 194708) {
+            if (cp < 194727) {
+                return lxb_encoding_multi_big5_194708_194727_map[cp - 194708];
+            }
+        }
+    }
+
+    return UINT16_MAX;
+}
+
+lxb_inline uint16_t
+lxb_encoding_multi_euc_kr_index(lxb_codepoint_t cp)
+{
+    if (cp > 0xFFE7) {
+        return UINT16_MAX;
+    }
+
+    if (cp < 13278) {
+        if (cp >= 161 && cp < 1106) {
+            return lxb_encoding_multi_euc_kr_161_1106_map[cp - 161];
+        }
+        else if (cp >= 8213) {
+            return lxb_encoding_multi_euc_kr_8213_13278_map[cp - 8213];
+        }
+    }
+    else if (cp >= 19968) {
+        if (cp < 55204) {
+            return lxb_encoding_multi_euc_kr_19968_55204_map[cp - 19968];
+        }
+        else if (cp >= 63744) {
+            if (cp < 65511) {
+                return lxb_encoding_multi_euc_kr_63744_65511_map[cp - 63744];
+            }
+        }
+    }
+
+    return UINT16_MAX;
+}
+
+lxb_inline uint16_t
+lxb_encoding_multi_gb18030_index(lxb_codepoint_t cp)
+{
+    if (cp > 0xFFE6) {
+        return UINT16_MAX;
+    }
+
+    if (cp < 40892) {
+        if (cp >= 164 && cp < 1106) {
+            return lxb_encoding_multi_gb18030_164_1106_map[cp - 164];
+        }
+        else if (cp >= 7743) {
+            return lxb_encoding_multi_gb18030_7743_40892_map[cp - 7743];
+        }
+    }
+    else if (cp >= 57344) {
+        if (cp < 65510) {
+            return lxb_encoding_multi_gb18030_57344_65510_map[cp - 57344];
+        }
+    }
+
+    return UINT16_MAX;
+}
+
+lxb_inline uint16_t
+lxb_encoding_multi_jis0208_index(lxb_codepoint_t cp)
+{
+    if (cp > 0xFFE6) {
+        return UINT16_MAX;
+    }
+
+    if (cp < 13262) {
+        if (cp >= 167 && cp < 1106) {
+            return lxb_encoding_multi_jis0208_167_1106_map[cp - 167];
+        }
+        else if (cp >= 8208) {
+            return lxb_encoding_multi_jis0208_8208_13262_map[cp - 8208];
+        }
+    }
+    else if (cp >= 19968) {
+        if (cp < 40865) {
+            return lxb_encoding_multi_jis0208_19968_40865_map[cp - 19968];
+        }
+        else if (cp >= 63785) {
+            if (cp < 65510) {
+                return lxb_encoding_multi_jis0208_63785_65510_map[cp - 63785];
+            }
+        }
+    }
+
+    return UINT16_MAX;
+}
+
 lxb_status_t
 lxb_encoding_encode_default(lxb_encoding_encode_t *ctx, const lxb_codepoint_t **cps,
                             const lxb_codepoint_t *end)
@@ -327,10 +443,10 @@ lxb_encoding_encode_iso_2022_jp(lxb_encoding_encode_t *ctx, const lxb_codepoint_
     unsigned state;
     lxb_codepoint_t cp;
 
-    size = 0;
     state = ctx->state;
 
     for (; *cps < end; (*cps)++) {
+        size = 0;
         cp = **cps;
 
     begin:
diff --git a/ext/lexbor/lexbor/encoding/encoding.c b/ext/lexbor/lexbor/encoding/encoding.c
index 19d3a1474688..2a43f0fd70a2 100644
--- a/ext/lexbor/lexbor/encoding/encoding.c
+++ b/ext/lexbor/lexbor/encoding/encoding.c
@@ -55,6 +55,74 @@ lxb_encoding_data_by_pre_name(const lxb_char_t *name, size_t length)
     return entry->value;
 }
 
+lxb_encoding_t
+lxb_encoding_prescan_validate(const lxb_char_t *name, size_t length)
+{
+    const lxb_encoding_data_t *data;
+
+    data = lxb_encoding_data_by_pre_name(name, length);
+    if (data == NULL) {
+        return LXB_ENCODING_DEFAULT;
+    }
+
+    if (data->encoding == LXB_ENCODING_UTF_16BE
+        || data->encoding == LXB_ENCODING_UTF_16LE)
+    {
+        return LXB_ENCODING_UTF_8;
+    }
+
+    if (data->encoding == LXB_ENCODING_X_USER_DEFINED) {
+        return LXB_ENCODING_WINDOWS_1252;
+    }
+
+    return data->encoding;
+}
+
+const lxb_encoding_data_t *
+lxb_encoding_data_prescan_validate(const lxb_char_t *name, size_t length)
+{
+    const lxb_encoding_data_t *data;
+
+    data = lxb_encoding_data_by_pre_name(name, length);
+    if (data == NULL) {
+        return NULL;
+    }
+
+    if (data->encoding == LXB_ENCODING_UTF_16BE
+        || data->encoding == LXB_ENCODING_UTF_16LE)
+    {
+        return lxb_encoding_data(LXB_ENCODING_UTF_8);
+    }
+
+    if (data->encoding == LXB_ENCODING_X_USER_DEFINED) {
+        return lxb_encoding_data(LXB_ENCODING_WINDOWS_1252);
+    }
+
+    return data;
+}
+
+lxb_encoding_t
+lxb_encoding_bom_sniff(const lxb_char_t *begin, size_t length)
+{
+    if (length >= 3) {
+        if (begin[0] == 0xEF && begin[1] == 0xBB && begin[2] == 0xBF) {
+            return LXB_ENCODING_UTF_8;
+        }
+    }
+
+    if (length >= 2) {
+        if (begin[0] == 0xFE && begin[1] == 0xFF) {
+            return LXB_ENCODING_UTF_16BE;
+        }
+
+        if (begin[0] == 0xFF && begin[1] == 0xFE) {
+            return LXB_ENCODING_UTF_16LE;
+        }
+    }
+
+    return LXB_ENCODING_DEFAULT;
+}
+
 void
 lxb_encoding_utf_8_skip_bom(const lxb_char_t **begin, size_t *length)
 {
@@ -100,6 +168,54 @@ lxb_encoding_utf_16le_skip_bom(const lxb_char_t **begin, size_t *length)
     }
 }
 
+const lxb_encoding_data_t *
+lxb_encoding_data_by_name(const lxb_char_t *name, size_t length)
+{
+    const lexbor_shs_entry_t *entry;
+
+    if (length == 0) {
+        return NULL;
+    }
+
+    entry = lexbor_shs_entry_get_lower_static(lxb_encoding_res_shs_entities,
+                                              name, length);
+    if (entry == NULL) {
+        return NULL;
+    }
+
+    return (const lxb_encoding_data_t *) entry->value;
+}
+
+const lxb_encoding_data_t *
+lxb_encoding_data(lxb_encoding_t encoding)
+{
+    if (encoding >= LXB_ENCODING_LAST_ENTRY) {
+        return NULL;
+    }
+
+    return &lxb_encoding_res_map[encoding];
+}
+
+lxb_encoding_encode_f
+lxb_encoding_encode_function(lxb_encoding_t encoding)
+{
+    if (encoding >= LXB_ENCODING_LAST_ENTRY) {
+        return NULL;
+    }
+
+    return lxb_encoding_res_map[encoding].encode;
+}
+
+lxb_encoding_decode_f
+lxb_encoding_decode_function(lxb_encoding_t encoding)
+{
+    if (encoding >= LXB_ENCODING_LAST_ENTRY) {
+        return NULL;
+    }
+
+    return lxb_encoding_res_map[encoding].decode;
+}
+
 /*
  * No inline functions for ABI.
  */
diff --git a/ext/lexbor/lexbor/encoding/encoding.h b/ext/lexbor/lexbor/encoding/encoding.h
index 7bda3ba5f56c..7e08a3687993 100644
--- a/ext/lexbor/lexbor/encoding/encoding.h
+++ b/ext/lexbor/lexbor/encoding/encoding.h
@@ -27,9 +27,18 @@ extern "C" {
 LXB_API const lxb_encoding_data_t *
 lxb_encoding_data_by_pre_name(const lxb_char_t *name, size_t length);
 
+LXB_API lxb_encoding_t
+lxb_encoding_prescan_validate(const lxb_char_t *name, size_t length);
+
+LXB_API const lxb_encoding_data_t *
+lxb_encoding_data_prescan_validate(const lxb_char_t *name, size_t length);
+
 /*
  * To skip BOM.
  */
+LXB_API lxb_encoding_t
+lxb_encoding_bom_sniff(const lxb_char_t *begin, size_t length);
+
 LXB_API void
 lxb_encoding_utf_8_skip_bom(const lxb_char_t **begin, size_t *length);
 
@@ -39,6 +48,20 @@ lxb_encoding_utf_16be_skip_bom(const lxb_char_t **begin, size_t *length);
 LXB_API void
 lxb_encoding_utf_16le_skip_bom(const lxb_char_t **begin, size_t *length);
 
+/*
+ * Encoding data.
+ */
+LXB_API const lxb_encoding_data_t *
+lxb_encoding_data_by_name(const lxb_char_t *name, size_t length);
+
+LXB_API const lxb_encoding_data_t *
+lxb_encoding_data(lxb_encoding_t encoding);
+
+LXB_API lxb_encoding_encode_f
+lxb_encoding_encode_function(lxb_encoding_t encoding);
+
+LXB_API lxb_encoding_decode_f
+lxb_encoding_decode_function(lxb_encoding_t encoding);
 
 /*
  * Inline functions
@@ -305,54 +328,6 @@ lxb_encoding_decode_finish_single(lxb_encoding_decode_t *decode)
 /*
  * Encoding data.
  */
-lxb_inline const lxb_encoding_data_t *
-lxb_encoding_data_by_name(const lxb_char_t *name, size_t length)
-{
-    const lexbor_shs_entry_t *entry;
-
-    if (length == 0) {
-        return NULL;
-    }
-
-    entry = lexbor_shs_entry_get_lower_static(lxb_encoding_res_shs_entities,
-                                              name, length);
-    if (entry == NULL) {
-        return NULL;
-    }
-
-    return (const lxb_encoding_data_t *) entry->value;
-}
-
-lxb_inline const lxb_encoding_data_t *
-lxb_encoding_data(lxb_encoding_t encoding)
-{
-    if (encoding >= LXB_ENCODING_LAST_ENTRY) {
-        return NULL;
-    }
-
-    return &lxb_encoding_res_map[encoding];
-}
-
-lxb_inline lxb_encoding_encode_f
-lxb_encoding_encode_function(lxb_encoding_t encoding)
-{
-    if (encoding >= LXB_ENCODING_LAST_ENTRY) {
-        return NULL;
-    }
-
-    return lxb_encoding_res_map[encoding].encode;
-}
-
-lxb_inline lxb_encoding_decode_f
-lxb_encoding_decode_function(lxb_encoding_t encoding)
-{
-    if (encoding >= LXB_ENCODING_LAST_ENTRY) {
-        return NULL;
-    }
-
-    return lxb_encoding_res_map[encoding].decode;
-}
-
 lxb_inline lxb_status_t
 lxb_encoding_data_call_encode(lxb_encoding_data_t *encoding_data, lxb_encoding_encode_t *ctx,
                               const lxb_codepoint_t **cp, const lxb_codepoint_t *end)
diff --git a/ext/lexbor/lexbor/encoding/multi.c b/ext/lexbor/lexbor/encoding/multi.c
index 78cd93ea82b1..2651648c5c96 100644
--- a/ext/lexbor/lexbor/encoding/multi.c
+++ b/ext/lexbor/lexbor/encoding/multi.c
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2024 Alexander Borisov
+ * Copyright (C) 2026 Alexander Borisov
  *
  * Author: Alexander Borisov 
  */
diff --git a/ext/lexbor/lexbor/encoding/multi.h b/ext/lexbor/lexbor/encoding/multi.h
index 4e6da7b4728b..a4c5def5ba6a 100644
--- a/ext/lexbor/lexbor/encoding/multi.h
+++ b/ext/lexbor/lexbor/encoding/multi.h
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2024 Alexander Borisov
+ * Copyright (C) 2026 Alexander Borisov
  *
  * Author: Alexander Borisov 
  */
@@ -19,7 +19,7 @@ extern "C" {
 
 #include "lexbor/encoding/base.h"
 
-
+#ifndef LEXBOR_DISABLE_INTERNAL_EXTERN
 LXB_EXTERN lxb_codepoint_t lxb_encoding_multi_big5_map[19782];
 LXB_EXTERN lxb_codepoint_t lxb_encoding_multi_euc_kr_map[23750];
 LXB_EXTERN lxb_codepoint_t lxb_encoding_multi_gb18030_map[23940];
@@ -53,161 +53,7 @@ LXB_EXTERN uint16_t lxb_encoding_multi_jis0208_167_1106_map[939];
 LXB_EXTERN uint16_t lxb_encoding_multi_jis0208_8208_13262_map[5054];
 LXB_EXTERN uint16_t lxb_encoding_multi_jis0208_19968_40865_map[20897];
 LXB_EXTERN uint16_t lxb_encoding_multi_jis0208_63785_65510_map[1725];
-
-lxb_inline uint16_t
-lxb_encoding_multi_big5_index(lxb_codepoint_t cp)
-{
-    if (cp > 0x2F8A7) {
-        return UINT16_MAX;
-    }
-
-    if (cp < 65518) {
-        if (cp >= 167 && cp < 1106) {
-            return lxb_encoding_multi_big5_167_1106_map[cp - 167];
-        }
-        else if (cp >= 8211) {
-            if (cp < 40882) {
-                return lxb_encoding_multi_big5_8211_40882_map[cp - 8211];
-            }
-            else if (cp >= 64012) {
-                return lxb_encoding_multi_big5_64012_65518_map[cp - 64012];
-            }
-        }
-    }
-    else if (cp >= 131210) {
-        if (cp < 172369) {
-            return lxb_encoding_multi_big5_131210_172369_map[cp - 131210];
-        }
-        else if (cp >= 194708) {
-            if (cp < 194727) {
-                return lxb_encoding_multi_big5_194708_194727_map[cp - 194708];
-            }
-        }
-    }
-
-    return UINT16_MAX;
-}
-
-lxb_inline uint16_t
-lxb_encoding_multi_euc_kr_index(lxb_codepoint_t cp)
-{
-    if (cp > 0xFFE7) {
-        return UINT16_MAX;
-    }
-
-    if (cp < 13278) {
-        if (cp >= 161 && cp < 1106) {
-            return lxb_encoding_multi_euc_kr_161_1106_map[cp - 161];
-        }
-        else if (cp >= 8213) {
-            return lxb_encoding_multi_euc_kr_8213_13278_map[cp - 8213];
-        }
-    }
-    else if (cp >= 19968) {
-        if (cp < 55204) {
-            return lxb_encoding_multi_euc_kr_19968_55204_map[cp - 19968];
-        }
-        else if (cp >= 63744) {
-            if (cp < 65511) {
-                return lxb_encoding_multi_euc_kr_63744_65511_map[cp - 63744];
-            }
-        }
-    }
-
-    return UINT16_MAX;
-}
-
-lxb_inline uint16_t
-lxb_encoding_multi_gb18030_index(lxb_codepoint_t cp)
-{
-    if (cp > 0xFFE6) {
-        return UINT16_MAX;
-    }
-
-    if (cp < 40892) {
-        if (cp >= 164 && cp < 1106) {
-            return lxb_encoding_multi_gb18030_164_1106_map[cp - 164];
-        }
-        else if (cp >= 7743) {
-            return lxb_encoding_multi_gb18030_7743_40892_map[cp - 7743];
-        }
-    }
-    else if (cp >= 57344) {
-        if (cp < 65510) {
-            return lxb_encoding_multi_gb18030_57344_65510_map[cp - 57344];
-        }
-    }
-
-    return UINT16_MAX;
-}
-
-lxb_inline uint16_t
-lxb_encoding_multi_iso_2022_jp_katakana_index(lxb_codepoint_t cp)
-{
-    if (cp >= 12289 && cp < 12541) {
-        return lxb_encoding_multi_iso_2022_jp_katakana_12289_12541_map[cp - 12289];
-    }
-
-    return UINT16_MAX;
-}
-
-lxb_inline uint16_t
-lxb_encoding_multi_jis0212_index(lxb_codepoint_t cp)
-{
-    if (cp > 0xFF5F) {
-        return UINT16_MAX;
-    }
-
-    if (cp < 8483) {
-        if (cp >= 161 && cp < 1120) {
-            return lxb_encoding_multi_jis0212_161_1120_map[cp - 161];
-        }
-        else if (cp >= 8470) {
-            return lxb_encoding_multi_jis0212_8470_8483_map[cp - 8470];
-        }
-    }
-    else if (cp >= 19970) {
-        if (cp < 40870) {
-            return lxb_encoding_multi_jis0212_19970_40870_map[cp - 19970];
-        }
-        else if (cp >= 65374) {
-            if (cp < 65375) {
-                return lxb_encoding_multi_jis0212_65374_65375_map[cp - 65374];
-            }
-        }
-    }
-
-    return UINT16_MAX;
-}
-
-lxb_inline uint16_t
-lxb_encoding_multi_jis0208_index(lxb_codepoint_t cp)
-{
-    if (cp > 0xFFE6) {
-        return UINT16_MAX;
-    }
-
-    if (cp < 13262) {
-        if (cp >= 167 && cp < 1106) {
-            return lxb_encoding_multi_jis0208_167_1106_map[cp - 167];
-        }
-        else if (cp >= 8208) {
-            return lxb_encoding_multi_jis0208_8208_13262_map[cp - 8208];
-        }
-    }
-    else if (cp >= 19968) {
-        if (cp < 40865) {
-            return lxb_encoding_multi_jis0208_19968_40865_map[cp - 19968];
-        }
-        else if (cp >= 63785) {
-            if (cp < 65510) {
-                return lxb_encoding_multi_jis0208_63785_65510_map[cp - 63785];
-            }
-        }
-    }
-
-    return UINT16_MAX;
-}
+#endif /* !LEXBOR_DISABLE_INTERNAL_EXTERN */
 
 
 #ifdef __cplusplus
diff --git a/ext/lexbor/lexbor/encoding/range.h b/ext/lexbor/lexbor/encoding/range.h
index 18b331034423..ed9833d1cce9 100644
--- a/ext/lexbor/lexbor/encoding/range.h
+++ b/ext/lexbor/lexbor/encoding/range.h
@@ -23,8 +23,9 @@ extern "C" {
 
 #define LXB_ENCODING_RANGE_INDEX_GB18030_SIZE 207
 
-
+#ifndef LEXBOR_DISABLE_INTERNAL_EXTERN
 LXB_EXTERN const lxb_encoding_range_index_t lxb_encoding_range_index_gb18030[207];
+#endif /* !LEXBOR_DISABLE_INTERNAL_EXTERN */
 
 
 #ifdef __cplusplus
diff --git a/ext/lexbor/lexbor/encoding/res.h b/ext/lexbor/lexbor/encoding/res.h
index 46a9f91ae9a9..25334ebd27cf 100644
--- a/ext/lexbor/lexbor/encoding/res.h
+++ b/ext/lexbor/lexbor/encoding/res.h
@@ -22,10 +22,10 @@ extern "C" {
 #include "lexbor/encoding/base.h"
 #include "lexbor/core/shs.h"
 
-
+#ifndef LEXBOR_DISABLE_INTERNAL_EXTERN
 LXB_EXTERN const lxb_encoding_data_t lxb_encoding_res_map[LXB_ENCODING_LAST_ENTRY];
 LXB_EXTERN const lexbor_shs_entry_t lxb_encoding_res_shs_entities[220];
-
+#endif /* !LEXBOR_DISABLE_INTERNAL_EXTERN */
 
 #ifdef __cplusplus
 } /* extern "C" */
diff --git a/ext/lexbor/lexbor/encoding/single.h b/ext/lexbor/lexbor/encoding/single.h
index 906279bf33e7..c2a4271ac90c 100644
--- a/ext/lexbor/lexbor/encoding/single.h
+++ b/ext/lexbor/lexbor/encoding/single.h
@@ -51,7 +51,7 @@ extern "C" {
 #define LXB_ENCODING_SINGLE_HASH_WINDOWS_874_SIZE 359
 #define LXB_ENCODING_SINGLE_HASH_X_MAC_CYRILLIC_SIZE 373
 
-
+#ifndef LEXBOR_DISABLE_INTERNAL_EXTERN
 LXB_EXTERN const lxb_encoding_single_index_t lxb_encoding_single_index_ibm866[128];
 LXB_EXTERN const lxb_encoding_single_index_t lxb_encoding_single_index_iso_8859_10[128];
 LXB_EXTERN const lxb_encoding_single_index_t lxb_encoding_single_index_iso_8859_13[128];
@@ -107,6 +107,7 @@ LXB_EXTERN const lexbor_shs_hash_t lxb_encoding_single_hash_windows_1257[356];
 LXB_EXTERN const lexbor_shs_hash_t lxb_encoding_single_hash_windows_1258[406];
 LXB_EXTERN const lexbor_shs_hash_t lxb_encoding_single_hash_windows_874[360];
 LXB_EXTERN const lexbor_shs_hash_t lxb_encoding_single_hash_x_mac_cyrillic[374];
+#endif /* !LEXBOR_DISABLE_INTERNAL_EXTERN */
 
 
 #ifdef __cplusplus
diff --git a/ext/lexbor/lexbor/html/base.h b/ext/lexbor/lexbor/html/base.h
index a701dc35c680..570222c6de5e 100644
--- a/ext/lexbor/lexbor/html/base.h
+++ b/ext/lexbor/lexbor/html/base.h
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2018-2024 Alexander Borisov
+ * Copyright (C) 2018-2025 Alexander Borisov
  *
  * Author: Alexander Borisov 
  */
@@ -15,7 +15,7 @@ extern "C" {
 
 
 #define LXB_HTML_VERSION_MAJOR 2
-#define LXB_HTML_VERSION_MINOR 6
+#define LXB_HTML_VERSION_MINOR 8
 #define LXB_HTML_VERSION_PATCH 0
 
 #define LXB_HTML_VERSION_STRING LEXBOR_STRINGIZE(LXB_HTML_VERSION_MAJOR) "."   \
diff --git a/ext/lexbor/lexbor/html/encoding.c b/ext/lexbor/lexbor/html/encoding.c
index 5368400dab84..857661246b5c 100644
--- a/ext/lexbor/lexbor/html/encoding.c
+++ b/ext/lexbor/lexbor/html/encoding.c
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2019 Alexander Borisov
+ * Copyright (C) 2019-2026 Alexander Borisov
  *
  * Author: Alexander Borisov 
  */
@@ -9,6 +9,31 @@
 #include "lexbor/core/str.h"
 
 
+typedef struct {
+    lexbor_str_t alias;
+    lexbor_str_t name;
+}
+lxb_html_encoding_name_t;
+
+static const lxb_html_encoding_name_t lxb_html_encoding_names[] = {
+    /* UTF-16BE */
+    { lexbor_str("unicodefffe"),     lexbor_str("UTF-8") },
+    { lexbor_str("utf-16be"),        lexbor_str("UTF-8") },
+
+    /* UTF-16LE */
+    { lexbor_str("csunicode"),       lexbor_str("UTF-8") },
+    { lexbor_str("iso-10646-ucs-2"), lexbor_str("UTF-8") },
+    { lexbor_str("ucs-2"),           lexbor_str("UTF-8") },
+    { lexbor_str("unicode"),         lexbor_str("UTF-8") },
+    { lexbor_str("unicodefeff"),     lexbor_str("UTF-8") },
+    { lexbor_str("utf-16"),          lexbor_str("UTF-8") },
+    { lexbor_str("utf-16le"),        lexbor_str("UTF-8") },
+
+    /* x-user-defined */
+    { lexbor_str("x-user-defined"),  lexbor_str("windows-1252") }
+};
+
+
 static const lxb_char_t *
 lxb_html_encoding_meta(lxb_html_encoding_t *em,
                        const lxb_char_t *data, const lxb_char_t *end);
@@ -99,6 +124,73 @@ lxb_html_encoding_destroy(lxb_html_encoding_t *em, bool self_destroy)
     return em;
 }
 
+const lxb_char_t *
+lxb_html_encoding_prescan(lxb_html_encoding_t *em, const lxb_char_t *data,
+                          const lxb_char_t *end, size_t *out_length)
+{
+    size_t len, length;
+    lxb_status_t status;
+    lxb_html_encoding_entry_t *entry;
+    const lxb_html_encoding_name_t *name;
+
+    static const lexbor_str_t lxb_html_encoding_utf_16le = lexbor_str("UTF-16LE");
+    static const lexbor_str_t lxb_html_encoding_utf_16be = lexbor_str("UTF-16BE");
+
+    len = end - data;
+
+    /* Prescan for UTF-16 XML declarations: If position points to. */
+    if (len >= 6) {
+        if (data[0] == 0x3C && data[1] == 0x00 && data[2] == 0x3F
+            && data[3] == 0x00 && data[4] == 0x78 && data[5] == 0x00)
+        {
+            *out_length = lxb_html_encoding_utf_16le.length;
+            return lxb_html_encoding_utf_16le.data;
+        }
+
+        if (data[0] == 0x00 && data[1] == 0x3C && data[2] == 0x00
+            && data[3] == 0x3F && data[4] == 0x00 && data[5] == 0x78)
+        {
+            *out_length = lxb_html_encoding_utf_16be.length;
+            return lxb_html_encoding_utf_16be.data;
+        }
+    }
+
+    status = lxb_html_encoding_determine(em, data, end);
+    if (status != LXB_STATUS_OK) {
+        goto EMPTY;
+    }
+
+    if (lxb_html_encoding_meta_length(em) == 0) {
+        goto EMPTY;
+    }
+
+    entry = lxb_html_encoding_meta_entry(em, 0);
+    len = entry->end - entry->name;
+    length = sizeof(lxb_html_encoding_names) / sizeof(lxb_html_encoding_name_t);
+
+    for (size_t i = 0; i < length; i++) {
+        name = &lxb_html_encoding_names[i];
+
+        if (len == name->alias.length
+            && lexbor_str_data_ncasecmp(entry->name, name->alias.data,
+                                        name->alias.length))
+        {
+            *out_length = lxb_html_encoding_names[i].name.length;
+            return lxb_html_encoding_names[i].name.data;
+        }
+    }
+
+    *out_length = entry->end - entry->name;
+
+    return entry->name;
+
+EMPTY:
+
+    *out_length = 0;
+
+    return NULL;
+}
+
 lxb_status_t
 lxb_html_encoding_determine(lxb_html_encoding_t *em,
                             const lxb_char_t *data, const lxb_char_t *end)
@@ -381,12 +473,12 @@ lxb_html_encoding_content(const lxb_char_t *data, const lxb_char_t *end,
 
         for (; data < end; data++) {
             if (*data == **name_end) {
-                break;
+                *name_end = data;
+                goto done;
             }
         }
 
-        *name_end = data;
-        goto done;
+        return NULL;
     }
 
     name = data;
diff --git a/ext/lexbor/lexbor/html/encoding.h b/ext/lexbor/lexbor/html/encoding.h
index ec65778f715e..ad5a6198f945 100644
--- a/ext/lexbor/lexbor/html/encoding.h
+++ b/ext/lexbor/lexbor/html/encoding.h
@@ -1,5 +1,14 @@
 /*
- * Copyright (C) 2019 Alexander Borisov
+ * Copyright (C) 2019-2026 Alexander Borisov
+ *
+ * Functions for detecting encoding in an HTML byte stream.
+ *
+ * The HTML parser accepts only UTF-8 input. The detected encoding can be used
+ * with the Encoding module to convert the original byte stream from its
+ * encoding to UTF-8 before passing it to the parser.
+ *
+ * By specification:
+ *     https://html.spec.whatwg.org/#determining-the-character-encoding
  *
  * Author: Alexander Borisov 
  */
@@ -12,12 +21,13 @@ extern "C" {
 #endif
 
 #include "lexbor/html/base.h"
-
 #include "lexbor/core/array_obj.h"
 
 
 typedef struct {
+    /* Pointer to the beginning of the encoding name in the original data. */
     const lxb_char_t *name;
+    /* Pointer to the end of the encoding name in the original data. */
     const lxb_char_t *end;
 }
 lxb_html_encoding_entry_t;
@@ -29,17 +39,101 @@ typedef struct {
 lxb_html_encoding_t;
 
 
+/*
+ * Initialization of the lxb_html_encoding_t object.
+ *
+ * The object can be allocated on the stack or created using
+ * lxb_html_encoding_create() function.
+ *
+ * @param[in] lxb_html_encoding_t *
+ *
+ * @return LXB_STATUS_OK if successful, otherwise an error status value.
+ */
 LXB_API lxb_status_t
 lxb_html_encoding_init(lxb_html_encoding_t *em);
 
+/*
+ * Destruction of the lxb_html_encoding_t object.
+ *
+ * Releases internal resources of the object.
+ * If the object was created using lxb_html_encoding_create(), set self_destroy
+ * to true.
+ *
+ * @param[in] lxb_html_encoding_t *
+ * @param[in] If true, the object itself will be freed.
+ *
+ * @return NULL if self_destroy is true. Pointer to the object if false.
+ */
 LXB_API lxb_html_encoding_t *
 lxb_html_encoding_destroy(lxb_html_encoding_t *em, bool self_destroy);
 
+/*
+ * Prescan a byte stream to determine its encoding.
+ *
+ * By specification:
+ *     https://html.spec.whatwg.org/#prescan-a-byte-stream-to-determine-its-encoding
+ *
+ * Returns the validated encoding name if found, or NULL otherwise.
+ *
+ * Important:
+ * The returned pointer is not guaranteed to point into the input data stream.
+ * It may reference an internal static string (e.g. when the found encoding name
+ * is matched against a known alias). Do not assume the returned pointer lies
+ * within the [data, end) range.
+ *
+ * @param[in] lxb_html_encoding_t *. Not NULL.
+ * @param[in] Pointer to the beginning of the data. Not NULL.
+ * @param[in] Pointer to the end of the data. Not NULL.
+ * @param[out] Length of the returned encoding name. Not NULL.
+ *
+ * @return Pointer to the encoding name, or NULL if no encoding was found.
+ */
+LXB_API const lxb_char_t *
+lxb_html_encoding_prescan(lxb_html_encoding_t *em, const lxb_char_t *data,
+                          const lxb_char_t *end, size_t *out_length);
 
+/*
+ * Prescan a byte stream to determine its encoding.
+ *
+ * Implementation of the HTML specification algorithm for extracting encoding
+ * from  tags. Scans raw HTML bytes looking for  and
+ *  declarations.
+ *
+ * Results can be retrieved using lxb_html_encoding_meta_entry() and
+ * lxb_html_encoding_meta_length() functions.
+ *
+ * Important:
+ * The HTML specification requires that if the determined charset is
+ * UTF-16BE/LE, it must be replaced with UTF-8, and if it is x-user-defined,
+ * it must be replaced with windows-1252. This function does not perform these
+ * replacements because it returns pointers to the original data (start and end
+ * of the found encoding name), which can be useful for developers. To get the
+ * validated encoding according to the specification, use the
+ * lxb_encoding_data_prescan_validate()/lxb_encoding_prescan_validate()
+ * functions from the Encoding module, or handle these cases manually.
+ *
+ * @param[in] lxb_html_encoding_t *. Not NULL.
+ * @param[in] Pointer to the beginning of the data. Not NULL.
+ * @param[in] Pointer to the end of the data. Not NULL.
+ *
+ * @return LXB_STATUS_OK if successful, otherwise an error status value.
+ */
 LXB_API lxb_status_t
 lxb_html_encoding_determine(lxb_html_encoding_t *em,
                             const lxb_char_t *data, const lxb_char_t *end);
 
+/*
+ * Extract encoding name from a Content-Type string.
+ *
+ * Parses the value of a content attribute looking for "charset="
+ * pattern. For example, from "text/html; charset=utf-8" extracts "utf-8".
+ *
+ * @param[in] Pointer to the beginning of the content string. Not NULL.
+ * @param[in] Pointer to the end of the content string. Not NULL.
+ * @param[out] Pointer to the end of the encoding name. Not NULL.
+ *
+ * @return Pointer to the beginning of the encoding name, or NULL if not found.
+ */
 LXB_API const lxb_char_t *
 lxb_html_encoding_content(const lxb_char_t *data, const lxb_char_t *end,
                           const lxb_char_t **name_end);
@@ -48,6 +142,14 @@ lxb_html_encoding_content(const lxb_char_t *data, const lxb_char_t *end,
 /*
  * Inline functions
  */
+
+/*
+ * Create an lxb_html_encoding_t object on the heap.
+ *
+ * The object must be initialized using lxb_html_encoding_init() after creation.
+ *
+ * @return Pointer to a new object, or NULL if memory allocation failed.
+ */
 lxb_inline lxb_html_encoding_t *
 lxb_html_encoding_create(void)
 {
@@ -55,6 +157,14 @@ lxb_html_encoding_create(void)
                                                  sizeof(lxb_html_encoding_t));
 }
 
+/*
+ * Clean the lxb_html_encoding_t object for reuse.
+ *
+ * Resets internal state so the object can be used for a new prescan without
+ * reallocation. Does not free memory.
+ *
+ * @param[in] lxb_html_encoding_t *. Not NULL.
+ */
 lxb_inline void
 lxb_html_encoding_clean(lxb_html_encoding_t *em)
 {
@@ -62,18 +172,45 @@ lxb_html_encoding_clean(lxb_html_encoding_t *em)
     lexbor_array_obj_clean(&em->result);
 }
 
+/*
+ * Get an encoding entry from the results by index.
+ *
+ * Returns a pointer to the lxb_html_encoding_entry_t which contains pointers
+ * to the beginning and end of the encoding name in the original data.
+ *
+ * @param[in] lxb_html_encoding_t *. Not NULL.
+ * @param[in] Index of the entry.
+ *
+ * @return Pointer to the entry, or NULL if the index is out of bounds.
+ */
 lxb_inline lxb_html_encoding_entry_t *
 lxb_html_encoding_meta_entry(lxb_html_encoding_t *em, size_t idx)
 {
     return (lxb_html_encoding_entry_t *) lexbor_array_obj_get(&em->result, idx);
 }
 
+/*
+ * Get the number of encoding entries found.
+ *
+ * @param[in] lxb_html_encoding_t *. Not NULL.
+ *
+ * @return Number of entries in the result.
+ */
 lxb_inline size_t
 lxb_html_encoding_meta_length(lxb_html_encoding_t *em)
 {
     return lexbor_array_obj_length(&em->result);
 }
 
+/*
+ * Get the result array object directly.
+ *
+ * Returns the internal array of lxb_html_encoding_entry_t entries.
+ *
+ * @param[in] lxb_html_encoding_t *. Not NULL.
+ *
+ * @return Pointer to the lexbor_array_obj_t with results.
+ */
 lxb_inline lexbor_array_obj_t *
 lxb_html_encoding_meta_result(lxb_html_encoding_t *em)
 {
diff --git a/ext/lexbor/lexbor/html/interface.c b/ext/lexbor/lexbor/html/interface.c
index 1e7156d92a41..1b2a57c813e9 100644
--- a/ext/lexbor/lexbor/html/interface.c
+++ b/ext/lexbor/lexbor/html/interface.c
@@ -26,30 +26,33 @@ lxb_html_interface_create(lxb_html_document_t *document, lxb_tag_id_t tag_id,
                           lxb_ns_id_t ns)
 {
     lxb_dom_node_t *node;
+    lxb_dom_element_t *domel;
+    lxb_html_unknown_element_t *unel;
 
     if (tag_id >= LXB_TAG__LAST_ENTRY) {
         if (ns == LXB_NS_HTML) {
-            lxb_html_unknown_element_t *unel;
-
             unel = lxb_html_unknown_element_interface_create(document);
             node = lxb_dom_interface_node(unel);
         }
         else if (ns == LXB_NS_SVG) {
             /* TODO: For this need implement SVGElement */
-            lxb_dom_element_t *domel;
 
             domel = lxb_dom_element_interface_create(&document->dom_document);
             node = lxb_dom_interface_node(domel);
         }
         else {
-            lxb_dom_element_t *domel;
-
             domel = lxb_dom_element_interface_create(&document->dom_document);
             node = lxb_dom_interface_node(domel);
         }
     }
     else {
-        node = lxb_html_interface_res_constructors[tag_id][ns](document);
+        if (ns < LXB_NS__LAST_ENTRY) {
+            node = lxb_html_interface_res_constructors[tag_id][ns](document);
+        }
+        else {
+            domel = lxb_dom_element_interface_create(&document->dom_document);
+            node = lxb_dom_interface_node(domel);
+        }
     }
 
     if (node == NULL) {
diff --git a/ext/lexbor/lexbor/html/interface.h b/ext/lexbor/lexbor/html/interface.h
index a58a9e7474d7..503bef6345ac 100644
--- a/ext/lexbor/lexbor/html/interface.h
+++ b/ext/lexbor/lexbor/html/interface.h
@@ -71,6 +71,7 @@ extern "C" {
 #define lxb_html_interface_quote(obj) ((lxb_html_quote_element_t *) (obj))
 #define lxb_html_interface_script(obj) ((lxb_html_script_element_t *) (obj))
 #define lxb_html_interface_select(obj) ((lxb_html_select_element_t *) (obj))
+#define lxb_html_interface_selectedcontent(obj) ((lxb_html_selectedcontent_element_t *) obj)
 #define lxb_html_interface_slot(obj) ((lxb_html_slot_element_t *) (obj))
 #define lxb_html_interface_source(obj) ((lxb_html_source_element_t *) (obj))
 #define lxb_html_interface_span(obj) ((lxb_html_span_element_t *) (obj))
@@ -146,6 +147,8 @@ typedef struct lxb_html_progress_element lxb_html_progress_element_t;
 typedef struct lxb_html_quote_element lxb_html_quote_element_t;
 typedef struct lxb_html_script_element lxb_html_script_element_t;
 typedef struct lxb_html_select_element lxb_html_select_element_t;
+typedef struct lxb_html_selectedcontent_element lxb_html_selectedcontent_element_t;
+typedef struct lxb_html_search_element lxb_html_search_element_t;
 typedef struct lxb_html_slot_element lxb_html_slot_element_t;
 typedef struct lxb_html_source_element lxb_html_source_element_t;
 typedef struct lxb_html_span_element lxb_html_span_element_t;
diff --git a/ext/lexbor/lexbor/html/interface_res.h b/ext/lexbor/lexbor/html/interface_res.h
index 980be3c7de01..8a2f765c30ff 100644
--- a/ext/lexbor/lexbor/html/interface_res.h
+++ b/ext/lexbor/lexbor/html/interface_res.h
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2018-2025 Alexander Borisov
+ * Copyright (C) 2018-2026 Alexander Borisov
  *
  * Author: Alexander Borisov 
  */
@@ -14,12 +14,10 @@
 #ifndef LXB_HTML_INTERFACE_RES_H
 #define LXB_HTML_INTERFACE_RES_H
 
-#endif /* LXB_HTML_INTERFACE_RES_H */
-
 #ifdef LXB_TAG_CONST_VERSION
-#ifndef LXB_TAG_CONST_VERSION_A161EC911182C3254E7A972D5C51DF86
+#ifndef LXB_TAG_CONST_VERSION_5AB3094FB370521074947DC082575715
 #error Mismatched tags version! See "lexbor/tag/const.h".
-#endif /* LXB_TAG_CONST_VERSION_A161EC911182C3254E7A972D5C51DF86 */
+#endif /* LXB_TAG_CONST_VERSION_5AB3094FB370521074947DC082575715 */
 #else
 #error You need to include "lexbor/tag/const.h".
 #endif /* LXB_TAG_CONST_VERSION */
@@ -97,7 +95,9 @@
 #include "lexbor/html/interfaces/progress_element.h"
 #include "lexbor/html/interfaces/quote_element.h"
 #include "lexbor/html/interfaces/script_element.h"
+#include "lexbor/html/interfaces/search_element.h"
 #include "lexbor/html/interfaces/select_element.h"
+#include "lexbor/html/interfaces/selectedcontent_element.h"
 #include "lexbor/html/interfaces/slot_element.h"
 #include "lexbor/html/interfaces/source_element.h"
 #include "lexbor/html/interfaces/span_element.h"
@@ -130,18 +130,6 @@ lxb_dom_element_interface_destroy_wrapper(void *interface)
     return lxb_dom_element_interface_destroy(interface);
 }
 
-lxb_inline void *
-lxb_html_unknown_element_interface_create_wrapper(void *interface)
-{
-    return lxb_html_unknown_element_interface_create(interface);
-}
-
-lxb_inline void *
-lxb_html_unknown_element_interface_destroy_wrapper(void *interface)
-{
-    return lxb_html_unknown_element_interface_destroy(interface);
-}
-
 lxb_inline void *
 lxb_html_element_interface_create_wrapper(void *interface)
 {
@@ -166,6 +154,18 @@ lxb_dom_text_interface_destroy_wrapper(void *interface)
     return lxb_dom_text_interface_destroy(interface);
 }
 
+lxb_inline void *
+lxb_dom_document_interface_create_wrapper(void *interface)
+{
+    return lxb_dom_document_interface_create(interface);
+}
+
+lxb_inline void *
+lxb_dom_document_interface_destroy_wrapper(void *interface)
+{
+    return lxb_dom_document_interface_destroy(interface);
+}
+
 lxb_inline void *
 lxb_html_document_interface_create_wrapper(void *interface)
 {
@@ -214,6 +214,18 @@ lxb_html_anchor_element_interface_destroy_wrapper(void *interface)
     return lxb_html_anchor_element_interface_destroy(interface);
 }
 
+lxb_inline void *
+lxb_html_unknown_element_interface_create_wrapper(void *interface)
+{
+    return lxb_html_unknown_element_interface_create(interface);
+}
+
+lxb_inline void *
+lxb_html_unknown_element_interface_destroy_wrapper(void *interface)
+{
+    return lxb_html_unknown_element_interface_destroy(interface);
+}
+
 lxb_inline void *
 lxb_html_area_element_interface_create_wrapper(void *interface)
 {
@@ -826,6 +838,18 @@ lxb_html_script_element_interface_destroy_wrapper(void *interface)
     return lxb_html_script_element_interface_destroy(interface);
 }
 
+lxb_inline void *
+lxb_html_search_element_interface_create_wrapper(void *interface)
+{
+    return lxb_html_search_element_interface_create(interface);
+}
+
+lxb_inline void *
+lxb_html_search_element_interface_destroy_wrapper(void *interface)
+{
+    return lxb_html_search_element_interface_destroy(interface);
+}
+
 lxb_inline void *
 lxb_html_select_element_interface_create_wrapper(void *interface)
 {
@@ -838,6 +862,18 @@ lxb_html_select_element_interface_destroy_wrapper(void *interface)
     return lxb_html_select_element_interface_destroy(interface);
 }
 
+lxb_inline void *
+lxb_html_selectedcontent_element_interface_create_wrapper(void *interface)
+{
+    return lxb_html_selectedcontent_element_interface_create(interface);
+}
+
+lxb_inline void *
+lxb_html_selectedcontent_element_interface_destroy_wrapper(void *interface)
+{
+    return lxb_html_selectedcontent_element_interface_destroy(interface);
+}
+
 lxb_inline void *
 lxb_html_slot_element_interface_create_wrapper(void *interface)
 {
@@ -1019,15 +1055,12 @@ lxb_html_video_element_interface_destroy_wrapper(void *interface)
 }
 
 
-#ifdef LXB_HTML_INTERFACE_RES_CONSTRUCTORS
-#ifndef LXB_HTML_INTERFACE_RES_CONSTRUCTORS_ENABLED
-#define LXB_HTML_INTERFACE_RES_CONSTRUCTORS_ENABLED
 static  lxb_dom_interface_constructor_f lxb_html_interface_res_constructors[LXB_TAG__LAST_ENTRY][LXB_NS__LAST_ENTRY] = 
 {
     /* LXB_TAG__UNDEF */
     {
-        (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper,
-        (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper,
+        (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
+        (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_html_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
@@ -1037,8 +1070,8 @@ static  lxb_dom_interface_constructor_f lxb_html_interface_res_constructors[LXB_
     },
     /* LXB_TAG__END_OF_FILE */
     {
-        (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper,
-        (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper,
+        (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
+        (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_html_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
@@ -1048,52 +1081,52 @@ static  lxb_dom_interface_constructor_f lxb_html_interface_res_constructors[LXB_
     },
     /* LXB_TAG__TEXT */
     {
-        (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper,
-        (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_dom_text_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_dom_text_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_dom_text_interface_create_wrapper,
-        (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
-        (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
-        (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper
+        (lxb_dom_interface_constructor_f) lxb_dom_text_interface_create_wrapper,
+        (lxb_dom_interface_constructor_f) lxb_dom_text_interface_create_wrapper,
+        (lxb_dom_interface_constructor_f) lxb_dom_text_interface_create_wrapper,
+        (lxb_dom_interface_constructor_f) lxb_dom_text_interface_create_wrapper,
+        (lxb_dom_interface_constructor_f) lxb_dom_text_interface_create_wrapper
     },
     /* LXB_TAG__DOCUMENT */
     {
-        (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper,
-        (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper,
+        (lxb_dom_interface_constructor_f) lxb_dom_document_interface_create_wrapper,
+        (lxb_dom_interface_constructor_f) lxb_dom_document_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_html_document_interface_create_wrapper,
-        (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
-        (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
-        (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
-        (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
-        (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper
+        (lxb_dom_interface_constructor_f) lxb_dom_document_interface_create_wrapper,
+        (lxb_dom_interface_constructor_f) lxb_dom_document_interface_create_wrapper,
+        (lxb_dom_interface_constructor_f) lxb_dom_document_interface_create_wrapper,
+        (lxb_dom_interface_constructor_f) lxb_dom_document_interface_create_wrapper,
+        (lxb_dom_interface_constructor_f) lxb_dom_document_interface_create_wrapper
     },
     /* LXB_TAG__EM_COMMENT */
     {
-        (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper,
-        (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_dom_comment_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_dom_comment_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_dom_comment_interface_create_wrapper,
-        (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
-        (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
-        (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper
+        (lxb_dom_interface_constructor_f) lxb_dom_comment_interface_create_wrapper,
+        (lxb_dom_interface_constructor_f) lxb_dom_comment_interface_create_wrapper,
+        (lxb_dom_interface_constructor_f) lxb_dom_comment_interface_create_wrapper,
+        (lxb_dom_interface_constructor_f) lxb_dom_comment_interface_create_wrapper,
+        (lxb_dom_interface_constructor_f) lxb_dom_comment_interface_create_wrapper
     },
     /* LXB_TAG__EM_DOCTYPE */
     {
-        (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper,
-        (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_dom_document_type_interface_create_wrapper,
-        (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
-        (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
-        (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
-        (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
-        (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper
+        (lxb_dom_interface_constructor_f) lxb_dom_document_type_interface_create_wrapper,
+        (lxb_dom_interface_constructor_f) lxb_dom_document_type_interface_create_wrapper,
+        (lxb_dom_interface_constructor_f) lxb_dom_document_type_interface_create_wrapper,
+        (lxb_dom_interface_constructor_f) lxb_dom_document_type_interface_create_wrapper,
+        (lxb_dom_interface_constructor_f) lxb_dom_document_type_interface_create_wrapper,
+        (lxb_dom_interface_constructor_f) lxb_dom_document_type_interface_create_wrapper,
+        (lxb_dom_interface_constructor_f) lxb_dom_document_type_interface_create_wrapper
     },
     /* LXB_TAG_A */
     {
-        (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper,
-        (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper,
+        (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
+        (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_html_anchor_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
@@ -1103,8 +1136,8 @@ static  lxb_dom_interface_constructor_f lxb_html_interface_res_constructors[LXB_
     },
     /* LXB_TAG_ABBR */
     {
-        (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper,
-        (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper,
+        (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
+        (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_html_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
@@ -1114,8 +1147,8 @@ static  lxb_dom_interface_constructor_f lxb_html_interface_res_constructors[LXB_
     },
     /* LXB_TAG_ACRONYM */
     {
-        (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper,
-        (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper,
+        (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
+        (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_html_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
@@ -1125,8 +1158,8 @@ static  lxb_dom_interface_constructor_f lxb_html_interface_res_constructors[LXB_
     },
     /* LXB_TAG_ADDRESS */
     {
-        (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper,
-        (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper,
+        (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
+        (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_html_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
@@ -1136,8 +1169,8 @@ static  lxb_dom_interface_constructor_f lxb_html_interface_res_constructors[LXB_
     },
     /* LXB_TAG_ALTGLYPH */
     {
-        (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper,
-        (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper,
+        (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
+        (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
@@ -1147,8 +1180,8 @@ static  lxb_dom_interface_constructor_f lxb_html_interface_res_constructors[LXB_
     },
     /* LXB_TAG_ALTGLYPHDEF */
     {
-        (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper,
-        (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper,
+        (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
+        (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
@@ -1158,8 +1191,8 @@ static  lxb_dom_interface_constructor_f lxb_html_interface_res_constructors[LXB_
     },
     /* LXB_TAG_ALTGLYPHITEM */
     {
-        (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper,
-        (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper,
+        (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
+        (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
@@ -1169,8 +1202,8 @@ static  lxb_dom_interface_constructor_f lxb_html_interface_res_constructors[LXB_
     },
     /* LXB_TAG_ANIMATECOLOR */
     {
-        (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper,
-        (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper,
+        (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
+        (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
@@ -1180,8 +1213,8 @@ static  lxb_dom_interface_constructor_f lxb_html_interface_res_constructors[LXB_
     },
     /* LXB_TAG_ANIMATEMOTION */
     {
-        (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper,
-        (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper,
+        (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
+        (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
@@ -1191,8 +1224,8 @@ static  lxb_dom_interface_constructor_f lxb_html_interface_res_constructors[LXB_
     },
     /* LXB_TAG_ANIMATETRANSFORM */
     {
-        (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper,
-        (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper,
+        (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
+        (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
@@ -1202,8 +1235,8 @@ static  lxb_dom_interface_constructor_f lxb_html_interface_res_constructors[LXB_
     },
     /* LXB_TAG_ANNOTATION_XML */
     {
-        (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper,
-        (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper,
+        (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
+        (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
@@ -1213,8 +1246,8 @@ static  lxb_dom_interface_constructor_f lxb_html_interface_res_constructors[LXB_
     },
     /* LXB_TAG_APPLET */
     {
-        (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper,
-        (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper,
+        (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
+        (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
@@ -1224,8 +1257,8 @@ static  lxb_dom_interface_constructor_f lxb_html_interface_res_constructors[LXB_
     },
     /* LXB_TAG_AREA */
     {
-        (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper,
-        (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper,
+        (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
+        (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_html_area_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
@@ -1235,8 +1268,8 @@ static  lxb_dom_interface_constructor_f lxb_html_interface_res_constructors[LXB_
     },
     /* LXB_TAG_ARTICLE */
     {
-        (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper,
-        (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper,
+        (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
+        (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_html_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
@@ -1246,8 +1279,8 @@ static  lxb_dom_interface_constructor_f lxb_html_interface_res_constructors[LXB_
     },
     /* LXB_TAG_ASIDE */
     {
-        (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper,
-        (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper,
+        (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
+        (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_html_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
@@ -1257,8 +1290,8 @@ static  lxb_dom_interface_constructor_f lxb_html_interface_res_constructors[LXB_
     },
     /* LXB_TAG_AUDIO */
     {
-        (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper,
-        (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper,
+        (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
+        (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_html_audio_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
@@ -1268,8 +1301,8 @@ static  lxb_dom_interface_constructor_f lxb_html_interface_res_constructors[LXB_
     },
     /* LXB_TAG_B */
     {
-        (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper,
-        (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper,
+        (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
+        (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_html_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
@@ -1279,8 +1312,8 @@ static  lxb_dom_interface_constructor_f lxb_html_interface_res_constructors[LXB_
     },
     /* LXB_TAG_BASE */
     {
-        (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper,
-        (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper,
+        (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
+        (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_html_base_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
@@ -1290,8 +1323,8 @@ static  lxb_dom_interface_constructor_f lxb_html_interface_res_constructors[LXB_
     },
     /* LXB_TAG_BASEFONT */
     {
-        (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper,
-        (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper,
+        (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
+        (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_html_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
@@ -1301,8 +1334,8 @@ static  lxb_dom_interface_constructor_f lxb_html_interface_res_constructors[LXB_
     },
     /* LXB_TAG_BDI */
     {
-        (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper,
-        (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper,
+        (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
+        (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_html_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
@@ -1312,8 +1345,8 @@ static  lxb_dom_interface_constructor_f lxb_html_interface_res_constructors[LXB_
     },
     /* LXB_TAG_BDO */
     {
-        (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper,
-        (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper,
+        (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
+        (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_html_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
@@ -1323,8 +1356,8 @@ static  lxb_dom_interface_constructor_f lxb_html_interface_res_constructors[LXB_
     },
     /* LXB_TAG_BGSOUND */
     {
-        (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper,
-        (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper,
+        (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
+        (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
@@ -1334,8 +1367,8 @@ static  lxb_dom_interface_constructor_f lxb_html_interface_res_constructors[LXB_
     },
     /* LXB_TAG_BIG */
     {
-        (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper,
-        (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper,
+        (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
+        (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_html_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
@@ -1345,8 +1378,8 @@ static  lxb_dom_interface_constructor_f lxb_html_interface_res_constructors[LXB_
     },
     /* LXB_TAG_BLINK */
     {
-        (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper,
-        (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper,
+        (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
+        (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
@@ -1356,8 +1389,8 @@ static  lxb_dom_interface_constructor_f lxb_html_interface_res_constructors[LXB_
     },
     /* LXB_TAG_BLOCKQUOTE */
     {
-        (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper,
-        (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper,
+        (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
+        (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_html_quote_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
@@ -1367,8 +1400,8 @@ static  lxb_dom_interface_constructor_f lxb_html_interface_res_constructors[LXB_
     },
     /* LXB_TAG_BODY */
     {
-        (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper,
-        (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper,
+        (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
+        (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_html_body_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
@@ -1378,8 +1411,8 @@ static  lxb_dom_interface_constructor_f lxb_html_interface_res_constructors[LXB_
     },
     /* LXB_TAG_BR */
     {
-        (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper,
-        (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper,
+        (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
+        (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_html_br_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
@@ -1389,8 +1422,8 @@ static  lxb_dom_interface_constructor_f lxb_html_interface_res_constructors[LXB_
     },
     /* LXB_TAG_BUTTON */
     {
-        (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper,
-        (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper,
+        (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
+        (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_html_button_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
@@ -1400,8 +1433,8 @@ static  lxb_dom_interface_constructor_f lxb_html_interface_res_constructors[LXB_
     },
     /* LXB_TAG_CANVAS */
     {
-        (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper,
-        (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper,
+        (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
+        (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_html_canvas_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
@@ -1411,8 +1444,8 @@ static  lxb_dom_interface_constructor_f lxb_html_interface_res_constructors[LXB_
     },
     /* LXB_TAG_CAPTION */
     {
-        (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper,
-        (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper,
+        (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
+        (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_html_table_caption_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
@@ -1422,8 +1455,8 @@ static  lxb_dom_interface_constructor_f lxb_html_interface_res_constructors[LXB_
     },
     /* LXB_TAG_CENTER */
     {
-        (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper,
-        (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper,
+        (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
+        (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_html_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
@@ -1433,8 +1466,8 @@ static  lxb_dom_interface_constructor_f lxb_html_interface_res_constructors[LXB_
     },
     /* LXB_TAG_CITE */
     {
-        (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper,
-        (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper,
+        (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
+        (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_html_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
@@ -1444,8 +1477,8 @@ static  lxb_dom_interface_constructor_f lxb_html_interface_res_constructors[LXB_
     },
     /* LXB_TAG_CLIPPATH */
     {
-        (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper,
-        (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper,
+        (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
+        (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
@@ -1455,8 +1488,8 @@ static  lxb_dom_interface_constructor_f lxb_html_interface_res_constructors[LXB_
     },
     /* LXB_TAG_CODE */
     {
-        (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper,
-        (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper,
+        (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
+        (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_html_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
@@ -1466,8 +1499,8 @@ static  lxb_dom_interface_constructor_f lxb_html_interface_res_constructors[LXB_
     },
     /* LXB_TAG_COL */
     {
-        (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper,
-        (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper,
+        (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
+        (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_html_table_col_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
@@ -1477,8 +1510,8 @@ static  lxb_dom_interface_constructor_f lxb_html_interface_res_constructors[LXB_
     },
     /* LXB_TAG_COLGROUP */
     {
-        (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper,
-        (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper,
+        (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
+        (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_html_table_col_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
@@ -1488,8 +1521,8 @@ static  lxb_dom_interface_constructor_f lxb_html_interface_res_constructors[LXB_
     },
     /* LXB_TAG_DATA */
     {
-        (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper,
-        (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper,
+        (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
+        (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_html_data_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
@@ -1499,8 +1532,8 @@ static  lxb_dom_interface_constructor_f lxb_html_interface_res_constructors[LXB_
     },
     /* LXB_TAG_DATALIST */
     {
-        (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper,
-        (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper,
+        (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
+        (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_html_data_list_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
@@ -1510,8 +1543,8 @@ static  lxb_dom_interface_constructor_f lxb_html_interface_res_constructors[LXB_
     },
     /* LXB_TAG_DD */
     {
-        (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper,
-        (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper,
+        (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
+        (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_html_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
@@ -1521,8 +1554,8 @@ static  lxb_dom_interface_constructor_f lxb_html_interface_res_constructors[LXB_
     },
     /* LXB_TAG_DEL */
     {
-        (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper,
-        (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper,
+        (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
+        (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_html_mod_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
@@ -1532,8 +1565,8 @@ static  lxb_dom_interface_constructor_f lxb_html_interface_res_constructors[LXB_
     },
     /* LXB_TAG_DESC */
     {
-        (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper,
-        (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper,
+        (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
+        (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
@@ -1543,8 +1576,8 @@ static  lxb_dom_interface_constructor_f lxb_html_interface_res_constructors[LXB_
     },
     /* LXB_TAG_DETAILS */
     {
-        (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper,
-        (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper,
+        (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
+        (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_html_details_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
@@ -1554,8 +1587,8 @@ static  lxb_dom_interface_constructor_f lxb_html_interface_res_constructors[LXB_
     },
     /* LXB_TAG_DFN */
     {
-        (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper,
-        (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper,
+        (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
+        (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_html_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
@@ -1565,8 +1598,8 @@ static  lxb_dom_interface_constructor_f lxb_html_interface_res_constructors[LXB_
     },
     /* LXB_TAG_DIALOG */
     {
-        (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper,
-        (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper,
+        (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
+        (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_html_dialog_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
@@ -1576,8 +1609,8 @@ static  lxb_dom_interface_constructor_f lxb_html_interface_res_constructors[LXB_
     },
     /* LXB_TAG_DIR */
     {
-        (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper,
-        (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper,
+        (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
+        (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_html_directory_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
@@ -1587,8 +1620,8 @@ static  lxb_dom_interface_constructor_f lxb_html_interface_res_constructors[LXB_
     },
     /* LXB_TAG_DIV */
     {
-        (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper,
-        (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper,
+        (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
+        (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_html_div_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
@@ -1598,8 +1631,8 @@ static  lxb_dom_interface_constructor_f lxb_html_interface_res_constructors[LXB_
     },
     /* LXB_TAG_DL */
     {
-        (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper,
-        (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper,
+        (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
+        (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_html_d_list_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
@@ -1609,8 +1642,8 @@ static  lxb_dom_interface_constructor_f lxb_html_interface_res_constructors[LXB_
     },
     /* LXB_TAG_DT */
     {
-        (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper,
-        (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper,
+        (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
+        (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_html_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
@@ -1620,8 +1653,8 @@ static  lxb_dom_interface_constructor_f lxb_html_interface_res_constructors[LXB_
     },
     /* LXB_TAG_EM */
     {
-        (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper,
-        (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper,
+        (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
+        (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_html_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
@@ -1631,8 +1664,8 @@ static  lxb_dom_interface_constructor_f lxb_html_interface_res_constructors[LXB_
     },
     /* LXB_TAG_EMBED */
     {
-        (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper,
-        (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper,
+        (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
+        (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_html_embed_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
@@ -1642,8 +1675,8 @@ static  lxb_dom_interface_constructor_f lxb_html_interface_res_constructors[LXB_
     },
     /* LXB_TAG_FEBLEND */
     {
-        (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper,
-        (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper,
+        (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
+        (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
@@ -1653,8 +1686,8 @@ static  lxb_dom_interface_constructor_f lxb_html_interface_res_constructors[LXB_
     },
     /* LXB_TAG_FECOLORMATRIX */
     {
-        (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper,
-        (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper,
+        (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
+        (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
@@ -1664,8 +1697,8 @@ static  lxb_dom_interface_constructor_f lxb_html_interface_res_constructors[LXB_
     },
     /* LXB_TAG_FECOMPONENTTRANSFER */
     {
-        (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper,
-        (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper,
+        (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
+        (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
@@ -1675,8 +1708,8 @@ static  lxb_dom_interface_constructor_f lxb_html_interface_res_constructors[LXB_
     },
     /* LXB_TAG_FECOMPOSITE */
     {
-        (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper,
-        (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper,
+        (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
+        (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
@@ -1686,8 +1719,8 @@ static  lxb_dom_interface_constructor_f lxb_html_interface_res_constructors[LXB_
     },
     /* LXB_TAG_FECONVOLVEMATRIX */
     {
-        (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper,
-        (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper,
+        (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
+        (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
@@ -1697,8 +1730,8 @@ static  lxb_dom_interface_constructor_f lxb_html_interface_res_constructors[LXB_
     },
     /* LXB_TAG_FEDIFFUSELIGHTING */
     {
-        (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper,
-        (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper,
+        (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
+        (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
@@ -1708,8 +1741,8 @@ static  lxb_dom_interface_constructor_f lxb_html_interface_res_constructors[LXB_
     },
     /* LXB_TAG_FEDISPLACEMENTMAP */
     {
-        (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper,
-        (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper,
+        (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
+        (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
@@ -1719,8 +1752,8 @@ static  lxb_dom_interface_constructor_f lxb_html_interface_res_constructors[LXB_
     },
     /* LXB_TAG_FEDISTANTLIGHT */
     {
-        (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper,
-        (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper,
+        (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
+        (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
@@ -1730,8 +1763,8 @@ static  lxb_dom_interface_constructor_f lxb_html_interface_res_constructors[LXB_
     },
     /* LXB_TAG_FEDROPSHADOW */
     {
-        (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper,
-        (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper,
+        (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
+        (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
@@ -1741,8 +1774,8 @@ static  lxb_dom_interface_constructor_f lxb_html_interface_res_constructors[LXB_
     },
     /* LXB_TAG_FEFLOOD */
     {
-        (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper,
-        (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper,
+        (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
+        (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
@@ -1752,8 +1785,8 @@ static  lxb_dom_interface_constructor_f lxb_html_interface_res_constructors[LXB_
     },
     /* LXB_TAG_FEFUNCA */
     {
-        (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper,
-        (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper,
+        (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
+        (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
@@ -1763,8 +1796,8 @@ static  lxb_dom_interface_constructor_f lxb_html_interface_res_constructors[LXB_
     },
     /* LXB_TAG_FEFUNCB */
     {
-        (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper,
-        (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper,
+        (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
+        (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
@@ -1774,8 +1807,8 @@ static  lxb_dom_interface_constructor_f lxb_html_interface_res_constructors[LXB_
     },
     /* LXB_TAG_FEFUNCG */
     {
-        (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper,
-        (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper,
+        (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
+        (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
@@ -1785,8 +1818,8 @@ static  lxb_dom_interface_constructor_f lxb_html_interface_res_constructors[LXB_
     },
     /* LXB_TAG_FEFUNCR */
     {
-        (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper,
-        (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper,
+        (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
+        (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
@@ -1796,8 +1829,8 @@ static  lxb_dom_interface_constructor_f lxb_html_interface_res_constructors[LXB_
     },
     /* LXB_TAG_FEGAUSSIANBLUR */
     {
-        (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper,
-        (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper,
+        (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
+        (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
@@ -1807,8 +1840,8 @@ static  lxb_dom_interface_constructor_f lxb_html_interface_res_constructors[LXB_
     },
     /* LXB_TAG_FEIMAGE */
     {
-        (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper,
-        (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper,
+        (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
+        (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
@@ -1818,8 +1851,8 @@ static  lxb_dom_interface_constructor_f lxb_html_interface_res_constructors[LXB_
     },
     /* LXB_TAG_FEMERGE */
     {
-        (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper,
-        (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper,
+        (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
+        (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
@@ -1829,8 +1862,8 @@ static  lxb_dom_interface_constructor_f lxb_html_interface_res_constructors[LXB_
     },
     /* LXB_TAG_FEMERGENODE */
     {
-        (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper,
-        (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper,
+        (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
+        (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
@@ -1840,8 +1873,8 @@ static  lxb_dom_interface_constructor_f lxb_html_interface_res_constructors[LXB_
     },
     /* LXB_TAG_FEMORPHOLOGY */
     {
-        (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper,
-        (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper,
+        (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
+        (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
@@ -1851,8 +1884,8 @@ static  lxb_dom_interface_constructor_f lxb_html_interface_res_constructors[LXB_
     },
     /* LXB_TAG_FEOFFSET */
     {
-        (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper,
-        (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper,
+        (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
+        (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
@@ -1862,8 +1895,8 @@ static  lxb_dom_interface_constructor_f lxb_html_interface_res_constructors[LXB_
     },
     /* LXB_TAG_FEPOINTLIGHT */
     {
-        (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper,
-        (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper,
+        (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
+        (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
@@ -1873,8 +1906,8 @@ static  lxb_dom_interface_constructor_f lxb_html_interface_res_constructors[LXB_
     },
     /* LXB_TAG_FESPECULARLIGHTING */
     {
-        (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper,
-        (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper,
+        (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
+        (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
@@ -1884,8 +1917,8 @@ static  lxb_dom_interface_constructor_f lxb_html_interface_res_constructors[LXB_
     },
     /* LXB_TAG_FESPOTLIGHT */
     {
-        (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper,
-        (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper,
+        (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
+        (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
@@ -1895,8 +1928,8 @@ static  lxb_dom_interface_constructor_f lxb_html_interface_res_constructors[LXB_
     },
     /* LXB_TAG_FETILE */
     {
-        (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper,
-        (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper,
+        (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
+        (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
@@ -1906,8 +1939,8 @@ static  lxb_dom_interface_constructor_f lxb_html_interface_res_constructors[LXB_
     },
     /* LXB_TAG_FETURBULENCE */
     {
-        (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper,
-        (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper,
+        (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
+        (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
@@ -1917,8 +1950,8 @@ static  lxb_dom_interface_constructor_f lxb_html_interface_res_constructors[LXB_
     },
     /* LXB_TAG_FIELDSET */
     {
-        (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper,
-        (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper,
+        (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
+        (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_html_field_set_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
@@ -1928,8 +1961,8 @@ static  lxb_dom_interface_constructor_f lxb_html_interface_res_constructors[LXB_
     },
     /* LXB_TAG_FIGCAPTION */
     {
-        (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper,
-        (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper,
+        (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
+        (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_html_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
@@ -1939,8 +1972,8 @@ static  lxb_dom_interface_constructor_f lxb_html_interface_res_constructors[LXB_
     },
     /* LXB_TAG_FIGURE */
     {
-        (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper,
-        (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper,
+        (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
+        (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_html_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
@@ -1950,8 +1983,8 @@ static  lxb_dom_interface_constructor_f lxb_html_interface_res_constructors[LXB_
     },
     /* LXB_TAG_FONT */
     {
-        (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper,
-        (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper,
+        (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
+        (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_html_font_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
@@ -1961,8 +1994,8 @@ static  lxb_dom_interface_constructor_f lxb_html_interface_res_constructors[LXB_
     },
     /* LXB_TAG_FOOTER */
     {
-        (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper,
-        (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper,
+        (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
+        (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_html_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
@@ -1972,8 +2005,8 @@ static  lxb_dom_interface_constructor_f lxb_html_interface_res_constructors[LXB_
     },
     /* LXB_TAG_FOREIGNOBJECT */
     {
-        (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper,
-        (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper,
+        (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
+        (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
@@ -1983,8 +2016,8 @@ static  lxb_dom_interface_constructor_f lxb_html_interface_res_constructors[LXB_
     },
     /* LXB_TAG_FORM */
     {
-        (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper,
-        (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper,
+        (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
+        (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_html_form_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
@@ -1994,8 +2027,8 @@ static  lxb_dom_interface_constructor_f lxb_html_interface_res_constructors[LXB_
     },
     /* LXB_TAG_FRAME */
     {
-        (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper,
-        (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper,
+        (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
+        (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_html_frame_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
@@ -2005,8 +2038,8 @@ static  lxb_dom_interface_constructor_f lxb_html_interface_res_constructors[LXB_
     },
     /* LXB_TAG_FRAMESET */
     {
-        (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper,
-        (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper,
+        (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
+        (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_html_frame_set_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
@@ -2016,8 +2049,8 @@ static  lxb_dom_interface_constructor_f lxb_html_interface_res_constructors[LXB_
     },
     /* LXB_TAG_GLYPHREF */
     {
-        (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper,
-        (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper,
+        (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
+        (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
@@ -2027,8 +2060,8 @@ static  lxb_dom_interface_constructor_f lxb_html_interface_res_constructors[LXB_
     },
     /* LXB_TAG_H1 */
     {
-        (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper,
-        (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper,
+        (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
+        (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_html_heading_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
@@ -2038,8 +2071,8 @@ static  lxb_dom_interface_constructor_f lxb_html_interface_res_constructors[LXB_
     },
     /* LXB_TAG_H2 */
     {
-        (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper,
-        (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper,
+        (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
+        (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_html_heading_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
@@ -2049,8 +2082,8 @@ static  lxb_dom_interface_constructor_f lxb_html_interface_res_constructors[LXB_
     },
     /* LXB_TAG_H3 */
     {
-        (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper,
-        (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper,
+        (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
+        (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_html_heading_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
@@ -2060,8 +2093,8 @@ static  lxb_dom_interface_constructor_f lxb_html_interface_res_constructors[LXB_
     },
     /* LXB_TAG_H4 */
     {
-        (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper,
-        (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper,
+        (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
+        (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_html_heading_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
@@ -2071,8 +2104,8 @@ static  lxb_dom_interface_constructor_f lxb_html_interface_res_constructors[LXB_
     },
     /* LXB_TAG_H5 */
     {
-        (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper,
-        (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper,
+        (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
+        (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_html_heading_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
@@ -2082,8 +2115,8 @@ static  lxb_dom_interface_constructor_f lxb_html_interface_res_constructors[LXB_
     },
     /* LXB_TAG_H6 */
     {
-        (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper,
-        (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper,
+        (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
+        (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_html_heading_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
@@ -2093,8 +2126,8 @@ static  lxb_dom_interface_constructor_f lxb_html_interface_res_constructors[LXB_
     },
     /* LXB_TAG_HEAD */
     {
-        (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper,
-        (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper,
+        (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
+        (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_html_head_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
@@ -2104,8 +2137,8 @@ static  lxb_dom_interface_constructor_f lxb_html_interface_res_constructors[LXB_
     },
     /* LXB_TAG_HEADER */
     {
-        (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper,
-        (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper,
+        (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
+        (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_html_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
@@ -2115,8 +2148,8 @@ static  lxb_dom_interface_constructor_f lxb_html_interface_res_constructors[LXB_
     },
     /* LXB_TAG_HGROUP */
     {
-        (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper,
-        (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper,
+        (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
+        (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_html_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
@@ -2126,8 +2159,8 @@ static  lxb_dom_interface_constructor_f lxb_html_interface_res_constructors[LXB_
     },
     /* LXB_TAG_HR */
     {
-        (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper,
-        (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper,
+        (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
+        (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_html_hr_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
@@ -2137,8 +2170,8 @@ static  lxb_dom_interface_constructor_f lxb_html_interface_res_constructors[LXB_
     },
     /* LXB_TAG_HTML */
     {
-        (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper,
-        (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper,
+        (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
+        (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_html_html_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
@@ -2148,8 +2181,8 @@ static  lxb_dom_interface_constructor_f lxb_html_interface_res_constructors[LXB_
     },
     /* LXB_TAG_I */
     {
-        (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper,
-        (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper,
+        (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
+        (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_html_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
@@ -2159,8 +2192,8 @@ static  lxb_dom_interface_constructor_f lxb_html_interface_res_constructors[LXB_
     },
     /* LXB_TAG_IFRAME */
     {
-        (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper,
-        (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper,
+        (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
+        (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_html_iframe_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
@@ -2170,8 +2203,8 @@ static  lxb_dom_interface_constructor_f lxb_html_interface_res_constructors[LXB_
     },
     /* LXB_TAG_IMAGE */
     {
-        (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper,
-        (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper,
+        (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
+        (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_html_image_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
@@ -2181,8 +2214,8 @@ static  lxb_dom_interface_constructor_f lxb_html_interface_res_constructors[LXB_
     },
     /* LXB_TAG_IMG */
     {
-        (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper,
-        (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper,
+        (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
+        (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_html_image_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
@@ -2192,8 +2225,8 @@ static  lxb_dom_interface_constructor_f lxb_html_interface_res_constructors[LXB_
     },
     /* LXB_TAG_INPUT */
     {
-        (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper,
-        (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper,
+        (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
+        (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_html_input_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
@@ -2203,8 +2236,8 @@ static  lxb_dom_interface_constructor_f lxb_html_interface_res_constructors[LXB_
     },
     /* LXB_TAG_INS */
     {
-        (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper,
-        (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper,
+        (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
+        (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_html_mod_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
@@ -2214,8 +2247,8 @@ static  lxb_dom_interface_constructor_f lxb_html_interface_res_constructors[LXB_
     },
     /* LXB_TAG_ISINDEX */
     {
-        (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper,
-        (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper,
+        (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
+        (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
@@ -2225,8 +2258,8 @@ static  lxb_dom_interface_constructor_f lxb_html_interface_res_constructors[LXB_
     },
     /* LXB_TAG_KBD */
     {
-        (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper,
-        (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper,
+        (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
+        (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_html_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
@@ -2236,8 +2269,8 @@ static  lxb_dom_interface_constructor_f lxb_html_interface_res_constructors[LXB_
     },
     /* LXB_TAG_KEYGEN */
     {
-        (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper,
-        (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper,
+        (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
+        (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
@@ -2247,8 +2280,8 @@ static  lxb_dom_interface_constructor_f lxb_html_interface_res_constructors[LXB_
     },
     /* LXB_TAG_LABEL */
     {
-        (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper,
-        (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper,
+        (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
+        (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_html_label_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
@@ -2258,8 +2291,8 @@ static  lxb_dom_interface_constructor_f lxb_html_interface_res_constructors[LXB_
     },
     /* LXB_TAG_LEGEND */
     {
-        (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper,
-        (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper,
+        (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
+        (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_html_legend_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
@@ -2269,8 +2302,8 @@ static  lxb_dom_interface_constructor_f lxb_html_interface_res_constructors[LXB_
     },
     /* LXB_TAG_LI */
     {
-        (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper,
-        (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper,
+        (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
+        (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_html_li_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
@@ -2280,8 +2313,8 @@ static  lxb_dom_interface_constructor_f lxb_html_interface_res_constructors[LXB_
     },
     /* LXB_TAG_LINEARGRADIENT */
     {
-        (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper,
-        (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper,
+        (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
+        (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
@@ -2291,8 +2324,8 @@ static  lxb_dom_interface_constructor_f lxb_html_interface_res_constructors[LXB_
     },
     /* LXB_TAG_LINK */
     {
-        (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper,
-        (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper,
+        (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
+        (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_html_link_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
@@ -2302,8 +2335,8 @@ static  lxb_dom_interface_constructor_f lxb_html_interface_res_constructors[LXB_
     },
     /* LXB_TAG_LISTING */
     {
-        (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper,
-        (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper,
+        (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
+        (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_html_pre_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
@@ -2313,8 +2346,8 @@ static  lxb_dom_interface_constructor_f lxb_html_interface_res_constructors[LXB_
     },
     /* LXB_TAG_MAIN */
     {
-        (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper,
-        (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper,
+        (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
+        (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_html_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
@@ -2324,8 +2357,8 @@ static  lxb_dom_interface_constructor_f lxb_html_interface_res_constructors[LXB_
     },
     /* LXB_TAG_MALIGNMARK */
     {
-        (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper,
-        (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper,
+        (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
+        (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
@@ -2335,8 +2368,8 @@ static  lxb_dom_interface_constructor_f lxb_html_interface_res_constructors[LXB_
     },
     /* LXB_TAG_MAP */
     {
-        (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper,
-        (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper,
+        (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
+        (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_html_map_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
@@ -2346,8 +2379,8 @@ static  lxb_dom_interface_constructor_f lxb_html_interface_res_constructors[LXB_
     },
     /* LXB_TAG_MARK */
     {
-        (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper,
-        (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper,
+        (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
+        (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_html_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
@@ -2357,8 +2390,8 @@ static  lxb_dom_interface_constructor_f lxb_html_interface_res_constructors[LXB_
     },
     /* LXB_TAG_MARQUEE */
     {
-        (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper,
-        (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper,
+        (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
+        (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_html_marquee_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
@@ -2368,8 +2401,8 @@ static  lxb_dom_interface_constructor_f lxb_html_interface_res_constructors[LXB_
     },
     /* LXB_TAG_MATH */
     {
-        (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper,
-        (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper,
+        (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
+        (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
@@ -2379,8 +2412,8 @@ static  lxb_dom_interface_constructor_f lxb_html_interface_res_constructors[LXB_
     },
     /* LXB_TAG_MENU */
     {
-        (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper,
-        (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper,
+        (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
+        (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_html_menu_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
@@ -2390,8 +2423,8 @@ static  lxb_dom_interface_constructor_f lxb_html_interface_res_constructors[LXB_
     },
     /* LXB_TAG_META */
     {
-        (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper,
-        (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper,
+        (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
+        (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_html_meta_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
@@ -2401,8 +2434,8 @@ static  lxb_dom_interface_constructor_f lxb_html_interface_res_constructors[LXB_
     },
     /* LXB_TAG_METER */
     {
-        (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper,
-        (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper,
+        (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
+        (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_html_meter_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
@@ -2412,8 +2445,8 @@ static  lxb_dom_interface_constructor_f lxb_html_interface_res_constructors[LXB_
     },
     /* LXB_TAG_MFENCED */
     {
-        (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper,
-        (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper,
+        (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
+        (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
@@ -2423,8 +2456,8 @@ static  lxb_dom_interface_constructor_f lxb_html_interface_res_constructors[LXB_
     },
     /* LXB_TAG_MGLYPH */
     {
-        (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper,
-        (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper,
+        (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
+        (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
@@ -2434,8 +2467,8 @@ static  lxb_dom_interface_constructor_f lxb_html_interface_res_constructors[LXB_
     },
     /* LXB_TAG_MI */
     {
-        (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper,
-        (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper,
+        (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
+        (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
@@ -2445,8 +2478,8 @@ static  lxb_dom_interface_constructor_f lxb_html_interface_res_constructors[LXB_
     },
     /* LXB_TAG_MN */
     {
-        (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper,
-        (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper,
+        (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
+        (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
@@ -2456,8 +2489,8 @@ static  lxb_dom_interface_constructor_f lxb_html_interface_res_constructors[LXB_
     },
     /* LXB_TAG_MO */
     {
-        (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper,
-        (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper,
+        (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
+        (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
@@ -2467,8 +2500,8 @@ static  lxb_dom_interface_constructor_f lxb_html_interface_res_constructors[LXB_
     },
     /* LXB_TAG_MS */
     {
-        (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper,
-        (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper,
+        (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
+        (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
@@ -2478,8 +2511,8 @@ static  lxb_dom_interface_constructor_f lxb_html_interface_res_constructors[LXB_
     },
     /* LXB_TAG_MTEXT */
     {
-        (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper,
-        (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper,
+        (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
+        (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
@@ -2489,8 +2522,8 @@ static  lxb_dom_interface_constructor_f lxb_html_interface_res_constructors[LXB_
     },
     /* LXB_TAG_MULTICOL */
     {
-        (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper,
-        (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper,
+        (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
+        (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
@@ -2500,8 +2533,8 @@ static  lxb_dom_interface_constructor_f lxb_html_interface_res_constructors[LXB_
     },
     /* LXB_TAG_NAV */
     {
-        (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper,
-        (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper,
+        (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
+        (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_html_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
@@ -2511,8 +2544,8 @@ static  lxb_dom_interface_constructor_f lxb_html_interface_res_constructors[LXB_
     },
     /* LXB_TAG_NEXTID */
     {
-        (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper,
-        (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper,
+        (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
+        (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
@@ -2522,8 +2555,8 @@ static  lxb_dom_interface_constructor_f lxb_html_interface_res_constructors[LXB_
     },
     /* LXB_TAG_NOBR */
     {
-        (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper,
-        (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper,
+        (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
+        (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_html_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
@@ -2533,8 +2566,8 @@ static  lxb_dom_interface_constructor_f lxb_html_interface_res_constructors[LXB_
     },
     /* LXB_TAG_NOEMBED */
     {
-        (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper,
-        (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper,
+        (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
+        (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_html_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
@@ -2544,8 +2577,8 @@ static  lxb_dom_interface_constructor_f lxb_html_interface_res_constructors[LXB_
     },
     /* LXB_TAG_NOFRAMES */
     {
-        (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper,
-        (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper,
+        (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
+        (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_html_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
@@ -2555,8 +2588,8 @@ static  lxb_dom_interface_constructor_f lxb_html_interface_res_constructors[LXB_
     },
     /* LXB_TAG_NOSCRIPT */
     {
-        (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper,
-        (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper,
+        (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
+        (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_html_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
@@ -2566,8 +2599,8 @@ static  lxb_dom_interface_constructor_f lxb_html_interface_res_constructors[LXB_
     },
     /* LXB_TAG_OBJECT */
     {
-        (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper,
-        (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper,
+        (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
+        (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_html_object_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
@@ -2577,8 +2610,8 @@ static  lxb_dom_interface_constructor_f lxb_html_interface_res_constructors[LXB_
     },
     /* LXB_TAG_OL */
     {
-        (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper,
-        (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper,
+        (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
+        (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_html_o_list_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
@@ -2588,8 +2621,8 @@ static  lxb_dom_interface_constructor_f lxb_html_interface_res_constructors[LXB_
     },
     /* LXB_TAG_OPTGROUP */
     {
-        (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper,
-        (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper,
+        (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
+        (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_html_opt_group_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
@@ -2599,8 +2632,8 @@ static  lxb_dom_interface_constructor_f lxb_html_interface_res_constructors[LXB_
     },
     /* LXB_TAG_OPTION */
     {
-        (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper,
-        (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper,
+        (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
+        (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_html_option_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
@@ -2610,8 +2643,8 @@ static  lxb_dom_interface_constructor_f lxb_html_interface_res_constructors[LXB_
     },
     /* LXB_TAG_OUTPUT */
     {
-        (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper,
-        (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper,
+        (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
+        (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_html_output_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
@@ -2621,8 +2654,8 @@ static  lxb_dom_interface_constructor_f lxb_html_interface_res_constructors[LXB_
     },
     /* LXB_TAG_P */
     {
-        (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper,
-        (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper,
+        (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
+        (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_html_paragraph_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
@@ -2632,8 +2665,8 @@ static  lxb_dom_interface_constructor_f lxb_html_interface_res_constructors[LXB_
     },
     /* LXB_TAG_PARAM */
     {
-        (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper,
-        (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper,
+        (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
+        (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_html_param_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
@@ -2643,8 +2676,8 @@ static  lxb_dom_interface_constructor_f lxb_html_interface_res_constructors[LXB_
     },
     /* LXB_TAG_PATH */
     {
-        (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper,
-        (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper,
+        (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
+        (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
@@ -2654,8 +2687,8 @@ static  lxb_dom_interface_constructor_f lxb_html_interface_res_constructors[LXB_
     },
     /* LXB_TAG_PICTURE */
     {
-        (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper,
-        (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper,
+        (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
+        (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_html_picture_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
@@ -2665,8 +2698,8 @@ static  lxb_dom_interface_constructor_f lxb_html_interface_res_constructors[LXB_
     },
     /* LXB_TAG_PLAINTEXT */
     {
-        (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper,
-        (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper,
+        (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
+        (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_html_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
@@ -2676,8 +2709,8 @@ static  lxb_dom_interface_constructor_f lxb_html_interface_res_constructors[LXB_
     },
     /* LXB_TAG_PRE */
     {
-        (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper,
-        (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper,
+        (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
+        (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_html_pre_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
@@ -2687,8 +2720,8 @@ static  lxb_dom_interface_constructor_f lxb_html_interface_res_constructors[LXB_
     },
     /* LXB_TAG_PROGRESS */
     {
-        (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper,
-        (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper,
+        (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
+        (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_html_progress_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
@@ -2698,8 +2731,8 @@ static  lxb_dom_interface_constructor_f lxb_html_interface_res_constructors[LXB_
     },
     /* LXB_TAG_Q */
     {
-        (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper,
-        (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper,
+        (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
+        (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_html_quote_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
@@ -2709,8 +2742,8 @@ static  lxb_dom_interface_constructor_f lxb_html_interface_res_constructors[LXB_
     },
     /* LXB_TAG_RADIALGRADIENT */
     {
-        (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper,
-        (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper,
+        (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
+        (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
@@ -2720,8 +2753,8 @@ static  lxb_dom_interface_constructor_f lxb_html_interface_res_constructors[LXB_
     },
     /* LXB_TAG_RB */
     {
-        (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper,
-        (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper,
+        (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
+        (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_html_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
@@ -2731,8 +2764,8 @@ static  lxb_dom_interface_constructor_f lxb_html_interface_res_constructors[LXB_
     },
     /* LXB_TAG_RP */
     {
-        (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper,
-        (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper,
+        (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
+        (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_html_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
@@ -2742,8 +2775,8 @@ static  lxb_dom_interface_constructor_f lxb_html_interface_res_constructors[LXB_
     },
     /* LXB_TAG_RT */
     {
-        (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper,
-        (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper,
+        (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
+        (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_html_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
@@ -2753,8 +2786,8 @@ static  lxb_dom_interface_constructor_f lxb_html_interface_res_constructors[LXB_
     },
     /* LXB_TAG_RTC */
     {
-        (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper,
-        (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper,
+        (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
+        (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_html_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
@@ -2764,8 +2797,8 @@ static  lxb_dom_interface_constructor_f lxb_html_interface_res_constructors[LXB_
     },
     /* LXB_TAG_RUBY */
     {
-        (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper,
-        (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper,
+        (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
+        (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_html_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
@@ -2775,8 +2808,8 @@ static  lxb_dom_interface_constructor_f lxb_html_interface_res_constructors[LXB_
     },
     /* LXB_TAG_S */
     {
-        (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper,
-        (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper,
+        (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
+        (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_html_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
@@ -2786,8 +2819,8 @@ static  lxb_dom_interface_constructor_f lxb_html_interface_res_constructors[LXB_
     },
     /* LXB_TAG_SAMP */
     {
-        (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper,
-        (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper,
+        (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
+        (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_html_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
@@ -2797,8 +2830,8 @@ static  lxb_dom_interface_constructor_f lxb_html_interface_res_constructors[LXB_
     },
     /* LXB_TAG_SCRIPT */
     {
-        (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper,
-        (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper,
+        (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
+        (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_html_script_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
@@ -2806,10 +2839,21 @@ static  lxb_dom_interface_constructor_f lxb_html_interface_res_constructors[LXB_
         (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper
     },
+    /* LXB_TAG_SEARCH */
+    {
+        (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
+        (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
+        (lxb_dom_interface_constructor_f) lxb_html_search_element_interface_create_wrapper,
+        (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
+        (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
+        (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
+        (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
+        (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper
+    },
     /* LXB_TAG_SECTION */
     {
-        (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper,
-        (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper,
+        (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
+        (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_html_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
@@ -2819,8 +2863,8 @@ static  lxb_dom_interface_constructor_f lxb_html_interface_res_constructors[LXB_
     },
     /* LXB_TAG_SELECT */
     {
-        (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper,
-        (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper,
+        (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
+        (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_html_select_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
@@ -2828,10 +2872,21 @@ static  lxb_dom_interface_constructor_f lxb_html_interface_res_constructors[LXB_
         (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper
     },
+    /* LXB_TAG_SELECTEDCONTENT */
+    {
+        (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
+        (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
+        (lxb_dom_interface_constructor_f) lxb_html_selectedcontent_element_interface_create_wrapper,
+        (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
+        (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
+        (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
+        (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
+        (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper
+    },
     /* LXB_TAG_SLOT */
     {
-        (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper,
-        (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper,
+        (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
+        (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_html_slot_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
@@ -2841,8 +2896,8 @@ static  lxb_dom_interface_constructor_f lxb_html_interface_res_constructors[LXB_
     },
     /* LXB_TAG_SMALL */
     {
-        (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper,
-        (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper,
+        (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
+        (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_html_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
@@ -2852,8 +2907,8 @@ static  lxb_dom_interface_constructor_f lxb_html_interface_res_constructors[LXB_
     },
     /* LXB_TAG_SOURCE */
     {
-        (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper,
-        (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper,
+        (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
+        (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_html_source_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
@@ -2863,8 +2918,8 @@ static  lxb_dom_interface_constructor_f lxb_html_interface_res_constructors[LXB_
     },
     /* LXB_TAG_SPACER */
     {
-        (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper,
-        (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper,
+        (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
+        (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
@@ -2874,8 +2929,8 @@ static  lxb_dom_interface_constructor_f lxb_html_interface_res_constructors[LXB_
     },
     /* LXB_TAG_SPAN */
     {
-        (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper,
-        (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper,
+        (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
+        (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_html_span_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
@@ -2885,8 +2940,8 @@ static  lxb_dom_interface_constructor_f lxb_html_interface_res_constructors[LXB_
     },
     /* LXB_TAG_STRIKE */
     {
-        (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper,
-        (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper,
+        (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
+        (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_html_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
@@ -2896,8 +2951,8 @@ static  lxb_dom_interface_constructor_f lxb_html_interface_res_constructors[LXB_
     },
     /* LXB_TAG_STRONG */
     {
-        (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper,
-        (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper,
+        (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
+        (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_html_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
@@ -2907,8 +2962,8 @@ static  lxb_dom_interface_constructor_f lxb_html_interface_res_constructors[LXB_
     },
     /* LXB_TAG_STYLE */
     {
-        (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper,
-        (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper,
+        (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
+        (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_html_style_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
@@ -2918,8 +2973,8 @@ static  lxb_dom_interface_constructor_f lxb_html_interface_res_constructors[LXB_
     },
     /* LXB_TAG_SUB */
     {
-        (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper,
-        (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper,
+        (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
+        (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_html_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
@@ -2929,8 +2984,8 @@ static  lxb_dom_interface_constructor_f lxb_html_interface_res_constructors[LXB_
     },
     /* LXB_TAG_SUMMARY */
     {
-        (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper,
-        (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper,
+        (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
+        (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_html_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
@@ -2940,8 +2995,8 @@ static  lxb_dom_interface_constructor_f lxb_html_interface_res_constructors[LXB_
     },
     /* LXB_TAG_SUP */
     {
-        (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper,
-        (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper,
+        (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
+        (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_html_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
@@ -2951,8 +3006,8 @@ static  lxb_dom_interface_constructor_f lxb_html_interface_res_constructors[LXB_
     },
     /* LXB_TAG_SVG */
     {
-        (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper,
-        (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper,
+        (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
+        (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
@@ -2962,8 +3017,8 @@ static  lxb_dom_interface_constructor_f lxb_html_interface_res_constructors[LXB_
     },
     /* LXB_TAG_TABLE */
     {
-        (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper,
-        (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper,
+        (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
+        (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_html_table_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
@@ -2973,8 +3028,8 @@ static  lxb_dom_interface_constructor_f lxb_html_interface_res_constructors[LXB_
     },
     /* LXB_TAG_TBODY */
     {
-        (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper,
-        (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper,
+        (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
+        (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_html_table_section_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
@@ -2984,8 +3039,8 @@ static  lxb_dom_interface_constructor_f lxb_html_interface_res_constructors[LXB_
     },
     /* LXB_TAG_TD */
     {
-        (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper,
-        (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper,
+        (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
+        (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_html_table_cell_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
@@ -2995,8 +3050,8 @@ static  lxb_dom_interface_constructor_f lxb_html_interface_res_constructors[LXB_
     },
     /* LXB_TAG_TEMPLATE */
     {
-        (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper,
-        (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper,
+        (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
+        (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_html_template_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
@@ -3006,8 +3061,8 @@ static  lxb_dom_interface_constructor_f lxb_html_interface_res_constructors[LXB_
     },
     /* LXB_TAG_TEXTAREA */
     {
-        (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper,
-        (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper,
+        (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
+        (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_html_text_area_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
@@ -3017,8 +3072,8 @@ static  lxb_dom_interface_constructor_f lxb_html_interface_res_constructors[LXB_
     },
     /* LXB_TAG_TEXTPATH */
     {
-        (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper,
-        (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper,
+        (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
+        (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
@@ -3028,8 +3083,8 @@ static  lxb_dom_interface_constructor_f lxb_html_interface_res_constructors[LXB_
     },
     /* LXB_TAG_TFOOT */
     {
-        (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper,
-        (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper,
+        (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
+        (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_html_table_section_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
@@ -3039,8 +3094,8 @@ static  lxb_dom_interface_constructor_f lxb_html_interface_res_constructors[LXB_
     },
     /* LXB_TAG_TH */
     {
-        (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper,
-        (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper,
+        (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
+        (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_html_table_cell_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
@@ -3050,8 +3105,8 @@ static  lxb_dom_interface_constructor_f lxb_html_interface_res_constructors[LXB_
     },
     /* LXB_TAG_THEAD */
     {
-        (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper,
-        (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper,
+        (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
+        (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_html_table_section_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
@@ -3061,8 +3116,8 @@ static  lxb_dom_interface_constructor_f lxb_html_interface_res_constructors[LXB_
     },
     /* LXB_TAG_TIME */
     {
-        (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper,
-        (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper,
+        (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
+        (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_html_time_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
@@ -3072,8 +3127,8 @@ static  lxb_dom_interface_constructor_f lxb_html_interface_res_constructors[LXB_
     },
     /* LXB_TAG_TITLE */
     {
-        (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper,
-        (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper,
+        (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
+        (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_html_title_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
@@ -3083,8 +3138,8 @@ static  lxb_dom_interface_constructor_f lxb_html_interface_res_constructors[LXB_
     },
     /* LXB_TAG_TR */
     {
-        (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper,
-        (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper,
+        (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
+        (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_html_table_row_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
@@ -3094,8 +3149,8 @@ static  lxb_dom_interface_constructor_f lxb_html_interface_res_constructors[LXB_
     },
     /* LXB_TAG_TRACK */
     {
-        (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper,
-        (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper,
+        (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
+        (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_html_track_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
@@ -3105,8 +3160,8 @@ static  lxb_dom_interface_constructor_f lxb_html_interface_res_constructors[LXB_
     },
     /* LXB_TAG_TT */
     {
-        (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper,
-        (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper,
+        (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
+        (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_html_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
@@ -3116,8 +3171,8 @@ static  lxb_dom_interface_constructor_f lxb_html_interface_res_constructors[LXB_
     },
     /* LXB_TAG_U */
     {
-        (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper,
-        (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper,
+        (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
+        (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_html_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
@@ -3127,8 +3182,8 @@ static  lxb_dom_interface_constructor_f lxb_html_interface_res_constructors[LXB_
     },
     /* LXB_TAG_UL */
     {
-        (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper,
-        (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper,
+        (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
+        (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_html_u_list_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
@@ -3138,8 +3193,8 @@ static  lxb_dom_interface_constructor_f lxb_html_interface_res_constructors[LXB_
     },
     /* LXB_TAG_VAR */
     {
-        (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper,
-        (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper,
+        (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
+        (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_html_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
@@ -3149,8 +3204,8 @@ static  lxb_dom_interface_constructor_f lxb_html_interface_res_constructors[LXB_
     },
     /* LXB_TAG_VIDEO */
     {
-        (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper,
-        (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper,
+        (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
+        (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_html_video_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
@@ -3160,8 +3215,8 @@ static  lxb_dom_interface_constructor_f lxb_html_interface_res_constructors[LXB_
     },
     /* LXB_TAG_WBR */
     {
-        (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper,
-        (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper,
+        (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
+        (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_html_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
@@ -3171,8 +3226,8 @@ static  lxb_dom_interface_constructor_f lxb_html_interface_res_constructors[LXB_
     },
     /* LXB_TAG_XMP */
     {
-        (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper,
-        (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper,
+        (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
+        (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_html_pre_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
         (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper,
@@ -3181,18 +3236,13 @@ static  lxb_dom_interface_constructor_f lxb_html_interface_res_constructors[LXB_
         (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper
     }
 };
-#endif /* LXB_HTML_INTERFACE_RES_CONSTRUCTORS_ENABLED */
-#endif /* LXB_HTML_INTERFACE_RES_CONSTRUCTORS */
 
-#ifdef LXB_HTML_INTERFACE_RES_DESTRUCTOR
-#ifndef LXB_HTML_INTERFACE_RES_DESTRUCTOR_ENABLED
-#define LXB_HTML_INTERFACE_RES_DESTRUCTOR_ENABLED
 static  lxb_dom_interface_destructor_f lxb_html_interface_res_destructor[LXB_TAG__LAST_ENTRY][LXB_NS__LAST_ENTRY] = 
 {
     /* LXB_TAG__UNDEF */
     {
-        (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper,
-        (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper,
+        (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
+        (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_html_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
@@ -3202,8 +3252,8 @@ static  lxb_dom_interface_destructor_f lxb_html_interface_res_destructor[LXB_TAG
     },
     /* LXB_TAG__END_OF_FILE */
     {
-        (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper,
-        (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper,
+        (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
+        (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_html_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
@@ -3213,52 +3263,52 @@ static  lxb_dom_interface_destructor_f lxb_html_interface_res_destructor[LXB_TAG
     },
     /* LXB_TAG__TEXT */
     {
-        (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper,
-        (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_dom_text_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_dom_text_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_dom_text_interface_destroy_wrapper,
-        (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
-        (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
-        (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper
+        (lxb_dom_interface_destructor_f) lxb_dom_text_interface_destroy_wrapper,
+        (lxb_dom_interface_destructor_f) lxb_dom_text_interface_destroy_wrapper,
+        (lxb_dom_interface_destructor_f) lxb_dom_text_interface_destroy_wrapper,
+        (lxb_dom_interface_destructor_f) lxb_dom_text_interface_destroy_wrapper,
+        (lxb_dom_interface_destructor_f) lxb_dom_text_interface_destroy_wrapper
     },
     /* LXB_TAG__DOCUMENT */
     {
-        (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper,
-        (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper,
+        (lxb_dom_interface_destructor_f) lxb_dom_document_interface_destroy_wrapper,
+        (lxb_dom_interface_destructor_f) lxb_dom_document_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_html_document_interface_destroy_wrapper,
-        (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
-        (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
-        (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
-        (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
-        (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper
+        (lxb_dom_interface_destructor_f) lxb_dom_document_interface_destroy_wrapper,
+        (lxb_dom_interface_destructor_f) lxb_dom_document_interface_destroy_wrapper,
+        (lxb_dom_interface_destructor_f) lxb_dom_document_interface_destroy_wrapper,
+        (lxb_dom_interface_destructor_f) lxb_dom_document_interface_destroy_wrapper,
+        (lxb_dom_interface_destructor_f) lxb_dom_document_interface_destroy_wrapper
     },
     /* LXB_TAG__EM_COMMENT */
     {
-        (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper,
-        (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_dom_comment_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_dom_comment_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_dom_comment_interface_destroy_wrapper,
-        (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
-        (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
-        (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper
+        (lxb_dom_interface_destructor_f) lxb_dom_comment_interface_destroy_wrapper,
+        (lxb_dom_interface_destructor_f) lxb_dom_comment_interface_destroy_wrapper,
+        (lxb_dom_interface_destructor_f) lxb_dom_comment_interface_destroy_wrapper,
+        (lxb_dom_interface_destructor_f) lxb_dom_comment_interface_destroy_wrapper,
+        (lxb_dom_interface_destructor_f) lxb_dom_comment_interface_destroy_wrapper
     },
     /* LXB_TAG__EM_DOCTYPE */
     {
-        (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper,
-        (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_dom_document_type_interface_destroy_wrapper,
-        (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
-        (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
-        (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
-        (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
-        (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper
+        (lxb_dom_interface_destructor_f) lxb_dom_document_type_interface_destroy_wrapper,
+        (lxb_dom_interface_destructor_f) lxb_dom_document_type_interface_destroy_wrapper,
+        (lxb_dom_interface_destructor_f) lxb_dom_document_type_interface_destroy_wrapper,
+        (lxb_dom_interface_destructor_f) lxb_dom_document_type_interface_destroy_wrapper,
+        (lxb_dom_interface_destructor_f) lxb_dom_document_type_interface_destroy_wrapper,
+        (lxb_dom_interface_destructor_f) lxb_dom_document_type_interface_destroy_wrapper,
+        (lxb_dom_interface_destructor_f) lxb_dom_document_type_interface_destroy_wrapper
     },
     /* LXB_TAG_A */
     {
-        (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper,
-        (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper,
+        (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
+        (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_html_anchor_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
@@ -3268,8 +3318,8 @@ static  lxb_dom_interface_destructor_f lxb_html_interface_res_destructor[LXB_TAG
     },
     /* LXB_TAG_ABBR */
     {
-        (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper,
-        (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper,
+        (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
+        (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_html_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
@@ -3279,8 +3329,8 @@ static  lxb_dom_interface_destructor_f lxb_html_interface_res_destructor[LXB_TAG
     },
     /* LXB_TAG_ACRONYM */
     {
-        (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper,
-        (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper,
+        (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
+        (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_html_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
@@ -3290,8 +3340,8 @@ static  lxb_dom_interface_destructor_f lxb_html_interface_res_destructor[LXB_TAG
     },
     /* LXB_TAG_ADDRESS */
     {
-        (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper,
-        (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper,
+        (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
+        (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_html_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
@@ -3301,8 +3351,8 @@ static  lxb_dom_interface_destructor_f lxb_html_interface_res_destructor[LXB_TAG
     },
     /* LXB_TAG_ALTGLYPH */
     {
-        (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper,
-        (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper,
+        (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
+        (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
@@ -3312,8 +3362,8 @@ static  lxb_dom_interface_destructor_f lxb_html_interface_res_destructor[LXB_TAG
     },
     /* LXB_TAG_ALTGLYPHDEF */
     {
-        (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper,
-        (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper,
+        (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
+        (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
@@ -3323,8 +3373,8 @@ static  lxb_dom_interface_destructor_f lxb_html_interface_res_destructor[LXB_TAG
     },
     /* LXB_TAG_ALTGLYPHITEM */
     {
-        (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper,
-        (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper,
+        (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
+        (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
@@ -3334,8 +3384,8 @@ static  lxb_dom_interface_destructor_f lxb_html_interface_res_destructor[LXB_TAG
     },
     /* LXB_TAG_ANIMATECOLOR */
     {
-        (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper,
-        (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper,
+        (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
+        (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
@@ -3345,8 +3395,8 @@ static  lxb_dom_interface_destructor_f lxb_html_interface_res_destructor[LXB_TAG
     },
     /* LXB_TAG_ANIMATEMOTION */
     {
-        (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper,
-        (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper,
+        (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
+        (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
@@ -3356,8 +3406,8 @@ static  lxb_dom_interface_destructor_f lxb_html_interface_res_destructor[LXB_TAG
     },
     /* LXB_TAG_ANIMATETRANSFORM */
     {
-        (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper,
-        (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper,
+        (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
+        (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
@@ -3367,8 +3417,8 @@ static  lxb_dom_interface_destructor_f lxb_html_interface_res_destructor[LXB_TAG
     },
     /* LXB_TAG_ANNOTATION_XML */
     {
-        (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper,
-        (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper,
+        (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
+        (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
@@ -3378,8 +3428,8 @@ static  lxb_dom_interface_destructor_f lxb_html_interface_res_destructor[LXB_TAG
     },
     /* LXB_TAG_APPLET */
     {
-        (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper,
-        (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper,
+        (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
+        (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
@@ -3389,8 +3439,8 @@ static  lxb_dom_interface_destructor_f lxb_html_interface_res_destructor[LXB_TAG
     },
     /* LXB_TAG_AREA */
     {
-        (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper,
-        (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper,
+        (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
+        (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_html_area_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
@@ -3400,8 +3450,8 @@ static  lxb_dom_interface_destructor_f lxb_html_interface_res_destructor[LXB_TAG
     },
     /* LXB_TAG_ARTICLE */
     {
-        (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper,
-        (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper,
+        (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
+        (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_html_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
@@ -3411,8 +3461,8 @@ static  lxb_dom_interface_destructor_f lxb_html_interface_res_destructor[LXB_TAG
     },
     /* LXB_TAG_ASIDE */
     {
-        (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper,
-        (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper,
+        (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
+        (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_html_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
@@ -3422,8 +3472,8 @@ static  lxb_dom_interface_destructor_f lxb_html_interface_res_destructor[LXB_TAG
     },
     /* LXB_TAG_AUDIO */
     {
-        (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper,
-        (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper,
+        (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
+        (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_html_audio_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
@@ -3433,8 +3483,8 @@ static  lxb_dom_interface_destructor_f lxb_html_interface_res_destructor[LXB_TAG
     },
     /* LXB_TAG_B */
     {
-        (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper,
-        (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper,
+        (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
+        (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_html_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
@@ -3444,8 +3494,8 @@ static  lxb_dom_interface_destructor_f lxb_html_interface_res_destructor[LXB_TAG
     },
     /* LXB_TAG_BASE */
     {
-        (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper,
-        (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper,
+        (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
+        (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_html_base_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
@@ -3455,8 +3505,8 @@ static  lxb_dom_interface_destructor_f lxb_html_interface_res_destructor[LXB_TAG
     },
     /* LXB_TAG_BASEFONT */
     {
-        (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper,
-        (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper,
+        (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
+        (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_html_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
@@ -3466,8 +3516,8 @@ static  lxb_dom_interface_destructor_f lxb_html_interface_res_destructor[LXB_TAG
     },
     /* LXB_TAG_BDI */
     {
-        (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper,
-        (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper,
+        (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
+        (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_html_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
@@ -3477,8 +3527,8 @@ static  lxb_dom_interface_destructor_f lxb_html_interface_res_destructor[LXB_TAG
     },
     /* LXB_TAG_BDO */
     {
-        (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper,
-        (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper,
+        (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
+        (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_html_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
@@ -3488,8 +3538,8 @@ static  lxb_dom_interface_destructor_f lxb_html_interface_res_destructor[LXB_TAG
     },
     /* LXB_TAG_BGSOUND */
     {
-        (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper,
-        (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper,
+        (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
+        (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
@@ -3499,8 +3549,8 @@ static  lxb_dom_interface_destructor_f lxb_html_interface_res_destructor[LXB_TAG
     },
     /* LXB_TAG_BIG */
     {
-        (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper,
-        (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper,
+        (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
+        (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_html_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
@@ -3510,8 +3560,8 @@ static  lxb_dom_interface_destructor_f lxb_html_interface_res_destructor[LXB_TAG
     },
     /* LXB_TAG_BLINK */
     {
-        (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper,
-        (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper,
+        (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
+        (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
@@ -3521,8 +3571,8 @@ static  lxb_dom_interface_destructor_f lxb_html_interface_res_destructor[LXB_TAG
     },
     /* LXB_TAG_BLOCKQUOTE */
     {
-        (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper,
-        (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper,
+        (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
+        (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_html_quote_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
@@ -3532,8 +3582,8 @@ static  lxb_dom_interface_destructor_f lxb_html_interface_res_destructor[LXB_TAG
     },
     /* LXB_TAG_BODY */
     {
-        (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper,
-        (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper,
+        (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
+        (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_html_body_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
@@ -3543,8 +3593,8 @@ static  lxb_dom_interface_destructor_f lxb_html_interface_res_destructor[LXB_TAG
     },
     /* LXB_TAG_BR */
     {
-        (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper,
-        (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper,
+        (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
+        (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_html_br_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
@@ -3554,8 +3604,8 @@ static  lxb_dom_interface_destructor_f lxb_html_interface_res_destructor[LXB_TAG
     },
     /* LXB_TAG_BUTTON */
     {
-        (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper,
-        (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper,
+        (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
+        (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_html_button_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
@@ -3565,8 +3615,8 @@ static  lxb_dom_interface_destructor_f lxb_html_interface_res_destructor[LXB_TAG
     },
     /* LXB_TAG_CANVAS */
     {
-        (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper,
-        (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper,
+        (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
+        (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_html_canvas_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
@@ -3576,8 +3626,8 @@ static  lxb_dom_interface_destructor_f lxb_html_interface_res_destructor[LXB_TAG
     },
     /* LXB_TAG_CAPTION */
     {
-        (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper,
-        (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper,
+        (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
+        (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_html_table_caption_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
@@ -3587,8 +3637,8 @@ static  lxb_dom_interface_destructor_f lxb_html_interface_res_destructor[LXB_TAG
     },
     /* LXB_TAG_CENTER */
     {
-        (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper,
-        (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper,
+        (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
+        (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_html_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
@@ -3598,8 +3648,8 @@ static  lxb_dom_interface_destructor_f lxb_html_interface_res_destructor[LXB_TAG
     },
     /* LXB_TAG_CITE */
     {
-        (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper,
-        (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper,
+        (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
+        (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_html_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
@@ -3609,8 +3659,8 @@ static  lxb_dom_interface_destructor_f lxb_html_interface_res_destructor[LXB_TAG
     },
     /* LXB_TAG_CLIPPATH */
     {
-        (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper,
-        (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper,
+        (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
+        (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
@@ -3620,8 +3670,8 @@ static  lxb_dom_interface_destructor_f lxb_html_interface_res_destructor[LXB_TAG
     },
     /* LXB_TAG_CODE */
     {
-        (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper,
-        (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper,
+        (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
+        (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_html_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
@@ -3631,8 +3681,8 @@ static  lxb_dom_interface_destructor_f lxb_html_interface_res_destructor[LXB_TAG
     },
     /* LXB_TAG_COL */
     {
-        (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper,
-        (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper,
+        (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
+        (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_html_table_col_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
@@ -3642,8 +3692,8 @@ static  lxb_dom_interface_destructor_f lxb_html_interface_res_destructor[LXB_TAG
     },
     /* LXB_TAG_COLGROUP */
     {
-        (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper,
-        (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper,
+        (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
+        (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_html_table_col_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
@@ -3653,8 +3703,8 @@ static  lxb_dom_interface_destructor_f lxb_html_interface_res_destructor[LXB_TAG
     },
     /* LXB_TAG_DATA */
     {
-        (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper,
-        (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper,
+        (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
+        (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_html_data_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
@@ -3664,8 +3714,8 @@ static  lxb_dom_interface_destructor_f lxb_html_interface_res_destructor[LXB_TAG
     },
     /* LXB_TAG_DATALIST */
     {
-        (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper,
-        (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper,
+        (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
+        (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_html_data_list_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
@@ -3675,8 +3725,8 @@ static  lxb_dom_interface_destructor_f lxb_html_interface_res_destructor[LXB_TAG
     },
     /* LXB_TAG_DD */
     {
-        (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper,
-        (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper,
+        (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
+        (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_html_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
@@ -3686,8 +3736,8 @@ static  lxb_dom_interface_destructor_f lxb_html_interface_res_destructor[LXB_TAG
     },
     /* LXB_TAG_DEL */
     {
-        (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper,
-        (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper,
+        (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
+        (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_html_mod_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
@@ -3697,8 +3747,8 @@ static  lxb_dom_interface_destructor_f lxb_html_interface_res_destructor[LXB_TAG
     },
     /* LXB_TAG_DESC */
     {
-        (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper,
-        (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper,
+        (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
+        (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
@@ -3708,8 +3758,8 @@ static  lxb_dom_interface_destructor_f lxb_html_interface_res_destructor[LXB_TAG
     },
     /* LXB_TAG_DETAILS */
     {
-        (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper,
-        (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper,
+        (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
+        (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_html_details_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
@@ -3719,8 +3769,8 @@ static  lxb_dom_interface_destructor_f lxb_html_interface_res_destructor[LXB_TAG
     },
     /* LXB_TAG_DFN */
     {
-        (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper,
-        (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper,
+        (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
+        (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_html_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
@@ -3730,8 +3780,8 @@ static  lxb_dom_interface_destructor_f lxb_html_interface_res_destructor[LXB_TAG
     },
     /* LXB_TAG_DIALOG */
     {
-        (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper,
-        (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper,
+        (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
+        (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_html_dialog_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
@@ -3741,8 +3791,8 @@ static  lxb_dom_interface_destructor_f lxb_html_interface_res_destructor[LXB_TAG
     },
     /* LXB_TAG_DIR */
     {
-        (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper,
-        (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper,
+        (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
+        (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_html_directory_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
@@ -3752,8 +3802,8 @@ static  lxb_dom_interface_destructor_f lxb_html_interface_res_destructor[LXB_TAG
     },
     /* LXB_TAG_DIV */
     {
-        (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper,
-        (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper,
+        (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
+        (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_html_div_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
@@ -3763,8 +3813,8 @@ static  lxb_dom_interface_destructor_f lxb_html_interface_res_destructor[LXB_TAG
     },
     /* LXB_TAG_DL */
     {
-        (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper,
-        (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper,
+        (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
+        (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_html_d_list_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
@@ -3774,8 +3824,8 @@ static  lxb_dom_interface_destructor_f lxb_html_interface_res_destructor[LXB_TAG
     },
     /* LXB_TAG_DT */
     {
-        (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper,
-        (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper,
+        (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
+        (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_html_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
@@ -3785,8 +3835,8 @@ static  lxb_dom_interface_destructor_f lxb_html_interface_res_destructor[LXB_TAG
     },
     /* LXB_TAG_EM */
     {
-        (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper,
-        (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper,
+        (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
+        (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_html_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
@@ -3796,8 +3846,8 @@ static  lxb_dom_interface_destructor_f lxb_html_interface_res_destructor[LXB_TAG
     },
     /* LXB_TAG_EMBED */
     {
-        (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper,
-        (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper,
+        (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
+        (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_html_embed_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
@@ -3807,8 +3857,8 @@ static  lxb_dom_interface_destructor_f lxb_html_interface_res_destructor[LXB_TAG
     },
     /* LXB_TAG_FEBLEND */
     {
-        (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper,
-        (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper,
+        (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
+        (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
@@ -3818,8 +3868,8 @@ static  lxb_dom_interface_destructor_f lxb_html_interface_res_destructor[LXB_TAG
     },
     /* LXB_TAG_FECOLORMATRIX */
     {
-        (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper,
-        (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper,
+        (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
+        (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
@@ -3829,8 +3879,8 @@ static  lxb_dom_interface_destructor_f lxb_html_interface_res_destructor[LXB_TAG
     },
     /* LXB_TAG_FECOMPONENTTRANSFER */
     {
-        (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper,
-        (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper,
+        (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
+        (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
@@ -3840,8 +3890,8 @@ static  lxb_dom_interface_destructor_f lxb_html_interface_res_destructor[LXB_TAG
     },
     /* LXB_TAG_FECOMPOSITE */
     {
-        (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper,
-        (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper,
+        (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
+        (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
@@ -3851,8 +3901,8 @@ static  lxb_dom_interface_destructor_f lxb_html_interface_res_destructor[LXB_TAG
     },
     /* LXB_TAG_FECONVOLVEMATRIX */
     {
-        (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper,
-        (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper,
+        (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
+        (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
@@ -3862,8 +3912,8 @@ static  lxb_dom_interface_destructor_f lxb_html_interface_res_destructor[LXB_TAG
     },
     /* LXB_TAG_FEDIFFUSELIGHTING */
     {
-        (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper,
-        (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper,
+        (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
+        (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
@@ -3873,8 +3923,8 @@ static  lxb_dom_interface_destructor_f lxb_html_interface_res_destructor[LXB_TAG
     },
     /* LXB_TAG_FEDISPLACEMENTMAP */
     {
-        (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper,
-        (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper,
+        (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
+        (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
@@ -3884,8 +3934,8 @@ static  lxb_dom_interface_destructor_f lxb_html_interface_res_destructor[LXB_TAG
     },
     /* LXB_TAG_FEDISTANTLIGHT */
     {
-        (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper,
-        (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper,
+        (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
+        (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
@@ -3895,8 +3945,8 @@ static  lxb_dom_interface_destructor_f lxb_html_interface_res_destructor[LXB_TAG
     },
     /* LXB_TAG_FEDROPSHADOW */
     {
-        (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper,
-        (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper,
+        (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
+        (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
@@ -3906,8 +3956,8 @@ static  lxb_dom_interface_destructor_f lxb_html_interface_res_destructor[LXB_TAG
     },
     /* LXB_TAG_FEFLOOD */
     {
-        (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper,
-        (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper,
+        (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
+        (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
@@ -3917,8 +3967,8 @@ static  lxb_dom_interface_destructor_f lxb_html_interface_res_destructor[LXB_TAG
     },
     /* LXB_TAG_FEFUNCA */
     {
-        (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper,
-        (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper,
+        (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
+        (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
@@ -3928,8 +3978,8 @@ static  lxb_dom_interface_destructor_f lxb_html_interface_res_destructor[LXB_TAG
     },
     /* LXB_TAG_FEFUNCB */
     {
-        (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper,
-        (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper,
+        (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
+        (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
@@ -3939,8 +3989,8 @@ static  lxb_dom_interface_destructor_f lxb_html_interface_res_destructor[LXB_TAG
     },
     /* LXB_TAG_FEFUNCG */
     {
-        (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper,
-        (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper,
+        (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
+        (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
@@ -3950,8 +4000,8 @@ static  lxb_dom_interface_destructor_f lxb_html_interface_res_destructor[LXB_TAG
     },
     /* LXB_TAG_FEFUNCR */
     {
-        (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper,
-        (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper,
+        (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
+        (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
@@ -3961,8 +4011,8 @@ static  lxb_dom_interface_destructor_f lxb_html_interface_res_destructor[LXB_TAG
     },
     /* LXB_TAG_FEGAUSSIANBLUR */
     {
-        (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper,
-        (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper,
+        (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
+        (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
@@ -3972,8 +4022,8 @@ static  lxb_dom_interface_destructor_f lxb_html_interface_res_destructor[LXB_TAG
     },
     /* LXB_TAG_FEIMAGE */
     {
-        (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper,
-        (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper,
+        (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
+        (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
@@ -3983,8 +4033,8 @@ static  lxb_dom_interface_destructor_f lxb_html_interface_res_destructor[LXB_TAG
     },
     /* LXB_TAG_FEMERGE */
     {
-        (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper,
-        (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper,
+        (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
+        (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
@@ -3994,8 +4044,8 @@ static  lxb_dom_interface_destructor_f lxb_html_interface_res_destructor[LXB_TAG
     },
     /* LXB_TAG_FEMERGENODE */
     {
-        (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper,
-        (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper,
+        (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
+        (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
@@ -4005,8 +4055,8 @@ static  lxb_dom_interface_destructor_f lxb_html_interface_res_destructor[LXB_TAG
     },
     /* LXB_TAG_FEMORPHOLOGY */
     {
-        (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper,
-        (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper,
+        (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
+        (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
@@ -4016,8 +4066,8 @@ static  lxb_dom_interface_destructor_f lxb_html_interface_res_destructor[LXB_TAG
     },
     /* LXB_TAG_FEOFFSET */
     {
-        (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper,
-        (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper,
+        (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
+        (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
@@ -4027,8 +4077,8 @@ static  lxb_dom_interface_destructor_f lxb_html_interface_res_destructor[LXB_TAG
     },
     /* LXB_TAG_FEPOINTLIGHT */
     {
-        (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper,
-        (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper,
+        (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
+        (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
@@ -4038,8 +4088,8 @@ static  lxb_dom_interface_destructor_f lxb_html_interface_res_destructor[LXB_TAG
     },
     /* LXB_TAG_FESPECULARLIGHTING */
     {
-        (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper,
-        (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper,
+        (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
+        (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
@@ -4049,8 +4099,8 @@ static  lxb_dom_interface_destructor_f lxb_html_interface_res_destructor[LXB_TAG
     },
     /* LXB_TAG_FESPOTLIGHT */
     {
-        (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper,
-        (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper,
+        (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
+        (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
@@ -4060,8 +4110,8 @@ static  lxb_dom_interface_destructor_f lxb_html_interface_res_destructor[LXB_TAG
     },
     /* LXB_TAG_FETILE */
     {
-        (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper,
-        (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper,
+        (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
+        (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
@@ -4071,8 +4121,8 @@ static  lxb_dom_interface_destructor_f lxb_html_interface_res_destructor[LXB_TAG
     },
     /* LXB_TAG_FETURBULENCE */
     {
-        (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper,
-        (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper,
+        (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
+        (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
@@ -4082,8 +4132,8 @@ static  lxb_dom_interface_destructor_f lxb_html_interface_res_destructor[LXB_TAG
     },
     /* LXB_TAG_FIELDSET */
     {
-        (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper,
-        (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper,
+        (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
+        (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_html_field_set_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
@@ -4093,8 +4143,8 @@ static  lxb_dom_interface_destructor_f lxb_html_interface_res_destructor[LXB_TAG
     },
     /* LXB_TAG_FIGCAPTION */
     {
-        (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper,
-        (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper,
+        (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
+        (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_html_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
@@ -4104,8 +4154,8 @@ static  lxb_dom_interface_destructor_f lxb_html_interface_res_destructor[LXB_TAG
     },
     /* LXB_TAG_FIGURE */
     {
-        (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper,
-        (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper,
+        (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
+        (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_html_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
@@ -4115,8 +4165,8 @@ static  lxb_dom_interface_destructor_f lxb_html_interface_res_destructor[LXB_TAG
     },
     /* LXB_TAG_FONT */
     {
-        (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper,
-        (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper,
+        (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
+        (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_html_font_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
@@ -4126,8 +4176,8 @@ static  lxb_dom_interface_destructor_f lxb_html_interface_res_destructor[LXB_TAG
     },
     /* LXB_TAG_FOOTER */
     {
-        (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper,
-        (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper,
+        (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
+        (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_html_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
@@ -4137,8 +4187,8 @@ static  lxb_dom_interface_destructor_f lxb_html_interface_res_destructor[LXB_TAG
     },
     /* LXB_TAG_FOREIGNOBJECT */
     {
-        (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper,
-        (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper,
+        (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
+        (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
@@ -4148,8 +4198,8 @@ static  lxb_dom_interface_destructor_f lxb_html_interface_res_destructor[LXB_TAG
     },
     /* LXB_TAG_FORM */
     {
-        (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper,
-        (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper,
+        (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
+        (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_html_form_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
@@ -4159,8 +4209,8 @@ static  lxb_dom_interface_destructor_f lxb_html_interface_res_destructor[LXB_TAG
     },
     /* LXB_TAG_FRAME */
     {
-        (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper,
-        (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper,
+        (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
+        (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_html_frame_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
@@ -4170,8 +4220,8 @@ static  lxb_dom_interface_destructor_f lxb_html_interface_res_destructor[LXB_TAG
     },
     /* LXB_TAG_FRAMESET */
     {
-        (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper,
-        (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper,
+        (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
+        (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_html_frame_set_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
@@ -4181,8 +4231,8 @@ static  lxb_dom_interface_destructor_f lxb_html_interface_res_destructor[LXB_TAG
     },
     /* LXB_TAG_GLYPHREF */
     {
-        (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper,
-        (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper,
+        (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
+        (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
@@ -4192,8 +4242,8 @@ static  lxb_dom_interface_destructor_f lxb_html_interface_res_destructor[LXB_TAG
     },
     /* LXB_TAG_H1 */
     {
-        (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper,
-        (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper,
+        (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
+        (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_html_heading_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
@@ -4203,8 +4253,8 @@ static  lxb_dom_interface_destructor_f lxb_html_interface_res_destructor[LXB_TAG
     },
     /* LXB_TAG_H2 */
     {
-        (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper,
-        (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper,
+        (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
+        (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_html_heading_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
@@ -4214,8 +4264,8 @@ static  lxb_dom_interface_destructor_f lxb_html_interface_res_destructor[LXB_TAG
     },
     /* LXB_TAG_H3 */
     {
-        (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper,
-        (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper,
+        (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
+        (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_html_heading_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
@@ -4225,8 +4275,8 @@ static  lxb_dom_interface_destructor_f lxb_html_interface_res_destructor[LXB_TAG
     },
     /* LXB_TAG_H4 */
     {
-        (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper,
-        (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper,
+        (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
+        (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_html_heading_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
@@ -4236,8 +4286,8 @@ static  lxb_dom_interface_destructor_f lxb_html_interface_res_destructor[LXB_TAG
     },
     /* LXB_TAG_H5 */
     {
-        (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper,
-        (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper,
+        (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
+        (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_html_heading_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
@@ -4247,8 +4297,8 @@ static  lxb_dom_interface_destructor_f lxb_html_interface_res_destructor[LXB_TAG
     },
     /* LXB_TAG_H6 */
     {
-        (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper,
-        (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper,
+        (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
+        (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_html_heading_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
@@ -4258,8 +4308,8 @@ static  lxb_dom_interface_destructor_f lxb_html_interface_res_destructor[LXB_TAG
     },
     /* LXB_TAG_HEAD */
     {
-        (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper,
-        (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper,
+        (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
+        (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_html_head_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
@@ -4269,8 +4319,8 @@ static  lxb_dom_interface_destructor_f lxb_html_interface_res_destructor[LXB_TAG
     },
     /* LXB_TAG_HEADER */
     {
-        (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper,
-        (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper,
+        (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
+        (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_html_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
@@ -4280,8 +4330,8 @@ static  lxb_dom_interface_destructor_f lxb_html_interface_res_destructor[LXB_TAG
     },
     /* LXB_TAG_HGROUP */
     {
-        (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper,
-        (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper,
+        (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
+        (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_html_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
@@ -4291,8 +4341,8 @@ static  lxb_dom_interface_destructor_f lxb_html_interface_res_destructor[LXB_TAG
     },
     /* LXB_TAG_HR */
     {
-        (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper,
-        (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper,
+        (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
+        (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_html_hr_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
@@ -4302,8 +4352,8 @@ static  lxb_dom_interface_destructor_f lxb_html_interface_res_destructor[LXB_TAG
     },
     /* LXB_TAG_HTML */
     {
-        (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper,
-        (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper,
+        (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
+        (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_html_html_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
@@ -4313,8 +4363,8 @@ static  lxb_dom_interface_destructor_f lxb_html_interface_res_destructor[LXB_TAG
     },
     /* LXB_TAG_I */
     {
-        (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper,
-        (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper,
+        (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
+        (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_html_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
@@ -4324,8 +4374,8 @@ static  lxb_dom_interface_destructor_f lxb_html_interface_res_destructor[LXB_TAG
     },
     /* LXB_TAG_IFRAME */
     {
-        (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper,
-        (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper,
+        (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
+        (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_html_iframe_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
@@ -4335,8 +4385,8 @@ static  lxb_dom_interface_destructor_f lxb_html_interface_res_destructor[LXB_TAG
     },
     /* LXB_TAG_IMAGE */
     {
-        (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper,
-        (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper,
+        (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
+        (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_html_image_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
@@ -4346,8 +4396,8 @@ static  lxb_dom_interface_destructor_f lxb_html_interface_res_destructor[LXB_TAG
     },
     /* LXB_TAG_IMG */
     {
-        (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper,
-        (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper,
+        (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
+        (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_html_image_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
@@ -4357,8 +4407,8 @@ static  lxb_dom_interface_destructor_f lxb_html_interface_res_destructor[LXB_TAG
     },
     /* LXB_TAG_INPUT */
     {
-        (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper,
-        (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper,
+        (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
+        (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_html_input_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
@@ -4368,8 +4418,8 @@ static  lxb_dom_interface_destructor_f lxb_html_interface_res_destructor[LXB_TAG
     },
     /* LXB_TAG_INS */
     {
-        (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper,
-        (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper,
+        (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
+        (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_html_mod_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
@@ -4379,8 +4429,8 @@ static  lxb_dom_interface_destructor_f lxb_html_interface_res_destructor[LXB_TAG
     },
     /* LXB_TAG_ISINDEX */
     {
-        (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper,
-        (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper,
+        (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
+        (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
@@ -4390,8 +4440,8 @@ static  lxb_dom_interface_destructor_f lxb_html_interface_res_destructor[LXB_TAG
     },
     /* LXB_TAG_KBD */
     {
-        (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper,
-        (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper,
+        (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
+        (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_html_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
@@ -4401,8 +4451,8 @@ static  lxb_dom_interface_destructor_f lxb_html_interface_res_destructor[LXB_TAG
     },
     /* LXB_TAG_KEYGEN */
     {
-        (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper,
-        (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper,
+        (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
+        (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
@@ -4412,8 +4462,8 @@ static  lxb_dom_interface_destructor_f lxb_html_interface_res_destructor[LXB_TAG
     },
     /* LXB_TAG_LABEL */
     {
-        (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper,
-        (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper,
+        (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
+        (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_html_label_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
@@ -4423,8 +4473,8 @@ static  lxb_dom_interface_destructor_f lxb_html_interface_res_destructor[LXB_TAG
     },
     /* LXB_TAG_LEGEND */
     {
-        (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper,
-        (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper,
+        (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
+        (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_html_legend_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
@@ -4434,8 +4484,8 @@ static  lxb_dom_interface_destructor_f lxb_html_interface_res_destructor[LXB_TAG
     },
     /* LXB_TAG_LI */
     {
-        (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper,
-        (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper,
+        (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
+        (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_html_li_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
@@ -4445,8 +4495,8 @@ static  lxb_dom_interface_destructor_f lxb_html_interface_res_destructor[LXB_TAG
     },
     /* LXB_TAG_LINEARGRADIENT */
     {
-        (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper,
-        (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper,
+        (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
+        (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
@@ -4456,8 +4506,8 @@ static  lxb_dom_interface_destructor_f lxb_html_interface_res_destructor[LXB_TAG
     },
     /* LXB_TAG_LINK */
     {
-        (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper,
-        (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper,
+        (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
+        (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_html_link_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
@@ -4467,8 +4517,8 @@ static  lxb_dom_interface_destructor_f lxb_html_interface_res_destructor[LXB_TAG
     },
     /* LXB_TAG_LISTING */
     {
-        (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper,
-        (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper,
+        (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
+        (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_html_pre_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
@@ -4478,8 +4528,8 @@ static  lxb_dom_interface_destructor_f lxb_html_interface_res_destructor[LXB_TAG
     },
     /* LXB_TAG_MAIN */
     {
-        (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper,
-        (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper,
+        (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
+        (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_html_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
@@ -4489,8 +4539,8 @@ static  lxb_dom_interface_destructor_f lxb_html_interface_res_destructor[LXB_TAG
     },
     /* LXB_TAG_MALIGNMARK */
     {
-        (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper,
-        (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper,
+        (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
+        (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
@@ -4500,8 +4550,8 @@ static  lxb_dom_interface_destructor_f lxb_html_interface_res_destructor[LXB_TAG
     },
     /* LXB_TAG_MAP */
     {
-        (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper,
-        (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper,
+        (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
+        (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_html_map_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
@@ -4511,8 +4561,8 @@ static  lxb_dom_interface_destructor_f lxb_html_interface_res_destructor[LXB_TAG
     },
     /* LXB_TAG_MARK */
     {
-        (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper,
-        (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper,
+        (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
+        (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_html_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
@@ -4522,8 +4572,8 @@ static  lxb_dom_interface_destructor_f lxb_html_interface_res_destructor[LXB_TAG
     },
     /* LXB_TAG_MARQUEE */
     {
-        (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper,
-        (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper,
+        (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
+        (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_html_marquee_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
@@ -4533,8 +4583,8 @@ static  lxb_dom_interface_destructor_f lxb_html_interface_res_destructor[LXB_TAG
     },
     /* LXB_TAG_MATH */
     {
-        (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper,
-        (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper,
+        (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
+        (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
@@ -4544,8 +4594,8 @@ static  lxb_dom_interface_destructor_f lxb_html_interface_res_destructor[LXB_TAG
     },
     /* LXB_TAG_MENU */
     {
-        (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper,
-        (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper,
+        (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
+        (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_html_menu_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
@@ -4555,8 +4605,8 @@ static  lxb_dom_interface_destructor_f lxb_html_interface_res_destructor[LXB_TAG
     },
     /* LXB_TAG_META */
     {
-        (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper,
-        (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper,
+        (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
+        (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_html_meta_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
@@ -4566,8 +4616,8 @@ static  lxb_dom_interface_destructor_f lxb_html_interface_res_destructor[LXB_TAG
     },
     /* LXB_TAG_METER */
     {
-        (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper,
-        (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper,
+        (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
+        (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_html_meter_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
@@ -4577,8 +4627,8 @@ static  lxb_dom_interface_destructor_f lxb_html_interface_res_destructor[LXB_TAG
     },
     /* LXB_TAG_MFENCED */
     {
-        (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper,
-        (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper,
+        (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
+        (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
@@ -4588,8 +4638,8 @@ static  lxb_dom_interface_destructor_f lxb_html_interface_res_destructor[LXB_TAG
     },
     /* LXB_TAG_MGLYPH */
     {
-        (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper,
-        (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper,
+        (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
+        (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
@@ -4599,8 +4649,8 @@ static  lxb_dom_interface_destructor_f lxb_html_interface_res_destructor[LXB_TAG
     },
     /* LXB_TAG_MI */
     {
-        (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper,
-        (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper,
+        (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
+        (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
@@ -4610,8 +4660,8 @@ static  lxb_dom_interface_destructor_f lxb_html_interface_res_destructor[LXB_TAG
     },
     /* LXB_TAG_MN */
     {
-        (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper,
-        (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper,
+        (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
+        (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
@@ -4621,8 +4671,8 @@ static  lxb_dom_interface_destructor_f lxb_html_interface_res_destructor[LXB_TAG
     },
     /* LXB_TAG_MO */
     {
-        (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper,
-        (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper,
+        (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
+        (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
@@ -4632,8 +4682,8 @@ static  lxb_dom_interface_destructor_f lxb_html_interface_res_destructor[LXB_TAG
     },
     /* LXB_TAG_MS */
     {
-        (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper,
-        (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper,
+        (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
+        (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
@@ -4643,8 +4693,8 @@ static  lxb_dom_interface_destructor_f lxb_html_interface_res_destructor[LXB_TAG
     },
     /* LXB_TAG_MTEXT */
     {
-        (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper,
-        (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper,
+        (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
+        (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
@@ -4654,8 +4704,8 @@ static  lxb_dom_interface_destructor_f lxb_html_interface_res_destructor[LXB_TAG
     },
     /* LXB_TAG_MULTICOL */
     {
-        (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper,
-        (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper,
+        (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
+        (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
@@ -4665,8 +4715,8 @@ static  lxb_dom_interface_destructor_f lxb_html_interface_res_destructor[LXB_TAG
     },
     /* LXB_TAG_NAV */
     {
-        (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper,
-        (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper,
+        (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
+        (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_html_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
@@ -4676,8 +4726,8 @@ static  lxb_dom_interface_destructor_f lxb_html_interface_res_destructor[LXB_TAG
     },
     /* LXB_TAG_NEXTID */
     {
-        (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper,
-        (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper,
+        (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
+        (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
@@ -4687,8 +4737,8 @@ static  lxb_dom_interface_destructor_f lxb_html_interface_res_destructor[LXB_TAG
     },
     /* LXB_TAG_NOBR */
     {
-        (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper,
-        (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper,
+        (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
+        (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_html_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
@@ -4698,8 +4748,8 @@ static  lxb_dom_interface_destructor_f lxb_html_interface_res_destructor[LXB_TAG
     },
     /* LXB_TAG_NOEMBED */
     {
-        (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper,
-        (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper,
+        (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
+        (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_html_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
@@ -4709,8 +4759,8 @@ static  lxb_dom_interface_destructor_f lxb_html_interface_res_destructor[LXB_TAG
     },
     /* LXB_TAG_NOFRAMES */
     {
-        (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper,
-        (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper,
+        (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
+        (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_html_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
@@ -4720,8 +4770,8 @@ static  lxb_dom_interface_destructor_f lxb_html_interface_res_destructor[LXB_TAG
     },
     /* LXB_TAG_NOSCRIPT */
     {
-        (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper,
-        (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper,
+        (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
+        (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_html_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
@@ -4731,8 +4781,8 @@ static  lxb_dom_interface_destructor_f lxb_html_interface_res_destructor[LXB_TAG
     },
     /* LXB_TAG_OBJECT */
     {
-        (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper,
-        (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper,
+        (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
+        (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_html_object_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
@@ -4742,8 +4792,8 @@ static  lxb_dom_interface_destructor_f lxb_html_interface_res_destructor[LXB_TAG
     },
     /* LXB_TAG_OL */
     {
-        (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper,
-        (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper,
+        (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
+        (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_html_o_list_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
@@ -4753,8 +4803,8 @@ static  lxb_dom_interface_destructor_f lxb_html_interface_res_destructor[LXB_TAG
     },
     /* LXB_TAG_OPTGROUP */
     {
-        (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper,
-        (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper,
+        (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
+        (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_html_opt_group_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
@@ -4764,8 +4814,8 @@ static  lxb_dom_interface_destructor_f lxb_html_interface_res_destructor[LXB_TAG
     },
     /* LXB_TAG_OPTION */
     {
-        (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper,
-        (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper,
+        (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
+        (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_html_option_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
@@ -4775,8 +4825,8 @@ static  lxb_dom_interface_destructor_f lxb_html_interface_res_destructor[LXB_TAG
     },
     /* LXB_TAG_OUTPUT */
     {
-        (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper,
-        (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper,
+        (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
+        (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_html_output_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
@@ -4786,8 +4836,8 @@ static  lxb_dom_interface_destructor_f lxb_html_interface_res_destructor[LXB_TAG
     },
     /* LXB_TAG_P */
     {
-        (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper,
-        (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper,
+        (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
+        (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_html_paragraph_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
@@ -4797,8 +4847,8 @@ static  lxb_dom_interface_destructor_f lxb_html_interface_res_destructor[LXB_TAG
     },
     /* LXB_TAG_PARAM */
     {
-        (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper,
-        (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper,
+        (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
+        (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_html_param_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
@@ -4808,8 +4858,8 @@ static  lxb_dom_interface_destructor_f lxb_html_interface_res_destructor[LXB_TAG
     },
     /* LXB_TAG_PATH */
     {
-        (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper,
-        (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper,
+        (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
+        (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
@@ -4819,8 +4869,8 @@ static  lxb_dom_interface_destructor_f lxb_html_interface_res_destructor[LXB_TAG
     },
     /* LXB_TAG_PICTURE */
     {
-        (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper,
-        (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper,
+        (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
+        (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_html_picture_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
@@ -4830,8 +4880,8 @@ static  lxb_dom_interface_destructor_f lxb_html_interface_res_destructor[LXB_TAG
     },
     /* LXB_TAG_PLAINTEXT */
     {
-        (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper,
-        (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper,
+        (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
+        (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_html_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
@@ -4841,8 +4891,8 @@ static  lxb_dom_interface_destructor_f lxb_html_interface_res_destructor[LXB_TAG
     },
     /* LXB_TAG_PRE */
     {
-        (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper,
-        (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper,
+        (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
+        (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_html_pre_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
@@ -4852,8 +4902,8 @@ static  lxb_dom_interface_destructor_f lxb_html_interface_res_destructor[LXB_TAG
     },
     /* LXB_TAG_PROGRESS */
     {
-        (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper,
-        (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper,
+        (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
+        (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_html_progress_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
@@ -4863,8 +4913,8 @@ static  lxb_dom_interface_destructor_f lxb_html_interface_res_destructor[LXB_TAG
     },
     /* LXB_TAG_Q */
     {
-        (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper,
-        (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper,
+        (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
+        (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_html_quote_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
@@ -4874,8 +4924,8 @@ static  lxb_dom_interface_destructor_f lxb_html_interface_res_destructor[LXB_TAG
     },
     /* LXB_TAG_RADIALGRADIENT */
     {
-        (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper,
-        (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper,
+        (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
+        (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
@@ -4885,8 +4935,8 @@ static  lxb_dom_interface_destructor_f lxb_html_interface_res_destructor[LXB_TAG
     },
     /* LXB_TAG_RB */
     {
-        (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper,
-        (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper,
+        (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
+        (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_html_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
@@ -4896,8 +4946,8 @@ static  lxb_dom_interface_destructor_f lxb_html_interface_res_destructor[LXB_TAG
     },
     /* LXB_TAG_RP */
     {
-        (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper,
-        (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper,
+        (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
+        (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_html_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
@@ -4907,8 +4957,8 @@ static  lxb_dom_interface_destructor_f lxb_html_interface_res_destructor[LXB_TAG
     },
     /* LXB_TAG_RT */
     {
-        (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper,
-        (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper,
+        (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
+        (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_html_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
@@ -4918,8 +4968,8 @@ static  lxb_dom_interface_destructor_f lxb_html_interface_res_destructor[LXB_TAG
     },
     /* LXB_TAG_RTC */
     {
-        (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper,
-        (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper,
+        (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
+        (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_html_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
@@ -4929,8 +4979,8 @@ static  lxb_dom_interface_destructor_f lxb_html_interface_res_destructor[LXB_TAG
     },
     /* LXB_TAG_RUBY */
     {
-        (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper,
-        (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper,
+        (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
+        (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_html_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
@@ -4940,8 +4990,8 @@ static  lxb_dom_interface_destructor_f lxb_html_interface_res_destructor[LXB_TAG
     },
     /* LXB_TAG_S */
     {
-        (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper,
-        (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper,
+        (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
+        (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_html_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
@@ -4951,8 +5001,8 @@ static  lxb_dom_interface_destructor_f lxb_html_interface_res_destructor[LXB_TAG
     },
     /* LXB_TAG_SAMP */
     {
-        (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper,
-        (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper,
+        (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
+        (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_html_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
@@ -4962,8 +5012,8 @@ static  lxb_dom_interface_destructor_f lxb_html_interface_res_destructor[LXB_TAG
     },
     /* LXB_TAG_SCRIPT */
     {
-        (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper,
-        (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper,
+        (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
+        (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_html_script_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
@@ -4971,10 +5021,21 @@ static  lxb_dom_interface_destructor_f lxb_html_interface_res_destructor[LXB_TAG
         (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper
     },
+    /* LXB_TAG_SEARCH */
+    {
+        (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
+        (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
+        (lxb_dom_interface_destructor_f) lxb_html_search_element_interface_destroy_wrapper,
+        (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
+        (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
+        (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
+        (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
+        (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper
+    },
     /* LXB_TAG_SECTION */
     {
-        (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper,
-        (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper,
+        (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
+        (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_html_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
@@ -4984,8 +5045,8 @@ static  lxb_dom_interface_destructor_f lxb_html_interface_res_destructor[LXB_TAG
     },
     /* LXB_TAG_SELECT */
     {
-        (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper,
-        (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper,
+        (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
+        (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_html_select_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
@@ -4993,10 +5054,21 @@ static  lxb_dom_interface_destructor_f lxb_html_interface_res_destructor[LXB_TAG
         (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper
     },
+    /* LXB_TAG_SELECTEDCONTENT */
+    {
+        (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
+        (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
+        (lxb_dom_interface_destructor_f) lxb_html_selectedcontent_element_interface_destroy_wrapper,
+        (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
+        (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
+        (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
+        (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
+        (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper
+    },
     /* LXB_TAG_SLOT */
     {
-        (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper,
-        (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper,
+        (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
+        (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_html_slot_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
@@ -5006,8 +5078,8 @@ static  lxb_dom_interface_destructor_f lxb_html_interface_res_destructor[LXB_TAG
     },
     /* LXB_TAG_SMALL */
     {
-        (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper,
-        (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper,
+        (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
+        (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_html_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
@@ -5017,8 +5089,8 @@ static  lxb_dom_interface_destructor_f lxb_html_interface_res_destructor[LXB_TAG
     },
     /* LXB_TAG_SOURCE */
     {
-        (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper,
-        (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper,
+        (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
+        (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_html_source_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
@@ -5028,8 +5100,8 @@ static  lxb_dom_interface_destructor_f lxb_html_interface_res_destructor[LXB_TAG
     },
     /* LXB_TAG_SPACER */
     {
-        (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper,
-        (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper,
+        (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
+        (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
@@ -5039,8 +5111,8 @@ static  lxb_dom_interface_destructor_f lxb_html_interface_res_destructor[LXB_TAG
     },
     /* LXB_TAG_SPAN */
     {
-        (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper,
-        (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper,
+        (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
+        (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_html_span_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
@@ -5050,8 +5122,8 @@ static  lxb_dom_interface_destructor_f lxb_html_interface_res_destructor[LXB_TAG
     },
     /* LXB_TAG_STRIKE */
     {
-        (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper,
-        (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper,
+        (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
+        (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_html_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
@@ -5061,8 +5133,8 @@ static  lxb_dom_interface_destructor_f lxb_html_interface_res_destructor[LXB_TAG
     },
     /* LXB_TAG_STRONG */
     {
-        (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper,
-        (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper,
+        (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
+        (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_html_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
@@ -5072,8 +5144,8 @@ static  lxb_dom_interface_destructor_f lxb_html_interface_res_destructor[LXB_TAG
     },
     /* LXB_TAG_STYLE */
     {
-        (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper,
-        (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper,
+        (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
+        (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_html_style_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
@@ -5083,8 +5155,8 @@ static  lxb_dom_interface_destructor_f lxb_html_interface_res_destructor[LXB_TAG
     },
     /* LXB_TAG_SUB */
     {
-        (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper,
-        (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper,
+        (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
+        (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_html_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
@@ -5094,8 +5166,8 @@ static  lxb_dom_interface_destructor_f lxb_html_interface_res_destructor[LXB_TAG
     },
     /* LXB_TAG_SUMMARY */
     {
-        (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper,
-        (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper,
+        (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
+        (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_html_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
@@ -5105,8 +5177,8 @@ static  lxb_dom_interface_destructor_f lxb_html_interface_res_destructor[LXB_TAG
     },
     /* LXB_TAG_SUP */
     {
-        (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper,
-        (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper,
+        (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
+        (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_html_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
@@ -5116,8 +5188,8 @@ static  lxb_dom_interface_destructor_f lxb_html_interface_res_destructor[LXB_TAG
     },
     /* LXB_TAG_SVG */
     {
-        (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper,
-        (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper,
+        (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
+        (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
@@ -5127,8 +5199,8 @@ static  lxb_dom_interface_destructor_f lxb_html_interface_res_destructor[LXB_TAG
     },
     /* LXB_TAG_TABLE */
     {
-        (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper,
-        (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper,
+        (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
+        (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_html_table_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
@@ -5138,8 +5210,8 @@ static  lxb_dom_interface_destructor_f lxb_html_interface_res_destructor[LXB_TAG
     },
     /* LXB_TAG_TBODY */
     {
-        (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper,
-        (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper,
+        (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
+        (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_html_table_section_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
@@ -5149,8 +5221,8 @@ static  lxb_dom_interface_destructor_f lxb_html_interface_res_destructor[LXB_TAG
     },
     /* LXB_TAG_TD */
     {
-        (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper,
-        (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper,
+        (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
+        (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_html_table_cell_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
@@ -5160,8 +5232,8 @@ static  lxb_dom_interface_destructor_f lxb_html_interface_res_destructor[LXB_TAG
     },
     /* LXB_TAG_TEMPLATE */
     {
-        (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper,
-        (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper,
+        (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
+        (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_html_template_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
@@ -5171,8 +5243,8 @@ static  lxb_dom_interface_destructor_f lxb_html_interface_res_destructor[LXB_TAG
     },
     /* LXB_TAG_TEXTAREA */
     {
-        (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper,
-        (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper,
+        (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
+        (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_html_text_area_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
@@ -5182,8 +5254,8 @@ static  lxb_dom_interface_destructor_f lxb_html_interface_res_destructor[LXB_TAG
     },
     /* LXB_TAG_TEXTPATH */
     {
-        (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper,
-        (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper,
+        (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
+        (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
@@ -5193,8 +5265,8 @@ static  lxb_dom_interface_destructor_f lxb_html_interface_res_destructor[LXB_TAG
     },
     /* LXB_TAG_TFOOT */
     {
-        (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper,
-        (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper,
+        (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
+        (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_html_table_section_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
@@ -5204,8 +5276,8 @@ static  lxb_dom_interface_destructor_f lxb_html_interface_res_destructor[LXB_TAG
     },
     /* LXB_TAG_TH */
     {
-        (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper,
-        (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper,
+        (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
+        (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_html_table_cell_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
@@ -5215,8 +5287,8 @@ static  lxb_dom_interface_destructor_f lxb_html_interface_res_destructor[LXB_TAG
     },
     /* LXB_TAG_THEAD */
     {
-        (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper,
-        (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper,
+        (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
+        (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_html_table_section_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
@@ -5226,8 +5298,8 @@ static  lxb_dom_interface_destructor_f lxb_html_interface_res_destructor[LXB_TAG
     },
     /* LXB_TAG_TIME */
     {
-        (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper,
-        (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper,
+        (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
+        (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_html_time_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
@@ -5237,8 +5309,8 @@ static  lxb_dom_interface_destructor_f lxb_html_interface_res_destructor[LXB_TAG
     },
     /* LXB_TAG_TITLE */
     {
-        (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper,
-        (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper,
+        (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
+        (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_html_title_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
@@ -5248,8 +5320,8 @@ static  lxb_dom_interface_destructor_f lxb_html_interface_res_destructor[LXB_TAG
     },
     /* LXB_TAG_TR */
     {
-        (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper,
-        (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper,
+        (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
+        (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_html_table_row_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
@@ -5259,8 +5331,8 @@ static  lxb_dom_interface_destructor_f lxb_html_interface_res_destructor[LXB_TAG
     },
     /* LXB_TAG_TRACK */
     {
-        (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper,
-        (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper,
+        (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
+        (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_html_track_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
@@ -5270,8 +5342,8 @@ static  lxb_dom_interface_destructor_f lxb_html_interface_res_destructor[LXB_TAG
     },
     /* LXB_TAG_TT */
     {
-        (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper,
-        (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper,
+        (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
+        (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_html_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
@@ -5281,8 +5353,8 @@ static  lxb_dom_interface_destructor_f lxb_html_interface_res_destructor[LXB_TAG
     },
     /* LXB_TAG_U */
     {
-        (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper,
-        (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper,
+        (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
+        (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_html_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
@@ -5292,8 +5364,8 @@ static  lxb_dom_interface_destructor_f lxb_html_interface_res_destructor[LXB_TAG
     },
     /* LXB_TAG_UL */
     {
-        (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper,
-        (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper,
+        (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
+        (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_html_u_list_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
@@ -5303,8 +5375,8 @@ static  lxb_dom_interface_destructor_f lxb_html_interface_res_destructor[LXB_TAG
     },
     /* LXB_TAG_VAR */
     {
-        (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper,
-        (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper,
+        (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
+        (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_html_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
@@ -5314,8 +5386,8 @@ static  lxb_dom_interface_destructor_f lxb_html_interface_res_destructor[LXB_TAG
     },
     /* LXB_TAG_VIDEO */
     {
-        (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper,
-        (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper,
+        (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
+        (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_html_video_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
@@ -5325,8 +5397,8 @@ static  lxb_dom_interface_destructor_f lxb_html_interface_res_destructor[LXB_TAG
     },
     /* LXB_TAG_WBR */
     {
-        (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper,
-        (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper,
+        (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
+        (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_html_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
@@ -5336,8 +5408,8 @@ static  lxb_dom_interface_destructor_f lxb_html_interface_res_destructor[LXB_TAG
     },
     /* LXB_TAG_XMP */
     {
-        (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper,
-        (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper,
+        (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
+        (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_html_pre_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
         (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper,
@@ -5346,5 +5418,5 @@ static  lxb_dom_interface_destructor_f lxb_html_interface_res_destructor[LXB_TAG
         (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper
     }
 };
-#endif /* LXB_HTML_INTERFACE_RES_DESTRUCTOR_ENABLED */
-#endif /* LXB_HTML_INTERFACE_RES_DESTRUCTOR */
+
+#endif /* LXB_HTML_INTERFACE_RES_H */
diff --git a/ext/lexbor/lexbor/html/interfaces/document.c b/ext/lexbor/lexbor/html/interfaces/document.c
index 34a2c6db0e5a..b40c6c8692f1 100644
--- a/ext/lexbor/lexbor/html/interfaces/document.c
+++ b/ext/lexbor/lexbor/html/interfaces/document.c
@@ -11,16 +11,18 @@
 #include "lexbor/html/interfaces/style_element.h"
 #include "lexbor/html/node.h"
 #include "lexbor/html/parser.h"
+#include "lexbor/html/tokenizer.h"
 
 #include "lexbor/tag/tag.h"
 
 #include "lexbor/dom/interfaces/text.h"
 #include "lexbor/dom/interfaces/element.h"
 
-#define LXB_HTML_TAG_RES_DATA
-#define LXB_HTML_TAG_RES_SHS_DATA
-#include "lexbor/html/tag_res.h"
 
+#ifndef LEXBOR_DISABLE_INTERNAL_EXTERN
+    LXB_EXTERN lxb_html_tag_category_t lxb_html_tag_res_cats[LXB_TAG__LAST_ENTRY][LXB_NS__LAST_ENTRY];
+    LXB_EXTERN lxb_html_tag_fixname_t lxb_html_tag_res_fixname_svg[LXB_TAG__LAST_ENTRY];
+#endif
 
 lxb_status_t
 lxb_html_parse_chunk_prepare(lxb_html_parser_t *parser,
@@ -34,7 +36,7 @@ lxb_html_document_title_walker(lxb_dom_node_t *node, void *ctx);
 
 
 lxb_inline lxb_dom_interface_t *
-lxb_html_document_interface_create_wrapper(lxb_dom_document_t *document,
+lxb_html_document_interface_create_handler(lxb_dom_document_t *document,
                                            lxb_tag_id_t tag_id, lxb_ns_id_t ns)
 {
     return lxb_html_interface_create(lxb_html_interface_document(document),
@@ -60,7 +62,7 @@ lxb_html_document_interface_create(lxb_html_document_t *document)
     }
 
     status = lxb_dom_document_init(doc, lxb_dom_interface_document(document),
-                                   lxb_html_document_interface_create_wrapper,
+                                   lxb_html_document_interface_create_handler,
                                    lxb_html_interface_clone,
                                    lxb_html_interface_destroy,
                                    LXB_DOM_DOCUMENT_DTYPE_HTML, LXB_NS_HTML);
@@ -267,6 +269,7 @@ lxb_html_document_parser_prepare(lxb_html_document_t *document)
 {
     lxb_status_t status;
     lxb_dom_document_t *doc;
+    lxb_html_parser_t *parser;
 
     doc = lxb_dom_interface_document(document);
 
@@ -278,6 +281,10 @@ lxb_html_document_parser_prepare(lxb_html_document_t *document)
             lxb_html_parser_destroy(doc->parser);
             return status;
         }
+
+        parser = doc->parser;
+
+        lxb_html_tokenizer_keep_duplicate_set(parser->tkz, true);
     }
     else if (lxb_html_parser_state(doc->parser) != LXB_HTML_PARSER_STATE_BEGIN) {
         lxb_html_parser_clean(doc->parser);
diff --git a/ext/lexbor/lexbor/html/interfaces/option_element.c b/ext/lexbor/lexbor/html/interfaces/option_element.c
index 77e1e23d3878..19f085da0423 100644
--- a/ext/lexbor/lexbor/html/interfaces/option_element.c
+++ b/ext/lexbor/lexbor/html/interfaces/option_element.c
@@ -5,6 +5,8 @@
  */
 
 #include "lexbor/html/interfaces/option_element.h"
+#include "lexbor/html/interfaces/select_element.h"
+#include "lexbor/html/interfaces/selectedcontent_element.h"
 #include "lexbor/html/interfaces/document.h"
 
 
@@ -33,3 +35,48 @@ lxb_html_option_element_interface_destroy(lxb_html_option_element_t *option_elem
     (void) lxb_dom_node_interface_destroy(lxb_dom_interface_node(option_element));
     return NULL;
 }
+
+lxb_dom_exception_code_t
+lxb_html_option_maybe_clone_to_selectedcontent(lxb_html_option_element_t *option)
+{
+    bool is;
+    lxb_dom_node_t *select;
+    lxb_html_select_element_t *select_el;
+    lxb_html_selectedcontent_element_t *sel_content;
+
+    is = lxb_html_option_element_selectedness(lxb_html_interface_option(option));
+    if (!is) {
+        return LXB_DOM_EXCEPTION_OK;
+    }
+
+    select = lxb_dom_interface_node(option);
+
+    do {
+        select = select->parent;
+
+        if (select == NULL) {
+            return LXB_DOM_EXCEPTION_OK;
+        }
+    }
+    while (select->local_name != LXB_TAG_SELECT || select->ns != LXB_NS_HTML);
+
+    select_el = lxb_html_interface_select(select);
+
+    sel_content = lxb_html_select_get_enabled_selectedcontent(select_el);
+    if (sel_content == NULL) {
+        return LXB_DOM_EXCEPTION_OK;
+    }
+
+    return lxb_html_selectedcontent_clone_option(sel_content, option);
+}
+
+bool
+lxb_html_option_element_selectedness(lxb_html_option_element_t *option)
+{
+    lxb_dom_attr_t *selected;
+
+    selected = lxb_dom_element_attr_by_id(lxb_dom_interface_element(option),
+                                          LXB_DOM_ATTR_SELECTED);
+
+    return selected != NULL;
+}
diff --git a/ext/lexbor/lexbor/html/interfaces/option_element.h b/ext/lexbor/lexbor/html/interfaces/option_element.h
index a59763898def..99d4977aa031 100644
--- a/ext/lexbor/lexbor/html/interfaces/option_element.h
+++ b/ext/lexbor/lexbor/html/interfaces/option_element.h
@@ -27,6 +27,13 @@ LXB_API lxb_html_option_element_t *
 lxb_html_option_element_interface_destroy(lxb_html_option_element_t *option_element);
 
 
+LXB_API lxb_dom_exception_code_t
+lxb_html_option_maybe_clone_to_selectedcontent(lxb_html_option_element_t *option);
+
+LXB_API bool
+lxb_html_option_element_selectedness(lxb_html_option_element_t *option);
+
+
 #ifdef __cplusplus
 } /* extern "C" */
 #endif
diff --git a/ext/lexbor/lexbor/html/interfaces/search_element.c b/ext/lexbor/lexbor/html/interfaces/search_element.c
new file mode 100644
index 000000000000..00ca2a6ba3fc
--- /dev/null
+++ b/ext/lexbor/lexbor/html/interfaces/search_element.c
@@ -0,0 +1,35 @@
+/*
+ * Copyright (C) 2018 Alexander Borisov
+ *
+ * Author: Alexander Borisov 
+ */
+
+#include "lexbor/html/interfaces/search_element.h"
+#include "lexbor/html/interfaces/document.h"
+
+
+lxb_html_search_element_t *
+lxb_html_search_element_interface_create(lxb_html_document_t *document)
+{
+    lxb_html_search_element_t *element;
+
+    element = lexbor_mraw_calloc(document->dom_document.mraw,
+                                 sizeof(lxb_html_search_element_t));
+    if (element == NULL) {
+        return NULL;
+    }
+
+    lxb_dom_node_t *node = lxb_dom_interface_node(element);
+
+    node->owner_document = lxb_html_document_original_ref(document);
+    node->type = LXB_DOM_NODE_TYPE_ELEMENT;
+
+    return element;
+}
+
+lxb_html_search_element_t *
+lxb_html_search_element_interface_destroy(lxb_html_search_element_t *search_element)
+{
+    (void) lxb_dom_node_interface_destroy(lxb_dom_interface_node(search_element));
+    return NULL;
+}
diff --git a/ext/lexbor/lexbor/html/interfaces/search_element.h b/ext/lexbor/lexbor/html/interfaces/search_element.h
new file mode 100644
index 000000000000..a42862176409
--- /dev/null
+++ b/ext/lexbor/lexbor/html/interfaces/search_element.h
@@ -0,0 +1,34 @@
+/*
+ * Copyright (C) 2018 Alexander Borisov
+ *
+ * Author: Alexander Borisov 
+ */
+
+#ifndef LEXBOR_HTML_SEARCH_ELEMENT_H
+#define LEXBOR_HTML_SEARCH_ELEMENT_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include "lexbor/html/interface.h"
+#include "lexbor/html/interfaces/element.h"
+
+
+struct lxb_html_search_element {
+    lxb_html_element_t element;
+};
+
+
+LXB_API lxb_html_search_element_t *
+lxb_html_search_element_interface_create(lxb_html_document_t *document);
+
+LXB_API lxb_html_search_element_t *
+lxb_html_search_element_interface_destroy(lxb_html_search_element_t *search_element);
+
+
+#ifdef __cplusplus
+} /* extern "C" */
+#endif
+
+#endif /* LEXBOR_HTML_SEARCH_ELEMENT_H */
diff --git a/ext/lexbor/lexbor/html/interfaces/select_element.c b/ext/lexbor/lexbor/html/interfaces/select_element.c
index 69f8abe8dd51..8b338dc76da7 100644
--- a/ext/lexbor/lexbor/html/interfaces/select_element.c
+++ b/ext/lexbor/lexbor/html/interfaces/select_element.c
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2018 Alexander Borisov
+ * Copyright (C) 2018-2025 Alexander Borisov
  *
  * Author: Alexander Borisov 
  */
@@ -8,6 +8,10 @@
 #include "lexbor/html/interfaces/document.h"
 
 
+static lexbor_action_t
+lxb_html_select_find_selectedcontent_cb(lxb_dom_node_t *node, void *ctx);
+
+
 lxb_html_select_element_t *
 lxb_html_select_element_interface_create(lxb_html_document_t *document)
 {
@@ -33,3 +37,44 @@ lxb_html_select_element_interface_destroy(lxb_html_select_element_t *select_elem
     (void) lxb_dom_node_interface_destroy(lxb_dom_interface_node(select_element));
     return NULL;
 }
+
+lxb_html_selectedcontent_element_t *
+lxb_html_select_get_enabled_selectedcontent(lxb_html_select_element_t *el)
+{
+    lxb_dom_attr_t *multiple;
+    lxb_dom_node_t *selectedcontent, *node;
+
+    multiple = lxb_dom_element_attr_by_id(lxb_dom_interface_element(el),
+                                          LXB_DOM_ATTR_MULTIPLE);
+    if (multiple != NULL) {
+        return NULL;
+    }
+
+    selectedcontent = NULL;
+    node = lxb_dom_interface_node(el);
+
+    lxb_dom_node_simple_walk(node, lxb_html_select_find_selectedcontent_cb,
+                             &selectedcontent);
+    if (selectedcontent == NULL) {
+        return NULL;
+    }
+
+    return lxb_html_interface_selectedcontent(selectedcontent);
+}
+
+static lexbor_action_t
+lxb_html_select_find_selectedcontent_cb(lxb_dom_node_t *node, void *ctx)
+{
+    lxb_dom_node_t **selectedcontent;
+
+    if (node->local_name == LXB_TAG_SELECTEDCONTENT
+        && node->ns == LXB_NS_HTML)
+    {
+        selectedcontent = ctx;
+        *selectedcontent = node;
+
+        return LEXBOR_ACTION_STOP;
+    }
+
+    return LEXBOR_ACTION_OK;
+}
diff --git a/ext/lexbor/lexbor/html/interfaces/select_element.h b/ext/lexbor/lexbor/html/interfaces/select_element.h
index 8676db5da902..03e20d197cd3 100644
--- a/ext/lexbor/lexbor/html/interfaces/select_element.h
+++ b/ext/lexbor/lexbor/html/interfaces/select_element.h
@@ -26,6 +26,8 @@ lxb_html_select_element_interface_create(lxb_html_document_t *document);
 LXB_API lxb_html_select_element_t *
 lxb_html_select_element_interface_destroy(lxb_html_select_element_t *select_element);
 
+LXB_API lxb_html_selectedcontent_element_t *
+lxb_html_select_get_enabled_selectedcontent(lxb_html_select_element_t *el);
 
 #ifdef __cplusplus
 } /* extern "C" */
diff --git a/ext/lexbor/lexbor/html/interfaces/selectedcontent_element.c b/ext/lexbor/lexbor/html/interfaces/selectedcontent_element.c
new file mode 100644
index 000000000000..41b1c0d58b8f
--- /dev/null
+++ b/ext/lexbor/lexbor/html/interfaces/selectedcontent_element.c
@@ -0,0 +1,67 @@
+/*
+ * Copyright (C) 2025 Alexander Borisov
+ *
+ * Author: Alexander Borisov 
+ */
+
+#include "lexbor/dom/interfaces/document_fragment.h"
+#include "lexbor/html/interfaces/selectedcontent_element.h"
+#include "lexbor/html/interfaces/document.h"
+
+
+lxb_html_selectedcontent_element_t *
+lxb_html_selectedcontent_element_interface_create(lxb_html_document_t *document)
+{
+    lxb_html_selectedcontent_element_t *element;
+
+    element = lexbor_mraw_calloc(document->dom_document.mraw,
+                                 sizeof(lxb_html_selectedcontent_element_t));
+    if (element == NULL) {
+        return NULL;
+    }
+
+    lxb_dom_node_t *node = lxb_dom_interface_node(element);
+
+    node->owner_document = lxb_html_document_original_ref(document);
+    node->type = LXB_DOM_NODE_TYPE_ELEMENT;
+
+    return element;
+}
+
+lxb_html_selectedcontent_element_t *
+lxb_html_selectedcontent_element_interface_destroy(lxb_html_selectedcontent_element_t *selectedcontent_element)
+{
+    (void) lxb_dom_node_interface_destroy(lxb_dom_interface_node(selectedcontent_element));
+    return NULL;
+}
+
+lxb_dom_exception_code_t
+lxb_html_selectedcontent_clone_option(lxb_html_selectedcontent_element_t *sc,
+                                      lxb_html_option_element_t *option)
+{
+    lxb_dom_node_t *node, *child, *opt_node;
+    lxb_dom_document_fragment_t fragment;
+
+    memset(&fragment, 0x00, sizeof(lxb_dom_document_fragment_t));
+
+    opt_node = lxb_dom_interface_node(option);
+
+    fragment.node.type = LXB_DOM_NODE_TYPE_DOCUMENT_FRAGMENT;
+    fragment.node.owner_document = opt_node->owner_document;
+
+    node = opt_node->first_child;
+
+    while (node != NULL) {
+        child = lxb_dom_node_clone(node, true);
+        if (child == NULL) {
+            return LXB_DOM_EXCEPTION_ERR;
+        }
+
+        lxb_dom_node_insert_child_wo_events(lxb_dom_interface_node(&fragment),
+                                            child);
+        node = node->next;
+    }
+
+    return lxb_dom_node_replace_all_spec(lxb_dom_interface_node(sc),
+                                         lxb_dom_interface_node(&fragment));
+}
diff --git a/ext/lexbor/lexbor/html/interfaces/selectedcontent_element.h b/ext/lexbor/lexbor/html/interfaces/selectedcontent_element.h
new file mode 100644
index 000000000000..5d38b59f501c
--- /dev/null
+++ b/ext/lexbor/lexbor/html/interfaces/selectedcontent_element.h
@@ -0,0 +1,37 @@
+/*
+ * Copyright (C) 2025 Alexander Borisov
+ *
+ * Author: Alexander Borisov 
+ */
+
+#ifndef LEXBOR_HTML_SELECTEDCONTENT_ELEMENT_H
+#define LEXBOR_HTML_SELECTEDCONTENT_ELEMENT_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include "lexbor/html/interface.h"
+#include "lexbor/html/interfaces/element.h"
+
+
+struct lxb_html_selectedcontent_element {
+    lxb_html_element_t element;
+};
+
+
+LXB_API lxb_html_selectedcontent_element_t *
+lxb_html_selectedcontent_element_interface_create(lxb_html_document_t *document);
+
+LXB_API lxb_html_selectedcontent_element_t *
+lxb_html_selectedcontent_element_interface_destroy(lxb_html_selectedcontent_element_t *selectedcontent_element);
+
+LXB_API lxb_dom_exception_code_t
+lxb_html_selectedcontent_clone_option(lxb_html_selectedcontent_element_t *sc,
+                                      lxb_html_option_element_t *option);
+
+#ifdef __cplusplus
+} /* extern "C" */
+#endif
+
+#endif /* LEXBOR_HTML_SELECTEDCONTENT_ELEMENT_H */
diff --git a/ext/lexbor/lexbor/html/parser.c b/ext/lexbor/lexbor/html/parser.c
index caca15e4be26..7d051045101e 100644
--- a/ext/lexbor/lexbor/html/parser.c
+++ b/ext/lexbor/lexbor/html/parser.c
@@ -13,9 +13,10 @@
 #include "lexbor/html/tree/template_insertion.h"
 #include "lexbor/html/tree/insertion_mode.h"
 
-#define LXB_HTML_TAG_RES_DATA
-#define LXB_HTML_TAG_RES_SHS_DATA
-#include "lexbor/html/tag_res.h"
+#ifndef LEXBOR_DISABLE_INTERNAL_EXTERN
+    LXB_EXTERN lxb_html_tag_category_t lxb_html_tag_res_cats[LXB_TAG__LAST_ENTRY][LXB_NS__LAST_ENTRY];
+    LXB_EXTERN lxb_html_tag_fixname_t lxb_html_tag_res_fixname_svg[LXB_TAG__LAST_ENTRY];
+#endif
 
 
 static void
@@ -43,6 +44,8 @@ lxb_html_parser_init(lxb_html_parser_t *parser)
         return status;
     }
 
+    lxb_html_tokenizer_keep_duplicate_set(parser->tkz, true);
+
     /* Tree */
     parser->tree = lxb_html_tree_create();
     status = lxb_html_tree_init(parser->tree, parser->tkz);
@@ -339,7 +342,9 @@ lxb_html_parse_fragment_chunk_destroy(lxb_html_parser_t *parser)
         parser->tree->fragment = NULL;
     }
 
-    if (lxb_html_document_is_original(parser->tree->document) == false) {
+    if (parser->tree->document != NULL
+        && lxb_html_document_is_original(parser->tree->document) == false)
+    {
         if (parser->root != NULL) {
             doc = lxb_dom_interface_node(parser->tree->document)->owner_document;
             parser->root->parent = &doc->node;
diff --git a/ext/lexbor/lexbor/html/style.c b/ext/lexbor/lexbor/html/style.c
deleted file mode 100644
index b07dbf12cae0..000000000000
--- a/ext/lexbor/lexbor/html/style.c
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
- * Copyright (C) 2022-2023 Alexander Borisov
- *
- * Author: Alexander Borisov 
- */
-
-#include "lexbor/html/style.h"
-
-
-uintptr_t
-lxb_html_style_id_by_name(lxb_html_document_t *doc,
-                          const lxb_char_t *name, size_t size)
-{
-    const lxb_css_entry_data_t *data;
-
-    data = lxb_css_property_by_name(name, size);
-
-    if (data == NULL) {
-        return lxb_html_document_css_customs_find_id(doc, name, size);
-    }
-
-    return data->unique;
-}
diff --git a/ext/lexbor/lexbor/html/style.h b/ext/lexbor/lexbor/html/style.h
deleted file mode 100644
index 10800bcd6593..000000000000
--- a/ext/lexbor/lexbor/html/style.h
+++ /dev/null
@@ -1,46 +0,0 @@
-/*
- * Copyright (C) 2022-2023 Alexander Borisov
- *
- * Author: Alexander Borisov 
- */
-
-#ifndef LEXBOR_HTML_STYLE_H
-#define LEXBOR_HTML_STYLE_H
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-#include "lexbor/core/avl.h"
-#include "lexbor/css/selectors/selector.h"
-#include "lexbor/html/interfaces/document.h"
-
-
-typedef struct lxb_html_style_weak lxb_html_style_weak_t;
-
-struct lxb_html_style_weak {
-    void                           *value;
-    lxb_css_selector_specificity_t sp;
-
-    lxb_html_style_weak_t          *next;
-};
-
-typedef struct {
-    lexbor_avl_node_t              entry;
-    lxb_html_style_weak_t          *weak;
-
-    lxb_css_selector_specificity_t sp;
-}
-lxb_html_style_node_t;
-
-
-LXB_API uintptr_t
-lxb_html_style_id_by_name(lxb_html_document_t *doc,
-                          const lxb_char_t *name, size_t size);
-
-
-#ifdef __cplusplus
-} /* extern "C" */
-#endif
-
-#endif /* LEXBOR_HTML_STYLE_H */
diff --git a/ext/lexbor/lexbor/html/tag.c b/ext/lexbor/lexbor/html/tag.c
new file mode 100644
index 000000000000..48f894963c56
--- /dev/null
+++ b/ext/lexbor/lexbor/html/tag.c
@@ -0,0 +1,30 @@
+/*
+ * Copyright (C) 2026 Alexander Borisov
+ *
+ * Author: Alexander Borisov 
+ */
+
+#include "lexbor/html/tag.h"
+#include "lexbor/html/tag_res.h"
+
+
+bool
+lxb_html_tag_is_category(lxb_tag_id_t tag_id, lxb_ns_id_t ns,
+                         lxb_html_tag_category_t cat)
+{
+    if (tag_id < LXB_TAG__LAST_ENTRY && ns < LXB_NS__LAST_ENTRY) {
+        return lxb_html_tag_res_cats[tag_id][ns] & cat;
+    }
+
+    return (LXB_HTML_TAG_CATEGORY_ORDINARY) & cat;
+}
+
+const lxb_html_tag_fixname_t *
+lxb_html_tag_fixname_svg(lxb_tag_id_t tag_id)
+{
+    if (tag_id >= LXB_TAG__LAST_ENTRY) {
+        return NULL;
+    }
+
+    return &lxb_html_tag_res_fixname_svg[tag_id];
+}
diff --git a/ext/lexbor/lexbor/html/tag.h b/ext/lexbor/lexbor/html/tag.h
index 6570d7d40b7c..b559d31f6882 100644
--- a/ext/lexbor/lexbor/html/tag.h
+++ b/ext/lexbor/lexbor/html/tag.h
@@ -28,8 +28,7 @@ enum lxb_html_tag_category {
     LXB_HTML_TAG_CATEGORY_SCOPE           = 0x0008,
     LXB_HTML_TAG_CATEGORY_SCOPE_LIST_ITEM = 0x0010,
     LXB_HTML_TAG_CATEGORY_SCOPE_BUTTON    = 0x0020,
-    LXB_HTML_TAG_CATEGORY_SCOPE_TABLE     = 0x0040,
-    LXB_HTML_TAG_CATEGORY_SCOPE_SELECT    = 0x0080,
+    LXB_HTML_TAG_CATEGORY_SCOPE_TABLE     = 0x0040
 };
 
 typedef struct {
@@ -39,35 +38,17 @@ typedef struct {
 lxb_html_tag_fixname_t;
 
 
-#define LXB_HTML_TAG_RES_CATS
-#define LXB_HTML_TAG_RES_FIXNAME_SVG
-#include "lexbor/html/tag_res.h"
+LXB_API bool
+lxb_html_tag_is_category(lxb_tag_id_t tag_id, lxb_ns_id_t ns,
+                         lxb_html_tag_category_t cat);
+
+LXB_API const lxb_html_tag_fixname_t *
+lxb_html_tag_fixname_svg(lxb_tag_id_t tag_id);
 
 
 /*
  * Inline functions
  */
-lxb_inline bool
-lxb_html_tag_is_category(lxb_tag_id_t tag_id, lxb_ns_id_t ns,
-                         lxb_html_tag_category_t cat)
-{
-    if (tag_id < LXB_TAG__LAST_ENTRY && ns < LXB_NS__LAST_ENTRY) {
-        return lxb_html_tag_res_cats[tag_id][ns] & cat;
-    }
-
-    return (LXB_HTML_TAG_CATEGORY_ORDINARY|LXB_HTML_TAG_CATEGORY_SCOPE_SELECT) & cat;
-}
-
-lxb_inline const lxb_html_tag_fixname_t *
-lxb_html_tag_fixname_svg(lxb_tag_id_t tag_id)
-{
-    if (tag_id >= LXB_TAG__LAST_ENTRY) {
-        return NULL;
-    }
-
-    return &lxb_html_tag_res_fixname_svg[tag_id];
-}
-
 lxb_inline bool
 lxb_html_tag_is_void(lxb_tag_id_t tag_id)
 {
diff --git a/ext/lexbor/lexbor/html/tag_res.h b/ext/lexbor/lexbor/html/tag_res.h
index 97c28640ccd1..5e2453a59f2a 100644
--- a/ext/lexbor/lexbor/html/tag_res.h
+++ b/ext/lexbor/lexbor/html/tag_res.h
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2018 Alexander Borisov
+ * Copyright (C) 2018-2026 Alexander Borisov
  *
  * Author: Alexander Borisov 
  */
@@ -14,14 +14,10 @@
 #ifndef LXB_HTML_TAG_RES_H
 #define LXB_HTML_TAG_RES_H
 
-#include "lexbor/html/tag.h"
-
-#endif /* LXB_HTML_TAG_RES_H */
-
 #ifdef LXB_TAG_CONST_VERSION
-#ifndef LXB_TAG_CONST_VERSION_A161EC911182C3254E7A972D5C51DF86
+#ifndef LXB_TAG_CONST_VERSION_5AB3094FB370521074947DC082575715
 #error Mismatched tags version! See "lexbor/tag/const.h".
-#endif /* LXB_TAG_CONST_VERSION_A161EC911182C3254E7A972D5C51DF86 */
+#endif /* LXB_TAG_CONST_VERSION_5AB3094FB370521074947DC082575715 */
 #else
 #error You need to include "lexbor/tag/const.h".
 #endif /* LXB_TAG_CONST_VERSION */
@@ -34,1835 +30,1476 @@
 #error You need to include "lexbor/ns/const.h".
 #endif /* LXB_NS_CONST_VERSION */
 
-#ifdef LXB_HTML_TAG_RES_CATS
-#ifndef LXB_HTML_TAG_RES_CATS_ENABLED
-#define LXB_HTML_TAG_RES_CATS_ENABLED
-static  lxb_html_tag_category_t lxb_html_tag_res_cats[LXB_TAG__LAST_ENTRY][LXB_NS__LAST_ENTRY] = 
+LXB_API  lxb_html_tag_category_t lxb_html_tag_res_cats[LXB_TAG__LAST_ENTRY][LXB_NS__LAST_ENTRY] = 
 {
     /* LXB_TAG__UNDEF */
     {
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY_ORDINARY
-            |LXB_HTML_TAG_CATEGORY_SCOPE_SELECT,
-        LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY_ORDINARY,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF
     },
     /* LXB_TAG__END_OF_FILE */
     {
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY_ORDINARY
-            |LXB_HTML_TAG_CATEGORY_SCOPE_SELECT,
-        LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY_ORDINARY,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF
     },
     /* LXB_TAG__TEXT */
     {
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY_ORDINARY
-            |LXB_HTML_TAG_CATEGORY_SCOPE_SELECT,
-        LXB_HTML_TAG_CATEGORY_ORDINARY
-            |LXB_HTML_TAG_CATEGORY_SCOPE_SELECT,
-        LXB_HTML_TAG_CATEGORY_ORDINARY
-            |LXB_HTML_TAG_CATEGORY_SCOPE_SELECT,
-        LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF
+        LXB_HTML_TAG_CATEGORY_ORDINARY,LXB_HTML_TAG_CATEGORY_ORDINARY,
+        LXB_HTML_TAG_CATEGORY_ORDINARY,LXB_HTML_TAG_CATEGORY_ORDINARY,
+        LXB_HTML_TAG_CATEGORY_ORDINARY,LXB_HTML_TAG_CATEGORY_ORDINARY,
+        LXB_HTML_TAG_CATEGORY_ORDINARY,LXB_HTML_TAG_CATEGORY_ORDINARY
     },
     /* LXB_TAG__DOCUMENT */
     {
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY_ORDINARY
-            |LXB_HTML_TAG_CATEGORY_SCOPE_SELECT,
-        LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF
+        LXB_HTML_TAG_CATEGORY_ORDINARY,LXB_HTML_TAG_CATEGORY_ORDINARY,
+        LXB_HTML_TAG_CATEGORY_ORDINARY,LXB_HTML_TAG_CATEGORY_ORDINARY,
+        LXB_HTML_TAG_CATEGORY_ORDINARY,LXB_HTML_TAG_CATEGORY_ORDINARY,
+        LXB_HTML_TAG_CATEGORY_ORDINARY,LXB_HTML_TAG_CATEGORY_ORDINARY
     },
     /* LXB_TAG__EM_COMMENT */
     {
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY_ORDINARY
-            |LXB_HTML_TAG_CATEGORY_SCOPE_SELECT,
-        LXB_HTML_TAG_CATEGORY_ORDINARY
-            |LXB_HTML_TAG_CATEGORY_SCOPE_SELECT,
-        LXB_HTML_TAG_CATEGORY_ORDINARY
-            |LXB_HTML_TAG_CATEGORY_SCOPE_SELECT,
-        LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF
+        LXB_HTML_TAG_CATEGORY_ORDINARY,LXB_HTML_TAG_CATEGORY_ORDINARY,
+        LXB_HTML_TAG_CATEGORY_ORDINARY,LXB_HTML_TAG_CATEGORY_ORDINARY,
+        LXB_HTML_TAG_CATEGORY_ORDINARY,LXB_HTML_TAG_CATEGORY_ORDINARY,
+        LXB_HTML_TAG_CATEGORY_ORDINARY,LXB_HTML_TAG_CATEGORY_ORDINARY
     },
     /* LXB_TAG__EM_DOCTYPE */
     {
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY_ORDINARY
-            |LXB_HTML_TAG_CATEGORY_SCOPE_SELECT,
-        LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF
+        LXB_HTML_TAG_CATEGORY_ORDINARY,LXB_HTML_TAG_CATEGORY_ORDINARY,
+        LXB_HTML_TAG_CATEGORY_ORDINARY,LXB_HTML_TAG_CATEGORY_ORDINARY,
+        LXB_HTML_TAG_CATEGORY_ORDINARY,LXB_HTML_TAG_CATEGORY_ORDINARY,
+        LXB_HTML_TAG_CATEGORY_ORDINARY,LXB_HTML_TAG_CATEGORY_ORDINARY
     },
     /* LXB_TAG_A */
     {
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY_FORMATTING
-            |LXB_HTML_TAG_CATEGORY_SCOPE_SELECT,
-        LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY_FORMATTING,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF
     },
     /* LXB_TAG_ABBR */
     {
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY_ORDINARY
-            |LXB_HTML_TAG_CATEGORY_SCOPE_SELECT,
-        LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY_ORDINARY,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF
     },
     /* LXB_TAG_ACRONYM */
     {
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY_ORDINARY
-            |LXB_HTML_TAG_CATEGORY_SCOPE_SELECT,
-        LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY_ORDINARY,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF
     },
     /* LXB_TAG_ADDRESS */
     {
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY_SCOPE_SELECT
-            |LXB_HTML_TAG_CATEGORY_SPECIAL,
-        LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY_SPECIAL,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF
     },
     /* LXB_TAG_ALTGLYPH */
     {
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY_ORDINARY
-            |LXB_HTML_TAG_CATEGORY_SCOPE_SELECT,
-        LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY_ORDINARY,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF
     },
     /* LXB_TAG_ALTGLYPHDEF */
     {
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY_ORDINARY
-            |LXB_HTML_TAG_CATEGORY_SCOPE_SELECT,
-        LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY_ORDINARY,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF
     },
     /* LXB_TAG_ALTGLYPHITEM */
     {
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY_ORDINARY
-            |LXB_HTML_TAG_CATEGORY_SCOPE_SELECT,
-        LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY_ORDINARY,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF
     },
     /* LXB_TAG_ANIMATECOLOR */
     {
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY_ORDINARY
-            |LXB_HTML_TAG_CATEGORY_SCOPE_SELECT,
-        LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY_ORDINARY,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF
     },
     /* LXB_TAG_ANIMATEMOTION */
     {
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY_ORDINARY
-            |LXB_HTML_TAG_CATEGORY_SCOPE_SELECT,
-        LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY_ORDINARY,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF
     },
     /* LXB_TAG_ANIMATETRANSFORM */
     {
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY_ORDINARY
-            |LXB_HTML_TAG_CATEGORY_SCOPE_SELECT,
-        LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY_ORDINARY,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF
     },
     /* LXB_TAG_ANNOTATION_XML */
     {
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY_SCOPE
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY_SCOPE
             |LXB_HTML_TAG_CATEGORY_SCOPE_BUTTON
             |LXB_HTML_TAG_CATEGORY_SCOPE_LIST_ITEM
-            |LXB_HTML_TAG_CATEGORY_SCOPE_SELECT
             |LXB_HTML_TAG_CATEGORY_SPECIAL,
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF
     },
     /* LXB_TAG_APPLET */
     {
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, 
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF,
         LXB_HTML_TAG_CATEGORY_SCOPE
             |LXB_HTML_TAG_CATEGORY_SCOPE_BUTTON
             |LXB_HTML_TAG_CATEGORY_SCOPE_LIST_ITEM
-            |LXB_HTML_TAG_CATEGORY_SCOPE_SELECT
             |LXB_HTML_TAG_CATEGORY_SPECIAL,
-        LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF
+        LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF
     },
     /* LXB_TAG_AREA */
     {
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY_SCOPE_SELECT
-            |LXB_HTML_TAG_CATEGORY_SPECIAL,
-        LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY_SPECIAL,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF
     },
     /* LXB_TAG_ARTICLE */
     {
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY_SCOPE_SELECT
-            |LXB_HTML_TAG_CATEGORY_SPECIAL,
-        LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY_SPECIAL,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF
     },
     /* LXB_TAG_ASIDE */
     {
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY_SCOPE_SELECT
-            |LXB_HTML_TAG_CATEGORY_SPECIAL,
-        LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY_SPECIAL,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF
     },
     /* LXB_TAG_AUDIO */
     {
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY_ORDINARY
-            |LXB_HTML_TAG_CATEGORY_SCOPE_SELECT,
-        LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY_ORDINARY,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF
     },
     /* LXB_TAG_B */
     {
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY_FORMATTING
-            |LXB_HTML_TAG_CATEGORY_SCOPE_SELECT,
-        LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY_FORMATTING,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF
     },
     /* LXB_TAG_BASE */
     {
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY_SCOPE_SELECT
-            |LXB_HTML_TAG_CATEGORY_SPECIAL,
-        LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY_SPECIAL,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF
     },
     /* LXB_TAG_BASEFONT */
     {
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY_SCOPE_SELECT
-            |LXB_HTML_TAG_CATEGORY_SPECIAL,
-        LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY_SPECIAL,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF
     },
     /* LXB_TAG_BDI */
     {
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY_ORDINARY
-            |LXB_HTML_TAG_CATEGORY_SCOPE_SELECT,
-        LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY_ORDINARY,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF
     },
     /* LXB_TAG_BDO */
     {
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY_ORDINARY
-            |LXB_HTML_TAG_CATEGORY_SCOPE_SELECT,
-        LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY_ORDINARY,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF
     },
     /* LXB_TAG_BGSOUND */
     {
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY_SCOPE_SELECT
-            |LXB_HTML_TAG_CATEGORY_SPECIAL,
-        LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY_SPECIAL,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF
     },
     /* LXB_TAG_BIG */
     {
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY_FORMATTING
-            |LXB_HTML_TAG_CATEGORY_SCOPE_SELECT,
-        LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY_FORMATTING,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF
     },
     /* LXB_TAG_BLINK */
     {
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY_ORDINARY
-            |LXB_HTML_TAG_CATEGORY_SCOPE_SELECT,
-        LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY_ORDINARY,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF
     },
     /* LXB_TAG_BLOCKQUOTE */
     {
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY_SCOPE_SELECT
-            |LXB_HTML_TAG_CATEGORY_SPECIAL,
-        LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY_SPECIAL,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF
     },
     /* LXB_TAG_BODY */
     {
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY_SCOPE_SELECT
-            |LXB_HTML_TAG_CATEGORY_SPECIAL,
-        LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY_SPECIAL,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF
     },
     /* LXB_TAG_BR */
     {
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY_SCOPE_SELECT
-            |LXB_HTML_TAG_CATEGORY_SPECIAL,
-        LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY_SPECIAL,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF
     },
     /* LXB_TAG_BUTTON */
     {
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, 
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF,
         LXB_HTML_TAG_CATEGORY_SCOPE_BUTTON
-            |LXB_HTML_TAG_CATEGORY_SCOPE_SELECT
             |LXB_HTML_TAG_CATEGORY_SPECIAL,
-        LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF
+        LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF
     },
     /* LXB_TAG_CANVAS */
     {
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY_ORDINARY
-            |LXB_HTML_TAG_CATEGORY_SCOPE_SELECT,
-        LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY_ORDINARY,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF
     },
     /* LXB_TAG_CAPTION */
     {
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, 
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF,
         LXB_HTML_TAG_CATEGORY_SCOPE
             |LXB_HTML_TAG_CATEGORY_SCOPE_BUTTON
             |LXB_HTML_TAG_CATEGORY_SCOPE_LIST_ITEM
-            |LXB_HTML_TAG_CATEGORY_SCOPE_SELECT
             |LXB_HTML_TAG_CATEGORY_SPECIAL,
-        LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF
+        LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF
     },
     /* LXB_TAG_CENTER */
     {
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY_SCOPE_SELECT
-            |LXB_HTML_TAG_CATEGORY_SPECIAL,
-        LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY_SPECIAL,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF
     },
     /* LXB_TAG_CITE */
     {
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY_ORDINARY
-            |LXB_HTML_TAG_CATEGORY_SCOPE_SELECT,
-        LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY_ORDINARY,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF
     },
     /* LXB_TAG_CLIPPATH */
     {
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY_ORDINARY
-            |LXB_HTML_TAG_CATEGORY_SCOPE_SELECT,
-        LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY_ORDINARY,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF
     },
     /* LXB_TAG_CODE */
     {
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY_FORMATTING
-            |LXB_HTML_TAG_CATEGORY_SCOPE_SELECT,
-        LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY_FORMATTING,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF
     },
     /* LXB_TAG_COL */
     {
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY_SCOPE_SELECT
-            |LXB_HTML_TAG_CATEGORY_SPECIAL,
-        LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY_SPECIAL,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF
     },
     /* LXB_TAG_COLGROUP */
     {
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY_SCOPE_SELECT
-            |LXB_HTML_TAG_CATEGORY_SPECIAL,
-        LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY_SPECIAL,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF
     },
     /* LXB_TAG_DATA */
     {
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY_ORDINARY
-            |LXB_HTML_TAG_CATEGORY_SCOPE_SELECT,
-        LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY_ORDINARY,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF
     },
     /* LXB_TAG_DATALIST */
     {
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY_ORDINARY
-            |LXB_HTML_TAG_CATEGORY_SCOPE_SELECT,
-        LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY_ORDINARY,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF
     },
     /* LXB_TAG_DD */
     {
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY_SCOPE_SELECT
-            |LXB_HTML_TAG_CATEGORY_SPECIAL,
-        LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY_SPECIAL,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF
     },
     /* LXB_TAG_DEL */
     {
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY_ORDINARY
-            |LXB_HTML_TAG_CATEGORY_SCOPE_SELECT,
-        LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY_ORDINARY,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF
     },
     /* LXB_TAG_DESC */
     {
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, 
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF,
         LXB_HTML_TAG_CATEGORY_SCOPE
             |LXB_HTML_TAG_CATEGORY_SCOPE_BUTTON
             |LXB_HTML_TAG_CATEGORY_SCOPE_LIST_ITEM
-            |LXB_HTML_TAG_CATEGORY_SCOPE_SELECT
             |LXB_HTML_TAG_CATEGORY_SPECIAL,
-        LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF
+        LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF
     },
     /* LXB_TAG_DETAILS */
     {
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY_SCOPE_SELECT
-            |LXB_HTML_TAG_CATEGORY_SPECIAL,
-        LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY_SPECIAL,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF
     },
     /* LXB_TAG_DFN */
     {
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY_ORDINARY
-            |LXB_HTML_TAG_CATEGORY_SCOPE_SELECT,
-        LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY_ORDINARY,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF
     },
     /* LXB_TAG_DIALOG */
     {
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY_ORDINARY
-            |LXB_HTML_TAG_CATEGORY_SCOPE_SELECT,
-        LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY_ORDINARY,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF
     },
     /* LXB_TAG_DIR */
     {
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY_SCOPE_SELECT
-            |LXB_HTML_TAG_CATEGORY_SPECIAL,
-        LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY_SPECIAL,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF
     },
     /* LXB_TAG_DIV */
     {
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY_SCOPE_SELECT
-            |LXB_HTML_TAG_CATEGORY_SPECIAL,
-        LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY_SPECIAL,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF
     },
     /* LXB_TAG_DL */
     {
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY_SCOPE_SELECT
-            |LXB_HTML_TAG_CATEGORY_SPECIAL,
-        LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY_SPECIAL,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF
     },
     /* LXB_TAG_DT */
     {
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY_SCOPE_SELECT
-            |LXB_HTML_TAG_CATEGORY_SPECIAL,
-        LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY_SPECIAL,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF
     },
     /* LXB_TAG_EM */
     {
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY_FORMATTING
-            |LXB_HTML_TAG_CATEGORY_SCOPE_SELECT,
-        LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY_FORMATTING,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF
     },
     /* LXB_TAG_EMBED */
     {
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY_SCOPE_SELECT
-            |LXB_HTML_TAG_CATEGORY_SPECIAL,
-        LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY_SPECIAL,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF
     },
     /* LXB_TAG_FEBLEND */
     {
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY_ORDINARY
-            |LXB_HTML_TAG_CATEGORY_SCOPE_SELECT,
-        LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY_ORDINARY,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF
     },
     /* LXB_TAG_FECOLORMATRIX */
     {
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY_ORDINARY
-            |LXB_HTML_TAG_CATEGORY_SCOPE_SELECT,
-        LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY_ORDINARY,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF
     },
     /* LXB_TAG_FECOMPONENTTRANSFER */
     {
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY_ORDINARY
-            |LXB_HTML_TAG_CATEGORY_SCOPE_SELECT,
-        LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY_ORDINARY,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF
     },
     /* LXB_TAG_FECOMPOSITE */
     {
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY_ORDINARY
-            |LXB_HTML_TAG_CATEGORY_SCOPE_SELECT,
-        LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY_ORDINARY,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF
     },
     /* LXB_TAG_FECONVOLVEMATRIX */
     {
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY_ORDINARY
-            |LXB_HTML_TAG_CATEGORY_SCOPE_SELECT,
-        LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY_ORDINARY,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF
     },
     /* LXB_TAG_FEDIFFUSELIGHTING */
     {
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY_ORDINARY
-            |LXB_HTML_TAG_CATEGORY_SCOPE_SELECT,
-        LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY_ORDINARY,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF
     },
     /* LXB_TAG_FEDISPLACEMENTMAP */
     {
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY_ORDINARY
-            |LXB_HTML_TAG_CATEGORY_SCOPE_SELECT,
-        LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY_ORDINARY,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF
     },
     /* LXB_TAG_FEDISTANTLIGHT */
     {
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY_ORDINARY
-            |LXB_HTML_TAG_CATEGORY_SCOPE_SELECT,
-        LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY_ORDINARY,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF
     },
     /* LXB_TAG_FEDROPSHADOW */
     {
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY_ORDINARY
-            |LXB_HTML_TAG_CATEGORY_SCOPE_SELECT,
-        LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY_ORDINARY,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF
     },
     /* LXB_TAG_FEFLOOD */
     {
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY_ORDINARY
-            |LXB_HTML_TAG_CATEGORY_SCOPE_SELECT,
-        LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY_ORDINARY,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF
     },
     /* LXB_TAG_FEFUNCA */
     {
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY_ORDINARY
-            |LXB_HTML_TAG_CATEGORY_SCOPE_SELECT,
-        LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY_ORDINARY,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF
     },
     /* LXB_TAG_FEFUNCB */
     {
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY_ORDINARY
-            |LXB_HTML_TAG_CATEGORY_SCOPE_SELECT,
-        LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY_ORDINARY,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF
     },
     /* LXB_TAG_FEFUNCG */
     {
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY_ORDINARY
-            |LXB_HTML_TAG_CATEGORY_SCOPE_SELECT,
-        LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY_ORDINARY,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF
     },
     /* LXB_TAG_FEFUNCR */
     {
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY_ORDINARY
-            |LXB_HTML_TAG_CATEGORY_SCOPE_SELECT,
-        LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY_ORDINARY,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF
     },
     /* LXB_TAG_FEGAUSSIANBLUR */
     {
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY_ORDINARY
-            |LXB_HTML_TAG_CATEGORY_SCOPE_SELECT,
-        LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY_ORDINARY,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF
     },
     /* LXB_TAG_FEIMAGE */
     {
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY_ORDINARY
-            |LXB_HTML_TAG_CATEGORY_SCOPE_SELECT,
-        LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY_ORDINARY,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF
     },
     /* LXB_TAG_FEMERGE */
     {
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY_ORDINARY
-            |LXB_HTML_TAG_CATEGORY_SCOPE_SELECT,
-        LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY_ORDINARY,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF
     },
     /* LXB_TAG_FEMERGENODE */
     {
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY_ORDINARY
-            |LXB_HTML_TAG_CATEGORY_SCOPE_SELECT,
-        LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY_ORDINARY,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF
     },
     /* LXB_TAG_FEMORPHOLOGY */
     {
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY_ORDINARY
-            |LXB_HTML_TAG_CATEGORY_SCOPE_SELECT,
-        LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY_ORDINARY,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF
     },
     /* LXB_TAG_FEOFFSET */
     {
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY_ORDINARY
-            |LXB_HTML_TAG_CATEGORY_SCOPE_SELECT,
-        LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY_ORDINARY,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF
     },
     /* LXB_TAG_FEPOINTLIGHT */
     {
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY_ORDINARY
-            |LXB_HTML_TAG_CATEGORY_SCOPE_SELECT,
-        LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY_ORDINARY,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF
     },
     /* LXB_TAG_FESPECULARLIGHTING */
     {
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY_ORDINARY
-            |LXB_HTML_TAG_CATEGORY_SCOPE_SELECT,
-        LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY_ORDINARY,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF
     },
     /* LXB_TAG_FESPOTLIGHT */
     {
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY_ORDINARY
-            |LXB_HTML_TAG_CATEGORY_SCOPE_SELECT,
-        LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY_ORDINARY,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF
     },
     /* LXB_TAG_FETILE */
     {
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY_ORDINARY
-            |LXB_HTML_TAG_CATEGORY_SCOPE_SELECT,
-        LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY_ORDINARY,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF
     },
     /* LXB_TAG_FETURBULENCE */
     {
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY_ORDINARY
-            |LXB_HTML_TAG_CATEGORY_SCOPE_SELECT,
-        LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY_ORDINARY,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF
     },
     /* LXB_TAG_FIELDSET */
     {
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY_SCOPE_SELECT
-            |LXB_HTML_TAG_CATEGORY_SPECIAL,
-        LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY_SPECIAL,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF
     },
     /* LXB_TAG_FIGCAPTION */
     {
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY_SCOPE_SELECT
-            |LXB_HTML_TAG_CATEGORY_SPECIAL,
-        LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY_SPECIAL,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF
     },
     /* LXB_TAG_FIGURE */
     {
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY_SCOPE_SELECT
-            |LXB_HTML_TAG_CATEGORY_SPECIAL,
-        LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY_SPECIAL,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF
     },
     /* LXB_TAG_FONT */
     {
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY_FORMATTING
-            |LXB_HTML_TAG_CATEGORY_SCOPE_SELECT,
-        LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY_FORMATTING,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF
     },
     /* LXB_TAG_FOOTER */
     {
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY_SCOPE_SELECT
-            |LXB_HTML_TAG_CATEGORY_SPECIAL,
-        LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY_SPECIAL,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF
     },
     /* LXB_TAG_FOREIGNOBJECT */
     {
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, 
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF,
         LXB_HTML_TAG_CATEGORY_SCOPE
             |LXB_HTML_TAG_CATEGORY_SCOPE_BUTTON
             |LXB_HTML_TAG_CATEGORY_SCOPE_LIST_ITEM
-            |LXB_HTML_TAG_CATEGORY_SCOPE_SELECT
             |LXB_HTML_TAG_CATEGORY_SPECIAL,
-        LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF
+        LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF
     },
     /* LXB_TAG_FORM */
     {
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY_SCOPE_SELECT
-            |LXB_HTML_TAG_CATEGORY_SPECIAL,
-        LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY_SPECIAL,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF
     },
     /* LXB_TAG_FRAME */
     {
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY_SCOPE_SELECT
-            |LXB_HTML_TAG_CATEGORY_SPECIAL,
-        LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY_SPECIAL,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF
     },
     /* LXB_TAG_FRAMESET */
     {
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY_SCOPE_SELECT
-            |LXB_HTML_TAG_CATEGORY_SPECIAL,
-        LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY_SPECIAL,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF
     },
     /* LXB_TAG_GLYPHREF */
     {
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY_ORDINARY
-            |LXB_HTML_TAG_CATEGORY_SCOPE_SELECT,
-        LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY_ORDINARY,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF
     },
     /* LXB_TAG_H1 */
     {
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY_SCOPE_SELECT
-            |LXB_HTML_TAG_CATEGORY_SPECIAL,
-        LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY_SPECIAL,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF
     },
     /* LXB_TAG_H2 */
     {
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY_SCOPE_SELECT
-            |LXB_HTML_TAG_CATEGORY_SPECIAL,
-        LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY_SPECIAL,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF
     },
     /* LXB_TAG_H3 */
     {
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY_SCOPE_SELECT
-            |LXB_HTML_TAG_CATEGORY_SPECIAL,
-        LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY_SPECIAL,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF
     },
     /* LXB_TAG_H4 */
     {
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY_SCOPE_SELECT
-            |LXB_HTML_TAG_CATEGORY_SPECIAL,
-        LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY_SPECIAL,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF
     },
     /* LXB_TAG_H5 */
     {
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY_SCOPE_SELECT
-            |LXB_HTML_TAG_CATEGORY_SPECIAL,
-        LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY_SPECIAL,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF
     },
     /* LXB_TAG_H6 */
     {
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY_SCOPE_SELECT
-            |LXB_HTML_TAG_CATEGORY_SPECIAL,
-        LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY_SPECIAL,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF
     },
     /* LXB_TAG_HEAD */
     {
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY_SCOPE_SELECT
-            |LXB_HTML_TAG_CATEGORY_SPECIAL,
-        LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY_SPECIAL,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF
     },
     /* LXB_TAG_HEADER */
     {
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY_SCOPE_SELECT
-            |LXB_HTML_TAG_CATEGORY_SPECIAL,
-        LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY_SPECIAL,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF
     },
     /* LXB_TAG_HGROUP */
     {
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY_SCOPE_SELECT
-            |LXB_HTML_TAG_CATEGORY_SPECIAL,
-        LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY_SPECIAL,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF
     },
     /* LXB_TAG_HR */
     {
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY_SCOPE_SELECT
-            |LXB_HTML_TAG_CATEGORY_SPECIAL,
-        LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY_SPECIAL,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF
     },
     /* LXB_TAG_HTML */
     {
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, 
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF,
         LXB_HTML_TAG_CATEGORY_SCOPE
             |LXB_HTML_TAG_CATEGORY_SCOPE_BUTTON
             |LXB_HTML_TAG_CATEGORY_SCOPE_LIST_ITEM
-            |LXB_HTML_TAG_CATEGORY_SCOPE_SELECT
             |LXB_HTML_TAG_CATEGORY_SCOPE_TABLE
             |LXB_HTML_TAG_CATEGORY_SPECIAL,
-        LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF
+        LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF
     },
     /* LXB_TAG_I */
     {
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY_FORMATTING
-            |LXB_HTML_TAG_CATEGORY_SCOPE_SELECT,
-        LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY_FORMATTING,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF
     },
     /* LXB_TAG_IFRAME */
     {
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY_SCOPE_SELECT
-            |LXB_HTML_TAG_CATEGORY_SPECIAL,
-        LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY_SPECIAL,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF
     },
     /* LXB_TAG_IMAGE */
     {
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY_SCOPE_SELECT
-            |LXB_HTML_TAG_CATEGORY_SPECIAL,
-        LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY_SPECIAL,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF
     },
     /* LXB_TAG_IMG */
     {
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY_SCOPE_SELECT
-            |LXB_HTML_TAG_CATEGORY_SPECIAL,
-        LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY_SPECIAL,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF
     },
     /* LXB_TAG_INPUT */
     {
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY_SCOPE_SELECT
-            |LXB_HTML_TAG_CATEGORY_SPECIAL,
-        LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY_SPECIAL,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF
     },
     /* LXB_TAG_INS */
     {
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY_ORDINARY
-            |LXB_HTML_TAG_CATEGORY_SCOPE_SELECT,
-        LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY_ORDINARY,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF
     },
     /* LXB_TAG_ISINDEX */
     {
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY_ORDINARY
-            |LXB_HTML_TAG_CATEGORY_SCOPE_SELECT,
-        LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY_ORDINARY,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF
     },
     /* LXB_TAG_KBD */
     {
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY_ORDINARY
-            |LXB_HTML_TAG_CATEGORY_SCOPE_SELECT,
-        LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY_ORDINARY,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF
     },
     /* LXB_TAG_KEYGEN */
     {
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY_SCOPE_SELECT
-            |LXB_HTML_TAG_CATEGORY_SPECIAL,
-        LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY_SPECIAL,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF
     },
     /* LXB_TAG_LABEL */
     {
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY_ORDINARY
-            |LXB_HTML_TAG_CATEGORY_SCOPE_SELECT,
-        LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY_ORDINARY,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF
     },
     /* LXB_TAG_LEGEND */
     {
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY_ORDINARY
-            |LXB_HTML_TAG_CATEGORY_SCOPE_SELECT,
-        LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY_ORDINARY,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF
     },
     /* LXB_TAG_LI */
     {
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY_SCOPE_SELECT
-            |LXB_HTML_TAG_CATEGORY_SPECIAL,
-        LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY_SPECIAL,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF
     },
     /* LXB_TAG_LINEARGRADIENT */
     {
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY_ORDINARY
-            |LXB_HTML_TAG_CATEGORY_SCOPE_SELECT,
-        LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY_ORDINARY,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF
     },
     /* LXB_TAG_LINK */
     {
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY_SCOPE_SELECT
-            |LXB_HTML_TAG_CATEGORY_SPECIAL,
-        LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY_SPECIAL,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF
     },
     /* LXB_TAG_LISTING */
     {
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY_SCOPE_SELECT
-            |LXB_HTML_TAG_CATEGORY_SPECIAL,
-        LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY_SPECIAL,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF
     },
     /* LXB_TAG_MAIN */
     {
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY_SCOPE_SELECT
-            |LXB_HTML_TAG_CATEGORY_SPECIAL,
-        LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY_SPECIAL,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF
     },
     /* LXB_TAG_MALIGNMARK */
     {
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY_ORDINARY,
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY_ORDINARY,
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF
     },
     /* LXB_TAG_MAP */
     {
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY_ORDINARY
-            |LXB_HTML_TAG_CATEGORY_SCOPE_SELECT,
-        LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY_ORDINARY,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF
     },
     /* LXB_TAG_MARK */
     {
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY_ORDINARY
-            |LXB_HTML_TAG_CATEGORY_SCOPE_SELECT,
-        LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY_ORDINARY,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF
     },
     /* LXB_TAG_MARQUEE */
     {
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, 
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF,
         LXB_HTML_TAG_CATEGORY_SCOPE
             |LXB_HTML_TAG_CATEGORY_SCOPE_BUTTON
             |LXB_HTML_TAG_CATEGORY_SCOPE_LIST_ITEM
-            |LXB_HTML_TAG_CATEGORY_SCOPE_SELECT
             |LXB_HTML_TAG_CATEGORY_SPECIAL,
-        LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF
+        LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF
     },
     /* LXB_TAG_MATH */
     {
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY_ORDINARY
-            |LXB_HTML_TAG_CATEGORY_SCOPE_SELECT,
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY_ORDINARY,
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF
     },
     /* LXB_TAG_MENU */
     {
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY_SCOPE_SELECT
-            |LXB_HTML_TAG_CATEGORY_SPECIAL,
-        LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY_SPECIAL,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF
     },
     /* LXB_TAG_META */
     {
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY_SCOPE_SELECT
-            |LXB_HTML_TAG_CATEGORY_SPECIAL,
-        LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY_SPECIAL,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF
     },
     /* LXB_TAG_METER */
     {
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY_ORDINARY
-            |LXB_HTML_TAG_CATEGORY_SCOPE_SELECT,
-        LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY_ORDINARY,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF
     },
     /* LXB_TAG_MFENCED */
     {
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY_ORDINARY
-            |LXB_HTML_TAG_CATEGORY_SCOPE_SELECT,
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY_ORDINARY,
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF
     },
     /* LXB_TAG_MGLYPH */
     {
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY_ORDINARY,
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY_ORDINARY,
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF
     },
     /* LXB_TAG_MI */
     {
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY_SCOPE
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY_SCOPE
             |LXB_HTML_TAG_CATEGORY_SCOPE_BUTTON
             |LXB_HTML_TAG_CATEGORY_SCOPE_LIST_ITEM
-            |LXB_HTML_TAG_CATEGORY_SCOPE_SELECT
             |LXB_HTML_TAG_CATEGORY_SPECIAL,
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF
     },
     /* LXB_TAG_MN */
     {
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY_SCOPE
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY_SCOPE
             |LXB_HTML_TAG_CATEGORY_SCOPE_BUTTON
             |LXB_HTML_TAG_CATEGORY_SCOPE_LIST_ITEM
-            |LXB_HTML_TAG_CATEGORY_SCOPE_SELECT
             |LXB_HTML_TAG_CATEGORY_SPECIAL,
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF
     },
     /* LXB_TAG_MO */
     {
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY_SCOPE
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY_SCOPE
             |LXB_HTML_TAG_CATEGORY_SCOPE_BUTTON
             |LXB_HTML_TAG_CATEGORY_SCOPE_LIST_ITEM
-            |LXB_HTML_TAG_CATEGORY_SCOPE_SELECT
             |LXB_HTML_TAG_CATEGORY_SPECIAL,
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF
     },
     /* LXB_TAG_MS */
     {
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY_SCOPE
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY_SCOPE
             |LXB_HTML_TAG_CATEGORY_SCOPE_BUTTON
             |LXB_HTML_TAG_CATEGORY_SCOPE_LIST_ITEM
-            |LXB_HTML_TAG_CATEGORY_SCOPE_SELECT
             |LXB_HTML_TAG_CATEGORY_SPECIAL,
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF
     },
     /* LXB_TAG_MTEXT */
     {
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY_SCOPE
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY_SCOPE
             |LXB_HTML_TAG_CATEGORY_SCOPE_BUTTON
             |LXB_HTML_TAG_CATEGORY_SCOPE_LIST_ITEM
-            |LXB_HTML_TAG_CATEGORY_SCOPE_SELECT
             |LXB_HTML_TAG_CATEGORY_SPECIAL,
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF
     },
     /* LXB_TAG_MULTICOL */
     {
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY_ORDINARY
-            |LXB_HTML_TAG_CATEGORY_SCOPE_SELECT,
-        LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY_ORDINARY,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF
     },
     /* LXB_TAG_NAV */
     {
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY_SCOPE_SELECT
-            |LXB_HTML_TAG_CATEGORY_SPECIAL,
-        LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY_SPECIAL,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF
     },
     /* LXB_TAG_NEXTID */
     {
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY_ORDINARY
-            |LXB_HTML_TAG_CATEGORY_SCOPE_SELECT,
-        LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY_ORDINARY,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF
     },
     /* LXB_TAG_NOBR */
     {
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY_FORMATTING
-            |LXB_HTML_TAG_CATEGORY_SCOPE_SELECT,
-        LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY_FORMATTING,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF
     },
     /* LXB_TAG_NOEMBED */
     {
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY_SCOPE_SELECT
-            |LXB_HTML_TAG_CATEGORY_SPECIAL,
-        LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY_SPECIAL,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF
     },
     /* LXB_TAG_NOFRAMES */
     {
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY_SCOPE_SELECT
-            |LXB_HTML_TAG_CATEGORY_SPECIAL,
-        LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY_SPECIAL,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF
     },
     /* LXB_TAG_NOSCRIPT */
     {
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY_SCOPE_SELECT
-            |LXB_HTML_TAG_CATEGORY_SPECIAL,
-        LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY_SPECIAL,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF
     },
     /* LXB_TAG_OBJECT */
     {
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, 
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF,
         LXB_HTML_TAG_CATEGORY_SCOPE
             |LXB_HTML_TAG_CATEGORY_SCOPE_BUTTON
             |LXB_HTML_TAG_CATEGORY_SCOPE_LIST_ITEM
-            |LXB_HTML_TAG_CATEGORY_SCOPE_SELECT
             |LXB_HTML_TAG_CATEGORY_SPECIAL,
-        LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF
+        LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF
     },
     /* LXB_TAG_OL */
     {
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, 
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF,
         LXB_HTML_TAG_CATEGORY_SCOPE_LIST_ITEM
-            |LXB_HTML_TAG_CATEGORY_SCOPE_SELECT
             |LXB_HTML_TAG_CATEGORY_SPECIAL,
-        LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF
+        LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF
     },
     /* LXB_TAG_OPTGROUP */
     {
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY_ORDINARY,LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY_ORDINARY,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF
     },
     /* LXB_TAG_OPTION */
     {
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY_ORDINARY,LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY_ORDINARY,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF
     },
     /* LXB_TAG_OUTPUT */
     {
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY_ORDINARY
-            |LXB_HTML_TAG_CATEGORY_SCOPE_SELECT,
-        LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY_ORDINARY,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF
     },
     /* LXB_TAG_P */
     {
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY_SCOPE_SELECT
-            |LXB_HTML_TAG_CATEGORY_SPECIAL,
-        LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY_SPECIAL,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF
     },
     /* LXB_TAG_PARAM */
     {
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY_SCOPE_SELECT
-            |LXB_HTML_TAG_CATEGORY_SPECIAL,
-        LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY_SPECIAL,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF
     },
     /* LXB_TAG_PATH */
     {
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY_ORDINARY
-            |LXB_HTML_TAG_CATEGORY_SCOPE_SELECT,
-        LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY_ORDINARY,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF
     },
     /* LXB_TAG_PICTURE */
     {
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY_ORDINARY
-            |LXB_HTML_TAG_CATEGORY_SCOPE_SELECT,
-        LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY_ORDINARY,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF
     },
     /* LXB_TAG_PLAINTEXT */
     {
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY_SCOPE_SELECT
-            |LXB_HTML_TAG_CATEGORY_SPECIAL,
-        LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY_SPECIAL,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF
     },
     /* LXB_TAG_PRE */
     {
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY_SCOPE_SELECT
-            |LXB_HTML_TAG_CATEGORY_SPECIAL,
-        LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY_SPECIAL,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF
     },
     /* LXB_TAG_PROGRESS */
     {
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY_ORDINARY
-            |LXB_HTML_TAG_CATEGORY_SCOPE_SELECT,
-        LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY_ORDINARY,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF
     },
     /* LXB_TAG_Q */
     {
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY_ORDINARY
-            |LXB_HTML_TAG_CATEGORY_SCOPE_SELECT,
-        LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY_ORDINARY,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF
     },
     /* LXB_TAG_RADIALGRADIENT */
     {
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY_ORDINARY
-            |LXB_HTML_TAG_CATEGORY_SCOPE_SELECT,
-        LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY_ORDINARY,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF
     },
     /* LXB_TAG_RB */
     {
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY_ORDINARY
-            |LXB_HTML_TAG_CATEGORY_SCOPE_SELECT,
-        LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY_ORDINARY,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF
     },
     /* LXB_TAG_RP */
     {
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY_ORDINARY
-            |LXB_HTML_TAG_CATEGORY_SCOPE_SELECT,
-        LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY_ORDINARY,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF
     },
     /* LXB_TAG_RT */
     {
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY_ORDINARY
-            |LXB_HTML_TAG_CATEGORY_SCOPE_SELECT,
-        LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY_ORDINARY,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF
     },
     /* LXB_TAG_RTC */
     {
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY_ORDINARY
-            |LXB_HTML_TAG_CATEGORY_SCOPE_SELECT,
-        LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY_ORDINARY,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF
     },
     /* LXB_TAG_RUBY */
     {
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY_ORDINARY
-            |LXB_HTML_TAG_CATEGORY_SCOPE_SELECT,
-        LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY_ORDINARY,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF
     },
     /* LXB_TAG_S */
     {
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY_FORMATTING
-            |LXB_HTML_TAG_CATEGORY_SCOPE_SELECT,
-        LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY_FORMATTING,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF
     },
     /* LXB_TAG_SAMP */
     {
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY_ORDINARY
-            |LXB_HTML_TAG_CATEGORY_SCOPE_SELECT,
-        LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY_ORDINARY,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF
     },
     /* LXB_TAG_SCRIPT */
     {
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY_SCOPE_SELECT
-            |LXB_HTML_TAG_CATEGORY_SPECIAL,
-        LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY_SPECIAL,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF
+    },
+    /* LXB_TAG_SEARCH */
+    {
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY_SPECIAL,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF
     },
     /* LXB_TAG_SECTION */
     {
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY_SCOPE_SELECT
-            |LXB_HTML_TAG_CATEGORY_SPECIAL,
-        LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY_SPECIAL,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF
     },
     /* LXB_TAG_SELECT */
     {
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY_SCOPE_SELECT
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY_SCOPE
+            |LXB_HTML_TAG_CATEGORY_SCOPE_BUTTON
+            |LXB_HTML_TAG_CATEGORY_SCOPE_LIST_ITEM
             |LXB_HTML_TAG_CATEGORY_SPECIAL,
-        LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF
+        LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF
+    },
+    /* LXB_TAG_SELECTEDCONTENT */
+    {
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY_ORDINARY,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF
     },
     /* LXB_TAG_SLOT */
     {
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY_ORDINARY
-            |LXB_HTML_TAG_CATEGORY_SCOPE_SELECT,
-        LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY_ORDINARY,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF
     },
     /* LXB_TAG_SMALL */
     {
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY_FORMATTING
-            |LXB_HTML_TAG_CATEGORY_SCOPE_SELECT,
-        LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY_FORMATTING,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF
     },
     /* LXB_TAG_SOURCE */
     {
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY_SCOPE_SELECT
-            |LXB_HTML_TAG_CATEGORY_SPECIAL,
-        LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY_SPECIAL,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF
     },
     /* LXB_TAG_SPACER */
     {
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY_ORDINARY
-            |LXB_HTML_TAG_CATEGORY_SCOPE_SELECT,
-        LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY_ORDINARY,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF
     },
     /* LXB_TAG_SPAN */
     {
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY_ORDINARY
-            |LXB_HTML_TAG_CATEGORY_SCOPE_SELECT,
-        LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY_ORDINARY,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF
     },
     /* LXB_TAG_STRIKE */
     {
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY_FORMATTING
-            |LXB_HTML_TAG_CATEGORY_SCOPE_SELECT,
-        LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY_FORMATTING,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF
     },
     /* LXB_TAG_STRONG */
     {
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY_FORMATTING
-            |LXB_HTML_TAG_CATEGORY_SCOPE_SELECT,
-        LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY_FORMATTING,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF
     },
     /* LXB_TAG_STYLE */
     {
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY_SCOPE_SELECT
-            |LXB_HTML_TAG_CATEGORY_SPECIAL,
-        LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY_SPECIAL,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF
     },
     /* LXB_TAG_SUB */
     {
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY_ORDINARY
-            |LXB_HTML_TAG_CATEGORY_SCOPE_SELECT,
-        LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY_ORDINARY,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF
     },
     /* LXB_TAG_SUMMARY */
     {
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY_SCOPE_SELECT
-            |LXB_HTML_TAG_CATEGORY_SPECIAL,
-        LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY_SPECIAL,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF
     },
     /* LXB_TAG_SUP */
     {
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY_ORDINARY
-            |LXB_HTML_TAG_CATEGORY_SCOPE_SELECT,
-        LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY_ORDINARY,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF
     },
     /* LXB_TAG_SVG */
     {
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY_ORDINARY
-            |LXB_HTML_TAG_CATEGORY_SCOPE_SELECT,
-        LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY_ORDINARY,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF
     },
     /* LXB_TAG_TABLE */
     {
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, 
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF,
         LXB_HTML_TAG_CATEGORY_SCOPE
             |LXB_HTML_TAG_CATEGORY_SCOPE_BUTTON
             |LXB_HTML_TAG_CATEGORY_SCOPE_LIST_ITEM
-            |LXB_HTML_TAG_CATEGORY_SCOPE_SELECT
             |LXB_HTML_TAG_CATEGORY_SCOPE_TABLE
             |LXB_HTML_TAG_CATEGORY_SPECIAL,
-        LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF
+        LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF
     },
     /* LXB_TAG_TBODY */
     {
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY_SCOPE_SELECT
-            |LXB_HTML_TAG_CATEGORY_SPECIAL,
-        LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY_SPECIAL,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF
     },
     /* LXB_TAG_TD */
     {
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, 
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF,
         LXB_HTML_TAG_CATEGORY_SCOPE
             |LXB_HTML_TAG_CATEGORY_SCOPE_BUTTON
             |LXB_HTML_TAG_CATEGORY_SCOPE_LIST_ITEM
-            |LXB_HTML_TAG_CATEGORY_SCOPE_SELECT
             |LXB_HTML_TAG_CATEGORY_SPECIAL,
-        LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF
+        LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF
     },
     /* LXB_TAG_TEMPLATE */
     {
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, 
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF,
         LXB_HTML_TAG_CATEGORY_SCOPE
             |LXB_HTML_TAG_CATEGORY_SCOPE_BUTTON
             |LXB_HTML_TAG_CATEGORY_SCOPE_LIST_ITEM
-            |LXB_HTML_TAG_CATEGORY_SCOPE_SELECT
             |LXB_HTML_TAG_CATEGORY_SCOPE_TABLE
             |LXB_HTML_TAG_CATEGORY_SPECIAL,
-        LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF
+        LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF
     },
     /* LXB_TAG_TEXTAREA */
     {
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY_SCOPE_SELECT
-            |LXB_HTML_TAG_CATEGORY_SPECIAL,
-        LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY_SPECIAL,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF
     },
     /* LXB_TAG_TEXTPATH */
     {
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY_ORDINARY
-            |LXB_HTML_TAG_CATEGORY_SCOPE_SELECT,
-        LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY_ORDINARY,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF
     },
     /* LXB_TAG_TFOOT */
     {
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY_SCOPE_SELECT
-            |LXB_HTML_TAG_CATEGORY_SPECIAL,
-        LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY_SPECIAL,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF
     },
     /* LXB_TAG_TH */
     {
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, 
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF,
         LXB_HTML_TAG_CATEGORY_SCOPE
             |LXB_HTML_TAG_CATEGORY_SCOPE_BUTTON
             |LXB_HTML_TAG_CATEGORY_SCOPE_LIST_ITEM
-            |LXB_HTML_TAG_CATEGORY_SCOPE_SELECT
             |LXB_HTML_TAG_CATEGORY_SPECIAL,
-        LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF
+        LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF
     },
     /* LXB_TAG_THEAD */
     {
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY_SCOPE_SELECT
-            |LXB_HTML_TAG_CATEGORY_SPECIAL,
-        LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY_SPECIAL,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF
     },
     /* LXB_TAG_TIME */
     {
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY_ORDINARY
-            |LXB_HTML_TAG_CATEGORY_SCOPE_SELECT,
-        LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY_ORDINARY,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF
     },
     /* LXB_TAG_TITLE */
     {
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY_SCOPE_SELECT
-            |LXB_HTML_TAG_CATEGORY_SPECIAL,
-        LXB_HTML_TAG_CATEGORY__UNDEF, 
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY_SPECIAL,LXB_HTML_TAG_CATEGORY__UNDEF,
         LXB_HTML_TAG_CATEGORY_SCOPE
             |LXB_HTML_TAG_CATEGORY_SCOPE_BUTTON
             |LXB_HTML_TAG_CATEGORY_SCOPE_LIST_ITEM
-            |LXB_HTML_TAG_CATEGORY_SCOPE_SELECT
             |LXB_HTML_TAG_CATEGORY_SPECIAL,
-        LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF
+        LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF
     },
     /* LXB_TAG_TR */
     {
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY_SCOPE_SELECT
-            |LXB_HTML_TAG_CATEGORY_SPECIAL,
-        LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY_SPECIAL,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF
     },
     /* LXB_TAG_TRACK */
     {
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY_SCOPE_SELECT
-            |LXB_HTML_TAG_CATEGORY_SPECIAL,
-        LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY_SPECIAL,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF
     },
     /* LXB_TAG_TT */
     {
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY_FORMATTING
-            |LXB_HTML_TAG_CATEGORY_SCOPE_SELECT,
-        LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY_FORMATTING,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF
     },
     /* LXB_TAG_U */
     {
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY_FORMATTING
-            |LXB_HTML_TAG_CATEGORY_SCOPE_SELECT,
-        LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY_FORMATTING,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF
     },
     /* LXB_TAG_UL */
     {
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, 
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF,
         LXB_HTML_TAG_CATEGORY_SCOPE_LIST_ITEM
-            |LXB_HTML_TAG_CATEGORY_SCOPE_SELECT
             |LXB_HTML_TAG_CATEGORY_SPECIAL,
-        LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF
+        LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF
     },
     /* LXB_TAG_VAR */
     {
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY_ORDINARY
-            |LXB_HTML_TAG_CATEGORY_SCOPE_SELECT,
-        LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY_ORDINARY,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF
     },
     /* LXB_TAG_VIDEO */
     {
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY_ORDINARY
-            |LXB_HTML_TAG_CATEGORY_SCOPE_SELECT,
-        LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY_ORDINARY,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF
     },
     /* LXB_TAG_WBR */
     {
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY_SCOPE_SELECT
-            |LXB_HTML_TAG_CATEGORY_SPECIAL,
-        LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY_SPECIAL,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF
     },
     /* LXB_TAG_XMP */
     {
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY_SCOPE_SELECT
-            |LXB_HTML_TAG_CATEGORY_SPECIAL,
-        LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, 
-        LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY_SPECIAL,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF,
+        LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF
     }
 };
-#endif /* LXB_HTML_TAG_RES_CATS_ENABLED */
-#endif /* LXB_HTML_TAG_RES_CATS */
 
-#ifdef LXB_HTML_TAG_RES_FIXNAME_SVG
-#ifndef LXB_HTML_TAG_RES_FIXNAME_SVG_ENABLED
-#define LXB_HTML_TAG_RES_FIXNAME_SVG_ENABLED
-static  lxb_html_tag_fixname_t lxb_html_tag_res_fixname_svg[LXB_TAG__LAST_ENTRY] = 
+LXB_API  lxb_html_tag_fixname_t lxb_html_tag_res_fixname_svg[LXB_TAG__LAST_ENTRY] = 
 {
     /* LXB_TAG__UNDEF */
     {NULL, 0},
@@ -2188,10 +1825,14 @@ static  lxb_html_tag_fixname_t lxb_html_tag_res_fixname_svg[LXB_TAG__LAST_ENTRY]
     {NULL, 0},
     /* LXB_TAG_SCRIPT */
     {NULL, 0},
+    /* LXB_TAG_SEARCH */
+    {NULL, 0},
     /* LXB_TAG_SECTION */
     {NULL, 0},
     /* LXB_TAG_SELECT */
     {NULL, 0},
+    /* LXB_TAG_SELECTEDCONTENT */
+    {NULL, 0},
     /* LXB_TAG_SLOT */
     {NULL, 0},
     /* LXB_TAG_SMALL */
@@ -2256,7 +1897,7 @@ static  lxb_html_tag_fixname_t lxb_html_tag_res_fixname_svg[LXB_TAG__LAST_ENTRY]
     {NULL, 0},
     /* LXB_TAG_XMP */
     {NULL, 0},
-
+    
 };
-#endif /* LXB_HTML_TAG_RES_FIXNAME_SVG_ENABLED */
-#endif /* LXB_HTML_TAG_RES_FIXNAME_SVG */
+
+#endif /* LXB_HTML_TAG_RES_H */
diff --git a/ext/lexbor/lexbor/html/token.c b/ext/lexbor/lexbor/html/token.c
index 0f5d076adf59..d4ab1bbb767d 100644
--- a/ext/lexbor/lexbor/html/token.c
+++ b/ext/lexbor/lexbor/html/token.c
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2018-2020 Alexander Borisov
+ * Copyright (C) 2018-2026 Alexander Borisov
  *
  * Author: Alexander Borisov 
  */
@@ -7,11 +7,12 @@
 #include "lexbor/html/token.h"
 #include "lexbor/html/tokenizer.h"
 
-#define LEXBOR_STR_RES_MAP_LOWERCASE
-#define LEXBOR_STR_RES_ANSI_REPLACEMENT_CHARACTER
-#define LEXBOR_STR_RES_MAP_HEX
-#define LEXBOR_STR_RES_MAP_NUM
-#include "lexbor/core/str_res.h"
+#ifndef LEXBOR_DISABLE_INTERNAL_EXTERN
+    LXB_EXTERN const lxb_char_t lexbor_str_res_map_lowercase[256];
+    LXB_EXTERN const lxb_char_t lexbor_str_res_ansi_replacement_character[4];
+    LXB_EXTERN const lxb_char_t lexbor_str_res_map_num[256];
+    LXB_EXTERN const lxb_char_t lexbor_str_res_map_hex[256];
+#endif
 
 #include "lexbor/dom/interfaces/document_type.h"
 
diff --git a/ext/lexbor/lexbor/html/tokenizer.c b/ext/lexbor/lexbor/html/tokenizer.c
index 0bd9aec504f0..1d9f3781255d 100644
--- a/ext/lexbor/lexbor/html/tokenizer.c
+++ b/ext/lexbor/lexbor/html/tokenizer.c
@@ -11,19 +11,20 @@
 #include "lexbor/html/tokenizer/state_script.h"
 #include "lexbor/html/tree.h"
 
-#define LXB_HTML_TAG_RES_DATA
-#define LXB_HTML_TAG_RES_SHS_DATA
-#include "lexbor/html/tag_res.h"
+
+#ifndef LEXBOR_DISABLE_INTERNAL_EXTERN
+    LXB_EXTERN lxb_html_tag_category_t lxb_html_tag_res_cats[LXB_TAG__LAST_ENTRY][LXB_NS__LAST_ENTRY];
+    LXB_EXTERN lxb_html_tag_fixname_t lxb_html_tag_res_fixname_svg[LXB_TAG__LAST_ENTRY];
+#endif
 
 
 #define LXB_HTML_TKZ_TEMP_SIZE (4096 * 4)
 
 
 enum {
-    LXB_HTML_TOKENIZER_OPT_UNDEF           = 0x00,
-    LXB_HTML_TOKENIZER_OPT_TAGS_SELF       = 0x01,
-    LXB_HTML_TOKENIZER_OPT_ATTRS_SELF      = 0x02,
-    LXB_HTML_TOKENIZER_OPT_ATTRS_MRAW_SELF = 0x04
+    LXB_HTML_TOKENIZER_OPT_TAGS_SELF       = 1 << 0,
+    LXB_HTML_TOKENIZER_OPT_ATTRS_SELF      = 1 << 1,
+    LXB_HTML_TOKENIZER_OPT_ATTRS_MRAW_SELF = 1 << 2
 };
 
 
@@ -206,6 +207,8 @@ lxb_html_tokenizer_clean(lxb_html_tokenizer_t *tkz)
     tkz->is_eof = false;
     tkz->status = LXB_STATUS_OK;
 
+    tkz->utf8_buf_len = 0;
+
     tkz->pos = tkz->start;
 
     lexbor_mraw_clean(tkz->mraw);
@@ -304,12 +307,268 @@ lxb_html_tokenizer_begin(lxb_html_tokenizer_t *tkz)
     return LXB_STATUS_OK;
 }
 
+/*
+ * Input stream validation.
+ *
+ * Per the HTML spec §13.2.3.5: surrogates, noncharacters, and controls
+ * (other than ASCII whitespace and NULL) in the input stream are parse errors.
+ *
+ * This is a fast linear scan that only fires when
+ * LXB_HTML_TOKENIZER_OPT_VALIDATE_INPUT is set.
+ */
+
+/*
+ * Lookup: 1 if the byte is a single-byte control that needs reporting.
+ * Covers 0x01–0x08, 0x0B, 0x0E–0x1F, 0x7F.
+ * Excludes 0x00 (handled by tokenizer as UNNUCH), 0x09 (TAB), 0x0A (LF),
+ * 0x0C (FF), 0x0D (CR), 0x20 (SPACE).
+ */
+static const lxb_char_t
+lxb_html_tkz_validate_ctl[256] =
+{
+/*       0  1  2  3  4  5  6  7  8  9  A  B  C  D  E  F */
+/* 0 */  0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 0, 0, 1, 1,
+/* 1 */  1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+/* 2 */  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+/* 3 */  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+/* 4 */  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+/* 5 */  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+/* 6 */  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+/* 7 */  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1,
+/* 8+ */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+         0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+         0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+         0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+         0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+         0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+         0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+         0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
+};
+
+static void
+lxb_html_tokenizer_validate_codepoint(lxb_html_tokenizer_t *tkz,
+                                      uint32_t cp, const lxb_char_t *pos)
+{
+    /* C1 controls: U+0080–U+009F */
+    if (cp >= 0x0080 && cp <= 0x009F) {
+        lxb_html_tokenizer_error_add(tkz->parse_errors, pos,
+                                     LXB_HTML_TOKENIZER_ERROR_COCHININST);
+        return;
+    }
+
+    /* Surrogates: U+D800–U+DFFF */
+    if (cp >= 0xD800 && cp <= 0xDFFF) {
+        lxb_html_tokenizer_error_add(tkz->parse_errors, pos,
+                                     LXB_HTML_TOKENIZER_ERROR_SUININST);
+        return;
+    }
+
+    /* Noncharacters: U+FDD0–U+FDEF */
+    if (cp >= 0xFDD0 && cp <= 0xFDEF) {
+        lxb_html_tokenizer_error_add(tkz->parse_errors, pos,
+                                     LXB_HTML_TOKENIZER_ERROR_NOININST);
+        return;
+    }
+
+    /* Noncharacters: U+xFFFE and U+xFFFF on every plane */
+    if ((cp & 0xFFFE) == 0xFFFE && cp <= 0x10FFFF) {
+        lxb_html_tokenizer_error_add(tkz->parse_errors, pos,
+                                     LXB_HTML_TOKENIZER_ERROR_NOININST);
+    }
+}
+
+static void
+lxb_html_tokenizer_validate_flush_utf8(lxb_html_tokenizer_t *tkz,
+                                       const lxb_char_t *pos)
+{
+    uint32_t cp;
+    unsigned len = tkz->utf8_buf_len;
+    const lxb_char_t *b = tkz->utf8_buf;
+
+    if (len < 2) {
+        goto done;
+    }
+
+    if ((b[0] & 0xE0) == 0xC0) {
+        cp = ((uint32_t)(b[0] & 0x1F) << 6) | (b[1] & 0x3F);
+        lxb_html_tokenizer_validate_codepoint(tkz, cp, pos);
+        goto done;
+    }
+
+    if (len < 3) {
+        goto done;
+    }
+
+    if ((b[0] & 0xF0) == 0xE0) {
+        cp = ((uint32_t)(b[0] & 0x0F) << 12)
+           | ((uint32_t)(b[1] & 0x3F) << 6)
+           | (b[2] & 0x3F);
+        lxb_html_tokenizer_validate_codepoint(tkz, cp, pos);
+        goto done;
+    }
+
+    if (len < 4) {
+        goto done;
+    }
+
+    if ((b[0] & 0xF8) == 0xF0) {
+        cp = ((uint32_t)(b[0] & 0x07) << 18)
+           | ((uint32_t)(b[1] & 0x3F) << 12)
+           | ((uint32_t)(b[2] & 0x3F) << 6)
+           | (b[3] & 0x3F);
+        lxb_html_tokenizer_validate_codepoint(tkz, cp, pos);
+    }
+
+done:
+
+    tkz->utf8_buf_len = 0;
+}
+
+static void
+lxb_html_tokenizer_validate_input(lxb_html_tokenizer_t *tkz,
+                                  const lxb_char_t *data, size_t size)
+{
+    uint32_t cp;
+    unsigned need, len;
+    const lxb_char_t *p, *end;
+
+    p = data;
+    end = data + size;
+
+    /* Continue incomplete UTF-8 sequence from previous chunk. */
+    if (tkz->utf8_buf_len > 0) {
+        lxb_char_t lead = tkz->utf8_buf[0];
+
+        if ((lead & 0xE0) == 0xC0) {
+            need = 2;
+        }
+        else if ((lead & 0xF0) == 0xE0) {
+            need = 3;
+        }
+        else {
+            need = 4;
+        }
+
+        while (tkz->utf8_buf_len < need && p < end) {
+            if ((*p & 0xC0) != 0x80) {
+                /* Broken sequence, skip. */
+                tkz->utf8_buf_len = 0;
+                break;
+            }
+
+            tkz->utf8_buf[tkz->utf8_buf_len++] = *p++;
+        }
+
+        if (tkz->utf8_buf_len == need) {
+            lxb_html_tokenizer_validate_flush_utf8(tkz, data);
+        }
+        else if (p >= end) {
+            /* Still incomplete, wait for more data. */
+            return;
+        }
+        else {
+            /* Broken sequence was reset above. */
+        }
+    }
+
+    while (p < end) {
+        lxb_char_t b = *p;
+
+        /* Fast path: printable ASCII (0x20–0x7E), TAB, LF, FF, CR, NULL. */
+        if (b < 0x80) {
+            if (lxb_html_tkz_validate_ctl[b]) {
+                lxb_html_tokenizer_error_add(tkz->parse_errors, p,
+                                             LXB_HTML_TOKENIZER_ERROR_COCHININST);
+            }
+
+            p++;
+            continue;
+        }
+
+        /* Multi-byte UTF-8. Determine expected length. */
+        if ((b & 0xE0) == 0xC0) {
+            need = 2;
+        }
+        else if ((b & 0xF0) == 0xE0) {
+            need = 3;
+        }
+        else if ((b & 0xF8) == 0xF0) {
+            need = 4;
+        }
+        else {
+            /* Invalid lead byte or continuation byte, skip. */
+            p++;
+            continue;
+        }
+
+        /* Check if the full sequence is available in this chunk. */
+        if ((unsigned)(end - p) < need) {
+            /* Save partial sequence for next chunk. */
+            len = (unsigned)(end - p);
+            memcpy(tkz->utf8_buf, p, len);
+            tkz->utf8_buf_len = len;
+            return;
+        }
+
+        /* Quick filter: only decode if lead byte can start a bad codepoint.
+         *
+         * 0xC2       -> C1 controls (U+0080–U+009F): second byte 0x80–0x9F
+         * 0xED       -> surrogates (U+D800–U+DFFF): second byte 0xA0–0xBF
+         * 0xEF       -> nonchars U+FDD0–U+FDEF (0xEF 0xB7 0x90–0xAF)
+         *               and U+FFFE/U+FFFF (0xEF 0xBF 0xBE/0xBF)
+         * 0xF0–0xF4  -> nonchars U+xFFFE/U+xFFFF on planes 1–16
+         */
+        if (b == 0xC2) {
+            if (p[1] <= 0x9F) {
+                cp = ((uint32_t)(b & 0x1F) << 6) | (p[1] & 0x3F);
+                lxb_html_tokenizer_validate_codepoint(tkz, cp, p);
+            }
+        }
+        else if (b == 0xED) {
+            if (p[1] >= 0xA0) {
+                cp = ((uint32_t)(b & 0x0F) << 12)
+                   | ((uint32_t)(p[1] & 0x3F) << 6)
+                   | (p[2] & 0x3F);
+                lxb_html_tokenizer_validate_codepoint(tkz, cp, p);
+            }
+        }
+        else if (b == 0xEF) {
+            if (p[1] == 0xB7 && p[2] >= 0x90 && p[2] <= 0xAF) {
+                /* U+FDD0–U+FDEF */
+                lxb_html_tokenizer_error_add(tkz->parse_errors, p,
+                                             LXB_HTML_TOKENIZER_ERROR_NOININST);
+            }
+            else if (p[1] == 0xBF && (p[2] == 0xBE || p[2] == 0xBF)) {
+                /* U+FFFE, U+FFFF */
+                lxb_html_tokenizer_error_add(tkz->parse_errors, p,
+                                             LXB_HTML_TOKENIZER_ERROR_NOININST);
+            }
+        }
+        else if (b >= 0xF0 && b <= 0xF4) {
+            /* 4-byte: check for xFFFE/xFFFF. */
+            if (p[2] == 0xBF && (p[3] == 0xBE || p[3] == 0xBF)) {
+                cp = ((uint32_t)(b & 0x07) << 18)
+                   | ((uint32_t)(p[1] & 0x3F) << 12)
+                   | ((uint32_t)(p[2] & 0x3F) << 6)
+                   | (p[3] & 0x3F);
+                lxb_html_tokenizer_validate_codepoint(tkz, cp, p);
+            }
+        }
+
+        p += need;
+    }
+}
+
 lxb_status_t
 lxb_html_tokenizer_chunk(lxb_html_tokenizer_t *tkz, const lxb_char_t *data,
                          size_t size)
 {
     const lxb_char_t *end = data + size;
 
+    if (tkz->opt & LXB_HTML_TOKENIZER_OPT_VALIDATE_INPUT) {
+        lxb_html_tokenizer_validate_input(tkz, data, size);
+    }
+
     tkz->is_eof = false;
     tkz->status = LXB_STATUS_OK;
     tkz->last = end;
@@ -457,6 +716,46 @@ lxb_html_tokenizer_set_state_by_tag(lxb_html_tokenizer_t *tkz, bool scripting,
     }
 }
 
+void
+lxb_html_tokenizer_attr_last_duplicate(lxb_html_tokenizer_t *tkz)
+{
+    lxb_html_token_t *token;
+    lxb_html_token_attr_t *attr, *last;
+
+    token = tkz->token;
+    attr = token->attr_first;
+    last = token->attr_last;
+
+    while (attr != last) {
+        if (attr->name == last->name) {
+            lxb_html_tokenizer_error_add(tkz->parse_errors, last->name_begin,
+                                         LXB_HTML_TOKENIZER_ERROR_DUAT);
+
+            lxb_html_token_attr_remove(token, last);
+            lxb_html_token_attr_destroy(last, tkz->dobj_token_attr);
+            return;
+        }
+
+        attr = attr->next;
+    }
+}
+
+void
+lxb_html_tokenizer_validate_close_tag(lxb_html_tokenizer_t *tkz)
+{
+    if (tkz->token->attr_last != NULL) {
+        lxb_html_tokenizer_error_add(tkz->parse_errors,
+                                     tkz->token->attr_last->name_begin,
+                                     LXB_HTML_TOKENIZER_ERROR_ENTAWIAT);
+    }
+
+    if (tkz->token->type & LXB_HTML_TOKEN_TYPE_CLOSE_SELF) {
+        lxb_html_tokenizer_error_add(tkz->parse_errors, tkz->token->end,
+                                     LXB_HTML_TOKENIZER_ERROR_ENTAWITRSO);
+    }
+}
+
+
 /*
  * No inline functions for ABI.
  */
@@ -508,6 +807,13 @@ lxb_html_tokenizer_tree_set_noi(lxb_html_tokenizer_t *tkz,
     lxb_html_tokenizer_tree_set(tkz, tree);
 }
 
+void
+lxb_html_tokenizer_input_validation_set_noi(lxb_html_tokenizer_t *tkz,
+                                            bool enabled)
+{
+    lxb_html_tokenizer_input_validation_set(tkz, enabled);
+}
+
 lexbor_mraw_t *
 lxb_html_tokenizer_mraw_noi(lxb_html_tokenizer_t *tkz)
 {
@@ -519,3 +825,10 @@ lxb_html_tokenizer_tags_noi(lxb_html_tokenizer_t *tkz)
 {
     return lxb_html_tokenizer_tags(tkz);
 }
+
+void
+lxb_html_tokenizer_keep_duplicate_set_noi(lxb_html_tokenizer_t *tkz,
+                                          bool keep)
+{
+    lxb_html_tokenizer_keep_duplicate_set(tkz, keep);
+}
diff --git a/ext/lexbor/lexbor/html/tokenizer.h b/ext/lexbor/lexbor/html/tokenizer.h
index 74bb55ef0fd7..aa1ac37d996d 100644
--- a/ext/lexbor/lexbor/html/tokenizer.h
+++ b/ext/lexbor/lexbor/html/tokenizer.h
@@ -21,6 +21,12 @@ extern "C" {
 #include "lexbor/ns/ns.h"
 
 
+enum {
+    LXB_HTML_TOKENIZER_OPT_UNDEF               = 0x00,
+    LXB_HTML_TOKENIZER_OPT_VALIDATE_INPUT      = 1 << 3,
+    LXB_HTML_TOKENIZER_OPT_ATTR_KEEP_DUPLICATE = 1 << 4
+};
+
 /* State */
 typedef const lxb_char_t *
 (*lxb_html_tokenizer_state_f)(lxb_html_tokenizer_t *tkz,
@@ -90,6 +96,10 @@ struct lxb_html_tokenizer {
     lxb_status_t                     status;
     bool                             is_eof;
 
+    /* Input stream validation (for cross-chunk UTF-8). */
+    lxb_char_t                       utf8_buf[4];
+    unsigned                         utf8_buf_len;
+
     lxb_html_tokenizer_t             *base;
     size_t                           ref_count;
 };
@@ -97,8 +107,9 @@ struct lxb_html_tokenizer {
 
 #include "lexbor/html/tokenizer/error.h"
 
-
-extern const lxb_char_t *lxb_html_tokenizer_eof;
+#ifndef LEXBOR_DISABLE_INTERNAL_EXTERN
+    LXB_EXTERN const lxb_char_t *lxb_html_tokenizer_eof;
+#endif
 
 LXB_API lxb_html_tokenizer_t *
 lxb_html_tokenizer_create(void);
@@ -156,6 +167,11 @@ LXB_API void
 lxb_html_tokenizer_set_state_by_tag(lxb_html_tokenizer_t *tkz, bool scripting,
                                     lxb_tag_id_t tag_id, lxb_ns_id_t ns);
 
+LXB_API void
+lxb_html_tokenizer_attr_last_duplicate(lxb_html_tokenizer_t *tkz);
+
+LXB_API void
+lxb_html_tokenizer_validate_close_tag(lxb_html_tokenizer_t *tkz);
 
 /*
  * Inline functions
@@ -250,6 +266,28 @@ lxb_html_tokenizer_mraw(lxb_html_tokenizer_t *tkz)
     return tkz->mraw;
 }
 
+lxb_inline void
+lxb_html_tokenizer_input_validation_set(lxb_html_tokenizer_t *tkz, bool enabled)
+{
+    if (enabled) {
+        tkz->opt |= LXB_HTML_TOKENIZER_OPT_VALIDATE_INPUT;
+    }
+    else {
+        tkz->opt &= ~LXB_HTML_TOKENIZER_OPT_VALIDATE_INPUT;
+    }
+}
+
+lxb_inline void
+lxb_html_tokenizer_keep_duplicate_set(lxb_html_tokenizer_t *tkz, bool keep)
+{
+    if (keep) {
+        tkz->opt |= LXB_HTML_TOKENIZER_OPT_ATTR_KEEP_DUPLICATE;
+    }
+    else {
+        tkz->opt &= ~LXB_HTML_TOKENIZER_OPT_ATTR_KEEP_DUPLICATE;
+    }
+}
+
 lxb_inline lxb_status_t
 lxb_html_tokenizer_temp_realloc(lxb_html_tokenizer_t *tkz, size_t size)
 {
@@ -331,12 +369,20 @@ LXB_API void
 lxb_html_tokenizer_tree_set_noi(lxb_html_tokenizer_t *tkz,
                                 lxb_html_tree_t *tree);
 
+LXB_API void
+lxb_html_tokenizer_input_validation_set_noi(lxb_html_tokenizer_t *tkz,
+                                            bool enabled);
+
 LXB_API lexbor_mraw_t *
 lxb_html_tokenizer_mraw_noi(lxb_html_tokenizer_t *tkz);
 
 LXB_API lexbor_hash_t *
 lxb_html_tokenizer_tags_noi(lxb_html_tokenizer_t *tkz);
 
+LXB_API void
+lxb_html_tokenizer_keep_duplicate_set_noi(lxb_html_tokenizer_t *tkz,
+                                          bool keep);
+
 
 #ifdef __cplusplus
 } /* extern "C" */
diff --git a/ext/lexbor/lexbor/html/tokenizer/error.c b/ext/lexbor/lexbor/html/tokenizer/error.c
index c2381ad97c87..241fac509768 100644
--- a/ext/lexbor/lexbor/html/tokenizer/error.c
+++ b/ext/lexbor/lexbor/html/tokenizer/error.c
@@ -1,9 +1,10 @@
 /*
- * Copyright (C) 2018 Alexander Borisov
+ * Copyright (C) 2018-2026 Alexander Borisov
  *
  * Author: Alexander Borisov 
  */
 
+#include "lexbor/core/str.h"
 #include "lexbor/html/tokenizer/error.h"
 
 
@@ -26,3 +27,76 @@ lxb_html_tokenizer_error_add(lexbor_array_obj_t *parse_errors,
 
     return entry;
 }
+
+const lxb_char_t *
+lxb_html_tokenizer_error_to_string(lxb_html_tokenizer_error_id_t id,
+                                   size_t *len)
+{
+    static const lexbor_str_t unknown = lexbor_str("unknown error");
+
+    static const lexbor_str_t errors[LXB_HTML_TOKENIZER_ERROR_LAST_ENTRY] = {
+        lexbor_str("abrupt closing of empty comment"),
+        lexbor_str("abrupt doctype public identifier"),
+        lexbor_str("abrupt doctype system identifier"),
+        lexbor_str("absence of digits in numeric character reference"),
+        lexbor_str("cdata in html content"),
+        lexbor_str("character reference outside unicode range"),
+        lexbor_str("control character in input stream"),
+        lexbor_str("control character reference"),
+        lexbor_str("end tag with attributes"),
+        lexbor_str("duplicate attribute"),
+        lexbor_str("end tag with trailing solidus"),
+        lexbor_str("eof before tag name"),
+        lexbor_str("eof in cdata"),
+        lexbor_str("eof in comment"),
+        lexbor_str("eof in doctype"),
+        lexbor_str("eof in script html comment like text"),
+        lexbor_str("eof in tag"),
+        lexbor_str("incorrectly closed comment"),
+        lexbor_str("incorrectly opened comment"),
+        lexbor_str("invalid character sequence after doctype name"),
+        lexbor_str("invalid first character of tag name"),
+        lexbor_str("missing attribute value"),
+        lexbor_str("missing doctype name"),
+        lexbor_str("missing doctype public identifier"),
+        lexbor_str("missing doctype system identifier"),
+        lexbor_str("missing end tag name"),
+        lexbor_str("missing quote before doctype public identifier"),
+        lexbor_str("missing quote before doctype system identifier"),
+        lexbor_str("missing semicolon after character reference"),
+        lexbor_str("missing whitespace after doctype public keyword"),
+        lexbor_str("missing whitespace after doctype system keyword"),
+        lexbor_str("missing whitespace before doctype name"),
+        lexbor_str("missing whitespace between attributes"),
+        lexbor_str("missing whitespace between doctype public and system identifiers"),
+        lexbor_str("nested comment"),
+        lexbor_str("noncharacter character reference"),
+        lexbor_str("noncharacter in input stream"),
+        lexbor_str("non void html element start tag with trailing solidus"),
+        lexbor_str("null character reference"),
+        lexbor_str("surrogate character reference"),
+        lexbor_str("surrogate in input stream"),
+        lexbor_str("unexpected character after doctype system identifier"),
+        lexbor_str("unexpected character in attribute name"),
+        lexbor_str("unexpected character in unquoted attribute value"),
+        lexbor_str("unexpected equals sign before attribute name"),
+        lexbor_str("unexpected null character"),
+        lexbor_str("unexpected question mark instead of tag name"),
+        lexbor_str("unexpected solidus in tag"),
+        lexbor_str("unknown named character reference")
+    };
+
+    if (id >= (sizeof(errors) / sizeof(lexbor_str_t))) {
+        if (len != NULL) {
+            *len = unknown.length;
+        }
+
+        return unknown.data;
+    }
+
+    if (len != NULL) {
+        *len = errors[id].length;
+    }
+
+    return errors[id].data;
+}
diff --git a/ext/lexbor/lexbor/html/tokenizer/error.h b/ext/lexbor/lexbor/html/tokenizer/error.h
index 2685f039d510..617ff636935b 100644
--- a/ext/lexbor/lexbor/html/tokenizer/error.h
+++ b/ext/lexbor/lexbor/html/tokenizer/error.h
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2018 Alexander Borisov
+ * Copyright (C) 2018-2026 Alexander Borisov
  *
  * Author: Alexander Borisov 
  */
@@ -21,102 +21,103 @@ typedef enum {
     /* abrupt-closing-of-empty-comment */
     LXB_HTML_TOKENIZER_ERROR_ABCLOFEMCO         = 0x0000,
     /* abrupt-doctype-public-identifier */
-    LXB_HTML_TOKENIZER_ERROR_ABDOPUID           = 0x0001,
+    LXB_HTML_TOKENIZER_ERROR_ABDOPUID,
     /* abrupt-doctype-system-identifier */
-    LXB_HTML_TOKENIZER_ERROR_ABDOSYID           = 0x0002,
+    LXB_HTML_TOKENIZER_ERROR_ABDOSYID,
     /* absence-of-digits-in-numeric-character-reference */
-    LXB_HTML_TOKENIZER_ERROR_ABOFDIINNUCHRE     = 0x0003,
+    LXB_HTML_TOKENIZER_ERROR_ABOFDIINNUCHRE,
     /* cdata-in-html-content */
-    LXB_HTML_TOKENIZER_ERROR_CDINHTCO           = 0x0004,
+    LXB_HTML_TOKENIZER_ERROR_CDINHTCO,
     /* character-reference-outside-unicode-range */
-    LXB_HTML_TOKENIZER_ERROR_CHREOUUNRA         = 0x0005,
+    LXB_HTML_TOKENIZER_ERROR_CHREOUUNRA,
     /* control-character-in-input-stream */
-    LXB_HTML_TOKENIZER_ERROR_COCHININST         = 0x0006,
+    LXB_HTML_TOKENIZER_ERROR_COCHININST,
     /* control-character-reference */
-    LXB_HTML_TOKENIZER_ERROR_COCHRE             = 0x0007,
+    LXB_HTML_TOKENIZER_ERROR_COCHRE,
     /* end-tag-with-attributes */
-    LXB_HTML_TOKENIZER_ERROR_ENTAWIAT           = 0x0008,
+    LXB_HTML_TOKENIZER_ERROR_ENTAWIAT,
     /* duplicate-attribute */
-    LXB_HTML_TOKENIZER_ERROR_DUAT               = 0x0009,
+    LXB_HTML_TOKENIZER_ERROR_DUAT,
     /* end-tag-with-trailing-solidus */
-    LXB_HTML_TOKENIZER_ERROR_ENTAWITRSO         = 0x000A,
+    LXB_HTML_TOKENIZER_ERROR_ENTAWITRSO,
     /* eof-before-tag-name */
-    LXB_HTML_TOKENIZER_ERROR_EOBETANA           = 0x000B,
+    LXB_HTML_TOKENIZER_ERROR_EOBETANA,
     /* eof-in-cdata */
-    LXB_HTML_TOKENIZER_ERROR_EOINCD             = 0x000C,
+    LXB_HTML_TOKENIZER_ERROR_EOINCD,
     /* eof-in-comment */
-    LXB_HTML_TOKENIZER_ERROR_EOINCO             = 0x000D,
+    LXB_HTML_TOKENIZER_ERROR_EOINCO,
     /* eof-in-doctype */
-    LXB_HTML_TOKENIZER_ERROR_EOINDO             = 0x000E,
+    LXB_HTML_TOKENIZER_ERROR_EOINDO,
     /* eof-in-script-html-comment-like-text */
-    LXB_HTML_TOKENIZER_ERROR_EOINSCHTCOLITE     = 0x000F,
+    LXB_HTML_TOKENIZER_ERROR_EOINSCHTCOLITE,
     /* eof-in-tag */
-    LXB_HTML_TOKENIZER_ERROR_EOINTA             = 0x0010,
+    LXB_HTML_TOKENIZER_ERROR_EOINTA,
     /* incorrectly-closed-comment */
-    LXB_HTML_TOKENIZER_ERROR_INCLCO             = 0x0011,
+    LXB_HTML_TOKENIZER_ERROR_INCLCO,
     /* incorrectly-opened-comment */
-    LXB_HTML_TOKENIZER_ERROR_INOPCO             = 0x0012,
+    LXB_HTML_TOKENIZER_ERROR_INOPCO,
     /* invalid-character-sequence-after-doctype-name */
-    LXB_HTML_TOKENIZER_ERROR_INCHSEAFDONA       = 0x0013,
+    LXB_HTML_TOKENIZER_ERROR_INCHSEAFDONA,
     /* invalid-first-character-of-tag-name */
-    LXB_HTML_TOKENIZER_ERROR_INFICHOFTANA       = 0x0014,
+    LXB_HTML_TOKENIZER_ERROR_INFICHOFTANA,
     /* missing-attribute-value */
-    LXB_HTML_TOKENIZER_ERROR_MIATVA             = 0x0015,
+    LXB_HTML_TOKENIZER_ERROR_MIATVA,
     /* missing-doctype-name */
-    LXB_HTML_TOKENIZER_ERROR_MIDONA             = 0x0016,
+    LXB_HTML_TOKENIZER_ERROR_MIDONA,
     /* missing-doctype-public-identifier */
-    LXB_HTML_TOKENIZER_ERROR_MIDOPUID           = 0x0017,
+    LXB_HTML_TOKENIZER_ERROR_MIDOPUID,
     /* missing-doctype-system-identifier */
-    LXB_HTML_TOKENIZER_ERROR_MIDOSYID           = 0x0018,
+    LXB_HTML_TOKENIZER_ERROR_MIDOSYID,
     /* missing-end-tag-name */
-    LXB_HTML_TOKENIZER_ERROR_MIENTANA           = 0x0019,
+    LXB_HTML_TOKENIZER_ERROR_MIENTANA,
     /* missing-quote-before-doctype-public-identifier */
-    LXB_HTML_TOKENIZER_ERROR_MIQUBEDOPUID       = 0x001A,
+    LXB_HTML_TOKENIZER_ERROR_MIQUBEDOPUID,
     /* missing-quote-before-doctype-system-identifier */
-    LXB_HTML_TOKENIZER_ERROR_MIQUBEDOSYID       = 0x001B,
+    LXB_HTML_TOKENIZER_ERROR_MIQUBEDOSYID,
     /* missing-semicolon-after-character-reference */
-    LXB_HTML_TOKENIZER_ERROR_MISEAFCHRE         = 0x001C,
+    LXB_HTML_TOKENIZER_ERROR_MISEAFCHRE,
     /* missing-whitespace-after-doctype-public-keyword */
-    LXB_HTML_TOKENIZER_ERROR_MIWHAFDOPUKE       = 0x001D,
+    LXB_HTML_TOKENIZER_ERROR_MIWHAFDOPUKE,
     /* missing-whitespace-after-doctype-system-keyword */
-    LXB_HTML_TOKENIZER_ERROR_MIWHAFDOSYKE       = 0x001E,
+    LXB_HTML_TOKENIZER_ERROR_MIWHAFDOSYKE,
     /* missing-whitespace-before-doctype-name */
-    LXB_HTML_TOKENIZER_ERROR_MIWHBEDONA         = 0x001F,
+    LXB_HTML_TOKENIZER_ERROR_MIWHBEDONA,
     /* missing-whitespace-between-attributes */
-    LXB_HTML_TOKENIZER_ERROR_MIWHBEAT           = 0x0020,
+    LXB_HTML_TOKENIZER_ERROR_MIWHBEAT,
     /* missing-whitespace-between-doctype-public-and-system-identifiers */
-    LXB_HTML_TOKENIZER_ERROR_MIWHBEDOPUANSYID   = 0x0021,
+    LXB_HTML_TOKENIZER_ERROR_MIWHBEDOPUANSYID,
     /* nested-comment */
-    LXB_HTML_TOKENIZER_ERROR_NECO               = 0x0022,
+    LXB_HTML_TOKENIZER_ERROR_NECO,
     /* noncharacter-character-reference */
-    LXB_HTML_TOKENIZER_ERROR_NOCHRE             = 0x0023,
+    LXB_HTML_TOKENIZER_ERROR_NOCHRE,
     /* noncharacter-in-input-stream */
-    LXB_HTML_TOKENIZER_ERROR_NOININST           = 0x0024,
+    LXB_HTML_TOKENIZER_ERROR_NOININST,
     /* non-void-html-element-start-tag-with-trailing-solidus */
-    LXB_HTML_TOKENIZER_ERROR_NOVOHTELSTTAWITRSO = 0x0025,
+    LXB_HTML_TOKENIZER_ERROR_NOVOHTELSTTAWITRSO,
     /* null-character-reference */
-    LXB_HTML_TOKENIZER_ERROR_NUCHRE             = 0x0026,
+    LXB_HTML_TOKENIZER_ERROR_NUCHRE,
     /* surrogate-character-reference */
-    LXB_HTML_TOKENIZER_ERROR_SUCHRE             = 0x0027,
+    LXB_HTML_TOKENIZER_ERROR_SUCHRE,
     /* surrogate-in-input-stream */
-    LXB_HTML_TOKENIZER_ERROR_SUININST           = 0x0028,
+    LXB_HTML_TOKENIZER_ERROR_SUININST,
     /* unexpected-character-after-doctype-system-identifier */
-    LXB_HTML_TOKENIZER_ERROR_UNCHAFDOSYID       = 0x0029,
+    LXB_HTML_TOKENIZER_ERROR_UNCHAFDOSYID,
     /* unexpected-character-in-attribute-name */
-    LXB_HTML_TOKENIZER_ERROR_UNCHINATNA         = 0x002A,
+    LXB_HTML_TOKENIZER_ERROR_UNCHINATNA,
     /* unexpected-character-in-unquoted-attribute-value */
-    LXB_HTML_TOKENIZER_ERROR_UNCHINUNATVA       = 0x002B,
+    LXB_HTML_TOKENIZER_ERROR_UNCHINUNATVA,
     /* unexpected-equals-sign-before-attribute-name */
-    LXB_HTML_TOKENIZER_ERROR_UNEQSIBEATNA       = 0x002C,
+    LXB_HTML_TOKENIZER_ERROR_UNEQSIBEATNA,
     /* unexpected-null-character */
-    LXB_HTML_TOKENIZER_ERROR_UNNUCH             = 0x002D,
+    LXB_HTML_TOKENIZER_ERROR_UNNUCH,
     /* unexpected-question-mark-instead-of-tag-name */
-    LXB_HTML_TOKENIZER_ERROR_UNQUMAINOFTANA     = 0x002E,
+    LXB_HTML_TOKENIZER_ERROR_UNQUMAINOFTANA,
     /* unexpected-solidus-in-tag */
-    LXB_HTML_TOKENIZER_ERROR_UNSOINTA           = 0x002F,
+    LXB_HTML_TOKENIZER_ERROR_UNSOINTA,
     /* unknown-named-character-reference */
-    LXB_HTML_TOKENIZER_ERROR_UNNACHRE           = 0x0030,
-    LXB_HTML_TOKENIZER_ERROR_LAST_ENTRY         = 0x0031,
+    LXB_HTML_TOKENIZER_ERROR_UNNACHRE,
+
+    LXB_HTML_TOKENIZER_ERROR_LAST_ENTRY
 }
 lxb_html_tokenizer_error_id_t;
 
@@ -132,10 +133,13 @@ lxb_html_tokenizer_error_add(lexbor_array_obj_t *parse_errors,
                              const lxb_char_t *pos,
                              lxb_html_tokenizer_error_id_t id);
 
+LXB_API const lxb_char_t *
+lxb_html_tokenizer_error_to_string(lxb_html_tokenizer_error_id_t id,
+                                   size_t *len);
+
 
 #ifdef __cplusplus
 } /* extern "C" */
 #endif
 
 #endif /* LEXBOR_HTML_TOKENIZER_ERROR_H */
-
diff --git a/ext/lexbor/lexbor/html/tokenizer/res.h b/ext/lexbor/lexbor/html/tokenizer/res.h
index 5ec5c68bf65d..55c77f9e6c39 100644
--- a/ext/lexbor/lexbor/html/tokenizer/res.h
+++ b/ext/lexbor/lexbor/html/tokenizer/res.h
@@ -1,12 +1,12 @@
 /*
- * Copyright (C) 2018 Alexander Borisov
+ * Copyright (C) 2018-2026 Alexander Borisov
  *
  * Author: Alexander Borisov 
  */
 
 /*
- * Caution!!! Important!!!
- * This file is generated by the script
+ * Important!
+ * This file generated by the script
  * "utils/lexbor/html/tokenizer_entities_bst.py"!
  * Do not change this file!
  */
@@ -15,12 +15,6 @@
 #ifndef LXB_HTML_TOKENIZER_RES_H
 #define LXB_HTML_TOKENIZER_RES_H
 
-#endif /* LXB_HTML_TOKENIZER_RES */
-
-
-#ifdef LXB_HTML_TOKENIZER_RES_ENTITIES_SBST
-#ifndef LXB_HTML_TOKENIZER_RES_ENTITIES_SBST_ENABLED
-#define LXB_HTML_TOKENIZER_RES_ENTITIES_SBST_ENABLED
 static const lexbor_sbst_entry_static_t lxb_html_tokenizer_res_entities_sbst[] =
 {
 	{0x00, {0}, 0, 0, 0, 0}, {0x61, {0}, 0, 3, 2, 53},
@@ -4951,6 +4945,6 @@ static const lexbor_sbst_entry_static_t lxb_html_tokenizer_res_entities_sbst[] =
 	{0x3b, "\xd1\x8e", 2, 0, 0, 0}, {0x70, {0}, 0, 0, 0, 9852},
 	{0x66, {0}, 0, 0, 0, 9853}, {0x3b, "\xf0\x9d\x95\xaa", 4, 0, 0, 0}
 };
-#endif /* LXB_HTML_TOKENIZER_RES_ENTITIES_SBST_ENABLED */
-#endif /* LXB_HTML_TOKENIZER_RES_ENTITIES_SBST */
 
+
+#endif /* LXB_HTML_TOKENIZER_RES */
diff --git a/ext/lexbor/lexbor/html/tokenizer/state.c b/ext/lexbor/lexbor/html/tokenizer/state.c
index 207b909a1892..6c3cbebe92a3 100644
--- a/ext/lexbor/lexbor/html/tokenizer/state.c
+++ b/ext/lexbor/lexbor/html/tokenizer/state.c
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2018-2020 Alexander Borisov
+ * Copyright (C) 2018-2026 Alexander Borisov
  *
  * Author: Alexander Borisov 
  */
@@ -8,16 +8,16 @@
 #include "lexbor/html/tokenizer/state_comment.h"
 #include "lexbor/html/tokenizer/state_doctype.h"
 
-#define LEXBOR_STR_RES_ANSI_REPLACEMENT_CHARACTER
-#define LEXBOR_STR_RES_ALPHANUMERIC_CHARACTER
-#define LEXBOR_STR_RES_REPLACEMENT_CHARACTER
-#define LEXBOR_STR_RES_ALPHA_CHARACTER
-#define LEXBOR_STR_RES_MAP_HEX
-#define LEXBOR_STR_RES_MAP_NUM
-#include "lexbor/core/str_res.h"
-#include "lexbor/core/swar.h"
+#ifndef LEXBOR_DISABLE_INTERNAL_EXTERN
+    LXB_EXTERN const lxb_char_t lexbor_str_res_map_num[256];
+    LXB_EXTERN const lxb_char_t lexbor_str_res_map_hex[256];
+    LXB_EXTERN const lxb_char_t lexbor_str_res_ansi_replacement_character[4];
+    LXB_EXTERN const size_t     lexbor_str_res_alphanumeric_character[256];
+    LXB_EXTERN const size_t     lexbor_str_res_alpha_character[256];
+    LXB_EXTERN const size_t     lexbor_str_res_replacement_character[160];
+#endif
 
-#define LXB_HTML_TOKENIZER_RES_ENTITIES_SBST
+#include "lexbor/core/swar.h"
 #include "lexbor/html/tokenizer/res.h"
 
 
@@ -123,11 +123,6 @@ lxb_html_tokenizer_state_markup_declaration_cdata(lxb_html_tokenizer_t *tkz,
                                                   const lxb_char_t *end);
 
 /* CDATA Section */
-static const lxb_char_t *
-lxb_html_tokenizer_state_cdata_section_before(lxb_html_tokenizer_t *tkz,
-                                              const lxb_char_t *data,
-                                              const lxb_char_t *end);
-
 static const lxb_char_t *
 lxb_html_tokenizer_state_cdata_section(lxb_html_tokenizer_t *tkz,
                                        const lxb_char_t *data,
@@ -282,7 +277,7 @@ lxb_html_tokenizer_state_data(lxb_html_tokenizer_t *tkz,
                         lxb_html_tokenizer_state_token_set_end_eof(tkz);
                     }
 
-                    if (tkz->token->begin != tkz->token->end) {
+                    if (tkz->pos != tkz->start) {
                         tkz->token->tag_id = LXB_TAG__TEXT;
 
                         lxb_html_tokenizer_state_append_data_m(tkz, data);
@@ -381,7 +376,7 @@ lxb_html_tokenizer_state_plaintext(lxb_html_tokenizer_t *tkz,
                     }
 
                     lxb_html_tokenizer_state_set_text(tkz);
-                    lxb_html_tokenizer_state_token_done_m(tkz, end);
+                    lxb_html_tokenizer_state_token_text_done_m(tkz, end);
 
                     return end;
                 }
@@ -1451,8 +1446,8 @@ lxb_html_tokenizer_state_markup_declaration_open(lxb_html_tokenizer_t *tkz,
     else if (*data == 0x5B) {
         if ((end - data) < 7) {
             tkz->markup = (lxb_char_t *) "[CDATA[";
-
             tkz->state = lxb_html_tokenizer_state_markup_declaration_cdata;
+
             return data;
         }
 
@@ -1469,6 +1464,9 @@ lxb_html_tokenizer_state_markup_declaration_open(lxb_html_tokenizer_t *tkz,
                 return data;
             }
 
+            lxb_html_tokenizer_error_add(tkz->parse_errors, data,
+                                         LXB_HTML_TOKENIZER_ERROR_CDINHTCO);
+
             tkz->state = lxb_html_tokenizer_state_bogus_comment_before;
 
             return data;
@@ -1504,6 +1502,8 @@ lxb_html_tokenizer_state_markup_declaration_comment(lxb_html_tokenizer_t *tkz,
         return (data + 1);
     }
 
+    lxb_html_tokenizer_state_append_m(tkz, "-", 1);
+
     lxb_html_tokenizer_error_add(tkz->parse_errors, data,
                                  LXB_HTML_TOKENIZER_ERROR_INOPCO);
 
@@ -1538,6 +1538,8 @@ lxb_html_tokenizer_state_markup_declaration_doctype(lxb_html_tokenizer_t *tkz,
         return data;
     }
 
+    lxb_html_tokenizer_state_append_m(tkz, data, (end - data));
+
     tkz->markup = pos;
 
     return end;
@@ -1575,6 +1577,9 @@ lxb_html_tokenizer_state_markup_declaration_cdata(lxb_html_tokenizer_t *tkz,
 
         lxb_html_tokenizer_state_append_m(tkz, "[CDATA", 6);
 
+        lxb_html_tokenizer_error_add(tkz->parse_errors, data,
+                                     LXB_HTML_TOKENIZER_ERROR_CDINHTCO);
+
         tkz->state = lxb_html_tokenizer_state_bogus_comment_before;
         return data;
     }
@@ -1587,7 +1592,7 @@ lxb_html_tokenizer_state_markup_declaration_cdata(lxb_html_tokenizer_t *tkz,
 /*
  * Helper function. No in the specification. For 12.2.5.69
  */
-static const lxb_char_t *
+const lxb_char_t *
 lxb_html_tokenizer_state_cdata_section_before(lxb_html_tokenizer_t *tkz,
                                               const lxb_char_t *data,
                                               const lxb_char_t *end)
@@ -1661,7 +1666,7 @@ lxb_html_tokenizer_state_cdata_section(lxb_html_tokenizer_t *tkz,
                     }
 
                     lxb_html_tokenizer_state_set_text(tkz);
-                    lxb_html_tokenizer_state_token_done_m(tkz, end);
+                    lxb_html_tokenizer_state_token_text_done_m(tkz, end);
 
                     return end;
                 }
@@ -1726,7 +1731,7 @@ lxb_html_tokenizer_state_cdata_section_end(lxb_html_tokenizer_t *tkz,
         tkz->state = lxb_html_tokenizer_state_data_before;
 
         lxb_html_tokenizer_state_set_text(tkz);
-        lxb_html_tokenizer_state_token_done_m(tkz, end);
+        lxb_html_tokenizer_state_token_text_done_m(tkz, end);
 
         return (data + 1);
     }
@@ -1857,9 +1862,28 @@ lxb_html_tokenizer_state_char_ref_named(lxb_html_tokenizer_t *tkz,
      */
     /* U+003B SEMICOLON character (;) */
     if (tkz->is_attribute && tkz->entity_match->key != 0x3B) {
+        lxb_char_t ch;
+
+        /*
+         * The "next input character" per the spec is the character immediately
+         * after the matched entity, not the character that broke the SBST
+         * lookup.  For example, for "¬i;" the match is "¬"
+         * and the next input character is 'i', not ';'.
+         *
+         * If there are trailing characters in the buffer after the match,
+         * the next input character is the first one after entity_end.
+         * Otherwise it is *data (the character that terminated the SBST).
+         */
+        if (&tkz->start[tkz->entity_end + 1] < tkz->pos) {
+            ch = tkz->start[tkz->entity_end + 1];
+        }
+        else {
+            ch = *data;
+        }
+
         /* U+003D EQUALS SIGN character (=) or ASCII alphanumeric */
-        if (*data == 0x3D
-            || lexbor_str_res_alphanumeric_character[*data] != LEXBOR_STR_RES_SLIP)
+        if (ch == 0x3D
+            || lexbor_str_res_alphanumeric_character[ch] != LEXBOR_STR_RES_SLIP)
         {
             return data;
         }
@@ -1902,16 +1926,30 @@ lxb_html_tokenizer_state_char_ref_ambiguous_ampersand(lxb_html_tokenizer_t *tkz,
                                                       const lxb_char_t *data,
                                                       const lxb_char_t *end)
 {
-    /* ASCII alphanumeric */
-    /* Skipped, not need */
+    const lxb_char_t *begin = data;
 
-    /* U+003B SEMICOLON (;) */
-    if (*data == 0x3B) {
-        lxb_html_tokenizer_error_add(tkz->parse_errors, data,
-                                     LXB_HTML_TOKENIZER_ERROR_UNNACHRE);
+    while (data < end) {
+        /* Not ASCII alphanumeric */
+        if (lexbor_str_res_alphanumeric_character[ *data ] == LEXBOR_STR_RES_SLIP) {
+            lxb_html_tokenizer_state_append_m(tkz, begin, (data - begin));
+
+            /* U+003B SEMICOLON (;) */
+            if (*data == 0x3B) {
+                lxb_html_tokenizer_error_add(tkz->parse_errors, data,
+                                             LXB_HTML_TOKENIZER_ERROR_UNNACHRE);
+            }
+
+            tkz->state = tkz->state_return;
+
+            return data;
+        }
+
+        data += 1;
     }
 
-    tkz->state = tkz->state_return;
+    if (begin < data) {
+        lxb_html_tokenizer_state_append_m(tkz, begin, (data - begin));
+    }
 
     return data;
 }
@@ -2002,6 +2040,10 @@ lxb_html_tokenizer_state_char_ref_hexademical(lxb_html_tokenizer_t *tkz,
             if (*data == ';') {
                 data++;
             }
+            else {
+                lxb_html_tokenizer_error_add(tkz->parse_errors, data,
+                                             LXB_HTML_TOKENIZER_ERROR_MISEAFCHRE);
+            }
 
             return lxb_html_tokenizer_state_char_ref_numeric_end(tkz, data, end);
         }
@@ -2032,6 +2074,10 @@ lxb_html_tokenizer_state_char_ref_decimal(lxb_html_tokenizer_t *tkz,
             if (*data == ';') {
                 data++;
             }
+            else {
+                lxb_html_tokenizer_error_add(tkz->parse_errors, data,
+                                             LXB_HTML_TOKENIZER_ERROR_MISEAFCHRE);
+            }
 
             return lxb_html_tokenizer_state_char_ref_numeric_end(tkz, data, end);
         }
diff --git a/ext/lexbor/lexbor/html/tokenizer/state.h b/ext/lexbor/lexbor/html/tokenizer/state.h
index 5b095b4249d5..52eaa9a2c07b 100644
--- a/ext/lexbor/lexbor/html/tokenizer/state.h
+++ b/ext/lexbor/lexbor/html/tokenizer/state.h
@@ -110,6 +110,10 @@ extern "C" {
 
 #define lxb_html_tokenizer_state_token_attr_add_m(tkz, attr, v_return)         \
     do {                                                                       \
+        if (!(tkz->opt & LXB_HTML_TOKENIZER_OPT_ATTR_KEEP_DUPLICATE)) {        \
+            lxb_html_tokenizer_attr_last_duplicate(tkz);                       \
+        }                                                                      \
+                                                                               \
         attr = lxb_html_token_attr_append(tkz->token, tkz->dobj_token_attr);   \
         if (attr == NULL) {                                                    \
             tkz->status = LXB_STATUS_ERROR_MEMORY_ALLOCATION;                  \
@@ -145,6 +149,14 @@ extern "C" {
     (tkz->token->attr_last->value_end = tkz->last)
 
 #define _lxb_html_tokenizer_state_token_done_m(tkz, v_end)                     \
+    if (!(tkz->opt & LXB_HTML_TOKENIZER_OPT_ATTR_KEEP_DUPLICATE)) {            \
+        lxb_html_tokenizer_attr_last_duplicate(tkz);                           \
+    }                                                                          \
+                                                                               \
+    if (tkz->token->type & LXB_HTML_TOKEN_TYPE_CLOSE) {                        \
+        lxb_html_tokenizer_validate_close_tag(tkz);                            \
+    }                                                                          \
+                                                                               \
     tkz->token = tkz->callback_token_done(tkz, tkz->token,                     \
                                           tkz->callback_token_ctx);            \
     if (tkz->token == NULL) {                                                  \
@@ -154,23 +166,32 @@ extern "C" {
         return v_end;                                                          \
     }
 
-#define lxb_html_tokenizer_state_token_done_m(tkz, v_end)                      \
+#define lxb_html_tokenizer_state_token_text_done_m(tkz, v_end)                 \
     do {                                                                       \
-        if (tkz->token->begin != tkz->token->end) {                            \
-            _lxb_html_tokenizer_state_token_done_m(tkz, v_end)                 \
+        if (tkz->token->text_start != tkz->token->text_end) {                  \
+            _lxb_html_tokenizer_state_token_done_m(tkz, v_end);                \
         }                                                                      \
         lxb_html_token_clean(tkz->token);                                      \
         tkz->pos = tkz->start;                                                 \
     }                                                                          \
     while (0)
 
-#define lxb_html_tokenizer_state_token_done_wo_check_m(tkz, v_end)             \
+#define lxb_html_tokenizer_state_token_done_m(tkz, v_end)                      \
     do {                                                                       \
         _lxb_html_tokenizer_state_token_done_m(tkz, v_end)                     \
         lxb_html_token_clean(tkz->token);                                      \
+        tkz->pos = tkz->start;                                                 \
     }                                                                          \
     while (0)
 
+/*
+ * This macro is alias; it serves to ensure that when reading the code,
+ * we clearly understand where checks are not necessary, i.e., we are 100% sure
+ * that the token has been collected and is ready to be sent.
+ */
+#define lxb_html_tokenizer_state_token_done_wo_check_m(tkz, v_end)             \
+    lxb_html_tokenizer_state_token_done_m(tkz, v_end)
+
 #define lxb_html_tokenizer_state_set_text(tkz)                                 \
     do {                                                                       \
         tkz->token->text_start = tkz->start;                                   \
@@ -180,7 +201,7 @@ extern "C" {
 
 #define lxb_html_tokenizer_state_token_emit_text_not_empty_m(tkz, v_end)       \
     do {                                                                       \
-        if (tkz->token->begin != tkz->token->end) {                            \
+        if (tkz->start != tkz->pos) {                                          \
             tkz->token->tag_id = LXB_TAG__TEXT;                                \
                                                                                \
             lxb_html_tokenizer_state_set_text(tkz);                            \
@@ -211,6 +232,11 @@ lxb_html_tokenizer_state_self_closing_start_tag(lxb_html_tokenizer_t *tkz,
                                                 const lxb_char_t *data,
                                                 const lxb_char_t *end);
 
+LXB_API const lxb_char_t *
+lxb_html_tokenizer_state_cdata_section_before(lxb_html_tokenizer_t *tkz,
+                                              const lxb_char_t *data,
+                                              const lxb_char_t *end);
+
 LXB_API const lxb_char_t *
 lxb_html_tokenizer_state_cr(lxb_html_tokenizer_t *tkz, const lxb_char_t *data,
                             const lxb_char_t *end);
diff --git a/ext/lexbor/lexbor/html/tokenizer/state_comment.c b/ext/lexbor/lexbor/html/tokenizer/state_comment.c
index fd1c2ead980b..870b54578c62 100644
--- a/ext/lexbor/lexbor/html/tokenizer/state_comment.c
+++ b/ext/lexbor/lexbor/html/tokenizer/state_comment.c
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2018-2020 Alexander Borisov
+ * Copyright (C) 2018-2026 Alexander Borisov
  *
  * Author: Alexander Borisov 
  */
@@ -7,9 +7,9 @@
 #include "lexbor/html/tokenizer/state_comment.h"
 #include "lexbor/html/tokenizer/state.h"
 
-#define LEXBOR_STR_RES_ANSI_REPLACEMENT_CHARACTER
-#include "lexbor/core/str_res.h"
-
+#ifndef LEXBOR_DISABLE_INTERNAL_EXTERN
+LXB_EXTERN const lxb_char_t lexbor_str_res_ansi_replacement_character[4];
+#endif
 
 static const lxb_char_t *
 lxb_html_tokenizer_state_comment_start(lxb_html_tokenizer_t *tkz,
@@ -143,8 +143,6 @@ lxb_html_tokenizer_state_comment_start_dash(lxb_html_tokenizer_t *tkz,
     /* EOF */
     else if (*data == 0x00) {
         if (tkz->is_eof) {
-            lxb_html_tokenizer_state_append_m(tkz, "-", 1);
-
             lxb_html_tokenizer_error_add(tkz->parse_errors, tkz->last,
                                          LXB_HTML_TOKENIZER_ERROR_EOINCO);
 
@@ -452,8 +450,12 @@ lxb_html_tokenizer_state_comment_end_bang(lxb_html_tokenizer_t *tkz,
                                           const lxb_char_t *data,
                                           const lxb_char_t *end)
 {
+    static const lexbor_str_t two = lexbor_str("--!");
+
     /* U+002D HYPHEN-MINUS (-) */
     if (*data == 0x2D) {
+        lxb_html_tokenizer_state_append_m(tkz, two.data, two.length);
+
         tkz->state = lxb_html_tokenizer_state_comment_end_dash;
 
         return (data + 1);
@@ -481,6 +483,11 @@ lxb_html_tokenizer_state_comment_end_bang(lxb_html_tokenizer_t *tkz,
 
             return end;
         }
+
+        lxb_html_tokenizer_state_append_m(tkz, two.data, two.length);
+    }
+    else {
+        lxb_html_tokenizer_state_append_m(tkz, two.data, two.length);
     }
 
     tkz->state = lxb_html_tokenizer_state_comment;
diff --git a/ext/lexbor/lexbor/html/tokenizer/state_doctype.c b/ext/lexbor/lexbor/html/tokenizer/state_doctype.c
index 90466789cc09..7ccb02e08b2a 100644
--- a/ext/lexbor/lexbor/html/tokenizer/state_doctype.c
+++ b/ext/lexbor/lexbor/html/tokenizer/state_doctype.c
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2018-2020 Alexander Borisov
+ * Copyright (C) 2018-2026 Alexander Borisov
  *
  * Author: Alexander Borisov 
  */
@@ -7,10 +7,9 @@
 #include "lexbor/html/tokenizer/state_doctype.h"
 #include "lexbor/html/tokenizer/state.h"
 
-
-#define LEXBOR_STR_RES_ANSI_REPLACEMENT_CHARACTER
-#include "lexbor/core/str_res.h"
-
+#ifndef LEXBOR_DISABLE_INTERNAL_EXTERN
+    LXB_EXTERN const lxb_char_t lexbor_str_res_ansi_replacement_character[4];
+#endif
 
 lxb_dom_attr_data_t *
 lxb_dom_attr_local_name_append(lexbor_hash_t *hash,
@@ -527,6 +526,7 @@ lxb_html_tokenizer_state_doctype_after_name_public(lxb_html_tokenizer_t *tkz,
         lxb_html_tokenizer_error_add(tkz->parse_errors, data,
                                      LXB_HTML_TOKENIZER_ERROR_INCHSEAFDONA);
 
+        tkz->token->type |= LXB_HTML_TOKEN_TYPE_FORCE_QUIRKS;
         tkz->state = lxb_html_tokenizer_state_doctype_bogus;
 
         return data;
@@ -577,6 +577,7 @@ lxb_html_tokenizer_state_doctype_after_name_system(lxb_html_tokenizer_t *tkz,
         lxb_html_tokenizer_error_add(tkz->parse_errors, data,
                                      LXB_HTML_TOKENIZER_ERROR_INCHSEAFDONA);
 
+        tkz->token->type |= LXB_HTML_TOKEN_TYPE_FORCE_QUIRKS;
         tkz->state = lxb_html_tokenizer_state_doctype_bogus;
 
         return data;
@@ -797,6 +798,7 @@ lxb_html_tokenizer_state_doctype_public_identifier_double_quoted(lxb_html_tokeni
             /* U+003E GREATER-THAN SIGN (>) */
             case 0x3E:
                 tkz->state = lxb_html_tokenizer_state_data_before;
+                tkz->token->type |= LXB_HTML_TOKEN_TYPE_FORCE_QUIRKS;
 
                 lxb_html_tokenizer_error_add(tkz->parse_errors, data,
                                              LXB_HTML_TOKENIZER_ERROR_ABDOPUID);
@@ -912,6 +914,7 @@ lxb_html_tokenizer_state_doctype_public_identifier_single_quoted(lxb_html_tokeni
             /* U+003E GREATER-THAN SIGN (>) */
             case 0x3E:
                 tkz->state = lxb_html_tokenizer_state_data_before;
+                tkz->token->type |= LXB_HTML_TOKEN_TYPE_FORCE_QUIRKS;
 
                 lxb_html_tokenizer_error_add(tkz->parse_errors, data,
                                              LXB_HTML_TOKENIZER_ERROR_ABDOPUID);
@@ -1350,6 +1353,7 @@ lxb_html_tokenizer_state_doctype_system_identifier_double_quoted(lxb_html_tokeni
             /* U+003E GREATER-THAN SIGN (>) */
             case 0x3E:
                 tkz->state = lxb_html_tokenizer_state_data_before;
+                tkz->token->type |= LXB_HTML_TOKEN_TYPE_FORCE_QUIRKS;
 
                 lxb_html_tokenizer_error_add(tkz->parse_errors, data,
                                              LXB_HTML_TOKENIZER_ERROR_ABDOSYID);
@@ -1465,6 +1469,7 @@ lxb_html_tokenizer_state_doctype_system_identifier_single_quoted(lxb_html_tokeni
             /* U+003E GREATER-THAN SIGN (>) */
             case 0x3E:
                 tkz->state = lxb_html_tokenizer_state_data_before;
+                tkz->token->type |= LXB_HTML_TOKEN_TYPE_FORCE_QUIRKS;
 
                 lxb_html_tokenizer_error_add(tkz->parse_errors, data,
                                              LXB_HTML_TOKENIZER_ERROR_ABDOSYID);
diff --git a/ext/lexbor/lexbor/html/tokenizer/state_rawtext.c b/ext/lexbor/lexbor/html/tokenizer/state_rawtext.c
index 6629ca910342..456266b6e33a 100644
--- a/ext/lexbor/lexbor/html/tokenizer/state_rawtext.c
+++ b/ext/lexbor/lexbor/html/tokenizer/state_rawtext.c
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2018-2020 Alexander Borisov
+ * Copyright (C) 2018-2026 Alexander Borisov
  *
  * Author: Alexander Borisov 
  */
@@ -7,10 +7,10 @@
 #include "lexbor/html/tokenizer/state_rawtext.h"
 #include "lexbor/html/tokenizer/state.h"
 
-#define LEXBOR_STR_RES_ANSI_REPLACEMENT_CHARACTER
-#define LEXBOR_STR_RES_ALPHA_CHARACTER
-#include "lexbor/core/str_res.h"
-
+#ifndef LEXBOR_DISABLE_INTERNAL_EXTERN
+    LXB_EXTERN const lxb_char_t lexbor_str_res_ansi_replacement_character[4];
+    LXB_EXTERN const size_t     lexbor_str_res_alpha_character[256];
+#endif
 
 const lxb_tag_data_t *
 lxb_tag_append_lower(lexbor_hash_t *hash,
@@ -114,7 +114,7 @@ lxb_html_tokenizer_state_rawtext(lxb_html_tokenizer_t *tkz,
                     tkz->token->tag_id = LXB_TAG__TEXT;
 
                     lxb_html_tokenizer_state_set_text(tkz);
-                    lxb_html_tokenizer_state_token_done_m(tkz, end);
+                    lxb_html_tokenizer_state_token_text_done_m(tkz, end);
 
                     return end;
                 }
@@ -246,7 +246,7 @@ lxb_html_tokenizer_state_rawtext_end_tag_name(lxb_html_tokenizer_t *tkz,
                 tkz->pos = &tkz->start[tkz->entity_start];
 
                 lxb_html_tokenizer_state_set_text(tkz);
-                lxb_html_tokenizer_state_token_done_m(tkz, end);
+                lxb_html_tokenizer_state_token_text_done_m(tkz, end);
 
                 /* Init close token */
                 tkz->token->tag_id = tkz->tmp_tag_id;
@@ -291,7 +291,7 @@ lxb_html_tokenizer_state_rawtext_end_tag_name(lxb_html_tokenizer_t *tkz,
     tkz->pos = &tkz->start[tkz->entity_start];
 
     lxb_html_tokenizer_state_set_text(tkz);
-    lxb_html_tokenizer_state_token_done_m(tkz, end);
+    lxb_html_tokenizer_state_token_text_done_m(tkz, end);
 
     /* Init close token */
     tkz->token->tag_id = tkz->tmp_tag_id;
diff --git a/ext/lexbor/lexbor/html/tokenizer/state_rcdata.c b/ext/lexbor/lexbor/html/tokenizer/state_rcdata.c
index f47dc7e87a22..02e68b324546 100644
--- a/ext/lexbor/lexbor/html/tokenizer/state_rcdata.c
+++ b/ext/lexbor/lexbor/html/tokenizer/state_rcdata.c
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2018-2020 Alexander Borisov
+ * Copyright (C) 2018-2026 Alexander Borisov
  *
  * Author: Alexander Borisov 
  */
@@ -7,10 +7,10 @@
 #include "lexbor/html/tokenizer/state_rcdata.h"
 #include "lexbor/html/tokenizer/state.h"
 
-#define LEXBOR_STR_RES_ANSI_REPLACEMENT_CHARACTER
-#define LEXBOR_STR_RES_ALPHA_CHARACTER
-#include "lexbor/core/str_res.h"
-
+#ifndef LEXBOR_DISABLE_INTERNAL_EXTERN
+    LXB_EXTERN const lxb_char_t lexbor_str_res_ansi_replacement_character[4];
+    LXB_EXTERN const size_t     lexbor_str_res_alpha_character[256];
+#endif
 
 const lxb_tag_data_t *
 lxb_tag_append_lower(lexbor_hash_t *hash,
@@ -123,7 +123,7 @@ lxb_html_tokenizer_state_rcdata(lxb_html_tokenizer_t *tkz,
                     tkz->token->tag_id = LXB_TAG__TEXT;
 
                     lxb_html_tokenizer_state_set_text(tkz);
-                    lxb_html_tokenizer_state_token_done_m(tkz, end);
+                    lxb_html_tokenizer_state_token_text_done_m(tkz, end);
 
                     return end;
                 }
@@ -255,7 +255,7 @@ lxb_html_tokenizer_state_rcdata_end_tag_name(lxb_html_tokenizer_t *tkz,
                 tkz->pos = &tkz->start[tkz->entity_start];
 
                 lxb_html_tokenizer_state_set_text(tkz);
-                lxb_html_tokenizer_state_token_done_m(tkz, end);
+                lxb_html_tokenizer_state_token_text_done_m(tkz, end);
 
                 /* Init close token */
                 tkz->token->tag_id = tkz->tmp_tag_id;
@@ -300,7 +300,7 @@ lxb_html_tokenizer_state_rcdata_end_tag_name(lxb_html_tokenizer_t *tkz,
     tkz->pos = &tkz->start[tkz->entity_start];
 
     lxb_html_tokenizer_state_set_text(tkz);
-    lxb_html_tokenizer_state_token_done_m(tkz, end);
+    lxb_html_tokenizer_state_token_text_done_m(tkz, end);
 
     /* Init close token */
     tkz->token->tag_id = tkz->tmp_tag_id;
diff --git a/ext/lexbor/lexbor/html/tokenizer/state_script.c b/ext/lexbor/lexbor/html/tokenizer/state_script.c
index 4d56d18f7f3f..26e694f8f517 100644
--- a/ext/lexbor/lexbor/html/tokenizer/state_script.c
+++ b/ext/lexbor/lexbor/html/tokenizer/state_script.c
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2018-2020 Alexander Borisov
+ * Copyright (C) 2018-2026 Alexander Borisov
  *
  * Author: Alexander Borisov 
  */
@@ -7,12 +7,11 @@
 #include "lexbor/html/tokenizer/state_script.h"
 #include "lexbor/html/tokenizer/state.h"
 
-#define LEXBOR_STR_RES_ALPHA_CHARACTER
-#define LEXBOR_STR_RES_ANSI_REPLACEMENT_CHARACTER
-#include "lexbor/core/str_res.h"
-
-#include "lexbor/core/str_res.h"
-
+#ifndef LEXBOR_DISABLE_INTERNAL_EXTERN
+    LXB_EXTERN const size_t lexbor_str_res_alpha_character[256];
+    LXB_EXTERN const size_t lexbor_str_res_replacement_character[160];
+    LXB_EXTERN const lxb_char_t lexbor_str_res_ansi_replacement_character[4];
+#endif
 
 const lxb_tag_data_t *
 lxb_tag_append_lower(lexbor_hash_t *hash,
@@ -203,7 +202,7 @@ lxb_html_tokenizer_state_script_data(lxb_html_tokenizer_t *tkz,
                     tkz->token->tag_id = LXB_TAG__TEXT;
 
                     lxb_html_tokenizer_state_set_text(tkz);
-                    lxb_html_tokenizer_state_token_done_m(tkz, end);
+                    lxb_html_tokenizer_state_token_text_done_m(tkz, end);
 
                     return end;
                 }
@@ -347,7 +346,7 @@ lxb_html_tokenizer_state_script_data_end_tag_name(lxb_html_tokenizer_t *tkz,
                 tkz->pos = &tkz->start[tkz->entity_start];
 
                 lxb_html_tokenizer_state_set_text(tkz);
-                lxb_html_tokenizer_state_token_done_m(tkz, end);
+                lxb_html_tokenizer_state_token_text_done_m(tkz, end);
 
                 /* Init close token */
                 tkz->token->tag_id = tkz->tmp_tag_id;
@@ -391,7 +390,7 @@ lxb_html_tokenizer_state_script_data_end_tag_name(lxb_html_tokenizer_t *tkz,
     tkz->pos = &tkz->start[tkz->entity_start];
 
     lxb_html_tokenizer_state_set_text(tkz);
-    lxb_html_tokenizer_state_token_done_m(tkz, end);
+    lxb_html_tokenizer_state_token_text_done_m(tkz, end);
 
     /* Init close token */
     tkz->token->tag_id = tkz->tmp_tag_id;
@@ -517,7 +516,7 @@ lxb_html_tokenizer_state_script_data_escaped(lxb_html_tokenizer_t *tkz,
 
                     lxb_html_tokenizer_state_set_text(tkz);
                     lxb_html_tokenizer_state_token_set_end_eof(tkz);
-                    lxb_html_tokenizer_state_token_done_m(tkz, end);
+                    lxb_html_tokenizer_state_token_text_done_m(tkz, end);
 
                     return end;
                 }
@@ -581,7 +580,7 @@ lxb_html_tokenizer_state_script_data_escaped_dash(lxb_html_tokenizer_t *tkz,
 
                 lxb_html_tokenizer_state_set_text(tkz);
                 lxb_html_tokenizer_state_token_set_end_eof(tkz);
-                lxb_html_tokenizer_state_token_done_m(tkz, end);
+                lxb_html_tokenizer_state_token_text_done_m(tkz, end);
 
                 return end;
             }
@@ -758,7 +757,7 @@ lxb_html_tokenizer_state_script_data_escaped_end_tag_name(
                 tkz->pos = &tkz->start[tkz->entity_start];
 
                 lxb_html_tokenizer_state_set_text(tkz);
-                lxb_html_tokenizer_state_token_done_m(tkz, end);
+                lxb_html_tokenizer_state_token_text_done_m(tkz, end);
 
                 /* Init close token */
                 tkz->token->tag_id = tkz->tmp_tag_id;
@@ -802,7 +801,7 @@ lxb_html_tokenizer_state_script_data_escaped_end_tag_name(
     tkz->pos = &tkz->start[tkz->entity_start];
 
     lxb_html_tokenizer_state_set_text(tkz);
-    lxb_html_tokenizer_state_token_done_m(tkz, end);
+    lxb_html_tokenizer_state_token_text_done_m(tkz, end);
 
     /* Init close token */
     tkz->token->tag_id = tkz->tmp_tag_id;
@@ -947,7 +946,7 @@ lxb_html_tokenizer_state_script_data_double_escaped(lxb_html_tokenizer_t *tkz,
 
                     lxb_html_tokenizer_state_set_text(tkz);
                     lxb_html_tokenizer_state_token_set_end_eof(tkz);
-                    lxb_html_tokenizer_state_token_done_m(tkz, end);
+                    lxb_html_tokenizer_state_token_text_done_m(tkz, end);
 
                     return end;
                 }
@@ -1011,7 +1010,7 @@ lxb_html_tokenizer_state_script_data_double_escaped_dash(lxb_html_tokenizer_t *t
 
                 lxb_html_tokenizer_state_set_text(tkz);
                 lxb_html_tokenizer_state_token_set_end_eof(tkz);
-                lxb_html_tokenizer_state_token_done_m(tkz, end);
+                lxb_html_tokenizer_state_token_text_done_m(tkz, end);
 
                 return end;
             }
@@ -1077,7 +1076,7 @@ lxb_html_tokenizer_state_script_data_double_escaped_dash_dash(
 
                 lxb_html_tokenizer_state_set_text(tkz);
                 lxb_html_tokenizer_state_token_set_end_eof(tkz);
-                lxb_html_tokenizer_state_token_done_m(tkz, end);
+                lxb_html_tokenizer_state_token_text_done_m(tkz, end);
 
                 return end;
             }
diff --git a/ext/lexbor/lexbor/html/tree.c b/ext/lexbor/lexbor/html/tree.c
index 91bfd17ee1db..3f4c18d7fa40 100644
--- a/ext/lexbor/lexbor/html/tree.c
+++ b/ext/lexbor/lexbor/html/tree.c
@@ -19,6 +19,7 @@
 #include "lexbor/html/interface.h"
 #include "lexbor/html/interfaces/template_element.h"
 #include "lexbor/html/interfaces/unknown_element.h"
+#include "lexbor/html/interfaces/option_element.h"
 #include "lexbor/html/tokenizer/state_rawtext.h"
 #include "lexbor/html/tokenizer/state_rcdata.h"
 
@@ -390,7 +391,8 @@ lxb_html_tree_appropriate_place_inserting_node(lxb_html_tree_t *tree,
 
 lxb_html_element_t *
 lxb_html_tree_insert_foreign_element(lxb_html_tree_t *tree,
-                                     lxb_html_token_t *token, lxb_ns_id_t ns)
+                                     lxb_html_token_t *token, lxb_ns_id_t ns,
+                                     bool only_add_stack)
 {
     lxb_status_t status;
     lxb_dom_node_t *pos;
@@ -407,7 +409,9 @@ lxb_html_tree_insert_foreign_element(lxb_html_tree_t *tree,
         return NULL;
     }
 
-    lxb_html_tree_insert_node(pos, lxb_dom_interface_node(element), ipos);
+    if (only_add_stack == false) {
+        lxb_html_tree_insert_node(pos, lxb_dom_interface_node(element), ipos);
+    }
 
     status = lxb_html_tree_open_elements_push(tree,
                                               lxb_dom_interface_node(element));
@@ -1033,44 +1037,7 @@ lxb_html_tree_reset_insertion_mode_appropriately(lxb_html_tree_t *tree)
             continue;
         }
 
-        /* Step 4 */
-        if (node->local_name == LXB_TAG_SELECT) {
-            /* Step 4.1 */
-            if (last) {
-                tree->mode = lxb_html_tree_insertion_mode_in_select;
-                return;
-            }
-
-            /* Step 4.2 */
-            size_t ancestor = idx;
-
-            for (;;) {
-                /* Step 4.3 */
-                if (ancestor == 0) {
-                    tree->mode = lxb_html_tree_insertion_mode_in_select;
-                    return;
-                }
-
-                /* Step 4.4 */
-                ancestor--;
-
-                /* Step 4.5 */
-                lxb_dom_node_t *ancestor_node = list[ancestor];
-
-                if(lxb_html_tree_node_is(ancestor_node, LXB_TAG_TEMPLATE)) {
-                    tree->mode = lxb_html_tree_insertion_mode_in_select;
-                    return;
-                }
-
-                /* Step 4.6 */
-                else if(lxb_html_tree_node_is(ancestor_node, LXB_TAG_TABLE)) {
-                    tree->mode = lxb_html_tree_insertion_mode_in_select_in_table;
-                    return;
-                }
-            }
-        }
-
-        /* Step 5-15 */
+        /* Step 4-15 */
         switch (node->local_name) {
             case LXB_TAG_TD:
             case LXB_TAG_TH:
@@ -1309,6 +1276,41 @@ lxb_html_tree_element_in_scope_td_th(lxb_html_tree_t *tree)
     return NULL;
 }
 
+lxb_dom_node_t *
+lxb_html_tree_element_in_scope_option_optgroup(lxb_html_tree_t *tree)
+{
+    lxb_dom_node_t *node;
+
+    size_t idx = tree->open_elements->length;
+    void **list = tree->open_elements->list;
+
+    while (idx != 0) {
+        idx--;
+        node = list[idx];
+
+        switch (node->local_name) {
+            case LXB_TAG_OPTION:
+            case LXB_TAG_OPTGROUP:
+                if (node->ns == LXB_NS_HTML) {
+                    return node;
+                }
+
+                break;
+
+            default:
+                break;
+        }
+
+        if (lxb_html_tag_is_category(node->local_name, LXB_NS_HTML,
+                                     LXB_HTML_TAG_CATEGORY_SCOPE))
+        {
+            return NULL;
+        }
+    }
+
+    return NULL;
+}
+
 bool
 lxb_html_tree_check_scope_element(lxb_html_tree_t *tree)
 {
@@ -1362,8 +1364,6 @@ lxb_html_tree_close_p_element(lxb_html_tree_t *tree, lxb_html_token_t *token)
                                                  true);
 }
 
-#include "lexbor/html/serialize.h"
-
 bool
 lxb_html_tree_adoption_agency_algorithm(lxb_html_tree_t *tree,
                                         lxb_html_token_t *token,
diff --git a/ext/lexbor/lexbor/html/tree.h b/ext/lexbor/lexbor/html/tree.h
index 8ad32a4c1bec..7b2c62030497 100644
--- a/ext/lexbor/lexbor/html/tree.h
+++ b/ext/lexbor/lexbor/html/tree.h
@@ -114,7 +114,8 @@ lxb_html_tree_appropriate_place_inserting_node(lxb_html_tree_t *tree,
 
 LXB_API lxb_html_element_t *
 lxb_html_tree_insert_foreign_element(lxb_html_tree_t *tree,
-                                     lxb_html_token_t *token, lxb_ns_id_t ns);
+                                     lxb_html_token_t *token, lxb_ns_id_t ns,
+                                     bool only_add_stack);
 
 LXB_API lxb_html_element_t *
 lxb_html_tree_create_element_for_token(lxb_html_tree_t *tree,
@@ -201,6 +202,9 @@ lxb_html_tree_element_in_scope_tbody_thead_tfoot(lxb_html_tree_t *tree);
 LXB_API lxb_dom_node_t *
 lxb_html_tree_element_in_scope_td_th(lxb_html_tree_t *tree);
 
+LXB_API lxb_dom_node_t *
+lxb_html_tree_element_in_scope_option_optgroup(lxb_html_tree_t *tree);
+
 LXB_API bool
 lxb_html_tree_check_scope_element(lxb_html_tree_t *tree);
 
@@ -307,7 +311,8 @@ lxb_inline lxb_html_element_t *
 lxb_html_tree_insert_html_element(lxb_html_tree_t *tree,
                                   lxb_html_token_t *token)
 {
-    return lxb_html_tree_insert_foreign_element(tree, token, LXB_NS_HTML);
+    return lxb_html_tree_insert_foreign_element(tree, token, LXB_NS_HTML,
+                                                false);
 }
 
 lxb_inline void
@@ -374,6 +379,21 @@ lxb_html_tree_attach_document(lxb_html_tree_t *tree, lxb_html_document_t *doc)
     tree->document = doc;
 }
 
+lxb_inline bool
+lxb_html_tree_is_fragment(lxb_html_tree_t *tree)
+{
+    return tree->fragment != NULL;
+}
+
+lxb_inline bool
+lxb_html_tree_is_fragment_element(lxb_html_tree_t *tree,
+                                  lxb_tag_id_t tag_id, lxb_ns_id_t ns)
+{
+    lxb_dom_node_t *fragment = tree->fragment;
+
+    return lxb_html_tree_is_fragment(tree)
+            && fragment->local_name == tag_id && fragment->ns == ns;
+}
 
 #ifdef __cplusplus
 } /* extern "C" */
diff --git a/ext/lexbor/lexbor/html/tree/error.c b/ext/lexbor/lexbor/html/tree/error.c
index 88ad8c44795a..ef36eab8d228 100644
--- a/ext/lexbor/lexbor/html/tree/error.c
+++ b/ext/lexbor/lexbor/html/tree/error.c
@@ -1,9 +1,10 @@
 /*
- * Copyright (C) 2018 Alexander Borisov
+ * Copyright (C) 2018-2026 Alexander Borisov
  *
  * Author: Alexander Borisov 
  */
 
+#include "lexbor/core/str.h"
 #include "lexbor/html/tree/error.h"
 
 
@@ -27,3 +28,68 @@ lxb_html_tree_error_add(lexbor_array_obj_t *parse_errors,
 
     return entry;
 }
+
+const lxb_char_t *
+lxb_html_tree_error_to_string(lxb_html_tree_error_id_t id, size_t *len)
+{
+    static const lexbor_str_t unknown = lexbor_str("unknown error");
+
+    static const lexbor_str_t errors[LXB_HTML_RULES_ERROR_LAST_ENTRY] = {
+        lexbor_str("unexpected token"),
+        lexbor_str("unexpected closed token"),
+        lexbor_str("null character"),
+        lexbor_str("unexpected character token"),
+        lexbor_str("unexpected token in initial mode"),
+        lexbor_str("bad doctype token in initial mode"),
+        lexbor_str("doctype token in before html mode"),
+        lexbor_str("unexpected closed token in before html mode"),
+        lexbor_str("doctype token in before head mode"),
+        lexbor_str("unexpected closed token in before head mode"),
+        lexbor_str("doctype token in head mode"),
+        lexbor_str("non void html element start tag with trailing solidus"),
+        lexbor_str("head token in head mode"),
+        lexbor_str("unexpected closed token in head mode"),
+        lexbor_str("template closed token without opening in head mode"),
+        lexbor_str("template element is not current in head mode"),
+        lexbor_str("doctype token in head noscript mode"),
+        lexbor_str("doctype token after head mode"),
+        lexbor_str("head token after head mode"),
+        lexbor_str("doctype token in body mode"),
+        lexbor_str("bad ending open elements is wrong"),
+        lexbor_str("open elements is wrong"),
+        lexbor_str("unexpected element in open elements stack"),
+        lexbor_str("missing element in open elements stack"),
+        lexbor_str("no body element in scope"),
+        lexbor_str("missing element in scope"),
+        lexbor_str("unexpected element in scope"),
+        lexbor_str("unexpected element in active formatting stack"),
+        lexbor_str("unexpected end of file"),
+        lexbor_str("characters in table text"),
+        lexbor_str("doctype token in table mode"),
+        lexbor_str("doctype token in select mode"),
+        lexbor_str("doctype token after body mode"),
+        lexbor_str("doctype token in frameset mode"),
+        lexbor_str("doctype token after frameset mode"),
+        lexbor_str("doctype token foreign content mode"),
+        lexbor_str("select in scope"),
+        lexbor_str("fragment parsing select in context parse input"),
+        lexbor_str("fragment parsing select in context parse select"),
+        lexbor_str("hr parsing select option optgroup in scope"),
+        lexbor_str("option parsing option in scope"),
+        lexbor_str("optgroup parsing option optgroup in scope")
+    };
+
+    if (id >= (sizeof(errors) / sizeof(lexbor_str_t))) {
+        if (len != NULL) {
+            *len = unknown.length;
+        }
+
+        return unknown.data;
+    }
+
+    if (len != NULL) {
+        *len = errors[id].length;
+    }
+
+    return errors[id].data;
+}
diff --git a/ext/lexbor/lexbor/html/tree/error.h b/ext/lexbor/lexbor/html/tree/error.h
index ed1859f355a6..b1867725ef98 100644
--- a/ext/lexbor/lexbor/html/tree/error.h
+++ b/ext/lexbor/lexbor/html/tree/error.h
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2018 Alexander Borisov
+ * Copyright (C) 2018-2026 Alexander Borisov
  *
  * Author: Alexander Borisov 
  */
@@ -90,6 +90,18 @@ typedef enum {
     LXB_HTML_RULES_ERROR_DOTOAFFRMO,
     /* doctype-token-foreign-content-mode */
     LXB_HTML_RULES_ERROR_DOTOFOCOMO,
+    /* select-in-scope */
+    LXB_HTML_RULES_ERROR_SEINSC,
+    /* fragment-parsing-select-in-context-parse-input */
+    LXB_HTML_RULES_ERROR_FRPASEINCOPAIN,
+    /* fragment-parsing-select-in-context-parse-select */
+    LXB_HTML_RULES_ERROR_FRPASEINCOPASE,
+    /* hr-parsing-select-option-optgroup-in-scope */
+    LXB_HTML_RULES_ERROR_HRPASEOPOPINSC,
+    /* option-parsing-option-in-scope */
+    LXB_HTML_RULES_ERROR_OPPAOPINSC,
+    /* optgroup-parsing-option-optgroup-in-scope */
+    LXB_HTML_RULES_ERROR_OPPAOPOPINSC,
 
     LXB_HTML_RULES_ERROR_LAST_ENTRY
 }
@@ -108,10 +120,12 @@ LXB_API lxb_html_tree_error_t *
 lxb_html_tree_error_add(lexbor_array_obj_t *parse_errors,
                         lxb_html_token_t *token, lxb_html_tree_error_id_t id);
 
+LXB_API const lxb_char_t *
+lxb_html_tree_error_to_string(lxb_html_tree_error_id_t id, size_t *len);
+
 
 #ifdef __cplusplus
 } /* extern "C" */
 #endif
 
 #endif /* LEXBOR_HTML_TREE_ERROR_H */
-
diff --git a/ext/lexbor/lexbor/html/tree/insertion_mode.h b/ext/lexbor/lexbor/html/tree/insertion_mode.h
index 97cc29fa6aad..5817f3c015fd 100644
--- a/ext/lexbor/lexbor/html/tree/insertion_mode.h
+++ b/ext/lexbor/lexbor/html/tree/insertion_mode.h
@@ -91,14 +91,6 @@ LXB_API bool
 lxb_html_tree_insertion_mode_in_cell(lxb_html_tree_t *tree,
                                      lxb_html_token_t *token);
 
-LXB_API bool
-lxb_html_tree_insertion_mode_in_select(lxb_html_tree_t *tree,
-                                       lxb_html_token_t *token);
-
-LXB_API bool
-lxb_html_tree_insertion_mode_in_select_in_table(lxb_html_tree_t *tree,
-                                                lxb_html_token_t *token);
-
 LXB_API bool
 lxb_html_tree_insertion_mode_in_template(lxb_html_tree_t *tree,
                                          lxb_html_token_t *token);
diff --git a/ext/lexbor/lexbor/html/tree/insertion_mode/foreign_content.c b/ext/lexbor/lexbor/html/tree/insertion_mode/foreign_content.c
index 900557a59c33..7e546e34fd9c 100644
--- a/ext/lexbor/lexbor/html/tree/insertion_mode/foreign_content.c
+++ b/ext/lexbor/lexbor/html/tree/insertion_mode/foreign_content.c
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2018-2020 Alexander Borisov
+ * Copyright (C) 2018-2026 Alexander Borisov
  *
  * Author: Alexander Borisov 
  */
@@ -8,10 +8,10 @@
 #include "lexbor/html/tree/open_elements.h"
 #include "lexbor/html/interfaces/element.h"
 
-#define LEXBOR_TOKENIZER_CHARS_MAP
-#define LEXBOR_STR_RES_ANSI_REPLACEMENT_CHARACTER
-#include "lexbor/core/str_res.h"
-
+#ifndef LEXBOR_DISABLE_INTERNAL_EXTERN
+    LXB_EXTERN const lxb_char_t lexbor_str_res_ansi_replacement_character[4];
+    LXB_EXTERN const unsigned char lexbor_tokenizer_chars_map[256];
+#endif
 
 lxb_status_t
 lxb_dom_element_qualified_name_set(lxb_dom_element_t *element,
@@ -87,7 +87,8 @@ lxb_html_tree_insertion_mode_foreign_content_anything_else(lxb_html_tree_t *tree
         tree->before_append_attr = lxb_html_tree_adjust_attributes_svg;
     }
 
-    element = lxb_html_tree_insert_foreign_element(tree, token, node->ns);
+    element = lxb_html_tree_insert_foreign_element(tree, token, node->ns,
+                                                   false);
     if (element == NULL) {
         tree->before_append_attr = NULL;
         tree->status = LXB_STATUS_ERROR_MEMORY_ALLOCATION;
@@ -259,22 +260,19 @@ lxb_html_tree_insertion_mode_foreign_content_all(lxb_html_tree_t *tree,
 
     lxb_html_tree_parse_error(tree, token, LXB_HTML_RULES_ERROR_UNTO);
 
-    if (tree->fragment != NULL) {
-        return lxb_html_tree_insertion_mode_foreign_content_anything_else(tree,
-                                                                          token);
-    }
+    node = lxb_html_tree_current_node(tree);
 
-    do {
+    while (node != NULL &&
+           !(lxb_html_tree_mathml_text_integration_point(node)
+             || lxb_html_tree_html_integration_point(node)
+             || node->ns == LXB_NS_HTML))
+    {
         lxb_html_tree_open_elements_pop(tree);
 
         node = lxb_html_tree_current_node(tree);
     }
-    while (node &&
-           !(lxb_html_tree_mathml_text_integration_point(node)
-            || lxb_html_tree_html_integration_point(node)
-            || node->ns == LXB_NS_HTML));
 
-    return false;
+    return tree->mode(tree, token);
 }
 
 bool
@@ -286,6 +284,10 @@ lxb_html_tree_insertion_mode_foreign_content(lxb_html_tree_t *tree,
             case LXB_TAG_SCRIPT:
                 return lxb_html_tree_insertion_mode_foreign_content_script_closed(tree,
                                                                                   token);
+            case LXB_TAG_P:
+            case LXB_TAG_BR:
+                return lxb_html_tree_insertion_mode_foreign_content_all(tree,
+                                                                        token);
             default:
                 return lxb_html_tree_insertion_mode_foreign_content_anything_else_closed(tree,
                                                                                          token);
diff --git a/ext/lexbor/lexbor/html/tree/insertion_mode/in_body.c b/ext/lexbor/lexbor/html/tree/insertion_mode/in_body.c
index 32cc40476948..38610c7cdd27 100644
--- a/ext/lexbor/lexbor/html/tree/insertion_mode/in_body.c
+++ b/ext/lexbor/lexbor/html/tree/insertion_mode/in_body.c
@@ -1,19 +1,25 @@
 /*
- * Copyright (C) 2018-2020 Alexander Borisov
+ * Copyright (C) 2018-2026 Alexander Borisov
  *
  * Author: Alexander Borisov 
  */
 
-#define LEXBOR_TOKENIZER_CHARS_MAP
-#include "lexbor/core/str_res.h"
-
 #include "lexbor/html/tree/insertion_mode.h"
 #include "lexbor/html/tree/open_elements.h"
 #include "lexbor/html/tree/active_formatting.h"
 #include "lexbor/html/interfaces/head_element.h"
+#include "lexbor/html/interfaces/option_element.h"
 #include "lexbor/html/tokenizer/state.h"
+#include "lexbor/html/parser.h"
 #include "lexbor/html/tokenizer/state_rcdata.h"
 
+#ifndef LEXBOR_DISABLE_INTERNAL_EXTERN
+    LXB_EXTERN const unsigned char lexbor_tokenizer_chars_map[256];
+#endif
+
+static bool
+lxb_html_tree_insertion_mode_in_body_anything_else_closed(lxb_html_tree_t *tree,
+                                                          lxb_html_token_t *token);
 
 /*
  * User case insertion mode.
@@ -691,7 +697,7 @@ lxb_html_tree_insertion_mode_in_body_button(lxb_html_tree_t *tree,
  * "address", "article", "aside", "blockquote", "button",  "center", "details",
  * "dialog", "dir", "div", "dl", "fieldset", "figcaption", "figure", "footer",
  * "header", "hgroup", "listing", "main", "menu", "nav", "ol", "pre", "section",
- * "summary", "ul"
+ * "select", "summary", "ul"
  */
 lxb_inline bool
 lxb_html_tree_insertion_mode_in_body_abcdfhlmnopsu_closed(lxb_html_tree_t *tree,
@@ -1204,13 +1210,63 @@ lxb_html_tree_insertion_mode_in_body_br_closed(lxb_html_tree_t *tree,
     return lxb_html_tree_insertion_mode_in_body_abeikw(tree, token);
 }
 
+lxb_inline bool
+lxb_html_tree_insertion_mode_in_body_option_closed(lxb_html_tree_t *tree,
+                                                   lxb_html_token_t *token)
+{
+    bool is;
+    size_t index;
+    lxb_dom_node_t *node;
+    lxb_html_option_element_t *option;
+    lxb_dom_exception_code_t code;
+
+    node = lxb_html_tree_open_elements_find_reverse(tree, LXB_TAG_OPTION,
+                                                    LXB_NS_HTML, &index);
+
+    lxb_html_tree_insertion_mode_in_body_anything_else_closed(tree, token);
+
+    if (node != NULL) {
+        is = lxb_html_tree_open_elements_find_by_node(tree, node, &index);
+
+        if (!is) {
+            option = lxb_html_interface_option(node);
+
+            code = lxb_html_option_maybe_clone_to_selectedcontent(option);
+            if (code != LXB_DOM_EXCEPTION_OK) {
+                tree->status = LXB_STATUS_ERROR;
+
+                return lxb_html_tree_process_abort(tree);
+            }
+        }
+    }
+
+    return true;
+}
+
 lxb_inline bool
 lxb_html_tree_insertion_mode_in_body_input(lxb_html_tree_t *tree,
                                            lxb_html_token_t *token)
 {
+    bool is;
+    lxb_dom_node_t *node;
     lxb_dom_attr_t *attr;
     lxb_html_element_t *element;
 
+    is = lxb_html_tree_is_fragment_element(tree, LXB_TAG_SELECT, LXB_NS_HTML);
+    if (is) {
+        lxb_html_tree_parse_error(tree, token,
+                                  LXB_HTML_RULES_ERROR_FRPASEINCOPAIN);
+        return true;
+    }
+
+    node = lxb_html_tree_element_in_scope(tree, LXB_TAG_SELECT, LXB_NS_HTML,
+                                          LXB_HTML_TAG_CATEGORY_SCOPE);
+    if (node != NULL) {
+        lxb_html_tree_parse_error(tree, token, LXB_HTML_RULES_ERROR_SEINSC);
+        lxb_html_tree_open_elements_pop_until_node(tree, node, true);
+    }
+
+
     tree->status = lxb_html_tree_active_formatting_reconstruct_elements(tree);
     if (tree->status != LXB_STATUS_OK) {
         return lxb_html_tree_process_abort(tree);
@@ -1277,6 +1333,19 @@ lxb_html_tree_insertion_mode_in_body_hr(lxb_html_tree_t *tree,
         lxb_html_tree_close_p_element(tree, token);
     }
 
+    node = lxb_html_tree_element_in_scope(tree, LXB_TAG_SELECT, LXB_NS_HTML,
+                                          LXB_HTML_TAG_CATEGORY_SCOPE);
+    if (node != NULL) {
+        lxb_html_tree_generate_implied_end_tags(tree, LXB_TAG__UNDEF,
+                                                LXB_NS__UNDEF);
+
+        node = lxb_html_tree_element_in_scope_option_optgroup(tree);
+        if (node != NULL) {
+            lxb_html_tree_parse_error(tree, token,
+                                      LXB_HTML_RULES_ERROR_HRPASEOPOPINSC);
+        }
+    }
+
     element = lxb_html_tree_insert_html_element(tree, token);
     if (element == NULL) {
         tree->status = LXB_STATUS_ERROR_MEMORY_ALLOCATION;
@@ -1396,8 +1465,25 @@ lxb_inline bool
 lxb_html_tree_insertion_mode_in_body_select(lxb_html_tree_t *tree,
                                             lxb_html_token_t *token)
 {
+    bool is;
+    lxb_dom_node_t *node;
     lxb_html_element_t *element;
 
+    is = lxb_html_tree_is_fragment_element(tree, LXB_TAG_SELECT, LXB_NS_HTML);
+    if (is) {
+        lxb_html_tree_parse_error(tree, token,
+                                  LXB_HTML_RULES_ERROR_FRPASEINCOPASE);
+        return true;
+    }
+
+    node = lxb_html_tree_element_in_scope(tree, LXB_TAG_SELECT, LXB_NS_HTML,
+                                          LXB_HTML_TAG_CATEGORY_SCOPE);
+    if (node != NULL) {
+        lxb_html_tree_parse_error(tree, token, LXB_HTML_RULES_ERROR_SEINSC);
+        lxb_html_tree_open_elements_pop_until_node(tree, node, true);
+        return true;
+    }
+
     tree->status = lxb_html_tree_active_formatting_reconstruct_elements(tree);
     if (tree->status != LXB_STATUS_OK) {
         return lxb_html_tree_process_abort(tree);
@@ -1412,34 +1498,81 @@ lxb_html_tree_insertion_mode_in_body_select(lxb_html_tree_t *tree,
 
     tree->frameset_ok = false;
 
-    if (tree->mode == lxb_html_tree_insertion_mode_in_table
-        || tree->mode == lxb_html_tree_insertion_mode_in_caption
-        || tree->mode == lxb_html_tree_insertion_mode_in_table_body
-        || tree->mode == lxb_html_tree_insertion_mode_in_row
-        || tree->mode == lxb_html_tree_insertion_mode_in_cell)
-    {
-        tree->mode = lxb_html_tree_insertion_mode_in_select_in_table;
+    return true;
+}
+
+/*
+ * "option"
+ */
+lxb_inline bool
+lxb_html_tree_insertion_mode_in_body_option(lxb_html_tree_t *tree,
+                                            lxb_html_token_t *token)
+{
+    lxb_dom_node_t *node;
+    lxb_html_element_t *element;
+
+    node = lxb_html_tree_element_in_scope(tree, LXB_TAG_SELECT, LXB_NS_HTML,
+                                          LXB_HTML_TAG_CATEGORY_SCOPE);
+    if (node != NULL) {
+        lxb_html_tree_generate_implied_end_tags(tree, LXB_TAG_OPTGROUP,
+                                                LXB_NS_HTML);
+
+        node = lxb_html_tree_element_in_scope(tree, LXB_TAG_OPTION, LXB_NS_HTML,
+                                              LXB_HTML_TAG_CATEGORY_SCOPE);
+        if (node != NULL) {
+            lxb_html_tree_parse_error(tree, token,
+                                      LXB_HTML_RULES_ERROR_OPPAOPINSC);
+        }
     }
     else {
-        tree->mode = lxb_html_tree_insertion_mode_in_select;
+        node = lxb_html_tree_current_node(tree);
+        if (lxb_html_tree_node_is(node, LXB_TAG_OPTION)) {
+            lxb_html_tree_open_elements_pop(tree);
+        }
+    }
+
+    tree->status = lxb_html_tree_active_formatting_reconstruct_elements(tree);
+    if (tree->status != LXB_STATUS_OK) {
+        return lxb_html_tree_process_abort(tree);
+    }
+
+    element = lxb_html_tree_insert_html_element(tree, token);
+    if (element == NULL) {
+        tree->status = LXB_STATUS_ERROR_MEMORY_ALLOCATION;
+
+        return lxb_html_tree_process_abort(tree);
     }
 
     return true;
 }
 
 /*
- * "optgroup", "option"
+ * "optgroup"
  */
 lxb_inline bool
-lxb_html_tree_insertion_mode_in_body_optopt(lxb_html_tree_t *tree,
-                                            lxb_html_token_t *token)
+lxb_html_tree_insertion_mode_in_body_optgroup(lxb_html_tree_t *tree,
+                                              lxb_html_token_t *token)
 {
     lxb_dom_node_t *node;
     lxb_html_element_t *element;
 
-    node = lxb_html_tree_current_node(tree);
-    if (lxb_html_tree_node_is(node, LXB_TAG_OPTION)) {
-        lxb_html_tree_open_elements_pop(tree);
+    node = lxb_html_tree_element_in_scope(tree, LXB_TAG_SELECT, LXB_NS_HTML,
+                                          LXB_HTML_TAG_CATEGORY_SCOPE);
+    if (node != NULL) {
+        lxb_html_tree_generate_implied_end_tags(tree, LXB_TAG__UNDEF,
+                                                LXB_NS__UNDEF);
+
+        node = lxb_html_tree_element_in_scope_option_optgroup(tree);
+        if (node != NULL) {
+            lxb_html_tree_parse_error(tree, token,
+                                      LXB_HTML_RULES_ERROR_OPPAOPOPINSC);
+        }
+    }
+    else {
+        node = lxb_html_tree_current_node(tree);
+        if (lxb_html_tree_node_is(node, LXB_TAG_OPTION)) {
+            lxb_html_tree_open_elements_pop(tree);
+        }
     }
 
     tree->status = lxb_html_tree_active_formatting_reconstruct_elements(tree);
@@ -1539,7 +1672,8 @@ lxb_html_tree_insertion_mode_in_body_math(lxb_html_tree_t *tree,
 
     tree->before_append_attr = lxb_html_tree_adjust_attributes_mathml;
 
-    element = lxb_html_tree_insert_foreign_element(tree, token, LXB_NS_MATH);
+    element = lxb_html_tree_insert_foreign_element(tree, token, LXB_NS_MATH,
+                                                   false);
     if (element == NULL) {
         tree->before_append_attr = NULL;
         tree->status = LXB_STATUS_ERROR_MEMORY_ALLOCATION;
@@ -1570,7 +1704,8 @@ lxb_html_tree_insertion_mode_in_body_svg(lxb_html_tree_t *tree,
 
     tree->before_append_attr = lxb_html_tree_adjust_attributes_svg;
 
-    element = lxb_html_tree_insert_foreign_element(tree, token, LXB_NS_SVG);
+    element = lxb_html_tree_insert_foreign_element(tree, token, LXB_NS_SVG,
+                                                   false);
     if (element == NULL) {
         tree->before_append_attr = NULL;
         tree->status = LXB_STATUS_ERROR_MEMORY_ALLOCATION;
@@ -1643,7 +1778,7 @@ lxb_html_tree_insertion_mode_in_body_noscript(lxb_html_tree_t *tree,
     return true;
 }
 
-lxb_inline bool
+static bool
 lxb_html_tree_insertion_mode_in_body_anything_else_closed(lxb_html_tree_t *tree,
                                                           lxb_html_token_t *token)
 {
@@ -1719,7 +1854,9 @@ lxb_html_tree_insertion_mode_in_body(lxb_html_tree_t *tree,
             case LXB_TAG_NAV:
             case LXB_TAG_OL:
             case LXB_TAG_PRE:
+            case LXB_TAG_SEARCH:
             case LXB_TAG_SECTION:
+            case LXB_TAG_SELECT:
             case LXB_TAG_SUMMARY:
             case LXB_TAG_UL:
                 return lxb_html_tree_insertion_mode_in_body_abcdfhlmnopsu_closed(tree,
@@ -1770,6 +1907,10 @@ lxb_html_tree_insertion_mode_in_body(lxb_html_tree_t *tree,
                 return lxb_html_tree_insertion_mode_in_body_br_closed(tree,
                                                                       token);
 
+            case LXB_TAG_OPTION:
+                return lxb_html_tree_insertion_mode_in_body_option_closed(tree,
+                                                                          token);
+
             default:
                 return lxb_html_tree_insertion_mode_in_body_anything_else_closed(tree,
                                                                                  token);
@@ -1831,6 +1972,7 @@ lxb_html_tree_insertion_mode_in_body(lxb_html_tree_t *tree,
         case LXB_TAG_NAV:
         case LXB_TAG_OL:
         case LXB_TAG_P:
+        case LXB_TAG_SEARCH:
         case LXB_TAG_SECTION:
         case LXB_TAG_SUMMARY:
         case LXB_TAG_UL:
@@ -1934,9 +2076,11 @@ lxb_html_tree_insertion_mode_in_body(lxb_html_tree_t *tree,
         case LXB_TAG_SELECT:
             return lxb_html_tree_insertion_mode_in_body_select(tree, token);
 
-        case LXB_TAG_OPTGROUP:
         case LXB_TAG_OPTION:
-            return lxb_html_tree_insertion_mode_in_body_optopt(tree, token);
+            return lxb_html_tree_insertion_mode_in_body_option(tree, token);
+
+        case LXB_TAG_OPTGROUP:
+            return lxb_html_tree_insertion_mode_in_body_optgroup(tree, token);
 
         case LXB_TAG_RB:
         case LXB_TAG_RTC:
diff --git a/ext/lexbor/lexbor/html/tree/insertion_mode/in_head_noscript.c b/ext/lexbor/lexbor/html/tree/insertion_mode/in_head_noscript.c
index 78e4c5919fe7..1b40ecf62d86 100644
--- a/ext/lexbor/lexbor/html/tree/insertion_mode/in_head_noscript.c
+++ b/ext/lexbor/lexbor/html/tree/insertion_mode/in_head_noscript.c
@@ -101,6 +101,13 @@ lxb_html_tree_insertion_mode_in_head_noscript_closed(lxb_html_tree_t *tree,
                                                                             token);
     }
 
+    if (token->tag_id == LXB_TAG_NOSCRIPT) {
+        lxb_html_tree_open_elements_pop(tree);
+        tree->mode = lxb_html_tree_insertion_mode_in_head;
+
+        return true;
+    }
+
     lxb_html_tree_parse_error(tree, token, LXB_HTML_RULES_ERROR_UNTO);
 
     return true;
diff --git a/ext/lexbor/lexbor/html/tree/insertion_mode/in_select.c b/ext/lexbor/lexbor/html/tree/insertion_mode/in_select.c
deleted file mode 100644
index b4eed2c5d3a8..000000000000
--- a/ext/lexbor/lexbor/html/tree/insertion_mode/in_select.c
+++ /dev/null
@@ -1,375 +0,0 @@
-/*
- * Copyright (C) 2018-2020 Alexander Borisov
- *
- * Author: Alexander Borisov 
- */
-
-#include "lexbor/html/tree/insertion_mode.h"
-#include "lexbor/html/tree/open_elements.h"
-
-
-lxb_inline bool
-lxb_html_tree_insertion_mode_in_select_text(lxb_html_tree_t *tree,
-                                            lxb_html_token_t *token)
-{
-    lexbor_str_t str;
-
-    if (token->null_count != 0) {
-        lxb_html_tree_parse_error(tree, token,
-                                  LXB_HTML_RULES_ERROR_NUCH);
-
-        tree->status = lxb_html_token_make_text_drop_null(token, &str,
-                                                          tree->document->dom_document.text);
-    }
-    else {
-        tree->status = lxb_html_token_make_text(token, &str,
-                                                tree->document->dom_document.text);
-    }
-
-    if (tree->status != LXB_STATUS_OK) {
-        return lxb_html_tree_process_abort(tree);
-    }
-
-    /* Can be zero only if all NULL are gone */
-    if (str.length == 0) {
-        lexbor_str_destroy(&str, tree->document->dom_document.text, false);
-
-        return true;
-    }
-
-    tree->status = lxb_html_tree_insert_character_for_data(tree, &str, NULL);
-    if (tree->status != LXB_STATUS_OK) {
-        return lxb_html_tree_process_abort(tree);
-    }
-
-    return true;
-}
-
-lxb_inline bool
-lxb_html_tree_insertion_mode_in_select_comment(lxb_html_tree_t *tree,
-                                               lxb_html_token_t *token)
-{
-    lxb_dom_comment_t *comment;
-
-    comment = lxb_html_tree_insert_comment(tree, token, NULL);
-    if (comment == NULL) {
-        tree->status = LXB_STATUS_ERROR_MEMORY_ALLOCATION;
-
-        return lxb_html_tree_process_abort(tree);
-    }
-
-    return true;
-}
-
-lxb_inline bool
-lxb_html_tree_insertion_mode_in_select_doctype(lxb_html_tree_t *tree,
-                                               lxb_html_token_t *token)
-{
-    lxb_html_tree_parse_error(tree, token, LXB_HTML_RULES_ERROR_DOTOINSEMO);
-
-    return true;
-}
-
-lxb_inline bool
-lxb_html_tree_insertion_mode_in_select_html(lxb_html_tree_t *tree,
-                                            lxb_html_token_t *token)
-{
-    return lxb_html_tree_insertion_mode_in_body(tree, token);
-}
-
-lxb_inline bool
-lxb_html_tree_insertion_mode_in_select_option(lxb_html_tree_t *tree,
-                                              lxb_html_token_t *token)
-{
-    lxb_html_element_t *element;
-    lxb_dom_node_t *node = lxb_html_tree_current_node(tree);
-
-    if (lxb_html_tree_node_is(node, LXB_TAG_OPTION)) {
-        lxb_html_tree_open_elements_pop(tree);
-    }
-
-    element = lxb_html_tree_insert_html_element(tree, token);
-    if (element == NULL) {
-        tree->status = LXB_STATUS_ERROR_MEMORY_ALLOCATION;
-
-        return lxb_html_tree_process_abort(tree);
-    }
-
-    return true;
-}
-
-lxb_inline bool
-lxb_html_tree_insertion_mode_in_select_optgroup(lxb_html_tree_t *tree,
-                                                lxb_html_token_t *token)
-{
-    lxb_html_element_t *element;
-    lxb_dom_node_t *node = lxb_html_tree_current_node(tree);
-
-    if (lxb_html_tree_node_is(node, LXB_TAG_OPTION)) {
-        lxb_html_tree_open_elements_pop(tree);
-    }
-
-    node = lxb_html_tree_current_node(tree);
-
-    if (lxb_html_tree_node_is(node, LXB_TAG_OPTGROUP)) {
-        lxb_html_tree_open_elements_pop(tree);
-    }
-
-    element = lxb_html_tree_insert_html_element(tree, token);
-    if (element == NULL) {
-        tree->status = LXB_STATUS_ERROR_MEMORY_ALLOCATION;
-
-        return lxb_html_tree_process_abort(tree);
-    }
-
-    return true;
-}
-
-lxb_inline bool
-lxb_html_tree_insertion_mode_in_select_hr(lxb_html_tree_t *tree,
-                                          lxb_html_token_t *token)
-{
-    lxb_html_element_t *element;
-    lxb_dom_node_t *node = lxb_html_tree_current_node(tree);
-
-    if (lxb_html_tree_node_is(node, LXB_TAG_OPTION)) {
-        lxb_html_tree_open_elements_pop(tree);
-    }
-
-    node = lxb_html_tree_current_node(tree);
-
-    if (lxb_html_tree_node_is(node, LXB_TAG_OPTGROUP)) {
-        lxb_html_tree_open_elements_pop(tree);
-    }
-
-    element = lxb_html_tree_insert_html_element(tree, token);
-    if (element == NULL) {
-        tree->status = LXB_STATUS_ERROR_MEMORY_ALLOCATION;
-
-        return lxb_html_tree_process_abort(tree);
-    }
-
-    lxb_html_tree_open_elements_pop(tree);
-
-    lxb_html_tree_acknowledge_token_self_closing(tree, token);
-
-    return true;
-}
-
-lxb_inline bool
-lxb_html_tree_insertion_mode_in_select_optgroup_closed(lxb_html_tree_t *tree,
-                                                       lxb_html_token_t *token)
-{
-    lxb_dom_node_t *node = lxb_html_tree_current_node(tree);
-
-    if (lxb_html_tree_node_is(node, LXB_TAG_OPTION)
-        && tree->open_elements->length > 1)
-    {
-        node = lxb_html_tree_open_elements_get(tree,
-                                               tree->open_elements->length - 2);
-        if (node != NULL && lxb_html_tree_node_is(node, LXB_TAG_OPTGROUP)) {
-            lxb_html_tree_open_elements_pop(tree);
-        }
-    }
-
-    node = lxb_html_tree_current_node(tree);
-
-    if (lxb_html_tree_node_is(node, LXB_TAG_OPTGROUP) == false) {
-        lxb_html_tree_parse_error(tree, token,
-                                  LXB_HTML_RULES_ERROR_UNELINOPELST);
-        return true;
-    }
-
-    lxb_html_tree_open_elements_pop(tree);
-
-    return true;
-}
-
-lxb_inline bool
-lxb_html_tree_insertion_mode_in_select_option_closed(lxb_html_tree_t *tree,
-                                                     lxb_html_token_t *token)
-{
-    lxb_dom_node_t *node = lxb_html_tree_current_node(tree);
-
-    if (lxb_html_tree_node_is(node, LXB_TAG_OPTION) == false) {
-        lxb_html_tree_parse_error(tree, token,
-                                  LXB_HTML_RULES_ERROR_UNELINOPELST);
-        return true;
-    }
-
-    lxb_html_tree_open_elements_pop(tree);
-
-    return true;
-}
-
-lxb_inline bool
-lxb_html_tree_insertion_mode_in_select_select_closed(lxb_html_tree_t *tree,
-                                                     lxb_html_token_t *token)
-{
-    lxb_dom_node_t *node;
-
-    node = lxb_html_tree_element_in_scope(tree, LXB_TAG_SELECT, LXB_NS_HTML,
-                                          LXB_HTML_TAG_CATEGORY_SCOPE_SELECT);
-    if (node == NULL) {
-        lxb_html_tree_parse_error(tree, token, LXB_HTML_RULES_ERROR_UNCLTO);
-
-        return true;
-    }
-
-    lxb_html_tree_open_elements_pop_until_tag_id(tree, LXB_TAG_SELECT,
-                                                 LXB_NS_HTML, true);
-
-    lxb_html_tree_reset_insertion_mode_appropriately(tree);
-
-    return true;
-}
-
-lxb_inline bool
-lxb_html_tree_insertion_mode_in_select_select(lxb_html_tree_t *tree,
-                                              lxb_html_token_t *token)
-{
-    lxb_dom_node_t *node;
-
-    lxb_html_tree_parse_error(tree, token, LXB_HTML_RULES_ERROR_UNTO);
-
-    node = lxb_html_tree_element_in_scope(tree, LXB_TAG_SELECT, LXB_NS_HTML,
-                                          LXB_HTML_TAG_CATEGORY_SCOPE_SELECT);
-    if (node == NULL) {
-        return true;
-    }
-
-    lxb_html_tree_open_elements_pop_until_tag_id(tree, LXB_TAG_SELECT,
-                                                 LXB_NS_HTML, true);
-
-    lxb_html_tree_reset_insertion_mode_appropriately(tree);
-
-    return true;
-}
-
-/*
- * "input", "keygen", "textarea"
- */
-lxb_inline bool
-lxb_html_tree_insertion_mode_in_select_ikt(lxb_html_tree_t *tree,
-                                           lxb_html_token_t *token)
-{
-    lxb_dom_node_t *node;
-
-    lxb_html_tree_parse_error(tree, token, LXB_HTML_RULES_ERROR_UNTO);
-
-    node = lxb_html_tree_element_in_scope(tree, LXB_TAG_SELECT, LXB_NS_HTML,
-                                          LXB_HTML_TAG_CATEGORY_SCOPE_SELECT);
-    if (node == NULL) {
-        return true;
-    }
-
-    lxb_html_tree_open_elements_pop_until_tag_id(tree, LXB_TAG_SELECT,
-                                                 LXB_NS_HTML, true);
-
-    lxb_html_tree_reset_insertion_mode_appropriately(tree);
-
-    return false;
-}
-
-/*
- * A start tag whose tag name is one of: "script", "template"
- * An end tag whose tag name is "template"
- */
-lxb_inline bool
-lxb_html_tree_insertion_mode_in_select_st_open_closed(lxb_html_tree_t *tree,
-                                                      lxb_html_token_t *token)
-{
-    return lxb_html_tree_insertion_mode_in_head(tree, token);
-}
-
-lxb_inline bool
-lxb_html_tree_insertion_mode_in_select_end_of_file(lxb_html_tree_t *tree,
-                                                   lxb_html_token_t *token)
-{
-    return lxb_html_tree_insertion_mode_in_body(tree, token);
-}
-
-lxb_inline bool
-lxb_html_tree_insertion_mode_in_select_anything_else(lxb_html_tree_t *tree,
-                                                     lxb_html_token_t *token)
-{
-    lxb_html_tree_parse_error(tree, token, LXB_HTML_RULES_ERROR_UNTO);
-
-    return true;
-}
-
-lxb_inline bool
-lxb_html_tree_insertion_mode_in_select_anything_else_closed(lxb_html_tree_t *tree,
-                                                            lxb_html_token_t *token)
-{
-    lxb_html_tree_parse_error(tree, token, LXB_HTML_RULES_ERROR_UNCLTO);
-
-    return true;
-}
-
-bool
-lxb_html_tree_insertion_mode_in_select(lxb_html_tree_t *tree,
-                                       lxb_html_token_t *token)
-{
-    if (token->type & LXB_HTML_TOKEN_TYPE_CLOSE) {
-        switch (token->tag_id) {
-            case LXB_TAG_OPTGROUP:
-                return lxb_html_tree_insertion_mode_in_select_optgroup_closed(tree,
-                                                                              token);
-            case LXB_TAG_OPTION:
-                return lxb_html_tree_insertion_mode_in_select_option_closed(tree,
-                                                                            token);
-            case LXB_TAG_SELECT:
-                return lxb_html_tree_insertion_mode_in_select_select_closed(tree,
-                                                                            token);
-            case LXB_TAG_TEMPLATE:
-                return lxb_html_tree_insertion_mode_in_select_st_open_closed(tree,
-                                                                             token);
-            default:
-                return lxb_html_tree_insertion_mode_in_select_anything_else_closed(tree,
-                                                                                   token);
-        }
-    }
-
-    switch (token->tag_id) {
-        case LXB_TAG__TEXT:
-            return lxb_html_tree_insertion_mode_in_select_text(tree, token);
-
-        case LXB_TAG__EM_COMMENT:
-            return lxb_html_tree_insertion_mode_in_select_comment(tree, token);
-
-        case LXB_TAG__EM_DOCTYPE:
-            return lxb_html_tree_insertion_mode_in_select_doctype(tree, token);
-
-        case LXB_TAG_HTML:
-            return lxb_html_tree_insertion_mode_in_select_html(tree, token);
-
-        case LXB_TAG_OPTION:
-            return lxb_html_tree_insertion_mode_in_select_option(tree, token);
-
-        case LXB_TAG_OPTGROUP:
-            return lxb_html_tree_insertion_mode_in_select_optgroup(tree, token);
-
-        case LXB_TAG_HR:
-            return lxb_html_tree_insertion_mode_in_select_hr(tree, token);
-
-        case LXB_TAG_SELECT:
-            return lxb_html_tree_insertion_mode_in_select_select(tree, token);
-
-        case LXB_TAG_INPUT:
-        case LXB_TAG_KEYGEN:
-        case LXB_TAG_TEXTAREA:
-            return lxb_html_tree_insertion_mode_in_select_ikt(tree, token);
-
-        case LXB_TAG_SCRIPT:
-        case LXB_TAG_TEMPLATE:
-            return lxb_html_tree_insertion_mode_in_select_st_open_closed(tree,
-                                                                         token);
-        case LXB_TAG__END_OF_FILE:
-            return lxb_html_tree_insertion_mode_in_select_end_of_file(tree,
-                                                                      token);
-        default:
-            return lxb_html_tree_insertion_mode_in_select_anything_else(tree,
-                                                                        token);
-    }
-}
diff --git a/ext/lexbor/lexbor/html/tree/insertion_mode/in_select_in_table.c b/ext/lexbor/lexbor/html/tree/insertion_mode/in_select_in_table.c
deleted file mode 100644
index 7db2e259191e..000000000000
--- a/ext/lexbor/lexbor/html/tree/insertion_mode/in_select_in_table.c
+++ /dev/null
@@ -1,115 +0,0 @@
-/*
- * Copyright (C) 2018-2019 Alexander Borisov
- *
- * Author: Alexander Borisov 
- */
-
-#include "lexbor/html/tree/insertion_mode.h"
-#include "lexbor/html/tree/open_elements.h"
-
-
-/*
- * "caption", "table", "tbody", "tfoot", "thead", "tr", "td", "th"
- */
-lxb_inline bool
-lxb_html_tree_insertion_mode_in_select_in_table_ct(lxb_html_tree_t *tree,
-                                                   lxb_html_token_t *token)
-{
-    lxb_html_tree_parse_error(tree, token, LXB_HTML_RULES_ERROR_UNTO);
-
-    lxb_html_tree_open_elements_pop_until_tag_id(tree, LXB_TAG_SELECT,
-                                                 LXB_NS_HTML, true);
-
-    lxb_html_tree_reset_insertion_mode_appropriately(tree);
-
-    return false;
-}
-
-/*
- * "caption", "table", "tbody", "tfoot", "thead", "tr", "td", "th"
- */
-lxb_inline bool
-lxb_html_tree_insertion_mode_in_select_in_table_ct_closed(lxb_html_tree_t *tree,
-                                                          lxb_html_token_t *token)
-{
-    lxb_dom_node_t *node;
-
-    lxb_html_tree_parse_error(tree, token, LXB_HTML_RULES_ERROR_UNCLTO);
-
-    node = lxb_html_tree_element_in_scope(tree, token->tag_id, LXB_NS_HTML,
-                                          LXB_HTML_TAG_CATEGORY_SCOPE_TABLE);
-    if (node == NULL) {
-        return true;
-    }
-
-    lxb_html_tree_open_elements_pop_until_tag_id(tree, LXB_TAG_SELECT,
-                                                 LXB_NS_HTML, true);
-
-    lxb_html_tree_reset_insertion_mode_appropriately(tree);
-
-    return false;
-}
-
-lxb_inline bool
-lxb_html_tree_insertion_mode_in_select_in_table_anything_else(lxb_html_tree_t *tree,
-                                                              lxb_html_token_t *token)
-{
-    return lxb_html_tree_insertion_mode_in_select(tree, token);
-}
-
-lxb_inline bool
-lxb_html_tree_insertion_mode_in_select_in_table_anything_else_closed(lxb_html_tree_t *tree,
-                                                                     lxb_html_token_t *token)
-{
-    return lxb_html_tree_insertion_mode_in_select_in_table_anything_else(tree,
-                                                                         token);
-}
-
-bool
-lxb_html_tree_insertion_mode_in_select_in_table(lxb_html_tree_t *tree,
-                                                lxb_html_token_t *token)
-{
-    if (token->tag_id >= LXB_TAG__LAST_ENTRY) {
-        if (token->type & LXB_HTML_TOKEN_TYPE_CLOSE) {
-            return lxb_html_tree_insertion_mode_in_select_in_table_anything_else_closed(tree,
-                                                                                        token);
-        }
-
-        return lxb_html_tree_insertion_mode_in_select_in_table_anything_else(tree,
-                                                                             token);
-    }
-
-    if (token->type & LXB_HTML_TOKEN_TYPE_CLOSE) {
-        switch (token->tag_id) {
-            case LXB_TAG_CAPTION:
-            case LXB_TAG_TABLE:
-            case LXB_TAG_TBODY:
-            case LXB_TAG_TFOOT:
-            case LXB_TAG_THEAD:
-            case LXB_TAG_TR:
-            case LXB_TAG_TH:
-            case LXB_TAG_TD:
-                return lxb_html_tree_insertion_mode_in_select_in_table_ct_closed(tree,
-                                                                                 token);
-            default:
-                return lxb_html_tree_insertion_mode_in_select_in_table_anything_else_closed(tree,
-                                                                                            token);
-        }
-    }
-
-    switch (token->tag_id) {
-        case LXB_TAG_CAPTION:
-        case LXB_TAG_TABLE:
-        case LXB_TAG_TBODY:
-        case LXB_TAG_TFOOT:
-        case LXB_TAG_THEAD:
-        case LXB_TAG_TR:
-        case LXB_TAG_TH:
-        case LXB_TAG_TD:
-            return lxb_html_tree_insertion_mode_in_select_in_table_ct(tree,
-                                                                      token);
-        default:
-            return lxb_html_tree_insertion_mode_in_select_in_table_anything_else(tree,
-                                                                                 token);
-    }
-}
diff --git a/ext/lexbor/lexbor/ns/base.h b/ext/lexbor/lexbor/ns/base.h
index a5b01baa0e6c..94ee0b7f8719 100644
--- a/ext/lexbor/lexbor/ns/base.h
+++ b/ext/lexbor/lexbor/ns/base.h
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2019 Alexander Borisov
+ * Copyright (C) 2019-2025 Alexander Borisov
  *
  * Author: Alexander Borisov 
  */
@@ -16,7 +16,7 @@ extern "C" {
 
 
 #define LXB_NS_VERSION_MAJOR 1
-#define LXB_NS_VERSION_MINOR 2
+#define LXB_NS_VERSION_MINOR 4
 #define LXB_NS_VERSION_PATCH 0
 
 #define LXB_NS_VERSION_STRING                                                  \
diff --git a/ext/lexbor/lexbor/ns/const.h b/ext/lexbor/lexbor/ns/const.h
index 463d8d4998bc..2115629b9bdd 100644
--- a/ext/lexbor/lexbor/ns/const.h
+++ b/ext/lexbor/lexbor/ns/const.h
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2018 Alexander Borisov
+ * Copyright (C) 2018-2026 Alexander Borisov
  *
  * Author: Alexander Borisov 
  */
diff --git a/ext/lexbor/lexbor/ns/ns.c b/ext/lexbor/lexbor/ns/ns.c
index 87e870cf627c..4ffd02519c94 100644
--- a/ext/lexbor/lexbor/ns/ns.c
+++ b/ext/lexbor/lexbor/ns/ns.c
@@ -1,13 +1,14 @@
 /*
- * Copyright (C) 2018-2019 Alexander Borisov
+ * Copyright (C) 2018-2026 Alexander Borisov
  *
  * Author: Alexander Borisov 
  */
 
 #include "lexbor/core/shs.h"
 
-#define LEXBOR_STR_RES_MAP_LOWERCASE
-#include "lexbor/core/str_res.h"
+#ifndef LEXBOR_DISABLE_INTERNAL_EXTERN
+    LXB_EXTERN const lxb_char_t lexbor_str_res_map_lowercase[256];
+#endif
 
 #include "lexbor/ns/ns.h"
 #include "lexbor/ns/res.h"
diff --git a/ext/lexbor/lexbor/ns/res.h b/ext/lexbor/lexbor/ns/res.h
index ca3ab04cb6e7..c953ab074696 100644
--- a/ext/lexbor/lexbor/ns/res.h
+++ b/ext/lexbor/lexbor/ns/res.h
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2018-2019 Alexander Borisov
+ * Copyright (C) 2018-2026 Alexander Borisov
  *
  * Author: Alexander Borisov 
  */
@@ -50,7 +50,7 @@ static const lxb_ns_prefix_data_t lxb_ns_prefix_res_data[LXB_NS__LAST_ENTRY] =
     {{.u.short_str = "xmlns", .length = 5, .next = NULL}, LXB_NS_XMLNS, 1, true}
 };
 
-static const lexbor_shs_entry_t lxb_ns_res_shs_data[] = 
+static const lexbor_shs_entry_t lxb_ns_res_shs_data[29] = 
 {
     {NULL, NULL, 28, 0}, {"html", (void *) &lxb_ns_prefix_res_data[2], 4, 0}, 
     {"xmlns", (void *) &lxb_ns_prefix_res_data[7], 5, 0}, {NULL, NULL, 0, 0}, 
@@ -69,7 +69,7 @@ static const lexbor_shs_entry_t lxb_ns_res_shs_data[] =
     {"xml", (void *) &lxb_ns_prefix_res_data[6], 3, 0}
 };
 
-static const lexbor_shs_entry_t lxb_ns_res_shs_link_data[] = 
+static const lexbor_shs_entry_t lxb_ns_res_shs_link_data[23] = 
 {
     {NULL, NULL, 22, 0}, 
     {"http://www.w3.org/1999/xhtml", (void *) &lxb_ns_res_data[2], 28, 0}, 
diff --git a/ext/lexbor/lexbor/punycode/base.h b/ext/lexbor/lexbor/punycode/base.h
index de51606a69a6..ee0c08ae344e 100644
--- a/ext/lexbor/lexbor/punycode/base.h
+++ b/ext/lexbor/lexbor/punycode/base.h
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2023-2024 Alexander Borisov
+ * Copyright (C) 2023-2026 Alexander Borisov
  *
  * Author: Alexander Borisov 
  */
@@ -15,7 +15,7 @@ extern "C" {
 
 
 #define LXB_PUNYCODE_VERSION_MAJOR 1
-#define LXB_PUNYCODE_VERSION_MINOR 1
+#define LXB_PUNYCODE_VERSION_MINOR 2
 #define LXB_PUNYCODE_VERSION_PATCH 0
 
 #define LEXBOR_PUNYCODE_VERSION_STRING LEXBOR_STRINGIZE(LXB_PUNYCODE_VERSION_MAJOR) "." \
diff --git a/ext/lexbor/lexbor/punycode/punycode.c b/ext/lexbor/lexbor/punycode/punycode.c
index 02465a4e00f1..4c3f22ea9bce 100644
--- a/ext/lexbor/lexbor/punycode/punycode.c
+++ b/ext/lexbor/lexbor/punycode/punycode.c
@@ -138,6 +138,13 @@ lxb_punycode_encode_body(const lxb_codepoint_t *cps, const lxb_codepoint_t *cps_
     }
 
     if (p > buf) {
+        if (p >= end) {
+            p = lxb_punycode_encode_realloc(p, &buf, &end, buffer);
+            if (p == NULL) {
+                return LXB_STATUS_ERROR_MEMORY_ALLOCATION;
+            }
+        }
+
         *p++ = LXB_PUNYCODE_DELIMITER;
     }
 
diff --git a/ext/lexbor/lexbor/selectors/base.h b/ext/lexbor/lexbor/selectors/base.h
index 64af0261a75c..19bdda73849a 100644
--- a/ext/lexbor/lexbor/selectors/base.h
+++ b/ext/lexbor/lexbor/selectors/base.h
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2021-2023 Alexander Borisov
+ * Copyright (C) 2021-2026 Alexander Borisov
  *
  * Author: Alexander Borisov 
  */
@@ -15,7 +15,7 @@ extern "C" {
 
 
 #define LXB_SELECTORS_VERSION_MAJOR 0
-#define LXB_SELECTORS_VERSION_MINOR 3
+#define LXB_SELECTORS_VERSION_MINOR 6
 #define LXB_SELECTORS_VERSION_PATCH 0
 
 #define LXB_SELECTORS_VERSION_STRING LEXBOR_STRINGIZE(LXB_SELECTORS_VERSION_MAJOR) "."   \
diff --git a/ext/lexbor/lexbor/tag/base.h b/ext/lexbor/lexbor/tag/base.h
index 94886ee4f47c..27ba326cf40f 100644
--- a/ext/lexbor/lexbor/tag/base.h
+++ b/ext/lexbor/lexbor/tag/base.h
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2019-2024 Alexander Borisov
+ * Copyright (C) 2019-2026 Alexander Borisov
  *
  * Author: Alexander Borisov 
  */
@@ -16,7 +16,7 @@ extern "C" {
 
 
 #define LXB_TAG_VERSION_MAJOR 1
-#define LXB_TAG_VERSION_MINOR 3
+#define LXB_TAG_VERSION_MINOR 5
 #define LXB_TAG_VERSION_PATCH 0
 
 #define LXB_TAG_VERSION_STRING                                                 \
diff --git a/ext/lexbor/lexbor/tag/const.h b/ext/lexbor/lexbor/tag/const.h
index 1a598d347472..b08e387da326 100644
--- a/ext/lexbor/lexbor/tag/const.h
+++ b/ext/lexbor/lexbor/tag/const.h
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2018 Alexander Borisov
+ * Copyright (C) 2018-2026 Alexander Borisov
  *
  * Author: Alexander Borisov 
  */
@@ -14,8 +14,8 @@
 #ifndef LXB_TAG_CONST_H
 #define LXB_TAG_CONST_H
 
-#define LXB_TAG_CONST_VERSION "A161EC911182C3254E7A972D5C51DF86"
-#define LXB_TAG_CONST_VERSION_A161EC911182C3254E7A972D5C51DF86
+#define LXB_TAG_CONST_VERSION "5AB3094FB370521074947DC082575715"
+#define LXB_TAG_CONST_VERSION_5AB3094FB370521074947DC082575715
 
 
 typedef uintptr_t lxb_tag_id_t;
@@ -183,41 +183,43 @@ typedef enum {
     LXB_TAG_S                   = 0x009f,
     LXB_TAG_SAMP                = 0x00a0,
     LXB_TAG_SCRIPT              = 0x00a1,
-    LXB_TAG_SECTION             = 0x00a2,
-    LXB_TAG_SELECT              = 0x00a3,
-    LXB_TAG_SLOT                = 0x00a4,
-    LXB_TAG_SMALL               = 0x00a5,
-    LXB_TAG_SOURCE              = 0x00a6,
-    LXB_TAG_SPACER              = 0x00a7,
-    LXB_TAG_SPAN                = 0x00a8,
-    LXB_TAG_STRIKE              = 0x00a9,
-    LXB_TAG_STRONG              = 0x00aa,
-    LXB_TAG_STYLE               = 0x00ab,
-    LXB_TAG_SUB                 = 0x00ac,
-    LXB_TAG_SUMMARY             = 0x00ad,
-    LXB_TAG_SUP                 = 0x00ae,
-    LXB_TAG_SVG                 = 0x00af,
-    LXB_TAG_TABLE               = 0x00b0,
-    LXB_TAG_TBODY               = 0x00b1,
-    LXB_TAG_TD                  = 0x00b2,
-    LXB_TAG_TEMPLATE            = 0x00b3,
-    LXB_TAG_TEXTAREA            = 0x00b4,
-    LXB_TAG_TEXTPATH            = 0x00b5,
-    LXB_TAG_TFOOT               = 0x00b6,
-    LXB_TAG_TH                  = 0x00b7,
-    LXB_TAG_THEAD               = 0x00b8,
-    LXB_TAG_TIME                = 0x00b9,
-    LXB_TAG_TITLE               = 0x00ba,
-    LXB_TAG_TR                  = 0x00bb,
-    LXB_TAG_TRACK               = 0x00bc,
-    LXB_TAG_TT                  = 0x00bd,
-    LXB_TAG_U                   = 0x00be,
-    LXB_TAG_UL                  = 0x00bf,
-    LXB_TAG_VAR                 = 0x00c0,
-    LXB_TAG_VIDEO               = 0x00c1,
-    LXB_TAG_WBR                 = 0x00c2,
-    LXB_TAG_XMP                 = 0x00c3,
-    LXB_TAG__LAST_ENTRY         = 0x00c4
+    LXB_TAG_SEARCH              = 0x00a2,
+    LXB_TAG_SECTION             = 0x00a3,
+    LXB_TAG_SELECT              = 0x00a4,
+    LXB_TAG_SELECTEDCONTENT     = 0x00a5,
+    LXB_TAG_SLOT                = 0x00a6,
+    LXB_TAG_SMALL               = 0x00a7,
+    LXB_TAG_SOURCE              = 0x00a8,
+    LXB_TAG_SPACER              = 0x00a9,
+    LXB_TAG_SPAN                = 0x00aa,
+    LXB_TAG_STRIKE              = 0x00ab,
+    LXB_TAG_STRONG              = 0x00ac,
+    LXB_TAG_STYLE               = 0x00ad,
+    LXB_TAG_SUB                 = 0x00ae,
+    LXB_TAG_SUMMARY             = 0x00af,
+    LXB_TAG_SUP                 = 0x00b0,
+    LXB_TAG_SVG                 = 0x00b1,
+    LXB_TAG_TABLE               = 0x00b2,
+    LXB_TAG_TBODY               = 0x00b3,
+    LXB_TAG_TD                  = 0x00b4,
+    LXB_TAG_TEMPLATE            = 0x00b5,
+    LXB_TAG_TEXTAREA            = 0x00b6,
+    LXB_TAG_TEXTPATH            = 0x00b7,
+    LXB_TAG_TFOOT               = 0x00b8,
+    LXB_TAG_TH                  = 0x00b9,
+    LXB_TAG_THEAD               = 0x00ba,
+    LXB_TAG_TIME                = 0x00bb,
+    LXB_TAG_TITLE               = 0x00bc,
+    LXB_TAG_TR                  = 0x00bd,
+    LXB_TAG_TRACK               = 0x00be,
+    LXB_TAG_TT                  = 0x00bf,
+    LXB_TAG_U                   = 0x00c0,
+    LXB_TAG_UL                  = 0x00c1,
+    LXB_TAG_VAR                 = 0x00c2,
+    LXB_TAG_VIDEO               = 0x00c3,
+    LXB_TAG_WBR                 = 0x00c4,
+    LXB_TAG_XMP                 = 0x00c5,
+    LXB_TAG__LAST_ENTRY         = 0x00c6
 }
 lxb_tag_id_enum_t;
 
diff --git a/ext/lexbor/lexbor/tag/res.h b/ext/lexbor/lexbor/tag/res.h
index 4ad1f37e034e..5672d4a5a5f2 100644
--- a/ext/lexbor/lexbor/tag/res.h
+++ b/ext/lexbor/lexbor/tag/res.h
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2018 Alexander Borisov
+ * Copyright (C) 2018-2026 Alexander Borisov
  *
  * Author: Alexander Borisov 
  */
@@ -17,9 +17,9 @@
 #endif /* LXB_TAG_RES_H */
 
 #ifdef LXB_TAG_CONST_VERSION
-#ifndef LXB_TAG_CONST_VERSION_A161EC911182C3254E7A972D5C51DF86
+#ifndef LXB_TAG_CONST_VERSION_5AB3094FB370521074947DC082575715
 #error Mismatched tags version! See "lexbor/tag/const.h".
-#endif /* LXB_TAG_CONST_VERSION_A161EC911182C3254E7A972D5C51DF86 */
+#endif /* LXB_TAG_CONST_VERSION_5AB3094FB370521074947DC082575715 */
 #else
 #error You need to include "lexbor/tag/const.h".
 #endif /* LXB_TAG_CONST_VERSION */
@@ -188,8 +188,10 @@ static const lxb_tag_data_t lxb_tag_res_data_default[LXB_TAG__LAST_ENTRY] =
     {{.u.short_str = "s", .length = 1, .next = NULL}, LXB_TAG_S, 1, true},
     {{.u.short_str = "samp", .length = 4, .next = NULL}, LXB_TAG_SAMP, 1, true},
     {{.u.short_str = "script", .length = 6, .next = NULL}, LXB_TAG_SCRIPT, 1, true},
+    {{.u.short_str = "search", .length = 6, .next = NULL}, LXB_TAG_SEARCH, 1, true},
     {{.u.short_str = "section", .length = 7, .next = NULL}, LXB_TAG_SECTION, 1, true},
     {{.u.short_str = "select", .length = 6, .next = NULL}, LXB_TAG_SELECT, 1, true},
+    {{.u.short_str = "selectedcontent", .length = 15, .next = NULL}, LXB_TAG_SELECTEDCONTENT, 1, true},
     {{.u.short_str = "slot", .length = 4, .next = NULL}, LXB_TAG_SLOT, 1, true},
     {{.u.short_str = "small", .length = 5, .next = NULL}, LXB_TAG_SMALL, 1, true},
     {{.u.short_str = "source", .length = 6, .next = NULL}, LXB_TAG_SOURCE, 1, true},
@@ -389,8 +391,10 @@ static const lxb_tag_data_t lxb_tag_res_data_upper_default[LXB_TAG__LAST_ENTRY]
     {{.u.short_str = "S", .length = 1, .next = NULL}, LXB_TAG_S, 1, true},
     {{.u.short_str = "SAMP", .length = 4, .next = NULL}, LXB_TAG_SAMP, 1, true},
     {{.u.short_str = "SCRIPT", .length = 6, .next = NULL}, LXB_TAG_SCRIPT, 1, true},
+    {{.u.short_str = "SEARCH", .length = 6, .next = NULL}, LXB_TAG_SEARCH, 1, true},
     {{.u.short_str = "SECTION", .length = 7, .next = NULL}, LXB_TAG_SECTION, 1, true},
     {{.u.short_str = "SELECT", .length = 6, .next = NULL}, LXB_TAG_SELECT, 1, true},
+    {{.u.short_str = "SELECTEDCONTENT", .length = 15, .next = NULL}, LXB_TAG_SELECTEDCONTENT, 1, true},
     {{.u.short_str = "SLOT", .length = 4, .next = NULL}, LXB_TAG_SLOT, 1, true},
     {{.u.short_str = "SMALL", .length = 5, .next = NULL}, LXB_TAG_SMALL, 1, true},
     {{.u.short_str = "SOURCE", .length = 6, .next = NULL}, LXB_TAG_SOURCE, 1, true},
@@ -426,81 +430,81 @@ static const lxb_tag_data_t lxb_tag_res_data_upper_default[LXB_TAG__LAST_ENTRY]
 };
 #endif
 
-static const lexbor_shs_entry_t lxb_tag_res_shs_data_default[] = 
+static const lexbor_shs_entry_t lxb_tag_res_shs_data_default[263] = 
 {
     {NULL, NULL, 262, 0}, {"radialgradient", (void *) &lxb_tag_res_data_default[153], 14, 0}, 
     {"fecomponenttransfer", (void *) &lxb_tag_res_data_default[58], 19, 0}, {"abbr", (void *) &lxb_tag_res_data_default[7], 4, 1}, 
     {"feflood", (void *) &lxb_tag_res_data_default[65], 7, 0}, {"marquee", (void *) &lxb_tag_res_data_default[121], 7, 0}, 
     {"feblend", (void *) &lxb_tag_res_data_default[56], 7, 4}, {"optgroup", (void *) &lxb_tag_res_data_default[142], 8, 0}, 
-    {"video", (void *) &lxb_tag_res_data_default[193], 5, 10}, {"u", (void *) &lxb_tag_res_data_default[190], 1, 0}, 
+    {"video", (void *) &lxb_tag_res_data_default[195], 5, 10}, {"u", (void *) &lxb_tag_res_data_default[192], 1, 0}, 
     {"iframe", (void *) &lxb_tag_res_data_default[103], 6, 0}, {"animatecolor", (void *) &lxb_tag_res_data_default[13], 12, 0}, 
     {"output", (void *) &lxb_tag_res_data_default[144], 6, 0}, {"figcaption", (void *) &lxb_tag_res_data_default[82], 10, 0}, 
     {"mglyph", (void *) &lxb_tag_res_data_default[127], 6, 0}, {"!--", (void *) &lxb_tag_res_data_default[4], 3, 0}, 
     {"fefuncg", (void *) &lxb_tag_res_data_default[68], 7, 0}, {"aside", (void *) &lxb_tag_res_data_default[20], 5, 0}, 
-    {"style", (void *) &lxb_tag_res_data_default[171], 5, 0}, {"strike", (void *) &lxb_tag_res_data_default[169], 6, 0}, 
+    {"style", (void *) &lxb_tag_res_data_default[173], 5, 0}, {"strike", (void *) &lxb_tag_res_data_default[171], 6, 0}, 
     {"header", (void *) &lxb_tag_res_data_default[98], 6, 0}, {"glyphref", (void *) &lxb_tag_res_data_default[90], 8, 23}, 
     {"label", (void *) &lxb_tag_res_data_default[111], 5, 0}, {"feconvolvematrix", (void *) &lxb_tag_res_data_default[60], 16, 0}, 
-    {"altglyphdef", (void *) &lxb_tag_res_data_default[11], 11, 0}, {"title", (void *) &lxb_tag_res_data_default[186], 5, 0}, 
+    {"altglyphdef", (void *) &lxb_tag_res_data_default[11], 11, 0}, {"title", (void *) &lxb_tag_res_data_default[188], 5, 0}, 
     {"head", (void *) &lxb_tag_res_data_default[97], 4, 0}, {"noframes", (void *) &lxb_tag_res_data_default[138], 8, 0}, 
     {"code", (void *) &lxb_tag_res_data_default[39], 4, 30}, {"rb", (void *) &lxb_tag_res_data_default[154], 2, 5}, 
     {"blink", (void *) &lxb_tag_res_data_default[29], 5, 0}, {"image", (void *) &lxb_tag_res_data_default[104], 5, 0}, 
     {"col", (void *) &lxb_tag_res_data_default[40], 3, 8}, {"object", (void *) &lxb_tag_res_data_default[140], 6, 12}, 
-    {"template", (void *) &lxb_tag_res_data_default[179], 8, 36}, {"h2", (void *) &lxb_tag_res_data_default[92], 2, 13}, 
+    {"template", (void *) &lxb_tag_res_data_default[181], 8, 36}, {"h2", (void *) &lxb_tag_res_data_default[92], 2, 13}, 
     {"lineargradient", (void *) &lxb_tag_res_data_default[114], 14, 0}, {"math", (void *) &lxb_tag_res_data_default[122], 4, 0}, 
     {"base", (void *) &lxb_tag_res_data_default[23], 4, 45}, {"dl", (void *) &lxb_tag_res_data_default[52], 2, 14}, 
-    {"del", (void *) &lxb_tag_res_data_default[45], 3, 16}, {"svg", (void *) &lxb_tag_res_data_default[175], 3, 17}, 
+    {"del", (void *) &lxb_tag_res_data_default[45], 3, 16}, {"svg", (void *) &lxb_tag_res_data_default[177], 3, 17}, 
     {"dir", (void *) &lxb_tag_res_data_default[50], 3, 0}, {"article", (void *) &lxb_tag_res_data_default[19], 7, 0}, 
-    {"strong", (void *) &lxb_tag_res_data_default[170], 6, 0}, {"dialog", (void *) &lxb_tag_res_data_default[49], 6, 0}, 
-    {"details", (void *) &lxb_tag_res_data_default[47], 7, 0}, {"textpath", (void *) &lxb_tag_res_data_default[181], 8, 52}, 
+    {"strong", (void *) &lxb_tag_res_data_default[172], 6, 0}, {"dialog", (void *) &lxb_tag_res_data_default[49], 6, 0}, 
+    {"details", (void *) &lxb_tag_res_data_default[47], 7, 0}, {"textpath", (void *) &lxb_tag_res_data_default[183], 8, 52}, 
     {"mark", (void *) &lxb_tag_res_data_default[120], 4, 0}, {"basefont", (void *) &lxb_tag_res_data_default[24], 8, 0}, 
     {"fediffuselighting", (void *) &lxb_tag_res_data_default[61], 17, 0}, {"fespecularlighting", (void *) &lxb_tag_res_data_default[77], 18, 0}, 
     {"blockquote", (void *) &lxb_tag_res_data_default[30], 10, 0}, {"script", (void *) &lxb_tag_res_data_default[161], 6, 58}, 
     {"malignmark", (void *) &lxb_tag_res_data_default[118], 10, 0}, {"hr", (void *) &lxb_tag_res_data_default[100], 2, 18}, 
-    {"source", (void *) &lxb_tag_res_data_default[166], 6, 19}, {"mn", (void *) &lxb_tag_res_data_default[129], 2, 0}, 
-    {"select", (void *) &lxb_tag_res_data_default[163], 6, 0}, {"main", (void *) &lxb_tag_res_data_default[117], 4, 20}, 
+    {"source", (void *) &lxb_tag_res_data_default[168], 6, 19}, {"mn", (void *) &lxb_tag_res_data_default[129], 2, 0}, 
+    {"select", (void *) &lxb_tag_res_data_default[164], 6, 0}, {"main", (void *) &lxb_tag_res_data_default[117], 4, 20}, 
     {"fieldset", (void *) &lxb_tag_res_data_default[81], 8, 62}, {"ins", (void *) &lxb_tag_res_data_default[107], 3, 0}, 
     {"frameset", (void *) &lxb_tag_res_data_default[89], 8, 0}, {"button", (void *) &lxb_tag_res_data_default[33], 6, 0}, 
     {"fecolormatrix", (void *) &lxb_tag_res_data_default[57], 13, 0}, {"q", (void *) &lxb_tag_res_data_default[152], 1, 0}, 
-    {"animatemotion", (void *) &lxb_tag_res_data_default[14], 13, 0}, {"time", (void *) &lxb_tag_res_data_default[185], 4, 21}, 
-    {"table", (void *) &lxb_tag_res_data_default[176], 5, 25}, {"h6", (void *) &lxb_tag_res_data_default[96], 2, 26}, 
+    {"animatemotion", (void *) &lxb_tag_res_data_default[14], 13, 0}, {"time", (void *) &lxb_tag_res_data_default[187], 4, 21}, 
+    {"table", (void *) &lxb_tag_res_data_default[178], 5, 25}, {"h6", (void *) &lxb_tag_res_data_default[96], 2, 26}, 
     {"cite", (void *) &lxb_tag_res_data_default[37], 4, 28}, {"img", (void *) &lxb_tag_res_data_default[105], 3, 34}, 
     {"fepointlight", (void *) &lxb_tag_res_data_default[76], 12, 0}, {"audio", (void *) &lxb_tag_res_data_default[21], 5, 0}, 
     {"#end-of-file", (void *) &lxb_tag_res_data_default[1], 12, 0}, {"noscript", (void *) &lxb_tag_res_data_default[139], 8, 0}, 
-    {"foreignobject", (void *) &lxb_tag_res_data_default[86], 13, 0}, {"spacer", (void *) &lxb_tag_res_data_default[167], 6, 0}, 
-    {"samp", (void *) &lxb_tag_res_data_default[160], 4, 0}, {"altglyphitem", (void *) &lxb_tag_res_data_default[12], 12, 0}, 
-    {"dt", (void *) &lxb_tag_res_data_default[53], 2, 0}, {"data", (void *) &lxb_tag_res_data_default[42], 4, 0}, 
+    {"foreignobject", (void *) &lxb_tag_res_data_default[86], 13, 77}, {"selectedcontent", (void *) &lxb_tag_res_data_default[165], 15, 0}, 
+    {"spacer", (void *) &lxb_tag_res_data_default[169], 6, 0}, {"samp", (void *) &lxb_tag_res_data_default[160], 4, 0}, 
+    {"altglyphitem", (void *) &lxb_tag_res_data_default[12], 12, 0}, {"data", (void *) &lxb_tag_res_data_default[42], 4, 0}, 
     {"mtext", (void *) &lxb_tag_res_data_default[132], 5, 0}, {"path", (void *) &lxb_tag_res_data_default[147], 4, 0}, 
-    {"input", (void *) &lxb_tag_res_data_default[106], 5, 0}, {"th", (void *) &lxb_tag_res_data_default[183], 2, 38}, 
-    {"p", (void *) &lxb_tag_res_data_default[145], 1, 0}, {"animatetransform", (void *) &lxb_tag_res_data_default[15], 16, 0}, 
-    {"datalist", (void *) &lxb_tag_res_data_default[43], 8, 0}, {"small", (void *) &lxb_tag_res_data_default[165], 5, 0}, 
+    {"input", (void *) &lxb_tag_res_data_default[106], 5, 0}, {"th", (void *) &lxb_tag_res_data_default[185], 2, 38}, 
+    {"p", (void *) &lxb_tag_res_data_default[145], 1, 0}, {"dt", (void *) &lxb_tag_res_data_default[53], 2, 0}, 
+    {"animatetransform", (void *) &lxb_tag_res_data_default[15], 16, 0}, {"datalist", (void *) &lxb_tag_res_data_default[43], 8, 0}, 
     {"b", (void *) &lxb_tag_res_data_default[22], 1, 46}, {"nextid", (void *) &lxb_tag_res_data_default[135], 6, 47}, 
-    {"noembed", (void *) &lxb_tag_res_data_default[137], 7, 0}, {"nav", (void *) &lxb_tag_res_data_default[134], 3, 0}, 
-    {"bgsound", (void *) &lxb_tag_res_data_default[27], 7, 0}, {"slot", (void *) &lxb_tag_res_data_default[164], 4, 0}, 
-    {"param", (void *) &lxb_tag_res_data_default[146], 5, 0}, {"font", (void *) &lxb_tag_res_data_default[84], 4, 53}, 
-    {"figure", (void *) &lxb_tag_res_data_default[83], 6, 0}, {"femerge", (void *) &lxb_tag_res_data_default[72], 7, 0}, 
-    {"femergenode", (void *) &lxb_tag_res_data_default[73], 11, 0}, {"feoffset", (void *) &lxb_tag_res_data_default[75], 8, 60}, 
-    {"#text", (void *) &lxb_tag_res_data_default[2], 5, 0}, {"ul", (void *) &lxb_tag_res_data_default[191], 2, 0}, 
+    {"noembed", (void *) &lxb_tag_res_data_default[137], 7, 0}, {"small", (void *) &lxb_tag_res_data_default[167], 5, 0}, 
+    {"nav", (void *) &lxb_tag_res_data_default[134], 3, 0}, {"slot", (void *) &lxb_tag_res_data_default[166], 4, 0}, 
+    {"search", (void *) &lxb_tag_res_data_default[162], 6, 0}, {"font", (void *) &lxb_tag_res_data_default[84], 4, 53}, 
+    {"bgsound", (void *) &lxb_tag_res_data_default[27], 7, 0}, {"param", (void *) &lxb_tag_res_data_default[146], 5, 0}, 
+    {"figure", (void *) &lxb_tag_res_data_default[83], 6, 0}, {"feoffset", (void *) &lxb_tag_res_data_default[75], 8, 60}, 
+    {"#text", (void *) &lxb_tag_res_data_default[2], 5, 0}, {"femerge", (void *) &lxb_tag_res_data_default[72], 7, 0}, 
     {"fespotlight", (void *) &lxb_tag_res_data_default[78], 11, 66}, {"form", (void *) &lxb_tag_res_data_default[87], 4, 72}, 
     {"#document", (void *) &lxb_tag_res_data_default[3], 9, 76}, {"fedistantlight", (void *) &lxb_tag_res_data_default[63], 14, 0}, 
-    {"track", (void *) &lxb_tag_res_data_default[188], 5, 0}, {"h3", (void *) &lxb_tag_res_data_default[93], 2, 77}, 
-    {"h1", (void *) &lxb_tag_res_data_default[91], 2, 0}, {"i", (void *) &lxb_tag_res_data_default[102], 1, 0}, 
-    {"altglyph", (void *) &lxb_tag_res_data_default[10], 8, 0}, {"legend", (void *) &lxb_tag_res_data_default[112], 6, 115}, 
-    {"tbody", (void *) &lxb_tag_res_data_default[177], 5, 0}, {"address", (void *) &lxb_tag_res_data_default[9], 7, 0}, 
-    {"caption", (void *) &lxb_tag_res_data_default[35], 7, 0}, {"option", (void *) &lxb_tag_res_data_default[143], 6, 0}, 
-    {"sup", (void *) &lxb_tag_res_data_default[174], 3, 0}, {"body", (void *) &lxb_tag_res_data_default[31], 4, 78}, 
-    {"progress", (void *) &lxb_tag_res_data_default[151], 8, 122}, {"acronym", (void *) &lxb_tag_res_data_default[8], 7, 0}, 
+    {"track", (void *) &lxb_tag_res_data_default[190], 5, 0}, {"h3", (void *) &lxb_tag_res_data_default[93], 2, 78}, 
+    {"femergenode", (void *) &lxb_tag_res_data_default[73], 11, 0}, {"i", (void *) &lxb_tag_res_data_default[102], 1, 0}, 
+    {"ul", (void *) &lxb_tag_res_data_default[193], 2, 0}, {"h1", (void *) &lxb_tag_res_data_default[91], 2, 0}, 
+    {"tbody", (void *) &lxb_tag_res_data_default[179], 5, 0}, {"altglyph", (void *) &lxb_tag_res_data_default[10], 8, 0}, 
+    {"legend", (void *) &lxb_tag_res_data_default[112], 6, 117}, {"address", (void *) &lxb_tag_res_data_default[9], 7, 0}, 
+    {"sup", (void *) &lxb_tag_res_data_default[176], 3, 0}, {"body", (void *) &lxb_tag_res_data_default[31], 4, 79}, 
+    {"caption", (void *) &lxb_tag_res_data_default[35], 7, 0}, {"acronym", (void *) &lxb_tag_res_data_default[8], 7, 0}, 
+    {"option", (void *) &lxb_tag_res_data_default[143], 6, 0}, {"progress", (void *) &lxb_tag_res_data_default[151], 8, 124}, 
     {"fegaussianblur", (void *) &lxb_tag_res_data_default[70], 14, 0}, {NULL, NULL, 0, 0}, 
-    {NULL, NULL, 0, 0}, {NULL, NULL, 0, 0}, 
-    {"mi", (void *) &lxb_tag_res_data_default[128], 2, 79}, {NULL, NULL, 0, 0}, 
-    {"dfn", (void *) &lxb_tag_res_data_default[48], 3, 0}, {"a", (void *) &lxb_tag_res_data_default[6], 1, 80}, 
-    {"listing", (void *) &lxb_tag_res_data_default[116], 7, 87}, {"span", (void *) &lxb_tag_res_data_default[168], 4, 0}, 
+    {"mi", (void *) &lxb_tag_res_data_default[128], 2, 80}, {NULL, NULL, 0, 0}, 
+    {"dfn", (void *) &lxb_tag_res_data_default[48], 3, 0}, {"a", (void *) &lxb_tag_res_data_default[6], 1, 87}, 
+    {"listing", (void *) &lxb_tag_res_data_default[116], 7, 88}, {"span", (void *) &lxb_tag_res_data_default[170], 4, 0}, 
     {"area", (void *) &lxb_tag_res_data_default[18], 4, 0}, {"clippath", (void *) &lxb_tag_res_data_default[38], 8, 0}, 
-    {"section", (void *) &lxb_tag_res_data_default[162], 7, 0}, {"li", (void *) &lxb_tag_res_data_default[113], 2, 88}, 
+    {"section", (void *) &lxb_tag_res_data_default[163], 7, 0}, {"li", (void *) &lxb_tag_res_data_default[113], 2, 89}, 
     {NULL, NULL, 0, 0}, {"html", (void *) &lxb_tag_res_data_default[101], 4, 0}, 
     {NULL, NULL, 0, 0}, {"fedropshadow", (void *) &lxb_tag_res_data_default[64], 12, 0}, 
     {"embed", (void *) &lxb_tag_res_data_default[55], 5, 0}, {NULL, NULL, 0, 0}, 
     {NULL, NULL, 0, 0}, {"multicol", (void *) &lxb_tag_res_data_default[133], 8, 0}, 
-    {"var", (void *) &lxb_tag_res_data_default[192], 3, 89}, {"rp", (void *) &lxb_tag_res_data_default[155], 2, 0}, 
+    {"var", (void *) &lxb_tag_res_data_default[194], 3, 93}, {"rp", (void *) &lxb_tag_res_data_default[155], 2, 0}, 
     {NULL, NULL, 0, 0}, {"link", (void *) &lxb_tag_res_data_default[115], 4, 0}, 
     {"mo", (void *) &lxb_tag_res_data_default[130], 2, 0}, {NULL, NULL, 0, 0}, 
     {NULL, NULL, 0, 0}, {"annotation-xml", (void *) &lxb_tag_res_data_default[16], 14, 0}, 
@@ -510,54 +514,54 @@ static const lexbor_shs_entry_t lxb_tag_res_shs_data_default[] =
     {"fefuncb", (void *) &lxb_tag_res_data_default[67], 7, 0}, {NULL, NULL, 0, 0}, 
     {NULL, NULL, 0, 0}, {NULL, NULL, 0, 0}, 
     {"meter", (void *) &lxb_tag_res_data_default[125], 5, 0}, {NULL, NULL, 0, 0}, 
-    {NULL, NULL, 0, 0}, {"tt", (void *) &lxb_tag_res_data_default[189], 2, 0}, 
-    {"big", (void *) &lxb_tag_res_data_default[28], 3, 93}, {NULL, NULL, 0, 0}, 
-    {"tfoot", (void *) &lxb_tag_res_data_default[182], 5, 0}, {"desc", (void *) &lxb_tag_res_data_default[46], 4, 0}, 
+    {NULL, NULL, 0, 0}, {"tt", (void *) &lxb_tag_res_data_default[191], 2, 0}, 
+    {"big", (void *) &lxb_tag_res_data_default[28], 3, 94}, {NULL, NULL, 0, 0}, 
+    {"tfoot", (void *) &lxb_tag_res_data_default[184], 5, 0}, {"desc", (void *) &lxb_tag_res_data_default[46], 4, 96}, 
     {"isindex", (void *) &lxb_tag_res_data_default[108], 7, 0}, {NULL, NULL, 0, 0}, 
     {"menu", (void *) &lxb_tag_res_data_default[123], 4, 0}, {"hgroup", (void *) &lxb_tag_res_data_default[99], 6, 0}, 
     {NULL, NULL, 0, 0}, {NULL, NULL, 0, 0}, 
-    {"wbr", (void *) &lxb_tag_res_data_default[194], 3, 0}, {NULL, NULL, 0, 0}, 
-    {"pre", (void *) &lxb_tag_res_data_default[150], 3, 94}, {NULL, NULL, 0, 0}, 
+    {"wbr", (void *) &lxb_tag_res_data_default[196], 3, 0}, {NULL, NULL, 0, 0}, 
+    {"pre", (void *) &lxb_tag_res_data_default[150], 3, 98}, {NULL, NULL, 0, 0}, 
     {NULL, NULL, 0, 0}, {NULL, NULL, 0, 0}, 
     {"picture", (void *) &lxb_tag_res_data_default[148], 7, 0}, {"h4", (void *) &lxb_tag_res_data_default[94], 2, 0}, 
     {NULL, NULL, 0, 0}, {NULL, NULL, 0, 0}, 
-    {"meta", (void *) &lxb_tag_res_data_default[124], 4, 96}, {NULL, NULL, 0, 0}, 
+    {"meta", (void *) &lxb_tag_res_data_default[124], 4, 99}, {NULL, NULL, 0, 0}, 
     {"rtc", (void *) &lxb_tag_res_data_default[157], 3, 0}, {NULL, NULL, 0, 0}, 
-    {"frame", (void *) &lxb_tag_res_data_default[88], 5, 0}, {"fetile", (void *) &lxb_tag_res_data_default[79], 6, 98}, 
-    {"feimage", (void *) &lxb_tag_res_data_default[71], 7, 99}, {NULL, NULL, 0, 0}, 
-    {"xmp", (void *) &lxb_tag_res_data_default[195], 3, 0}, {NULL, NULL, 0, 0}, 
-    {"fecomposite", (void *) &lxb_tag_res_data_default[59], 11, 100}, {"feturbulence", (void *) &lxb_tag_res_data_default[80], 12, 0}, 
-    {NULL, NULL, 0, 0}, {"summary", (void *) &lxb_tag_res_data_default[173], 7, 0}, 
+    {"frame", (void *) &lxb_tag_res_data_default[88], 5, 0}, {"fetile", (void *) &lxb_tag_res_data_default[79], 6, 100}, 
+    {"feimage", (void *) &lxb_tag_res_data_default[71], 7, 103}, {NULL, NULL, 0, 0}, 
+    {"xmp", (void *) &lxb_tag_res_data_default[197], 3, 0}, {NULL, NULL, 0, 0}, 
+    {"fecomposite", (void *) &lxb_tag_res_data_default[59], 11, 110}, {"feturbulence", (void *) &lxb_tag_res_data_default[80], 12, 0}, 
+    {NULL, NULL, 0, 0}, {"summary", (void *) &lxb_tag_res_data_default[175], 7, 0}, 
     {"mfenced", (void *) &lxb_tag_res_data_default[126], 7, 0}, {NULL, NULL, 0, 0}, 
-    {"sub", (void *) &lxb_tag_res_data_default[172], 3, 0}, {"colgroup", (void *) &lxb_tag_res_data_default[41], 8, 0}, 
+    {"sub", (void *) &lxb_tag_res_data_default[174], 3, 0}, {"colgroup", (void *) &lxb_tag_res_data_default[41], 8, 0}, 
     {NULL, NULL, 0, 0}, {NULL, NULL, 0, 0}, 
     {NULL, NULL, 0, 0}, {NULL, NULL, 0, 0}, 
     {NULL, NULL, 0, 0}, {NULL, NULL, 0, 0}, 
-    {NULL, NULL, 0, 0}, {"dd", (void *) &lxb_tag_res_data_default[44], 2, 103}, 
+    {NULL, NULL, 0, 0}, {"dd", (void *) &lxb_tag_res_data_default[44], 2, 112}, 
     {NULL, NULL, 0, 0}, {NULL, NULL, 0, 0}, 
     {NULL, NULL, 0, 0}, {NULL, NULL, 0, 0}, 
     {NULL, NULL, 0, 0}, {NULL, NULL, 0, 0}, 
-    {"div", (void *) &lxb_tag_res_data_default[51], 3, 0}, {"textarea", (void *) &lxb_tag_res_data_default[180], 8, 0}, 
+    {"div", (void *) &lxb_tag_res_data_default[51], 3, 0}, {"textarea", (void *) &lxb_tag_res_data_default[182], 8, 0}, 
     {"!doctype", (void *) &lxb_tag_res_data_default[5], 8, 0}, {"applet", (void *) &lxb_tag_res_data_default[17], 6, 0}, 
-    {NULL, NULL, 0, 0}, {"br", (void *) &lxb_tag_res_data_default[32], 2, 110}, 
+    {NULL, NULL, 0, 0}, {"br", (void *) &lxb_tag_res_data_default[32], 2, 113}, 
     {NULL, NULL, 0, 0}, {"keygen", (void *) &lxb_tag_res_data_default[110], 6, 0}, 
     {"kbd", (void *) &lxb_tag_res_data_default[109], 3, 0}, {NULL, NULL, 0, 0}, 
     {"plaintext", (void *) &lxb_tag_res_data_default[149], 9, 0}, {"s", (void *) &lxb_tag_res_data_default[159], 1, 0}, 
     {NULL, NULL, 0, 0}, {NULL, NULL, 0, 0}, 
-    {"bdo", (void *) &lxb_tag_res_data_default[26], 3, 0}, {"td", (void *) &lxb_tag_res_data_default[178], 2, 0}, 
+    {"bdo", (void *) &lxb_tag_res_data_default[26], 3, 0}, {"td", (void *) &lxb_tag_res_data_default[180], 2, 0}, 
     {"fefunca", (void *) &lxb_tag_res_data_default[66], 7, 0}, {"ol", (void *) &lxb_tag_res_data_default[141], 2, 0}, 
-    {"thead", (void *) &lxb_tag_res_data_default[184], 5, 0}, {"nobr", (void *) &lxb_tag_res_data_default[136], 4, 112}, 
-    {NULL, NULL, 0, 0}, {"tr", (void *) &lxb_tag_res_data_default[187], 2, 0}, 
+    {"thead", (void *) &lxb_tag_res_data_default[186], 5, 0}, {"nobr", (void *) &lxb_tag_res_data_default[136], 4, 115}, 
+    {NULL, NULL, 0, 0}, {"tr", (void *) &lxb_tag_res_data_default[189], 2, 0}, 
     {"map", (void *) &lxb_tag_res_data_default[119], 3, 0}, {NULL, NULL, 0, 0}, 
     {NULL, NULL, 0, 0}, {NULL, NULL, 0, 0}, 
-    {NULL, NULL, 0, 0}, {"#undef", (void *) &lxb_tag_res_data_default[0], 6, 113}, 
+    {NULL, NULL, 0, 0}, {"#undef", (void *) &lxb_tag_res_data_default[0], 6, 116}, 
     {"em", (void *) &lxb_tag_res_data_default[54], 2, 0}, {NULL, NULL, 0, 0}, 
     {"bdi", (void *) &lxb_tag_res_data_default[25], 3, 0}, {"femorphology", (void *) &lxb_tag_res_data_default[74], 12, 0}, 
-    {"ms", (void *) &lxb_tag_res_data_default[131], 2, 116}, {"footer", (void *) &lxb_tag_res_data_default[85], 6, 0}, 
-    {"fefuncr", (void *) &lxb_tag_res_data_default[69], 7, 0}, {"rt", (void *) &lxb_tag_res_data_default[156], 2, 117}, 
+    {"ms", (void *) &lxb_tag_res_data_default[131], 2, 120}, {"footer", (void *) &lxb_tag_res_data_default[85], 6, 0}, 
+    {"fefuncr", (void *) &lxb_tag_res_data_default[69], 7, 0}, {"rt", (void *) &lxb_tag_res_data_default[156], 2, 122}, 
     {NULL, NULL, 0, 0}, {NULL, NULL, 0, 0}, 
     {NULL, NULL, 0, 0}, {"h5", (void *) &lxb_tag_res_data_default[95], 2, 0}, 
-    {NULL, NULL, 0, 0}, {"ruby", (void *) &lxb_tag_res_data_default[158], 4, 120}, 
+    {NULL, NULL, 0, 0}, {"ruby", (void *) &lxb_tag_res_data_default[158], 4, 123}, 
     {"canvas", (void *) &lxb_tag_res_data_default[34], 6, 0}, {NULL, NULL, 0, 0}, 
     {NULL, NULL, 0, 0}
 };
diff --git a/ext/lexbor/lexbor/unicode/base.h b/ext/lexbor/lexbor/unicode/base.h
index 4797b563c335..3ca2b6b2d8fb 100644
--- a/ext/lexbor/lexbor/unicode/base.h
+++ b/ext/lexbor/lexbor/unicode/base.h
@@ -16,7 +16,7 @@ extern "C" {
 
 
 #define LXB_UNICODE_VERSION_MAJOR 0
-#define LXB_UNICODE_VERSION_MINOR 3
+#define LXB_UNICODE_VERSION_MINOR 4
 #define LXB_UNICODE_VERSION_PATCH 0
 
 #define LXB_UNICODE_VERSION_STRING LEXBOR_STRINGIZE(LXB_UNICODE_VERSION_MAJOR) "." \
diff --git a/ext/lexbor/lexbor/unicode/res.h b/ext/lexbor/lexbor/unicode/res.h
index 9948cc6be1a7..cd5c2c7a1d8a 100644
--- a/ext/lexbor/lexbor/unicode/res.h
+++ b/ext/lexbor/lexbor/unicode/res.h
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2024 Alexander Borisov
+ * Copyright (C) 2025 Alexander Borisov
  *
  * Author: Alexander Borisov 
  */
@@ -2212,7 +2212,7 @@ static const uint16_t lxb_unicode_table_map_0_57345[57345] =
     1, /* 088C (2188) */
     1, /* 088D (2189) */
     1, /* 088E (2190) */
-    56, /* 088F (2191) */
+    1, /* 088F (2191) */
     56, /* 0890 (2192) */
     56, /* 0891 (2193) */
     56, /* 0892 (2194) */
@@ -3185,7 +3185,7 @@ static const uint16_t lxb_unicode_table_map_0_57345[57345] =
     1, /* 0C59 (3161) */
     1, /* 0C5A (3162) */
     56, /* 0C5B (3163) */
-    56, /* 0C5C (3164) */
+    1, /* 0C5C (3164) */
     1, /* 0C5D (3165) */
     56, /* 0C5E (3166) */
     56, /* 0C5F (3167) */
@@ -3313,7 +3313,7 @@ static const uint16_t lxb_unicode_table_map_0_57345[57345] =
     56, /* 0CD9 (3289) */
     56, /* 0CDA (3290) */
     56, /* 0CDB (3291) */
-    56, /* 0CDC (3292) */
+    1, /* 0CDC (3292) */
     1, /* 0CDD (3293) */
     1, /* 0CDE (3294) */
     56, /* 0CDF (3295) */
@@ -6884,35 +6884,35 @@ static const uint16_t lxb_unicode_table_map_0_57345[57345] =
     431, /* 1ACC (6860) */
     431, /* 1ACD (6861) */
     431, /* 1ACE (6862) */
-    56, /* 1ACF (6863) */
-    56, /* 1AD0 (6864) */
-    56, /* 1AD1 (6865) */
-    56, /* 1AD2 (6866) */
-    56, /* 1AD3 (6867) */
-    56, /* 1AD4 (6868) */
-    56, /* 1AD5 (6869) */
-    56, /* 1AD6 (6870) */
-    56, /* 1AD7 (6871) */
-    56, /* 1AD8 (6872) */
-    56, /* 1AD9 (6873) */
-    56, /* 1ADA (6874) */
-    56, /* 1ADB (6875) */
-    56, /* 1ADC (6876) */
-    56, /* 1ADD (6877) */
+    431, /* 1ACF (6863) */
+    431, /* 1AD0 (6864) */
+    431, /* 1AD1 (6865) */
+    431, /* 1AD2 (6866) */
+    431, /* 1AD3 (6867) */
+    431, /* 1AD4 (6868) */
+    431, /* 1AD5 (6869) */
+    431, /* 1AD6 (6870) */
+    431, /* 1AD7 (6871) */
+    431, /* 1AD8 (6872) */
+    431, /* 1AD9 (6873) */
+    431, /* 1ADA (6874) */
+    431, /* 1ADB (6875) */
+    431, /* 1ADC (6876) */
+    433, /* 1ADD (6877) */
     56, /* 1ADE (6878) */
     56, /* 1ADF (6879) */
-    56, /* 1AE0 (6880) */
-    56, /* 1AE1 (6881) */
-    56, /* 1AE2 (6882) */
-    56, /* 1AE3 (6883) */
-    56, /* 1AE4 (6884) */
-    56, /* 1AE5 (6885) */
-    56, /* 1AE6 (6886) */
-    56, /* 1AE7 (6887) */
-    56, /* 1AE8 (6888) */
-    56, /* 1AE9 (6889) */
-    56, /* 1AEA (6890) */
-    56, /* 1AEB (6891) */
+    431, /* 1AE0 (6880) */
+    431, /* 1AE1 (6881) */
+    431, /* 1AE2 (6882) */
+    431, /* 1AE3 (6883) */
+    431, /* 1AE4 (6884) */
+    431, /* 1AE5 (6885) */
+    433, /* 1AE6 (6886) */
+    431, /* 1AE7 (6887) */
+    431, /* 1AE8 (6888) */
+    431, /* 1AE9 (6889) */
+    431, /* 1AEA (6890) */
+    446, /* 1AEB (6891) */
     56, /* 1AEC (6892) */
     56, /* 1AED (6893) */
     56, /* 1AEE (6894) */
@@ -8406,7 +8406,7 @@ static const uint16_t lxb_unicode_table_map_0_57345[57345] =
     1, /* 20BE (8382) */
     1, /* 20BF (8383) */
     1, /* 20C0 (8384) */
-    56, /* 20C1 (8385) */
+    1, /* 20C1 (8385) */
     56, /* 20C2 (8386) */
     56, /* 20C3 (8387) */
     56, /* 20C4 (8388) */
@@ -11179,7 +11179,7 @@ static const uint16_t lxb_unicode_table_map_0_57345[57345] =
     1, /* 2B93 (11155) */
     1, /* 2B94 (11156) */
     1, /* 2B95 (11157) */
-    56, /* 2B96 (11158) */
+    1, /* 2B96 (11158) */
     1, /* 2B97 (11159) */
     1, /* 2B98 (11160) */
     1, /* 2B99 (11161) */
@@ -42979,21 +42979,21 @@ static const uint16_t lxb_unicode_table_map_0_57345[57345] =
     3245, /* A7CB (42955) */
     3246, /* A7CC (42956) */
     1, /* A7CD (42957) */
-    56, /* A7CE (42958) */
-    56, /* A7CF (42959) */
-    3247, /* A7D0 (42960) */
+    3247, /* A7CE (42958) */
+    1, /* A7CF (42959) */
+    3248, /* A7D0 (42960) */
     1, /* A7D1 (42961) */
-    56, /* A7D2 (42962) */
+    3249, /* A7D2 (42962) */
     1, /* A7D3 (42963) */
-    56, /* A7D4 (42964) */
+    3250, /* A7D4 (42964) */
     1, /* A7D5 (42965) */
-    3248, /* A7D6 (42966) */
+    3251, /* A7D6 (42966) */
     1, /* A7D7 (42967) */
-    3249, /* A7D8 (42968) */
+    3252, /* A7D8 (42968) */
     1, /* A7D9 (42969) */
-    3250, /* A7DA (42970) */
+    3253, /* A7DA (42970) */
     1, /* A7DB (42971) */
-    3251, /* A7DC (42972) */
+    3254, /* A7DC (42972) */
     56, /* A7DD (42973) */
     56, /* A7DE (42974) */
     56, /* A7DF (42975) */
@@ -43014,15 +43014,15 @@ static const uint16_t lxb_unicode_table_map_0_57345[57345] =
     56, /* A7EE (42990) */
     56, /* A7EF (42991) */
     56, /* A7F0 (42992) */
-    56, /* A7F1 (42993) */
-    3252, /* A7F2 (42994) */
-    3253, /* A7F3 (42995) */
-    3254, /* A7F4 (42996) */
-    3255, /* A7F5 (42997) */
+    3255, /* A7F1 (42993) */
+    3256, /* A7F2 (42994) */
+    3257, /* A7F3 (42995) */
+    3258, /* A7F4 (42996) */
+    3259, /* A7F5 (42997) */
     1, /* A7F6 (42998) */
     1, /* A7F7 (42999) */
-    3256, /* A7F8 (43000) */
-    3257, /* A7F9 (43001) */
+    3260, /* A7F8 (43000) */
+    3261, /* A7F9 (43001) */
     1, /* A7FA (43002) */
     1, /* A7FB (43003) */
     1, /* A7FC (43004) */
@@ -43889,10 +43889,10 @@ static const uint16_t lxb_unicode_table_map_0_57345[57345] =
     1, /* AB59 (43865) */
     1, /* AB5A (43866) */
     1, /* AB5B (43867) */
-    3258, /* AB5C (43868) */
-    3259, /* AB5D (43869) */
-    3260, /* AB5E (43870) */
-    3261, /* AB5F (43871) */
+    3262, /* AB5C (43868) */
+    3263, /* AB5D (43869) */
+    3264, /* AB5E (43870) */
+    3265, /* AB5F (43871) */
     1, /* AB60 (43872) */
     1, /* AB61 (43873) */
     1, /* AB62 (43874) */
@@ -43902,93 +43902,93 @@ static const uint16_t lxb_unicode_table_map_0_57345[57345] =
     1, /* AB66 (43878) */
     1, /* AB67 (43879) */
     1, /* AB68 (43880) */
-    3262, /* AB69 (43881) */
+    3266, /* AB69 (43881) */
     1, /* AB6A (43882) */
     1, /* AB6B (43883) */
     56, /* AB6C (43884) */
     56, /* AB6D (43885) */
     56, /* AB6E (43886) */
     56, /* AB6F (43887) */
-    3263, /* AB70 (43888) */
-    3264, /* AB71 (43889) */
-    3265, /* AB72 (43890) */
-    3266, /* AB73 (43891) */
-    3267, /* AB74 (43892) */
-    3268, /* AB75 (43893) */
-    3269, /* AB76 (43894) */
-    3270, /* AB77 (43895) */
-    3271, /* AB78 (43896) */
-    3272, /* AB79 (43897) */
-    3273, /* AB7A (43898) */
-    3274, /* AB7B (43899) */
-    3275, /* AB7C (43900) */
-    3276, /* AB7D (43901) */
-    3277, /* AB7E (43902) */
-    3278, /* AB7F (43903) */
-    3279, /* AB80 (43904) */
-    3280, /* AB81 (43905) */
-    3281, /* AB82 (43906) */
-    3282, /* AB83 (43907) */
-    3283, /* AB84 (43908) */
-    3284, /* AB85 (43909) */
-    3285, /* AB86 (43910) */
-    3286, /* AB87 (43911) */
-    3287, /* AB88 (43912) */
-    3288, /* AB89 (43913) */
-    3289, /* AB8A (43914) */
-    3290, /* AB8B (43915) */
-    3291, /* AB8C (43916) */
-    3292, /* AB8D (43917) */
-    3293, /* AB8E (43918) */
-    3294, /* AB8F (43919) */
-    3295, /* AB90 (43920) */
-    3296, /* AB91 (43921) */
-    3297, /* AB92 (43922) */
-    3298, /* AB93 (43923) */
-    3299, /* AB94 (43924) */
-    3300, /* AB95 (43925) */
-    3301, /* AB96 (43926) */
-    3302, /* AB97 (43927) */
-    3303, /* AB98 (43928) */
-    3304, /* AB99 (43929) */
-    3305, /* AB9A (43930) */
-    3306, /* AB9B (43931) */
-    3307, /* AB9C (43932) */
-    3308, /* AB9D (43933) */
-    3309, /* AB9E (43934) */
-    3310, /* AB9F (43935) */
-    3311, /* ABA0 (43936) */
-    3312, /* ABA1 (43937) */
-    3313, /* ABA2 (43938) */
-    3314, /* ABA3 (43939) */
-    3315, /* ABA4 (43940) */
-    3316, /* ABA5 (43941) */
-    3317, /* ABA6 (43942) */
-    3318, /* ABA7 (43943) */
-    3319, /* ABA8 (43944) */
-    3320, /* ABA9 (43945) */
-    3321, /* ABAA (43946) */
-    3322, /* ABAB (43947) */
-    3323, /* ABAC (43948) */
-    3324, /* ABAD (43949) */
-    3325, /* ABAE (43950) */
-    3326, /* ABAF (43951) */
-    3327, /* ABB0 (43952) */
-    3328, /* ABB1 (43953) */
-    3329, /* ABB2 (43954) */
-    3330, /* ABB3 (43955) */
-    3331, /* ABB4 (43956) */
-    3332, /* ABB5 (43957) */
-    3333, /* ABB6 (43958) */
-    3334, /* ABB7 (43959) */
-    3335, /* ABB8 (43960) */
-    3336, /* ABB9 (43961) */
-    3337, /* ABBA (43962) */
-    3338, /* ABBB (43963) */
-    3339, /* ABBC (43964) */
-    3340, /* ABBD (43965) */
-    3341, /* ABBE (43966) */
-    3342, /* ABBF (43967) */
+    3267, /* AB70 (43888) */
+    3268, /* AB71 (43889) */
+    3269, /* AB72 (43890) */
+    3270, /* AB73 (43891) */
+    3271, /* AB74 (43892) */
+    3272, /* AB75 (43893) */
+    3273, /* AB76 (43894) */
+    3274, /* AB77 (43895) */
+    3275, /* AB78 (43896) */
+    3276, /* AB79 (43897) */
+    3277, /* AB7A (43898) */
+    3278, /* AB7B (43899) */
+    3279, /* AB7C (43900) */
+    3280, /* AB7D (43901) */
+    3281, /* AB7E (43902) */
+    3282, /* AB7F (43903) */
+    3283, /* AB80 (43904) */
+    3284, /* AB81 (43905) */
+    3285, /* AB82 (43906) */
+    3286, /* AB83 (43907) */
+    3287, /* AB84 (43908) */
+    3288, /* AB85 (43909) */
+    3289, /* AB86 (43910) */
+    3290, /* AB87 (43911) */
+    3291, /* AB88 (43912) */
+    3292, /* AB89 (43913) */
+    3293, /* AB8A (43914) */
+    3294, /* AB8B (43915) */
+    3295, /* AB8C (43916) */
+    3296, /* AB8D (43917) */
+    3297, /* AB8E (43918) */
+    3298, /* AB8F (43919) */
+    3299, /* AB90 (43920) */
+    3300, /* AB91 (43921) */
+    3301, /* AB92 (43922) */
+    3302, /* AB93 (43923) */
+    3303, /* AB94 (43924) */
+    3304, /* AB95 (43925) */
+    3305, /* AB96 (43926) */
+    3306, /* AB97 (43927) */
+    3307, /* AB98 (43928) */
+    3308, /* AB99 (43929) */
+    3309, /* AB9A (43930) */
+    3310, /* AB9B (43931) */
+    3311, /* AB9C (43932) */
+    3312, /* AB9D (43933) */
+    3313, /* AB9E (43934) */
+    3314, /* AB9F (43935) */
+    3315, /* ABA0 (43936) */
+    3316, /* ABA1 (43937) */
+    3317, /* ABA2 (43938) */
+    3318, /* ABA3 (43939) */
+    3319, /* ABA4 (43940) */
+    3320, /* ABA5 (43941) */
+    3321, /* ABA6 (43942) */
+    3322, /* ABA7 (43943) */
+    3323, /* ABA8 (43944) */
+    3324, /* ABA9 (43945) */
+    3325, /* ABAA (43946) */
+    3326, /* ABAB (43947) */
+    3327, /* ABAC (43948) */
+    3328, /* ABAD (43949) */
+    3329, /* ABAE (43950) */
+    3330, /* ABAF (43951) */
+    3331, /* ABB0 (43952) */
+    3332, /* ABB1 (43953) */
+    3333, /* ABB2 (43954) */
+    3334, /* ABB3 (43955) */
+    3335, /* ABB4 (43956) */
+    3336, /* ABB5 (43957) */
+    3337, /* ABB6 (43958) */
+    3338, /* ABB7 (43959) */
+    3339, /* ABB8 (43960) */
+    3340, /* ABB9 (43961) */
+    3341, /* ABBA (43962) */
+    3342, /* ABBB (43963) */
+    3343, /* ABBC (43964) */
+    3344, /* ABBD (43965) */
+    3345, /* ABBE (43966) */
+    3346, /* ABBF (43967) */
     1, /* ABC0 (43968) */
     1, /* ABC1 (43969) */
     1, /* ABC2 (43970) */
@@ -44053,11178 +44053,11178 @@ static const uint16_t lxb_unicode_table_map_0_57345[57345] =
     56, /* ABFD (44029) */
     56, /* ABFE (44030) */
     56, /* ABFF (44031) */
-    3343, /* AC00 (44032) */
-    3343, /* AC01 (44033) */
-    3343, /* AC02 (44034) */
-    3343, /* AC03 (44035) */
-    3343, /* AC04 (44036) */
-    3343, /* AC05 (44037) */
-    3343, /* AC06 (44038) */
-    3343, /* AC07 (44039) */
-    3343, /* AC08 (44040) */
-    3343, /* AC09 (44041) */
-    3343, /* AC0A (44042) */
-    3343, /* AC0B (44043) */
-    3343, /* AC0C (44044) */
-    3343, /* AC0D (44045) */
-    3343, /* AC0E (44046) */
-    3343, /* AC0F (44047) */
-    3343, /* AC10 (44048) */
-    3343, /* AC11 (44049) */
-    3343, /* AC12 (44050) */
-    3343, /* AC13 (44051) */
-    3343, /* AC14 (44052) */
-    3343, /* AC15 (44053) */
-    3343, /* AC16 (44054) */
-    3343, /* AC17 (44055) */
-    3343, /* AC18 (44056) */
-    3343, /* AC19 (44057) */
-    3343, /* AC1A (44058) */
-    3343, /* AC1B (44059) */
-    3343, /* AC1C (44060) */
-    3343, /* AC1D (44061) */
-    3343, /* AC1E (44062) */
-    3343, /* AC1F (44063) */
-    3343, /* AC20 (44064) */
-    3343, /* AC21 (44065) */
-    3343, /* AC22 (44066) */
-    3343, /* AC23 (44067) */
-    3343, /* AC24 (44068) */
-    3343, /* AC25 (44069) */
-    3343, /* AC26 (44070) */
-    3343, /* AC27 (44071) */
-    3343, /* AC28 (44072) */
-    3343, /* AC29 (44073) */
-    3343, /* AC2A (44074) */
-    3343, /* AC2B (44075) */
-    3343, /* AC2C (44076) */
-    3343, /* AC2D (44077) */
-    3343, /* AC2E (44078) */
-    3343, /* AC2F (44079) */
-    3343, /* AC30 (44080) */
-    3343, /* AC31 (44081) */
-    3343, /* AC32 (44082) */
-    3343, /* AC33 (44083) */
-    3343, /* AC34 (44084) */
-    3343, /* AC35 (44085) */
-    3343, /* AC36 (44086) */
-    3343, /* AC37 (44087) */
-    3343, /* AC38 (44088) */
-    3343, /* AC39 (44089) */
-    3343, /* AC3A (44090) */
-    3343, /* AC3B (44091) */
-    3343, /* AC3C (44092) */
-    3343, /* AC3D (44093) */
-    3343, /* AC3E (44094) */
-    3343, /* AC3F (44095) */
-    3343, /* AC40 (44096) */
-    3343, /* AC41 (44097) */
-    3343, /* AC42 (44098) */
-    3343, /* AC43 (44099) */
-    3343, /* AC44 (44100) */
-    3343, /* AC45 (44101) */
-    3343, /* AC46 (44102) */
-    3343, /* AC47 (44103) */
-    3343, /* AC48 (44104) */
-    3343, /* AC49 (44105) */
-    3343, /* AC4A (44106) */
-    3343, /* AC4B (44107) */
-    3343, /* AC4C (44108) */
-    3343, /* AC4D (44109) */
-    3343, /* AC4E (44110) */
-    3343, /* AC4F (44111) */
-    3343, /* AC50 (44112) */
-    3343, /* AC51 (44113) */
-    3343, /* AC52 (44114) */
-    3343, /* AC53 (44115) */
-    3343, /* AC54 (44116) */
-    3343, /* AC55 (44117) */
-    3343, /* AC56 (44118) */
-    3343, /* AC57 (44119) */
-    3343, /* AC58 (44120) */
-    3343, /* AC59 (44121) */
-    3343, /* AC5A (44122) */
-    3343, /* AC5B (44123) */
-    3343, /* AC5C (44124) */
-    3343, /* AC5D (44125) */
-    3343, /* AC5E (44126) */
-    3343, /* AC5F (44127) */
-    3343, /* AC60 (44128) */
-    3343, /* AC61 (44129) */
-    3343, /* AC62 (44130) */
-    3343, /* AC63 (44131) */
-    3343, /* AC64 (44132) */
-    3343, /* AC65 (44133) */
-    3343, /* AC66 (44134) */
-    3343, /* AC67 (44135) */
-    3343, /* AC68 (44136) */
-    3343, /* AC69 (44137) */
-    3343, /* AC6A (44138) */
-    3343, /* AC6B (44139) */
-    3343, /* AC6C (44140) */
-    3343, /* AC6D (44141) */
-    3343, /* AC6E (44142) */
-    3343, /* AC6F (44143) */
-    3343, /* AC70 (44144) */
-    3343, /* AC71 (44145) */
-    3343, /* AC72 (44146) */
-    3343, /* AC73 (44147) */
-    3343, /* AC74 (44148) */
-    3343, /* AC75 (44149) */
-    3343, /* AC76 (44150) */
-    3343, /* AC77 (44151) */
-    3343, /* AC78 (44152) */
-    3343, /* AC79 (44153) */
-    3343, /* AC7A (44154) */
-    3343, /* AC7B (44155) */
-    3343, /* AC7C (44156) */
-    3343, /* AC7D (44157) */
-    3343, /* AC7E (44158) */
-    3343, /* AC7F (44159) */
-    3343, /* AC80 (44160) */
-    3343, /* AC81 (44161) */
-    3343, /* AC82 (44162) */
-    3343, /* AC83 (44163) */
-    3343, /* AC84 (44164) */
-    3343, /* AC85 (44165) */
-    3343, /* AC86 (44166) */
-    3343, /* AC87 (44167) */
-    3343, /* AC88 (44168) */
-    3343, /* AC89 (44169) */
-    3343, /* AC8A (44170) */
-    3343, /* AC8B (44171) */
-    3343, /* AC8C (44172) */
-    3343, /* AC8D (44173) */
-    3343, /* AC8E (44174) */
-    3343, /* AC8F (44175) */
-    3343, /* AC90 (44176) */
-    3343, /* AC91 (44177) */
-    3343, /* AC92 (44178) */
-    3343, /* AC93 (44179) */
-    3343, /* AC94 (44180) */
-    3343, /* AC95 (44181) */
-    3343, /* AC96 (44182) */
-    3343, /* AC97 (44183) */
-    3343, /* AC98 (44184) */
-    3343, /* AC99 (44185) */
-    3343, /* AC9A (44186) */
-    3343, /* AC9B (44187) */
-    3343, /* AC9C (44188) */
-    3343, /* AC9D (44189) */
-    3343, /* AC9E (44190) */
-    3343, /* AC9F (44191) */
-    3343, /* ACA0 (44192) */
-    3343, /* ACA1 (44193) */
-    3343, /* ACA2 (44194) */
-    3343, /* ACA3 (44195) */
-    3343, /* ACA4 (44196) */
-    3343, /* ACA5 (44197) */
-    3343, /* ACA6 (44198) */
-    3343, /* ACA7 (44199) */
-    3343, /* ACA8 (44200) */
-    3343, /* ACA9 (44201) */
-    3343, /* ACAA (44202) */
-    3343, /* ACAB (44203) */
-    3343, /* ACAC (44204) */
-    3343, /* ACAD (44205) */
-    3343, /* ACAE (44206) */
-    3343, /* ACAF (44207) */
-    3343, /* ACB0 (44208) */
-    3343, /* ACB1 (44209) */
-    3343, /* ACB2 (44210) */
-    3343, /* ACB3 (44211) */
-    3343, /* ACB4 (44212) */
-    3343, /* ACB5 (44213) */
-    3343, /* ACB6 (44214) */
-    3343, /* ACB7 (44215) */
-    3343, /* ACB8 (44216) */
-    3343, /* ACB9 (44217) */
-    3343, /* ACBA (44218) */
-    3343, /* ACBB (44219) */
-    3343, /* ACBC (44220) */
-    3343, /* ACBD (44221) */
-    3343, /* ACBE (44222) */
-    3343, /* ACBF (44223) */
-    3343, /* ACC0 (44224) */
-    3343, /* ACC1 (44225) */
-    3343, /* ACC2 (44226) */
-    3343, /* ACC3 (44227) */
-    3343, /* ACC4 (44228) */
-    3343, /* ACC5 (44229) */
-    3343, /* ACC6 (44230) */
-    3343, /* ACC7 (44231) */
-    3343, /* ACC8 (44232) */
-    3343, /* ACC9 (44233) */
-    3343, /* ACCA (44234) */
-    3343, /* ACCB (44235) */
-    3343, /* ACCC (44236) */
-    3343, /* ACCD (44237) */
-    3343, /* ACCE (44238) */
-    3343, /* ACCF (44239) */
-    3343, /* ACD0 (44240) */
-    3343, /* ACD1 (44241) */
-    3343, /* ACD2 (44242) */
-    3343, /* ACD3 (44243) */
-    3343, /* ACD4 (44244) */
-    3343, /* ACD5 (44245) */
-    3343, /* ACD6 (44246) */
-    3343, /* ACD7 (44247) */
-    3343, /* ACD8 (44248) */
-    3343, /* ACD9 (44249) */
-    3343, /* ACDA (44250) */
-    3343, /* ACDB (44251) */
-    3343, /* ACDC (44252) */
-    3343, /* ACDD (44253) */
-    3343, /* ACDE (44254) */
-    3343, /* ACDF (44255) */
-    3343, /* ACE0 (44256) */
-    3343, /* ACE1 (44257) */
-    3343, /* ACE2 (44258) */
-    3343, /* ACE3 (44259) */
-    3343, /* ACE4 (44260) */
-    3343, /* ACE5 (44261) */
-    3343, /* ACE6 (44262) */
-    3343, /* ACE7 (44263) */
-    3343, /* ACE8 (44264) */
-    3343, /* ACE9 (44265) */
-    3343, /* ACEA (44266) */
-    3343, /* ACEB (44267) */
-    3343, /* ACEC (44268) */
-    3343, /* ACED (44269) */
-    3343, /* ACEE (44270) */
-    3343, /* ACEF (44271) */
-    3343, /* ACF0 (44272) */
-    3343, /* ACF1 (44273) */
-    3343, /* ACF2 (44274) */
-    3343, /* ACF3 (44275) */
-    3343, /* ACF4 (44276) */
-    3343, /* ACF5 (44277) */
-    3343, /* ACF6 (44278) */
-    3343, /* ACF7 (44279) */
-    3343, /* ACF8 (44280) */
-    3343, /* ACF9 (44281) */
-    3343, /* ACFA (44282) */
-    3343, /* ACFB (44283) */
-    3343, /* ACFC (44284) */
-    3343, /* ACFD (44285) */
-    3343, /* ACFE (44286) */
-    3343, /* ACFF (44287) */
-    3343, /* AD00 (44288) */
-    3343, /* AD01 (44289) */
-    3343, /* AD02 (44290) */
-    3343, /* AD03 (44291) */
-    3343, /* AD04 (44292) */
-    3343, /* AD05 (44293) */
-    3343, /* AD06 (44294) */
-    3343, /* AD07 (44295) */
-    3343, /* AD08 (44296) */
-    3343, /* AD09 (44297) */
-    3343, /* AD0A (44298) */
-    3343, /* AD0B (44299) */
-    3343, /* AD0C (44300) */
-    3343, /* AD0D (44301) */
-    3343, /* AD0E (44302) */
-    3343, /* AD0F (44303) */
-    3343, /* AD10 (44304) */
-    3343, /* AD11 (44305) */
-    3343, /* AD12 (44306) */
-    3343, /* AD13 (44307) */
-    3343, /* AD14 (44308) */
-    3343, /* AD15 (44309) */
-    3343, /* AD16 (44310) */
-    3343, /* AD17 (44311) */
-    3343, /* AD18 (44312) */
-    3343, /* AD19 (44313) */
-    3343, /* AD1A (44314) */
-    3343, /* AD1B (44315) */
-    3343, /* AD1C (44316) */
-    3343, /* AD1D (44317) */
-    3343, /* AD1E (44318) */
-    3343, /* AD1F (44319) */
-    3343, /* AD20 (44320) */
-    3343, /* AD21 (44321) */
-    3343, /* AD22 (44322) */
-    3343, /* AD23 (44323) */
-    3343, /* AD24 (44324) */
-    3343, /* AD25 (44325) */
-    3343, /* AD26 (44326) */
-    3343, /* AD27 (44327) */
-    3343, /* AD28 (44328) */
-    3343, /* AD29 (44329) */
-    3343, /* AD2A (44330) */
-    3343, /* AD2B (44331) */
-    3343, /* AD2C (44332) */
-    3343, /* AD2D (44333) */
-    3343, /* AD2E (44334) */
-    3343, /* AD2F (44335) */
-    3343, /* AD30 (44336) */
-    3343, /* AD31 (44337) */
-    3343, /* AD32 (44338) */
-    3343, /* AD33 (44339) */
-    3343, /* AD34 (44340) */
-    3343, /* AD35 (44341) */
-    3343, /* AD36 (44342) */
-    3343, /* AD37 (44343) */
-    3343, /* AD38 (44344) */
-    3343, /* AD39 (44345) */
-    3343, /* AD3A (44346) */
-    3343, /* AD3B (44347) */
-    3343, /* AD3C (44348) */
-    3343, /* AD3D (44349) */
-    3343, /* AD3E (44350) */
-    3343, /* AD3F (44351) */
-    3343, /* AD40 (44352) */
-    3343, /* AD41 (44353) */
-    3343, /* AD42 (44354) */
-    3343, /* AD43 (44355) */
-    3343, /* AD44 (44356) */
-    3343, /* AD45 (44357) */
-    3343, /* AD46 (44358) */
-    3343, /* AD47 (44359) */
-    3343, /* AD48 (44360) */
-    3343, /* AD49 (44361) */
-    3343, /* AD4A (44362) */
-    3343, /* AD4B (44363) */
-    3343, /* AD4C (44364) */
-    3343, /* AD4D (44365) */
-    3343, /* AD4E (44366) */
-    3343, /* AD4F (44367) */
-    3343, /* AD50 (44368) */
-    3343, /* AD51 (44369) */
-    3343, /* AD52 (44370) */
-    3343, /* AD53 (44371) */
-    3343, /* AD54 (44372) */
-    3343, /* AD55 (44373) */
-    3343, /* AD56 (44374) */
-    3343, /* AD57 (44375) */
-    3343, /* AD58 (44376) */
-    3343, /* AD59 (44377) */
-    3343, /* AD5A (44378) */
-    3343, /* AD5B (44379) */
-    3343, /* AD5C (44380) */
-    3343, /* AD5D (44381) */
-    3343, /* AD5E (44382) */
-    3343, /* AD5F (44383) */
-    3343, /* AD60 (44384) */
-    3343, /* AD61 (44385) */
-    3343, /* AD62 (44386) */
-    3343, /* AD63 (44387) */
-    3343, /* AD64 (44388) */
-    3343, /* AD65 (44389) */
-    3343, /* AD66 (44390) */
-    3343, /* AD67 (44391) */
-    3343, /* AD68 (44392) */
-    3343, /* AD69 (44393) */
-    3343, /* AD6A (44394) */
-    3343, /* AD6B (44395) */
-    3343, /* AD6C (44396) */
-    3343, /* AD6D (44397) */
-    3343, /* AD6E (44398) */
-    3343, /* AD6F (44399) */
-    3343, /* AD70 (44400) */
-    3343, /* AD71 (44401) */
-    3343, /* AD72 (44402) */
-    3343, /* AD73 (44403) */
-    3343, /* AD74 (44404) */
-    3343, /* AD75 (44405) */
-    3343, /* AD76 (44406) */
-    3343, /* AD77 (44407) */
-    3343, /* AD78 (44408) */
-    3343, /* AD79 (44409) */
-    3343, /* AD7A (44410) */
-    3343, /* AD7B (44411) */
-    3343, /* AD7C (44412) */
-    3343, /* AD7D (44413) */
-    3343, /* AD7E (44414) */
-    3343, /* AD7F (44415) */
-    3343, /* AD80 (44416) */
-    3343, /* AD81 (44417) */
-    3343, /* AD82 (44418) */
-    3343, /* AD83 (44419) */
-    3343, /* AD84 (44420) */
-    3343, /* AD85 (44421) */
-    3343, /* AD86 (44422) */
-    3343, /* AD87 (44423) */
-    3343, /* AD88 (44424) */
-    3343, /* AD89 (44425) */
-    3343, /* AD8A (44426) */
-    3343, /* AD8B (44427) */
-    3343, /* AD8C (44428) */
-    3343, /* AD8D (44429) */
-    3343, /* AD8E (44430) */
-    3343, /* AD8F (44431) */
-    3343, /* AD90 (44432) */
-    3343, /* AD91 (44433) */
-    3343, /* AD92 (44434) */
-    3343, /* AD93 (44435) */
-    3343, /* AD94 (44436) */
-    3343, /* AD95 (44437) */
-    3343, /* AD96 (44438) */
-    3343, /* AD97 (44439) */
-    3343, /* AD98 (44440) */
-    3343, /* AD99 (44441) */
-    3343, /* AD9A (44442) */
-    3343, /* AD9B (44443) */
-    3343, /* AD9C (44444) */
-    3343, /* AD9D (44445) */
-    3343, /* AD9E (44446) */
-    3343, /* AD9F (44447) */
-    3343, /* ADA0 (44448) */
-    3343, /* ADA1 (44449) */
-    3343, /* ADA2 (44450) */
-    3343, /* ADA3 (44451) */
-    3343, /* ADA4 (44452) */
-    3343, /* ADA5 (44453) */
-    3343, /* ADA6 (44454) */
-    3343, /* ADA7 (44455) */
-    3343, /* ADA8 (44456) */
-    3343, /* ADA9 (44457) */
-    3343, /* ADAA (44458) */
-    3343, /* ADAB (44459) */
-    3343, /* ADAC (44460) */
-    3343, /* ADAD (44461) */
-    3343, /* ADAE (44462) */
-    3343, /* ADAF (44463) */
-    3343, /* ADB0 (44464) */
-    3343, /* ADB1 (44465) */
-    3343, /* ADB2 (44466) */
-    3343, /* ADB3 (44467) */
-    3343, /* ADB4 (44468) */
-    3343, /* ADB5 (44469) */
-    3343, /* ADB6 (44470) */
-    3343, /* ADB7 (44471) */
-    3343, /* ADB8 (44472) */
-    3343, /* ADB9 (44473) */
-    3343, /* ADBA (44474) */
-    3343, /* ADBB (44475) */
-    3343, /* ADBC (44476) */
-    3343, /* ADBD (44477) */
-    3343, /* ADBE (44478) */
-    3343, /* ADBF (44479) */
-    3343, /* ADC0 (44480) */
-    3343, /* ADC1 (44481) */
-    3343, /* ADC2 (44482) */
-    3343, /* ADC3 (44483) */
-    3343, /* ADC4 (44484) */
-    3343, /* ADC5 (44485) */
-    3343, /* ADC6 (44486) */
-    3343, /* ADC7 (44487) */
-    3343, /* ADC8 (44488) */
-    3343, /* ADC9 (44489) */
-    3343, /* ADCA (44490) */
-    3343, /* ADCB (44491) */
-    3343, /* ADCC (44492) */
-    3343, /* ADCD (44493) */
-    3343, /* ADCE (44494) */
-    3343, /* ADCF (44495) */
-    3343, /* ADD0 (44496) */
-    3343, /* ADD1 (44497) */
-    3343, /* ADD2 (44498) */
-    3343, /* ADD3 (44499) */
-    3343, /* ADD4 (44500) */
-    3343, /* ADD5 (44501) */
-    3343, /* ADD6 (44502) */
-    3343, /* ADD7 (44503) */
-    3343, /* ADD8 (44504) */
-    3343, /* ADD9 (44505) */
-    3343, /* ADDA (44506) */
-    3343, /* ADDB (44507) */
-    3343, /* ADDC (44508) */
-    3343, /* ADDD (44509) */
-    3343, /* ADDE (44510) */
-    3343, /* ADDF (44511) */
-    3343, /* ADE0 (44512) */
-    3343, /* ADE1 (44513) */
-    3343, /* ADE2 (44514) */
-    3343, /* ADE3 (44515) */
-    3343, /* ADE4 (44516) */
-    3343, /* ADE5 (44517) */
-    3343, /* ADE6 (44518) */
-    3343, /* ADE7 (44519) */
-    3343, /* ADE8 (44520) */
-    3343, /* ADE9 (44521) */
-    3343, /* ADEA (44522) */
-    3343, /* ADEB (44523) */
-    3343, /* ADEC (44524) */
-    3343, /* ADED (44525) */
-    3343, /* ADEE (44526) */
-    3343, /* ADEF (44527) */
-    3343, /* ADF0 (44528) */
-    3343, /* ADF1 (44529) */
-    3343, /* ADF2 (44530) */
-    3343, /* ADF3 (44531) */
-    3343, /* ADF4 (44532) */
-    3343, /* ADF5 (44533) */
-    3343, /* ADF6 (44534) */
-    3343, /* ADF7 (44535) */
-    3343, /* ADF8 (44536) */
-    3343, /* ADF9 (44537) */
-    3343, /* ADFA (44538) */
-    3343, /* ADFB (44539) */
-    3343, /* ADFC (44540) */
-    3343, /* ADFD (44541) */
-    3343, /* ADFE (44542) */
-    3343, /* ADFF (44543) */
-    3343, /* AE00 (44544) */
-    3343, /* AE01 (44545) */
-    3343, /* AE02 (44546) */
-    3343, /* AE03 (44547) */
-    3343, /* AE04 (44548) */
-    3343, /* AE05 (44549) */
-    3343, /* AE06 (44550) */
-    3343, /* AE07 (44551) */
-    3343, /* AE08 (44552) */
-    3343, /* AE09 (44553) */
-    3343, /* AE0A (44554) */
-    3343, /* AE0B (44555) */
-    3343, /* AE0C (44556) */
-    3343, /* AE0D (44557) */
-    3343, /* AE0E (44558) */
-    3343, /* AE0F (44559) */
-    3343, /* AE10 (44560) */
-    3343, /* AE11 (44561) */
-    3343, /* AE12 (44562) */
-    3343, /* AE13 (44563) */
-    3343, /* AE14 (44564) */
-    3343, /* AE15 (44565) */
-    3343, /* AE16 (44566) */
-    3343, /* AE17 (44567) */
-    3343, /* AE18 (44568) */
-    3343, /* AE19 (44569) */
-    3343, /* AE1A (44570) */
-    3343, /* AE1B (44571) */
-    3343, /* AE1C (44572) */
-    3343, /* AE1D (44573) */
-    3343, /* AE1E (44574) */
-    3343, /* AE1F (44575) */
-    3343, /* AE20 (44576) */
-    3343, /* AE21 (44577) */
-    3343, /* AE22 (44578) */
-    3343, /* AE23 (44579) */
-    3343, /* AE24 (44580) */
-    3343, /* AE25 (44581) */
-    3343, /* AE26 (44582) */
-    3343, /* AE27 (44583) */
-    3343, /* AE28 (44584) */
-    3343, /* AE29 (44585) */
-    3343, /* AE2A (44586) */
-    3343, /* AE2B (44587) */
-    3343, /* AE2C (44588) */
-    3343, /* AE2D (44589) */
-    3343, /* AE2E (44590) */
-    3343, /* AE2F (44591) */
-    3343, /* AE30 (44592) */
-    3343, /* AE31 (44593) */
-    3343, /* AE32 (44594) */
-    3343, /* AE33 (44595) */
-    3343, /* AE34 (44596) */
-    3343, /* AE35 (44597) */
-    3343, /* AE36 (44598) */
-    3343, /* AE37 (44599) */
-    3343, /* AE38 (44600) */
-    3343, /* AE39 (44601) */
-    3343, /* AE3A (44602) */
-    3343, /* AE3B (44603) */
-    3343, /* AE3C (44604) */
-    3343, /* AE3D (44605) */
-    3343, /* AE3E (44606) */
-    3343, /* AE3F (44607) */
-    3343, /* AE40 (44608) */
-    3343, /* AE41 (44609) */
-    3343, /* AE42 (44610) */
-    3343, /* AE43 (44611) */
-    3343, /* AE44 (44612) */
-    3343, /* AE45 (44613) */
-    3343, /* AE46 (44614) */
-    3343, /* AE47 (44615) */
-    3343, /* AE48 (44616) */
-    3343, /* AE49 (44617) */
-    3343, /* AE4A (44618) */
-    3343, /* AE4B (44619) */
-    3343, /* AE4C (44620) */
-    3343, /* AE4D (44621) */
-    3343, /* AE4E (44622) */
-    3343, /* AE4F (44623) */
-    3343, /* AE50 (44624) */
-    3343, /* AE51 (44625) */
-    3343, /* AE52 (44626) */
-    3343, /* AE53 (44627) */
-    3343, /* AE54 (44628) */
-    3343, /* AE55 (44629) */
-    3343, /* AE56 (44630) */
-    3343, /* AE57 (44631) */
-    3343, /* AE58 (44632) */
-    3343, /* AE59 (44633) */
-    3343, /* AE5A (44634) */
-    3343, /* AE5B (44635) */
-    3343, /* AE5C (44636) */
-    3343, /* AE5D (44637) */
-    3343, /* AE5E (44638) */
-    3343, /* AE5F (44639) */
-    3343, /* AE60 (44640) */
-    3343, /* AE61 (44641) */
-    3343, /* AE62 (44642) */
-    3343, /* AE63 (44643) */
-    3343, /* AE64 (44644) */
-    3343, /* AE65 (44645) */
-    3343, /* AE66 (44646) */
-    3343, /* AE67 (44647) */
-    3343, /* AE68 (44648) */
-    3343, /* AE69 (44649) */
-    3343, /* AE6A (44650) */
-    3343, /* AE6B (44651) */
-    3343, /* AE6C (44652) */
-    3343, /* AE6D (44653) */
-    3343, /* AE6E (44654) */
-    3343, /* AE6F (44655) */
-    3343, /* AE70 (44656) */
-    3343, /* AE71 (44657) */
-    3343, /* AE72 (44658) */
-    3343, /* AE73 (44659) */
-    3343, /* AE74 (44660) */
-    3343, /* AE75 (44661) */
-    3343, /* AE76 (44662) */
-    3343, /* AE77 (44663) */
-    3343, /* AE78 (44664) */
-    3343, /* AE79 (44665) */
-    3343, /* AE7A (44666) */
-    3343, /* AE7B (44667) */
-    3343, /* AE7C (44668) */
-    3343, /* AE7D (44669) */
-    3343, /* AE7E (44670) */
-    3343, /* AE7F (44671) */
-    3343, /* AE80 (44672) */
-    3343, /* AE81 (44673) */
-    3343, /* AE82 (44674) */
-    3343, /* AE83 (44675) */
-    3343, /* AE84 (44676) */
-    3343, /* AE85 (44677) */
-    3343, /* AE86 (44678) */
-    3343, /* AE87 (44679) */
-    3343, /* AE88 (44680) */
-    3343, /* AE89 (44681) */
-    3343, /* AE8A (44682) */
-    3343, /* AE8B (44683) */
-    3343, /* AE8C (44684) */
-    3343, /* AE8D (44685) */
-    3343, /* AE8E (44686) */
-    3343, /* AE8F (44687) */
-    3343, /* AE90 (44688) */
-    3343, /* AE91 (44689) */
-    3343, /* AE92 (44690) */
-    3343, /* AE93 (44691) */
-    3343, /* AE94 (44692) */
-    3343, /* AE95 (44693) */
-    3343, /* AE96 (44694) */
-    3343, /* AE97 (44695) */
-    3343, /* AE98 (44696) */
-    3343, /* AE99 (44697) */
-    3343, /* AE9A (44698) */
-    3343, /* AE9B (44699) */
-    3343, /* AE9C (44700) */
-    3343, /* AE9D (44701) */
-    3343, /* AE9E (44702) */
-    3343, /* AE9F (44703) */
-    3343, /* AEA0 (44704) */
-    3343, /* AEA1 (44705) */
-    3343, /* AEA2 (44706) */
-    3343, /* AEA3 (44707) */
-    3343, /* AEA4 (44708) */
-    3343, /* AEA5 (44709) */
-    3343, /* AEA6 (44710) */
-    3343, /* AEA7 (44711) */
-    3343, /* AEA8 (44712) */
-    3343, /* AEA9 (44713) */
-    3343, /* AEAA (44714) */
-    3343, /* AEAB (44715) */
-    3343, /* AEAC (44716) */
-    3343, /* AEAD (44717) */
-    3343, /* AEAE (44718) */
-    3343, /* AEAF (44719) */
-    3343, /* AEB0 (44720) */
-    3343, /* AEB1 (44721) */
-    3343, /* AEB2 (44722) */
-    3343, /* AEB3 (44723) */
-    3343, /* AEB4 (44724) */
-    3343, /* AEB5 (44725) */
-    3343, /* AEB6 (44726) */
-    3343, /* AEB7 (44727) */
-    3343, /* AEB8 (44728) */
-    3343, /* AEB9 (44729) */
-    3343, /* AEBA (44730) */
-    3343, /* AEBB (44731) */
-    3343, /* AEBC (44732) */
-    3343, /* AEBD (44733) */
-    3343, /* AEBE (44734) */
-    3343, /* AEBF (44735) */
-    3343, /* AEC0 (44736) */
-    3343, /* AEC1 (44737) */
-    3343, /* AEC2 (44738) */
-    3343, /* AEC3 (44739) */
-    3343, /* AEC4 (44740) */
-    3343, /* AEC5 (44741) */
-    3343, /* AEC6 (44742) */
-    3343, /* AEC7 (44743) */
-    3343, /* AEC8 (44744) */
-    3343, /* AEC9 (44745) */
-    3343, /* AECA (44746) */
-    3343, /* AECB (44747) */
-    3343, /* AECC (44748) */
-    3343, /* AECD (44749) */
-    3343, /* AECE (44750) */
-    3343, /* AECF (44751) */
-    3343, /* AED0 (44752) */
-    3343, /* AED1 (44753) */
-    3343, /* AED2 (44754) */
-    3343, /* AED3 (44755) */
-    3343, /* AED4 (44756) */
-    3343, /* AED5 (44757) */
-    3343, /* AED6 (44758) */
-    3343, /* AED7 (44759) */
-    3343, /* AED8 (44760) */
-    3343, /* AED9 (44761) */
-    3343, /* AEDA (44762) */
-    3343, /* AEDB (44763) */
-    3343, /* AEDC (44764) */
-    3343, /* AEDD (44765) */
-    3343, /* AEDE (44766) */
-    3343, /* AEDF (44767) */
-    3343, /* AEE0 (44768) */
-    3343, /* AEE1 (44769) */
-    3343, /* AEE2 (44770) */
-    3343, /* AEE3 (44771) */
-    3343, /* AEE4 (44772) */
-    3343, /* AEE5 (44773) */
-    3343, /* AEE6 (44774) */
-    3343, /* AEE7 (44775) */
-    3343, /* AEE8 (44776) */
-    3343, /* AEE9 (44777) */
-    3343, /* AEEA (44778) */
-    3343, /* AEEB (44779) */
-    3343, /* AEEC (44780) */
-    3343, /* AEED (44781) */
-    3343, /* AEEE (44782) */
-    3343, /* AEEF (44783) */
-    3343, /* AEF0 (44784) */
-    3343, /* AEF1 (44785) */
-    3343, /* AEF2 (44786) */
-    3343, /* AEF3 (44787) */
-    3343, /* AEF4 (44788) */
-    3343, /* AEF5 (44789) */
-    3343, /* AEF6 (44790) */
-    3343, /* AEF7 (44791) */
-    3343, /* AEF8 (44792) */
-    3343, /* AEF9 (44793) */
-    3343, /* AEFA (44794) */
-    3343, /* AEFB (44795) */
-    3343, /* AEFC (44796) */
-    3343, /* AEFD (44797) */
-    3343, /* AEFE (44798) */
-    3343, /* AEFF (44799) */
-    3343, /* AF00 (44800) */
-    3343, /* AF01 (44801) */
-    3343, /* AF02 (44802) */
-    3343, /* AF03 (44803) */
-    3343, /* AF04 (44804) */
-    3343, /* AF05 (44805) */
-    3343, /* AF06 (44806) */
-    3343, /* AF07 (44807) */
-    3343, /* AF08 (44808) */
-    3343, /* AF09 (44809) */
-    3343, /* AF0A (44810) */
-    3343, /* AF0B (44811) */
-    3343, /* AF0C (44812) */
-    3343, /* AF0D (44813) */
-    3343, /* AF0E (44814) */
-    3343, /* AF0F (44815) */
-    3343, /* AF10 (44816) */
-    3343, /* AF11 (44817) */
-    3343, /* AF12 (44818) */
-    3343, /* AF13 (44819) */
-    3343, /* AF14 (44820) */
-    3343, /* AF15 (44821) */
-    3343, /* AF16 (44822) */
-    3343, /* AF17 (44823) */
-    3343, /* AF18 (44824) */
-    3343, /* AF19 (44825) */
-    3343, /* AF1A (44826) */
-    3343, /* AF1B (44827) */
-    3343, /* AF1C (44828) */
-    3343, /* AF1D (44829) */
-    3343, /* AF1E (44830) */
-    3343, /* AF1F (44831) */
-    3343, /* AF20 (44832) */
-    3343, /* AF21 (44833) */
-    3343, /* AF22 (44834) */
-    3343, /* AF23 (44835) */
-    3343, /* AF24 (44836) */
-    3343, /* AF25 (44837) */
-    3343, /* AF26 (44838) */
-    3343, /* AF27 (44839) */
-    3343, /* AF28 (44840) */
-    3343, /* AF29 (44841) */
-    3343, /* AF2A (44842) */
-    3343, /* AF2B (44843) */
-    3343, /* AF2C (44844) */
-    3343, /* AF2D (44845) */
-    3343, /* AF2E (44846) */
-    3343, /* AF2F (44847) */
-    3343, /* AF30 (44848) */
-    3343, /* AF31 (44849) */
-    3343, /* AF32 (44850) */
-    3343, /* AF33 (44851) */
-    3343, /* AF34 (44852) */
-    3343, /* AF35 (44853) */
-    3343, /* AF36 (44854) */
-    3343, /* AF37 (44855) */
-    3343, /* AF38 (44856) */
-    3343, /* AF39 (44857) */
-    3343, /* AF3A (44858) */
-    3343, /* AF3B (44859) */
-    3343, /* AF3C (44860) */
-    3343, /* AF3D (44861) */
-    3343, /* AF3E (44862) */
-    3343, /* AF3F (44863) */
-    3343, /* AF40 (44864) */
-    3343, /* AF41 (44865) */
-    3343, /* AF42 (44866) */
-    3343, /* AF43 (44867) */
-    3343, /* AF44 (44868) */
-    3343, /* AF45 (44869) */
-    3343, /* AF46 (44870) */
-    3343, /* AF47 (44871) */
-    3343, /* AF48 (44872) */
-    3343, /* AF49 (44873) */
-    3343, /* AF4A (44874) */
-    3343, /* AF4B (44875) */
-    3343, /* AF4C (44876) */
-    3343, /* AF4D (44877) */
-    3343, /* AF4E (44878) */
-    3343, /* AF4F (44879) */
-    3343, /* AF50 (44880) */
-    3343, /* AF51 (44881) */
-    3343, /* AF52 (44882) */
-    3343, /* AF53 (44883) */
-    3343, /* AF54 (44884) */
-    3343, /* AF55 (44885) */
-    3343, /* AF56 (44886) */
-    3343, /* AF57 (44887) */
-    3343, /* AF58 (44888) */
-    3343, /* AF59 (44889) */
-    3343, /* AF5A (44890) */
-    3343, /* AF5B (44891) */
-    3343, /* AF5C (44892) */
-    3343, /* AF5D (44893) */
-    3343, /* AF5E (44894) */
-    3343, /* AF5F (44895) */
-    3343, /* AF60 (44896) */
-    3343, /* AF61 (44897) */
-    3343, /* AF62 (44898) */
-    3343, /* AF63 (44899) */
-    3343, /* AF64 (44900) */
-    3343, /* AF65 (44901) */
-    3343, /* AF66 (44902) */
-    3343, /* AF67 (44903) */
-    3343, /* AF68 (44904) */
-    3343, /* AF69 (44905) */
-    3343, /* AF6A (44906) */
-    3343, /* AF6B (44907) */
-    3343, /* AF6C (44908) */
-    3343, /* AF6D (44909) */
-    3343, /* AF6E (44910) */
-    3343, /* AF6F (44911) */
-    3343, /* AF70 (44912) */
-    3343, /* AF71 (44913) */
-    3343, /* AF72 (44914) */
-    3343, /* AF73 (44915) */
-    3343, /* AF74 (44916) */
-    3343, /* AF75 (44917) */
-    3343, /* AF76 (44918) */
-    3343, /* AF77 (44919) */
-    3343, /* AF78 (44920) */
-    3343, /* AF79 (44921) */
-    3343, /* AF7A (44922) */
-    3343, /* AF7B (44923) */
-    3343, /* AF7C (44924) */
-    3343, /* AF7D (44925) */
-    3343, /* AF7E (44926) */
-    3343, /* AF7F (44927) */
-    3343, /* AF80 (44928) */
-    3343, /* AF81 (44929) */
-    3343, /* AF82 (44930) */
-    3343, /* AF83 (44931) */
-    3343, /* AF84 (44932) */
-    3343, /* AF85 (44933) */
-    3343, /* AF86 (44934) */
-    3343, /* AF87 (44935) */
-    3343, /* AF88 (44936) */
-    3343, /* AF89 (44937) */
-    3343, /* AF8A (44938) */
-    3343, /* AF8B (44939) */
-    3343, /* AF8C (44940) */
-    3343, /* AF8D (44941) */
-    3343, /* AF8E (44942) */
-    3343, /* AF8F (44943) */
-    3343, /* AF90 (44944) */
-    3343, /* AF91 (44945) */
-    3343, /* AF92 (44946) */
-    3343, /* AF93 (44947) */
-    3343, /* AF94 (44948) */
-    3343, /* AF95 (44949) */
-    3343, /* AF96 (44950) */
-    3343, /* AF97 (44951) */
-    3343, /* AF98 (44952) */
-    3343, /* AF99 (44953) */
-    3343, /* AF9A (44954) */
-    3343, /* AF9B (44955) */
-    3343, /* AF9C (44956) */
-    3343, /* AF9D (44957) */
-    3343, /* AF9E (44958) */
-    3343, /* AF9F (44959) */
-    3343, /* AFA0 (44960) */
-    3343, /* AFA1 (44961) */
-    3343, /* AFA2 (44962) */
-    3343, /* AFA3 (44963) */
-    3343, /* AFA4 (44964) */
-    3343, /* AFA5 (44965) */
-    3343, /* AFA6 (44966) */
-    3343, /* AFA7 (44967) */
-    3343, /* AFA8 (44968) */
-    3343, /* AFA9 (44969) */
-    3343, /* AFAA (44970) */
-    3343, /* AFAB (44971) */
-    3343, /* AFAC (44972) */
-    3343, /* AFAD (44973) */
-    3343, /* AFAE (44974) */
-    3343, /* AFAF (44975) */
-    3343, /* AFB0 (44976) */
-    3343, /* AFB1 (44977) */
-    3343, /* AFB2 (44978) */
-    3343, /* AFB3 (44979) */
-    3343, /* AFB4 (44980) */
-    3343, /* AFB5 (44981) */
-    3343, /* AFB6 (44982) */
-    3343, /* AFB7 (44983) */
-    3343, /* AFB8 (44984) */
-    3343, /* AFB9 (44985) */
-    3343, /* AFBA (44986) */
-    3343, /* AFBB (44987) */
-    3343, /* AFBC (44988) */
-    3343, /* AFBD (44989) */
-    3343, /* AFBE (44990) */
-    3343, /* AFBF (44991) */
-    3343, /* AFC0 (44992) */
-    3343, /* AFC1 (44993) */
-    3343, /* AFC2 (44994) */
-    3343, /* AFC3 (44995) */
-    3343, /* AFC4 (44996) */
-    3343, /* AFC5 (44997) */
-    3343, /* AFC6 (44998) */
-    3343, /* AFC7 (44999) */
-    3343, /* AFC8 (45000) */
-    3343, /* AFC9 (45001) */
-    3343, /* AFCA (45002) */
-    3343, /* AFCB (45003) */
-    3343, /* AFCC (45004) */
-    3343, /* AFCD (45005) */
-    3343, /* AFCE (45006) */
-    3343, /* AFCF (45007) */
-    3343, /* AFD0 (45008) */
-    3343, /* AFD1 (45009) */
-    3343, /* AFD2 (45010) */
-    3343, /* AFD3 (45011) */
-    3343, /* AFD4 (45012) */
-    3343, /* AFD5 (45013) */
-    3343, /* AFD6 (45014) */
-    3343, /* AFD7 (45015) */
-    3343, /* AFD8 (45016) */
-    3343, /* AFD9 (45017) */
-    3343, /* AFDA (45018) */
-    3343, /* AFDB (45019) */
-    3343, /* AFDC (45020) */
-    3343, /* AFDD (45021) */
-    3343, /* AFDE (45022) */
-    3343, /* AFDF (45023) */
-    3343, /* AFE0 (45024) */
-    3343, /* AFE1 (45025) */
-    3343, /* AFE2 (45026) */
-    3343, /* AFE3 (45027) */
-    3343, /* AFE4 (45028) */
-    3343, /* AFE5 (45029) */
-    3343, /* AFE6 (45030) */
-    3343, /* AFE7 (45031) */
-    3343, /* AFE8 (45032) */
-    3343, /* AFE9 (45033) */
-    3343, /* AFEA (45034) */
-    3343, /* AFEB (45035) */
-    3343, /* AFEC (45036) */
-    3343, /* AFED (45037) */
-    3343, /* AFEE (45038) */
-    3343, /* AFEF (45039) */
-    3343, /* AFF0 (45040) */
-    3343, /* AFF1 (45041) */
-    3343, /* AFF2 (45042) */
-    3343, /* AFF3 (45043) */
-    3343, /* AFF4 (45044) */
-    3343, /* AFF5 (45045) */
-    3343, /* AFF6 (45046) */
-    3343, /* AFF7 (45047) */
-    3343, /* AFF8 (45048) */
-    3343, /* AFF9 (45049) */
-    3343, /* AFFA (45050) */
-    3343, /* AFFB (45051) */
-    3343, /* AFFC (45052) */
-    3343, /* AFFD (45053) */
-    3343, /* AFFE (45054) */
-    3343, /* AFFF (45055) */
-    3343, /* B000 (45056) */
-    3343, /* B001 (45057) */
-    3343, /* B002 (45058) */
-    3343, /* B003 (45059) */
-    3343, /* B004 (45060) */
-    3343, /* B005 (45061) */
-    3343, /* B006 (45062) */
-    3343, /* B007 (45063) */
-    3343, /* B008 (45064) */
-    3343, /* B009 (45065) */
-    3343, /* B00A (45066) */
-    3343, /* B00B (45067) */
-    3343, /* B00C (45068) */
-    3343, /* B00D (45069) */
-    3343, /* B00E (45070) */
-    3343, /* B00F (45071) */
-    3343, /* B010 (45072) */
-    3343, /* B011 (45073) */
-    3343, /* B012 (45074) */
-    3343, /* B013 (45075) */
-    3343, /* B014 (45076) */
-    3343, /* B015 (45077) */
-    3343, /* B016 (45078) */
-    3343, /* B017 (45079) */
-    3343, /* B018 (45080) */
-    3343, /* B019 (45081) */
-    3343, /* B01A (45082) */
-    3343, /* B01B (45083) */
-    3343, /* B01C (45084) */
-    3343, /* B01D (45085) */
-    3343, /* B01E (45086) */
-    3343, /* B01F (45087) */
-    3343, /* B020 (45088) */
-    3343, /* B021 (45089) */
-    3343, /* B022 (45090) */
-    3343, /* B023 (45091) */
-    3343, /* B024 (45092) */
-    3343, /* B025 (45093) */
-    3343, /* B026 (45094) */
-    3343, /* B027 (45095) */
-    3343, /* B028 (45096) */
-    3343, /* B029 (45097) */
-    3343, /* B02A (45098) */
-    3343, /* B02B (45099) */
-    3343, /* B02C (45100) */
-    3343, /* B02D (45101) */
-    3343, /* B02E (45102) */
-    3343, /* B02F (45103) */
-    3343, /* B030 (45104) */
-    3343, /* B031 (45105) */
-    3343, /* B032 (45106) */
-    3343, /* B033 (45107) */
-    3343, /* B034 (45108) */
-    3343, /* B035 (45109) */
-    3343, /* B036 (45110) */
-    3343, /* B037 (45111) */
-    3343, /* B038 (45112) */
-    3343, /* B039 (45113) */
-    3343, /* B03A (45114) */
-    3343, /* B03B (45115) */
-    3343, /* B03C (45116) */
-    3343, /* B03D (45117) */
-    3343, /* B03E (45118) */
-    3343, /* B03F (45119) */
-    3343, /* B040 (45120) */
-    3343, /* B041 (45121) */
-    3343, /* B042 (45122) */
-    3343, /* B043 (45123) */
-    3343, /* B044 (45124) */
-    3343, /* B045 (45125) */
-    3343, /* B046 (45126) */
-    3343, /* B047 (45127) */
-    3343, /* B048 (45128) */
-    3343, /* B049 (45129) */
-    3343, /* B04A (45130) */
-    3343, /* B04B (45131) */
-    3343, /* B04C (45132) */
-    3343, /* B04D (45133) */
-    3343, /* B04E (45134) */
-    3343, /* B04F (45135) */
-    3343, /* B050 (45136) */
-    3343, /* B051 (45137) */
-    3343, /* B052 (45138) */
-    3343, /* B053 (45139) */
-    3343, /* B054 (45140) */
-    3343, /* B055 (45141) */
-    3343, /* B056 (45142) */
-    3343, /* B057 (45143) */
-    3343, /* B058 (45144) */
-    3343, /* B059 (45145) */
-    3343, /* B05A (45146) */
-    3343, /* B05B (45147) */
-    3343, /* B05C (45148) */
-    3343, /* B05D (45149) */
-    3343, /* B05E (45150) */
-    3343, /* B05F (45151) */
-    3343, /* B060 (45152) */
-    3343, /* B061 (45153) */
-    3343, /* B062 (45154) */
-    3343, /* B063 (45155) */
-    3343, /* B064 (45156) */
-    3343, /* B065 (45157) */
-    3343, /* B066 (45158) */
-    3343, /* B067 (45159) */
-    3343, /* B068 (45160) */
-    3343, /* B069 (45161) */
-    3343, /* B06A (45162) */
-    3343, /* B06B (45163) */
-    3343, /* B06C (45164) */
-    3343, /* B06D (45165) */
-    3343, /* B06E (45166) */
-    3343, /* B06F (45167) */
-    3343, /* B070 (45168) */
-    3343, /* B071 (45169) */
-    3343, /* B072 (45170) */
-    3343, /* B073 (45171) */
-    3343, /* B074 (45172) */
-    3343, /* B075 (45173) */
-    3343, /* B076 (45174) */
-    3343, /* B077 (45175) */
-    3343, /* B078 (45176) */
-    3343, /* B079 (45177) */
-    3343, /* B07A (45178) */
-    3343, /* B07B (45179) */
-    3343, /* B07C (45180) */
-    3343, /* B07D (45181) */
-    3343, /* B07E (45182) */
-    3343, /* B07F (45183) */
-    3343, /* B080 (45184) */
-    3343, /* B081 (45185) */
-    3343, /* B082 (45186) */
-    3343, /* B083 (45187) */
-    3343, /* B084 (45188) */
-    3343, /* B085 (45189) */
-    3343, /* B086 (45190) */
-    3343, /* B087 (45191) */
-    3343, /* B088 (45192) */
-    3343, /* B089 (45193) */
-    3343, /* B08A (45194) */
-    3343, /* B08B (45195) */
-    3343, /* B08C (45196) */
-    3343, /* B08D (45197) */
-    3343, /* B08E (45198) */
-    3343, /* B08F (45199) */
-    3343, /* B090 (45200) */
-    3343, /* B091 (45201) */
-    3343, /* B092 (45202) */
-    3343, /* B093 (45203) */
-    3343, /* B094 (45204) */
-    3343, /* B095 (45205) */
-    3343, /* B096 (45206) */
-    3343, /* B097 (45207) */
-    3343, /* B098 (45208) */
-    3343, /* B099 (45209) */
-    3343, /* B09A (45210) */
-    3343, /* B09B (45211) */
-    3343, /* B09C (45212) */
-    3343, /* B09D (45213) */
-    3343, /* B09E (45214) */
-    3343, /* B09F (45215) */
-    3343, /* B0A0 (45216) */
-    3343, /* B0A1 (45217) */
-    3343, /* B0A2 (45218) */
-    3343, /* B0A3 (45219) */
-    3343, /* B0A4 (45220) */
-    3343, /* B0A5 (45221) */
-    3343, /* B0A6 (45222) */
-    3343, /* B0A7 (45223) */
-    3343, /* B0A8 (45224) */
-    3343, /* B0A9 (45225) */
-    3343, /* B0AA (45226) */
-    3343, /* B0AB (45227) */
-    3343, /* B0AC (45228) */
-    3343, /* B0AD (45229) */
-    3343, /* B0AE (45230) */
-    3343, /* B0AF (45231) */
-    3343, /* B0B0 (45232) */
-    3343, /* B0B1 (45233) */
-    3343, /* B0B2 (45234) */
-    3343, /* B0B3 (45235) */
-    3343, /* B0B4 (45236) */
-    3343, /* B0B5 (45237) */
-    3343, /* B0B6 (45238) */
-    3343, /* B0B7 (45239) */
-    3343, /* B0B8 (45240) */
-    3343, /* B0B9 (45241) */
-    3343, /* B0BA (45242) */
-    3343, /* B0BB (45243) */
-    3343, /* B0BC (45244) */
-    3343, /* B0BD (45245) */
-    3343, /* B0BE (45246) */
-    3343, /* B0BF (45247) */
-    3343, /* B0C0 (45248) */
-    3343, /* B0C1 (45249) */
-    3343, /* B0C2 (45250) */
-    3343, /* B0C3 (45251) */
-    3343, /* B0C4 (45252) */
-    3343, /* B0C5 (45253) */
-    3343, /* B0C6 (45254) */
-    3343, /* B0C7 (45255) */
-    3343, /* B0C8 (45256) */
-    3343, /* B0C9 (45257) */
-    3343, /* B0CA (45258) */
-    3343, /* B0CB (45259) */
-    3343, /* B0CC (45260) */
-    3343, /* B0CD (45261) */
-    3343, /* B0CE (45262) */
-    3343, /* B0CF (45263) */
-    3343, /* B0D0 (45264) */
-    3343, /* B0D1 (45265) */
-    3343, /* B0D2 (45266) */
-    3343, /* B0D3 (45267) */
-    3343, /* B0D4 (45268) */
-    3343, /* B0D5 (45269) */
-    3343, /* B0D6 (45270) */
-    3343, /* B0D7 (45271) */
-    3343, /* B0D8 (45272) */
-    3343, /* B0D9 (45273) */
-    3343, /* B0DA (45274) */
-    3343, /* B0DB (45275) */
-    3343, /* B0DC (45276) */
-    3343, /* B0DD (45277) */
-    3343, /* B0DE (45278) */
-    3343, /* B0DF (45279) */
-    3343, /* B0E0 (45280) */
-    3343, /* B0E1 (45281) */
-    3343, /* B0E2 (45282) */
-    3343, /* B0E3 (45283) */
-    3343, /* B0E4 (45284) */
-    3343, /* B0E5 (45285) */
-    3343, /* B0E6 (45286) */
-    3343, /* B0E7 (45287) */
-    3343, /* B0E8 (45288) */
-    3343, /* B0E9 (45289) */
-    3343, /* B0EA (45290) */
-    3343, /* B0EB (45291) */
-    3343, /* B0EC (45292) */
-    3343, /* B0ED (45293) */
-    3343, /* B0EE (45294) */
-    3343, /* B0EF (45295) */
-    3343, /* B0F0 (45296) */
-    3343, /* B0F1 (45297) */
-    3343, /* B0F2 (45298) */
-    3343, /* B0F3 (45299) */
-    3343, /* B0F4 (45300) */
-    3343, /* B0F5 (45301) */
-    3343, /* B0F6 (45302) */
-    3343, /* B0F7 (45303) */
-    3343, /* B0F8 (45304) */
-    3343, /* B0F9 (45305) */
-    3343, /* B0FA (45306) */
-    3343, /* B0FB (45307) */
-    3343, /* B0FC (45308) */
-    3343, /* B0FD (45309) */
-    3343, /* B0FE (45310) */
-    3343, /* B0FF (45311) */
-    3343, /* B100 (45312) */
-    3343, /* B101 (45313) */
-    3343, /* B102 (45314) */
-    3343, /* B103 (45315) */
-    3343, /* B104 (45316) */
-    3343, /* B105 (45317) */
-    3343, /* B106 (45318) */
-    3343, /* B107 (45319) */
-    3343, /* B108 (45320) */
-    3343, /* B109 (45321) */
-    3343, /* B10A (45322) */
-    3343, /* B10B (45323) */
-    3343, /* B10C (45324) */
-    3343, /* B10D (45325) */
-    3343, /* B10E (45326) */
-    3343, /* B10F (45327) */
-    3343, /* B110 (45328) */
-    3343, /* B111 (45329) */
-    3343, /* B112 (45330) */
-    3343, /* B113 (45331) */
-    3343, /* B114 (45332) */
-    3343, /* B115 (45333) */
-    3343, /* B116 (45334) */
-    3343, /* B117 (45335) */
-    3343, /* B118 (45336) */
-    3343, /* B119 (45337) */
-    3343, /* B11A (45338) */
-    3343, /* B11B (45339) */
-    3343, /* B11C (45340) */
-    3343, /* B11D (45341) */
-    3343, /* B11E (45342) */
-    3343, /* B11F (45343) */
-    3343, /* B120 (45344) */
-    3343, /* B121 (45345) */
-    3343, /* B122 (45346) */
-    3343, /* B123 (45347) */
-    3343, /* B124 (45348) */
-    3343, /* B125 (45349) */
-    3343, /* B126 (45350) */
-    3343, /* B127 (45351) */
-    3343, /* B128 (45352) */
-    3343, /* B129 (45353) */
-    3343, /* B12A (45354) */
-    3343, /* B12B (45355) */
-    3343, /* B12C (45356) */
-    3343, /* B12D (45357) */
-    3343, /* B12E (45358) */
-    3343, /* B12F (45359) */
-    3343, /* B130 (45360) */
-    3343, /* B131 (45361) */
-    3343, /* B132 (45362) */
-    3343, /* B133 (45363) */
-    3343, /* B134 (45364) */
-    3343, /* B135 (45365) */
-    3343, /* B136 (45366) */
-    3343, /* B137 (45367) */
-    3343, /* B138 (45368) */
-    3343, /* B139 (45369) */
-    3343, /* B13A (45370) */
-    3343, /* B13B (45371) */
-    3343, /* B13C (45372) */
-    3343, /* B13D (45373) */
-    3343, /* B13E (45374) */
-    3343, /* B13F (45375) */
-    3343, /* B140 (45376) */
-    3343, /* B141 (45377) */
-    3343, /* B142 (45378) */
-    3343, /* B143 (45379) */
-    3343, /* B144 (45380) */
-    3343, /* B145 (45381) */
-    3343, /* B146 (45382) */
-    3343, /* B147 (45383) */
-    3343, /* B148 (45384) */
-    3343, /* B149 (45385) */
-    3343, /* B14A (45386) */
-    3343, /* B14B (45387) */
-    3343, /* B14C (45388) */
-    3343, /* B14D (45389) */
-    3343, /* B14E (45390) */
-    3343, /* B14F (45391) */
-    3343, /* B150 (45392) */
-    3343, /* B151 (45393) */
-    3343, /* B152 (45394) */
-    3343, /* B153 (45395) */
-    3343, /* B154 (45396) */
-    3343, /* B155 (45397) */
-    3343, /* B156 (45398) */
-    3343, /* B157 (45399) */
-    3343, /* B158 (45400) */
-    3343, /* B159 (45401) */
-    3343, /* B15A (45402) */
-    3343, /* B15B (45403) */
-    3343, /* B15C (45404) */
-    3343, /* B15D (45405) */
-    3343, /* B15E (45406) */
-    3343, /* B15F (45407) */
-    3343, /* B160 (45408) */
-    3343, /* B161 (45409) */
-    3343, /* B162 (45410) */
-    3343, /* B163 (45411) */
-    3343, /* B164 (45412) */
-    3343, /* B165 (45413) */
-    3343, /* B166 (45414) */
-    3343, /* B167 (45415) */
-    3343, /* B168 (45416) */
-    3343, /* B169 (45417) */
-    3343, /* B16A (45418) */
-    3343, /* B16B (45419) */
-    3343, /* B16C (45420) */
-    3343, /* B16D (45421) */
-    3343, /* B16E (45422) */
-    3343, /* B16F (45423) */
-    3343, /* B170 (45424) */
-    3343, /* B171 (45425) */
-    3343, /* B172 (45426) */
-    3343, /* B173 (45427) */
-    3343, /* B174 (45428) */
-    3343, /* B175 (45429) */
-    3343, /* B176 (45430) */
-    3343, /* B177 (45431) */
-    3343, /* B178 (45432) */
-    3343, /* B179 (45433) */
-    3343, /* B17A (45434) */
-    3343, /* B17B (45435) */
-    3343, /* B17C (45436) */
-    3343, /* B17D (45437) */
-    3343, /* B17E (45438) */
-    3343, /* B17F (45439) */
-    3343, /* B180 (45440) */
-    3343, /* B181 (45441) */
-    3343, /* B182 (45442) */
-    3343, /* B183 (45443) */
-    3343, /* B184 (45444) */
-    3343, /* B185 (45445) */
-    3343, /* B186 (45446) */
-    3343, /* B187 (45447) */
-    3343, /* B188 (45448) */
-    3343, /* B189 (45449) */
-    3343, /* B18A (45450) */
-    3343, /* B18B (45451) */
-    3343, /* B18C (45452) */
-    3343, /* B18D (45453) */
-    3343, /* B18E (45454) */
-    3343, /* B18F (45455) */
-    3343, /* B190 (45456) */
-    3343, /* B191 (45457) */
-    3343, /* B192 (45458) */
-    3343, /* B193 (45459) */
-    3343, /* B194 (45460) */
-    3343, /* B195 (45461) */
-    3343, /* B196 (45462) */
-    3343, /* B197 (45463) */
-    3343, /* B198 (45464) */
-    3343, /* B199 (45465) */
-    3343, /* B19A (45466) */
-    3343, /* B19B (45467) */
-    3343, /* B19C (45468) */
-    3343, /* B19D (45469) */
-    3343, /* B19E (45470) */
-    3343, /* B19F (45471) */
-    3343, /* B1A0 (45472) */
-    3343, /* B1A1 (45473) */
-    3343, /* B1A2 (45474) */
-    3343, /* B1A3 (45475) */
-    3343, /* B1A4 (45476) */
-    3343, /* B1A5 (45477) */
-    3343, /* B1A6 (45478) */
-    3343, /* B1A7 (45479) */
-    3343, /* B1A8 (45480) */
-    3343, /* B1A9 (45481) */
-    3343, /* B1AA (45482) */
-    3343, /* B1AB (45483) */
-    3343, /* B1AC (45484) */
-    3343, /* B1AD (45485) */
-    3343, /* B1AE (45486) */
-    3343, /* B1AF (45487) */
-    3343, /* B1B0 (45488) */
-    3343, /* B1B1 (45489) */
-    3343, /* B1B2 (45490) */
-    3343, /* B1B3 (45491) */
-    3343, /* B1B4 (45492) */
-    3343, /* B1B5 (45493) */
-    3343, /* B1B6 (45494) */
-    3343, /* B1B7 (45495) */
-    3343, /* B1B8 (45496) */
-    3343, /* B1B9 (45497) */
-    3343, /* B1BA (45498) */
-    3343, /* B1BB (45499) */
-    3343, /* B1BC (45500) */
-    3343, /* B1BD (45501) */
-    3343, /* B1BE (45502) */
-    3343, /* B1BF (45503) */
-    3343, /* B1C0 (45504) */
-    3343, /* B1C1 (45505) */
-    3343, /* B1C2 (45506) */
-    3343, /* B1C3 (45507) */
-    3343, /* B1C4 (45508) */
-    3343, /* B1C5 (45509) */
-    3343, /* B1C6 (45510) */
-    3343, /* B1C7 (45511) */
-    3343, /* B1C8 (45512) */
-    3343, /* B1C9 (45513) */
-    3343, /* B1CA (45514) */
-    3343, /* B1CB (45515) */
-    3343, /* B1CC (45516) */
-    3343, /* B1CD (45517) */
-    3343, /* B1CE (45518) */
-    3343, /* B1CF (45519) */
-    3343, /* B1D0 (45520) */
-    3343, /* B1D1 (45521) */
-    3343, /* B1D2 (45522) */
-    3343, /* B1D3 (45523) */
-    3343, /* B1D4 (45524) */
-    3343, /* B1D5 (45525) */
-    3343, /* B1D6 (45526) */
-    3343, /* B1D7 (45527) */
-    3343, /* B1D8 (45528) */
-    3343, /* B1D9 (45529) */
-    3343, /* B1DA (45530) */
-    3343, /* B1DB (45531) */
-    3343, /* B1DC (45532) */
-    3343, /* B1DD (45533) */
-    3343, /* B1DE (45534) */
-    3343, /* B1DF (45535) */
-    3343, /* B1E0 (45536) */
-    3343, /* B1E1 (45537) */
-    3343, /* B1E2 (45538) */
-    3343, /* B1E3 (45539) */
-    3343, /* B1E4 (45540) */
-    3343, /* B1E5 (45541) */
-    3343, /* B1E6 (45542) */
-    3343, /* B1E7 (45543) */
-    3343, /* B1E8 (45544) */
-    3343, /* B1E9 (45545) */
-    3343, /* B1EA (45546) */
-    3343, /* B1EB (45547) */
-    3343, /* B1EC (45548) */
-    3343, /* B1ED (45549) */
-    3343, /* B1EE (45550) */
-    3343, /* B1EF (45551) */
-    3343, /* B1F0 (45552) */
-    3343, /* B1F1 (45553) */
-    3343, /* B1F2 (45554) */
-    3343, /* B1F3 (45555) */
-    3343, /* B1F4 (45556) */
-    3343, /* B1F5 (45557) */
-    3343, /* B1F6 (45558) */
-    3343, /* B1F7 (45559) */
-    3343, /* B1F8 (45560) */
-    3343, /* B1F9 (45561) */
-    3343, /* B1FA (45562) */
-    3343, /* B1FB (45563) */
-    3343, /* B1FC (45564) */
-    3343, /* B1FD (45565) */
-    3343, /* B1FE (45566) */
-    3343, /* B1FF (45567) */
-    3343, /* B200 (45568) */
-    3343, /* B201 (45569) */
-    3343, /* B202 (45570) */
-    3343, /* B203 (45571) */
-    3343, /* B204 (45572) */
-    3343, /* B205 (45573) */
-    3343, /* B206 (45574) */
-    3343, /* B207 (45575) */
-    3343, /* B208 (45576) */
-    3343, /* B209 (45577) */
-    3343, /* B20A (45578) */
-    3343, /* B20B (45579) */
-    3343, /* B20C (45580) */
-    3343, /* B20D (45581) */
-    3343, /* B20E (45582) */
-    3343, /* B20F (45583) */
-    3343, /* B210 (45584) */
-    3343, /* B211 (45585) */
-    3343, /* B212 (45586) */
-    3343, /* B213 (45587) */
-    3343, /* B214 (45588) */
-    3343, /* B215 (45589) */
-    3343, /* B216 (45590) */
-    3343, /* B217 (45591) */
-    3343, /* B218 (45592) */
-    3343, /* B219 (45593) */
-    3343, /* B21A (45594) */
-    3343, /* B21B (45595) */
-    3343, /* B21C (45596) */
-    3343, /* B21D (45597) */
-    3343, /* B21E (45598) */
-    3343, /* B21F (45599) */
-    3343, /* B220 (45600) */
-    3343, /* B221 (45601) */
-    3343, /* B222 (45602) */
-    3343, /* B223 (45603) */
-    3343, /* B224 (45604) */
-    3343, /* B225 (45605) */
-    3343, /* B226 (45606) */
-    3343, /* B227 (45607) */
-    3343, /* B228 (45608) */
-    3343, /* B229 (45609) */
-    3343, /* B22A (45610) */
-    3343, /* B22B (45611) */
-    3343, /* B22C (45612) */
-    3343, /* B22D (45613) */
-    3343, /* B22E (45614) */
-    3343, /* B22F (45615) */
-    3343, /* B230 (45616) */
-    3343, /* B231 (45617) */
-    3343, /* B232 (45618) */
-    3343, /* B233 (45619) */
-    3343, /* B234 (45620) */
-    3343, /* B235 (45621) */
-    3343, /* B236 (45622) */
-    3343, /* B237 (45623) */
-    3343, /* B238 (45624) */
-    3343, /* B239 (45625) */
-    3343, /* B23A (45626) */
-    3343, /* B23B (45627) */
-    3343, /* B23C (45628) */
-    3343, /* B23D (45629) */
-    3343, /* B23E (45630) */
-    3343, /* B23F (45631) */
-    3343, /* B240 (45632) */
-    3343, /* B241 (45633) */
-    3343, /* B242 (45634) */
-    3343, /* B243 (45635) */
-    3343, /* B244 (45636) */
-    3343, /* B245 (45637) */
-    3343, /* B246 (45638) */
-    3343, /* B247 (45639) */
-    3343, /* B248 (45640) */
-    3343, /* B249 (45641) */
-    3343, /* B24A (45642) */
-    3343, /* B24B (45643) */
-    3343, /* B24C (45644) */
-    3343, /* B24D (45645) */
-    3343, /* B24E (45646) */
-    3343, /* B24F (45647) */
-    3343, /* B250 (45648) */
-    3343, /* B251 (45649) */
-    3343, /* B252 (45650) */
-    3343, /* B253 (45651) */
-    3343, /* B254 (45652) */
-    3343, /* B255 (45653) */
-    3343, /* B256 (45654) */
-    3343, /* B257 (45655) */
-    3343, /* B258 (45656) */
-    3343, /* B259 (45657) */
-    3343, /* B25A (45658) */
-    3343, /* B25B (45659) */
-    3343, /* B25C (45660) */
-    3343, /* B25D (45661) */
-    3343, /* B25E (45662) */
-    3343, /* B25F (45663) */
-    3343, /* B260 (45664) */
-    3343, /* B261 (45665) */
-    3343, /* B262 (45666) */
-    3343, /* B263 (45667) */
-    3343, /* B264 (45668) */
-    3343, /* B265 (45669) */
-    3343, /* B266 (45670) */
-    3343, /* B267 (45671) */
-    3343, /* B268 (45672) */
-    3343, /* B269 (45673) */
-    3343, /* B26A (45674) */
-    3343, /* B26B (45675) */
-    3343, /* B26C (45676) */
-    3343, /* B26D (45677) */
-    3343, /* B26E (45678) */
-    3343, /* B26F (45679) */
-    3343, /* B270 (45680) */
-    3343, /* B271 (45681) */
-    3343, /* B272 (45682) */
-    3343, /* B273 (45683) */
-    3343, /* B274 (45684) */
-    3343, /* B275 (45685) */
-    3343, /* B276 (45686) */
-    3343, /* B277 (45687) */
-    3343, /* B278 (45688) */
-    3343, /* B279 (45689) */
-    3343, /* B27A (45690) */
-    3343, /* B27B (45691) */
-    3343, /* B27C (45692) */
-    3343, /* B27D (45693) */
-    3343, /* B27E (45694) */
-    3343, /* B27F (45695) */
-    3343, /* B280 (45696) */
-    3343, /* B281 (45697) */
-    3343, /* B282 (45698) */
-    3343, /* B283 (45699) */
-    3343, /* B284 (45700) */
-    3343, /* B285 (45701) */
-    3343, /* B286 (45702) */
-    3343, /* B287 (45703) */
-    3343, /* B288 (45704) */
-    3343, /* B289 (45705) */
-    3343, /* B28A (45706) */
-    3343, /* B28B (45707) */
-    3343, /* B28C (45708) */
-    3343, /* B28D (45709) */
-    3343, /* B28E (45710) */
-    3343, /* B28F (45711) */
-    3343, /* B290 (45712) */
-    3343, /* B291 (45713) */
-    3343, /* B292 (45714) */
-    3343, /* B293 (45715) */
-    3343, /* B294 (45716) */
-    3343, /* B295 (45717) */
-    3343, /* B296 (45718) */
-    3343, /* B297 (45719) */
-    3343, /* B298 (45720) */
-    3343, /* B299 (45721) */
-    3343, /* B29A (45722) */
-    3343, /* B29B (45723) */
-    3343, /* B29C (45724) */
-    3343, /* B29D (45725) */
-    3343, /* B29E (45726) */
-    3343, /* B29F (45727) */
-    3343, /* B2A0 (45728) */
-    3343, /* B2A1 (45729) */
-    3343, /* B2A2 (45730) */
-    3343, /* B2A3 (45731) */
-    3343, /* B2A4 (45732) */
-    3343, /* B2A5 (45733) */
-    3343, /* B2A6 (45734) */
-    3343, /* B2A7 (45735) */
-    3343, /* B2A8 (45736) */
-    3343, /* B2A9 (45737) */
-    3343, /* B2AA (45738) */
-    3343, /* B2AB (45739) */
-    3343, /* B2AC (45740) */
-    3343, /* B2AD (45741) */
-    3343, /* B2AE (45742) */
-    3343, /* B2AF (45743) */
-    3343, /* B2B0 (45744) */
-    3343, /* B2B1 (45745) */
-    3343, /* B2B2 (45746) */
-    3343, /* B2B3 (45747) */
-    3343, /* B2B4 (45748) */
-    3343, /* B2B5 (45749) */
-    3343, /* B2B6 (45750) */
-    3343, /* B2B7 (45751) */
-    3343, /* B2B8 (45752) */
-    3343, /* B2B9 (45753) */
-    3343, /* B2BA (45754) */
-    3343, /* B2BB (45755) */
-    3343, /* B2BC (45756) */
-    3343, /* B2BD (45757) */
-    3343, /* B2BE (45758) */
-    3343, /* B2BF (45759) */
-    3343, /* B2C0 (45760) */
-    3343, /* B2C1 (45761) */
-    3343, /* B2C2 (45762) */
-    3343, /* B2C3 (45763) */
-    3343, /* B2C4 (45764) */
-    3343, /* B2C5 (45765) */
-    3343, /* B2C6 (45766) */
-    3343, /* B2C7 (45767) */
-    3343, /* B2C8 (45768) */
-    3343, /* B2C9 (45769) */
-    3343, /* B2CA (45770) */
-    3343, /* B2CB (45771) */
-    3343, /* B2CC (45772) */
-    3343, /* B2CD (45773) */
-    3343, /* B2CE (45774) */
-    3343, /* B2CF (45775) */
-    3343, /* B2D0 (45776) */
-    3343, /* B2D1 (45777) */
-    3343, /* B2D2 (45778) */
-    3343, /* B2D3 (45779) */
-    3343, /* B2D4 (45780) */
-    3343, /* B2D5 (45781) */
-    3343, /* B2D6 (45782) */
-    3343, /* B2D7 (45783) */
-    3343, /* B2D8 (45784) */
-    3343, /* B2D9 (45785) */
-    3343, /* B2DA (45786) */
-    3343, /* B2DB (45787) */
-    3343, /* B2DC (45788) */
-    3343, /* B2DD (45789) */
-    3343, /* B2DE (45790) */
-    3343, /* B2DF (45791) */
-    3343, /* B2E0 (45792) */
-    3343, /* B2E1 (45793) */
-    3343, /* B2E2 (45794) */
-    3343, /* B2E3 (45795) */
-    3343, /* B2E4 (45796) */
-    3343, /* B2E5 (45797) */
-    3343, /* B2E6 (45798) */
-    3343, /* B2E7 (45799) */
-    3343, /* B2E8 (45800) */
-    3343, /* B2E9 (45801) */
-    3343, /* B2EA (45802) */
-    3343, /* B2EB (45803) */
-    3343, /* B2EC (45804) */
-    3343, /* B2ED (45805) */
-    3343, /* B2EE (45806) */
-    3343, /* B2EF (45807) */
-    3343, /* B2F0 (45808) */
-    3343, /* B2F1 (45809) */
-    3343, /* B2F2 (45810) */
-    3343, /* B2F3 (45811) */
-    3343, /* B2F4 (45812) */
-    3343, /* B2F5 (45813) */
-    3343, /* B2F6 (45814) */
-    3343, /* B2F7 (45815) */
-    3343, /* B2F8 (45816) */
-    3343, /* B2F9 (45817) */
-    3343, /* B2FA (45818) */
-    3343, /* B2FB (45819) */
-    3343, /* B2FC (45820) */
-    3343, /* B2FD (45821) */
-    3343, /* B2FE (45822) */
-    3343, /* B2FF (45823) */
-    3343, /* B300 (45824) */
-    3343, /* B301 (45825) */
-    3343, /* B302 (45826) */
-    3343, /* B303 (45827) */
-    3343, /* B304 (45828) */
-    3343, /* B305 (45829) */
-    3343, /* B306 (45830) */
-    3343, /* B307 (45831) */
-    3343, /* B308 (45832) */
-    3343, /* B309 (45833) */
-    3343, /* B30A (45834) */
-    3343, /* B30B (45835) */
-    3343, /* B30C (45836) */
-    3343, /* B30D (45837) */
-    3343, /* B30E (45838) */
-    3343, /* B30F (45839) */
-    3343, /* B310 (45840) */
-    3343, /* B311 (45841) */
-    3343, /* B312 (45842) */
-    3343, /* B313 (45843) */
-    3343, /* B314 (45844) */
-    3343, /* B315 (45845) */
-    3343, /* B316 (45846) */
-    3343, /* B317 (45847) */
-    3343, /* B318 (45848) */
-    3343, /* B319 (45849) */
-    3343, /* B31A (45850) */
-    3343, /* B31B (45851) */
-    3343, /* B31C (45852) */
-    3343, /* B31D (45853) */
-    3343, /* B31E (45854) */
-    3343, /* B31F (45855) */
-    3343, /* B320 (45856) */
-    3343, /* B321 (45857) */
-    3343, /* B322 (45858) */
-    3343, /* B323 (45859) */
-    3343, /* B324 (45860) */
-    3343, /* B325 (45861) */
-    3343, /* B326 (45862) */
-    3343, /* B327 (45863) */
-    3343, /* B328 (45864) */
-    3343, /* B329 (45865) */
-    3343, /* B32A (45866) */
-    3343, /* B32B (45867) */
-    3343, /* B32C (45868) */
-    3343, /* B32D (45869) */
-    3343, /* B32E (45870) */
-    3343, /* B32F (45871) */
-    3343, /* B330 (45872) */
-    3343, /* B331 (45873) */
-    3343, /* B332 (45874) */
-    3343, /* B333 (45875) */
-    3343, /* B334 (45876) */
-    3343, /* B335 (45877) */
-    3343, /* B336 (45878) */
-    3343, /* B337 (45879) */
-    3343, /* B338 (45880) */
-    3343, /* B339 (45881) */
-    3343, /* B33A (45882) */
-    3343, /* B33B (45883) */
-    3343, /* B33C (45884) */
-    3343, /* B33D (45885) */
-    3343, /* B33E (45886) */
-    3343, /* B33F (45887) */
-    3343, /* B340 (45888) */
-    3343, /* B341 (45889) */
-    3343, /* B342 (45890) */
-    3343, /* B343 (45891) */
-    3343, /* B344 (45892) */
-    3343, /* B345 (45893) */
-    3343, /* B346 (45894) */
-    3343, /* B347 (45895) */
-    3343, /* B348 (45896) */
-    3343, /* B349 (45897) */
-    3343, /* B34A (45898) */
-    3343, /* B34B (45899) */
-    3343, /* B34C (45900) */
-    3343, /* B34D (45901) */
-    3343, /* B34E (45902) */
-    3343, /* B34F (45903) */
-    3343, /* B350 (45904) */
-    3343, /* B351 (45905) */
-    3343, /* B352 (45906) */
-    3343, /* B353 (45907) */
-    3343, /* B354 (45908) */
-    3343, /* B355 (45909) */
-    3343, /* B356 (45910) */
-    3343, /* B357 (45911) */
-    3343, /* B358 (45912) */
-    3343, /* B359 (45913) */
-    3343, /* B35A (45914) */
-    3343, /* B35B (45915) */
-    3343, /* B35C (45916) */
-    3343, /* B35D (45917) */
-    3343, /* B35E (45918) */
-    3343, /* B35F (45919) */
-    3343, /* B360 (45920) */
-    3343, /* B361 (45921) */
-    3343, /* B362 (45922) */
-    3343, /* B363 (45923) */
-    3343, /* B364 (45924) */
-    3343, /* B365 (45925) */
-    3343, /* B366 (45926) */
-    3343, /* B367 (45927) */
-    3343, /* B368 (45928) */
-    3343, /* B369 (45929) */
-    3343, /* B36A (45930) */
-    3343, /* B36B (45931) */
-    3343, /* B36C (45932) */
-    3343, /* B36D (45933) */
-    3343, /* B36E (45934) */
-    3343, /* B36F (45935) */
-    3343, /* B370 (45936) */
-    3343, /* B371 (45937) */
-    3343, /* B372 (45938) */
-    3343, /* B373 (45939) */
-    3343, /* B374 (45940) */
-    3343, /* B375 (45941) */
-    3343, /* B376 (45942) */
-    3343, /* B377 (45943) */
-    3343, /* B378 (45944) */
-    3343, /* B379 (45945) */
-    3343, /* B37A (45946) */
-    3343, /* B37B (45947) */
-    3343, /* B37C (45948) */
-    3343, /* B37D (45949) */
-    3343, /* B37E (45950) */
-    3343, /* B37F (45951) */
-    3343, /* B380 (45952) */
-    3343, /* B381 (45953) */
-    3343, /* B382 (45954) */
-    3343, /* B383 (45955) */
-    3343, /* B384 (45956) */
-    3343, /* B385 (45957) */
-    3343, /* B386 (45958) */
-    3343, /* B387 (45959) */
-    3343, /* B388 (45960) */
-    3343, /* B389 (45961) */
-    3343, /* B38A (45962) */
-    3343, /* B38B (45963) */
-    3343, /* B38C (45964) */
-    3343, /* B38D (45965) */
-    3343, /* B38E (45966) */
-    3343, /* B38F (45967) */
-    3343, /* B390 (45968) */
-    3343, /* B391 (45969) */
-    3343, /* B392 (45970) */
-    3343, /* B393 (45971) */
-    3343, /* B394 (45972) */
-    3343, /* B395 (45973) */
-    3343, /* B396 (45974) */
-    3343, /* B397 (45975) */
-    3343, /* B398 (45976) */
-    3343, /* B399 (45977) */
-    3343, /* B39A (45978) */
-    3343, /* B39B (45979) */
-    3343, /* B39C (45980) */
-    3343, /* B39D (45981) */
-    3343, /* B39E (45982) */
-    3343, /* B39F (45983) */
-    3343, /* B3A0 (45984) */
-    3343, /* B3A1 (45985) */
-    3343, /* B3A2 (45986) */
-    3343, /* B3A3 (45987) */
-    3343, /* B3A4 (45988) */
-    3343, /* B3A5 (45989) */
-    3343, /* B3A6 (45990) */
-    3343, /* B3A7 (45991) */
-    3343, /* B3A8 (45992) */
-    3343, /* B3A9 (45993) */
-    3343, /* B3AA (45994) */
-    3343, /* B3AB (45995) */
-    3343, /* B3AC (45996) */
-    3343, /* B3AD (45997) */
-    3343, /* B3AE (45998) */
-    3343, /* B3AF (45999) */
-    3343, /* B3B0 (46000) */
-    3343, /* B3B1 (46001) */
-    3343, /* B3B2 (46002) */
-    3343, /* B3B3 (46003) */
-    3343, /* B3B4 (46004) */
-    3343, /* B3B5 (46005) */
-    3343, /* B3B6 (46006) */
-    3343, /* B3B7 (46007) */
-    3343, /* B3B8 (46008) */
-    3343, /* B3B9 (46009) */
-    3343, /* B3BA (46010) */
-    3343, /* B3BB (46011) */
-    3343, /* B3BC (46012) */
-    3343, /* B3BD (46013) */
-    3343, /* B3BE (46014) */
-    3343, /* B3BF (46015) */
-    3343, /* B3C0 (46016) */
-    3343, /* B3C1 (46017) */
-    3343, /* B3C2 (46018) */
-    3343, /* B3C3 (46019) */
-    3343, /* B3C4 (46020) */
-    3343, /* B3C5 (46021) */
-    3343, /* B3C6 (46022) */
-    3343, /* B3C7 (46023) */
-    3343, /* B3C8 (46024) */
-    3343, /* B3C9 (46025) */
-    3343, /* B3CA (46026) */
-    3343, /* B3CB (46027) */
-    3343, /* B3CC (46028) */
-    3343, /* B3CD (46029) */
-    3343, /* B3CE (46030) */
-    3343, /* B3CF (46031) */
-    3343, /* B3D0 (46032) */
-    3343, /* B3D1 (46033) */
-    3343, /* B3D2 (46034) */
-    3343, /* B3D3 (46035) */
-    3343, /* B3D4 (46036) */
-    3343, /* B3D5 (46037) */
-    3343, /* B3D6 (46038) */
-    3343, /* B3D7 (46039) */
-    3343, /* B3D8 (46040) */
-    3343, /* B3D9 (46041) */
-    3343, /* B3DA (46042) */
-    3343, /* B3DB (46043) */
-    3343, /* B3DC (46044) */
-    3343, /* B3DD (46045) */
-    3343, /* B3DE (46046) */
-    3343, /* B3DF (46047) */
-    3343, /* B3E0 (46048) */
-    3343, /* B3E1 (46049) */
-    3343, /* B3E2 (46050) */
-    3343, /* B3E3 (46051) */
-    3343, /* B3E4 (46052) */
-    3343, /* B3E5 (46053) */
-    3343, /* B3E6 (46054) */
-    3343, /* B3E7 (46055) */
-    3343, /* B3E8 (46056) */
-    3343, /* B3E9 (46057) */
-    3343, /* B3EA (46058) */
-    3343, /* B3EB (46059) */
-    3343, /* B3EC (46060) */
-    3343, /* B3ED (46061) */
-    3343, /* B3EE (46062) */
-    3343, /* B3EF (46063) */
-    3343, /* B3F0 (46064) */
-    3343, /* B3F1 (46065) */
-    3343, /* B3F2 (46066) */
-    3343, /* B3F3 (46067) */
-    3343, /* B3F4 (46068) */
-    3343, /* B3F5 (46069) */
-    3343, /* B3F6 (46070) */
-    3343, /* B3F7 (46071) */
-    3343, /* B3F8 (46072) */
-    3343, /* B3F9 (46073) */
-    3343, /* B3FA (46074) */
-    3343, /* B3FB (46075) */
-    3343, /* B3FC (46076) */
-    3343, /* B3FD (46077) */
-    3343, /* B3FE (46078) */
-    3343, /* B3FF (46079) */
-    3343, /* B400 (46080) */
-    3343, /* B401 (46081) */
-    3343, /* B402 (46082) */
-    3343, /* B403 (46083) */
-    3343, /* B404 (46084) */
-    3343, /* B405 (46085) */
-    3343, /* B406 (46086) */
-    3343, /* B407 (46087) */
-    3343, /* B408 (46088) */
-    3343, /* B409 (46089) */
-    3343, /* B40A (46090) */
-    3343, /* B40B (46091) */
-    3343, /* B40C (46092) */
-    3343, /* B40D (46093) */
-    3343, /* B40E (46094) */
-    3343, /* B40F (46095) */
-    3343, /* B410 (46096) */
-    3343, /* B411 (46097) */
-    3343, /* B412 (46098) */
-    3343, /* B413 (46099) */
-    3343, /* B414 (46100) */
-    3343, /* B415 (46101) */
-    3343, /* B416 (46102) */
-    3343, /* B417 (46103) */
-    3343, /* B418 (46104) */
-    3343, /* B419 (46105) */
-    3343, /* B41A (46106) */
-    3343, /* B41B (46107) */
-    3343, /* B41C (46108) */
-    3343, /* B41D (46109) */
-    3343, /* B41E (46110) */
-    3343, /* B41F (46111) */
-    3343, /* B420 (46112) */
-    3343, /* B421 (46113) */
-    3343, /* B422 (46114) */
-    3343, /* B423 (46115) */
-    3343, /* B424 (46116) */
-    3343, /* B425 (46117) */
-    3343, /* B426 (46118) */
-    3343, /* B427 (46119) */
-    3343, /* B428 (46120) */
-    3343, /* B429 (46121) */
-    3343, /* B42A (46122) */
-    3343, /* B42B (46123) */
-    3343, /* B42C (46124) */
-    3343, /* B42D (46125) */
-    3343, /* B42E (46126) */
-    3343, /* B42F (46127) */
-    3343, /* B430 (46128) */
-    3343, /* B431 (46129) */
-    3343, /* B432 (46130) */
-    3343, /* B433 (46131) */
-    3343, /* B434 (46132) */
-    3343, /* B435 (46133) */
-    3343, /* B436 (46134) */
-    3343, /* B437 (46135) */
-    3343, /* B438 (46136) */
-    3343, /* B439 (46137) */
-    3343, /* B43A (46138) */
-    3343, /* B43B (46139) */
-    3343, /* B43C (46140) */
-    3343, /* B43D (46141) */
-    3343, /* B43E (46142) */
-    3343, /* B43F (46143) */
-    3343, /* B440 (46144) */
-    3343, /* B441 (46145) */
-    3343, /* B442 (46146) */
-    3343, /* B443 (46147) */
-    3343, /* B444 (46148) */
-    3343, /* B445 (46149) */
-    3343, /* B446 (46150) */
-    3343, /* B447 (46151) */
-    3343, /* B448 (46152) */
-    3343, /* B449 (46153) */
-    3343, /* B44A (46154) */
-    3343, /* B44B (46155) */
-    3343, /* B44C (46156) */
-    3343, /* B44D (46157) */
-    3343, /* B44E (46158) */
-    3343, /* B44F (46159) */
-    3343, /* B450 (46160) */
-    3343, /* B451 (46161) */
-    3343, /* B452 (46162) */
-    3343, /* B453 (46163) */
-    3343, /* B454 (46164) */
-    3343, /* B455 (46165) */
-    3343, /* B456 (46166) */
-    3343, /* B457 (46167) */
-    3343, /* B458 (46168) */
-    3343, /* B459 (46169) */
-    3343, /* B45A (46170) */
-    3343, /* B45B (46171) */
-    3343, /* B45C (46172) */
-    3343, /* B45D (46173) */
-    3343, /* B45E (46174) */
-    3343, /* B45F (46175) */
-    3343, /* B460 (46176) */
-    3343, /* B461 (46177) */
-    3343, /* B462 (46178) */
-    3343, /* B463 (46179) */
-    3343, /* B464 (46180) */
-    3343, /* B465 (46181) */
-    3343, /* B466 (46182) */
-    3343, /* B467 (46183) */
-    3343, /* B468 (46184) */
-    3343, /* B469 (46185) */
-    3343, /* B46A (46186) */
-    3343, /* B46B (46187) */
-    3343, /* B46C (46188) */
-    3343, /* B46D (46189) */
-    3343, /* B46E (46190) */
-    3343, /* B46F (46191) */
-    3343, /* B470 (46192) */
-    3343, /* B471 (46193) */
-    3343, /* B472 (46194) */
-    3343, /* B473 (46195) */
-    3343, /* B474 (46196) */
-    3343, /* B475 (46197) */
-    3343, /* B476 (46198) */
-    3343, /* B477 (46199) */
-    3343, /* B478 (46200) */
-    3343, /* B479 (46201) */
-    3343, /* B47A (46202) */
-    3343, /* B47B (46203) */
-    3343, /* B47C (46204) */
-    3343, /* B47D (46205) */
-    3343, /* B47E (46206) */
-    3343, /* B47F (46207) */
-    3343, /* B480 (46208) */
-    3343, /* B481 (46209) */
-    3343, /* B482 (46210) */
-    3343, /* B483 (46211) */
-    3343, /* B484 (46212) */
-    3343, /* B485 (46213) */
-    3343, /* B486 (46214) */
-    3343, /* B487 (46215) */
-    3343, /* B488 (46216) */
-    3343, /* B489 (46217) */
-    3343, /* B48A (46218) */
-    3343, /* B48B (46219) */
-    3343, /* B48C (46220) */
-    3343, /* B48D (46221) */
-    3343, /* B48E (46222) */
-    3343, /* B48F (46223) */
-    3343, /* B490 (46224) */
-    3343, /* B491 (46225) */
-    3343, /* B492 (46226) */
-    3343, /* B493 (46227) */
-    3343, /* B494 (46228) */
-    3343, /* B495 (46229) */
-    3343, /* B496 (46230) */
-    3343, /* B497 (46231) */
-    3343, /* B498 (46232) */
-    3343, /* B499 (46233) */
-    3343, /* B49A (46234) */
-    3343, /* B49B (46235) */
-    3343, /* B49C (46236) */
-    3343, /* B49D (46237) */
-    3343, /* B49E (46238) */
-    3343, /* B49F (46239) */
-    3343, /* B4A0 (46240) */
-    3343, /* B4A1 (46241) */
-    3343, /* B4A2 (46242) */
-    3343, /* B4A3 (46243) */
-    3343, /* B4A4 (46244) */
-    3343, /* B4A5 (46245) */
-    3343, /* B4A6 (46246) */
-    3343, /* B4A7 (46247) */
-    3343, /* B4A8 (46248) */
-    3343, /* B4A9 (46249) */
-    3343, /* B4AA (46250) */
-    3343, /* B4AB (46251) */
-    3343, /* B4AC (46252) */
-    3343, /* B4AD (46253) */
-    3343, /* B4AE (46254) */
-    3343, /* B4AF (46255) */
-    3343, /* B4B0 (46256) */
-    3343, /* B4B1 (46257) */
-    3343, /* B4B2 (46258) */
-    3343, /* B4B3 (46259) */
-    3343, /* B4B4 (46260) */
-    3343, /* B4B5 (46261) */
-    3343, /* B4B6 (46262) */
-    3343, /* B4B7 (46263) */
-    3343, /* B4B8 (46264) */
-    3343, /* B4B9 (46265) */
-    3343, /* B4BA (46266) */
-    3343, /* B4BB (46267) */
-    3343, /* B4BC (46268) */
-    3343, /* B4BD (46269) */
-    3343, /* B4BE (46270) */
-    3343, /* B4BF (46271) */
-    3343, /* B4C0 (46272) */
-    3343, /* B4C1 (46273) */
-    3343, /* B4C2 (46274) */
-    3343, /* B4C3 (46275) */
-    3343, /* B4C4 (46276) */
-    3343, /* B4C5 (46277) */
-    3343, /* B4C6 (46278) */
-    3343, /* B4C7 (46279) */
-    3343, /* B4C8 (46280) */
-    3343, /* B4C9 (46281) */
-    3343, /* B4CA (46282) */
-    3343, /* B4CB (46283) */
-    3343, /* B4CC (46284) */
-    3343, /* B4CD (46285) */
-    3343, /* B4CE (46286) */
-    3343, /* B4CF (46287) */
-    3343, /* B4D0 (46288) */
-    3343, /* B4D1 (46289) */
-    3343, /* B4D2 (46290) */
-    3343, /* B4D3 (46291) */
-    3343, /* B4D4 (46292) */
-    3343, /* B4D5 (46293) */
-    3343, /* B4D6 (46294) */
-    3343, /* B4D7 (46295) */
-    3343, /* B4D8 (46296) */
-    3343, /* B4D9 (46297) */
-    3343, /* B4DA (46298) */
-    3343, /* B4DB (46299) */
-    3343, /* B4DC (46300) */
-    3343, /* B4DD (46301) */
-    3343, /* B4DE (46302) */
-    3343, /* B4DF (46303) */
-    3343, /* B4E0 (46304) */
-    3343, /* B4E1 (46305) */
-    3343, /* B4E2 (46306) */
-    3343, /* B4E3 (46307) */
-    3343, /* B4E4 (46308) */
-    3343, /* B4E5 (46309) */
-    3343, /* B4E6 (46310) */
-    3343, /* B4E7 (46311) */
-    3343, /* B4E8 (46312) */
-    3343, /* B4E9 (46313) */
-    3343, /* B4EA (46314) */
-    3343, /* B4EB (46315) */
-    3343, /* B4EC (46316) */
-    3343, /* B4ED (46317) */
-    3343, /* B4EE (46318) */
-    3343, /* B4EF (46319) */
-    3343, /* B4F0 (46320) */
-    3343, /* B4F1 (46321) */
-    3343, /* B4F2 (46322) */
-    3343, /* B4F3 (46323) */
-    3343, /* B4F4 (46324) */
-    3343, /* B4F5 (46325) */
-    3343, /* B4F6 (46326) */
-    3343, /* B4F7 (46327) */
-    3343, /* B4F8 (46328) */
-    3343, /* B4F9 (46329) */
-    3343, /* B4FA (46330) */
-    3343, /* B4FB (46331) */
-    3343, /* B4FC (46332) */
-    3343, /* B4FD (46333) */
-    3343, /* B4FE (46334) */
-    3343, /* B4FF (46335) */
-    3343, /* B500 (46336) */
-    3343, /* B501 (46337) */
-    3343, /* B502 (46338) */
-    3343, /* B503 (46339) */
-    3343, /* B504 (46340) */
-    3343, /* B505 (46341) */
-    3343, /* B506 (46342) */
-    3343, /* B507 (46343) */
-    3343, /* B508 (46344) */
-    3343, /* B509 (46345) */
-    3343, /* B50A (46346) */
-    3343, /* B50B (46347) */
-    3343, /* B50C (46348) */
-    3343, /* B50D (46349) */
-    3343, /* B50E (46350) */
-    3343, /* B50F (46351) */
-    3343, /* B510 (46352) */
-    3343, /* B511 (46353) */
-    3343, /* B512 (46354) */
-    3343, /* B513 (46355) */
-    3343, /* B514 (46356) */
-    3343, /* B515 (46357) */
-    3343, /* B516 (46358) */
-    3343, /* B517 (46359) */
-    3343, /* B518 (46360) */
-    3343, /* B519 (46361) */
-    3343, /* B51A (46362) */
-    3343, /* B51B (46363) */
-    3343, /* B51C (46364) */
-    3343, /* B51D (46365) */
-    3343, /* B51E (46366) */
-    3343, /* B51F (46367) */
-    3343, /* B520 (46368) */
-    3343, /* B521 (46369) */
-    3343, /* B522 (46370) */
-    3343, /* B523 (46371) */
-    3343, /* B524 (46372) */
-    3343, /* B525 (46373) */
-    3343, /* B526 (46374) */
-    3343, /* B527 (46375) */
-    3343, /* B528 (46376) */
-    3343, /* B529 (46377) */
-    3343, /* B52A (46378) */
-    3343, /* B52B (46379) */
-    3343, /* B52C (46380) */
-    3343, /* B52D (46381) */
-    3343, /* B52E (46382) */
-    3343, /* B52F (46383) */
-    3343, /* B530 (46384) */
-    3343, /* B531 (46385) */
-    3343, /* B532 (46386) */
-    3343, /* B533 (46387) */
-    3343, /* B534 (46388) */
-    3343, /* B535 (46389) */
-    3343, /* B536 (46390) */
-    3343, /* B537 (46391) */
-    3343, /* B538 (46392) */
-    3343, /* B539 (46393) */
-    3343, /* B53A (46394) */
-    3343, /* B53B (46395) */
-    3343, /* B53C (46396) */
-    3343, /* B53D (46397) */
-    3343, /* B53E (46398) */
-    3343, /* B53F (46399) */
-    3343, /* B540 (46400) */
-    3343, /* B541 (46401) */
-    3343, /* B542 (46402) */
-    3343, /* B543 (46403) */
-    3343, /* B544 (46404) */
-    3343, /* B545 (46405) */
-    3343, /* B546 (46406) */
-    3343, /* B547 (46407) */
-    3343, /* B548 (46408) */
-    3343, /* B549 (46409) */
-    3343, /* B54A (46410) */
-    3343, /* B54B (46411) */
-    3343, /* B54C (46412) */
-    3343, /* B54D (46413) */
-    3343, /* B54E (46414) */
-    3343, /* B54F (46415) */
-    3343, /* B550 (46416) */
-    3343, /* B551 (46417) */
-    3343, /* B552 (46418) */
-    3343, /* B553 (46419) */
-    3343, /* B554 (46420) */
-    3343, /* B555 (46421) */
-    3343, /* B556 (46422) */
-    3343, /* B557 (46423) */
-    3343, /* B558 (46424) */
-    3343, /* B559 (46425) */
-    3343, /* B55A (46426) */
-    3343, /* B55B (46427) */
-    3343, /* B55C (46428) */
-    3343, /* B55D (46429) */
-    3343, /* B55E (46430) */
-    3343, /* B55F (46431) */
-    3343, /* B560 (46432) */
-    3343, /* B561 (46433) */
-    3343, /* B562 (46434) */
-    3343, /* B563 (46435) */
-    3343, /* B564 (46436) */
-    3343, /* B565 (46437) */
-    3343, /* B566 (46438) */
-    3343, /* B567 (46439) */
-    3343, /* B568 (46440) */
-    3343, /* B569 (46441) */
-    3343, /* B56A (46442) */
-    3343, /* B56B (46443) */
-    3343, /* B56C (46444) */
-    3343, /* B56D (46445) */
-    3343, /* B56E (46446) */
-    3343, /* B56F (46447) */
-    3343, /* B570 (46448) */
-    3343, /* B571 (46449) */
-    3343, /* B572 (46450) */
-    3343, /* B573 (46451) */
-    3343, /* B574 (46452) */
-    3343, /* B575 (46453) */
-    3343, /* B576 (46454) */
-    3343, /* B577 (46455) */
-    3343, /* B578 (46456) */
-    3343, /* B579 (46457) */
-    3343, /* B57A (46458) */
-    3343, /* B57B (46459) */
-    3343, /* B57C (46460) */
-    3343, /* B57D (46461) */
-    3343, /* B57E (46462) */
-    3343, /* B57F (46463) */
-    3343, /* B580 (46464) */
-    3343, /* B581 (46465) */
-    3343, /* B582 (46466) */
-    3343, /* B583 (46467) */
-    3343, /* B584 (46468) */
-    3343, /* B585 (46469) */
-    3343, /* B586 (46470) */
-    3343, /* B587 (46471) */
-    3343, /* B588 (46472) */
-    3343, /* B589 (46473) */
-    3343, /* B58A (46474) */
-    3343, /* B58B (46475) */
-    3343, /* B58C (46476) */
-    3343, /* B58D (46477) */
-    3343, /* B58E (46478) */
-    3343, /* B58F (46479) */
-    3343, /* B590 (46480) */
-    3343, /* B591 (46481) */
-    3343, /* B592 (46482) */
-    3343, /* B593 (46483) */
-    3343, /* B594 (46484) */
-    3343, /* B595 (46485) */
-    3343, /* B596 (46486) */
-    3343, /* B597 (46487) */
-    3343, /* B598 (46488) */
-    3343, /* B599 (46489) */
-    3343, /* B59A (46490) */
-    3343, /* B59B (46491) */
-    3343, /* B59C (46492) */
-    3343, /* B59D (46493) */
-    3343, /* B59E (46494) */
-    3343, /* B59F (46495) */
-    3343, /* B5A0 (46496) */
-    3343, /* B5A1 (46497) */
-    3343, /* B5A2 (46498) */
-    3343, /* B5A3 (46499) */
-    3343, /* B5A4 (46500) */
-    3343, /* B5A5 (46501) */
-    3343, /* B5A6 (46502) */
-    3343, /* B5A7 (46503) */
-    3343, /* B5A8 (46504) */
-    3343, /* B5A9 (46505) */
-    3343, /* B5AA (46506) */
-    3343, /* B5AB (46507) */
-    3343, /* B5AC (46508) */
-    3343, /* B5AD (46509) */
-    3343, /* B5AE (46510) */
-    3343, /* B5AF (46511) */
-    3343, /* B5B0 (46512) */
-    3343, /* B5B1 (46513) */
-    3343, /* B5B2 (46514) */
-    3343, /* B5B3 (46515) */
-    3343, /* B5B4 (46516) */
-    3343, /* B5B5 (46517) */
-    3343, /* B5B6 (46518) */
-    3343, /* B5B7 (46519) */
-    3343, /* B5B8 (46520) */
-    3343, /* B5B9 (46521) */
-    3343, /* B5BA (46522) */
-    3343, /* B5BB (46523) */
-    3343, /* B5BC (46524) */
-    3343, /* B5BD (46525) */
-    3343, /* B5BE (46526) */
-    3343, /* B5BF (46527) */
-    3343, /* B5C0 (46528) */
-    3343, /* B5C1 (46529) */
-    3343, /* B5C2 (46530) */
-    3343, /* B5C3 (46531) */
-    3343, /* B5C4 (46532) */
-    3343, /* B5C5 (46533) */
-    3343, /* B5C6 (46534) */
-    3343, /* B5C7 (46535) */
-    3343, /* B5C8 (46536) */
-    3343, /* B5C9 (46537) */
-    3343, /* B5CA (46538) */
-    3343, /* B5CB (46539) */
-    3343, /* B5CC (46540) */
-    3343, /* B5CD (46541) */
-    3343, /* B5CE (46542) */
-    3343, /* B5CF (46543) */
-    3343, /* B5D0 (46544) */
-    3343, /* B5D1 (46545) */
-    3343, /* B5D2 (46546) */
-    3343, /* B5D3 (46547) */
-    3343, /* B5D4 (46548) */
-    3343, /* B5D5 (46549) */
-    3343, /* B5D6 (46550) */
-    3343, /* B5D7 (46551) */
-    3343, /* B5D8 (46552) */
-    3343, /* B5D9 (46553) */
-    3343, /* B5DA (46554) */
-    3343, /* B5DB (46555) */
-    3343, /* B5DC (46556) */
-    3343, /* B5DD (46557) */
-    3343, /* B5DE (46558) */
-    3343, /* B5DF (46559) */
-    3343, /* B5E0 (46560) */
-    3343, /* B5E1 (46561) */
-    3343, /* B5E2 (46562) */
-    3343, /* B5E3 (46563) */
-    3343, /* B5E4 (46564) */
-    3343, /* B5E5 (46565) */
-    3343, /* B5E6 (46566) */
-    3343, /* B5E7 (46567) */
-    3343, /* B5E8 (46568) */
-    3343, /* B5E9 (46569) */
-    3343, /* B5EA (46570) */
-    3343, /* B5EB (46571) */
-    3343, /* B5EC (46572) */
-    3343, /* B5ED (46573) */
-    3343, /* B5EE (46574) */
-    3343, /* B5EF (46575) */
-    3343, /* B5F0 (46576) */
-    3343, /* B5F1 (46577) */
-    3343, /* B5F2 (46578) */
-    3343, /* B5F3 (46579) */
-    3343, /* B5F4 (46580) */
-    3343, /* B5F5 (46581) */
-    3343, /* B5F6 (46582) */
-    3343, /* B5F7 (46583) */
-    3343, /* B5F8 (46584) */
-    3343, /* B5F9 (46585) */
-    3343, /* B5FA (46586) */
-    3343, /* B5FB (46587) */
-    3343, /* B5FC (46588) */
-    3343, /* B5FD (46589) */
-    3343, /* B5FE (46590) */
-    3343, /* B5FF (46591) */
-    3343, /* B600 (46592) */
-    3343, /* B601 (46593) */
-    3343, /* B602 (46594) */
-    3343, /* B603 (46595) */
-    3343, /* B604 (46596) */
-    3343, /* B605 (46597) */
-    3343, /* B606 (46598) */
-    3343, /* B607 (46599) */
-    3343, /* B608 (46600) */
-    3343, /* B609 (46601) */
-    3343, /* B60A (46602) */
-    3343, /* B60B (46603) */
-    3343, /* B60C (46604) */
-    3343, /* B60D (46605) */
-    3343, /* B60E (46606) */
-    3343, /* B60F (46607) */
-    3343, /* B610 (46608) */
-    3343, /* B611 (46609) */
-    3343, /* B612 (46610) */
-    3343, /* B613 (46611) */
-    3343, /* B614 (46612) */
-    3343, /* B615 (46613) */
-    3343, /* B616 (46614) */
-    3343, /* B617 (46615) */
-    3343, /* B618 (46616) */
-    3343, /* B619 (46617) */
-    3343, /* B61A (46618) */
-    3343, /* B61B (46619) */
-    3343, /* B61C (46620) */
-    3343, /* B61D (46621) */
-    3343, /* B61E (46622) */
-    3343, /* B61F (46623) */
-    3343, /* B620 (46624) */
-    3343, /* B621 (46625) */
-    3343, /* B622 (46626) */
-    3343, /* B623 (46627) */
-    3343, /* B624 (46628) */
-    3343, /* B625 (46629) */
-    3343, /* B626 (46630) */
-    3343, /* B627 (46631) */
-    3343, /* B628 (46632) */
-    3343, /* B629 (46633) */
-    3343, /* B62A (46634) */
-    3343, /* B62B (46635) */
-    3343, /* B62C (46636) */
-    3343, /* B62D (46637) */
-    3343, /* B62E (46638) */
-    3343, /* B62F (46639) */
-    3343, /* B630 (46640) */
-    3343, /* B631 (46641) */
-    3343, /* B632 (46642) */
-    3343, /* B633 (46643) */
-    3343, /* B634 (46644) */
-    3343, /* B635 (46645) */
-    3343, /* B636 (46646) */
-    3343, /* B637 (46647) */
-    3343, /* B638 (46648) */
-    3343, /* B639 (46649) */
-    3343, /* B63A (46650) */
-    3343, /* B63B (46651) */
-    3343, /* B63C (46652) */
-    3343, /* B63D (46653) */
-    3343, /* B63E (46654) */
-    3343, /* B63F (46655) */
-    3343, /* B640 (46656) */
-    3343, /* B641 (46657) */
-    3343, /* B642 (46658) */
-    3343, /* B643 (46659) */
-    3343, /* B644 (46660) */
-    3343, /* B645 (46661) */
-    3343, /* B646 (46662) */
-    3343, /* B647 (46663) */
-    3343, /* B648 (46664) */
-    3343, /* B649 (46665) */
-    3343, /* B64A (46666) */
-    3343, /* B64B (46667) */
-    3343, /* B64C (46668) */
-    3343, /* B64D (46669) */
-    3343, /* B64E (46670) */
-    3343, /* B64F (46671) */
-    3343, /* B650 (46672) */
-    3343, /* B651 (46673) */
-    3343, /* B652 (46674) */
-    3343, /* B653 (46675) */
-    3343, /* B654 (46676) */
-    3343, /* B655 (46677) */
-    3343, /* B656 (46678) */
-    3343, /* B657 (46679) */
-    3343, /* B658 (46680) */
-    3343, /* B659 (46681) */
-    3343, /* B65A (46682) */
-    3343, /* B65B (46683) */
-    3343, /* B65C (46684) */
-    3343, /* B65D (46685) */
-    3343, /* B65E (46686) */
-    3343, /* B65F (46687) */
-    3343, /* B660 (46688) */
-    3343, /* B661 (46689) */
-    3343, /* B662 (46690) */
-    3343, /* B663 (46691) */
-    3343, /* B664 (46692) */
-    3343, /* B665 (46693) */
-    3343, /* B666 (46694) */
-    3343, /* B667 (46695) */
-    3343, /* B668 (46696) */
-    3343, /* B669 (46697) */
-    3343, /* B66A (46698) */
-    3343, /* B66B (46699) */
-    3343, /* B66C (46700) */
-    3343, /* B66D (46701) */
-    3343, /* B66E (46702) */
-    3343, /* B66F (46703) */
-    3343, /* B670 (46704) */
-    3343, /* B671 (46705) */
-    3343, /* B672 (46706) */
-    3343, /* B673 (46707) */
-    3343, /* B674 (46708) */
-    3343, /* B675 (46709) */
-    3343, /* B676 (46710) */
-    3343, /* B677 (46711) */
-    3343, /* B678 (46712) */
-    3343, /* B679 (46713) */
-    3343, /* B67A (46714) */
-    3343, /* B67B (46715) */
-    3343, /* B67C (46716) */
-    3343, /* B67D (46717) */
-    3343, /* B67E (46718) */
-    3343, /* B67F (46719) */
-    3343, /* B680 (46720) */
-    3343, /* B681 (46721) */
-    3343, /* B682 (46722) */
-    3343, /* B683 (46723) */
-    3343, /* B684 (46724) */
-    3343, /* B685 (46725) */
-    3343, /* B686 (46726) */
-    3343, /* B687 (46727) */
-    3343, /* B688 (46728) */
-    3343, /* B689 (46729) */
-    3343, /* B68A (46730) */
-    3343, /* B68B (46731) */
-    3343, /* B68C (46732) */
-    3343, /* B68D (46733) */
-    3343, /* B68E (46734) */
-    3343, /* B68F (46735) */
-    3343, /* B690 (46736) */
-    3343, /* B691 (46737) */
-    3343, /* B692 (46738) */
-    3343, /* B693 (46739) */
-    3343, /* B694 (46740) */
-    3343, /* B695 (46741) */
-    3343, /* B696 (46742) */
-    3343, /* B697 (46743) */
-    3343, /* B698 (46744) */
-    3343, /* B699 (46745) */
-    3343, /* B69A (46746) */
-    3343, /* B69B (46747) */
-    3343, /* B69C (46748) */
-    3343, /* B69D (46749) */
-    3343, /* B69E (46750) */
-    3343, /* B69F (46751) */
-    3343, /* B6A0 (46752) */
-    3343, /* B6A1 (46753) */
-    3343, /* B6A2 (46754) */
-    3343, /* B6A3 (46755) */
-    3343, /* B6A4 (46756) */
-    3343, /* B6A5 (46757) */
-    3343, /* B6A6 (46758) */
-    3343, /* B6A7 (46759) */
-    3343, /* B6A8 (46760) */
-    3343, /* B6A9 (46761) */
-    3343, /* B6AA (46762) */
-    3343, /* B6AB (46763) */
-    3343, /* B6AC (46764) */
-    3343, /* B6AD (46765) */
-    3343, /* B6AE (46766) */
-    3343, /* B6AF (46767) */
-    3343, /* B6B0 (46768) */
-    3343, /* B6B1 (46769) */
-    3343, /* B6B2 (46770) */
-    3343, /* B6B3 (46771) */
-    3343, /* B6B4 (46772) */
-    3343, /* B6B5 (46773) */
-    3343, /* B6B6 (46774) */
-    3343, /* B6B7 (46775) */
-    3343, /* B6B8 (46776) */
-    3343, /* B6B9 (46777) */
-    3343, /* B6BA (46778) */
-    3343, /* B6BB (46779) */
-    3343, /* B6BC (46780) */
-    3343, /* B6BD (46781) */
-    3343, /* B6BE (46782) */
-    3343, /* B6BF (46783) */
-    3343, /* B6C0 (46784) */
-    3343, /* B6C1 (46785) */
-    3343, /* B6C2 (46786) */
-    3343, /* B6C3 (46787) */
-    3343, /* B6C4 (46788) */
-    3343, /* B6C5 (46789) */
-    3343, /* B6C6 (46790) */
-    3343, /* B6C7 (46791) */
-    3343, /* B6C8 (46792) */
-    3343, /* B6C9 (46793) */
-    3343, /* B6CA (46794) */
-    3343, /* B6CB (46795) */
-    3343, /* B6CC (46796) */
-    3343, /* B6CD (46797) */
-    3343, /* B6CE (46798) */
-    3343, /* B6CF (46799) */
-    3343, /* B6D0 (46800) */
-    3343, /* B6D1 (46801) */
-    3343, /* B6D2 (46802) */
-    3343, /* B6D3 (46803) */
-    3343, /* B6D4 (46804) */
-    3343, /* B6D5 (46805) */
-    3343, /* B6D6 (46806) */
-    3343, /* B6D7 (46807) */
-    3343, /* B6D8 (46808) */
-    3343, /* B6D9 (46809) */
-    3343, /* B6DA (46810) */
-    3343, /* B6DB (46811) */
-    3343, /* B6DC (46812) */
-    3343, /* B6DD (46813) */
-    3343, /* B6DE (46814) */
-    3343, /* B6DF (46815) */
-    3343, /* B6E0 (46816) */
-    3343, /* B6E1 (46817) */
-    3343, /* B6E2 (46818) */
-    3343, /* B6E3 (46819) */
-    3343, /* B6E4 (46820) */
-    3343, /* B6E5 (46821) */
-    3343, /* B6E6 (46822) */
-    3343, /* B6E7 (46823) */
-    3343, /* B6E8 (46824) */
-    3343, /* B6E9 (46825) */
-    3343, /* B6EA (46826) */
-    3343, /* B6EB (46827) */
-    3343, /* B6EC (46828) */
-    3343, /* B6ED (46829) */
-    3343, /* B6EE (46830) */
-    3343, /* B6EF (46831) */
-    3343, /* B6F0 (46832) */
-    3343, /* B6F1 (46833) */
-    3343, /* B6F2 (46834) */
-    3343, /* B6F3 (46835) */
-    3343, /* B6F4 (46836) */
-    3343, /* B6F5 (46837) */
-    3343, /* B6F6 (46838) */
-    3343, /* B6F7 (46839) */
-    3343, /* B6F8 (46840) */
-    3343, /* B6F9 (46841) */
-    3343, /* B6FA (46842) */
-    3343, /* B6FB (46843) */
-    3343, /* B6FC (46844) */
-    3343, /* B6FD (46845) */
-    3343, /* B6FE (46846) */
-    3343, /* B6FF (46847) */
-    3343, /* B700 (46848) */
-    3343, /* B701 (46849) */
-    3343, /* B702 (46850) */
-    3343, /* B703 (46851) */
-    3343, /* B704 (46852) */
-    3343, /* B705 (46853) */
-    3343, /* B706 (46854) */
-    3343, /* B707 (46855) */
-    3343, /* B708 (46856) */
-    3343, /* B709 (46857) */
-    3343, /* B70A (46858) */
-    3343, /* B70B (46859) */
-    3343, /* B70C (46860) */
-    3343, /* B70D (46861) */
-    3343, /* B70E (46862) */
-    3343, /* B70F (46863) */
-    3343, /* B710 (46864) */
-    3343, /* B711 (46865) */
-    3343, /* B712 (46866) */
-    3343, /* B713 (46867) */
-    3343, /* B714 (46868) */
-    3343, /* B715 (46869) */
-    3343, /* B716 (46870) */
-    3343, /* B717 (46871) */
-    3343, /* B718 (46872) */
-    3343, /* B719 (46873) */
-    3343, /* B71A (46874) */
-    3343, /* B71B (46875) */
-    3343, /* B71C (46876) */
-    3343, /* B71D (46877) */
-    3343, /* B71E (46878) */
-    3343, /* B71F (46879) */
-    3343, /* B720 (46880) */
-    3343, /* B721 (46881) */
-    3343, /* B722 (46882) */
-    3343, /* B723 (46883) */
-    3343, /* B724 (46884) */
-    3343, /* B725 (46885) */
-    3343, /* B726 (46886) */
-    3343, /* B727 (46887) */
-    3343, /* B728 (46888) */
-    3343, /* B729 (46889) */
-    3343, /* B72A (46890) */
-    3343, /* B72B (46891) */
-    3343, /* B72C (46892) */
-    3343, /* B72D (46893) */
-    3343, /* B72E (46894) */
-    3343, /* B72F (46895) */
-    3343, /* B730 (46896) */
-    3343, /* B731 (46897) */
-    3343, /* B732 (46898) */
-    3343, /* B733 (46899) */
-    3343, /* B734 (46900) */
-    3343, /* B735 (46901) */
-    3343, /* B736 (46902) */
-    3343, /* B737 (46903) */
-    3343, /* B738 (46904) */
-    3343, /* B739 (46905) */
-    3343, /* B73A (46906) */
-    3343, /* B73B (46907) */
-    3343, /* B73C (46908) */
-    3343, /* B73D (46909) */
-    3343, /* B73E (46910) */
-    3343, /* B73F (46911) */
-    3343, /* B740 (46912) */
-    3343, /* B741 (46913) */
-    3343, /* B742 (46914) */
-    3343, /* B743 (46915) */
-    3343, /* B744 (46916) */
-    3343, /* B745 (46917) */
-    3343, /* B746 (46918) */
-    3343, /* B747 (46919) */
-    3343, /* B748 (46920) */
-    3343, /* B749 (46921) */
-    3343, /* B74A (46922) */
-    3343, /* B74B (46923) */
-    3343, /* B74C (46924) */
-    3343, /* B74D (46925) */
-    3343, /* B74E (46926) */
-    3343, /* B74F (46927) */
-    3343, /* B750 (46928) */
-    3343, /* B751 (46929) */
-    3343, /* B752 (46930) */
-    3343, /* B753 (46931) */
-    3343, /* B754 (46932) */
-    3343, /* B755 (46933) */
-    3343, /* B756 (46934) */
-    3343, /* B757 (46935) */
-    3343, /* B758 (46936) */
-    3343, /* B759 (46937) */
-    3343, /* B75A (46938) */
-    3343, /* B75B (46939) */
-    3343, /* B75C (46940) */
-    3343, /* B75D (46941) */
-    3343, /* B75E (46942) */
-    3343, /* B75F (46943) */
-    3343, /* B760 (46944) */
-    3343, /* B761 (46945) */
-    3343, /* B762 (46946) */
-    3343, /* B763 (46947) */
-    3343, /* B764 (46948) */
-    3343, /* B765 (46949) */
-    3343, /* B766 (46950) */
-    3343, /* B767 (46951) */
-    3343, /* B768 (46952) */
-    3343, /* B769 (46953) */
-    3343, /* B76A (46954) */
-    3343, /* B76B (46955) */
-    3343, /* B76C (46956) */
-    3343, /* B76D (46957) */
-    3343, /* B76E (46958) */
-    3343, /* B76F (46959) */
-    3343, /* B770 (46960) */
-    3343, /* B771 (46961) */
-    3343, /* B772 (46962) */
-    3343, /* B773 (46963) */
-    3343, /* B774 (46964) */
-    3343, /* B775 (46965) */
-    3343, /* B776 (46966) */
-    3343, /* B777 (46967) */
-    3343, /* B778 (46968) */
-    3343, /* B779 (46969) */
-    3343, /* B77A (46970) */
-    3343, /* B77B (46971) */
-    3343, /* B77C (46972) */
-    3343, /* B77D (46973) */
-    3343, /* B77E (46974) */
-    3343, /* B77F (46975) */
-    3343, /* B780 (46976) */
-    3343, /* B781 (46977) */
-    3343, /* B782 (46978) */
-    3343, /* B783 (46979) */
-    3343, /* B784 (46980) */
-    3343, /* B785 (46981) */
-    3343, /* B786 (46982) */
-    3343, /* B787 (46983) */
-    3343, /* B788 (46984) */
-    3343, /* B789 (46985) */
-    3343, /* B78A (46986) */
-    3343, /* B78B (46987) */
-    3343, /* B78C (46988) */
-    3343, /* B78D (46989) */
-    3343, /* B78E (46990) */
-    3343, /* B78F (46991) */
-    3343, /* B790 (46992) */
-    3343, /* B791 (46993) */
-    3343, /* B792 (46994) */
-    3343, /* B793 (46995) */
-    3343, /* B794 (46996) */
-    3343, /* B795 (46997) */
-    3343, /* B796 (46998) */
-    3343, /* B797 (46999) */
-    3343, /* B798 (47000) */
-    3343, /* B799 (47001) */
-    3343, /* B79A (47002) */
-    3343, /* B79B (47003) */
-    3343, /* B79C (47004) */
-    3343, /* B79D (47005) */
-    3343, /* B79E (47006) */
-    3343, /* B79F (47007) */
-    3343, /* B7A0 (47008) */
-    3343, /* B7A1 (47009) */
-    3343, /* B7A2 (47010) */
-    3343, /* B7A3 (47011) */
-    3343, /* B7A4 (47012) */
-    3343, /* B7A5 (47013) */
-    3343, /* B7A6 (47014) */
-    3343, /* B7A7 (47015) */
-    3343, /* B7A8 (47016) */
-    3343, /* B7A9 (47017) */
-    3343, /* B7AA (47018) */
-    3343, /* B7AB (47019) */
-    3343, /* B7AC (47020) */
-    3343, /* B7AD (47021) */
-    3343, /* B7AE (47022) */
-    3343, /* B7AF (47023) */
-    3343, /* B7B0 (47024) */
-    3343, /* B7B1 (47025) */
-    3343, /* B7B2 (47026) */
-    3343, /* B7B3 (47027) */
-    3343, /* B7B4 (47028) */
-    3343, /* B7B5 (47029) */
-    3343, /* B7B6 (47030) */
-    3343, /* B7B7 (47031) */
-    3343, /* B7B8 (47032) */
-    3343, /* B7B9 (47033) */
-    3343, /* B7BA (47034) */
-    3343, /* B7BB (47035) */
-    3343, /* B7BC (47036) */
-    3343, /* B7BD (47037) */
-    3343, /* B7BE (47038) */
-    3343, /* B7BF (47039) */
-    3343, /* B7C0 (47040) */
-    3343, /* B7C1 (47041) */
-    3343, /* B7C2 (47042) */
-    3343, /* B7C3 (47043) */
-    3343, /* B7C4 (47044) */
-    3343, /* B7C5 (47045) */
-    3343, /* B7C6 (47046) */
-    3343, /* B7C7 (47047) */
-    3343, /* B7C8 (47048) */
-    3343, /* B7C9 (47049) */
-    3343, /* B7CA (47050) */
-    3343, /* B7CB (47051) */
-    3343, /* B7CC (47052) */
-    3343, /* B7CD (47053) */
-    3343, /* B7CE (47054) */
-    3343, /* B7CF (47055) */
-    3343, /* B7D0 (47056) */
-    3343, /* B7D1 (47057) */
-    3343, /* B7D2 (47058) */
-    3343, /* B7D3 (47059) */
-    3343, /* B7D4 (47060) */
-    3343, /* B7D5 (47061) */
-    3343, /* B7D6 (47062) */
-    3343, /* B7D7 (47063) */
-    3343, /* B7D8 (47064) */
-    3343, /* B7D9 (47065) */
-    3343, /* B7DA (47066) */
-    3343, /* B7DB (47067) */
-    3343, /* B7DC (47068) */
-    3343, /* B7DD (47069) */
-    3343, /* B7DE (47070) */
-    3343, /* B7DF (47071) */
-    3343, /* B7E0 (47072) */
-    3343, /* B7E1 (47073) */
-    3343, /* B7E2 (47074) */
-    3343, /* B7E3 (47075) */
-    3343, /* B7E4 (47076) */
-    3343, /* B7E5 (47077) */
-    3343, /* B7E6 (47078) */
-    3343, /* B7E7 (47079) */
-    3343, /* B7E8 (47080) */
-    3343, /* B7E9 (47081) */
-    3343, /* B7EA (47082) */
-    3343, /* B7EB (47083) */
-    3343, /* B7EC (47084) */
-    3343, /* B7ED (47085) */
-    3343, /* B7EE (47086) */
-    3343, /* B7EF (47087) */
-    3343, /* B7F0 (47088) */
-    3343, /* B7F1 (47089) */
-    3343, /* B7F2 (47090) */
-    3343, /* B7F3 (47091) */
-    3343, /* B7F4 (47092) */
-    3343, /* B7F5 (47093) */
-    3343, /* B7F6 (47094) */
-    3343, /* B7F7 (47095) */
-    3343, /* B7F8 (47096) */
-    3343, /* B7F9 (47097) */
-    3343, /* B7FA (47098) */
-    3343, /* B7FB (47099) */
-    3343, /* B7FC (47100) */
-    3343, /* B7FD (47101) */
-    3343, /* B7FE (47102) */
-    3343, /* B7FF (47103) */
-    3343, /* B800 (47104) */
-    3343, /* B801 (47105) */
-    3343, /* B802 (47106) */
-    3343, /* B803 (47107) */
-    3343, /* B804 (47108) */
-    3343, /* B805 (47109) */
-    3343, /* B806 (47110) */
-    3343, /* B807 (47111) */
-    3343, /* B808 (47112) */
-    3343, /* B809 (47113) */
-    3343, /* B80A (47114) */
-    3343, /* B80B (47115) */
-    3343, /* B80C (47116) */
-    3343, /* B80D (47117) */
-    3343, /* B80E (47118) */
-    3343, /* B80F (47119) */
-    3343, /* B810 (47120) */
-    3343, /* B811 (47121) */
-    3343, /* B812 (47122) */
-    3343, /* B813 (47123) */
-    3343, /* B814 (47124) */
-    3343, /* B815 (47125) */
-    3343, /* B816 (47126) */
-    3343, /* B817 (47127) */
-    3343, /* B818 (47128) */
-    3343, /* B819 (47129) */
-    3343, /* B81A (47130) */
-    3343, /* B81B (47131) */
-    3343, /* B81C (47132) */
-    3343, /* B81D (47133) */
-    3343, /* B81E (47134) */
-    3343, /* B81F (47135) */
-    3343, /* B820 (47136) */
-    3343, /* B821 (47137) */
-    3343, /* B822 (47138) */
-    3343, /* B823 (47139) */
-    3343, /* B824 (47140) */
-    3343, /* B825 (47141) */
-    3343, /* B826 (47142) */
-    3343, /* B827 (47143) */
-    3343, /* B828 (47144) */
-    3343, /* B829 (47145) */
-    3343, /* B82A (47146) */
-    3343, /* B82B (47147) */
-    3343, /* B82C (47148) */
-    3343, /* B82D (47149) */
-    3343, /* B82E (47150) */
-    3343, /* B82F (47151) */
-    3343, /* B830 (47152) */
-    3343, /* B831 (47153) */
-    3343, /* B832 (47154) */
-    3343, /* B833 (47155) */
-    3343, /* B834 (47156) */
-    3343, /* B835 (47157) */
-    3343, /* B836 (47158) */
-    3343, /* B837 (47159) */
-    3343, /* B838 (47160) */
-    3343, /* B839 (47161) */
-    3343, /* B83A (47162) */
-    3343, /* B83B (47163) */
-    3343, /* B83C (47164) */
-    3343, /* B83D (47165) */
-    3343, /* B83E (47166) */
-    3343, /* B83F (47167) */
-    3343, /* B840 (47168) */
-    3343, /* B841 (47169) */
-    3343, /* B842 (47170) */
-    3343, /* B843 (47171) */
-    3343, /* B844 (47172) */
-    3343, /* B845 (47173) */
-    3343, /* B846 (47174) */
-    3343, /* B847 (47175) */
-    3343, /* B848 (47176) */
-    3343, /* B849 (47177) */
-    3343, /* B84A (47178) */
-    3343, /* B84B (47179) */
-    3343, /* B84C (47180) */
-    3343, /* B84D (47181) */
-    3343, /* B84E (47182) */
-    3343, /* B84F (47183) */
-    3343, /* B850 (47184) */
-    3343, /* B851 (47185) */
-    3343, /* B852 (47186) */
-    3343, /* B853 (47187) */
-    3343, /* B854 (47188) */
-    3343, /* B855 (47189) */
-    3343, /* B856 (47190) */
-    3343, /* B857 (47191) */
-    3343, /* B858 (47192) */
-    3343, /* B859 (47193) */
-    3343, /* B85A (47194) */
-    3343, /* B85B (47195) */
-    3343, /* B85C (47196) */
-    3343, /* B85D (47197) */
-    3343, /* B85E (47198) */
-    3343, /* B85F (47199) */
-    3343, /* B860 (47200) */
-    3343, /* B861 (47201) */
-    3343, /* B862 (47202) */
-    3343, /* B863 (47203) */
-    3343, /* B864 (47204) */
-    3343, /* B865 (47205) */
-    3343, /* B866 (47206) */
-    3343, /* B867 (47207) */
-    3343, /* B868 (47208) */
-    3343, /* B869 (47209) */
-    3343, /* B86A (47210) */
-    3343, /* B86B (47211) */
-    3343, /* B86C (47212) */
-    3343, /* B86D (47213) */
-    3343, /* B86E (47214) */
-    3343, /* B86F (47215) */
-    3343, /* B870 (47216) */
-    3343, /* B871 (47217) */
-    3343, /* B872 (47218) */
-    3343, /* B873 (47219) */
-    3343, /* B874 (47220) */
-    3343, /* B875 (47221) */
-    3343, /* B876 (47222) */
-    3343, /* B877 (47223) */
-    3343, /* B878 (47224) */
-    3343, /* B879 (47225) */
-    3343, /* B87A (47226) */
-    3343, /* B87B (47227) */
-    3343, /* B87C (47228) */
-    3343, /* B87D (47229) */
-    3343, /* B87E (47230) */
-    3343, /* B87F (47231) */
-    3343, /* B880 (47232) */
-    3343, /* B881 (47233) */
-    3343, /* B882 (47234) */
-    3343, /* B883 (47235) */
-    3343, /* B884 (47236) */
-    3343, /* B885 (47237) */
-    3343, /* B886 (47238) */
-    3343, /* B887 (47239) */
-    3343, /* B888 (47240) */
-    3343, /* B889 (47241) */
-    3343, /* B88A (47242) */
-    3343, /* B88B (47243) */
-    3343, /* B88C (47244) */
-    3343, /* B88D (47245) */
-    3343, /* B88E (47246) */
-    3343, /* B88F (47247) */
-    3343, /* B890 (47248) */
-    3343, /* B891 (47249) */
-    3343, /* B892 (47250) */
-    3343, /* B893 (47251) */
-    3343, /* B894 (47252) */
-    3343, /* B895 (47253) */
-    3343, /* B896 (47254) */
-    3343, /* B897 (47255) */
-    3343, /* B898 (47256) */
-    3343, /* B899 (47257) */
-    3343, /* B89A (47258) */
-    3343, /* B89B (47259) */
-    3343, /* B89C (47260) */
-    3343, /* B89D (47261) */
-    3343, /* B89E (47262) */
-    3343, /* B89F (47263) */
-    3343, /* B8A0 (47264) */
-    3343, /* B8A1 (47265) */
-    3343, /* B8A2 (47266) */
-    3343, /* B8A3 (47267) */
-    3343, /* B8A4 (47268) */
-    3343, /* B8A5 (47269) */
-    3343, /* B8A6 (47270) */
-    3343, /* B8A7 (47271) */
-    3343, /* B8A8 (47272) */
-    3343, /* B8A9 (47273) */
-    3343, /* B8AA (47274) */
-    3343, /* B8AB (47275) */
-    3343, /* B8AC (47276) */
-    3343, /* B8AD (47277) */
-    3343, /* B8AE (47278) */
-    3343, /* B8AF (47279) */
-    3343, /* B8B0 (47280) */
-    3343, /* B8B1 (47281) */
-    3343, /* B8B2 (47282) */
-    3343, /* B8B3 (47283) */
-    3343, /* B8B4 (47284) */
-    3343, /* B8B5 (47285) */
-    3343, /* B8B6 (47286) */
-    3343, /* B8B7 (47287) */
-    3343, /* B8B8 (47288) */
-    3343, /* B8B9 (47289) */
-    3343, /* B8BA (47290) */
-    3343, /* B8BB (47291) */
-    3343, /* B8BC (47292) */
-    3343, /* B8BD (47293) */
-    3343, /* B8BE (47294) */
-    3343, /* B8BF (47295) */
-    3343, /* B8C0 (47296) */
-    3343, /* B8C1 (47297) */
-    3343, /* B8C2 (47298) */
-    3343, /* B8C3 (47299) */
-    3343, /* B8C4 (47300) */
-    3343, /* B8C5 (47301) */
-    3343, /* B8C6 (47302) */
-    3343, /* B8C7 (47303) */
-    3343, /* B8C8 (47304) */
-    3343, /* B8C9 (47305) */
-    3343, /* B8CA (47306) */
-    3343, /* B8CB (47307) */
-    3343, /* B8CC (47308) */
-    3343, /* B8CD (47309) */
-    3343, /* B8CE (47310) */
-    3343, /* B8CF (47311) */
-    3343, /* B8D0 (47312) */
-    3343, /* B8D1 (47313) */
-    3343, /* B8D2 (47314) */
-    3343, /* B8D3 (47315) */
-    3343, /* B8D4 (47316) */
-    3343, /* B8D5 (47317) */
-    3343, /* B8D6 (47318) */
-    3343, /* B8D7 (47319) */
-    3343, /* B8D8 (47320) */
-    3343, /* B8D9 (47321) */
-    3343, /* B8DA (47322) */
-    3343, /* B8DB (47323) */
-    3343, /* B8DC (47324) */
-    3343, /* B8DD (47325) */
-    3343, /* B8DE (47326) */
-    3343, /* B8DF (47327) */
-    3343, /* B8E0 (47328) */
-    3343, /* B8E1 (47329) */
-    3343, /* B8E2 (47330) */
-    3343, /* B8E3 (47331) */
-    3343, /* B8E4 (47332) */
-    3343, /* B8E5 (47333) */
-    3343, /* B8E6 (47334) */
-    3343, /* B8E7 (47335) */
-    3343, /* B8E8 (47336) */
-    3343, /* B8E9 (47337) */
-    3343, /* B8EA (47338) */
-    3343, /* B8EB (47339) */
-    3343, /* B8EC (47340) */
-    3343, /* B8ED (47341) */
-    3343, /* B8EE (47342) */
-    3343, /* B8EF (47343) */
-    3343, /* B8F0 (47344) */
-    3343, /* B8F1 (47345) */
-    3343, /* B8F2 (47346) */
-    3343, /* B8F3 (47347) */
-    3343, /* B8F4 (47348) */
-    3343, /* B8F5 (47349) */
-    3343, /* B8F6 (47350) */
-    3343, /* B8F7 (47351) */
-    3343, /* B8F8 (47352) */
-    3343, /* B8F9 (47353) */
-    3343, /* B8FA (47354) */
-    3343, /* B8FB (47355) */
-    3343, /* B8FC (47356) */
-    3343, /* B8FD (47357) */
-    3343, /* B8FE (47358) */
-    3343, /* B8FF (47359) */
-    3343, /* B900 (47360) */
-    3343, /* B901 (47361) */
-    3343, /* B902 (47362) */
-    3343, /* B903 (47363) */
-    3343, /* B904 (47364) */
-    3343, /* B905 (47365) */
-    3343, /* B906 (47366) */
-    3343, /* B907 (47367) */
-    3343, /* B908 (47368) */
-    3343, /* B909 (47369) */
-    3343, /* B90A (47370) */
-    3343, /* B90B (47371) */
-    3343, /* B90C (47372) */
-    3343, /* B90D (47373) */
-    3343, /* B90E (47374) */
-    3343, /* B90F (47375) */
-    3343, /* B910 (47376) */
-    3343, /* B911 (47377) */
-    3343, /* B912 (47378) */
-    3343, /* B913 (47379) */
-    3343, /* B914 (47380) */
-    3343, /* B915 (47381) */
-    3343, /* B916 (47382) */
-    3343, /* B917 (47383) */
-    3343, /* B918 (47384) */
-    3343, /* B919 (47385) */
-    3343, /* B91A (47386) */
-    3343, /* B91B (47387) */
-    3343, /* B91C (47388) */
-    3343, /* B91D (47389) */
-    3343, /* B91E (47390) */
-    3343, /* B91F (47391) */
-    3343, /* B920 (47392) */
-    3343, /* B921 (47393) */
-    3343, /* B922 (47394) */
-    3343, /* B923 (47395) */
-    3343, /* B924 (47396) */
-    3343, /* B925 (47397) */
-    3343, /* B926 (47398) */
-    3343, /* B927 (47399) */
-    3343, /* B928 (47400) */
-    3343, /* B929 (47401) */
-    3343, /* B92A (47402) */
-    3343, /* B92B (47403) */
-    3343, /* B92C (47404) */
-    3343, /* B92D (47405) */
-    3343, /* B92E (47406) */
-    3343, /* B92F (47407) */
-    3343, /* B930 (47408) */
-    3343, /* B931 (47409) */
-    3343, /* B932 (47410) */
-    3343, /* B933 (47411) */
-    3343, /* B934 (47412) */
-    3343, /* B935 (47413) */
-    3343, /* B936 (47414) */
-    3343, /* B937 (47415) */
-    3343, /* B938 (47416) */
-    3343, /* B939 (47417) */
-    3343, /* B93A (47418) */
-    3343, /* B93B (47419) */
-    3343, /* B93C (47420) */
-    3343, /* B93D (47421) */
-    3343, /* B93E (47422) */
-    3343, /* B93F (47423) */
-    3343, /* B940 (47424) */
-    3343, /* B941 (47425) */
-    3343, /* B942 (47426) */
-    3343, /* B943 (47427) */
-    3343, /* B944 (47428) */
-    3343, /* B945 (47429) */
-    3343, /* B946 (47430) */
-    3343, /* B947 (47431) */
-    3343, /* B948 (47432) */
-    3343, /* B949 (47433) */
-    3343, /* B94A (47434) */
-    3343, /* B94B (47435) */
-    3343, /* B94C (47436) */
-    3343, /* B94D (47437) */
-    3343, /* B94E (47438) */
-    3343, /* B94F (47439) */
-    3343, /* B950 (47440) */
-    3343, /* B951 (47441) */
-    3343, /* B952 (47442) */
-    3343, /* B953 (47443) */
-    3343, /* B954 (47444) */
-    3343, /* B955 (47445) */
-    3343, /* B956 (47446) */
-    3343, /* B957 (47447) */
-    3343, /* B958 (47448) */
-    3343, /* B959 (47449) */
-    3343, /* B95A (47450) */
-    3343, /* B95B (47451) */
-    3343, /* B95C (47452) */
-    3343, /* B95D (47453) */
-    3343, /* B95E (47454) */
-    3343, /* B95F (47455) */
-    3343, /* B960 (47456) */
-    3343, /* B961 (47457) */
-    3343, /* B962 (47458) */
-    3343, /* B963 (47459) */
-    3343, /* B964 (47460) */
-    3343, /* B965 (47461) */
-    3343, /* B966 (47462) */
-    3343, /* B967 (47463) */
-    3343, /* B968 (47464) */
-    3343, /* B969 (47465) */
-    3343, /* B96A (47466) */
-    3343, /* B96B (47467) */
-    3343, /* B96C (47468) */
-    3343, /* B96D (47469) */
-    3343, /* B96E (47470) */
-    3343, /* B96F (47471) */
-    3343, /* B970 (47472) */
-    3343, /* B971 (47473) */
-    3343, /* B972 (47474) */
-    3343, /* B973 (47475) */
-    3343, /* B974 (47476) */
-    3343, /* B975 (47477) */
-    3343, /* B976 (47478) */
-    3343, /* B977 (47479) */
-    3343, /* B978 (47480) */
-    3343, /* B979 (47481) */
-    3343, /* B97A (47482) */
-    3343, /* B97B (47483) */
-    3343, /* B97C (47484) */
-    3343, /* B97D (47485) */
-    3343, /* B97E (47486) */
-    3343, /* B97F (47487) */
-    3343, /* B980 (47488) */
-    3343, /* B981 (47489) */
-    3343, /* B982 (47490) */
-    3343, /* B983 (47491) */
-    3343, /* B984 (47492) */
-    3343, /* B985 (47493) */
-    3343, /* B986 (47494) */
-    3343, /* B987 (47495) */
-    3343, /* B988 (47496) */
-    3343, /* B989 (47497) */
-    3343, /* B98A (47498) */
-    3343, /* B98B (47499) */
-    3343, /* B98C (47500) */
-    3343, /* B98D (47501) */
-    3343, /* B98E (47502) */
-    3343, /* B98F (47503) */
-    3343, /* B990 (47504) */
-    3343, /* B991 (47505) */
-    3343, /* B992 (47506) */
-    3343, /* B993 (47507) */
-    3343, /* B994 (47508) */
-    3343, /* B995 (47509) */
-    3343, /* B996 (47510) */
-    3343, /* B997 (47511) */
-    3343, /* B998 (47512) */
-    3343, /* B999 (47513) */
-    3343, /* B99A (47514) */
-    3343, /* B99B (47515) */
-    3343, /* B99C (47516) */
-    3343, /* B99D (47517) */
-    3343, /* B99E (47518) */
-    3343, /* B99F (47519) */
-    3343, /* B9A0 (47520) */
-    3343, /* B9A1 (47521) */
-    3343, /* B9A2 (47522) */
-    3343, /* B9A3 (47523) */
-    3343, /* B9A4 (47524) */
-    3343, /* B9A5 (47525) */
-    3343, /* B9A6 (47526) */
-    3343, /* B9A7 (47527) */
-    3343, /* B9A8 (47528) */
-    3343, /* B9A9 (47529) */
-    3343, /* B9AA (47530) */
-    3343, /* B9AB (47531) */
-    3343, /* B9AC (47532) */
-    3343, /* B9AD (47533) */
-    3343, /* B9AE (47534) */
-    3343, /* B9AF (47535) */
-    3343, /* B9B0 (47536) */
-    3343, /* B9B1 (47537) */
-    3343, /* B9B2 (47538) */
-    3343, /* B9B3 (47539) */
-    3343, /* B9B4 (47540) */
-    3343, /* B9B5 (47541) */
-    3343, /* B9B6 (47542) */
-    3343, /* B9B7 (47543) */
-    3343, /* B9B8 (47544) */
-    3343, /* B9B9 (47545) */
-    3343, /* B9BA (47546) */
-    3343, /* B9BB (47547) */
-    3343, /* B9BC (47548) */
-    3343, /* B9BD (47549) */
-    3343, /* B9BE (47550) */
-    3343, /* B9BF (47551) */
-    3343, /* B9C0 (47552) */
-    3343, /* B9C1 (47553) */
-    3343, /* B9C2 (47554) */
-    3343, /* B9C3 (47555) */
-    3343, /* B9C4 (47556) */
-    3343, /* B9C5 (47557) */
-    3343, /* B9C6 (47558) */
-    3343, /* B9C7 (47559) */
-    3343, /* B9C8 (47560) */
-    3343, /* B9C9 (47561) */
-    3343, /* B9CA (47562) */
-    3343, /* B9CB (47563) */
-    3343, /* B9CC (47564) */
-    3343, /* B9CD (47565) */
-    3343, /* B9CE (47566) */
-    3343, /* B9CF (47567) */
-    3343, /* B9D0 (47568) */
-    3343, /* B9D1 (47569) */
-    3343, /* B9D2 (47570) */
-    3343, /* B9D3 (47571) */
-    3343, /* B9D4 (47572) */
-    3343, /* B9D5 (47573) */
-    3343, /* B9D6 (47574) */
-    3343, /* B9D7 (47575) */
-    3343, /* B9D8 (47576) */
-    3343, /* B9D9 (47577) */
-    3343, /* B9DA (47578) */
-    3343, /* B9DB (47579) */
-    3343, /* B9DC (47580) */
-    3343, /* B9DD (47581) */
-    3343, /* B9DE (47582) */
-    3343, /* B9DF (47583) */
-    3343, /* B9E0 (47584) */
-    3343, /* B9E1 (47585) */
-    3343, /* B9E2 (47586) */
-    3343, /* B9E3 (47587) */
-    3343, /* B9E4 (47588) */
-    3343, /* B9E5 (47589) */
-    3343, /* B9E6 (47590) */
-    3343, /* B9E7 (47591) */
-    3343, /* B9E8 (47592) */
-    3343, /* B9E9 (47593) */
-    3343, /* B9EA (47594) */
-    3343, /* B9EB (47595) */
-    3343, /* B9EC (47596) */
-    3343, /* B9ED (47597) */
-    3343, /* B9EE (47598) */
-    3343, /* B9EF (47599) */
-    3343, /* B9F0 (47600) */
-    3343, /* B9F1 (47601) */
-    3343, /* B9F2 (47602) */
-    3343, /* B9F3 (47603) */
-    3343, /* B9F4 (47604) */
-    3343, /* B9F5 (47605) */
-    3343, /* B9F6 (47606) */
-    3343, /* B9F7 (47607) */
-    3343, /* B9F8 (47608) */
-    3343, /* B9F9 (47609) */
-    3343, /* B9FA (47610) */
-    3343, /* B9FB (47611) */
-    3343, /* B9FC (47612) */
-    3343, /* B9FD (47613) */
-    3343, /* B9FE (47614) */
-    3343, /* B9FF (47615) */
-    3343, /* BA00 (47616) */
-    3343, /* BA01 (47617) */
-    3343, /* BA02 (47618) */
-    3343, /* BA03 (47619) */
-    3343, /* BA04 (47620) */
-    3343, /* BA05 (47621) */
-    3343, /* BA06 (47622) */
-    3343, /* BA07 (47623) */
-    3343, /* BA08 (47624) */
-    3343, /* BA09 (47625) */
-    3343, /* BA0A (47626) */
-    3343, /* BA0B (47627) */
-    3343, /* BA0C (47628) */
-    3343, /* BA0D (47629) */
-    3343, /* BA0E (47630) */
-    3343, /* BA0F (47631) */
-    3343, /* BA10 (47632) */
-    3343, /* BA11 (47633) */
-    3343, /* BA12 (47634) */
-    3343, /* BA13 (47635) */
-    3343, /* BA14 (47636) */
-    3343, /* BA15 (47637) */
-    3343, /* BA16 (47638) */
-    3343, /* BA17 (47639) */
-    3343, /* BA18 (47640) */
-    3343, /* BA19 (47641) */
-    3343, /* BA1A (47642) */
-    3343, /* BA1B (47643) */
-    3343, /* BA1C (47644) */
-    3343, /* BA1D (47645) */
-    3343, /* BA1E (47646) */
-    3343, /* BA1F (47647) */
-    3343, /* BA20 (47648) */
-    3343, /* BA21 (47649) */
-    3343, /* BA22 (47650) */
-    3343, /* BA23 (47651) */
-    3343, /* BA24 (47652) */
-    3343, /* BA25 (47653) */
-    3343, /* BA26 (47654) */
-    3343, /* BA27 (47655) */
-    3343, /* BA28 (47656) */
-    3343, /* BA29 (47657) */
-    3343, /* BA2A (47658) */
-    3343, /* BA2B (47659) */
-    3343, /* BA2C (47660) */
-    3343, /* BA2D (47661) */
-    3343, /* BA2E (47662) */
-    3343, /* BA2F (47663) */
-    3343, /* BA30 (47664) */
-    3343, /* BA31 (47665) */
-    3343, /* BA32 (47666) */
-    3343, /* BA33 (47667) */
-    3343, /* BA34 (47668) */
-    3343, /* BA35 (47669) */
-    3343, /* BA36 (47670) */
-    3343, /* BA37 (47671) */
-    3343, /* BA38 (47672) */
-    3343, /* BA39 (47673) */
-    3343, /* BA3A (47674) */
-    3343, /* BA3B (47675) */
-    3343, /* BA3C (47676) */
-    3343, /* BA3D (47677) */
-    3343, /* BA3E (47678) */
-    3343, /* BA3F (47679) */
-    3343, /* BA40 (47680) */
-    3343, /* BA41 (47681) */
-    3343, /* BA42 (47682) */
-    3343, /* BA43 (47683) */
-    3343, /* BA44 (47684) */
-    3343, /* BA45 (47685) */
-    3343, /* BA46 (47686) */
-    3343, /* BA47 (47687) */
-    3343, /* BA48 (47688) */
-    3343, /* BA49 (47689) */
-    3343, /* BA4A (47690) */
-    3343, /* BA4B (47691) */
-    3343, /* BA4C (47692) */
-    3343, /* BA4D (47693) */
-    3343, /* BA4E (47694) */
-    3343, /* BA4F (47695) */
-    3343, /* BA50 (47696) */
-    3343, /* BA51 (47697) */
-    3343, /* BA52 (47698) */
-    3343, /* BA53 (47699) */
-    3343, /* BA54 (47700) */
-    3343, /* BA55 (47701) */
-    3343, /* BA56 (47702) */
-    3343, /* BA57 (47703) */
-    3343, /* BA58 (47704) */
-    3343, /* BA59 (47705) */
-    3343, /* BA5A (47706) */
-    3343, /* BA5B (47707) */
-    3343, /* BA5C (47708) */
-    3343, /* BA5D (47709) */
-    3343, /* BA5E (47710) */
-    3343, /* BA5F (47711) */
-    3343, /* BA60 (47712) */
-    3343, /* BA61 (47713) */
-    3343, /* BA62 (47714) */
-    3343, /* BA63 (47715) */
-    3343, /* BA64 (47716) */
-    3343, /* BA65 (47717) */
-    3343, /* BA66 (47718) */
-    3343, /* BA67 (47719) */
-    3343, /* BA68 (47720) */
-    3343, /* BA69 (47721) */
-    3343, /* BA6A (47722) */
-    3343, /* BA6B (47723) */
-    3343, /* BA6C (47724) */
-    3343, /* BA6D (47725) */
-    3343, /* BA6E (47726) */
-    3343, /* BA6F (47727) */
-    3343, /* BA70 (47728) */
-    3343, /* BA71 (47729) */
-    3343, /* BA72 (47730) */
-    3343, /* BA73 (47731) */
-    3343, /* BA74 (47732) */
-    3343, /* BA75 (47733) */
-    3343, /* BA76 (47734) */
-    3343, /* BA77 (47735) */
-    3343, /* BA78 (47736) */
-    3343, /* BA79 (47737) */
-    3343, /* BA7A (47738) */
-    3343, /* BA7B (47739) */
-    3343, /* BA7C (47740) */
-    3343, /* BA7D (47741) */
-    3343, /* BA7E (47742) */
-    3343, /* BA7F (47743) */
-    3343, /* BA80 (47744) */
-    3343, /* BA81 (47745) */
-    3343, /* BA82 (47746) */
-    3343, /* BA83 (47747) */
-    3343, /* BA84 (47748) */
-    3343, /* BA85 (47749) */
-    3343, /* BA86 (47750) */
-    3343, /* BA87 (47751) */
-    3343, /* BA88 (47752) */
-    3343, /* BA89 (47753) */
-    3343, /* BA8A (47754) */
-    3343, /* BA8B (47755) */
-    3343, /* BA8C (47756) */
-    3343, /* BA8D (47757) */
-    3343, /* BA8E (47758) */
-    3343, /* BA8F (47759) */
-    3343, /* BA90 (47760) */
-    3343, /* BA91 (47761) */
-    3343, /* BA92 (47762) */
-    3343, /* BA93 (47763) */
-    3343, /* BA94 (47764) */
-    3343, /* BA95 (47765) */
-    3343, /* BA96 (47766) */
-    3343, /* BA97 (47767) */
-    3343, /* BA98 (47768) */
-    3343, /* BA99 (47769) */
-    3343, /* BA9A (47770) */
-    3343, /* BA9B (47771) */
-    3343, /* BA9C (47772) */
-    3343, /* BA9D (47773) */
-    3343, /* BA9E (47774) */
-    3343, /* BA9F (47775) */
-    3343, /* BAA0 (47776) */
-    3343, /* BAA1 (47777) */
-    3343, /* BAA2 (47778) */
-    3343, /* BAA3 (47779) */
-    3343, /* BAA4 (47780) */
-    3343, /* BAA5 (47781) */
-    3343, /* BAA6 (47782) */
-    3343, /* BAA7 (47783) */
-    3343, /* BAA8 (47784) */
-    3343, /* BAA9 (47785) */
-    3343, /* BAAA (47786) */
-    3343, /* BAAB (47787) */
-    3343, /* BAAC (47788) */
-    3343, /* BAAD (47789) */
-    3343, /* BAAE (47790) */
-    3343, /* BAAF (47791) */
-    3343, /* BAB0 (47792) */
-    3343, /* BAB1 (47793) */
-    3343, /* BAB2 (47794) */
-    3343, /* BAB3 (47795) */
-    3343, /* BAB4 (47796) */
-    3343, /* BAB5 (47797) */
-    3343, /* BAB6 (47798) */
-    3343, /* BAB7 (47799) */
-    3343, /* BAB8 (47800) */
-    3343, /* BAB9 (47801) */
-    3343, /* BABA (47802) */
-    3343, /* BABB (47803) */
-    3343, /* BABC (47804) */
-    3343, /* BABD (47805) */
-    3343, /* BABE (47806) */
-    3343, /* BABF (47807) */
-    3343, /* BAC0 (47808) */
-    3343, /* BAC1 (47809) */
-    3343, /* BAC2 (47810) */
-    3343, /* BAC3 (47811) */
-    3343, /* BAC4 (47812) */
-    3343, /* BAC5 (47813) */
-    3343, /* BAC6 (47814) */
-    3343, /* BAC7 (47815) */
-    3343, /* BAC8 (47816) */
-    3343, /* BAC9 (47817) */
-    3343, /* BACA (47818) */
-    3343, /* BACB (47819) */
-    3343, /* BACC (47820) */
-    3343, /* BACD (47821) */
-    3343, /* BACE (47822) */
-    3343, /* BACF (47823) */
-    3343, /* BAD0 (47824) */
-    3343, /* BAD1 (47825) */
-    3343, /* BAD2 (47826) */
-    3343, /* BAD3 (47827) */
-    3343, /* BAD4 (47828) */
-    3343, /* BAD5 (47829) */
-    3343, /* BAD6 (47830) */
-    3343, /* BAD7 (47831) */
-    3343, /* BAD8 (47832) */
-    3343, /* BAD9 (47833) */
-    3343, /* BADA (47834) */
-    3343, /* BADB (47835) */
-    3343, /* BADC (47836) */
-    3343, /* BADD (47837) */
-    3343, /* BADE (47838) */
-    3343, /* BADF (47839) */
-    3343, /* BAE0 (47840) */
-    3343, /* BAE1 (47841) */
-    3343, /* BAE2 (47842) */
-    3343, /* BAE3 (47843) */
-    3343, /* BAE4 (47844) */
-    3343, /* BAE5 (47845) */
-    3343, /* BAE6 (47846) */
-    3343, /* BAE7 (47847) */
-    3343, /* BAE8 (47848) */
-    3343, /* BAE9 (47849) */
-    3343, /* BAEA (47850) */
-    3343, /* BAEB (47851) */
-    3343, /* BAEC (47852) */
-    3343, /* BAED (47853) */
-    3343, /* BAEE (47854) */
-    3343, /* BAEF (47855) */
-    3343, /* BAF0 (47856) */
-    3343, /* BAF1 (47857) */
-    3343, /* BAF2 (47858) */
-    3343, /* BAF3 (47859) */
-    3343, /* BAF4 (47860) */
-    3343, /* BAF5 (47861) */
-    3343, /* BAF6 (47862) */
-    3343, /* BAF7 (47863) */
-    3343, /* BAF8 (47864) */
-    3343, /* BAF9 (47865) */
-    3343, /* BAFA (47866) */
-    3343, /* BAFB (47867) */
-    3343, /* BAFC (47868) */
-    3343, /* BAFD (47869) */
-    3343, /* BAFE (47870) */
-    3343, /* BAFF (47871) */
-    3343, /* BB00 (47872) */
-    3343, /* BB01 (47873) */
-    3343, /* BB02 (47874) */
-    3343, /* BB03 (47875) */
-    3343, /* BB04 (47876) */
-    3343, /* BB05 (47877) */
-    3343, /* BB06 (47878) */
-    3343, /* BB07 (47879) */
-    3343, /* BB08 (47880) */
-    3343, /* BB09 (47881) */
-    3343, /* BB0A (47882) */
-    3343, /* BB0B (47883) */
-    3343, /* BB0C (47884) */
-    3343, /* BB0D (47885) */
-    3343, /* BB0E (47886) */
-    3343, /* BB0F (47887) */
-    3343, /* BB10 (47888) */
-    3343, /* BB11 (47889) */
-    3343, /* BB12 (47890) */
-    3343, /* BB13 (47891) */
-    3343, /* BB14 (47892) */
-    3343, /* BB15 (47893) */
-    3343, /* BB16 (47894) */
-    3343, /* BB17 (47895) */
-    3343, /* BB18 (47896) */
-    3343, /* BB19 (47897) */
-    3343, /* BB1A (47898) */
-    3343, /* BB1B (47899) */
-    3343, /* BB1C (47900) */
-    3343, /* BB1D (47901) */
-    3343, /* BB1E (47902) */
-    3343, /* BB1F (47903) */
-    3343, /* BB20 (47904) */
-    3343, /* BB21 (47905) */
-    3343, /* BB22 (47906) */
-    3343, /* BB23 (47907) */
-    3343, /* BB24 (47908) */
-    3343, /* BB25 (47909) */
-    3343, /* BB26 (47910) */
-    3343, /* BB27 (47911) */
-    3343, /* BB28 (47912) */
-    3343, /* BB29 (47913) */
-    3343, /* BB2A (47914) */
-    3343, /* BB2B (47915) */
-    3343, /* BB2C (47916) */
-    3343, /* BB2D (47917) */
-    3343, /* BB2E (47918) */
-    3343, /* BB2F (47919) */
-    3343, /* BB30 (47920) */
-    3343, /* BB31 (47921) */
-    3343, /* BB32 (47922) */
-    3343, /* BB33 (47923) */
-    3343, /* BB34 (47924) */
-    3343, /* BB35 (47925) */
-    3343, /* BB36 (47926) */
-    3343, /* BB37 (47927) */
-    3343, /* BB38 (47928) */
-    3343, /* BB39 (47929) */
-    3343, /* BB3A (47930) */
-    3343, /* BB3B (47931) */
-    3343, /* BB3C (47932) */
-    3343, /* BB3D (47933) */
-    3343, /* BB3E (47934) */
-    3343, /* BB3F (47935) */
-    3343, /* BB40 (47936) */
-    3343, /* BB41 (47937) */
-    3343, /* BB42 (47938) */
-    3343, /* BB43 (47939) */
-    3343, /* BB44 (47940) */
-    3343, /* BB45 (47941) */
-    3343, /* BB46 (47942) */
-    3343, /* BB47 (47943) */
-    3343, /* BB48 (47944) */
-    3343, /* BB49 (47945) */
-    3343, /* BB4A (47946) */
-    3343, /* BB4B (47947) */
-    3343, /* BB4C (47948) */
-    3343, /* BB4D (47949) */
-    3343, /* BB4E (47950) */
-    3343, /* BB4F (47951) */
-    3343, /* BB50 (47952) */
-    3343, /* BB51 (47953) */
-    3343, /* BB52 (47954) */
-    3343, /* BB53 (47955) */
-    3343, /* BB54 (47956) */
-    3343, /* BB55 (47957) */
-    3343, /* BB56 (47958) */
-    3343, /* BB57 (47959) */
-    3343, /* BB58 (47960) */
-    3343, /* BB59 (47961) */
-    3343, /* BB5A (47962) */
-    3343, /* BB5B (47963) */
-    3343, /* BB5C (47964) */
-    3343, /* BB5D (47965) */
-    3343, /* BB5E (47966) */
-    3343, /* BB5F (47967) */
-    3343, /* BB60 (47968) */
-    3343, /* BB61 (47969) */
-    3343, /* BB62 (47970) */
-    3343, /* BB63 (47971) */
-    3343, /* BB64 (47972) */
-    3343, /* BB65 (47973) */
-    3343, /* BB66 (47974) */
-    3343, /* BB67 (47975) */
-    3343, /* BB68 (47976) */
-    3343, /* BB69 (47977) */
-    3343, /* BB6A (47978) */
-    3343, /* BB6B (47979) */
-    3343, /* BB6C (47980) */
-    3343, /* BB6D (47981) */
-    3343, /* BB6E (47982) */
-    3343, /* BB6F (47983) */
-    3343, /* BB70 (47984) */
-    3343, /* BB71 (47985) */
-    3343, /* BB72 (47986) */
-    3343, /* BB73 (47987) */
-    3343, /* BB74 (47988) */
-    3343, /* BB75 (47989) */
-    3343, /* BB76 (47990) */
-    3343, /* BB77 (47991) */
-    3343, /* BB78 (47992) */
-    3343, /* BB79 (47993) */
-    3343, /* BB7A (47994) */
-    3343, /* BB7B (47995) */
-    3343, /* BB7C (47996) */
-    3343, /* BB7D (47997) */
-    3343, /* BB7E (47998) */
-    3343, /* BB7F (47999) */
-    3343, /* BB80 (48000) */
-    3343, /* BB81 (48001) */
-    3343, /* BB82 (48002) */
-    3343, /* BB83 (48003) */
-    3343, /* BB84 (48004) */
-    3343, /* BB85 (48005) */
-    3343, /* BB86 (48006) */
-    3343, /* BB87 (48007) */
-    3343, /* BB88 (48008) */
-    3343, /* BB89 (48009) */
-    3343, /* BB8A (48010) */
-    3343, /* BB8B (48011) */
-    3343, /* BB8C (48012) */
-    3343, /* BB8D (48013) */
-    3343, /* BB8E (48014) */
-    3343, /* BB8F (48015) */
-    3343, /* BB90 (48016) */
-    3343, /* BB91 (48017) */
-    3343, /* BB92 (48018) */
-    3343, /* BB93 (48019) */
-    3343, /* BB94 (48020) */
-    3343, /* BB95 (48021) */
-    3343, /* BB96 (48022) */
-    3343, /* BB97 (48023) */
-    3343, /* BB98 (48024) */
-    3343, /* BB99 (48025) */
-    3343, /* BB9A (48026) */
-    3343, /* BB9B (48027) */
-    3343, /* BB9C (48028) */
-    3343, /* BB9D (48029) */
-    3343, /* BB9E (48030) */
-    3343, /* BB9F (48031) */
-    3343, /* BBA0 (48032) */
-    3343, /* BBA1 (48033) */
-    3343, /* BBA2 (48034) */
-    3343, /* BBA3 (48035) */
-    3343, /* BBA4 (48036) */
-    3343, /* BBA5 (48037) */
-    3343, /* BBA6 (48038) */
-    3343, /* BBA7 (48039) */
-    3343, /* BBA8 (48040) */
-    3343, /* BBA9 (48041) */
-    3343, /* BBAA (48042) */
-    3343, /* BBAB (48043) */
-    3343, /* BBAC (48044) */
-    3343, /* BBAD (48045) */
-    3343, /* BBAE (48046) */
-    3343, /* BBAF (48047) */
-    3343, /* BBB0 (48048) */
-    3343, /* BBB1 (48049) */
-    3343, /* BBB2 (48050) */
-    3343, /* BBB3 (48051) */
-    3343, /* BBB4 (48052) */
-    3343, /* BBB5 (48053) */
-    3343, /* BBB6 (48054) */
-    3343, /* BBB7 (48055) */
-    3343, /* BBB8 (48056) */
-    3343, /* BBB9 (48057) */
-    3343, /* BBBA (48058) */
-    3343, /* BBBB (48059) */
-    3343, /* BBBC (48060) */
-    3343, /* BBBD (48061) */
-    3343, /* BBBE (48062) */
-    3343, /* BBBF (48063) */
-    3343, /* BBC0 (48064) */
-    3343, /* BBC1 (48065) */
-    3343, /* BBC2 (48066) */
-    3343, /* BBC3 (48067) */
-    3343, /* BBC4 (48068) */
-    3343, /* BBC5 (48069) */
-    3343, /* BBC6 (48070) */
-    3343, /* BBC7 (48071) */
-    3343, /* BBC8 (48072) */
-    3343, /* BBC9 (48073) */
-    3343, /* BBCA (48074) */
-    3343, /* BBCB (48075) */
-    3343, /* BBCC (48076) */
-    3343, /* BBCD (48077) */
-    3343, /* BBCE (48078) */
-    3343, /* BBCF (48079) */
-    3343, /* BBD0 (48080) */
-    3343, /* BBD1 (48081) */
-    3343, /* BBD2 (48082) */
-    3343, /* BBD3 (48083) */
-    3343, /* BBD4 (48084) */
-    3343, /* BBD5 (48085) */
-    3343, /* BBD6 (48086) */
-    3343, /* BBD7 (48087) */
-    3343, /* BBD8 (48088) */
-    3343, /* BBD9 (48089) */
-    3343, /* BBDA (48090) */
-    3343, /* BBDB (48091) */
-    3343, /* BBDC (48092) */
-    3343, /* BBDD (48093) */
-    3343, /* BBDE (48094) */
-    3343, /* BBDF (48095) */
-    3343, /* BBE0 (48096) */
-    3343, /* BBE1 (48097) */
-    3343, /* BBE2 (48098) */
-    3343, /* BBE3 (48099) */
-    3343, /* BBE4 (48100) */
-    3343, /* BBE5 (48101) */
-    3343, /* BBE6 (48102) */
-    3343, /* BBE7 (48103) */
-    3343, /* BBE8 (48104) */
-    3343, /* BBE9 (48105) */
-    3343, /* BBEA (48106) */
-    3343, /* BBEB (48107) */
-    3343, /* BBEC (48108) */
-    3343, /* BBED (48109) */
-    3343, /* BBEE (48110) */
-    3343, /* BBEF (48111) */
-    3343, /* BBF0 (48112) */
-    3343, /* BBF1 (48113) */
-    3343, /* BBF2 (48114) */
-    3343, /* BBF3 (48115) */
-    3343, /* BBF4 (48116) */
-    3343, /* BBF5 (48117) */
-    3343, /* BBF6 (48118) */
-    3343, /* BBF7 (48119) */
-    3343, /* BBF8 (48120) */
-    3343, /* BBF9 (48121) */
-    3343, /* BBFA (48122) */
-    3343, /* BBFB (48123) */
-    3343, /* BBFC (48124) */
-    3343, /* BBFD (48125) */
-    3343, /* BBFE (48126) */
-    3343, /* BBFF (48127) */
-    3343, /* BC00 (48128) */
-    3343, /* BC01 (48129) */
-    3343, /* BC02 (48130) */
-    3343, /* BC03 (48131) */
-    3343, /* BC04 (48132) */
-    3343, /* BC05 (48133) */
-    3343, /* BC06 (48134) */
-    3343, /* BC07 (48135) */
-    3343, /* BC08 (48136) */
-    3343, /* BC09 (48137) */
-    3343, /* BC0A (48138) */
-    3343, /* BC0B (48139) */
-    3343, /* BC0C (48140) */
-    3343, /* BC0D (48141) */
-    3343, /* BC0E (48142) */
-    3343, /* BC0F (48143) */
-    3343, /* BC10 (48144) */
-    3343, /* BC11 (48145) */
-    3343, /* BC12 (48146) */
-    3343, /* BC13 (48147) */
-    3343, /* BC14 (48148) */
-    3343, /* BC15 (48149) */
-    3343, /* BC16 (48150) */
-    3343, /* BC17 (48151) */
-    3343, /* BC18 (48152) */
-    3343, /* BC19 (48153) */
-    3343, /* BC1A (48154) */
-    3343, /* BC1B (48155) */
-    3343, /* BC1C (48156) */
-    3343, /* BC1D (48157) */
-    3343, /* BC1E (48158) */
-    3343, /* BC1F (48159) */
-    3343, /* BC20 (48160) */
-    3343, /* BC21 (48161) */
-    3343, /* BC22 (48162) */
-    3343, /* BC23 (48163) */
-    3343, /* BC24 (48164) */
-    3343, /* BC25 (48165) */
-    3343, /* BC26 (48166) */
-    3343, /* BC27 (48167) */
-    3343, /* BC28 (48168) */
-    3343, /* BC29 (48169) */
-    3343, /* BC2A (48170) */
-    3343, /* BC2B (48171) */
-    3343, /* BC2C (48172) */
-    3343, /* BC2D (48173) */
-    3343, /* BC2E (48174) */
-    3343, /* BC2F (48175) */
-    3343, /* BC30 (48176) */
-    3343, /* BC31 (48177) */
-    3343, /* BC32 (48178) */
-    3343, /* BC33 (48179) */
-    3343, /* BC34 (48180) */
-    3343, /* BC35 (48181) */
-    3343, /* BC36 (48182) */
-    3343, /* BC37 (48183) */
-    3343, /* BC38 (48184) */
-    3343, /* BC39 (48185) */
-    3343, /* BC3A (48186) */
-    3343, /* BC3B (48187) */
-    3343, /* BC3C (48188) */
-    3343, /* BC3D (48189) */
-    3343, /* BC3E (48190) */
-    3343, /* BC3F (48191) */
-    3343, /* BC40 (48192) */
-    3343, /* BC41 (48193) */
-    3343, /* BC42 (48194) */
-    3343, /* BC43 (48195) */
-    3343, /* BC44 (48196) */
-    3343, /* BC45 (48197) */
-    3343, /* BC46 (48198) */
-    3343, /* BC47 (48199) */
-    3343, /* BC48 (48200) */
-    3343, /* BC49 (48201) */
-    3343, /* BC4A (48202) */
-    3343, /* BC4B (48203) */
-    3343, /* BC4C (48204) */
-    3343, /* BC4D (48205) */
-    3343, /* BC4E (48206) */
-    3343, /* BC4F (48207) */
-    3343, /* BC50 (48208) */
-    3343, /* BC51 (48209) */
-    3343, /* BC52 (48210) */
-    3343, /* BC53 (48211) */
-    3343, /* BC54 (48212) */
-    3343, /* BC55 (48213) */
-    3343, /* BC56 (48214) */
-    3343, /* BC57 (48215) */
-    3343, /* BC58 (48216) */
-    3343, /* BC59 (48217) */
-    3343, /* BC5A (48218) */
-    3343, /* BC5B (48219) */
-    3343, /* BC5C (48220) */
-    3343, /* BC5D (48221) */
-    3343, /* BC5E (48222) */
-    3343, /* BC5F (48223) */
-    3343, /* BC60 (48224) */
-    3343, /* BC61 (48225) */
-    3343, /* BC62 (48226) */
-    3343, /* BC63 (48227) */
-    3343, /* BC64 (48228) */
-    3343, /* BC65 (48229) */
-    3343, /* BC66 (48230) */
-    3343, /* BC67 (48231) */
-    3343, /* BC68 (48232) */
-    3343, /* BC69 (48233) */
-    3343, /* BC6A (48234) */
-    3343, /* BC6B (48235) */
-    3343, /* BC6C (48236) */
-    3343, /* BC6D (48237) */
-    3343, /* BC6E (48238) */
-    3343, /* BC6F (48239) */
-    3343, /* BC70 (48240) */
-    3343, /* BC71 (48241) */
-    3343, /* BC72 (48242) */
-    3343, /* BC73 (48243) */
-    3343, /* BC74 (48244) */
-    3343, /* BC75 (48245) */
-    3343, /* BC76 (48246) */
-    3343, /* BC77 (48247) */
-    3343, /* BC78 (48248) */
-    3343, /* BC79 (48249) */
-    3343, /* BC7A (48250) */
-    3343, /* BC7B (48251) */
-    3343, /* BC7C (48252) */
-    3343, /* BC7D (48253) */
-    3343, /* BC7E (48254) */
-    3343, /* BC7F (48255) */
-    3343, /* BC80 (48256) */
-    3343, /* BC81 (48257) */
-    3343, /* BC82 (48258) */
-    3343, /* BC83 (48259) */
-    3343, /* BC84 (48260) */
-    3343, /* BC85 (48261) */
-    3343, /* BC86 (48262) */
-    3343, /* BC87 (48263) */
-    3343, /* BC88 (48264) */
-    3343, /* BC89 (48265) */
-    3343, /* BC8A (48266) */
-    3343, /* BC8B (48267) */
-    3343, /* BC8C (48268) */
-    3343, /* BC8D (48269) */
-    3343, /* BC8E (48270) */
-    3343, /* BC8F (48271) */
-    3343, /* BC90 (48272) */
-    3343, /* BC91 (48273) */
-    3343, /* BC92 (48274) */
-    3343, /* BC93 (48275) */
-    3343, /* BC94 (48276) */
-    3343, /* BC95 (48277) */
-    3343, /* BC96 (48278) */
-    3343, /* BC97 (48279) */
-    3343, /* BC98 (48280) */
-    3343, /* BC99 (48281) */
-    3343, /* BC9A (48282) */
-    3343, /* BC9B (48283) */
-    3343, /* BC9C (48284) */
-    3343, /* BC9D (48285) */
-    3343, /* BC9E (48286) */
-    3343, /* BC9F (48287) */
-    3343, /* BCA0 (48288) */
-    3343, /* BCA1 (48289) */
-    3343, /* BCA2 (48290) */
-    3343, /* BCA3 (48291) */
-    3343, /* BCA4 (48292) */
-    3343, /* BCA5 (48293) */
-    3343, /* BCA6 (48294) */
-    3343, /* BCA7 (48295) */
-    3343, /* BCA8 (48296) */
-    3343, /* BCA9 (48297) */
-    3343, /* BCAA (48298) */
-    3343, /* BCAB (48299) */
-    3343, /* BCAC (48300) */
-    3343, /* BCAD (48301) */
-    3343, /* BCAE (48302) */
-    3343, /* BCAF (48303) */
-    3343, /* BCB0 (48304) */
-    3343, /* BCB1 (48305) */
-    3343, /* BCB2 (48306) */
-    3343, /* BCB3 (48307) */
-    3343, /* BCB4 (48308) */
-    3343, /* BCB5 (48309) */
-    3343, /* BCB6 (48310) */
-    3343, /* BCB7 (48311) */
-    3343, /* BCB8 (48312) */
-    3343, /* BCB9 (48313) */
-    3343, /* BCBA (48314) */
-    3343, /* BCBB (48315) */
-    3343, /* BCBC (48316) */
-    3343, /* BCBD (48317) */
-    3343, /* BCBE (48318) */
-    3343, /* BCBF (48319) */
-    3343, /* BCC0 (48320) */
-    3343, /* BCC1 (48321) */
-    3343, /* BCC2 (48322) */
-    3343, /* BCC3 (48323) */
-    3343, /* BCC4 (48324) */
-    3343, /* BCC5 (48325) */
-    3343, /* BCC6 (48326) */
-    3343, /* BCC7 (48327) */
-    3343, /* BCC8 (48328) */
-    3343, /* BCC9 (48329) */
-    3343, /* BCCA (48330) */
-    3343, /* BCCB (48331) */
-    3343, /* BCCC (48332) */
-    3343, /* BCCD (48333) */
-    3343, /* BCCE (48334) */
-    3343, /* BCCF (48335) */
-    3343, /* BCD0 (48336) */
-    3343, /* BCD1 (48337) */
-    3343, /* BCD2 (48338) */
-    3343, /* BCD3 (48339) */
-    3343, /* BCD4 (48340) */
-    3343, /* BCD5 (48341) */
-    3343, /* BCD6 (48342) */
-    3343, /* BCD7 (48343) */
-    3343, /* BCD8 (48344) */
-    3343, /* BCD9 (48345) */
-    3343, /* BCDA (48346) */
-    3343, /* BCDB (48347) */
-    3343, /* BCDC (48348) */
-    3343, /* BCDD (48349) */
-    3343, /* BCDE (48350) */
-    3343, /* BCDF (48351) */
-    3343, /* BCE0 (48352) */
-    3343, /* BCE1 (48353) */
-    3343, /* BCE2 (48354) */
-    3343, /* BCE3 (48355) */
-    3343, /* BCE4 (48356) */
-    3343, /* BCE5 (48357) */
-    3343, /* BCE6 (48358) */
-    3343, /* BCE7 (48359) */
-    3343, /* BCE8 (48360) */
-    3343, /* BCE9 (48361) */
-    3343, /* BCEA (48362) */
-    3343, /* BCEB (48363) */
-    3343, /* BCEC (48364) */
-    3343, /* BCED (48365) */
-    3343, /* BCEE (48366) */
-    3343, /* BCEF (48367) */
-    3343, /* BCF0 (48368) */
-    3343, /* BCF1 (48369) */
-    3343, /* BCF2 (48370) */
-    3343, /* BCF3 (48371) */
-    3343, /* BCF4 (48372) */
-    3343, /* BCF5 (48373) */
-    3343, /* BCF6 (48374) */
-    3343, /* BCF7 (48375) */
-    3343, /* BCF8 (48376) */
-    3343, /* BCF9 (48377) */
-    3343, /* BCFA (48378) */
-    3343, /* BCFB (48379) */
-    3343, /* BCFC (48380) */
-    3343, /* BCFD (48381) */
-    3343, /* BCFE (48382) */
-    3343, /* BCFF (48383) */
-    3343, /* BD00 (48384) */
-    3343, /* BD01 (48385) */
-    3343, /* BD02 (48386) */
-    3343, /* BD03 (48387) */
-    3343, /* BD04 (48388) */
-    3343, /* BD05 (48389) */
-    3343, /* BD06 (48390) */
-    3343, /* BD07 (48391) */
-    3343, /* BD08 (48392) */
-    3343, /* BD09 (48393) */
-    3343, /* BD0A (48394) */
-    3343, /* BD0B (48395) */
-    3343, /* BD0C (48396) */
-    3343, /* BD0D (48397) */
-    3343, /* BD0E (48398) */
-    3343, /* BD0F (48399) */
-    3343, /* BD10 (48400) */
-    3343, /* BD11 (48401) */
-    3343, /* BD12 (48402) */
-    3343, /* BD13 (48403) */
-    3343, /* BD14 (48404) */
-    3343, /* BD15 (48405) */
-    3343, /* BD16 (48406) */
-    3343, /* BD17 (48407) */
-    3343, /* BD18 (48408) */
-    3343, /* BD19 (48409) */
-    3343, /* BD1A (48410) */
-    3343, /* BD1B (48411) */
-    3343, /* BD1C (48412) */
-    3343, /* BD1D (48413) */
-    3343, /* BD1E (48414) */
-    3343, /* BD1F (48415) */
-    3343, /* BD20 (48416) */
-    3343, /* BD21 (48417) */
-    3343, /* BD22 (48418) */
-    3343, /* BD23 (48419) */
-    3343, /* BD24 (48420) */
-    3343, /* BD25 (48421) */
-    3343, /* BD26 (48422) */
-    3343, /* BD27 (48423) */
-    3343, /* BD28 (48424) */
-    3343, /* BD29 (48425) */
-    3343, /* BD2A (48426) */
-    3343, /* BD2B (48427) */
-    3343, /* BD2C (48428) */
-    3343, /* BD2D (48429) */
-    3343, /* BD2E (48430) */
-    3343, /* BD2F (48431) */
-    3343, /* BD30 (48432) */
-    3343, /* BD31 (48433) */
-    3343, /* BD32 (48434) */
-    3343, /* BD33 (48435) */
-    3343, /* BD34 (48436) */
-    3343, /* BD35 (48437) */
-    3343, /* BD36 (48438) */
-    3343, /* BD37 (48439) */
-    3343, /* BD38 (48440) */
-    3343, /* BD39 (48441) */
-    3343, /* BD3A (48442) */
-    3343, /* BD3B (48443) */
-    3343, /* BD3C (48444) */
-    3343, /* BD3D (48445) */
-    3343, /* BD3E (48446) */
-    3343, /* BD3F (48447) */
-    3343, /* BD40 (48448) */
-    3343, /* BD41 (48449) */
-    3343, /* BD42 (48450) */
-    3343, /* BD43 (48451) */
-    3343, /* BD44 (48452) */
-    3343, /* BD45 (48453) */
-    3343, /* BD46 (48454) */
-    3343, /* BD47 (48455) */
-    3343, /* BD48 (48456) */
-    3343, /* BD49 (48457) */
-    3343, /* BD4A (48458) */
-    3343, /* BD4B (48459) */
-    3343, /* BD4C (48460) */
-    3343, /* BD4D (48461) */
-    3343, /* BD4E (48462) */
-    3343, /* BD4F (48463) */
-    3343, /* BD50 (48464) */
-    3343, /* BD51 (48465) */
-    3343, /* BD52 (48466) */
-    3343, /* BD53 (48467) */
-    3343, /* BD54 (48468) */
-    3343, /* BD55 (48469) */
-    3343, /* BD56 (48470) */
-    3343, /* BD57 (48471) */
-    3343, /* BD58 (48472) */
-    3343, /* BD59 (48473) */
-    3343, /* BD5A (48474) */
-    3343, /* BD5B (48475) */
-    3343, /* BD5C (48476) */
-    3343, /* BD5D (48477) */
-    3343, /* BD5E (48478) */
-    3343, /* BD5F (48479) */
-    3343, /* BD60 (48480) */
-    3343, /* BD61 (48481) */
-    3343, /* BD62 (48482) */
-    3343, /* BD63 (48483) */
-    3343, /* BD64 (48484) */
-    3343, /* BD65 (48485) */
-    3343, /* BD66 (48486) */
-    3343, /* BD67 (48487) */
-    3343, /* BD68 (48488) */
-    3343, /* BD69 (48489) */
-    3343, /* BD6A (48490) */
-    3343, /* BD6B (48491) */
-    3343, /* BD6C (48492) */
-    3343, /* BD6D (48493) */
-    3343, /* BD6E (48494) */
-    3343, /* BD6F (48495) */
-    3343, /* BD70 (48496) */
-    3343, /* BD71 (48497) */
-    3343, /* BD72 (48498) */
-    3343, /* BD73 (48499) */
-    3343, /* BD74 (48500) */
-    3343, /* BD75 (48501) */
-    3343, /* BD76 (48502) */
-    3343, /* BD77 (48503) */
-    3343, /* BD78 (48504) */
-    3343, /* BD79 (48505) */
-    3343, /* BD7A (48506) */
-    3343, /* BD7B (48507) */
-    3343, /* BD7C (48508) */
-    3343, /* BD7D (48509) */
-    3343, /* BD7E (48510) */
-    3343, /* BD7F (48511) */
-    3343, /* BD80 (48512) */
-    3343, /* BD81 (48513) */
-    3343, /* BD82 (48514) */
-    3343, /* BD83 (48515) */
-    3343, /* BD84 (48516) */
-    3343, /* BD85 (48517) */
-    3343, /* BD86 (48518) */
-    3343, /* BD87 (48519) */
-    3343, /* BD88 (48520) */
-    3343, /* BD89 (48521) */
-    3343, /* BD8A (48522) */
-    3343, /* BD8B (48523) */
-    3343, /* BD8C (48524) */
-    3343, /* BD8D (48525) */
-    3343, /* BD8E (48526) */
-    3343, /* BD8F (48527) */
-    3343, /* BD90 (48528) */
-    3343, /* BD91 (48529) */
-    3343, /* BD92 (48530) */
-    3343, /* BD93 (48531) */
-    3343, /* BD94 (48532) */
-    3343, /* BD95 (48533) */
-    3343, /* BD96 (48534) */
-    3343, /* BD97 (48535) */
-    3343, /* BD98 (48536) */
-    3343, /* BD99 (48537) */
-    3343, /* BD9A (48538) */
-    3343, /* BD9B (48539) */
-    3343, /* BD9C (48540) */
-    3343, /* BD9D (48541) */
-    3343, /* BD9E (48542) */
-    3343, /* BD9F (48543) */
-    3343, /* BDA0 (48544) */
-    3343, /* BDA1 (48545) */
-    3343, /* BDA2 (48546) */
-    3343, /* BDA3 (48547) */
-    3343, /* BDA4 (48548) */
-    3343, /* BDA5 (48549) */
-    3343, /* BDA6 (48550) */
-    3343, /* BDA7 (48551) */
-    3343, /* BDA8 (48552) */
-    3343, /* BDA9 (48553) */
-    3343, /* BDAA (48554) */
-    3343, /* BDAB (48555) */
-    3343, /* BDAC (48556) */
-    3343, /* BDAD (48557) */
-    3343, /* BDAE (48558) */
-    3343, /* BDAF (48559) */
-    3343, /* BDB0 (48560) */
-    3343, /* BDB1 (48561) */
-    3343, /* BDB2 (48562) */
-    3343, /* BDB3 (48563) */
-    3343, /* BDB4 (48564) */
-    3343, /* BDB5 (48565) */
-    3343, /* BDB6 (48566) */
-    3343, /* BDB7 (48567) */
-    3343, /* BDB8 (48568) */
-    3343, /* BDB9 (48569) */
-    3343, /* BDBA (48570) */
-    3343, /* BDBB (48571) */
-    3343, /* BDBC (48572) */
-    3343, /* BDBD (48573) */
-    3343, /* BDBE (48574) */
-    3343, /* BDBF (48575) */
-    3343, /* BDC0 (48576) */
-    3343, /* BDC1 (48577) */
-    3343, /* BDC2 (48578) */
-    3343, /* BDC3 (48579) */
-    3343, /* BDC4 (48580) */
-    3343, /* BDC5 (48581) */
-    3343, /* BDC6 (48582) */
-    3343, /* BDC7 (48583) */
-    3343, /* BDC8 (48584) */
-    3343, /* BDC9 (48585) */
-    3343, /* BDCA (48586) */
-    3343, /* BDCB (48587) */
-    3343, /* BDCC (48588) */
-    3343, /* BDCD (48589) */
-    3343, /* BDCE (48590) */
-    3343, /* BDCF (48591) */
-    3343, /* BDD0 (48592) */
-    3343, /* BDD1 (48593) */
-    3343, /* BDD2 (48594) */
-    3343, /* BDD3 (48595) */
-    3343, /* BDD4 (48596) */
-    3343, /* BDD5 (48597) */
-    3343, /* BDD6 (48598) */
-    3343, /* BDD7 (48599) */
-    3343, /* BDD8 (48600) */
-    3343, /* BDD9 (48601) */
-    3343, /* BDDA (48602) */
-    3343, /* BDDB (48603) */
-    3343, /* BDDC (48604) */
-    3343, /* BDDD (48605) */
-    3343, /* BDDE (48606) */
-    3343, /* BDDF (48607) */
-    3343, /* BDE0 (48608) */
-    3343, /* BDE1 (48609) */
-    3343, /* BDE2 (48610) */
-    3343, /* BDE3 (48611) */
-    3343, /* BDE4 (48612) */
-    3343, /* BDE5 (48613) */
-    3343, /* BDE6 (48614) */
-    3343, /* BDE7 (48615) */
-    3343, /* BDE8 (48616) */
-    3343, /* BDE9 (48617) */
-    3343, /* BDEA (48618) */
-    3343, /* BDEB (48619) */
-    3343, /* BDEC (48620) */
-    3343, /* BDED (48621) */
-    3343, /* BDEE (48622) */
-    3343, /* BDEF (48623) */
-    3343, /* BDF0 (48624) */
-    3343, /* BDF1 (48625) */
-    3343, /* BDF2 (48626) */
-    3343, /* BDF3 (48627) */
-    3343, /* BDF4 (48628) */
-    3343, /* BDF5 (48629) */
-    3343, /* BDF6 (48630) */
-    3343, /* BDF7 (48631) */
-    3343, /* BDF8 (48632) */
-    3343, /* BDF9 (48633) */
-    3343, /* BDFA (48634) */
-    3343, /* BDFB (48635) */
-    3343, /* BDFC (48636) */
-    3343, /* BDFD (48637) */
-    3343, /* BDFE (48638) */
-    3343, /* BDFF (48639) */
-    3343, /* BE00 (48640) */
-    3343, /* BE01 (48641) */
-    3343, /* BE02 (48642) */
-    3343, /* BE03 (48643) */
-    3343, /* BE04 (48644) */
-    3343, /* BE05 (48645) */
-    3343, /* BE06 (48646) */
-    3343, /* BE07 (48647) */
-    3343, /* BE08 (48648) */
-    3343, /* BE09 (48649) */
-    3343, /* BE0A (48650) */
-    3343, /* BE0B (48651) */
-    3343, /* BE0C (48652) */
-    3343, /* BE0D (48653) */
-    3343, /* BE0E (48654) */
-    3343, /* BE0F (48655) */
-    3343, /* BE10 (48656) */
-    3343, /* BE11 (48657) */
-    3343, /* BE12 (48658) */
-    3343, /* BE13 (48659) */
-    3343, /* BE14 (48660) */
-    3343, /* BE15 (48661) */
-    3343, /* BE16 (48662) */
-    3343, /* BE17 (48663) */
-    3343, /* BE18 (48664) */
-    3343, /* BE19 (48665) */
-    3343, /* BE1A (48666) */
-    3343, /* BE1B (48667) */
-    3343, /* BE1C (48668) */
-    3343, /* BE1D (48669) */
-    3343, /* BE1E (48670) */
-    3343, /* BE1F (48671) */
-    3343, /* BE20 (48672) */
-    3343, /* BE21 (48673) */
-    3343, /* BE22 (48674) */
-    3343, /* BE23 (48675) */
-    3343, /* BE24 (48676) */
-    3343, /* BE25 (48677) */
-    3343, /* BE26 (48678) */
-    3343, /* BE27 (48679) */
-    3343, /* BE28 (48680) */
-    3343, /* BE29 (48681) */
-    3343, /* BE2A (48682) */
-    3343, /* BE2B (48683) */
-    3343, /* BE2C (48684) */
-    3343, /* BE2D (48685) */
-    3343, /* BE2E (48686) */
-    3343, /* BE2F (48687) */
-    3343, /* BE30 (48688) */
-    3343, /* BE31 (48689) */
-    3343, /* BE32 (48690) */
-    3343, /* BE33 (48691) */
-    3343, /* BE34 (48692) */
-    3343, /* BE35 (48693) */
-    3343, /* BE36 (48694) */
-    3343, /* BE37 (48695) */
-    3343, /* BE38 (48696) */
-    3343, /* BE39 (48697) */
-    3343, /* BE3A (48698) */
-    3343, /* BE3B (48699) */
-    3343, /* BE3C (48700) */
-    3343, /* BE3D (48701) */
-    3343, /* BE3E (48702) */
-    3343, /* BE3F (48703) */
-    3343, /* BE40 (48704) */
-    3343, /* BE41 (48705) */
-    3343, /* BE42 (48706) */
-    3343, /* BE43 (48707) */
-    3343, /* BE44 (48708) */
-    3343, /* BE45 (48709) */
-    3343, /* BE46 (48710) */
-    3343, /* BE47 (48711) */
-    3343, /* BE48 (48712) */
-    3343, /* BE49 (48713) */
-    3343, /* BE4A (48714) */
-    3343, /* BE4B (48715) */
-    3343, /* BE4C (48716) */
-    3343, /* BE4D (48717) */
-    3343, /* BE4E (48718) */
-    3343, /* BE4F (48719) */
-    3343, /* BE50 (48720) */
-    3343, /* BE51 (48721) */
-    3343, /* BE52 (48722) */
-    3343, /* BE53 (48723) */
-    3343, /* BE54 (48724) */
-    3343, /* BE55 (48725) */
-    3343, /* BE56 (48726) */
-    3343, /* BE57 (48727) */
-    3343, /* BE58 (48728) */
-    3343, /* BE59 (48729) */
-    3343, /* BE5A (48730) */
-    3343, /* BE5B (48731) */
-    3343, /* BE5C (48732) */
-    3343, /* BE5D (48733) */
-    3343, /* BE5E (48734) */
-    3343, /* BE5F (48735) */
-    3343, /* BE60 (48736) */
-    3343, /* BE61 (48737) */
-    3343, /* BE62 (48738) */
-    3343, /* BE63 (48739) */
-    3343, /* BE64 (48740) */
-    3343, /* BE65 (48741) */
-    3343, /* BE66 (48742) */
-    3343, /* BE67 (48743) */
-    3343, /* BE68 (48744) */
-    3343, /* BE69 (48745) */
-    3343, /* BE6A (48746) */
-    3343, /* BE6B (48747) */
-    3343, /* BE6C (48748) */
-    3343, /* BE6D (48749) */
-    3343, /* BE6E (48750) */
-    3343, /* BE6F (48751) */
-    3343, /* BE70 (48752) */
-    3343, /* BE71 (48753) */
-    3343, /* BE72 (48754) */
-    3343, /* BE73 (48755) */
-    3343, /* BE74 (48756) */
-    3343, /* BE75 (48757) */
-    3343, /* BE76 (48758) */
-    3343, /* BE77 (48759) */
-    3343, /* BE78 (48760) */
-    3343, /* BE79 (48761) */
-    3343, /* BE7A (48762) */
-    3343, /* BE7B (48763) */
-    3343, /* BE7C (48764) */
-    3343, /* BE7D (48765) */
-    3343, /* BE7E (48766) */
-    3343, /* BE7F (48767) */
-    3343, /* BE80 (48768) */
-    3343, /* BE81 (48769) */
-    3343, /* BE82 (48770) */
-    3343, /* BE83 (48771) */
-    3343, /* BE84 (48772) */
-    3343, /* BE85 (48773) */
-    3343, /* BE86 (48774) */
-    3343, /* BE87 (48775) */
-    3343, /* BE88 (48776) */
-    3343, /* BE89 (48777) */
-    3343, /* BE8A (48778) */
-    3343, /* BE8B (48779) */
-    3343, /* BE8C (48780) */
-    3343, /* BE8D (48781) */
-    3343, /* BE8E (48782) */
-    3343, /* BE8F (48783) */
-    3343, /* BE90 (48784) */
-    3343, /* BE91 (48785) */
-    3343, /* BE92 (48786) */
-    3343, /* BE93 (48787) */
-    3343, /* BE94 (48788) */
-    3343, /* BE95 (48789) */
-    3343, /* BE96 (48790) */
-    3343, /* BE97 (48791) */
-    3343, /* BE98 (48792) */
-    3343, /* BE99 (48793) */
-    3343, /* BE9A (48794) */
-    3343, /* BE9B (48795) */
-    3343, /* BE9C (48796) */
-    3343, /* BE9D (48797) */
-    3343, /* BE9E (48798) */
-    3343, /* BE9F (48799) */
-    3343, /* BEA0 (48800) */
-    3343, /* BEA1 (48801) */
-    3343, /* BEA2 (48802) */
-    3343, /* BEA3 (48803) */
-    3343, /* BEA4 (48804) */
-    3343, /* BEA5 (48805) */
-    3343, /* BEA6 (48806) */
-    3343, /* BEA7 (48807) */
-    3343, /* BEA8 (48808) */
-    3343, /* BEA9 (48809) */
-    3343, /* BEAA (48810) */
-    3343, /* BEAB (48811) */
-    3343, /* BEAC (48812) */
-    3343, /* BEAD (48813) */
-    3343, /* BEAE (48814) */
-    3343, /* BEAF (48815) */
-    3343, /* BEB0 (48816) */
-    3343, /* BEB1 (48817) */
-    3343, /* BEB2 (48818) */
-    3343, /* BEB3 (48819) */
-    3343, /* BEB4 (48820) */
-    3343, /* BEB5 (48821) */
-    3343, /* BEB6 (48822) */
-    3343, /* BEB7 (48823) */
-    3343, /* BEB8 (48824) */
-    3343, /* BEB9 (48825) */
-    3343, /* BEBA (48826) */
-    3343, /* BEBB (48827) */
-    3343, /* BEBC (48828) */
-    3343, /* BEBD (48829) */
-    3343, /* BEBE (48830) */
-    3343, /* BEBF (48831) */
-    3343, /* BEC0 (48832) */
-    3343, /* BEC1 (48833) */
-    3343, /* BEC2 (48834) */
-    3343, /* BEC3 (48835) */
-    3343, /* BEC4 (48836) */
-    3343, /* BEC5 (48837) */
-    3343, /* BEC6 (48838) */
-    3343, /* BEC7 (48839) */
-    3343, /* BEC8 (48840) */
-    3343, /* BEC9 (48841) */
-    3343, /* BECA (48842) */
-    3343, /* BECB (48843) */
-    3343, /* BECC (48844) */
-    3343, /* BECD (48845) */
-    3343, /* BECE (48846) */
-    3343, /* BECF (48847) */
-    3343, /* BED0 (48848) */
-    3343, /* BED1 (48849) */
-    3343, /* BED2 (48850) */
-    3343, /* BED3 (48851) */
-    3343, /* BED4 (48852) */
-    3343, /* BED5 (48853) */
-    3343, /* BED6 (48854) */
-    3343, /* BED7 (48855) */
-    3343, /* BED8 (48856) */
-    3343, /* BED9 (48857) */
-    3343, /* BEDA (48858) */
-    3343, /* BEDB (48859) */
-    3343, /* BEDC (48860) */
-    3343, /* BEDD (48861) */
-    3343, /* BEDE (48862) */
-    3343, /* BEDF (48863) */
-    3343, /* BEE0 (48864) */
-    3343, /* BEE1 (48865) */
-    3343, /* BEE2 (48866) */
-    3343, /* BEE3 (48867) */
-    3343, /* BEE4 (48868) */
-    3343, /* BEE5 (48869) */
-    3343, /* BEE6 (48870) */
-    3343, /* BEE7 (48871) */
-    3343, /* BEE8 (48872) */
-    3343, /* BEE9 (48873) */
-    3343, /* BEEA (48874) */
-    3343, /* BEEB (48875) */
-    3343, /* BEEC (48876) */
-    3343, /* BEED (48877) */
-    3343, /* BEEE (48878) */
-    3343, /* BEEF (48879) */
-    3343, /* BEF0 (48880) */
-    3343, /* BEF1 (48881) */
-    3343, /* BEF2 (48882) */
-    3343, /* BEF3 (48883) */
-    3343, /* BEF4 (48884) */
-    3343, /* BEF5 (48885) */
-    3343, /* BEF6 (48886) */
-    3343, /* BEF7 (48887) */
-    3343, /* BEF8 (48888) */
-    3343, /* BEF9 (48889) */
-    3343, /* BEFA (48890) */
-    3343, /* BEFB (48891) */
-    3343, /* BEFC (48892) */
-    3343, /* BEFD (48893) */
-    3343, /* BEFE (48894) */
-    3343, /* BEFF (48895) */
-    3343, /* BF00 (48896) */
-    3343, /* BF01 (48897) */
-    3343, /* BF02 (48898) */
-    3343, /* BF03 (48899) */
-    3343, /* BF04 (48900) */
-    3343, /* BF05 (48901) */
-    3343, /* BF06 (48902) */
-    3343, /* BF07 (48903) */
-    3343, /* BF08 (48904) */
-    3343, /* BF09 (48905) */
-    3343, /* BF0A (48906) */
-    3343, /* BF0B (48907) */
-    3343, /* BF0C (48908) */
-    3343, /* BF0D (48909) */
-    3343, /* BF0E (48910) */
-    3343, /* BF0F (48911) */
-    3343, /* BF10 (48912) */
-    3343, /* BF11 (48913) */
-    3343, /* BF12 (48914) */
-    3343, /* BF13 (48915) */
-    3343, /* BF14 (48916) */
-    3343, /* BF15 (48917) */
-    3343, /* BF16 (48918) */
-    3343, /* BF17 (48919) */
-    3343, /* BF18 (48920) */
-    3343, /* BF19 (48921) */
-    3343, /* BF1A (48922) */
-    3343, /* BF1B (48923) */
-    3343, /* BF1C (48924) */
-    3343, /* BF1D (48925) */
-    3343, /* BF1E (48926) */
-    3343, /* BF1F (48927) */
-    3343, /* BF20 (48928) */
-    3343, /* BF21 (48929) */
-    3343, /* BF22 (48930) */
-    3343, /* BF23 (48931) */
-    3343, /* BF24 (48932) */
-    3343, /* BF25 (48933) */
-    3343, /* BF26 (48934) */
-    3343, /* BF27 (48935) */
-    3343, /* BF28 (48936) */
-    3343, /* BF29 (48937) */
-    3343, /* BF2A (48938) */
-    3343, /* BF2B (48939) */
-    3343, /* BF2C (48940) */
-    3343, /* BF2D (48941) */
-    3343, /* BF2E (48942) */
-    3343, /* BF2F (48943) */
-    3343, /* BF30 (48944) */
-    3343, /* BF31 (48945) */
-    3343, /* BF32 (48946) */
-    3343, /* BF33 (48947) */
-    3343, /* BF34 (48948) */
-    3343, /* BF35 (48949) */
-    3343, /* BF36 (48950) */
-    3343, /* BF37 (48951) */
-    3343, /* BF38 (48952) */
-    3343, /* BF39 (48953) */
-    3343, /* BF3A (48954) */
-    3343, /* BF3B (48955) */
-    3343, /* BF3C (48956) */
-    3343, /* BF3D (48957) */
-    3343, /* BF3E (48958) */
-    3343, /* BF3F (48959) */
-    3343, /* BF40 (48960) */
-    3343, /* BF41 (48961) */
-    3343, /* BF42 (48962) */
-    3343, /* BF43 (48963) */
-    3343, /* BF44 (48964) */
-    3343, /* BF45 (48965) */
-    3343, /* BF46 (48966) */
-    3343, /* BF47 (48967) */
-    3343, /* BF48 (48968) */
-    3343, /* BF49 (48969) */
-    3343, /* BF4A (48970) */
-    3343, /* BF4B (48971) */
-    3343, /* BF4C (48972) */
-    3343, /* BF4D (48973) */
-    3343, /* BF4E (48974) */
-    3343, /* BF4F (48975) */
-    3343, /* BF50 (48976) */
-    3343, /* BF51 (48977) */
-    3343, /* BF52 (48978) */
-    3343, /* BF53 (48979) */
-    3343, /* BF54 (48980) */
-    3343, /* BF55 (48981) */
-    3343, /* BF56 (48982) */
-    3343, /* BF57 (48983) */
-    3343, /* BF58 (48984) */
-    3343, /* BF59 (48985) */
-    3343, /* BF5A (48986) */
-    3343, /* BF5B (48987) */
-    3343, /* BF5C (48988) */
-    3343, /* BF5D (48989) */
-    3343, /* BF5E (48990) */
-    3343, /* BF5F (48991) */
-    3343, /* BF60 (48992) */
-    3343, /* BF61 (48993) */
-    3343, /* BF62 (48994) */
-    3343, /* BF63 (48995) */
-    3343, /* BF64 (48996) */
-    3343, /* BF65 (48997) */
-    3343, /* BF66 (48998) */
-    3343, /* BF67 (48999) */
-    3343, /* BF68 (49000) */
-    3343, /* BF69 (49001) */
-    3343, /* BF6A (49002) */
-    3343, /* BF6B (49003) */
-    3343, /* BF6C (49004) */
-    3343, /* BF6D (49005) */
-    3343, /* BF6E (49006) */
-    3343, /* BF6F (49007) */
-    3343, /* BF70 (49008) */
-    3343, /* BF71 (49009) */
-    3343, /* BF72 (49010) */
-    3343, /* BF73 (49011) */
-    3343, /* BF74 (49012) */
-    3343, /* BF75 (49013) */
-    3343, /* BF76 (49014) */
-    3343, /* BF77 (49015) */
-    3343, /* BF78 (49016) */
-    3343, /* BF79 (49017) */
-    3343, /* BF7A (49018) */
-    3343, /* BF7B (49019) */
-    3343, /* BF7C (49020) */
-    3343, /* BF7D (49021) */
-    3343, /* BF7E (49022) */
-    3343, /* BF7F (49023) */
-    3343, /* BF80 (49024) */
-    3343, /* BF81 (49025) */
-    3343, /* BF82 (49026) */
-    3343, /* BF83 (49027) */
-    3343, /* BF84 (49028) */
-    3343, /* BF85 (49029) */
-    3343, /* BF86 (49030) */
-    3343, /* BF87 (49031) */
-    3343, /* BF88 (49032) */
-    3343, /* BF89 (49033) */
-    3343, /* BF8A (49034) */
-    3343, /* BF8B (49035) */
-    3343, /* BF8C (49036) */
-    3343, /* BF8D (49037) */
-    3343, /* BF8E (49038) */
-    3343, /* BF8F (49039) */
-    3343, /* BF90 (49040) */
-    3343, /* BF91 (49041) */
-    3343, /* BF92 (49042) */
-    3343, /* BF93 (49043) */
-    3343, /* BF94 (49044) */
-    3343, /* BF95 (49045) */
-    3343, /* BF96 (49046) */
-    3343, /* BF97 (49047) */
-    3343, /* BF98 (49048) */
-    3343, /* BF99 (49049) */
-    3343, /* BF9A (49050) */
-    3343, /* BF9B (49051) */
-    3343, /* BF9C (49052) */
-    3343, /* BF9D (49053) */
-    3343, /* BF9E (49054) */
-    3343, /* BF9F (49055) */
-    3343, /* BFA0 (49056) */
-    3343, /* BFA1 (49057) */
-    3343, /* BFA2 (49058) */
-    3343, /* BFA3 (49059) */
-    3343, /* BFA4 (49060) */
-    3343, /* BFA5 (49061) */
-    3343, /* BFA6 (49062) */
-    3343, /* BFA7 (49063) */
-    3343, /* BFA8 (49064) */
-    3343, /* BFA9 (49065) */
-    3343, /* BFAA (49066) */
-    3343, /* BFAB (49067) */
-    3343, /* BFAC (49068) */
-    3343, /* BFAD (49069) */
-    3343, /* BFAE (49070) */
-    3343, /* BFAF (49071) */
-    3343, /* BFB0 (49072) */
-    3343, /* BFB1 (49073) */
-    3343, /* BFB2 (49074) */
-    3343, /* BFB3 (49075) */
-    3343, /* BFB4 (49076) */
-    3343, /* BFB5 (49077) */
-    3343, /* BFB6 (49078) */
-    3343, /* BFB7 (49079) */
-    3343, /* BFB8 (49080) */
-    3343, /* BFB9 (49081) */
-    3343, /* BFBA (49082) */
-    3343, /* BFBB (49083) */
-    3343, /* BFBC (49084) */
-    3343, /* BFBD (49085) */
-    3343, /* BFBE (49086) */
-    3343, /* BFBF (49087) */
-    3343, /* BFC0 (49088) */
-    3343, /* BFC1 (49089) */
-    3343, /* BFC2 (49090) */
-    3343, /* BFC3 (49091) */
-    3343, /* BFC4 (49092) */
-    3343, /* BFC5 (49093) */
-    3343, /* BFC6 (49094) */
-    3343, /* BFC7 (49095) */
-    3343, /* BFC8 (49096) */
-    3343, /* BFC9 (49097) */
-    3343, /* BFCA (49098) */
-    3343, /* BFCB (49099) */
-    3343, /* BFCC (49100) */
-    3343, /* BFCD (49101) */
-    3343, /* BFCE (49102) */
-    3343, /* BFCF (49103) */
-    3343, /* BFD0 (49104) */
-    3343, /* BFD1 (49105) */
-    3343, /* BFD2 (49106) */
-    3343, /* BFD3 (49107) */
-    3343, /* BFD4 (49108) */
-    3343, /* BFD5 (49109) */
-    3343, /* BFD6 (49110) */
-    3343, /* BFD7 (49111) */
-    3343, /* BFD8 (49112) */
-    3343, /* BFD9 (49113) */
-    3343, /* BFDA (49114) */
-    3343, /* BFDB (49115) */
-    3343, /* BFDC (49116) */
-    3343, /* BFDD (49117) */
-    3343, /* BFDE (49118) */
-    3343, /* BFDF (49119) */
-    3343, /* BFE0 (49120) */
-    3343, /* BFE1 (49121) */
-    3343, /* BFE2 (49122) */
-    3343, /* BFE3 (49123) */
-    3343, /* BFE4 (49124) */
-    3343, /* BFE5 (49125) */
-    3343, /* BFE6 (49126) */
-    3343, /* BFE7 (49127) */
-    3343, /* BFE8 (49128) */
-    3343, /* BFE9 (49129) */
-    3343, /* BFEA (49130) */
-    3343, /* BFEB (49131) */
-    3343, /* BFEC (49132) */
-    3343, /* BFED (49133) */
-    3343, /* BFEE (49134) */
-    3343, /* BFEF (49135) */
-    3343, /* BFF0 (49136) */
-    3343, /* BFF1 (49137) */
-    3343, /* BFF2 (49138) */
-    3343, /* BFF3 (49139) */
-    3343, /* BFF4 (49140) */
-    3343, /* BFF5 (49141) */
-    3343, /* BFF6 (49142) */
-    3343, /* BFF7 (49143) */
-    3343, /* BFF8 (49144) */
-    3343, /* BFF9 (49145) */
-    3343, /* BFFA (49146) */
-    3343, /* BFFB (49147) */
-    3343, /* BFFC (49148) */
-    3343, /* BFFD (49149) */
-    3343, /* BFFE (49150) */
-    3343, /* BFFF (49151) */
-    3343, /* C000 (49152) */
-    3343, /* C001 (49153) */
-    3343, /* C002 (49154) */
-    3343, /* C003 (49155) */
-    3343, /* C004 (49156) */
-    3343, /* C005 (49157) */
-    3343, /* C006 (49158) */
-    3343, /* C007 (49159) */
-    3343, /* C008 (49160) */
-    3343, /* C009 (49161) */
-    3343, /* C00A (49162) */
-    3343, /* C00B (49163) */
-    3343, /* C00C (49164) */
-    3343, /* C00D (49165) */
-    3343, /* C00E (49166) */
-    3343, /* C00F (49167) */
-    3343, /* C010 (49168) */
-    3343, /* C011 (49169) */
-    3343, /* C012 (49170) */
-    3343, /* C013 (49171) */
-    3343, /* C014 (49172) */
-    3343, /* C015 (49173) */
-    3343, /* C016 (49174) */
-    3343, /* C017 (49175) */
-    3343, /* C018 (49176) */
-    3343, /* C019 (49177) */
-    3343, /* C01A (49178) */
-    3343, /* C01B (49179) */
-    3343, /* C01C (49180) */
-    3343, /* C01D (49181) */
-    3343, /* C01E (49182) */
-    3343, /* C01F (49183) */
-    3343, /* C020 (49184) */
-    3343, /* C021 (49185) */
-    3343, /* C022 (49186) */
-    3343, /* C023 (49187) */
-    3343, /* C024 (49188) */
-    3343, /* C025 (49189) */
-    3343, /* C026 (49190) */
-    3343, /* C027 (49191) */
-    3343, /* C028 (49192) */
-    3343, /* C029 (49193) */
-    3343, /* C02A (49194) */
-    3343, /* C02B (49195) */
-    3343, /* C02C (49196) */
-    3343, /* C02D (49197) */
-    3343, /* C02E (49198) */
-    3343, /* C02F (49199) */
-    3343, /* C030 (49200) */
-    3343, /* C031 (49201) */
-    3343, /* C032 (49202) */
-    3343, /* C033 (49203) */
-    3343, /* C034 (49204) */
-    3343, /* C035 (49205) */
-    3343, /* C036 (49206) */
-    3343, /* C037 (49207) */
-    3343, /* C038 (49208) */
-    3343, /* C039 (49209) */
-    3343, /* C03A (49210) */
-    3343, /* C03B (49211) */
-    3343, /* C03C (49212) */
-    3343, /* C03D (49213) */
-    3343, /* C03E (49214) */
-    3343, /* C03F (49215) */
-    3343, /* C040 (49216) */
-    3343, /* C041 (49217) */
-    3343, /* C042 (49218) */
-    3343, /* C043 (49219) */
-    3343, /* C044 (49220) */
-    3343, /* C045 (49221) */
-    3343, /* C046 (49222) */
-    3343, /* C047 (49223) */
-    3343, /* C048 (49224) */
-    3343, /* C049 (49225) */
-    3343, /* C04A (49226) */
-    3343, /* C04B (49227) */
-    3343, /* C04C (49228) */
-    3343, /* C04D (49229) */
-    3343, /* C04E (49230) */
-    3343, /* C04F (49231) */
-    3343, /* C050 (49232) */
-    3343, /* C051 (49233) */
-    3343, /* C052 (49234) */
-    3343, /* C053 (49235) */
-    3343, /* C054 (49236) */
-    3343, /* C055 (49237) */
-    3343, /* C056 (49238) */
-    3343, /* C057 (49239) */
-    3343, /* C058 (49240) */
-    3343, /* C059 (49241) */
-    3343, /* C05A (49242) */
-    3343, /* C05B (49243) */
-    3343, /* C05C (49244) */
-    3343, /* C05D (49245) */
-    3343, /* C05E (49246) */
-    3343, /* C05F (49247) */
-    3343, /* C060 (49248) */
-    3343, /* C061 (49249) */
-    3343, /* C062 (49250) */
-    3343, /* C063 (49251) */
-    3343, /* C064 (49252) */
-    3343, /* C065 (49253) */
-    3343, /* C066 (49254) */
-    3343, /* C067 (49255) */
-    3343, /* C068 (49256) */
-    3343, /* C069 (49257) */
-    3343, /* C06A (49258) */
-    3343, /* C06B (49259) */
-    3343, /* C06C (49260) */
-    3343, /* C06D (49261) */
-    3343, /* C06E (49262) */
-    3343, /* C06F (49263) */
-    3343, /* C070 (49264) */
-    3343, /* C071 (49265) */
-    3343, /* C072 (49266) */
-    3343, /* C073 (49267) */
-    3343, /* C074 (49268) */
-    3343, /* C075 (49269) */
-    3343, /* C076 (49270) */
-    3343, /* C077 (49271) */
-    3343, /* C078 (49272) */
-    3343, /* C079 (49273) */
-    3343, /* C07A (49274) */
-    3343, /* C07B (49275) */
-    3343, /* C07C (49276) */
-    3343, /* C07D (49277) */
-    3343, /* C07E (49278) */
-    3343, /* C07F (49279) */
-    3343, /* C080 (49280) */
-    3343, /* C081 (49281) */
-    3343, /* C082 (49282) */
-    3343, /* C083 (49283) */
-    3343, /* C084 (49284) */
-    3343, /* C085 (49285) */
-    3343, /* C086 (49286) */
-    3343, /* C087 (49287) */
-    3343, /* C088 (49288) */
-    3343, /* C089 (49289) */
-    3343, /* C08A (49290) */
-    3343, /* C08B (49291) */
-    3343, /* C08C (49292) */
-    3343, /* C08D (49293) */
-    3343, /* C08E (49294) */
-    3343, /* C08F (49295) */
-    3343, /* C090 (49296) */
-    3343, /* C091 (49297) */
-    3343, /* C092 (49298) */
-    3343, /* C093 (49299) */
-    3343, /* C094 (49300) */
-    3343, /* C095 (49301) */
-    3343, /* C096 (49302) */
-    3343, /* C097 (49303) */
-    3343, /* C098 (49304) */
-    3343, /* C099 (49305) */
-    3343, /* C09A (49306) */
-    3343, /* C09B (49307) */
-    3343, /* C09C (49308) */
-    3343, /* C09D (49309) */
-    3343, /* C09E (49310) */
-    3343, /* C09F (49311) */
-    3343, /* C0A0 (49312) */
-    3343, /* C0A1 (49313) */
-    3343, /* C0A2 (49314) */
-    3343, /* C0A3 (49315) */
-    3343, /* C0A4 (49316) */
-    3343, /* C0A5 (49317) */
-    3343, /* C0A6 (49318) */
-    3343, /* C0A7 (49319) */
-    3343, /* C0A8 (49320) */
-    3343, /* C0A9 (49321) */
-    3343, /* C0AA (49322) */
-    3343, /* C0AB (49323) */
-    3343, /* C0AC (49324) */
-    3343, /* C0AD (49325) */
-    3343, /* C0AE (49326) */
-    3343, /* C0AF (49327) */
-    3343, /* C0B0 (49328) */
-    3343, /* C0B1 (49329) */
-    3343, /* C0B2 (49330) */
-    3343, /* C0B3 (49331) */
-    3343, /* C0B4 (49332) */
-    3343, /* C0B5 (49333) */
-    3343, /* C0B6 (49334) */
-    3343, /* C0B7 (49335) */
-    3343, /* C0B8 (49336) */
-    3343, /* C0B9 (49337) */
-    3343, /* C0BA (49338) */
-    3343, /* C0BB (49339) */
-    3343, /* C0BC (49340) */
-    3343, /* C0BD (49341) */
-    3343, /* C0BE (49342) */
-    3343, /* C0BF (49343) */
-    3343, /* C0C0 (49344) */
-    3343, /* C0C1 (49345) */
-    3343, /* C0C2 (49346) */
-    3343, /* C0C3 (49347) */
-    3343, /* C0C4 (49348) */
-    3343, /* C0C5 (49349) */
-    3343, /* C0C6 (49350) */
-    3343, /* C0C7 (49351) */
-    3343, /* C0C8 (49352) */
-    3343, /* C0C9 (49353) */
-    3343, /* C0CA (49354) */
-    3343, /* C0CB (49355) */
-    3343, /* C0CC (49356) */
-    3343, /* C0CD (49357) */
-    3343, /* C0CE (49358) */
-    3343, /* C0CF (49359) */
-    3343, /* C0D0 (49360) */
-    3343, /* C0D1 (49361) */
-    3343, /* C0D2 (49362) */
-    3343, /* C0D3 (49363) */
-    3343, /* C0D4 (49364) */
-    3343, /* C0D5 (49365) */
-    3343, /* C0D6 (49366) */
-    3343, /* C0D7 (49367) */
-    3343, /* C0D8 (49368) */
-    3343, /* C0D9 (49369) */
-    3343, /* C0DA (49370) */
-    3343, /* C0DB (49371) */
-    3343, /* C0DC (49372) */
-    3343, /* C0DD (49373) */
-    3343, /* C0DE (49374) */
-    3343, /* C0DF (49375) */
-    3343, /* C0E0 (49376) */
-    3343, /* C0E1 (49377) */
-    3343, /* C0E2 (49378) */
-    3343, /* C0E3 (49379) */
-    3343, /* C0E4 (49380) */
-    3343, /* C0E5 (49381) */
-    3343, /* C0E6 (49382) */
-    3343, /* C0E7 (49383) */
-    3343, /* C0E8 (49384) */
-    3343, /* C0E9 (49385) */
-    3343, /* C0EA (49386) */
-    3343, /* C0EB (49387) */
-    3343, /* C0EC (49388) */
-    3343, /* C0ED (49389) */
-    3343, /* C0EE (49390) */
-    3343, /* C0EF (49391) */
-    3343, /* C0F0 (49392) */
-    3343, /* C0F1 (49393) */
-    3343, /* C0F2 (49394) */
-    3343, /* C0F3 (49395) */
-    3343, /* C0F4 (49396) */
-    3343, /* C0F5 (49397) */
-    3343, /* C0F6 (49398) */
-    3343, /* C0F7 (49399) */
-    3343, /* C0F8 (49400) */
-    3343, /* C0F9 (49401) */
-    3343, /* C0FA (49402) */
-    3343, /* C0FB (49403) */
-    3343, /* C0FC (49404) */
-    3343, /* C0FD (49405) */
-    3343, /* C0FE (49406) */
-    3343, /* C0FF (49407) */
-    3343, /* C100 (49408) */
-    3343, /* C101 (49409) */
-    3343, /* C102 (49410) */
-    3343, /* C103 (49411) */
-    3343, /* C104 (49412) */
-    3343, /* C105 (49413) */
-    3343, /* C106 (49414) */
-    3343, /* C107 (49415) */
-    3343, /* C108 (49416) */
-    3343, /* C109 (49417) */
-    3343, /* C10A (49418) */
-    3343, /* C10B (49419) */
-    3343, /* C10C (49420) */
-    3343, /* C10D (49421) */
-    3343, /* C10E (49422) */
-    3343, /* C10F (49423) */
-    3343, /* C110 (49424) */
-    3343, /* C111 (49425) */
-    3343, /* C112 (49426) */
-    3343, /* C113 (49427) */
-    3343, /* C114 (49428) */
-    3343, /* C115 (49429) */
-    3343, /* C116 (49430) */
-    3343, /* C117 (49431) */
-    3343, /* C118 (49432) */
-    3343, /* C119 (49433) */
-    3343, /* C11A (49434) */
-    3343, /* C11B (49435) */
-    3343, /* C11C (49436) */
-    3343, /* C11D (49437) */
-    3343, /* C11E (49438) */
-    3343, /* C11F (49439) */
-    3343, /* C120 (49440) */
-    3343, /* C121 (49441) */
-    3343, /* C122 (49442) */
-    3343, /* C123 (49443) */
-    3343, /* C124 (49444) */
-    3343, /* C125 (49445) */
-    3343, /* C126 (49446) */
-    3343, /* C127 (49447) */
-    3343, /* C128 (49448) */
-    3343, /* C129 (49449) */
-    3343, /* C12A (49450) */
-    3343, /* C12B (49451) */
-    3343, /* C12C (49452) */
-    3343, /* C12D (49453) */
-    3343, /* C12E (49454) */
-    3343, /* C12F (49455) */
-    3343, /* C130 (49456) */
-    3343, /* C131 (49457) */
-    3343, /* C132 (49458) */
-    3343, /* C133 (49459) */
-    3343, /* C134 (49460) */
-    3343, /* C135 (49461) */
-    3343, /* C136 (49462) */
-    3343, /* C137 (49463) */
-    3343, /* C138 (49464) */
-    3343, /* C139 (49465) */
-    3343, /* C13A (49466) */
-    3343, /* C13B (49467) */
-    3343, /* C13C (49468) */
-    3343, /* C13D (49469) */
-    3343, /* C13E (49470) */
-    3343, /* C13F (49471) */
-    3343, /* C140 (49472) */
-    3343, /* C141 (49473) */
-    3343, /* C142 (49474) */
-    3343, /* C143 (49475) */
-    3343, /* C144 (49476) */
-    3343, /* C145 (49477) */
-    3343, /* C146 (49478) */
-    3343, /* C147 (49479) */
-    3343, /* C148 (49480) */
-    3343, /* C149 (49481) */
-    3343, /* C14A (49482) */
-    3343, /* C14B (49483) */
-    3343, /* C14C (49484) */
-    3343, /* C14D (49485) */
-    3343, /* C14E (49486) */
-    3343, /* C14F (49487) */
-    3343, /* C150 (49488) */
-    3343, /* C151 (49489) */
-    3343, /* C152 (49490) */
-    3343, /* C153 (49491) */
-    3343, /* C154 (49492) */
-    3343, /* C155 (49493) */
-    3343, /* C156 (49494) */
-    3343, /* C157 (49495) */
-    3343, /* C158 (49496) */
-    3343, /* C159 (49497) */
-    3343, /* C15A (49498) */
-    3343, /* C15B (49499) */
-    3343, /* C15C (49500) */
-    3343, /* C15D (49501) */
-    3343, /* C15E (49502) */
-    3343, /* C15F (49503) */
-    3343, /* C160 (49504) */
-    3343, /* C161 (49505) */
-    3343, /* C162 (49506) */
-    3343, /* C163 (49507) */
-    3343, /* C164 (49508) */
-    3343, /* C165 (49509) */
-    3343, /* C166 (49510) */
-    3343, /* C167 (49511) */
-    3343, /* C168 (49512) */
-    3343, /* C169 (49513) */
-    3343, /* C16A (49514) */
-    3343, /* C16B (49515) */
-    3343, /* C16C (49516) */
-    3343, /* C16D (49517) */
-    3343, /* C16E (49518) */
-    3343, /* C16F (49519) */
-    3343, /* C170 (49520) */
-    3343, /* C171 (49521) */
-    3343, /* C172 (49522) */
-    3343, /* C173 (49523) */
-    3343, /* C174 (49524) */
-    3343, /* C175 (49525) */
-    3343, /* C176 (49526) */
-    3343, /* C177 (49527) */
-    3343, /* C178 (49528) */
-    3343, /* C179 (49529) */
-    3343, /* C17A (49530) */
-    3343, /* C17B (49531) */
-    3343, /* C17C (49532) */
-    3343, /* C17D (49533) */
-    3343, /* C17E (49534) */
-    3343, /* C17F (49535) */
-    3343, /* C180 (49536) */
-    3343, /* C181 (49537) */
-    3343, /* C182 (49538) */
-    3343, /* C183 (49539) */
-    3343, /* C184 (49540) */
-    3343, /* C185 (49541) */
-    3343, /* C186 (49542) */
-    3343, /* C187 (49543) */
-    3343, /* C188 (49544) */
-    3343, /* C189 (49545) */
-    3343, /* C18A (49546) */
-    3343, /* C18B (49547) */
-    3343, /* C18C (49548) */
-    3343, /* C18D (49549) */
-    3343, /* C18E (49550) */
-    3343, /* C18F (49551) */
-    3343, /* C190 (49552) */
-    3343, /* C191 (49553) */
-    3343, /* C192 (49554) */
-    3343, /* C193 (49555) */
-    3343, /* C194 (49556) */
-    3343, /* C195 (49557) */
-    3343, /* C196 (49558) */
-    3343, /* C197 (49559) */
-    3343, /* C198 (49560) */
-    3343, /* C199 (49561) */
-    3343, /* C19A (49562) */
-    3343, /* C19B (49563) */
-    3343, /* C19C (49564) */
-    3343, /* C19D (49565) */
-    3343, /* C19E (49566) */
-    3343, /* C19F (49567) */
-    3343, /* C1A0 (49568) */
-    3343, /* C1A1 (49569) */
-    3343, /* C1A2 (49570) */
-    3343, /* C1A3 (49571) */
-    3343, /* C1A4 (49572) */
-    3343, /* C1A5 (49573) */
-    3343, /* C1A6 (49574) */
-    3343, /* C1A7 (49575) */
-    3343, /* C1A8 (49576) */
-    3343, /* C1A9 (49577) */
-    3343, /* C1AA (49578) */
-    3343, /* C1AB (49579) */
-    3343, /* C1AC (49580) */
-    3343, /* C1AD (49581) */
-    3343, /* C1AE (49582) */
-    3343, /* C1AF (49583) */
-    3343, /* C1B0 (49584) */
-    3343, /* C1B1 (49585) */
-    3343, /* C1B2 (49586) */
-    3343, /* C1B3 (49587) */
-    3343, /* C1B4 (49588) */
-    3343, /* C1B5 (49589) */
-    3343, /* C1B6 (49590) */
-    3343, /* C1B7 (49591) */
-    3343, /* C1B8 (49592) */
-    3343, /* C1B9 (49593) */
-    3343, /* C1BA (49594) */
-    3343, /* C1BB (49595) */
-    3343, /* C1BC (49596) */
-    3343, /* C1BD (49597) */
-    3343, /* C1BE (49598) */
-    3343, /* C1BF (49599) */
-    3343, /* C1C0 (49600) */
-    3343, /* C1C1 (49601) */
-    3343, /* C1C2 (49602) */
-    3343, /* C1C3 (49603) */
-    3343, /* C1C4 (49604) */
-    3343, /* C1C5 (49605) */
-    3343, /* C1C6 (49606) */
-    3343, /* C1C7 (49607) */
-    3343, /* C1C8 (49608) */
-    3343, /* C1C9 (49609) */
-    3343, /* C1CA (49610) */
-    3343, /* C1CB (49611) */
-    3343, /* C1CC (49612) */
-    3343, /* C1CD (49613) */
-    3343, /* C1CE (49614) */
-    3343, /* C1CF (49615) */
-    3343, /* C1D0 (49616) */
-    3343, /* C1D1 (49617) */
-    3343, /* C1D2 (49618) */
-    3343, /* C1D3 (49619) */
-    3343, /* C1D4 (49620) */
-    3343, /* C1D5 (49621) */
-    3343, /* C1D6 (49622) */
-    3343, /* C1D7 (49623) */
-    3343, /* C1D8 (49624) */
-    3343, /* C1D9 (49625) */
-    3343, /* C1DA (49626) */
-    3343, /* C1DB (49627) */
-    3343, /* C1DC (49628) */
-    3343, /* C1DD (49629) */
-    3343, /* C1DE (49630) */
-    3343, /* C1DF (49631) */
-    3343, /* C1E0 (49632) */
-    3343, /* C1E1 (49633) */
-    3343, /* C1E2 (49634) */
-    3343, /* C1E3 (49635) */
-    3343, /* C1E4 (49636) */
-    3343, /* C1E5 (49637) */
-    3343, /* C1E6 (49638) */
-    3343, /* C1E7 (49639) */
-    3343, /* C1E8 (49640) */
-    3343, /* C1E9 (49641) */
-    3343, /* C1EA (49642) */
-    3343, /* C1EB (49643) */
-    3343, /* C1EC (49644) */
-    3343, /* C1ED (49645) */
-    3343, /* C1EE (49646) */
-    3343, /* C1EF (49647) */
-    3343, /* C1F0 (49648) */
-    3343, /* C1F1 (49649) */
-    3343, /* C1F2 (49650) */
-    3343, /* C1F3 (49651) */
-    3343, /* C1F4 (49652) */
-    3343, /* C1F5 (49653) */
-    3343, /* C1F6 (49654) */
-    3343, /* C1F7 (49655) */
-    3343, /* C1F8 (49656) */
-    3343, /* C1F9 (49657) */
-    3343, /* C1FA (49658) */
-    3343, /* C1FB (49659) */
-    3343, /* C1FC (49660) */
-    3343, /* C1FD (49661) */
-    3343, /* C1FE (49662) */
-    3343, /* C1FF (49663) */
-    3343, /* C200 (49664) */
-    3343, /* C201 (49665) */
-    3343, /* C202 (49666) */
-    3343, /* C203 (49667) */
-    3343, /* C204 (49668) */
-    3343, /* C205 (49669) */
-    3343, /* C206 (49670) */
-    3343, /* C207 (49671) */
-    3343, /* C208 (49672) */
-    3343, /* C209 (49673) */
-    3343, /* C20A (49674) */
-    3343, /* C20B (49675) */
-    3343, /* C20C (49676) */
-    3343, /* C20D (49677) */
-    3343, /* C20E (49678) */
-    3343, /* C20F (49679) */
-    3343, /* C210 (49680) */
-    3343, /* C211 (49681) */
-    3343, /* C212 (49682) */
-    3343, /* C213 (49683) */
-    3343, /* C214 (49684) */
-    3343, /* C215 (49685) */
-    3343, /* C216 (49686) */
-    3343, /* C217 (49687) */
-    3343, /* C218 (49688) */
-    3343, /* C219 (49689) */
-    3343, /* C21A (49690) */
-    3343, /* C21B (49691) */
-    3343, /* C21C (49692) */
-    3343, /* C21D (49693) */
-    3343, /* C21E (49694) */
-    3343, /* C21F (49695) */
-    3343, /* C220 (49696) */
-    3343, /* C221 (49697) */
-    3343, /* C222 (49698) */
-    3343, /* C223 (49699) */
-    3343, /* C224 (49700) */
-    3343, /* C225 (49701) */
-    3343, /* C226 (49702) */
-    3343, /* C227 (49703) */
-    3343, /* C228 (49704) */
-    3343, /* C229 (49705) */
-    3343, /* C22A (49706) */
-    3343, /* C22B (49707) */
-    3343, /* C22C (49708) */
-    3343, /* C22D (49709) */
-    3343, /* C22E (49710) */
-    3343, /* C22F (49711) */
-    3343, /* C230 (49712) */
-    3343, /* C231 (49713) */
-    3343, /* C232 (49714) */
-    3343, /* C233 (49715) */
-    3343, /* C234 (49716) */
-    3343, /* C235 (49717) */
-    3343, /* C236 (49718) */
-    3343, /* C237 (49719) */
-    3343, /* C238 (49720) */
-    3343, /* C239 (49721) */
-    3343, /* C23A (49722) */
-    3343, /* C23B (49723) */
-    3343, /* C23C (49724) */
-    3343, /* C23D (49725) */
-    3343, /* C23E (49726) */
-    3343, /* C23F (49727) */
-    3343, /* C240 (49728) */
-    3343, /* C241 (49729) */
-    3343, /* C242 (49730) */
-    3343, /* C243 (49731) */
-    3343, /* C244 (49732) */
-    3343, /* C245 (49733) */
-    3343, /* C246 (49734) */
-    3343, /* C247 (49735) */
-    3343, /* C248 (49736) */
-    3343, /* C249 (49737) */
-    3343, /* C24A (49738) */
-    3343, /* C24B (49739) */
-    3343, /* C24C (49740) */
-    3343, /* C24D (49741) */
-    3343, /* C24E (49742) */
-    3343, /* C24F (49743) */
-    3343, /* C250 (49744) */
-    3343, /* C251 (49745) */
-    3343, /* C252 (49746) */
-    3343, /* C253 (49747) */
-    3343, /* C254 (49748) */
-    3343, /* C255 (49749) */
-    3343, /* C256 (49750) */
-    3343, /* C257 (49751) */
-    3343, /* C258 (49752) */
-    3343, /* C259 (49753) */
-    3343, /* C25A (49754) */
-    3343, /* C25B (49755) */
-    3343, /* C25C (49756) */
-    3343, /* C25D (49757) */
-    3343, /* C25E (49758) */
-    3343, /* C25F (49759) */
-    3343, /* C260 (49760) */
-    3343, /* C261 (49761) */
-    3343, /* C262 (49762) */
-    3343, /* C263 (49763) */
-    3343, /* C264 (49764) */
-    3343, /* C265 (49765) */
-    3343, /* C266 (49766) */
-    3343, /* C267 (49767) */
-    3343, /* C268 (49768) */
-    3343, /* C269 (49769) */
-    3343, /* C26A (49770) */
-    3343, /* C26B (49771) */
-    3343, /* C26C (49772) */
-    3343, /* C26D (49773) */
-    3343, /* C26E (49774) */
-    3343, /* C26F (49775) */
-    3343, /* C270 (49776) */
-    3343, /* C271 (49777) */
-    3343, /* C272 (49778) */
-    3343, /* C273 (49779) */
-    3343, /* C274 (49780) */
-    3343, /* C275 (49781) */
-    3343, /* C276 (49782) */
-    3343, /* C277 (49783) */
-    3343, /* C278 (49784) */
-    3343, /* C279 (49785) */
-    3343, /* C27A (49786) */
-    3343, /* C27B (49787) */
-    3343, /* C27C (49788) */
-    3343, /* C27D (49789) */
-    3343, /* C27E (49790) */
-    3343, /* C27F (49791) */
-    3343, /* C280 (49792) */
-    3343, /* C281 (49793) */
-    3343, /* C282 (49794) */
-    3343, /* C283 (49795) */
-    3343, /* C284 (49796) */
-    3343, /* C285 (49797) */
-    3343, /* C286 (49798) */
-    3343, /* C287 (49799) */
-    3343, /* C288 (49800) */
-    3343, /* C289 (49801) */
-    3343, /* C28A (49802) */
-    3343, /* C28B (49803) */
-    3343, /* C28C (49804) */
-    3343, /* C28D (49805) */
-    3343, /* C28E (49806) */
-    3343, /* C28F (49807) */
-    3343, /* C290 (49808) */
-    3343, /* C291 (49809) */
-    3343, /* C292 (49810) */
-    3343, /* C293 (49811) */
-    3343, /* C294 (49812) */
-    3343, /* C295 (49813) */
-    3343, /* C296 (49814) */
-    3343, /* C297 (49815) */
-    3343, /* C298 (49816) */
-    3343, /* C299 (49817) */
-    3343, /* C29A (49818) */
-    3343, /* C29B (49819) */
-    3343, /* C29C (49820) */
-    3343, /* C29D (49821) */
-    3343, /* C29E (49822) */
-    3343, /* C29F (49823) */
-    3343, /* C2A0 (49824) */
-    3343, /* C2A1 (49825) */
-    3343, /* C2A2 (49826) */
-    3343, /* C2A3 (49827) */
-    3343, /* C2A4 (49828) */
-    3343, /* C2A5 (49829) */
-    3343, /* C2A6 (49830) */
-    3343, /* C2A7 (49831) */
-    3343, /* C2A8 (49832) */
-    3343, /* C2A9 (49833) */
-    3343, /* C2AA (49834) */
-    3343, /* C2AB (49835) */
-    3343, /* C2AC (49836) */
-    3343, /* C2AD (49837) */
-    3343, /* C2AE (49838) */
-    3343, /* C2AF (49839) */
-    3343, /* C2B0 (49840) */
-    3343, /* C2B1 (49841) */
-    3343, /* C2B2 (49842) */
-    3343, /* C2B3 (49843) */
-    3343, /* C2B4 (49844) */
-    3343, /* C2B5 (49845) */
-    3343, /* C2B6 (49846) */
-    3343, /* C2B7 (49847) */
-    3343, /* C2B8 (49848) */
-    3343, /* C2B9 (49849) */
-    3343, /* C2BA (49850) */
-    3343, /* C2BB (49851) */
-    3343, /* C2BC (49852) */
-    3343, /* C2BD (49853) */
-    3343, /* C2BE (49854) */
-    3343, /* C2BF (49855) */
-    3343, /* C2C0 (49856) */
-    3343, /* C2C1 (49857) */
-    3343, /* C2C2 (49858) */
-    3343, /* C2C3 (49859) */
-    3343, /* C2C4 (49860) */
-    3343, /* C2C5 (49861) */
-    3343, /* C2C6 (49862) */
-    3343, /* C2C7 (49863) */
-    3343, /* C2C8 (49864) */
-    3343, /* C2C9 (49865) */
-    3343, /* C2CA (49866) */
-    3343, /* C2CB (49867) */
-    3343, /* C2CC (49868) */
-    3343, /* C2CD (49869) */
-    3343, /* C2CE (49870) */
-    3343, /* C2CF (49871) */
-    3343, /* C2D0 (49872) */
-    3343, /* C2D1 (49873) */
-    3343, /* C2D2 (49874) */
-    3343, /* C2D3 (49875) */
-    3343, /* C2D4 (49876) */
-    3343, /* C2D5 (49877) */
-    3343, /* C2D6 (49878) */
-    3343, /* C2D7 (49879) */
-    3343, /* C2D8 (49880) */
-    3343, /* C2D9 (49881) */
-    3343, /* C2DA (49882) */
-    3343, /* C2DB (49883) */
-    3343, /* C2DC (49884) */
-    3343, /* C2DD (49885) */
-    3343, /* C2DE (49886) */
-    3343, /* C2DF (49887) */
-    3343, /* C2E0 (49888) */
-    3343, /* C2E1 (49889) */
-    3343, /* C2E2 (49890) */
-    3343, /* C2E3 (49891) */
-    3343, /* C2E4 (49892) */
-    3343, /* C2E5 (49893) */
-    3343, /* C2E6 (49894) */
-    3343, /* C2E7 (49895) */
-    3343, /* C2E8 (49896) */
-    3343, /* C2E9 (49897) */
-    3343, /* C2EA (49898) */
-    3343, /* C2EB (49899) */
-    3343, /* C2EC (49900) */
-    3343, /* C2ED (49901) */
-    3343, /* C2EE (49902) */
-    3343, /* C2EF (49903) */
-    3343, /* C2F0 (49904) */
-    3343, /* C2F1 (49905) */
-    3343, /* C2F2 (49906) */
-    3343, /* C2F3 (49907) */
-    3343, /* C2F4 (49908) */
-    3343, /* C2F5 (49909) */
-    3343, /* C2F6 (49910) */
-    3343, /* C2F7 (49911) */
-    3343, /* C2F8 (49912) */
-    3343, /* C2F9 (49913) */
-    3343, /* C2FA (49914) */
-    3343, /* C2FB (49915) */
-    3343, /* C2FC (49916) */
-    3343, /* C2FD (49917) */
-    3343, /* C2FE (49918) */
-    3343, /* C2FF (49919) */
-    3343, /* C300 (49920) */
-    3343, /* C301 (49921) */
-    3343, /* C302 (49922) */
-    3343, /* C303 (49923) */
-    3343, /* C304 (49924) */
-    3343, /* C305 (49925) */
-    3343, /* C306 (49926) */
-    3343, /* C307 (49927) */
-    3343, /* C308 (49928) */
-    3343, /* C309 (49929) */
-    3343, /* C30A (49930) */
-    3343, /* C30B (49931) */
-    3343, /* C30C (49932) */
-    3343, /* C30D (49933) */
-    3343, /* C30E (49934) */
-    3343, /* C30F (49935) */
-    3343, /* C310 (49936) */
-    3343, /* C311 (49937) */
-    3343, /* C312 (49938) */
-    3343, /* C313 (49939) */
-    3343, /* C314 (49940) */
-    3343, /* C315 (49941) */
-    3343, /* C316 (49942) */
-    3343, /* C317 (49943) */
-    3343, /* C318 (49944) */
-    3343, /* C319 (49945) */
-    3343, /* C31A (49946) */
-    3343, /* C31B (49947) */
-    3343, /* C31C (49948) */
-    3343, /* C31D (49949) */
-    3343, /* C31E (49950) */
-    3343, /* C31F (49951) */
-    3343, /* C320 (49952) */
-    3343, /* C321 (49953) */
-    3343, /* C322 (49954) */
-    3343, /* C323 (49955) */
-    3343, /* C324 (49956) */
-    3343, /* C325 (49957) */
-    3343, /* C326 (49958) */
-    3343, /* C327 (49959) */
-    3343, /* C328 (49960) */
-    3343, /* C329 (49961) */
-    3343, /* C32A (49962) */
-    3343, /* C32B (49963) */
-    3343, /* C32C (49964) */
-    3343, /* C32D (49965) */
-    3343, /* C32E (49966) */
-    3343, /* C32F (49967) */
-    3343, /* C330 (49968) */
-    3343, /* C331 (49969) */
-    3343, /* C332 (49970) */
-    3343, /* C333 (49971) */
-    3343, /* C334 (49972) */
-    3343, /* C335 (49973) */
-    3343, /* C336 (49974) */
-    3343, /* C337 (49975) */
-    3343, /* C338 (49976) */
-    3343, /* C339 (49977) */
-    3343, /* C33A (49978) */
-    3343, /* C33B (49979) */
-    3343, /* C33C (49980) */
-    3343, /* C33D (49981) */
-    3343, /* C33E (49982) */
-    3343, /* C33F (49983) */
-    3343, /* C340 (49984) */
-    3343, /* C341 (49985) */
-    3343, /* C342 (49986) */
-    3343, /* C343 (49987) */
-    3343, /* C344 (49988) */
-    3343, /* C345 (49989) */
-    3343, /* C346 (49990) */
-    3343, /* C347 (49991) */
-    3343, /* C348 (49992) */
-    3343, /* C349 (49993) */
-    3343, /* C34A (49994) */
-    3343, /* C34B (49995) */
-    3343, /* C34C (49996) */
-    3343, /* C34D (49997) */
-    3343, /* C34E (49998) */
-    3343, /* C34F (49999) */
-    3343, /* C350 (50000) */
-    3343, /* C351 (50001) */
-    3343, /* C352 (50002) */
-    3343, /* C353 (50003) */
-    3343, /* C354 (50004) */
-    3343, /* C355 (50005) */
-    3343, /* C356 (50006) */
-    3343, /* C357 (50007) */
-    3343, /* C358 (50008) */
-    3343, /* C359 (50009) */
-    3343, /* C35A (50010) */
-    3343, /* C35B (50011) */
-    3343, /* C35C (50012) */
-    3343, /* C35D (50013) */
-    3343, /* C35E (50014) */
-    3343, /* C35F (50015) */
-    3343, /* C360 (50016) */
-    3343, /* C361 (50017) */
-    3343, /* C362 (50018) */
-    3343, /* C363 (50019) */
-    3343, /* C364 (50020) */
-    3343, /* C365 (50021) */
-    3343, /* C366 (50022) */
-    3343, /* C367 (50023) */
-    3343, /* C368 (50024) */
-    3343, /* C369 (50025) */
-    3343, /* C36A (50026) */
-    3343, /* C36B (50027) */
-    3343, /* C36C (50028) */
-    3343, /* C36D (50029) */
-    3343, /* C36E (50030) */
-    3343, /* C36F (50031) */
-    3343, /* C370 (50032) */
-    3343, /* C371 (50033) */
-    3343, /* C372 (50034) */
-    3343, /* C373 (50035) */
-    3343, /* C374 (50036) */
-    3343, /* C375 (50037) */
-    3343, /* C376 (50038) */
-    3343, /* C377 (50039) */
-    3343, /* C378 (50040) */
-    3343, /* C379 (50041) */
-    3343, /* C37A (50042) */
-    3343, /* C37B (50043) */
-    3343, /* C37C (50044) */
-    3343, /* C37D (50045) */
-    3343, /* C37E (50046) */
-    3343, /* C37F (50047) */
-    3343, /* C380 (50048) */
-    3343, /* C381 (50049) */
-    3343, /* C382 (50050) */
-    3343, /* C383 (50051) */
-    3343, /* C384 (50052) */
-    3343, /* C385 (50053) */
-    3343, /* C386 (50054) */
-    3343, /* C387 (50055) */
-    3343, /* C388 (50056) */
-    3343, /* C389 (50057) */
-    3343, /* C38A (50058) */
-    3343, /* C38B (50059) */
-    3343, /* C38C (50060) */
-    3343, /* C38D (50061) */
-    3343, /* C38E (50062) */
-    3343, /* C38F (50063) */
-    3343, /* C390 (50064) */
-    3343, /* C391 (50065) */
-    3343, /* C392 (50066) */
-    3343, /* C393 (50067) */
-    3343, /* C394 (50068) */
-    3343, /* C395 (50069) */
-    3343, /* C396 (50070) */
-    3343, /* C397 (50071) */
-    3343, /* C398 (50072) */
-    3343, /* C399 (50073) */
-    3343, /* C39A (50074) */
-    3343, /* C39B (50075) */
-    3343, /* C39C (50076) */
-    3343, /* C39D (50077) */
-    3343, /* C39E (50078) */
-    3343, /* C39F (50079) */
-    3343, /* C3A0 (50080) */
-    3343, /* C3A1 (50081) */
-    3343, /* C3A2 (50082) */
-    3343, /* C3A3 (50083) */
-    3343, /* C3A4 (50084) */
-    3343, /* C3A5 (50085) */
-    3343, /* C3A6 (50086) */
-    3343, /* C3A7 (50087) */
-    3343, /* C3A8 (50088) */
-    3343, /* C3A9 (50089) */
-    3343, /* C3AA (50090) */
-    3343, /* C3AB (50091) */
-    3343, /* C3AC (50092) */
-    3343, /* C3AD (50093) */
-    3343, /* C3AE (50094) */
-    3343, /* C3AF (50095) */
-    3343, /* C3B0 (50096) */
-    3343, /* C3B1 (50097) */
-    3343, /* C3B2 (50098) */
-    3343, /* C3B3 (50099) */
-    3343, /* C3B4 (50100) */
-    3343, /* C3B5 (50101) */
-    3343, /* C3B6 (50102) */
-    3343, /* C3B7 (50103) */
-    3343, /* C3B8 (50104) */
-    3343, /* C3B9 (50105) */
-    3343, /* C3BA (50106) */
-    3343, /* C3BB (50107) */
-    3343, /* C3BC (50108) */
-    3343, /* C3BD (50109) */
-    3343, /* C3BE (50110) */
-    3343, /* C3BF (50111) */
-    3343, /* C3C0 (50112) */
-    3343, /* C3C1 (50113) */
-    3343, /* C3C2 (50114) */
-    3343, /* C3C3 (50115) */
-    3343, /* C3C4 (50116) */
-    3343, /* C3C5 (50117) */
-    3343, /* C3C6 (50118) */
-    3343, /* C3C7 (50119) */
-    3343, /* C3C8 (50120) */
-    3343, /* C3C9 (50121) */
-    3343, /* C3CA (50122) */
-    3343, /* C3CB (50123) */
-    3343, /* C3CC (50124) */
-    3343, /* C3CD (50125) */
-    3343, /* C3CE (50126) */
-    3343, /* C3CF (50127) */
-    3343, /* C3D0 (50128) */
-    3343, /* C3D1 (50129) */
-    3343, /* C3D2 (50130) */
-    3343, /* C3D3 (50131) */
-    3343, /* C3D4 (50132) */
-    3343, /* C3D5 (50133) */
-    3343, /* C3D6 (50134) */
-    3343, /* C3D7 (50135) */
-    3343, /* C3D8 (50136) */
-    3343, /* C3D9 (50137) */
-    3343, /* C3DA (50138) */
-    3343, /* C3DB (50139) */
-    3343, /* C3DC (50140) */
-    3343, /* C3DD (50141) */
-    3343, /* C3DE (50142) */
-    3343, /* C3DF (50143) */
-    3343, /* C3E0 (50144) */
-    3343, /* C3E1 (50145) */
-    3343, /* C3E2 (50146) */
-    3343, /* C3E3 (50147) */
-    3343, /* C3E4 (50148) */
-    3343, /* C3E5 (50149) */
-    3343, /* C3E6 (50150) */
-    3343, /* C3E7 (50151) */
-    3343, /* C3E8 (50152) */
-    3343, /* C3E9 (50153) */
-    3343, /* C3EA (50154) */
-    3343, /* C3EB (50155) */
-    3343, /* C3EC (50156) */
-    3343, /* C3ED (50157) */
-    3343, /* C3EE (50158) */
-    3343, /* C3EF (50159) */
-    3343, /* C3F0 (50160) */
-    3343, /* C3F1 (50161) */
-    3343, /* C3F2 (50162) */
-    3343, /* C3F3 (50163) */
-    3343, /* C3F4 (50164) */
-    3343, /* C3F5 (50165) */
-    3343, /* C3F6 (50166) */
-    3343, /* C3F7 (50167) */
-    3343, /* C3F8 (50168) */
-    3343, /* C3F9 (50169) */
-    3343, /* C3FA (50170) */
-    3343, /* C3FB (50171) */
-    3343, /* C3FC (50172) */
-    3343, /* C3FD (50173) */
-    3343, /* C3FE (50174) */
-    3343, /* C3FF (50175) */
-    3343, /* C400 (50176) */
-    3343, /* C401 (50177) */
-    3343, /* C402 (50178) */
-    3343, /* C403 (50179) */
-    3343, /* C404 (50180) */
-    3343, /* C405 (50181) */
-    3343, /* C406 (50182) */
-    3343, /* C407 (50183) */
-    3343, /* C408 (50184) */
-    3343, /* C409 (50185) */
-    3343, /* C40A (50186) */
-    3343, /* C40B (50187) */
-    3343, /* C40C (50188) */
-    3343, /* C40D (50189) */
-    3343, /* C40E (50190) */
-    3343, /* C40F (50191) */
-    3343, /* C410 (50192) */
-    3343, /* C411 (50193) */
-    3343, /* C412 (50194) */
-    3343, /* C413 (50195) */
-    3343, /* C414 (50196) */
-    3343, /* C415 (50197) */
-    3343, /* C416 (50198) */
-    3343, /* C417 (50199) */
-    3343, /* C418 (50200) */
-    3343, /* C419 (50201) */
-    3343, /* C41A (50202) */
-    3343, /* C41B (50203) */
-    3343, /* C41C (50204) */
-    3343, /* C41D (50205) */
-    3343, /* C41E (50206) */
-    3343, /* C41F (50207) */
-    3343, /* C420 (50208) */
-    3343, /* C421 (50209) */
-    3343, /* C422 (50210) */
-    3343, /* C423 (50211) */
-    3343, /* C424 (50212) */
-    3343, /* C425 (50213) */
-    3343, /* C426 (50214) */
-    3343, /* C427 (50215) */
-    3343, /* C428 (50216) */
-    3343, /* C429 (50217) */
-    3343, /* C42A (50218) */
-    3343, /* C42B (50219) */
-    3343, /* C42C (50220) */
-    3343, /* C42D (50221) */
-    3343, /* C42E (50222) */
-    3343, /* C42F (50223) */
-    3343, /* C430 (50224) */
-    3343, /* C431 (50225) */
-    3343, /* C432 (50226) */
-    3343, /* C433 (50227) */
-    3343, /* C434 (50228) */
-    3343, /* C435 (50229) */
-    3343, /* C436 (50230) */
-    3343, /* C437 (50231) */
-    3343, /* C438 (50232) */
-    3343, /* C439 (50233) */
-    3343, /* C43A (50234) */
-    3343, /* C43B (50235) */
-    3343, /* C43C (50236) */
-    3343, /* C43D (50237) */
-    3343, /* C43E (50238) */
-    3343, /* C43F (50239) */
-    3343, /* C440 (50240) */
-    3343, /* C441 (50241) */
-    3343, /* C442 (50242) */
-    3343, /* C443 (50243) */
-    3343, /* C444 (50244) */
-    3343, /* C445 (50245) */
-    3343, /* C446 (50246) */
-    3343, /* C447 (50247) */
-    3343, /* C448 (50248) */
-    3343, /* C449 (50249) */
-    3343, /* C44A (50250) */
-    3343, /* C44B (50251) */
-    3343, /* C44C (50252) */
-    3343, /* C44D (50253) */
-    3343, /* C44E (50254) */
-    3343, /* C44F (50255) */
-    3343, /* C450 (50256) */
-    3343, /* C451 (50257) */
-    3343, /* C452 (50258) */
-    3343, /* C453 (50259) */
-    3343, /* C454 (50260) */
-    3343, /* C455 (50261) */
-    3343, /* C456 (50262) */
-    3343, /* C457 (50263) */
-    3343, /* C458 (50264) */
-    3343, /* C459 (50265) */
-    3343, /* C45A (50266) */
-    3343, /* C45B (50267) */
-    3343, /* C45C (50268) */
-    3343, /* C45D (50269) */
-    3343, /* C45E (50270) */
-    3343, /* C45F (50271) */
-    3343, /* C460 (50272) */
-    3343, /* C461 (50273) */
-    3343, /* C462 (50274) */
-    3343, /* C463 (50275) */
-    3343, /* C464 (50276) */
-    3343, /* C465 (50277) */
-    3343, /* C466 (50278) */
-    3343, /* C467 (50279) */
-    3343, /* C468 (50280) */
-    3343, /* C469 (50281) */
-    3343, /* C46A (50282) */
-    3343, /* C46B (50283) */
-    3343, /* C46C (50284) */
-    3343, /* C46D (50285) */
-    3343, /* C46E (50286) */
-    3343, /* C46F (50287) */
-    3343, /* C470 (50288) */
-    3343, /* C471 (50289) */
-    3343, /* C472 (50290) */
-    3343, /* C473 (50291) */
-    3343, /* C474 (50292) */
-    3343, /* C475 (50293) */
-    3343, /* C476 (50294) */
-    3343, /* C477 (50295) */
-    3343, /* C478 (50296) */
-    3343, /* C479 (50297) */
-    3343, /* C47A (50298) */
-    3343, /* C47B (50299) */
-    3343, /* C47C (50300) */
-    3343, /* C47D (50301) */
-    3343, /* C47E (50302) */
-    3343, /* C47F (50303) */
-    3343, /* C480 (50304) */
-    3343, /* C481 (50305) */
-    3343, /* C482 (50306) */
-    3343, /* C483 (50307) */
-    3343, /* C484 (50308) */
-    3343, /* C485 (50309) */
-    3343, /* C486 (50310) */
-    3343, /* C487 (50311) */
-    3343, /* C488 (50312) */
-    3343, /* C489 (50313) */
-    3343, /* C48A (50314) */
-    3343, /* C48B (50315) */
-    3343, /* C48C (50316) */
-    3343, /* C48D (50317) */
-    3343, /* C48E (50318) */
-    3343, /* C48F (50319) */
-    3343, /* C490 (50320) */
-    3343, /* C491 (50321) */
-    3343, /* C492 (50322) */
-    3343, /* C493 (50323) */
-    3343, /* C494 (50324) */
-    3343, /* C495 (50325) */
-    3343, /* C496 (50326) */
-    3343, /* C497 (50327) */
-    3343, /* C498 (50328) */
-    3343, /* C499 (50329) */
-    3343, /* C49A (50330) */
-    3343, /* C49B (50331) */
-    3343, /* C49C (50332) */
-    3343, /* C49D (50333) */
-    3343, /* C49E (50334) */
-    3343, /* C49F (50335) */
-    3343, /* C4A0 (50336) */
-    3343, /* C4A1 (50337) */
-    3343, /* C4A2 (50338) */
-    3343, /* C4A3 (50339) */
-    3343, /* C4A4 (50340) */
-    3343, /* C4A5 (50341) */
-    3343, /* C4A6 (50342) */
-    3343, /* C4A7 (50343) */
-    3343, /* C4A8 (50344) */
-    3343, /* C4A9 (50345) */
-    3343, /* C4AA (50346) */
-    3343, /* C4AB (50347) */
-    3343, /* C4AC (50348) */
-    3343, /* C4AD (50349) */
-    3343, /* C4AE (50350) */
-    3343, /* C4AF (50351) */
-    3343, /* C4B0 (50352) */
-    3343, /* C4B1 (50353) */
-    3343, /* C4B2 (50354) */
-    3343, /* C4B3 (50355) */
-    3343, /* C4B4 (50356) */
-    3343, /* C4B5 (50357) */
-    3343, /* C4B6 (50358) */
-    3343, /* C4B7 (50359) */
-    3343, /* C4B8 (50360) */
-    3343, /* C4B9 (50361) */
-    3343, /* C4BA (50362) */
-    3343, /* C4BB (50363) */
-    3343, /* C4BC (50364) */
-    3343, /* C4BD (50365) */
-    3343, /* C4BE (50366) */
-    3343, /* C4BF (50367) */
-    3343, /* C4C0 (50368) */
-    3343, /* C4C1 (50369) */
-    3343, /* C4C2 (50370) */
-    3343, /* C4C3 (50371) */
-    3343, /* C4C4 (50372) */
-    3343, /* C4C5 (50373) */
-    3343, /* C4C6 (50374) */
-    3343, /* C4C7 (50375) */
-    3343, /* C4C8 (50376) */
-    3343, /* C4C9 (50377) */
-    3343, /* C4CA (50378) */
-    3343, /* C4CB (50379) */
-    3343, /* C4CC (50380) */
-    3343, /* C4CD (50381) */
-    3343, /* C4CE (50382) */
-    3343, /* C4CF (50383) */
-    3343, /* C4D0 (50384) */
-    3343, /* C4D1 (50385) */
-    3343, /* C4D2 (50386) */
-    3343, /* C4D3 (50387) */
-    3343, /* C4D4 (50388) */
-    3343, /* C4D5 (50389) */
-    3343, /* C4D6 (50390) */
-    3343, /* C4D7 (50391) */
-    3343, /* C4D8 (50392) */
-    3343, /* C4D9 (50393) */
-    3343, /* C4DA (50394) */
-    3343, /* C4DB (50395) */
-    3343, /* C4DC (50396) */
-    3343, /* C4DD (50397) */
-    3343, /* C4DE (50398) */
-    3343, /* C4DF (50399) */
-    3343, /* C4E0 (50400) */
-    3343, /* C4E1 (50401) */
-    3343, /* C4E2 (50402) */
-    3343, /* C4E3 (50403) */
-    3343, /* C4E4 (50404) */
-    3343, /* C4E5 (50405) */
-    3343, /* C4E6 (50406) */
-    3343, /* C4E7 (50407) */
-    3343, /* C4E8 (50408) */
-    3343, /* C4E9 (50409) */
-    3343, /* C4EA (50410) */
-    3343, /* C4EB (50411) */
-    3343, /* C4EC (50412) */
-    3343, /* C4ED (50413) */
-    3343, /* C4EE (50414) */
-    3343, /* C4EF (50415) */
-    3343, /* C4F0 (50416) */
-    3343, /* C4F1 (50417) */
-    3343, /* C4F2 (50418) */
-    3343, /* C4F3 (50419) */
-    3343, /* C4F4 (50420) */
-    3343, /* C4F5 (50421) */
-    3343, /* C4F6 (50422) */
-    3343, /* C4F7 (50423) */
-    3343, /* C4F8 (50424) */
-    3343, /* C4F9 (50425) */
-    3343, /* C4FA (50426) */
-    3343, /* C4FB (50427) */
-    3343, /* C4FC (50428) */
-    3343, /* C4FD (50429) */
-    3343, /* C4FE (50430) */
-    3343, /* C4FF (50431) */
-    3343, /* C500 (50432) */
-    3343, /* C501 (50433) */
-    3343, /* C502 (50434) */
-    3343, /* C503 (50435) */
-    3343, /* C504 (50436) */
-    3343, /* C505 (50437) */
-    3343, /* C506 (50438) */
-    3343, /* C507 (50439) */
-    3343, /* C508 (50440) */
-    3343, /* C509 (50441) */
-    3343, /* C50A (50442) */
-    3343, /* C50B (50443) */
-    3343, /* C50C (50444) */
-    3343, /* C50D (50445) */
-    3343, /* C50E (50446) */
-    3343, /* C50F (50447) */
-    3343, /* C510 (50448) */
-    3343, /* C511 (50449) */
-    3343, /* C512 (50450) */
-    3343, /* C513 (50451) */
-    3343, /* C514 (50452) */
-    3343, /* C515 (50453) */
-    3343, /* C516 (50454) */
-    3343, /* C517 (50455) */
-    3343, /* C518 (50456) */
-    3343, /* C519 (50457) */
-    3343, /* C51A (50458) */
-    3343, /* C51B (50459) */
-    3343, /* C51C (50460) */
-    3343, /* C51D (50461) */
-    3343, /* C51E (50462) */
-    3343, /* C51F (50463) */
-    3343, /* C520 (50464) */
-    3343, /* C521 (50465) */
-    3343, /* C522 (50466) */
-    3343, /* C523 (50467) */
-    3343, /* C524 (50468) */
-    3343, /* C525 (50469) */
-    3343, /* C526 (50470) */
-    3343, /* C527 (50471) */
-    3343, /* C528 (50472) */
-    3343, /* C529 (50473) */
-    3343, /* C52A (50474) */
-    3343, /* C52B (50475) */
-    3343, /* C52C (50476) */
-    3343, /* C52D (50477) */
-    3343, /* C52E (50478) */
-    3343, /* C52F (50479) */
-    3343, /* C530 (50480) */
-    3343, /* C531 (50481) */
-    3343, /* C532 (50482) */
-    3343, /* C533 (50483) */
-    3343, /* C534 (50484) */
-    3343, /* C535 (50485) */
-    3343, /* C536 (50486) */
-    3343, /* C537 (50487) */
-    3343, /* C538 (50488) */
-    3343, /* C539 (50489) */
-    3343, /* C53A (50490) */
-    3343, /* C53B (50491) */
-    3343, /* C53C (50492) */
-    3343, /* C53D (50493) */
-    3343, /* C53E (50494) */
-    3343, /* C53F (50495) */
-    3343, /* C540 (50496) */
-    3343, /* C541 (50497) */
-    3343, /* C542 (50498) */
-    3343, /* C543 (50499) */
-    3343, /* C544 (50500) */
-    3343, /* C545 (50501) */
-    3343, /* C546 (50502) */
-    3343, /* C547 (50503) */
-    3343, /* C548 (50504) */
-    3343, /* C549 (50505) */
-    3343, /* C54A (50506) */
-    3343, /* C54B (50507) */
-    3343, /* C54C (50508) */
-    3343, /* C54D (50509) */
-    3343, /* C54E (50510) */
-    3343, /* C54F (50511) */
-    3343, /* C550 (50512) */
-    3343, /* C551 (50513) */
-    3343, /* C552 (50514) */
-    3343, /* C553 (50515) */
-    3343, /* C554 (50516) */
-    3343, /* C555 (50517) */
-    3343, /* C556 (50518) */
-    3343, /* C557 (50519) */
-    3343, /* C558 (50520) */
-    3343, /* C559 (50521) */
-    3343, /* C55A (50522) */
-    3343, /* C55B (50523) */
-    3343, /* C55C (50524) */
-    3343, /* C55D (50525) */
-    3343, /* C55E (50526) */
-    3343, /* C55F (50527) */
-    3343, /* C560 (50528) */
-    3343, /* C561 (50529) */
-    3343, /* C562 (50530) */
-    3343, /* C563 (50531) */
-    3343, /* C564 (50532) */
-    3343, /* C565 (50533) */
-    3343, /* C566 (50534) */
-    3343, /* C567 (50535) */
-    3343, /* C568 (50536) */
-    3343, /* C569 (50537) */
-    3343, /* C56A (50538) */
-    3343, /* C56B (50539) */
-    3343, /* C56C (50540) */
-    3343, /* C56D (50541) */
-    3343, /* C56E (50542) */
-    3343, /* C56F (50543) */
-    3343, /* C570 (50544) */
-    3343, /* C571 (50545) */
-    3343, /* C572 (50546) */
-    3343, /* C573 (50547) */
-    3343, /* C574 (50548) */
-    3343, /* C575 (50549) */
-    3343, /* C576 (50550) */
-    3343, /* C577 (50551) */
-    3343, /* C578 (50552) */
-    3343, /* C579 (50553) */
-    3343, /* C57A (50554) */
-    3343, /* C57B (50555) */
-    3343, /* C57C (50556) */
-    3343, /* C57D (50557) */
-    3343, /* C57E (50558) */
-    3343, /* C57F (50559) */
-    3343, /* C580 (50560) */
-    3343, /* C581 (50561) */
-    3343, /* C582 (50562) */
-    3343, /* C583 (50563) */
-    3343, /* C584 (50564) */
-    3343, /* C585 (50565) */
-    3343, /* C586 (50566) */
-    3343, /* C587 (50567) */
-    3343, /* C588 (50568) */
-    3343, /* C589 (50569) */
-    3343, /* C58A (50570) */
-    3343, /* C58B (50571) */
-    3343, /* C58C (50572) */
-    3343, /* C58D (50573) */
-    3343, /* C58E (50574) */
-    3343, /* C58F (50575) */
-    3343, /* C590 (50576) */
-    3343, /* C591 (50577) */
-    3343, /* C592 (50578) */
-    3343, /* C593 (50579) */
-    3343, /* C594 (50580) */
-    3343, /* C595 (50581) */
-    3343, /* C596 (50582) */
-    3343, /* C597 (50583) */
-    3343, /* C598 (50584) */
-    3343, /* C599 (50585) */
-    3343, /* C59A (50586) */
-    3343, /* C59B (50587) */
-    3343, /* C59C (50588) */
-    3343, /* C59D (50589) */
-    3343, /* C59E (50590) */
-    3343, /* C59F (50591) */
-    3343, /* C5A0 (50592) */
-    3343, /* C5A1 (50593) */
-    3343, /* C5A2 (50594) */
-    3343, /* C5A3 (50595) */
-    3343, /* C5A4 (50596) */
-    3343, /* C5A5 (50597) */
-    3343, /* C5A6 (50598) */
-    3343, /* C5A7 (50599) */
-    3343, /* C5A8 (50600) */
-    3343, /* C5A9 (50601) */
-    3343, /* C5AA (50602) */
-    3343, /* C5AB (50603) */
-    3343, /* C5AC (50604) */
-    3343, /* C5AD (50605) */
-    3343, /* C5AE (50606) */
-    3343, /* C5AF (50607) */
-    3343, /* C5B0 (50608) */
-    3343, /* C5B1 (50609) */
-    3343, /* C5B2 (50610) */
-    3343, /* C5B3 (50611) */
-    3343, /* C5B4 (50612) */
-    3343, /* C5B5 (50613) */
-    3343, /* C5B6 (50614) */
-    3343, /* C5B7 (50615) */
-    3343, /* C5B8 (50616) */
-    3343, /* C5B9 (50617) */
-    3343, /* C5BA (50618) */
-    3343, /* C5BB (50619) */
-    3343, /* C5BC (50620) */
-    3343, /* C5BD (50621) */
-    3343, /* C5BE (50622) */
-    3343, /* C5BF (50623) */
-    3343, /* C5C0 (50624) */
-    3343, /* C5C1 (50625) */
-    3343, /* C5C2 (50626) */
-    3343, /* C5C3 (50627) */
-    3343, /* C5C4 (50628) */
-    3343, /* C5C5 (50629) */
-    3343, /* C5C6 (50630) */
-    3343, /* C5C7 (50631) */
-    3343, /* C5C8 (50632) */
-    3343, /* C5C9 (50633) */
-    3343, /* C5CA (50634) */
-    3343, /* C5CB (50635) */
-    3343, /* C5CC (50636) */
-    3343, /* C5CD (50637) */
-    3343, /* C5CE (50638) */
-    3343, /* C5CF (50639) */
-    3343, /* C5D0 (50640) */
-    3343, /* C5D1 (50641) */
-    3343, /* C5D2 (50642) */
-    3343, /* C5D3 (50643) */
-    3343, /* C5D4 (50644) */
-    3343, /* C5D5 (50645) */
-    3343, /* C5D6 (50646) */
-    3343, /* C5D7 (50647) */
-    3343, /* C5D8 (50648) */
-    3343, /* C5D9 (50649) */
-    3343, /* C5DA (50650) */
-    3343, /* C5DB (50651) */
-    3343, /* C5DC (50652) */
-    3343, /* C5DD (50653) */
-    3343, /* C5DE (50654) */
-    3343, /* C5DF (50655) */
-    3343, /* C5E0 (50656) */
-    3343, /* C5E1 (50657) */
-    3343, /* C5E2 (50658) */
-    3343, /* C5E3 (50659) */
-    3343, /* C5E4 (50660) */
-    3343, /* C5E5 (50661) */
-    3343, /* C5E6 (50662) */
-    3343, /* C5E7 (50663) */
-    3343, /* C5E8 (50664) */
-    3343, /* C5E9 (50665) */
-    3343, /* C5EA (50666) */
-    3343, /* C5EB (50667) */
-    3343, /* C5EC (50668) */
-    3343, /* C5ED (50669) */
-    3343, /* C5EE (50670) */
-    3343, /* C5EF (50671) */
-    3343, /* C5F0 (50672) */
-    3343, /* C5F1 (50673) */
-    3343, /* C5F2 (50674) */
-    3343, /* C5F3 (50675) */
-    3343, /* C5F4 (50676) */
-    3343, /* C5F5 (50677) */
-    3343, /* C5F6 (50678) */
-    3343, /* C5F7 (50679) */
-    3343, /* C5F8 (50680) */
-    3343, /* C5F9 (50681) */
-    3343, /* C5FA (50682) */
-    3343, /* C5FB (50683) */
-    3343, /* C5FC (50684) */
-    3343, /* C5FD (50685) */
-    3343, /* C5FE (50686) */
-    3343, /* C5FF (50687) */
-    3343, /* C600 (50688) */
-    3343, /* C601 (50689) */
-    3343, /* C602 (50690) */
-    3343, /* C603 (50691) */
-    3343, /* C604 (50692) */
-    3343, /* C605 (50693) */
-    3343, /* C606 (50694) */
-    3343, /* C607 (50695) */
-    3343, /* C608 (50696) */
-    3343, /* C609 (50697) */
-    3343, /* C60A (50698) */
-    3343, /* C60B (50699) */
-    3343, /* C60C (50700) */
-    3343, /* C60D (50701) */
-    3343, /* C60E (50702) */
-    3343, /* C60F (50703) */
-    3343, /* C610 (50704) */
-    3343, /* C611 (50705) */
-    3343, /* C612 (50706) */
-    3343, /* C613 (50707) */
-    3343, /* C614 (50708) */
-    3343, /* C615 (50709) */
-    3343, /* C616 (50710) */
-    3343, /* C617 (50711) */
-    3343, /* C618 (50712) */
-    3343, /* C619 (50713) */
-    3343, /* C61A (50714) */
-    3343, /* C61B (50715) */
-    3343, /* C61C (50716) */
-    3343, /* C61D (50717) */
-    3343, /* C61E (50718) */
-    3343, /* C61F (50719) */
-    3343, /* C620 (50720) */
-    3343, /* C621 (50721) */
-    3343, /* C622 (50722) */
-    3343, /* C623 (50723) */
-    3343, /* C624 (50724) */
-    3343, /* C625 (50725) */
-    3343, /* C626 (50726) */
-    3343, /* C627 (50727) */
-    3343, /* C628 (50728) */
-    3343, /* C629 (50729) */
-    3343, /* C62A (50730) */
-    3343, /* C62B (50731) */
-    3343, /* C62C (50732) */
-    3343, /* C62D (50733) */
-    3343, /* C62E (50734) */
-    3343, /* C62F (50735) */
-    3343, /* C630 (50736) */
-    3343, /* C631 (50737) */
-    3343, /* C632 (50738) */
-    3343, /* C633 (50739) */
-    3343, /* C634 (50740) */
-    3343, /* C635 (50741) */
-    3343, /* C636 (50742) */
-    3343, /* C637 (50743) */
-    3343, /* C638 (50744) */
-    3343, /* C639 (50745) */
-    3343, /* C63A (50746) */
-    3343, /* C63B (50747) */
-    3343, /* C63C (50748) */
-    3343, /* C63D (50749) */
-    3343, /* C63E (50750) */
-    3343, /* C63F (50751) */
-    3343, /* C640 (50752) */
-    3343, /* C641 (50753) */
-    3343, /* C642 (50754) */
-    3343, /* C643 (50755) */
-    3343, /* C644 (50756) */
-    3343, /* C645 (50757) */
-    3343, /* C646 (50758) */
-    3343, /* C647 (50759) */
-    3343, /* C648 (50760) */
-    3343, /* C649 (50761) */
-    3343, /* C64A (50762) */
-    3343, /* C64B (50763) */
-    3343, /* C64C (50764) */
-    3343, /* C64D (50765) */
-    3343, /* C64E (50766) */
-    3343, /* C64F (50767) */
-    3343, /* C650 (50768) */
-    3343, /* C651 (50769) */
-    3343, /* C652 (50770) */
-    3343, /* C653 (50771) */
-    3343, /* C654 (50772) */
-    3343, /* C655 (50773) */
-    3343, /* C656 (50774) */
-    3343, /* C657 (50775) */
-    3343, /* C658 (50776) */
-    3343, /* C659 (50777) */
-    3343, /* C65A (50778) */
-    3343, /* C65B (50779) */
-    3343, /* C65C (50780) */
-    3343, /* C65D (50781) */
-    3343, /* C65E (50782) */
-    3343, /* C65F (50783) */
-    3343, /* C660 (50784) */
-    3343, /* C661 (50785) */
-    3343, /* C662 (50786) */
-    3343, /* C663 (50787) */
-    3343, /* C664 (50788) */
-    3343, /* C665 (50789) */
-    3343, /* C666 (50790) */
-    3343, /* C667 (50791) */
-    3343, /* C668 (50792) */
-    3343, /* C669 (50793) */
-    3343, /* C66A (50794) */
-    3343, /* C66B (50795) */
-    3343, /* C66C (50796) */
-    3343, /* C66D (50797) */
-    3343, /* C66E (50798) */
-    3343, /* C66F (50799) */
-    3343, /* C670 (50800) */
-    3343, /* C671 (50801) */
-    3343, /* C672 (50802) */
-    3343, /* C673 (50803) */
-    3343, /* C674 (50804) */
-    3343, /* C675 (50805) */
-    3343, /* C676 (50806) */
-    3343, /* C677 (50807) */
-    3343, /* C678 (50808) */
-    3343, /* C679 (50809) */
-    3343, /* C67A (50810) */
-    3343, /* C67B (50811) */
-    3343, /* C67C (50812) */
-    3343, /* C67D (50813) */
-    3343, /* C67E (50814) */
-    3343, /* C67F (50815) */
-    3343, /* C680 (50816) */
-    3343, /* C681 (50817) */
-    3343, /* C682 (50818) */
-    3343, /* C683 (50819) */
-    3343, /* C684 (50820) */
-    3343, /* C685 (50821) */
-    3343, /* C686 (50822) */
-    3343, /* C687 (50823) */
-    3343, /* C688 (50824) */
-    3343, /* C689 (50825) */
-    3343, /* C68A (50826) */
-    3343, /* C68B (50827) */
-    3343, /* C68C (50828) */
-    3343, /* C68D (50829) */
-    3343, /* C68E (50830) */
-    3343, /* C68F (50831) */
-    3343, /* C690 (50832) */
-    3343, /* C691 (50833) */
-    3343, /* C692 (50834) */
-    3343, /* C693 (50835) */
-    3343, /* C694 (50836) */
-    3343, /* C695 (50837) */
-    3343, /* C696 (50838) */
-    3343, /* C697 (50839) */
-    3343, /* C698 (50840) */
-    3343, /* C699 (50841) */
-    3343, /* C69A (50842) */
-    3343, /* C69B (50843) */
-    3343, /* C69C (50844) */
-    3343, /* C69D (50845) */
-    3343, /* C69E (50846) */
-    3343, /* C69F (50847) */
-    3343, /* C6A0 (50848) */
-    3343, /* C6A1 (50849) */
-    3343, /* C6A2 (50850) */
-    3343, /* C6A3 (50851) */
-    3343, /* C6A4 (50852) */
-    3343, /* C6A5 (50853) */
-    3343, /* C6A6 (50854) */
-    3343, /* C6A7 (50855) */
-    3343, /* C6A8 (50856) */
-    3343, /* C6A9 (50857) */
-    3343, /* C6AA (50858) */
-    3343, /* C6AB (50859) */
-    3343, /* C6AC (50860) */
-    3343, /* C6AD (50861) */
-    3343, /* C6AE (50862) */
-    3343, /* C6AF (50863) */
-    3343, /* C6B0 (50864) */
-    3343, /* C6B1 (50865) */
-    3343, /* C6B2 (50866) */
-    3343, /* C6B3 (50867) */
-    3343, /* C6B4 (50868) */
-    3343, /* C6B5 (50869) */
-    3343, /* C6B6 (50870) */
-    3343, /* C6B7 (50871) */
-    3343, /* C6B8 (50872) */
-    3343, /* C6B9 (50873) */
-    3343, /* C6BA (50874) */
-    3343, /* C6BB (50875) */
-    3343, /* C6BC (50876) */
-    3343, /* C6BD (50877) */
-    3343, /* C6BE (50878) */
-    3343, /* C6BF (50879) */
-    3343, /* C6C0 (50880) */
-    3343, /* C6C1 (50881) */
-    3343, /* C6C2 (50882) */
-    3343, /* C6C3 (50883) */
-    3343, /* C6C4 (50884) */
-    3343, /* C6C5 (50885) */
-    3343, /* C6C6 (50886) */
-    3343, /* C6C7 (50887) */
-    3343, /* C6C8 (50888) */
-    3343, /* C6C9 (50889) */
-    3343, /* C6CA (50890) */
-    3343, /* C6CB (50891) */
-    3343, /* C6CC (50892) */
-    3343, /* C6CD (50893) */
-    3343, /* C6CE (50894) */
-    3343, /* C6CF (50895) */
-    3343, /* C6D0 (50896) */
-    3343, /* C6D1 (50897) */
-    3343, /* C6D2 (50898) */
-    3343, /* C6D3 (50899) */
-    3343, /* C6D4 (50900) */
-    3343, /* C6D5 (50901) */
-    3343, /* C6D6 (50902) */
-    3343, /* C6D7 (50903) */
-    3343, /* C6D8 (50904) */
-    3343, /* C6D9 (50905) */
-    3343, /* C6DA (50906) */
-    3343, /* C6DB (50907) */
-    3343, /* C6DC (50908) */
-    3343, /* C6DD (50909) */
-    3343, /* C6DE (50910) */
-    3343, /* C6DF (50911) */
-    3343, /* C6E0 (50912) */
-    3343, /* C6E1 (50913) */
-    3343, /* C6E2 (50914) */
-    3343, /* C6E3 (50915) */
-    3343, /* C6E4 (50916) */
-    3343, /* C6E5 (50917) */
-    3343, /* C6E6 (50918) */
-    3343, /* C6E7 (50919) */
-    3343, /* C6E8 (50920) */
-    3343, /* C6E9 (50921) */
-    3343, /* C6EA (50922) */
-    3343, /* C6EB (50923) */
-    3343, /* C6EC (50924) */
-    3343, /* C6ED (50925) */
-    3343, /* C6EE (50926) */
-    3343, /* C6EF (50927) */
-    3343, /* C6F0 (50928) */
-    3343, /* C6F1 (50929) */
-    3343, /* C6F2 (50930) */
-    3343, /* C6F3 (50931) */
-    3343, /* C6F4 (50932) */
-    3343, /* C6F5 (50933) */
-    3343, /* C6F6 (50934) */
-    3343, /* C6F7 (50935) */
-    3343, /* C6F8 (50936) */
-    3343, /* C6F9 (50937) */
-    3343, /* C6FA (50938) */
-    3343, /* C6FB (50939) */
-    3343, /* C6FC (50940) */
-    3343, /* C6FD (50941) */
-    3343, /* C6FE (50942) */
-    3343, /* C6FF (50943) */
-    3343, /* C700 (50944) */
-    3343, /* C701 (50945) */
-    3343, /* C702 (50946) */
-    3343, /* C703 (50947) */
-    3343, /* C704 (50948) */
-    3343, /* C705 (50949) */
-    3343, /* C706 (50950) */
-    3343, /* C707 (50951) */
-    3343, /* C708 (50952) */
-    3343, /* C709 (50953) */
-    3343, /* C70A (50954) */
-    3343, /* C70B (50955) */
-    3343, /* C70C (50956) */
-    3343, /* C70D (50957) */
-    3343, /* C70E (50958) */
-    3343, /* C70F (50959) */
-    3343, /* C710 (50960) */
-    3343, /* C711 (50961) */
-    3343, /* C712 (50962) */
-    3343, /* C713 (50963) */
-    3343, /* C714 (50964) */
-    3343, /* C715 (50965) */
-    3343, /* C716 (50966) */
-    3343, /* C717 (50967) */
-    3343, /* C718 (50968) */
-    3343, /* C719 (50969) */
-    3343, /* C71A (50970) */
-    3343, /* C71B (50971) */
-    3343, /* C71C (50972) */
-    3343, /* C71D (50973) */
-    3343, /* C71E (50974) */
-    3343, /* C71F (50975) */
-    3343, /* C720 (50976) */
-    3343, /* C721 (50977) */
-    3343, /* C722 (50978) */
-    3343, /* C723 (50979) */
-    3343, /* C724 (50980) */
-    3343, /* C725 (50981) */
-    3343, /* C726 (50982) */
-    3343, /* C727 (50983) */
-    3343, /* C728 (50984) */
-    3343, /* C729 (50985) */
-    3343, /* C72A (50986) */
-    3343, /* C72B (50987) */
-    3343, /* C72C (50988) */
-    3343, /* C72D (50989) */
-    3343, /* C72E (50990) */
-    3343, /* C72F (50991) */
-    3343, /* C730 (50992) */
-    3343, /* C731 (50993) */
-    3343, /* C732 (50994) */
-    3343, /* C733 (50995) */
-    3343, /* C734 (50996) */
-    3343, /* C735 (50997) */
-    3343, /* C736 (50998) */
-    3343, /* C737 (50999) */
-    3343, /* C738 (51000) */
-    3343, /* C739 (51001) */
-    3343, /* C73A (51002) */
-    3343, /* C73B (51003) */
-    3343, /* C73C (51004) */
-    3343, /* C73D (51005) */
-    3343, /* C73E (51006) */
-    3343, /* C73F (51007) */
-    3343, /* C740 (51008) */
-    3343, /* C741 (51009) */
-    3343, /* C742 (51010) */
-    3343, /* C743 (51011) */
-    3343, /* C744 (51012) */
-    3343, /* C745 (51013) */
-    3343, /* C746 (51014) */
-    3343, /* C747 (51015) */
-    3343, /* C748 (51016) */
-    3343, /* C749 (51017) */
-    3343, /* C74A (51018) */
-    3343, /* C74B (51019) */
-    3343, /* C74C (51020) */
-    3343, /* C74D (51021) */
-    3343, /* C74E (51022) */
-    3343, /* C74F (51023) */
-    3343, /* C750 (51024) */
-    3343, /* C751 (51025) */
-    3343, /* C752 (51026) */
-    3343, /* C753 (51027) */
-    3343, /* C754 (51028) */
-    3343, /* C755 (51029) */
-    3343, /* C756 (51030) */
-    3343, /* C757 (51031) */
-    3343, /* C758 (51032) */
-    3343, /* C759 (51033) */
-    3343, /* C75A (51034) */
-    3343, /* C75B (51035) */
-    3343, /* C75C (51036) */
-    3343, /* C75D (51037) */
-    3343, /* C75E (51038) */
-    3343, /* C75F (51039) */
-    3343, /* C760 (51040) */
-    3343, /* C761 (51041) */
-    3343, /* C762 (51042) */
-    3343, /* C763 (51043) */
-    3343, /* C764 (51044) */
-    3343, /* C765 (51045) */
-    3343, /* C766 (51046) */
-    3343, /* C767 (51047) */
-    3343, /* C768 (51048) */
-    3343, /* C769 (51049) */
-    3343, /* C76A (51050) */
-    3343, /* C76B (51051) */
-    3343, /* C76C (51052) */
-    3343, /* C76D (51053) */
-    3343, /* C76E (51054) */
-    3343, /* C76F (51055) */
-    3343, /* C770 (51056) */
-    3343, /* C771 (51057) */
-    3343, /* C772 (51058) */
-    3343, /* C773 (51059) */
-    3343, /* C774 (51060) */
-    3343, /* C775 (51061) */
-    3343, /* C776 (51062) */
-    3343, /* C777 (51063) */
-    3343, /* C778 (51064) */
-    3343, /* C779 (51065) */
-    3343, /* C77A (51066) */
-    3343, /* C77B (51067) */
-    3343, /* C77C (51068) */
-    3343, /* C77D (51069) */
-    3343, /* C77E (51070) */
-    3343, /* C77F (51071) */
-    3343, /* C780 (51072) */
-    3343, /* C781 (51073) */
-    3343, /* C782 (51074) */
-    3343, /* C783 (51075) */
-    3343, /* C784 (51076) */
-    3343, /* C785 (51077) */
-    3343, /* C786 (51078) */
-    3343, /* C787 (51079) */
-    3343, /* C788 (51080) */
-    3343, /* C789 (51081) */
-    3343, /* C78A (51082) */
-    3343, /* C78B (51083) */
-    3343, /* C78C (51084) */
-    3343, /* C78D (51085) */
-    3343, /* C78E (51086) */
-    3343, /* C78F (51087) */
-    3343, /* C790 (51088) */
-    3343, /* C791 (51089) */
-    3343, /* C792 (51090) */
-    3343, /* C793 (51091) */
-    3343, /* C794 (51092) */
-    3343, /* C795 (51093) */
-    3343, /* C796 (51094) */
-    3343, /* C797 (51095) */
-    3343, /* C798 (51096) */
-    3343, /* C799 (51097) */
-    3343, /* C79A (51098) */
-    3343, /* C79B (51099) */
-    3343, /* C79C (51100) */
-    3343, /* C79D (51101) */
-    3343, /* C79E (51102) */
-    3343, /* C79F (51103) */
-    3343, /* C7A0 (51104) */
-    3343, /* C7A1 (51105) */
-    3343, /* C7A2 (51106) */
-    3343, /* C7A3 (51107) */
-    3343, /* C7A4 (51108) */
-    3343, /* C7A5 (51109) */
-    3343, /* C7A6 (51110) */
-    3343, /* C7A7 (51111) */
-    3343, /* C7A8 (51112) */
-    3343, /* C7A9 (51113) */
-    3343, /* C7AA (51114) */
-    3343, /* C7AB (51115) */
-    3343, /* C7AC (51116) */
-    3343, /* C7AD (51117) */
-    3343, /* C7AE (51118) */
-    3343, /* C7AF (51119) */
-    3343, /* C7B0 (51120) */
-    3343, /* C7B1 (51121) */
-    3343, /* C7B2 (51122) */
-    3343, /* C7B3 (51123) */
-    3343, /* C7B4 (51124) */
-    3343, /* C7B5 (51125) */
-    3343, /* C7B6 (51126) */
-    3343, /* C7B7 (51127) */
-    3343, /* C7B8 (51128) */
-    3343, /* C7B9 (51129) */
-    3343, /* C7BA (51130) */
-    3343, /* C7BB (51131) */
-    3343, /* C7BC (51132) */
-    3343, /* C7BD (51133) */
-    3343, /* C7BE (51134) */
-    3343, /* C7BF (51135) */
-    3343, /* C7C0 (51136) */
-    3343, /* C7C1 (51137) */
-    3343, /* C7C2 (51138) */
-    3343, /* C7C3 (51139) */
-    3343, /* C7C4 (51140) */
-    3343, /* C7C5 (51141) */
-    3343, /* C7C6 (51142) */
-    3343, /* C7C7 (51143) */
-    3343, /* C7C8 (51144) */
-    3343, /* C7C9 (51145) */
-    3343, /* C7CA (51146) */
-    3343, /* C7CB (51147) */
-    3343, /* C7CC (51148) */
-    3343, /* C7CD (51149) */
-    3343, /* C7CE (51150) */
-    3343, /* C7CF (51151) */
-    3343, /* C7D0 (51152) */
-    3343, /* C7D1 (51153) */
-    3343, /* C7D2 (51154) */
-    3343, /* C7D3 (51155) */
-    3343, /* C7D4 (51156) */
-    3343, /* C7D5 (51157) */
-    3343, /* C7D6 (51158) */
-    3343, /* C7D7 (51159) */
-    3343, /* C7D8 (51160) */
-    3343, /* C7D9 (51161) */
-    3343, /* C7DA (51162) */
-    3343, /* C7DB (51163) */
-    3343, /* C7DC (51164) */
-    3343, /* C7DD (51165) */
-    3343, /* C7DE (51166) */
-    3343, /* C7DF (51167) */
-    3343, /* C7E0 (51168) */
-    3343, /* C7E1 (51169) */
-    3343, /* C7E2 (51170) */
-    3343, /* C7E3 (51171) */
-    3343, /* C7E4 (51172) */
-    3343, /* C7E5 (51173) */
-    3343, /* C7E6 (51174) */
-    3343, /* C7E7 (51175) */
-    3343, /* C7E8 (51176) */
-    3343, /* C7E9 (51177) */
-    3343, /* C7EA (51178) */
-    3343, /* C7EB (51179) */
-    3343, /* C7EC (51180) */
-    3343, /* C7ED (51181) */
-    3343, /* C7EE (51182) */
-    3343, /* C7EF (51183) */
-    3343, /* C7F0 (51184) */
-    3343, /* C7F1 (51185) */
-    3343, /* C7F2 (51186) */
-    3343, /* C7F3 (51187) */
-    3343, /* C7F4 (51188) */
-    3343, /* C7F5 (51189) */
-    3343, /* C7F6 (51190) */
-    3343, /* C7F7 (51191) */
-    3343, /* C7F8 (51192) */
-    3343, /* C7F9 (51193) */
-    3343, /* C7FA (51194) */
-    3343, /* C7FB (51195) */
-    3343, /* C7FC (51196) */
-    3343, /* C7FD (51197) */
-    3343, /* C7FE (51198) */
-    3343, /* C7FF (51199) */
-    3343, /* C800 (51200) */
-    3343, /* C801 (51201) */
-    3343, /* C802 (51202) */
-    3343, /* C803 (51203) */
-    3343, /* C804 (51204) */
-    3343, /* C805 (51205) */
-    3343, /* C806 (51206) */
-    3343, /* C807 (51207) */
-    3343, /* C808 (51208) */
-    3343, /* C809 (51209) */
-    3343, /* C80A (51210) */
-    3343, /* C80B (51211) */
-    3343, /* C80C (51212) */
-    3343, /* C80D (51213) */
-    3343, /* C80E (51214) */
-    3343, /* C80F (51215) */
-    3343, /* C810 (51216) */
-    3343, /* C811 (51217) */
-    3343, /* C812 (51218) */
-    3343, /* C813 (51219) */
-    3343, /* C814 (51220) */
-    3343, /* C815 (51221) */
-    3343, /* C816 (51222) */
-    3343, /* C817 (51223) */
-    3343, /* C818 (51224) */
-    3343, /* C819 (51225) */
-    3343, /* C81A (51226) */
-    3343, /* C81B (51227) */
-    3343, /* C81C (51228) */
-    3343, /* C81D (51229) */
-    3343, /* C81E (51230) */
-    3343, /* C81F (51231) */
-    3343, /* C820 (51232) */
-    3343, /* C821 (51233) */
-    3343, /* C822 (51234) */
-    3343, /* C823 (51235) */
-    3343, /* C824 (51236) */
-    3343, /* C825 (51237) */
-    3343, /* C826 (51238) */
-    3343, /* C827 (51239) */
-    3343, /* C828 (51240) */
-    3343, /* C829 (51241) */
-    3343, /* C82A (51242) */
-    3343, /* C82B (51243) */
-    3343, /* C82C (51244) */
-    3343, /* C82D (51245) */
-    3343, /* C82E (51246) */
-    3343, /* C82F (51247) */
-    3343, /* C830 (51248) */
-    3343, /* C831 (51249) */
-    3343, /* C832 (51250) */
-    3343, /* C833 (51251) */
-    3343, /* C834 (51252) */
-    3343, /* C835 (51253) */
-    3343, /* C836 (51254) */
-    3343, /* C837 (51255) */
-    3343, /* C838 (51256) */
-    3343, /* C839 (51257) */
-    3343, /* C83A (51258) */
-    3343, /* C83B (51259) */
-    3343, /* C83C (51260) */
-    3343, /* C83D (51261) */
-    3343, /* C83E (51262) */
-    3343, /* C83F (51263) */
-    3343, /* C840 (51264) */
-    3343, /* C841 (51265) */
-    3343, /* C842 (51266) */
-    3343, /* C843 (51267) */
-    3343, /* C844 (51268) */
-    3343, /* C845 (51269) */
-    3343, /* C846 (51270) */
-    3343, /* C847 (51271) */
-    3343, /* C848 (51272) */
-    3343, /* C849 (51273) */
-    3343, /* C84A (51274) */
-    3343, /* C84B (51275) */
-    3343, /* C84C (51276) */
-    3343, /* C84D (51277) */
-    3343, /* C84E (51278) */
-    3343, /* C84F (51279) */
-    3343, /* C850 (51280) */
-    3343, /* C851 (51281) */
-    3343, /* C852 (51282) */
-    3343, /* C853 (51283) */
-    3343, /* C854 (51284) */
-    3343, /* C855 (51285) */
-    3343, /* C856 (51286) */
-    3343, /* C857 (51287) */
-    3343, /* C858 (51288) */
-    3343, /* C859 (51289) */
-    3343, /* C85A (51290) */
-    3343, /* C85B (51291) */
-    3343, /* C85C (51292) */
-    3343, /* C85D (51293) */
-    3343, /* C85E (51294) */
-    3343, /* C85F (51295) */
-    3343, /* C860 (51296) */
-    3343, /* C861 (51297) */
-    3343, /* C862 (51298) */
-    3343, /* C863 (51299) */
-    3343, /* C864 (51300) */
-    3343, /* C865 (51301) */
-    3343, /* C866 (51302) */
-    3343, /* C867 (51303) */
-    3343, /* C868 (51304) */
-    3343, /* C869 (51305) */
-    3343, /* C86A (51306) */
-    3343, /* C86B (51307) */
-    3343, /* C86C (51308) */
-    3343, /* C86D (51309) */
-    3343, /* C86E (51310) */
-    3343, /* C86F (51311) */
-    3343, /* C870 (51312) */
-    3343, /* C871 (51313) */
-    3343, /* C872 (51314) */
-    3343, /* C873 (51315) */
-    3343, /* C874 (51316) */
-    3343, /* C875 (51317) */
-    3343, /* C876 (51318) */
-    3343, /* C877 (51319) */
-    3343, /* C878 (51320) */
-    3343, /* C879 (51321) */
-    3343, /* C87A (51322) */
-    3343, /* C87B (51323) */
-    3343, /* C87C (51324) */
-    3343, /* C87D (51325) */
-    3343, /* C87E (51326) */
-    3343, /* C87F (51327) */
-    3343, /* C880 (51328) */
-    3343, /* C881 (51329) */
-    3343, /* C882 (51330) */
-    3343, /* C883 (51331) */
-    3343, /* C884 (51332) */
-    3343, /* C885 (51333) */
-    3343, /* C886 (51334) */
-    3343, /* C887 (51335) */
-    3343, /* C888 (51336) */
-    3343, /* C889 (51337) */
-    3343, /* C88A (51338) */
-    3343, /* C88B (51339) */
-    3343, /* C88C (51340) */
-    3343, /* C88D (51341) */
-    3343, /* C88E (51342) */
-    3343, /* C88F (51343) */
-    3343, /* C890 (51344) */
-    3343, /* C891 (51345) */
-    3343, /* C892 (51346) */
-    3343, /* C893 (51347) */
-    3343, /* C894 (51348) */
-    3343, /* C895 (51349) */
-    3343, /* C896 (51350) */
-    3343, /* C897 (51351) */
-    3343, /* C898 (51352) */
-    3343, /* C899 (51353) */
-    3343, /* C89A (51354) */
-    3343, /* C89B (51355) */
-    3343, /* C89C (51356) */
-    3343, /* C89D (51357) */
-    3343, /* C89E (51358) */
-    3343, /* C89F (51359) */
-    3343, /* C8A0 (51360) */
-    3343, /* C8A1 (51361) */
-    3343, /* C8A2 (51362) */
-    3343, /* C8A3 (51363) */
-    3343, /* C8A4 (51364) */
-    3343, /* C8A5 (51365) */
-    3343, /* C8A6 (51366) */
-    3343, /* C8A7 (51367) */
-    3343, /* C8A8 (51368) */
-    3343, /* C8A9 (51369) */
-    3343, /* C8AA (51370) */
-    3343, /* C8AB (51371) */
-    3343, /* C8AC (51372) */
-    3343, /* C8AD (51373) */
-    3343, /* C8AE (51374) */
-    3343, /* C8AF (51375) */
-    3343, /* C8B0 (51376) */
-    3343, /* C8B1 (51377) */
-    3343, /* C8B2 (51378) */
-    3343, /* C8B3 (51379) */
-    3343, /* C8B4 (51380) */
-    3343, /* C8B5 (51381) */
-    3343, /* C8B6 (51382) */
-    3343, /* C8B7 (51383) */
-    3343, /* C8B8 (51384) */
-    3343, /* C8B9 (51385) */
-    3343, /* C8BA (51386) */
-    3343, /* C8BB (51387) */
-    3343, /* C8BC (51388) */
-    3343, /* C8BD (51389) */
-    3343, /* C8BE (51390) */
-    3343, /* C8BF (51391) */
-    3343, /* C8C0 (51392) */
-    3343, /* C8C1 (51393) */
-    3343, /* C8C2 (51394) */
-    3343, /* C8C3 (51395) */
-    3343, /* C8C4 (51396) */
-    3343, /* C8C5 (51397) */
-    3343, /* C8C6 (51398) */
-    3343, /* C8C7 (51399) */
-    3343, /* C8C8 (51400) */
-    3343, /* C8C9 (51401) */
-    3343, /* C8CA (51402) */
-    3343, /* C8CB (51403) */
-    3343, /* C8CC (51404) */
-    3343, /* C8CD (51405) */
-    3343, /* C8CE (51406) */
-    3343, /* C8CF (51407) */
-    3343, /* C8D0 (51408) */
-    3343, /* C8D1 (51409) */
-    3343, /* C8D2 (51410) */
-    3343, /* C8D3 (51411) */
-    3343, /* C8D4 (51412) */
-    3343, /* C8D5 (51413) */
-    3343, /* C8D6 (51414) */
-    3343, /* C8D7 (51415) */
-    3343, /* C8D8 (51416) */
-    3343, /* C8D9 (51417) */
-    3343, /* C8DA (51418) */
-    3343, /* C8DB (51419) */
-    3343, /* C8DC (51420) */
-    3343, /* C8DD (51421) */
-    3343, /* C8DE (51422) */
-    3343, /* C8DF (51423) */
-    3343, /* C8E0 (51424) */
-    3343, /* C8E1 (51425) */
-    3343, /* C8E2 (51426) */
-    3343, /* C8E3 (51427) */
-    3343, /* C8E4 (51428) */
-    3343, /* C8E5 (51429) */
-    3343, /* C8E6 (51430) */
-    3343, /* C8E7 (51431) */
-    3343, /* C8E8 (51432) */
-    3343, /* C8E9 (51433) */
-    3343, /* C8EA (51434) */
-    3343, /* C8EB (51435) */
-    3343, /* C8EC (51436) */
-    3343, /* C8ED (51437) */
-    3343, /* C8EE (51438) */
-    3343, /* C8EF (51439) */
-    3343, /* C8F0 (51440) */
-    3343, /* C8F1 (51441) */
-    3343, /* C8F2 (51442) */
-    3343, /* C8F3 (51443) */
-    3343, /* C8F4 (51444) */
-    3343, /* C8F5 (51445) */
-    3343, /* C8F6 (51446) */
-    3343, /* C8F7 (51447) */
-    3343, /* C8F8 (51448) */
-    3343, /* C8F9 (51449) */
-    3343, /* C8FA (51450) */
-    3343, /* C8FB (51451) */
-    3343, /* C8FC (51452) */
-    3343, /* C8FD (51453) */
-    3343, /* C8FE (51454) */
-    3343, /* C8FF (51455) */
-    3343, /* C900 (51456) */
-    3343, /* C901 (51457) */
-    3343, /* C902 (51458) */
-    3343, /* C903 (51459) */
-    3343, /* C904 (51460) */
-    3343, /* C905 (51461) */
-    3343, /* C906 (51462) */
-    3343, /* C907 (51463) */
-    3343, /* C908 (51464) */
-    3343, /* C909 (51465) */
-    3343, /* C90A (51466) */
-    3343, /* C90B (51467) */
-    3343, /* C90C (51468) */
-    3343, /* C90D (51469) */
-    3343, /* C90E (51470) */
-    3343, /* C90F (51471) */
-    3343, /* C910 (51472) */
-    3343, /* C911 (51473) */
-    3343, /* C912 (51474) */
-    3343, /* C913 (51475) */
-    3343, /* C914 (51476) */
-    3343, /* C915 (51477) */
-    3343, /* C916 (51478) */
-    3343, /* C917 (51479) */
-    3343, /* C918 (51480) */
-    3343, /* C919 (51481) */
-    3343, /* C91A (51482) */
-    3343, /* C91B (51483) */
-    3343, /* C91C (51484) */
-    3343, /* C91D (51485) */
-    3343, /* C91E (51486) */
-    3343, /* C91F (51487) */
-    3343, /* C920 (51488) */
-    3343, /* C921 (51489) */
-    3343, /* C922 (51490) */
-    3343, /* C923 (51491) */
-    3343, /* C924 (51492) */
-    3343, /* C925 (51493) */
-    3343, /* C926 (51494) */
-    3343, /* C927 (51495) */
-    3343, /* C928 (51496) */
-    3343, /* C929 (51497) */
-    3343, /* C92A (51498) */
-    3343, /* C92B (51499) */
-    3343, /* C92C (51500) */
-    3343, /* C92D (51501) */
-    3343, /* C92E (51502) */
-    3343, /* C92F (51503) */
-    3343, /* C930 (51504) */
-    3343, /* C931 (51505) */
-    3343, /* C932 (51506) */
-    3343, /* C933 (51507) */
-    3343, /* C934 (51508) */
-    3343, /* C935 (51509) */
-    3343, /* C936 (51510) */
-    3343, /* C937 (51511) */
-    3343, /* C938 (51512) */
-    3343, /* C939 (51513) */
-    3343, /* C93A (51514) */
-    3343, /* C93B (51515) */
-    3343, /* C93C (51516) */
-    3343, /* C93D (51517) */
-    3343, /* C93E (51518) */
-    3343, /* C93F (51519) */
-    3343, /* C940 (51520) */
-    3343, /* C941 (51521) */
-    3343, /* C942 (51522) */
-    3343, /* C943 (51523) */
-    3343, /* C944 (51524) */
-    3343, /* C945 (51525) */
-    3343, /* C946 (51526) */
-    3343, /* C947 (51527) */
-    3343, /* C948 (51528) */
-    3343, /* C949 (51529) */
-    3343, /* C94A (51530) */
-    3343, /* C94B (51531) */
-    3343, /* C94C (51532) */
-    3343, /* C94D (51533) */
-    3343, /* C94E (51534) */
-    3343, /* C94F (51535) */
-    3343, /* C950 (51536) */
-    3343, /* C951 (51537) */
-    3343, /* C952 (51538) */
-    3343, /* C953 (51539) */
-    3343, /* C954 (51540) */
-    3343, /* C955 (51541) */
-    3343, /* C956 (51542) */
-    3343, /* C957 (51543) */
-    3343, /* C958 (51544) */
-    3343, /* C959 (51545) */
-    3343, /* C95A (51546) */
-    3343, /* C95B (51547) */
-    3343, /* C95C (51548) */
-    3343, /* C95D (51549) */
-    3343, /* C95E (51550) */
-    3343, /* C95F (51551) */
-    3343, /* C960 (51552) */
-    3343, /* C961 (51553) */
-    3343, /* C962 (51554) */
-    3343, /* C963 (51555) */
-    3343, /* C964 (51556) */
-    3343, /* C965 (51557) */
-    3343, /* C966 (51558) */
-    3343, /* C967 (51559) */
-    3343, /* C968 (51560) */
-    3343, /* C969 (51561) */
-    3343, /* C96A (51562) */
-    3343, /* C96B (51563) */
-    3343, /* C96C (51564) */
-    3343, /* C96D (51565) */
-    3343, /* C96E (51566) */
-    3343, /* C96F (51567) */
-    3343, /* C970 (51568) */
-    3343, /* C971 (51569) */
-    3343, /* C972 (51570) */
-    3343, /* C973 (51571) */
-    3343, /* C974 (51572) */
-    3343, /* C975 (51573) */
-    3343, /* C976 (51574) */
-    3343, /* C977 (51575) */
-    3343, /* C978 (51576) */
-    3343, /* C979 (51577) */
-    3343, /* C97A (51578) */
-    3343, /* C97B (51579) */
-    3343, /* C97C (51580) */
-    3343, /* C97D (51581) */
-    3343, /* C97E (51582) */
-    3343, /* C97F (51583) */
-    3343, /* C980 (51584) */
-    3343, /* C981 (51585) */
-    3343, /* C982 (51586) */
-    3343, /* C983 (51587) */
-    3343, /* C984 (51588) */
-    3343, /* C985 (51589) */
-    3343, /* C986 (51590) */
-    3343, /* C987 (51591) */
-    3343, /* C988 (51592) */
-    3343, /* C989 (51593) */
-    3343, /* C98A (51594) */
-    3343, /* C98B (51595) */
-    3343, /* C98C (51596) */
-    3343, /* C98D (51597) */
-    3343, /* C98E (51598) */
-    3343, /* C98F (51599) */
-    3343, /* C990 (51600) */
-    3343, /* C991 (51601) */
-    3343, /* C992 (51602) */
-    3343, /* C993 (51603) */
-    3343, /* C994 (51604) */
-    3343, /* C995 (51605) */
-    3343, /* C996 (51606) */
-    3343, /* C997 (51607) */
-    3343, /* C998 (51608) */
-    3343, /* C999 (51609) */
-    3343, /* C99A (51610) */
-    3343, /* C99B (51611) */
-    3343, /* C99C (51612) */
-    3343, /* C99D (51613) */
-    3343, /* C99E (51614) */
-    3343, /* C99F (51615) */
-    3343, /* C9A0 (51616) */
-    3343, /* C9A1 (51617) */
-    3343, /* C9A2 (51618) */
-    3343, /* C9A3 (51619) */
-    3343, /* C9A4 (51620) */
-    3343, /* C9A5 (51621) */
-    3343, /* C9A6 (51622) */
-    3343, /* C9A7 (51623) */
-    3343, /* C9A8 (51624) */
-    3343, /* C9A9 (51625) */
-    3343, /* C9AA (51626) */
-    3343, /* C9AB (51627) */
-    3343, /* C9AC (51628) */
-    3343, /* C9AD (51629) */
-    3343, /* C9AE (51630) */
-    3343, /* C9AF (51631) */
-    3343, /* C9B0 (51632) */
-    3343, /* C9B1 (51633) */
-    3343, /* C9B2 (51634) */
-    3343, /* C9B3 (51635) */
-    3343, /* C9B4 (51636) */
-    3343, /* C9B5 (51637) */
-    3343, /* C9B6 (51638) */
-    3343, /* C9B7 (51639) */
-    3343, /* C9B8 (51640) */
-    3343, /* C9B9 (51641) */
-    3343, /* C9BA (51642) */
-    3343, /* C9BB (51643) */
-    3343, /* C9BC (51644) */
-    3343, /* C9BD (51645) */
-    3343, /* C9BE (51646) */
-    3343, /* C9BF (51647) */
-    3343, /* C9C0 (51648) */
-    3343, /* C9C1 (51649) */
-    3343, /* C9C2 (51650) */
-    3343, /* C9C3 (51651) */
-    3343, /* C9C4 (51652) */
-    3343, /* C9C5 (51653) */
-    3343, /* C9C6 (51654) */
-    3343, /* C9C7 (51655) */
-    3343, /* C9C8 (51656) */
-    3343, /* C9C9 (51657) */
-    3343, /* C9CA (51658) */
-    3343, /* C9CB (51659) */
-    3343, /* C9CC (51660) */
-    3343, /* C9CD (51661) */
-    3343, /* C9CE (51662) */
-    3343, /* C9CF (51663) */
-    3343, /* C9D0 (51664) */
-    3343, /* C9D1 (51665) */
-    3343, /* C9D2 (51666) */
-    3343, /* C9D3 (51667) */
-    3343, /* C9D4 (51668) */
-    3343, /* C9D5 (51669) */
-    3343, /* C9D6 (51670) */
-    3343, /* C9D7 (51671) */
-    3343, /* C9D8 (51672) */
-    3343, /* C9D9 (51673) */
-    3343, /* C9DA (51674) */
-    3343, /* C9DB (51675) */
-    3343, /* C9DC (51676) */
-    3343, /* C9DD (51677) */
-    3343, /* C9DE (51678) */
-    3343, /* C9DF (51679) */
-    3343, /* C9E0 (51680) */
-    3343, /* C9E1 (51681) */
-    3343, /* C9E2 (51682) */
-    3343, /* C9E3 (51683) */
-    3343, /* C9E4 (51684) */
-    3343, /* C9E5 (51685) */
-    3343, /* C9E6 (51686) */
-    3343, /* C9E7 (51687) */
-    3343, /* C9E8 (51688) */
-    3343, /* C9E9 (51689) */
-    3343, /* C9EA (51690) */
-    3343, /* C9EB (51691) */
-    3343, /* C9EC (51692) */
-    3343, /* C9ED (51693) */
-    3343, /* C9EE (51694) */
-    3343, /* C9EF (51695) */
-    3343, /* C9F0 (51696) */
-    3343, /* C9F1 (51697) */
-    3343, /* C9F2 (51698) */
-    3343, /* C9F3 (51699) */
-    3343, /* C9F4 (51700) */
-    3343, /* C9F5 (51701) */
-    3343, /* C9F6 (51702) */
-    3343, /* C9F7 (51703) */
-    3343, /* C9F8 (51704) */
-    3343, /* C9F9 (51705) */
-    3343, /* C9FA (51706) */
-    3343, /* C9FB (51707) */
-    3343, /* C9FC (51708) */
-    3343, /* C9FD (51709) */
-    3343, /* C9FE (51710) */
-    3343, /* C9FF (51711) */
-    3343, /* CA00 (51712) */
-    3343, /* CA01 (51713) */
-    3343, /* CA02 (51714) */
-    3343, /* CA03 (51715) */
-    3343, /* CA04 (51716) */
-    3343, /* CA05 (51717) */
-    3343, /* CA06 (51718) */
-    3343, /* CA07 (51719) */
-    3343, /* CA08 (51720) */
-    3343, /* CA09 (51721) */
-    3343, /* CA0A (51722) */
-    3343, /* CA0B (51723) */
-    3343, /* CA0C (51724) */
-    3343, /* CA0D (51725) */
-    3343, /* CA0E (51726) */
-    3343, /* CA0F (51727) */
-    3343, /* CA10 (51728) */
-    3343, /* CA11 (51729) */
-    3343, /* CA12 (51730) */
-    3343, /* CA13 (51731) */
-    3343, /* CA14 (51732) */
-    3343, /* CA15 (51733) */
-    3343, /* CA16 (51734) */
-    3343, /* CA17 (51735) */
-    3343, /* CA18 (51736) */
-    3343, /* CA19 (51737) */
-    3343, /* CA1A (51738) */
-    3343, /* CA1B (51739) */
-    3343, /* CA1C (51740) */
-    3343, /* CA1D (51741) */
-    3343, /* CA1E (51742) */
-    3343, /* CA1F (51743) */
-    3343, /* CA20 (51744) */
-    3343, /* CA21 (51745) */
-    3343, /* CA22 (51746) */
-    3343, /* CA23 (51747) */
-    3343, /* CA24 (51748) */
-    3343, /* CA25 (51749) */
-    3343, /* CA26 (51750) */
-    3343, /* CA27 (51751) */
-    3343, /* CA28 (51752) */
-    3343, /* CA29 (51753) */
-    3343, /* CA2A (51754) */
-    3343, /* CA2B (51755) */
-    3343, /* CA2C (51756) */
-    3343, /* CA2D (51757) */
-    3343, /* CA2E (51758) */
-    3343, /* CA2F (51759) */
-    3343, /* CA30 (51760) */
-    3343, /* CA31 (51761) */
-    3343, /* CA32 (51762) */
-    3343, /* CA33 (51763) */
-    3343, /* CA34 (51764) */
-    3343, /* CA35 (51765) */
-    3343, /* CA36 (51766) */
-    3343, /* CA37 (51767) */
-    3343, /* CA38 (51768) */
-    3343, /* CA39 (51769) */
-    3343, /* CA3A (51770) */
-    3343, /* CA3B (51771) */
-    3343, /* CA3C (51772) */
-    3343, /* CA3D (51773) */
-    3343, /* CA3E (51774) */
-    3343, /* CA3F (51775) */
-    3343, /* CA40 (51776) */
-    3343, /* CA41 (51777) */
-    3343, /* CA42 (51778) */
-    3343, /* CA43 (51779) */
-    3343, /* CA44 (51780) */
-    3343, /* CA45 (51781) */
-    3343, /* CA46 (51782) */
-    3343, /* CA47 (51783) */
-    3343, /* CA48 (51784) */
-    3343, /* CA49 (51785) */
-    3343, /* CA4A (51786) */
-    3343, /* CA4B (51787) */
-    3343, /* CA4C (51788) */
-    3343, /* CA4D (51789) */
-    3343, /* CA4E (51790) */
-    3343, /* CA4F (51791) */
-    3343, /* CA50 (51792) */
-    3343, /* CA51 (51793) */
-    3343, /* CA52 (51794) */
-    3343, /* CA53 (51795) */
-    3343, /* CA54 (51796) */
-    3343, /* CA55 (51797) */
-    3343, /* CA56 (51798) */
-    3343, /* CA57 (51799) */
-    3343, /* CA58 (51800) */
-    3343, /* CA59 (51801) */
-    3343, /* CA5A (51802) */
-    3343, /* CA5B (51803) */
-    3343, /* CA5C (51804) */
-    3343, /* CA5D (51805) */
-    3343, /* CA5E (51806) */
-    3343, /* CA5F (51807) */
-    3343, /* CA60 (51808) */
-    3343, /* CA61 (51809) */
-    3343, /* CA62 (51810) */
-    3343, /* CA63 (51811) */
-    3343, /* CA64 (51812) */
-    3343, /* CA65 (51813) */
-    3343, /* CA66 (51814) */
-    3343, /* CA67 (51815) */
-    3343, /* CA68 (51816) */
-    3343, /* CA69 (51817) */
-    3343, /* CA6A (51818) */
-    3343, /* CA6B (51819) */
-    3343, /* CA6C (51820) */
-    3343, /* CA6D (51821) */
-    3343, /* CA6E (51822) */
-    3343, /* CA6F (51823) */
-    3343, /* CA70 (51824) */
-    3343, /* CA71 (51825) */
-    3343, /* CA72 (51826) */
-    3343, /* CA73 (51827) */
-    3343, /* CA74 (51828) */
-    3343, /* CA75 (51829) */
-    3343, /* CA76 (51830) */
-    3343, /* CA77 (51831) */
-    3343, /* CA78 (51832) */
-    3343, /* CA79 (51833) */
-    3343, /* CA7A (51834) */
-    3343, /* CA7B (51835) */
-    3343, /* CA7C (51836) */
-    3343, /* CA7D (51837) */
-    3343, /* CA7E (51838) */
-    3343, /* CA7F (51839) */
-    3343, /* CA80 (51840) */
-    3343, /* CA81 (51841) */
-    3343, /* CA82 (51842) */
-    3343, /* CA83 (51843) */
-    3343, /* CA84 (51844) */
-    3343, /* CA85 (51845) */
-    3343, /* CA86 (51846) */
-    3343, /* CA87 (51847) */
-    3343, /* CA88 (51848) */
-    3343, /* CA89 (51849) */
-    3343, /* CA8A (51850) */
-    3343, /* CA8B (51851) */
-    3343, /* CA8C (51852) */
-    3343, /* CA8D (51853) */
-    3343, /* CA8E (51854) */
-    3343, /* CA8F (51855) */
-    3343, /* CA90 (51856) */
-    3343, /* CA91 (51857) */
-    3343, /* CA92 (51858) */
-    3343, /* CA93 (51859) */
-    3343, /* CA94 (51860) */
-    3343, /* CA95 (51861) */
-    3343, /* CA96 (51862) */
-    3343, /* CA97 (51863) */
-    3343, /* CA98 (51864) */
-    3343, /* CA99 (51865) */
-    3343, /* CA9A (51866) */
-    3343, /* CA9B (51867) */
-    3343, /* CA9C (51868) */
-    3343, /* CA9D (51869) */
-    3343, /* CA9E (51870) */
-    3343, /* CA9F (51871) */
-    3343, /* CAA0 (51872) */
-    3343, /* CAA1 (51873) */
-    3343, /* CAA2 (51874) */
-    3343, /* CAA3 (51875) */
-    3343, /* CAA4 (51876) */
-    3343, /* CAA5 (51877) */
-    3343, /* CAA6 (51878) */
-    3343, /* CAA7 (51879) */
-    3343, /* CAA8 (51880) */
-    3343, /* CAA9 (51881) */
-    3343, /* CAAA (51882) */
-    3343, /* CAAB (51883) */
-    3343, /* CAAC (51884) */
-    3343, /* CAAD (51885) */
-    3343, /* CAAE (51886) */
-    3343, /* CAAF (51887) */
-    3343, /* CAB0 (51888) */
-    3343, /* CAB1 (51889) */
-    3343, /* CAB2 (51890) */
-    3343, /* CAB3 (51891) */
-    3343, /* CAB4 (51892) */
-    3343, /* CAB5 (51893) */
-    3343, /* CAB6 (51894) */
-    3343, /* CAB7 (51895) */
-    3343, /* CAB8 (51896) */
-    3343, /* CAB9 (51897) */
-    3343, /* CABA (51898) */
-    3343, /* CABB (51899) */
-    3343, /* CABC (51900) */
-    3343, /* CABD (51901) */
-    3343, /* CABE (51902) */
-    3343, /* CABF (51903) */
-    3343, /* CAC0 (51904) */
-    3343, /* CAC1 (51905) */
-    3343, /* CAC2 (51906) */
-    3343, /* CAC3 (51907) */
-    3343, /* CAC4 (51908) */
-    3343, /* CAC5 (51909) */
-    3343, /* CAC6 (51910) */
-    3343, /* CAC7 (51911) */
-    3343, /* CAC8 (51912) */
-    3343, /* CAC9 (51913) */
-    3343, /* CACA (51914) */
-    3343, /* CACB (51915) */
-    3343, /* CACC (51916) */
-    3343, /* CACD (51917) */
-    3343, /* CACE (51918) */
-    3343, /* CACF (51919) */
-    3343, /* CAD0 (51920) */
-    3343, /* CAD1 (51921) */
-    3343, /* CAD2 (51922) */
-    3343, /* CAD3 (51923) */
-    3343, /* CAD4 (51924) */
-    3343, /* CAD5 (51925) */
-    3343, /* CAD6 (51926) */
-    3343, /* CAD7 (51927) */
-    3343, /* CAD8 (51928) */
-    3343, /* CAD9 (51929) */
-    3343, /* CADA (51930) */
-    3343, /* CADB (51931) */
-    3343, /* CADC (51932) */
-    3343, /* CADD (51933) */
-    3343, /* CADE (51934) */
-    3343, /* CADF (51935) */
-    3343, /* CAE0 (51936) */
-    3343, /* CAE1 (51937) */
-    3343, /* CAE2 (51938) */
-    3343, /* CAE3 (51939) */
-    3343, /* CAE4 (51940) */
-    3343, /* CAE5 (51941) */
-    3343, /* CAE6 (51942) */
-    3343, /* CAE7 (51943) */
-    3343, /* CAE8 (51944) */
-    3343, /* CAE9 (51945) */
-    3343, /* CAEA (51946) */
-    3343, /* CAEB (51947) */
-    3343, /* CAEC (51948) */
-    3343, /* CAED (51949) */
-    3343, /* CAEE (51950) */
-    3343, /* CAEF (51951) */
-    3343, /* CAF0 (51952) */
-    3343, /* CAF1 (51953) */
-    3343, /* CAF2 (51954) */
-    3343, /* CAF3 (51955) */
-    3343, /* CAF4 (51956) */
-    3343, /* CAF5 (51957) */
-    3343, /* CAF6 (51958) */
-    3343, /* CAF7 (51959) */
-    3343, /* CAF8 (51960) */
-    3343, /* CAF9 (51961) */
-    3343, /* CAFA (51962) */
-    3343, /* CAFB (51963) */
-    3343, /* CAFC (51964) */
-    3343, /* CAFD (51965) */
-    3343, /* CAFE (51966) */
-    3343, /* CAFF (51967) */
-    3343, /* CB00 (51968) */
-    3343, /* CB01 (51969) */
-    3343, /* CB02 (51970) */
-    3343, /* CB03 (51971) */
-    3343, /* CB04 (51972) */
-    3343, /* CB05 (51973) */
-    3343, /* CB06 (51974) */
-    3343, /* CB07 (51975) */
-    3343, /* CB08 (51976) */
-    3343, /* CB09 (51977) */
-    3343, /* CB0A (51978) */
-    3343, /* CB0B (51979) */
-    3343, /* CB0C (51980) */
-    3343, /* CB0D (51981) */
-    3343, /* CB0E (51982) */
-    3343, /* CB0F (51983) */
-    3343, /* CB10 (51984) */
-    3343, /* CB11 (51985) */
-    3343, /* CB12 (51986) */
-    3343, /* CB13 (51987) */
-    3343, /* CB14 (51988) */
-    3343, /* CB15 (51989) */
-    3343, /* CB16 (51990) */
-    3343, /* CB17 (51991) */
-    3343, /* CB18 (51992) */
-    3343, /* CB19 (51993) */
-    3343, /* CB1A (51994) */
-    3343, /* CB1B (51995) */
-    3343, /* CB1C (51996) */
-    3343, /* CB1D (51997) */
-    3343, /* CB1E (51998) */
-    3343, /* CB1F (51999) */
-    3343, /* CB20 (52000) */
-    3343, /* CB21 (52001) */
-    3343, /* CB22 (52002) */
-    3343, /* CB23 (52003) */
-    3343, /* CB24 (52004) */
-    3343, /* CB25 (52005) */
-    3343, /* CB26 (52006) */
-    3343, /* CB27 (52007) */
-    3343, /* CB28 (52008) */
-    3343, /* CB29 (52009) */
-    3343, /* CB2A (52010) */
-    3343, /* CB2B (52011) */
-    3343, /* CB2C (52012) */
-    3343, /* CB2D (52013) */
-    3343, /* CB2E (52014) */
-    3343, /* CB2F (52015) */
-    3343, /* CB30 (52016) */
-    3343, /* CB31 (52017) */
-    3343, /* CB32 (52018) */
-    3343, /* CB33 (52019) */
-    3343, /* CB34 (52020) */
-    3343, /* CB35 (52021) */
-    3343, /* CB36 (52022) */
-    3343, /* CB37 (52023) */
-    3343, /* CB38 (52024) */
-    3343, /* CB39 (52025) */
-    3343, /* CB3A (52026) */
-    3343, /* CB3B (52027) */
-    3343, /* CB3C (52028) */
-    3343, /* CB3D (52029) */
-    3343, /* CB3E (52030) */
-    3343, /* CB3F (52031) */
-    3343, /* CB40 (52032) */
-    3343, /* CB41 (52033) */
-    3343, /* CB42 (52034) */
-    3343, /* CB43 (52035) */
-    3343, /* CB44 (52036) */
-    3343, /* CB45 (52037) */
-    3343, /* CB46 (52038) */
-    3343, /* CB47 (52039) */
-    3343, /* CB48 (52040) */
-    3343, /* CB49 (52041) */
-    3343, /* CB4A (52042) */
-    3343, /* CB4B (52043) */
-    3343, /* CB4C (52044) */
-    3343, /* CB4D (52045) */
-    3343, /* CB4E (52046) */
-    3343, /* CB4F (52047) */
-    3343, /* CB50 (52048) */
-    3343, /* CB51 (52049) */
-    3343, /* CB52 (52050) */
-    3343, /* CB53 (52051) */
-    3343, /* CB54 (52052) */
-    3343, /* CB55 (52053) */
-    3343, /* CB56 (52054) */
-    3343, /* CB57 (52055) */
-    3343, /* CB58 (52056) */
-    3343, /* CB59 (52057) */
-    3343, /* CB5A (52058) */
-    3343, /* CB5B (52059) */
-    3343, /* CB5C (52060) */
-    3343, /* CB5D (52061) */
-    3343, /* CB5E (52062) */
-    3343, /* CB5F (52063) */
-    3343, /* CB60 (52064) */
-    3343, /* CB61 (52065) */
-    3343, /* CB62 (52066) */
-    3343, /* CB63 (52067) */
-    3343, /* CB64 (52068) */
-    3343, /* CB65 (52069) */
-    3343, /* CB66 (52070) */
-    3343, /* CB67 (52071) */
-    3343, /* CB68 (52072) */
-    3343, /* CB69 (52073) */
-    3343, /* CB6A (52074) */
-    3343, /* CB6B (52075) */
-    3343, /* CB6C (52076) */
-    3343, /* CB6D (52077) */
-    3343, /* CB6E (52078) */
-    3343, /* CB6F (52079) */
-    3343, /* CB70 (52080) */
-    3343, /* CB71 (52081) */
-    3343, /* CB72 (52082) */
-    3343, /* CB73 (52083) */
-    3343, /* CB74 (52084) */
-    3343, /* CB75 (52085) */
-    3343, /* CB76 (52086) */
-    3343, /* CB77 (52087) */
-    3343, /* CB78 (52088) */
-    3343, /* CB79 (52089) */
-    3343, /* CB7A (52090) */
-    3343, /* CB7B (52091) */
-    3343, /* CB7C (52092) */
-    3343, /* CB7D (52093) */
-    3343, /* CB7E (52094) */
-    3343, /* CB7F (52095) */
-    3343, /* CB80 (52096) */
-    3343, /* CB81 (52097) */
-    3343, /* CB82 (52098) */
-    3343, /* CB83 (52099) */
-    3343, /* CB84 (52100) */
-    3343, /* CB85 (52101) */
-    3343, /* CB86 (52102) */
-    3343, /* CB87 (52103) */
-    3343, /* CB88 (52104) */
-    3343, /* CB89 (52105) */
-    3343, /* CB8A (52106) */
-    3343, /* CB8B (52107) */
-    3343, /* CB8C (52108) */
-    3343, /* CB8D (52109) */
-    3343, /* CB8E (52110) */
-    3343, /* CB8F (52111) */
-    3343, /* CB90 (52112) */
-    3343, /* CB91 (52113) */
-    3343, /* CB92 (52114) */
-    3343, /* CB93 (52115) */
-    3343, /* CB94 (52116) */
-    3343, /* CB95 (52117) */
-    3343, /* CB96 (52118) */
-    3343, /* CB97 (52119) */
-    3343, /* CB98 (52120) */
-    3343, /* CB99 (52121) */
-    3343, /* CB9A (52122) */
-    3343, /* CB9B (52123) */
-    3343, /* CB9C (52124) */
-    3343, /* CB9D (52125) */
-    3343, /* CB9E (52126) */
-    3343, /* CB9F (52127) */
-    3343, /* CBA0 (52128) */
-    3343, /* CBA1 (52129) */
-    3343, /* CBA2 (52130) */
-    3343, /* CBA3 (52131) */
-    3343, /* CBA4 (52132) */
-    3343, /* CBA5 (52133) */
-    3343, /* CBA6 (52134) */
-    3343, /* CBA7 (52135) */
-    3343, /* CBA8 (52136) */
-    3343, /* CBA9 (52137) */
-    3343, /* CBAA (52138) */
-    3343, /* CBAB (52139) */
-    3343, /* CBAC (52140) */
-    3343, /* CBAD (52141) */
-    3343, /* CBAE (52142) */
-    3343, /* CBAF (52143) */
-    3343, /* CBB0 (52144) */
-    3343, /* CBB1 (52145) */
-    3343, /* CBB2 (52146) */
-    3343, /* CBB3 (52147) */
-    3343, /* CBB4 (52148) */
-    3343, /* CBB5 (52149) */
-    3343, /* CBB6 (52150) */
-    3343, /* CBB7 (52151) */
-    3343, /* CBB8 (52152) */
-    3343, /* CBB9 (52153) */
-    3343, /* CBBA (52154) */
-    3343, /* CBBB (52155) */
-    3343, /* CBBC (52156) */
-    3343, /* CBBD (52157) */
-    3343, /* CBBE (52158) */
-    3343, /* CBBF (52159) */
-    3343, /* CBC0 (52160) */
-    3343, /* CBC1 (52161) */
-    3343, /* CBC2 (52162) */
-    3343, /* CBC3 (52163) */
-    3343, /* CBC4 (52164) */
-    3343, /* CBC5 (52165) */
-    3343, /* CBC6 (52166) */
-    3343, /* CBC7 (52167) */
-    3343, /* CBC8 (52168) */
-    3343, /* CBC9 (52169) */
-    3343, /* CBCA (52170) */
-    3343, /* CBCB (52171) */
-    3343, /* CBCC (52172) */
-    3343, /* CBCD (52173) */
-    3343, /* CBCE (52174) */
-    3343, /* CBCF (52175) */
-    3343, /* CBD0 (52176) */
-    3343, /* CBD1 (52177) */
-    3343, /* CBD2 (52178) */
-    3343, /* CBD3 (52179) */
-    3343, /* CBD4 (52180) */
-    3343, /* CBD5 (52181) */
-    3343, /* CBD6 (52182) */
-    3343, /* CBD7 (52183) */
-    3343, /* CBD8 (52184) */
-    3343, /* CBD9 (52185) */
-    3343, /* CBDA (52186) */
-    3343, /* CBDB (52187) */
-    3343, /* CBDC (52188) */
-    3343, /* CBDD (52189) */
-    3343, /* CBDE (52190) */
-    3343, /* CBDF (52191) */
-    3343, /* CBE0 (52192) */
-    3343, /* CBE1 (52193) */
-    3343, /* CBE2 (52194) */
-    3343, /* CBE3 (52195) */
-    3343, /* CBE4 (52196) */
-    3343, /* CBE5 (52197) */
-    3343, /* CBE6 (52198) */
-    3343, /* CBE7 (52199) */
-    3343, /* CBE8 (52200) */
-    3343, /* CBE9 (52201) */
-    3343, /* CBEA (52202) */
-    3343, /* CBEB (52203) */
-    3343, /* CBEC (52204) */
-    3343, /* CBED (52205) */
-    3343, /* CBEE (52206) */
-    3343, /* CBEF (52207) */
-    3343, /* CBF0 (52208) */
-    3343, /* CBF1 (52209) */
-    3343, /* CBF2 (52210) */
-    3343, /* CBF3 (52211) */
-    3343, /* CBF4 (52212) */
-    3343, /* CBF5 (52213) */
-    3343, /* CBF6 (52214) */
-    3343, /* CBF7 (52215) */
-    3343, /* CBF8 (52216) */
-    3343, /* CBF9 (52217) */
-    3343, /* CBFA (52218) */
-    3343, /* CBFB (52219) */
-    3343, /* CBFC (52220) */
-    3343, /* CBFD (52221) */
-    3343, /* CBFE (52222) */
-    3343, /* CBFF (52223) */
-    3343, /* CC00 (52224) */
-    3343, /* CC01 (52225) */
-    3343, /* CC02 (52226) */
-    3343, /* CC03 (52227) */
-    3343, /* CC04 (52228) */
-    3343, /* CC05 (52229) */
-    3343, /* CC06 (52230) */
-    3343, /* CC07 (52231) */
-    3343, /* CC08 (52232) */
-    3343, /* CC09 (52233) */
-    3343, /* CC0A (52234) */
-    3343, /* CC0B (52235) */
-    3343, /* CC0C (52236) */
-    3343, /* CC0D (52237) */
-    3343, /* CC0E (52238) */
-    3343, /* CC0F (52239) */
-    3343, /* CC10 (52240) */
-    3343, /* CC11 (52241) */
-    3343, /* CC12 (52242) */
-    3343, /* CC13 (52243) */
-    3343, /* CC14 (52244) */
-    3343, /* CC15 (52245) */
-    3343, /* CC16 (52246) */
-    3343, /* CC17 (52247) */
-    3343, /* CC18 (52248) */
-    3343, /* CC19 (52249) */
-    3343, /* CC1A (52250) */
-    3343, /* CC1B (52251) */
-    3343, /* CC1C (52252) */
-    3343, /* CC1D (52253) */
-    3343, /* CC1E (52254) */
-    3343, /* CC1F (52255) */
-    3343, /* CC20 (52256) */
-    3343, /* CC21 (52257) */
-    3343, /* CC22 (52258) */
-    3343, /* CC23 (52259) */
-    3343, /* CC24 (52260) */
-    3343, /* CC25 (52261) */
-    3343, /* CC26 (52262) */
-    3343, /* CC27 (52263) */
-    3343, /* CC28 (52264) */
-    3343, /* CC29 (52265) */
-    3343, /* CC2A (52266) */
-    3343, /* CC2B (52267) */
-    3343, /* CC2C (52268) */
-    3343, /* CC2D (52269) */
-    3343, /* CC2E (52270) */
-    3343, /* CC2F (52271) */
-    3343, /* CC30 (52272) */
-    3343, /* CC31 (52273) */
-    3343, /* CC32 (52274) */
-    3343, /* CC33 (52275) */
-    3343, /* CC34 (52276) */
-    3343, /* CC35 (52277) */
-    3343, /* CC36 (52278) */
-    3343, /* CC37 (52279) */
-    3343, /* CC38 (52280) */
-    3343, /* CC39 (52281) */
-    3343, /* CC3A (52282) */
-    3343, /* CC3B (52283) */
-    3343, /* CC3C (52284) */
-    3343, /* CC3D (52285) */
-    3343, /* CC3E (52286) */
-    3343, /* CC3F (52287) */
-    3343, /* CC40 (52288) */
-    3343, /* CC41 (52289) */
-    3343, /* CC42 (52290) */
-    3343, /* CC43 (52291) */
-    3343, /* CC44 (52292) */
-    3343, /* CC45 (52293) */
-    3343, /* CC46 (52294) */
-    3343, /* CC47 (52295) */
-    3343, /* CC48 (52296) */
-    3343, /* CC49 (52297) */
-    3343, /* CC4A (52298) */
-    3343, /* CC4B (52299) */
-    3343, /* CC4C (52300) */
-    3343, /* CC4D (52301) */
-    3343, /* CC4E (52302) */
-    3343, /* CC4F (52303) */
-    3343, /* CC50 (52304) */
-    3343, /* CC51 (52305) */
-    3343, /* CC52 (52306) */
-    3343, /* CC53 (52307) */
-    3343, /* CC54 (52308) */
-    3343, /* CC55 (52309) */
-    3343, /* CC56 (52310) */
-    3343, /* CC57 (52311) */
-    3343, /* CC58 (52312) */
-    3343, /* CC59 (52313) */
-    3343, /* CC5A (52314) */
-    3343, /* CC5B (52315) */
-    3343, /* CC5C (52316) */
-    3343, /* CC5D (52317) */
-    3343, /* CC5E (52318) */
-    3343, /* CC5F (52319) */
-    3343, /* CC60 (52320) */
-    3343, /* CC61 (52321) */
-    3343, /* CC62 (52322) */
-    3343, /* CC63 (52323) */
-    3343, /* CC64 (52324) */
-    3343, /* CC65 (52325) */
-    3343, /* CC66 (52326) */
-    3343, /* CC67 (52327) */
-    3343, /* CC68 (52328) */
-    3343, /* CC69 (52329) */
-    3343, /* CC6A (52330) */
-    3343, /* CC6B (52331) */
-    3343, /* CC6C (52332) */
-    3343, /* CC6D (52333) */
-    3343, /* CC6E (52334) */
-    3343, /* CC6F (52335) */
-    3343, /* CC70 (52336) */
-    3343, /* CC71 (52337) */
-    3343, /* CC72 (52338) */
-    3343, /* CC73 (52339) */
-    3343, /* CC74 (52340) */
-    3343, /* CC75 (52341) */
-    3343, /* CC76 (52342) */
-    3343, /* CC77 (52343) */
-    3343, /* CC78 (52344) */
-    3343, /* CC79 (52345) */
-    3343, /* CC7A (52346) */
-    3343, /* CC7B (52347) */
-    3343, /* CC7C (52348) */
-    3343, /* CC7D (52349) */
-    3343, /* CC7E (52350) */
-    3343, /* CC7F (52351) */
-    3343, /* CC80 (52352) */
-    3343, /* CC81 (52353) */
-    3343, /* CC82 (52354) */
-    3343, /* CC83 (52355) */
-    3343, /* CC84 (52356) */
-    3343, /* CC85 (52357) */
-    3343, /* CC86 (52358) */
-    3343, /* CC87 (52359) */
-    3343, /* CC88 (52360) */
-    3343, /* CC89 (52361) */
-    3343, /* CC8A (52362) */
-    3343, /* CC8B (52363) */
-    3343, /* CC8C (52364) */
-    3343, /* CC8D (52365) */
-    3343, /* CC8E (52366) */
-    3343, /* CC8F (52367) */
-    3343, /* CC90 (52368) */
-    3343, /* CC91 (52369) */
-    3343, /* CC92 (52370) */
-    3343, /* CC93 (52371) */
-    3343, /* CC94 (52372) */
-    3343, /* CC95 (52373) */
-    3343, /* CC96 (52374) */
-    3343, /* CC97 (52375) */
-    3343, /* CC98 (52376) */
-    3343, /* CC99 (52377) */
-    3343, /* CC9A (52378) */
-    3343, /* CC9B (52379) */
-    3343, /* CC9C (52380) */
-    3343, /* CC9D (52381) */
-    3343, /* CC9E (52382) */
-    3343, /* CC9F (52383) */
-    3343, /* CCA0 (52384) */
-    3343, /* CCA1 (52385) */
-    3343, /* CCA2 (52386) */
-    3343, /* CCA3 (52387) */
-    3343, /* CCA4 (52388) */
-    3343, /* CCA5 (52389) */
-    3343, /* CCA6 (52390) */
-    3343, /* CCA7 (52391) */
-    3343, /* CCA8 (52392) */
-    3343, /* CCA9 (52393) */
-    3343, /* CCAA (52394) */
-    3343, /* CCAB (52395) */
-    3343, /* CCAC (52396) */
-    3343, /* CCAD (52397) */
-    3343, /* CCAE (52398) */
-    3343, /* CCAF (52399) */
-    3343, /* CCB0 (52400) */
-    3343, /* CCB1 (52401) */
-    3343, /* CCB2 (52402) */
-    3343, /* CCB3 (52403) */
-    3343, /* CCB4 (52404) */
-    3343, /* CCB5 (52405) */
-    3343, /* CCB6 (52406) */
-    3343, /* CCB7 (52407) */
-    3343, /* CCB8 (52408) */
-    3343, /* CCB9 (52409) */
-    3343, /* CCBA (52410) */
-    3343, /* CCBB (52411) */
-    3343, /* CCBC (52412) */
-    3343, /* CCBD (52413) */
-    3343, /* CCBE (52414) */
-    3343, /* CCBF (52415) */
-    3343, /* CCC0 (52416) */
-    3343, /* CCC1 (52417) */
-    3343, /* CCC2 (52418) */
-    3343, /* CCC3 (52419) */
-    3343, /* CCC4 (52420) */
-    3343, /* CCC5 (52421) */
-    3343, /* CCC6 (52422) */
-    3343, /* CCC7 (52423) */
-    3343, /* CCC8 (52424) */
-    3343, /* CCC9 (52425) */
-    3343, /* CCCA (52426) */
-    3343, /* CCCB (52427) */
-    3343, /* CCCC (52428) */
-    3343, /* CCCD (52429) */
-    3343, /* CCCE (52430) */
-    3343, /* CCCF (52431) */
-    3343, /* CCD0 (52432) */
-    3343, /* CCD1 (52433) */
-    3343, /* CCD2 (52434) */
-    3343, /* CCD3 (52435) */
-    3343, /* CCD4 (52436) */
-    3343, /* CCD5 (52437) */
-    3343, /* CCD6 (52438) */
-    3343, /* CCD7 (52439) */
-    3343, /* CCD8 (52440) */
-    3343, /* CCD9 (52441) */
-    3343, /* CCDA (52442) */
-    3343, /* CCDB (52443) */
-    3343, /* CCDC (52444) */
-    3343, /* CCDD (52445) */
-    3343, /* CCDE (52446) */
-    3343, /* CCDF (52447) */
-    3343, /* CCE0 (52448) */
-    3343, /* CCE1 (52449) */
-    3343, /* CCE2 (52450) */
-    3343, /* CCE3 (52451) */
-    3343, /* CCE4 (52452) */
-    3343, /* CCE5 (52453) */
-    3343, /* CCE6 (52454) */
-    3343, /* CCE7 (52455) */
-    3343, /* CCE8 (52456) */
-    3343, /* CCE9 (52457) */
-    3343, /* CCEA (52458) */
-    3343, /* CCEB (52459) */
-    3343, /* CCEC (52460) */
-    3343, /* CCED (52461) */
-    3343, /* CCEE (52462) */
-    3343, /* CCEF (52463) */
-    3343, /* CCF0 (52464) */
-    3343, /* CCF1 (52465) */
-    3343, /* CCF2 (52466) */
-    3343, /* CCF3 (52467) */
-    3343, /* CCF4 (52468) */
-    3343, /* CCF5 (52469) */
-    3343, /* CCF6 (52470) */
-    3343, /* CCF7 (52471) */
-    3343, /* CCF8 (52472) */
-    3343, /* CCF9 (52473) */
-    3343, /* CCFA (52474) */
-    3343, /* CCFB (52475) */
-    3343, /* CCFC (52476) */
-    3343, /* CCFD (52477) */
-    3343, /* CCFE (52478) */
-    3343, /* CCFF (52479) */
-    3343, /* CD00 (52480) */
-    3343, /* CD01 (52481) */
-    3343, /* CD02 (52482) */
-    3343, /* CD03 (52483) */
-    3343, /* CD04 (52484) */
-    3343, /* CD05 (52485) */
-    3343, /* CD06 (52486) */
-    3343, /* CD07 (52487) */
-    3343, /* CD08 (52488) */
-    3343, /* CD09 (52489) */
-    3343, /* CD0A (52490) */
-    3343, /* CD0B (52491) */
-    3343, /* CD0C (52492) */
-    3343, /* CD0D (52493) */
-    3343, /* CD0E (52494) */
-    3343, /* CD0F (52495) */
-    3343, /* CD10 (52496) */
-    3343, /* CD11 (52497) */
-    3343, /* CD12 (52498) */
-    3343, /* CD13 (52499) */
-    3343, /* CD14 (52500) */
-    3343, /* CD15 (52501) */
-    3343, /* CD16 (52502) */
-    3343, /* CD17 (52503) */
-    3343, /* CD18 (52504) */
-    3343, /* CD19 (52505) */
-    3343, /* CD1A (52506) */
-    3343, /* CD1B (52507) */
-    3343, /* CD1C (52508) */
-    3343, /* CD1D (52509) */
-    3343, /* CD1E (52510) */
-    3343, /* CD1F (52511) */
-    3343, /* CD20 (52512) */
-    3343, /* CD21 (52513) */
-    3343, /* CD22 (52514) */
-    3343, /* CD23 (52515) */
-    3343, /* CD24 (52516) */
-    3343, /* CD25 (52517) */
-    3343, /* CD26 (52518) */
-    3343, /* CD27 (52519) */
-    3343, /* CD28 (52520) */
-    3343, /* CD29 (52521) */
-    3343, /* CD2A (52522) */
-    3343, /* CD2B (52523) */
-    3343, /* CD2C (52524) */
-    3343, /* CD2D (52525) */
-    3343, /* CD2E (52526) */
-    3343, /* CD2F (52527) */
-    3343, /* CD30 (52528) */
-    3343, /* CD31 (52529) */
-    3343, /* CD32 (52530) */
-    3343, /* CD33 (52531) */
-    3343, /* CD34 (52532) */
-    3343, /* CD35 (52533) */
-    3343, /* CD36 (52534) */
-    3343, /* CD37 (52535) */
-    3343, /* CD38 (52536) */
-    3343, /* CD39 (52537) */
-    3343, /* CD3A (52538) */
-    3343, /* CD3B (52539) */
-    3343, /* CD3C (52540) */
-    3343, /* CD3D (52541) */
-    3343, /* CD3E (52542) */
-    3343, /* CD3F (52543) */
-    3343, /* CD40 (52544) */
-    3343, /* CD41 (52545) */
-    3343, /* CD42 (52546) */
-    3343, /* CD43 (52547) */
-    3343, /* CD44 (52548) */
-    3343, /* CD45 (52549) */
-    3343, /* CD46 (52550) */
-    3343, /* CD47 (52551) */
-    3343, /* CD48 (52552) */
-    3343, /* CD49 (52553) */
-    3343, /* CD4A (52554) */
-    3343, /* CD4B (52555) */
-    3343, /* CD4C (52556) */
-    3343, /* CD4D (52557) */
-    3343, /* CD4E (52558) */
-    3343, /* CD4F (52559) */
-    3343, /* CD50 (52560) */
-    3343, /* CD51 (52561) */
-    3343, /* CD52 (52562) */
-    3343, /* CD53 (52563) */
-    3343, /* CD54 (52564) */
-    3343, /* CD55 (52565) */
-    3343, /* CD56 (52566) */
-    3343, /* CD57 (52567) */
-    3343, /* CD58 (52568) */
-    3343, /* CD59 (52569) */
-    3343, /* CD5A (52570) */
-    3343, /* CD5B (52571) */
-    3343, /* CD5C (52572) */
-    3343, /* CD5D (52573) */
-    3343, /* CD5E (52574) */
-    3343, /* CD5F (52575) */
-    3343, /* CD60 (52576) */
-    3343, /* CD61 (52577) */
-    3343, /* CD62 (52578) */
-    3343, /* CD63 (52579) */
-    3343, /* CD64 (52580) */
-    3343, /* CD65 (52581) */
-    3343, /* CD66 (52582) */
-    3343, /* CD67 (52583) */
-    3343, /* CD68 (52584) */
-    3343, /* CD69 (52585) */
-    3343, /* CD6A (52586) */
-    3343, /* CD6B (52587) */
-    3343, /* CD6C (52588) */
-    3343, /* CD6D (52589) */
-    3343, /* CD6E (52590) */
-    3343, /* CD6F (52591) */
-    3343, /* CD70 (52592) */
-    3343, /* CD71 (52593) */
-    3343, /* CD72 (52594) */
-    3343, /* CD73 (52595) */
-    3343, /* CD74 (52596) */
-    3343, /* CD75 (52597) */
-    3343, /* CD76 (52598) */
-    3343, /* CD77 (52599) */
-    3343, /* CD78 (52600) */
-    3343, /* CD79 (52601) */
-    3343, /* CD7A (52602) */
-    3343, /* CD7B (52603) */
-    3343, /* CD7C (52604) */
-    3343, /* CD7D (52605) */
-    3343, /* CD7E (52606) */
-    3343, /* CD7F (52607) */
-    3343, /* CD80 (52608) */
-    3343, /* CD81 (52609) */
-    3343, /* CD82 (52610) */
-    3343, /* CD83 (52611) */
-    3343, /* CD84 (52612) */
-    3343, /* CD85 (52613) */
-    3343, /* CD86 (52614) */
-    3343, /* CD87 (52615) */
-    3343, /* CD88 (52616) */
-    3343, /* CD89 (52617) */
-    3343, /* CD8A (52618) */
-    3343, /* CD8B (52619) */
-    3343, /* CD8C (52620) */
-    3343, /* CD8D (52621) */
-    3343, /* CD8E (52622) */
-    3343, /* CD8F (52623) */
-    3343, /* CD90 (52624) */
-    3343, /* CD91 (52625) */
-    3343, /* CD92 (52626) */
-    3343, /* CD93 (52627) */
-    3343, /* CD94 (52628) */
-    3343, /* CD95 (52629) */
-    3343, /* CD96 (52630) */
-    3343, /* CD97 (52631) */
-    3343, /* CD98 (52632) */
-    3343, /* CD99 (52633) */
-    3343, /* CD9A (52634) */
-    3343, /* CD9B (52635) */
-    3343, /* CD9C (52636) */
-    3343, /* CD9D (52637) */
-    3343, /* CD9E (52638) */
-    3343, /* CD9F (52639) */
-    3343, /* CDA0 (52640) */
-    3343, /* CDA1 (52641) */
-    3343, /* CDA2 (52642) */
-    3343, /* CDA3 (52643) */
-    3343, /* CDA4 (52644) */
-    3343, /* CDA5 (52645) */
-    3343, /* CDA6 (52646) */
-    3343, /* CDA7 (52647) */
-    3343, /* CDA8 (52648) */
-    3343, /* CDA9 (52649) */
-    3343, /* CDAA (52650) */
-    3343, /* CDAB (52651) */
-    3343, /* CDAC (52652) */
-    3343, /* CDAD (52653) */
-    3343, /* CDAE (52654) */
-    3343, /* CDAF (52655) */
-    3343, /* CDB0 (52656) */
-    3343, /* CDB1 (52657) */
-    3343, /* CDB2 (52658) */
-    3343, /* CDB3 (52659) */
-    3343, /* CDB4 (52660) */
-    3343, /* CDB5 (52661) */
-    3343, /* CDB6 (52662) */
-    3343, /* CDB7 (52663) */
-    3343, /* CDB8 (52664) */
-    3343, /* CDB9 (52665) */
-    3343, /* CDBA (52666) */
-    3343, /* CDBB (52667) */
-    3343, /* CDBC (52668) */
-    3343, /* CDBD (52669) */
-    3343, /* CDBE (52670) */
-    3343, /* CDBF (52671) */
-    3343, /* CDC0 (52672) */
-    3343, /* CDC1 (52673) */
-    3343, /* CDC2 (52674) */
-    3343, /* CDC3 (52675) */
-    3343, /* CDC4 (52676) */
-    3343, /* CDC5 (52677) */
-    3343, /* CDC6 (52678) */
-    3343, /* CDC7 (52679) */
-    3343, /* CDC8 (52680) */
-    3343, /* CDC9 (52681) */
-    3343, /* CDCA (52682) */
-    3343, /* CDCB (52683) */
-    3343, /* CDCC (52684) */
-    3343, /* CDCD (52685) */
-    3343, /* CDCE (52686) */
-    3343, /* CDCF (52687) */
-    3343, /* CDD0 (52688) */
-    3343, /* CDD1 (52689) */
-    3343, /* CDD2 (52690) */
-    3343, /* CDD3 (52691) */
-    3343, /* CDD4 (52692) */
-    3343, /* CDD5 (52693) */
-    3343, /* CDD6 (52694) */
-    3343, /* CDD7 (52695) */
-    3343, /* CDD8 (52696) */
-    3343, /* CDD9 (52697) */
-    3343, /* CDDA (52698) */
-    3343, /* CDDB (52699) */
-    3343, /* CDDC (52700) */
-    3343, /* CDDD (52701) */
-    3343, /* CDDE (52702) */
-    3343, /* CDDF (52703) */
-    3343, /* CDE0 (52704) */
-    3343, /* CDE1 (52705) */
-    3343, /* CDE2 (52706) */
-    3343, /* CDE3 (52707) */
-    3343, /* CDE4 (52708) */
-    3343, /* CDE5 (52709) */
-    3343, /* CDE6 (52710) */
-    3343, /* CDE7 (52711) */
-    3343, /* CDE8 (52712) */
-    3343, /* CDE9 (52713) */
-    3343, /* CDEA (52714) */
-    3343, /* CDEB (52715) */
-    3343, /* CDEC (52716) */
-    3343, /* CDED (52717) */
-    3343, /* CDEE (52718) */
-    3343, /* CDEF (52719) */
-    3343, /* CDF0 (52720) */
-    3343, /* CDF1 (52721) */
-    3343, /* CDF2 (52722) */
-    3343, /* CDF3 (52723) */
-    3343, /* CDF4 (52724) */
-    3343, /* CDF5 (52725) */
-    3343, /* CDF6 (52726) */
-    3343, /* CDF7 (52727) */
-    3343, /* CDF8 (52728) */
-    3343, /* CDF9 (52729) */
-    3343, /* CDFA (52730) */
-    3343, /* CDFB (52731) */
-    3343, /* CDFC (52732) */
-    3343, /* CDFD (52733) */
-    3343, /* CDFE (52734) */
-    3343, /* CDFF (52735) */
-    3343, /* CE00 (52736) */
-    3343, /* CE01 (52737) */
-    3343, /* CE02 (52738) */
-    3343, /* CE03 (52739) */
-    3343, /* CE04 (52740) */
-    3343, /* CE05 (52741) */
-    3343, /* CE06 (52742) */
-    3343, /* CE07 (52743) */
-    3343, /* CE08 (52744) */
-    3343, /* CE09 (52745) */
-    3343, /* CE0A (52746) */
-    3343, /* CE0B (52747) */
-    3343, /* CE0C (52748) */
-    3343, /* CE0D (52749) */
-    3343, /* CE0E (52750) */
-    3343, /* CE0F (52751) */
-    3343, /* CE10 (52752) */
-    3343, /* CE11 (52753) */
-    3343, /* CE12 (52754) */
-    3343, /* CE13 (52755) */
-    3343, /* CE14 (52756) */
-    3343, /* CE15 (52757) */
-    3343, /* CE16 (52758) */
-    3343, /* CE17 (52759) */
-    3343, /* CE18 (52760) */
-    3343, /* CE19 (52761) */
-    3343, /* CE1A (52762) */
-    3343, /* CE1B (52763) */
-    3343, /* CE1C (52764) */
-    3343, /* CE1D (52765) */
-    3343, /* CE1E (52766) */
-    3343, /* CE1F (52767) */
-    3343, /* CE20 (52768) */
-    3343, /* CE21 (52769) */
-    3343, /* CE22 (52770) */
-    3343, /* CE23 (52771) */
-    3343, /* CE24 (52772) */
-    3343, /* CE25 (52773) */
-    3343, /* CE26 (52774) */
-    3343, /* CE27 (52775) */
-    3343, /* CE28 (52776) */
-    3343, /* CE29 (52777) */
-    3343, /* CE2A (52778) */
-    3343, /* CE2B (52779) */
-    3343, /* CE2C (52780) */
-    3343, /* CE2D (52781) */
-    3343, /* CE2E (52782) */
-    3343, /* CE2F (52783) */
-    3343, /* CE30 (52784) */
-    3343, /* CE31 (52785) */
-    3343, /* CE32 (52786) */
-    3343, /* CE33 (52787) */
-    3343, /* CE34 (52788) */
-    3343, /* CE35 (52789) */
-    3343, /* CE36 (52790) */
-    3343, /* CE37 (52791) */
-    3343, /* CE38 (52792) */
-    3343, /* CE39 (52793) */
-    3343, /* CE3A (52794) */
-    3343, /* CE3B (52795) */
-    3343, /* CE3C (52796) */
-    3343, /* CE3D (52797) */
-    3343, /* CE3E (52798) */
-    3343, /* CE3F (52799) */
-    3343, /* CE40 (52800) */
-    3343, /* CE41 (52801) */
-    3343, /* CE42 (52802) */
-    3343, /* CE43 (52803) */
-    3343, /* CE44 (52804) */
-    3343, /* CE45 (52805) */
-    3343, /* CE46 (52806) */
-    3343, /* CE47 (52807) */
-    3343, /* CE48 (52808) */
-    3343, /* CE49 (52809) */
-    3343, /* CE4A (52810) */
-    3343, /* CE4B (52811) */
-    3343, /* CE4C (52812) */
-    3343, /* CE4D (52813) */
-    3343, /* CE4E (52814) */
-    3343, /* CE4F (52815) */
-    3343, /* CE50 (52816) */
-    3343, /* CE51 (52817) */
-    3343, /* CE52 (52818) */
-    3343, /* CE53 (52819) */
-    3343, /* CE54 (52820) */
-    3343, /* CE55 (52821) */
-    3343, /* CE56 (52822) */
-    3343, /* CE57 (52823) */
-    3343, /* CE58 (52824) */
-    3343, /* CE59 (52825) */
-    3343, /* CE5A (52826) */
-    3343, /* CE5B (52827) */
-    3343, /* CE5C (52828) */
-    3343, /* CE5D (52829) */
-    3343, /* CE5E (52830) */
-    3343, /* CE5F (52831) */
-    3343, /* CE60 (52832) */
-    3343, /* CE61 (52833) */
-    3343, /* CE62 (52834) */
-    3343, /* CE63 (52835) */
-    3343, /* CE64 (52836) */
-    3343, /* CE65 (52837) */
-    3343, /* CE66 (52838) */
-    3343, /* CE67 (52839) */
-    3343, /* CE68 (52840) */
-    3343, /* CE69 (52841) */
-    3343, /* CE6A (52842) */
-    3343, /* CE6B (52843) */
-    3343, /* CE6C (52844) */
-    3343, /* CE6D (52845) */
-    3343, /* CE6E (52846) */
-    3343, /* CE6F (52847) */
-    3343, /* CE70 (52848) */
-    3343, /* CE71 (52849) */
-    3343, /* CE72 (52850) */
-    3343, /* CE73 (52851) */
-    3343, /* CE74 (52852) */
-    3343, /* CE75 (52853) */
-    3343, /* CE76 (52854) */
-    3343, /* CE77 (52855) */
-    3343, /* CE78 (52856) */
-    3343, /* CE79 (52857) */
-    3343, /* CE7A (52858) */
-    3343, /* CE7B (52859) */
-    3343, /* CE7C (52860) */
-    3343, /* CE7D (52861) */
-    3343, /* CE7E (52862) */
-    3343, /* CE7F (52863) */
-    3343, /* CE80 (52864) */
-    3343, /* CE81 (52865) */
-    3343, /* CE82 (52866) */
-    3343, /* CE83 (52867) */
-    3343, /* CE84 (52868) */
-    3343, /* CE85 (52869) */
-    3343, /* CE86 (52870) */
-    3343, /* CE87 (52871) */
-    3343, /* CE88 (52872) */
-    3343, /* CE89 (52873) */
-    3343, /* CE8A (52874) */
-    3343, /* CE8B (52875) */
-    3343, /* CE8C (52876) */
-    3343, /* CE8D (52877) */
-    3343, /* CE8E (52878) */
-    3343, /* CE8F (52879) */
-    3343, /* CE90 (52880) */
-    3343, /* CE91 (52881) */
-    3343, /* CE92 (52882) */
-    3343, /* CE93 (52883) */
-    3343, /* CE94 (52884) */
-    3343, /* CE95 (52885) */
-    3343, /* CE96 (52886) */
-    3343, /* CE97 (52887) */
-    3343, /* CE98 (52888) */
-    3343, /* CE99 (52889) */
-    3343, /* CE9A (52890) */
-    3343, /* CE9B (52891) */
-    3343, /* CE9C (52892) */
-    3343, /* CE9D (52893) */
-    3343, /* CE9E (52894) */
-    3343, /* CE9F (52895) */
-    3343, /* CEA0 (52896) */
-    3343, /* CEA1 (52897) */
-    3343, /* CEA2 (52898) */
-    3343, /* CEA3 (52899) */
-    3343, /* CEA4 (52900) */
-    3343, /* CEA5 (52901) */
-    3343, /* CEA6 (52902) */
-    3343, /* CEA7 (52903) */
-    3343, /* CEA8 (52904) */
-    3343, /* CEA9 (52905) */
-    3343, /* CEAA (52906) */
-    3343, /* CEAB (52907) */
-    3343, /* CEAC (52908) */
-    3343, /* CEAD (52909) */
-    3343, /* CEAE (52910) */
-    3343, /* CEAF (52911) */
-    3343, /* CEB0 (52912) */
-    3343, /* CEB1 (52913) */
-    3343, /* CEB2 (52914) */
-    3343, /* CEB3 (52915) */
-    3343, /* CEB4 (52916) */
-    3343, /* CEB5 (52917) */
-    3343, /* CEB6 (52918) */
-    3343, /* CEB7 (52919) */
-    3343, /* CEB8 (52920) */
-    3343, /* CEB9 (52921) */
-    3343, /* CEBA (52922) */
-    3343, /* CEBB (52923) */
-    3343, /* CEBC (52924) */
-    3343, /* CEBD (52925) */
-    3343, /* CEBE (52926) */
-    3343, /* CEBF (52927) */
-    3343, /* CEC0 (52928) */
-    3343, /* CEC1 (52929) */
-    3343, /* CEC2 (52930) */
-    3343, /* CEC3 (52931) */
-    3343, /* CEC4 (52932) */
-    3343, /* CEC5 (52933) */
-    3343, /* CEC6 (52934) */
-    3343, /* CEC7 (52935) */
-    3343, /* CEC8 (52936) */
-    3343, /* CEC9 (52937) */
-    3343, /* CECA (52938) */
-    3343, /* CECB (52939) */
-    3343, /* CECC (52940) */
-    3343, /* CECD (52941) */
-    3343, /* CECE (52942) */
-    3343, /* CECF (52943) */
-    3343, /* CED0 (52944) */
-    3343, /* CED1 (52945) */
-    3343, /* CED2 (52946) */
-    3343, /* CED3 (52947) */
-    3343, /* CED4 (52948) */
-    3343, /* CED5 (52949) */
-    3343, /* CED6 (52950) */
-    3343, /* CED7 (52951) */
-    3343, /* CED8 (52952) */
-    3343, /* CED9 (52953) */
-    3343, /* CEDA (52954) */
-    3343, /* CEDB (52955) */
-    3343, /* CEDC (52956) */
-    3343, /* CEDD (52957) */
-    3343, /* CEDE (52958) */
-    3343, /* CEDF (52959) */
-    3343, /* CEE0 (52960) */
-    3343, /* CEE1 (52961) */
-    3343, /* CEE2 (52962) */
-    3343, /* CEE3 (52963) */
-    3343, /* CEE4 (52964) */
-    3343, /* CEE5 (52965) */
-    3343, /* CEE6 (52966) */
-    3343, /* CEE7 (52967) */
-    3343, /* CEE8 (52968) */
-    3343, /* CEE9 (52969) */
-    3343, /* CEEA (52970) */
-    3343, /* CEEB (52971) */
-    3343, /* CEEC (52972) */
-    3343, /* CEED (52973) */
-    3343, /* CEEE (52974) */
-    3343, /* CEEF (52975) */
-    3343, /* CEF0 (52976) */
-    3343, /* CEF1 (52977) */
-    3343, /* CEF2 (52978) */
-    3343, /* CEF3 (52979) */
-    3343, /* CEF4 (52980) */
-    3343, /* CEF5 (52981) */
-    3343, /* CEF6 (52982) */
-    3343, /* CEF7 (52983) */
-    3343, /* CEF8 (52984) */
-    3343, /* CEF9 (52985) */
-    3343, /* CEFA (52986) */
-    3343, /* CEFB (52987) */
-    3343, /* CEFC (52988) */
-    3343, /* CEFD (52989) */
-    3343, /* CEFE (52990) */
-    3343, /* CEFF (52991) */
-    3343, /* CF00 (52992) */
-    3343, /* CF01 (52993) */
-    3343, /* CF02 (52994) */
-    3343, /* CF03 (52995) */
-    3343, /* CF04 (52996) */
-    3343, /* CF05 (52997) */
-    3343, /* CF06 (52998) */
-    3343, /* CF07 (52999) */
-    3343, /* CF08 (53000) */
-    3343, /* CF09 (53001) */
-    3343, /* CF0A (53002) */
-    3343, /* CF0B (53003) */
-    3343, /* CF0C (53004) */
-    3343, /* CF0D (53005) */
-    3343, /* CF0E (53006) */
-    3343, /* CF0F (53007) */
-    3343, /* CF10 (53008) */
-    3343, /* CF11 (53009) */
-    3343, /* CF12 (53010) */
-    3343, /* CF13 (53011) */
-    3343, /* CF14 (53012) */
-    3343, /* CF15 (53013) */
-    3343, /* CF16 (53014) */
-    3343, /* CF17 (53015) */
-    3343, /* CF18 (53016) */
-    3343, /* CF19 (53017) */
-    3343, /* CF1A (53018) */
-    3343, /* CF1B (53019) */
-    3343, /* CF1C (53020) */
-    3343, /* CF1D (53021) */
-    3343, /* CF1E (53022) */
-    3343, /* CF1F (53023) */
-    3343, /* CF20 (53024) */
-    3343, /* CF21 (53025) */
-    3343, /* CF22 (53026) */
-    3343, /* CF23 (53027) */
-    3343, /* CF24 (53028) */
-    3343, /* CF25 (53029) */
-    3343, /* CF26 (53030) */
-    3343, /* CF27 (53031) */
-    3343, /* CF28 (53032) */
-    3343, /* CF29 (53033) */
-    3343, /* CF2A (53034) */
-    3343, /* CF2B (53035) */
-    3343, /* CF2C (53036) */
-    3343, /* CF2D (53037) */
-    3343, /* CF2E (53038) */
-    3343, /* CF2F (53039) */
-    3343, /* CF30 (53040) */
-    3343, /* CF31 (53041) */
-    3343, /* CF32 (53042) */
-    3343, /* CF33 (53043) */
-    3343, /* CF34 (53044) */
-    3343, /* CF35 (53045) */
-    3343, /* CF36 (53046) */
-    3343, /* CF37 (53047) */
-    3343, /* CF38 (53048) */
-    3343, /* CF39 (53049) */
-    3343, /* CF3A (53050) */
-    3343, /* CF3B (53051) */
-    3343, /* CF3C (53052) */
-    3343, /* CF3D (53053) */
-    3343, /* CF3E (53054) */
-    3343, /* CF3F (53055) */
-    3343, /* CF40 (53056) */
-    3343, /* CF41 (53057) */
-    3343, /* CF42 (53058) */
-    3343, /* CF43 (53059) */
-    3343, /* CF44 (53060) */
-    3343, /* CF45 (53061) */
-    3343, /* CF46 (53062) */
-    3343, /* CF47 (53063) */
-    3343, /* CF48 (53064) */
-    3343, /* CF49 (53065) */
-    3343, /* CF4A (53066) */
-    3343, /* CF4B (53067) */
-    3343, /* CF4C (53068) */
-    3343, /* CF4D (53069) */
-    3343, /* CF4E (53070) */
-    3343, /* CF4F (53071) */
-    3343, /* CF50 (53072) */
-    3343, /* CF51 (53073) */
-    3343, /* CF52 (53074) */
-    3343, /* CF53 (53075) */
-    3343, /* CF54 (53076) */
-    3343, /* CF55 (53077) */
-    3343, /* CF56 (53078) */
-    3343, /* CF57 (53079) */
-    3343, /* CF58 (53080) */
-    3343, /* CF59 (53081) */
-    3343, /* CF5A (53082) */
-    3343, /* CF5B (53083) */
-    3343, /* CF5C (53084) */
-    3343, /* CF5D (53085) */
-    3343, /* CF5E (53086) */
-    3343, /* CF5F (53087) */
-    3343, /* CF60 (53088) */
-    3343, /* CF61 (53089) */
-    3343, /* CF62 (53090) */
-    3343, /* CF63 (53091) */
-    3343, /* CF64 (53092) */
-    3343, /* CF65 (53093) */
-    3343, /* CF66 (53094) */
-    3343, /* CF67 (53095) */
-    3343, /* CF68 (53096) */
-    3343, /* CF69 (53097) */
-    3343, /* CF6A (53098) */
-    3343, /* CF6B (53099) */
-    3343, /* CF6C (53100) */
-    3343, /* CF6D (53101) */
-    3343, /* CF6E (53102) */
-    3343, /* CF6F (53103) */
-    3343, /* CF70 (53104) */
-    3343, /* CF71 (53105) */
-    3343, /* CF72 (53106) */
-    3343, /* CF73 (53107) */
-    3343, /* CF74 (53108) */
-    3343, /* CF75 (53109) */
-    3343, /* CF76 (53110) */
-    3343, /* CF77 (53111) */
-    3343, /* CF78 (53112) */
-    3343, /* CF79 (53113) */
-    3343, /* CF7A (53114) */
-    3343, /* CF7B (53115) */
-    3343, /* CF7C (53116) */
-    3343, /* CF7D (53117) */
-    3343, /* CF7E (53118) */
-    3343, /* CF7F (53119) */
-    3343, /* CF80 (53120) */
-    3343, /* CF81 (53121) */
-    3343, /* CF82 (53122) */
-    3343, /* CF83 (53123) */
-    3343, /* CF84 (53124) */
-    3343, /* CF85 (53125) */
-    3343, /* CF86 (53126) */
-    3343, /* CF87 (53127) */
-    3343, /* CF88 (53128) */
-    3343, /* CF89 (53129) */
-    3343, /* CF8A (53130) */
-    3343, /* CF8B (53131) */
-    3343, /* CF8C (53132) */
-    3343, /* CF8D (53133) */
-    3343, /* CF8E (53134) */
-    3343, /* CF8F (53135) */
-    3343, /* CF90 (53136) */
-    3343, /* CF91 (53137) */
-    3343, /* CF92 (53138) */
-    3343, /* CF93 (53139) */
-    3343, /* CF94 (53140) */
-    3343, /* CF95 (53141) */
-    3343, /* CF96 (53142) */
-    3343, /* CF97 (53143) */
-    3343, /* CF98 (53144) */
-    3343, /* CF99 (53145) */
-    3343, /* CF9A (53146) */
-    3343, /* CF9B (53147) */
-    3343, /* CF9C (53148) */
-    3343, /* CF9D (53149) */
-    3343, /* CF9E (53150) */
-    3343, /* CF9F (53151) */
-    3343, /* CFA0 (53152) */
-    3343, /* CFA1 (53153) */
-    3343, /* CFA2 (53154) */
-    3343, /* CFA3 (53155) */
-    3343, /* CFA4 (53156) */
-    3343, /* CFA5 (53157) */
-    3343, /* CFA6 (53158) */
-    3343, /* CFA7 (53159) */
-    3343, /* CFA8 (53160) */
-    3343, /* CFA9 (53161) */
-    3343, /* CFAA (53162) */
-    3343, /* CFAB (53163) */
-    3343, /* CFAC (53164) */
-    3343, /* CFAD (53165) */
-    3343, /* CFAE (53166) */
-    3343, /* CFAF (53167) */
-    3343, /* CFB0 (53168) */
-    3343, /* CFB1 (53169) */
-    3343, /* CFB2 (53170) */
-    3343, /* CFB3 (53171) */
-    3343, /* CFB4 (53172) */
-    3343, /* CFB5 (53173) */
-    3343, /* CFB6 (53174) */
-    3343, /* CFB7 (53175) */
-    3343, /* CFB8 (53176) */
-    3343, /* CFB9 (53177) */
-    3343, /* CFBA (53178) */
-    3343, /* CFBB (53179) */
-    3343, /* CFBC (53180) */
-    3343, /* CFBD (53181) */
-    3343, /* CFBE (53182) */
-    3343, /* CFBF (53183) */
-    3343, /* CFC0 (53184) */
-    3343, /* CFC1 (53185) */
-    3343, /* CFC2 (53186) */
-    3343, /* CFC3 (53187) */
-    3343, /* CFC4 (53188) */
-    3343, /* CFC5 (53189) */
-    3343, /* CFC6 (53190) */
-    3343, /* CFC7 (53191) */
-    3343, /* CFC8 (53192) */
-    3343, /* CFC9 (53193) */
-    3343, /* CFCA (53194) */
-    3343, /* CFCB (53195) */
-    3343, /* CFCC (53196) */
-    3343, /* CFCD (53197) */
-    3343, /* CFCE (53198) */
-    3343, /* CFCF (53199) */
-    3343, /* CFD0 (53200) */
-    3343, /* CFD1 (53201) */
-    3343, /* CFD2 (53202) */
-    3343, /* CFD3 (53203) */
-    3343, /* CFD4 (53204) */
-    3343, /* CFD5 (53205) */
-    3343, /* CFD6 (53206) */
-    3343, /* CFD7 (53207) */
-    3343, /* CFD8 (53208) */
-    3343, /* CFD9 (53209) */
-    3343, /* CFDA (53210) */
-    3343, /* CFDB (53211) */
-    3343, /* CFDC (53212) */
-    3343, /* CFDD (53213) */
-    3343, /* CFDE (53214) */
-    3343, /* CFDF (53215) */
-    3343, /* CFE0 (53216) */
-    3343, /* CFE1 (53217) */
-    3343, /* CFE2 (53218) */
-    3343, /* CFE3 (53219) */
-    3343, /* CFE4 (53220) */
-    3343, /* CFE5 (53221) */
-    3343, /* CFE6 (53222) */
-    3343, /* CFE7 (53223) */
-    3343, /* CFE8 (53224) */
-    3343, /* CFE9 (53225) */
-    3343, /* CFEA (53226) */
-    3343, /* CFEB (53227) */
-    3343, /* CFEC (53228) */
-    3343, /* CFED (53229) */
-    3343, /* CFEE (53230) */
-    3343, /* CFEF (53231) */
-    3343, /* CFF0 (53232) */
-    3343, /* CFF1 (53233) */
-    3343, /* CFF2 (53234) */
-    3343, /* CFF3 (53235) */
-    3343, /* CFF4 (53236) */
-    3343, /* CFF5 (53237) */
-    3343, /* CFF6 (53238) */
-    3343, /* CFF7 (53239) */
-    3343, /* CFF8 (53240) */
-    3343, /* CFF9 (53241) */
-    3343, /* CFFA (53242) */
-    3343, /* CFFB (53243) */
-    3343, /* CFFC (53244) */
-    3343, /* CFFD (53245) */
-    3343, /* CFFE (53246) */
-    3343, /* CFFF (53247) */
-    3343, /* D000 (53248) */
-    3343, /* D001 (53249) */
-    3343, /* D002 (53250) */
-    3343, /* D003 (53251) */
-    3343, /* D004 (53252) */
-    3343, /* D005 (53253) */
-    3343, /* D006 (53254) */
-    3343, /* D007 (53255) */
-    3343, /* D008 (53256) */
-    3343, /* D009 (53257) */
-    3343, /* D00A (53258) */
-    3343, /* D00B (53259) */
-    3343, /* D00C (53260) */
-    3343, /* D00D (53261) */
-    3343, /* D00E (53262) */
-    3343, /* D00F (53263) */
-    3343, /* D010 (53264) */
-    3343, /* D011 (53265) */
-    3343, /* D012 (53266) */
-    3343, /* D013 (53267) */
-    3343, /* D014 (53268) */
-    3343, /* D015 (53269) */
-    3343, /* D016 (53270) */
-    3343, /* D017 (53271) */
-    3343, /* D018 (53272) */
-    3343, /* D019 (53273) */
-    3343, /* D01A (53274) */
-    3343, /* D01B (53275) */
-    3343, /* D01C (53276) */
-    3343, /* D01D (53277) */
-    3343, /* D01E (53278) */
-    3343, /* D01F (53279) */
-    3343, /* D020 (53280) */
-    3343, /* D021 (53281) */
-    3343, /* D022 (53282) */
-    3343, /* D023 (53283) */
-    3343, /* D024 (53284) */
-    3343, /* D025 (53285) */
-    3343, /* D026 (53286) */
-    3343, /* D027 (53287) */
-    3343, /* D028 (53288) */
-    3343, /* D029 (53289) */
-    3343, /* D02A (53290) */
-    3343, /* D02B (53291) */
-    3343, /* D02C (53292) */
-    3343, /* D02D (53293) */
-    3343, /* D02E (53294) */
-    3343, /* D02F (53295) */
-    3343, /* D030 (53296) */
-    3343, /* D031 (53297) */
-    3343, /* D032 (53298) */
-    3343, /* D033 (53299) */
-    3343, /* D034 (53300) */
-    3343, /* D035 (53301) */
-    3343, /* D036 (53302) */
-    3343, /* D037 (53303) */
-    3343, /* D038 (53304) */
-    3343, /* D039 (53305) */
-    3343, /* D03A (53306) */
-    3343, /* D03B (53307) */
-    3343, /* D03C (53308) */
-    3343, /* D03D (53309) */
-    3343, /* D03E (53310) */
-    3343, /* D03F (53311) */
-    3343, /* D040 (53312) */
-    3343, /* D041 (53313) */
-    3343, /* D042 (53314) */
-    3343, /* D043 (53315) */
-    3343, /* D044 (53316) */
-    3343, /* D045 (53317) */
-    3343, /* D046 (53318) */
-    3343, /* D047 (53319) */
-    3343, /* D048 (53320) */
-    3343, /* D049 (53321) */
-    3343, /* D04A (53322) */
-    3343, /* D04B (53323) */
-    3343, /* D04C (53324) */
-    3343, /* D04D (53325) */
-    3343, /* D04E (53326) */
-    3343, /* D04F (53327) */
-    3343, /* D050 (53328) */
-    3343, /* D051 (53329) */
-    3343, /* D052 (53330) */
-    3343, /* D053 (53331) */
-    3343, /* D054 (53332) */
-    3343, /* D055 (53333) */
-    3343, /* D056 (53334) */
-    3343, /* D057 (53335) */
-    3343, /* D058 (53336) */
-    3343, /* D059 (53337) */
-    3343, /* D05A (53338) */
-    3343, /* D05B (53339) */
-    3343, /* D05C (53340) */
-    3343, /* D05D (53341) */
-    3343, /* D05E (53342) */
-    3343, /* D05F (53343) */
-    3343, /* D060 (53344) */
-    3343, /* D061 (53345) */
-    3343, /* D062 (53346) */
-    3343, /* D063 (53347) */
-    3343, /* D064 (53348) */
-    3343, /* D065 (53349) */
-    3343, /* D066 (53350) */
-    3343, /* D067 (53351) */
-    3343, /* D068 (53352) */
-    3343, /* D069 (53353) */
-    3343, /* D06A (53354) */
-    3343, /* D06B (53355) */
-    3343, /* D06C (53356) */
-    3343, /* D06D (53357) */
-    3343, /* D06E (53358) */
-    3343, /* D06F (53359) */
-    3343, /* D070 (53360) */
-    3343, /* D071 (53361) */
-    3343, /* D072 (53362) */
-    3343, /* D073 (53363) */
-    3343, /* D074 (53364) */
-    3343, /* D075 (53365) */
-    3343, /* D076 (53366) */
-    3343, /* D077 (53367) */
-    3343, /* D078 (53368) */
-    3343, /* D079 (53369) */
-    3343, /* D07A (53370) */
-    3343, /* D07B (53371) */
-    3343, /* D07C (53372) */
-    3343, /* D07D (53373) */
-    3343, /* D07E (53374) */
-    3343, /* D07F (53375) */
-    3343, /* D080 (53376) */
-    3343, /* D081 (53377) */
-    3343, /* D082 (53378) */
-    3343, /* D083 (53379) */
-    3343, /* D084 (53380) */
-    3343, /* D085 (53381) */
-    3343, /* D086 (53382) */
-    3343, /* D087 (53383) */
-    3343, /* D088 (53384) */
-    3343, /* D089 (53385) */
-    3343, /* D08A (53386) */
-    3343, /* D08B (53387) */
-    3343, /* D08C (53388) */
-    3343, /* D08D (53389) */
-    3343, /* D08E (53390) */
-    3343, /* D08F (53391) */
-    3343, /* D090 (53392) */
-    3343, /* D091 (53393) */
-    3343, /* D092 (53394) */
-    3343, /* D093 (53395) */
-    3343, /* D094 (53396) */
-    3343, /* D095 (53397) */
-    3343, /* D096 (53398) */
-    3343, /* D097 (53399) */
-    3343, /* D098 (53400) */
-    3343, /* D099 (53401) */
-    3343, /* D09A (53402) */
-    3343, /* D09B (53403) */
-    3343, /* D09C (53404) */
-    3343, /* D09D (53405) */
-    3343, /* D09E (53406) */
-    3343, /* D09F (53407) */
-    3343, /* D0A0 (53408) */
-    3343, /* D0A1 (53409) */
-    3343, /* D0A2 (53410) */
-    3343, /* D0A3 (53411) */
-    3343, /* D0A4 (53412) */
-    3343, /* D0A5 (53413) */
-    3343, /* D0A6 (53414) */
-    3343, /* D0A7 (53415) */
-    3343, /* D0A8 (53416) */
-    3343, /* D0A9 (53417) */
-    3343, /* D0AA (53418) */
-    3343, /* D0AB (53419) */
-    3343, /* D0AC (53420) */
-    3343, /* D0AD (53421) */
-    3343, /* D0AE (53422) */
-    3343, /* D0AF (53423) */
-    3343, /* D0B0 (53424) */
-    3343, /* D0B1 (53425) */
-    3343, /* D0B2 (53426) */
-    3343, /* D0B3 (53427) */
-    3343, /* D0B4 (53428) */
-    3343, /* D0B5 (53429) */
-    3343, /* D0B6 (53430) */
-    3343, /* D0B7 (53431) */
-    3343, /* D0B8 (53432) */
-    3343, /* D0B9 (53433) */
-    3343, /* D0BA (53434) */
-    3343, /* D0BB (53435) */
-    3343, /* D0BC (53436) */
-    3343, /* D0BD (53437) */
-    3343, /* D0BE (53438) */
-    3343, /* D0BF (53439) */
-    3343, /* D0C0 (53440) */
-    3343, /* D0C1 (53441) */
-    3343, /* D0C2 (53442) */
-    3343, /* D0C3 (53443) */
-    3343, /* D0C4 (53444) */
-    3343, /* D0C5 (53445) */
-    3343, /* D0C6 (53446) */
-    3343, /* D0C7 (53447) */
-    3343, /* D0C8 (53448) */
-    3343, /* D0C9 (53449) */
-    3343, /* D0CA (53450) */
-    3343, /* D0CB (53451) */
-    3343, /* D0CC (53452) */
-    3343, /* D0CD (53453) */
-    3343, /* D0CE (53454) */
-    3343, /* D0CF (53455) */
-    3343, /* D0D0 (53456) */
-    3343, /* D0D1 (53457) */
-    3343, /* D0D2 (53458) */
-    3343, /* D0D3 (53459) */
-    3343, /* D0D4 (53460) */
-    3343, /* D0D5 (53461) */
-    3343, /* D0D6 (53462) */
-    3343, /* D0D7 (53463) */
-    3343, /* D0D8 (53464) */
-    3343, /* D0D9 (53465) */
-    3343, /* D0DA (53466) */
-    3343, /* D0DB (53467) */
-    3343, /* D0DC (53468) */
-    3343, /* D0DD (53469) */
-    3343, /* D0DE (53470) */
-    3343, /* D0DF (53471) */
-    3343, /* D0E0 (53472) */
-    3343, /* D0E1 (53473) */
-    3343, /* D0E2 (53474) */
-    3343, /* D0E3 (53475) */
-    3343, /* D0E4 (53476) */
-    3343, /* D0E5 (53477) */
-    3343, /* D0E6 (53478) */
-    3343, /* D0E7 (53479) */
-    3343, /* D0E8 (53480) */
-    3343, /* D0E9 (53481) */
-    3343, /* D0EA (53482) */
-    3343, /* D0EB (53483) */
-    3343, /* D0EC (53484) */
-    3343, /* D0ED (53485) */
-    3343, /* D0EE (53486) */
-    3343, /* D0EF (53487) */
-    3343, /* D0F0 (53488) */
-    3343, /* D0F1 (53489) */
-    3343, /* D0F2 (53490) */
-    3343, /* D0F3 (53491) */
-    3343, /* D0F4 (53492) */
-    3343, /* D0F5 (53493) */
-    3343, /* D0F6 (53494) */
-    3343, /* D0F7 (53495) */
-    3343, /* D0F8 (53496) */
-    3343, /* D0F9 (53497) */
-    3343, /* D0FA (53498) */
-    3343, /* D0FB (53499) */
-    3343, /* D0FC (53500) */
-    3343, /* D0FD (53501) */
-    3343, /* D0FE (53502) */
-    3343, /* D0FF (53503) */
-    3343, /* D100 (53504) */
-    3343, /* D101 (53505) */
-    3343, /* D102 (53506) */
-    3343, /* D103 (53507) */
-    3343, /* D104 (53508) */
-    3343, /* D105 (53509) */
-    3343, /* D106 (53510) */
-    3343, /* D107 (53511) */
-    3343, /* D108 (53512) */
-    3343, /* D109 (53513) */
-    3343, /* D10A (53514) */
-    3343, /* D10B (53515) */
-    3343, /* D10C (53516) */
-    3343, /* D10D (53517) */
-    3343, /* D10E (53518) */
-    3343, /* D10F (53519) */
-    3343, /* D110 (53520) */
-    3343, /* D111 (53521) */
-    3343, /* D112 (53522) */
-    3343, /* D113 (53523) */
-    3343, /* D114 (53524) */
-    3343, /* D115 (53525) */
-    3343, /* D116 (53526) */
-    3343, /* D117 (53527) */
-    3343, /* D118 (53528) */
-    3343, /* D119 (53529) */
-    3343, /* D11A (53530) */
-    3343, /* D11B (53531) */
-    3343, /* D11C (53532) */
-    3343, /* D11D (53533) */
-    3343, /* D11E (53534) */
-    3343, /* D11F (53535) */
-    3343, /* D120 (53536) */
-    3343, /* D121 (53537) */
-    3343, /* D122 (53538) */
-    3343, /* D123 (53539) */
-    3343, /* D124 (53540) */
-    3343, /* D125 (53541) */
-    3343, /* D126 (53542) */
-    3343, /* D127 (53543) */
-    3343, /* D128 (53544) */
-    3343, /* D129 (53545) */
-    3343, /* D12A (53546) */
-    3343, /* D12B (53547) */
-    3343, /* D12C (53548) */
-    3343, /* D12D (53549) */
-    3343, /* D12E (53550) */
-    3343, /* D12F (53551) */
-    3343, /* D130 (53552) */
-    3343, /* D131 (53553) */
-    3343, /* D132 (53554) */
-    3343, /* D133 (53555) */
-    3343, /* D134 (53556) */
-    3343, /* D135 (53557) */
-    3343, /* D136 (53558) */
-    3343, /* D137 (53559) */
-    3343, /* D138 (53560) */
-    3343, /* D139 (53561) */
-    3343, /* D13A (53562) */
-    3343, /* D13B (53563) */
-    3343, /* D13C (53564) */
-    3343, /* D13D (53565) */
-    3343, /* D13E (53566) */
-    3343, /* D13F (53567) */
-    3343, /* D140 (53568) */
-    3343, /* D141 (53569) */
-    3343, /* D142 (53570) */
-    3343, /* D143 (53571) */
-    3343, /* D144 (53572) */
-    3343, /* D145 (53573) */
-    3343, /* D146 (53574) */
-    3343, /* D147 (53575) */
-    3343, /* D148 (53576) */
-    3343, /* D149 (53577) */
-    3343, /* D14A (53578) */
-    3343, /* D14B (53579) */
-    3343, /* D14C (53580) */
-    3343, /* D14D (53581) */
-    3343, /* D14E (53582) */
-    3343, /* D14F (53583) */
-    3343, /* D150 (53584) */
-    3343, /* D151 (53585) */
-    3343, /* D152 (53586) */
-    3343, /* D153 (53587) */
-    3343, /* D154 (53588) */
-    3343, /* D155 (53589) */
-    3343, /* D156 (53590) */
-    3343, /* D157 (53591) */
-    3343, /* D158 (53592) */
-    3343, /* D159 (53593) */
-    3343, /* D15A (53594) */
-    3343, /* D15B (53595) */
-    3343, /* D15C (53596) */
-    3343, /* D15D (53597) */
-    3343, /* D15E (53598) */
-    3343, /* D15F (53599) */
-    3343, /* D160 (53600) */
-    3343, /* D161 (53601) */
-    3343, /* D162 (53602) */
-    3343, /* D163 (53603) */
-    3343, /* D164 (53604) */
-    3343, /* D165 (53605) */
-    3343, /* D166 (53606) */
-    3343, /* D167 (53607) */
-    3343, /* D168 (53608) */
-    3343, /* D169 (53609) */
-    3343, /* D16A (53610) */
-    3343, /* D16B (53611) */
-    3343, /* D16C (53612) */
-    3343, /* D16D (53613) */
-    3343, /* D16E (53614) */
-    3343, /* D16F (53615) */
-    3343, /* D170 (53616) */
-    3343, /* D171 (53617) */
-    3343, /* D172 (53618) */
-    3343, /* D173 (53619) */
-    3343, /* D174 (53620) */
-    3343, /* D175 (53621) */
-    3343, /* D176 (53622) */
-    3343, /* D177 (53623) */
-    3343, /* D178 (53624) */
-    3343, /* D179 (53625) */
-    3343, /* D17A (53626) */
-    3343, /* D17B (53627) */
-    3343, /* D17C (53628) */
-    3343, /* D17D (53629) */
-    3343, /* D17E (53630) */
-    3343, /* D17F (53631) */
-    3343, /* D180 (53632) */
-    3343, /* D181 (53633) */
-    3343, /* D182 (53634) */
-    3343, /* D183 (53635) */
-    3343, /* D184 (53636) */
-    3343, /* D185 (53637) */
-    3343, /* D186 (53638) */
-    3343, /* D187 (53639) */
-    3343, /* D188 (53640) */
-    3343, /* D189 (53641) */
-    3343, /* D18A (53642) */
-    3343, /* D18B (53643) */
-    3343, /* D18C (53644) */
-    3343, /* D18D (53645) */
-    3343, /* D18E (53646) */
-    3343, /* D18F (53647) */
-    3343, /* D190 (53648) */
-    3343, /* D191 (53649) */
-    3343, /* D192 (53650) */
-    3343, /* D193 (53651) */
-    3343, /* D194 (53652) */
-    3343, /* D195 (53653) */
-    3343, /* D196 (53654) */
-    3343, /* D197 (53655) */
-    3343, /* D198 (53656) */
-    3343, /* D199 (53657) */
-    3343, /* D19A (53658) */
-    3343, /* D19B (53659) */
-    3343, /* D19C (53660) */
-    3343, /* D19D (53661) */
-    3343, /* D19E (53662) */
-    3343, /* D19F (53663) */
-    3343, /* D1A0 (53664) */
-    3343, /* D1A1 (53665) */
-    3343, /* D1A2 (53666) */
-    3343, /* D1A3 (53667) */
-    3343, /* D1A4 (53668) */
-    3343, /* D1A5 (53669) */
-    3343, /* D1A6 (53670) */
-    3343, /* D1A7 (53671) */
-    3343, /* D1A8 (53672) */
-    3343, /* D1A9 (53673) */
-    3343, /* D1AA (53674) */
-    3343, /* D1AB (53675) */
-    3343, /* D1AC (53676) */
-    3343, /* D1AD (53677) */
-    3343, /* D1AE (53678) */
-    3343, /* D1AF (53679) */
-    3343, /* D1B0 (53680) */
-    3343, /* D1B1 (53681) */
-    3343, /* D1B2 (53682) */
-    3343, /* D1B3 (53683) */
-    3343, /* D1B4 (53684) */
-    3343, /* D1B5 (53685) */
-    3343, /* D1B6 (53686) */
-    3343, /* D1B7 (53687) */
-    3343, /* D1B8 (53688) */
-    3343, /* D1B9 (53689) */
-    3343, /* D1BA (53690) */
-    3343, /* D1BB (53691) */
-    3343, /* D1BC (53692) */
-    3343, /* D1BD (53693) */
-    3343, /* D1BE (53694) */
-    3343, /* D1BF (53695) */
-    3343, /* D1C0 (53696) */
-    3343, /* D1C1 (53697) */
-    3343, /* D1C2 (53698) */
-    3343, /* D1C3 (53699) */
-    3343, /* D1C4 (53700) */
-    3343, /* D1C5 (53701) */
-    3343, /* D1C6 (53702) */
-    3343, /* D1C7 (53703) */
-    3343, /* D1C8 (53704) */
-    3343, /* D1C9 (53705) */
-    3343, /* D1CA (53706) */
-    3343, /* D1CB (53707) */
-    3343, /* D1CC (53708) */
-    3343, /* D1CD (53709) */
-    3343, /* D1CE (53710) */
-    3343, /* D1CF (53711) */
-    3343, /* D1D0 (53712) */
-    3343, /* D1D1 (53713) */
-    3343, /* D1D2 (53714) */
-    3343, /* D1D3 (53715) */
-    3343, /* D1D4 (53716) */
-    3343, /* D1D5 (53717) */
-    3343, /* D1D6 (53718) */
-    3343, /* D1D7 (53719) */
-    3343, /* D1D8 (53720) */
-    3343, /* D1D9 (53721) */
-    3343, /* D1DA (53722) */
-    3343, /* D1DB (53723) */
-    3343, /* D1DC (53724) */
-    3343, /* D1DD (53725) */
-    3343, /* D1DE (53726) */
-    3343, /* D1DF (53727) */
-    3343, /* D1E0 (53728) */
-    3343, /* D1E1 (53729) */
-    3343, /* D1E2 (53730) */
-    3343, /* D1E3 (53731) */
-    3343, /* D1E4 (53732) */
-    3343, /* D1E5 (53733) */
-    3343, /* D1E6 (53734) */
-    3343, /* D1E7 (53735) */
-    3343, /* D1E8 (53736) */
-    3343, /* D1E9 (53737) */
-    3343, /* D1EA (53738) */
-    3343, /* D1EB (53739) */
-    3343, /* D1EC (53740) */
-    3343, /* D1ED (53741) */
-    3343, /* D1EE (53742) */
-    3343, /* D1EF (53743) */
-    3343, /* D1F0 (53744) */
-    3343, /* D1F1 (53745) */
-    3343, /* D1F2 (53746) */
-    3343, /* D1F3 (53747) */
-    3343, /* D1F4 (53748) */
-    3343, /* D1F5 (53749) */
-    3343, /* D1F6 (53750) */
-    3343, /* D1F7 (53751) */
-    3343, /* D1F8 (53752) */
-    3343, /* D1F9 (53753) */
-    3343, /* D1FA (53754) */
-    3343, /* D1FB (53755) */
-    3343, /* D1FC (53756) */
-    3343, /* D1FD (53757) */
-    3343, /* D1FE (53758) */
-    3343, /* D1FF (53759) */
-    3343, /* D200 (53760) */
-    3343, /* D201 (53761) */
-    3343, /* D202 (53762) */
-    3343, /* D203 (53763) */
-    3343, /* D204 (53764) */
-    3343, /* D205 (53765) */
-    3343, /* D206 (53766) */
-    3343, /* D207 (53767) */
-    3343, /* D208 (53768) */
-    3343, /* D209 (53769) */
-    3343, /* D20A (53770) */
-    3343, /* D20B (53771) */
-    3343, /* D20C (53772) */
-    3343, /* D20D (53773) */
-    3343, /* D20E (53774) */
-    3343, /* D20F (53775) */
-    3343, /* D210 (53776) */
-    3343, /* D211 (53777) */
-    3343, /* D212 (53778) */
-    3343, /* D213 (53779) */
-    3343, /* D214 (53780) */
-    3343, /* D215 (53781) */
-    3343, /* D216 (53782) */
-    3343, /* D217 (53783) */
-    3343, /* D218 (53784) */
-    3343, /* D219 (53785) */
-    3343, /* D21A (53786) */
-    3343, /* D21B (53787) */
-    3343, /* D21C (53788) */
-    3343, /* D21D (53789) */
-    3343, /* D21E (53790) */
-    3343, /* D21F (53791) */
-    3343, /* D220 (53792) */
-    3343, /* D221 (53793) */
-    3343, /* D222 (53794) */
-    3343, /* D223 (53795) */
-    3343, /* D224 (53796) */
-    3343, /* D225 (53797) */
-    3343, /* D226 (53798) */
-    3343, /* D227 (53799) */
-    3343, /* D228 (53800) */
-    3343, /* D229 (53801) */
-    3343, /* D22A (53802) */
-    3343, /* D22B (53803) */
-    3343, /* D22C (53804) */
-    3343, /* D22D (53805) */
-    3343, /* D22E (53806) */
-    3343, /* D22F (53807) */
-    3343, /* D230 (53808) */
-    3343, /* D231 (53809) */
-    3343, /* D232 (53810) */
-    3343, /* D233 (53811) */
-    3343, /* D234 (53812) */
-    3343, /* D235 (53813) */
-    3343, /* D236 (53814) */
-    3343, /* D237 (53815) */
-    3343, /* D238 (53816) */
-    3343, /* D239 (53817) */
-    3343, /* D23A (53818) */
-    3343, /* D23B (53819) */
-    3343, /* D23C (53820) */
-    3343, /* D23D (53821) */
-    3343, /* D23E (53822) */
-    3343, /* D23F (53823) */
-    3343, /* D240 (53824) */
-    3343, /* D241 (53825) */
-    3343, /* D242 (53826) */
-    3343, /* D243 (53827) */
-    3343, /* D244 (53828) */
-    3343, /* D245 (53829) */
-    3343, /* D246 (53830) */
-    3343, /* D247 (53831) */
-    3343, /* D248 (53832) */
-    3343, /* D249 (53833) */
-    3343, /* D24A (53834) */
-    3343, /* D24B (53835) */
-    3343, /* D24C (53836) */
-    3343, /* D24D (53837) */
-    3343, /* D24E (53838) */
-    3343, /* D24F (53839) */
-    3343, /* D250 (53840) */
-    3343, /* D251 (53841) */
-    3343, /* D252 (53842) */
-    3343, /* D253 (53843) */
-    3343, /* D254 (53844) */
-    3343, /* D255 (53845) */
-    3343, /* D256 (53846) */
-    3343, /* D257 (53847) */
-    3343, /* D258 (53848) */
-    3343, /* D259 (53849) */
-    3343, /* D25A (53850) */
-    3343, /* D25B (53851) */
-    3343, /* D25C (53852) */
-    3343, /* D25D (53853) */
-    3343, /* D25E (53854) */
-    3343, /* D25F (53855) */
-    3343, /* D260 (53856) */
-    3343, /* D261 (53857) */
-    3343, /* D262 (53858) */
-    3343, /* D263 (53859) */
-    3343, /* D264 (53860) */
-    3343, /* D265 (53861) */
-    3343, /* D266 (53862) */
-    3343, /* D267 (53863) */
-    3343, /* D268 (53864) */
-    3343, /* D269 (53865) */
-    3343, /* D26A (53866) */
-    3343, /* D26B (53867) */
-    3343, /* D26C (53868) */
-    3343, /* D26D (53869) */
-    3343, /* D26E (53870) */
-    3343, /* D26F (53871) */
-    3343, /* D270 (53872) */
-    3343, /* D271 (53873) */
-    3343, /* D272 (53874) */
-    3343, /* D273 (53875) */
-    3343, /* D274 (53876) */
-    3343, /* D275 (53877) */
-    3343, /* D276 (53878) */
-    3343, /* D277 (53879) */
-    3343, /* D278 (53880) */
-    3343, /* D279 (53881) */
-    3343, /* D27A (53882) */
-    3343, /* D27B (53883) */
-    3343, /* D27C (53884) */
-    3343, /* D27D (53885) */
-    3343, /* D27E (53886) */
-    3343, /* D27F (53887) */
-    3343, /* D280 (53888) */
-    3343, /* D281 (53889) */
-    3343, /* D282 (53890) */
-    3343, /* D283 (53891) */
-    3343, /* D284 (53892) */
-    3343, /* D285 (53893) */
-    3343, /* D286 (53894) */
-    3343, /* D287 (53895) */
-    3343, /* D288 (53896) */
-    3343, /* D289 (53897) */
-    3343, /* D28A (53898) */
-    3343, /* D28B (53899) */
-    3343, /* D28C (53900) */
-    3343, /* D28D (53901) */
-    3343, /* D28E (53902) */
-    3343, /* D28F (53903) */
-    3343, /* D290 (53904) */
-    3343, /* D291 (53905) */
-    3343, /* D292 (53906) */
-    3343, /* D293 (53907) */
-    3343, /* D294 (53908) */
-    3343, /* D295 (53909) */
-    3343, /* D296 (53910) */
-    3343, /* D297 (53911) */
-    3343, /* D298 (53912) */
-    3343, /* D299 (53913) */
-    3343, /* D29A (53914) */
-    3343, /* D29B (53915) */
-    3343, /* D29C (53916) */
-    3343, /* D29D (53917) */
-    3343, /* D29E (53918) */
-    3343, /* D29F (53919) */
-    3343, /* D2A0 (53920) */
-    3343, /* D2A1 (53921) */
-    3343, /* D2A2 (53922) */
-    3343, /* D2A3 (53923) */
-    3343, /* D2A4 (53924) */
-    3343, /* D2A5 (53925) */
-    3343, /* D2A6 (53926) */
-    3343, /* D2A7 (53927) */
-    3343, /* D2A8 (53928) */
-    3343, /* D2A9 (53929) */
-    3343, /* D2AA (53930) */
-    3343, /* D2AB (53931) */
-    3343, /* D2AC (53932) */
-    3343, /* D2AD (53933) */
-    3343, /* D2AE (53934) */
-    3343, /* D2AF (53935) */
-    3343, /* D2B0 (53936) */
-    3343, /* D2B1 (53937) */
-    3343, /* D2B2 (53938) */
-    3343, /* D2B3 (53939) */
-    3343, /* D2B4 (53940) */
-    3343, /* D2B5 (53941) */
-    3343, /* D2B6 (53942) */
-    3343, /* D2B7 (53943) */
-    3343, /* D2B8 (53944) */
-    3343, /* D2B9 (53945) */
-    3343, /* D2BA (53946) */
-    3343, /* D2BB (53947) */
-    3343, /* D2BC (53948) */
-    3343, /* D2BD (53949) */
-    3343, /* D2BE (53950) */
-    3343, /* D2BF (53951) */
-    3343, /* D2C0 (53952) */
-    3343, /* D2C1 (53953) */
-    3343, /* D2C2 (53954) */
-    3343, /* D2C3 (53955) */
-    3343, /* D2C4 (53956) */
-    3343, /* D2C5 (53957) */
-    3343, /* D2C6 (53958) */
-    3343, /* D2C7 (53959) */
-    3343, /* D2C8 (53960) */
-    3343, /* D2C9 (53961) */
-    3343, /* D2CA (53962) */
-    3343, /* D2CB (53963) */
-    3343, /* D2CC (53964) */
-    3343, /* D2CD (53965) */
-    3343, /* D2CE (53966) */
-    3343, /* D2CF (53967) */
-    3343, /* D2D0 (53968) */
-    3343, /* D2D1 (53969) */
-    3343, /* D2D2 (53970) */
-    3343, /* D2D3 (53971) */
-    3343, /* D2D4 (53972) */
-    3343, /* D2D5 (53973) */
-    3343, /* D2D6 (53974) */
-    3343, /* D2D7 (53975) */
-    3343, /* D2D8 (53976) */
-    3343, /* D2D9 (53977) */
-    3343, /* D2DA (53978) */
-    3343, /* D2DB (53979) */
-    3343, /* D2DC (53980) */
-    3343, /* D2DD (53981) */
-    3343, /* D2DE (53982) */
-    3343, /* D2DF (53983) */
-    3343, /* D2E0 (53984) */
-    3343, /* D2E1 (53985) */
-    3343, /* D2E2 (53986) */
-    3343, /* D2E3 (53987) */
-    3343, /* D2E4 (53988) */
-    3343, /* D2E5 (53989) */
-    3343, /* D2E6 (53990) */
-    3343, /* D2E7 (53991) */
-    3343, /* D2E8 (53992) */
-    3343, /* D2E9 (53993) */
-    3343, /* D2EA (53994) */
-    3343, /* D2EB (53995) */
-    3343, /* D2EC (53996) */
-    3343, /* D2ED (53997) */
-    3343, /* D2EE (53998) */
-    3343, /* D2EF (53999) */
-    3343, /* D2F0 (54000) */
-    3343, /* D2F1 (54001) */
-    3343, /* D2F2 (54002) */
-    3343, /* D2F3 (54003) */
-    3343, /* D2F4 (54004) */
-    3343, /* D2F5 (54005) */
-    3343, /* D2F6 (54006) */
-    3343, /* D2F7 (54007) */
-    3343, /* D2F8 (54008) */
-    3343, /* D2F9 (54009) */
-    3343, /* D2FA (54010) */
-    3343, /* D2FB (54011) */
-    3343, /* D2FC (54012) */
-    3343, /* D2FD (54013) */
-    3343, /* D2FE (54014) */
-    3343, /* D2FF (54015) */
-    3343, /* D300 (54016) */
-    3343, /* D301 (54017) */
-    3343, /* D302 (54018) */
-    3343, /* D303 (54019) */
-    3343, /* D304 (54020) */
-    3343, /* D305 (54021) */
-    3343, /* D306 (54022) */
-    3343, /* D307 (54023) */
-    3343, /* D308 (54024) */
-    3343, /* D309 (54025) */
-    3343, /* D30A (54026) */
-    3343, /* D30B (54027) */
-    3343, /* D30C (54028) */
-    3343, /* D30D (54029) */
-    3343, /* D30E (54030) */
-    3343, /* D30F (54031) */
-    3343, /* D310 (54032) */
-    3343, /* D311 (54033) */
-    3343, /* D312 (54034) */
-    3343, /* D313 (54035) */
-    3343, /* D314 (54036) */
-    3343, /* D315 (54037) */
-    3343, /* D316 (54038) */
-    3343, /* D317 (54039) */
-    3343, /* D318 (54040) */
-    3343, /* D319 (54041) */
-    3343, /* D31A (54042) */
-    3343, /* D31B (54043) */
-    3343, /* D31C (54044) */
-    3343, /* D31D (54045) */
-    3343, /* D31E (54046) */
-    3343, /* D31F (54047) */
-    3343, /* D320 (54048) */
-    3343, /* D321 (54049) */
-    3343, /* D322 (54050) */
-    3343, /* D323 (54051) */
-    3343, /* D324 (54052) */
-    3343, /* D325 (54053) */
-    3343, /* D326 (54054) */
-    3343, /* D327 (54055) */
-    3343, /* D328 (54056) */
-    3343, /* D329 (54057) */
-    3343, /* D32A (54058) */
-    3343, /* D32B (54059) */
-    3343, /* D32C (54060) */
-    3343, /* D32D (54061) */
-    3343, /* D32E (54062) */
-    3343, /* D32F (54063) */
-    3343, /* D330 (54064) */
-    3343, /* D331 (54065) */
-    3343, /* D332 (54066) */
-    3343, /* D333 (54067) */
-    3343, /* D334 (54068) */
-    3343, /* D335 (54069) */
-    3343, /* D336 (54070) */
-    3343, /* D337 (54071) */
-    3343, /* D338 (54072) */
-    3343, /* D339 (54073) */
-    3343, /* D33A (54074) */
-    3343, /* D33B (54075) */
-    3343, /* D33C (54076) */
-    3343, /* D33D (54077) */
-    3343, /* D33E (54078) */
-    3343, /* D33F (54079) */
-    3343, /* D340 (54080) */
-    3343, /* D341 (54081) */
-    3343, /* D342 (54082) */
-    3343, /* D343 (54083) */
-    3343, /* D344 (54084) */
-    3343, /* D345 (54085) */
-    3343, /* D346 (54086) */
-    3343, /* D347 (54087) */
-    3343, /* D348 (54088) */
-    3343, /* D349 (54089) */
-    3343, /* D34A (54090) */
-    3343, /* D34B (54091) */
-    3343, /* D34C (54092) */
-    3343, /* D34D (54093) */
-    3343, /* D34E (54094) */
-    3343, /* D34F (54095) */
-    3343, /* D350 (54096) */
-    3343, /* D351 (54097) */
-    3343, /* D352 (54098) */
-    3343, /* D353 (54099) */
-    3343, /* D354 (54100) */
-    3343, /* D355 (54101) */
-    3343, /* D356 (54102) */
-    3343, /* D357 (54103) */
-    3343, /* D358 (54104) */
-    3343, /* D359 (54105) */
-    3343, /* D35A (54106) */
-    3343, /* D35B (54107) */
-    3343, /* D35C (54108) */
-    3343, /* D35D (54109) */
-    3343, /* D35E (54110) */
-    3343, /* D35F (54111) */
-    3343, /* D360 (54112) */
-    3343, /* D361 (54113) */
-    3343, /* D362 (54114) */
-    3343, /* D363 (54115) */
-    3343, /* D364 (54116) */
-    3343, /* D365 (54117) */
-    3343, /* D366 (54118) */
-    3343, /* D367 (54119) */
-    3343, /* D368 (54120) */
-    3343, /* D369 (54121) */
-    3343, /* D36A (54122) */
-    3343, /* D36B (54123) */
-    3343, /* D36C (54124) */
-    3343, /* D36D (54125) */
-    3343, /* D36E (54126) */
-    3343, /* D36F (54127) */
-    3343, /* D370 (54128) */
-    3343, /* D371 (54129) */
-    3343, /* D372 (54130) */
-    3343, /* D373 (54131) */
-    3343, /* D374 (54132) */
-    3343, /* D375 (54133) */
-    3343, /* D376 (54134) */
-    3343, /* D377 (54135) */
-    3343, /* D378 (54136) */
-    3343, /* D379 (54137) */
-    3343, /* D37A (54138) */
-    3343, /* D37B (54139) */
-    3343, /* D37C (54140) */
-    3343, /* D37D (54141) */
-    3343, /* D37E (54142) */
-    3343, /* D37F (54143) */
-    3343, /* D380 (54144) */
-    3343, /* D381 (54145) */
-    3343, /* D382 (54146) */
-    3343, /* D383 (54147) */
-    3343, /* D384 (54148) */
-    3343, /* D385 (54149) */
-    3343, /* D386 (54150) */
-    3343, /* D387 (54151) */
-    3343, /* D388 (54152) */
-    3343, /* D389 (54153) */
-    3343, /* D38A (54154) */
-    3343, /* D38B (54155) */
-    3343, /* D38C (54156) */
-    3343, /* D38D (54157) */
-    3343, /* D38E (54158) */
-    3343, /* D38F (54159) */
-    3343, /* D390 (54160) */
-    3343, /* D391 (54161) */
-    3343, /* D392 (54162) */
-    3343, /* D393 (54163) */
-    3343, /* D394 (54164) */
-    3343, /* D395 (54165) */
-    3343, /* D396 (54166) */
-    3343, /* D397 (54167) */
-    3343, /* D398 (54168) */
-    3343, /* D399 (54169) */
-    3343, /* D39A (54170) */
-    3343, /* D39B (54171) */
-    3343, /* D39C (54172) */
-    3343, /* D39D (54173) */
-    3343, /* D39E (54174) */
-    3343, /* D39F (54175) */
-    3343, /* D3A0 (54176) */
-    3343, /* D3A1 (54177) */
-    3343, /* D3A2 (54178) */
-    3343, /* D3A3 (54179) */
-    3343, /* D3A4 (54180) */
-    3343, /* D3A5 (54181) */
-    3343, /* D3A6 (54182) */
-    3343, /* D3A7 (54183) */
-    3343, /* D3A8 (54184) */
-    3343, /* D3A9 (54185) */
-    3343, /* D3AA (54186) */
-    3343, /* D3AB (54187) */
-    3343, /* D3AC (54188) */
-    3343, /* D3AD (54189) */
-    3343, /* D3AE (54190) */
-    3343, /* D3AF (54191) */
-    3343, /* D3B0 (54192) */
-    3343, /* D3B1 (54193) */
-    3343, /* D3B2 (54194) */
-    3343, /* D3B3 (54195) */
-    3343, /* D3B4 (54196) */
-    3343, /* D3B5 (54197) */
-    3343, /* D3B6 (54198) */
-    3343, /* D3B7 (54199) */
-    3343, /* D3B8 (54200) */
-    3343, /* D3B9 (54201) */
-    3343, /* D3BA (54202) */
-    3343, /* D3BB (54203) */
-    3343, /* D3BC (54204) */
-    3343, /* D3BD (54205) */
-    3343, /* D3BE (54206) */
-    3343, /* D3BF (54207) */
-    3343, /* D3C0 (54208) */
-    3343, /* D3C1 (54209) */
-    3343, /* D3C2 (54210) */
-    3343, /* D3C3 (54211) */
-    3343, /* D3C4 (54212) */
-    3343, /* D3C5 (54213) */
-    3343, /* D3C6 (54214) */
-    3343, /* D3C7 (54215) */
-    3343, /* D3C8 (54216) */
-    3343, /* D3C9 (54217) */
-    3343, /* D3CA (54218) */
-    3343, /* D3CB (54219) */
-    3343, /* D3CC (54220) */
-    3343, /* D3CD (54221) */
-    3343, /* D3CE (54222) */
-    3343, /* D3CF (54223) */
-    3343, /* D3D0 (54224) */
-    3343, /* D3D1 (54225) */
-    3343, /* D3D2 (54226) */
-    3343, /* D3D3 (54227) */
-    3343, /* D3D4 (54228) */
-    3343, /* D3D5 (54229) */
-    3343, /* D3D6 (54230) */
-    3343, /* D3D7 (54231) */
-    3343, /* D3D8 (54232) */
-    3343, /* D3D9 (54233) */
-    3343, /* D3DA (54234) */
-    3343, /* D3DB (54235) */
-    3343, /* D3DC (54236) */
-    3343, /* D3DD (54237) */
-    3343, /* D3DE (54238) */
-    3343, /* D3DF (54239) */
-    3343, /* D3E0 (54240) */
-    3343, /* D3E1 (54241) */
-    3343, /* D3E2 (54242) */
-    3343, /* D3E3 (54243) */
-    3343, /* D3E4 (54244) */
-    3343, /* D3E5 (54245) */
-    3343, /* D3E6 (54246) */
-    3343, /* D3E7 (54247) */
-    3343, /* D3E8 (54248) */
-    3343, /* D3E9 (54249) */
-    3343, /* D3EA (54250) */
-    3343, /* D3EB (54251) */
-    3343, /* D3EC (54252) */
-    3343, /* D3ED (54253) */
-    3343, /* D3EE (54254) */
-    3343, /* D3EF (54255) */
-    3343, /* D3F0 (54256) */
-    3343, /* D3F1 (54257) */
-    3343, /* D3F2 (54258) */
-    3343, /* D3F3 (54259) */
-    3343, /* D3F4 (54260) */
-    3343, /* D3F5 (54261) */
-    3343, /* D3F6 (54262) */
-    3343, /* D3F7 (54263) */
-    3343, /* D3F8 (54264) */
-    3343, /* D3F9 (54265) */
-    3343, /* D3FA (54266) */
-    3343, /* D3FB (54267) */
-    3343, /* D3FC (54268) */
-    3343, /* D3FD (54269) */
-    3343, /* D3FE (54270) */
-    3343, /* D3FF (54271) */
-    3343, /* D400 (54272) */
-    3343, /* D401 (54273) */
-    3343, /* D402 (54274) */
-    3343, /* D403 (54275) */
-    3343, /* D404 (54276) */
-    3343, /* D405 (54277) */
-    3343, /* D406 (54278) */
-    3343, /* D407 (54279) */
-    3343, /* D408 (54280) */
-    3343, /* D409 (54281) */
-    3343, /* D40A (54282) */
-    3343, /* D40B (54283) */
-    3343, /* D40C (54284) */
-    3343, /* D40D (54285) */
-    3343, /* D40E (54286) */
-    3343, /* D40F (54287) */
-    3343, /* D410 (54288) */
-    3343, /* D411 (54289) */
-    3343, /* D412 (54290) */
-    3343, /* D413 (54291) */
-    3343, /* D414 (54292) */
-    3343, /* D415 (54293) */
-    3343, /* D416 (54294) */
-    3343, /* D417 (54295) */
-    3343, /* D418 (54296) */
-    3343, /* D419 (54297) */
-    3343, /* D41A (54298) */
-    3343, /* D41B (54299) */
-    3343, /* D41C (54300) */
-    3343, /* D41D (54301) */
-    3343, /* D41E (54302) */
-    3343, /* D41F (54303) */
-    3343, /* D420 (54304) */
-    3343, /* D421 (54305) */
-    3343, /* D422 (54306) */
-    3343, /* D423 (54307) */
-    3343, /* D424 (54308) */
-    3343, /* D425 (54309) */
-    3343, /* D426 (54310) */
-    3343, /* D427 (54311) */
-    3343, /* D428 (54312) */
-    3343, /* D429 (54313) */
-    3343, /* D42A (54314) */
-    3343, /* D42B (54315) */
-    3343, /* D42C (54316) */
-    3343, /* D42D (54317) */
-    3343, /* D42E (54318) */
-    3343, /* D42F (54319) */
-    3343, /* D430 (54320) */
-    3343, /* D431 (54321) */
-    3343, /* D432 (54322) */
-    3343, /* D433 (54323) */
-    3343, /* D434 (54324) */
-    3343, /* D435 (54325) */
-    3343, /* D436 (54326) */
-    3343, /* D437 (54327) */
-    3343, /* D438 (54328) */
-    3343, /* D439 (54329) */
-    3343, /* D43A (54330) */
-    3343, /* D43B (54331) */
-    3343, /* D43C (54332) */
-    3343, /* D43D (54333) */
-    3343, /* D43E (54334) */
-    3343, /* D43F (54335) */
-    3343, /* D440 (54336) */
-    3343, /* D441 (54337) */
-    3343, /* D442 (54338) */
-    3343, /* D443 (54339) */
-    3343, /* D444 (54340) */
-    3343, /* D445 (54341) */
-    3343, /* D446 (54342) */
-    3343, /* D447 (54343) */
-    3343, /* D448 (54344) */
-    3343, /* D449 (54345) */
-    3343, /* D44A (54346) */
-    3343, /* D44B (54347) */
-    3343, /* D44C (54348) */
-    3343, /* D44D (54349) */
-    3343, /* D44E (54350) */
-    3343, /* D44F (54351) */
-    3343, /* D450 (54352) */
-    3343, /* D451 (54353) */
-    3343, /* D452 (54354) */
-    3343, /* D453 (54355) */
-    3343, /* D454 (54356) */
-    3343, /* D455 (54357) */
-    3343, /* D456 (54358) */
-    3343, /* D457 (54359) */
-    3343, /* D458 (54360) */
-    3343, /* D459 (54361) */
-    3343, /* D45A (54362) */
-    3343, /* D45B (54363) */
-    3343, /* D45C (54364) */
-    3343, /* D45D (54365) */
-    3343, /* D45E (54366) */
-    3343, /* D45F (54367) */
-    3343, /* D460 (54368) */
-    3343, /* D461 (54369) */
-    3343, /* D462 (54370) */
-    3343, /* D463 (54371) */
-    3343, /* D464 (54372) */
-    3343, /* D465 (54373) */
-    3343, /* D466 (54374) */
-    3343, /* D467 (54375) */
-    3343, /* D468 (54376) */
-    3343, /* D469 (54377) */
-    3343, /* D46A (54378) */
-    3343, /* D46B (54379) */
-    3343, /* D46C (54380) */
-    3343, /* D46D (54381) */
-    3343, /* D46E (54382) */
-    3343, /* D46F (54383) */
-    3343, /* D470 (54384) */
-    3343, /* D471 (54385) */
-    3343, /* D472 (54386) */
-    3343, /* D473 (54387) */
-    3343, /* D474 (54388) */
-    3343, /* D475 (54389) */
-    3343, /* D476 (54390) */
-    3343, /* D477 (54391) */
-    3343, /* D478 (54392) */
-    3343, /* D479 (54393) */
-    3343, /* D47A (54394) */
-    3343, /* D47B (54395) */
-    3343, /* D47C (54396) */
-    3343, /* D47D (54397) */
-    3343, /* D47E (54398) */
-    3343, /* D47F (54399) */
-    3343, /* D480 (54400) */
-    3343, /* D481 (54401) */
-    3343, /* D482 (54402) */
-    3343, /* D483 (54403) */
-    3343, /* D484 (54404) */
-    3343, /* D485 (54405) */
-    3343, /* D486 (54406) */
-    3343, /* D487 (54407) */
-    3343, /* D488 (54408) */
-    3343, /* D489 (54409) */
-    3343, /* D48A (54410) */
-    3343, /* D48B (54411) */
-    3343, /* D48C (54412) */
-    3343, /* D48D (54413) */
-    3343, /* D48E (54414) */
-    3343, /* D48F (54415) */
-    3343, /* D490 (54416) */
-    3343, /* D491 (54417) */
-    3343, /* D492 (54418) */
-    3343, /* D493 (54419) */
-    3343, /* D494 (54420) */
-    3343, /* D495 (54421) */
-    3343, /* D496 (54422) */
-    3343, /* D497 (54423) */
-    3343, /* D498 (54424) */
-    3343, /* D499 (54425) */
-    3343, /* D49A (54426) */
-    3343, /* D49B (54427) */
-    3343, /* D49C (54428) */
-    3343, /* D49D (54429) */
-    3343, /* D49E (54430) */
-    3343, /* D49F (54431) */
-    3343, /* D4A0 (54432) */
-    3343, /* D4A1 (54433) */
-    3343, /* D4A2 (54434) */
-    3343, /* D4A3 (54435) */
-    3343, /* D4A4 (54436) */
-    3343, /* D4A5 (54437) */
-    3343, /* D4A6 (54438) */
-    3343, /* D4A7 (54439) */
-    3343, /* D4A8 (54440) */
-    3343, /* D4A9 (54441) */
-    3343, /* D4AA (54442) */
-    3343, /* D4AB (54443) */
-    3343, /* D4AC (54444) */
-    3343, /* D4AD (54445) */
-    3343, /* D4AE (54446) */
-    3343, /* D4AF (54447) */
-    3343, /* D4B0 (54448) */
-    3343, /* D4B1 (54449) */
-    3343, /* D4B2 (54450) */
-    3343, /* D4B3 (54451) */
-    3343, /* D4B4 (54452) */
-    3343, /* D4B5 (54453) */
-    3343, /* D4B6 (54454) */
-    3343, /* D4B7 (54455) */
-    3343, /* D4B8 (54456) */
-    3343, /* D4B9 (54457) */
-    3343, /* D4BA (54458) */
-    3343, /* D4BB (54459) */
-    3343, /* D4BC (54460) */
-    3343, /* D4BD (54461) */
-    3343, /* D4BE (54462) */
-    3343, /* D4BF (54463) */
-    3343, /* D4C0 (54464) */
-    3343, /* D4C1 (54465) */
-    3343, /* D4C2 (54466) */
-    3343, /* D4C3 (54467) */
-    3343, /* D4C4 (54468) */
-    3343, /* D4C5 (54469) */
-    3343, /* D4C6 (54470) */
-    3343, /* D4C7 (54471) */
-    3343, /* D4C8 (54472) */
-    3343, /* D4C9 (54473) */
-    3343, /* D4CA (54474) */
-    3343, /* D4CB (54475) */
-    3343, /* D4CC (54476) */
-    3343, /* D4CD (54477) */
-    3343, /* D4CE (54478) */
-    3343, /* D4CF (54479) */
-    3343, /* D4D0 (54480) */
-    3343, /* D4D1 (54481) */
-    3343, /* D4D2 (54482) */
-    3343, /* D4D3 (54483) */
-    3343, /* D4D4 (54484) */
-    3343, /* D4D5 (54485) */
-    3343, /* D4D6 (54486) */
-    3343, /* D4D7 (54487) */
-    3343, /* D4D8 (54488) */
-    3343, /* D4D9 (54489) */
-    3343, /* D4DA (54490) */
-    3343, /* D4DB (54491) */
-    3343, /* D4DC (54492) */
-    3343, /* D4DD (54493) */
-    3343, /* D4DE (54494) */
-    3343, /* D4DF (54495) */
-    3343, /* D4E0 (54496) */
-    3343, /* D4E1 (54497) */
-    3343, /* D4E2 (54498) */
-    3343, /* D4E3 (54499) */
-    3343, /* D4E4 (54500) */
-    3343, /* D4E5 (54501) */
-    3343, /* D4E6 (54502) */
-    3343, /* D4E7 (54503) */
-    3343, /* D4E8 (54504) */
-    3343, /* D4E9 (54505) */
-    3343, /* D4EA (54506) */
-    3343, /* D4EB (54507) */
-    3343, /* D4EC (54508) */
-    3343, /* D4ED (54509) */
-    3343, /* D4EE (54510) */
-    3343, /* D4EF (54511) */
-    3343, /* D4F0 (54512) */
-    3343, /* D4F1 (54513) */
-    3343, /* D4F2 (54514) */
-    3343, /* D4F3 (54515) */
-    3343, /* D4F4 (54516) */
-    3343, /* D4F5 (54517) */
-    3343, /* D4F6 (54518) */
-    3343, /* D4F7 (54519) */
-    3343, /* D4F8 (54520) */
-    3343, /* D4F9 (54521) */
-    3343, /* D4FA (54522) */
-    3343, /* D4FB (54523) */
-    3343, /* D4FC (54524) */
-    3343, /* D4FD (54525) */
-    3343, /* D4FE (54526) */
-    3343, /* D4FF (54527) */
-    3343, /* D500 (54528) */
-    3343, /* D501 (54529) */
-    3343, /* D502 (54530) */
-    3343, /* D503 (54531) */
-    3343, /* D504 (54532) */
-    3343, /* D505 (54533) */
-    3343, /* D506 (54534) */
-    3343, /* D507 (54535) */
-    3343, /* D508 (54536) */
-    3343, /* D509 (54537) */
-    3343, /* D50A (54538) */
-    3343, /* D50B (54539) */
-    3343, /* D50C (54540) */
-    3343, /* D50D (54541) */
-    3343, /* D50E (54542) */
-    3343, /* D50F (54543) */
-    3343, /* D510 (54544) */
-    3343, /* D511 (54545) */
-    3343, /* D512 (54546) */
-    3343, /* D513 (54547) */
-    3343, /* D514 (54548) */
-    3343, /* D515 (54549) */
-    3343, /* D516 (54550) */
-    3343, /* D517 (54551) */
-    3343, /* D518 (54552) */
-    3343, /* D519 (54553) */
-    3343, /* D51A (54554) */
-    3343, /* D51B (54555) */
-    3343, /* D51C (54556) */
-    3343, /* D51D (54557) */
-    3343, /* D51E (54558) */
-    3343, /* D51F (54559) */
-    3343, /* D520 (54560) */
-    3343, /* D521 (54561) */
-    3343, /* D522 (54562) */
-    3343, /* D523 (54563) */
-    3343, /* D524 (54564) */
-    3343, /* D525 (54565) */
-    3343, /* D526 (54566) */
-    3343, /* D527 (54567) */
-    3343, /* D528 (54568) */
-    3343, /* D529 (54569) */
-    3343, /* D52A (54570) */
-    3343, /* D52B (54571) */
-    3343, /* D52C (54572) */
-    3343, /* D52D (54573) */
-    3343, /* D52E (54574) */
-    3343, /* D52F (54575) */
-    3343, /* D530 (54576) */
-    3343, /* D531 (54577) */
-    3343, /* D532 (54578) */
-    3343, /* D533 (54579) */
-    3343, /* D534 (54580) */
-    3343, /* D535 (54581) */
-    3343, /* D536 (54582) */
-    3343, /* D537 (54583) */
-    3343, /* D538 (54584) */
-    3343, /* D539 (54585) */
-    3343, /* D53A (54586) */
-    3343, /* D53B (54587) */
-    3343, /* D53C (54588) */
-    3343, /* D53D (54589) */
-    3343, /* D53E (54590) */
-    3343, /* D53F (54591) */
-    3343, /* D540 (54592) */
-    3343, /* D541 (54593) */
-    3343, /* D542 (54594) */
-    3343, /* D543 (54595) */
-    3343, /* D544 (54596) */
-    3343, /* D545 (54597) */
-    3343, /* D546 (54598) */
-    3343, /* D547 (54599) */
-    3343, /* D548 (54600) */
-    3343, /* D549 (54601) */
-    3343, /* D54A (54602) */
-    3343, /* D54B (54603) */
-    3343, /* D54C (54604) */
-    3343, /* D54D (54605) */
-    3343, /* D54E (54606) */
-    3343, /* D54F (54607) */
-    3343, /* D550 (54608) */
-    3343, /* D551 (54609) */
-    3343, /* D552 (54610) */
-    3343, /* D553 (54611) */
-    3343, /* D554 (54612) */
-    3343, /* D555 (54613) */
-    3343, /* D556 (54614) */
-    3343, /* D557 (54615) */
-    3343, /* D558 (54616) */
-    3343, /* D559 (54617) */
-    3343, /* D55A (54618) */
-    3343, /* D55B (54619) */
-    3343, /* D55C (54620) */
-    3343, /* D55D (54621) */
-    3343, /* D55E (54622) */
-    3343, /* D55F (54623) */
-    3343, /* D560 (54624) */
-    3343, /* D561 (54625) */
-    3343, /* D562 (54626) */
-    3343, /* D563 (54627) */
-    3343, /* D564 (54628) */
-    3343, /* D565 (54629) */
-    3343, /* D566 (54630) */
-    3343, /* D567 (54631) */
-    3343, /* D568 (54632) */
-    3343, /* D569 (54633) */
-    3343, /* D56A (54634) */
-    3343, /* D56B (54635) */
-    3343, /* D56C (54636) */
-    3343, /* D56D (54637) */
-    3343, /* D56E (54638) */
-    3343, /* D56F (54639) */
-    3343, /* D570 (54640) */
-    3343, /* D571 (54641) */
-    3343, /* D572 (54642) */
-    3343, /* D573 (54643) */
-    3343, /* D574 (54644) */
-    3343, /* D575 (54645) */
-    3343, /* D576 (54646) */
-    3343, /* D577 (54647) */
-    3343, /* D578 (54648) */
-    3343, /* D579 (54649) */
-    3343, /* D57A (54650) */
-    3343, /* D57B (54651) */
-    3343, /* D57C (54652) */
-    3343, /* D57D (54653) */
-    3343, /* D57E (54654) */
-    3343, /* D57F (54655) */
-    3343, /* D580 (54656) */
-    3343, /* D581 (54657) */
-    3343, /* D582 (54658) */
-    3343, /* D583 (54659) */
-    3343, /* D584 (54660) */
-    3343, /* D585 (54661) */
-    3343, /* D586 (54662) */
-    3343, /* D587 (54663) */
-    3343, /* D588 (54664) */
-    3343, /* D589 (54665) */
-    3343, /* D58A (54666) */
-    3343, /* D58B (54667) */
-    3343, /* D58C (54668) */
-    3343, /* D58D (54669) */
-    3343, /* D58E (54670) */
-    3343, /* D58F (54671) */
-    3343, /* D590 (54672) */
-    3343, /* D591 (54673) */
-    3343, /* D592 (54674) */
-    3343, /* D593 (54675) */
-    3343, /* D594 (54676) */
-    3343, /* D595 (54677) */
-    3343, /* D596 (54678) */
-    3343, /* D597 (54679) */
-    3343, /* D598 (54680) */
-    3343, /* D599 (54681) */
-    3343, /* D59A (54682) */
-    3343, /* D59B (54683) */
-    3343, /* D59C (54684) */
-    3343, /* D59D (54685) */
-    3343, /* D59E (54686) */
-    3343, /* D59F (54687) */
-    3343, /* D5A0 (54688) */
-    3343, /* D5A1 (54689) */
-    3343, /* D5A2 (54690) */
-    3343, /* D5A3 (54691) */
-    3343, /* D5A4 (54692) */
-    3343, /* D5A5 (54693) */
-    3343, /* D5A6 (54694) */
-    3343, /* D5A7 (54695) */
-    3343, /* D5A8 (54696) */
-    3343, /* D5A9 (54697) */
-    3343, /* D5AA (54698) */
-    3343, /* D5AB (54699) */
-    3343, /* D5AC (54700) */
-    3343, /* D5AD (54701) */
-    3343, /* D5AE (54702) */
-    3343, /* D5AF (54703) */
-    3343, /* D5B0 (54704) */
-    3343, /* D5B1 (54705) */
-    3343, /* D5B2 (54706) */
-    3343, /* D5B3 (54707) */
-    3343, /* D5B4 (54708) */
-    3343, /* D5B5 (54709) */
-    3343, /* D5B6 (54710) */
-    3343, /* D5B7 (54711) */
-    3343, /* D5B8 (54712) */
-    3343, /* D5B9 (54713) */
-    3343, /* D5BA (54714) */
-    3343, /* D5BB (54715) */
-    3343, /* D5BC (54716) */
-    3343, /* D5BD (54717) */
-    3343, /* D5BE (54718) */
-    3343, /* D5BF (54719) */
-    3343, /* D5C0 (54720) */
-    3343, /* D5C1 (54721) */
-    3343, /* D5C2 (54722) */
-    3343, /* D5C3 (54723) */
-    3343, /* D5C4 (54724) */
-    3343, /* D5C5 (54725) */
-    3343, /* D5C6 (54726) */
-    3343, /* D5C7 (54727) */
-    3343, /* D5C8 (54728) */
-    3343, /* D5C9 (54729) */
-    3343, /* D5CA (54730) */
-    3343, /* D5CB (54731) */
-    3343, /* D5CC (54732) */
-    3343, /* D5CD (54733) */
-    3343, /* D5CE (54734) */
-    3343, /* D5CF (54735) */
-    3343, /* D5D0 (54736) */
-    3343, /* D5D1 (54737) */
-    3343, /* D5D2 (54738) */
-    3343, /* D5D3 (54739) */
-    3343, /* D5D4 (54740) */
-    3343, /* D5D5 (54741) */
-    3343, /* D5D6 (54742) */
-    3343, /* D5D7 (54743) */
-    3343, /* D5D8 (54744) */
-    3343, /* D5D9 (54745) */
-    3343, /* D5DA (54746) */
-    3343, /* D5DB (54747) */
-    3343, /* D5DC (54748) */
-    3343, /* D5DD (54749) */
-    3343, /* D5DE (54750) */
-    3343, /* D5DF (54751) */
-    3343, /* D5E0 (54752) */
-    3343, /* D5E1 (54753) */
-    3343, /* D5E2 (54754) */
-    3343, /* D5E3 (54755) */
-    3343, /* D5E4 (54756) */
-    3343, /* D5E5 (54757) */
-    3343, /* D5E6 (54758) */
-    3343, /* D5E7 (54759) */
-    3343, /* D5E8 (54760) */
-    3343, /* D5E9 (54761) */
-    3343, /* D5EA (54762) */
-    3343, /* D5EB (54763) */
-    3343, /* D5EC (54764) */
-    3343, /* D5ED (54765) */
-    3343, /* D5EE (54766) */
-    3343, /* D5EF (54767) */
-    3343, /* D5F0 (54768) */
-    3343, /* D5F1 (54769) */
-    3343, /* D5F2 (54770) */
-    3343, /* D5F3 (54771) */
-    3343, /* D5F4 (54772) */
-    3343, /* D5F5 (54773) */
-    3343, /* D5F6 (54774) */
-    3343, /* D5F7 (54775) */
-    3343, /* D5F8 (54776) */
-    3343, /* D5F9 (54777) */
-    3343, /* D5FA (54778) */
-    3343, /* D5FB (54779) */
-    3343, /* D5FC (54780) */
-    3343, /* D5FD (54781) */
-    3343, /* D5FE (54782) */
-    3343, /* D5FF (54783) */
-    3343, /* D600 (54784) */
-    3343, /* D601 (54785) */
-    3343, /* D602 (54786) */
-    3343, /* D603 (54787) */
-    3343, /* D604 (54788) */
-    3343, /* D605 (54789) */
-    3343, /* D606 (54790) */
-    3343, /* D607 (54791) */
-    3343, /* D608 (54792) */
-    3343, /* D609 (54793) */
-    3343, /* D60A (54794) */
-    3343, /* D60B (54795) */
-    3343, /* D60C (54796) */
-    3343, /* D60D (54797) */
-    3343, /* D60E (54798) */
-    3343, /* D60F (54799) */
-    3343, /* D610 (54800) */
-    3343, /* D611 (54801) */
-    3343, /* D612 (54802) */
-    3343, /* D613 (54803) */
-    3343, /* D614 (54804) */
-    3343, /* D615 (54805) */
-    3343, /* D616 (54806) */
-    3343, /* D617 (54807) */
-    3343, /* D618 (54808) */
-    3343, /* D619 (54809) */
-    3343, /* D61A (54810) */
-    3343, /* D61B (54811) */
-    3343, /* D61C (54812) */
-    3343, /* D61D (54813) */
-    3343, /* D61E (54814) */
-    3343, /* D61F (54815) */
-    3343, /* D620 (54816) */
-    3343, /* D621 (54817) */
-    3343, /* D622 (54818) */
-    3343, /* D623 (54819) */
-    3343, /* D624 (54820) */
-    3343, /* D625 (54821) */
-    3343, /* D626 (54822) */
-    3343, /* D627 (54823) */
-    3343, /* D628 (54824) */
-    3343, /* D629 (54825) */
-    3343, /* D62A (54826) */
-    3343, /* D62B (54827) */
-    3343, /* D62C (54828) */
-    3343, /* D62D (54829) */
-    3343, /* D62E (54830) */
-    3343, /* D62F (54831) */
-    3343, /* D630 (54832) */
-    3343, /* D631 (54833) */
-    3343, /* D632 (54834) */
-    3343, /* D633 (54835) */
-    3343, /* D634 (54836) */
-    3343, /* D635 (54837) */
-    3343, /* D636 (54838) */
-    3343, /* D637 (54839) */
-    3343, /* D638 (54840) */
-    3343, /* D639 (54841) */
-    3343, /* D63A (54842) */
-    3343, /* D63B (54843) */
-    3343, /* D63C (54844) */
-    3343, /* D63D (54845) */
-    3343, /* D63E (54846) */
-    3343, /* D63F (54847) */
-    3343, /* D640 (54848) */
-    3343, /* D641 (54849) */
-    3343, /* D642 (54850) */
-    3343, /* D643 (54851) */
-    3343, /* D644 (54852) */
-    3343, /* D645 (54853) */
-    3343, /* D646 (54854) */
-    3343, /* D647 (54855) */
-    3343, /* D648 (54856) */
-    3343, /* D649 (54857) */
-    3343, /* D64A (54858) */
-    3343, /* D64B (54859) */
-    3343, /* D64C (54860) */
-    3343, /* D64D (54861) */
-    3343, /* D64E (54862) */
-    3343, /* D64F (54863) */
-    3343, /* D650 (54864) */
-    3343, /* D651 (54865) */
-    3343, /* D652 (54866) */
-    3343, /* D653 (54867) */
-    3343, /* D654 (54868) */
-    3343, /* D655 (54869) */
-    3343, /* D656 (54870) */
-    3343, /* D657 (54871) */
-    3343, /* D658 (54872) */
-    3343, /* D659 (54873) */
-    3343, /* D65A (54874) */
-    3343, /* D65B (54875) */
-    3343, /* D65C (54876) */
-    3343, /* D65D (54877) */
-    3343, /* D65E (54878) */
-    3343, /* D65F (54879) */
-    3343, /* D660 (54880) */
-    3343, /* D661 (54881) */
-    3343, /* D662 (54882) */
-    3343, /* D663 (54883) */
-    3343, /* D664 (54884) */
-    3343, /* D665 (54885) */
-    3343, /* D666 (54886) */
-    3343, /* D667 (54887) */
-    3343, /* D668 (54888) */
-    3343, /* D669 (54889) */
-    3343, /* D66A (54890) */
-    3343, /* D66B (54891) */
-    3343, /* D66C (54892) */
-    3343, /* D66D (54893) */
-    3343, /* D66E (54894) */
-    3343, /* D66F (54895) */
-    3343, /* D670 (54896) */
-    3343, /* D671 (54897) */
-    3343, /* D672 (54898) */
-    3343, /* D673 (54899) */
-    3343, /* D674 (54900) */
-    3343, /* D675 (54901) */
-    3343, /* D676 (54902) */
-    3343, /* D677 (54903) */
-    3343, /* D678 (54904) */
-    3343, /* D679 (54905) */
-    3343, /* D67A (54906) */
-    3343, /* D67B (54907) */
-    3343, /* D67C (54908) */
-    3343, /* D67D (54909) */
-    3343, /* D67E (54910) */
-    3343, /* D67F (54911) */
-    3343, /* D680 (54912) */
-    3343, /* D681 (54913) */
-    3343, /* D682 (54914) */
-    3343, /* D683 (54915) */
-    3343, /* D684 (54916) */
-    3343, /* D685 (54917) */
-    3343, /* D686 (54918) */
-    3343, /* D687 (54919) */
-    3343, /* D688 (54920) */
-    3343, /* D689 (54921) */
-    3343, /* D68A (54922) */
-    3343, /* D68B (54923) */
-    3343, /* D68C (54924) */
-    3343, /* D68D (54925) */
-    3343, /* D68E (54926) */
-    3343, /* D68F (54927) */
-    3343, /* D690 (54928) */
-    3343, /* D691 (54929) */
-    3343, /* D692 (54930) */
-    3343, /* D693 (54931) */
-    3343, /* D694 (54932) */
-    3343, /* D695 (54933) */
-    3343, /* D696 (54934) */
-    3343, /* D697 (54935) */
-    3343, /* D698 (54936) */
-    3343, /* D699 (54937) */
-    3343, /* D69A (54938) */
-    3343, /* D69B (54939) */
-    3343, /* D69C (54940) */
-    3343, /* D69D (54941) */
-    3343, /* D69E (54942) */
-    3343, /* D69F (54943) */
-    3343, /* D6A0 (54944) */
-    3343, /* D6A1 (54945) */
-    3343, /* D6A2 (54946) */
-    3343, /* D6A3 (54947) */
-    3343, /* D6A4 (54948) */
-    3343, /* D6A5 (54949) */
-    3343, /* D6A6 (54950) */
-    3343, /* D6A7 (54951) */
-    3343, /* D6A8 (54952) */
-    3343, /* D6A9 (54953) */
-    3343, /* D6AA (54954) */
-    3343, /* D6AB (54955) */
-    3343, /* D6AC (54956) */
-    3343, /* D6AD (54957) */
-    3343, /* D6AE (54958) */
-    3343, /* D6AF (54959) */
-    3343, /* D6B0 (54960) */
-    3343, /* D6B1 (54961) */
-    3343, /* D6B2 (54962) */
-    3343, /* D6B3 (54963) */
-    3343, /* D6B4 (54964) */
-    3343, /* D6B5 (54965) */
-    3343, /* D6B6 (54966) */
-    3343, /* D6B7 (54967) */
-    3343, /* D6B8 (54968) */
-    3343, /* D6B9 (54969) */
-    3343, /* D6BA (54970) */
-    3343, /* D6BB (54971) */
-    3343, /* D6BC (54972) */
-    3343, /* D6BD (54973) */
-    3343, /* D6BE (54974) */
-    3343, /* D6BF (54975) */
-    3343, /* D6C0 (54976) */
-    3343, /* D6C1 (54977) */
-    3343, /* D6C2 (54978) */
-    3343, /* D6C3 (54979) */
-    3343, /* D6C4 (54980) */
-    3343, /* D6C5 (54981) */
-    3343, /* D6C6 (54982) */
-    3343, /* D6C7 (54983) */
-    3343, /* D6C8 (54984) */
-    3343, /* D6C9 (54985) */
-    3343, /* D6CA (54986) */
-    3343, /* D6CB (54987) */
-    3343, /* D6CC (54988) */
-    3343, /* D6CD (54989) */
-    3343, /* D6CE (54990) */
-    3343, /* D6CF (54991) */
-    3343, /* D6D0 (54992) */
-    3343, /* D6D1 (54993) */
-    3343, /* D6D2 (54994) */
-    3343, /* D6D3 (54995) */
-    3343, /* D6D4 (54996) */
-    3343, /* D6D5 (54997) */
-    3343, /* D6D6 (54998) */
-    3343, /* D6D7 (54999) */
-    3343, /* D6D8 (55000) */
-    3343, /* D6D9 (55001) */
-    3343, /* D6DA (55002) */
-    3343, /* D6DB (55003) */
-    3343, /* D6DC (55004) */
-    3343, /* D6DD (55005) */
-    3343, /* D6DE (55006) */
-    3343, /* D6DF (55007) */
-    3343, /* D6E0 (55008) */
-    3343, /* D6E1 (55009) */
-    3343, /* D6E2 (55010) */
-    3343, /* D6E3 (55011) */
-    3343, /* D6E4 (55012) */
-    3343, /* D6E5 (55013) */
-    3343, /* D6E6 (55014) */
-    3343, /* D6E7 (55015) */
-    3343, /* D6E8 (55016) */
-    3343, /* D6E9 (55017) */
-    3343, /* D6EA (55018) */
-    3343, /* D6EB (55019) */
-    3343, /* D6EC (55020) */
-    3343, /* D6ED (55021) */
-    3343, /* D6EE (55022) */
-    3343, /* D6EF (55023) */
-    3343, /* D6F0 (55024) */
-    3343, /* D6F1 (55025) */
-    3343, /* D6F2 (55026) */
-    3343, /* D6F3 (55027) */
-    3343, /* D6F4 (55028) */
-    3343, /* D6F5 (55029) */
-    3343, /* D6F6 (55030) */
-    3343, /* D6F7 (55031) */
-    3343, /* D6F8 (55032) */
-    3343, /* D6F9 (55033) */
-    3343, /* D6FA (55034) */
-    3343, /* D6FB (55035) */
-    3343, /* D6FC (55036) */
-    3343, /* D6FD (55037) */
-    3343, /* D6FE (55038) */
-    3343, /* D6FF (55039) */
-    3343, /* D700 (55040) */
-    3343, /* D701 (55041) */
-    3343, /* D702 (55042) */
-    3343, /* D703 (55043) */
-    3343, /* D704 (55044) */
-    3343, /* D705 (55045) */
-    3343, /* D706 (55046) */
-    3343, /* D707 (55047) */
-    3343, /* D708 (55048) */
-    3343, /* D709 (55049) */
-    3343, /* D70A (55050) */
-    3343, /* D70B (55051) */
-    3343, /* D70C (55052) */
-    3343, /* D70D (55053) */
-    3343, /* D70E (55054) */
-    3343, /* D70F (55055) */
-    3343, /* D710 (55056) */
-    3343, /* D711 (55057) */
-    3343, /* D712 (55058) */
-    3343, /* D713 (55059) */
-    3343, /* D714 (55060) */
-    3343, /* D715 (55061) */
-    3343, /* D716 (55062) */
-    3343, /* D717 (55063) */
-    3343, /* D718 (55064) */
-    3343, /* D719 (55065) */
-    3343, /* D71A (55066) */
-    3343, /* D71B (55067) */
-    3343, /* D71C (55068) */
-    3343, /* D71D (55069) */
-    3343, /* D71E (55070) */
-    3343, /* D71F (55071) */
-    3343, /* D720 (55072) */
-    3343, /* D721 (55073) */
-    3343, /* D722 (55074) */
-    3343, /* D723 (55075) */
-    3343, /* D724 (55076) */
-    3343, /* D725 (55077) */
-    3343, /* D726 (55078) */
-    3343, /* D727 (55079) */
-    3343, /* D728 (55080) */
-    3343, /* D729 (55081) */
-    3343, /* D72A (55082) */
-    3343, /* D72B (55083) */
-    3343, /* D72C (55084) */
-    3343, /* D72D (55085) */
-    3343, /* D72E (55086) */
-    3343, /* D72F (55087) */
-    3343, /* D730 (55088) */
-    3343, /* D731 (55089) */
-    3343, /* D732 (55090) */
-    3343, /* D733 (55091) */
-    3343, /* D734 (55092) */
-    3343, /* D735 (55093) */
-    3343, /* D736 (55094) */
-    3343, /* D737 (55095) */
-    3343, /* D738 (55096) */
-    3343, /* D739 (55097) */
-    3343, /* D73A (55098) */
-    3343, /* D73B (55099) */
-    3343, /* D73C (55100) */
-    3343, /* D73D (55101) */
-    3343, /* D73E (55102) */
-    3343, /* D73F (55103) */
-    3343, /* D740 (55104) */
-    3343, /* D741 (55105) */
-    3343, /* D742 (55106) */
-    3343, /* D743 (55107) */
-    3343, /* D744 (55108) */
-    3343, /* D745 (55109) */
-    3343, /* D746 (55110) */
-    3343, /* D747 (55111) */
-    3343, /* D748 (55112) */
-    3343, /* D749 (55113) */
-    3343, /* D74A (55114) */
-    3343, /* D74B (55115) */
-    3343, /* D74C (55116) */
-    3343, /* D74D (55117) */
-    3343, /* D74E (55118) */
-    3343, /* D74F (55119) */
-    3343, /* D750 (55120) */
-    3343, /* D751 (55121) */
-    3343, /* D752 (55122) */
-    3343, /* D753 (55123) */
-    3343, /* D754 (55124) */
-    3343, /* D755 (55125) */
-    3343, /* D756 (55126) */
-    3343, /* D757 (55127) */
-    3343, /* D758 (55128) */
-    3343, /* D759 (55129) */
-    3343, /* D75A (55130) */
-    3343, /* D75B (55131) */
-    3343, /* D75C (55132) */
-    3343, /* D75D (55133) */
-    3343, /* D75E (55134) */
-    3343, /* D75F (55135) */
-    3343, /* D760 (55136) */
-    3343, /* D761 (55137) */
-    3343, /* D762 (55138) */
-    3343, /* D763 (55139) */
-    3343, /* D764 (55140) */
-    3343, /* D765 (55141) */
-    3343, /* D766 (55142) */
-    3343, /* D767 (55143) */
-    3343, /* D768 (55144) */
-    3343, /* D769 (55145) */
-    3343, /* D76A (55146) */
-    3343, /* D76B (55147) */
-    3343, /* D76C (55148) */
-    3343, /* D76D (55149) */
-    3343, /* D76E (55150) */
-    3343, /* D76F (55151) */
-    3343, /* D770 (55152) */
-    3343, /* D771 (55153) */
-    3343, /* D772 (55154) */
-    3343, /* D773 (55155) */
-    3343, /* D774 (55156) */
-    3343, /* D775 (55157) */
-    3343, /* D776 (55158) */
-    3343, /* D777 (55159) */
-    3343, /* D778 (55160) */
-    3343, /* D779 (55161) */
-    3343, /* D77A (55162) */
-    3343, /* D77B (55163) */
-    3343, /* D77C (55164) */
-    3343, /* D77D (55165) */
-    3343, /* D77E (55166) */
-    3343, /* D77F (55167) */
-    3343, /* D780 (55168) */
-    3343, /* D781 (55169) */
-    3343, /* D782 (55170) */
-    3343, /* D783 (55171) */
-    3343, /* D784 (55172) */
-    3343, /* D785 (55173) */
-    3343, /* D786 (55174) */
-    3343, /* D787 (55175) */
-    3343, /* D788 (55176) */
-    3343, /* D789 (55177) */
-    3343, /* D78A (55178) */
-    3343, /* D78B (55179) */
-    3343, /* D78C (55180) */
-    3343, /* D78D (55181) */
-    3343, /* D78E (55182) */
-    3343, /* D78F (55183) */
-    3343, /* D790 (55184) */
-    3343, /* D791 (55185) */
-    3343, /* D792 (55186) */
-    3343, /* D793 (55187) */
-    3343, /* D794 (55188) */
-    3343, /* D795 (55189) */
-    3343, /* D796 (55190) */
-    3343, /* D797 (55191) */
-    3343, /* D798 (55192) */
-    3343, /* D799 (55193) */
-    3343, /* D79A (55194) */
-    3343, /* D79B (55195) */
-    3343, /* D79C (55196) */
-    3343, /* D79D (55197) */
-    3343, /* D79E (55198) */
-    3343, /* D79F (55199) */
-    3343, /* D7A0 (55200) */
-    3343, /* D7A1 (55201) */
-    3343, /* D7A2 (55202) */
-    3343, /* D7A3 (55203) */
+    3347, /* AC00 (44032) */
+    3347, /* AC01 (44033) */
+    3347, /* AC02 (44034) */
+    3347, /* AC03 (44035) */
+    3347, /* AC04 (44036) */
+    3347, /* AC05 (44037) */
+    3347, /* AC06 (44038) */
+    3347, /* AC07 (44039) */
+    3347, /* AC08 (44040) */
+    3347, /* AC09 (44041) */
+    3347, /* AC0A (44042) */
+    3347, /* AC0B (44043) */
+    3347, /* AC0C (44044) */
+    3347, /* AC0D (44045) */
+    3347, /* AC0E (44046) */
+    3347, /* AC0F (44047) */
+    3347, /* AC10 (44048) */
+    3347, /* AC11 (44049) */
+    3347, /* AC12 (44050) */
+    3347, /* AC13 (44051) */
+    3347, /* AC14 (44052) */
+    3347, /* AC15 (44053) */
+    3347, /* AC16 (44054) */
+    3347, /* AC17 (44055) */
+    3347, /* AC18 (44056) */
+    3347, /* AC19 (44057) */
+    3347, /* AC1A (44058) */
+    3347, /* AC1B (44059) */
+    3347, /* AC1C (44060) */
+    3347, /* AC1D (44061) */
+    3347, /* AC1E (44062) */
+    3347, /* AC1F (44063) */
+    3347, /* AC20 (44064) */
+    3347, /* AC21 (44065) */
+    3347, /* AC22 (44066) */
+    3347, /* AC23 (44067) */
+    3347, /* AC24 (44068) */
+    3347, /* AC25 (44069) */
+    3347, /* AC26 (44070) */
+    3347, /* AC27 (44071) */
+    3347, /* AC28 (44072) */
+    3347, /* AC29 (44073) */
+    3347, /* AC2A (44074) */
+    3347, /* AC2B (44075) */
+    3347, /* AC2C (44076) */
+    3347, /* AC2D (44077) */
+    3347, /* AC2E (44078) */
+    3347, /* AC2F (44079) */
+    3347, /* AC30 (44080) */
+    3347, /* AC31 (44081) */
+    3347, /* AC32 (44082) */
+    3347, /* AC33 (44083) */
+    3347, /* AC34 (44084) */
+    3347, /* AC35 (44085) */
+    3347, /* AC36 (44086) */
+    3347, /* AC37 (44087) */
+    3347, /* AC38 (44088) */
+    3347, /* AC39 (44089) */
+    3347, /* AC3A (44090) */
+    3347, /* AC3B (44091) */
+    3347, /* AC3C (44092) */
+    3347, /* AC3D (44093) */
+    3347, /* AC3E (44094) */
+    3347, /* AC3F (44095) */
+    3347, /* AC40 (44096) */
+    3347, /* AC41 (44097) */
+    3347, /* AC42 (44098) */
+    3347, /* AC43 (44099) */
+    3347, /* AC44 (44100) */
+    3347, /* AC45 (44101) */
+    3347, /* AC46 (44102) */
+    3347, /* AC47 (44103) */
+    3347, /* AC48 (44104) */
+    3347, /* AC49 (44105) */
+    3347, /* AC4A (44106) */
+    3347, /* AC4B (44107) */
+    3347, /* AC4C (44108) */
+    3347, /* AC4D (44109) */
+    3347, /* AC4E (44110) */
+    3347, /* AC4F (44111) */
+    3347, /* AC50 (44112) */
+    3347, /* AC51 (44113) */
+    3347, /* AC52 (44114) */
+    3347, /* AC53 (44115) */
+    3347, /* AC54 (44116) */
+    3347, /* AC55 (44117) */
+    3347, /* AC56 (44118) */
+    3347, /* AC57 (44119) */
+    3347, /* AC58 (44120) */
+    3347, /* AC59 (44121) */
+    3347, /* AC5A (44122) */
+    3347, /* AC5B (44123) */
+    3347, /* AC5C (44124) */
+    3347, /* AC5D (44125) */
+    3347, /* AC5E (44126) */
+    3347, /* AC5F (44127) */
+    3347, /* AC60 (44128) */
+    3347, /* AC61 (44129) */
+    3347, /* AC62 (44130) */
+    3347, /* AC63 (44131) */
+    3347, /* AC64 (44132) */
+    3347, /* AC65 (44133) */
+    3347, /* AC66 (44134) */
+    3347, /* AC67 (44135) */
+    3347, /* AC68 (44136) */
+    3347, /* AC69 (44137) */
+    3347, /* AC6A (44138) */
+    3347, /* AC6B (44139) */
+    3347, /* AC6C (44140) */
+    3347, /* AC6D (44141) */
+    3347, /* AC6E (44142) */
+    3347, /* AC6F (44143) */
+    3347, /* AC70 (44144) */
+    3347, /* AC71 (44145) */
+    3347, /* AC72 (44146) */
+    3347, /* AC73 (44147) */
+    3347, /* AC74 (44148) */
+    3347, /* AC75 (44149) */
+    3347, /* AC76 (44150) */
+    3347, /* AC77 (44151) */
+    3347, /* AC78 (44152) */
+    3347, /* AC79 (44153) */
+    3347, /* AC7A (44154) */
+    3347, /* AC7B (44155) */
+    3347, /* AC7C (44156) */
+    3347, /* AC7D (44157) */
+    3347, /* AC7E (44158) */
+    3347, /* AC7F (44159) */
+    3347, /* AC80 (44160) */
+    3347, /* AC81 (44161) */
+    3347, /* AC82 (44162) */
+    3347, /* AC83 (44163) */
+    3347, /* AC84 (44164) */
+    3347, /* AC85 (44165) */
+    3347, /* AC86 (44166) */
+    3347, /* AC87 (44167) */
+    3347, /* AC88 (44168) */
+    3347, /* AC89 (44169) */
+    3347, /* AC8A (44170) */
+    3347, /* AC8B (44171) */
+    3347, /* AC8C (44172) */
+    3347, /* AC8D (44173) */
+    3347, /* AC8E (44174) */
+    3347, /* AC8F (44175) */
+    3347, /* AC90 (44176) */
+    3347, /* AC91 (44177) */
+    3347, /* AC92 (44178) */
+    3347, /* AC93 (44179) */
+    3347, /* AC94 (44180) */
+    3347, /* AC95 (44181) */
+    3347, /* AC96 (44182) */
+    3347, /* AC97 (44183) */
+    3347, /* AC98 (44184) */
+    3347, /* AC99 (44185) */
+    3347, /* AC9A (44186) */
+    3347, /* AC9B (44187) */
+    3347, /* AC9C (44188) */
+    3347, /* AC9D (44189) */
+    3347, /* AC9E (44190) */
+    3347, /* AC9F (44191) */
+    3347, /* ACA0 (44192) */
+    3347, /* ACA1 (44193) */
+    3347, /* ACA2 (44194) */
+    3347, /* ACA3 (44195) */
+    3347, /* ACA4 (44196) */
+    3347, /* ACA5 (44197) */
+    3347, /* ACA6 (44198) */
+    3347, /* ACA7 (44199) */
+    3347, /* ACA8 (44200) */
+    3347, /* ACA9 (44201) */
+    3347, /* ACAA (44202) */
+    3347, /* ACAB (44203) */
+    3347, /* ACAC (44204) */
+    3347, /* ACAD (44205) */
+    3347, /* ACAE (44206) */
+    3347, /* ACAF (44207) */
+    3347, /* ACB0 (44208) */
+    3347, /* ACB1 (44209) */
+    3347, /* ACB2 (44210) */
+    3347, /* ACB3 (44211) */
+    3347, /* ACB4 (44212) */
+    3347, /* ACB5 (44213) */
+    3347, /* ACB6 (44214) */
+    3347, /* ACB7 (44215) */
+    3347, /* ACB8 (44216) */
+    3347, /* ACB9 (44217) */
+    3347, /* ACBA (44218) */
+    3347, /* ACBB (44219) */
+    3347, /* ACBC (44220) */
+    3347, /* ACBD (44221) */
+    3347, /* ACBE (44222) */
+    3347, /* ACBF (44223) */
+    3347, /* ACC0 (44224) */
+    3347, /* ACC1 (44225) */
+    3347, /* ACC2 (44226) */
+    3347, /* ACC3 (44227) */
+    3347, /* ACC4 (44228) */
+    3347, /* ACC5 (44229) */
+    3347, /* ACC6 (44230) */
+    3347, /* ACC7 (44231) */
+    3347, /* ACC8 (44232) */
+    3347, /* ACC9 (44233) */
+    3347, /* ACCA (44234) */
+    3347, /* ACCB (44235) */
+    3347, /* ACCC (44236) */
+    3347, /* ACCD (44237) */
+    3347, /* ACCE (44238) */
+    3347, /* ACCF (44239) */
+    3347, /* ACD0 (44240) */
+    3347, /* ACD1 (44241) */
+    3347, /* ACD2 (44242) */
+    3347, /* ACD3 (44243) */
+    3347, /* ACD4 (44244) */
+    3347, /* ACD5 (44245) */
+    3347, /* ACD6 (44246) */
+    3347, /* ACD7 (44247) */
+    3347, /* ACD8 (44248) */
+    3347, /* ACD9 (44249) */
+    3347, /* ACDA (44250) */
+    3347, /* ACDB (44251) */
+    3347, /* ACDC (44252) */
+    3347, /* ACDD (44253) */
+    3347, /* ACDE (44254) */
+    3347, /* ACDF (44255) */
+    3347, /* ACE0 (44256) */
+    3347, /* ACE1 (44257) */
+    3347, /* ACE2 (44258) */
+    3347, /* ACE3 (44259) */
+    3347, /* ACE4 (44260) */
+    3347, /* ACE5 (44261) */
+    3347, /* ACE6 (44262) */
+    3347, /* ACE7 (44263) */
+    3347, /* ACE8 (44264) */
+    3347, /* ACE9 (44265) */
+    3347, /* ACEA (44266) */
+    3347, /* ACEB (44267) */
+    3347, /* ACEC (44268) */
+    3347, /* ACED (44269) */
+    3347, /* ACEE (44270) */
+    3347, /* ACEF (44271) */
+    3347, /* ACF0 (44272) */
+    3347, /* ACF1 (44273) */
+    3347, /* ACF2 (44274) */
+    3347, /* ACF3 (44275) */
+    3347, /* ACF4 (44276) */
+    3347, /* ACF5 (44277) */
+    3347, /* ACF6 (44278) */
+    3347, /* ACF7 (44279) */
+    3347, /* ACF8 (44280) */
+    3347, /* ACF9 (44281) */
+    3347, /* ACFA (44282) */
+    3347, /* ACFB (44283) */
+    3347, /* ACFC (44284) */
+    3347, /* ACFD (44285) */
+    3347, /* ACFE (44286) */
+    3347, /* ACFF (44287) */
+    3347, /* AD00 (44288) */
+    3347, /* AD01 (44289) */
+    3347, /* AD02 (44290) */
+    3347, /* AD03 (44291) */
+    3347, /* AD04 (44292) */
+    3347, /* AD05 (44293) */
+    3347, /* AD06 (44294) */
+    3347, /* AD07 (44295) */
+    3347, /* AD08 (44296) */
+    3347, /* AD09 (44297) */
+    3347, /* AD0A (44298) */
+    3347, /* AD0B (44299) */
+    3347, /* AD0C (44300) */
+    3347, /* AD0D (44301) */
+    3347, /* AD0E (44302) */
+    3347, /* AD0F (44303) */
+    3347, /* AD10 (44304) */
+    3347, /* AD11 (44305) */
+    3347, /* AD12 (44306) */
+    3347, /* AD13 (44307) */
+    3347, /* AD14 (44308) */
+    3347, /* AD15 (44309) */
+    3347, /* AD16 (44310) */
+    3347, /* AD17 (44311) */
+    3347, /* AD18 (44312) */
+    3347, /* AD19 (44313) */
+    3347, /* AD1A (44314) */
+    3347, /* AD1B (44315) */
+    3347, /* AD1C (44316) */
+    3347, /* AD1D (44317) */
+    3347, /* AD1E (44318) */
+    3347, /* AD1F (44319) */
+    3347, /* AD20 (44320) */
+    3347, /* AD21 (44321) */
+    3347, /* AD22 (44322) */
+    3347, /* AD23 (44323) */
+    3347, /* AD24 (44324) */
+    3347, /* AD25 (44325) */
+    3347, /* AD26 (44326) */
+    3347, /* AD27 (44327) */
+    3347, /* AD28 (44328) */
+    3347, /* AD29 (44329) */
+    3347, /* AD2A (44330) */
+    3347, /* AD2B (44331) */
+    3347, /* AD2C (44332) */
+    3347, /* AD2D (44333) */
+    3347, /* AD2E (44334) */
+    3347, /* AD2F (44335) */
+    3347, /* AD30 (44336) */
+    3347, /* AD31 (44337) */
+    3347, /* AD32 (44338) */
+    3347, /* AD33 (44339) */
+    3347, /* AD34 (44340) */
+    3347, /* AD35 (44341) */
+    3347, /* AD36 (44342) */
+    3347, /* AD37 (44343) */
+    3347, /* AD38 (44344) */
+    3347, /* AD39 (44345) */
+    3347, /* AD3A (44346) */
+    3347, /* AD3B (44347) */
+    3347, /* AD3C (44348) */
+    3347, /* AD3D (44349) */
+    3347, /* AD3E (44350) */
+    3347, /* AD3F (44351) */
+    3347, /* AD40 (44352) */
+    3347, /* AD41 (44353) */
+    3347, /* AD42 (44354) */
+    3347, /* AD43 (44355) */
+    3347, /* AD44 (44356) */
+    3347, /* AD45 (44357) */
+    3347, /* AD46 (44358) */
+    3347, /* AD47 (44359) */
+    3347, /* AD48 (44360) */
+    3347, /* AD49 (44361) */
+    3347, /* AD4A (44362) */
+    3347, /* AD4B (44363) */
+    3347, /* AD4C (44364) */
+    3347, /* AD4D (44365) */
+    3347, /* AD4E (44366) */
+    3347, /* AD4F (44367) */
+    3347, /* AD50 (44368) */
+    3347, /* AD51 (44369) */
+    3347, /* AD52 (44370) */
+    3347, /* AD53 (44371) */
+    3347, /* AD54 (44372) */
+    3347, /* AD55 (44373) */
+    3347, /* AD56 (44374) */
+    3347, /* AD57 (44375) */
+    3347, /* AD58 (44376) */
+    3347, /* AD59 (44377) */
+    3347, /* AD5A (44378) */
+    3347, /* AD5B (44379) */
+    3347, /* AD5C (44380) */
+    3347, /* AD5D (44381) */
+    3347, /* AD5E (44382) */
+    3347, /* AD5F (44383) */
+    3347, /* AD60 (44384) */
+    3347, /* AD61 (44385) */
+    3347, /* AD62 (44386) */
+    3347, /* AD63 (44387) */
+    3347, /* AD64 (44388) */
+    3347, /* AD65 (44389) */
+    3347, /* AD66 (44390) */
+    3347, /* AD67 (44391) */
+    3347, /* AD68 (44392) */
+    3347, /* AD69 (44393) */
+    3347, /* AD6A (44394) */
+    3347, /* AD6B (44395) */
+    3347, /* AD6C (44396) */
+    3347, /* AD6D (44397) */
+    3347, /* AD6E (44398) */
+    3347, /* AD6F (44399) */
+    3347, /* AD70 (44400) */
+    3347, /* AD71 (44401) */
+    3347, /* AD72 (44402) */
+    3347, /* AD73 (44403) */
+    3347, /* AD74 (44404) */
+    3347, /* AD75 (44405) */
+    3347, /* AD76 (44406) */
+    3347, /* AD77 (44407) */
+    3347, /* AD78 (44408) */
+    3347, /* AD79 (44409) */
+    3347, /* AD7A (44410) */
+    3347, /* AD7B (44411) */
+    3347, /* AD7C (44412) */
+    3347, /* AD7D (44413) */
+    3347, /* AD7E (44414) */
+    3347, /* AD7F (44415) */
+    3347, /* AD80 (44416) */
+    3347, /* AD81 (44417) */
+    3347, /* AD82 (44418) */
+    3347, /* AD83 (44419) */
+    3347, /* AD84 (44420) */
+    3347, /* AD85 (44421) */
+    3347, /* AD86 (44422) */
+    3347, /* AD87 (44423) */
+    3347, /* AD88 (44424) */
+    3347, /* AD89 (44425) */
+    3347, /* AD8A (44426) */
+    3347, /* AD8B (44427) */
+    3347, /* AD8C (44428) */
+    3347, /* AD8D (44429) */
+    3347, /* AD8E (44430) */
+    3347, /* AD8F (44431) */
+    3347, /* AD90 (44432) */
+    3347, /* AD91 (44433) */
+    3347, /* AD92 (44434) */
+    3347, /* AD93 (44435) */
+    3347, /* AD94 (44436) */
+    3347, /* AD95 (44437) */
+    3347, /* AD96 (44438) */
+    3347, /* AD97 (44439) */
+    3347, /* AD98 (44440) */
+    3347, /* AD99 (44441) */
+    3347, /* AD9A (44442) */
+    3347, /* AD9B (44443) */
+    3347, /* AD9C (44444) */
+    3347, /* AD9D (44445) */
+    3347, /* AD9E (44446) */
+    3347, /* AD9F (44447) */
+    3347, /* ADA0 (44448) */
+    3347, /* ADA1 (44449) */
+    3347, /* ADA2 (44450) */
+    3347, /* ADA3 (44451) */
+    3347, /* ADA4 (44452) */
+    3347, /* ADA5 (44453) */
+    3347, /* ADA6 (44454) */
+    3347, /* ADA7 (44455) */
+    3347, /* ADA8 (44456) */
+    3347, /* ADA9 (44457) */
+    3347, /* ADAA (44458) */
+    3347, /* ADAB (44459) */
+    3347, /* ADAC (44460) */
+    3347, /* ADAD (44461) */
+    3347, /* ADAE (44462) */
+    3347, /* ADAF (44463) */
+    3347, /* ADB0 (44464) */
+    3347, /* ADB1 (44465) */
+    3347, /* ADB2 (44466) */
+    3347, /* ADB3 (44467) */
+    3347, /* ADB4 (44468) */
+    3347, /* ADB5 (44469) */
+    3347, /* ADB6 (44470) */
+    3347, /* ADB7 (44471) */
+    3347, /* ADB8 (44472) */
+    3347, /* ADB9 (44473) */
+    3347, /* ADBA (44474) */
+    3347, /* ADBB (44475) */
+    3347, /* ADBC (44476) */
+    3347, /* ADBD (44477) */
+    3347, /* ADBE (44478) */
+    3347, /* ADBF (44479) */
+    3347, /* ADC0 (44480) */
+    3347, /* ADC1 (44481) */
+    3347, /* ADC2 (44482) */
+    3347, /* ADC3 (44483) */
+    3347, /* ADC4 (44484) */
+    3347, /* ADC5 (44485) */
+    3347, /* ADC6 (44486) */
+    3347, /* ADC7 (44487) */
+    3347, /* ADC8 (44488) */
+    3347, /* ADC9 (44489) */
+    3347, /* ADCA (44490) */
+    3347, /* ADCB (44491) */
+    3347, /* ADCC (44492) */
+    3347, /* ADCD (44493) */
+    3347, /* ADCE (44494) */
+    3347, /* ADCF (44495) */
+    3347, /* ADD0 (44496) */
+    3347, /* ADD1 (44497) */
+    3347, /* ADD2 (44498) */
+    3347, /* ADD3 (44499) */
+    3347, /* ADD4 (44500) */
+    3347, /* ADD5 (44501) */
+    3347, /* ADD6 (44502) */
+    3347, /* ADD7 (44503) */
+    3347, /* ADD8 (44504) */
+    3347, /* ADD9 (44505) */
+    3347, /* ADDA (44506) */
+    3347, /* ADDB (44507) */
+    3347, /* ADDC (44508) */
+    3347, /* ADDD (44509) */
+    3347, /* ADDE (44510) */
+    3347, /* ADDF (44511) */
+    3347, /* ADE0 (44512) */
+    3347, /* ADE1 (44513) */
+    3347, /* ADE2 (44514) */
+    3347, /* ADE3 (44515) */
+    3347, /* ADE4 (44516) */
+    3347, /* ADE5 (44517) */
+    3347, /* ADE6 (44518) */
+    3347, /* ADE7 (44519) */
+    3347, /* ADE8 (44520) */
+    3347, /* ADE9 (44521) */
+    3347, /* ADEA (44522) */
+    3347, /* ADEB (44523) */
+    3347, /* ADEC (44524) */
+    3347, /* ADED (44525) */
+    3347, /* ADEE (44526) */
+    3347, /* ADEF (44527) */
+    3347, /* ADF0 (44528) */
+    3347, /* ADF1 (44529) */
+    3347, /* ADF2 (44530) */
+    3347, /* ADF3 (44531) */
+    3347, /* ADF4 (44532) */
+    3347, /* ADF5 (44533) */
+    3347, /* ADF6 (44534) */
+    3347, /* ADF7 (44535) */
+    3347, /* ADF8 (44536) */
+    3347, /* ADF9 (44537) */
+    3347, /* ADFA (44538) */
+    3347, /* ADFB (44539) */
+    3347, /* ADFC (44540) */
+    3347, /* ADFD (44541) */
+    3347, /* ADFE (44542) */
+    3347, /* ADFF (44543) */
+    3347, /* AE00 (44544) */
+    3347, /* AE01 (44545) */
+    3347, /* AE02 (44546) */
+    3347, /* AE03 (44547) */
+    3347, /* AE04 (44548) */
+    3347, /* AE05 (44549) */
+    3347, /* AE06 (44550) */
+    3347, /* AE07 (44551) */
+    3347, /* AE08 (44552) */
+    3347, /* AE09 (44553) */
+    3347, /* AE0A (44554) */
+    3347, /* AE0B (44555) */
+    3347, /* AE0C (44556) */
+    3347, /* AE0D (44557) */
+    3347, /* AE0E (44558) */
+    3347, /* AE0F (44559) */
+    3347, /* AE10 (44560) */
+    3347, /* AE11 (44561) */
+    3347, /* AE12 (44562) */
+    3347, /* AE13 (44563) */
+    3347, /* AE14 (44564) */
+    3347, /* AE15 (44565) */
+    3347, /* AE16 (44566) */
+    3347, /* AE17 (44567) */
+    3347, /* AE18 (44568) */
+    3347, /* AE19 (44569) */
+    3347, /* AE1A (44570) */
+    3347, /* AE1B (44571) */
+    3347, /* AE1C (44572) */
+    3347, /* AE1D (44573) */
+    3347, /* AE1E (44574) */
+    3347, /* AE1F (44575) */
+    3347, /* AE20 (44576) */
+    3347, /* AE21 (44577) */
+    3347, /* AE22 (44578) */
+    3347, /* AE23 (44579) */
+    3347, /* AE24 (44580) */
+    3347, /* AE25 (44581) */
+    3347, /* AE26 (44582) */
+    3347, /* AE27 (44583) */
+    3347, /* AE28 (44584) */
+    3347, /* AE29 (44585) */
+    3347, /* AE2A (44586) */
+    3347, /* AE2B (44587) */
+    3347, /* AE2C (44588) */
+    3347, /* AE2D (44589) */
+    3347, /* AE2E (44590) */
+    3347, /* AE2F (44591) */
+    3347, /* AE30 (44592) */
+    3347, /* AE31 (44593) */
+    3347, /* AE32 (44594) */
+    3347, /* AE33 (44595) */
+    3347, /* AE34 (44596) */
+    3347, /* AE35 (44597) */
+    3347, /* AE36 (44598) */
+    3347, /* AE37 (44599) */
+    3347, /* AE38 (44600) */
+    3347, /* AE39 (44601) */
+    3347, /* AE3A (44602) */
+    3347, /* AE3B (44603) */
+    3347, /* AE3C (44604) */
+    3347, /* AE3D (44605) */
+    3347, /* AE3E (44606) */
+    3347, /* AE3F (44607) */
+    3347, /* AE40 (44608) */
+    3347, /* AE41 (44609) */
+    3347, /* AE42 (44610) */
+    3347, /* AE43 (44611) */
+    3347, /* AE44 (44612) */
+    3347, /* AE45 (44613) */
+    3347, /* AE46 (44614) */
+    3347, /* AE47 (44615) */
+    3347, /* AE48 (44616) */
+    3347, /* AE49 (44617) */
+    3347, /* AE4A (44618) */
+    3347, /* AE4B (44619) */
+    3347, /* AE4C (44620) */
+    3347, /* AE4D (44621) */
+    3347, /* AE4E (44622) */
+    3347, /* AE4F (44623) */
+    3347, /* AE50 (44624) */
+    3347, /* AE51 (44625) */
+    3347, /* AE52 (44626) */
+    3347, /* AE53 (44627) */
+    3347, /* AE54 (44628) */
+    3347, /* AE55 (44629) */
+    3347, /* AE56 (44630) */
+    3347, /* AE57 (44631) */
+    3347, /* AE58 (44632) */
+    3347, /* AE59 (44633) */
+    3347, /* AE5A (44634) */
+    3347, /* AE5B (44635) */
+    3347, /* AE5C (44636) */
+    3347, /* AE5D (44637) */
+    3347, /* AE5E (44638) */
+    3347, /* AE5F (44639) */
+    3347, /* AE60 (44640) */
+    3347, /* AE61 (44641) */
+    3347, /* AE62 (44642) */
+    3347, /* AE63 (44643) */
+    3347, /* AE64 (44644) */
+    3347, /* AE65 (44645) */
+    3347, /* AE66 (44646) */
+    3347, /* AE67 (44647) */
+    3347, /* AE68 (44648) */
+    3347, /* AE69 (44649) */
+    3347, /* AE6A (44650) */
+    3347, /* AE6B (44651) */
+    3347, /* AE6C (44652) */
+    3347, /* AE6D (44653) */
+    3347, /* AE6E (44654) */
+    3347, /* AE6F (44655) */
+    3347, /* AE70 (44656) */
+    3347, /* AE71 (44657) */
+    3347, /* AE72 (44658) */
+    3347, /* AE73 (44659) */
+    3347, /* AE74 (44660) */
+    3347, /* AE75 (44661) */
+    3347, /* AE76 (44662) */
+    3347, /* AE77 (44663) */
+    3347, /* AE78 (44664) */
+    3347, /* AE79 (44665) */
+    3347, /* AE7A (44666) */
+    3347, /* AE7B (44667) */
+    3347, /* AE7C (44668) */
+    3347, /* AE7D (44669) */
+    3347, /* AE7E (44670) */
+    3347, /* AE7F (44671) */
+    3347, /* AE80 (44672) */
+    3347, /* AE81 (44673) */
+    3347, /* AE82 (44674) */
+    3347, /* AE83 (44675) */
+    3347, /* AE84 (44676) */
+    3347, /* AE85 (44677) */
+    3347, /* AE86 (44678) */
+    3347, /* AE87 (44679) */
+    3347, /* AE88 (44680) */
+    3347, /* AE89 (44681) */
+    3347, /* AE8A (44682) */
+    3347, /* AE8B (44683) */
+    3347, /* AE8C (44684) */
+    3347, /* AE8D (44685) */
+    3347, /* AE8E (44686) */
+    3347, /* AE8F (44687) */
+    3347, /* AE90 (44688) */
+    3347, /* AE91 (44689) */
+    3347, /* AE92 (44690) */
+    3347, /* AE93 (44691) */
+    3347, /* AE94 (44692) */
+    3347, /* AE95 (44693) */
+    3347, /* AE96 (44694) */
+    3347, /* AE97 (44695) */
+    3347, /* AE98 (44696) */
+    3347, /* AE99 (44697) */
+    3347, /* AE9A (44698) */
+    3347, /* AE9B (44699) */
+    3347, /* AE9C (44700) */
+    3347, /* AE9D (44701) */
+    3347, /* AE9E (44702) */
+    3347, /* AE9F (44703) */
+    3347, /* AEA0 (44704) */
+    3347, /* AEA1 (44705) */
+    3347, /* AEA2 (44706) */
+    3347, /* AEA3 (44707) */
+    3347, /* AEA4 (44708) */
+    3347, /* AEA5 (44709) */
+    3347, /* AEA6 (44710) */
+    3347, /* AEA7 (44711) */
+    3347, /* AEA8 (44712) */
+    3347, /* AEA9 (44713) */
+    3347, /* AEAA (44714) */
+    3347, /* AEAB (44715) */
+    3347, /* AEAC (44716) */
+    3347, /* AEAD (44717) */
+    3347, /* AEAE (44718) */
+    3347, /* AEAF (44719) */
+    3347, /* AEB0 (44720) */
+    3347, /* AEB1 (44721) */
+    3347, /* AEB2 (44722) */
+    3347, /* AEB3 (44723) */
+    3347, /* AEB4 (44724) */
+    3347, /* AEB5 (44725) */
+    3347, /* AEB6 (44726) */
+    3347, /* AEB7 (44727) */
+    3347, /* AEB8 (44728) */
+    3347, /* AEB9 (44729) */
+    3347, /* AEBA (44730) */
+    3347, /* AEBB (44731) */
+    3347, /* AEBC (44732) */
+    3347, /* AEBD (44733) */
+    3347, /* AEBE (44734) */
+    3347, /* AEBF (44735) */
+    3347, /* AEC0 (44736) */
+    3347, /* AEC1 (44737) */
+    3347, /* AEC2 (44738) */
+    3347, /* AEC3 (44739) */
+    3347, /* AEC4 (44740) */
+    3347, /* AEC5 (44741) */
+    3347, /* AEC6 (44742) */
+    3347, /* AEC7 (44743) */
+    3347, /* AEC8 (44744) */
+    3347, /* AEC9 (44745) */
+    3347, /* AECA (44746) */
+    3347, /* AECB (44747) */
+    3347, /* AECC (44748) */
+    3347, /* AECD (44749) */
+    3347, /* AECE (44750) */
+    3347, /* AECF (44751) */
+    3347, /* AED0 (44752) */
+    3347, /* AED1 (44753) */
+    3347, /* AED2 (44754) */
+    3347, /* AED3 (44755) */
+    3347, /* AED4 (44756) */
+    3347, /* AED5 (44757) */
+    3347, /* AED6 (44758) */
+    3347, /* AED7 (44759) */
+    3347, /* AED8 (44760) */
+    3347, /* AED9 (44761) */
+    3347, /* AEDA (44762) */
+    3347, /* AEDB (44763) */
+    3347, /* AEDC (44764) */
+    3347, /* AEDD (44765) */
+    3347, /* AEDE (44766) */
+    3347, /* AEDF (44767) */
+    3347, /* AEE0 (44768) */
+    3347, /* AEE1 (44769) */
+    3347, /* AEE2 (44770) */
+    3347, /* AEE3 (44771) */
+    3347, /* AEE4 (44772) */
+    3347, /* AEE5 (44773) */
+    3347, /* AEE6 (44774) */
+    3347, /* AEE7 (44775) */
+    3347, /* AEE8 (44776) */
+    3347, /* AEE9 (44777) */
+    3347, /* AEEA (44778) */
+    3347, /* AEEB (44779) */
+    3347, /* AEEC (44780) */
+    3347, /* AEED (44781) */
+    3347, /* AEEE (44782) */
+    3347, /* AEEF (44783) */
+    3347, /* AEF0 (44784) */
+    3347, /* AEF1 (44785) */
+    3347, /* AEF2 (44786) */
+    3347, /* AEF3 (44787) */
+    3347, /* AEF4 (44788) */
+    3347, /* AEF5 (44789) */
+    3347, /* AEF6 (44790) */
+    3347, /* AEF7 (44791) */
+    3347, /* AEF8 (44792) */
+    3347, /* AEF9 (44793) */
+    3347, /* AEFA (44794) */
+    3347, /* AEFB (44795) */
+    3347, /* AEFC (44796) */
+    3347, /* AEFD (44797) */
+    3347, /* AEFE (44798) */
+    3347, /* AEFF (44799) */
+    3347, /* AF00 (44800) */
+    3347, /* AF01 (44801) */
+    3347, /* AF02 (44802) */
+    3347, /* AF03 (44803) */
+    3347, /* AF04 (44804) */
+    3347, /* AF05 (44805) */
+    3347, /* AF06 (44806) */
+    3347, /* AF07 (44807) */
+    3347, /* AF08 (44808) */
+    3347, /* AF09 (44809) */
+    3347, /* AF0A (44810) */
+    3347, /* AF0B (44811) */
+    3347, /* AF0C (44812) */
+    3347, /* AF0D (44813) */
+    3347, /* AF0E (44814) */
+    3347, /* AF0F (44815) */
+    3347, /* AF10 (44816) */
+    3347, /* AF11 (44817) */
+    3347, /* AF12 (44818) */
+    3347, /* AF13 (44819) */
+    3347, /* AF14 (44820) */
+    3347, /* AF15 (44821) */
+    3347, /* AF16 (44822) */
+    3347, /* AF17 (44823) */
+    3347, /* AF18 (44824) */
+    3347, /* AF19 (44825) */
+    3347, /* AF1A (44826) */
+    3347, /* AF1B (44827) */
+    3347, /* AF1C (44828) */
+    3347, /* AF1D (44829) */
+    3347, /* AF1E (44830) */
+    3347, /* AF1F (44831) */
+    3347, /* AF20 (44832) */
+    3347, /* AF21 (44833) */
+    3347, /* AF22 (44834) */
+    3347, /* AF23 (44835) */
+    3347, /* AF24 (44836) */
+    3347, /* AF25 (44837) */
+    3347, /* AF26 (44838) */
+    3347, /* AF27 (44839) */
+    3347, /* AF28 (44840) */
+    3347, /* AF29 (44841) */
+    3347, /* AF2A (44842) */
+    3347, /* AF2B (44843) */
+    3347, /* AF2C (44844) */
+    3347, /* AF2D (44845) */
+    3347, /* AF2E (44846) */
+    3347, /* AF2F (44847) */
+    3347, /* AF30 (44848) */
+    3347, /* AF31 (44849) */
+    3347, /* AF32 (44850) */
+    3347, /* AF33 (44851) */
+    3347, /* AF34 (44852) */
+    3347, /* AF35 (44853) */
+    3347, /* AF36 (44854) */
+    3347, /* AF37 (44855) */
+    3347, /* AF38 (44856) */
+    3347, /* AF39 (44857) */
+    3347, /* AF3A (44858) */
+    3347, /* AF3B (44859) */
+    3347, /* AF3C (44860) */
+    3347, /* AF3D (44861) */
+    3347, /* AF3E (44862) */
+    3347, /* AF3F (44863) */
+    3347, /* AF40 (44864) */
+    3347, /* AF41 (44865) */
+    3347, /* AF42 (44866) */
+    3347, /* AF43 (44867) */
+    3347, /* AF44 (44868) */
+    3347, /* AF45 (44869) */
+    3347, /* AF46 (44870) */
+    3347, /* AF47 (44871) */
+    3347, /* AF48 (44872) */
+    3347, /* AF49 (44873) */
+    3347, /* AF4A (44874) */
+    3347, /* AF4B (44875) */
+    3347, /* AF4C (44876) */
+    3347, /* AF4D (44877) */
+    3347, /* AF4E (44878) */
+    3347, /* AF4F (44879) */
+    3347, /* AF50 (44880) */
+    3347, /* AF51 (44881) */
+    3347, /* AF52 (44882) */
+    3347, /* AF53 (44883) */
+    3347, /* AF54 (44884) */
+    3347, /* AF55 (44885) */
+    3347, /* AF56 (44886) */
+    3347, /* AF57 (44887) */
+    3347, /* AF58 (44888) */
+    3347, /* AF59 (44889) */
+    3347, /* AF5A (44890) */
+    3347, /* AF5B (44891) */
+    3347, /* AF5C (44892) */
+    3347, /* AF5D (44893) */
+    3347, /* AF5E (44894) */
+    3347, /* AF5F (44895) */
+    3347, /* AF60 (44896) */
+    3347, /* AF61 (44897) */
+    3347, /* AF62 (44898) */
+    3347, /* AF63 (44899) */
+    3347, /* AF64 (44900) */
+    3347, /* AF65 (44901) */
+    3347, /* AF66 (44902) */
+    3347, /* AF67 (44903) */
+    3347, /* AF68 (44904) */
+    3347, /* AF69 (44905) */
+    3347, /* AF6A (44906) */
+    3347, /* AF6B (44907) */
+    3347, /* AF6C (44908) */
+    3347, /* AF6D (44909) */
+    3347, /* AF6E (44910) */
+    3347, /* AF6F (44911) */
+    3347, /* AF70 (44912) */
+    3347, /* AF71 (44913) */
+    3347, /* AF72 (44914) */
+    3347, /* AF73 (44915) */
+    3347, /* AF74 (44916) */
+    3347, /* AF75 (44917) */
+    3347, /* AF76 (44918) */
+    3347, /* AF77 (44919) */
+    3347, /* AF78 (44920) */
+    3347, /* AF79 (44921) */
+    3347, /* AF7A (44922) */
+    3347, /* AF7B (44923) */
+    3347, /* AF7C (44924) */
+    3347, /* AF7D (44925) */
+    3347, /* AF7E (44926) */
+    3347, /* AF7F (44927) */
+    3347, /* AF80 (44928) */
+    3347, /* AF81 (44929) */
+    3347, /* AF82 (44930) */
+    3347, /* AF83 (44931) */
+    3347, /* AF84 (44932) */
+    3347, /* AF85 (44933) */
+    3347, /* AF86 (44934) */
+    3347, /* AF87 (44935) */
+    3347, /* AF88 (44936) */
+    3347, /* AF89 (44937) */
+    3347, /* AF8A (44938) */
+    3347, /* AF8B (44939) */
+    3347, /* AF8C (44940) */
+    3347, /* AF8D (44941) */
+    3347, /* AF8E (44942) */
+    3347, /* AF8F (44943) */
+    3347, /* AF90 (44944) */
+    3347, /* AF91 (44945) */
+    3347, /* AF92 (44946) */
+    3347, /* AF93 (44947) */
+    3347, /* AF94 (44948) */
+    3347, /* AF95 (44949) */
+    3347, /* AF96 (44950) */
+    3347, /* AF97 (44951) */
+    3347, /* AF98 (44952) */
+    3347, /* AF99 (44953) */
+    3347, /* AF9A (44954) */
+    3347, /* AF9B (44955) */
+    3347, /* AF9C (44956) */
+    3347, /* AF9D (44957) */
+    3347, /* AF9E (44958) */
+    3347, /* AF9F (44959) */
+    3347, /* AFA0 (44960) */
+    3347, /* AFA1 (44961) */
+    3347, /* AFA2 (44962) */
+    3347, /* AFA3 (44963) */
+    3347, /* AFA4 (44964) */
+    3347, /* AFA5 (44965) */
+    3347, /* AFA6 (44966) */
+    3347, /* AFA7 (44967) */
+    3347, /* AFA8 (44968) */
+    3347, /* AFA9 (44969) */
+    3347, /* AFAA (44970) */
+    3347, /* AFAB (44971) */
+    3347, /* AFAC (44972) */
+    3347, /* AFAD (44973) */
+    3347, /* AFAE (44974) */
+    3347, /* AFAF (44975) */
+    3347, /* AFB0 (44976) */
+    3347, /* AFB1 (44977) */
+    3347, /* AFB2 (44978) */
+    3347, /* AFB3 (44979) */
+    3347, /* AFB4 (44980) */
+    3347, /* AFB5 (44981) */
+    3347, /* AFB6 (44982) */
+    3347, /* AFB7 (44983) */
+    3347, /* AFB8 (44984) */
+    3347, /* AFB9 (44985) */
+    3347, /* AFBA (44986) */
+    3347, /* AFBB (44987) */
+    3347, /* AFBC (44988) */
+    3347, /* AFBD (44989) */
+    3347, /* AFBE (44990) */
+    3347, /* AFBF (44991) */
+    3347, /* AFC0 (44992) */
+    3347, /* AFC1 (44993) */
+    3347, /* AFC2 (44994) */
+    3347, /* AFC3 (44995) */
+    3347, /* AFC4 (44996) */
+    3347, /* AFC5 (44997) */
+    3347, /* AFC6 (44998) */
+    3347, /* AFC7 (44999) */
+    3347, /* AFC8 (45000) */
+    3347, /* AFC9 (45001) */
+    3347, /* AFCA (45002) */
+    3347, /* AFCB (45003) */
+    3347, /* AFCC (45004) */
+    3347, /* AFCD (45005) */
+    3347, /* AFCE (45006) */
+    3347, /* AFCF (45007) */
+    3347, /* AFD0 (45008) */
+    3347, /* AFD1 (45009) */
+    3347, /* AFD2 (45010) */
+    3347, /* AFD3 (45011) */
+    3347, /* AFD4 (45012) */
+    3347, /* AFD5 (45013) */
+    3347, /* AFD6 (45014) */
+    3347, /* AFD7 (45015) */
+    3347, /* AFD8 (45016) */
+    3347, /* AFD9 (45017) */
+    3347, /* AFDA (45018) */
+    3347, /* AFDB (45019) */
+    3347, /* AFDC (45020) */
+    3347, /* AFDD (45021) */
+    3347, /* AFDE (45022) */
+    3347, /* AFDF (45023) */
+    3347, /* AFE0 (45024) */
+    3347, /* AFE1 (45025) */
+    3347, /* AFE2 (45026) */
+    3347, /* AFE3 (45027) */
+    3347, /* AFE4 (45028) */
+    3347, /* AFE5 (45029) */
+    3347, /* AFE6 (45030) */
+    3347, /* AFE7 (45031) */
+    3347, /* AFE8 (45032) */
+    3347, /* AFE9 (45033) */
+    3347, /* AFEA (45034) */
+    3347, /* AFEB (45035) */
+    3347, /* AFEC (45036) */
+    3347, /* AFED (45037) */
+    3347, /* AFEE (45038) */
+    3347, /* AFEF (45039) */
+    3347, /* AFF0 (45040) */
+    3347, /* AFF1 (45041) */
+    3347, /* AFF2 (45042) */
+    3347, /* AFF3 (45043) */
+    3347, /* AFF4 (45044) */
+    3347, /* AFF5 (45045) */
+    3347, /* AFF6 (45046) */
+    3347, /* AFF7 (45047) */
+    3347, /* AFF8 (45048) */
+    3347, /* AFF9 (45049) */
+    3347, /* AFFA (45050) */
+    3347, /* AFFB (45051) */
+    3347, /* AFFC (45052) */
+    3347, /* AFFD (45053) */
+    3347, /* AFFE (45054) */
+    3347, /* AFFF (45055) */
+    3347, /* B000 (45056) */
+    3347, /* B001 (45057) */
+    3347, /* B002 (45058) */
+    3347, /* B003 (45059) */
+    3347, /* B004 (45060) */
+    3347, /* B005 (45061) */
+    3347, /* B006 (45062) */
+    3347, /* B007 (45063) */
+    3347, /* B008 (45064) */
+    3347, /* B009 (45065) */
+    3347, /* B00A (45066) */
+    3347, /* B00B (45067) */
+    3347, /* B00C (45068) */
+    3347, /* B00D (45069) */
+    3347, /* B00E (45070) */
+    3347, /* B00F (45071) */
+    3347, /* B010 (45072) */
+    3347, /* B011 (45073) */
+    3347, /* B012 (45074) */
+    3347, /* B013 (45075) */
+    3347, /* B014 (45076) */
+    3347, /* B015 (45077) */
+    3347, /* B016 (45078) */
+    3347, /* B017 (45079) */
+    3347, /* B018 (45080) */
+    3347, /* B019 (45081) */
+    3347, /* B01A (45082) */
+    3347, /* B01B (45083) */
+    3347, /* B01C (45084) */
+    3347, /* B01D (45085) */
+    3347, /* B01E (45086) */
+    3347, /* B01F (45087) */
+    3347, /* B020 (45088) */
+    3347, /* B021 (45089) */
+    3347, /* B022 (45090) */
+    3347, /* B023 (45091) */
+    3347, /* B024 (45092) */
+    3347, /* B025 (45093) */
+    3347, /* B026 (45094) */
+    3347, /* B027 (45095) */
+    3347, /* B028 (45096) */
+    3347, /* B029 (45097) */
+    3347, /* B02A (45098) */
+    3347, /* B02B (45099) */
+    3347, /* B02C (45100) */
+    3347, /* B02D (45101) */
+    3347, /* B02E (45102) */
+    3347, /* B02F (45103) */
+    3347, /* B030 (45104) */
+    3347, /* B031 (45105) */
+    3347, /* B032 (45106) */
+    3347, /* B033 (45107) */
+    3347, /* B034 (45108) */
+    3347, /* B035 (45109) */
+    3347, /* B036 (45110) */
+    3347, /* B037 (45111) */
+    3347, /* B038 (45112) */
+    3347, /* B039 (45113) */
+    3347, /* B03A (45114) */
+    3347, /* B03B (45115) */
+    3347, /* B03C (45116) */
+    3347, /* B03D (45117) */
+    3347, /* B03E (45118) */
+    3347, /* B03F (45119) */
+    3347, /* B040 (45120) */
+    3347, /* B041 (45121) */
+    3347, /* B042 (45122) */
+    3347, /* B043 (45123) */
+    3347, /* B044 (45124) */
+    3347, /* B045 (45125) */
+    3347, /* B046 (45126) */
+    3347, /* B047 (45127) */
+    3347, /* B048 (45128) */
+    3347, /* B049 (45129) */
+    3347, /* B04A (45130) */
+    3347, /* B04B (45131) */
+    3347, /* B04C (45132) */
+    3347, /* B04D (45133) */
+    3347, /* B04E (45134) */
+    3347, /* B04F (45135) */
+    3347, /* B050 (45136) */
+    3347, /* B051 (45137) */
+    3347, /* B052 (45138) */
+    3347, /* B053 (45139) */
+    3347, /* B054 (45140) */
+    3347, /* B055 (45141) */
+    3347, /* B056 (45142) */
+    3347, /* B057 (45143) */
+    3347, /* B058 (45144) */
+    3347, /* B059 (45145) */
+    3347, /* B05A (45146) */
+    3347, /* B05B (45147) */
+    3347, /* B05C (45148) */
+    3347, /* B05D (45149) */
+    3347, /* B05E (45150) */
+    3347, /* B05F (45151) */
+    3347, /* B060 (45152) */
+    3347, /* B061 (45153) */
+    3347, /* B062 (45154) */
+    3347, /* B063 (45155) */
+    3347, /* B064 (45156) */
+    3347, /* B065 (45157) */
+    3347, /* B066 (45158) */
+    3347, /* B067 (45159) */
+    3347, /* B068 (45160) */
+    3347, /* B069 (45161) */
+    3347, /* B06A (45162) */
+    3347, /* B06B (45163) */
+    3347, /* B06C (45164) */
+    3347, /* B06D (45165) */
+    3347, /* B06E (45166) */
+    3347, /* B06F (45167) */
+    3347, /* B070 (45168) */
+    3347, /* B071 (45169) */
+    3347, /* B072 (45170) */
+    3347, /* B073 (45171) */
+    3347, /* B074 (45172) */
+    3347, /* B075 (45173) */
+    3347, /* B076 (45174) */
+    3347, /* B077 (45175) */
+    3347, /* B078 (45176) */
+    3347, /* B079 (45177) */
+    3347, /* B07A (45178) */
+    3347, /* B07B (45179) */
+    3347, /* B07C (45180) */
+    3347, /* B07D (45181) */
+    3347, /* B07E (45182) */
+    3347, /* B07F (45183) */
+    3347, /* B080 (45184) */
+    3347, /* B081 (45185) */
+    3347, /* B082 (45186) */
+    3347, /* B083 (45187) */
+    3347, /* B084 (45188) */
+    3347, /* B085 (45189) */
+    3347, /* B086 (45190) */
+    3347, /* B087 (45191) */
+    3347, /* B088 (45192) */
+    3347, /* B089 (45193) */
+    3347, /* B08A (45194) */
+    3347, /* B08B (45195) */
+    3347, /* B08C (45196) */
+    3347, /* B08D (45197) */
+    3347, /* B08E (45198) */
+    3347, /* B08F (45199) */
+    3347, /* B090 (45200) */
+    3347, /* B091 (45201) */
+    3347, /* B092 (45202) */
+    3347, /* B093 (45203) */
+    3347, /* B094 (45204) */
+    3347, /* B095 (45205) */
+    3347, /* B096 (45206) */
+    3347, /* B097 (45207) */
+    3347, /* B098 (45208) */
+    3347, /* B099 (45209) */
+    3347, /* B09A (45210) */
+    3347, /* B09B (45211) */
+    3347, /* B09C (45212) */
+    3347, /* B09D (45213) */
+    3347, /* B09E (45214) */
+    3347, /* B09F (45215) */
+    3347, /* B0A0 (45216) */
+    3347, /* B0A1 (45217) */
+    3347, /* B0A2 (45218) */
+    3347, /* B0A3 (45219) */
+    3347, /* B0A4 (45220) */
+    3347, /* B0A5 (45221) */
+    3347, /* B0A6 (45222) */
+    3347, /* B0A7 (45223) */
+    3347, /* B0A8 (45224) */
+    3347, /* B0A9 (45225) */
+    3347, /* B0AA (45226) */
+    3347, /* B0AB (45227) */
+    3347, /* B0AC (45228) */
+    3347, /* B0AD (45229) */
+    3347, /* B0AE (45230) */
+    3347, /* B0AF (45231) */
+    3347, /* B0B0 (45232) */
+    3347, /* B0B1 (45233) */
+    3347, /* B0B2 (45234) */
+    3347, /* B0B3 (45235) */
+    3347, /* B0B4 (45236) */
+    3347, /* B0B5 (45237) */
+    3347, /* B0B6 (45238) */
+    3347, /* B0B7 (45239) */
+    3347, /* B0B8 (45240) */
+    3347, /* B0B9 (45241) */
+    3347, /* B0BA (45242) */
+    3347, /* B0BB (45243) */
+    3347, /* B0BC (45244) */
+    3347, /* B0BD (45245) */
+    3347, /* B0BE (45246) */
+    3347, /* B0BF (45247) */
+    3347, /* B0C0 (45248) */
+    3347, /* B0C1 (45249) */
+    3347, /* B0C2 (45250) */
+    3347, /* B0C3 (45251) */
+    3347, /* B0C4 (45252) */
+    3347, /* B0C5 (45253) */
+    3347, /* B0C6 (45254) */
+    3347, /* B0C7 (45255) */
+    3347, /* B0C8 (45256) */
+    3347, /* B0C9 (45257) */
+    3347, /* B0CA (45258) */
+    3347, /* B0CB (45259) */
+    3347, /* B0CC (45260) */
+    3347, /* B0CD (45261) */
+    3347, /* B0CE (45262) */
+    3347, /* B0CF (45263) */
+    3347, /* B0D0 (45264) */
+    3347, /* B0D1 (45265) */
+    3347, /* B0D2 (45266) */
+    3347, /* B0D3 (45267) */
+    3347, /* B0D4 (45268) */
+    3347, /* B0D5 (45269) */
+    3347, /* B0D6 (45270) */
+    3347, /* B0D7 (45271) */
+    3347, /* B0D8 (45272) */
+    3347, /* B0D9 (45273) */
+    3347, /* B0DA (45274) */
+    3347, /* B0DB (45275) */
+    3347, /* B0DC (45276) */
+    3347, /* B0DD (45277) */
+    3347, /* B0DE (45278) */
+    3347, /* B0DF (45279) */
+    3347, /* B0E0 (45280) */
+    3347, /* B0E1 (45281) */
+    3347, /* B0E2 (45282) */
+    3347, /* B0E3 (45283) */
+    3347, /* B0E4 (45284) */
+    3347, /* B0E5 (45285) */
+    3347, /* B0E6 (45286) */
+    3347, /* B0E7 (45287) */
+    3347, /* B0E8 (45288) */
+    3347, /* B0E9 (45289) */
+    3347, /* B0EA (45290) */
+    3347, /* B0EB (45291) */
+    3347, /* B0EC (45292) */
+    3347, /* B0ED (45293) */
+    3347, /* B0EE (45294) */
+    3347, /* B0EF (45295) */
+    3347, /* B0F0 (45296) */
+    3347, /* B0F1 (45297) */
+    3347, /* B0F2 (45298) */
+    3347, /* B0F3 (45299) */
+    3347, /* B0F4 (45300) */
+    3347, /* B0F5 (45301) */
+    3347, /* B0F6 (45302) */
+    3347, /* B0F7 (45303) */
+    3347, /* B0F8 (45304) */
+    3347, /* B0F9 (45305) */
+    3347, /* B0FA (45306) */
+    3347, /* B0FB (45307) */
+    3347, /* B0FC (45308) */
+    3347, /* B0FD (45309) */
+    3347, /* B0FE (45310) */
+    3347, /* B0FF (45311) */
+    3347, /* B100 (45312) */
+    3347, /* B101 (45313) */
+    3347, /* B102 (45314) */
+    3347, /* B103 (45315) */
+    3347, /* B104 (45316) */
+    3347, /* B105 (45317) */
+    3347, /* B106 (45318) */
+    3347, /* B107 (45319) */
+    3347, /* B108 (45320) */
+    3347, /* B109 (45321) */
+    3347, /* B10A (45322) */
+    3347, /* B10B (45323) */
+    3347, /* B10C (45324) */
+    3347, /* B10D (45325) */
+    3347, /* B10E (45326) */
+    3347, /* B10F (45327) */
+    3347, /* B110 (45328) */
+    3347, /* B111 (45329) */
+    3347, /* B112 (45330) */
+    3347, /* B113 (45331) */
+    3347, /* B114 (45332) */
+    3347, /* B115 (45333) */
+    3347, /* B116 (45334) */
+    3347, /* B117 (45335) */
+    3347, /* B118 (45336) */
+    3347, /* B119 (45337) */
+    3347, /* B11A (45338) */
+    3347, /* B11B (45339) */
+    3347, /* B11C (45340) */
+    3347, /* B11D (45341) */
+    3347, /* B11E (45342) */
+    3347, /* B11F (45343) */
+    3347, /* B120 (45344) */
+    3347, /* B121 (45345) */
+    3347, /* B122 (45346) */
+    3347, /* B123 (45347) */
+    3347, /* B124 (45348) */
+    3347, /* B125 (45349) */
+    3347, /* B126 (45350) */
+    3347, /* B127 (45351) */
+    3347, /* B128 (45352) */
+    3347, /* B129 (45353) */
+    3347, /* B12A (45354) */
+    3347, /* B12B (45355) */
+    3347, /* B12C (45356) */
+    3347, /* B12D (45357) */
+    3347, /* B12E (45358) */
+    3347, /* B12F (45359) */
+    3347, /* B130 (45360) */
+    3347, /* B131 (45361) */
+    3347, /* B132 (45362) */
+    3347, /* B133 (45363) */
+    3347, /* B134 (45364) */
+    3347, /* B135 (45365) */
+    3347, /* B136 (45366) */
+    3347, /* B137 (45367) */
+    3347, /* B138 (45368) */
+    3347, /* B139 (45369) */
+    3347, /* B13A (45370) */
+    3347, /* B13B (45371) */
+    3347, /* B13C (45372) */
+    3347, /* B13D (45373) */
+    3347, /* B13E (45374) */
+    3347, /* B13F (45375) */
+    3347, /* B140 (45376) */
+    3347, /* B141 (45377) */
+    3347, /* B142 (45378) */
+    3347, /* B143 (45379) */
+    3347, /* B144 (45380) */
+    3347, /* B145 (45381) */
+    3347, /* B146 (45382) */
+    3347, /* B147 (45383) */
+    3347, /* B148 (45384) */
+    3347, /* B149 (45385) */
+    3347, /* B14A (45386) */
+    3347, /* B14B (45387) */
+    3347, /* B14C (45388) */
+    3347, /* B14D (45389) */
+    3347, /* B14E (45390) */
+    3347, /* B14F (45391) */
+    3347, /* B150 (45392) */
+    3347, /* B151 (45393) */
+    3347, /* B152 (45394) */
+    3347, /* B153 (45395) */
+    3347, /* B154 (45396) */
+    3347, /* B155 (45397) */
+    3347, /* B156 (45398) */
+    3347, /* B157 (45399) */
+    3347, /* B158 (45400) */
+    3347, /* B159 (45401) */
+    3347, /* B15A (45402) */
+    3347, /* B15B (45403) */
+    3347, /* B15C (45404) */
+    3347, /* B15D (45405) */
+    3347, /* B15E (45406) */
+    3347, /* B15F (45407) */
+    3347, /* B160 (45408) */
+    3347, /* B161 (45409) */
+    3347, /* B162 (45410) */
+    3347, /* B163 (45411) */
+    3347, /* B164 (45412) */
+    3347, /* B165 (45413) */
+    3347, /* B166 (45414) */
+    3347, /* B167 (45415) */
+    3347, /* B168 (45416) */
+    3347, /* B169 (45417) */
+    3347, /* B16A (45418) */
+    3347, /* B16B (45419) */
+    3347, /* B16C (45420) */
+    3347, /* B16D (45421) */
+    3347, /* B16E (45422) */
+    3347, /* B16F (45423) */
+    3347, /* B170 (45424) */
+    3347, /* B171 (45425) */
+    3347, /* B172 (45426) */
+    3347, /* B173 (45427) */
+    3347, /* B174 (45428) */
+    3347, /* B175 (45429) */
+    3347, /* B176 (45430) */
+    3347, /* B177 (45431) */
+    3347, /* B178 (45432) */
+    3347, /* B179 (45433) */
+    3347, /* B17A (45434) */
+    3347, /* B17B (45435) */
+    3347, /* B17C (45436) */
+    3347, /* B17D (45437) */
+    3347, /* B17E (45438) */
+    3347, /* B17F (45439) */
+    3347, /* B180 (45440) */
+    3347, /* B181 (45441) */
+    3347, /* B182 (45442) */
+    3347, /* B183 (45443) */
+    3347, /* B184 (45444) */
+    3347, /* B185 (45445) */
+    3347, /* B186 (45446) */
+    3347, /* B187 (45447) */
+    3347, /* B188 (45448) */
+    3347, /* B189 (45449) */
+    3347, /* B18A (45450) */
+    3347, /* B18B (45451) */
+    3347, /* B18C (45452) */
+    3347, /* B18D (45453) */
+    3347, /* B18E (45454) */
+    3347, /* B18F (45455) */
+    3347, /* B190 (45456) */
+    3347, /* B191 (45457) */
+    3347, /* B192 (45458) */
+    3347, /* B193 (45459) */
+    3347, /* B194 (45460) */
+    3347, /* B195 (45461) */
+    3347, /* B196 (45462) */
+    3347, /* B197 (45463) */
+    3347, /* B198 (45464) */
+    3347, /* B199 (45465) */
+    3347, /* B19A (45466) */
+    3347, /* B19B (45467) */
+    3347, /* B19C (45468) */
+    3347, /* B19D (45469) */
+    3347, /* B19E (45470) */
+    3347, /* B19F (45471) */
+    3347, /* B1A0 (45472) */
+    3347, /* B1A1 (45473) */
+    3347, /* B1A2 (45474) */
+    3347, /* B1A3 (45475) */
+    3347, /* B1A4 (45476) */
+    3347, /* B1A5 (45477) */
+    3347, /* B1A6 (45478) */
+    3347, /* B1A7 (45479) */
+    3347, /* B1A8 (45480) */
+    3347, /* B1A9 (45481) */
+    3347, /* B1AA (45482) */
+    3347, /* B1AB (45483) */
+    3347, /* B1AC (45484) */
+    3347, /* B1AD (45485) */
+    3347, /* B1AE (45486) */
+    3347, /* B1AF (45487) */
+    3347, /* B1B0 (45488) */
+    3347, /* B1B1 (45489) */
+    3347, /* B1B2 (45490) */
+    3347, /* B1B3 (45491) */
+    3347, /* B1B4 (45492) */
+    3347, /* B1B5 (45493) */
+    3347, /* B1B6 (45494) */
+    3347, /* B1B7 (45495) */
+    3347, /* B1B8 (45496) */
+    3347, /* B1B9 (45497) */
+    3347, /* B1BA (45498) */
+    3347, /* B1BB (45499) */
+    3347, /* B1BC (45500) */
+    3347, /* B1BD (45501) */
+    3347, /* B1BE (45502) */
+    3347, /* B1BF (45503) */
+    3347, /* B1C0 (45504) */
+    3347, /* B1C1 (45505) */
+    3347, /* B1C2 (45506) */
+    3347, /* B1C3 (45507) */
+    3347, /* B1C4 (45508) */
+    3347, /* B1C5 (45509) */
+    3347, /* B1C6 (45510) */
+    3347, /* B1C7 (45511) */
+    3347, /* B1C8 (45512) */
+    3347, /* B1C9 (45513) */
+    3347, /* B1CA (45514) */
+    3347, /* B1CB (45515) */
+    3347, /* B1CC (45516) */
+    3347, /* B1CD (45517) */
+    3347, /* B1CE (45518) */
+    3347, /* B1CF (45519) */
+    3347, /* B1D0 (45520) */
+    3347, /* B1D1 (45521) */
+    3347, /* B1D2 (45522) */
+    3347, /* B1D3 (45523) */
+    3347, /* B1D4 (45524) */
+    3347, /* B1D5 (45525) */
+    3347, /* B1D6 (45526) */
+    3347, /* B1D7 (45527) */
+    3347, /* B1D8 (45528) */
+    3347, /* B1D9 (45529) */
+    3347, /* B1DA (45530) */
+    3347, /* B1DB (45531) */
+    3347, /* B1DC (45532) */
+    3347, /* B1DD (45533) */
+    3347, /* B1DE (45534) */
+    3347, /* B1DF (45535) */
+    3347, /* B1E0 (45536) */
+    3347, /* B1E1 (45537) */
+    3347, /* B1E2 (45538) */
+    3347, /* B1E3 (45539) */
+    3347, /* B1E4 (45540) */
+    3347, /* B1E5 (45541) */
+    3347, /* B1E6 (45542) */
+    3347, /* B1E7 (45543) */
+    3347, /* B1E8 (45544) */
+    3347, /* B1E9 (45545) */
+    3347, /* B1EA (45546) */
+    3347, /* B1EB (45547) */
+    3347, /* B1EC (45548) */
+    3347, /* B1ED (45549) */
+    3347, /* B1EE (45550) */
+    3347, /* B1EF (45551) */
+    3347, /* B1F0 (45552) */
+    3347, /* B1F1 (45553) */
+    3347, /* B1F2 (45554) */
+    3347, /* B1F3 (45555) */
+    3347, /* B1F4 (45556) */
+    3347, /* B1F5 (45557) */
+    3347, /* B1F6 (45558) */
+    3347, /* B1F7 (45559) */
+    3347, /* B1F8 (45560) */
+    3347, /* B1F9 (45561) */
+    3347, /* B1FA (45562) */
+    3347, /* B1FB (45563) */
+    3347, /* B1FC (45564) */
+    3347, /* B1FD (45565) */
+    3347, /* B1FE (45566) */
+    3347, /* B1FF (45567) */
+    3347, /* B200 (45568) */
+    3347, /* B201 (45569) */
+    3347, /* B202 (45570) */
+    3347, /* B203 (45571) */
+    3347, /* B204 (45572) */
+    3347, /* B205 (45573) */
+    3347, /* B206 (45574) */
+    3347, /* B207 (45575) */
+    3347, /* B208 (45576) */
+    3347, /* B209 (45577) */
+    3347, /* B20A (45578) */
+    3347, /* B20B (45579) */
+    3347, /* B20C (45580) */
+    3347, /* B20D (45581) */
+    3347, /* B20E (45582) */
+    3347, /* B20F (45583) */
+    3347, /* B210 (45584) */
+    3347, /* B211 (45585) */
+    3347, /* B212 (45586) */
+    3347, /* B213 (45587) */
+    3347, /* B214 (45588) */
+    3347, /* B215 (45589) */
+    3347, /* B216 (45590) */
+    3347, /* B217 (45591) */
+    3347, /* B218 (45592) */
+    3347, /* B219 (45593) */
+    3347, /* B21A (45594) */
+    3347, /* B21B (45595) */
+    3347, /* B21C (45596) */
+    3347, /* B21D (45597) */
+    3347, /* B21E (45598) */
+    3347, /* B21F (45599) */
+    3347, /* B220 (45600) */
+    3347, /* B221 (45601) */
+    3347, /* B222 (45602) */
+    3347, /* B223 (45603) */
+    3347, /* B224 (45604) */
+    3347, /* B225 (45605) */
+    3347, /* B226 (45606) */
+    3347, /* B227 (45607) */
+    3347, /* B228 (45608) */
+    3347, /* B229 (45609) */
+    3347, /* B22A (45610) */
+    3347, /* B22B (45611) */
+    3347, /* B22C (45612) */
+    3347, /* B22D (45613) */
+    3347, /* B22E (45614) */
+    3347, /* B22F (45615) */
+    3347, /* B230 (45616) */
+    3347, /* B231 (45617) */
+    3347, /* B232 (45618) */
+    3347, /* B233 (45619) */
+    3347, /* B234 (45620) */
+    3347, /* B235 (45621) */
+    3347, /* B236 (45622) */
+    3347, /* B237 (45623) */
+    3347, /* B238 (45624) */
+    3347, /* B239 (45625) */
+    3347, /* B23A (45626) */
+    3347, /* B23B (45627) */
+    3347, /* B23C (45628) */
+    3347, /* B23D (45629) */
+    3347, /* B23E (45630) */
+    3347, /* B23F (45631) */
+    3347, /* B240 (45632) */
+    3347, /* B241 (45633) */
+    3347, /* B242 (45634) */
+    3347, /* B243 (45635) */
+    3347, /* B244 (45636) */
+    3347, /* B245 (45637) */
+    3347, /* B246 (45638) */
+    3347, /* B247 (45639) */
+    3347, /* B248 (45640) */
+    3347, /* B249 (45641) */
+    3347, /* B24A (45642) */
+    3347, /* B24B (45643) */
+    3347, /* B24C (45644) */
+    3347, /* B24D (45645) */
+    3347, /* B24E (45646) */
+    3347, /* B24F (45647) */
+    3347, /* B250 (45648) */
+    3347, /* B251 (45649) */
+    3347, /* B252 (45650) */
+    3347, /* B253 (45651) */
+    3347, /* B254 (45652) */
+    3347, /* B255 (45653) */
+    3347, /* B256 (45654) */
+    3347, /* B257 (45655) */
+    3347, /* B258 (45656) */
+    3347, /* B259 (45657) */
+    3347, /* B25A (45658) */
+    3347, /* B25B (45659) */
+    3347, /* B25C (45660) */
+    3347, /* B25D (45661) */
+    3347, /* B25E (45662) */
+    3347, /* B25F (45663) */
+    3347, /* B260 (45664) */
+    3347, /* B261 (45665) */
+    3347, /* B262 (45666) */
+    3347, /* B263 (45667) */
+    3347, /* B264 (45668) */
+    3347, /* B265 (45669) */
+    3347, /* B266 (45670) */
+    3347, /* B267 (45671) */
+    3347, /* B268 (45672) */
+    3347, /* B269 (45673) */
+    3347, /* B26A (45674) */
+    3347, /* B26B (45675) */
+    3347, /* B26C (45676) */
+    3347, /* B26D (45677) */
+    3347, /* B26E (45678) */
+    3347, /* B26F (45679) */
+    3347, /* B270 (45680) */
+    3347, /* B271 (45681) */
+    3347, /* B272 (45682) */
+    3347, /* B273 (45683) */
+    3347, /* B274 (45684) */
+    3347, /* B275 (45685) */
+    3347, /* B276 (45686) */
+    3347, /* B277 (45687) */
+    3347, /* B278 (45688) */
+    3347, /* B279 (45689) */
+    3347, /* B27A (45690) */
+    3347, /* B27B (45691) */
+    3347, /* B27C (45692) */
+    3347, /* B27D (45693) */
+    3347, /* B27E (45694) */
+    3347, /* B27F (45695) */
+    3347, /* B280 (45696) */
+    3347, /* B281 (45697) */
+    3347, /* B282 (45698) */
+    3347, /* B283 (45699) */
+    3347, /* B284 (45700) */
+    3347, /* B285 (45701) */
+    3347, /* B286 (45702) */
+    3347, /* B287 (45703) */
+    3347, /* B288 (45704) */
+    3347, /* B289 (45705) */
+    3347, /* B28A (45706) */
+    3347, /* B28B (45707) */
+    3347, /* B28C (45708) */
+    3347, /* B28D (45709) */
+    3347, /* B28E (45710) */
+    3347, /* B28F (45711) */
+    3347, /* B290 (45712) */
+    3347, /* B291 (45713) */
+    3347, /* B292 (45714) */
+    3347, /* B293 (45715) */
+    3347, /* B294 (45716) */
+    3347, /* B295 (45717) */
+    3347, /* B296 (45718) */
+    3347, /* B297 (45719) */
+    3347, /* B298 (45720) */
+    3347, /* B299 (45721) */
+    3347, /* B29A (45722) */
+    3347, /* B29B (45723) */
+    3347, /* B29C (45724) */
+    3347, /* B29D (45725) */
+    3347, /* B29E (45726) */
+    3347, /* B29F (45727) */
+    3347, /* B2A0 (45728) */
+    3347, /* B2A1 (45729) */
+    3347, /* B2A2 (45730) */
+    3347, /* B2A3 (45731) */
+    3347, /* B2A4 (45732) */
+    3347, /* B2A5 (45733) */
+    3347, /* B2A6 (45734) */
+    3347, /* B2A7 (45735) */
+    3347, /* B2A8 (45736) */
+    3347, /* B2A9 (45737) */
+    3347, /* B2AA (45738) */
+    3347, /* B2AB (45739) */
+    3347, /* B2AC (45740) */
+    3347, /* B2AD (45741) */
+    3347, /* B2AE (45742) */
+    3347, /* B2AF (45743) */
+    3347, /* B2B0 (45744) */
+    3347, /* B2B1 (45745) */
+    3347, /* B2B2 (45746) */
+    3347, /* B2B3 (45747) */
+    3347, /* B2B4 (45748) */
+    3347, /* B2B5 (45749) */
+    3347, /* B2B6 (45750) */
+    3347, /* B2B7 (45751) */
+    3347, /* B2B8 (45752) */
+    3347, /* B2B9 (45753) */
+    3347, /* B2BA (45754) */
+    3347, /* B2BB (45755) */
+    3347, /* B2BC (45756) */
+    3347, /* B2BD (45757) */
+    3347, /* B2BE (45758) */
+    3347, /* B2BF (45759) */
+    3347, /* B2C0 (45760) */
+    3347, /* B2C1 (45761) */
+    3347, /* B2C2 (45762) */
+    3347, /* B2C3 (45763) */
+    3347, /* B2C4 (45764) */
+    3347, /* B2C5 (45765) */
+    3347, /* B2C6 (45766) */
+    3347, /* B2C7 (45767) */
+    3347, /* B2C8 (45768) */
+    3347, /* B2C9 (45769) */
+    3347, /* B2CA (45770) */
+    3347, /* B2CB (45771) */
+    3347, /* B2CC (45772) */
+    3347, /* B2CD (45773) */
+    3347, /* B2CE (45774) */
+    3347, /* B2CF (45775) */
+    3347, /* B2D0 (45776) */
+    3347, /* B2D1 (45777) */
+    3347, /* B2D2 (45778) */
+    3347, /* B2D3 (45779) */
+    3347, /* B2D4 (45780) */
+    3347, /* B2D5 (45781) */
+    3347, /* B2D6 (45782) */
+    3347, /* B2D7 (45783) */
+    3347, /* B2D8 (45784) */
+    3347, /* B2D9 (45785) */
+    3347, /* B2DA (45786) */
+    3347, /* B2DB (45787) */
+    3347, /* B2DC (45788) */
+    3347, /* B2DD (45789) */
+    3347, /* B2DE (45790) */
+    3347, /* B2DF (45791) */
+    3347, /* B2E0 (45792) */
+    3347, /* B2E1 (45793) */
+    3347, /* B2E2 (45794) */
+    3347, /* B2E3 (45795) */
+    3347, /* B2E4 (45796) */
+    3347, /* B2E5 (45797) */
+    3347, /* B2E6 (45798) */
+    3347, /* B2E7 (45799) */
+    3347, /* B2E8 (45800) */
+    3347, /* B2E9 (45801) */
+    3347, /* B2EA (45802) */
+    3347, /* B2EB (45803) */
+    3347, /* B2EC (45804) */
+    3347, /* B2ED (45805) */
+    3347, /* B2EE (45806) */
+    3347, /* B2EF (45807) */
+    3347, /* B2F0 (45808) */
+    3347, /* B2F1 (45809) */
+    3347, /* B2F2 (45810) */
+    3347, /* B2F3 (45811) */
+    3347, /* B2F4 (45812) */
+    3347, /* B2F5 (45813) */
+    3347, /* B2F6 (45814) */
+    3347, /* B2F7 (45815) */
+    3347, /* B2F8 (45816) */
+    3347, /* B2F9 (45817) */
+    3347, /* B2FA (45818) */
+    3347, /* B2FB (45819) */
+    3347, /* B2FC (45820) */
+    3347, /* B2FD (45821) */
+    3347, /* B2FE (45822) */
+    3347, /* B2FF (45823) */
+    3347, /* B300 (45824) */
+    3347, /* B301 (45825) */
+    3347, /* B302 (45826) */
+    3347, /* B303 (45827) */
+    3347, /* B304 (45828) */
+    3347, /* B305 (45829) */
+    3347, /* B306 (45830) */
+    3347, /* B307 (45831) */
+    3347, /* B308 (45832) */
+    3347, /* B309 (45833) */
+    3347, /* B30A (45834) */
+    3347, /* B30B (45835) */
+    3347, /* B30C (45836) */
+    3347, /* B30D (45837) */
+    3347, /* B30E (45838) */
+    3347, /* B30F (45839) */
+    3347, /* B310 (45840) */
+    3347, /* B311 (45841) */
+    3347, /* B312 (45842) */
+    3347, /* B313 (45843) */
+    3347, /* B314 (45844) */
+    3347, /* B315 (45845) */
+    3347, /* B316 (45846) */
+    3347, /* B317 (45847) */
+    3347, /* B318 (45848) */
+    3347, /* B319 (45849) */
+    3347, /* B31A (45850) */
+    3347, /* B31B (45851) */
+    3347, /* B31C (45852) */
+    3347, /* B31D (45853) */
+    3347, /* B31E (45854) */
+    3347, /* B31F (45855) */
+    3347, /* B320 (45856) */
+    3347, /* B321 (45857) */
+    3347, /* B322 (45858) */
+    3347, /* B323 (45859) */
+    3347, /* B324 (45860) */
+    3347, /* B325 (45861) */
+    3347, /* B326 (45862) */
+    3347, /* B327 (45863) */
+    3347, /* B328 (45864) */
+    3347, /* B329 (45865) */
+    3347, /* B32A (45866) */
+    3347, /* B32B (45867) */
+    3347, /* B32C (45868) */
+    3347, /* B32D (45869) */
+    3347, /* B32E (45870) */
+    3347, /* B32F (45871) */
+    3347, /* B330 (45872) */
+    3347, /* B331 (45873) */
+    3347, /* B332 (45874) */
+    3347, /* B333 (45875) */
+    3347, /* B334 (45876) */
+    3347, /* B335 (45877) */
+    3347, /* B336 (45878) */
+    3347, /* B337 (45879) */
+    3347, /* B338 (45880) */
+    3347, /* B339 (45881) */
+    3347, /* B33A (45882) */
+    3347, /* B33B (45883) */
+    3347, /* B33C (45884) */
+    3347, /* B33D (45885) */
+    3347, /* B33E (45886) */
+    3347, /* B33F (45887) */
+    3347, /* B340 (45888) */
+    3347, /* B341 (45889) */
+    3347, /* B342 (45890) */
+    3347, /* B343 (45891) */
+    3347, /* B344 (45892) */
+    3347, /* B345 (45893) */
+    3347, /* B346 (45894) */
+    3347, /* B347 (45895) */
+    3347, /* B348 (45896) */
+    3347, /* B349 (45897) */
+    3347, /* B34A (45898) */
+    3347, /* B34B (45899) */
+    3347, /* B34C (45900) */
+    3347, /* B34D (45901) */
+    3347, /* B34E (45902) */
+    3347, /* B34F (45903) */
+    3347, /* B350 (45904) */
+    3347, /* B351 (45905) */
+    3347, /* B352 (45906) */
+    3347, /* B353 (45907) */
+    3347, /* B354 (45908) */
+    3347, /* B355 (45909) */
+    3347, /* B356 (45910) */
+    3347, /* B357 (45911) */
+    3347, /* B358 (45912) */
+    3347, /* B359 (45913) */
+    3347, /* B35A (45914) */
+    3347, /* B35B (45915) */
+    3347, /* B35C (45916) */
+    3347, /* B35D (45917) */
+    3347, /* B35E (45918) */
+    3347, /* B35F (45919) */
+    3347, /* B360 (45920) */
+    3347, /* B361 (45921) */
+    3347, /* B362 (45922) */
+    3347, /* B363 (45923) */
+    3347, /* B364 (45924) */
+    3347, /* B365 (45925) */
+    3347, /* B366 (45926) */
+    3347, /* B367 (45927) */
+    3347, /* B368 (45928) */
+    3347, /* B369 (45929) */
+    3347, /* B36A (45930) */
+    3347, /* B36B (45931) */
+    3347, /* B36C (45932) */
+    3347, /* B36D (45933) */
+    3347, /* B36E (45934) */
+    3347, /* B36F (45935) */
+    3347, /* B370 (45936) */
+    3347, /* B371 (45937) */
+    3347, /* B372 (45938) */
+    3347, /* B373 (45939) */
+    3347, /* B374 (45940) */
+    3347, /* B375 (45941) */
+    3347, /* B376 (45942) */
+    3347, /* B377 (45943) */
+    3347, /* B378 (45944) */
+    3347, /* B379 (45945) */
+    3347, /* B37A (45946) */
+    3347, /* B37B (45947) */
+    3347, /* B37C (45948) */
+    3347, /* B37D (45949) */
+    3347, /* B37E (45950) */
+    3347, /* B37F (45951) */
+    3347, /* B380 (45952) */
+    3347, /* B381 (45953) */
+    3347, /* B382 (45954) */
+    3347, /* B383 (45955) */
+    3347, /* B384 (45956) */
+    3347, /* B385 (45957) */
+    3347, /* B386 (45958) */
+    3347, /* B387 (45959) */
+    3347, /* B388 (45960) */
+    3347, /* B389 (45961) */
+    3347, /* B38A (45962) */
+    3347, /* B38B (45963) */
+    3347, /* B38C (45964) */
+    3347, /* B38D (45965) */
+    3347, /* B38E (45966) */
+    3347, /* B38F (45967) */
+    3347, /* B390 (45968) */
+    3347, /* B391 (45969) */
+    3347, /* B392 (45970) */
+    3347, /* B393 (45971) */
+    3347, /* B394 (45972) */
+    3347, /* B395 (45973) */
+    3347, /* B396 (45974) */
+    3347, /* B397 (45975) */
+    3347, /* B398 (45976) */
+    3347, /* B399 (45977) */
+    3347, /* B39A (45978) */
+    3347, /* B39B (45979) */
+    3347, /* B39C (45980) */
+    3347, /* B39D (45981) */
+    3347, /* B39E (45982) */
+    3347, /* B39F (45983) */
+    3347, /* B3A0 (45984) */
+    3347, /* B3A1 (45985) */
+    3347, /* B3A2 (45986) */
+    3347, /* B3A3 (45987) */
+    3347, /* B3A4 (45988) */
+    3347, /* B3A5 (45989) */
+    3347, /* B3A6 (45990) */
+    3347, /* B3A7 (45991) */
+    3347, /* B3A8 (45992) */
+    3347, /* B3A9 (45993) */
+    3347, /* B3AA (45994) */
+    3347, /* B3AB (45995) */
+    3347, /* B3AC (45996) */
+    3347, /* B3AD (45997) */
+    3347, /* B3AE (45998) */
+    3347, /* B3AF (45999) */
+    3347, /* B3B0 (46000) */
+    3347, /* B3B1 (46001) */
+    3347, /* B3B2 (46002) */
+    3347, /* B3B3 (46003) */
+    3347, /* B3B4 (46004) */
+    3347, /* B3B5 (46005) */
+    3347, /* B3B6 (46006) */
+    3347, /* B3B7 (46007) */
+    3347, /* B3B8 (46008) */
+    3347, /* B3B9 (46009) */
+    3347, /* B3BA (46010) */
+    3347, /* B3BB (46011) */
+    3347, /* B3BC (46012) */
+    3347, /* B3BD (46013) */
+    3347, /* B3BE (46014) */
+    3347, /* B3BF (46015) */
+    3347, /* B3C0 (46016) */
+    3347, /* B3C1 (46017) */
+    3347, /* B3C2 (46018) */
+    3347, /* B3C3 (46019) */
+    3347, /* B3C4 (46020) */
+    3347, /* B3C5 (46021) */
+    3347, /* B3C6 (46022) */
+    3347, /* B3C7 (46023) */
+    3347, /* B3C8 (46024) */
+    3347, /* B3C9 (46025) */
+    3347, /* B3CA (46026) */
+    3347, /* B3CB (46027) */
+    3347, /* B3CC (46028) */
+    3347, /* B3CD (46029) */
+    3347, /* B3CE (46030) */
+    3347, /* B3CF (46031) */
+    3347, /* B3D0 (46032) */
+    3347, /* B3D1 (46033) */
+    3347, /* B3D2 (46034) */
+    3347, /* B3D3 (46035) */
+    3347, /* B3D4 (46036) */
+    3347, /* B3D5 (46037) */
+    3347, /* B3D6 (46038) */
+    3347, /* B3D7 (46039) */
+    3347, /* B3D8 (46040) */
+    3347, /* B3D9 (46041) */
+    3347, /* B3DA (46042) */
+    3347, /* B3DB (46043) */
+    3347, /* B3DC (46044) */
+    3347, /* B3DD (46045) */
+    3347, /* B3DE (46046) */
+    3347, /* B3DF (46047) */
+    3347, /* B3E0 (46048) */
+    3347, /* B3E1 (46049) */
+    3347, /* B3E2 (46050) */
+    3347, /* B3E3 (46051) */
+    3347, /* B3E4 (46052) */
+    3347, /* B3E5 (46053) */
+    3347, /* B3E6 (46054) */
+    3347, /* B3E7 (46055) */
+    3347, /* B3E8 (46056) */
+    3347, /* B3E9 (46057) */
+    3347, /* B3EA (46058) */
+    3347, /* B3EB (46059) */
+    3347, /* B3EC (46060) */
+    3347, /* B3ED (46061) */
+    3347, /* B3EE (46062) */
+    3347, /* B3EF (46063) */
+    3347, /* B3F0 (46064) */
+    3347, /* B3F1 (46065) */
+    3347, /* B3F2 (46066) */
+    3347, /* B3F3 (46067) */
+    3347, /* B3F4 (46068) */
+    3347, /* B3F5 (46069) */
+    3347, /* B3F6 (46070) */
+    3347, /* B3F7 (46071) */
+    3347, /* B3F8 (46072) */
+    3347, /* B3F9 (46073) */
+    3347, /* B3FA (46074) */
+    3347, /* B3FB (46075) */
+    3347, /* B3FC (46076) */
+    3347, /* B3FD (46077) */
+    3347, /* B3FE (46078) */
+    3347, /* B3FF (46079) */
+    3347, /* B400 (46080) */
+    3347, /* B401 (46081) */
+    3347, /* B402 (46082) */
+    3347, /* B403 (46083) */
+    3347, /* B404 (46084) */
+    3347, /* B405 (46085) */
+    3347, /* B406 (46086) */
+    3347, /* B407 (46087) */
+    3347, /* B408 (46088) */
+    3347, /* B409 (46089) */
+    3347, /* B40A (46090) */
+    3347, /* B40B (46091) */
+    3347, /* B40C (46092) */
+    3347, /* B40D (46093) */
+    3347, /* B40E (46094) */
+    3347, /* B40F (46095) */
+    3347, /* B410 (46096) */
+    3347, /* B411 (46097) */
+    3347, /* B412 (46098) */
+    3347, /* B413 (46099) */
+    3347, /* B414 (46100) */
+    3347, /* B415 (46101) */
+    3347, /* B416 (46102) */
+    3347, /* B417 (46103) */
+    3347, /* B418 (46104) */
+    3347, /* B419 (46105) */
+    3347, /* B41A (46106) */
+    3347, /* B41B (46107) */
+    3347, /* B41C (46108) */
+    3347, /* B41D (46109) */
+    3347, /* B41E (46110) */
+    3347, /* B41F (46111) */
+    3347, /* B420 (46112) */
+    3347, /* B421 (46113) */
+    3347, /* B422 (46114) */
+    3347, /* B423 (46115) */
+    3347, /* B424 (46116) */
+    3347, /* B425 (46117) */
+    3347, /* B426 (46118) */
+    3347, /* B427 (46119) */
+    3347, /* B428 (46120) */
+    3347, /* B429 (46121) */
+    3347, /* B42A (46122) */
+    3347, /* B42B (46123) */
+    3347, /* B42C (46124) */
+    3347, /* B42D (46125) */
+    3347, /* B42E (46126) */
+    3347, /* B42F (46127) */
+    3347, /* B430 (46128) */
+    3347, /* B431 (46129) */
+    3347, /* B432 (46130) */
+    3347, /* B433 (46131) */
+    3347, /* B434 (46132) */
+    3347, /* B435 (46133) */
+    3347, /* B436 (46134) */
+    3347, /* B437 (46135) */
+    3347, /* B438 (46136) */
+    3347, /* B439 (46137) */
+    3347, /* B43A (46138) */
+    3347, /* B43B (46139) */
+    3347, /* B43C (46140) */
+    3347, /* B43D (46141) */
+    3347, /* B43E (46142) */
+    3347, /* B43F (46143) */
+    3347, /* B440 (46144) */
+    3347, /* B441 (46145) */
+    3347, /* B442 (46146) */
+    3347, /* B443 (46147) */
+    3347, /* B444 (46148) */
+    3347, /* B445 (46149) */
+    3347, /* B446 (46150) */
+    3347, /* B447 (46151) */
+    3347, /* B448 (46152) */
+    3347, /* B449 (46153) */
+    3347, /* B44A (46154) */
+    3347, /* B44B (46155) */
+    3347, /* B44C (46156) */
+    3347, /* B44D (46157) */
+    3347, /* B44E (46158) */
+    3347, /* B44F (46159) */
+    3347, /* B450 (46160) */
+    3347, /* B451 (46161) */
+    3347, /* B452 (46162) */
+    3347, /* B453 (46163) */
+    3347, /* B454 (46164) */
+    3347, /* B455 (46165) */
+    3347, /* B456 (46166) */
+    3347, /* B457 (46167) */
+    3347, /* B458 (46168) */
+    3347, /* B459 (46169) */
+    3347, /* B45A (46170) */
+    3347, /* B45B (46171) */
+    3347, /* B45C (46172) */
+    3347, /* B45D (46173) */
+    3347, /* B45E (46174) */
+    3347, /* B45F (46175) */
+    3347, /* B460 (46176) */
+    3347, /* B461 (46177) */
+    3347, /* B462 (46178) */
+    3347, /* B463 (46179) */
+    3347, /* B464 (46180) */
+    3347, /* B465 (46181) */
+    3347, /* B466 (46182) */
+    3347, /* B467 (46183) */
+    3347, /* B468 (46184) */
+    3347, /* B469 (46185) */
+    3347, /* B46A (46186) */
+    3347, /* B46B (46187) */
+    3347, /* B46C (46188) */
+    3347, /* B46D (46189) */
+    3347, /* B46E (46190) */
+    3347, /* B46F (46191) */
+    3347, /* B470 (46192) */
+    3347, /* B471 (46193) */
+    3347, /* B472 (46194) */
+    3347, /* B473 (46195) */
+    3347, /* B474 (46196) */
+    3347, /* B475 (46197) */
+    3347, /* B476 (46198) */
+    3347, /* B477 (46199) */
+    3347, /* B478 (46200) */
+    3347, /* B479 (46201) */
+    3347, /* B47A (46202) */
+    3347, /* B47B (46203) */
+    3347, /* B47C (46204) */
+    3347, /* B47D (46205) */
+    3347, /* B47E (46206) */
+    3347, /* B47F (46207) */
+    3347, /* B480 (46208) */
+    3347, /* B481 (46209) */
+    3347, /* B482 (46210) */
+    3347, /* B483 (46211) */
+    3347, /* B484 (46212) */
+    3347, /* B485 (46213) */
+    3347, /* B486 (46214) */
+    3347, /* B487 (46215) */
+    3347, /* B488 (46216) */
+    3347, /* B489 (46217) */
+    3347, /* B48A (46218) */
+    3347, /* B48B (46219) */
+    3347, /* B48C (46220) */
+    3347, /* B48D (46221) */
+    3347, /* B48E (46222) */
+    3347, /* B48F (46223) */
+    3347, /* B490 (46224) */
+    3347, /* B491 (46225) */
+    3347, /* B492 (46226) */
+    3347, /* B493 (46227) */
+    3347, /* B494 (46228) */
+    3347, /* B495 (46229) */
+    3347, /* B496 (46230) */
+    3347, /* B497 (46231) */
+    3347, /* B498 (46232) */
+    3347, /* B499 (46233) */
+    3347, /* B49A (46234) */
+    3347, /* B49B (46235) */
+    3347, /* B49C (46236) */
+    3347, /* B49D (46237) */
+    3347, /* B49E (46238) */
+    3347, /* B49F (46239) */
+    3347, /* B4A0 (46240) */
+    3347, /* B4A1 (46241) */
+    3347, /* B4A2 (46242) */
+    3347, /* B4A3 (46243) */
+    3347, /* B4A4 (46244) */
+    3347, /* B4A5 (46245) */
+    3347, /* B4A6 (46246) */
+    3347, /* B4A7 (46247) */
+    3347, /* B4A8 (46248) */
+    3347, /* B4A9 (46249) */
+    3347, /* B4AA (46250) */
+    3347, /* B4AB (46251) */
+    3347, /* B4AC (46252) */
+    3347, /* B4AD (46253) */
+    3347, /* B4AE (46254) */
+    3347, /* B4AF (46255) */
+    3347, /* B4B0 (46256) */
+    3347, /* B4B1 (46257) */
+    3347, /* B4B2 (46258) */
+    3347, /* B4B3 (46259) */
+    3347, /* B4B4 (46260) */
+    3347, /* B4B5 (46261) */
+    3347, /* B4B6 (46262) */
+    3347, /* B4B7 (46263) */
+    3347, /* B4B8 (46264) */
+    3347, /* B4B9 (46265) */
+    3347, /* B4BA (46266) */
+    3347, /* B4BB (46267) */
+    3347, /* B4BC (46268) */
+    3347, /* B4BD (46269) */
+    3347, /* B4BE (46270) */
+    3347, /* B4BF (46271) */
+    3347, /* B4C0 (46272) */
+    3347, /* B4C1 (46273) */
+    3347, /* B4C2 (46274) */
+    3347, /* B4C3 (46275) */
+    3347, /* B4C4 (46276) */
+    3347, /* B4C5 (46277) */
+    3347, /* B4C6 (46278) */
+    3347, /* B4C7 (46279) */
+    3347, /* B4C8 (46280) */
+    3347, /* B4C9 (46281) */
+    3347, /* B4CA (46282) */
+    3347, /* B4CB (46283) */
+    3347, /* B4CC (46284) */
+    3347, /* B4CD (46285) */
+    3347, /* B4CE (46286) */
+    3347, /* B4CF (46287) */
+    3347, /* B4D0 (46288) */
+    3347, /* B4D1 (46289) */
+    3347, /* B4D2 (46290) */
+    3347, /* B4D3 (46291) */
+    3347, /* B4D4 (46292) */
+    3347, /* B4D5 (46293) */
+    3347, /* B4D6 (46294) */
+    3347, /* B4D7 (46295) */
+    3347, /* B4D8 (46296) */
+    3347, /* B4D9 (46297) */
+    3347, /* B4DA (46298) */
+    3347, /* B4DB (46299) */
+    3347, /* B4DC (46300) */
+    3347, /* B4DD (46301) */
+    3347, /* B4DE (46302) */
+    3347, /* B4DF (46303) */
+    3347, /* B4E0 (46304) */
+    3347, /* B4E1 (46305) */
+    3347, /* B4E2 (46306) */
+    3347, /* B4E3 (46307) */
+    3347, /* B4E4 (46308) */
+    3347, /* B4E5 (46309) */
+    3347, /* B4E6 (46310) */
+    3347, /* B4E7 (46311) */
+    3347, /* B4E8 (46312) */
+    3347, /* B4E9 (46313) */
+    3347, /* B4EA (46314) */
+    3347, /* B4EB (46315) */
+    3347, /* B4EC (46316) */
+    3347, /* B4ED (46317) */
+    3347, /* B4EE (46318) */
+    3347, /* B4EF (46319) */
+    3347, /* B4F0 (46320) */
+    3347, /* B4F1 (46321) */
+    3347, /* B4F2 (46322) */
+    3347, /* B4F3 (46323) */
+    3347, /* B4F4 (46324) */
+    3347, /* B4F5 (46325) */
+    3347, /* B4F6 (46326) */
+    3347, /* B4F7 (46327) */
+    3347, /* B4F8 (46328) */
+    3347, /* B4F9 (46329) */
+    3347, /* B4FA (46330) */
+    3347, /* B4FB (46331) */
+    3347, /* B4FC (46332) */
+    3347, /* B4FD (46333) */
+    3347, /* B4FE (46334) */
+    3347, /* B4FF (46335) */
+    3347, /* B500 (46336) */
+    3347, /* B501 (46337) */
+    3347, /* B502 (46338) */
+    3347, /* B503 (46339) */
+    3347, /* B504 (46340) */
+    3347, /* B505 (46341) */
+    3347, /* B506 (46342) */
+    3347, /* B507 (46343) */
+    3347, /* B508 (46344) */
+    3347, /* B509 (46345) */
+    3347, /* B50A (46346) */
+    3347, /* B50B (46347) */
+    3347, /* B50C (46348) */
+    3347, /* B50D (46349) */
+    3347, /* B50E (46350) */
+    3347, /* B50F (46351) */
+    3347, /* B510 (46352) */
+    3347, /* B511 (46353) */
+    3347, /* B512 (46354) */
+    3347, /* B513 (46355) */
+    3347, /* B514 (46356) */
+    3347, /* B515 (46357) */
+    3347, /* B516 (46358) */
+    3347, /* B517 (46359) */
+    3347, /* B518 (46360) */
+    3347, /* B519 (46361) */
+    3347, /* B51A (46362) */
+    3347, /* B51B (46363) */
+    3347, /* B51C (46364) */
+    3347, /* B51D (46365) */
+    3347, /* B51E (46366) */
+    3347, /* B51F (46367) */
+    3347, /* B520 (46368) */
+    3347, /* B521 (46369) */
+    3347, /* B522 (46370) */
+    3347, /* B523 (46371) */
+    3347, /* B524 (46372) */
+    3347, /* B525 (46373) */
+    3347, /* B526 (46374) */
+    3347, /* B527 (46375) */
+    3347, /* B528 (46376) */
+    3347, /* B529 (46377) */
+    3347, /* B52A (46378) */
+    3347, /* B52B (46379) */
+    3347, /* B52C (46380) */
+    3347, /* B52D (46381) */
+    3347, /* B52E (46382) */
+    3347, /* B52F (46383) */
+    3347, /* B530 (46384) */
+    3347, /* B531 (46385) */
+    3347, /* B532 (46386) */
+    3347, /* B533 (46387) */
+    3347, /* B534 (46388) */
+    3347, /* B535 (46389) */
+    3347, /* B536 (46390) */
+    3347, /* B537 (46391) */
+    3347, /* B538 (46392) */
+    3347, /* B539 (46393) */
+    3347, /* B53A (46394) */
+    3347, /* B53B (46395) */
+    3347, /* B53C (46396) */
+    3347, /* B53D (46397) */
+    3347, /* B53E (46398) */
+    3347, /* B53F (46399) */
+    3347, /* B540 (46400) */
+    3347, /* B541 (46401) */
+    3347, /* B542 (46402) */
+    3347, /* B543 (46403) */
+    3347, /* B544 (46404) */
+    3347, /* B545 (46405) */
+    3347, /* B546 (46406) */
+    3347, /* B547 (46407) */
+    3347, /* B548 (46408) */
+    3347, /* B549 (46409) */
+    3347, /* B54A (46410) */
+    3347, /* B54B (46411) */
+    3347, /* B54C (46412) */
+    3347, /* B54D (46413) */
+    3347, /* B54E (46414) */
+    3347, /* B54F (46415) */
+    3347, /* B550 (46416) */
+    3347, /* B551 (46417) */
+    3347, /* B552 (46418) */
+    3347, /* B553 (46419) */
+    3347, /* B554 (46420) */
+    3347, /* B555 (46421) */
+    3347, /* B556 (46422) */
+    3347, /* B557 (46423) */
+    3347, /* B558 (46424) */
+    3347, /* B559 (46425) */
+    3347, /* B55A (46426) */
+    3347, /* B55B (46427) */
+    3347, /* B55C (46428) */
+    3347, /* B55D (46429) */
+    3347, /* B55E (46430) */
+    3347, /* B55F (46431) */
+    3347, /* B560 (46432) */
+    3347, /* B561 (46433) */
+    3347, /* B562 (46434) */
+    3347, /* B563 (46435) */
+    3347, /* B564 (46436) */
+    3347, /* B565 (46437) */
+    3347, /* B566 (46438) */
+    3347, /* B567 (46439) */
+    3347, /* B568 (46440) */
+    3347, /* B569 (46441) */
+    3347, /* B56A (46442) */
+    3347, /* B56B (46443) */
+    3347, /* B56C (46444) */
+    3347, /* B56D (46445) */
+    3347, /* B56E (46446) */
+    3347, /* B56F (46447) */
+    3347, /* B570 (46448) */
+    3347, /* B571 (46449) */
+    3347, /* B572 (46450) */
+    3347, /* B573 (46451) */
+    3347, /* B574 (46452) */
+    3347, /* B575 (46453) */
+    3347, /* B576 (46454) */
+    3347, /* B577 (46455) */
+    3347, /* B578 (46456) */
+    3347, /* B579 (46457) */
+    3347, /* B57A (46458) */
+    3347, /* B57B (46459) */
+    3347, /* B57C (46460) */
+    3347, /* B57D (46461) */
+    3347, /* B57E (46462) */
+    3347, /* B57F (46463) */
+    3347, /* B580 (46464) */
+    3347, /* B581 (46465) */
+    3347, /* B582 (46466) */
+    3347, /* B583 (46467) */
+    3347, /* B584 (46468) */
+    3347, /* B585 (46469) */
+    3347, /* B586 (46470) */
+    3347, /* B587 (46471) */
+    3347, /* B588 (46472) */
+    3347, /* B589 (46473) */
+    3347, /* B58A (46474) */
+    3347, /* B58B (46475) */
+    3347, /* B58C (46476) */
+    3347, /* B58D (46477) */
+    3347, /* B58E (46478) */
+    3347, /* B58F (46479) */
+    3347, /* B590 (46480) */
+    3347, /* B591 (46481) */
+    3347, /* B592 (46482) */
+    3347, /* B593 (46483) */
+    3347, /* B594 (46484) */
+    3347, /* B595 (46485) */
+    3347, /* B596 (46486) */
+    3347, /* B597 (46487) */
+    3347, /* B598 (46488) */
+    3347, /* B599 (46489) */
+    3347, /* B59A (46490) */
+    3347, /* B59B (46491) */
+    3347, /* B59C (46492) */
+    3347, /* B59D (46493) */
+    3347, /* B59E (46494) */
+    3347, /* B59F (46495) */
+    3347, /* B5A0 (46496) */
+    3347, /* B5A1 (46497) */
+    3347, /* B5A2 (46498) */
+    3347, /* B5A3 (46499) */
+    3347, /* B5A4 (46500) */
+    3347, /* B5A5 (46501) */
+    3347, /* B5A6 (46502) */
+    3347, /* B5A7 (46503) */
+    3347, /* B5A8 (46504) */
+    3347, /* B5A9 (46505) */
+    3347, /* B5AA (46506) */
+    3347, /* B5AB (46507) */
+    3347, /* B5AC (46508) */
+    3347, /* B5AD (46509) */
+    3347, /* B5AE (46510) */
+    3347, /* B5AF (46511) */
+    3347, /* B5B0 (46512) */
+    3347, /* B5B1 (46513) */
+    3347, /* B5B2 (46514) */
+    3347, /* B5B3 (46515) */
+    3347, /* B5B4 (46516) */
+    3347, /* B5B5 (46517) */
+    3347, /* B5B6 (46518) */
+    3347, /* B5B7 (46519) */
+    3347, /* B5B8 (46520) */
+    3347, /* B5B9 (46521) */
+    3347, /* B5BA (46522) */
+    3347, /* B5BB (46523) */
+    3347, /* B5BC (46524) */
+    3347, /* B5BD (46525) */
+    3347, /* B5BE (46526) */
+    3347, /* B5BF (46527) */
+    3347, /* B5C0 (46528) */
+    3347, /* B5C1 (46529) */
+    3347, /* B5C2 (46530) */
+    3347, /* B5C3 (46531) */
+    3347, /* B5C4 (46532) */
+    3347, /* B5C5 (46533) */
+    3347, /* B5C6 (46534) */
+    3347, /* B5C7 (46535) */
+    3347, /* B5C8 (46536) */
+    3347, /* B5C9 (46537) */
+    3347, /* B5CA (46538) */
+    3347, /* B5CB (46539) */
+    3347, /* B5CC (46540) */
+    3347, /* B5CD (46541) */
+    3347, /* B5CE (46542) */
+    3347, /* B5CF (46543) */
+    3347, /* B5D0 (46544) */
+    3347, /* B5D1 (46545) */
+    3347, /* B5D2 (46546) */
+    3347, /* B5D3 (46547) */
+    3347, /* B5D4 (46548) */
+    3347, /* B5D5 (46549) */
+    3347, /* B5D6 (46550) */
+    3347, /* B5D7 (46551) */
+    3347, /* B5D8 (46552) */
+    3347, /* B5D9 (46553) */
+    3347, /* B5DA (46554) */
+    3347, /* B5DB (46555) */
+    3347, /* B5DC (46556) */
+    3347, /* B5DD (46557) */
+    3347, /* B5DE (46558) */
+    3347, /* B5DF (46559) */
+    3347, /* B5E0 (46560) */
+    3347, /* B5E1 (46561) */
+    3347, /* B5E2 (46562) */
+    3347, /* B5E3 (46563) */
+    3347, /* B5E4 (46564) */
+    3347, /* B5E5 (46565) */
+    3347, /* B5E6 (46566) */
+    3347, /* B5E7 (46567) */
+    3347, /* B5E8 (46568) */
+    3347, /* B5E9 (46569) */
+    3347, /* B5EA (46570) */
+    3347, /* B5EB (46571) */
+    3347, /* B5EC (46572) */
+    3347, /* B5ED (46573) */
+    3347, /* B5EE (46574) */
+    3347, /* B5EF (46575) */
+    3347, /* B5F0 (46576) */
+    3347, /* B5F1 (46577) */
+    3347, /* B5F2 (46578) */
+    3347, /* B5F3 (46579) */
+    3347, /* B5F4 (46580) */
+    3347, /* B5F5 (46581) */
+    3347, /* B5F6 (46582) */
+    3347, /* B5F7 (46583) */
+    3347, /* B5F8 (46584) */
+    3347, /* B5F9 (46585) */
+    3347, /* B5FA (46586) */
+    3347, /* B5FB (46587) */
+    3347, /* B5FC (46588) */
+    3347, /* B5FD (46589) */
+    3347, /* B5FE (46590) */
+    3347, /* B5FF (46591) */
+    3347, /* B600 (46592) */
+    3347, /* B601 (46593) */
+    3347, /* B602 (46594) */
+    3347, /* B603 (46595) */
+    3347, /* B604 (46596) */
+    3347, /* B605 (46597) */
+    3347, /* B606 (46598) */
+    3347, /* B607 (46599) */
+    3347, /* B608 (46600) */
+    3347, /* B609 (46601) */
+    3347, /* B60A (46602) */
+    3347, /* B60B (46603) */
+    3347, /* B60C (46604) */
+    3347, /* B60D (46605) */
+    3347, /* B60E (46606) */
+    3347, /* B60F (46607) */
+    3347, /* B610 (46608) */
+    3347, /* B611 (46609) */
+    3347, /* B612 (46610) */
+    3347, /* B613 (46611) */
+    3347, /* B614 (46612) */
+    3347, /* B615 (46613) */
+    3347, /* B616 (46614) */
+    3347, /* B617 (46615) */
+    3347, /* B618 (46616) */
+    3347, /* B619 (46617) */
+    3347, /* B61A (46618) */
+    3347, /* B61B (46619) */
+    3347, /* B61C (46620) */
+    3347, /* B61D (46621) */
+    3347, /* B61E (46622) */
+    3347, /* B61F (46623) */
+    3347, /* B620 (46624) */
+    3347, /* B621 (46625) */
+    3347, /* B622 (46626) */
+    3347, /* B623 (46627) */
+    3347, /* B624 (46628) */
+    3347, /* B625 (46629) */
+    3347, /* B626 (46630) */
+    3347, /* B627 (46631) */
+    3347, /* B628 (46632) */
+    3347, /* B629 (46633) */
+    3347, /* B62A (46634) */
+    3347, /* B62B (46635) */
+    3347, /* B62C (46636) */
+    3347, /* B62D (46637) */
+    3347, /* B62E (46638) */
+    3347, /* B62F (46639) */
+    3347, /* B630 (46640) */
+    3347, /* B631 (46641) */
+    3347, /* B632 (46642) */
+    3347, /* B633 (46643) */
+    3347, /* B634 (46644) */
+    3347, /* B635 (46645) */
+    3347, /* B636 (46646) */
+    3347, /* B637 (46647) */
+    3347, /* B638 (46648) */
+    3347, /* B639 (46649) */
+    3347, /* B63A (46650) */
+    3347, /* B63B (46651) */
+    3347, /* B63C (46652) */
+    3347, /* B63D (46653) */
+    3347, /* B63E (46654) */
+    3347, /* B63F (46655) */
+    3347, /* B640 (46656) */
+    3347, /* B641 (46657) */
+    3347, /* B642 (46658) */
+    3347, /* B643 (46659) */
+    3347, /* B644 (46660) */
+    3347, /* B645 (46661) */
+    3347, /* B646 (46662) */
+    3347, /* B647 (46663) */
+    3347, /* B648 (46664) */
+    3347, /* B649 (46665) */
+    3347, /* B64A (46666) */
+    3347, /* B64B (46667) */
+    3347, /* B64C (46668) */
+    3347, /* B64D (46669) */
+    3347, /* B64E (46670) */
+    3347, /* B64F (46671) */
+    3347, /* B650 (46672) */
+    3347, /* B651 (46673) */
+    3347, /* B652 (46674) */
+    3347, /* B653 (46675) */
+    3347, /* B654 (46676) */
+    3347, /* B655 (46677) */
+    3347, /* B656 (46678) */
+    3347, /* B657 (46679) */
+    3347, /* B658 (46680) */
+    3347, /* B659 (46681) */
+    3347, /* B65A (46682) */
+    3347, /* B65B (46683) */
+    3347, /* B65C (46684) */
+    3347, /* B65D (46685) */
+    3347, /* B65E (46686) */
+    3347, /* B65F (46687) */
+    3347, /* B660 (46688) */
+    3347, /* B661 (46689) */
+    3347, /* B662 (46690) */
+    3347, /* B663 (46691) */
+    3347, /* B664 (46692) */
+    3347, /* B665 (46693) */
+    3347, /* B666 (46694) */
+    3347, /* B667 (46695) */
+    3347, /* B668 (46696) */
+    3347, /* B669 (46697) */
+    3347, /* B66A (46698) */
+    3347, /* B66B (46699) */
+    3347, /* B66C (46700) */
+    3347, /* B66D (46701) */
+    3347, /* B66E (46702) */
+    3347, /* B66F (46703) */
+    3347, /* B670 (46704) */
+    3347, /* B671 (46705) */
+    3347, /* B672 (46706) */
+    3347, /* B673 (46707) */
+    3347, /* B674 (46708) */
+    3347, /* B675 (46709) */
+    3347, /* B676 (46710) */
+    3347, /* B677 (46711) */
+    3347, /* B678 (46712) */
+    3347, /* B679 (46713) */
+    3347, /* B67A (46714) */
+    3347, /* B67B (46715) */
+    3347, /* B67C (46716) */
+    3347, /* B67D (46717) */
+    3347, /* B67E (46718) */
+    3347, /* B67F (46719) */
+    3347, /* B680 (46720) */
+    3347, /* B681 (46721) */
+    3347, /* B682 (46722) */
+    3347, /* B683 (46723) */
+    3347, /* B684 (46724) */
+    3347, /* B685 (46725) */
+    3347, /* B686 (46726) */
+    3347, /* B687 (46727) */
+    3347, /* B688 (46728) */
+    3347, /* B689 (46729) */
+    3347, /* B68A (46730) */
+    3347, /* B68B (46731) */
+    3347, /* B68C (46732) */
+    3347, /* B68D (46733) */
+    3347, /* B68E (46734) */
+    3347, /* B68F (46735) */
+    3347, /* B690 (46736) */
+    3347, /* B691 (46737) */
+    3347, /* B692 (46738) */
+    3347, /* B693 (46739) */
+    3347, /* B694 (46740) */
+    3347, /* B695 (46741) */
+    3347, /* B696 (46742) */
+    3347, /* B697 (46743) */
+    3347, /* B698 (46744) */
+    3347, /* B699 (46745) */
+    3347, /* B69A (46746) */
+    3347, /* B69B (46747) */
+    3347, /* B69C (46748) */
+    3347, /* B69D (46749) */
+    3347, /* B69E (46750) */
+    3347, /* B69F (46751) */
+    3347, /* B6A0 (46752) */
+    3347, /* B6A1 (46753) */
+    3347, /* B6A2 (46754) */
+    3347, /* B6A3 (46755) */
+    3347, /* B6A4 (46756) */
+    3347, /* B6A5 (46757) */
+    3347, /* B6A6 (46758) */
+    3347, /* B6A7 (46759) */
+    3347, /* B6A8 (46760) */
+    3347, /* B6A9 (46761) */
+    3347, /* B6AA (46762) */
+    3347, /* B6AB (46763) */
+    3347, /* B6AC (46764) */
+    3347, /* B6AD (46765) */
+    3347, /* B6AE (46766) */
+    3347, /* B6AF (46767) */
+    3347, /* B6B0 (46768) */
+    3347, /* B6B1 (46769) */
+    3347, /* B6B2 (46770) */
+    3347, /* B6B3 (46771) */
+    3347, /* B6B4 (46772) */
+    3347, /* B6B5 (46773) */
+    3347, /* B6B6 (46774) */
+    3347, /* B6B7 (46775) */
+    3347, /* B6B8 (46776) */
+    3347, /* B6B9 (46777) */
+    3347, /* B6BA (46778) */
+    3347, /* B6BB (46779) */
+    3347, /* B6BC (46780) */
+    3347, /* B6BD (46781) */
+    3347, /* B6BE (46782) */
+    3347, /* B6BF (46783) */
+    3347, /* B6C0 (46784) */
+    3347, /* B6C1 (46785) */
+    3347, /* B6C2 (46786) */
+    3347, /* B6C3 (46787) */
+    3347, /* B6C4 (46788) */
+    3347, /* B6C5 (46789) */
+    3347, /* B6C6 (46790) */
+    3347, /* B6C7 (46791) */
+    3347, /* B6C8 (46792) */
+    3347, /* B6C9 (46793) */
+    3347, /* B6CA (46794) */
+    3347, /* B6CB (46795) */
+    3347, /* B6CC (46796) */
+    3347, /* B6CD (46797) */
+    3347, /* B6CE (46798) */
+    3347, /* B6CF (46799) */
+    3347, /* B6D0 (46800) */
+    3347, /* B6D1 (46801) */
+    3347, /* B6D2 (46802) */
+    3347, /* B6D3 (46803) */
+    3347, /* B6D4 (46804) */
+    3347, /* B6D5 (46805) */
+    3347, /* B6D6 (46806) */
+    3347, /* B6D7 (46807) */
+    3347, /* B6D8 (46808) */
+    3347, /* B6D9 (46809) */
+    3347, /* B6DA (46810) */
+    3347, /* B6DB (46811) */
+    3347, /* B6DC (46812) */
+    3347, /* B6DD (46813) */
+    3347, /* B6DE (46814) */
+    3347, /* B6DF (46815) */
+    3347, /* B6E0 (46816) */
+    3347, /* B6E1 (46817) */
+    3347, /* B6E2 (46818) */
+    3347, /* B6E3 (46819) */
+    3347, /* B6E4 (46820) */
+    3347, /* B6E5 (46821) */
+    3347, /* B6E6 (46822) */
+    3347, /* B6E7 (46823) */
+    3347, /* B6E8 (46824) */
+    3347, /* B6E9 (46825) */
+    3347, /* B6EA (46826) */
+    3347, /* B6EB (46827) */
+    3347, /* B6EC (46828) */
+    3347, /* B6ED (46829) */
+    3347, /* B6EE (46830) */
+    3347, /* B6EF (46831) */
+    3347, /* B6F0 (46832) */
+    3347, /* B6F1 (46833) */
+    3347, /* B6F2 (46834) */
+    3347, /* B6F3 (46835) */
+    3347, /* B6F4 (46836) */
+    3347, /* B6F5 (46837) */
+    3347, /* B6F6 (46838) */
+    3347, /* B6F7 (46839) */
+    3347, /* B6F8 (46840) */
+    3347, /* B6F9 (46841) */
+    3347, /* B6FA (46842) */
+    3347, /* B6FB (46843) */
+    3347, /* B6FC (46844) */
+    3347, /* B6FD (46845) */
+    3347, /* B6FE (46846) */
+    3347, /* B6FF (46847) */
+    3347, /* B700 (46848) */
+    3347, /* B701 (46849) */
+    3347, /* B702 (46850) */
+    3347, /* B703 (46851) */
+    3347, /* B704 (46852) */
+    3347, /* B705 (46853) */
+    3347, /* B706 (46854) */
+    3347, /* B707 (46855) */
+    3347, /* B708 (46856) */
+    3347, /* B709 (46857) */
+    3347, /* B70A (46858) */
+    3347, /* B70B (46859) */
+    3347, /* B70C (46860) */
+    3347, /* B70D (46861) */
+    3347, /* B70E (46862) */
+    3347, /* B70F (46863) */
+    3347, /* B710 (46864) */
+    3347, /* B711 (46865) */
+    3347, /* B712 (46866) */
+    3347, /* B713 (46867) */
+    3347, /* B714 (46868) */
+    3347, /* B715 (46869) */
+    3347, /* B716 (46870) */
+    3347, /* B717 (46871) */
+    3347, /* B718 (46872) */
+    3347, /* B719 (46873) */
+    3347, /* B71A (46874) */
+    3347, /* B71B (46875) */
+    3347, /* B71C (46876) */
+    3347, /* B71D (46877) */
+    3347, /* B71E (46878) */
+    3347, /* B71F (46879) */
+    3347, /* B720 (46880) */
+    3347, /* B721 (46881) */
+    3347, /* B722 (46882) */
+    3347, /* B723 (46883) */
+    3347, /* B724 (46884) */
+    3347, /* B725 (46885) */
+    3347, /* B726 (46886) */
+    3347, /* B727 (46887) */
+    3347, /* B728 (46888) */
+    3347, /* B729 (46889) */
+    3347, /* B72A (46890) */
+    3347, /* B72B (46891) */
+    3347, /* B72C (46892) */
+    3347, /* B72D (46893) */
+    3347, /* B72E (46894) */
+    3347, /* B72F (46895) */
+    3347, /* B730 (46896) */
+    3347, /* B731 (46897) */
+    3347, /* B732 (46898) */
+    3347, /* B733 (46899) */
+    3347, /* B734 (46900) */
+    3347, /* B735 (46901) */
+    3347, /* B736 (46902) */
+    3347, /* B737 (46903) */
+    3347, /* B738 (46904) */
+    3347, /* B739 (46905) */
+    3347, /* B73A (46906) */
+    3347, /* B73B (46907) */
+    3347, /* B73C (46908) */
+    3347, /* B73D (46909) */
+    3347, /* B73E (46910) */
+    3347, /* B73F (46911) */
+    3347, /* B740 (46912) */
+    3347, /* B741 (46913) */
+    3347, /* B742 (46914) */
+    3347, /* B743 (46915) */
+    3347, /* B744 (46916) */
+    3347, /* B745 (46917) */
+    3347, /* B746 (46918) */
+    3347, /* B747 (46919) */
+    3347, /* B748 (46920) */
+    3347, /* B749 (46921) */
+    3347, /* B74A (46922) */
+    3347, /* B74B (46923) */
+    3347, /* B74C (46924) */
+    3347, /* B74D (46925) */
+    3347, /* B74E (46926) */
+    3347, /* B74F (46927) */
+    3347, /* B750 (46928) */
+    3347, /* B751 (46929) */
+    3347, /* B752 (46930) */
+    3347, /* B753 (46931) */
+    3347, /* B754 (46932) */
+    3347, /* B755 (46933) */
+    3347, /* B756 (46934) */
+    3347, /* B757 (46935) */
+    3347, /* B758 (46936) */
+    3347, /* B759 (46937) */
+    3347, /* B75A (46938) */
+    3347, /* B75B (46939) */
+    3347, /* B75C (46940) */
+    3347, /* B75D (46941) */
+    3347, /* B75E (46942) */
+    3347, /* B75F (46943) */
+    3347, /* B760 (46944) */
+    3347, /* B761 (46945) */
+    3347, /* B762 (46946) */
+    3347, /* B763 (46947) */
+    3347, /* B764 (46948) */
+    3347, /* B765 (46949) */
+    3347, /* B766 (46950) */
+    3347, /* B767 (46951) */
+    3347, /* B768 (46952) */
+    3347, /* B769 (46953) */
+    3347, /* B76A (46954) */
+    3347, /* B76B (46955) */
+    3347, /* B76C (46956) */
+    3347, /* B76D (46957) */
+    3347, /* B76E (46958) */
+    3347, /* B76F (46959) */
+    3347, /* B770 (46960) */
+    3347, /* B771 (46961) */
+    3347, /* B772 (46962) */
+    3347, /* B773 (46963) */
+    3347, /* B774 (46964) */
+    3347, /* B775 (46965) */
+    3347, /* B776 (46966) */
+    3347, /* B777 (46967) */
+    3347, /* B778 (46968) */
+    3347, /* B779 (46969) */
+    3347, /* B77A (46970) */
+    3347, /* B77B (46971) */
+    3347, /* B77C (46972) */
+    3347, /* B77D (46973) */
+    3347, /* B77E (46974) */
+    3347, /* B77F (46975) */
+    3347, /* B780 (46976) */
+    3347, /* B781 (46977) */
+    3347, /* B782 (46978) */
+    3347, /* B783 (46979) */
+    3347, /* B784 (46980) */
+    3347, /* B785 (46981) */
+    3347, /* B786 (46982) */
+    3347, /* B787 (46983) */
+    3347, /* B788 (46984) */
+    3347, /* B789 (46985) */
+    3347, /* B78A (46986) */
+    3347, /* B78B (46987) */
+    3347, /* B78C (46988) */
+    3347, /* B78D (46989) */
+    3347, /* B78E (46990) */
+    3347, /* B78F (46991) */
+    3347, /* B790 (46992) */
+    3347, /* B791 (46993) */
+    3347, /* B792 (46994) */
+    3347, /* B793 (46995) */
+    3347, /* B794 (46996) */
+    3347, /* B795 (46997) */
+    3347, /* B796 (46998) */
+    3347, /* B797 (46999) */
+    3347, /* B798 (47000) */
+    3347, /* B799 (47001) */
+    3347, /* B79A (47002) */
+    3347, /* B79B (47003) */
+    3347, /* B79C (47004) */
+    3347, /* B79D (47005) */
+    3347, /* B79E (47006) */
+    3347, /* B79F (47007) */
+    3347, /* B7A0 (47008) */
+    3347, /* B7A1 (47009) */
+    3347, /* B7A2 (47010) */
+    3347, /* B7A3 (47011) */
+    3347, /* B7A4 (47012) */
+    3347, /* B7A5 (47013) */
+    3347, /* B7A6 (47014) */
+    3347, /* B7A7 (47015) */
+    3347, /* B7A8 (47016) */
+    3347, /* B7A9 (47017) */
+    3347, /* B7AA (47018) */
+    3347, /* B7AB (47019) */
+    3347, /* B7AC (47020) */
+    3347, /* B7AD (47021) */
+    3347, /* B7AE (47022) */
+    3347, /* B7AF (47023) */
+    3347, /* B7B0 (47024) */
+    3347, /* B7B1 (47025) */
+    3347, /* B7B2 (47026) */
+    3347, /* B7B3 (47027) */
+    3347, /* B7B4 (47028) */
+    3347, /* B7B5 (47029) */
+    3347, /* B7B6 (47030) */
+    3347, /* B7B7 (47031) */
+    3347, /* B7B8 (47032) */
+    3347, /* B7B9 (47033) */
+    3347, /* B7BA (47034) */
+    3347, /* B7BB (47035) */
+    3347, /* B7BC (47036) */
+    3347, /* B7BD (47037) */
+    3347, /* B7BE (47038) */
+    3347, /* B7BF (47039) */
+    3347, /* B7C0 (47040) */
+    3347, /* B7C1 (47041) */
+    3347, /* B7C2 (47042) */
+    3347, /* B7C3 (47043) */
+    3347, /* B7C4 (47044) */
+    3347, /* B7C5 (47045) */
+    3347, /* B7C6 (47046) */
+    3347, /* B7C7 (47047) */
+    3347, /* B7C8 (47048) */
+    3347, /* B7C9 (47049) */
+    3347, /* B7CA (47050) */
+    3347, /* B7CB (47051) */
+    3347, /* B7CC (47052) */
+    3347, /* B7CD (47053) */
+    3347, /* B7CE (47054) */
+    3347, /* B7CF (47055) */
+    3347, /* B7D0 (47056) */
+    3347, /* B7D1 (47057) */
+    3347, /* B7D2 (47058) */
+    3347, /* B7D3 (47059) */
+    3347, /* B7D4 (47060) */
+    3347, /* B7D5 (47061) */
+    3347, /* B7D6 (47062) */
+    3347, /* B7D7 (47063) */
+    3347, /* B7D8 (47064) */
+    3347, /* B7D9 (47065) */
+    3347, /* B7DA (47066) */
+    3347, /* B7DB (47067) */
+    3347, /* B7DC (47068) */
+    3347, /* B7DD (47069) */
+    3347, /* B7DE (47070) */
+    3347, /* B7DF (47071) */
+    3347, /* B7E0 (47072) */
+    3347, /* B7E1 (47073) */
+    3347, /* B7E2 (47074) */
+    3347, /* B7E3 (47075) */
+    3347, /* B7E4 (47076) */
+    3347, /* B7E5 (47077) */
+    3347, /* B7E6 (47078) */
+    3347, /* B7E7 (47079) */
+    3347, /* B7E8 (47080) */
+    3347, /* B7E9 (47081) */
+    3347, /* B7EA (47082) */
+    3347, /* B7EB (47083) */
+    3347, /* B7EC (47084) */
+    3347, /* B7ED (47085) */
+    3347, /* B7EE (47086) */
+    3347, /* B7EF (47087) */
+    3347, /* B7F0 (47088) */
+    3347, /* B7F1 (47089) */
+    3347, /* B7F2 (47090) */
+    3347, /* B7F3 (47091) */
+    3347, /* B7F4 (47092) */
+    3347, /* B7F5 (47093) */
+    3347, /* B7F6 (47094) */
+    3347, /* B7F7 (47095) */
+    3347, /* B7F8 (47096) */
+    3347, /* B7F9 (47097) */
+    3347, /* B7FA (47098) */
+    3347, /* B7FB (47099) */
+    3347, /* B7FC (47100) */
+    3347, /* B7FD (47101) */
+    3347, /* B7FE (47102) */
+    3347, /* B7FF (47103) */
+    3347, /* B800 (47104) */
+    3347, /* B801 (47105) */
+    3347, /* B802 (47106) */
+    3347, /* B803 (47107) */
+    3347, /* B804 (47108) */
+    3347, /* B805 (47109) */
+    3347, /* B806 (47110) */
+    3347, /* B807 (47111) */
+    3347, /* B808 (47112) */
+    3347, /* B809 (47113) */
+    3347, /* B80A (47114) */
+    3347, /* B80B (47115) */
+    3347, /* B80C (47116) */
+    3347, /* B80D (47117) */
+    3347, /* B80E (47118) */
+    3347, /* B80F (47119) */
+    3347, /* B810 (47120) */
+    3347, /* B811 (47121) */
+    3347, /* B812 (47122) */
+    3347, /* B813 (47123) */
+    3347, /* B814 (47124) */
+    3347, /* B815 (47125) */
+    3347, /* B816 (47126) */
+    3347, /* B817 (47127) */
+    3347, /* B818 (47128) */
+    3347, /* B819 (47129) */
+    3347, /* B81A (47130) */
+    3347, /* B81B (47131) */
+    3347, /* B81C (47132) */
+    3347, /* B81D (47133) */
+    3347, /* B81E (47134) */
+    3347, /* B81F (47135) */
+    3347, /* B820 (47136) */
+    3347, /* B821 (47137) */
+    3347, /* B822 (47138) */
+    3347, /* B823 (47139) */
+    3347, /* B824 (47140) */
+    3347, /* B825 (47141) */
+    3347, /* B826 (47142) */
+    3347, /* B827 (47143) */
+    3347, /* B828 (47144) */
+    3347, /* B829 (47145) */
+    3347, /* B82A (47146) */
+    3347, /* B82B (47147) */
+    3347, /* B82C (47148) */
+    3347, /* B82D (47149) */
+    3347, /* B82E (47150) */
+    3347, /* B82F (47151) */
+    3347, /* B830 (47152) */
+    3347, /* B831 (47153) */
+    3347, /* B832 (47154) */
+    3347, /* B833 (47155) */
+    3347, /* B834 (47156) */
+    3347, /* B835 (47157) */
+    3347, /* B836 (47158) */
+    3347, /* B837 (47159) */
+    3347, /* B838 (47160) */
+    3347, /* B839 (47161) */
+    3347, /* B83A (47162) */
+    3347, /* B83B (47163) */
+    3347, /* B83C (47164) */
+    3347, /* B83D (47165) */
+    3347, /* B83E (47166) */
+    3347, /* B83F (47167) */
+    3347, /* B840 (47168) */
+    3347, /* B841 (47169) */
+    3347, /* B842 (47170) */
+    3347, /* B843 (47171) */
+    3347, /* B844 (47172) */
+    3347, /* B845 (47173) */
+    3347, /* B846 (47174) */
+    3347, /* B847 (47175) */
+    3347, /* B848 (47176) */
+    3347, /* B849 (47177) */
+    3347, /* B84A (47178) */
+    3347, /* B84B (47179) */
+    3347, /* B84C (47180) */
+    3347, /* B84D (47181) */
+    3347, /* B84E (47182) */
+    3347, /* B84F (47183) */
+    3347, /* B850 (47184) */
+    3347, /* B851 (47185) */
+    3347, /* B852 (47186) */
+    3347, /* B853 (47187) */
+    3347, /* B854 (47188) */
+    3347, /* B855 (47189) */
+    3347, /* B856 (47190) */
+    3347, /* B857 (47191) */
+    3347, /* B858 (47192) */
+    3347, /* B859 (47193) */
+    3347, /* B85A (47194) */
+    3347, /* B85B (47195) */
+    3347, /* B85C (47196) */
+    3347, /* B85D (47197) */
+    3347, /* B85E (47198) */
+    3347, /* B85F (47199) */
+    3347, /* B860 (47200) */
+    3347, /* B861 (47201) */
+    3347, /* B862 (47202) */
+    3347, /* B863 (47203) */
+    3347, /* B864 (47204) */
+    3347, /* B865 (47205) */
+    3347, /* B866 (47206) */
+    3347, /* B867 (47207) */
+    3347, /* B868 (47208) */
+    3347, /* B869 (47209) */
+    3347, /* B86A (47210) */
+    3347, /* B86B (47211) */
+    3347, /* B86C (47212) */
+    3347, /* B86D (47213) */
+    3347, /* B86E (47214) */
+    3347, /* B86F (47215) */
+    3347, /* B870 (47216) */
+    3347, /* B871 (47217) */
+    3347, /* B872 (47218) */
+    3347, /* B873 (47219) */
+    3347, /* B874 (47220) */
+    3347, /* B875 (47221) */
+    3347, /* B876 (47222) */
+    3347, /* B877 (47223) */
+    3347, /* B878 (47224) */
+    3347, /* B879 (47225) */
+    3347, /* B87A (47226) */
+    3347, /* B87B (47227) */
+    3347, /* B87C (47228) */
+    3347, /* B87D (47229) */
+    3347, /* B87E (47230) */
+    3347, /* B87F (47231) */
+    3347, /* B880 (47232) */
+    3347, /* B881 (47233) */
+    3347, /* B882 (47234) */
+    3347, /* B883 (47235) */
+    3347, /* B884 (47236) */
+    3347, /* B885 (47237) */
+    3347, /* B886 (47238) */
+    3347, /* B887 (47239) */
+    3347, /* B888 (47240) */
+    3347, /* B889 (47241) */
+    3347, /* B88A (47242) */
+    3347, /* B88B (47243) */
+    3347, /* B88C (47244) */
+    3347, /* B88D (47245) */
+    3347, /* B88E (47246) */
+    3347, /* B88F (47247) */
+    3347, /* B890 (47248) */
+    3347, /* B891 (47249) */
+    3347, /* B892 (47250) */
+    3347, /* B893 (47251) */
+    3347, /* B894 (47252) */
+    3347, /* B895 (47253) */
+    3347, /* B896 (47254) */
+    3347, /* B897 (47255) */
+    3347, /* B898 (47256) */
+    3347, /* B899 (47257) */
+    3347, /* B89A (47258) */
+    3347, /* B89B (47259) */
+    3347, /* B89C (47260) */
+    3347, /* B89D (47261) */
+    3347, /* B89E (47262) */
+    3347, /* B89F (47263) */
+    3347, /* B8A0 (47264) */
+    3347, /* B8A1 (47265) */
+    3347, /* B8A2 (47266) */
+    3347, /* B8A3 (47267) */
+    3347, /* B8A4 (47268) */
+    3347, /* B8A5 (47269) */
+    3347, /* B8A6 (47270) */
+    3347, /* B8A7 (47271) */
+    3347, /* B8A8 (47272) */
+    3347, /* B8A9 (47273) */
+    3347, /* B8AA (47274) */
+    3347, /* B8AB (47275) */
+    3347, /* B8AC (47276) */
+    3347, /* B8AD (47277) */
+    3347, /* B8AE (47278) */
+    3347, /* B8AF (47279) */
+    3347, /* B8B0 (47280) */
+    3347, /* B8B1 (47281) */
+    3347, /* B8B2 (47282) */
+    3347, /* B8B3 (47283) */
+    3347, /* B8B4 (47284) */
+    3347, /* B8B5 (47285) */
+    3347, /* B8B6 (47286) */
+    3347, /* B8B7 (47287) */
+    3347, /* B8B8 (47288) */
+    3347, /* B8B9 (47289) */
+    3347, /* B8BA (47290) */
+    3347, /* B8BB (47291) */
+    3347, /* B8BC (47292) */
+    3347, /* B8BD (47293) */
+    3347, /* B8BE (47294) */
+    3347, /* B8BF (47295) */
+    3347, /* B8C0 (47296) */
+    3347, /* B8C1 (47297) */
+    3347, /* B8C2 (47298) */
+    3347, /* B8C3 (47299) */
+    3347, /* B8C4 (47300) */
+    3347, /* B8C5 (47301) */
+    3347, /* B8C6 (47302) */
+    3347, /* B8C7 (47303) */
+    3347, /* B8C8 (47304) */
+    3347, /* B8C9 (47305) */
+    3347, /* B8CA (47306) */
+    3347, /* B8CB (47307) */
+    3347, /* B8CC (47308) */
+    3347, /* B8CD (47309) */
+    3347, /* B8CE (47310) */
+    3347, /* B8CF (47311) */
+    3347, /* B8D0 (47312) */
+    3347, /* B8D1 (47313) */
+    3347, /* B8D2 (47314) */
+    3347, /* B8D3 (47315) */
+    3347, /* B8D4 (47316) */
+    3347, /* B8D5 (47317) */
+    3347, /* B8D6 (47318) */
+    3347, /* B8D7 (47319) */
+    3347, /* B8D8 (47320) */
+    3347, /* B8D9 (47321) */
+    3347, /* B8DA (47322) */
+    3347, /* B8DB (47323) */
+    3347, /* B8DC (47324) */
+    3347, /* B8DD (47325) */
+    3347, /* B8DE (47326) */
+    3347, /* B8DF (47327) */
+    3347, /* B8E0 (47328) */
+    3347, /* B8E1 (47329) */
+    3347, /* B8E2 (47330) */
+    3347, /* B8E3 (47331) */
+    3347, /* B8E4 (47332) */
+    3347, /* B8E5 (47333) */
+    3347, /* B8E6 (47334) */
+    3347, /* B8E7 (47335) */
+    3347, /* B8E8 (47336) */
+    3347, /* B8E9 (47337) */
+    3347, /* B8EA (47338) */
+    3347, /* B8EB (47339) */
+    3347, /* B8EC (47340) */
+    3347, /* B8ED (47341) */
+    3347, /* B8EE (47342) */
+    3347, /* B8EF (47343) */
+    3347, /* B8F0 (47344) */
+    3347, /* B8F1 (47345) */
+    3347, /* B8F2 (47346) */
+    3347, /* B8F3 (47347) */
+    3347, /* B8F4 (47348) */
+    3347, /* B8F5 (47349) */
+    3347, /* B8F6 (47350) */
+    3347, /* B8F7 (47351) */
+    3347, /* B8F8 (47352) */
+    3347, /* B8F9 (47353) */
+    3347, /* B8FA (47354) */
+    3347, /* B8FB (47355) */
+    3347, /* B8FC (47356) */
+    3347, /* B8FD (47357) */
+    3347, /* B8FE (47358) */
+    3347, /* B8FF (47359) */
+    3347, /* B900 (47360) */
+    3347, /* B901 (47361) */
+    3347, /* B902 (47362) */
+    3347, /* B903 (47363) */
+    3347, /* B904 (47364) */
+    3347, /* B905 (47365) */
+    3347, /* B906 (47366) */
+    3347, /* B907 (47367) */
+    3347, /* B908 (47368) */
+    3347, /* B909 (47369) */
+    3347, /* B90A (47370) */
+    3347, /* B90B (47371) */
+    3347, /* B90C (47372) */
+    3347, /* B90D (47373) */
+    3347, /* B90E (47374) */
+    3347, /* B90F (47375) */
+    3347, /* B910 (47376) */
+    3347, /* B911 (47377) */
+    3347, /* B912 (47378) */
+    3347, /* B913 (47379) */
+    3347, /* B914 (47380) */
+    3347, /* B915 (47381) */
+    3347, /* B916 (47382) */
+    3347, /* B917 (47383) */
+    3347, /* B918 (47384) */
+    3347, /* B919 (47385) */
+    3347, /* B91A (47386) */
+    3347, /* B91B (47387) */
+    3347, /* B91C (47388) */
+    3347, /* B91D (47389) */
+    3347, /* B91E (47390) */
+    3347, /* B91F (47391) */
+    3347, /* B920 (47392) */
+    3347, /* B921 (47393) */
+    3347, /* B922 (47394) */
+    3347, /* B923 (47395) */
+    3347, /* B924 (47396) */
+    3347, /* B925 (47397) */
+    3347, /* B926 (47398) */
+    3347, /* B927 (47399) */
+    3347, /* B928 (47400) */
+    3347, /* B929 (47401) */
+    3347, /* B92A (47402) */
+    3347, /* B92B (47403) */
+    3347, /* B92C (47404) */
+    3347, /* B92D (47405) */
+    3347, /* B92E (47406) */
+    3347, /* B92F (47407) */
+    3347, /* B930 (47408) */
+    3347, /* B931 (47409) */
+    3347, /* B932 (47410) */
+    3347, /* B933 (47411) */
+    3347, /* B934 (47412) */
+    3347, /* B935 (47413) */
+    3347, /* B936 (47414) */
+    3347, /* B937 (47415) */
+    3347, /* B938 (47416) */
+    3347, /* B939 (47417) */
+    3347, /* B93A (47418) */
+    3347, /* B93B (47419) */
+    3347, /* B93C (47420) */
+    3347, /* B93D (47421) */
+    3347, /* B93E (47422) */
+    3347, /* B93F (47423) */
+    3347, /* B940 (47424) */
+    3347, /* B941 (47425) */
+    3347, /* B942 (47426) */
+    3347, /* B943 (47427) */
+    3347, /* B944 (47428) */
+    3347, /* B945 (47429) */
+    3347, /* B946 (47430) */
+    3347, /* B947 (47431) */
+    3347, /* B948 (47432) */
+    3347, /* B949 (47433) */
+    3347, /* B94A (47434) */
+    3347, /* B94B (47435) */
+    3347, /* B94C (47436) */
+    3347, /* B94D (47437) */
+    3347, /* B94E (47438) */
+    3347, /* B94F (47439) */
+    3347, /* B950 (47440) */
+    3347, /* B951 (47441) */
+    3347, /* B952 (47442) */
+    3347, /* B953 (47443) */
+    3347, /* B954 (47444) */
+    3347, /* B955 (47445) */
+    3347, /* B956 (47446) */
+    3347, /* B957 (47447) */
+    3347, /* B958 (47448) */
+    3347, /* B959 (47449) */
+    3347, /* B95A (47450) */
+    3347, /* B95B (47451) */
+    3347, /* B95C (47452) */
+    3347, /* B95D (47453) */
+    3347, /* B95E (47454) */
+    3347, /* B95F (47455) */
+    3347, /* B960 (47456) */
+    3347, /* B961 (47457) */
+    3347, /* B962 (47458) */
+    3347, /* B963 (47459) */
+    3347, /* B964 (47460) */
+    3347, /* B965 (47461) */
+    3347, /* B966 (47462) */
+    3347, /* B967 (47463) */
+    3347, /* B968 (47464) */
+    3347, /* B969 (47465) */
+    3347, /* B96A (47466) */
+    3347, /* B96B (47467) */
+    3347, /* B96C (47468) */
+    3347, /* B96D (47469) */
+    3347, /* B96E (47470) */
+    3347, /* B96F (47471) */
+    3347, /* B970 (47472) */
+    3347, /* B971 (47473) */
+    3347, /* B972 (47474) */
+    3347, /* B973 (47475) */
+    3347, /* B974 (47476) */
+    3347, /* B975 (47477) */
+    3347, /* B976 (47478) */
+    3347, /* B977 (47479) */
+    3347, /* B978 (47480) */
+    3347, /* B979 (47481) */
+    3347, /* B97A (47482) */
+    3347, /* B97B (47483) */
+    3347, /* B97C (47484) */
+    3347, /* B97D (47485) */
+    3347, /* B97E (47486) */
+    3347, /* B97F (47487) */
+    3347, /* B980 (47488) */
+    3347, /* B981 (47489) */
+    3347, /* B982 (47490) */
+    3347, /* B983 (47491) */
+    3347, /* B984 (47492) */
+    3347, /* B985 (47493) */
+    3347, /* B986 (47494) */
+    3347, /* B987 (47495) */
+    3347, /* B988 (47496) */
+    3347, /* B989 (47497) */
+    3347, /* B98A (47498) */
+    3347, /* B98B (47499) */
+    3347, /* B98C (47500) */
+    3347, /* B98D (47501) */
+    3347, /* B98E (47502) */
+    3347, /* B98F (47503) */
+    3347, /* B990 (47504) */
+    3347, /* B991 (47505) */
+    3347, /* B992 (47506) */
+    3347, /* B993 (47507) */
+    3347, /* B994 (47508) */
+    3347, /* B995 (47509) */
+    3347, /* B996 (47510) */
+    3347, /* B997 (47511) */
+    3347, /* B998 (47512) */
+    3347, /* B999 (47513) */
+    3347, /* B99A (47514) */
+    3347, /* B99B (47515) */
+    3347, /* B99C (47516) */
+    3347, /* B99D (47517) */
+    3347, /* B99E (47518) */
+    3347, /* B99F (47519) */
+    3347, /* B9A0 (47520) */
+    3347, /* B9A1 (47521) */
+    3347, /* B9A2 (47522) */
+    3347, /* B9A3 (47523) */
+    3347, /* B9A4 (47524) */
+    3347, /* B9A5 (47525) */
+    3347, /* B9A6 (47526) */
+    3347, /* B9A7 (47527) */
+    3347, /* B9A8 (47528) */
+    3347, /* B9A9 (47529) */
+    3347, /* B9AA (47530) */
+    3347, /* B9AB (47531) */
+    3347, /* B9AC (47532) */
+    3347, /* B9AD (47533) */
+    3347, /* B9AE (47534) */
+    3347, /* B9AF (47535) */
+    3347, /* B9B0 (47536) */
+    3347, /* B9B1 (47537) */
+    3347, /* B9B2 (47538) */
+    3347, /* B9B3 (47539) */
+    3347, /* B9B4 (47540) */
+    3347, /* B9B5 (47541) */
+    3347, /* B9B6 (47542) */
+    3347, /* B9B7 (47543) */
+    3347, /* B9B8 (47544) */
+    3347, /* B9B9 (47545) */
+    3347, /* B9BA (47546) */
+    3347, /* B9BB (47547) */
+    3347, /* B9BC (47548) */
+    3347, /* B9BD (47549) */
+    3347, /* B9BE (47550) */
+    3347, /* B9BF (47551) */
+    3347, /* B9C0 (47552) */
+    3347, /* B9C1 (47553) */
+    3347, /* B9C2 (47554) */
+    3347, /* B9C3 (47555) */
+    3347, /* B9C4 (47556) */
+    3347, /* B9C5 (47557) */
+    3347, /* B9C6 (47558) */
+    3347, /* B9C7 (47559) */
+    3347, /* B9C8 (47560) */
+    3347, /* B9C9 (47561) */
+    3347, /* B9CA (47562) */
+    3347, /* B9CB (47563) */
+    3347, /* B9CC (47564) */
+    3347, /* B9CD (47565) */
+    3347, /* B9CE (47566) */
+    3347, /* B9CF (47567) */
+    3347, /* B9D0 (47568) */
+    3347, /* B9D1 (47569) */
+    3347, /* B9D2 (47570) */
+    3347, /* B9D3 (47571) */
+    3347, /* B9D4 (47572) */
+    3347, /* B9D5 (47573) */
+    3347, /* B9D6 (47574) */
+    3347, /* B9D7 (47575) */
+    3347, /* B9D8 (47576) */
+    3347, /* B9D9 (47577) */
+    3347, /* B9DA (47578) */
+    3347, /* B9DB (47579) */
+    3347, /* B9DC (47580) */
+    3347, /* B9DD (47581) */
+    3347, /* B9DE (47582) */
+    3347, /* B9DF (47583) */
+    3347, /* B9E0 (47584) */
+    3347, /* B9E1 (47585) */
+    3347, /* B9E2 (47586) */
+    3347, /* B9E3 (47587) */
+    3347, /* B9E4 (47588) */
+    3347, /* B9E5 (47589) */
+    3347, /* B9E6 (47590) */
+    3347, /* B9E7 (47591) */
+    3347, /* B9E8 (47592) */
+    3347, /* B9E9 (47593) */
+    3347, /* B9EA (47594) */
+    3347, /* B9EB (47595) */
+    3347, /* B9EC (47596) */
+    3347, /* B9ED (47597) */
+    3347, /* B9EE (47598) */
+    3347, /* B9EF (47599) */
+    3347, /* B9F0 (47600) */
+    3347, /* B9F1 (47601) */
+    3347, /* B9F2 (47602) */
+    3347, /* B9F3 (47603) */
+    3347, /* B9F4 (47604) */
+    3347, /* B9F5 (47605) */
+    3347, /* B9F6 (47606) */
+    3347, /* B9F7 (47607) */
+    3347, /* B9F8 (47608) */
+    3347, /* B9F9 (47609) */
+    3347, /* B9FA (47610) */
+    3347, /* B9FB (47611) */
+    3347, /* B9FC (47612) */
+    3347, /* B9FD (47613) */
+    3347, /* B9FE (47614) */
+    3347, /* B9FF (47615) */
+    3347, /* BA00 (47616) */
+    3347, /* BA01 (47617) */
+    3347, /* BA02 (47618) */
+    3347, /* BA03 (47619) */
+    3347, /* BA04 (47620) */
+    3347, /* BA05 (47621) */
+    3347, /* BA06 (47622) */
+    3347, /* BA07 (47623) */
+    3347, /* BA08 (47624) */
+    3347, /* BA09 (47625) */
+    3347, /* BA0A (47626) */
+    3347, /* BA0B (47627) */
+    3347, /* BA0C (47628) */
+    3347, /* BA0D (47629) */
+    3347, /* BA0E (47630) */
+    3347, /* BA0F (47631) */
+    3347, /* BA10 (47632) */
+    3347, /* BA11 (47633) */
+    3347, /* BA12 (47634) */
+    3347, /* BA13 (47635) */
+    3347, /* BA14 (47636) */
+    3347, /* BA15 (47637) */
+    3347, /* BA16 (47638) */
+    3347, /* BA17 (47639) */
+    3347, /* BA18 (47640) */
+    3347, /* BA19 (47641) */
+    3347, /* BA1A (47642) */
+    3347, /* BA1B (47643) */
+    3347, /* BA1C (47644) */
+    3347, /* BA1D (47645) */
+    3347, /* BA1E (47646) */
+    3347, /* BA1F (47647) */
+    3347, /* BA20 (47648) */
+    3347, /* BA21 (47649) */
+    3347, /* BA22 (47650) */
+    3347, /* BA23 (47651) */
+    3347, /* BA24 (47652) */
+    3347, /* BA25 (47653) */
+    3347, /* BA26 (47654) */
+    3347, /* BA27 (47655) */
+    3347, /* BA28 (47656) */
+    3347, /* BA29 (47657) */
+    3347, /* BA2A (47658) */
+    3347, /* BA2B (47659) */
+    3347, /* BA2C (47660) */
+    3347, /* BA2D (47661) */
+    3347, /* BA2E (47662) */
+    3347, /* BA2F (47663) */
+    3347, /* BA30 (47664) */
+    3347, /* BA31 (47665) */
+    3347, /* BA32 (47666) */
+    3347, /* BA33 (47667) */
+    3347, /* BA34 (47668) */
+    3347, /* BA35 (47669) */
+    3347, /* BA36 (47670) */
+    3347, /* BA37 (47671) */
+    3347, /* BA38 (47672) */
+    3347, /* BA39 (47673) */
+    3347, /* BA3A (47674) */
+    3347, /* BA3B (47675) */
+    3347, /* BA3C (47676) */
+    3347, /* BA3D (47677) */
+    3347, /* BA3E (47678) */
+    3347, /* BA3F (47679) */
+    3347, /* BA40 (47680) */
+    3347, /* BA41 (47681) */
+    3347, /* BA42 (47682) */
+    3347, /* BA43 (47683) */
+    3347, /* BA44 (47684) */
+    3347, /* BA45 (47685) */
+    3347, /* BA46 (47686) */
+    3347, /* BA47 (47687) */
+    3347, /* BA48 (47688) */
+    3347, /* BA49 (47689) */
+    3347, /* BA4A (47690) */
+    3347, /* BA4B (47691) */
+    3347, /* BA4C (47692) */
+    3347, /* BA4D (47693) */
+    3347, /* BA4E (47694) */
+    3347, /* BA4F (47695) */
+    3347, /* BA50 (47696) */
+    3347, /* BA51 (47697) */
+    3347, /* BA52 (47698) */
+    3347, /* BA53 (47699) */
+    3347, /* BA54 (47700) */
+    3347, /* BA55 (47701) */
+    3347, /* BA56 (47702) */
+    3347, /* BA57 (47703) */
+    3347, /* BA58 (47704) */
+    3347, /* BA59 (47705) */
+    3347, /* BA5A (47706) */
+    3347, /* BA5B (47707) */
+    3347, /* BA5C (47708) */
+    3347, /* BA5D (47709) */
+    3347, /* BA5E (47710) */
+    3347, /* BA5F (47711) */
+    3347, /* BA60 (47712) */
+    3347, /* BA61 (47713) */
+    3347, /* BA62 (47714) */
+    3347, /* BA63 (47715) */
+    3347, /* BA64 (47716) */
+    3347, /* BA65 (47717) */
+    3347, /* BA66 (47718) */
+    3347, /* BA67 (47719) */
+    3347, /* BA68 (47720) */
+    3347, /* BA69 (47721) */
+    3347, /* BA6A (47722) */
+    3347, /* BA6B (47723) */
+    3347, /* BA6C (47724) */
+    3347, /* BA6D (47725) */
+    3347, /* BA6E (47726) */
+    3347, /* BA6F (47727) */
+    3347, /* BA70 (47728) */
+    3347, /* BA71 (47729) */
+    3347, /* BA72 (47730) */
+    3347, /* BA73 (47731) */
+    3347, /* BA74 (47732) */
+    3347, /* BA75 (47733) */
+    3347, /* BA76 (47734) */
+    3347, /* BA77 (47735) */
+    3347, /* BA78 (47736) */
+    3347, /* BA79 (47737) */
+    3347, /* BA7A (47738) */
+    3347, /* BA7B (47739) */
+    3347, /* BA7C (47740) */
+    3347, /* BA7D (47741) */
+    3347, /* BA7E (47742) */
+    3347, /* BA7F (47743) */
+    3347, /* BA80 (47744) */
+    3347, /* BA81 (47745) */
+    3347, /* BA82 (47746) */
+    3347, /* BA83 (47747) */
+    3347, /* BA84 (47748) */
+    3347, /* BA85 (47749) */
+    3347, /* BA86 (47750) */
+    3347, /* BA87 (47751) */
+    3347, /* BA88 (47752) */
+    3347, /* BA89 (47753) */
+    3347, /* BA8A (47754) */
+    3347, /* BA8B (47755) */
+    3347, /* BA8C (47756) */
+    3347, /* BA8D (47757) */
+    3347, /* BA8E (47758) */
+    3347, /* BA8F (47759) */
+    3347, /* BA90 (47760) */
+    3347, /* BA91 (47761) */
+    3347, /* BA92 (47762) */
+    3347, /* BA93 (47763) */
+    3347, /* BA94 (47764) */
+    3347, /* BA95 (47765) */
+    3347, /* BA96 (47766) */
+    3347, /* BA97 (47767) */
+    3347, /* BA98 (47768) */
+    3347, /* BA99 (47769) */
+    3347, /* BA9A (47770) */
+    3347, /* BA9B (47771) */
+    3347, /* BA9C (47772) */
+    3347, /* BA9D (47773) */
+    3347, /* BA9E (47774) */
+    3347, /* BA9F (47775) */
+    3347, /* BAA0 (47776) */
+    3347, /* BAA1 (47777) */
+    3347, /* BAA2 (47778) */
+    3347, /* BAA3 (47779) */
+    3347, /* BAA4 (47780) */
+    3347, /* BAA5 (47781) */
+    3347, /* BAA6 (47782) */
+    3347, /* BAA7 (47783) */
+    3347, /* BAA8 (47784) */
+    3347, /* BAA9 (47785) */
+    3347, /* BAAA (47786) */
+    3347, /* BAAB (47787) */
+    3347, /* BAAC (47788) */
+    3347, /* BAAD (47789) */
+    3347, /* BAAE (47790) */
+    3347, /* BAAF (47791) */
+    3347, /* BAB0 (47792) */
+    3347, /* BAB1 (47793) */
+    3347, /* BAB2 (47794) */
+    3347, /* BAB3 (47795) */
+    3347, /* BAB4 (47796) */
+    3347, /* BAB5 (47797) */
+    3347, /* BAB6 (47798) */
+    3347, /* BAB7 (47799) */
+    3347, /* BAB8 (47800) */
+    3347, /* BAB9 (47801) */
+    3347, /* BABA (47802) */
+    3347, /* BABB (47803) */
+    3347, /* BABC (47804) */
+    3347, /* BABD (47805) */
+    3347, /* BABE (47806) */
+    3347, /* BABF (47807) */
+    3347, /* BAC0 (47808) */
+    3347, /* BAC1 (47809) */
+    3347, /* BAC2 (47810) */
+    3347, /* BAC3 (47811) */
+    3347, /* BAC4 (47812) */
+    3347, /* BAC5 (47813) */
+    3347, /* BAC6 (47814) */
+    3347, /* BAC7 (47815) */
+    3347, /* BAC8 (47816) */
+    3347, /* BAC9 (47817) */
+    3347, /* BACA (47818) */
+    3347, /* BACB (47819) */
+    3347, /* BACC (47820) */
+    3347, /* BACD (47821) */
+    3347, /* BACE (47822) */
+    3347, /* BACF (47823) */
+    3347, /* BAD0 (47824) */
+    3347, /* BAD1 (47825) */
+    3347, /* BAD2 (47826) */
+    3347, /* BAD3 (47827) */
+    3347, /* BAD4 (47828) */
+    3347, /* BAD5 (47829) */
+    3347, /* BAD6 (47830) */
+    3347, /* BAD7 (47831) */
+    3347, /* BAD8 (47832) */
+    3347, /* BAD9 (47833) */
+    3347, /* BADA (47834) */
+    3347, /* BADB (47835) */
+    3347, /* BADC (47836) */
+    3347, /* BADD (47837) */
+    3347, /* BADE (47838) */
+    3347, /* BADF (47839) */
+    3347, /* BAE0 (47840) */
+    3347, /* BAE1 (47841) */
+    3347, /* BAE2 (47842) */
+    3347, /* BAE3 (47843) */
+    3347, /* BAE4 (47844) */
+    3347, /* BAE5 (47845) */
+    3347, /* BAE6 (47846) */
+    3347, /* BAE7 (47847) */
+    3347, /* BAE8 (47848) */
+    3347, /* BAE9 (47849) */
+    3347, /* BAEA (47850) */
+    3347, /* BAEB (47851) */
+    3347, /* BAEC (47852) */
+    3347, /* BAED (47853) */
+    3347, /* BAEE (47854) */
+    3347, /* BAEF (47855) */
+    3347, /* BAF0 (47856) */
+    3347, /* BAF1 (47857) */
+    3347, /* BAF2 (47858) */
+    3347, /* BAF3 (47859) */
+    3347, /* BAF4 (47860) */
+    3347, /* BAF5 (47861) */
+    3347, /* BAF6 (47862) */
+    3347, /* BAF7 (47863) */
+    3347, /* BAF8 (47864) */
+    3347, /* BAF9 (47865) */
+    3347, /* BAFA (47866) */
+    3347, /* BAFB (47867) */
+    3347, /* BAFC (47868) */
+    3347, /* BAFD (47869) */
+    3347, /* BAFE (47870) */
+    3347, /* BAFF (47871) */
+    3347, /* BB00 (47872) */
+    3347, /* BB01 (47873) */
+    3347, /* BB02 (47874) */
+    3347, /* BB03 (47875) */
+    3347, /* BB04 (47876) */
+    3347, /* BB05 (47877) */
+    3347, /* BB06 (47878) */
+    3347, /* BB07 (47879) */
+    3347, /* BB08 (47880) */
+    3347, /* BB09 (47881) */
+    3347, /* BB0A (47882) */
+    3347, /* BB0B (47883) */
+    3347, /* BB0C (47884) */
+    3347, /* BB0D (47885) */
+    3347, /* BB0E (47886) */
+    3347, /* BB0F (47887) */
+    3347, /* BB10 (47888) */
+    3347, /* BB11 (47889) */
+    3347, /* BB12 (47890) */
+    3347, /* BB13 (47891) */
+    3347, /* BB14 (47892) */
+    3347, /* BB15 (47893) */
+    3347, /* BB16 (47894) */
+    3347, /* BB17 (47895) */
+    3347, /* BB18 (47896) */
+    3347, /* BB19 (47897) */
+    3347, /* BB1A (47898) */
+    3347, /* BB1B (47899) */
+    3347, /* BB1C (47900) */
+    3347, /* BB1D (47901) */
+    3347, /* BB1E (47902) */
+    3347, /* BB1F (47903) */
+    3347, /* BB20 (47904) */
+    3347, /* BB21 (47905) */
+    3347, /* BB22 (47906) */
+    3347, /* BB23 (47907) */
+    3347, /* BB24 (47908) */
+    3347, /* BB25 (47909) */
+    3347, /* BB26 (47910) */
+    3347, /* BB27 (47911) */
+    3347, /* BB28 (47912) */
+    3347, /* BB29 (47913) */
+    3347, /* BB2A (47914) */
+    3347, /* BB2B (47915) */
+    3347, /* BB2C (47916) */
+    3347, /* BB2D (47917) */
+    3347, /* BB2E (47918) */
+    3347, /* BB2F (47919) */
+    3347, /* BB30 (47920) */
+    3347, /* BB31 (47921) */
+    3347, /* BB32 (47922) */
+    3347, /* BB33 (47923) */
+    3347, /* BB34 (47924) */
+    3347, /* BB35 (47925) */
+    3347, /* BB36 (47926) */
+    3347, /* BB37 (47927) */
+    3347, /* BB38 (47928) */
+    3347, /* BB39 (47929) */
+    3347, /* BB3A (47930) */
+    3347, /* BB3B (47931) */
+    3347, /* BB3C (47932) */
+    3347, /* BB3D (47933) */
+    3347, /* BB3E (47934) */
+    3347, /* BB3F (47935) */
+    3347, /* BB40 (47936) */
+    3347, /* BB41 (47937) */
+    3347, /* BB42 (47938) */
+    3347, /* BB43 (47939) */
+    3347, /* BB44 (47940) */
+    3347, /* BB45 (47941) */
+    3347, /* BB46 (47942) */
+    3347, /* BB47 (47943) */
+    3347, /* BB48 (47944) */
+    3347, /* BB49 (47945) */
+    3347, /* BB4A (47946) */
+    3347, /* BB4B (47947) */
+    3347, /* BB4C (47948) */
+    3347, /* BB4D (47949) */
+    3347, /* BB4E (47950) */
+    3347, /* BB4F (47951) */
+    3347, /* BB50 (47952) */
+    3347, /* BB51 (47953) */
+    3347, /* BB52 (47954) */
+    3347, /* BB53 (47955) */
+    3347, /* BB54 (47956) */
+    3347, /* BB55 (47957) */
+    3347, /* BB56 (47958) */
+    3347, /* BB57 (47959) */
+    3347, /* BB58 (47960) */
+    3347, /* BB59 (47961) */
+    3347, /* BB5A (47962) */
+    3347, /* BB5B (47963) */
+    3347, /* BB5C (47964) */
+    3347, /* BB5D (47965) */
+    3347, /* BB5E (47966) */
+    3347, /* BB5F (47967) */
+    3347, /* BB60 (47968) */
+    3347, /* BB61 (47969) */
+    3347, /* BB62 (47970) */
+    3347, /* BB63 (47971) */
+    3347, /* BB64 (47972) */
+    3347, /* BB65 (47973) */
+    3347, /* BB66 (47974) */
+    3347, /* BB67 (47975) */
+    3347, /* BB68 (47976) */
+    3347, /* BB69 (47977) */
+    3347, /* BB6A (47978) */
+    3347, /* BB6B (47979) */
+    3347, /* BB6C (47980) */
+    3347, /* BB6D (47981) */
+    3347, /* BB6E (47982) */
+    3347, /* BB6F (47983) */
+    3347, /* BB70 (47984) */
+    3347, /* BB71 (47985) */
+    3347, /* BB72 (47986) */
+    3347, /* BB73 (47987) */
+    3347, /* BB74 (47988) */
+    3347, /* BB75 (47989) */
+    3347, /* BB76 (47990) */
+    3347, /* BB77 (47991) */
+    3347, /* BB78 (47992) */
+    3347, /* BB79 (47993) */
+    3347, /* BB7A (47994) */
+    3347, /* BB7B (47995) */
+    3347, /* BB7C (47996) */
+    3347, /* BB7D (47997) */
+    3347, /* BB7E (47998) */
+    3347, /* BB7F (47999) */
+    3347, /* BB80 (48000) */
+    3347, /* BB81 (48001) */
+    3347, /* BB82 (48002) */
+    3347, /* BB83 (48003) */
+    3347, /* BB84 (48004) */
+    3347, /* BB85 (48005) */
+    3347, /* BB86 (48006) */
+    3347, /* BB87 (48007) */
+    3347, /* BB88 (48008) */
+    3347, /* BB89 (48009) */
+    3347, /* BB8A (48010) */
+    3347, /* BB8B (48011) */
+    3347, /* BB8C (48012) */
+    3347, /* BB8D (48013) */
+    3347, /* BB8E (48014) */
+    3347, /* BB8F (48015) */
+    3347, /* BB90 (48016) */
+    3347, /* BB91 (48017) */
+    3347, /* BB92 (48018) */
+    3347, /* BB93 (48019) */
+    3347, /* BB94 (48020) */
+    3347, /* BB95 (48021) */
+    3347, /* BB96 (48022) */
+    3347, /* BB97 (48023) */
+    3347, /* BB98 (48024) */
+    3347, /* BB99 (48025) */
+    3347, /* BB9A (48026) */
+    3347, /* BB9B (48027) */
+    3347, /* BB9C (48028) */
+    3347, /* BB9D (48029) */
+    3347, /* BB9E (48030) */
+    3347, /* BB9F (48031) */
+    3347, /* BBA0 (48032) */
+    3347, /* BBA1 (48033) */
+    3347, /* BBA2 (48034) */
+    3347, /* BBA3 (48035) */
+    3347, /* BBA4 (48036) */
+    3347, /* BBA5 (48037) */
+    3347, /* BBA6 (48038) */
+    3347, /* BBA7 (48039) */
+    3347, /* BBA8 (48040) */
+    3347, /* BBA9 (48041) */
+    3347, /* BBAA (48042) */
+    3347, /* BBAB (48043) */
+    3347, /* BBAC (48044) */
+    3347, /* BBAD (48045) */
+    3347, /* BBAE (48046) */
+    3347, /* BBAF (48047) */
+    3347, /* BBB0 (48048) */
+    3347, /* BBB1 (48049) */
+    3347, /* BBB2 (48050) */
+    3347, /* BBB3 (48051) */
+    3347, /* BBB4 (48052) */
+    3347, /* BBB5 (48053) */
+    3347, /* BBB6 (48054) */
+    3347, /* BBB7 (48055) */
+    3347, /* BBB8 (48056) */
+    3347, /* BBB9 (48057) */
+    3347, /* BBBA (48058) */
+    3347, /* BBBB (48059) */
+    3347, /* BBBC (48060) */
+    3347, /* BBBD (48061) */
+    3347, /* BBBE (48062) */
+    3347, /* BBBF (48063) */
+    3347, /* BBC0 (48064) */
+    3347, /* BBC1 (48065) */
+    3347, /* BBC2 (48066) */
+    3347, /* BBC3 (48067) */
+    3347, /* BBC4 (48068) */
+    3347, /* BBC5 (48069) */
+    3347, /* BBC6 (48070) */
+    3347, /* BBC7 (48071) */
+    3347, /* BBC8 (48072) */
+    3347, /* BBC9 (48073) */
+    3347, /* BBCA (48074) */
+    3347, /* BBCB (48075) */
+    3347, /* BBCC (48076) */
+    3347, /* BBCD (48077) */
+    3347, /* BBCE (48078) */
+    3347, /* BBCF (48079) */
+    3347, /* BBD0 (48080) */
+    3347, /* BBD1 (48081) */
+    3347, /* BBD2 (48082) */
+    3347, /* BBD3 (48083) */
+    3347, /* BBD4 (48084) */
+    3347, /* BBD5 (48085) */
+    3347, /* BBD6 (48086) */
+    3347, /* BBD7 (48087) */
+    3347, /* BBD8 (48088) */
+    3347, /* BBD9 (48089) */
+    3347, /* BBDA (48090) */
+    3347, /* BBDB (48091) */
+    3347, /* BBDC (48092) */
+    3347, /* BBDD (48093) */
+    3347, /* BBDE (48094) */
+    3347, /* BBDF (48095) */
+    3347, /* BBE0 (48096) */
+    3347, /* BBE1 (48097) */
+    3347, /* BBE2 (48098) */
+    3347, /* BBE3 (48099) */
+    3347, /* BBE4 (48100) */
+    3347, /* BBE5 (48101) */
+    3347, /* BBE6 (48102) */
+    3347, /* BBE7 (48103) */
+    3347, /* BBE8 (48104) */
+    3347, /* BBE9 (48105) */
+    3347, /* BBEA (48106) */
+    3347, /* BBEB (48107) */
+    3347, /* BBEC (48108) */
+    3347, /* BBED (48109) */
+    3347, /* BBEE (48110) */
+    3347, /* BBEF (48111) */
+    3347, /* BBF0 (48112) */
+    3347, /* BBF1 (48113) */
+    3347, /* BBF2 (48114) */
+    3347, /* BBF3 (48115) */
+    3347, /* BBF4 (48116) */
+    3347, /* BBF5 (48117) */
+    3347, /* BBF6 (48118) */
+    3347, /* BBF7 (48119) */
+    3347, /* BBF8 (48120) */
+    3347, /* BBF9 (48121) */
+    3347, /* BBFA (48122) */
+    3347, /* BBFB (48123) */
+    3347, /* BBFC (48124) */
+    3347, /* BBFD (48125) */
+    3347, /* BBFE (48126) */
+    3347, /* BBFF (48127) */
+    3347, /* BC00 (48128) */
+    3347, /* BC01 (48129) */
+    3347, /* BC02 (48130) */
+    3347, /* BC03 (48131) */
+    3347, /* BC04 (48132) */
+    3347, /* BC05 (48133) */
+    3347, /* BC06 (48134) */
+    3347, /* BC07 (48135) */
+    3347, /* BC08 (48136) */
+    3347, /* BC09 (48137) */
+    3347, /* BC0A (48138) */
+    3347, /* BC0B (48139) */
+    3347, /* BC0C (48140) */
+    3347, /* BC0D (48141) */
+    3347, /* BC0E (48142) */
+    3347, /* BC0F (48143) */
+    3347, /* BC10 (48144) */
+    3347, /* BC11 (48145) */
+    3347, /* BC12 (48146) */
+    3347, /* BC13 (48147) */
+    3347, /* BC14 (48148) */
+    3347, /* BC15 (48149) */
+    3347, /* BC16 (48150) */
+    3347, /* BC17 (48151) */
+    3347, /* BC18 (48152) */
+    3347, /* BC19 (48153) */
+    3347, /* BC1A (48154) */
+    3347, /* BC1B (48155) */
+    3347, /* BC1C (48156) */
+    3347, /* BC1D (48157) */
+    3347, /* BC1E (48158) */
+    3347, /* BC1F (48159) */
+    3347, /* BC20 (48160) */
+    3347, /* BC21 (48161) */
+    3347, /* BC22 (48162) */
+    3347, /* BC23 (48163) */
+    3347, /* BC24 (48164) */
+    3347, /* BC25 (48165) */
+    3347, /* BC26 (48166) */
+    3347, /* BC27 (48167) */
+    3347, /* BC28 (48168) */
+    3347, /* BC29 (48169) */
+    3347, /* BC2A (48170) */
+    3347, /* BC2B (48171) */
+    3347, /* BC2C (48172) */
+    3347, /* BC2D (48173) */
+    3347, /* BC2E (48174) */
+    3347, /* BC2F (48175) */
+    3347, /* BC30 (48176) */
+    3347, /* BC31 (48177) */
+    3347, /* BC32 (48178) */
+    3347, /* BC33 (48179) */
+    3347, /* BC34 (48180) */
+    3347, /* BC35 (48181) */
+    3347, /* BC36 (48182) */
+    3347, /* BC37 (48183) */
+    3347, /* BC38 (48184) */
+    3347, /* BC39 (48185) */
+    3347, /* BC3A (48186) */
+    3347, /* BC3B (48187) */
+    3347, /* BC3C (48188) */
+    3347, /* BC3D (48189) */
+    3347, /* BC3E (48190) */
+    3347, /* BC3F (48191) */
+    3347, /* BC40 (48192) */
+    3347, /* BC41 (48193) */
+    3347, /* BC42 (48194) */
+    3347, /* BC43 (48195) */
+    3347, /* BC44 (48196) */
+    3347, /* BC45 (48197) */
+    3347, /* BC46 (48198) */
+    3347, /* BC47 (48199) */
+    3347, /* BC48 (48200) */
+    3347, /* BC49 (48201) */
+    3347, /* BC4A (48202) */
+    3347, /* BC4B (48203) */
+    3347, /* BC4C (48204) */
+    3347, /* BC4D (48205) */
+    3347, /* BC4E (48206) */
+    3347, /* BC4F (48207) */
+    3347, /* BC50 (48208) */
+    3347, /* BC51 (48209) */
+    3347, /* BC52 (48210) */
+    3347, /* BC53 (48211) */
+    3347, /* BC54 (48212) */
+    3347, /* BC55 (48213) */
+    3347, /* BC56 (48214) */
+    3347, /* BC57 (48215) */
+    3347, /* BC58 (48216) */
+    3347, /* BC59 (48217) */
+    3347, /* BC5A (48218) */
+    3347, /* BC5B (48219) */
+    3347, /* BC5C (48220) */
+    3347, /* BC5D (48221) */
+    3347, /* BC5E (48222) */
+    3347, /* BC5F (48223) */
+    3347, /* BC60 (48224) */
+    3347, /* BC61 (48225) */
+    3347, /* BC62 (48226) */
+    3347, /* BC63 (48227) */
+    3347, /* BC64 (48228) */
+    3347, /* BC65 (48229) */
+    3347, /* BC66 (48230) */
+    3347, /* BC67 (48231) */
+    3347, /* BC68 (48232) */
+    3347, /* BC69 (48233) */
+    3347, /* BC6A (48234) */
+    3347, /* BC6B (48235) */
+    3347, /* BC6C (48236) */
+    3347, /* BC6D (48237) */
+    3347, /* BC6E (48238) */
+    3347, /* BC6F (48239) */
+    3347, /* BC70 (48240) */
+    3347, /* BC71 (48241) */
+    3347, /* BC72 (48242) */
+    3347, /* BC73 (48243) */
+    3347, /* BC74 (48244) */
+    3347, /* BC75 (48245) */
+    3347, /* BC76 (48246) */
+    3347, /* BC77 (48247) */
+    3347, /* BC78 (48248) */
+    3347, /* BC79 (48249) */
+    3347, /* BC7A (48250) */
+    3347, /* BC7B (48251) */
+    3347, /* BC7C (48252) */
+    3347, /* BC7D (48253) */
+    3347, /* BC7E (48254) */
+    3347, /* BC7F (48255) */
+    3347, /* BC80 (48256) */
+    3347, /* BC81 (48257) */
+    3347, /* BC82 (48258) */
+    3347, /* BC83 (48259) */
+    3347, /* BC84 (48260) */
+    3347, /* BC85 (48261) */
+    3347, /* BC86 (48262) */
+    3347, /* BC87 (48263) */
+    3347, /* BC88 (48264) */
+    3347, /* BC89 (48265) */
+    3347, /* BC8A (48266) */
+    3347, /* BC8B (48267) */
+    3347, /* BC8C (48268) */
+    3347, /* BC8D (48269) */
+    3347, /* BC8E (48270) */
+    3347, /* BC8F (48271) */
+    3347, /* BC90 (48272) */
+    3347, /* BC91 (48273) */
+    3347, /* BC92 (48274) */
+    3347, /* BC93 (48275) */
+    3347, /* BC94 (48276) */
+    3347, /* BC95 (48277) */
+    3347, /* BC96 (48278) */
+    3347, /* BC97 (48279) */
+    3347, /* BC98 (48280) */
+    3347, /* BC99 (48281) */
+    3347, /* BC9A (48282) */
+    3347, /* BC9B (48283) */
+    3347, /* BC9C (48284) */
+    3347, /* BC9D (48285) */
+    3347, /* BC9E (48286) */
+    3347, /* BC9F (48287) */
+    3347, /* BCA0 (48288) */
+    3347, /* BCA1 (48289) */
+    3347, /* BCA2 (48290) */
+    3347, /* BCA3 (48291) */
+    3347, /* BCA4 (48292) */
+    3347, /* BCA5 (48293) */
+    3347, /* BCA6 (48294) */
+    3347, /* BCA7 (48295) */
+    3347, /* BCA8 (48296) */
+    3347, /* BCA9 (48297) */
+    3347, /* BCAA (48298) */
+    3347, /* BCAB (48299) */
+    3347, /* BCAC (48300) */
+    3347, /* BCAD (48301) */
+    3347, /* BCAE (48302) */
+    3347, /* BCAF (48303) */
+    3347, /* BCB0 (48304) */
+    3347, /* BCB1 (48305) */
+    3347, /* BCB2 (48306) */
+    3347, /* BCB3 (48307) */
+    3347, /* BCB4 (48308) */
+    3347, /* BCB5 (48309) */
+    3347, /* BCB6 (48310) */
+    3347, /* BCB7 (48311) */
+    3347, /* BCB8 (48312) */
+    3347, /* BCB9 (48313) */
+    3347, /* BCBA (48314) */
+    3347, /* BCBB (48315) */
+    3347, /* BCBC (48316) */
+    3347, /* BCBD (48317) */
+    3347, /* BCBE (48318) */
+    3347, /* BCBF (48319) */
+    3347, /* BCC0 (48320) */
+    3347, /* BCC1 (48321) */
+    3347, /* BCC2 (48322) */
+    3347, /* BCC3 (48323) */
+    3347, /* BCC4 (48324) */
+    3347, /* BCC5 (48325) */
+    3347, /* BCC6 (48326) */
+    3347, /* BCC7 (48327) */
+    3347, /* BCC8 (48328) */
+    3347, /* BCC9 (48329) */
+    3347, /* BCCA (48330) */
+    3347, /* BCCB (48331) */
+    3347, /* BCCC (48332) */
+    3347, /* BCCD (48333) */
+    3347, /* BCCE (48334) */
+    3347, /* BCCF (48335) */
+    3347, /* BCD0 (48336) */
+    3347, /* BCD1 (48337) */
+    3347, /* BCD2 (48338) */
+    3347, /* BCD3 (48339) */
+    3347, /* BCD4 (48340) */
+    3347, /* BCD5 (48341) */
+    3347, /* BCD6 (48342) */
+    3347, /* BCD7 (48343) */
+    3347, /* BCD8 (48344) */
+    3347, /* BCD9 (48345) */
+    3347, /* BCDA (48346) */
+    3347, /* BCDB (48347) */
+    3347, /* BCDC (48348) */
+    3347, /* BCDD (48349) */
+    3347, /* BCDE (48350) */
+    3347, /* BCDF (48351) */
+    3347, /* BCE0 (48352) */
+    3347, /* BCE1 (48353) */
+    3347, /* BCE2 (48354) */
+    3347, /* BCE3 (48355) */
+    3347, /* BCE4 (48356) */
+    3347, /* BCE5 (48357) */
+    3347, /* BCE6 (48358) */
+    3347, /* BCE7 (48359) */
+    3347, /* BCE8 (48360) */
+    3347, /* BCE9 (48361) */
+    3347, /* BCEA (48362) */
+    3347, /* BCEB (48363) */
+    3347, /* BCEC (48364) */
+    3347, /* BCED (48365) */
+    3347, /* BCEE (48366) */
+    3347, /* BCEF (48367) */
+    3347, /* BCF0 (48368) */
+    3347, /* BCF1 (48369) */
+    3347, /* BCF2 (48370) */
+    3347, /* BCF3 (48371) */
+    3347, /* BCF4 (48372) */
+    3347, /* BCF5 (48373) */
+    3347, /* BCF6 (48374) */
+    3347, /* BCF7 (48375) */
+    3347, /* BCF8 (48376) */
+    3347, /* BCF9 (48377) */
+    3347, /* BCFA (48378) */
+    3347, /* BCFB (48379) */
+    3347, /* BCFC (48380) */
+    3347, /* BCFD (48381) */
+    3347, /* BCFE (48382) */
+    3347, /* BCFF (48383) */
+    3347, /* BD00 (48384) */
+    3347, /* BD01 (48385) */
+    3347, /* BD02 (48386) */
+    3347, /* BD03 (48387) */
+    3347, /* BD04 (48388) */
+    3347, /* BD05 (48389) */
+    3347, /* BD06 (48390) */
+    3347, /* BD07 (48391) */
+    3347, /* BD08 (48392) */
+    3347, /* BD09 (48393) */
+    3347, /* BD0A (48394) */
+    3347, /* BD0B (48395) */
+    3347, /* BD0C (48396) */
+    3347, /* BD0D (48397) */
+    3347, /* BD0E (48398) */
+    3347, /* BD0F (48399) */
+    3347, /* BD10 (48400) */
+    3347, /* BD11 (48401) */
+    3347, /* BD12 (48402) */
+    3347, /* BD13 (48403) */
+    3347, /* BD14 (48404) */
+    3347, /* BD15 (48405) */
+    3347, /* BD16 (48406) */
+    3347, /* BD17 (48407) */
+    3347, /* BD18 (48408) */
+    3347, /* BD19 (48409) */
+    3347, /* BD1A (48410) */
+    3347, /* BD1B (48411) */
+    3347, /* BD1C (48412) */
+    3347, /* BD1D (48413) */
+    3347, /* BD1E (48414) */
+    3347, /* BD1F (48415) */
+    3347, /* BD20 (48416) */
+    3347, /* BD21 (48417) */
+    3347, /* BD22 (48418) */
+    3347, /* BD23 (48419) */
+    3347, /* BD24 (48420) */
+    3347, /* BD25 (48421) */
+    3347, /* BD26 (48422) */
+    3347, /* BD27 (48423) */
+    3347, /* BD28 (48424) */
+    3347, /* BD29 (48425) */
+    3347, /* BD2A (48426) */
+    3347, /* BD2B (48427) */
+    3347, /* BD2C (48428) */
+    3347, /* BD2D (48429) */
+    3347, /* BD2E (48430) */
+    3347, /* BD2F (48431) */
+    3347, /* BD30 (48432) */
+    3347, /* BD31 (48433) */
+    3347, /* BD32 (48434) */
+    3347, /* BD33 (48435) */
+    3347, /* BD34 (48436) */
+    3347, /* BD35 (48437) */
+    3347, /* BD36 (48438) */
+    3347, /* BD37 (48439) */
+    3347, /* BD38 (48440) */
+    3347, /* BD39 (48441) */
+    3347, /* BD3A (48442) */
+    3347, /* BD3B (48443) */
+    3347, /* BD3C (48444) */
+    3347, /* BD3D (48445) */
+    3347, /* BD3E (48446) */
+    3347, /* BD3F (48447) */
+    3347, /* BD40 (48448) */
+    3347, /* BD41 (48449) */
+    3347, /* BD42 (48450) */
+    3347, /* BD43 (48451) */
+    3347, /* BD44 (48452) */
+    3347, /* BD45 (48453) */
+    3347, /* BD46 (48454) */
+    3347, /* BD47 (48455) */
+    3347, /* BD48 (48456) */
+    3347, /* BD49 (48457) */
+    3347, /* BD4A (48458) */
+    3347, /* BD4B (48459) */
+    3347, /* BD4C (48460) */
+    3347, /* BD4D (48461) */
+    3347, /* BD4E (48462) */
+    3347, /* BD4F (48463) */
+    3347, /* BD50 (48464) */
+    3347, /* BD51 (48465) */
+    3347, /* BD52 (48466) */
+    3347, /* BD53 (48467) */
+    3347, /* BD54 (48468) */
+    3347, /* BD55 (48469) */
+    3347, /* BD56 (48470) */
+    3347, /* BD57 (48471) */
+    3347, /* BD58 (48472) */
+    3347, /* BD59 (48473) */
+    3347, /* BD5A (48474) */
+    3347, /* BD5B (48475) */
+    3347, /* BD5C (48476) */
+    3347, /* BD5D (48477) */
+    3347, /* BD5E (48478) */
+    3347, /* BD5F (48479) */
+    3347, /* BD60 (48480) */
+    3347, /* BD61 (48481) */
+    3347, /* BD62 (48482) */
+    3347, /* BD63 (48483) */
+    3347, /* BD64 (48484) */
+    3347, /* BD65 (48485) */
+    3347, /* BD66 (48486) */
+    3347, /* BD67 (48487) */
+    3347, /* BD68 (48488) */
+    3347, /* BD69 (48489) */
+    3347, /* BD6A (48490) */
+    3347, /* BD6B (48491) */
+    3347, /* BD6C (48492) */
+    3347, /* BD6D (48493) */
+    3347, /* BD6E (48494) */
+    3347, /* BD6F (48495) */
+    3347, /* BD70 (48496) */
+    3347, /* BD71 (48497) */
+    3347, /* BD72 (48498) */
+    3347, /* BD73 (48499) */
+    3347, /* BD74 (48500) */
+    3347, /* BD75 (48501) */
+    3347, /* BD76 (48502) */
+    3347, /* BD77 (48503) */
+    3347, /* BD78 (48504) */
+    3347, /* BD79 (48505) */
+    3347, /* BD7A (48506) */
+    3347, /* BD7B (48507) */
+    3347, /* BD7C (48508) */
+    3347, /* BD7D (48509) */
+    3347, /* BD7E (48510) */
+    3347, /* BD7F (48511) */
+    3347, /* BD80 (48512) */
+    3347, /* BD81 (48513) */
+    3347, /* BD82 (48514) */
+    3347, /* BD83 (48515) */
+    3347, /* BD84 (48516) */
+    3347, /* BD85 (48517) */
+    3347, /* BD86 (48518) */
+    3347, /* BD87 (48519) */
+    3347, /* BD88 (48520) */
+    3347, /* BD89 (48521) */
+    3347, /* BD8A (48522) */
+    3347, /* BD8B (48523) */
+    3347, /* BD8C (48524) */
+    3347, /* BD8D (48525) */
+    3347, /* BD8E (48526) */
+    3347, /* BD8F (48527) */
+    3347, /* BD90 (48528) */
+    3347, /* BD91 (48529) */
+    3347, /* BD92 (48530) */
+    3347, /* BD93 (48531) */
+    3347, /* BD94 (48532) */
+    3347, /* BD95 (48533) */
+    3347, /* BD96 (48534) */
+    3347, /* BD97 (48535) */
+    3347, /* BD98 (48536) */
+    3347, /* BD99 (48537) */
+    3347, /* BD9A (48538) */
+    3347, /* BD9B (48539) */
+    3347, /* BD9C (48540) */
+    3347, /* BD9D (48541) */
+    3347, /* BD9E (48542) */
+    3347, /* BD9F (48543) */
+    3347, /* BDA0 (48544) */
+    3347, /* BDA1 (48545) */
+    3347, /* BDA2 (48546) */
+    3347, /* BDA3 (48547) */
+    3347, /* BDA4 (48548) */
+    3347, /* BDA5 (48549) */
+    3347, /* BDA6 (48550) */
+    3347, /* BDA7 (48551) */
+    3347, /* BDA8 (48552) */
+    3347, /* BDA9 (48553) */
+    3347, /* BDAA (48554) */
+    3347, /* BDAB (48555) */
+    3347, /* BDAC (48556) */
+    3347, /* BDAD (48557) */
+    3347, /* BDAE (48558) */
+    3347, /* BDAF (48559) */
+    3347, /* BDB0 (48560) */
+    3347, /* BDB1 (48561) */
+    3347, /* BDB2 (48562) */
+    3347, /* BDB3 (48563) */
+    3347, /* BDB4 (48564) */
+    3347, /* BDB5 (48565) */
+    3347, /* BDB6 (48566) */
+    3347, /* BDB7 (48567) */
+    3347, /* BDB8 (48568) */
+    3347, /* BDB9 (48569) */
+    3347, /* BDBA (48570) */
+    3347, /* BDBB (48571) */
+    3347, /* BDBC (48572) */
+    3347, /* BDBD (48573) */
+    3347, /* BDBE (48574) */
+    3347, /* BDBF (48575) */
+    3347, /* BDC0 (48576) */
+    3347, /* BDC1 (48577) */
+    3347, /* BDC2 (48578) */
+    3347, /* BDC3 (48579) */
+    3347, /* BDC4 (48580) */
+    3347, /* BDC5 (48581) */
+    3347, /* BDC6 (48582) */
+    3347, /* BDC7 (48583) */
+    3347, /* BDC8 (48584) */
+    3347, /* BDC9 (48585) */
+    3347, /* BDCA (48586) */
+    3347, /* BDCB (48587) */
+    3347, /* BDCC (48588) */
+    3347, /* BDCD (48589) */
+    3347, /* BDCE (48590) */
+    3347, /* BDCF (48591) */
+    3347, /* BDD0 (48592) */
+    3347, /* BDD1 (48593) */
+    3347, /* BDD2 (48594) */
+    3347, /* BDD3 (48595) */
+    3347, /* BDD4 (48596) */
+    3347, /* BDD5 (48597) */
+    3347, /* BDD6 (48598) */
+    3347, /* BDD7 (48599) */
+    3347, /* BDD8 (48600) */
+    3347, /* BDD9 (48601) */
+    3347, /* BDDA (48602) */
+    3347, /* BDDB (48603) */
+    3347, /* BDDC (48604) */
+    3347, /* BDDD (48605) */
+    3347, /* BDDE (48606) */
+    3347, /* BDDF (48607) */
+    3347, /* BDE0 (48608) */
+    3347, /* BDE1 (48609) */
+    3347, /* BDE2 (48610) */
+    3347, /* BDE3 (48611) */
+    3347, /* BDE4 (48612) */
+    3347, /* BDE5 (48613) */
+    3347, /* BDE6 (48614) */
+    3347, /* BDE7 (48615) */
+    3347, /* BDE8 (48616) */
+    3347, /* BDE9 (48617) */
+    3347, /* BDEA (48618) */
+    3347, /* BDEB (48619) */
+    3347, /* BDEC (48620) */
+    3347, /* BDED (48621) */
+    3347, /* BDEE (48622) */
+    3347, /* BDEF (48623) */
+    3347, /* BDF0 (48624) */
+    3347, /* BDF1 (48625) */
+    3347, /* BDF2 (48626) */
+    3347, /* BDF3 (48627) */
+    3347, /* BDF4 (48628) */
+    3347, /* BDF5 (48629) */
+    3347, /* BDF6 (48630) */
+    3347, /* BDF7 (48631) */
+    3347, /* BDF8 (48632) */
+    3347, /* BDF9 (48633) */
+    3347, /* BDFA (48634) */
+    3347, /* BDFB (48635) */
+    3347, /* BDFC (48636) */
+    3347, /* BDFD (48637) */
+    3347, /* BDFE (48638) */
+    3347, /* BDFF (48639) */
+    3347, /* BE00 (48640) */
+    3347, /* BE01 (48641) */
+    3347, /* BE02 (48642) */
+    3347, /* BE03 (48643) */
+    3347, /* BE04 (48644) */
+    3347, /* BE05 (48645) */
+    3347, /* BE06 (48646) */
+    3347, /* BE07 (48647) */
+    3347, /* BE08 (48648) */
+    3347, /* BE09 (48649) */
+    3347, /* BE0A (48650) */
+    3347, /* BE0B (48651) */
+    3347, /* BE0C (48652) */
+    3347, /* BE0D (48653) */
+    3347, /* BE0E (48654) */
+    3347, /* BE0F (48655) */
+    3347, /* BE10 (48656) */
+    3347, /* BE11 (48657) */
+    3347, /* BE12 (48658) */
+    3347, /* BE13 (48659) */
+    3347, /* BE14 (48660) */
+    3347, /* BE15 (48661) */
+    3347, /* BE16 (48662) */
+    3347, /* BE17 (48663) */
+    3347, /* BE18 (48664) */
+    3347, /* BE19 (48665) */
+    3347, /* BE1A (48666) */
+    3347, /* BE1B (48667) */
+    3347, /* BE1C (48668) */
+    3347, /* BE1D (48669) */
+    3347, /* BE1E (48670) */
+    3347, /* BE1F (48671) */
+    3347, /* BE20 (48672) */
+    3347, /* BE21 (48673) */
+    3347, /* BE22 (48674) */
+    3347, /* BE23 (48675) */
+    3347, /* BE24 (48676) */
+    3347, /* BE25 (48677) */
+    3347, /* BE26 (48678) */
+    3347, /* BE27 (48679) */
+    3347, /* BE28 (48680) */
+    3347, /* BE29 (48681) */
+    3347, /* BE2A (48682) */
+    3347, /* BE2B (48683) */
+    3347, /* BE2C (48684) */
+    3347, /* BE2D (48685) */
+    3347, /* BE2E (48686) */
+    3347, /* BE2F (48687) */
+    3347, /* BE30 (48688) */
+    3347, /* BE31 (48689) */
+    3347, /* BE32 (48690) */
+    3347, /* BE33 (48691) */
+    3347, /* BE34 (48692) */
+    3347, /* BE35 (48693) */
+    3347, /* BE36 (48694) */
+    3347, /* BE37 (48695) */
+    3347, /* BE38 (48696) */
+    3347, /* BE39 (48697) */
+    3347, /* BE3A (48698) */
+    3347, /* BE3B (48699) */
+    3347, /* BE3C (48700) */
+    3347, /* BE3D (48701) */
+    3347, /* BE3E (48702) */
+    3347, /* BE3F (48703) */
+    3347, /* BE40 (48704) */
+    3347, /* BE41 (48705) */
+    3347, /* BE42 (48706) */
+    3347, /* BE43 (48707) */
+    3347, /* BE44 (48708) */
+    3347, /* BE45 (48709) */
+    3347, /* BE46 (48710) */
+    3347, /* BE47 (48711) */
+    3347, /* BE48 (48712) */
+    3347, /* BE49 (48713) */
+    3347, /* BE4A (48714) */
+    3347, /* BE4B (48715) */
+    3347, /* BE4C (48716) */
+    3347, /* BE4D (48717) */
+    3347, /* BE4E (48718) */
+    3347, /* BE4F (48719) */
+    3347, /* BE50 (48720) */
+    3347, /* BE51 (48721) */
+    3347, /* BE52 (48722) */
+    3347, /* BE53 (48723) */
+    3347, /* BE54 (48724) */
+    3347, /* BE55 (48725) */
+    3347, /* BE56 (48726) */
+    3347, /* BE57 (48727) */
+    3347, /* BE58 (48728) */
+    3347, /* BE59 (48729) */
+    3347, /* BE5A (48730) */
+    3347, /* BE5B (48731) */
+    3347, /* BE5C (48732) */
+    3347, /* BE5D (48733) */
+    3347, /* BE5E (48734) */
+    3347, /* BE5F (48735) */
+    3347, /* BE60 (48736) */
+    3347, /* BE61 (48737) */
+    3347, /* BE62 (48738) */
+    3347, /* BE63 (48739) */
+    3347, /* BE64 (48740) */
+    3347, /* BE65 (48741) */
+    3347, /* BE66 (48742) */
+    3347, /* BE67 (48743) */
+    3347, /* BE68 (48744) */
+    3347, /* BE69 (48745) */
+    3347, /* BE6A (48746) */
+    3347, /* BE6B (48747) */
+    3347, /* BE6C (48748) */
+    3347, /* BE6D (48749) */
+    3347, /* BE6E (48750) */
+    3347, /* BE6F (48751) */
+    3347, /* BE70 (48752) */
+    3347, /* BE71 (48753) */
+    3347, /* BE72 (48754) */
+    3347, /* BE73 (48755) */
+    3347, /* BE74 (48756) */
+    3347, /* BE75 (48757) */
+    3347, /* BE76 (48758) */
+    3347, /* BE77 (48759) */
+    3347, /* BE78 (48760) */
+    3347, /* BE79 (48761) */
+    3347, /* BE7A (48762) */
+    3347, /* BE7B (48763) */
+    3347, /* BE7C (48764) */
+    3347, /* BE7D (48765) */
+    3347, /* BE7E (48766) */
+    3347, /* BE7F (48767) */
+    3347, /* BE80 (48768) */
+    3347, /* BE81 (48769) */
+    3347, /* BE82 (48770) */
+    3347, /* BE83 (48771) */
+    3347, /* BE84 (48772) */
+    3347, /* BE85 (48773) */
+    3347, /* BE86 (48774) */
+    3347, /* BE87 (48775) */
+    3347, /* BE88 (48776) */
+    3347, /* BE89 (48777) */
+    3347, /* BE8A (48778) */
+    3347, /* BE8B (48779) */
+    3347, /* BE8C (48780) */
+    3347, /* BE8D (48781) */
+    3347, /* BE8E (48782) */
+    3347, /* BE8F (48783) */
+    3347, /* BE90 (48784) */
+    3347, /* BE91 (48785) */
+    3347, /* BE92 (48786) */
+    3347, /* BE93 (48787) */
+    3347, /* BE94 (48788) */
+    3347, /* BE95 (48789) */
+    3347, /* BE96 (48790) */
+    3347, /* BE97 (48791) */
+    3347, /* BE98 (48792) */
+    3347, /* BE99 (48793) */
+    3347, /* BE9A (48794) */
+    3347, /* BE9B (48795) */
+    3347, /* BE9C (48796) */
+    3347, /* BE9D (48797) */
+    3347, /* BE9E (48798) */
+    3347, /* BE9F (48799) */
+    3347, /* BEA0 (48800) */
+    3347, /* BEA1 (48801) */
+    3347, /* BEA2 (48802) */
+    3347, /* BEA3 (48803) */
+    3347, /* BEA4 (48804) */
+    3347, /* BEA5 (48805) */
+    3347, /* BEA6 (48806) */
+    3347, /* BEA7 (48807) */
+    3347, /* BEA8 (48808) */
+    3347, /* BEA9 (48809) */
+    3347, /* BEAA (48810) */
+    3347, /* BEAB (48811) */
+    3347, /* BEAC (48812) */
+    3347, /* BEAD (48813) */
+    3347, /* BEAE (48814) */
+    3347, /* BEAF (48815) */
+    3347, /* BEB0 (48816) */
+    3347, /* BEB1 (48817) */
+    3347, /* BEB2 (48818) */
+    3347, /* BEB3 (48819) */
+    3347, /* BEB4 (48820) */
+    3347, /* BEB5 (48821) */
+    3347, /* BEB6 (48822) */
+    3347, /* BEB7 (48823) */
+    3347, /* BEB8 (48824) */
+    3347, /* BEB9 (48825) */
+    3347, /* BEBA (48826) */
+    3347, /* BEBB (48827) */
+    3347, /* BEBC (48828) */
+    3347, /* BEBD (48829) */
+    3347, /* BEBE (48830) */
+    3347, /* BEBF (48831) */
+    3347, /* BEC0 (48832) */
+    3347, /* BEC1 (48833) */
+    3347, /* BEC2 (48834) */
+    3347, /* BEC3 (48835) */
+    3347, /* BEC4 (48836) */
+    3347, /* BEC5 (48837) */
+    3347, /* BEC6 (48838) */
+    3347, /* BEC7 (48839) */
+    3347, /* BEC8 (48840) */
+    3347, /* BEC9 (48841) */
+    3347, /* BECA (48842) */
+    3347, /* BECB (48843) */
+    3347, /* BECC (48844) */
+    3347, /* BECD (48845) */
+    3347, /* BECE (48846) */
+    3347, /* BECF (48847) */
+    3347, /* BED0 (48848) */
+    3347, /* BED1 (48849) */
+    3347, /* BED2 (48850) */
+    3347, /* BED3 (48851) */
+    3347, /* BED4 (48852) */
+    3347, /* BED5 (48853) */
+    3347, /* BED6 (48854) */
+    3347, /* BED7 (48855) */
+    3347, /* BED8 (48856) */
+    3347, /* BED9 (48857) */
+    3347, /* BEDA (48858) */
+    3347, /* BEDB (48859) */
+    3347, /* BEDC (48860) */
+    3347, /* BEDD (48861) */
+    3347, /* BEDE (48862) */
+    3347, /* BEDF (48863) */
+    3347, /* BEE0 (48864) */
+    3347, /* BEE1 (48865) */
+    3347, /* BEE2 (48866) */
+    3347, /* BEE3 (48867) */
+    3347, /* BEE4 (48868) */
+    3347, /* BEE5 (48869) */
+    3347, /* BEE6 (48870) */
+    3347, /* BEE7 (48871) */
+    3347, /* BEE8 (48872) */
+    3347, /* BEE9 (48873) */
+    3347, /* BEEA (48874) */
+    3347, /* BEEB (48875) */
+    3347, /* BEEC (48876) */
+    3347, /* BEED (48877) */
+    3347, /* BEEE (48878) */
+    3347, /* BEEF (48879) */
+    3347, /* BEF0 (48880) */
+    3347, /* BEF1 (48881) */
+    3347, /* BEF2 (48882) */
+    3347, /* BEF3 (48883) */
+    3347, /* BEF4 (48884) */
+    3347, /* BEF5 (48885) */
+    3347, /* BEF6 (48886) */
+    3347, /* BEF7 (48887) */
+    3347, /* BEF8 (48888) */
+    3347, /* BEF9 (48889) */
+    3347, /* BEFA (48890) */
+    3347, /* BEFB (48891) */
+    3347, /* BEFC (48892) */
+    3347, /* BEFD (48893) */
+    3347, /* BEFE (48894) */
+    3347, /* BEFF (48895) */
+    3347, /* BF00 (48896) */
+    3347, /* BF01 (48897) */
+    3347, /* BF02 (48898) */
+    3347, /* BF03 (48899) */
+    3347, /* BF04 (48900) */
+    3347, /* BF05 (48901) */
+    3347, /* BF06 (48902) */
+    3347, /* BF07 (48903) */
+    3347, /* BF08 (48904) */
+    3347, /* BF09 (48905) */
+    3347, /* BF0A (48906) */
+    3347, /* BF0B (48907) */
+    3347, /* BF0C (48908) */
+    3347, /* BF0D (48909) */
+    3347, /* BF0E (48910) */
+    3347, /* BF0F (48911) */
+    3347, /* BF10 (48912) */
+    3347, /* BF11 (48913) */
+    3347, /* BF12 (48914) */
+    3347, /* BF13 (48915) */
+    3347, /* BF14 (48916) */
+    3347, /* BF15 (48917) */
+    3347, /* BF16 (48918) */
+    3347, /* BF17 (48919) */
+    3347, /* BF18 (48920) */
+    3347, /* BF19 (48921) */
+    3347, /* BF1A (48922) */
+    3347, /* BF1B (48923) */
+    3347, /* BF1C (48924) */
+    3347, /* BF1D (48925) */
+    3347, /* BF1E (48926) */
+    3347, /* BF1F (48927) */
+    3347, /* BF20 (48928) */
+    3347, /* BF21 (48929) */
+    3347, /* BF22 (48930) */
+    3347, /* BF23 (48931) */
+    3347, /* BF24 (48932) */
+    3347, /* BF25 (48933) */
+    3347, /* BF26 (48934) */
+    3347, /* BF27 (48935) */
+    3347, /* BF28 (48936) */
+    3347, /* BF29 (48937) */
+    3347, /* BF2A (48938) */
+    3347, /* BF2B (48939) */
+    3347, /* BF2C (48940) */
+    3347, /* BF2D (48941) */
+    3347, /* BF2E (48942) */
+    3347, /* BF2F (48943) */
+    3347, /* BF30 (48944) */
+    3347, /* BF31 (48945) */
+    3347, /* BF32 (48946) */
+    3347, /* BF33 (48947) */
+    3347, /* BF34 (48948) */
+    3347, /* BF35 (48949) */
+    3347, /* BF36 (48950) */
+    3347, /* BF37 (48951) */
+    3347, /* BF38 (48952) */
+    3347, /* BF39 (48953) */
+    3347, /* BF3A (48954) */
+    3347, /* BF3B (48955) */
+    3347, /* BF3C (48956) */
+    3347, /* BF3D (48957) */
+    3347, /* BF3E (48958) */
+    3347, /* BF3F (48959) */
+    3347, /* BF40 (48960) */
+    3347, /* BF41 (48961) */
+    3347, /* BF42 (48962) */
+    3347, /* BF43 (48963) */
+    3347, /* BF44 (48964) */
+    3347, /* BF45 (48965) */
+    3347, /* BF46 (48966) */
+    3347, /* BF47 (48967) */
+    3347, /* BF48 (48968) */
+    3347, /* BF49 (48969) */
+    3347, /* BF4A (48970) */
+    3347, /* BF4B (48971) */
+    3347, /* BF4C (48972) */
+    3347, /* BF4D (48973) */
+    3347, /* BF4E (48974) */
+    3347, /* BF4F (48975) */
+    3347, /* BF50 (48976) */
+    3347, /* BF51 (48977) */
+    3347, /* BF52 (48978) */
+    3347, /* BF53 (48979) */
+    3347, /* BF54 (48980) */
+    3347, /* BF55 (48981) */
+    3347, /* BF56 (48982) */
+    3347, /* BF57 (48983) */
+    3347, /* BF58 (48984) */
+    3347, /* BF59 (48985) */
+    3347, /* BF5A (48986) */
+    3347, /* BF5B (48987) */
+    3347, /* BF5C (48988) */
+    3347, /* BF5D (48989) */
+    3347, /* BF5E (48990) */
+    3347, /* BF5F (48991) */
+    3347, /* BF60 (48992) */
+    3347, /* BF61 (48993) */
+    3347, /* BF62 (48994) */
+    3347, /* BF63 (48995) */
+    3347, /* BF64 (48996) */
+    3347, /* BF65 (48997) */
+    3347, /* BF66 (48998) */
+    3347, /* BF67 (48999) */
+    3347, /* BF68 (49000) */
+    3347, /* BF69 (49001) */
+    3347, /* BF6A (49002) */
+    3347, /* BF6B (49003) */
+    3347, /* BF6C (49004) */
+    3347, /* BF6D (49005) */
+    3347, /* BF6E (49006) */
+    3347, /* BF6F (49007) */
+    3347, /* BF70 (49008) */
+    3347, /* BF71 (49009) */
+    3347, /* BF72 (49010) */
+    3347, /* BF73 (49011) */
+    3347, /* BF74 (49012) */
+    3347, /* BF75 (49013) */
+    3347, /* BF76 (49014) */
+    3347, /* BF77 (49015) */
+    3347, /* BF78 (49016) */
+    3347, /* BF79 (49017) */
+    3347, /* BF7A (49018) */
+    3347, /* BF7B (49019) */
+    3347, /* BF7C (49020) */
+    3347, /* BF7D (49021) */
+    3347, /* BF7E (49022) */
+    3347, /* BF7F (49023) */
+    3347, /* BF80 (49024) */
+    3347, /* BF81 (49025) */
+    3347, /* BF82 (49026) */
+    3347, /* BF83 (49027) */
+    3347, /* BF84 (49028) */
+    3347, /* BF85 (49029) */
+    3347, /* BF86 (49030) */
+    3347, /* BF87 (49031) */
+    3347, /* BF88 (49032) */
+    3347, /* BF89 (49033) */
+    3347, /* BF8A (49034) */
+    3347, /* BF8B (49035) */
+    3347, /* BF8C (49036) */
+    3347, /* BF8D (49037) */
+    3347, /* BF8E (49038) */
+    3347, /* BF8F (49039) */
+    3347, /* BF90 (49040) */
+    3347, /* BF91 (49041) */
+    3347, /* BF92 (49042) */
+    3347, /* BF93 (49043) */
+    3347, /* BF94 (49044) */
+    3347, /* BF95 (49045) */
+    3347, /* BF96 (49046) */
+    3347, /* BF97 (49047) */
+    3347, /* BF98 (49048) */
+    3347, /* BF99 (49049) */
+    3347, /* BF9A (49050) */
+    3347, /* BF9B (49051) */
+    3347, /* BF9C (49052) */
+    3347, /* BF9D (49053) */
+    3347, /* BF9E (49054) */
+    3347, /* BF9F (49055) */
+    3347, /* BFA0 (49056) */
+    3347, /* BFA1 (49057) */
+    3347, /* BFA2 (49058) */
+    3347, /* BFA3 (49059) */
+    3347, /* BFA4 (49060) */
+    3347, /* BFA5 (49061) */
+    3347, /* BFA6 (49062) */
+    3347, /* BFA7 (49063) */
+    3347, /* BFA8 (49064) */
+    3347, /* BFA9 (49065) */
+    3347, /* BFAA (49066) */
+    3347, /* BFAB (49067) */
+    3347, /* BFAC (49068) */
+    3347, /* BFAD (49069) */
+    3347, /* BFAE (49070) */
+    3347, /* BFAF (49071) */
+    3347, /* BFB0 (49072) */
+    3347, /* BFB1 (49073) */
+    3347, /* BFB2 (49074) */
+    3347, /* BFB3 (49075) */
+    3347, /* BFB4 (49076) */
+    3347, /* BFB5 (49077) */
+    3347, /* BFB6 (49078) */
+    3347, /* BFB7 (49079) */
+    3347, /* BFB8 (49080) */
+    3347, /* BFB9 (49081) */
+    3347, /* BFBA (49082) */
+    3347, /* BFBB (49083) */
+    3347, /* BFBC (49084) */
+    3347, /* BFBD (49085) */
+    3347, /* BFBE (49086) */
+    3347, /* BFBF (49087) */
+    3347, /* BFC0 (49088) */
+    3347, /* BFC1 (49089) */
+    3347, /* BFC2 (49090) */
+    3347, /* BFC3 (49091) */
+    3347, /* BFC4 (49092) */
+    3347, /* BFC5 (49093) */
+    3347, /* BFC6 (49094) */
+    3347, /* BFC7 (49095) */
+    3347, /* BFC8 (49096) */
+    3347, /* BFC9 (49097) */
+    3347, /* BFCA (49098) */
+    3347, /* BFCB (49099) */
+    3347, /* BFCC (49100) */
+    3347, /* BFCD (49101) */
+    3347, /* BFCE (49102) */
+    3347, /* BFCF (49103) */
+    3347, /* BFD0 (49104) */
+    3347, /* BFD1 (49105) */
+    3347, /* BFD2 (49106) */
+    3347, /* BFD3 (49107) */
+    3347, /* BFD4 (49108) */
+    3347, /* BFD5 (49109) */
+    3347, /* BFD6 (49110) */
+    3347, /* BFD7 (49111) */
+    3347, /* BFD8 (49112) */
+    3347, /* BFD9 (49113) */
+    3347, /* BFDA (49114) */
+    3347, /* BFDB (49115) */
+    3347, /* BFDC (49116) */
+    3347, /* BFDD (49117) */
+    3347, /* BFDE (49118) */
+    3347, /* BFDF (49119) */
+    3347, /* BFE0 (49120) */
+    3347, /* BFE1 (49121) */
+    3347, /* BFE2 (49122) */
+    3347, /* BFE3 (49123) */
+    3347, /* BFE4 (49124) */
+    3347, /* BFE5 (49125) */
+    3347, /* BFE6 (49126) */
+    3347, /* BFE7 (49127) */
+    3347, /* BFE8 (49128) */
+    3347, /* BFE9 (49129) */
+    3347, /* BFEA (49130) */
+    3347, /* BFEB (49131) */
+    3347, /* BFEC (49132) */
+    3347, /* BFED (49133) */
+    3347, /* BFEE (49134) */
+    3347, /* BFEF (49135) */
+    3347, /* BFF0 (49136) */
+    3347, /* BFF1 (49137) */
+    3347, /* BFF2 (49138) */
+    3347, /* BFF3 (49139) */
+    3347, /* BFF4 (49140) */
+    3347, /* BFF5 (49141) */
+    3347, /* BFF6 (49142) */
+    3347, /* BFF7 (49143) */
+    3347, /* BFF8 (49144) */
+    3347, /* BFF9 (49145) */
+    3347, /* BFFA (49146) */
+    3347, /* BFFB (49147) */
+    3347, /* BFFC (49148) */
+    3347, /* BFFD (49149) */
+    3347, /* BFFE (49150) */
+    3347, /* BFFF (49151) */
+    3347, /* C000 (49152) */
+    3347, /* C001 (49153) */
+    3347, /* C002 (49154) */
+    3347, /* C003 (49155) */
+    3347, /* C004 (49156) */
+    3347, /* C005 (49157) */
+    3347, /* C006 (49158) */
+    3347, /* C007 (49159) */
+    3347, /* C008 (49160) */
+    3347, /* C009 (49161) */
+    3347, /* C00A (49162) */
+    3347, /* C00B (49163) */
+    3347, /* C00C (49164) */
+    3347, /* C00D (49165) */
+    3347, /* C00E (49166) */
+    3347, /* C00F (49167) */
+    3347, /* C010 (49168) */
+    3347, /* C011 (49169) */
+    3347, /* C012 (49170) */
+    3347, /* C013 (49171) */
+    3347, /* C014 (49172) */
+    3347, /* C015 (49173) */
+    3347, /* C016 (49174) */
+    3347, /* C017 (49175) */
+    3347, /* C018 (49176) */
+    3347, /* C019 (49177) */
+    3347, /* C01A (49178) */
+    3347, /* C01B (49179) */
+    3347, /* C01C (49180) */
+    3347, /* C01D (49181) */
+    3347, /* C01E (49182) */
+    3347, /* C01F (49183) */
+    3347, /* C020 (49184) */
+    3347, /* C021 (49185) */
+    3347, /* C022 (49186) */
+    3347, /* C023 (49187) */
+    3347, /* C024 (49188) */
+    3347, /* C025 (49189) */
+    3347, /* C026 (49190) */
+    3347, /* C027 (49191) */
+    3347, /* C028 (49192) */
+    3347, /* C029 (49193) */
+    3347, /* C02A (49194) */
+    3347, /* C02B (49195) */
+    3347, /* C02C (49196) */
+    3347, /* C02D (49197) */
+    3347, /* C02E (49198) */
+    3347, /* C02F (49199) */
+    3347, /* C030 (49200) */
+    3347, /* C031 (49201) */
+    3347, /* C032 (49202) */
+    3347, /* C033 (49203) */
+    3347, /* C034 (49204) */
+    3347, /* C035 (49205) */
+    3347, /* C036 (49206) */
+    3347, /* C037 (49207) */
+    3347, /* C038 (49208) */
+    3347, /* C039 (49209) */
+    3347, /* C03A (49210) */
+    3347, /* C03B (49211) */
+    3347, /* C03C (49212) */
+    3347, /* C03D (49213) */
+    3347, /* C03E (49214) */
+    3347, /* C03F (49215) */
+    3347, /* C040 (49216) */
+    3347, /* C041 (49217) */
+    3347, /* C042 (49218) */
+    3347, /* C043 (49219) */
+    3347, /* C044 (49220) */
+    3347, /* C045 (49221) */
+    3347, /* C046 (49222) */
+    3347, /* C047 (49223) */
+    3347, /* C048 (49224) */
+    3347, /* C049 (49225) */
+    3347, /* C04A (49226) */
+    3347, /* C04B (49227) */
+    3347, /* C04C (49228) */
+    3347, /* C04D (49229) */
+    3347, /* C04E (49230) */
+    3347, /* C04F (49231) */
+    3347, /* C050 (49232) */
+    3347, /* C051 (49233) */
+    3347, /* C052 (49234) */
+    3347, /* C053 (49235) */
+    3347, /* C054 (49236) */
+    3347, /* C055 (49237) */
+    3347, /* C056 (49238) */
+    3347, /* C057 (49239) */
+    3347, /* C058 (49240) */
+    3347, /* C059 (49241) */
+    3347, /* C05A (49242) */
+    3347, /* C05B (49243) */
+    3347, /* C05C (49244) */
+    3347, /* C05D (49245) */
+    3347, /* C05E (49246) */
+    3347, /* C05F (49247) */
+    3347, /* C060 (49248) */
+    3347, /* C061 (49249) */
+    3347, /* C062 (49250) */
+    3347, /* C063 (49251) */
+    3347, /* C064 (49252) */
+    3347, /* C065 (49253) */
+    3347, /* C066 (49254) */
+    3347, /* C067 (49255) */
+    3347, /* C068 (49256) */
+    3347, /* C069 (49257) */
+    3347, /* C06A (49258) */
+    3347, /* C06B (49259) */
+    3347, /* C06C (49260) */
+    3347, /* C06D (49261) */
+    3347, /* C06E (49262) */
+    3347, /* C06F (49263) */
+    3347, /* C070 (49264) */
+    3347, /* C071 (49265) */
+    3347, /* C072 (49266) */
+    3347, /* C073 (49267) */
+    3347, /* C074 (49268) */
+    3347, /* C075 (49269) */
+    3347, /* C076 (49270) */
+    3347, /* C077 (49271) */
+    3347, /* C078 (49272) */
+    3347, /* C079 (49273) */
+    3347, /* C07A (49274) */
+    3347, /* C07B (49275) */
+    3347, /* C07C (49276) */
+    3347, /* C07D (49277) */
+    3347, /* C07E (49278) */
+    3347, /* C07F (49279) */
+    3347, /* C080 (49280) */
+    3347, /* C081 (49281) */
+    3347, /* C082 (49282) */
+    3347, /* C083 (49283) */
+    3347, /* C084 (49284) */
+    3347, /* C085 (49285) */
+    3347, /* C086 (49286) */
+    3347, /* C087 (49287) */
+    3347, /* C088 (49288) */
+    3347, /* C089 (49289) */
+    3347, /* C08A (49290) */
+    3347, /* C08B (49291) */
+    3347, /* C08C (49292) */
+    3347, /* C08D (49293) */
+    3347, /* C08E (49294) */
+    3347, /* C08F (49295) */
+    3347, /* C090 (49296) */
+    3347, /* C091 (49297) */
+    3347, /* C092 (49298) */
+    3347, /* C093 (49299) */
+    3347, /* C094 (49300) */
+    3347, /* C095 (49301) */
+    3347, /* C096 (49302) */
+    3347, /* C097 (49303) */
+    3347, /* C098 (49304) */
+    3347, /* C099 (49305) */
+    3347, /* C09A (49306) */
+    3347, /* C09B (49307) */
+    3347, /* C09C (49308) */
+    3347, /* C09D (49309) */
+    3347, /* C09E (49310) */
+    3347, /* C09F (49311) */
+    3347, /* C0A0 (49312) */
+    3347, /* C0A1 (49313) */
+    3347, /* C0A2 (49314) */
+    3347, /* C0A3 (49315) */
+    3347, /* C0A4 (49316) */
+    3347, /* C0A5 (49317) */
+    3347, /* C0A6 (49318) */
+    3347, /* C0A7 (49319) */
+    3347, /* C0A8 (49320) */
+    3347, /* C0A9 (49321) */
+    3347, /* C0AA (49322) */
+    3347, /* C0AB (49323) */
+    3347, /* C0AC (49324) */
+    3347, /* C0AD (49325) */
+    3347, /* C0AE (49326) */
+    3347, /* C0AF (49327) */
+    3347, /* C0B0 (49328) */
+    3347, /* C0B1 (49329) */
+    3347, /* C0B2 (49330) */
+    3347, /* C0B3 (49331) */
+    3347, /* C0B4 (49332) */
+    3347, /* C0B5 (49333) */
+    3347, /* C0B6 (49334) */
+    3347, /* C0B7 (49335) */
+    3347, /* C0B8 (49336) */
+    3347, /* C0B9 (49337) */
+    3347, /* C0BA (49338) */
+    3347, /* C0BB (49339) */
+    3347, /* C0BC (49340) */
+    3347, /* C0BD (49341) */
+    3347, /* C0BE (49342) */
+    3347, /* C0BF (49343) */
+    3347, /* C0C0 (49344) */
+    3347, /* C0C1 (49345) */
+    3347, /* C0C2 (49346) */
+    3347, /* C0C3 (49347) */
+    3347, /* C0C4 (49348) */
+    3347, /* C0C5 (49349) */
+    3347, /* C0C6 (49350) */
+    3347, /* C0C7 (49351) */
+    3347, /* C0C8 (49352) */
+    3347, /* C0C9 (49353) */
+    3347, /* C0CA (49354) */
+    3347, /* C0CB (49355) */
+    3347, /* C0CC (49356) */
+    3347, /* C0CD (49357) */
+    3347, /* C0CE (49358) */
+    3347, /* C0CF (49359) */
+    3347, /* C0D0 (49360) */
+    3347, /* C0D1 (49361) */
+    3347, /* C0D2 (49362) */
+    3347, /* C0D3 (49363) */
+    3347, /* C0D4 (49364) */
+    3347, /* C0D5 (49365) */
+    3347, /* C0D6 (49366) */
+    3347, /* C0D7 (49367) */
+    3347, /* C0D8 (49368) */
+    3347, /* C0D9 (49369) */
+    3347, /* C0DA (49370) */
+    3347, /* C0DB (49371) */
+    3347, /* C0DC (49372) */
+    3347, /* C0DD (49373) */
+    3347, /* C0DE (49374) */
+    3347, /* C0DF (49375) */
+    3347, /* C0E0 (49376) */
+    3347, /* C0E1 (49377) */
+    3347, /* C0E2 (49378) */
+    3347, /* C0E3 (49379) */
+    3347, /* C0E4 (49380) */
+    3347, /* C0E5 (49381) */
+    3347, /* C0E6 (49382) */
+    3347, /* C0E7 (49383) */
+    3347, /* C0E8 (49384) */
+    3347, /* C0E9 (49385) */
+    3347, /* C0EA (49386) */
+    3347, /* C0EB (49387) */
+    3347, /* C0EC (49388) */
+    3347, /* C0ED (49389) */
+    3347, /* C0EE (49390) */
+    3347, /* C0EF (49391) */
+    3347, /* C0F0 (49392) */
+    3347, /* C0F1 (49393) */
+    3347, /* C0F2 (49394) */
+    3347, /* C0F3 (49395) */
+    3347, /* C0F4 (49396) */
+    3347, /* C0F5 (49397) */
+    3347, /* C0F6 (49398) */
+    3347, /* C0F7 (49399) */
+    3347, /* C0F8 (49400) */
+    3347, /* C0F9 (49401) */
+    3347, /* C0FA (49402) */
+    3347, /* C0FB (49403) */
+    3347, /* C0FC (49404) */
+    3347, /* C0FD (49405) */
+    3347, /* C0FE (49406) */
+    3347, /* C0FF (49407) */
+    3347, /* C100 (49408) */
+    3347, /* C101 (49409) */
+    3347, /* C102 (49410) */
+    3347, /* C103 (49411) */
+    3347, /* C104 (49412) */
+    3347, /* C105 (49413) */
+    3347, /* C106 (49414) */
+    3347, /* C107 (49415) */
+    3347, /* C108 (49416) */
+    3347, /* C109 (49417) */
+    3347, /* C10A (49418) */
+    3347, /* C10B (49419) */
+    3347, /* C10C (49420) */
+    3347, /* C10D (49421) */
+    3347, /* C10E (49422) */
+    3347, /* C10F (49423) */
+    3347, /* C110 (49424) */
+    3347, /* C111 (49425) */
+    3347, /* C112 (49426) */
+    3347, /* C113 (49427) */
+    3347, /* C114 (49428) */
+    3347, /* C115 (49429) */
+    3347, /* C116 (49430) */
+    3347, /* C117 (49431) */
+    3347, /* C118 (49432) */
+    3347, /* C119 (49433) */
+    3347, /* C11A (49434) */
+    3347, /* C11B (49435) */
+    3347, /* C11C (49436) */
+    3347, /* C11D (49437) */
+    3347, /* C11E (49438) */
+    3347, /* C11F (49439) */
+    3347, /* C120 (49440) */
+    3347, /* C121 (49441) */
+    3347, /* C122 (49442) */
+    3347, /* C123 (49443) */
+    3347, /* C124 (49444) */
+    3347, /* C125 (49445) */
+    3347, /* C126 (49446) */
+    3347, /* C127 (49447) */
+    3347, /* C128 (49448) */
+    3347, /* C129 (49449) */
+    3347, /* C12A (49450) */
+    3347, /* C12B (49451) */
+    3347, /* C12C (49452) */
+    3347, /* C12D (49453) */
+    3347, /* C12E (49454) */
+    3347, /* C12F (49455) */
+    3347, /* C130 (49456) */
+    3347, /* C131 (49457) */
+    3347, /* C132 (49458) */
+    3347, /* C133 (49459) */
+    3347, /* C134 (49460) */
+    3347, /* C135 (49461) */
+    3347, /* C136 (49462) */
+    3347, /* C137 (49463) */
+    3347, /* C138 (49464) */
+    3347, /* C139 (49465) */
+    3347, /* C13A (49466) */
+    3347, /* C13B (49467) */
+    3347, /* C13C (49468) */
+    3347, /* C13D (49469) */
+    3347, /* C13E (49470) */
+    3347, /* C13F (49471) */
+    3347, /* C140 (49472) */
+    3347, /* C141 (49473) */
+    3347, /* C142 (49474) */
+    3347, /* C143 (49475) */
+    3347, /* C144 (49476) */
+    3347, /* C145 (49477) */
+    3347, /* C146 (49478) */
+    3347, /* C147 (49479) */
+    3347, /* C148 (49480) */
+    3347, /* C149 (49481) */
+    3347, /* C14A (49482) */
+    3347, /* C14B (49483) */
+    3347, /* C14C (49484) */
+    3347, /* C14D (49485) */
+    3347, /* C14E (49486) */
+    3347, /* C14F (49487) */
+    3347, /* C150 (49488) */
+    3347, /* C151 (49489) */
+    3347, /* C152 (49490) */
+    3347, /* C153 (49491) */
+    3347, /* C154 (49492) */
+    3347, /* C155 (49493) */
+    3347, /* C156 (49494) */
+    3347, /* C157 (49495) */
+    3347, /* C158 (49496) */
+    3347, /* C159 (49497) */
+    3347, /* C15A (49498) */
+    3347, /* C15B (49499) */
+    3347, /* C15C (49500) */
+    3347, /* C15D (49501) */
+    3347, /* C15E (49502) */
+    3347, /* C15F (49503) */
+    3347, /* C160 (49504) */
+    3347, /* C161 (49505) */
+    3347, /* C162 (49506) */
+    3347, /* C163 (49507) */
+    3347, /* C164 (49508) */
+    3347, /* C165 (49509) */
+    3347, /* C166 (49510) */
+    3347, /* C167 (49511) */
+    3347, /* C168 (49512) */
+    3347, /* C169 (49513) */
+    3347, /* C16A (49514) */
+    3347, /* C16B (49515) */
+    3347, /* C16C (49516) */
+    3347, /* C16D (49517) */
+    3347, /* C16E (49518) */
+    3347, /* C16F (49519) */
+    3347, /* C170 (49520) */
+    3347, /* C171 (49521) */
+    3347, /* C172 (49522) */
+    3347, /* C173 (49523) */
+    3347, /* C174 (49524) */
+    3347, /* C175 (49525) */
+    3347, /* C176 (49526) */
+    3347, /* C177 (49527) */
+    3347, /* C178 (49528) */
+    3347, /* C179 (49529) */
+    3347, /* C17A (49530) */
+    3347, /* C17B (49531) */
+    3347, /* C17C (49532) */
+    3347, /* C17D (49533) */
+    3347, /* C17E (49534) */
+    3347, /* C17F (49535) */
+    3347, /* C180 (49536) */
+    3347, /* C181 (49537) */
+    3347, /* C182 (49538) */
+    3347, /* C183 (49539) */
+    3347, /* C184 (49540) */
+    3347, /* C185 (49541) */
+    3347, /* C186 (49542) */
+    3347, /* C187 (49543) */
+    3347, /* C188 (49544) */
+    3347, /* C189 (49545) */
+    3347, /* C18A (49546) */
+    3347, /* C18B (49547) */
+    3347, /* C18C (49548) */
+    3347, /* C18D (49549) */
+    3347, /* C18E (49550) */
+    3347, /* C18F (49551) */
+    3347, /* C190 (49552) */
+    3347, /* C191 (49553) */
+    3347, /* C192 (49554) */
+    3347, /* C193 (49555) */
+    3347, /* C194 (49556) */
+    3347, /* C195 (49557) */
+    3347, /* C196 (49558) */
+    3347, /* C197 (49559) */
+    3347, /* C198 (49560) */
+    3347, /* C199 (49561) */
+    3347, /* C19A (49562) */
+    3347, /* C19B (49563) */
+    3347, /* C19C (49564) */
+    3347, /* C19D (49565) */
+    3347, /* C19E (49566) */
+    3347, /* C19F (49567) */
+    3347, /* C1A0 (49568) */
+    3347, /* C1A1 (49569) */
+    3347, /* C1A2 (49570) */
+    3347, /* C1A3 (49571) */
+    3347, /* C1A4 (49572) */
+    3347, /* C1A5 (49573) */
+    3347, /* C1A6 (49574) */
+    3347, /* C1A7 (49575) */
+    3347, /* C1A8 (49576) */
+    3347, /* C1A9 (49577) */
+    3347, /* C1AA (49578) */
+    3347, /* C1AB (49579) */
+    3347, /* C1AC (49580) */
+    3347, /* C1AD (49581) */
+    3347, /* C1AE (49582) */
+    3347, /* C1AF (49583) */
+    3347, /* C1B0 (49584) */
+    3347, /* C1B1 (49585) */
+    3347, /* C1B2 (49586) */
+    3347, /* C1B3 (49587) */
+    3347, /* C1B4 (49588) */
+    3347, /* C1B5 (49589) */
+    3347, /* C1B6 (49590) */
+    3347, /* C1B7 (49591) */
+    3347, /* C1B8 (49592) */
+    3347, /* C1B9 (49593) */
+    3347, /* C1BA (49594) */
+    3347, /* C1BB (49595) */
+    3347, /* C1BC (49596) */
+    3347, /* C1BD (49597) */
+    3347, /* C1BE (49598) */
+    3347, /* C1BF (49599) */
+    3347, /* C1C0 (49600) */
+    3347, /* C1C1 (49601) */
+    3347, /* C1C2 (49602) */
+    3347, /* C1C3 (49603) */
+    3347, /* C1C4 (49604) */
+    3347, /* C1C5 (49605) */
+    3347, /* C1C6 (49606) */
+    3347, /* C1C7 (49607) */
+    3347, /* C1C8 (49608) */
+    3347, /* C1C9 (49609) */
+    3347, /* C1CA (49610) */
+    3347, /* C1CB (49611) */
+    3347, /* C1CC (49612) */
+    3347, /* C1CD (49613) */
+    3347, /* C1CE (49614) */
+    3347, /* C1CF (49615) */
+    3347, /* C1D0 (49616) */
+    3347, /* C1D1 (49617) */
+    3347, /* C1D2 (49618) */
+    3347, /* C1D3 (49619) */
+    3347, /* C1D4 (49620) */
+    3347, /* C1D5 (49621) */
+    3347, /* C1D6 (49622) */
+    3347, /* C1D7 (49623) */
+    3347, /* C1D8 (49624) */
+    3347, /* C1D9 (49625) */
+    3347, /* C1DA (49626) */
+    3347, /* C1DB (49627) */
+    3347, /* C1DC (49628) */
+    3347, /* C1DD (49629) */
+    3347, /* C1DE (49630) */
+    3347, /* C1DF (49631) */
+    3347, /* C1E0 (49632) */
+    3347, /* C1E1 (49633) */
+    3347, /* C1E2 (49634) */
+    3347, /* C1E3 (49635) */
+    3347, /* C1E4 (49636) */
+    3347, /* C1E5 (49637) */
+    3347, /* C1E6 (49638) */
+    3347, /* C1E7 (49639) */
+    3347, /* C1E8 (49640) */
+    3347, /* C1E9 (49641) */
+    3347, /* C1EA (49642) */
+    3347, /* C1EB (49643) */
+    3347, /* C1EC (49644) */
+    3347, /* C1ED (49645) */
+    3347, /* C1EE (49646) */
+    3347, /* C1EF (49647) */
+    3347, /* C1F0 (49648) */
+    3347, /* C1F1 (49649) */
+    3347, /* C1F2 (49650) */
+    3347, /* C1F3 (49651) */
+    3347, /* C1F4 (49652) */
+    3347, /* C1F5 (49653) */
+    3347, /* C1F6 (49654) */
+    3347, /* C1F7 (49655) */
+    3347, /* C1F8 (49656) */
+    3347, /* C1F9 (49657) */
+    3347, /* C1FA (49658) */
+    3347, /* C1FB (49659) */
+    3347, /* C1FC (49660) */
+    3347, /* C1FD (49661) */
+    3347, /* C1FE (49662) */
+    3347, /* C1FF (49663) */
+    3347, /* C200 (49664) */
+    3347, /* C201 (49665) */
+    3347, /* C202 (49666) */
+    3347, /* C203 (49667) */
+    3347, /* C204 (49668) */
+    3347, /* C205 (49669) */
+    3347, /* C206 (49670) */
+    3347, /* C207 (49671) */
+    3347, /* C208 (49672) */
+    3347, /* C209 (49673) */
+    3347, /* C20A (49674) */
+    3347, /* C20B (49675) */
+    3347, /* C20C (49676) */
+    3347, /* C20D (49677) */
+    3347, /* C20E (49678) */
+    3347, /* C20F (49679) */
+    3347, /* C210 (49680) */
+    3347, /* C211 (49681) */
+    3347, /* C212 (49682) */
+    3347, /* C213 (49683) */
+    3347, /* C214 (49684) */
+    3347, /* C215 (49685) */
+    3347, /* C216 (49686) */
+    3347, /* C217 (49687) */
+    3347, /* C218 (49688) */
+    3347, /* C219 (49689) */
+    3347, /* C21A (49690) */
+    3347, /* C21B (49691) */
+    3347, /* C21C (49692) */
+    3347, /* C21D (49693) */
+    3347, /* C21E (49694) */
+    3347, /* C21F (49695) */
+    3347, /* C220 (49696) */
+    3347, /* C221 (49697) */
+    3347, /* C222 (49698) */
+    3347, /* C223 (49699) */
+    3347, /* C224 (49700) */
+    3347, /* C225 (49701) */
+    3347, /* C226 (49702) */
+    3347, /* C227 (49703) */
+    3347, /* C228 (49704) */
+    3347, /* C229 (49705) */
+    3347, /* C22A (49706) */
+    3347, /* C22B (49707) */
+    3347, /* C22C (49708) */
+    3347, /* C22D (49709) */
+    3347, /* C22E (49710) */
+    3347, /* C22F (49711) */
+    3347, /* C230 (49712) */
+    3347, /* C231 (49713) */
+    3347, /* C232 (49714) */
+    3347, /* C233 (49715) */
+    3347, /* C234 (49716) */
+    3347, /* C235 (49717) */
+    3347, /* C236 (49718) */
+    3347, /* C237 (49719) */
+    3347, /* C238 (49720) */
+    3347, /* C239 (49721) */
+    3347, /* C23A (49722) */
+    3347, /* C23B (49723) */
+    3347, /* C23C (49724) */
+    3347, /* C23D (49725) */
+    3347, /* C23E (49726) */
+    3347, /* C23F (49727) */
+    3347, /* C240 (49728) */
+    3347, /* C241 (49729) */
+    3347, /* C242 (49730) */
+    3347, /* C243 (49731) */
+    3347, /* C244 (49732) */
+    3347, /* C245 (49733) */
+    3347, /* C246 (49734) */
+    3347, /* C247 (49735) */
+    3347, /* C248 (49736) */
+    3347, /* C249 (49737) */
+    3347, /* C24A (49738) */
+    3347, /* C24B (49739) */
+    3347, /* C24C (49740) */
+    3347, /* C24D (49741) */
+    3347, /* C24E (49742) */
+    3347, /* C24F (49743) */
+    3347, /* C250 (49744) */
+    3347, /* C251 (49745) */
+    3347, /* C252 (49746) */
+    3347, /* C253 (49747) */
+    3347, /* C254 (49748) */
+    3347, /* C255 (49749) */
+    3347, /* C256 (49750) */
+    3347, /* C257 (49751) */
+    3347, /* C258 (49752) */
+    3347, /* C259 (49753) */
+    3347, /* C25A (49754) */
+    3347, /* C25B (49755) */
+    3347, /* C25C (49756) */
+    3347, /* C25D (49757) */
+    3347, /* C25E (49758) */
+    3347, /* C25F (49759) */
+    3347, /* C260 (49760) */
+    3347, /* C261 (49761) */
+    3347, /* C262 (49762) */
+    3347, /* C263 (49763) */
+    3347, /* C264 (49764) */
+    3347, /* C265 (49765) */
+    3347, /* C266 (49766) */
+    3347, /* C267 (49767) */
+    3347, /* C268 (49768) */
+    3347, /* C269 (49769) */
+    3347, /* C26A (49770) */
+    3347, /* C26B (49771) */
+    3347, /* C26C (49772) */
+    3347, /* C26D (49773) */
+    3347, /* C26E (49774) */
+    3347, /* C26F (49775) */
+    3347, /* C270 (49776) */
+    3347, /* C271 (49777) */
+    3347, /* C272 (49778) */
+    3347, /* C273 (49779) */
+    3347, /* C274 (49780) */
+    3347, /* C275 (49781) */
+    3347, /* C276 (49782) */
+    3347, /* C277 (49783) */
+    3347, /* C278 (49784) */
+    3347, /* C279 (49785) */
+    3347, /* C27A (49786) */
+    3347, /* C27B (49787) */
+    3347, /* C27C (49788) */
+    3347, /* C27D (49789) */
+    3347, /* C27E (49790) */
+    3347, /* C27F (49791) */
+    3347, /* C280 (49792) */
+    3347, /* C281 (49793) */
+    3347, /* C282 (49794) */
+    3347, /* C283 (49795) */
+    3347, /* C284 (49796) */
+    3347, /* C285 (49797) */
+    3347, /* C286 (49798) */
+    3347, /* C287 (49799) */
+    3347, /* C288 (49800) */
+    3347, /* C289 (49801) */
+    3347, /* C28A (49802) */
+    3347, /* C28B (49803) */
+    3347, /* C28C (49804) */
+    3347, /* C28D (49805) */
+    3347, /* C28E (49806) */
+    3347, /* C28F (49807) */
+    3347, /* C290 (49808) */
+    3347, /* C291 (49809) */
+    3347, /* C292 (49810) */
+    3347, /* C293 (49811) */
+    3347, /* C294 (49812) */
+    3347, /* C295 (49813) */
+    3347, /* C296 (49814) */
+    3347, /* C297 (49815) */
+    3347, /* C298 (49816) */
+    3347, /* C299 (49817) */
+    3347, /* C29A (49818) */
+    3347, /* C29B (49819) */
+    3347, /* C29C (49820) */
+    3347, /* C29D (49821) */
+    3347, /* C29E (49822) */
+    3347, /* C29F (49823) */
+    3347, /* C2A0 (49824) */
+    3347, /* C2A1 (49825) */
+    3347, /* C2A2 (49826) */
+    3347, /* C2A3 (49827) */
+    3347, /* C2A4 (49828) */
+    3347, /* C2A5 (49829) */
+    3347, /* C2A6 (49830) */
+    3347, /* C2A7 (49831) */
+    3347, /* C2A8 (49832) */
+    3347, /* C2A9 (49833) */
+    3347, /* C2AA (49834) */
+    3347, /* C2AB (49835) */
+    3347, /* C2AC (49836) */
+    3347, /* C2AD (49837) */
+    3347, /* C2AE (49838) */
+    3347, /* C2AF (49839) */
+    3347, /* C2B0 (49840) */
+    3347, /* C2B1 (49841) */
+    3347, /* C2B2 (49842) */
+    3347, /* C2B3 (49843) */
+    3347, /* C2B4 (49844) */
+    3347, /* C2B5 (49845) */
+    3347, /* C2B6 (49846) */
+    3347, /* C2B7 (49847) */
+    3347, /* C2B8 (49848) */
+    3347, /* C2B9 (49849) */
+    3347, /* C2BA (49850) */
+    3347, /* C2BB (49851) */
+    3347, /* C2BC (49852) */
+    3347, /* C2BD (49853) */
+    3347, /* C2BE (49854) */
+    3347, /* C2BF (49855) */
+    3347, /* C2C0 (49856) */
+    3347, /* C2C1 (49857) */
+    3347, /* C2C2 (49858) */
+    3347, /* C2C3 (49859) */
+    3347, /* C2C4 (49860) */
+    3347, /* C2C5 (49861) */
+    3347, /* C2C6 (49862) */
+    3347, /* C2C7 (49863) */
+    3347, /* C2C8 (49864) */
+    3347, /* C2C9 (49865) */
+    3347, /* C2CA (49866) */
+    3347, /* C2CB (49867) */
+    3347, /* C2CC (49868) */
+    3347, /* C2CD (49869) */
+    3347, /* C2CE (49870) */
+    3347, /* C2CF (49871) */
+    3347, /* C2D0 (49872) */
+    3347, /* C2D1 (49873) */
+    3347, /* C2D2 (49874) */
+    3347, /* C2D3 (49875) */
+    3347, /* C2D4 (49876) */
+    3347, /* C2D5 (49877) */
+    3347, /* C2D6 (49878) */
+    3347, /* C2D7 (49879) */
+    3347, /* C2D8 (49880) */
+    3347, /* C2D9 (49881) */
+    3347, /* C2DA (49882) */
+    3347, /* C2DB (49883) */
+    3347, /* C2DC (49884) */
+    3347, /* C2DD (49885) */
+    3347, /* C2DE (49886) */
+    3347, /* C2DF (49887) */
+    3347, /* C2E0 (49888) */
+    3347, /* C2E1 (49889) */
+    3347, /* C2E2 (49890) */
+    3347, /* C2E3 (49891) */
+    3347, /* C2E4 (49892) */
+    3347, /* C2E5 (49893) */
+    3347, /* C2E6 (49894) */
+    3347, /* C2E7 (49895) */
+    3347, /* C2E8 (49896) */
+    3347, /* C2E9 (49897) */
+    3347, /* C2EA (49898) */
+    3347, /* C2EB (49899) */
+    3347, /* C2EC (49900) */
+    3347, /* C2ED (49901) */
+    3347, /* C2EE (49902) */
+    3347, /* C2EF (49903) */
+    3347, /* C2F0 (49904) */
+    3347, /* C2F1 (49905) */
+    3347, /* C2F2 (49906) */
+    3347, /* C2F3 (49907) */
+    3347, /* C2F4 (49908) */
+    3347, /* C2F5 (49909) */
+    3347, /* C2F6 (49910) */
+    3347, /* C2F7 (49911) */
+    3347, /* C2F8 (49912) */
+    3347, /* C2F9 (49913) */
+    3347, /* C2FA (49914) */
+    3347, /* C2FB (49915) */
+    3347, /* C2FC (49916) */
+    3347, /* C2FD (49917) */
+    3347, /* C2FE (49918) */
+    3347, /* C2FF (49919) */
+    3347, /* C300 (49920) */
+    3347, /* C301 (49921) */
+    3347, /* C302 (49922) */
+    3347, /* C303 (49923) */
+    3347, /* C304 (49924) */
+    3347, /* C305 (49925) */
+    3347, /* C306 (49926) */
+    3347, /* C307 (49927) */
+    3347, /* C308 (49928) */
+    3347, /* C309 (49929) */
+    3347, /* C30A (49930) */
+    3347, /* C30B (49931) */
+    3347, /* C30C (49932) */
+    3347, /* C30D (49933) */
+    3347, /* C30E (49934) */
+    3347, /* C30F (49935) */
+    3347, /* C310 (49936) */
+    3347, /* C311 (49937) */
+    3347, /* C312 (49938) */
+    3347, /* C313 (49939) */
+    3347, /* C314 (49940) */
+    3347, /* C315 (49941) */
+    3347, /* C316 (49942) */
+    3347, /* C317 (49943) */
+    3347, /* C318 (49944) */
+    3347, /* C319 (49945) */
+    3347, /* C31A (49946) */
+    3347, /* C31B (49947) */
+    3347, /* C31C (49948) */
+    3347, /* C31D (49949) */
+    3347, /* C31E (49950) */
+    3347, /* C31F (49951) */
+    3347, /* C320 (49952) */
+    3347, /* C321 (49953) */
+    3347, /* C322 (49954) */
+    3347, /* C323 (49955) */
+    3347, /* C324 (49956) */
+    3347, /* C325 (49957) */
+    3347, /* C326 (49958) */
+    3347, /* C327 (49959) */
+    3347, /* C328 (49960) */
+    3347, /* C329 (49961) */
+    3347, /* C32A (49962) */
+    3347, /* C32B (49963) */
+    3347, /* C32C (49964) */
+    3347, /* C32D (49965) */
+    3347, /* C32E (49966) */
+    3347, /* C32F (49967) */
+    3347, /* C330 (49968) */
+    3347, /* C331 (49969) */
+    3347, /* C332 (49970) */
+    3347, /* C333 (49971) */
+    3347, /* C334 (49972) */
+    3347, /* C335 (49973) */
+    3347, /* C336 (49974) */
+    3347, /* C337 (49975) */
+    3347, /* C338 (49976) */
+    3347, /* C339 (49977) */
+    3347, /* C33A (49978) */
+    3347, /* C33B (49979) */
+    3347, /* C33C (49980) */
+    3347, /* C33D (49981) */
+    3347, /* C33E (49982) */
+    3347, /* C33F (49983) */
+    3347, /* C340 (49984) */
+    3347, /* C341 (49985) */
+    3347, /* C342 (49986) */
+    3347, /* C343 (49987) */
+    3347, /* C344 (49988) */
+    3347, /* C345 (49989) */
+    3347, /* C346 (49990) */
+    3347, /* C347 (49991) */
+    3347, /* C348 (49992) */
+    3347, /* C349 (49993) */
+    3347, /* C34A (49994) */
+    3347, /* C34B (49995) */
+    3347, /* C34C (49996) */
+    3347, /* C34D (49997) */
+    3347, /* C34E (49998) */
+    3347, /* C34F (49999) */
+    3347, /* C350 (50000) */
+    3347, /* C351 (50001) */
+    3347, /* C352 (50002) */
+    3347, /* C353 (50003) */
+    3347, /* C354 (50004) */
+    3347, /* C355 (50005) */
+    3347, /* C356 (50006) */
+    3347, /* C357 (50007) */
+    3347, /* C358 (50008) */
+    3347, /* C359 (50009) */
+    3347, /* C35A (50010) */
+    3347, /* C35B (50011) */
+    3347, /* C35C (50012) */
+    3347, /* C35D (50013) */
+    3347, /* C35E (50014) */
+    3347, /* C35F (50015) */
+    3347, /* C360 (50016) */
+    3347, /* C361 (50017) */
+    3347, /* C362 (50018) */
+    3347, /* C363 (50019) */
+    3347, /* C364 (50020) */
+    3347, /* C365 (50021) */
+    3347, /* C366 (50022) */
+    3347, /* C367 (50023) */
+    3347, /* C368 (50024) */
+    3347, /* C369 (50025) */
+    3347, /* C36A (50026) */
+    3347, /* C36B (50027) */
+    3347, /* C36C (50028) */
+    3347, /* C36D (50029) */
+    3347, /* C36E (50030) */
+    3347, /* C36F (50031) */
+    3347, /* C370 (50032) */
+    3347, /* C371 (50033) */
+    3347, /* C372 (50034) */
+    3347, /* C373 (50035) */
+    3347, /* C374 (50036) */
+    3347, /* C375 (50037) */
+    3347, /* C376 (50038) */
+    3347, /* C377 (50039) */
+    3347, /* C378 (50040) */
+    3347, /* C379 (50041) */
+    3347, /* C37A (50042) */
+    3347, /* C37B (50043) */
+    3347, /* C37C (50044) */
+    3347, /* C37D (50045) */
+    3347, /* C37E (50046) */
+    3347, /* C37F (50047) */
+    3347, /* C380 (50048) */
+    3347, /* C381 (50049) */
+    3347, /* C382 (50050) */
+    3347, /* C383 (50051) */
+    3347, /* C384 (50052) */
+    3347, /* C385 (50053) */
+    3347, /* C386 (50054) */
+    3347, /* C387 (50055) */
+    3347, /* C388 (50056) */
+    3347, /* C389 (50057) */
+    3347, /* C38A (50058) */
+    3347, /* C38B (50059) */
+    3347, /* C38C (50060) */
+    3347, /* C38D (50061) */
+    3347, /* C38E (50062) */
+    3347, /* C38F (50063) */
+    3347, /* C390 (50064) */
+    3347, /* C391 (50065) */
+    3347, /* C392 (50066) */
+    3347, /* C393 (50067) */
+    3347, /* C394 (50068) */
+    3347, /* C395 (50069) */
+    3347, /* C396 (50070) */
+    3347, /* C397 (50071) */
+    3347, /* C398 (50072) */
+    3347, /* C399 (50073) */
+    3347, /* C39A (50074) */
+    3347, /* C39B (50075) */
+    3347, /* C39C (50076) */
+    3347, /* C39D (50077) */
+    3347, /* C39E (50078) */
+    3347, /* C39F (50079) */
+    3347, /* C3A0 (50080) */
+    3347, /* C3A1 (50081) */
+    3347, /* C3A2 (50082) */
+    3347, /* C3A3 (50083) */
+    3347, /* C3A4 (50084) */
+    3347, /* C3A5 (50085) */
+    3347, /* C3A6 (50086) */
+    3347, /* C3A7 (50087) */
+    3347, /* C3A8 (50088) */
+    3347, /* C3A9 (50089) */
+    3347, /* C3AA (50090) */
+    3347, /* C3AB (50091) */
+    3347, /* C3AC (50092) */
+    3347, /* C3AD (50093) */
+    3347, /* C3AE (50094) */
+    3347, /* C3AF (50095) */
+    3347, /* C3B0 (50096) */
+    3347, /* C3B1 (50097) */
+    3347, /* C3B2 (50098) */
+    3347, /* C3B3 (50099) */
+    3347, /* C3B4 (50100) */
+    3347, /* C3B5 (50101) */
+    3347, /* C3B6 (50102) */
+    3347, /* C3B7 (50103) */
+    3347, /* C3B8 (50104) */
+    3347, /* C3B9 (50105) */
+    3347, /* C3BA (50106) */
+    3347, /* C3BB (50107) */
+    3347, /* C3BC (50108) */
+    3347, /* C3BD (50109) */
+    3347, /* C3BE (50110) */
+    3347, /* C3BF (50111) */
+    3347, /* C3C0 (50112) */
+    3347, /* C3C1 (50113) */
+    3347, /* C3C2 (50114) */
+    3347, /* C3C3 (50115) */
+    3347, /* C3C4 (50116) */
+    3347, /* C3C5 (50117) */
+    3347, /* C3C6 (50118) */
+    3347, /* C3C7 (50119) */
+    3347, /* C3C8 (50120) */
+    3347, /* C3C9 (50121) */
+    3347, /* C3CA (50122) */
+    3347, /* C3CB (50123) */
+    3347, /* C3CC (50124) */
+    3347, /* C3CD (50125) */
+    3347, /* C3CE (50126) */
+    3347, /* C3CF (50127) */
+    3347, /* C3D0 (50128) */
+    3347, /* C3D1 (50129) */
+    3347, /* C3D2 (50130) */
+    3347, /* C3D3 (50131) */
+    3347, /* C3D4 (50132) */
+    3347, /* C3D5 (50133) */
+    3347, /* C3D6 (50134) */
+    3347, /* C3D7 (50135) */
+    3347, /* C3D8 (50136) */
+    3347, /* C3D9 (50137) */
+    3347, /* C3DA (50138) */
+    3347, /* C3DB (50139) */
+    3347, /* C3DC (50140) */
+    3347, /* C3DD (50141) */
+    3347, /* C3DE (50142) */
+    3347, /* C3DF (50143) */
+    3347, /* C3E0 (50144) */
+    3347, /* C3E1 (50145) */
+    3347, /* C3E2 (50146) */
+    3347, /* C3E3 (50147) */
+    3347, /* C3E4 (50148) */
+    3347, /* C3E5 (50149) */
+    3347, /* C3E6 (50150) */
+    3347, /* C3E7 (50151) */
+    3347, /* C3E8 (50152) */
+    3347, /* C3E9 (50153) */
+    3347, /* C3EA (50154) */
+    3347, /* C3EB (50155) */
+    3347, /* C3EC (50156) */
+    3347, /* C3ED (50157) */
+    3347, /* C3EE (50158) */
+    3347, /* C3EF (50159) */
+    3347, /* C3F0 (50160) */
+    3347, /* C3F1 (50161) */
+    3347, /* C3F2 (50162) */
+    3347, /* C3F3 (50163) */
+    3347, /* C3F4 (50164) */
+    3347, /* C3F5 (50165) */
+    3347, /* C3F6 (50166) */
+    3347, /* C3F7 (50167) */
+    3347, /* C3F8 (50168) */
+    3347, /* C3F9 (50169) */
+    3347, /* C3FA (50170) */
+    3347, /* C3FB (50171) */
+    3347, /* C3FC (50172) */
+    3347, /* C3FD (50173) */
+    3347, /* C3FE (50174) */
+    3347, /* C3FF (50175) */
+    3347, /* C400 (50176) */
+    3347, /* C401 (50177) */
+    3347, /* C402 (50178) */
+    3347, /* C403 (50179) */
+    3347, /* C404 (50180) */
+    3347, /* C405 (50181) */
+    3347, /* C406 (50182) */
+    3347, /* C407 (50183) */
+    3347, /* C408 (50184) */
+    3347, /* C409 (50185) */
+    3347, /* C40A (50186) */
+    3347, /* C40B (50187) */
+    3347, /* C40C (50188) */
+    3347, /* C40D (50189) */
+    3347, /* C40E (50190) */
+    3347, /* C40F (50191) */
+    3347, /* C410 (50192) */
+    3347, /* C411 (50193) */
+    3347, /* C412 (50194) */
+    3347, /* C413 (50195) */
+    3347, /* C414 (50196) */
+    3347, /* C415 (50197) */
+    3347, /* C416 (50198) */
+    3347, /* C417 (50199) */
+    3347, /* C418 (50200) */
+    3347, /* C419 (50201) */
+    3347, /* C41A (50202) */
+    3347, /* C41B (50203) */
+    3347, /* C41C (50204) */
+    3347, /* C41D (50205) */
+    3347, /* C41E (50206) */
+    3347, /* C41F (50207) */
+    3347, /* C420 (50208) */
+    3347, /* C421 (50209) */
+    3347, /* C422 (50210) */
+    3347, /* C423 (50211) */
+    3347, /* C424 (50212) */
+    3347, /* C425 (50213) */
+    3347, /* C426 (50214) */
+    3347, /* C427 (50215) */
+    3347, /* C428 (50216) */
+    3347, /* C429 (50217) */
+    3347, /* C42A (50218) */
+    3347, /* C42B (50219) */
+    3347, /* C42C (50220) */
+    3347, /* C42D (50221) */
+    3347, /* C42E (50222) */
+    3347, /* C42F (50223) */
+    3347, /* C430 (50224) */
+    3347, /* C431 (50225) */
+    3347, /* C432 (50226) */
+    3347, /* C433 (50227) */
+    3347, /* C434 (50228) */
+    3347, /* C435 (50229) */
+    3347, /* C436 (50230) */
+    3347, /* C437 (50231) */
+    3347, /* C438 (50232) */
+    3347, /* C439 (50233) */
+    3347, /* C43A (50234) */
+    3347, /* C43B (50235) */
+    3347, /* C43C (50236) */
+    3347, /* C43D (50237) */
+    3347, /* C43E (50238) */
+    3347, /* C43F (50239) */
+    3347, /* C440 (50240) */
+    3347, /* C441 (50241) */
+    3347, /* C442 (50242) */
+    3347, /* C443 (50243) */
+    3347, /* C444 (50244) */
+    3347, /* C445 (50245) */
+    3347, /* C446 (50246) */
+    3347, /* C447 (50247) */
+    3347, /* C448 (50248) */
+    3347, /* C449 (50249) */
+    3347, /* C44A (50250) */
+    3347, /* C44B (50251) */
+    3347, /* C44C (50252) */
+    3347, /* C44D (50253) */
+    3347, /* C44E (50254) */
+    3347, /* C44F (50255) */
+    3347, /* C450 (50256) */
+    3347, /* C451 (50257) */
+    3347, /* C452 (50258) */
+    3347, /* C453 (50259) */
+    3347, /* C454 (50260) */
+    3347, /* C455 (50261) */
+    3347, /* C456 (50262) */
+    3347, /* C457 (50263) */
+    3347, /* C458 (50264) */
+    3347, /* C459 (50265) */
+    3347, /* C45A (50266) */
+    3347, /* C45B (50267) */
+    3347, /* C45C (50268) */
+    3347, /* C45D (50269) */
+    3347, /* C45E (50270) */
+    3347, /* C45F (50271) */
+    3347, /* C460 (50272) */
+    3347, /* C461 (50273) */
+    3347, /* C462 (50274) */
+    3347, /* C463 (50275) */
+    3347, /* C464 (50276) */
+    3347, /* C465 (50277) */
+    3347, /* C466 (50278) */
+    3347, /* C467 (50279) */
+    3347, /* C468 (50280) */
+    3347, /* C469 (50281) */
+    3347, /* C46A (50282) */
+    3347, /* C46B (50283) */
+    3347, /* C46C (50284) */
+    3347, /* C46D (50285) */
+    3347, /* C46E (50286) */
+    3347, /* C46F (50287) */
+    3347, /* C470 (50288) */
+    3347, /* C471 (50289) */
+    3347, /* C472 (50290) */
+    3347, /* C473 (50291) */
+    3347, /* C474 (50292) */
+    3347, /* C475 (50293) */
+    3347, /* C476 (50294) */
+    3347, /* C477 (50295) */
+    3347, /* C478 (50296) */
+    3347, /* C479 (50297) */
+    3347, /* C47A (50298) */
+    3347, /* C47B (50299) */
+    3347, /* C47C (50300) */
+    3347, /* C47D (50301) */
+    3347, /* C47E (50302) */
+    3347, /* C47F (50303) */
+    3347, /* C480 (50304) */
+    3347, /* C481 (50305) */
+    3347, /* C482 (50306) */
+    3347, /* C483 (50307) */
+    3347, /* C484 (50308) */
+    3347, /* C485 (50309) */
+    3347, /* C486 (50310) */
+    3347, /* C487 (50311) */
+    3347, /* C488 (50312) */
+    3347, /* C489 (50313) */
+    3347, /* C48A (50314) */
+    3347, /* C48B (50315) */
+    3347, /* C48C (50316) */
+    3347, /* C48D (50317) */
+    3347, /* C48E (50318) */
+    3347, /* C48F (50319) */
+    3347, /* C490 (50320) */
+    3347, /* C491 (50321) */
+    3347, /* C492 (50322) */
+    3347, /* C493 (50323) */
+    3347, /* C494 (50324) */
+    3347, /* C495 (50325) */
+    3347, /* C496 (50326) */
+    3347, /* C497 (50327) */
+    3347, /* C498 (50328) */
+    3347, /* C499 (50329) */
+    3347, /* C49A (50330) */
+    3347, /* C49B (50331) */
+    3347, /* C49C (50332) */
+    3347, /* C49D (50333) */
+    3347, /* C49E (50334) */
+    3347, /* C49F (50335) */
+    3347, /* C4A0 (50336) */
+    3347, /* C4A1 (50337) */
+    3347, /* C4A2 (50338) */
+    3347, /* C4A3 (50339) */
+    3347, /* C4A4 (50340) */
+    3347, /* C4A5 (50341) */
+    3347, /* C4A6 (50342) */
+    3347, /* C4A7 (50343) */
+    3347, /* C4A8 (50344) */
+    3347, /* C4A9 (50345) */
+    3347, /* C4AA (50346) */
+    3347, /* C4AB (50347) */
+    3347, /* C4AC (50348) */
+    3347, /* C4AD (50349) */
+    3347, /* C4AE (50350) */
+    3347, /* C4AF (50351) */
+    3347, /* C4B0 (50352) */
+    3347, /* C4B1 (50353) */
+    3347, /* C4B2 (50354) */
+    3347, /* C4B3 (50355) */
+    3347, /* C4B4 (50356) */
+    3347, /* C4B5 (50357) */
+    3347, /* C4B6 (50358) */
+    3347, /* C4B7 (50359) */
+    3347, /* C4B8 (50360) */
+    3347, /* C4B9 (50361) */
+    3347, /* C4BA (50362) */
+    3347, /* C4BB (50363) */
+    3347, /* C4BC (50364) */
+    3347, /* C4BD (50365) */
+    3347, /* C4BE (50366) */
+    3347, /* C4BF (50367) */
+    3347, /* C4C0 (50368) */
+    3347, /* C4C1 (50369) */
+    3347, /* C4C2 (50370) */
+    3347, /* C4C3 (50371) */
+    3347, /* C4C4 (50372) */
+    3347, /* C4C5 (50373) */
+    3347, /* C4C6 (50374) */
+    3347, /* C4C7 (50375) */
+    3347, /* C4C8 (50376) */
+    3347, /* C4C9 (50377) */
+    3347, /* C4CA (50378) */
+    3347, /* C4CB (50379) */
+    3347, /* C4CC (50380) */
+    3347, /* C4CD (50381) */
+    3347, /* C4CE (50382) */
+    3347, /* C4CF (50383) */
+    3347, /* C4D0 (50384) */
+    3347, /* C4D1 (50385) */
+    3347, /* C4D2 (50386) */
+    3347, /* C4D3 (50387) */
+    3347, /* C4D4 (50388) */
+    3347, /* C4D5 (50389) */
+    3347, /* C4D6 (50390) */
+    3347, /* C4D7 (50391) */
+    3347, /* C4D8 (50392) */
+    3347, /* C4D9 (50393) */
+    3347, /* C4DA (50394) */
+    3347, /* C4DB (50395) */
+    3347, /* C4DC (50396) */
+    3347, /* C4DD (50397) */
+    3347, /* C4DE (50398) */
+    3347, /* C4DF (50399) */
+    3347, /* C4E0 (50400) */
+    3347, /* C4E1 (50401) */
+    3347, /* C4E2 (50402) */
+    3347, /* C4E3 (50403) */
+    3347, /* C4E4 (50404) */
+    3347, /* C4E5 (50405) */
+    3347, /* C4E6 (50406) */
+    3347, /* C4E7 (50407) */
+    3347, /* C4E8 (50408) */
+    3347, /* C4E9 (50409) */
+    3347, /* C4EA (50410) */
+    3347, /* C4EB (50411) */
+    3347, /* C4EC (50412) */
+    3347, /* C4ED (50413) */
+    3347, /* C4EE (50414) */
+    3347, /* C4EF (50415) */
+    3347, /* C4F0 (50416) */
+    3347, /* C4F1 (50417) */
+    3347, /* C4F2 (50418) */
+    3347, /* C4F3 (50419) */
+    3347, /* C4F4 (50420) */
+    3347, /* C4F5 (50421) */
+    3347, /* C4F6 (50422) */
+    3347, /* C4F7 (50423) */
+    3347, /* C4F8 (50424) */
+    3347, /* C4F9 (50425) */
+    3347, /* C4FA (50426) */
+    3347, /* C4FB (50427) */
+    3347, /* C4FC (50428) */
+    3347, /* C4FD (50429) */
+    3347, /* C4FE (50430) */
+    3347, /* C4FF (50431) */
+    3347, /* C500 (50432) */
+    3347, /* C501 (50433) */
+    3347, /* C502 (50434) */
+    3347, /* C503 (50435) */
+    3347, /* C504 (50436) */
+    3347, /* C505 (50437) */
+    3347, /* C506 (50438) */
+    3347, /* C507 (50439) */
+    3347, /* C508 (50440) */
+    3347, /* C509 (50441) */
+    3347, /* C50A (50442) */
+    3347, /* C50B (50443) */
+    3347, /* C50C (50444) */
+    3347, /* C50D (50445) */
+    3347, /* C50E (50446) */
+    3347, /* C50F (50447) */
+    3347, /* C510 (50448) */
+    3347, /* C511 (50449) */
+    3347, /* C512 (50450) */
+    3347, /* C513 (50451) */
+    3347, /* C514 (50452) */
+    3347, /* C515 (50453) */
+    3347, /* C516 (50454) */
+    3347, /* C517 (50455) */
+    3347, /* C518 (50456) */
+    3347, /* C519 (50457) */
+    3347, /* C51A (50458) */
+    3347, /* C51B (50459) */
+    3347, /* C51C (50460) */
+    3347, /* C51D (50461) */
+    3347, /* C51E (50462) */
+    3347, /* C51F (50463) */
+    3347, /* C520 (50464) */
+    3347, /* C521 (50465) */
+    3347, /* C522 (50466) */
+    3347, /* C523 (50467) */
+    3347, /* C524 (50468) */
+    3347, /* C525 (50469) */
+    3347, /* C526 (50470) */
+    3347, /* C527 (50471) */
+    3347, /* C528 (50472) */
+    3347, /* C529 (50473) */
+    3347, /* C52A (50474) */
+    3347, /* C52B (50475) */
+    3347, /* C52C (50476) */
+    3347, /* C52D (50477) */
+    3347, /* C52E (50478) */
+    3347, /* C52F (50479) */
+    3347, /* C530 (50480) */
+    3347, /* C531 (50481) */
+    3347, /* C532 (50482) */
+    3347, /* C533 (50483) */
+    3347, /* C534 (50484) */
+    3347, /* C535 (50485) */
+    3347, /* C536 (50486) */
+    3347, /* C537 (50487) */
+    3347, /* C538 (50488) */
+    3347, /* C539 (50489) */
+    3347, /* C53A (50490) */
+    3347, /* C53B (50491) */
+    3347, /* C53C (50492) */
+    3347, /* C53D (50493) */
+    3347, /* C53E (50494) */
+    3347, /* C53F (50495) */
+    3347, /* C540 (50496) */
+    3347, /* C541 (50497) */
+    3347, /* C542 (50498) */
+    3347, /* C543 (50499) */
+    3347, /* C544 (50500) */
+    3347, /* C545 (50501) */
+    3347, /* C546 (50502) */
+    3347, /* C547 (50503) */
+    3347, /* C548 (50504) */
+    3347, /* C549 (50505) */
+    3347, /* C54A (50506) */
+    3347, /* C54B (50507) */
+    3347, /* C54C (50508) */
+    3347, /* C54D (50509) */
+    3347, /* C54E (50510) */
+    3347, /* C54F (50511) */
+    3347, /* C550 (50512) */
+    3347, /* C551 (50513) */
+    3347, /* C552 (50514) */
+    3347, /* C553 (50515) */
+    3347, /* C554 (50516) */
+    3347, /* C555 (50517) */
+    3347, /* C556 (50518) */
+    3347, /* C557 (50519) */
+    3347, /* C558 (50520) */
+    3347, /* C559 (50521) */
+    3347, /* C55A (50522) */
+    3347, /* C55B (50523) */
+    3347, /* C55C (50524) */
+    3347, /* C55D (50525) */
+    3347, /* C55E (50526) */
+    3347, /* C55F (50527) */
+    3347, /* C560 (50528) */
+    3347, /* C561 (50529) */
+    3347, /* C562 (50530) */
+    3347, /* C563 (50531) */
+    3347, /* C564 (50532) */
+    3347, /* C565 (50533) */
+    3347, /* C566 (50534) */
+    3347, /* C567 (50535) */
+    3347, /* C568 (50536) */
+    3347, /* C569 (50537) */
+    3347, /* C56A (50538) */
+    3347, /* C56B (50539) */
+    3347, /* C56C (50540) */
+    3347, /* C56D (50541) */
+    3347, /* C56E (50542) */
+    3347, /* C56F (50543) */
+    3347, /* C570 (50544) */
+    3347, /* C571 (50545) */
+    3347, /* C572 (50546) */
+    3347, /* C573 (50547) */
+    3347, /* C574 (50548) */
+    3347, /* C575 (50549) */
+    3347, /* C576 (50550) */
+    3347, /* C577 (50551) */
+    3347, /* C578 (50552) */
+    3347, /* C579 (50553) */
+    3347, /* C57A (50554) */
+    3347, /* C57B (50555) */
+    3347, /* C57C (50556) */
+    3347, /* C57D (50557) */
+    3347, /* C57E (50558) */
+    3347, /* C57F (50559) */
+    3347, /* C580 (50560) */
+    3347, /* C581 (50561) */
+    3347, /* C582 (50562) */
+    3347, /* C583 (50563) */
+    3347, /* C584 (50564) */
+    3347, /* C585 (50565) */
+    3347, /* C586 (50566) */
+    3347, /* C587 (50567) */
+    3347, /* C588 (50568) */
+    3347, /* C589 (50569) */
+    3347, /* C58A (50570) */
+    3347, /* C58B (50571) */
+    3347, /* C58C (50572) */
+    3347, /* C58D (50573) */
+    3347, /* C58E (50574) */
+    3347, /* C58F (50575) */
+    3347, /* C590 (50576) */
+    3347, /* C591 (50577) */
+    3347, /* C592 (50578) */
+    3347, /* C593 (50579) */
+    3347, /* C594 (50580) */
+    3347, /* C595 (50581) */
+    3347, /* C596 (50582) */
+    3347, /* C597 (50583) */
+    3347, /* C598 (50584) */
+    3347, /* C599 (50585) */
+    3347, /* C59A (50586) */
+    3347, /* C59B (50587) */
+    3347, /* C59C (50588) */
+    3347, /* C59D (50589) */
+    3347, /* C59E (50590) */
+    3347, /* C59F (50591) */
+    3347, /* C5A0 (50592) */
+    3347, /* C5A1 (50593) */
+    3347, /* C5A2 (50594) */
+    3347, /* C5A3 (50595) */
+    3347, /* C5A4 (50596) */
+    3347, /* C5A5 (50597) */
+    3347, /* C5A6 (50598) */
+    3347, /* C5A7 (50599) */
+    3347, /* C5A8 (50600) */
+    3347, /* C5A9 (50601) */
+    3347, /* C5AA (50602) */
+    3347, /* C5AB (50603) */
+    3347, /* C5AC (50604) */
+    3347, /* C5AD (50605) */
+    3347, /* C5AE (50606) */
+    3347, /* C5AF (50607) */
+    3347, /* C5B0 (50608) */
+    3347, /* C5B1 (50609) */
+    3347, /* C5B2 (50610) */
+    3347, /* C5B3 (50611) */
+    3347, /* C5B4 (50612) */
+    3347, /* C5B5 (50613) */
+    3347, /* C5B6 (50614) */
+    3347, /* C5B7 (50615) */
+    3347, /* C5B8 (50616) */
+    3347, /* C5B9 (50617) */
+    3347, /* C5BA (50618) */
+    3347, /* C5BB (50619) */
+    3347, /* C5BC (50620) */
+    3347, /* C5BD (50621) */
+    3347, /* C5BE (50622) */
+    3347, /* C5BF (50623) */
+    3347, /* C5C0 (50624) */
+    3347, /* C5C1 (50625) */
+    3347, /* C5C2 (50626) */
+    3347, /* C5C3 (50627) */
+    3347, /* C5C4 (50628) */
+    3347, /* C5C5 (50629) */
+    3347, /* C5C6 (50630) */
+    3347, /* C5C7 (50631) */
+    3347, /* C5C8 (50632) */
+    3347, /* C5C9 (50633) */
+    3347, /* C5CA (50634) */
+    3347, /* C5CB (50635) */
+    3347, /* C5CC (50636) */
+    3347, /* C5CD (50637) */
+    3347, /* C5CE (50638) */
+    3347, /* C5CF (50639) */
+    3347, /* C5D0 (50640) */
+    3347, /* C5D1 (50641) */
+    3347, /* C5D2 (50642) */
+    3347, /* C5D3 (50643) */
+    3347, /* C5D4 (50644) */
+    3347, /* C5D5 (50645) */
+    3347, /* C5D6 (50646) */
+    3347, /* C5D7 (50647) */
+    3347, /* C5D8 (50648) */
+    3347, /* C5D9 (50649) */
+    3347, /* C5DA (50650) */
+    3347, /* C5DB (50651) */
+    3347, /* C5DC (50652) */
+    3347, /* C5DD (50653) */
+    3347, /* C5DE (50654) */
+    3347, /* C5DF (50655) */
+    3347, /* C5E0 (50656) */
+    3347, /* C5E1 (50657) */
+    3347, /* C5E2 (50658) */
+    3347, /* C5E3 (50659) */
+    3347, /* C5E4 (50660) */
+    3347, /* C5E5 (50661) */
+    3347, /* C5E6 (50662) */
+    3347, /* C5E7 (50663) */
+    3347, /* C5E8 (50664) */
+    3347, /* C5E9 (50665) */
+    3347, /* C5EA (50666) */
+    3347, /* C5EB (50667) */
+    3347, /* C5EC (50668) */
+    3347, /* C5ED (50669) */
+    3347, /* C5EE (50670) */
+    3347, /* C5EF (50671) */
+    3347, /* C5F0 (50672) */
+    3347, /* C5F1 (50673) */
+    3347, /* C5F2 (50674) */
+    3347, /* C5F3 (50675) */
+    3347, /* C5F4 (50676) */
+    3347, /* C5F5 (50677) */
+    3347, /* C5F6 (50678) */
+    3347, /* C5F7 (50679) */
+    3347, /* C5F8 (50680) */
+    3347, /* C5F9 (50681) */
+    3347, /* C5FA (50682) */
+    3347, /* C5FB (50683) */
+    3347, /* C5FC (50684) */
+    3347, /* C5FD (50685) */
+    3347, /* C5FE (50686) */
+    3347, /* C5FF (50687) */
+    3347, /* C600 (50688) */
+    3347, /* C601 (50689) */
+    3347, /* C602 (50690) */
+    3347, /* C603 (50691) */
+    3347, /* C604 (50692) */
+    3347, /* C605 (50693) */
+    3347, /* C606 (50694) */
+    3347, /* C607 (50695) */
+    3347, /* C608 (50696) */
+    3347, /* C609 (50697) */
+    3347, /* C60A (50698) */
+    3347, /* C60B (50699) */
+    3347, /* C60C (50700) */
+    3347, /* C60D (50701) */
+    3347, /* C60E (50702) */
+    3347, /* C60F (50703) */
+    3347, /* C610 (50704) */
+    3347, /* C611 (50705) */
+    3347, /* C612 (50706) */
+    3347, /* C613 (50707) */
+    3347, /* C614 (50708) */
+    3347, /* C615 (50709) */
+    3347, /* C616 (50710) */
+    3347, /* C617 (50711) */
+    3347, /* C618 (50712) */
+    3347, /* C619 (50713) */
+    3347, /* C61A (50714) */
+    3347, /* C61B (50715) */
+    3347, /* C61C (50716) */
+    3347, /* C61D (50717) */
+    3347, /* C61E (50718) */
+    3347, /* C61F (50719) */
+    3347, /* C620 (50720) */
+    3347, /* C621 (50721) */
+    3347, /* C622 (50722) */
+    3347, /* C623 (50723) */
+    3347, /* C624 (50724) */
+    3347, /* C625 (50725) */
+    3347, /* C626 (50726) */
+    3347, /* C627 (50727) */
+    3347, /* C628 (50728) */
+    3347, /* C629 (50729) */
+    3347, /* C62A (50730) */
+    3347, /* C62B (50731) */
+    3347, /* C62C (50732) */
+    3347, /* C62D (50733) */
+    3347, /* C62E (50734) */
+    3347, /* C62F (50735) */
+    3347, /* C630 (50736) */
+    3347, /* C631 (50737) */
+    3347, /* C632 (50738) */
+    3347, /* C633 (50739) */
+    3347, /* C634 (50740) */
+    3347, /* C635 (50741) */
+    3347, /* C636 (50742) */
+    3347, /* C637 (50743) */
+    3347, /* C638 (50744) */
+    3347, /* C639 (50745) */
+    3347, /* C63A (50746) */
+    3347, /* C63B (50747) */
+    3347, /* C63C (50748) */
+    3347, /* C63D (50749) */
+    3347, /* C63E (50750) */
+    3347, /* C63F (50751) */
+    3347, /* C640 (50752) */
+    3347, /* C641 (50753) */
+    3347, /* C642 (50754) */
+    3347, /* C643 (50755) */
+    3347, /* C644 (50756) */
+    3347, /* C645 (50757) */
+    3347, /* C646 (50758) */
+    3347, /* C647 (50759) */
+    3347, /* C648 (50760) */
+    3347, /* C649 (50761) */
+    3347, /* C64A (50762) */
+    3347, /* C64B (50763) */
+    3347, /* C64C (50764) */
+    3347, /* C64D (50765) */
+    3347, /* C64E (50766) */
+    3347, /* C64F (50767) */
+    3347, /* C650 (50768) */
+    3347, /* C651 (50769) */
+    3347, /* C652 (50770) */
+    3347, /* C653 (50771) */
+    3347, /* C654 (50772) */
+    3347, /* C655 (50773) */
+    3347, /* C656 (50774) */
+    3347, /* C657 (50775) */
+    3347, /* C658 (50776) */
+    3347, /* C659 (50777) */
+    3347, /* C65A (50778) */
+    3347, /* C65B (50779) */
+    3347, /* C65C (50780) */
+    3347, /* C65D (50781) */
+    3347, /* C65E (50782) */
+    3347, /* C65F (50783) */
+    3347, /* C660 (50784) */
+    3347, /* C661 (50785) */
+    3347, /* C662 (50786) */
+    3347, /* C663 (50787) */
+    3347, /* C664 (50788) */
+    3347, /* C665 (50789) */
+    3347, /* C666 (50790) */
+    3347, /* C667 (50791) */
+    3347, /* C668 (50792) */
+    3347, /* C669 (50793) */
+    3347, /* C66A (50794) */
+    3347, /* C66B (50795) */
+    3347, /* C66C (50796) */
+    3347, /* C66D (50797) */
+    3347, /* C66E (50798) */
+    3347, /* C66F (50799) */
+    3347, /* C670 (50800) */
+    3347, /* C671 (50801) */
+    3347, /* C672 (50802) */
+    3347, /* C673 (50803) */
+    3347, /* C674 (50804) */
+    3347, /* C675 (50805) */
+    3347, /* C676 (50806) */
+    3347, /* C677 (50807) */
+    3347, /* C678 (50808) */
+    3347, /* C679 (50809) */
+    3347, /* C67A (50810) */
+    3347, /* C67B (50811) */
+    3347, /* C67C (50812) */
+    3347, /* C67D (50813) */
+    3347, /* C67E (50814) */
+    3347, /* C67F (50815) */
+    3347, /* C680 (50816) */
+    3347, /* C681 (50817) */
+    3347, /* C682 (50818) */
+    3347, /* C683 (50819) */
+    3347, /* C684 (50820) */
+    3347, /* C685 (50821) */
+    3347, /* C686 (50822) */
+    3347, /* C687 (50823) */
+    3347, /* C688 (50824) */
+    3347, /* C689 (50825) */
+    3347, /* C68A (50826) */
+    3347, /* C68B (50827) */
+    3347, /* C68C (50828) */
+    3347, /* C68D (50829) */
+    3347, /* C68E (50830) */
+    3347, /* C68F (50831) */
+    3347, /* C690 (50832) */
+    3347, /* C691 (50833) */
+    3347, /* C692 (50834) */
+    3347, /* C693 (50835) */
+    3347, /* C694 (50836) */
+    3347, /* C695 (50837) */
+    3347, /* C696 (50838) */
+    3347, /* C697 (50839) */
+    3347, /* C698 (50840) */
+    3347, /* C699 (50841) */
+    3347, /* C69A (50842) */
+    3347, /* C69B (50843) */
+    3347, /* C69C (50844) */
+    3347, /* C69D (50845) */
+    3347, /* C69E (50846) */
+    3347, /* C69F (50847) */
+    3347, /* C6A0 (50848) */
+    3347, /* C6A1 (50849) */
+    3347, /* C6A2 (50850) */
+    3347, /* C6A3 (50851) */
+    3347, /* C6A4 (50852) */
+    3347, /* C6A5 (50853) */
+    3347, /* C6A6 (50854) */
+    3347, /* C6A7 (50855) */
+    3347, /* C6A8 (50856) */
+    3347, /* C6A9 (50857) */
+    3347, /* C6AA (50858) */
+    3347, /* C6AB (50859) */
+    3347, /* C6AC (50860) */
+    3347, /* C6AD (50861) */
+    3347, /* C6AE (50862) */
+    3347, /* C6AF (50863) */
+    3347, /* C6B0 (50864) */
+    3347, /* C6B1 (50865) */
+    3347, /* C6B2 (50866) */
+    3347, /* C6B3 (50867) */
+    3347, /* C6B4 (50868) */
+    3347, /* C6B5 (50869) */
+    3347, /* C6B6 (50870) */
+    3347, /* C6B7 (50871) */
+    3347, /* C6B8 (50872) */
+    3347, /* C6B9 (50873) */
+    3347, /* C6BA (50874) */
+    3347, /* C6BB (50875) */
+    3347, /* C6BC (50876) */
+    3347, /* C6BD (50877) */
+    3347, /* C6BE (50878) */
+    3347, /* C6BF (50879) */
+    3347, /* C6C0 (50880) */
+    3347, /* C6C1 (50881) */
+    3347, /* C6C2 (50882) */
+    3347, /* C6C3 (50883) */
+    3347, /* C6C4 (50884) */
+    3347, /* C6C5 (50885) */
+    3347, /* C6C6 (50886) */
+    3347, /* C6C7 (50887) */
+    3347, /* C6C8 (50888) */
+    3347, /* C6C9 (50889) */
+    3347, /* C6CA (50890) */
+    3347, /* C6CB (50891) */
+    3347, /* C6CC (50892) */
+    3347, /* C6CD (50893) */
+    3347, /* C6CE (50894) */
+    3347, /* C6CF (50895) */
+    3347, /* C6D0 (50896) */
+    3347, /* C6D1 (50897) */
+    3347, /* C6D2 (50898) */
+    3347, /* C6D3 (50899) */
+    3347, /* C6D4 (50900) */
+    3347, /* C6D5 (50901) */
+    3347, /* C6D6 (50902) */
+    3347, /* C6D7 (50903) */
+    3347, /* C6D8 (50904) */
+    3347, /* C6D9 (50905) */
+    3347, /* C6DA (50906) */
+    3347, /* C6DB (50907) */
+    3347, /* C6DC (50908) */
+    3347, /* C6DD (50909) */
+    3347, /* C6DE (50910) */
+    3347, /* C6DF (50911) */
+    3347, /* C6E0 (50912) */
+    3347, /* C6E1 (50913) */
+    3347, /* C6E2 (50914) */
+    3347, /* C6E3 (50915) */
+    3347, /* C6E4 (50916) */
+    3347, /* C6E5 (50917) */
+    3347, /* C6E6 (50918) */
+    3347, /* C6E7 (50919) */
+    3347, /* C6E8 (50920) */
+    3347, /* C6E9 (50921) */
+    3347, /* C6EA (50922) */
+    3347, /* C6EB (50923) */
+    3347, /* C6EC (50924) */
+    3347, /* C6ED (50925) */
+    3347, /* C6EE (50926) */
+    3347, /* C6EF (50927) */
+    3347, /* C6F0 (50928) */
+    3347, /* C6F1 (50929) */
+    3347, /* C6F2 (50930) */
+    3347, /* C6F3 (50931) */
+    3347, /* C6F4 (50932) */
+    3347, /* C6F5 (50933) */
+    3347, /* C6F6 (50934) */
+    3347, /* C6F7 (50935) */
+    3347, /* C6F8 (50936) */
+    3347, /* C6F9 (50937) */
+    3347, /* C6FA (50938) */
+    3347, /* C6FB (50939) */
+    3347, /* C6FC (50940) */
+    3347, /* C6FD (50941) */
+    3347, /* C6FE (50942) */
+    3347, /* C6FF (50943) */
+    3347, /* C700 (50944) */
+    3347, /* C701 (50945) */
+    3347, /* C702 (50946) */
+    3347, /* C703 (50947) */
+    3347, /* C704 (50948) */
+    3347, /* C705 (50949) */
+    3347, /* C706 (50950) */
+    3347, /* C707 (50951) */
+    3347, /* C708 (50952) */
+    3347, /* C709 (50953) */
+    3347, /* C70A (50954) */
+    3347, /* C70B (50955) */
+    3347, /* C70C (50956) */
+    3347, /* C70D (50957) */
+    3347, /* C70E (50958) */
+    3347, /* C70F (50959) */
+    3347, /* C710 (50960) */
+    3347, /* C711 (50961) */
+    3347, /* C712 (50962) */
+    3347, /* C713 (50963) */
+    3347, /* C714 (50964) */
+    3347, /* C715 (50965) */
+    3347, /* C716 (50966) */
+    3347, /* C717 (50967) */
+    3347, /* C718 (50968) */
+    3347, /* C719 (50969) */
+    3347, /* C71A (50970) */
+    3347, /* C71B (50971) */
+    3347, /* C71C (50972) */
+    3347, /* C71D (50973) */
+    3347, /* C71E (50974) */
+    3347, /* C71F (50975) */
+    3347, /* C720 (50976) */
+    3347, /* C721 (50977) */
+    3347, /* C722 (50978) */
+    3347, /* C723 (50979) */
+    3347, /* C724 (50980) */
+    3347, /* C725 (50981) */
+    3347, /* C726 (50982) */
+    3347, /* C727 (50983) */
+    3347, /* C728 (50984) */
+    3347, /* C729 (50985) */
+    3347, /* C72A (50986) */
+    3347, /* C72B (50987) */
+    3347, /* C72C (50988) */
+    3347, /* C72D (50989) */
+    3347, /* C72E (50990) */
+    3347, /* C72F (50991) */
+    3347, /* C730 (50992) */
+    3347, /* C731 (50993) */
+    3347, /* C732 (50994) */
+    3347, /* C733 (50995) */
+    3347, /* C734 (50996) */
+    3347, /* C735 (50997) */
+    3347, /* C736 (50998) */
+    3347, /* C737 (50999) */
+    3347, /* C738 (51000) */
+    3347, /* C739 (51001) */
+    3347, /* C73A (51002) */
+    3347, /* C73B (51003) */
+    3347, /* C73C (51004) */
+    3347, /* C73D (51005) */
+    3347, /* C73E (51006) */
+    3347, /* C73F (51007) */
+    3347, /* C740 (51008) */
+    3347, /* C741 (51009) */
+    3347, /* C742 (51010) */
+    3347, /* C743 (51011) */
+    3347, /* C744 (51012) */
+    3347, /* C745 (51013) */
+    3347, /* C746 (51014) */
+    3347, /* C747 (51015) */
+    3347, /* C748 (51016) */
+    3347, /* C749 (51017) */
+    3347, /* C74A (51018) */
+    3347, /* C74B (51019) */
+    3347, /* C74C (51020) */
+    3347, /* C74D (51021) */
+    3347, /* C74E (51022) */
+    3347, /* C74F (51023) */
+    3347, /* C750 (51024) */
+    3347, /* C751 (51025) */
+    3347, /* C752 (51026) */
+    3347, /* C753 (51027) */
+    3347, /* C754 (51028) */
+    3347, /* C755 (51029) */
+    3347, /* C756 (51030) */
+    3347, /* C757 (51031) */
+    3347, /* C758 (51032) */
+    3347, /* C759 (51033) */
+    3347, /* C75A (51034) */
+    3347, /* C75B (51035) */
+    3347, /* C75C (51036) */
+    3347, /* C75D (51037) */
+    3347, /* C75E (51038) */
+    3347, /* C75F (51039) */
+    3347, /* C760 (51040) */
+    3347, /* C761 (51041) */
+    3347, /* C762 (51042) */
+    3347, /* C763 (51043) */
+    3347, /* C764 (51044) */
+    3347, /* C765 (51045) */
+    3347, /* C766 (51046) */
+    3347, /* C767 (51047) */
+    3347, /* C768 (51048) */
+    3347, /* C769 (51049) */
+    3347, /* C76A (51050) */
+    3347, /* C76B (51051) */
+    3347, /* C76C (51052) */
+    3347, /* C76D (51053) */
+    3347, /* C76E (51054) */
+    3347, /* C76F (51055) */
+    3347, /* C770 (51056) */
+    3347, /* C771 (51057) */
+    3347, /* C772 (51058) */
+    3347, /* C773 (51059) */
+    3347, /* C774 (51060) */
+    3347, /* C775 (51061) */
+    3347, /* C776 (51062) */
+    3347, /* C777 (51063) */
+    3347, /* C778 (51064) */
+    3347, /* C779 (51065) */
+    3347, /* C77A (51066) */
+    3347, /* C77B (51067) */
+    3347, /* C77C (51068) */
+    3347, /* C77D (51069) */
+    3347, /* C77E (51070) */
+    3347, /* C77F (51071) */
+    3347, /* C780 (51072) */
+    3347, /* C781 (51073) */
+    3347, /* C782 (51074) */
+    3347, /* C783 (51075) */
+    3347, /* C784 (51076) */
+    3347, /* C785 (51077) */
+    3347, /* C786 (51078) */
+    3347, /* C787 (51079) */
+    3347, /* C788 (51080) */
+    3347, /* C789 (51081) */
+    3347, /* C78A (51082) */
+    3347, /* C78B (51083) */
+    3347, /* C78C (51084) */
+    3347, /* C78D (51085) */
+    3347, /* C78E (51086) */
+    3347, /* C78F (51087) */
+    3347, /* C790 (51088) */
+    3347, /* C791 (51089) */
+    3347, /* C792 (51090) */
+    3347, /* C793 (51091) */
+    3347, /* C794 (51092) */
+    3347, /* C795 (51093) */
+    3347, /* C796 (51094) */
+    3347, /* C797 (51095) */
+    3347, /* C798 (51096) */
+    3347, /* C799 (51097) */
+    3347, /* C79A (51098) */
+    3347, /* C79B (51099) */
+    3347, /* C79C (51100) */
+    3347, /* C79D (51101) */
+    3347, /* C79E (51102) */
+    3347, /* C79F (51103) */
+    3347, /* C7A0 (51104) */
+    3347, /* C7A1 (51105) */
+    3347, /* C7A2 (51106) */
+    3347, /* C7A3 (51107) */
+    3347, /* C7A4 (51108) */
+    3347, /* C7A5 (51109) */
+    3347, /* C7A6 (51110) */
+    3347, /* C7A7 (51111) */
+    3347, /* C7A8 (51112) */
+    3347, /* C7A9 (51113) */
+    3347, /* C7AA (51114) */
+    3347, /* C7AB (51115) */
+    3347, /* C7AC (51116) */
+    3347, /* C7AD (51117) */
+    3347, /* C7AE (51118) */
+    3347, /* C7AF (51119) */
+    3347, /* C7B0 (51120) */
+    3347, /* C7B1 (51121) */
+    3347, /* C7B2 (51122) */
+    3347, /* C7B3 (51123) */
+    3347, /* C7B4 (51124) */
+    3347, /* C7B5 (51125) */
+    3347, /* C7B6 (51126) */
+    3347, /* C7B7 (51127) */
+    3347, /* C7B8 (51128) */
+    3347, /* C7B9 (51129) */
+    3347, /* C7BA (51130) */
+    3347, /* C7BB (51131) */
+    3347, /* C7BC (51132) */
+    3347, /* C7BD (51133) */
+    3347, /* C7BE (51134) */
+    3347, /* C7BF (51135) */
+    3347, /* C7C0 (51136) */
+    3347, /* C7C1 (51137) */
+    3347, /* C7C2 (51138) */
+    3347, /* C7C3 (51139) */
+    3347, /* C7C4 (51140) */
+    3347, /* C7C5 (51141) */
+    3347, /* C7C6 (51142) */
+    3347, /* C7C7 (51143) */
+    3347, /* C7C8 (51144) */
+    3347, /* C7C9 (51145) */
+    3347, /* C7CA (51146) */
+    3347, /* C7CB (51147) */
+    3347, /* C7CC (51148) */
+    3347, /* C7CD (51149) */
+    3347, /* C7CE (51150) */
+    3347, /* C7CF (51151) */
+    3347, /* C7D0 (51152) */
+    3347, /* C7D1 (51153) */
+    3347, /* C7D2 (51154) */
+    3347, /* C7D3 (51155) */
+    3347, /* C7D4 (51156) */
+    3347, /* C7D5 (51157) */
+    3347, /* C7D6 (51158) */
+    3347, /* C7D7 (51159) */
+    3347, /* C7D8 (51160) */
+    3347, /* C7D9 (51161) */
+    3347, /* C7DA (51162) */
+    3347, /* C7DB (51163) */
+    3347, /* C7DC (51164) */
+    3347, /* C7DD (51165) */
+    3347, /* C7DE (51166) */
+    3347, /* C7DF (51167) */
+    3347, /* C7E0 (51168) */
+    3347, /* C7E1 (51169) */
+    3347, /* C7E2 (51170) */
+    3347, /* C7E3 (51171) */
+    3347, /* C7E4 (51172) */
+    3347, /* C7E5 (51173) */
+    3347, /* C7E6 (51174) */
+    3347, /* C7E7 (51175) */
+    3347, /* C7E8 (51176) */
+    3347, /* C7E9 (51177) */
+    3347, /* C7EA (51178) */
+    3347, /* C7EB (51179) */
+    3347, /* C7EC (51180) */
+    3347, /* C7ED (51181) */
+    3347, /* C7EE (51182) */
+    3347, /* C7EF (51183) */
+    3347, /* C7F0 (51184) */
+    3347, /* C7F1 (51185) */
+    3347, /* C7F2 (51186) */
+    3347, /* C7F3 (51187) */
+    3347, /* C7F4 (51188) */
+    3347, /* C7F5 (51189) */
+    3347, /* C7F6 (51190) */
+    3347, /* C7F7 (51191) */
+    3347, /* C7F8 (51192) */
+    3347, /* C7F9 (51193) */
+    3347, /* C7FA (51194) */
+    3347, /* C7FB (51195) */
+    3347, /* C7FC (51196) */
+    3347, /* C7FD (51197) */
+    3347, /* C7FE (51198) */
+    3347, /* C7FF (51199) */
+    3347, /* C800 (51200) */
+    3347, /* C801 (51201) */
+    3347, /* C802 (51202) */
+    3347, /* C803 (51203) */
+    3347, /* C804 (51204) */
+    3347, /* C805 (51205) */
+    3347, /* C806 (51206) */
+    3347, /* C807 (51207) */
+    3347, /* C808 (51208) */
+    3347, /* C809 (51209) */
+    3347, /* C80A (51210) */
+    3347, /* C80B (51211) */
+    3347, /* C80C (51212) */
+    3347, /* C80D (51213) */
+    3347, /* C80E (51214) */
+    3347, /* C80F (51215) */
+    3347, /* C810 (51216) */
+    3347, /* C811 (51217) */
+    3347, /* C812 (51218) */
+    3347, /* C813 (51219) */
+    3347, /* C814 (51220) */
+    3347, /* C815 (51221) */
+    3347, /* C816 (51222) */
+    3347, /* C817 (51223) */
+    3347, /* C818 (51224) */
+    3347, /* C819 (51225) */
+    3347, /* C81A (51226) */
+    3347, /* C81B (51227) */
+    3347, /* C81C (51228) */
+    3347, /* C81D (51229) */
+    3347, /* C81E (51230) */
+    3347, /* C81F (51231) */
+    3347, /* C820 (51232) */
+    3347, /* C821 (51233) */
+    3347, /* C822 (51234) */
+    3347, /* C823 (51235) */
+    3347, /* C824 (51236) */
+    3347, /* C825 (51237) */
+    3347, /* C826 (51238) */
+    3347, /* C827 (51239) */
+    3347, /* C828 (51240) */
+    3347, /* C829 (51241) */
+    3347, /* C82A (51242) */
+    3347, /* C82B (51243) */
+    3347, /* C82C (51244) */
+    3347, /* C82D (51245) */
+    3347, /* C82E (51246) */
+    3347, /* C82F (51247) */
+    3347, /* C830 (51248) */
+    3347, /* C831 (51249) */
+    3347, /* C832 (51250) */
+    3347, /* C833 (51251) */
+    3347, /* C834 (51252) */
+    3347, /* C835 (51253) */
+    3347, /* C836 (51254) */
+    3347, /* C837 (51255) */
+    3347, /* C838 (51256) */
+    3347, /* C839 (51257) */
+    3347, /* C83A (51258) */
+    3347, /* C83B (51259) */
+    3347, /* C83C (51260) */
+    3347, /* C83D (51261) */
+    3347, /* C83E (51262) */
+    3347, /* C83F (51263) */
+    3347, /* C840 (51264) */
+    3347, /* C841 (51265) */
+    3347, /* C842 (51266) */
+    3347, /* C843 (51267) */
+    3347, /* C844 (51268) */
+    3347, /* C845 (51269) */
+    3347, /* C846 (51270) */
+    3347, /* C847 (51271) */
+    3347, /* C848 (51272) */
+    3347, /* C849 (51273) */
+    3347, /* C84A (51274) */
+    3347, /* C84B (51275) */
+    3347, /* C84C (51276) */
+    3347, /* C84D (51277) */
+    3347, /* C84E (51278) */
+    3347, /* C84F (51279) */
+    3347, /* C850 (51280) */
+    3347, /* C851 (51281) */
+    3347, /* C852 (51282) */
+    3347, /* C853 (51283) */
+    3347, /* C854 (51284) */
+    3347, /* C855 (51285) */
+    3347, /* C856 (51286) */
+    3347, /* C857 (51287) */
+    3347, /* C858 (51288) */
+    3347, /* C859 (51289) */
+    3347, /* C85A (51290) */
+    3347, /* C85B (51291) */
+    3347, /* C85C (51292) */
+    3347, /* C85D (51293) */
+    3347, /* C85E (51294) */
+    3347, /* C85F (51295) */
+    3347, /* C860 (51296) */
+    3347, /* C861 (51297) */
+    3347, /* C862 (51298) */
+    3347, /* C863 (51299) */
+    3347, /* C864 (51300) */
+    3347, /* C865 (51301) */
+    3347, /* C866 (51302) */
+    3347, /* C867 (51303) */
+    3347, /* C868 (51304) */
+    3347, /* C869 (51305) */
+    3347, /* C86A (51306) */
+    3347, /* C86B (51307) */
+    3347, /* C86C (51308) */
+    3347, /* C86D (51309) */
+    3347, /* C86E (51310) */
+    3347, /* C86F (51311) */
+    3347, /* C870 (51312) */
+    3347, /* C871 (51313) */
+    3347, /* C872 (51314) */
+    3347, /* C873 (51315) */
+    3347, /* C874 (51316) */
+    3347, /* C875 (51317) */
+    3347, /* C876 (51318) */
+    3347, /* C877 (51319) */
+    3347, /* C878 (51320) */
+    3347, /* C879 (51321) */
+    3347, /* C87A (51322) */
+    3347, /* C87B (51323) */
+    3347, /* C87C (51324) */
+    3347, /* C87D (51325) */
+    3347, /* C87E (51326) */
+    3347, /* C87F (51327) */
+    3347, /* C880 (51328) */
+    3347, /* C881 (51329) */
+    3347, /* C882 (51330) */
+    3347, /* C883 (51331) */
+    3347, /* C884 (51332) */
+    3347, /* C885 (51333) */
+    3347, /* C886 (51334) */
+    3347, /* C887 (51335) */
+    3347, /* C888 (51336) */
+    3347, /* C889 (51337) */
+    3347, /* C88A (51338) */
+    3347, /* C88B (51339) */
+    3347, /* C88C (51340) */
+    3347, /* C88D (51341) */
+    3347, /* C88E (51342) */
+    3347, /* C88F (51343) */
+    3347, /* C890 (51344) */
+    3347, /* C891 (51345) */
+    3347, /* C892 (51346) */
+    3347, /* C893 (51347) */
+    3347, /* C894 (51348) */
+    3347, /* C895 (51349) */
+    3347, /* C896 (51350) */
+    3347, /* C897 (51351) */
+    3347, /* C898 (51352) */
+    3347, /* C899 (51353) */
+    3347, /* C89A (51354) */
+    3347, /* C89B (51355) */
+    3347, /* C89C (51356) */
+    3347, /* C89D (51357) */
+    3347, /* C89E (51358) */
+    3347, /* C89F (51359) */
+    3347, /* C8A0 (51360) */
+    3347, /* C8A1 (51361) */
+    3347, /* C8A2 (51362) */
+    3347, /* C8A3 (51363) */
+    3347, /* C8A4 (51364) */
+    3347, /* C8A5 (51365) */
+    3347, /* C8A6 (51366) */
+    3347, /* C8A7 (51367) */
+    3347, /* C8A8 (51368) */
+    3347, /* C8A9 (51369) */
+    3347, /* C8AA (51370) */
+    3347, /* C8AB (51371) */
+    3347, /* C8AC (51372) */
+    3347, /* C8AD (51373) */
+    3347, /* C8AE (51374) */
+    3347, /* C8AF (51375) */
+    3347, /* C8B0 (51376) */
+    3347, /* C8B1 (51377) */
+    3347, /* C8B2 (51378) */
+    3347, /* C8B3 (51379) */
+    3347, /* C8B4 (51380) */
+    3347, /* C8B5 (51381) */
+    3347, /* C8B6 (51382) */
+    3347, /* C8B7 (51383) */
+    3347, /* C8B8 (51384) */
+    3347, /* C8B9 (51385) */
+    3347, /* C8BA (51386) */
+    3347, /* C8BB (51387) */
+    3347, /* C8BC (51388) */
+    3347, /* C8BD (51389) */
+    3347, /* C8BE (51390) */
+    3347, /* C8BF (51391) */
+    3347, /* C8C0 (51392) */
+    3347, /* C8C1 (51393) */
+    3347, /* C8C2 (51394) */
+    3347, /* C8C3 (51395) */
+    3347, /* C8C4 (51396) */
+    3347, /* C8C5 (51397) */
+    3347, /* C8C6 (51398) */
+    3347, /* C8C7 (51399) */
+    3347, /* C8C8 (51400) */
+    3347, /* C8C9 (51401) */
+    3347, /* C8CA (51402) */
+    3347, /* C8CB (51403) */
+    3347, /* C8CC (51404) */
+    3347, /* C8CD (51405) */
+    3347, /* C8CE (51406) */
+    3347, /* C8CF (51407) */
+    3347, /* C8D0 (51408) */
+    3347, /* C8D1 (51409) */
+    3347, /* C8D2 (51410) */
+    3347, /* C8D3 (51411) */
+    3347, /* C8D4 (51412) */
+    3347, /* C8D5 (51413) */
+    3347, /* C8D6 (51414) */
+    3347, /* C8D7 (51415) */
+    3347, /* C8D8 (51416) */
+    3347, /* C8D9 (51417) */
+    3347, /* C8DA (51418) */
+    3347, /* C8DB (51419) */
+    3347, /* C8DC (51420) */
+    3347, /* C8DD (51421) */
+    3347, /* C8DE (51422) */
+    3347, /* C8DF (51423) */
+    3347, /* C8E0 (51424) */
+    3347, /* C8E1 (51425) */
+    3347, /* C8E2 (51426) */
+    3347, /* C8E3 (51427) */
+    3347, /* C8E4 (51428) */
+    3347, /* C8E5 (51429) */
+    3347, /* C8E6 (51430) */
+    3347, /* C8E7 (51431) */
+    3347, /* C8E8 (51432) */
+    3347, /* C8E9 (51433) */
+    3347, /* C8EA (51434) */
+    3347, /* C8EB (51435) */
+    3347, /* C8EC (51436) */
+    3347, /* C8ED (51437) */
+    3347, /* C8EE (51438) */
+    3347, /* C8EF (51439) */
+    3347, /* C8F0 (51440) */
+    3347, /* C8F1 (51441) */
+    3347, /* C8F2 (51442) */
+    3347, /* C8F3 (51443) */
+    3347, /* C8F4 (51444) */
+    3347, /* C8F5 (51445) */
+    3347, /* C8F6 (51446) */
+    3347, /* C8F7 (51447) */
+    3347, /* C8F8 (51448) */
+    3347, /* C8F9 (51449) */
+    3347, /* C8FA (51450) */
+    3347, /* C8FB (51451) */
+    3347, /* C8FC (51452) */
+    3347, /* C8FD (51453) */
+    3347, /* C8FE (51454) */
+    3347, /* C8FF (51455) */
+    3347, /* C900 (51456) */
+    3347, /* C901 (51457) */
+    3347, /* C902 (51458) */
+    3347, /* C903 (51459) */
+    3347, /* C904 (51460) */
+    3347, /* C905 (51461) */
+    3347, /* C906 (51462) */
+    3347, /* C907 (51463) */
+    3347, /* C908 (51464) */
+    3347, /* C909 (51465) */
+    3347, /* C90A (51466) */
+    3347, /* C90B (51467) */
+    3347, /* C90C (51468) */
+    3347, /* C90D (51469) */
+    3347, /* C90E (51470) */
+    3347, /* C90F (51471) */
+    3347, /* C910 (51472) */
+    3347, /* C911 (51473) */
+    3347, /* C912 (51474) */
+    3347, /* C913 (51475) */
+    3347, /* C914 (51476) */
+    3347, /* C915 (51477) */
+    3347, /* C916 (51478) */
+    3347, /* C917 (51479) */
+    3347, /* C918 (51480) */
+    3347, /* C919 (51481) */
+    3347, /* C91A (51482) */
+    3347, /* C91B (51483) */
+    3347, /* C91C (51484) */
+    3347, /* C91D (51485) */
+    3347, /* C91E (51486) */
+    3347, /* C91F (51487) */
+    3347, /* C920 (51488) */
+    3347, /* C921 (51489) */
+    3347, /* C922 (51490) */
+    3347, /* C923 (51491) */
+    3347, /* C924 (51492) */
+    3347, /* C925 (51493) */
+    3347, /* C926 (51494) */
+    3347, /* C927 (51495) */
+    3347, /* C928 (51496) */
+    3347, /* C929 (51497) */
+    3347, /* C92A (51498) */
+    3347, /* C92B (51499) */
+    3347, /* C92C (51500) */
+    3347, /* C92D (51501) */
+    3347, /* C92E (51502) */
+    3347, /* C92F (51503) */
+    3347, /* C930 (51504) */
+    3347, /* C931 (51505) */
+    3347, /* C932 (51506) */
+    3347, /* C933 (51507) */
+    3347, /* C934 (51508) */
+    3347, /* C935 (51509) */
+    3347, /* C936 (51510) */
+    3347, /* C937 (51511) */
+    3347, /* C938 (51512) */
+    3347, /* C939 (51513) */
+    3347, /* C93A (51514) */
+    3347, /* C93B (51515) */
+    3347, /* C93C (51516) */
+    3347, /* C93D (51517) */
+    3347, /* C93E (51518) */
+    3347, /* C93F (51519) */
+    3347, /* C940 (51520) */
+    3347, /* C941 (51521) */
+    3347, /* C942 (51522) */
+    3347, /* C943 (51523) */
+    3347, /* C944 (51524) */
+    3347, /* C945 (51525) */
+    3347, /* C946 (51526) */
+    3347, /* C947 (51527) */
+    3347, /* C948 (51528) */
+    3347, /* C949 (51529) */
+    3347, /* C94A (51530) */
+    3347, /* C94B (51531) */
+    3347, /* C94C (51532) */
+    3347, /* C94D (51533) */
+    3347, /* C94E (51534) */
+    3347, /* C94F (51535) */
+    3347, /* C950 (51536) */
+    3347, /* C951 (51537) */
+    3347, /* C952 (51538) */
+    3347, /* C953 (51539) */
+    3347, /* C954 (51540) */
+    3347, /* C955 (51541) */
+    3347, /* C956 (51542) */
+    3347, /* C957 (51543) */
+    3347, /* C958 (51544) */
+    3347, /* C959 (51545) */
+    3347, /* C95A (51546) */
+    3347, /* C95B (51547) */
+    3347, /* C95C (51548) */
+    3347, /* C95D (51549) */
+    3347, /* C95E (51550) */
+    3347, /* C95F (51551) */
+    3347, /* C960 (51552) */
+    3347, /* C961 (51553) */
+    3347, /* C962 (51554) */
+    3347, /* C963 (51555) */
+    3347, /* C964 (51556) */
+    3347, /* C965 (51557) */
+    3347, /* C966 (51558) */
+    3347, /* C967 (51559) */
+    3347, /* C968 (51560) */
+    3347, /* C969 (51561) */
+    3347, /* C96A (51562) */
+    3347, /* C96B (51563) */
+    3347, /* C96C (51564) */
+    3347, /* C96D (51565) */
+    3347, /* C96E (51566) */
+    3347, /* C96F (51567) */
+    3347, /* C970 (51568) */
+    3347, /* C971 (51569) */
+    3347, /* C972 (51570) */
+    3347, /* C973 (51571) */
+    3347, /* C974 (51572) */
+    3347, /* C975 (51573) */
+    3347, /* C976 (51574) */
+    3347, /* C977 (51575) */
+    3347, /* C978 (51576) */
+    3347, /* C979 (51577) */
+    3347, /* C97A (51578) */
+    3347, /* C97B (51579) */
+    3347, /* C97C (51580) */
+    3347, /* C97D (51581) */
+    3347, /* C97E (51582) */
+    3347, /* C97F (51583) */
+    3347, /* C980 (51584) */
+    3347, /* C981 (51585) */
+    3347, /* C982 (51586) */
+    3347, /* C983 (51587) */
+    3347, /* C984 (51588) */
+    3347, /* C985 (51589) */
+    3347, /* C986 (51590) */
+    3347, /* C987 (51591) */
+    3347, /* C988 (51592) */
+    3347, /* C989 (51593) */
+    3347, /* C98A (51594) */
+    3347, /* C98B (51595) */
+    3347, /* C98C (51596) */
+    3347, /* C98D (51597) */
+    3347, /* C98E (51598) */
+    3347, /* C98F (51599) */
+    3347, /* C990 (51600) */
+    3347, /* C991 (51601) */
+    3347, /* C992 (51602) */
+    3347, /* C993 (51603) */
+    3347, /* C994 (51604) */
+    3347, /* C995 (51605) */
+    3347, /* C996 (51606) */
+    3347, /* C997 (51607) */
+    3347, /* C998 (51608) */
+    3347, /* C999 (51609) */
+    3347, /* C99A (51610) */
+    3347, /* C99B (51611) */
+    3347, /* C99C (51612) */
+    3347, /* C99D (51613) */
+    3347, /* C99E (51614) */
+    3347, /* C99F (51615) */
+    3347, /* C9A0 (51616) */
+    3347, /* C9A1 (51617) */
+    3347, /* C9A2 (51618) */
+    3347, /* C9A3 (51619) */
+    3347, /* C9A4 (51620) */
+    3347, /* C9A5 (51621) */
+    3347, /* C9A6 (51622) */
+    3347, /* C9A7 (51623) */
+    3347, /* C9A8 (51624) */
+    3347, /* C9A9 (51625) */
+    3347, /* C9AA (51626) */
+    3347, /* C9AB (51627) */
+    3347, /* C9AC (51628) */
+    3347, /* C9AD (51629) */
+    3347, /* C9AE (51630) */
+    3347, /* C9AF (51631) */
+    3347, /* C9B0 (51632) */
+    3347, /* C9B1 (51633) */
+    3347, /* C9B2 (51634) */
+    3347, /* C9B3 (51635) */
+    3347, /* C9B4 (51636) */
+    3347, /* C9B5 (51637) */
+    3347, /* C9B6 (51638) */
+    3347, /* C9B7 (51639) */
+    3347, /* C9B8 (51640) */
+    3347, /* C9B9 (51641) */
+    3347, /* C9BA (51642) */
+    3347, /* C9BB (51643) */
+    3347, /* C9BC (51644) */
+    3347, /* C9BD (51645) */
+    3347, /* C9BE (51646) */
+    3347, /* C9BF (51647) */
+    3347, /* C9C0 (51648) */
+    3347, /* C9C1 (51649) */
+    3347, /* C9C2 (51650) */
+    3347, /* C9C3 (51651) */
+    3347, /* C9C4 (51652) */
+    3347, /* C9C5 (51653) */
+    3347, /* C9C6 (51654) */
+    3347, /* C9C7 (51655) */
+    3347, /* C9C8 (51656) */
+    3347, /* C9C9 (51657) */
+    3347, /* C9CA (51658) */
+    3347, /* C9CB (51659) */
+    3347, /* C9CC (51660) */
+    3347, /* C9CD (51661) */
+    3347, /* C9CE (51662) */
+    3347, /* C9CF (51663) */
+    3347, /* C9D0 (51664) */
+    3347, /* C9D1 (51665) */
+    3347, /* C9D2 (51666) */
+    3347, /* C9D3 (51667) */
+    3347, /* C9D4 (51668) */
+    3347, /* C9D5 (51669) */
+    3347, /* C9D6 (51670) */
+    3347, /* C9D7 (51671) */
+    3347, /* C9D8 (51672) */
+    3347, /* C9D9 (51673) */
+    3347, /* C9DA (51674) */
+    3347, /* C9DB (51675) */
+    3347, /* C9DC (51676) */
+    3347, /* C9DD (51677) */
+    3347, /* C9DE (51678) */
+    3347, /* C9DF (51679) */
+    3347, /* C9E0 (51680) */
+    3347, /* C9E1 (51681) */
+    3347, /* C9E2 (51682) */
+    3347, /* C9E3 (51683) */
+    3347, /* C9E4 (51684) */
+    3347, /* C9E5 (51685) */
+    3347, /* C9E6 (51686) */
+    3347, /* C9E7 (51687) */
+    3347, /* C9E8 (51688) */
+    3347, /* C9E9 (51689) */
+    3347, /* C9EA (51690) */
+    3347, /* C9EB (51691) */
+    3347, /* C9EC (51692) */
+    3347, /* C9ED (51693) */
+    3347, /* C9EE (51694) */
+    3347, /* C9EF (51695) */
+    3347, /* C9F0 (51696) */
+    3347, /* C9F1 (51697) */
+    3347, /* C9F2 (51698) */
+    3347, /* C9F3 (51699) */
+    3347, /* C9F4 (51700) */
+    3347, /* C9F5 (51701) */
+    3347, /* C9F6 (51702) */
+    3347, /* C9F7 (51703) */
+    3347, /* C9F8 (51704) */
+    3347, /* C9F9 (51705) */
+    3347, /* C9FA (51706) */
+    3347, /* C9FB (51707) */
+    3347, /* C9FC (51708) */
+    3347, /* C9FD (51709) */
+    3347, /* C9FE (51710) */
+    3347, /* C9FF (51711) */
+    3347, /* CA00 (51712) */
+    3347, /* CA01 (51713) */
+    3347, /* CA02 (51714) */
+    3347, /* CA03 (51715) */
+    3347, /* CA04 (51716) */
+    3347, /* CA05 (51717) */
+    3347, /* CA06 (51718) */
+    3347, /* CA07 (51719) */
+    3347, /* CA08 (51720) */
+    3347, /* CA09 (51721) */
+    3347, /* CA0A (51722) */
+    3347, /* CA0B (51723) */
+    3347, /* CA0C (51724) */
+    3347, /* CA0D (51725) */
+    3347, /* CA0E (51726) */
+    3347, /* CA0F (51727) */
+    3347, /* CA10 (51728) */
+    3347, /* CA11 (51729) */
+    3347, /* CA12 (51730) */
+    3347, /* CA13 (51731) */
+    3347, /* CA14 (51732) */
+    3347, /* CA15 (51733) */
+    3347, /* CA16 (51734) */
+    3347, /* CA17 (51735) */
+    3347, /* CA18 (51736) */
+    3347, /* CA19 (51737) */
+    3347, /* CA1A (51738) */
+    3347, /* CA1B (51739) */
+    3347, /* CA1C (51740) */
+    3347, /* CA1D (51741) */
+    3347, /* CA1E (51742) */
+    3347, /* CA1F (51743) */
+    3347, /* CA20 (51744) */
+    3347, /* CA21 (51745) */
+    3347, /* CA22 (51746) */
+    3347, /* CA23 (51747) */
+    3347, /* CA24 (51748) */
+    3347, /* CA25 (51749) */
+    3347, /* CA26 (51750) */
+    3347, /* CA27 (51751) */
+    3347, /* CA28 (51752) */
+    3347, /* CA29 (51753) */
+    3347, /* CA2A (51754) */
+    3347, /* CA2B (51755) */
+    3347, /* CA2C (51756) */
+    3347, /* CA2D (51757) */
+    3347, /* CA2E (51758) */
+    3347, /* CA2F (51759) */
+    3347, /* CA30 (51760) */
+    3347, /* CA31 (51761) */
+    3347, /* CA32 (51762) */
+    3347, /* CA33 (51763) */
+    3347, /* CA34 (51764) */
+    3347, /* CA35 (51765) */
+    3347, /* CA36 (51766) */
+    3347, /* CA37 (51767) */
+    3347, /* CA38 (51768) */
+    3347, /* CA39 (51769) */
+    3347, /* CA3A (51770) */
+    3347, /* CA3B (51771) */
+    3347, /* CA3C (51772) */
+    3347, /* CA3D (51773) */
+    3347, /* CA3E (51774) */
+    3347, /* CA3F (51775) */
+    3347, /* CA40 (51776) */
+    3347, /* CA41 (51777) */
+    3347, /* CA42 (51778) */
+    3347, /* CA43 (51779) */
+    3347, /* CA44 (51780) */
+    3347, /* CA45 (51781) */
+    3347, /* CA46 (51782) */
+    3347, /* CA47 (51783) */
+    3347, /* CA48 (51784) */
+    3347, /* CA49 (51785) */
+    3347, /* CA4A (51786) */
+    3347, /* CA4B (51787) */
+    3347, /* CA4C (51788) */
+    3347, /* CA4D (51789) */
+    3347, /* CA4E (51790) */
+    3347, /* CA4F (51791) */
+    3347, /* CA50 (51792) */
+    3347, /* CA51 (51793) */
+    3347, /* CA52 (51794) */
+    3347, /* CA53 (51795) */
+    3347, /* CA54 (51796) */
+    3347, /* CA55 (51797) */
+    3347, /* CA56 (51798) */
+    3347, /* CA57 (51799) */
+    3347, /* CA58 (51800) */
+    3347, /* CA59 (51801) */
+    3347, /* CA5A (51802) */
+    3347, /* CA5B (51803) */
+    3347, /* CA5C (51804) */
+    3347, /* CA5D (51805) */
+    3347, /* CA5E (51806) */
+    3347, /* CA5F (51807) */
+    3347, /* CA60 (51808) */
+    3347, /* CA61 (51809) */
+    3347, /* CA62 (51810) */
+    3347, /* CA63 (51811) */
+    3347, /* CA64 (51812) */
+    3347, /* CA65 (51813) */
+    3347, /* CA66 (51814) */
+    3347, /* CA67 (51815) */
+    3347, /* CA68 (51816) */
+    3347, /* CA69 (51817) */
+    3347, /* CA6A (51818) */
+    3347, /* CA6B (51819) */
+    3347, /* CA6C (51820) */
+    3347, /* CA6D (51821) */
+    3347, /* CA6E (51822) */
+    3347, /* CA6F (51823) */
+    3347, /* CA70 (51824) */
+    3347, /* CA71 (51825) */
+    3347, /* CA72 (51826) */
+    3347, /* CA73 (51827) */
+    3347, /* CA74 (51828) */
+    3347, /* CA75 (51829) */
+    3347, /* CA76 (51830) */
+    3347, /* CA77 (51831) */
+    3347, /* CA78 (51832) */
+    3347, /* CA79 (51833) */
+    3347, /* CA7A (51834) */
+    3347, /* CA7B (51835) */
+    3347, /* CA7C (51836) */
+    3347, /* CA7D (51837) */
+    3347, /* CA7E (51838) */
+    3347, /* CA7F (51839) */
+    3347, /* CA80 (51840) */
+    3347, /* CA81 (51841) */
+    3347, /* CA82 (51842) */
+    3347, /* CA83 (51843) */
+    3347, /* CA84 (51844) */
+    3347, /* CA85 (51845) */
+    3347, /* CA86 (51846) */
+    3347, /* CA87 (51847) */
+    3347, /* CA88 (51848) */
+    3347, /* CA89 (51849) */
+    3347, /* CA8A (51850) */
+    3347, /* CA8B (51851) */
+    3347, /* CA8C (51852) */
+    3347, /* CA8D (51853) */
+    3347, /* CA8E (51854) */
+    3347, /* CA8F (51855) */
+    3347, /* CA90 (51856) */
+    3347, /* CA91 (51857) */
+    3347, /* CA92 (51858) */
+    3347, /* CA93 (51859) */
+    3347, /* CA94 (51860) */
+    3347, /* CA95 (51861) */
+    3347, /* CA96 (51862) */
+    3347, /* CA97 (51863) */
+    3347, /* CA98 (51864) */
+    3347, /* CA99 (51865) */
+    3347, /* CA9A (51866) */
+    3347, /* CA9B (51867) */
+    3347, /* CA9C (51868) */
+    3347, /* CA9D (51869) */
+    3347, /* CA9E (51870) */
+    3347, /* CA9F (51871) */
+    3347, /* CAA0 (51872) */
+    3347, /* CAA1 (51873) */
+    3347, /* CAA2 (51874) */
+    3347, /* CAA3 (51875) */
+    3347, /* CAA4 (51876) */
+    3347, /* CAA5 (51877) */
+    3347, /* CAA6 (51878) */
+    3347, /* CAA7 (51879) */
+    3347, /* CAA8 (51880) */
+    3347, /* CAA9 (51881) */
+    3347, /* CAAA (51882) */
+    3347, /* CAAB (51883) */
+    3347, /* CAAC (51884) */
+    3347, /* CAAD (51885) */
+    3347, /* CAAE (51886) */
+    3347, /* CAAF (51887) */
+    3347, /* CAB0 (51888) */
+    3347, /* CAB1 (51889) */
+    3347, /* CAB2 (51890) */
+    3347, /* CAB3 (51891) */
+    3347, /* CAB4 (51892) */
+    3347, /* CAB5 (51893) */
+    3347, /* CAB6 (51894) */
+    3347, /* CAB7 (51895) */
+    3347, /* CAB8 (51896) */
+    3347, /* CAB9 (51897) */
+    3347, /* CABA (51898) */
+    3347, /* CABB (51899) */
+    3347, /* CABC (51900) */
+    3347, /* CABD (51901) */
+    3347, /* CABE (51902) */
+    3347, /* CABF (51903) */
+    3347, /* CAC0 (51904) */
+    3347, /* CAC1 (51905) */
+    3347, /* CAC2 (51906) */
+    3347, /* CAC3 (51907) */
+    3347, /* CAC4 (51908) */
+    3347, /* CAC5 (51909) */
+    3347, /* CAC6 (51910) */
+    3347, /* CAC7 (51911) */
+    3347, /* CAC8 (51912) */
+    3347, /* CAC9 (51913) */
+    3347, /* CACA (51914) */
+    3347, /* CACB (51915) */
+    3347, /* CACC (51916) */
+    3347, /* CACD (51917) */
+    3347, /* CACE (51918) */
+    3347, /* CACF (51919) */
+    3347, /* CAD0 (51920) */
+    3347, /* CAD1 (51921) */
+    3347, /* CAD2 (51922) */
+    3347, /* CAD3 (51923) */
+    3347, /* CAD4 (51924) */
+    3347, /* CAD5 (51925) */
+    3347, /* CAD6 (51926) */
+    3347, /* CAD7 (51927) */
+    3347, /* CAD8 (51928) */
+    3347, /* CAD9 (51929) */
+    3347, /* CADA (51930) */
+    3347, /* CADB (51931) */
+    3347, /* CADC (51932) */
+    3347, /* CADD (51933) */
+    3347, /* CADE (51934) */
+    3347, /* CADF (51935) */
+    3347, /* CAE0 (51936) */
+    3347, /* CAE1 (51937) */
+    3347, /* CAE2 (51938) */
+    3347, /* CAE3 (51939) */
+    3347, /* CAE4 (51940) */
+    3347, /* CAE5 (51941) */
+    3347, /* CAE6 (51942) */
+    3347, /* CAE7 (51943) */
+    3347, /* CAE8 (51944) */
+    3347, /* CAE9 (51945) */
+    3347, /* CAEA (51946) */
+    3347, /* CAEB (51947) */
+    3347, /* CAEC (51948) */
+    3347, /* CAED (51949) */
+    3347, /* CAEE (51950) */
+    3347, /* CAEF (51951) */
+    3347, /* CAF0 (51952) */
+    3347, /* CAF1 (51953) */
+    3347, /* CAF2 (51954) */
+    3347, /* CAF3 (51955) */
+    3347, /* CAF4 (51956) */
+    3347, /* CAF5 (51957) */
+    3347, /* CAF6 (51958) */
+    3347, /* CAF7 (51959) */
+    3347, /* CAF8 (51960) */
+    3347, /* CAF9 (51961) */
+    3347, /* CAFA (51962) */
+    3347, /* CAFB (51963) */
+    3347, /* CAFC (51964) */
+    3347, /* CAFD (51965) */
+    3347, /* CAFE (51966) */
+    3347, /* CAFF (51967) */
+    3347, /* CB00 (51968) */
+    3347, /* CB01 (51969) */
+    3347, /* CB02 (51970) */
+    3347, /* CB03 (51971) */
+    3347, /* CB04 (51972) */
+    3347, /* CB05 (51973) */
+    3347, /* CB06 (51974) */
+    3347, /* CB07 (51975) */
+    3347, /* CB08 (51976) */
+    3347, /* CB09 (51977) */
+    3347, /* CB0A (51978) */
+    3347, /* CB0B (51979) */
+    3347, /* CB0C (51980) */
+    3347, /* CB0D (51981) */
+    3347, /* CB0E (51982) */
+    3347, /* CB0F (51983) */
+    3347, /* CB10 (51984) */
+    3347, /* CB11 (51985) */
+    3347, /* CB12 (51986) */
+    3347, /* CB13 (51987) */
+    3347, /* CB14 (51988) */
+    3347, /* CB15 (51989) */
+    3347, /* CB16 (51990) */
+    3347, /* CB17 (51991) */
+    3347, /* CB18 (51992) */
+    3347, /* CB19 (51993) */
+    3347, /* CB1A (51994) */
+    3347, /* CB1B (51995) */
+    3347, /* CB1C (51996) */
+    3347, /* CB1D (51997) */
+    3347, /* CB1E (51998) */
+    3347, /* CB1F (51999) */
+    3347, /* CB20 (52000) */
+    3347, /* CB21 (52001) */
+    3347, /* CB22 (52002) */
+    3347, /* CB23 (52003) */
+    3347, /* CB24 (52004) */
+    3347, /* CB25 (52005) */
+    3347, /* CB26 (52006) */
+    3347, /* CB27 (52007) */
+    3347, /* CB28 (52008) */
+    3347, /* CB29 (52009) */
+    3347, /* CB2A (52010) */
+    3347, /* CB2B (52011) */
+    3347, /* CB2C (52012) */
+    3347, /* CB2D (52013) */
+    3347, /* CB2E (52014) */
+    3347, /* CB2F (52015) */
+    3347, /* CB30 (52016) */
+    3347, /* CB31 (52017) */
+    3347, /* CB32 (52018) */
+    3347, /* CB33 (52019) */
+    3347, /* CB34 (52020) */
+    3347, /* CB35 (52021) */
+    3347, /* CB36 (52022) */
+    3347, /* CB37 (52023) */
+    3347, /* CB38 (52024) */
+    3347, /* CB39 (52025) */
+    3347, /* CB3A (52026) */
+    3347, /* CB3B (52027) */
+    3347, /* CB3C (52028) */
+    3347, /* CB3D (52029) */
+    3347, /* CB3E (52030) */
+    3347, /* CB3F (52031) */
+    3347, /* CB40 (52032) */
+    3347, /* CB41 (52033) */
+    3347, /* CB42 (52034) */
+    3347, /* CB43 (52035) */
+    3347, /* CB44 (52036) */
+    3347, /* CB45 (52037) */
+    3347, /* CB46 (52038) */
+    3347, /* CB47 (52039) */
+    3347, /* CB48 (52040) */
+    3347, /* CB49 (52041) */
+    3347, /* CB4A (52042) */
+    3347, /* CB4B (52043) */
+    3347, /* CB4C (52044) */
+    3347, /* CB4D (52045) */
+    3347, /* CB4E (52046) */
+    3347, /* CB4F (52047) */
+    3347, /* CB50 (52048) */
+    3347, /* CB51 (52049) */
+    3347, /* CB52 (52050) */
+    3347, /* CB53 (52051) */
+    3347, /* CB54 (52052) */
+    3347, /* CB55 (52053) */
+    3347, /* CB56 (52054) */
+    3347, /* CB57 (52055) */
+    3347, /* CB58 (52056) */
+    3347, /* CB59 (52057) */
+    3347, /* CB5A (52058) */
+    3347, /* CB5B (52059) */
+    3347, /* CB5C (52060) */
+    3347, /* CB5D (52061) */
+    3347, /* CB5E (52062) */
+    3347, /* CB5F (52063) */
+    3347, /* CB60 (52064) */
+    3347, /* CB61 (52065) */
+    3347, /* CB62 (52066) */
+    3347, /* CB63 (52067) */
+    3347, /* CB64 (52068) */
+    3347, /* CB65 (52069) */
+    3347, /* CB66 (52070) */
+    3347, /* CB67 (52071) */
+    3347, /* CB68 (52072) */
+    3347, /* CB69 (52073) */
+    3347, /* CB6A (52074) */
+    3347, /* CB6B (52075) */
+    3347, /* CB6C (52076) */
+    3347, /* CB6D (52077) */
+    3347, /* CB6E (52078) */
+    3347, /* CB6F (52079) */
+    3347, /* CB70 (52080) */
+    3347, /* CB71 (52081) */
+    3347, /* CB72 (52082) */
+    3347, /* CB73 (52083) */
+    3347, /* CB74 (52084) */
+    3347, /* CB75 (52085) */
+    3347, /* CB76 (52086) */
+    3347, /* CB77 (52087) */
+    3347, /* CB78 (52088) */
+    3347, /* CB79 (52089) */
+    3347, /* CB7A (52090) */
+    3347, /* CB7B (52091) */
+    3347, /* CB7C (52092) */
+    3347, /* CB7D (52093) */
+    3347, /* CB7E (52094) */
+    3347, /* CB7F (52095) */
+    3347, /* CB80 (52096) */
+    3347, /* CB81 (52097) */
+    3347, /* CB82 (52098) */
+    3347, /* CB83 (52099) */
+    3347, /* CB84 (52100) */
+    3347, /* CB85 (52101) */
+    3347, /* CB86 (52102) */
+    3347, /* CB87 (52103) */
+    3347, /* CB88 (52104) */
+    3347, /* CB89 (52105) */
+    3347, /* CB8A (52106) */
+    3347, /* CB8B (52107) */
+    3347, /* CB8C (52108) */
+    3347, /* CB8D (52109) */
+    3347, /* CB8E (52110) */
+    3347, /* CB8F (52111) */
+    3347, /* CB90 (52112) */
+    3347, /* CB91 (52113) */
+    3347, /* CB92 (52114) */
+    3347, /* CB93 (52115) */
+    3347, /* CB94 (52116) */
+    3347, /* CB95 (52117) */
+    3347, /* CB96 (52118) */
+    3347, /* CB97 (52119) */
+    3347, /* CB98 (52120) */
+    3347, /* CB99 (52121) */
+    3347, /* CB9A (52122) */
+    3347, /* CB9B (52123) */
+    3347, /* CB9C (52124) */
+    3347, /* CB9D (52125) */
+    3347, /* CB9E (52126) */
+    3347, /* CB9F (52127) */
+    3347, /* CBA0 (52128) */
+    3347, /* CBA1 (52129) */
+    3347, /* CBA2 (52130) */
+    3347, /* CBA3 (52131) */
+    3347, /* CBA4 (52132) */
+    3347, /* CBA5 (52133) */
+    3347, /* CBA6 (52134) */
+    3347, /* CBA7 (52135) */
+    3347, /* CBA8 (52136) */
+    3347, /* CBA9 (52137) */
+    3347, /* CBAA (52138) */
+    3347, /* CBAB (52139) */
+    3347, /* CBAC (52140) */
+    3347, /* CBAD (52141) */
+    3347, /* CBAE (52142) */
+    3347, /* CBAF (52143) */
+    3347, /* CBB0 (52144) */
+    3347, /* CBB1 (52145) */
+    3347, /* CBB2 (52146) */
+    3347, /* CBB3 (52147) */
+    3347, /* CBB4 (52148) */
+    3347, /* CBB5 (52149) */
+    3347, /* CBB6 (52150) */
+    3347, /* CBB7 (52151) */
+    3347, /* CBB8 (52152) */
+    3347, /* CBB9 (52153) */
+    3347, /* CBBA (52154) */
+    3347, /* CBBB (52155) */
+    3347, /* CBBC (52156) */
+    3347, /* CBBD (52157) */
+    3347, /* CBBE (52158) */
+    3347, /* CBBF (52159) */
+    3347, /* CBC0 (52160) */
+    3347, /* CBC1 (52161) */
+    3347, /* CBC2 (52162) */
+    3347, /* CBC3 (52163) */
+    3347, /* CBC4 (52164) */
+    3347, /* CBC5 (52165) */
+    3347, /* CBC6 (52166) */
+    3347, /* CBC7 (52167) */
+    3347, /* CBC8 (52168) */
+    3347, /* CBC9 (52169) */
+    3347, /* CBCA (52170) */
+    3347, /* CBCB (52171) */
+    3347, /* CBCC (52172) */
+    3347, /* CBCD (52173) */
+    3347, /* CBCE (52174) */
+    3347, /* CBCF (52175) */
+    3347, /* CBD0 (52176) */
+    3347, /* CBD1 (52177) */
+    3347, /* CBD2 (52178) */
+    3347, /* CBD3 (52179) */
+    3347, /* CBD4 (52180) */
+    3347, /* CBD5 (52181) */
+    3347, /* CBD6 (52182) */
+    3347, /* CBD7 (52183) */
+    3347, /* CBD8 (52184) */
+    3347, /* CBD9 (52185) */
+    3347, /* CBDA (52186) */
+    3347, /* CBDB (52187) */
+    3347, /* CBDC (52188) */
+    3347, /* CBDD (52189) */
+    3347, /* CBDE (52190) */
+    3347, /* CBDF (52191) */
+    3347, /* CBE0 (52192) */
+    3347, /* CBE1 (52193) */
+    3347, /* CBE2 (52194) */
+    3347, /* CBE3 (52195) */
+    3347, /* CBE4 (52196) */
+    3347, /* CBE5 (52197) */
+    3347, /* CBE6 (52198) */
+    3347, /* CBE7 (52199) */
+    3347, /* CBE8 (52200) */
+    3347, /* CBE9 (52201) */
+    3347, /* CBEA (52202) */
+    3347, /* CBEB (52203) */
+    3347, /* CBEC (52204) */
+    3347, /* CBED (52205) */
+    3347, /* CBEE (52206) */
+    3347, /* CBEF (52207) */
+    3347, /* CBF0 (52208) */
+    3347, /* CBF1 (52209) */
+    3347, /* CBF2 (52210) */
+    3347, /* CBF3 (52211) */
+    3347, /* CBF4 (52212) */
+    3347, /* CBF5 (52213) */
+    3347, /* CBF6 (52214) */
+    3347, /* CBF7 (52215) */
+    3347, /* CBF8 (52216) */
+    3347, /* CBF9 (52217) */
+    3347, /* CBFA (52218) */
+    3347, /* CBFB (52219) */
+    3347, /* CBFC (52220) */
+    3347, /* CBFD (52221) */
+    3347, /* CBFE (52222) */
+    3347, /* CBFF (52223) */
+    3347, /* CC00 (52224) */
+    3347, /* CC01 (52225) */
+    3347, /* CC02 (52226) */
+    3347, /* CC03 (52227) */
+    3347, /* CC04 (52228) */
+    3347, /* CC05 (52229) */
+    3347, /* CC06 (52230) */
+    3347, /* CC07 (52231) */
+    3347, /* CC08 (52232) */
+    3347, /* CC09 (52233) */
+    3347, /* CC0A (52234) */
+    3347, /* CC0B (52235) */
+    3347, /* CC0C (52236) */
+    3347, /* CC0D (52237) */
+    3347, /* CC0E (52238) */
+    3347, /* CC0F (52239) */
+    3347, /* CC10 (52240) */
+    3347, /* CC11 (52241) */
+    3347, /* CC12 (52242) */
+    3347, /* CC13 (52243) */
+    3347, /* CC14 (52244) */
+    3347, /* CC15 (52245) */
+    3347, /* CC16 (52246) */
+    3347, /* CC17 (52247) */
+    3347, /* CC18 (52248) */
+    3347, /* CC19 (52249) */
+    3347, /* CC1A (52250) */
+    3347, /* CC1B (52251) */
+    3347, /* CC1C (52252) */
+    3347, /* CC1D (52253) */
+    3347, /* CC1E (52254) */
+    3347, /* CC1F (52255) */
+    3347, /* CC20 (52256) */
+    3347, /* CC21 (52257) */
+    3347, /* CC22 (52258) */
+    3347, /* CC23 (52259) */
+    3347, /* CC24 (52260) */
+    3347, /* CC25 (52261) */
+    3347, /* CC26 (52262) */
+    3347, /* CC27 (52263) */
+    3347, /* CC28 (52264) */
+    3347, /* CC29 (52265) */
+    3347, /* CC2A (52266) */
+    3347, /* CC2B (52267) */
+    3347, /* CC2C (52268) */
+    3347, /* CC2D (52269) */
+    3347, /* CC2E (52270) */
+    3347, /* CC2F (52271) */
+    3347, /* CC30 (52272) */
+    3347, /* CC31 (52273) */
+    3347, /* CC32 (52274) */
+    3347, /* CC33 (52275) */
+    3347, /* CC34 (52276) */
+    3347, /* CC35 (52277) */
+    3347, /* CC36 (52278) */
+    3347, /* CC37 (52279) */
+    3347, /* CC38 (52280) */
+    3347, /* CC39 (52281) */
+    3347, /* CC3A (52282) */
+    3347, /* CC3B (52283) */
+    3347, /* CC3C (52284) */
+    3347, /* CC3D (52285) */
+    3347, /* CC3E (52286) */
+    3347, /* CC3F (52287) */
+    3347, /* CC40 (52288) */
+    3347, /* CC41 (52289) */
+    3347, /* CC42 (52290) */
+    3347, /* CC43 (52291) */
+    3347, /* CC44 (52292) */
+    3347, /* CC45 (52293) */
+    3347, /* CC46 (52294) */
+    3347, /* CC47 (52295) */
+    3347, /* CC48 (52296) */
+    3347, /* CC49 (52297) */
+    3347, /* CC4A (52298) */
+    3347, /* CC4B (52299) */
+    3347, /* CC4C (52300) */
+    3347, /* CC4D (52301) */
+    3347, /* CC4E (52302) */
+    3347, /* CC4F (52303) */
+    3347, /* CC50 (52304) */
+    3347, /* CC51 (52305) */
+    3347, /* CC52 (52306) */
+    3347, /* CC53 (52307) */
+    3347, /* CC54 (52308) */
+    3347, /* CC55 (52309) */
+    3347, /* CC56 (52310) */
+    3347, /* CC57 (52311) */
+    3347, /* CC58 (52312) */
+    3347, /* CC59 (52313) */
+    3347, /* CC5A (52314) */
+    3347, /* CC5B (52315) */
+    3347, /* CC5C (52316) */
+    3347, /* CC5D (52317) */
+    3347, /* CC5E (52318) */
+    3347, /* CC5F (52319) */
+    3347, /* CC60 (52320) */
+    3347, /* CC61 (52321) */
+    3347, /* CC62 (52322) */
+    3347, /* CC63 (52323) */
+    3347, /* CC64 (52324) */
+    3347, /* CC65 (52325) */
+    3347, /* CC66 (52326) */
+    3347, /* CC67 (52327) */
+    3347, /* CC68 (52328) */
+    3347, /* CC69 (52329) */
+    3347, /* CC6A (52330) */
+    3347, /* CC6B (52331) */
+    3347, /* CC6C (52332) */
+    3347, /* CC6D (52333) */
+    3347, /* CC6E (52334) */
+    3347, /* CC6F (52335) */
+    3347, /* CC70 (52336) */
+    3347, /* CC71 (52337) */
+    3347, /* CC72 (52338) */
+    3347, /* CC73 (52339) */
+    3347, /* CC74 (52340) */
+    3347, /* CC75 (52341) */
+    3347, /* CC76 (52342) */
+    3347, /* CC77 (52343) */
+    3347, /* CC78 (52344) */
+    3347, /* CC79 (52345) */
+    3347, /* CC7A (52346) */
+    3347, /* CC7B (52347) */
+    3347, /* CC7C (52348) */
+    3347, /* CC7D (52349) */
+    3347, /* CC7E (52350) */
+    3347, /* CC7F (52351) */
+    3347, /* CC80 (52352) */
+    3347, /* CC81 (52353) */
+    3347, /* CC82 (52354) */
+    3347, /* CC83 (52355) */
+    3347, /* CC84 (52356) */
+    3347, /* CC85 (52357) */
+    3347, /* CC86 (52358) */
+    3347, /* CC87 (52359) */
+    3347, /* CC88 (52360) */
+    3347, /* CC89 (52361) */
+    3347, /* CC8A (52362) */
+    3347, /* CC8B (52363) */
+    3347, /* CC8C (52364) */
+    3347, /* CC8D (52365) */
+    3347, /* CC8E (52366) */
+    3347, /* CC8F (52367) */
+    3347, /* CC90 (52368) */
+    3347, /* CC91 (52369) */
+    3347, /* CC92 (52370) */
+    3347, /* CC93 (52371) */
+    3347, /* CC94 (52372) */
+    3347, /* CC95 (52373) */
+    3347, /* CC96 (52374) */
+    3347, /* CC97 (52375) */
+    3347, /* CC98 (52376) */
+    3347, /* CC99 (52377) */
+    3347, /* CC9A (52378) */
+    3347, /* CC9B (52379) */
+    3347, /* CC9C (52380) */
+    3347, /* CC9D (52381) */
+    3347, /* CC9E (52382) */
+    3347, /* CC9F (52383) */
+    3347, /* CCA0 (52384) */
+    3347, /* CCA1 (52385) */
+    3347, /* CCA2 (52386) */
+    3347, /* CCA3 (52387) */
+    3347, /* CCA4 (52388) */
+    3347, /* CCA5 (52389) */
+    3347, /* CCA6 (52390) */
+    3347, /* CCA7 (52391) */
+    3347, /* CCA8 (52392) */
+    3347, /* CCA9 (52393) */
+    3347, /* CCAA (52394) */
+    3347, /* CCAB (52395) */
+    3347, /* CCAC (52396) */
+    3347, /* CCAD (52397) */
+    3347, /* CCAE (52398) */
+    3347, /* CCAF (52399) */
+    3347, /* CCB0 (52400) */
+    3347, /* CCB1 (52401) */
+    3347, /* CCB2 (52402) */
+    3347, /* CCB3 (52403) */
+    3347, /* CCB4 (52404) */
+    3347, /* CCB5 (52405) */
+    3347, /* CCB6 (52406) */
+    3347, /* CCB7 (52407) */
+    3347, /* CCB8 (52408) */
+    3347, /* CCB9 (52409) */
+    3347, /* CCBA (52410) */
+    3347, /* CCBB (52411) */
+    3347, /* CCBC (52412) */
+    3347, /* CCBD (52413) */
+    3347, /* CCBE (52414) */
+    3347, /* CCBF (52415) */
+    3347, /* CCC0 (52416) */
+    3347, /* CCC1 (52417) */
+    3347, /* CCC2 (52418) */
+    3347, /* CCC3 (52419) */
+    3347, /* CCC4 (52420) */
+    3347, /* CCC5 (52421) */
+    3347, /* CCC6 (52422) */
+    3347, /* CCC7 (52423) */
+    3347, /* CCC8 (52424) */
+    3347, /* CCC9 (52425) */
+    3347, /* CCCA (52426) */
+    3347, /* CCCB (52427) */
+    3347, /* CCCC (52428) */
+    3347, /* CCCD (52429) */
+    3347, /* CCCE (52430) */
+    3347, /* CCCF (52431) */
+    3347, /* CCD0 (52432) */
+    3347, /* CCD1 (52433) */
+    3347, /* CCD2 (52434) */
+    3347, /* CCD3 (52435) */
+    3347, /* CCD4 (52436) */
+    3347, /* CCD5 (52437) */
+    3347, /* CCD6 (52438) */
+    3347, /* CCD7 (52439) */
+    3347, /* CCD8 (52440) */
+    3347, /* CCD9 (52441) */
+    3347, /* CCDA (52442) */
+    3347, /* CCDB (52443) */
+    3347, /* CCDC (52444) */
+    3347, /* CCDD (52445) */
+    3347, /* CCDE (52446) */
+    3347, /* CCDF (52447) */
+    3347, /* CCE0 (52448) */
+    3347, /* CCE1 (52449) */
+    3347, /* CCE2 (52450) */
+    3347, /* CCE3 (52451) */
+    3347, /* CCE4 (52452) */
+    3347, /* CCE5 (52453) */
+    3347, /* CCE6 (52454) */
+    3347, /* CCE7 (52455) */
+    3347, /* CCE8 (52456) */
+    3347, /* CCE9 (52457) */
+    3347, /* CCEA (52458) */
+    3347, /* CCEB (52459) */
+    3347, /* CCEC (52460) */
+    3347, /* CCED (52461) */
+    3347, /* CCEE (52462) */
+    3347, /* CCEF (52463) */
+    3347, /* CCF0 (52464) */
+    3347, /* CCF1 (52465) */
+    3347, /* CCF2 (52466) */
+    3347, /* CCF3 (52467) */
+    3347, /* CCF4 (52468) */
+    3347, /* CCF5 (52469) */
+    3347, /* CCF6 (52470) */
+    3347, /* CCF7 (52471) */
+    3347, /* CCF8 (52472) */
+    3347, /* CCF9 (52473) */
+    3347, /* CCFA (52474) */
+    3347, /* CCFB (52475) */
+    3347, /* CCFC (52476) */
+    3347, /* CCFD (52477) */
+    3347, /* CCFE (52478) */
+    3347, /* CCFF (52479) */
+    3347, /* CD00 (52480) */
+    3347, /* CD01 (52481) */
+    3347, /* CD02 (52482) */
+    3347, /* CD03 (52483) */
+    3347, /* CD04 (52484) */
+    3347, /* CD05 (52485) */
+    3347, /* CD06 (52486) */
+    3347, /* CD07 (52487) */
+    3347, /* CD08 (52488) */
+    3347, /* CD09 (52489) */
+    3347, /* CD0A (52490) */
+    3347, /* CD0B (52491) */
+    3347, /* CD0C (52492) */
+    3347, /* CD0D (52493) */
+    3347, /* CD0E (52494) */
+    3347, /* CD0F (52495) */
+    3347, /* CD10 (52496) */
+    3347, /* CD11 (52497) */
+    3347, /* CD12 (52498) */
+    3347, /* CD13 (52499) */
+    3347, /* CD14 (52500) */
+    3347, /* CD15 (52501) */
+    3347, /* CD16 (52502) */
+    3347, /* CD17 (52503) */
+    3347, /* CD18 (52504) */
+    3347, /* CD19 (52505) */
+    3347, /* CD1A (52506) */
+    3347, /* CD1B (52507) */
+    3347, /* CD1C (52508) */
+    3347, /* CD1D (52509) */
+    3347, /* CD1E (52510) */
+    3347, /* CD1F (52511) */
+    3347, /* CD20 (52512) */
+    3347, /* CD21 (52513) */
+    3347, /* CD22 (52514) */
+    3347, /* CD23 (52515) */
+    3347, /* CD24 (52516) */
+    3347, /* CD25 (52517) */
+    3347, /* CD26 (52518) */
+    3347, /* CD27 (52519) */
+    3347, /* CD28 (52520) */
+    3347, /* CD29 (52521) */
+    3347, /* CD2A (52522) */
+    3347, /* CD2B (52523) */
+    3347, /* CD2C (52524) */
+    3347, /* CD2D (52525) */
+    3347, /* CD2E (52526) */
+    3347, /* CD2F (52527) */
+    3347, /* CD30 (52528) */
+    3347, /* CD31 (52529) */
+    3347, /* CD32 (52530) */
+    3347, /* CD33 (52531) */
+    3347, /* CD34 (52532) */
+    3347, /* CD35 (52533) */
+    3347, /* CD36 (52534) */
+    3347, /* CD37 (52535) */
+    3347, /* CD38 (52536) */
+    3347, /* CD39 (52537) */
+    3347, /* CD3A (52538) */
+    3347, /* CD3B (52539) */
+    3347, /* CD3C (52540) */
+    3347, /* CD3D (52541) */
+    3347, /* CD3E (52542) */
+    3347, /* CD3F (52543) */
+    3347, /* CD40 (52544) */
+    3347, /* CD41 (52545) */
+    3347, /* CD42 (52546) */
+    3347, /* CD43 (52547) */
+    3347, /* CD44 (52548) */
+    3347, /* CD45 (52549) */
+    3347, /* CD46 (52550) */
+    3347, /* CD47 (52551) */
+    3347, /* CD48 (52552) */
+    3347, /* CD49 (52553) */
+    3347, /* CD4A (52554) */
+    3347, /* CD4B (52555) */
+    3347, /* CD4C (52556) */
+    3347, /* CD4D (52557) */
+    3347, /* CD4E (52558) */
+    3347, /* CD4F (52559) */
+    3347, /* CD50 (52560) */
+    3347, /* CD51 (52561) */
+    3347, /* CD52 (52562) */
+    3347, /* CD53 (52563) */
+    3347, /* CD54 (52564) */
+    3347, /* CD55 (52565) */
+    3347, /* CD56 (52566) */
+    3347, /* CD57 (52567) */
+    3347, /* CD58 (52568) */
+    3347, /* CD59 (52569) */
+    3347, /* CD5A (52570) */
+    3347, /* CD5B (52571) */
+    3347, /* CD5C (52572) */
+    3347, /* CD5D (52573) */
+    3347, /* CD5E (52574) */
+    3347, /* CD5F (52575) */
+    3347, /* CD60 (52576) */
+    3347, /* CD61 (52577) */
+    3347, /* CD62 (52578) */
+    3347, /* CD63 (52579) */
+    3347, /* CD64 (52580) */
+    3347, /* CD65 (52581) */
+    3347, /* CD66 (52582) */
+    3347, /* CD67 (52583) */
+    3347, /* CD68 (52584) */
+    3347, /* CD69 (52585) */
+    3347, /* CD6A (52586) */
+    3347, /* CD6B (52587) */
+    3347, /* CD6C (52588) */
+    3347, /* CD6D (52589) */
+    3347, /* CD6E (52590) */
+    3347, /* CD6F (52591) */
+    3347, /* CD70 (52592) */
+    3347, /* CD71 (52593) */
+    3347, /* CD72 (52594) */
+    3347, /* CD73 (52595) */
+    3347, /* CD74 (52596) */
+    3347, /* CD75 (52597) */
+    3347, /* CD76 (52598) */
+    3347, /* CD77 (52599) */
+    3347, /* CD78 (52600) */
+    3347, /* CD79 (52601) */
+    3347, /* CD7A (52602) */
+    3347, /* CD7B (52603) */
+    3347, /* CD7C (52604) */
+    3347, /* CD7D (52605) */
+    3347, /* CD7E (52606) */
+    3347, /* CD7F (52607) */
+    3347, /* CD80 (52608) */
+    3347, /* CD81 (52609) */
+    3347, /* CD82 (52610) */
+    3347, /* CD83 (52611) */
+    3347, /* CD84 (52612) */
+    3347, /* CD85 (52613) */
+    3347, /* CD86 (52614) */
+    3347, /* CD87 (52615) */
+    3347, /* CD88 (52616) */
+    3347, /* CD89 (52617) */
+    3347, /* CD8A (52618) */
+    3347, /* CD8B (52619) */
+    3347, /* CD8C (52620) */
+    3347, /* CD8D (52621) */
+    3347, /* CD8E (52622) */
+    3347, /* CD8F (52623) */
+    3347, /* CD90 (52624) */
+    3347, /* CD91 (52625) */
+    3347, /* CD92 (52626) */
+    3347, /* CD93 (52627) */
+    3347, /* CD94 (52628) */
+    3347, /* CD95 (52629) */
+    3347, /* CD96 (52630) */
+    3347, /* CD97 (52631) */
+    3347, /* CD98 (52632) */
+    3347, /* CD99 (52633) */
+    3347, /* CD9A (52634) */
+    3347, /* CD9B (52635) */
+    3347, /* CD9C (52636) */
+    3347, /* CD9D (52637) */
+    3347, /* CD9E (52638) */
+    3347, /* CD9F (52639) */
+    3347, /* CDA0 (52640) */
+    3347, /* CDA1 (52641) */
+    3347, /* CDA2 (52642) */
+    3347, /* CDA3 (52643) */
+    3347, /* CDA4 (52644) */
+    3347, /* CDA5 (52645) */
+    3347, /* CDA6 (52646) */
+    3347, /* CDA7 (52647) */
+    3347, /* CDA8 (52648) */
+    3347, /* CDA9 (52649) */
+    3347, /* CDAA (52650) */
+    3347, /* CDAB (52651) */
+    3347, /* CDAC (52652) */
+    3347, /* CDAD (52653) */
+    3347, /* CDAE (52654) */
+    3347, /* CDAF (52655) */
+    3347, /* CDB0 (52656) */
+    3347, /* CDB1 (52657) */
+    3347, /* CDB2 (52658) */
+    3347, /* CDB3 (52659) */
+    3347, /* CDB4 (52660) */
+    3347, /* CDB5 (52661) */
+    3347, /* CDB6 (52662) */
+    3347, /* CDB7 (52663) */
+    3347, /* CDB8 (52664) */
+    3347, /* CDB9 (52665) */
+    3347, /* CDBA (52666) */
+    3347, /* CDBB (52667) */
+    3347, /* CDBC (52668) */
+    3347, /* CDBD (52669) */
+    3347, /* CDBE (52670) */
+    3347, /* CDBF (52671) */
+    3347, /* CDC0 (52672) */
+    3347, /* CDC1 (52673) */
+    3347, /* CDC2 (52674) */
+    3347, /* CDC3 (52675) */
+    3347, /* CDC4 (52676) */
+    3347, /* CDC5 (52677) */
+    3347, /* CDC6 (52678) */
+    3347, /* CDC7 (52679) */
+    3347, /* CDC8 (52680) */
+    3347, /* CDC9 (52681) */
+    3347, /* CDCA (52682) */
+    3347, /* CDCB (52683) */
+    3347, /* CDCC (52684) */
+    3347, /* CDCD (52685) */
+    3347, /* CDCE (52686) */
+    3347, /* CDCF (52687) */
+    3347, /* CDD0 (52688) */
+    3347, /* CDD1 (52689) */
+    3347, /* CDD2 (52690) */
+    3347, /* CDD3 (52691) */
+    3347, /* CDD4 (52692) */
+    3347, /* CDD5 (52693) */
+    3347, /* CDD6 (52694) */
+    3347, /* CDD7 (52695) */
+    3347, /* CDD8 (52696) */
+    3347, /* CDD9 (52697) */
+    3347, /* CDDA (52698) */
+    3347, /* CDDB (52699) */
+    3347, /* CDDC (52700) */
+    3347, /* CDDD (52701) */
+    3347, /* CDDE (52702) */
+    3347, /* CDDF (52703) */
+    3347, /* CDE0 (52704) */
+    3347, /* CDE1 (52705) */
+    3347, /* CDE2 (52706) */
+    3347, /* CDE3 (52707) */
+    3347, /* CDE4 (52708) */
+    3347, /* CDE5 (52709) */
+    3347, /* CDE6 (52710) */
+    3347, /* CDE7 (52711) */
+    3347, /* CDE8 (52712) */
+    3347, /* CDE9 (52713) */
+    3347, /* CDEA (52714) */
+    3347, /* CDEB (52715) */
+    3347, /* CDEC (52716) */
+    3347, /* CDED (52717) */
+    3347, /* CDEE (52718) */
+    3347, /* CDEF (52719) */
+    3347, /* CDF0 (52720) */
+    3347, /* CDF1 (52721) */
+    3347, /* CDF2 (52722) */
+    3347, /* CDF3 (52723) */
+    3347, /* CDF4 (52724) */
+    3347, /* CDF5 (52725) */
+    3347, /* CDF6 (52726) */
+    3347, /* CDF7 (52727) */
+    3347, /* CDF8 (52728) */
+    3347, /* CDF9 (52729) */
+    3347, /* CDFA (52730) */
+    3347, /* CDFB (52731) */
+    3347, /* CDFC (52732) */
+    3347, /* CDFD (52733) */
+    3347, /* CDFE (52734) */
+    3347, /* CDFF (52735) */
+    3347, /* CE00 (52736) */
+    3347, /* CE01 (52737) */
+    3347, /* CE02 (52738) */
+    3347, /* CE03 (52739) */
+    3347, /* CE04 (52740) */
+    3347, /* CE05 (52741) */
+    3347, /* CE06 (52742) */
+    3347, /* CE07 (52743) */
+    3347, /* CE08 (52744) */
+    3347, /* CE09 (52745) */
+    3347, /* CE0A (52746) */
+    3347, /* CE0B (52747) */
+    3347, /* CE0C (52748) */
+    3347, /* CE0D (52749) */
+    3347, /* CE0E (52750) */
+    3347, /* CE0F (52751) */
+    3347, /* CE10 (52752) */
+    3347, /* CE11 (52753) */
+    3347, /* CE12 (52754) */
+    3347, /* CE13 (52755) */
+    3347, /* CE14 (52756) */
+    3347, /* CE15 (52757) */
+    3347, /* CE16 (52758) */
+    3347, /* CE17 (52759) */
+    3347, /* CE18 (52760) */
+    3347, /* CE19 (52761) */
+    3347, /* CE1A (52762) */
+    3347, /* CE1B (52763) */
+    3347, /* CE1C (52764) */
+    3347, /* CE1D (52765) */
+    3347, /* CE1E (52766) */
+    3347, /* CE1F (52767) */
+    3347, /* CE20 (52768) */
+    3347, /* CE21 (52769) */
+    3347, /* CE22 (52770) */
+    3347, /* CE23 (52771) */
+    3347, /* CE24 (52772) */
+    3347, /* CE25 (52773) */
+    3347, /* CE26 (52774) */
+    3347, /* CE27 (52775) */
+    3347, /* CE28 (52776) */
+    3347, /* CE29 (52777) */
+    3347, /* CE2A (52778) */
+    3347, /* CE2B (52779) */
+    3347, /* CE2C (52780) */
+    3347, /* CE2D (52781) */
+    3347, /* CE2E (52782) */
+    3347, /* CE2F (52783) */
+    3347, /* CE30 (52784) */
+    3347, /* CE31 (52785) */
+    3347, /* CE32 (52786) */
+    3347, /* CE33 (52787) */
+    3347, /* CE34 (52788) */
+    3347, /* CE35 (52789) */
+    3347, /* CE36 (52790) */
+    3347, /* CE37 (52791) */
+    3347, /* CE38 (52792) */
+    3347, /* CE39 (52793) */
+    3347, /* CE3A (52794) */
+    3347, /* CE3B (52795) */
+    3347, /* CE3C (52796) */
+    3347, /* CE3D (52797) */
+    3347, /* CE3E (52798) */
+    3347, /* CE3F (52799) */
+    3347, /* CE40 (52800) */
+    3347, /* CE41 (52801) */
+    3347, /* CE42 (52802) */
+    3347, /* CE43 (52803) */
+    3347, /* CE44 (52804) */
+    3347, /* CE45 (52805) */
+    3347, /* CE46 (52806) */
+    3347, /* CE47 (52807) */
+    3347, /* CE48 (52808) */
+    3347, /* CE49 (52809) */
+    3347, /* CE4A (52810) */
+    3347, /* CE4B (52811) */
+    3347, /* CE4C (52812) */
+    3347, /* CE4D (52813) */
+    3347, /* CE4E (52814) */
+    3347, /* CE4F (52815) */
+    3347, /* CE50 (52816) */
+    3347, /* CE51 (52817) */
+    3347, /* CE52 (52818) */
+    3347, /* CE53 (52819) */
+    3347, /* CE54 (52820) */
+    3347, /* CE55 (52821) */
+    3347, /* CE56 (52822) */
+    3347, /* CE57 (52823) */
+    3347, /* CE58 (52824) */
+    3347, /* CE59 (52825) */
+    3347, /* CE5A (52826) */
+    3347, /* CE5B (52827) */
+    3347, /* CE5C (52828) */
+    3347, /* CE5D (52829) */
+    3347, /* CE5E (52830) */
+    3347, /* CE5F (52831) */
+    3347, /* CE60 (52832) */
+    3347, /* CE61 (52833) */
+    3347, /* CE62 (52834) */
+    3347, /* CE63 (52835) */
+    3347, /* CE64 (52836) */
+    3347, /* CE65 (52837) */
+    3347, /* CE66 (52838) */
+    3347, /* CE67 (52839) */
+    3347, /* CE68 (52840) */
+    3347, /* CE69 (52841) */
+    3347, /* CE6A (52842) */
+    3347, /* CE6B (52843) */
+    3347, /* CE6C (52844) */
+    3347, /* CE6D (52845) */
+    3347, /* CE6E (52846) */
+    3347, /* CE6F (52847) */
+    3347, /* CE70 (52848) */
+    3347, /* CE71 (52849) */
+    3347, /* CE72 (52850) */
+    3347, /* CE73 (52851) */
+    3347, /* CE74 (52852) */
+    3347, /* CE75 (52853) */
+    3347, /* CE76 (52854) */
+    3347, /* CE77 (52855) */
+    3347, /* CE78 (52856) */
+    3347, /* CE79 (52857) */
+    3347, /* CE7A (52858) */
+    3347, /* CE7B (52859) */
+    3347, /* CE7C (52860) */
+    3347, /* CE7D (52861) */
+    3347, /* CE7E (52862) */
+    3347, /* CE7F (52863) */
+    3347, /* CE80 (52864) */
+    3347, /* CE81 (52865) */
+    3347, /* CE82 (52866) */
+    3347, /* CE83 (52867) */
+    3347, /* CE84 (52868) */
+    3347, /* CE85 (52869) */
+    3347, /* CE86 (52870) */
+    3347, /* CE87 (52871) */
+    3347, /* CE88 (52872) */
+    3347, /* CE89 (52873) */
+    3347, /* CE8A (52874) */
+    3347, /* CE8B (52875) */
+    3347, /* CE8C (52876) */
+    3347, /* CE8D (52877) */
+    3347, /* CE8E (52878) */
+    3347, /* CE8F (52879) */
+    3347, /* CE90 (52880) */
+    3347, /* CE91 (52881) */
+    3347, /* CE92 (52882) */
+    3347, /* CE93 (52883) */
+    3347, /* CE94 (52884) */
+    3347, /* CE95 (52885) */
+    3347, /* CE96 (52886) */
+    3347, /* CE97 (52887) */
+    3347, /* CE98 (52888) */
+    3347, /* CE99 (52889) */
+    3347, /* CE9A (52890) */
+    3347, /* CE9B (52891) */
+    3347, /* CE9C (52892) */
+    3347, /* CE9D (52893) */
+    3347, /* CE9E (52894) */
+    3347, /* CE9F (52895) */
+    3347, /* CEA0 (52896) */
+    3347, /* CEA1 (52897) */
+    3347, /* CEA2 (52898) */
+    3347, /* CEA3 (52899) */
+    3347, /* CEA4 (52900) */
+    3347, /* CEA5 (52901) */
+    3347, /* CEA6 (52902) */
+    3347, /* CEA7 (52903) */
+    3347, /* CEA8 (52904) */
+    3347, /* CEA9 (52905) */
+    3347, /* CEAA (52906) */
+    3347, /* CEAB (52907) */
+    3347, /* CEAC (52908) */
+    3347, /* CEAD (52909) */
+    3347, /* CEAE (52910) */
+    3347, /* CEAF (52911) */
+    3347, /* CEB0 (52912) */
+    3347, /* CEB1 (52913) */
+    3347, /* CEB2 (52914) */
+    3347, /* CEB3 (52915) */
+    3347, /* CEB4 (52916) */
+    3347, /* CEB5 (52917) */
+    3347, /* CEB6 (52918) */
+    3347, /* CEB7 (52919) */
+    3347, /* CEB8 (52920) */
+    3347, /* CEB9 (52921) */
+    3347, /* CEBA (52922) */
+    3347, /* CEBB (52923) */
+    3347, /* CEBC (52924) */
+    3347, /* CEBD (52925) */
+    3347, /* CEBE (52926) */
+    3347, /* CEBF (52927) */
+    3347, /* CEC0 (52928) */
+    3347, /* CEC1 (52929) */
+    3347, /* CEC2 (52930) */
+    3347, /* CEC3 (52931) */
+    3347, /* CEC4 (52932) */
+    3347, /* CEC5 (52933) */
+    3347, /* CEC6 (52934) */
+    3347, /* CEC7 (52935) */
+    3347, /* CEC8 (52936) */
+    3347, /* CEC9 (52937) */
+    3347, /* CECA (52938) */
+    3347, /* CECB (52939) */
+    3347, /* CECC (52940) */
+    3347, /* CECD (52941) */
+    3347, /* CECE (52942) */
+    3347, /* CECF (52943) */
+    3347, /* CED0 (52944) */
+    3347, /* CED1 (52945) */
+    3347, /* CED2 (52946) */
+    3347, /* CED3 (52947) */
+    3347, /* CED4 (52948) */
+    3347, /* CED5 (52949) */
+    3347, /* CED6 (52950) */
+    3347, /* CED7 (52951) */
+    3347, /* CED8 (52952) */
+    3347, /* CED9 (52953) */
+    3347, /* CEDA (52954) */
+    3347, /* CEDB (52955) */
+    3347, /* CEDC (52956) */
+    3347, /* CEDD (52957) */
+    3347, /* CEDE (52958) */
+    3347, /* CEDF (52959) */
+    3347, /* CEE0 (52960) */
+    3347, /* CEE1 (52961) */
+    3347, /* CEE2 (52962) */
+    3347, /* CEE3 (52963) */
+    3347, /* CEE4 (52964) */
+    3347, /* CEE5 (52965) */
+    3347, /* CEE6 (52966) */
+    3347, /* CEE7 (52967) */
+    3347, /* CEE8 (52968) */
+    3347, /* CEE9 (52969) */
+    3347, /* CEEA (52970) */
+    3347, /* CEEB (52971) */
+    3347, /* CEEC (52972) */
+    3347, /* CEED (52973) */
+    3347, /* CEEE (52974) */
+    3347, /* CEEF (52975) */
+    3347, /* CEF0 (52976) */
+    3347, /* CEF1 (52977) */
+    3347, /* CEF2 (52978) */
+    3347, /* CEF3 (52979) */
+    3347, /* CEF4 (52980) */
+    3347, /* CEF5 (52981) */
+    3347, /* CEF6 (52982) */
+    3347, /* CEF7 (52983) */
+    3347, /* CEF8 (52984) */
+    3347, /* CEF9 (52985) */
+    3347, /* CEFA (52986) */
+    3347, /* CEFB (52987) */
+    3347, /* CEFC (52988) */
+    3347, /* CEFD (52989) */
+    3347, /* CEFE (52990) */
+    3347, /* CEFF (52991) */
+    3347, /* CF00 (52992) */
+    3347, /* CF01 (52993) */
+    3347, /* CF02 (52994) */
+    3347, /* CF03 (52995) */
+    3347, /* CF04 (52996) */
+    3347, /* CF05 (52997) */
+    3347, /* CF06 (52998) */
+    3347, /* CF07 (52999) */
+    3347, /* CF08 (53000) */
+    3347, /* CF09 (53001) */
+    3347, /* CF0A (53002) */
+    3347, /* CF0B (53003) */
+    3347, /* CF0C (53004) */
+    3347, /* CF0D (53005) */
+    3347, /* CF0E (53006) */
+    3347, /* CF0F (53007) */
+    3347, /* CF10 (53008) */
+    3347, /* CF11 (53009) */
+    3347, /* CF12 (53010) */
+    3347, /* CF13 (53011) */
+    3347, /* CF14 (53012) */
+    3347, /* CF15 (53013) */
+    3347, /* CF16 (53014) */
+    3347, /* CF17 (53015) */
+    3347, /* CF18 (53016) */
+    3347, /* CF19 (53017) */
+    3347, /* CF1A (53018) */
+    3347, /* CF1B (53019) */
+    3347, /* CF1C (53020) */
+    3347, /* CF1D (53021) */
+    3347, /* CF1E (53022) */
+    3347, /* CF1F (53023) */
+    3347, /* CF20 (53024) */
+    3347, /* CF21 (53025) */
+    3347, /* CF22 (53026) */
+    3347, /* CF23 (53027) */
+    3347, /* CF24 (53028) */
+    3347, /* CF25 (53029) */
+    3347, /* CF26 (53030) */
+    3347, /* CF27 (53031) */
+    3347, /* CF28 (53032) */
+    3347, /* CF29 (53033) */
+    3347, /* CF2A (53034) */
+    3347, /* CF2B (53035) */
+    3347, /* CF2C (53036) */
+    3347, /* CF2D (53037) */
+    3347, /* CF2E (53038) */
+    3347, /* CF2F (53039) */
+    3347, /* CF30 (53040) */
+    3347, /* CF31 (53041) */
+    3347, /* CF32 (53042) */
+    3347, /* CF33 (53043) */
+    3347, /* CF34 (53044) */
+    3347, /* CF35 (53045) */
+    3347, /* CF36 (53046) */
+    3347, /* CF37 (53047) */
+    3347, /* CF38 (53048) */
+    3347, /* CF39 (53049) */
+    3347, /* CF3A (53050) */
+    3347, /* CF3B (53051) */
+    3347, /* CF3C (53052) */
+    3347, /* CF3D (53053) */
+    3347, /* CF3E (53054) */
+    3347, /* CF3F (53055) */
+    3347, /* CF40 (53056) */
+    3347, /* CF41 (53057) */
+    3347, /* CF42 (53058) */
+    3347, /* CF43 (53059) */
+    3347, /* CF44 (53060) */
+    3347, /* CF45 (53061) */
+    3347, /* CF46 (53062) */
+    3347, /* CF47 (53063) */
+    3347, /* CF48 (53064) */
+    3347, /* CF49 (53065) */
+    3347, /* CF4A (53066) */
+    3347, /* CF4B (53067) */
+    3347, /* CF4C (53068) */
+    3347, /* CF4D (53069) */
+    3347, /* CF4E (53070) */
+    3347, /* CF4F (53071) */
+    3347, /* CF50 (53072) */
+    3347, /* CF51 (53073) */
+    3347, /* CF52 (53074) */
+    3347, /* CF53 (53075) */
+    3347, /* CF54 (53076) */
+    3347, /* CF55 (53077) */
+    3347, /* CF56 (53078) */
+    3347, /* CF57 (53079) */
+    3347, /* CF58 (53080) */
+    3347, /* CF59 (53081) */
+    3347, /* CF5A (53082) */
+    3347, /* CF5B (53083) */
+    3347, /* CF5C (53084) */
+    3347, /* CF5D (53085) */
+    3347, /* CF5E (53086) */
+    3347, /* CF5F (53087) */
+    3347, /* CF60 (53088) */
+    3347, /* CF61 (53089) */
+    3347, /* CF62 (53090) */
+    3347, /* CF63 (53091) */
+    3347, /* CF64 (53092) */
+    3347, /* CF65 (53093) */
+    3347, /* CF66 (53094) */
+    3347, /* CF67 (53095) */
+    3347, /* CF68 (53096) */
+    3347, /* CF69 (53097) */
+    3347, /* CF6A (53098) */
+    3347, /* CF6B (53099) */
+    3347, /* CF6C (53100) */
+    3347, /* CF6D (53101) */
+    3347, /* CF6E (53102) */
+    3347, /* CF6F (53103) */
+    3347, /* CF70 (53104) */
+    3347, /* CF71 (53105) */
+    3347, /* CF72 (53106) */
+    3347, /* CF73 (53107) */
+    3347, /* CF74 (53108) */
+    3347, /* CF75 (53109) */
+    3347, /* CF76 (53110) */
+    3347, /* CF77 (53111) */
+    3347, /* CF78 (53112) */
+    3347, /* CF79 (53113) */
+    3347, /* CF7A (53114) */
+    3347, /* CF7B (53115) */
+    3347, /* CF7C (53116) */
+    3347, /* CF7D (53117) */
+    3347, /* CF7E (53118) */
+    3347, /* CF7F (53119) */
+    3347, /* CF80 (53120) */
+    3347, /* CF81 (53121) */
+    3347, /* CF82 (53122) */
+    3347, /* CF83 (53123) */
+    3347, /* CF84 (53124) */
+    3347, /* CF85 (53125) */
+    3347, /* CF86 (53126) */
+    3347, /* CF87 (53127) */
+    3347, /* CF88 (53128) */
+    3347, /* CF89 (53129) */
+    3347, /* CF8A (53130) */
+    3347, /* CF8B (53131) */
+    3347, /* CF8C (53132) */
+    3347, /* CF8D (53133) */
+    3347, /* CF8E (53134) */
+    3347, /* CF8F (53135) */
+    3347, /* CF90 (53136) */
+    3347, /* CF91 (53137) */
+    3347, /* CF92 (53138) */
+    3347, /* CF93 (53139) */
+    3347, /* CF94 (53140) */
+    3347, /* CF95 (53141) */
+    3347, /* CF96 (53142) */
+    3347, /* CF97 (53143) */
+    3347, /* CF98 (53144) */
+    3347, /* CF99 (53145) */
+    3347, /* CF9A (53146) */
+    3347, /* CF9B (53147) */
+    3347, /* CF9C (53148) */
+    3347, /* CF9D (53149) */
+    3347, /* CF9E (53150) */
+    3347, /* CF9F (53151) */
+    3347, /* CFA0 (53152) */
+    3347, /* CFA1 (53153) */
+    3347, /* CFA2 (53154) */
+    3347, /* CFA3 (53155) */
+    3347, /* CFA4 (53156) */
+    3347, /* CFA5 (53157) */
+    3347, /* CFA6 (53158) */
+    3347, /* CFA7 (53159) */
+    3347, /* CFA8 (53160) */
+    3347, /* CFA9 (53161) */
+    3347, /* CFAA (53162) */
+    3347, /* CFAB (53163) */
+    3347, /* CFAC (53164) */
+    3347, /* CFAD (53165) */
+    3347, /* CFAE (53166) */
+    3347, /* CFAF (53167) */
+    3347, /* CFB0 (53168) */
+    3347, /* CFB1 (53169) */
+    3347, /* CFB2 (53170) */
+    3347, /* CFB3 (53171) */
+    3347, /* CFB4 (53172) */
+    3347, /* CFB5 (53173) */
+    3347, /* CFB6 (53174) */
+    3347, /* CFB7 (53175) */
+    3347, /* CFB8 (53176) */
+    3347, /* CFB9 (53177) */
+    3347, /* CFBA (53178) */
+    3347, /* CFBB (53179) */
+    3347, /* CFBC (53180) */
+    3347, /* CFBD (53181) */
+    3347, /* CFBE (53182) */
+    3347, /* CFBF (53183) */
+    3347, /* CFC0 (53184) */
+    3347, /* CFC1 (53185) */
+    3347, /* CFC2 (53186) */
+    3347, /* CFC3 (53187) */
+    3347, /* CFC4 (53188) */
+    3347, /* CFC5 (53189) */
+    3347, /* CFC6 (53190) */
+    3347, /* CFC7 (53191) */
+    3347, /* CFC8 (53192) */
+    3347, /* CFC9 (53193) */
+    3347, /* CFCA (53194) */
+    3347, /* CFCB (53195) */
+    3347, /* CFCC (53196) */
+    3347, /* CFCD (53197) */
+    3347, /* CFCE (53198) */
+    3347, /* CFCF (53199) */
+    3347, /* CFD0 (53200) */
+    3347, /* CFD1 (53201) */
+    3347, /* CFD2 (53202) */
+    3347, /* CFD3 (53203) */
+    3347, /* CFD4 (53204) */
+    3347, /* CFD5 (53205) */
+    3347, /* CFD6 (53206) */
+    3347, /* CFD7 (53207) */
+    3347, /* CFD8 (53208) */
+    3347, /* CFD9 (53209) */
+    3347, /* CFDA (53210) */
+    3347, /* CFDB (53211) */
+    3347, /* CFDC (53212) */
+    3347, /* CFDD (53213) */
+    3347, /* CFDE (53214) */
+    3347, /* CFDF (53215) */
+    3347, /* CFE0 (53216) */
+    3347, /* CFE1 (53217) */
+    3347, /* CFE2 (53218) */
+    3347, /* CFE3 (53219) */
+    3347, /* CFE4 (53220) */
+    3347, /* CFE5 (53221) */
+    3347, /* CFE6 (53222) */
+    3347, /* CFE7 (53223) */
+    3347, /* CFE8 (53224) */
+    3347, /* CFE9 (53225) */
+    3347, /* CFEA (53226) */
+    3347, /* CFEB (53227) */
+    3347, /* CFEC (53228) */
+    3347, /* CFED (53229) */
+    3347, /* CFEE (53230) */
+    3347, /* CFEF (53231) */
+    3347, /* CFF0 (53232) */
+    3347, /* CFF1 (53233) */
+    3347, /* CFF2 (53234) */
+    3347, /* CFF3 (53235) */
+    3347, /* CFF4 (53236) */
+    3347, /* CFF5 (53237) */
+    3347, /* CFF6 (53238) */
+    3347, /* CFF7 (53239) */
+    3347, /* CFF8 (53240) */
+    3347, /* CFF9 (53241) */
+    3347, /* CFFA (53242) */
+    3347, /* CFFB (53243) */
+    3347, /* CFFC (53244) */
+    3347, /* CFFD (53245) */
+    3347, /* CFFE (53246) */
+    3347, /* CFFF (53247) */
+    3347, /* D000 (53248) */
+    3347, /* D001 (53249) */
+    3347, /* D002 (53250) */
+    3347, /* D003 (53251) */
+    3347, /* D004 (53252) */
+    3347, /* D005 (53253) */
+    3347, /* D006 (53254) */
+    3347, /* D007 (53255) */
+    3347, /* D008 (53256) */
+    3347, /* D009 (53257) */
+    3347, /* D00A (53258) */
+    3347, /* D00B (53259) */
+    3347, /* D00C (53260) */
+    3347, /* D00D (53261) */
+    3347, /* D00E (53262) */
+    3347, /* D00F (53263) */
+    3347, /* D010 (53264) */
+    3347, /* D011 (53265) */
+    3347, /* D012 (53266) */
+    3347, /* D013 (53267) */
+    3347, /* D014 (53268) */
+    3347, /* D015 (53269) */
+    3347, /* D016 (53270) */
+    3347, /* D017 (53271) */
+    3347, /* D018 (53272) */
+    3347, /* D019 (53273) */
+    3347, /* D01A (53274) */
+    3347, /* D01B (53275) */
+    3347, /* D01C (53276) */
+    3347, /* D01D (53277) */
+    3347, /* D01E (53278) */
+    3347, /* D01F (53279) */
+    3347, /* D020 (53280) */
+    3347, /* D021 (53281) */
+    3347, /* D022 (53282) */
+    3347, /* D023 (53283) */
+    3347, /* D024 (53284) */
+    3347, /* D025 (53285) */
+    3347, /* D026 (53286) */
+    3347, /* D027 (53287) */
+    3347, /* D028 (53288) */
+    3347, /* D029 (53289) */
+    3347, /* D02A (53290) */
+    3347, /* D02B (53291) */
+    3347, /* D02C (53292) */
+    3347, /* D02D (53293) */
+    3347, /* D02E (53294) */
+    3347, /* D02F (53295) */
+    3347, /* D030 (53296) */
+    3347, /* D031 (53297) */
+    3347, /* D032 (53298) */
+    3347, /* D033 (53299) */
+    3347, /* D034 (53300) */
+    3347, /* D035 (53301) */
+    3347, /* D036 (53302) */
+    3347, /* D037 (53303) */
+    3347, /* D038 (53304) */
+    3347, /* D039 (53305) */
+    3347, /* D03A (53306) */
+    3347, /* D03B (53307) */
+    3347, /* D03C (53308) */
+    3347, /* D03D (53309) */
+    3347, /* D03E (53310) */
+    3347, /* D03F (53311) */
+    3347, /* D040 (53312) */
+    3347, /* D041 (53313) */
+    3347, /* D042 (53314) */
+    3347, /* D043 (53315) */
+    3347, /* D044 (53316) */
+    3347, /* D045 (53317) */
+    3347, /* D046 (53318) */
+    3347, /* D047 (53319) */
+    3347, /* D048 (53320) */
+    3347, /* D049 (53321) */
+    3347, /* D04A (53322) */
+    3347, /* D04B (53323) */
+    3347, /* D04C (53324) */
+    3347, /* D04D (53325) */
+    3347, /* D04E (53326) */
+    3347, /* D04F (53327) */
+    3347, /* D050 (53328) */
+    3347, /* D051 (53329) */
+    3347, /* D052 (53330) */
+    3347, /* D053 (53331) */
+    3347, /* D054 (53332) */
+    3347, /* D055 (53333) */
+    3347, /* D056 (53334) */
+    3347, /* D057 (53335) */
+    3347, /* D058 (53336) */
+    3347, /* D059 (53337) */
+    3347, /* D05A (53338) */
+    3347, /* D05B (53339) */
+    3347, /* D05C (53340) */
+    3347, /* D05D (53341) */
+    3347, /* D05E (53342) */
+    3347, /* D05F (53343) */
+    3347, /* D060 (53344) */
+    3347, /* D061 (53345) */
+    3347, /* D062 (53346) */
+    3347, /* D063 (53347) */
+    3347, /* D064 (53348) */
+    3347, /* D065 (53349) */
+    3347, /* D066 (53350) */
+    3347, /* D067 (53351) */
+    3347, /* D068 (53352) */
+    3347, /* D069 (53353) */
+    3347, /* D06A (53354) */
+    3347, /* D06B (53355) */
+    3347, /* D06C (53356) */
+    3347, /* D06D (53357) */
+    3347, /* D06E (53358) */
+    3347, /* D06F (53359) */
+    3347, /* D070 (53360) */
+    3347, /* D071 (53361) */
+    3347, /* D072 (53362) */
+    3347, /* D073 (53363) */
+    3347, /* D074 (53364) */
+    3347, /* D075 (53365) */
+    3347, /* D076 (53366) */
+    3347, /* D077 (53367) */
+    3347, /* D078 (53368) */
+    3347, /* D079 (53369) */
+    3347, /* D07A (53370) */
+    3347, /* D07B (53371) */
+    3347, /* D07C (53372) */
+    3347, /* D07D (53373) */
+    3347, /* D07E (53374) */
+    3347, /* D07F (53375) */
+    3347, /* D080 (53376) */
+    3347, /* D081 (53377) */
+    3347, /* D082 (53378) */
+    3347, /* D083 (53379) */
+    3347, /* D084 (53380) */
+    3347, /* D085 (53381) */
+    3347, /* D086 (53382) */
+    3347, /* D087 (53383) */
+    3347, /* D088 (53384) */
+    3347, /* D089 (53385) */
+    3347, /* D08A (53386) */
+    3347, /* D08B (53387) */
+    3347, /* D08C (53388) */
+    3347, /* D08D (53389) */
+    3347, /* D08E (53390) */
+    3347, /* D08F (53391) */
+    3347, /* D090 (53392) */
+    3347, /* D091 (53393) */
+    3347, /* D092 (53394) */
+    3347, /* D093 (53395) */
+    3347, /* D094 (53396) */
+    3347, /* D095 (53397) */
+    3347, /* D096 (53398) */
+    3347, /* D097 (53399) */
+    3347, /* D098 (53400) */
+    3347, /* D099 (53401) */
+    3347, /* D09A (53402) */
+    3347, /* D09B (53403) */
+    3347, /* D09C (53404) */
+    3347, /* D09D (53405) */
+    3347, /* D09E (53406) */
+    3347, /* D09F (53407) */
+    3347, /* D0A0 (53408) */
+    3347, /* D0A1 (53409) */
+    3347, /* D0A2 (53410) */
+    3347, /* D0A3 (53411) */
+    3347, /* D0A4 (53412) */
+    3347, /* D0A5 (53413) */
+    3347, /* D0A6 (53414) */
+    3347, /* D0A7 (53415) */
+    3347, /* D0A8 (53416) */
+    3347, /* D0A9 (53417) */
+    3347, /* D0AA (53418) */
+    3347, /* D0AB (53419) */
+    3347, /* D0AC (53420) */
+    3347, /* D0AD (53421) */
+    3347, /* D0AE (53422) */
+    3347, /* D0AF (53423) */
+    3347, /* D0B0 (53424) */
+    3347, /* D0B1 (53425) */
+    3347, /* D0B2 (53426) */
+    3347, /* D0B3 (53427) */
+    3347, /* D0B4 (53428) */
+    3347, /* D0B5 (53429) */
+    3347, /* D0B6 (53430) */
+    3347, /* D0B7 (53431) */
+    3347, /* D0B8 (53432) */
+    3347, /* D0B9 (53433) */
+    3347, /* D0BA (53434) */
+    3347, /* D0BB (53435) */
+    3347, /* D0BC (53436) */
+    3347, /* D0BD (53437) */
+    3347, /* D0BE (53438) */
+    3347, /* D0BF (53439) */
+    3347, /* D0C0 (53440) */
+    3347, /* D0C1 (53441) */
+    3347, /* D0C2 (53442) */
+    3347, /* D0C3 (53443) */
+    3347, /* D0C4 (53444) */
+    3347, /* D0C5 (53445) */
+    3347, /* D0C6 (53446) */
+    3347, /* D0C7 (53447) */
+    3347, /* D0C8 (53448) */
+    3347, /* D0C9 (53449) */
+    3347, /* D0CA (53450) */
+    3347, /* D0CB (53451) */
+    3347, /* D0CC (53452) */
+    3347, /* D0CD (53453) */
+    3347, /* D0CE (53454) */
+    3347, /* D0CF (53455) */
+    3347, /* D0D0 (53456) */
+    3347, /* D0D1 (53457) */
+    3347, /* D0D2 (53458) */
+    3347, /* D0D3 (53459) */
+    3347, /* D0D4 (53460) */
+    3347, /* D0D5 (53461) */
+    3347, /* D0D6 (53462) */
+    3347, /* D0D7 (53463) */
+    3347, /* D0D8 (53464) */
+    3347, /* D0D9 (53465) */
+    3347, /* D0DA (53466) */
+    3347, /* D0DB (53467) */
+    3347, /* D0DC (53468) */
+    3347, /* D0DD (53469) */
+    3347, /* D0DE (53470) */
+    3347, /* D0DF (53471) */
+    3347, /* D0E0 (53472) */
+    3347, /* D0E1 (53473) */
+    3347, /* D0E2 (53474) */
+    3347, /* D0E3 (53475) */
+    3347, /* D0E4 (53476) */
+    3347, /* D0E5 (53477) */
+    3347, /* D0E6 (53478) */
+    3347, /* D0E7 (53479) */
+    3347, /* D0E8 (53480) */
+    3347, /* D0E9 (53481) */
+    3347, /* D0EA (53482) */
+    3347, /* D0EB (53483) */
+    3347, /* D0EC (53484) */
+    3347, /* D0ED (53485) */
+    3347, /* D0EE (53486) */
+    3347, /* D0EF (53487) */
+    3347, /* D0F0 (53488) */
+    3347, /* D0F1 (53489) */
+    3347, /* D0F2 (53490) */
+    3347, /* D0F3 (53491) */
+    3347, /* D0F4 (53492) */
+    3347, /* D0F5 (53493) */
+    3347, /* D0F6 (53494) */
+    3347, /* D0F7 (53495) */
+    3347, /* D0F8 (53496) */
+    3347, /* D0F9 (53497) */
+    3347, /* D0FA (53498) */
+    3347, /* D0FB (53499) */
+    3347, /* D0FC (53500) */
+    3347, /* D0FD (53501) */
+    3347, /* D0FE (53502) */
+    3347, /* D0FF (53503) */
+    3347, /* D100 (53504) */
+    3347, /* D101 (53505) */
+    3347, /* D102 (53506) */
+    3347, /* D103 (53507) */
+    3347, /* D104 (53508) */
+    3347, /* D105 (53509) */
+    3347, /* D106 (53510) */
+    3347, /* D107 (53511) */
+    3347, /* D108 (53512) */
+    3347, /* D109 (53513) */
+    3347, /* D10A (53514) */
+    3347, /* D10B (53515) */
+    3347, /* D10C (53516) */
+    3347, /* D10D (53517) */
+    3347, /* D10E (53518) */
+    3347, /* D10F (53519) */
+    3347, /* D110 (53520) */
+    3347, /* D111 (53521) */
+    3347, /* D112 (53522) */
+    3347, /* D113 (53523) */
+    3347, /* D114 (53524) */
+    3347, /* D115 (53525) */
+    3347, /* D116 (53526) */
+    3347, /* D117 (53527) */
+    3347, /* D118 (53528) */
+    3347, /* D119 (53529) */
+    3347, /* D11A (53530) */
+    3347, /* D11B (53531) */
+    3347, /* D11C (53532) */
+    3347, /* D11D (53533) */
+    3347, /* D11E (53534) */
+    3347, /* D11F (53535) */
+    3347, /* D120 (53536) */
+    3347, /* D121 (53537) */
+    3347, /* D122 (53538) */
+    3347, /* D123 (53539) */
+    3347, /* D124 (53540) */
+    3347, /* D125 (53541) */
+    3347, /* D126 (53542) */
+    3347, /* D127 (53543) */
+    3347, /* D128 (53544) */
+    3347, /* D129 (53545) */
+    3347, /* D12A (53546) */
+    3347, /* D12B (53547) */
+    3347, /* D12C (53548) */
+    3347, /* D12D (53549) */
+    3347, /* D12E (53550) */
+    3347, /* D12F (53551) */
+    3347, /* D130 (53552) */
+    3347, /* D131 (53553) */
+    3347, /* D132 (53554) */
+    3347, /* D133 (53555) */
+    3347, /* D134 (53556) */
+    3347, /* D135 (53557) */
+    3347, /* D136 (53558) */
+    3347, /* D137 (53559) */
+    3347, /* D138 (53560) */
+    3347, /* D139 (53561) */
+    3347, /* D13A (53562) */
+    3347, /* D13B (53563) */
+    3347, /* D13C (53564) */
+    3347, /* D13D (53565) */
+    3347, /* D13E (53566) */
+    3347, /* D13F (53567) */
+    3347, /* D140 (53568) */
+    3347, /* D141 (53569) */
+    3347, /* D142 (53570) */
+    3347, /* D143 (53571) */
+    3347, /* D144 (53572) */
+    3347, /* D145 (53573) */
+    3347, /* D146 (53574) */
+    3347, /* D147 (53575) */
+    3347, /* D148 (53576) */
+    3347, /* D149 (53577) */
+    3347, /* D14A (53578) */
+    3347, /* D14B (53579) */
+    3347, /* D14C (53580) */
+    3347, /* D14D (53581) */
+    3347, /* D14E (53582) */
+    3347, /* D14F (53583) */
+    3347, /* D150 (53584) */
+    3347, /* D151 (53585) */
+    3347, /* D152 (53586) */
+    3347, /* D153 (53587) */
+    3347, /* D154 (53588) */
+    3347, /* D155 (53589) */
+    3347, /* D156 (53590) */
+    3347, /* D157 (53591) */
+    3347, /* D158 (53592) */
+    3347, /* D159 (53593) */
+    3347, /* D15A (53594) */
+    3347, /* D15B (53595) */
+    3347, /* D15C (53596) */
+    3347, /* D15D (53597) */
+    3347, /* D15E (53598) */
+    3347, /* D15F (53599) */
+    3347, /* D160 (53600) */
+    3347, /* D161 (53601) */
+    3347, /* D162 (53602) */
+    3347, /* D163 (53603) */
+    3347, /* D164 (53604) */
+    3347, /* D165 (53605) */
+    3347, /* D166 (53606) */
+    3347, /* D167 (53607) */
+    3347, /* D168 (53608) */
+    3347, /* D169 (53609) */
+    3347, /* D16A (53610) */
+    3347, /* D16B (53611) */
+    3347, /* D16C (53612) */
+    3347, /* D16D (53613) */
+    3347, /* D16E (53614) */
+    3347, /* D16F (53615) */
+    3347, /* D170 (53616) */
+    3347, /* D171 (53617) */
+    3347, /* D172 (53618) */
+    3347, /* D173 (53619) */
+    3347, /* D174 (53620) */
+    3347, /* D175 (53621) */
+    3347, /* D176 (53622) */
+    3347, /* D177 (53623) */
+    3347, /* D178 (53624) */
+    3347, /* D179 (53625) */
+    3347, /* D17A (53626) */
+    3347, /* D17B (53627) */
+    3347, /* D17C (53628) */
+    3347, /* D17D (53629) */
+    3347, /* D17E (53630) */
+    3347, /* D17F (53631) */
+    3347, /* D180 (53632) */
+    3347, /* D181 (53633) */
+    3347, /* D182 (53634) */
+    3347, /* D183 (53635) */
+    3347, /* D184 (53636) */
+    3347, /* D185 (53637) */
+    3347, /* D186 (53638) */
+    3347, /* D187 (53639) */
+    3347, /* D188 (53640) */
+    3347, /* D189 (53641) */
+    3347, /* D18A (53642) */
+    3347, /* D18B (53643) */
+    3347, /* D18C (53644) */
+    3347, /* D18D (53645) */
+    3347, /* D18E (53646) */
+    3347, /* D18F (53647) */
+    3347, /* D190 (53648) */
+    3347, /* D191 (53649) */
+    3347, /* D192 (53650) */
+    3347, /* D193 (53651) */
+    3347, /* D194 (53652) */
+    3347, /* D195 (53653) */
+    3347, /* D196 (53654) */
+    3347, /* D197 (53655) */
+    3347, /* D198 (53656) */
+    3347, /* D199 (53657) */
+    3347, /* D19A (53658) */
+    3347, /* D19B (53659) */
+    3347, /* D19C (53660) */
+    3347, /* D19D (53661) */
+    3347, /* D19E (53662) */
+    3347, /* D19F (53663) */
+    3347, /* D1A0 (53664) */
+    3347, /* D1A1 (53665) */
+    3347, /* D1A2 (53666) */
+    3347, /* D1A3 (53667) */
+    3347, /* D1A4 (53668) */
+    3347, /* D1A5 (53669) */
+    3347, /* D1A6 (53670) */
+    3347, /* D1A7 (53671) */
+    3347, /* D1A8 (53672) */
+    3347, /* D1A9 (53673) */
+    3347, /* D1AA (53674) */
+    3347, /* D1AB (53675) */
+    3347, /* D1AC (53676) */
+    3347, /* D1AD (53677) */
+    3347, /* D1AE (53678) */
+    3347, /* D1AF (53679) */
+    3347, /* D1B0 (53680) */
+    3347, /* D1B1 (53681) */
+    3347, /* D1B2 (53682) */
+    3347, /* D1B3 (53683) */
+    3347, /* D1B4 (53684) */
+    3347, /* D1B5 (53685) */
+    3347, /* D1B6 (53686) */
+    3347, /* D1B7 (53687) */
+    3347, /* D1B8 (53688) */
+    3347, /* D1B9 (53689) */
+    3347, /* D1BA (53690) */
+    3347, /* D1BB (53691) */
+    3347, /* D1BC (53692) */
+    3347, /* D1BD (53693) */
+    3347, /* D1BE (53694) */
+    3347, /* D1BF (53695) */
+    3347, /* D1C0 (53696) */
+    3347, /* D1C1 (53697) */
+    3347, /* D1C2 (53698) */
+    3347, /* D1C3 (53699) */
+    3347, /* D1C4 (53700) */
+    3347, /* D1C5 (53701) */
+    3347, /* D1C6 (53702) */
+    3347, /* D1C7 (53703) */
+    3347, /* D1C8 (53704) */
+    3347, /* D1C9 (53705) */
+    3347, /* D1CA (53706) */
+    3347, /* D1CB (53707) */
+    3347, /* D1CC (53708) */
+    3347, /* D1CD (53709) */
+    3347, /* D1CE (53710) */
+    3347, /* D1CF (53711) */
+    3347, /* D1D0 (53712) */
+    3347, /* D1D1 (53713) */
+    3347, /* D1D2 (53714) */
+    3347, /* D1D3 (53715) */
+    3347, /* D1D4 (53716) */
+    3347, /* D1D5 (53717) */
+    3347, /* D1D6 (53718) */
+    3347, /* D1D7 (53719) */
+    3347, /* D1D8 (53720) */
+    3347, /* D1D9 (53721) */
+    3347, /* D1DA (53722) */
+    3347, /* D1DB (53723) */
+    3347, /* D1DC (53724) */
+    3347, /* D1DD (53725) */
+    3347, /* D1DE (53726) */
+    3347, /* D1DF (53727) */
+    3347, /* D1E0 (53728) */
+    3347, /* D1E1 (53729) */
+    3347, /* D1E2 (53730) */
+    3347, /* D1E3 (53731) */
+    3347, /* D1E4 (53732) */
+    3347, /* D1E5 (53733) */
+    3347, /* D1E6 (53734) */
+    3347, /* D1E7 (53735) */
+    3347, /* D1E8 (53736) */
+    3347, /* D1E9 (53737) */
+    3347, /* D1EA (53738) */
+    3347, /* D1EB (53739) */
+    3347, /* D1EC (53740) */
+    3347, /* D1ED (53741) */
+    3347, /* D1EE (53742) */
+    3347, /* D1EF (53743) */
+    3347, /* D1F0 (53744) */
+    3347, /* D1F1 (53745) */
+    3347, /* D1F2 (53746) */
+    3347, /* D1F3 (53747) */
+    3347, /* D1F4 (53748) */
+    3347, /* D1F5 (53749) */
+    3347, /* D1F6 (53750) */
+    3347, /* D1F7 (53751) */
+    3347, /* D1F8 (53752) */
+    3347, /* D1F9 (53753) */
+    3347, /* D1FA (53754) */
+    3347, /* D1FB (53755) */
+    3347, /* D1FC (53756) */
+    3347, /* D1FD (53757) */
+    3347, /* D1FE (53758) */
+    3347, /* D1FF (53759) */
+    3347, /* D200 (53760) */
+    3347, /* D201 (53761) */
+    3347, /* D202 (53762) */
+    3347, /* D203 (53763) */
+    3347, /* D204 (53764) */
+    3347, /* D205 (53765) */
+    3347, /* D206 (53766) */
+    3347, /* D207 (53767) */
+    3347, /* D208 (53768) */
+    3347, /* D209 (53769) */
+    3347, /* D20A (53770) */
+    3347, /* D20B (53771) */
+    3347, /* D20C (53772) */
+    3347, /* D20D (53773) */
+    3347, /* D20E (53774) */
+    3347, /* D20F (53775) */
+    3347, /* D210 (53776) */
+    3347, /* D211 (53777) */
+    3347, /* D212 (53778) */
+    3347, /* D213 (53779) */
+    3347, /* D214 (53780) */
+    3347, /* D215 (53781) */
+    3347, /* D216 (53782) */
+    3347, /* D217 (53783) */
+    3347, /* D218 (53784) */
+    3347, /* D219 (53785) */
+    3347, /* D21A (53786) */
+    3347, /* D21B (53787) */
+    3347, /* D21C (53788) */
+    3347, /* D21D (53789) */
+    3347, /* D21E (53790) */
+    3347, /* D21F (53791) */
+    3347, /* D220 (53792) */
+    3347, /* D221 (53793) */
+    3347, /* D222 (53794) */
+    3347, /* D223 (53795) */
+    3347, /* D224 (53796) */
+    3347, /* D225 (53797) */
+    3347, /* D226 (53798) */
+    3347, /* D227 (53799) */
+    3347, /* D228 (53800) */
+    3347, /* D229 (53801) */
+    3347, /* D22A (53802) */
+    3347, /* D22B (53803) */
+    3347, /* D22C (53804) */
+    3347, /* D22D (53805) */
+    3347, /* D22E (53806) */
+    3347, /* D22F (53807) */
+    3347, /* D230 (53808) */
+    3347, /* D231 (53809) */
+    3347, /* D232 (53810) */
+    3347, /* D233 (53811) */
+    3347, /* D234 (53812) */
+    3347, /* D235 (53813) */
+    3347, /* D236 (53814) */
+    3347, /* D237 (53815) */
+    3347, /* D238 (53816) */
+    3347, /* D239 (53817) */
+    3347, /* D23A (53818) */
+    3347, /* D23B (53819) */
+    3347, /* D23C (53820) */
+    3347, /* D23D (53821) */
+    3347, /* D23E (53822) */
+    3347, /* D23F (53823) */
+    3347, /* D240 (53824) */
+    3347, /* D241 (53825) */
+    3347, /* D242 (53826) */
+    3347, /* D243 (53827) */
+    3347, /* D244 (53828) */
+    3347, /* D245 (53829) */
+    3347, /* D246 (53830) */
+    3347, /* D247 (53831) */
+    3347, /* D248 (53832) */
+    3347, /* D249 (53833) */
+    3347, /* D24A (53834) */
+    3347, /* D24B (53835) */
+    3347, /* D24C (53836) */
+    3347, /* D24D (53837) */
+    3347, /* D24E (53838) */
+    3347, /* D24F (53839) */
+    3347, /* D250 (53840) */
+    3347, /* D251 (53841) */
+    3347, /* D252 (53842) */
+    3347, /* D253 (53843) */
+    3347, /* D254 (53844) */
+    3347, /* D255 (53845) */
+    3347, /* D256 (53846) */
+    3347, /* D257 (53847) */
+    3347, /* D258 (53848) */
+    3347, /* D259 (53849) */
+    3347, /* D25A (53850) */
+    3347, /* D25B (53851) */
+    3347, /* D25C (53852) */
+    3347, /* D25D (53853) */
+    3347, /* D25E (53854) */
+    3347, /* D25F (53855) */
+    3347, /* D260 (53856) */
+    3347, /* D261 (53857) */
+    3347, /* D262 (53858) */
+    3347, /* D263 (53859) */
+    3347, /* D264 (53860) */
+    3347, /* D265 (53861) */
+    3347, /* D266 (53862) */
+    3347, /* D267 (53863) */
+    3347, /* D268 (53864) */
+    3347, /* D269 (53865) */
+    3347, /* D26A (53866) */
+    3347, /* D26B (53867) */
+    3347, /* D26C (53868) */
+    3347, /* D26D (53869) */
+    3347, /* D26E (53870) */
+    3347, /* D26F (53871) */
+    3347, /* D270 (53872) */
+    3347, /* D271 (53873) */
+    3347, /* D272 (53874) */
+    3347, /* D273 (53875) */
+    3347, /* D274 (53876) */
+    3347, /* D275 (53877) */
+    3347, /* D276 (53878) */
+    3347, /* D277 (53879) */
+    3347, /* D278 (53880) */
+    3347, /* D279 (53881) */
+    3347, /* D27A (53882) */
+    3347, /* D27B (53883) */
+    3347, /* D27C (53884) */
+    3347, /* D27D (53885) */
+    3347, /* D27E (53886) */
+    3347, /* D27F (53887) */
+    3347, /* D280 (53888) */
+    3347, /* D281 (53889) */
+    3347, /* D282 (53890) */
+    3347, /* D283 (53891) */
+    3347, /* D284 (53892) */
+    3347, /* D285 (53893) */
+    3347, /* D286 (53894) */
+    3347, /* D287 (53895) */
+    3347, /* D288 (53896) */
+    3347, /* D289 (53897) */
+    3347, /* D28A (53898) */
+    3347, /* D28B (53899) */
+    3347, /* D28C (53900) */
+    3347, /* D28D (53901) */
+    3347, /* D28E (53902) */
+    3347, /* D28F (53903) */
+    3347, /* D290 (53904) */
+    3347, /* D291 (53905) */
+    3347, /* D292 (53906) */
+    3347, /* D293 (53907) */
+    3347, /* D294 (53908) */
+    3347, /* D295 (53909) */
+    3347, /* D296 (53910) */
+    3347, /* D297 (53911) */
+    3347, /* D298 (53912) */
+    3347, /* D299 (53913) */
+    3347, /* D29A (53914) */
+    3347, /* D29B (53915) */
+    3347, /* D29C (53916) */
+    3347, /* D29D (53917) */
+    3347, /* D29E (53918) */
+    3347, /* D29F (53919) */
+    3347, /* D2A0 (53920) */
+    3347, /* D2A1 (53921) */
+    3347, /* D2A2 (53922) */
+    3347, /* D2A3 (53923) */
+    3347, /* D2A4 (53924) */
+    3347, /* D2A5 (53925) */
+    3347, /* D2A6 (53926) */
+    3347, /* D2A7 (53927) */
+    3347, /* D2A8 (53928) */
+    3347, /* D2A9 (53929) */
+    3347, /* D2AA (53930) */
+    3347, /* D2AB (53931) */
+    3347, /* D2AC (53932) */
+    3347, /* D2AD (53933) */
+    3347, /* D2AE (53934) */
+    3347, /* D2AF (53935) */
+    3347, /* D2B0 (53936) */
+    3347, /* D2B1 (53937) */
+    3347, /* D2B2 (53938) */
+    3347, /* D2B3 (53939) */
+    3347, /* D2B4 (53940) */
+    3347, /* D2B5 (53941) */
+    3347, /* D2B6 (53942) */
+    3347, /* D2B7 (53943) */
+    3347, /* D2B8 (53944) */
+    3347, /* D2B9 (53945) */
+    3347, /* D2BA (53946) */
+    3347, /* D2BB (53947) */
+    3347, /* D2BC (53948) */
+    3347, /* D2BD (53949) */
+    3347, /* D2BE (53950) */
+    3347, /* D2BF (53951) */
+    3347, /* D2C0 (53952) */
+    3347, /* D2C1 (53953) */
+    3347, /* D2C2 (53954) */
+    3347, /* D2C3 (53955) */
+    3347, /* D2C4 (53956) */
+    3347, /* D2C5 (53957) */
+    3347, /* D2C6 (53958) */
+    3347, /* D2C7 (53959) */
+    3347, /* D2C8 (53960) */
+    3347, /* D2C9 (53961) */
+    3347, /* D2CA (53962) */
+    3347, /* D2CB (53963) */
+    3347, /* D2CC (53964) */
+    3347, /* D2CD (53965) */
+    3347, /* D2CE (53966) */
+    3347, /* D2CF (53967) */
+    3347, /* D2D0 (53968) */
+    3347, /* D2D1 (53969) */
+    3347, /* D2D2 (53970) */
+    3347, /* D2D3 (53971) */
+    3347, /* D2D4 (53972) */
+    3347, /* D2D5 (53973) */
+    3347, /* D2D6 (53974) */
+    3347, /* D2D7 (53975) */
+    3347, /* D2D8 (53976) */
+    3347, /* D2D9 (53977) */
+    3347, /* D2DA (53978) */
+    3347, /* D2DB (53979) */
+    3347, /* D2DC (53980) */
+    3347, /* D2DD (53981) */
+    3347, /* D2DE (53982) */
+    3347, /* D2DF (53983) */
+    3347, /* D2E0 (53984) */
+    3347, /* D2E1 (53985) */
+    3347, /* D2E2 (53986) */
+    3347, /* D2E3 (53987) */
+    3347, /* D2E4 (53988) */
+    3347, /* D2E5 (53989) */
+    3347, /* D2E6 (53990) */
+    3347, /* D2E7 (53991) */
+    3347, /* D2E8 (53992) */
+    3347, /* D2E9 (53993) */
+    3347, /* D2EA (53994) */
+    3347, /* D2EB (53995) */
+    3347, /* D2EC (53996) */
+    3347, /* D2ED (53997) */
+    3347, /* D2EE (53998) */
+    3347, /* D2EF (53999) */
+    3347, /* D2F0 (54000) */
+    3347, /* D2F1 (54001) */
+    3347, /* D2F2 (54002) */
+    3347, /* D2F3 (54003) */
+    3347, /* D2F4 (54004) */
+    3347, /* D2F5 (54005) */
+    3347, /* D2F6 (54006) */
+    3347, /* D2F7 (54007) */
+    3347, /* D2F8 (54008) */
+    3347, /* D2F9 (54009) */
+    3347, /* D2FA (54010) */
+    3347, /* D2FB (54011) */
+    3347, /* D2FC (54012) */
+    3347, /* D2FD (54013) */
+    3347, /* D2FE (54014) */
+    3347, /* D2FF (54015) */
+    3347, /* D300 (54016) */
+    3347, /* D301 (54017) */
+    3347, /* D302 (54018) */
+    3347, /* D303 (54019) */
+    3347, /* D304 (54020) */
+    3347, /* D305 (54021) */
+    3347, /* D306 (54022) */
+    3347, /* D307 (54023) */
+    3347, /* D308 (54024) */
+    3347, /* D309 (54025) */
+    3347, /* D30A (54026) */
+    3347, /* D30B (54027) */
+    3347, /* D30C (54028) */
+    3347, /* D30D (54029) */
+    3347, /* D30E (54030) */
+    3347, /* D30F (54031) */
+    3347, /* D310 (54032) */
+    3347, /* D311 (54033) */
+    3347, /* D312 (54034) */
+    3347, /* D313 (54035) */
+    3347, /* D314 (54036) */
+    3347, /* D315 (54037) */
+    3347, /* D316 (54038) */
+    3347, /* D317 (54039) */
+    3347, /* D318 (54040) */
+    3347, /* D319 (54041) */
+    3347, /* D31A (54042) */
+    3347, /* D31B (54043) */
+    3347, /* D31C (54044) */
+    3347, /* D31D (54045) */
+    3347, /* D31E (54046) */
+    3347, /* D31F (54047) */
+    3347, /* D320 (54048) */
+    3347, /* D321 (54049) */
+    3347, /* D322 (54050) */
+    3347, /* D323 (54051) */
+    3347, /* D324 (54052) */
+    3347, /* D325 (54053) */
+    3347, /* D326 (54054) */
+    3347, /* D327 (54055) */
+    3347, /* D328 (54056) */
+    3347, /* D329 (54057) */
+    3347, /* D32A (54058) */
+    3347, /* D32B (54059) */
+    3347, /* D32C (54060) */
+    3347, /* D32D (54061) */
+    3347, /* D32E (54062) */
+    3347, /* D32F (54063) */
+    3347, /* D330 (54064) */
+    3347, /* D331 (54065) */
+    3347, /* D332 (54066) */
+    3347, /* D333 (54067) */
+    3347, /* D334 (54068) */
+    3347, /* D335 (54069) */
+    3347, /* D336 (54070) */
+    3347, /* D337 (54071) */
+    3347, /* D338 (54072) */
+    3347, /* D339 (54073) */
+    3347, /* D33A (54074) */
+    3347, /* D33B (54075) */
+    3347, /* D33C (54076) */
+    3347, /* D33D (54077) */
+    3347, /* D33E (54078) */
+    3347, /* D33F (54079) */
+    3347, /* D340 (54080) */
+    3347, /* D341 (54081) */
+    3347, /* D342 (54082) */
+    3347, /* D343 (54083) */
+    3347, /* D344 (54084) */
+    3347, /* D345 (54085) */
+    3347, /* D346 (54086) */
+    3347, /* D347 (54087) */
+    3347, /* D348 (54088) */
+    3347, /* D349 (54089) */
+    3347, /* D34A (54090) */
+    3347, /* D34B (54091) */
+    3347, /* D34C (54092) */
+    3347, /* D34D (54093) */
+    3347, /* D34E (54094) */
+    3347, /* D34F (54095) */
+    3347, /* D350 (54096) */
+    3347, /* D351 (54097) */
+    3347, /* D352 (54098) */
+    3347, /* D353 (54099) */
+    3347, /* D354 (54100) */
+    3347, /* D355 (54101) */
+    3347, /* D356 (54102) */
+    3347, /* D357 (54103) */
+    3347, /* D358 (54104) */
+    3347, /* D359 (54105) */
+    3347, /* D35A (54106) */
+    3347, /* D35B (54107) */
+    3347, /* D35C (54108) */
+    3347, /* D35D (54109) */
+    3347, /* D35E (54110) */
+    3347, /* D35F (54111) */
+    3347, /* D360 (54112) */
+    3347, /* D361 (54113) */
+    3347, /* D362 (54114) */
+    3347, /* D363 (54115) */
+    3347, /* D364 (54116) */
+    3347, /* D365 (54117) */
+    3347, /* D366 (54118) */
+    3347, /* D367 (54119) */
+    3347, /* D368 (54120) */
+    3347, /* D369 (54121) */
+    3347, /* D36A (54122) */
+    3347, /* D36B (54123) */
+    3347, /* D36C (54124) */
+    3347, /* D36D (54125) */
+    3347, /* D36E (54126) */
+    3347, /* D36F (54127) */
+    3347, /* D370 (54128) */
+    3347, /* D371 (54129) */
+    3347, /* D372 (54130) */
+    3347, /* D373 (54131) */
+    3347, /* D374 (54132) */
+    3347, /* D375 (54133) */
+    3347, /* D376 (54134) */
+    3347, /* D377 (54135) */
+    3347, /* D378 (54136) */
+    3347, /* D379 (54137) */
+    3347, /* D37A (54138) */
+    3347, /* D37B (54139) */
+    3347, /* D37C (54140) */
+    3347, /* D37D (54141) */
+    3347, /* D37E (54142) */
+    3347, /* D37F (54143) */
+    3347, /* D380 (54144) */
+    3347, /* D381 (54145) */
+    3347, /* D382 (54146) */
+    3347, /* D383 (54147) */
+    3347, /* D384 (54148) */
+    3347, /* D385 (54149) */
+    3347, /* D386 (54150) */
+    3347, /* D387 (54151) */
+    3347, /* D388 (54152) */
+    3347, /* D389 (54153) */
+    3347, /* D38A (54154) */
+    3347, /* D38B (54155) */
+    3347, /* D38C (54156) */
+    3347, /* D38D (54157) */
+    3347, /* D38E (54158) */
+    3347, /* D38F (54159) */
+    3347, /* D390 (54160) */
+    3347, /* D391 (54161) */
+    3347, /* D392 (54162) */
+    3347, /* D393 (54163) */
+    3347, /* D394 (54164) */
+    3347, /* D395 (54165) */
+    3347, /* D396 (54166) */
+    3347, /* D397 (54167) */
+    3347, /* D398 (54168) */
+    3347, /* D399 (54169) */
+    3347, /* D39A (54170) */
+    3347, /* D39B (54171) */
+    3347, /* D39C (54172) */
+    3347, /* D39D (54173) */
+    3347, /* D39E (54174) */
+    3347, /* D39F (54175) */
+    3347, /* D3A0 (54176) */
+    3347, /* D3A1 (54177) */
+    3347, /* D3A2 (54178) */
+    3347, /* D3A3 (54179) */
+    3347, /* D3A4 (54180) */
+    3347, /* D3A5 (54181) */
+    3347, /* D3A6 (54182) */
+    3347, /* D3A7 (54183) */
+    3347, /* D3A8 (54184) */
+    3347, /* D3A9 (54185) */
+    3347, /* D3AA (54186) */
+    3347, /* D3AB (54187) */
+    3347, /* D3AC (54188) */
+    3347, /* D3AD (54189) */
+    3347, /* D3AE (54190) */
+    3347, /* D3AF (54191) */
+    3347, /* D3B0 (54192) */
+    3347, /* D3B1 (54193) */
+    3347, /* D3B2 (54194) */
+    3347, /* D3B3 (54195) */
+    3347, /* D3B4 (54196) */
+    3347, /* D3B5 (54197) */
+    3347, /* D3B6 (54198) */
+    3347, /* D3B7 (54199) */
+    3347, /* D3B8 (54200) */
+    3347, /* D3B9 (54201) */
+    3347, /* D3BA (54202) */
+    3347, /* D3BB (54203) */
+    3347, /* D3BC (54204) */
+    3347, /* D3BD (54205) */
+    3347, /* D3BE (54206) */
+    3347, /* D3BF (54207) */
+    3347, /* D3C0 (54208) */
+    3347, /* D3C1 (54209) */
+    3347, /* D3C2 (54210) */
+    3347, /* D3C3 (54211) */
+    3347, /* D3C4 (54212) */
+    3347, /* D3C5 (54213) */
+    3347, /* D3C6 (54214) */
+    3347, /* D3C7 (54215) */
+    3347, /* D3C8 (54216) */
+    3347, /* D3C9 (54217) */
+    3347, /* D3CA (54218) */
+    3347, /* D3CB (54219) */
+    3347, /* D3CC (54220) */
+    3347, /* D3CD (54221) */
+    3347, /* D3CE (54222) */
+    3347, /* D3CF (54223) */
+    3347, /* D3D0 (54224) */
+    3347, /* D3D1 (54225) */
+    3347, /* D3D2 (54226) */
+    3347, /* D3D3 (54227) */
+    3347, /* D3D4 (54228) */
+    3347, /* D3D5 (54229) */
+    3347, /* D3D6 (54230) */
+    3347, /* D3D7 (54231) */
+    3347, /* D3D8 (54232) */
+    3347, /* D3D9 (54233) */
+    3347, /* D3DA (54234) */
+    3347, /* D3DB (54235) */
+    3347, /* D3DC (54236) */
+    3347, /* D3DD (54237) */
+    3347, /* D3DE (54238) */
+    3347, /* D3DF (54239) */
+    3347, /* D3E0 (54240) */
+    3347, /* D3E1 (54241) */
+    3347, /* D3E2 (54242) */
+    3347, /* D3E3 (54243) */
+    3347, /* D3E4 (54244) */
+    3347, /* D3E5 (54245) */
+    3347, /* D3E6 (54246) */
+    3347, /* D3E7 (54247) */
+    3347, /* D3E8 (54248) */
+    3347, /* D3E9 (54249) */
+    3347, /* D3EA (54250) */
+    3347, /* D3EB (54251) */
+    3347, /* D3EC (54252) */
+    3347, /* D3ED (54253) */
+    3347, /* D3EE (54254) */
+    3347, /* D3EF (54255) */
+    3347, /* D3F0 (54256) */
+    3347, /* D3F1 (54257) */
+    3347, /* D3F2 (54258) */
+    3347, /* D3F3 (54259) */
+    3347, /* D3F4 (54260) */
+    3347, /* D3F5 (54261) */
+    3347, /* D3F6 (54262) */
+    3347, /* D3F7 (54263) */
+    3347, /* D3F8 (54264) */
+    3347, /* D3F9 (54265) */
+    3347, /* D3FA (54266) */
+    3347, /* D3FB (54267) */
+    3347, /* D3FC (54268) */
+    3347, /* D3FD (54269) */
+    3347, /* D3FE (54270) */
+    3347, /* D3FF (54271) */
+    3347, /* D400 (54272) */
+    3347, /* D401 (54273) */
+    3347, /* D402 (54274) */
+    3347, /* D403 (54275) */
+    3347, /* D404 (54276) */
+    3347, /* D405 (54277) */
+    3347, /* D406 (54278) */
+    3347, /* D407 (54279) */
+    3347, /* D408 (54280) */
+    3347, /* D409 (54281) */
+    3347, /* D40A (54282) */
+    3347, /* D40B (54283) */
+    3347, /* D40C (54284) */
+    3347, /* D40D (54285) */
+    3347, /* D40E (54286) */
+    3347, /* D40F (54287) */
+    3347, /* D410 (54288) */
+    3347, /* D411 (54289) */
+    3347, /* D412 (54290) */
+    3347, /* D413 (54291) */
+    3347, /* D414 (54292) */
+    3347, /* D415 (54293) */
+    3347, /* D416 (54294) */
+    3347, /* D417 (54295) */
+    3347, /* D418 (54296) */
+    3347, /* D419 (54297) */
+    3347, /* D41A (54298) */
+    3347, /* D41B (54299) */
+    3347, /* D41C (54300) */
+    3347, /* D41D (54301) */
+    3347, /* D41E (54302) */
+    3347, /* D41F (54303) */
+    3347, /* D420 (54304) */
+    3347, /* D421 (54305) */
+    3347, /* D422 (54306) */
+    3347, /* D423 (54307) */
+    3347, /* D424 (54308) */
+    3347, /* D425 (54309) */
+    3347, /* D426 (54310) */
+    3347, /* D427 (54311) */
+    3347, /* D428 (54312) */
+    3347, /* D429 (54313) */
+    3347, /* D42A (54314) */
+    3347, /* D42B (54315) */
+    3347, /* D42C (54316) */
+    3347, /* D42D (54317) */
+    3347, /* D42E (54318) */
+    3347, /* D42F (54319) */
+    3347, /* D430 (54320) */
+    3347, /* D431 (54321) */
+    3347, /* D432 (54322) */
+    3347, /* D433 (54323) */
+    3347, /* D434 (54324) */
+    3347, /* D435 (54325) */
+    3347, /* D436 (54326) */
+    3347, /* D437 (54327) */
+    3347, /* D438 (54328) */
+    3347, /* D439 (54329) */
+    3347, /* D43A (54330) */
+    3347, /* D43B (54331) */
+    3347, /* D43C (54332) */
+    3347, /* D43D (54333) */
+    3347, /* D43E (54334) */
+    3347, /* D43F (54335) */
+    3347, /* D440 (54336) */
+    3347, /* D441 (54337) */
+    3347, /* D442 (54338) */
+    3347, /* D443 (54339) */
+    3347, /* D444 (54340) */
+    3347, /* D445 (54341) */
+    3347, /* D446 (54342) */
+    3347, /* D447 (54343) */
+    3347, /* D448 (54344) */
+    3347, /* D449 (54345) */
+    3347, /* D44A (54346) */
+    3347, /* D44B (54347) */
+    3347, /* D44C (54348) */
+    3347, /* D44D (54349) */
+    3347, /* D44E (54350) */
+    3347, /* D44F (54351) */
+    3347, /* D450 (54352) */
+    3347, /* D451 (54353) */
+    3347, /* D452 (54354) */
+    3347, /* D453 (54355) */
+    3347, /* D454 (54356) */
+    3347, /* D455 (54357) */
+    3347, /* D456 (54358) */
+    3347, /* D457 (54359) */
+    3347, /* D458 (54360) */
+    3347, /* D459 (54361) */
+    3347, /* D45A (54362) */
+    3347, /* D45B (54363) */
+    3347, /* D45C (54364) */
+    3347, /* D45D (54365) */
+    3347, /* D45E (54366) */
+    3347, /* D45F (54367) */
+    3347, /* D460 (54368) */
+    3347, /* D461 (54369) */
+    3347, /* D462 (54370) */
+    3347, /* D463 (54371) */
+    3347, /* D464 (54372) */
+    3347, /* D465 (54373) */
+    3347, /* D466 (54374) */
+    3347, /* D467 (54375) */
+    3347, /* D468 (54376) */
+    3347, /* D469 (54377) */
+    3347, /* D46A (54378) */
+    3347, /* D46B (54379) */
+    3347, /* D46C (54380) */
+    3347, /* D46D (54381) */
+    3347, /* D46E (54382) */
+    3347, /* D46F (54383) */
+    3347, /* D470 (54384) */
+    3347, /* D471 (54385) */
+    3347, /* D472 (54386) */
+    3347, /* D473 (54387) */
+    3347, /* D474 (54388) */
+    3347, /* D475 (54389) */
+    3347, /* D476 (54390) */
+    3347, /* D477 (54391) */
+    3347, /* D478 (54392) */
+    3347, /* D479 (54393) */
+    3347, /* D47A (54394) */
+    3347, /* D47B (54395) */
+    3347, /* D47C (54396) */
+    3347, /* D47D (54397) */
+    3347, /* D47E (54398) */
+    3347, /* D47F (54399) */
+    3347, /* D480 (54400) */
+    3347, /* D481 (54401) */
+    3347, /* D482 (54402) */
+    3347, /* D483 (54403) */
+    3347, /* D484 (54404) */
+    3347, /* D485 (54405) */
+    3347, /* D486 (54406) */
+    3347, /* D487 (54407) */
+    3347, /* D488 (54408) */
+    3347, /* D489 (54409) */
+    3347, /* D48A (54410) */
+    3347, /* D48B (54411) */
+    3347, /* D48C (54412) */
+    3347, /* D48D (54413) */
+    3347, /* D48E (54414) */
+    3347, /* D48F (54415) */
+    3347, /* D490 (54416) */
+    3347, /* D491 (54417) */
+    3347, /* D492 (54418) */
+    3347, /* D493 (54419) */
+    3347, /* D494 (54420) */
+    3347, /* D495 (54421) */
+    3347, /* D496 (54422) */
+    3347, /* D497 (54423) */
+    3347, /* D498 (54424) */
+    3347, /* D499 (54425) */
+    3347, /* D49A (54426) */
+    3347, /* D49B (54427) */
+    3347, /* D49C (54428) */
+    3347, /* D49D (54429) */
+    3347, /* D49E (54430) */
+    3347, /* D49F (54431) */
+    3347, /* D4A0 (54432) */
+    3347, /* D4A1 (54433) */
+    3347, /* D4A2 (54434) */
+    3347, /* D4A3 (54435) */
+    3347, /* D4A4 (54436) */
+    3347, /* D4A5 (54437) */
+    3347, /* D4A6 (54438) */
+    3347, /* D4A7 (54439) */
+    3347, /* D4A8 (54440) */
+    3347, /* D4A9 (54441) */
+    3347, /* D4AA (54442) */
+    3347, /* D4AB (54443) */
+    3347, /* D4AC (54444) */
+    3347, /* D4AD (54445) */
+    3347, /* D4AE (54446) */
+    3347, /* D4AF (54447) */
+    3347, /* D4B0 (54448) */
+    3347, /* D4B1 (54449) */
+    3347, /* D4B2 (54450) */
+    3347, /* D4B3 (54451) */
+    3347, /* D4B4 (54452) */
+    3347, /* D4B5 (54453) */
+    3347, /* D4B6 (54454) */
+    3347, /* D4B7 (54455) */
+    3347, /* D4B8 (54456) */
+    3347, /* D4B9 (54457) */
+    3347, /* D4BA (54458) */
+    3347, /* D4BB (54459) */
+    3347, /* D4BC (54460) */
+    3347, /* D4BD (54461) */
+    3347, /* D4BE (54462) */
+    3347, /* D4BF (54463) */
+    3347, /* D4C0 (54464) */
+    3347, /* D4C1 (54465) */
+    3347, /* D4C2 (54466) */
+    3347, /* D4C3 (54467) */
+    3347, /* D4C4 (54468) */
+    3347, /* D4C5 (54469) */
+    3347, /* D4C6 (54470) */
+    3347, /* D4C7 (54471) */
+    3347, /* D4C8 (54472) */
+    3347, /* D4C9 (54473) */
+    3347, /* D4CA (54474) */
+    3347, /* D4CB (54475) */
+    3347, /* D4CC (54476) */
+    3347, /* D4CD (54477) */
+    3347, /* D4CE (54478) */
+    3347, /* D4CF (54479) */
+    3347, /* D4D0 (54480) */
+    3347, /* D4D1 (54481) */
+    3347, /* D4D2 (54482) */
+    3347, /* D4D3 (54483) */
+    3347, /* D4D4 (54484) */
+    3347, /* D4D5 (54485) */
+    3347, /* D4D6 (54486) */
+    3347, /* D4D7 (54487) */
+    3347, /* D4D8 (54488) */
+    3347, /* D4D9 (54489) */
+    3347, /* D4DA (54490) */
+    3347, /* D4DB (54491) */
+    3347, /* D4DC (54492) */
+    3347, /* D4DD (54493) */
+    3347, /* D4DE (54494) */
+    3347, /* D4DF (54495) */
+    3347, /* D4E0 (54496) */
+    3347, /* D4E1 (54497) */
+    3347, /* D4E2 (54498) */
+    3347, /* D4E3 (54499) */
+    3347, /* D4E4 (54500) */
+    3347, /* D4E5 (54501) */
+    3347, /* D4E6 (54502) */
+    3347, /* D4E7 (54503) */
+    3347, /* D4E8 (54504) */
+    3347, /* D4E9 (54505) */
+    3347, /* D4EA (54506) */
+    3347, /* D4EB (54507) */
+    3347, /* D4EC (54508) */
+    3347, /* D4ED (54509) */
+    3347, /* D4EE (54510) */
+    3347, /* D4EF (54511) */
+    3347, /* D4F0 (54512) */
+    3347, /* D4F1 (54513) */
+    3347, /* D4F2 (54514) */
+    3347, /* D4F3 (54515) */
+    3347, /* D4F4 (54516) */
+    3347, /* D4F5 (54517) */
+    3347, /* D4F6 (54518) */
+    3347, /* D4F7 (54519) */
+    3347, /* D4F8 (54520) */
+    3347, /* D4F9 (54521) */
+    3347, /* D4FA (54522) */
+    3347, /* D4FB (54523) */
+    3347, /* D4FC (54524) */
+    3347, /* D4FD (54525) */
+    3347, /* D4FE (54526) */
+    3347, /* D4FF (54527) */
+    3347, /* D500 (54528) */
+    3347, /* D501 (54529) */
+    3347, /* D502 (54530) */
+    3347, /* D503 (54531) */
+    3347, /* D504 (54532) */
+    3347, /* D505 (54533) */
+    3347, /* D506 (54534) */
+    3347, /* D507 (54535) */
+    3347, /* D508 (54536) */
+    3347, /* D509 (54537) */
+    3347, /* D50A (54538) */
+    3347, /* D50B (54539) */
+    3347, /* D50C (54540) */
+    3347, /* D50D (54541) */
+    3347, /* D50E (54542) */
+    3347, /* D50F (54543) */
+    3347, /* D510 (54544) */
+    3347, /* D511 (54545) */
+    3347, /* D512 (54546) */
+    3347, /* D513 (54547) */
+    3347, /* D514 (54548) */
+    3347, /* D515 (54549) */
+    3347, /* D516 (54550) */
+    3347, /* D517 (54551) */
+    3347, /* D518 (54552) */
+    3347, /* D519 (54553) */
+    3347, /* D51A (54554) */
+    3347, /* D51B (54555) */
+    3347, /* D51C (54556) */
+    3347, /* D51D (54557) */
+    3347, /* D51E (54558) */
+    3347, /* D51F (54559) */
+    3347, /* D520 (54560) */
+    3347, /* D521 (54561) */
+    3347, /* D522 (54562) */
+    3347, /* D523 (54563) */
+    3347, /* D524 (54564) */
+    3347, /* D525 (54565) */
+    3347, /* D526 (54566) */
+    3347, /* D527 (54567) */
+    3347, /* D528 (54568) */
+    3347, /* D529 (54569) */
+    3347, /* D52A (54570) */
+    3347, /* D52B (54571) */
+    3347, /* D52C (54572) */
+    3347, /* D52D (54573) */
+    3347, /* D52E (54574) */
+    3347, /* D52F (54575) */
+    3347, /* D530 (54576) */
+    3347, /* D531 (54577) */
+    3347, /* D532 (54578) */
+    3347, /* D533 (54579) */
+    3347, /* D534 (54580) */
+    3347, /* D535 (54581) */
+    3347, /* D536 (54582) */
+    3347, /* D537 (54583) */
+    3347, /* D538 (54584) */
+    3347, /* D539 (54585) */
+    3347, /* D53A (54586) */
+    3347, /* D53B (54587) */
+    3347, /* D53C (54588) */
+    3347, /* D53D (54589) */
+    3347, /* D53E (54590) */
+    3347, /* D53F (54591) */
+    3347, /* D540 (54592) */
+    3347, /* D541 (54593) */
+    3347, /* D542 (54594) */
+    3347, /* D543 (54595) */
+    3347, /* D544 (54596) */
+    3347, /* D545 (54597) */
+    3347, /* D546 (54598) */
+    3347, /* D547 (54599) */
+    3347, /* D548 (54600) */
+    3347, /* D549 (54601) */
+    3347, /* D54A (54602) */
+    3347, /* D54B (54603) */
+    3347, /* D54C (54604) */
+    3347, /* D54D (54605) */
+    3347, /* D54E (54606) */
+    3347, /* D54F (54607) */
+    3347, /* D550 (54608) */
+    3347, /* D551 (54609) */
+    3347, /* D552 (54610) */
+    3347, /* D553 (54611) */
+    3347, /* D554 (54612) */
+    3347, /* D555 (54613) */
+    3347, /* D556 (54614) */
+    3347, /* D557 (54615) */
+    3347, /* D558 (54616) */
+    3347, /* D559 (54617) */
+    3347, /* D55A (54618) */
+    3347, /* D55B (54619) */
+    3347, /* D55C (54620) */
+    3347, /* D55D (54621) */
+    3347, /* D55E (54622) */
+    3347, /* D55F (54623) */
+    3347, /* D560 (54624) */
+    3347, /* D561 (54625) */
+    3347, /* D562 (54626) */
+    3347, /* D563 (54627) */
+    3347, /* D564 (54628) */
+    3347, /* D565 (54629) */
+    3347, /* D566 (54630) */
+    3347, /* D567 (54631) */
+    3347, /* D568 (54632) */
+    3347, /* D569 (54633) */
+    3347, /* D56A (54634) */
+    3347, /* D56B (54635) */
+    3347, /* D56C (54636) */
+    3347, /* D56D (54637) */
+    3347, /* D56E (54638) */
+    3347, /* D56F (54639) */
+    3347, /* D570 (54640) */
+    3347, /* D571 (54641) */
+    3347, /* D572 (54642) */
+    3347, /* D573 (54643) */
+    3347, /* D574 (54644) */
+    3347, /* D575 (54645) */
+    3347, /* D576 (54646) */
+    3347, /* D577 (54647) */
+    3347, /* D578 (54648) */
+    3347, /* D579 (54649) */
+    3347, /* D57A (54650) */
+    3347, /* D57B (54651) */
+    3347, /* D57C (54652) */
+    3347, /* D57D (54653) */
+    3347, /* D57E (54654) */
+    3347, /* D57F (54655) */
+    3347, /* D580 (54656) */
+    3347, /* D581 (54657) */
+    3347, /* D582 (54658) */
+    3347, /* D583 (54659) */
+    3347, /* D584 (54660) */
+    3347, /* D585 (54661) */
+    3347, /* D586 (54662) */
+    3347, /* D587 (54663) */
+    3347, /* D588 (54664) */
+    3347, /* D589 (54665) */
+    3347, /* D58A (54666) */
+    3347, /* D58B (54667) */
+    3347, /* D58C (54668) */
+    3347, /* D58D (54669) */
+    3347, /* D58E (54670) */
+    3347, /* D58F (54671) */
+    3347, /* D590 (54672) */
+    3347, /* D591 (54673) */
+    3347, /* D592 (54674) */
+    3347, /* D593 (54675) */
+    3347, /* D594 (54676) */
+    3347, /* D595 (54677) */
+    3347, /* D596 (54678) */
+    3347, /* D597 (54679) */
+    3347, /* D598 (54680) */
+    3347, /* D599 (54681) */
+    3347, /* D59A (54682) */
+    3347, /* D59B (54683) */
+    3347, /* D59C (54684) */
+    3347, /* D59D (54685) */
+    3347, /* D59E (54686) */
+    3347, /* D59F (54687) */
+    3347, /* D5A0 (54688) */
+    3347, /* D5A1 (54689) */
+    3347, /* D5A2 (54690) */
+    3347, /* D5A3 (54691) */
+    3347, /* D5A4 (54692) */
+    3347, /* D5A5 (54693) */
+    3347, /* D5A6 (54694) */
+    3347, /* D5A7 (54695) */
+    3347, /* D5A8 (54696) */
+    3347, /* D5A9 (54697) */
+    3347, /* D5AA (54698) */
+    3347, /* D5AB (54699) */
+    3347, /* D5AC (54700) */
+    3347, /* D5AD (54701) */
+    3347, /* D5AE (54702) */
+    3347, /* D5AF (54703) */
+    3347, /* D5B0 (54704) */
+    3347, /* D5B1 (54705) */
+    3347, /* D5B2 (54706) */
+    3347, /* D5B3 (54707) */
+    3347, /* D5B4 (54708) */
+    3347, /* D5B5 (54709) */
+    3347, /* D5B6 (54710) */
+    3347, /* D5B7 (54711) */
+    3347, /* D5B8 (54712) */
+    3347, /* D5B9 (54713) */
+    3347, /* D5BA (54714) */
+    3347, /* D5BB (54715) */
+    3347, /* D5BC (54716) */
+    3347, /* D5BD (54717) */
+    3347, /* D5BE (54718) */
+    3347, /* D5BF (54719) */
+    3347, /* D5C0 (54720) */
+    3347, /* D5C1 (54721) */
+    3347, /* D5C2 (54722) */
+    3347, /* D5C3 (54723) */
+    3347, /* D5C4 (54724) */
+    3347, /* D5C5 (54725) */
+    3347, /* D5C6 (54726) */
+    3347, /* D5C7 (54727) */
+    3347, /* D5C8 (54728) */
+    3347, /* D5C9 (54729) */
+    3347, /* D5CA (54730) */
+    3347, /* D5CB (54731) */
+    3347, /* D5CC (54732) */
+    3347, /* D5CD (54733) */
+    3347, /* D5CE (54734) */
+    3347, /* D5CF (54735) */
+    3347, /* D5D0 (54736) */
+    3347, /* D5D1 (54737) */
+    3347, /* D5D2 (54738) */
+    3347, /* D5D3 (54739) */
+    3347, /* D5D4 (54740) */
+    3347, /* D5D5 (54741) */
+    3347, /* D5D6 (54742) */
+    3347, /* D5D7 (54743) */
+    3347, /* D5D8 (54744) */
+    3347, /* D5D9 (54745) */
+    3347, /* D5DA (54746) */
+    3347, /* D5DB (54747) */
+    3347, /* D5DC (54748) */
+    3347, /* D5DD (54749) */
+    3347, /* D5DE (54750) */
+    3347, /* D5DF (54751) */
+    3347, /* D5E0 (54752) */
+    3347, /* D5E1 (54753) */
+    3347, /* D5E2 (54754) */
+    3347, /* D5E3 (54755) */
+    3347, /* D5E4 (54756) */
+    3347, /* D5E5 (54757) */
+    3347, /* D5E6 (54758) */
+    3347, /* D5E7 (54759) */
+    3347, /* D5E8 (54760) */
+    3347, /* D5E9 (54761) */
+    3347, /* D5EA (54762) */
+    3347, /* D5EB (54763) */
+    3347, /* D5EC (54764) */
+    3347, /* D5ED (54765) */
+    3347, /* D5EE (54766) */
+    3347, /* D5EF (54767) */
+    3347, /* D5F0 (54768) */
+    3347, /* D5F1 (54769) */
+    3347, /* D5F2 (54770) */
+    3347, /* D5F3 (54771) */
+    3347, /* D5F4 (54772) */
+    3347, /* D5F5 (54773) */
+    3347, /* D5F6 (54774) */
+    3347, /* D5F7 (54775) */
+    3347, /* D5F8 (54776) */
+    3347, /* D5F9 (54777) */
+    3347, /* D5FA (54778) */
+    3347, /* D5FB (54779) */
+    3347, /* D5FC (54780) */
+    3347, /* D5FD (54781) */
+    3347, /* D5FE (54782) */
+    3347, /* D5FF (54783) */
+    3347, /* D600 (54784) */
+    3347, /* D601 (54785) */
+    3347, /* D602 (54786) */
+    3347, /* D603 (54787) */
+    3347, /* D604 (54788) */
+    3347, /* D605 (54789) */
+    3347, /* D606 (54790) */
+    3347, /* D607 (54791) */
+    3347, /* D608 (54792) */
+    3347, /* D609 (54793) */
+    3347, /* D60A (54794) */
+    3347, /* D60B (54795) */
+    3347, /* D60C (54796) */
+    3347, /* D60D (54797) */
+    3347, /* D60E (54798) */
+    3347, /* D60F (54799) */
+    3347, /* D610 (54800) */
+    3347, /* D611 (54801) */
+    3347, /* D612 (54802) */
+    3347, /* D613 (54803) */
+    3347, /* D614 (54804) */
+    3347, /* D615 (54805) */
+    3347, /* D616 (54806) */
+    3347, /* D617 (54807) */
+    3347, /* D618 (54808) */
+    3347, /* D619 (54809) */
+    3347, /* D61A (54810) */
+    3347, /* D61B (54811) */
+    3347, /* D61C (54812) */
+    3347, /* D61D (54813) */
+    3347, /* D61E (54814) */
+    3347, /* D61F (54815) */
+    3347, /* D620 (54816) */
+    3347, /* D621 (54817) */
+    3347, /* D622 (54818) */
+    3347, /* D623 (54819) */
+    3347, /* D624 (54820) */
+    3347, /* D625 (54821) */
+    3347, /* D626 (54822) */
+    3347, /* D627 (54823) */
+    3347, /* D628 (54824) */
+    3347, /* D629 (54825) */
+    3347, /* D62A (54826) */
+    3347, /* D62B (54827) */
+    3347, /* D62C (54828) */
+    3347, /* D62D (54829) */
+    3347, /* D62E (54830) */
+    3347, /* D62F (54831) */
+    3347, /* D630 (54832) */
+    3347, /* D631 (54833) */
+    3347, /* D632 (54834) */
+    3347, /* D633 (54835) */
+    3347, /* D634 (54836) */
+    3347, /* D635 (54837) */
+    3347, /* D636 (54838) */
+    3347, /* D637 (54839) */
+    3347, /* D638 (54840) */
+    3347, /* D639 (54841) */
+    3347, /* D63A (54842) */
+    3347, /* D63B (54843) */
+    3347, /* D63C (54844) */
+    3347, /* D63D (54845) */
+    3347, /* D63E (54846) */
+    3347, /* D63F (54847) */
+    3347, /* D640 (54848) */
+    3347, /* D641 (54849) */
+    3347, /* D642 (54850) */
+    3347, /* D643 (54851) */
+    3347, /* D644 (54852) */
+    3347, /* D645 (54853) */
+    3347, /* D646 (54854) */
+    3347, /* D647 (54855) */
+    3347, /* D648 (54856) */
+    3347, /* D649 (54857) */
+    3347, /* D64A (54858) */
+    3347, /* D64B (54859) */
+    3347, /* D64C (54860) */
+    3347, /* D64D (54861) */
+    3347, /* D64E (54862) */
+    3347, /* D64F (54863) */
+    3347, /* D650 (54864) */
+    3347, /* D651 (54865) */
+    3347, /* D652 (54866) */
+    3347, /* D653 (54867) */
+    3347, /* D654 (54868) */
+    3347, /* D655 (54869) */
+    3347, /* D656 (54870) */
+    3347, /* D657 (54871) */
+    3347, /* D658 (54872) */
+    3347, /* D659 (54873) */
+    3347, /* D65A (54874) */
+    3347, /* D65B (54875) */
+    3347, /* D65C (54876) */
+    3347, /* D65D (54877) */
+    3347, /* D65E (54878) */
+    3347, /* D65F (54879) */
+    3347, /* D660 (54880) */
+    3347, /* D661 (54881) */
+    3347, /* D662 (54882) */
+    3347, /* D663 (54883) */
+    3347, /* D664 (54884) */
+    3347, /* D665 (54885) */
+    3347, /* D666 (54886) */
+    3347, /* D667 (54887) */
+    3347, /* D668 (54888) */
+    3347, /* D669 (54889) */
+    3347, /* D66A (54890) */
+    3347, /* D66B (54891) */
+    3347, /* D66C (54892) */
+    3347, /* D66D (54893) */
+    3347, /* D66E (54894) */
+    3347, /* D66F (54895) */
+    3347, /* D670 (54896) */
+    3347, /* D671 (54897) */
+    3347, /* D672 (54898) */
+    3347, /* D673 (54899) */
+    3347, /* D674 (54900) */
+    3347, /* D675 (54901) */
+    3347, /* D676 (54902) */
+    3347, /* D677 (54903) */
+    3347, /* D678 (54904) */
+    3347, /* D679 (54905) */
+    3347, /* D67A (54906) */
+    3347, /* D67B (54907) */
+    3347, /* D67C (54908) */
+    3347, /* D67D (54909) */
+    3347, /* D67E (54910) */
+    3347, /* D67F (54911) */
+    3347, /* D680 (54912) */
+    3347, /* D681 (54913) */
+    3347, /* D682 (54914) */
+    3347, /* D683 (54915) */
+    3347, /* D684 (54916) */
+    3347, /* D685 (54917) */
+    3347, /* D686 (54918) */
+    3347, /* D687 (54919) */
+    3347, /* D688 (54920) */
+    3347, /* D689 (54921) */
+    3347, /* D68A (54922) */
+    3347, /* D68B (54923) */
+    3347, /* D68C (54924) */
+    3347, /* D68D (54925) */
+    3347, /* D68E (54926) */
+    3347, /* D68F (54927) */
+    3347, /* D690 (54928) */
+    3347, /* D691 (54929) */
+    3347, /* D692 (54930) */
+    3347, /* D693 (54931) */
+    3347, /* D694 (54932) */
+    3347, /* D695 (54933) */
+    3347, /* D696 (54934) */
+    3347, /* D697 (54935) */
+    3347, /* D698 (54936) */
+    3347, /* D699 (54937) */
+    3347, /* D69A (54938) */
+    3347, /* D69B (54939) */
+    3347, /* D69C (54940) */
+    3347, /* D69D (54941) */
+    3347, /* D69E (54942) */
+    3347, /* D69F (54943) */
+    3347, /* D6A0 (54944) */
+    3347, /* D6A1 (54945) */
+    3347, /* D6A2 (54946) */
+    3347, /* D6A3 (54947) */
+    3347, /* D6A4 (54948) */
+    3347, /* D6A5 (54949) */
+    3347, /* D6A6 (54950) */
+    3347, /* D6A7 (54951) */
+    3347, /* D6A8 (54952) */
+    3347, /* D6A9 (54953) */
+    3347, /* D6AA (54954) */
+    3347, /* D6AB (54955) */
+    3347, /* D6AC (54956) */
+    3347, /* D6AD (54957) */
+    3347, /* D6AE (54958) */
+    3347, /* D6AF (54959) */
+    3347, /* D6B0 (54960) */
+    3347, /* D6B1 (54961) */
+    3347, /* D6B2 (54962) */
+    3347, /* D6B3 (54963) */
+    3347, /* D6B4 (54964) */
+    3347, /* D6B5 (54965) */
+    3347, /* D6B6 (54966) */
+    3347, /* D6B7 (54967) */
+    3347, /* D6B8 (54968) */
+    3347, /* D6B9 (54969) */
+    3347, /* D6BA (54970) */
+    3347, /* D6BB (54971) */
+    3347, /* D6BC (54972) */
+    3347, /* D6BD (54973) */
+    3347, /* D6BE (54974) */
+    3347, /* D6BF (54975) */
+    3347, /* D6C0 (54976) */
+    3347, /* D6C1 (54977) */
+    3347, /* D6C2 (54978) */
+    3347, /* D6C3 (54979) */
+    3347, /* D6C4 (54980) */
+    3347, /* D6C5 (54981) */
+    3347, /* D6C6 (54982) */
+    3347, /* D6C7 (54983) */
+    3347, /* D6C8 (54984) */
+    3347, /* D6C9 (54985) */
+    3347, /* D6CA (54986) */
+    3347, /* D6CB (54987) */
+    3347, /* D6CC (54988) */
+    3347, /* D6CD (54989) */
+    3347, /* D6CE (54990) */
+    3347, /* D6CF (54991) */
+    3347, /* D6D0 (54992) */
+    3347, /* D6D1 (54993) */
+    3347, /* D6D2 (54994) */
+    3347, /* D6D3 (54995) */
+    3347, /* D6D4 (54996) */
+    3347, /* D6D5 (54997) */
+    3347, /* D6D6 (54998) */
+    3347, /* D6D7 (54999) */
+    3347, /* D6D8 (55000) */
+    3347, /* D6D9 (55001) */
+    3347, /* D6DA (55002) */
+    3347, /* D6DB (55003) */
+    3347, /* D6DC (55004) */
+    3347, /* D6DD (55005) */
+    3347, /* D6DE (55006) */
+    3347, /* D6DF (55007) */
+    3347, /* D6E0 (55008) */
+    3347, /* D6E1 (55009) */
+    3347, /* D6E2 (55010) */
+    3347, /* D6E3 (55011) */
+    3347, /* D6E4 (55012) */
+    3347, /* D6E5 (55013) */
+    3347, /* D6E6 (55014) */
+    3347, /* D6E7 (55015) */
+    3347, /* D6E8 (55016) */
+    3347, /* D6E9 (55017) */
+    3347, /* D6EA (55018) */
+    3347, /* D6EB (55019) */
+    3347, /* D6EC (55020) */
+    3347, /* D6ED (55021) */
+    3347, /* D6EE (55022) */
+    3347, /* D6EF (55023) */
+    3347, /* D6F0 (55024) */
+    3347, /* D6F1 (55025) */
+    3347, /* D6F2 (55026) */
+    3347, /* D6F3 (55027) */
+    3347, /* D6F4 (55028) */
+    3347, /* D6F5 (55029) */
+    3347, /* D6F6 (55030) */
+    3347, /* D6F7 (55031) */
+    3347, /* D6F8 (55032) */
+    3347, /* D6F9 (55033) */
+    3347, /* D6FA (55034) */
+    3347, /* D6FB (55035) */
+    3347, /* D6FC (55036) */
+    3347, /* D6FD (55037) */
+    3347, /* D6FE (55038) */
+    3347, /* D6FF (55039) */
+    3347, /* D700 (55040) */
+    3347, /* D701 (55041) */
+    3347, /* D702 (55042) */
+    3347, /* D703 (55043) */
+    3347, /* D704 (55044) */
+    3347, /* D705 (55045) */
+    3347, /* D706 (55046) */
+    3347, /* D707 (55047) */
+    3347, /* D708 (55048) */
+    3347, /* D709 (55049) */
+    3347, /* D70A (55050) */
+    3347, /* D70B (55051) */
+    3347, /* D70C (55052) */
+    3347, /* D70D (55053) */
+    3347, /* D70E (55054) */
+    3347, /* D70F (55055) */
+    3347, /* D710 (55056) */
+    3347, /* D711 (55057) */
+    3347, /* D712 (55058) */
+    3347, /* D713 (55059) */
+    3347, /* D714 (55060) */
+    3347, /* D715 (55061) */
+    3347, /* D716 (55062) */
+    3347, /* D717 (55063) */
+    3347, /* D718 (55064) */
+    3347, /* D719 (55065) */
+    3347, /* D71A (55066) */
+    3347, /* D71B (55067) */
+    3347, /* D71C (55068) */
+    3347, /* D71D (55069) */
+    3347, /* D71E (55070) */
+    3347, /* D71F (55071) */
+    3347, /* D720 (55072) */
+    3347, /* D721 (55073) */
+    3347, /* D722 (55074) */
+    3347, /* D723 (55075) */
+    3347, /* D724 (55076) */
+    3347, /* D725 (55077) */
+    3347, /* D726 (55078) */
+    3347, /* D727 (55079) */
+    3347, /* D728 (55080) */
+    3347, /* D729 (55081) */
+    3347, /* D72A (55082) */
+    3347, /* D72B (55083) */
+    3347, /* D72C (55084) */
+    3347, /* D72D (55085) */
+    3347, /* D72E (55086) */
+    3347, /* D72F (55087) */
+    3347, /* D730 (55088) */
+    3347, /* D731 (55089) */
+    3347, /* D732 (55090) */
+    3347, /* D733 (55091) */
+    3347, /* D734 (55092) */
+    3347, /* D735 (55093) */
+    3347, /* D736 (55094) */
+    3347, /* D737 (55095) */
+    3347, /* D738 (55096) */
+    3347, /* D739 (55097) */
+    3347, /* D73A (55098) */
+    3347, /* D73B (55099) */
+    3347, /* D73C (55100) */
+    3347, /* D73D (55101) */
+    3347, /* D73E (55102) */
+    3347, /* D73F (55103) */
+    3347, /* D740 (55104) */
+    3347, /* D741 (55105) */
+    3347, /* D742 (55106) */
+    3347, /* D743 (55107) */
+    3347, /* D744 (55108) */
+    3347, /* D745 (55109) */
+    3347, /* D746 (55110) */
+    3347, /* D747 (55111) */
+    3347, /* D748 (55112) */
+    3347, /* D749 (55113) */
+    3347, /* D74A (55114) */
+    3347, /* D74B (55115) */
+    3347, /* D74C (55116) */
+    3347, /* D74D (55117) */
+    3347, /* D74E (55118) */
+    3347, /* D74F (55119) */
+    3347, /* D750 (55120) */
+    3347, /* D751 (55121) */
+    3347, /* D752 (55122) */
+    3347, /* D753 (55123) */
+    3347, /* D754 (55124) */
+    3347, /* D755 (55125) */
+    3347, /* D756 (55126) */
+    3347, /* D757 (55127) */
+    3347, /* D758 (55128) */
+    3347, /* D759 (55129) */
+    3347, /* D75A (55130) */
+    3347, /* D75B (55131) */
+    3347, /* D75C (55132) */
+    3347, /* D75D (55133) */
+    3347, /* D75E (55134) */
+    3347, /* D75F (55135) */
+    3347, /* D760 (55136) */
+    3347, /* D761 (55137) */
+    3347, /* D762 (55138) */
+    3347, /* D763 (55139) */
+    3347, /* D764 (55140) */
+    3347, /* D765 (55141) */
+    3347, /* D766 (55142) */
+    3347, /* D767 (55143) */
+    3347, /* D768 (55144) */
+    3347, /* D769 (55145) */
+    3347, /* D76A (55146) */
+    3347, /* D76B (55147) */
+    3347, /* D76C (55148) */
+    3347, /* D76D (55149) */
+    3347, /* D76E (55150) */
+    3347, /* D76F (55151) */
+    3347, /* D770 (55152) */
+    3347, /* D771 (55153) */
+    3347, /* D772 (55154) */
+    3347, /* D773 (55155) */
+    3347, /* D774 (55156) */
+    3347, /* D775 (55157) */
+    3347, /* D776 (55158) */
+    3347, /* D777 (55159) */
+    3347, /* D778 (55160) */
+    3347, /* D779 (55161) */
+    3347, /* D77A (55162) */
+    3347, /* D77B (55163) */
+    3347, /* D77C (55164) */
+    3347, /* D77D (55165) */
+    3347, /* D77E (55166) */
+    3347, /* D77F (55167) */
+    3347, /* D780 (55168) */
+    3347, /* D781 (55169) */
+    3347, /* D782 (55170) */
+    3347, /* D783 (55171) */
+    3347, /* D784 (55172) */
+    3347, /* D785 (55173) */
+    3347, /* D786 (55174) */
+    3347, /* D787 (55175) */
+    3347, /* D788 (55176) */
+    3347, /* D789 (55177) */
+    3347, /* D78A (55178) */
+    3347, /* D78B (55179) */
+    3347, /* D78C (55180) */
+    3347, /* D78D (55181) */
+    3347, /* D78E (55182) */
+    3347, /* D78F (55183) */
+    3347, /* D790 (55184) */
+    3347, /* D791 (55185) */
+    3347, /* D792 (55186) */
+    3347, /* D793 (55187) */
+    3347, /* D794 (55188) */
+    3347, /* D795 (55189) */
+    3347, /* D796 (55190) */
+    3347, /* D797 (55191) */
+    3347, /* D798 (55192) */
+    3347, /* D799 (55193) */
+    3347, /* D79A (55194) */
+    3347, /* D79B (55195) */
+    3347, /* D79C (55196) */
+    3347, /* D79D (55197) */
+    3347, /* D79E (55198) */
+    3347, /* D79F (55199) */
+    3347, /* D7A0 (55200) */
+    3347, /* D7A1 (55201) */
+    3347, /* D7A2 (55202) */
+    3347, /* D7A3 (55203) */
     56, /* D7A4 (55204) */
     56, /* D7A5 (55205) */
     56, /* D7A6 (55206) */
@@ -57372,480 +57372,480 @@ static const uint16_t lxb_unicode_table_map_0_57345[57345] =
 static const uint16_t lxb_unicode_table_map_63743_83527[19784] =
 {
     56, /* F8FF (63743) */
-    3344, /* F900 (63744) */
-    3345, /* F901 (63745) */
-    3346, /* F902 (63746) */
-    3347, /* F903 (63747) */
-    3348, /* F904 (63748) */
-    3349, /* F905 (63749) */
-    3350, /* F906 (63750) */
-    3351, /* F907 (63751) */
-    3351, /* F908 (63752) */
-    3352, /* F909 (63753) */
-    3353, /* F90A (63754) */
-    3354, /* F90B (63755) */
-    3355, /* F90C (63756) */
-    3356, /* F90D (63757) */
-    3357, /* F90E (63758) */
-    3358, /* F90F (63759) */
-    3359, /* F910 (63760) */
-    3360, /* F911 (63761) */
-    3361, /* F912 (63762) */
-    3362, /* F913 (63763) */
-    3363, /* F914 (63764) */
-    3364, /* F915 (63765) */
-    3365, /* F916 (63766) */
-    3366, /* F917 (63767) */
-    3367, /* F918 (63768) */
-    3368, /* F919 (63769) */
-    3369, /* F91A (63770) */
-    3370, /* F91B (63771) */
-    3371, /* F91C (63772) */
-    3372, /* F91D (63773) */
-    3373, /* F91E (63774) */
-    3374, /* F91F (63775) */
-    3375, /* F920 (63776) */
-    3376, /* F921 (63777) */
-    3377, /* F922 (63778) */
-    3378, /* F923 (63779) */
-    3379, /* F924 (63780) */
-    3380, /* F925 (63781) */
-    3381, /* F926 (63782) */
-    3382, /* F927 (63783) */
-    3383, /* F928 (63784) */
-    3384, /* F929 (63785) */
-    3385, /* F92A (63786) */
-    3386, /* F92B (63787) */
-    3387, /* F92C (63788) */
-    3388, /* F92D (63789) */
-    3389, /* F92E (63790) */
-    3390, /* F92F (63791) */
-    3391, /* F930 (63792) */
-    3392, /* F931 (63793) */
-    3393, /* F932 (63794) */
-    3394, /* F933 (63795) */
-    3395, /* F934 (63796) */
-    3396, /* F935 (63797) */
-    3397, /* F936 (63798) */
-    3398, /* F937 (63799) */
-    3399, /* F938 (63800) */
-    3400, /* F939 (63801) */
-    3401, /* F93A (63802) */
-    3402, /* F93B (63803) */
-    3403, /* F93C (63804) */
-    3404, /* F93D (63805) */
-    3405, /* F93E (63806) */
-    3406, /* F93F (63807) */
-    3407, /* F940 (63808) */
-    3408, /* F941 (63809) */
-    3409, /* F942 (63810) */
-    3410, /* F943 (63811) */
-    3411, /* F944 (63812) */
-    3412, /* F945 (63813) */
-    3413, /* F946 (63814) */
-    3414, /* F947 (63815) */
-    3415, /* F948 (63816) */
-    3416, /* F949 (63817) */
-    3417, /* F94A (63818) */
-    3418, /* F94B (63819) */
-    3419, /* F94C (63820) */
-    3420, /* F94D (63821) */
-    3421, /* F94E (63822) */
-    3422, /* F94F (63823) */
-    3423, /* F950 (63824) */
-    3424, /* F951 (63825) */
-    3425, /* F952 (63826) */
-    3426, /* F953 (63827) */
-    3427, /* F954 (63828) */
-    3428, /* F955 (63829) */
-    3429, /* F956 (63830) */
-    3430, /* F957 (63831) */
-    3431, /* F958 (63832) */
-    3432, /* F959 (63833) */
-    3433, /* F95A (63834) */
-    3434, /* F95B (63835) */
-    3363, /* F95C (63836) */
-    3435, /* F95D (63837) */
-    3436, /* F95E (63838) */
-    3437, /* F95F (63839) */
-    3438, /* F960 (63840) */
-    3439, /* F961 (63841) */
-    3440, /* F962 (63842) */
-    3441, /* F963 (63843) */
-    3442, /* F964 (63844) */
-    3443, /* F965 (63845) */
-    3444, /* F966 (63846) */
-    3445, /* F967 (63847) */
-    3446, /* F968 (63848) */
-    3447, /* F969 (63849) */
-    3448, /* F96A (63850) */
-    3449, /* F96B (63851) */
-    3450, /* F96C (63852) */
-    3451, /* F96D (63853) */
-    3452, /* F96E (63854) */
-    3453, /* F96F (63855) */
-    3454, /* F970 (63856) */
-    3455, /* F971 (63857) */
-    3456, /* F972 (63858) */
-    3457, /* F973 (63859) */
-    3458, /* F974 (63860) */
-    3459, /* F975 (63861) */
-    3460, /* F976 (63862) */
-    3461, /* F977 (63863) */
-    3462, /* F978 (63864) */
-    3463, /* F979 (63865) */
-    3464, /* F97A (63866) */
-    3465, /* F97B (63867) */
-    3466, /* F97C (63868) */
-    3467, /* F97D (63869) */
-    3468, /* F97E (63870) */
-    3469, /* F97F (63871) */
-    3470, /* F980 (63872) */
-    3471, /* F981 (63873) */
-    3472, /* F982 (63874) */
-    3473, /* F983 (63875) */
-    3474, /* F984 (63876) */
-    3475, /* F985 (63877) */
-    3476, /* F986 (63878) */
-    3477, /* F987 (63879) */
-    3478, /* F988 (63880) */
-    3479, /* F989 (63881) */
-    3480, /* F98A (63882) */
-    3481, /* F98B (63883) */
-    3482, /* F98C (63884) */
-    3483, /* F98D (63885) */
-    3484, /* F98E (63886) */
-    3485, /* F98F (63887) */
-    3486, /* F990 (63888) */
-    3487, /* F991 (63889) */
-    3488, /* F992 (63890) */
-    3489, /* F993 (63891) */
-    3490, /* F994 (63892) */
-    3491, /* F995 (63893) */
-    3492, /* F996 (63894) */
-    3493, /* F997 (63895) */
-    3494, /* F998 (63896) */
-    3495, /* F999 (63897) */
-    3496, /* F99A (63898) */
-    3497, /* F99B (63899) */
-    3498, /* F99C (63900) */
-    3499, /* F99D (63901) */
-    3500, /* F99E (63902) */
-    3501, /* F99F (63903) */
-    3502, /* F9A0 (63904) */
-    3453, /* F9A1 (63905) */
-    3503, /* F9A2 (63906) */
-    3504, /* F9A3 (63907) */
-    3505, /* F9A4 (63908) */
-    3506, /* F9A5 (63909) */
-    3507, /* F9A6 (63910) */
-    3508, /* F9A7 (63911) */
-    3509, /* F9A8 (63912) */
-    3510, /* F9A9 (63913) */
-    3437, /* F9AA (63914) */
-    3511, /* F9AB (63915) */
-    3512, /* F9AC (63916) */
-    3513, /* F9AD (63917) */
-    3514, /* F9AE (63918) */
-    3515, /* F9AF (63919) */
-    3516, /* F9B0 (63920) */
-    3517, /* F9B1 (63921) */
-    3518, /* F9B2 (63922) */
-    3519, /* F9B3 (63923) */
-    3520, /* F9B4 (63924) */
-    3521, /* F9B5 (63925) */
-    3522, /* F9B6 (63926) */
-    3523, /* F9B7 (63927) */
-    3524, /* F9B8 (63928) */
-    3525, /* F9B9 (63929) */
-    3526, /* F9BA (63930) */
-    3527, /* F9BB (63931) */
-    3528, /* F9BC (63932) */
-    3529, /* F9BD (63933) */
-    3530, /* F9BE (63934) */
-    3363, /* F9BF (63935) */
-    3531, /* F9C0 (63936) */
-    3532, /* F9C1 (63937) */
-    3533, /* F9C2 (63938) */
-    3534, /* F9C3 (63939) */
-    3535, /* F9C4 (63940) */
-    3536, /* F9C5 (63941) */
-    3537, /* F9C6 (63942) */
-    3538, /* F9C7 (63943) */
-    3539, /* F9C8 (63944) */
-    3540, /* F9C9 (63945) */
-    3541, /* F9CA (63946) */
-    3542, /* F9CB (63947) */
-    3543, /* F9CC (63948) */
-    3544, /* F9CD (63949) */
-    3545, /* F9CE (63950) */
-    3546, /* F9CF (63951) */
-    3547, /* F9D0 (63952) */
-    3548, /* F9D1 (63953) */
-    3549, /* F9D2 (63954) */
-    3550, /* F9D3 (63955) */
-    3551, /* F9D4 (63956) */
-    3552, /* F9D5 (63957) */
-    3553, /* F9D6 (63958) */
-    3554, /* F9D7 (63959) */
-    3555, /* F9D8 (63960) */
-    3556, /* F9D9 (63961) */
-    3557, /* F9DA (63962) */
-    3439, /* F9DB (63963) */
-    3558, /* F9DC (63964) */
-    3559, /* F9DD (63965) */
-    3560, /* F9DE (63966) */
-    3561, /* F9DF (63967) */
-    3562, /* F9E0 (63968) */
-    3563, /* F9E1 (63969) */
-    3564, /* F9E2 (63970) */
-    3565, /* F9E3 (63971) */
-    3566, /* F9E4 (63972) */
-    3567, /* F9E5 (63973) */
-    3568, /* F9E6 (63974) */
-    3569, /* F9E7 (63975) */
-    3570, /* F9E8 (63976) */
-    3571, /* F9E9 (63977) */
-    3572, /* F9EA (63978) */
-    3573, /* F9EB (63979) */
-    3574, /* F9EC (63980) */
-    3575, /* F9ED (63981) */
-    3576, /* F9EE (63982) */
-    3577, /* F9EF (63983) */
-    3578, /* F9F0 (63984) */
-    3579, /* F9F1 (63985) */
-    3580, /* F9F2 (63986) */
-    3581, /* F9F3 (63987) */
-    3582, /* F9F4 (63988) */
-    3583, /* F9F5 (63989) */
-    3584, /* F9F6 (63990) */
-    3585, /* F9F7 (63991) */
-    3586, /* F9F8 (63992) */
-    3587, /* F9F9 (63993) */
-    3588, /* F9FA (63994) */
-    3589, /* F9FB (63995) */
-    3590, /* F9FC (63996) */
-    3591, /* F9FD (63997) */
-    3592, /* F9FE (63998) */
-    3593, /* F9FF (63999) */
-    3594, /* FA00 (64000) */
-    3595, /* FA01 (64001) */
-    3596, /* FA02 (64002) */
-    3597, /* FA03 (64003) */
-    3598, /* FA04 (64004) */
-    3599, /* FA05 (64005) */
-    3600, /* FA06 (64006) */
-    3601, /* FA07 (64007) */
-    3602, /* FA08 (64008) */
-    3603, /* FA09 (64009) */
-    3604, /* FA0A (64010) */
-    3605, /* FA0B (64011) */
-    3606, /* FA0C (64012) */
-    3607, /* FA0D (64013) */
+    3348, /* F900 (63744) */
+    3349, /* F901 (63745) */
+    3350, /* F902 (63746) */
+    3351, /* F903 (63747) */
+    3352, /* F904 (63748) */
+    3353, /* F905 (63749) */
+    3354, /* F906 (63750) */
+    3355, /* F907 (63751) */
+    3355, /* F908 (63752) */
+    3356, /* F909 (63753) */
+    3357, /* F90A (63754) */
+    3358, /* F90B (63755) */
+    3359, /* F90C (63756) */
+    3360, /* F90D (63757) */
+    3361, /* F90E (63758) */
+    3362, /* F90F (63759) */
+    3363, /* F910 (63760) */
+    3364, /* F911 (63761) */
+    3365, /* F912 (63762) */
+    3366, /* F913 (63763) */
+    3367, /* F914 (63764) */
+    3368, /* F915 (63765) */
+    3369, /* F916 (63766) */
+    3370, /* F917 (63767) */
+    3371, /* F918 (63768) */
+    3372, /* F919 (63769) */
+    3373, /* F91A (63770) */
+    3374, /* F91B (63771) */
+    3375, /* F91C (63772) */
+    3376, /* F91D (63773) */
+    3377, /* F91E (63774) */
+    3378, /* F91F (63775) */
+    3379, /* F920 (63776) */
+    3380, /* F921 (63777) */
+    3381, /* F922 (63778) */
+    3382, /* F923 (63779) */
+    3383, /* F924 (63780) */
+    3384, /* F925 (63781) */
+    3385, /* F926 (63782) */
+    3386, /* F927 (63783) */
+    3387, /* F928 (63784) */
+    3388, /* F929 (63785) */
+    3389, /* F92A (63786) */
+    3390, /* F92B (63787) */
+    3391, /* F92C (63788) */
+    3392, /* F92D (63789) */
+    3393, /* F92E (63790) */
+    3394, /* F92F (63791) */
+    3395, /* F930 (63792) */
+    3396, /* F931 (63793) */
+    3397, /* F932 (63794) */
+    3398, /* F933 (63795) */
+    3399, /* F934 (63796) */
+    3400, /* F935 (63797) */
+    3401, /* F936 (63798) */
+    3402, /* F937 (63799) */
+    3403, /* F938 (63800) */
+    3404, /* F939 (63801) */
+    3405, /* F93A (63802) */
+    3406, /* F93B (63803) */
+    3407, /* F93C (63804) */
+    3408, /* F93D (63805) */
+    3409, /* F93E (63806) */
+    3410, /* F93F (63807) */
+    3411, /* F940 (63808) */
+    3412, /* F941 (63809) */
+    3413, /* F942 (63810) */
+    3414, /* F943 (63811) */
+    3415, /* F944 (63812) */
+    3416, /* F945 (63813) */
+    3417, /* F946 (63814) */
+    3418, /* F947 (63815) */
+    3419, /* F948 (63816) */
+    3420, /* F949 (63817) */
+    3421, /* F94A (63818) */
+    3422, /* F94B (63819) */
+    3423, /* F94C (63820) */
+    3424, /* F94D (63821) */
+    3425, /* F94E (63822) */
+    3426, /* F94F (63823) */
+    3427, /* F950 (63824) */
+    3428, /* F951 (63825) */
+    3429, /* F952 (63826) */
+    3430, /* F953 (63827) */
+    3431, /* F954 (63828) */
+    3432, /* F955 (63829) */
+    3433, /* F956 (63830) */
+    3434, /* F957 (63831) */
+    3435, /* F958 (63832) */
+    3436, /* F959 (63833) */
+    3437, /* F95A (63834) */
+    3438, /* F95B (63835) */
+    3367, /* F95C (63836) */
+    3439, /* F95D (63837) */
+    3440, /* F95E (63838) */
+    3441, /* F95F (63839) */
+    3442, /* F960 (63840) */
+    3443, /* F961 (63841) */
+    3444, /* F962 (63842) */
+    3445, /* F963 (63843) */
+    3446, /* F964 (63844) */
+    3447, /* F965 (63845) */
+    3448, /* F966 (63846) */
+    3449, /* F967 (63847) */
+    3450, /* F968 (63848) */
+    3451, /* F969 (63849) */
+    3452, /* F96A (63850) */
+    3453, /* F96B (63851) */
+    3454, /* F96C (63852) */
+    3455, /* F96D (63853) */
+    3456, /* F96E (63854) */
+    3457, /* F96F (63855) */
+    3458, /* F970 (63856) */
+    3459, /* F971 (63857) */
+    3460, /* F972 (63858) */
+    3461, /* F973 (63859) */
+    3462, /* F974 (63860) */
+    3463, /* F975 (63861) */
+    3464, /* F976 (63862) */
+    3465, /* F977 (63863) */
+    3466, /* F978 (63864) */
+    3467, /* F979 (63865) */
+    3468, /* F97A (63866) */
+    3469, /* F97B (63867) */
+    3470, /* F97C (63868) */
+    3471, /* F97D (63869) */
+    3472, /* F97E (63870) */
+    3473, /* F97F (63871) */
+    3474, /* F980 (63872) */
+    3475, /* F981 (63873) */
+    3476, /* F982 (63874) */
+    3477, /* F983 (63875) */
+    3478, /* F984 (63876) */
+    3479, /* F985 (63877) */
+    3480, /* F986 (63878) */
+    3481, /* F987 (63879) */
+    3482, /* F988 (63880) */
+    3483, /* F989 (63881) */
+    3484, /* F98A (63882) */
+    3485, /* F98B (63883) */
+    3486, /* F98C (63884) */
+    3487, /* F98D (63885) */
+    3488, /* F98E (63886) */
+    3489, /* F98F (63887) */
+    3490, /* F990 (63888) */
+    3491, /* F991 (63889) */
+    3492, /* F992 (63890) */
+    3493, /* F993 (63891) */
+    3494, /* F994 (63892) */
+    3495, /* F995 (63893) */
+    3496, /* F996 (63894) */
+    3497, /* F997 (63895) */
+    3498, /* F998 (63896) */
+    3499, /* F999 (63897) */
+    3500, /* F99A (63898) */
+    3501, /* F99B (63899) */
+    3502, /* F99C (63900) */
+    3503, /* F99D (63901) */
+    3504, /* F99E (63902) */
+    3505, /* F99F (63903) */
+    3506, /* F9A0 (63904) */
+    3457, /* F9A1 (63905) */
+    3507, /* F9A2 (63906) */
+    3508, /* F9A3 (63907) */
+    3509, /* F9A4 (63908) */
+    3510, /* F9A5 (63909) */
+    3511, /* F9A6 (63910) */
+    3512, /* F9A7 (63911) */
+    3513, /* F9A8 (63912) */
+    3514, /* F9A9 (63913) */
+    3441, /* F9AA (63914) */
+    3515, /* F9AB (63915) */
+    3516, /* F9AC (63916) */
+    3517, /* F9AD (63917) */
+    3518, /* F9AE (63918) */
+    3519, /* F9AF (63919) */
+    3520, /* F9B0 (63920) */
+    3521, /* F9B1 (63921) */
+    3522, /* F9B2 (63922) */
+    3523, /* F9B3 (63923) */
+    3524, /* F9B4 (63924) */
+    3525, /* F9B5 (63925) */
+    3526, /* F9B6 (63926) */
+    3527, /* F9B7 (63927) */
+    3528, /* F9B8 (63928) */
+    3529, /* F9B9 (63929) */
+    3530, /* F9BA (63930) */
+    3531, /* F9BB (63931) */
+    3532, /* F9BC (63932) */
+    3533, /* F9BD (63933) */
+    3534, /* F9BE (63934) */
+    3367, /* F9BF (63935) */
+    3535, /* F9C0 (63936) */
+    3536, /* F9C1 (63937) */
+    3537, /* F9C2 (63938) */
+    3538, /* F9C3 (63939) */
+    3539, /* F9C4 (63940) */
+    3540, /* F9C5 (63941) */
+    3541, /* F9C6 (63942) */
+    3542, /* F9C7 (63943) */
+    3543, /* F9C8 (63944) */
+    3544, /* F9C9 (63945) */
+    3545, /* F9CA (63946) */
+    3546, /* F9CB (63947) */
+    3547, /* F9CC (63948) */
+    3548, /* F9CD (63949) */
+    3549, /* F9CE (63950) */
+    3550, /* F9CF (63951) */
+    3551, /* F9D0 (63952) */
+    3552, /* F9D1 (63953) */
+    3553, /* F9D2 (63954) */
+    3554, /* F9D3 (63955) */
+    3555, /* F9D4 (63956) */
+    3556, /* F9D5 (63957) */
+    3557, /* F9D6 (63958) */
+    3558, /* F9D7 (63959) */
+    3559, /* F9D8 (63960) */
+    3560, /* F9D9 (63961) */
+    3561, /* F9DA (63962) */
+    3443, /* F9DB (63963) */
+    3562, /* F9DC (63964) */
+    3563, /* F9DD (63965) */
+    3564, /* F9DE (63966) */
+    3565, /* F9DF (63967) */
+    3566, /* F9E0 (63968) */
+    3567, /* F9E1 (63969) */
+    3568, /* F9E2 (63970) */
+    3569, /* F9E3 (63971) */
+    3570, /* F9E4 (63972) */
+    3571, /* F9E5 (63973) */
+    3572, /* F9E6 (63974) */
+    3573, /* F9E7 (63975) */
+    3574, /* F9E8 (63976) */
+    3575, /* F9E9 (63977) */
+    3576, /* F9EA (63978) */
+    3577, /* F9EB (63979) */
+    3578, /* F9EC (63980) */
+    3579, /* F9ED (63981) */
+    3580, /* F9EE (63982) */
+    3581, /* F9EF (63983) */
+    3582, /* F9F0 (63984) */
+    3583, /* F9F1 (63985) */
+    3584, /* F9F2 (63986) */
+    3585, /* F9F3 (63987) */
+    3586, /* F9F4 (63988) */
+    3587, /* F9F5 (63989) */
+    3588, /* F9F6 (63990) */
+    3589, /* F9F7 (63991) */
+    3590, /* F9F8 (63992) */
+    3591, /* F9F9 (63993) */
+    3592, /* F9FA (63994) */
+    3593, /* F9FB (63995) */
+    3594, /* F9FC (63996) */
+    3595, /* F9FD (63997) */
+    3596, /* F9FE (63998) */
+    3597, /* F9FF (63999) */
+    3598, /* FA00 (64000) */
+    3599, /* FA01 (64001) */
+    3600, /* FA02 (64002) */
+    3601, /* FA03 (64003) */
+    3602, /* FA04 (64004) */
+    3603, /* FA05 (64005) */
+    3604, /* FA06 (64006) */
+    3605, /* FA07 (64007) */
+    3606, /* FA08 (64008) */
+    3607, /* FA09 (64009) */
+    3608, /* FA0A (64010) */
+    3609, /* FA0B (64011) */
+    3610, /* FA0C (64012) */
+    3611, /* FA0D (64013) */
     1, /* FA0E (64014) */
     1, /* FA0F (64015) */
-    3608, /* FA10 (64016) */
+    3612, /* FA10 (64016) */
     1, /* FA11 (64017) */
-    3609, /* FA12 (64018) */
+    3613, /* FA12 (64018) */
     1, /* FA13 (64019) */
     1, /* FA14 (64020) */
-    3610, /* FA15 (64021) */
-    3611, /* FA16 (64022) */
-    3612, /* FA17 (64023) */
-    3613, /* FA18 (64024) */
-    3614, /* FA19 (64025) */
-    3615, /* FA1A (64026) */
-    3616, /* FA1B (64027) */
-    3617, /* FA1C (64028) */
-    3618, /* FA1D (64029) */
-    3619, /* FA1E (64030) */
+    3614, /* FA15 (64021) */
+    3615, /* FA16 (64022) */
+    3616, /* FA17 (64023) */
+    3617, /* FA18 (64024) */
+    3618, /* FA19 (64025) */
+    3619, /* FA1A (64026) */
+    3620, /* FA1B (64027) */
+    3621, /* FA1C (64028) */
+    3622, /* FA1D (64029) */
+    3623, /* FA1E (64030) */
     1, /* FA1F (64031) */
-    3620, /* FA20 (64032) */
+    3624, /* FA20 (64032) */
     1, /* FA21 (64033) */
-    3621, /* FA22 (64034) */
+    3625, /* FA22 (64034) */
     1, /* FA23 (64035) */
     1, /* FA24 (64036) */
-    3622, /* FA25 (64037) */
-    3623, /* FA26 (64038) */
+    3626, /* FA25 (64037) */
+    3627, /* FA26 (64038) */
     1, /* FA27 (64039) */
     1, /* FA28 (64040) */
     1, /* FA29 (64041) */
-    3624, /* FA2A (64042) */
-    3625, /* FA2B (64043) */
-    3626, /* FA2C (64044) */
-    3627, /* FA2D (64045) */
-    3628, /* FA2E (64046) */
-    3629, /* FA2F (64047) */
-    3630, /* FA30 (64048) */
-    3631, /* FA31 (64049) */
-    3632, /* FA32 (64050) */
-    3633, /* FA33 (64051) */
-    3634, /* FA34 (64052) */
-    3635, /* FA35 (64053) */
-    3636, /* FA36 (64054) */
-    3637, /* FA37 (64055) */
-    3638, /* FA38 (64056) */
-    3639, /* FA39 (64057) */
-    3640, /* FA3A (64058) */
-    3641, /* FA3B (64059) */
-    3642, /* FA3C (64060) */
-    3643, /* FA3D (64061) */
-    3644, /* FA3E (64062) */
-    3645, /* FA3F (64063) */
-    3646, /* FA40 (64064) */
-    3647, /* FA41 (64065) */
-    3648, /* FA42 (64066) */
-    3649, /* FA43 (64067) */
-    3650, /* FA44 (64068) */
-    3651, /* FA45 (64069) */
-    3652, /* FA46 (64070) */
-    3653, /* FA47 (64071) */
-    3654, /* FA48 (64072) */
-    3655, /* FA49 (64073) */
-    3656, /* FA4A (64074) */
-    3657, /* FA4B (64075) */
-    3658, /* FA4C (64076) */
-    3659, /* FA4D (64077) */
-    3660, /* FA4E (64078) */
-    3661, /* FA4F (64079) */
-    3662, /* FA50 (64080) */
-    3663, /* FA51 (64081) */
-    3664, /* FA52 (64082) */
-    3665, /* FA53 (64083) */
-    3666, /* FA54 (64084) */
-    3667, /* FA55 (64085) */
-    3668, /* FA56 (64086) */
-    3492, /* FA57 (64087) */
-    3669, /* FA58 (64088) */
-    3670, /* FA59 (64089) */
-    3671, /* FA5A (64090) */
-    3672, /* FA5B (64091) */
-    3673, /* FA5C (64092) */
-    3674, /* FA5D (64093) */
-    3674, /* FA5E (64094) */
-    3675, /* FA5F (64095) */
-    3676, /* FA60 (64096) */
-    3677, /* FA61 (64097) */
-    3678, /* FA62 (64098) */
-    3679, /* FA63 (64099) */
-    3680, /* FA64 (64100) */
-    3681, /* FA65 (64101) */
-    3682, /* FA66 (64102) */
-    3622, /* FA67 (64103) */
-    3683, /* FA68 (64104) */
-    3684, /* FA69 (64105) */
-    3685, /* FA6A (64106) */
-    3686, /* FA6B (64107) */
-    3687, /* FA6C (64108) */
-    3688, /* FA6D (64109) */
+    3628, /* FA2A (64042) */
+    3629, /* FA2B (64043) */
+    3630, /* FA2C (64044) */
+    3631, /* FA2D (64045) */
+    3632, /* FA2E (64046) */
+    3633, /* FA2F (64047) */
+    3634, /* FA30 (64048) */
+    3635, /* FA31 (64049) */
+    3636, /* FA32 (64050) */
+    3637, /* FA33 (64051) */
+    3638, /* FA34 (64052) */
+    3639, /* FA35 (64053) */
+    3640, /* FA36 (64054) */
+    3641, /* FA37 (64055) */
+    3642, /* FA38 (64056) */
+    3643, /* FA39 (64057) */
+    3644, /* FA3A (64058) */
+    3645, /* FA3B (64059) */
+    3646, /* FA3C (64060) */
+    3647, /* FA3D (64061) */
+    3648, /* FA3E (64062) */
+    3649, /* FA3F (64063) */
+    3650, /* FA40 (64064) */
+    3651, /* FA41 (64065) */
+    3652, /* FA42 (64066) */
+    3653, /* FA43 (64067) */
+    3654, /* FA44 (64068) */
+    3655, /* FA45 (64069) */
+    3656, /* FA46 (64070) */
+    3657, /* FA47 (64071) */
+    3658, /* FA48 (64072) */
+    3659, /* FA49 (64073) */
+    3660, /* FA4A (64074) */
+    3661, /* FA4B (64075) */
+    3662, /* FA4C (64076) */
+    3663, /* FA4D (64077) */
+    3664, /* FA4E (64078) */
+    3665, /* FA4F (64079) */
+    3666, /* FA50 (64080) */
+    3667, /* FA51 (64081) */
+    3668, /* FA52 (64082) */
+    3669, /* FA53 (64083) */
+    3670, /* FA54 (64084) */
+    3671, /* FA55 (64085) */
+    3672, /* FA56 (64086) */
+    3496, /* FA57 (64087) */
+    3673, /* FA58 (64088) */
+    3674, /* FA59 (64089) */
+    3675, /* FA5A (64090) */
+    3676, /* FA5B (64091) */
+    3677, /* FA5C (64092) */
+    3678, /* FA5D (64093) */
+    3678, /* FA5E (64094) */
+    3679, /* FA5F (64095) */
+    3680, /* FA60 (64096) */
+    3681, /* FA61 (64097) */
+    3682, /* FA62 (64098) */
+    3683, /* FA63 (64099) */
+    3684, /* FA64 (64100) */
+    3685, /* FA65 (64101) */
+    3686, /* FA66 (64102) */
+    3626, /* FA67 (64103) */
+    3687, /* FA68 (64104) */
+    3688, /* FA69 (64105) */
+    3689, /* FA6A (64106) */
+    3690, /* FA6B (64107) */
+    3691, /* FA6C (64108) */
+    3692, /* FA6D (64109) */
     56, /* FA6E (64110) */
     56, /* FA6F (64111) */
-    3689, /* FA70 (64112) */
-    3690, /* FA71 (64113) */
-    3691, /* FA72 (64114) */
-    3692, /* FA73 (64115) */
-    3693, /* FA74 (64116) */
-    3694, /* FA75 (64117) */
-    3695, /* FA76 (64118) */
-    3696, /* FA77 (64119) */
-    3636, /* FA78 (64120) */
-    3697, /* FA79 (64121) */
-    3698, /* FA7A (64122) */
-    3699, /* FA7B (64123) */
-    3608, /* FA7C (64124) */
-    3700, /* FA7D (64125) */
-    3701, /* FA7E (64126) */
-    3702, /* FA7F (64127) */
-    3703, /* FA80 (64128) */
-    3704, /* FA81 (64129) */
-    3705, /* FA82 (64130) */
-    3706, /* FA83 (64131) */
-    3707, /* FA84 (64132) */
-    3708, /* FA85 (64133) */
-    3709, /* FA86 (64134) */
-    3710, /* FA87 (64135) */
-    3711, /* FA88 (64136) */
-    3645, /* FA89 (64137) */
-    3712, /* FA8A (64138) */
-    3646, /* FA8B (64139) */
-    3713, /* FA8C (64140) */
-    3714, /* FA8D (64141) */
-    3715, /* FA8E (64142) */
-    3716, /* FA8F (64143) */
-    3717, /* FA90 (64144) */
-    3609, /* FA91 (64145) */
-    3384, /* FA92 (64146) */
-    3718, /* FA93 (64147) */
-    3719, /* FA94 (64148) */
-    3720, /* FA95 (64149) */
-    3454, /* FA96 (64150) */
-    3541, /* FA97 (64151) */
-    3721, /* FA98 (64152) */
-    3722, /* FA99 (64153) */
-    3653, /* FA9A (64154) */
-    3723, /* FA9B (64155) */
-    3654, /* FA9C (64156) */
-    3724, /* FA9D (64157) */
-    3725, /* FA9E (64158) */
-    3726, /* FA9F (64159) */
-    3611, /* FAA0 (64160) */
-    3727, /* FAA1 (64161) */
-    3728, /* FAA2 (64162) */
-    3729, /* FAA3 (64163) */
-    3730, /* FAA4 (64164) */
-    3731, /* FAA5 (64165) */
-    3612, /* FAA6 (64166) */
-    3732, /* FAA7 (64167) */
-    3733, /* FAA8 (64168) */
-    3734, /* FAA9 (64169) */
-    3735, /* FAAA (64170) */
-    3736, /* FAAB (64171) */
-    3737, /* FAAC (64172) */
-    3668, /* FAAD (64173) */
-    3738, /* FAAE (64174) */
-    3739, /* FAAF (64175) */
-    3492, /* FAB0 (64176) */
-    3740, /* FAB1 (64177) */
-    3672, /* FAB2 (64178) */
-    3741, /* FAB3 (64179) */
-    3742, /* FAB4 (64180) */
-    3743, /* FAB5 (64181) */
-    3744, /* FAB6 (64182) */
-    3745, /* FAB7 (64183) */
-    3677, /* FAB8 (64184) */
-    3746, /* FAB9 (64185) */
-    3621, /* FABA (64186) */
-    3747, /* FABB (64187) */
-    3678, /* FABC (64188) */
-    3435, /* FABD (64189) */
-    3748, /* FABE (64190) */
-    3679, /* FABF (64191) */
-    3749, /* FAC0 (64192) */
-    3681, /* FAC1 (64193) */
-    3750, /* FAC2 (64194) */
-    3751, /* FAC3 (64195) */
-    3752, /* FAC4 (64196) */
-    3753, /* FAC5 (64197) */
-    3754, /* FAC6 (64198) */
-    3683, /* FAC7 (64199) */
-    3617, /* FAC8 (64200) */
-    3755, /* FAC9 (64201) */
-    3684, /* FACA (64202) */
-    3756, /* FACB (64203) */
-    3685, /* FACC (64204) */
-    3757, /* FACD (64205) */
-    3351, /* FACE (64206) */
-    3758, /* FACF (64207) */
-    3759, /* FAD0 (64208) */
-    3760, /* FAD1 (64209) */
-    3761, /* FAD2 (64210) */
-    3762, /* FAD3 (64211) */
-    3763, /* FAD4 (64212) */
-    3764, /* FAD5 (64213) */
-    3765, /* FAD6 (64214) */
-    3766, /* FAD7 (64215) */
-    3767, /* FAD8 (64216) */
-    3768, /* FAD9 (64217) */
+    3693, /* FA70 (64112) */
+    3694, /* FA71 (64113) */
+    3695, /* FA72 (64114) */
+    3696, /* FA73 (64115) */
+    3697, /* FA74 (64116) */
+    3698, /* FA75 (64117) */
+    3699, /* FA76 (64118) */
+    3700, /* FA77 (64119) */
+    3640, /* FA78 (64120) */
+    3701, /* FA79 (64121) */
+    3702, /* FA7A (64122) */
+    3703, /* FA7B (64123) */
+    3612, /* FA7C (64124) */
+    3704, /* FA7D (64125) */
+    3705, /* FA7E (64126) */
+    3706, /* FA7F (64127) */
+    3707, /* FA80 (64128) */
+    3708, /* FA81 (64129) */
+    3709, /* FA82 (64130) */
+    3710, /* FA83 (64131) */
+    3711, /* FA84 (64132) */
+    3712, /* FA85 (64133) */
+    3713, /* FA86 (64134) */
+    3714, /* FA87 (64135) */
+    3715, /* FA88 (64136) */
+    3649, /* FA89 (64137) */
+    3716, /* FA8A (64138) */
+    3650, /* FA8B (64139) */
+    3717, /* FA8C (64140) */
+    3718, /* FA8D (64141) */
+    3719, /* FA8E (64142) */
+    3720, /* FA8F (64143) */
+    3721, /* FA90 (64144) */
+    3613, /* FA91 (64145) */
+    3388, /* FA92 (64146) */
+    3722, /* FA93 (64147) */
+    3723, /* FA94 (64148) */
+    3724, /* FA95 (64149) */
+    3458, /* FA96 (64150) */
+    3545, /* FA97 (64151) */
+    3725, /* FA98 (64152) */
+    3726, /* FA99 (64153) */
+    3657, /* FA9A (64154) */
+    3727, /* FA9B (64155) */
+    3658, /* FA9C (64156) */
+    3728, /* FA9D (64157) */
+    3729, /* FA9E (64158) */
+    3730, /* FA9F (64159) */
+    3615, /* FAA0 (64160) */
+    3731, /* FAA1 (64161) */
+    3732, /* FAA2 (64162) */
+    3733, /* FAA3 (64163) */
+    3734, /* FAA4 (64164) */
+    3735, /* FAA5 (64165) */
+    3616, /* FAA6 (64166) */
+    3736, /* FAA7 (64167) */
+    3737, /* FAA8 (64168) */
+    3738, /* FAA9 (64169) */
+    3739, /* FAAA (64170) */
+    3740, /* FAAB (64171) */
+    3741, /* FAAC (64172) */
+    3672, /* FAAD (64173) */
+    3742, /* FAAE (64174) */
+    3743, /* FAAF (64175) */
+    3496, /* FAB0 (64176) */
+    3744, /* FAB1 (64177) */
+    3676, /* FAB2 (64178) */
+    3745, /* FAB3 (64179) */
+    3746, /* FAB4 (64180) */
+    3747, /* FAB5 (64181) */
+    3748, /* FAB6 (64182) */
+    3749, /* FAB7 (64183) */
+    3681, /* FAB8 (64184) */
+    3750, /* FAB9 (64185) */
+    3625, /* FABA (64186) */
+    3751, /* FABB (64187) */
+    3682, /* FABC (64188) */
+    3439, /* FABD (64189) */
+    3752, /* FABE (64190) */
+    3683, /* FABF (64191) */
+    3753, /* FAC0 (64192) */
+    3685, /* FAC1 (64193) */
+    3754, /* FAC2 (64194) */
+    3755, /* FAC3 (64195) */
+    3756, /* FAC4 (64196) */
+    3757, /* FAC5 (64197) */
+    3758, /* FAC6 (64198) */
+    3687, /* FAC7 (64199) */
+    3621, /* FAC8 (64200) */
+    3759, /* FAC9 (64201) */
+    3688, /* FACA (64202) */
+    3760, /* FACB (64203) */
+    3689, /* FACC (64204) */
+    3761, /* FACD (64205) */
+    3355, /* FACE (64206) */
+    3762, /* FACF (64207) */
+    3763, /* FAD0 (64208) */
+    3764, /* FAD1 (64209) */
+    3765, /* FAD2 (64210) */
+    3766, /* FAD3 (64211) */
+    3767, /* FAD4 (64212) */
+    3768, /* FAD5 (64213) */
+    3769, /* FAD6 (64214) */
+    3770, /* FAD7 (64215) */
+    3771, /* FAD8 (64216) */
+    3772, /* FAD9 (64217) */
     56, /* FADA (64218) */
     56, /* FADB (64219) */
     56, /* FADC (64220) */
@@ -57884,13 +57884,13 @@ static const uint16_t lxb_unicode_table_map_63743_83527[19784] =
     56, /* FAFD (64253) */
     56, /* FAFE (64254) */
     56, /* FAFF (64255) */
-    3769, /* FB00 (64256) */
-    3770, /* FB01 (64257) */
-    3771, /* FB02 (64258) */
-    3772, /* FB03 (64259) */
-    3773, /* FB04 (64260) */
-    3774, /* FB05 (64261) */
-    3775, /* FB06 (64262) */
+    3773, /* FB00 (64256) */
+    3774, /* FB01 (64257) */
+    3775, /* FB02 (64258) */
+    3776, /* FB03 (64259) */
+    3777, /* FB04 (64260) */
+    3778, /* FB05 (64261) */
+    3779, /* FB06 (64262) */
     56, /* FB07 (64263) */
     56, /* FB08 (64264) */
     56, /* FB09 (64265) */
@@ -57903,165 +57903,165 @@ static const uint16_t lxb_unicode_table_map_63743_83527[19784] =
     56, /* FB10 (64272) */
     56, /* FB11 (64273) */
     56, /* FB12 (64274) */
-    3776, /* FB13 (64275) */
-    3777, /* FB14 (64276) */
-    3778, /* FB15 (64277) */
-    3779, /* FB16 (64278) */
-    3780, /* FB17 (64279) */
+    3780, /* FB13 (64275) */
+    3781, /* FB14 (64276) */
+    3782, /* FB15 (64277) */
+    3783, /* FB16 (64278) */
+    3784, /* FB17 (64279) */
     56, /* FB18 (64280) */
     56, /* FB19 (64281) */
     56, /* FB1A (64282) */
     56, /* FB1B (64283) */
     56, /* FB1C (64284) */
-    3781, /* FB1D (64285) */
-    3782, /* FB1E (64286) */
-    3783, /* FB1F (64287) */
-    3784, /* FB20 (64288) */
-    3785, /* FB21 (64289) */
-    3786, /* FB22 (64290) */
-    3787, /* FB23 (64291) */
-    3788, /* FB24 (64292) */
-    3789, /* FB25 (64293) */
-    3790, /* FB26 (64294) */
-    3791, /* FB27 (64295) */
-    3792, /* FB28 (64296) */
-    3793, /* FB29 (64297) */
-    3794, /* FB2A (64298) */
-    3795, /* FB2B (64299) */
-    3796, /* FB2C (64300) */
-    3797, /* FB2D (64301) */
-    3798, /* FB2E (64302) */
-    3799, /* FB2F (64303) */
-    3800, /* FB30 (64304) */
-    3801, /* FB31 (64305) */
-    3802, /* FB32 (64306) */
-    3803, /* FB33 (64307) */
-    3804, /* FB34 (64308) */
-    3805, /* FB35 (64309) */
-    3806, /* FB36 (64310) */
+    3785, /* FB1D (64285) */
+    3786, /* FB1E (64286) */
+    3787, /* FB1F (64287) */
+    3788, /* FB20 (64288) */
+    3789, /* FB21 (64289) */
+    3790, /* FB22 (64290) */
+    3791, /* FB23 (64291) */
+    3792, /* FB24 (64292) */
+    3793, /* FB25 (64293) */
+    3794, /* FB26 (64294) */
+    3795, /* FB27 (64295) */
+    3796, /* FB28 (64296) */
+    3797, /* FB29 (64297) */
+    3798, /* FB2A (64298) */
+    3799, /* FB2B (64299) */
+    3800, /* FB2C (64300) */
+    3801, /* FB2D (64301) */
+    3802, /* FB2E (64302) */
+    3803, /* FB2F (64303) */
+    3804, /* FB30 (64304) */
+    3805, /* FB31 (64305) */
+    3806, /* FB32 (64306) */
+    3807, /* FB33 (64307) */
+    3808, /* FB34 (64308) */
+    3809, /* FB35 (64309) */
+    3810, /* FB36 (64310) */
     56, /* FB37 (64311) */
-    3807, /* FB38 (64312) */
-    3808, /* FB39 (64313) */
-    3809, /* FB3A (64314) */
-    3810, /* FB3B (64315) */
-    3811, /* FB3C (64316) */
+    3811, /* FB38 (64312) */
+    3812, /* FB39 (64313) */
+    3813, /* FB3A (64314) */
+    3814, /* FB3B (64315) */
+    3815, /* FB3C (64316) */
     56, /* FB3D (64317) */
-    3812, /* FB3E (64318) */
+    3816, /* FB3E (64318) */
     56, /* FB3F (64319) */
-    3813, /* FB40 (64320) */
-    3814, /* FB41 (64321) */
+    3817, /* FB40 (64320) */
+    3818, /* FB41 (64321) */
     56, /* FB42 (64322) */
-    3815, /* FB43 (64323) */
-    3816, /* FB44 (64324) */
+    3819, /* FB43 (64323) */
+    3820, /* FB44 (64324) */
     56, /* FB45 (64325) */
-    3817, /* FB46 (64326) */
-    3818, /* FB47 (64327) */
-    3819, /* FB48 (64328) */
-    3820, /* FB49 (64329) */
-    3821, /* FB4A (64330) */
-    3822, /* FB4B (64331) */
-    3823, /* FB4C (64332) */
-    3824, /* FB4D (64333) */
-    3825, /* FB4E (64334) */
-    3826, /* FB4F (64335) */
-    3827, /* FB50 (64336) */
-    3828, /* FB51 (64337) */
-    3829, /* FB52 (64338) */
-    3830, /* FB53 (64339) */
-    3831, /* FB54 (64340) */
-    3832, /* FB55 (64341) */
-    3833, /* FB56 (64342) */
-    3834, /* FB57 (64343) */
-    3835, /* FB58 (64344) */
-    3836, /* FB59 (64345) */
-    3837, /* FB5A (64346) */
-    3838, /* FB5B (64347) */
-    3839, /* FB5C (64348) */
-    3840, /* FB5D (64349) */
-    3841, /* FB5E (64350) */
-    3842, /* FB5F (64351) */
-    3843, /* FB60 (64352) */
-    3844, /* FB61 (64353) */
-    3845, /* FB62 (64354) */
-    3846, /* FB63 (64355) */
-    3847, /* FB64 (64356) */
-    3848, /* FB65 (64357) */
-    3849, /* FB66 (64358) */
-    3850, /* FB67 (64359) */
-    3851, /* FB68 (64360) */
-    3852, /* FB69 (64361) */
-    3853, /* FB6A (64362) */
-    3854, /* FB6B (64363) */
-    3855, /* FB6C (64364) */
-    3856, /* FB6D (64365) */
-    3857, /* FB6E (64366) */
-    3858, /* FB6F (64367) */
-    3859, /* FB70 (64368) */
-    3860, /* FB71 (64369) */
-    3861, /* FB72 (64370) */
-    3862, /* FB73 (64371) */
-    3863, /* FB74 (64372) */
-    3864, /* FB75 (64373) */
-    3865, /* FB76 (64374) */
-    3866, /* FB77 (64375) */
-    3867, /* FB78 (64376) */
-    3868, /* FB79 (64377) */
-    3869, /* FB7A (64378) */
-    3870, /* FB7B (64379) */
-    3871, /* FB7C (64380) */
-    3872, /* FB7D (64381) */
-    3873, /* FB7E (64382) */
-    3874, /* FB7F (64383) */
-    3875, /* FB80 (64384) */
-    3876, /* FB81 (64385) */
-    3877, /* FB82 (64386) */
-    3878, /* FB83 (64387) */
-    3879, /* FB84 (64388) */
-    3880, /* FB85 (64389) */
-    3881, /* FB86 (64390) */
-    3882, /* FB87 (64391) */
-    3883, /* FB88 (64392) */
-    3884, /* FB89 (64393) */
-    3885, /* FB8A (64394) */
-    3886, /* FB8B (64395) */
-    3887, /* FB8C (64396) */
-    3888, /* FB8D (64397) */
-    3889, /* FB8E (64398) */
-    3890, /* FB8F (64399) */
-    3891, /* FB90 (64400) */
-    3892, /* FB91 (64401) */
-    3893, /* FB92 (64402) */
-    3894, /* FB93 (64403) */
-    3895, /* FB94 (64404) */
-    3896, /* FB95 (64405) */
-    3897, /* FB96 (64406) */
-    3898, /* FB97 (64407) */
-    3899, /* FB98 (64408) */
-    3900, /* FB99 (64409) */
-    3901, /* FB9A (64410) */
-    3902, /* FB9B (64411) */
-    3903, /* FB9C (64412) */
-    3904, /* FB9D (64413) */
-    3905, /* FB9E (64414) */
-    3906, /* FB9F (64415) */
-    3907, /* FBA0 (64416) */
-    3908, /* FBA1 (64417) */
-    3909, /* FBA2 (64418) */
-    3910, /* FBA3 (64419) */
-    3911, /* FBA4 (64420) */
-    3912, /* FBA5 (64421) */
-    3913, /* FBA6 (64422) */
-    3914, /* FBA7 (64423) */
-    3915, /* FBA8 (64424) */
-    3916, /* FBA9 (64425) */
-    3917, /* FBAA (64426) */
-    3918, /* FBAB (64427) */
-    3919, /* FBAC (64428) */
-    3920, /* FBAD (64429) */
-    3921, /* FBAE (64430) */
-    3922, /* FBAF (64431) */
-    3923, /* FBB0 (64432) */
-    3924, /* FBB1 (64433) */
+    3821, /* FB46 (64326) */
+    3822, /* FB47 (64327) */
+    3823, /* FB48 (64328) */
+    3824, /* FB49 (64329) */
+    3825, /* FB4A (64330) */
+    3826, /* FB4B (64331) */
+    3827, /* FB4C (64332) */
+    3828, /* FB4D (64333) */
+    3829, /* FB4E (64334) */
+    3830, /* FB4F (64335) */
+    3831, /* FB50 (64336) */
+    3832, /* FB51 (64337) */
+    3833, /* FB52 (64338) */
+    3834, /* FB53 (64339) */
+    3835, /* FB54 (64340) */
+    3836, /* FB55 (64341) */
+    3837, /* FB56 (64342) */
+    3838, /* FB57 (64343) */
+    3839, /* FB58 (64344) */
+    3840, /* FB59 (64345) */
+    3841, /* FB5A (64346) */
+    3842, /* FB5B (64347) */
+    3843, /* FB5C (64348) */
+    3844, /* FB5D (64349) */
+    3845, /* FB5E (64350) */
+    3846, /* FB5F (64351) */
+    3847, /* FB60 (64352) */
+    3848, /* FB61 (64353) */
+    3849, /* FB62 (64354) */
+    3850, /* FB63 (64355) */
+    3851, /* FB64 (64356) */
+    3852, /* FB65 (64357) */
+    3853, /* FB66 (64358) */
+    3854, /* FB67 (64359) */
+    3855, /* FB68 (64360) */
+    3856, /* FB69 (64361) */
+    3857, /* FB6A (64362) */
+    3858, /* FB6B (64363) */
+    3859, /* FB6C (64364) */
+    3860, /* FB6D (64365) */
+    3861, /* FB6E (64366) */
+    3862, /* FB6F (64367) */
+    3863, /* FB70 (64368) */
+    3864, /* FB71 (64369) */
+    3865, /* FB72 (64370) */
+    3866, /* FB73 (64371) */
+    3867, /* FB74 (64372) */
+    3868, /* FB75 (64373) */
+    3869, /* FB76 (64374) */
+    3870, /* FB77 (64375) */
+    3871, /* FB78 (64376) */
+    3872, /* FB79 (64377) */
+    3873, /* FB7A (64378) */
+    3874, /* FB7B (64379) */
+    3875, /* FB7C (64380) */
+    3876, /* FB7D (64381) */
+    3877, /* FB7E (64382) */
+    3878, /* FB7F (64383) */
+    3879, /* FB80 (64384) */
+    3880, /* FB81 (64385) */
+    3881, /* FB82 (64386) */
+    3882, /* FB83 (64387) */
+    3883, /* FB84 (64388) */
+    3884, /* FB85 (64389) */
+    3885, /* FB86 (64390) */
+    3886, /* FB87 (64391) */
+    3887, /* FB88 (64392) */
+    3888, /* FB89 (64393) */
+    3889, /* FB8A (64394) */
+    3890, /* FB8B (64395) */
+    3891, /* FB8C (64396) */
+    3892, /* FB8D (64397) */
+    3893, /* FB8E (64398) */
+    3894, /* FB8F (64399) */
+    3895, /* FB90 (64400) */
+    3896, /* FB91 (64401) */
+    3897, /* FB92 (64402) */
+    3898, /* FB93 (64403) */
+    3899, /* FB94 (64404) */
+    3900, /* FB95 (64405) */
+    3901, /* FB96 (64406) */
+    3902, /* FB97 (64407) */
+    3903, /* FB98 (64408) */
+    3904, /* FB99 (64409) */
+    3905, /* FB9A (64410) */
+    3906, /* FB9B (64411) */
+    3907, /* FB9C (64412) */
+    3908, /* FB9D (64413) */
+    3909, /* FB9E (64414) */
+    3910, /* FB9F (64415) */
+    3911, /* FBA0 (64416) */
+    3912, /* FBA1 (64417) */
+    3913, /* FBA2 (64418) */
+    3914, /* FBA3 (64419) */
+    3915, /* FBA4 (64420) */
+    3916, /* FBA5 (64421) */
+    3917, /* FBA6 (64422) */
+    3918, /* FBA7 (64423) */
+    3919, /* FBA8 (64424) */
+    3920, /* FBA9 (64425) */
+    3921, /* FBAA (64426) */
+    3922, /* FBAB (64427) */
+    3923, /* FBAC (64428) */
+    3924, /* FBAD (64429) */
+    3925, /* FBAE (64430) */
+    3926, /* FBAF (64431) */
+    3927, /* FBB0 (64432) */
+    3928, /* FBB1 (64433) */
     1, /* FBB2 (64434) */
     1, /* FBB3 (64435) */
     1, /* FBB4 (64436) */
@@ -58079,385 +58079,385 @@ static const uint16_t lxb_unicode_table_map_63743_83527[19784] =
     1, /* FBC0 (64448) */
     1, /* FBC1 (64449) */
     1, /* FBC2 (64450) */
-    56, /* FBC3 (64451) */
-    56, /* FBC4 (64452) */
-    56, /* FBC5 (64453) */
-    56, /* FBC6 (64454) */
-    56, /* FBC7 (64455) */
-    56, /* FBC8 (64456) */
-    56, /* FBC9 (64457) */
-    56, /* FBCA (64458) */
-    56, /* FBCB (64459) */
-    56, /* FBCC (64460) */
-    56, /* FBCD (64461) */
-    56, /* FBCE (64462) */
-    56, /* FBCF (64463) */
-    56, /* FBD0 (64464) */
-    56, /* FBD1 (64465) */
-    56, /* FBD2 (64466) */
-    3925, /* FBD3 (64467) */
-    3926, /* FBD4 (64468) */
-    3927, /* FBD5 (64469) */
-    3928, /* FBD6 (64470) */
-    3929, /* FBD7 (64471) */
-    3930, /* FBD8 (64472) */
-    3931, /* FBD9 (64473) */
-    3932, /* FBDA (64474) */
-    3933, /* FBDB (64475) */
-    3934, /* FBDC (64476) */
-    3935, /* FBDD (64477) */
-    3936, /* FBDE (64478) */
-    3937, /* FBDF (64479) */
-    3938, /* FBE0 (64480) */
-    3939, /* FBE1 (64481) */
-    3940, /* FBE2 (64482) */
-    3941, /* FBE3 (64483) */
-    3942, /* FBE4 (64484) */
-    3943, /* FBE5 (64485) */
-    3944, /* FBE6 (64486) */
-    3945, /* FBE7 (64487) */
-    3946, /* FBE8 (64488) */
-    3947, /* FBE9 (64489) */
-    3948, /* FBEA (64490) */
-    3949, /* FBEB (64491) */
-    3950, /* FBEC (64492) */
-    3951, /* FBED (64493) */
-    3952, /* FBEE (64494) */
-    3953, /* FBEF (64495) */
-    3954, /* FBF0 (64496) */
-    3955, /* FBF1 (64497) */
-    3956, /* FBF2 (64498) */
-    3957, /* FBF3 (64499) */
-    3958, /* FBF4 (64500) */
-    3959, /* FBF5 (64501) */
-    3960, /* FBF6 (64502) */
-    3961, /* FBF7 (64503) */
-    3962, /* FBF8 (64504) */
-    3963, /* FBF9 (64505) */
-    3964, /* FBFA (64506) */
-    3965, /* FBFB (64507) */
-    3966, /* FBFC (64508) */
-    3967, /* FBFD (64509) */
-    3968, /* FBFE (64510) */
-    3969, /* FBFF (64511) */
-    3970, /* FC00 (64512) */
-    3971, /* FC01 (64513) */
-    3972, /* FC02 (64514) */
-    3963, /* FC03 (64515) */
-    3973, /* FC04 (64516) */
-    3974, /* FC05 (64517) */
-    3975, /* FC06 (64518) */
-    3976, /* FC07 (64519) */
-    3977, /* FC08 (64520) */
-    3978, /* FC09 (64521) */
-    3979, /* FC0A (64522) */
-    3980, /* FC0B (64523) */
-    3981, /* FC0C (64524) */
-    3982, /* FC0D (64525) */
-    3983, /* FC0E (64526) */
-    3984, /* FC0F (64527) */
-    3985, /* FC10 (64528) */
-    3986, /* FC11 (64529) */
-    3987, /* FC12 (64530) */
-    3988, /* FC13 (64531) */
-    3989, /* FC14 (64532) */
-    3990, /* FC15 (64533) */
-    3991, /* FC16 (64534) */
-    3992, /* FC17 (64535) */
-    3993, /* FC18 (64536) */
-    3994, /* FC19 (64537) */
-    3995, /* FC1A (64538) */
-    3996, /* FC1B (64539) */
-    3997, /* FC1C (64540) */
-    3998, /* FC1D (64541) */
-    3999, /* FC1E (64542) */
-    4000, /* FC1F (64543) */
-    4001, /* FC20 (64544) */
-    4002, /* FC21 (64545) */
-    4003, /* FC22 (64546) */
-    4004, /* FC23 (64547) */
-    4005, /* FC24 (64548) */
-    4006, /* FC25 (64549) */
-    4007, /* FC26 (64550) */
-    4008, /* FC27 (64551) */
-    4009, /* FC28 (64552) */
-    4010, /* FC29 (64553) */
-    4011, /* FC2A (64554) */
-    4012, /* FC2B (64555) */
-    4013, /* FC2C (64556) */
-    4014, /* FC2D (64557) */
-    4015, /* FC2E (64558) */
-    4016, /* FC2F (64559) */
-    4017, /* FC30 (64560) */
-    4018, /* FC31 (64561) */
-    4019, /* FC32 (64562) */
-    4020, /* FC33 (64563) */
-    4021, /* FC34 (64564) */
-    4022, /* FC35 (64565) */
-    4023, /* FC36 (64566) */
-    4024, /* FC37 (64567) */
-    4025, /* FC38 (64568) */
-    4026, /* FC39 (64569) */
-    4027, /* FC3A (64570) */
-    4028, /* FC3B (64571) */
-    4029, /* FC3C (64572) */
-    4030, /* FC3D (64573) */
-    4031, /* FC3E (64574) */
-    4032, /* FC3F (64575) */
-    4033, /* FC40 (64576) */
-    4034, /* FC41 (64577) */
-    4035, /* FC42 (64578) */
-    4036, /* FC43 (64579) */
-    4037, /* FC44 (64580) */
-    4038, /* FC45 (64581) */
-    4039, /* FC46 (64582) */
-    4040, /* FC47 (64583) */
-    4041, /* FC48 (64584) */
-    4042, /* FC49 (64585) */
-    4043, /* FC4A (64586) */
-    4044, /* FC4B (64587) */
-    4045, /* FC4C (64588) */
-    4046, /* FC4D (64589) */
-    4047, /* FC4E (64590) */
-    4048, /* FC4F (64591) */
-    4049, /* FC50 (64592) */
-    4050, /* FC51 (64593) */
-    4051, /* FC52 (64594) */
-    4052, /* FC53 (64595) */
-    4053, /* FC54 (64596) */
-    4054, /* FC55 (64597) */
-    4055, /* FC56 (64598) */
-    4056, /* FC57 (64599) */
-    4057, /* FC58 (64600) */
-    4058, /* FC59 (64601) */
-    4059, /* FC5A (64602) */
-    4060, /* FC5B (64603) */
-    4061, /* FC5C (64604) */
-    4062, /* FC5D (64605) */
-    4063, /* FC5E (64606) */
-    4064, /* FC5F (64607) */
-    4065, /* FC60 (64608) */
-    4066, /* FC61 (64609) */
-    4067, /* FC62 (64610) */
-    4068, /* FC63 (64611) */
-    4069, /* FC64 (64612) */
-    4070, /* FC65 (64613) */
-    4071, /* FC66 (64614) */
-    4072, /* FC67 (64615) */
-    3964, /* FC68 (64616) */
-    4073, /* FC69 (64617) */
-    4074, /* FC6A (64618) */
-    4075, /* FC6B (64619) */
-    4076, /* FC6C (64620) */
-    4077, /* FC6D (64621) */
-    4078, /* FC6E (64622) */
-    4079, /* FC6F (64623) */
-    4080, /* FC70 (64624) */
-    4081, /* FC71 (64625) */
-    4082, /* FC72 (64626) */
-    4083, /* FC73 (64627) */
-    4084, /* FC74 (64628) */
-    4085, /* FC75 (64629) */
-    4086, /* FC76 (64630) */
-    4087, /* FC77 (64631) */
-    4088, /* FC78 (64632) */
-    4089, /* FC79 (64633) */
-    4090, /* FC7A (64634) */
-    4091, /* FC7B (64635) */
-    4092, /* FC7C (64636) */
-    4093, /* FC7D (64637) */
-    4094, /* FC7E (64638) */
-    4095, /* FC7F (64639) */
-    4096, /* FC80 (64640) */
-    4097, /* FC81 (64641) */
-    4098, /* FC82 (64642) */
-    4099, /* FC83 (64643) */
-    4100, /* FC84 (64644) */
-    4101, /* FC85 (64645) */
-    4102, /* FC86 (64646) */
-    4103, /* FC87 (64647) */
-    4104, /* FC88 (64648) */
-    4105, /* FC89 (64649) */
-    4106, /* FC8A (64650) */
-    4107, /* FC8B (64651) */
-    4108, /* FC8C (64652) */
-    4109, /* FC8D (64653) */
-    4110, /* FC8E (64654) */
-    4111, /* FC8F (64655) */
-    4112, /* FC90 (64656) */
-    4113, /* FC91 (64657) */
-    4114, /* FC92 (64658) */
-    4115, /* FC93 (64659) */
-    4116, /* FC94 (64660) */
-    4117, /* FC95 (64661) */
-    4118, /* FC96 (64662) */
-    4119, /* FC97 (64663) */
-    4120, /* FC98 (64664) */
-    4121, /* FC99 (64665) */
-    4122, /* FC9A (64666) */
-    4123, /* FC9B (64667) */
-    4124, /* FC9C (64668) */
-    4125, /* FC9D (64669) */
-    4126, /* FC9E (64670) */
-    4127, /* FC9F (64671) */
-    4128, /* FCA0 (64672) */
-    4129, /* FCA1 (64673) */
-    4130, /* FCA2 (64674) */
-    4131, /* FCA3 (64675) */
-    4132, /* FCA4 (64676) */
-    4133, /* FCA5 (64677) */
-    4134, /* FCA6 (64678) */
-    4135, /* FCA7 (64679) */
-    4136, /* FCA8 (64680) */
-    4137, /* FCA9 (64681) */
-    4138, /* FCAA (64682) */
-    4139, /* FCAB (64683) */
-    4140, /* FCAC (64684) */
-    4141, /* FCAD (64685) */
-    4142, /* FCAE (64686) */
-    4143, /* FCAF (64687) */
-    4144, /* FCB0 (64688) */
-    4145, /* FCB1 (64689) */
-    4146, /* FCB2 (64690) */
-    4147, /* FCB3 (64691) */
-    4148, /* FCB4 (64692) */
-    4149, /* FCB5 (64693) */
-    4150, /* FCB6 (64694) */
-    4151, /* FCB7 (64695) */
-    4152, /* FCB8 (64696) */
-    4153, /* FCB9 (64697) */
-    4154, /* FCBA (64698) */
-    4155, /* FCBB (64699) */
-    4156, /* FCBC (64700) */
-    4157, /* FCBD (64701) */
-    4158, /* FCBE (64702) */
-    4159, /* FCBF (64703) */
-    4160, /* FCC0 (64704) */
-    4161, /* FCC1 (64705) */
-    4162, /* FCC2 (64706) */
-    4163, /* FCC3 (64707) */
-    4164, /* FCC4 (64708) */
-    4165, /* FCC5 (64709) */
-    4166, /* FCC6 (64710) */
-    4167, /* FCC7 (64711) */
-    4168, /* FCC8 (64712) */
-    4169, /* FCC9 (64713) */
-    4170, /* FCCA (64714) */
-    4171, /* FCCB (64715) */
-    4172, /* FCCC (64716) */
-    4173, /* FCCD (64717) */
-    4174, /* FCCE (64718) */
-    4175, /* FCCF (64719) */
-    4176, /* FCD0 (64720) */
-    4177, /* FCD1 (64721) */
-    4178, /* FCD2 (64722) */
-    4179, /* FCD3 (64723) */
-    4180, /* FCD4 (64724) */
-    4181, /* FCD5 (64725) */
-    4182, /* FCD6 (64726) */
-    4183, /* FCD7 (64727) */
-    4184, /* FCD8 (64728) */
-    4185, /* FCD9 (64729) */
-    4186, /* FCDA (64730) */
-    4187, /* FCDB (64731) */
-    4188, /* FCDC (64732) */
-    4189, /* FCDD (64733) */
-    4190, /* FCDE (64734) */
-    4191, /* FCDF (64735) */
-    4192, /* FCE0 (64736) */
-    4193, /* FCE1 (64737) */
-    4194, /* FCE2 (64738) */
-    4195, /* FCE3 (64739) */
-    4196, /* FCE4 (64740) */
-    4197, /* FCE5 (64741) */
-    4198, /* FCE6 (64742) */
-    4199, /* FCE7 (64743) */
-    4200, /* FCE8 (64744) */
-    4201, /* FCE9 (64745) */
-    4202, /* FCEA (64746) */
-    4203, /* FCEB (64747) */
-    4204, /* FCEC (64748) */
-    4205, /* FCED (64749) */
-    4206, /* FCEE (64750) */
-    4207, /* FCEF (64751) */
-    4208, /* FCF0 (64752) */
-    4209, /* FCF1 (64753) */
-    4210, /* FCF2 (64754) */
-    4211, /* FCF3 (64755) */
-    4212, /* FCF4 (64756) */
-    4213, /* FCF5 (64757) */
-    4214, /* FCF6 (64758) */
-    4215, /* FCF7 (64759) */
-    4216, /* FCF8 (64760) */
-    4217, /* FCF9 (64761) */
-    4218, /* FCFA (64762) */
-    4219, /* FCFB (64763) */
-    4220, /* FCFC (64764) */
-    4221, /* FCFD (64765) */
-    4222, /* FCFE (64766) */
-    4223, /* FCFF (64767) */
-    4224, /* FD00 (64768) */
-    4225, /* FD01 (64769) */
-    4226, /* FD02 (64770) */
-    4227, /* FD03 (64771) */
-    4228, /* FD04 (64772) */
-    4229, /* FD05 (64773) */
-    4230, /* FD06 (64774) */
-    4231, /* FD07 (64775) */
-    4232, /* FD08 (64776) */
-    4233, /* FD09 (64777) */
-    4234, /* FD0A (64778) */
-    4235, /* FD0B (64779) */
-    4236, /* FD0C (64780) */
-    4237, /* FD0D (64781) */
-    4238, /* FD0E (64782) */
-    4239, /* FD0F (64783) */
-    4240, /* FD10 (64784) */
-    4241, /* FD11 (64785) */
-    4242, /* FD12 (64786) */
-    4243, /* FD13 (64787) */
-    4244, /* FD14 (64788) */
-    4245, /* FD15 (64789) */
-    4246, /* FD16 (64790) */
-    4247, /* FD17 (64791) */
-    4248, /* FD18 (64792) */
-    4249, /* FD19 (64793) */
-    4250, /* FD1A (64794) */
-    4251, /* FD1B (64795) */
-    4252, /* FD1C (64796) */
-    4253, /* FD1D (64797) */
-    4254, /* FD1E (64798) */
-    4255, /* FD1F (64799) */
-    4256, /* FD20 (64800) */
-    4257, /* FD21 (64801) */
-    4258, /* FD22 (64802) */
-    4259, /* FD23 (64803) */
-    4260, /* FD24 (64804) */
-    4261, /* FD25 (64805) */
-    4262, /* FD26 (64806) */
-    4263, /* FD27 (64807) */
-    4264, /* FD28 (64808) */
-    4265, /* FD29 (64809) */
-    4266, /* FD2A (64810) */
-    4267, /* FD2B (64811) */
-    4268, /* FD2C (64812) */
-    4269, /* FD2D (64813) */
-    4270, /* FD2E (64814) */
-    4271, /* FD2F (64815) */
-    4272, /* FD30 (64816) */
-    4273, /* FD31 (64817) */
-    4274, /* FD32 (64818) */
-    4275, /* FD33 (64819) */
-    4276, /* FD34 (64820) */
-    4277, /* FD35 (64821) */
-    4278, /* FD36 (64822) */
-    4279, /* FD37 (64823) */
-    4280, /* FD38 (64824) */
-    4281, /* FD39 (64825) */
-    4282, /* FD3A (64826) */
-    4283, /* FD3B (64827) */
-    4284, /* FD3C (64828) */
-    4285, /* FD3D (64829) */
+    1, /* FBC3 (64451) */
+    1, /* FBC4 (64452) */
+    1, /* FBC5 (64453) */
+    1, /* FBC6 (64454) */
+    1, /* FBC7 (64455) */
+    1, /* FBC8 (64456) */
+    1, /* FBC9 (64457) */
+    1, /* FBCA (64458) */
+    1, /* FBCB (64459) */
+    1, /* FBCC (64460) */
+    1, /* FBCD (64461) */
+    1, /* FBCE (64462) */
+    1, /* FBCF (64463) */
+    1, /* FBD0 (64464) */
+    1, /* FBD1 (64465) */
+    1, /* FBD2 (64466) */
+    3929, /* FBD3 (64467) */
+    3930, /* FBD4 (64468) */
+    3931, /* FBD5 (64469) */
+    3932, /* FBD6 (64470) */
+    3933, /* FBD7 (64471) */
+    3934, /* FBD8 (64472) */
+    3935, /* FBD9 (64473) */
+    3936, /* FBDA (64474) */
+    3937, /* FBDB (64475) */
+    3938, /* FBDC (64476) */
+    3939, /* FBDD (64477) */
+    3940, /* FBDE (64478) */
+    3941, /* FBDF (64479) */
+    3942, /* FBE0 (64480) */
+    3943, /* FBE1 (64481) */
+    3944, /* FBE2 (64482) */
+    3945, /* FBE3 (64483) */
+    3946, /* FBE4 (64484) */
+    3947, /* FBE5 (64485) */
+    3948, /* FBE6 (64486) */
+    3949, /* FBE7 (64487) */
+    3950, /* FBE8 (64488) */
+    3951, /* FBE9 (64489) */
+    3952, /* FBEA (64490) */
+    3953, /* FBEB (64491) */
+    3954, /* FBEC (64492) */
+    3955, /* FBED (64493) */
+    3956, /* FBEE (64494) */
+    3957, /* FBEF (64495) */
+    3958, /* FBF0 (64496) */
+    3959, /* FBF1 (64497) */
+    3960, /* FBF2 (64498) */
+    3961, /* FBF3 (64499) */
+    3962, /* FBF4 (64500) */
+    3963, /* FBF5 (64501) */
+    3964, /* FBF6 (64502) */
+    3965, /* FBF7 (64503) */
+    3966, /* FBF8 (64504) */
+    3967, /* FBF9 (64505) */
+    3968, /* FBFA (64506) */
+    3969, /* FBFB (64507) */
+    3970, /* FBFC (64508) */
+    3971, /* FBFD (64509) */
+    3972, /* FBFE (64510) */
+    3973, /* FBFF (64511) */
+    3974, /* FC00 (64512) */
+    3975, /* FC01 (64513) */
+    3976, /* FC02 (64514) */
+    3967, /* FC03 (64515) */
+    3977, /* FC04 (64516) */
+    3978, /* FC05 (64517) */
+    3979, /* FC06 (64518) */
+    3980, /* FC07 (64519) */
+    3981, /* FC08 (64520) */
+    3982, /* FC09 (64521) */
+    3983, /* FC0A (64522) */
+    3984, /* FC0B (64523) */
+    3985, /* FC0C (64524) */
+    3986, /* FC0D (64525) */
+    3987, /* FC0E (64526) */
+    3988, /* FC0F (64527) */
+    3989, /* FC10 (64528) */
+    3990, /* FC11 (64529) */
+    3991, /* FC12 (64530) */
+    3992, /* FC13 (64531) */
+    3993, /* FC14 (64532) */
+    3994, /* FC15 (64533) */
+    3995, /* FC16 (64534) */
+    3996, /* FC17 (64535) */
+    3997, /* FC18 (64536) */
+    3998, /* FC19 (64537) */
+    3999, /* FC1A (64538) */
+    4000, /* FC1B (64539) */
+    4001, /* FC1C (64540) */
+    4002, /* FC1D (64541) */
+    4003, /* FC1E (64542) */
+    4004, /* FC1F (64543) */
+    4005, /* FC20 (64544) */
+    4006, /* FC21 (64545) */
+    4007, /* FC22 (64546) */
+    4008, /* FC23 (64547) */
+    4009, /* FC24 (64548) */
+    4010, /* FC25 (64549) */
+    4011, /* FC26 (64550) */
+    4012, /* FC27 (64551) */
+    4013, /* FC28 (64552) */
+    4014, /* FC29 (64553) */
+    4015, /* FC2A (64554) */
+    4016, /* FC2B (64555) */
+    4017, /* FC2C (64556) */
+    4018, /* FC2D (64557) */
+    4019, /* FC2E (64558) */
+    4020, /* FC2F (64559) */
+    4021, /* FC30 (64560) */
+    4022, /* FC31 (64561) */
+    4023, /* FC32 (64562) */
+    4024, /* FC33 (64563) */
+    4025, /* FC34 (64564) */
+    4026, /* FC35 (64565) */
+    4027, /* FC36 (64566) */
+    4028, /* FC37 (64567) */
+    4029, /* FC38 (64568) */
+    4030, /* FC39 (64569) */
+    4031, /* FC3A (64570) */
+    4032, /* FC3B (64571) */
+    4033, /* FC3C (64572) */
+    4034, /* FC3D (64573) */
+    4035, /* FC3E (64574) */
+    4036, /* FC3F (64575) */
+    4037, /* FC40 (64576) */
+    4038, /* FC41 (64577) */
+    4039, /* FC42 (64578) */
+    4040, /* FC43 (64579) */
+    4041, /* FC44 (64580) */
+    4042, /* FC45 (64581) */
+    4043, /* FC46 (64582) */
+    4044, /* FC47 (64583) */
+    4045, /* FC48 (64584) */
+    4046, /* FC49 (64585) */
+    4047, /* FC4A (64586) */
+    4048, /* FC4B (64587) */
+    4049, /* FC4C (64588) */
+    4050, /* FC4D (64589) */
+    4051, /* FC4E (64590) */
+    4052, /* FC4F (64591) */
+    4053, /* FC50 (64592) */
+    4054, /* FC51 (64593) */
+    4055, /* FC52 (64594) */
+    4056, /* FC53 (64595) */
+    4057, /* FC54 (64596) */
+    4058, /* FC55 (64597) */
+    4059, /* FC56 (64598) */
+    4060, /* FC57 (64599) */
+    4061, /* FC58 (64600) */
+    4062, /* FC59 (64601) */
+    4063, /* FC5A (64602) */
+    4064, /* FC5B (64603) */
+    4065, /* FC5C (64604) */
+    4066, /* FC5D (64605) */
+    4067, /* FC5E (64606) */
+    4068, /* FC5F (64607) */
+    4069, /* FC60 (64608) */
+    4070, /* FC61 (64609) */
+    4071, /* FC62 (64610) */
+    4072, /* FC63 (64611) */
+    4073, /* FC64 (64612) */
+    4074, /* FC65 (64613) */
+    4075, /* FC66 (64614) */
+    4076, /* FC67 (64615) */
+    3968, /* FC68 (64616) */
+    4077, /* FC69 (64617) */
+    4078, /* FC6A (64618) */
+    4079, /* FC6B (64619) */
+    4080, /* FC6C (64620) */
+    4081, /* FC6D (64621) */
+    4082, /* FC6E (64622) */
+    4083, /* FC6F (64623) */
+    4084, /* FC70 (64624) */
+    4085, /* FC71 (64625) */
+    4086, /* FC72 (64626) */
+    4087, /* FC73 (64627) */
+    4088, /* FC74 (64628) */
+    4089, /* FC75 (64629) */
+    4090, /* FC76 (64630) */
+    4091, /* FC77 (64631) */
+    4092, /* FC78 (64632) */
+    4093, /* FC79 (64633) */
+    4094, /* FC7A (64634) */
+    4095, /* FC7B (64635) */
+    4096, /* FC7C (64636) */
+    4097, /* FC7D (64637) */
+    4098, /* FC7E (64638) */
+    4099, /* FC7F (64639) */
+    4100, /* FC80 (64640) */
+    4101, /* FC81 (64641) */
+    4102, /* FC82 (64642) */
+    4103, /* FC83 (64643) */
+    4104, /* FC84 (64644) */
+    4105, /* FC85 (64645) */
+    4106, /* FC86 (64646) */
+    4107, /* FC87 (64647) */
+    4108, /* FC88 (64648) */
+    4109, /* FC89 (64649) */
+    4110, /* FC8A (64650) */
+    4111, /* FC8B (64651) */
+    4112, /* FC8C (64652) */
+    4113, /* FC8D (64653) */
+    4114, /* FC8E (64654) */
+    4115, /* FC8F (64655) */
+    4116, /* FC90 (64656) */
+    4117, /* FC91 (64657) */
+    4118, /* FC92 (64658) */
+    4119, /* FC93 (64659) */
+    4120, /* FC94 (64660) */
+    4121, /* FC95 (64661) */
+    4122, /* FC96 (64662) */
+    4123, /* FC97 (64663) */
+    4124, /* FC98 (64664) */
+    4125, /* FC99 (64665) */
+    4126, /* FC9A (64666) */
+    4127, /* FC9B (64667) */
+    4128, /* FC9C (64668) */
+    4129, /* FC9D (64669) */
+    4130, /* FC9E (64670) */
+    4131, /* FC9F (64671) */
+    4132, /* FCA0 (64672) */
+    4133, /* FCA1 (64673) */
+    4134, /* FCA2 (64674) */
+    4135, /* FCA3 (64675) */
+    4136, /* FCA4 (64676) */
+    4137, /* FCA5 (64677) */
+    4138, /* FCA6 (64678) */
+    4139, /* FCA7 (64679) */
+    4140, /* FCA8 (64680) */
+    4141, /* FCA9 (64681) */
+    4142, /* FCAA (64682) */
+    4143, /* FCAB (64683) */
+    4144, /* FCAC (64684) */
+    4145, /* FCAD (64685) */
+    4146, /* FCAE (64686) */
+    4147, /* FCAF (64687) */
+    4148, /* FCB0 (64688) */
+    4149, /* FCB1 (64689) */
+    4150, /* FCB2 (64690) */
+    4151, /* FCB3 (64691) */
+    4152, /* FCB4 (64692) */
+    4153, /* FCB5 (64693) */
+    4154, /* FCB6 (64694) */
+    4155, /* FCB7 (64695) */
+    4156, /* FCB8 (64696) */
+    4157, /* FCB9 (64697) */
+    4158, /* FCBA (64698) */
+    4159, /* FCBB (64699) */
+    4160, /* FCBC (64700) */
+    4161, /* FCBD (64701) */
+    4162, /* FCBE (64702) */
+    4163, /* FCBF (64703) */
+    4164, /* FCC0 (64704) */
+    4165, /* FCC1 (64705) */
+    4166, /* FCC2 (64706) */
+    4167, /* FCC3 (64707) */
+    4168, /* FCC4 (64708) */
+    4169, /* FCC5 (64709) */
+    4170, /* FCC6 (64710) */
+    4171, /* FCC7 (64711) */
+    4172, /* FCC8 (64712) */
+    4173, /* FCC9 (64713) */
+    4174, /* FCCA (64714) */
+    4175, /* FCCB (64715) */
+    4176, /* FCCC (64716) */
+    4177, /* FCCD (64717) */
+    4178, /* FCCE (64718) */
+    4179, /* FCCF (64719) */
+    4180, /* FCD0 (64720) */
+    4181, /* FCD1 (64721) */
+    4182, /* FCD2 (64722) */
+    4183, /* FCD3 (64723) */
+    4184, /* FCD4 (64724) */
+    4185, /* FCD5 (64725) */
+    4186, /* FCD6 (64726) */
+    4187, /* FCD7 (64727) */
+    4188, /* FCD8 (64728) */
+    4189, /* FCD9 (64729) */
+    4190, /* FCDA (64730) */
+    4191, /* FCDB (64731) */
+    4192, /* FCDC (64732) */
+    4193, /* FCDD (64733) */
+    4194, /* FCDE (64734) */
+    4195, /* FCDF (64735) */
+    4196, /* FCE0 (64736) */
+    4197, /* FCE1 (64737) */
+    4198, /* FCE2 (64738) */
+    4199, /* FCE3 (64739) */
+    4200, /* FCE4 (64740) */
+    4201, /* FCE5 (64741) */
+    4202, /* FCE6 (64742) */
+    4203, /* FCE7 (64743) */
+    4204, /* FCE8 (64744) */
+    4205, /* FCE9 (64745) */
+    4206, /* FCEA (64746) */
+    4207, /* FCEB (64747) */
+    4208, /* FCEC (64748) */
+    4209, /* FCED (64749) */
+    4210, /* FCEE (64750) */
+    4211, /* FCEF (64751) */
+    4212, /* FCF0 (64752) */
+    4213, /* FCF1 (64753) */
+    4214, /* FCF2 (64754) */
+    4215, /* FCF3 (64755) */
+    4216, /* FCF4 (64756) */
+    4217, /* FCF5 (64757) */
+    4218, /* FCF6 (64758) */
+    4219, /* FCF7 (64759) */
+    4220, /* FCF8 (64760) */
+    4221, /* FCF9 (64761) */
+    4222, /* FCFA (64762) */
+    4223, /* FCFB (64763) */
+    4224, /* FCFC (64764) */
+    4225, /* FCFD (64765) */
+    4226, /* FCFE (64766) */
+    4227, /* FCFF (64767) */
+    4228, /* FD00 (64768) */
+    4229, /* FD01 (64769) */
+    4230, /* FD02 (64770) */
+    4231, /* FD03 (64771) */
+    4232, /* FD04 (64772) */
+    4233, /* FD05 (64773) */
+    4234, /* FD06 (64774) */
+    4235, /* FD07 (64775) */
+    4236, /* FD08 (64776) */
+    4237, /* FD09 (64777) */
+    4238, /* FD0A (64778) */
+    4239, /* FD0B (64779) */
+    4240, /* FD0C (64780) */
+    4241, /* FD0D (64781) */
+    4242, /* FD0E (64782) */
+    4243, /* FD0F (64783) */
+    4244, /* FD10 (64784) */
+    4245, /* FD11 (64785) */
+    4246, /* FD12 (64786) */
+    4247, /* FD13 (64787) */
+    4248, /* FD14 (64788) */
+    4249, /* FD15 (64789) */
+    4250, /* FD16 (64790) */
+    4251, /* FD17 (64791) */
+    4252, /* FD18 (64792) */
+    4253, /* FD19 (64793) */
+    4254, /* FD1A (64794) */
+    4255, /* FD1B (64795) */
+    4256, /* FD1C (64796) */
+    4257, /* FD1D (64797) */
+    4258, /* FD1E (64798) */
+    4259, /* FD1F (64799) */
+    4260, /* FD20 (64800) */
+    4261, /* FD21 (64801) */
+    4262, /* FD22 (64802) */
+    4263, /* FD23 (64803) */
+    4264, /* FD24 (64804) */
+    4265, /* FD25 (64805) */
+    4266, /* FD26 (64806) */
+    4267, /* FD27 (64807) */
+    4268, /* FD28 (64808) */
+    4269, /* FD29 (64809) */
+    4270, /* FD2A (64810) */
+    4271, /* FD2B (64811) */
+    4272, /* FD2C (64812) */
+    4273, /* FD2D (64813) */
+    4274, /* FD2E (64814) */
+    4275, /* FD2F (64815) */
+    4276, /* FD30 (64816) */
+    4277, /* FD31 (64817) */
+    4278, /* FD32 (64818) */
+    4279, /* FD33 (64819) */
+    4280, /* FD34 (64820) */
+    4281, /* FD35 (64821) */
+    4282, /* FD36 (64822) */
+    4283, /* FD37 (64823) */
+    4284, /* FD38 (64824) */
+    4285, /* FD39 (64825) */
+    4286, /* FD3A (64826) */
+    4287, /* FD3B (64827) */
+    4288, /* FD3C (64828) */
+    4289, /* FD3D (64829) */
     1, /* FD3E (64830) */
     1, /* FD3F (64831) */
     1, /* FD40 (64832) */
@@ -58476,133 +58476,133 @@ static const uint16_t lxb_unicode_table_map_63743_83527[19784] =
     1, /* FD4D (64845) */
     1, /* FD4E (64846) */
     1, /* FD4F (64847) */
-    4286, /* FD50 (64848) */
-    4287, /* FD51 (64849) */
-    4288, /* FD52 (64850) */
-    4289, /* FD53 (64851) */
-    4290, /* FD54 (64852) */
-    4291, /* FD55 (64853) */
-    4292, /* FD56 (64854) */
-    4293, /* FD57 (64855) */
-    4294, /* FD58 (64856) */
-    4295, /* FD59 (64857) */
-    4296, /* FD5A (64858) */
-    4297, /* FD5B (64859) */
-    4298, /* FD5C (64860) */
-    4299, /* FD5D (64861) */
-    4300, /* FD5E (64862) */
-    4301, /* FD5F (64863) */
-    4302, /* FD60 (64864) */
-    4303, /* FD61 (64865) */
-    4304, /* FD62 (64866) */
-    4305, /* FD63 (64867) */
-    4306, /* FD64 (64868) */
-    4307, /* FD65 (64869) */
-    4308, /* FD66 (64870) */
-    4309, /* FD67 (64871) */
-    4310, /* FD68 (64872) */
-    4311, /* FD69 (64873) */
-    4312, /* FD6A (64874) */
-    4313, /* FD6B (64875) */
-    4314, /* FD6C (64876) */
-    4315, /* FD6D (64877) */
-    4316, /* FD6E (64878) */
-    4317, /* FD6F (64879) */
-    4318, /* FD70 (64880) */
-    4319, /* FD71 (64881) */
-    4320, /* FD72 (64882) */
-    4321, /* FD73 (64883) */
-    4322, /* FD74 (64884) */
-    4323, /* FD75 (64885) */
-    4324, /* FD76 (64886) */
-    4325, /* FD77 (64887) */
-    4326, /* FD78 (64888) */
-    4327, /* FD79 (64889) */
-    4328, /* FD7A (64890) */
-    4329, /* FD7B (64891) */
-    4330, /* FD7C (64892) */
-    4331, /* FD7D (64893) */
-    4332, /* FD7E (64894) */
-    4333, /* FD7F (64895) */
-    4334, /* FD80 (64896) */
-    4335, /* FD81 (64897) */
-    4336, /* FD82 (64898) */
-    4337, /* FD83 (64899) */
-    4338, /* FD84 (64900) */
-    4339, /* FD85 (64901) */
-    4340, /* FD86 (64902) */
-    4341, /* FD87 (64903) */
-    4342, /* FD88 (64904) */
-    4343, /* FD89 (64905) */
-    4344, /* FD8A (64906) */
-    4345, /* FD8B (64907) */
-    4346, /* FD8C (64908) */
-    4347, /* FD8D (64909) */
-    4348, /* FD8E (64910) */
-    4349, /* FD8F (64911) */
-    56, /* FD90 (64912) */
-    56, /* FD91 (64913) */
-    4350, /* FD92 (64914) */
-    4351, /* FD93 (64915) */
-    4352, /* FD94 (64916) */
-    4353, /* FD95 (64917) */
-    4354, /* FD96 (64918) */
-    4355, /* FD97 (64919) */
-    4356, /* FD98 (64920) */
-    4357, /* FD99 (64921) */
-    4358, /* FD9A (64922) */
-    4359, /* FD9B (64923) */
-    4360, /* FD9C (64924) */
-    4361, /* FD9D (64925) */
-    4362, /* FD9E (64926) */
-    4363, /* FD9F (64927) */
-    4364, /* FDA0 (64928) */
-    4365, /* FDA1 (64929) */
-    4366, /* FDA2 (64930) */
-    4367, /* FDA3 (64931) */
-    4368, /* FDA4 (64932) */
-    4369, /* FDA5 (64933) */
-    4370, /* FDA6 (64934) */
-    4371, /* FDA7 (64935) */
-    4372, /* FDA8 (64936) */
-    4373, /* FDA9 (64937) */
-    4374, /* FDAA (64938) */
-    4375, /* FDAB (64939) */
-    4376, /* FDAC (64940) */
-    4377, /* FDAD (64941) */
-    4378, /* FDAE (64942) */
-    4379, /* FDAF (64943) */
-    4380, /* FDB0 (64944) */
-    4381, /* FDB1 (64945) */
-    4382, /* FDB2 (64946) */
-    4383, /* FDB3 (64947) */
-    4384, /* FDB4 (64948) */
-    4385, /* FDB5 (64949) */
-    4386, /* FDB6 (64950) */
-    4387, /* FDB7 (64951) */
-    4388, /* FDB8 (64952) */
-    4389, /* FDB9 (64953) */
-    4390, /* FDBA (64954) */
-    4391, /* FDBB (64955) */
-    4392, /* FDBC (64956) */
-    4393, /* FDBD (64957) */
-    4394, /* FDBE (64958) */
-    4395, /* FDBF (64959) */
-    4396, /* FDC0 (64960) */
-    4397, /* FDC1 (64961) */
-    4398, /* FDC2 (64962) */
-    4399, /* FDC3 (64963) */
-    4400, /* FDC4 (64964) */
-    4401, /* FDC5 (64965) */
-    4402, /* FDC6 (64966) */
-    4403, /* FDC7 (64967) */
-    56, /* FDC8 (64968) */
-    56, /* FDC9 (64969) */
-    56, /* FDCA (64970) */
-    56, /* FDCB (64971) */
-    56, /* FDCC (64972) */
-    56, /* FDCD (64973) */
-    56, /* FDCE (64974) */
+    4290, /* FD50 (64848) */
+    4291, /* FD51 (64849) */
+    4292, /* FD52 (64850) */
+    4293, /* FD53 (64851) */
+    4294, /* FD54 (64852) */
+    4295, /* FD55 (64853) */
+    4296, /* FD56 (64854) */
+    4297, /* FD57 (64855) */
+    4298, /* FD58 (64856) */
+    4299, /* FD59 (64857) */
+    4300, /* FD5A (64858) */
+    4301, /* FD5B (64859) */
+    4302, /* FD5C (64860) */
+    4303, /* FD5D (64861) */
+    4304, /* FD5E (64862) */
+    4305, /* FD5F (64863) */
+    4306, /* FD60 (64864) */
+    4307, /* FD61 (64865) */
+    4308, /* FD62 (64866) */
+    4309, /* FD63 (64867) */
+    4310, /* FD64 (64868) */
+    4311, /* FD65 (64869) */
+    4312, /* FD66 (64870) */
+    4313, /* FD67 (64871) */
+    4314, /* FD68 (64872) */
+    4315, /* FD69 (64873) */
+    4316, /* FD6A (64874) */
+    4317, /* FD6B (64875) */
+    4318, /* FD6C (64876) */
+    4319, /* FD6D (64877) */
+    4320, /* FD6E (64878) */
+    4321, /* FD6F (64879) */
+    4322, /* FD70 (64880) */
+    4323, /* FD71 (64881) */
+    4324, /* FD72 (64882) */
+    4325, /* FD73 (64883) */
+    4326, /* FD74 (64884) */
+    4327, /* FD75 (64885) */
+    4328, /* FD76 (64886) */
+    4329, /* FD77 (64887) */
+    4330, /* FD78 (64888) */
+    4331, /* FD79 (64889) */
+    4332, /* FD7A (64890) */
+    4333, /* FD7B (64891) */
+    4334, /* FD7C (64892) */
+    4335, /* FD7D (64893) */
+    4336, /* FD7E (64894) */
+    4337, /* FD7F (64895) */
+    4338, /* FD80 (64896) */
+    4339, /* FD81 (64897) */
+    4340, /* FD82 (64898) */
+    4341, /* FD83 (64899) */
+    4342, /* FD84 (64900) */
+    4343, /* FD85 (64901) */
+    4344, /* FD86 (64902) */
+    4345, /* FD87 (64903) */
+    4346, /* FD88 (64904) */
+    4347, /* FD89 (64905) */
+    4348, /* FD8A (64906) */
+    4349, /* FD8B (64907) */
+    4350, /* FD8C (64908) */
+    4351, /* FD8D (64909) */
+    4352, /* FD8E (64910) */
+    4353, /* FD8F (64911) */
+    1, /* FD90 (64912) */
+    1, /* FD91 (64913) */
+    4354, /* FD92 (64914) */
+    4355, /* FD93 (64915) */
+    4356, /* FD94 (64916) */
+    4357, /* FD95 (64917) */
+    4358, /* FD96 (64918) */
+    4359, /* FD97 (64919) */
+    4360, /* FD98 (64920) */
+    4361, /* FD99 (64921) */
+    4362, /* FD9A (64922) */
+    4363, /* FD9B (64923) */
+    4364, /* FD9C (64924) */
+    4365, /* FD9D (64925) */
+    4366, /* FD9E (64926) */
+    4367, /* FD9F (64927) */
+    4368, /* FDA0 (64928) */
+    4369, /* FDA1 (64929) */
+    4370, /* FDA2 (64930) */
+    4371, /* FDA3 (64931) */
+    4372, /* FDA4 (64932) */
+    4373, /* FDA5 (64933) */
+    4374, /* FDA6 (64934) */
+    4375, /* FDA7 (64935) */
+    4376, /* FDA8 (64936) */
+    4377, /* FDA9 (64937) */
+    4378, /* FDAA (64938) */
+    4379, /* FDAB (64939) */
+    4380, /* FDAC (64940) */
+    4381, /* FDAD (64941) */
+    4382, /* FDAE (64942) */
+    4383, /* FDAF (64943) */
+    4384, /* FDB0 (64944) */
+    4385, /* FDB1 (64945) */
+    4386, /* FDB2 (64946) */
+    4387, /* FDB3 (64947) */
+    4388, /* FDB4 (64948) */
+    4389, /* FDB5 (64949) */
+    4390, /* FDB6 (64950) */
+    4391, /* FDB7 (64951) */
+    4392, /* FDB8 (64952) */
+    4393, /* FDB9 (64953) */
+    4394, /* FDBA (64954) */
+    4395, /* FDBB (64955) */
+    4396, /* FDBC (64956) */
+    4397, /* FDBD (64957) */
+    4398, /* FDBE (64958) */
+    4399, /* FDBF (64959) */
+    4400, /* FDC0 (64960) */
+    4401, /* FDC1 (64961) */
+    4402, /* FDC2 (64962) */
+    4403, /* FDC3 (64963) */
+    4404, /* FDC4 (64964) */
+    4405, /* FDC5 (64965) */
+    4406, /* FDC6 (64966) */
+    4407, /* FDC7 (64967) */
+    1, /* FDC8 (64968) */
+    1, /* FDC9 (64969) */
+    1, /* FDCA (64970) */
+    1, /* FDCB (64971) */
+    1, /* FDCC (64972) */
+    1, /* FDCD (64973) */
+    1, /* FDCE (64974) */
     1, /* FDCF (64975) */
     56, /* FDD0 (64976) */
     56, /* FDD1 (64977) */
@@ -58636,19 +58636,19 @@ static const uint16_t lxb_unicode_table_map_63743_83527[19784] =
     56, /* FDED (65005) */
     56, /* FDEE (65006) */
     56, /* FDEF (65007) */
-    4404, /* FDF0 (65008) */
-    4405, /* FDF1 (65009) */
-    4406, /* FDF2 (65010) */
-    4407, /* FDF3 (65011) */
-    4408, /* FDF4 (65012) */
-    4409, /* FDF5 (65013) */
-    4410, /* FDF6 (65014) */
-    4411, /* FDF7 (65015) */
-    4412, /* FDF8 (65016) */
-    4413, /* FDF9 (65017) */
-    4414, /* FDFA (65018) */
-    4415, /* FDFB (65019) */
-    4416, /* FDFC (65020) */
+    4408, /* FDF0 (65008) */
+    4409, /* FDF1 (65009) */
+    4410, /* FDF2 (65010) */
+    4411, /* FDF3 (65011) */
+    4412, /* FDF4 (65012) */
+    4413, /* FDF5 (65013) */
+    4414, /* FDF6 (65014) */
+    4415, /* FDF7 (65015) */
+    4416, /* FDF8 (65016) */
+    4417, /* FDF9 (65017) */
+    4418, /* FDFA (65018) */
+    4419, /* FDFB (65019) */
+    4420, /* FDFC (65020) */
     1, /* FDFD (65021) */
     1, /* FDFE (65022) */
     1, /* FDFF (65023) */
@@ -58668,16 +58668,16 @@ static const uint16_t lxb_unicode_table_map_63743_83527[19784] =
     60, /* FE0D (65037) */
     60, /* FE0E (65038) */
     60, /* FE0F (65039) */
-    4417, /* FE10 (65040) */
-    4418, /* FE11 (65041) */
-    4419, /* FE12 (65042) */
-    4420, /* FE13 (65043) */
-    4421, /* FE14 (65044) */
-    4422, /* FE15 (65045) */
-    4423, /* FE16 (65046) */
-    4424, /* FE17 (65047) */
-    4425, /* FE18 (65048) */
-    4426, /* FE19 (65049) */
+    4421, /* FE10 (65040) */
+    4422, /* FE11 (65041) */
+    4423, /* FE12 (65042) */
+    4424, /* FE13 (65043) */
+    4425, /* FE14 (65044) */
+    4426, /* FE15 (65045) */
+    4427, /* FE16 (65046) */
+    4428, /* FE17 (65047) */
+    4429, /* FE18 (65048) */
+    4430, /* FE19 (65049) */
     56, /* FE1A (65050) */
     56, /* FE1B (65051) */
     56, /* FE1C (65052) */
@@ -58700,453 +58700,453 @@ static const uint16_t lxb_unicode_table_map_63743_83527[19784] =
     433, /* FE2D (65069) */
     431, /* FE2E (65070) */
     431, /* FE2F (65071) */
-    4427, /* FE30 (65072) */
-    4428, /* FE31 (65073) */
-    4429, /* FE32 (65074) */
-    4430, /* FE33 (65075) */
-    4430, /* FE34 (65076) */
-    4431, /* FE35 (65077) */
-    4432, /* FE36 (65078) */
-    4433, /* FE37 (65079) */
-    4434, /* FE38 (65080) */
-    4435, /* FE39 (65081) */
-    4436, /* FE3A (65082) */
-    4437, /* FE3B (65083) */
-    4438, /* FE3C (65084) */
-    4439, /* FE3D (65085) */
-    4440, /* FE3E (65086) */
-    4441, /* FE3F (65087) */
-    4442, /* FE40 (65088) */
-    4443, /* FE41 (65089) */
-    4444, /* FE42 (65090) */
-    4445, /* FE43 (65091) */
-    4446, /* FE44 (65092) */
+    4431, /* FE30 (65072) */
+    4432, /* FE31 (65073) */
+    4433, /* FE32 (65074) */
+    4434, /* FE33 (65075) */
+    4434, /* FE34 (65076) */
+    4435, /* FE35 (65077) */
+    4436, /* FE36 (65078) */
+    4437, /* FE37 (65079) */
+    4438, /* FE38 (65080) */
+    4439, /* FE39 (65081) */
+    4440, /* FE3A (65082) */
+    4441, /* FE3B (65083) */
+    4442, /* FE3C (65084) */
+    4443, /* FE3D (65085) */
+    4444, /* FE3E (65086) */
+    4445, /* FE3F (65087) */
+    4446, /* FE40 (65088) */
+    4447, /* FE41 (65089) */
+    4448, /* FE42 (65090) */
+    4449, /* FE43 (65091) */
+    4450, /* FE44 (65092) */
     1, /* FE45 (65093) */
     1, /* FE46 (65094) */
-    4447, /* FE47 (65095) */
-    4448, /* FE48 (65096) */
-    4449, /* FE49 (65097) */
-    4450, /* FE4A (65098) */
-    4451, /* FE4B (65099) */
-    4452, /* FE4C (65100) */
-    4453, /* FE4D (65101) */
-    4453, /* FE4E (65102) */
-    4453, /* FE4F (65103) */
-    4454, /* FE50 (65104) */
-    4455, /* FE51 (65105) */
-    4456, /* FE52 (65106) */
+    4451, /* FE47 (65095) */
+    4452, /* FE48 (65096) */
+    4453, /* FE49 (65097) */
+    4454, /* FE4A (65098) */
+    4455, /* FE4B (65099) */
+    4456, /* FE4C (65100) */
+    4457, /* FE4D (65101) */
+    4457, /* FE4E (65102) */
+    4457, /* FE4F (65103) */
+    4458, /* FE50 (65104) */
+    4459, /* FE51 (65105) */
+    4460, /* FE52 (65106) */
     56, /* FE53 (65107) */
-    4457, /* FE54 (65108) */
-    4458, /* FE55 (65109) */
-    4459, /* FE56 (65110) */
-    4460, /* FE57 (65111) */
-    4461, /* FE58 (65112) */
-    4462, /* FE59 (65113) */
-    4463, /* FE5A (65114) */
-    4464, /* FE5B (65115) */
-    4465, /* FE5C (65116) */
-    4466, /* FE5D (65117) */
-    4467, /* FE5E (65118) */
-    4468, /* FE5F (65119) */
-    4469, /* FE60 (65120) */
-    4470, /* FE61 (65121) */
-    4471, /* FE62 (65122) */
-    4472, /* FE63 (65123) */
-    4473, /* FE64 (65124) */
-    4474, /* FE65 (65125) */
-    4475, /* FE66 (65126) */
+    4461, /* FE54 (65108) */
+    4462, /* FE55 (65109) */
+    4463, /* FE56 (65110) */
+    4464, /* FE57 (65111) */
+    4465, /* FE58 (65112) */
+    4466, /* FE59 (65113) */
+    4467, /* FE5A (65114) */
+    4468, /* FE5B (65115) */
+    4469, /* FE5C (65116) */
+    4470, /* FE5D (65117) */
+    4471, /* FE5E (65118) */
+    4472, /* FE5F (65119) */
+    4473, /* FE60 (65120) */
+    4474, /* FE61 (65121) */
+    4475, /* FE62 (65122) */
+    4476, /* FE63 (65123) */
+    4477, /* FE64 (65124) */
+    4478, /* FE65 (65125) */
+    4479, /* FE66 (65126) */
     56, /* FE67 (65127) */
-    4476, /* FE68 (65128) */
-    4477, /* FE69 (65129) */
-    4478, /* FE6A (65130) */
-    4479, /* FE6B (65131) */
+    4480, /* FE68 (65128) */
+    4481, /* FE69 (65129) */
+    4482, /* FE6A (65130) */
+    4483, /* FE6B (65131) */
     56, /* FE6C (65132) */
     56, /* FE6D (65133) */
     56, /* FE6E (65134) */
     56, /* FE6F (65135) */
-    4480, /* FE70 (65136) */
-    4481, /* FE71 (65137) */
-    4482, /* FE72 (65138) */
+    4484, /* FE70 (65136) */
+    4485, /* FE71 (65137) */
+    4486, /* FE72 (65138) */
     1, /* FE73 (65139) */
-    4483, /* FE74 (65140) */
+    4487, /* FE74 (65140) */
     56, /* FE75 (65141) */
-    4484, /* FE76 (65142) */
-    4485, /* FE77 (65143) */
-    4486, /* FE78 (65144) */
-    4487, /* FE79 (65145) */
-    4488, /* FE7A (65146) */
-    4489, /* FE7B (65147) */
-    4490, /* FE7C (65148) */
-    4491, /* FE7D (65149) */
-    4492, /* FE7E (65150) */
-    4493, /* FE7F (65151) */
-    4494, /* FE80 (65152) */
-    4495, /* FE81 (65153) */
-    4496, /* FE82 (65154) */
-    4497, /* FE83 (65155) */
-    4498, /* FE84 (65156) */
-    4499, /* FE85 (65157) */
-    4500, /* FE86 (65158) */
-    4501, /* FE87 (65159) */
-    4502, /* FE88 (65160) */
-    4503, /* FE89 (65161) */
-    4504, /* FE8A (65162) */
-    4505, /* FE8B (65163) */
-    4506, /* FE8C (65164) */
-    4507, /* FE8D (65165) */
-    4508, /* FE8E (65166) */
-    4509, /* FE8F (65167) */
-    4510, /* FE90 (65168) */
-    4511, /* FE91 (65169) */
-    4512, /* FE92 (65170) */
-    4513, /* FE93 (65171) */
-    4514, /* FE94 (65172) */
-    4515, /* FE95 (65173) */
-    4516, /* FE96 (65174) */
-    4517, /* FE97 (65175) */
-    4518, /* FE98 (65176) */
-    4519, /* FE99 (65177) */
-    4520, /* FE9A (65178) */
-    4521, /* FE9B (65179) */
-    4522, /* FE9C (65180) */
-    4523, /* FE9D (65181) */
-    4524, /* FE9E (65182) */
-    4525, /* FE9F (65183) */
-    4526, /* FEA0 (65184) */
-    4527, /* FEA1 (65185) */
-    4528, /* FEA2 (65186) */
-    4529, /* FEA3 (65187) */
-    4530, /* FEA4 (65188) */
-    4531, /* FEA5 (65189) */
-    4532, /* FEA6 (65190) */
-    4533, /* FEA7 (65191) */
-    4534, /* FEA8 (65192) */
-    4535, /* FEA9 (65193) */
-    4536, /* FEAA (65194) */
-    4537, /* FEAB (65195) */
-    4538, /* FEAC (65196) */
-    4539, /* FEAD (65197) */
-    4540, /* FEAE (65198) */
-    4541, /* FEAF (65199) */
-    4542, /* FEB0 (65200) */
-    4543, /* FEB1 (65201) */
-    4544, /* FEB2 (65202) */
-    4545, /* FEB3 (65203) */
-    4546, /* FEB4 (65204) */
-    4547, /* FEB5 (65205) */
-    4548, /* FEB6 (65206) */
-    4549, /* FEB7 (65207) */
-    4550, /* FEB8 (65208) */
-    4551, /* FEB9 (65209) */
-    4552, /* FEBA (65210) */
-    4553, /* FEBB (65211) */
-    4554, /* FEBC (65212) */
-    4555, /* FEBD (65213) */
-    4556, /* FEBE (65214) */
-    4557, /* FEBF (65215) */
-    4558, /* FEC0 (65216) */
-    4559, /* FEC1 (65217) */
-    4560, /* FEC2 (65218) */
-    4561, /* FEC3 (65219) */
-    4562, /* FEC4 (65220) */
-    4563, /* FEC5 (65221) */
-    4564, /* FEC6 (65222) */
-    4565, /* FEC7 (65223) */
-    4566, /* FEC8 (65224) */
-    4567, /* FEC9 (65225) */
-    4568, /* FECA (65226) */
-    4569, /* FECB (65227) */
-    4570, /* FECC (65228) */
-    4571, /* FECD (65229) */
-    4572, /* FECE (65230) */
-    4573, /* FECF (65231) */
-    4574, /* FED0 (65232) */
-    4575, /* FED1 (65233) */
-    4576, /* FED2 (65234) */
-    4577, /* FED3 (65235) */
-    4578, /* FED4 (65236) */
-    4579, /* FED5 (65237) */
-    4580, /* FED6 (65238) */
-    4581, /* FED7 (65239) */
-    4582, /* FED8 (65240) */
-    4583, /* FED9 (65241) */
-    4584, /* FEDA (65242) */
-    4585, /* FEDB (65243) */
-    4586, /* FEDC (65244) */
-    4587, /* FEDD (65245) */
-    4588, /* FEDE (65246) */
-    4589, /* FEDF (65247) */
-    4590, /* FEE0 (65248) */
-    4591, /* FEE1 (65249) */
-    4592, /* FEE2 (65250) */
-    4593, /* FEE3 (65251) */
-    4594, /* FEE4 (65252) */
-    4595, /* FEE5 (65253) */
-    4596, /* FEE6 (65254) */
-    4597, /* FEE7 (65255) */
-    4598, /* FEE8 (65256) */
-    4599, /* FEE9 (65257) */
-    4600, /* FEEA (65258) */
-    4601, /* FEEB (65259) */
-    4602, /* FEEC (65260) */
-    4603, /* FEED (65261) */
-    4604, /* FEEE (65262) */
-    4605, /* FEEF (65263) */
-    4606, /* FEF0 (65264) */
-    4607, /* FEF1 (65265) */
-    4608, /* FEF2 (65266) */
-    4609, /* FEF3 (65267) */
-    4610, /* FEF4 (65268) */
-    4611, /* FEF5 (65269) */
-    4612, /* FEF6 (65270) */
-    4613, /* FEF7 (65271) */
-    4614, /* FEF8 (65272) */
-    4615, /* FEF9 (65273) */
-    4616, /* FEFA (65274) */
-    4617, /* FEFB (65275) */
-    4618, /* FEFC (65276) */
+    4488, /* FE76 (65142) */
+    4489, /* FE77 (65143) */
+    4490, /* FE78 (65144) */
+    4491, /* FE79 (65145) */
+    4492, /* FE7A (65146) */
+    4493, /* FE7B (65147) */
+    4494, /* FE7C (65148) */
+    4495, /* FE7D (65149) */
+    4496, /* FE7E (65150) */
+    4497, /* FE7F (65151) */
+    4498, /* FE80 (65152) */
+    4499, /* FE81 (65153) */
+    4500, /* FE82 (65154) */
+    4501, /* FE83 (65155) */
+    4502, /* FE84 (65156) */
+    4503, /* FE85 (65157) */
+    4504, /* FE86 (65158) */
+    4505, /* FE87 (65159) */
+    4506, /* FE88 (65160) */
+    4507, /* FE89 (65161) */
+    4508, /* FE8A (65162) */
+    4509, /* FE8B (65163) */
+    4510, /* FE8C (65164) */
+    4511, /* FE8D (65165) */
+    4512, /* FE8E (65166) */
+    4513, /* FE8F (65167) */
+    4514, /* FE90 (65168) */
+    4515, /* FE91 (65169) */
+    4516, /* FE92 (65170) */
+    4517, /* FE93 (65171) */
+    4518, /* FE94 (65172) */
+    4519, /* FE95 (65173) */
+    4520, /* FE96 (65174) */
+    4521, /* FE97 (65175) */
+    4522, /* FE98 (65176) */
+    4523, /* FE99 (65177) */
+    4524, /* FE9A (65178) */
+    4525, /* FE9B (65179) */
+    4526, /* FE9C (65180) */
+    4527, /* FE9D (65181) */
+    4528, /* FE9E (65182) */
+    4529, /* FE9F (65183) */
+    4530, /* FEA0 (65184) */
+    4531, /* FEA1 (65185) */
+    4532, /* FEA2 (65186) */
+    4533, /* FEA3 (65187) */
+    4534, /* FEA4 (65188) */
+    4535, /* FEA5 (65189) */
+    4536, /* FEA6 (65190) */
+    4537, /* FEA7 (65191) */
+    4538, /* FEA8 (65192) */
+    4539, /* FEA9 (65193) */
+    4540, /* FEAA (65194) */
+    4541, /* FEAB (65195) */
+    4542, /* FEAC (65196) */
+    4543, /* FEAD (65197) */
+    4544, /* FEAE (65198) */
+    4545, /* FEAF (65199) */
+    4546, /* FEB0 (65200) */
+    4547, /* FEB1 (65201) */
+    4548, /* FEB2 (65202) */
+    4549, /* FEB3 (65203) */
+    4550, /* FEB4 (65204) */
+    4551, /* FEB5 (65205) */
+    4552, /* FEB6 (65206) */
+    4553, /* FEB7 (65207) */
+    4554, /* FEB8 (65208) */
+    4555, /* FEB9 (65209) */
+    4556, /* FEBA (65210) */
+    4557, /* FEBB (65211) */
+    4558, /* FEBC (65212) */
+    4559, /* FEBD (65213) */
+    4560, /* FEBE (65214) */
+    4561, /* FEBF (65215) */
+    4562, /* FEC0 (65216) */
+    4563, /* FEC1 (65217) */
+    4564, /* FEC2 (65218) */
+    4565, /* FEC3 (65219) */
+    4566, /* FEC4 (65220) */
+    4567, /* FEC5 (65221) */
+    4568, /* FEC6 (65222) */
+    4569, /* FEC7 (65223) */
+    4570, /* FEC8 (65224) */
+    4571, /* FEC9 (65225) */
+    4572, /* FECA (65226) */
+    4573, /* FECB (65227) */
+    4574, /* FECC (65228) */
+    4575, /* FECD (65229) */
+    4576, /* FECE (65230) */
+    4577, /* FECF (65231) */
+    4578, /* FED0 (65232) */
+    4579, /* FED1 (65233) */
+    4580, /* FED2 (65234) */
+    4581, /* FED3 (65235) */
+    4582, /* FED4 (65236) */
+    4583, /* FED5 (65237) */
+    4584, /* FED6 (65238) */
+    4585, /* FED7 (65239) */
+    4586, /* FED8 (65240) */
+    4587, /* FED9 (65241) */
+    4588, /* FEDA (65242) */
+    4589, /* FEDB (65243) */
+    4590, /* FEDC (65244) */
+    4591, /* FEDD (65245) */
+    4592, /* FEDE (65246) */
+    4593, /* FEDF (65247) */
+    4594, /* FEE0 (65248) */
+    4595, /* FEE1 (65249) */
+    4596, /* FEE2 (65250) */
+    4597, /* FEE3 (65251) */
+    4598, /* FEE4 (65252) */
+    4599, /* FEE5 (65253) */
+    4600, /* FEE6 (65254) */
+    4601, /* FEE7 (65255) */
+    4602, /* FEE8 (65256) */
+    4603, /* FEE9 (65257) */
+    4604, /* FEEA (65258) */
+    4605, /* FEEB (65259) */
+    4606, /* FEEC (65260) */
+    4607, /* FEED (65261) */
+    4608, /* FEEE (65262) */
+    4609, /* FEEF (65263) */
+    4610, /* FEF0 (65264) */
+    4611, /* FEF1 (65265) */
+    4612, /* FEF2 (65266) */
+    4613, /* FEF3 (65267) */
+    4614, /* FEF4 (65268) */
+    4615, /* FEF5 (65269) */
+    4616, /* FEF6 (65270) */
+    4617, /* FEF7 (65271) */
+    4618, /* FEF8 (65272) */
+    4619, /* FEF9 (65273) */
+    4620, /* FEFA (65274) */
+    4621, /* FEFB (65275) */
+    4622, /* FEFC (65276) */
     56, /* FEFD (65277) */
     56, /* FEFE (65278) */
     60, /* FEFF (65279) */
     56, /* FF00 (65280) */
-    4619, /* FF01 (65281) */
-    4620, /* FF02 (65282) */
-    4621, /* FF03 (65283) */
-    4622, /* FF04 (65284) */
-    4623, /* FF05 (65285) */
-    4624, /* FF06 (65286) */
-    4625, /* FF07 (65287) */
-    4626, /* FF08 (65288) */
-    4627, /* FF09 (65289) */
-    4628, /* FF0A (65290) */
-    4629, /* FF0B (65291) */
-    4630, /* FF0C (65292) */
-    4631, /* FF0D (65293) */
-    4632, /* FF0E (65294) */
-    4633, /* FF0F (65295) */
-    4634, /* FF10 (65296) */
-    4635, /* FF11 (65297) */
-    4636, /* FF12 (65298) */
-    4637, /* FF13 (65299) */
-    4638, /* FF14 (65300) */
-    4639, /* FF15 (65301) */
-    4640, /* FF16 (65302) */
-    4641, /* FF17 (65303) */
-    4642, /* FF18 (65304) */
-    4643, /* FF19 (65305) */
-    4644, /* FF1A (65306) */
-    4645, /* FF1B (65307) */
-    4646, /* FF1C (65308) */
-    4647, /* FF1D (65309) */
-    4648, /* FF1E (65310) */
-    4649, /* FF1F (65311) */
-    4650, /* FF20 (65312) */
-    4651, /* FF21 (65313) */
-    4652, /* FF22 (65314) */
-    4653, /* FF23 (65315) */
-    4654, /* FF24 (65316) */
-    4655, /* FF25 (65317) */
-    4656, /* FF26 (65318) */
-    4657, /* FF27 (65319) */
-    4658, /* FF28 (65320) */
-    4659, /* FF29 (65321) */
-    4660, /* FF2A (65322) */
-    4661, /* FF2B (65323) */
-    4662, /* FF2C (65324) */
-    4663, /* FF2D (65325) */
-    4664, /* FF2E (65326) */
-    4665, /* FF2F (65327) */
-    4666, /* FF30 (65328) */
-    4667, /* FF31 (65329) */
-    4668, /* FF32 (65330) */
-    4669, /* FF33 (65331) */
-    4670, /* FF34 (65332) */
-    4671, /* FF35 (65333) */
-    4672, /* FF36 (65334) */
-    4673, /* FF37 (65335) */
-    4674, /* FF38 (65336) */
-    4675, /* FF39 (65337) */
-    4676, /* FF3A (65338) */
-    4677, /* FF3B (65339) */
-    4678, /* FF3C (65340) */
-    4679, /* FF3D (65341) */
-    4680, /* FF3E (65342) */
-    4681, /* FF3F (65343) */
-    4682, /* FF40 (65344) */
-    4683, /* FF41 (65345) */
-    4684, /* FF42 (65346) */
-    4685, /* FF43 (65347) */
-    4686, /* FF44 (65348) */
-    4687, /* FF45 (65349) */
-    4688, /* FF46 (65350) */
-    4689, /* FF47 (65351) */
-    4690, /* FF48 (65352) */
-    4691, /* FF49 (65353) */
-    4692, /* FF4A (65354) */
-    4693, /* FF4B (65355) */
-    4694, /* FF4C (65356) */
-    4695, /* FF4D (65357) */
-    4696, /* FF4E (65358) */
-    4697, /* FF4F (65359) */
-    4698, /* FF50 (65360) */
-    4699, /* FF51 (65361) */
-    4700, /* FF52 (65362) */
-    4701, /* FF53 (65363) */
-    4702, /* FF54 (65364) */
-    4703, /* FF55 (65365) */
-    4704, /* FF56 (65366) */
-    4705, /* FF57 (65367) */
-    4706, /* FF58 (65368) */
-    4707, /* FF59 (65369) */
-    4708, /* FF5A (65370) */
-    4709, /* FF5B (65371) */
-    4710, /* FF5C (65372) */
-    4711, /* FF5D (65373) */
-    4712, /* FF5E (65374) */
-    4713, /* FF5F (65375) */
-    4714, /* FF60 (65376) */
-    4715, /* FF61 (65377) */
-    4716, /* FF62 (65378) */
-    4717, /* FF63 (65379) */
-    4718, /* FF64 (65380) */
-    4719, /* FF65 (65381) */
-    4720, /* FF66 (65382) */
-    4721, /* FF67 (65383) */
-    4722, /* FF68 (65384) */
-    4723, /* FF69 (65385) */
-    4724, /* FF6A (65386) */
-    4725, /* FF6B (65387) */
-    4726, /* FF6C (65388) */
-    4727, /* FF6D (65389) */
-    4728, /* FF6E (65390) */
-    4729, /* FF6F (65391) */
-    4730, /* FF70 (65392) */
-    4731, /* FF71 (65393) */
-    4732, /* FF72 (65394) */
-    4733, /* FF73 (65395) */
-    4734, /* FF74 (65396) */
-    4735, /* FF75 (65397) */
-    4736, /* FF76 (65398) */
-    4737, /* FF77 (65399) */
-    4738, /* FF78 (65400) */
-    4739, /* FF79 (65401) */
-    4740, /* FF7A (65402) */
-    4741, /* FF7B (65403) */
-    4742, /* FF7C (65404) */
-    4743, /* FF7D (65405) */
-    4744, /* FF7E (65406) */
-    4745, /* FF7F (65407) */
-    4746, /* FF80 (65408) */
-    4747, /* FF81 (65409) */
-    4748, /* FF82 (65410) */
-    4749, /* FF83 (65411) */
-    4750, /* FF84 (65412) */
-    4751, /* FF85 (65413) */
-    4752, /* FF86 (65414) */
-    4753, /* FF87 (65415) */
-    4754, /* FF88 (65416) */
-    4755, /* FF89 (65417) */
-    4756, /* FF8A (65418) */
-    4757, /* FF8B (65419) */
-    4758, /* FF8C (65420) */
-    4759, /* FF8D (65421) */
-    4760, /* FF8E (65422) */
-    4761, /* FF8F (65423) */
-    4762, /* FF90 (65424) */
-    4763, /* FF91 (65425) */
-    4764, /* FF92 (65426) */
-    4765, /* FF93 (65427) */
-    4766, /* FF94 (65428) */
-    4767, /* FF95 (65429) */
-    4768, /* FF96 (65430) */
-    4769, /* FF97 (65431) */
-    4770, /* FF98 (65432) */
-    4771, /* FF99 (65433) */
-    4772, /* FF9A (65434) */
-    4773, /* FF9B (65435) */
-    4774, /* FF9C (65436) */
-    4775, /* FF9D (65437) */
-    4776, /* FF9E (65438) */
-    4777, /* FF9F (65439) */
-    4778, /* FFA0 (65440) */
-    4779, /* FFA1 (65441) */
-    4780, /* FFA2 (65442) */
-    4781, /* FFA3 (65443) */
-    4782, /* FFA4 (65444) */
-    4783, /* FFA5 (65445) */
-    4784, /* FFA6 (65446) */
-    4785, /* FFA7 (65447) */
-    4786, /* FFA8 (65448) */
-    4787, /* FFA9 (65449) */
-    4788, /* FFAA (65450) */
-    4789, /* FFAB (65451) */
-    4790, /* FFAC (65452) */
-    4791, /* FFAD (65453) */
-    4792, /* FFAE (65454) */
-    4793, /* FFAF (65455) */
-    4794, /* FFB0 (65456) */
-    4795, /* FFB1 (65457) */
-    4796, /* FFB2 (65458) */
-    4797, /* FFB3 (65459) */
-    4798, /* FFB4 (65460) */
-    4799, /* FFB5 (65461) */
-    4800, /* FFB6 (65462) */
-    4801, /* FFB7 (65463) */
-    4802, /* FFB8 (65464) */
-    4803, /* FFB9 (65465) */
-    4804, /* FFBA (65466) */
-    4805, /* FFBB (65467) */
-    4806, /* FFBC (65468) */
-    4807, /* FFBD (65469) */
-    4808, /* FFBE (65470) */
+    4623, /* FF01 (65281) */
+    4624, /* FF02 (65282) */
+    4625, /* FF03 (65283) */
+    4626, /* FF04 (65284) */
+    4627, /* FF05 (65285) */
+    4628, /* FF06 (65286) */
+    4629, /* FF07 (65287) */
+    4630, /* FF08 (65288) */
+    4631, /* FF09 (65289) */
+    4632, /* FF0A (65290) */
+    4633, /* FF0B (65291) */
+    4634, /* FF0C (65292) */
+    4635, /* FF0D (65293) */
+    4636, /* FF0E (65294) */
+    4637, /* FF0F (65295) */
+    4638, /* FF10 (65296) */
+    4639, /* FF11 (65297) */
+    4640, /* FF12 (65298) */
+    4641, /* FF13 (65299) */
+    4642, /* FF14 (65300) */
+    4643, /* FF15 (65301) */
+    4644, /* FF16 (65302) */
+    4645, /* FF17 (65303) */
+    4646, /* FF18 (65304) */
+    4647, /* FF19 (65305) */
+    4648, /* FF1A (65306) */
+    4649, /* FF1B (65307) */
+    4650, /* FF1C (65308) */
+    4651, /* FF1D (65309) */
+    4652, /* FF1E (65310) */
+    4653, /* FF1F (65311) */
+    4654, /* FF20 (65312) */
+    4655, /* FF21 (65313) */
+    4656, /* FF22 (65314) */
+    4657, /* FF23 (65315) */
+    4658, /* FF24 (65316) */
+    4659, /* FF25 (65317) */
+    4660, /* FF26 (65318) */
+    4661, /* FF27 (65319) */
+    4662, /* FF28 (65320) */
+    4663, /* FF29 (65321) */
+    4664, /* FF2A (65322) */
+    4665, /* FF2B (65323) */
+    4666, /* FF2C (65324) */
+    4667, /* FF2D (65325) */
+    4668, /* FF2E (65326) */
+    4669, /* FF2F (65327) */
+    4670, /* FF30 (65328) */
+    4671, /* FF31 (65329) */
+    4672, /* FF32 (65330) */
+    4673, /* FF33 (65331) */
+    4674, /* FF34 (65332) */
+    4675, /* FF35 (65333) */
+    4676, /* FF36 (65334) */
+    4677, /* FF37 (65335) */
+    4678, /* FF38 (65336) */
+    4679, /* FF39 (65337) */
+    4680, /* FF3A (65338) */
+    4681, /* FF3B (65339) */
+    4682, /* FF3C (65340) */
+    4683, /* FF3D (65341) */
+    4684, /* FF3E (65342) */
+    4685, /* FF3F (65343) */
+    4686, /* FF40 (65344) */
+    4687, /* FF41 (65345) */
+    4688, /* FF42 (65346) */
+    4689, /* FF43 (65347) */
+    4690, /* FF44 (65348) */
+    4691, /* FF45 (65349) */
+    4692, /* FF46 (65350) */
+    4693, /* FF47 (65351) */
+    4694, /* FF48 (65352) */
+    4695, /* FF49 (65353) */
+    4696, /* FF4A (65354) */
+    4697, /* FF4B (65355) */
+    4698, /* FF4C (65356) */
+    4699, /* FF4D (65357) */
+    4700, /* FF4E (65358) */
+    4701, /* FF4F (65359) */
+    4702, /* FF50 (65360) */
+    4703, /* FF51 (65361) */
+    4704, /* FF52 (65362) */
+    4705, /* FF53 (65363) */
+    4706, /* FF54 (65364) */
+    4707, /* FF55 (65365) */
+    4708, /* FF56 (65366) */
+    4709, /* FF57 (65367) */
+    4710, /* FF58 (65368) */
+    4711, /* FF59 (65369) */
+    4712, /* FF5A (65370) */
+    4713, /* FF5B (65371) */
+    4714, /* FF5C (65372) */
+    4715, /* FF5D (65373) */
+    4716, /* FF5E (65374) */
+    4717, /* FF5F (65375) */
+    4718, /* FF60 (65376) */
+    4719, /* FF61 (65377) */
+    4720, /* FF62 (65378) */
+    4721, /* FF63 (65379) */
+    4722, /* FF64 (65380) */
+    4723, /* FF65 (65381) */
+    4724, /* FF66 (65382) */
+    4725, /* FF67 (65383) */
+    4726, /* FF68 (65384) */
+    4727, /* FF69 (65385) */
+    4728, /* FF6A (65386) */
+    4729, /* FF6B (65387) */
+    4730, /* FF6C (65388) */
+    4731, /* FF6D (65389) */
+    4732, /* FF6E (65390) */
+    4733, /* FF6F (65391) */
+    4734, /* FF70 (65392) */
+    4735, /* FF71 (65393) */
+    4736, /* FF72 (65394) */
+    4737, /* FF73 (65395) */
+    4738, /* FF74 (65396) */
+    4739, /* FF75 (65397) */
+    4740, /* FF76 (65398) */
+    4741, /* FF77 (65399) */
+    4742, /* FF78 (65400) */
+    4743, /* FF79 (65401) */
+    4744, /* FF7A (65402) */
+    4745, /* FF7B (65403) */
+    4746, /* FF7C (65404) */
+    4747, /* FF7D (65405) */
+    4748, /* FF7E (65406) */
+    4749, /* FF7F (65407) */
+    4750, /* FF80 (65408) */
+    4751, /* FF81 (65409) */
+    4752, /* FF82 (65410) */
+    4753, /* FF83 (65411) */
+    4754, /* FF84 (65412) */
+    4755, /* FF85 (65413) */
+    4756, /* FF86 (65414) */
+    4757, /* FF87 (65415) */
+    4758, /* FF88 (65416) */
+    4759, /* FF89 (65417) */
+    4760, /* FF8A (65418) */
+    4761, /* FF8B (65419) */
+    4762, /* FF8C (65420) */
+    4763, /* FF8D (65421) */
+    4764, /* FF8E (65422) */
+    4765, /* FF8F (65423) */
+    4766, /* FF90 (65424) */
+    4767, /* FF91 (65425) */
+    4768, /* FF92 (65426) */
+    4769, /* FF93 (65427) */
+    4770, /* FF94 (65428) */
+    4771, /* FF95 (65429) */
+    4772, /* FF96 (65430) */
+    4773, /* FF97 (65431) */
+    4774, /* FF98 (65432) */
+    4775, /* FF99 (65433) */
+    4776, /* FF9A (65434) */
+    4777, /* FF9B (65435) */
+    4778, /* FF9C (65436) */
+    4779, /* FF9D (65437) */
+    4780, /* FF9E (65438) */
+    4781, /* FF9F (65439) */
+    4782, /* FFA0 (65440) */
+    4783, /* FFA1 (65441) */
+    4784, /* FFA2 (65442) */
+    4785, /* FFA3 (65443) */
+    4786, /* FFA4 (65444) */
+    4787, /* FFA5 (65445) */
+    4788, /* FFA6 (65446) */
+    4789, /* FFA7 (65447) */
+    4790, /* FFA8 (65448) */
+    4791, /* FFA9 (65449) */
+    4792, /* FFAA (65450) */
+    4793, /* FFAB (65451) */
+    4794, /* FFAC (65452) */
+    4795, /* FFAD (65453) */
+    4796, /* FFAE (65454) */
+    4797, /* FFAF (65455) */
+    4798, /* FFB0 (65456) */
+    4799, /* FFB1 (65457) */
+    4800, /* FFB2 (65458) */
+    4801, /* FFB3 (65459) */
+    4802, /* FFB4 (65460) */
+    4803, /* FFB5 (65461) */
+    4804, /* FFB6 (65462) */
+    4805, /* FFB7 (65463) */
+    4806, /* FFB8 (65464) */
+    4807, /* FFB9 (65465) */
+    4808, /* FFBA (65466) */
+    4809, /* FFBB (65467) */
+    4810, /* FFBC (65468) */
+    4811, /* FFBD (65469) */
+    4812, /* FFBE (65470) */
     56, /* FFBF (65471) */
     56, /* FFC0 (65472) */
     56, /* FFC1 (65473) */
-    4809, /* FFC2 (65474) */
-    4810, /* FFC3 (65475) */
-    4811, /* FFC4 (65476) */
-    4812, /* FFC5 (65477) */
-    4813, /* FFC6 (65478) */
-    4814, /* FFC7 (65479) */
+    4813, /* FFC2 (65474) */
+    4814, /* FFC3 (65475) */
+    4815, /* FFC4 (65476) */
+    4816, /* FFC5 (65477) */
+    4817, /* FFC6 (65478) */
+    4818, /* FFC7 (65479) */
     56, /* FFC8 (65480) */
     56, /* FFC9 (65481) */
-    4815, /* FFCA (65482) */
-    4816, /* FFCB (65483) */
-    4817, /* FFCC (65484) */
-    4818, /* FFCD (65485) */
-    4819, /* FFCE (65486) */
-    4820, /* FFCF (65487) */
+    4819, /* FFCA (65482) */
+    4820, /* FFCB (65483) */
+    4821, /* FFCC (65484) */
+    4822, /* FFCD (65485) */
+    4823, /* FFCE (65486) */
+    4824, /* FFCF (65487) */
     56, /* FFD0 (65488) */
     56, /* FFD1 (65489) */
-    4821, /* FFD2 (65490) */
-    4822, /* FFD3 (65491) */
-    4823, /* FFD4 (65492) */
-    4824, /* FFD5 (65493) */
-    4825, /* FFD6 (65494) */
-    4826, /* FFD7 (65495) */
+    4825, /* FFD2 (65490) */
+    4826, /* FFD3 (65491) */
+    4827, /* FFD4 (65492) */
+    4828, /* FFD5 (65493) */
+    4829, /* FFD6 (65494) */
+    4830, /* FFD7 (65495) */
     56, /* FFD8 (65496) */
     56, /* FFD9 (65497) */
-    4827, /* FFDA (65498) */
-    4828, /* FFDB (65499) */
-    4829, /* FFDC (65500) */
+    4831, /* FFDA (65498) */
+    4832, /* FFDB (65499) */
+    4833, /* FFDC (65500) */
     56, /* FFDD (65501) */
     56, /* FFDE (65502) */
     56, /* FFDF (65503) */
-    4830, /* FFE0 (65504) */
-    4831, /* FFE1 (65505) */
-    4832, /* FFE2 (65506) */
-    4833, /* FFE3 (65507) */
-    4834, /* FFE4 (65508) */
-    4835, /* FFE5 (65509) */
-    4836, /* FFE6 (65510) */
+    4834, /* FFE0 (65504) */
+    4835, /* FFE1 (65505) */
+    4836, /* FFE2 (65506) */
+    4837, /* FFE3 (65507) */
+    4838, /* FFE4 (65508) */
+    4839, /* FFE5 (65509) */
+    4840, /* FFE6 (65510) */
     56, /* FFE7 (65511) */
-    4837, /* FFE8 (65512) */
-    4838, /* FFE9 (65513) */
-    4839, /* FFEA (65514) */
-    4840, /* FFEB (65515) */
-    4841, /* FFEC (65516) */
-    4842, /* FFED (65517) */
-    4843, /* FFEE (65518) */
+    4841, /* FFE8 (65512) */
+    4842, /* FFE9 (65513) */
+    4843, /* FFEA (65514) */
+    4844, /* FFEB (65515) */
+    4845, /* FFEC (65516) */
+    4846, /* FFED (65517) */
+    4847, /* FFEE (65518) */
     56, /* FFEF (65519) */
     56, /* FFF0 (65520) */
     56, /* FFF1 (65521) */
@@ -60188,46 +60188,46 @@ static const uint16_t lxb_unicode_table_map_63743_83527[19784] =
     56, /* 103FD (66557) */
     56, /* 103FE (66558) */
     56, /* 103FF (66559) */
-    4844, /* 10400 (66560) */
-    4845, /* 10401 (66561) */
-    4846, /* 10402 (66562) */
-    4847, /* 10403 (66563) */
-    4848, /* 10404 (66564) */
-    4849, /* 10405 (66565) */
-    4850, /* 10406 (66566) */
-    4851, /* 10407 (66567) */
-    4852, /* 10408 (66568) */
-    4853, /* 10409 (66569) */
-    4854, /* 1040A (66570) */
-    4855, /* 1040B (66571) */
-    4856, /* 1040C (66572) */
-    4857, /* 1040D (66573) */
-    4858, /* 1040E (66574) */
-    4859, /* 1040F (66575) */
-    4860, /* 10410 (66576) */
-    4861, /* 10411 (66577) */
-    4862, /* 10412 (66578) */
-    4863, /* 10413 (66579) */
-    4864, /* 10414 (66580) */
-    4865, /* 10415 (66581) */
-    4866, /* 10416 (66582) */
-    4867, /* 10417 (66583) */
-    4868, /* 10418 (66584) */
-    4869, /* 10419 (66585) */
-    4870, /* 1041A (66586) */
-    4871, /* 1041B (66587) */
-    4872, /* 1041C (66588) */
-    4873, /* 1041D (66589) */
-    4874, /* 1041E (66590) */
-    4875, /* 1041F (66591) */
-    4876, /* 10420 (66592) */
-    4877, /* 10421 (66593) */
-    4878, /* 10422 (66594) */
-    4879, /* 10423 (66595) */
-    4880, /* 10424 (66596) */
-    4881, /* 10425 (66597) */
-    4882, /* 10426 (66598) */
-    4883, /* 10427 (66599) */
+    4848, /* 10400 (66560) */
+    4849, /* 10401 (66561) */
+    4850, /* 10402 (66562) */
+    4851, /* 10403 (66563) */
+    4852, /* 10404 (66564) */
+    4853, /* 10405 (66565) */
+    4854, /* 10406 (66566) */
+    4855, /* 10407 (66567) */
+    4856, /* 10408 (66568) */
+    4857, /* 10409 (66569) */
+    4858, /* 1040A (66570) */
+    4859, /* 1040B (66571) */
+    4860, /* 1040C (66572) */
+    4861, /* 1040D (66573) */
+    4862, /* 1040E (66574) */
+    4863, /* 1040F (66575) */
+    4864, /* 10410 (66576) */
+    4865, /* 10411 (66577) */
+    4866, /* 10412 (66578) */
+    4867, /* 10413 (66579) */
+    4868, /* 10414 (66580) */
+    4869, /* 10415 (66581) */
+    4870, /* 10416 (66582) */
+    4871, /* 10417 (66583) */
+    4872, /* 10418 (66584) */
+    4873, /* 10419 (66585) */
+    4874, /* 1041A (66586) */
+    4875, /* 1041B (66587) */
+    4876, /* 1041C (66588) */
+    4877, /* 1041D (66589) */
+    4878, /* 1041E (66590) */
+    4879, /* 1041F (66591) */
+    4880, /* 10420 (66592) */
+    4881, /* 10421 (66593) */
+    4882, /* 10422 (66594) */
+    4883, /* 10423 (66595) */
+    4884, /* 10424 (66596) */
+    4885, /* 10425 (66597) */
+    4886, /* 10426 (66598) */
+    4887, /* 10427 (66599) */
     1, /* 10428 (66600) */
     1, /* 10429 (66601) */
     1, /* 1042A (66602) */
@@ -60364,42 +60364,42 @@ static const uint16_t lxb_unicode_table_map_63743_83527[19784] =
     56, /* 104AD (66733) */
     56, /* 104AE (66734) */
     56, /* 104AF (66735) */
-    4884, /* 104B0 (66736) */
-    4885, /* 104B1 (66737) */
-    4886, /* 104B2 (66738) */
-    4887, /* 104B3 (66739) */
-    4888, /* 104B4 (66740) */
-    4889, /* 104B5 (66741) */
-    4890, /* 104B6 (66742) */
-    4891, /* 104B7 (66743) */
-    4892, /* 104B8 (66744) */
-    4893, /* 104B9 (66745) */
-    4894, /* 104BA (66746) */
-    4895, /* 104BB (66747) */
-    4896, /* 104BC (66748) */
-    4897, /* 104BD (66749) */
-    4898, /* 104BE (66750) */
-    4899, /* 104BF (66751) */
-    4900, /* 104C0 (66752) */
-    4901, /* 104C1 (66753) */
-    4902, /* 104C2 (66754) */
-    4903, /* 104C3 (66755) */
-    4904, /* 104C4 (66756) */
-    4905, /* 104C5 (66757) */
-    4906, /* 104C6 (66758) */
-    4907, /* 104C7 (66759) */
-    4908, /* 104C8 (66760) */
-    4909, /* 104C9 (66761) */
-    4910, /* 104CA (66762) */
-    4911, /* 104CB (66763) */
-    4912, /* 104CC (66764) */
-    4913, /* 104CD (66765) */
-    4914, /* 104CE (66766) */
-    4915, /* 104CF (66767) */
-    4916, /* 104D0 (66768) */
-    4917, /* 104D1 (66769) */
-    4918, /* 104D2 (66770) */
-    4919, /* 104D3 (66771) */
+    4888, /* 104B0 (66736) */
+    4889, /* 104B1 (66737) */
+    4890, /* 104B2 (66738) */
+    4891, /* 104B3 (66739) */
+    4892, /* 104B4 (66740) */
+    4893, /* 104B5 (66741) */
+    4894, /* 104B6 (66742) */
+    4895, /* 104B7 (66743) */
+    4896, /* 104B8 (66744) */
+    4897, /* 104B9 (66745) */
+    4898, /* 104BA (66746) */
+    4899, /* 104BB (66747) */
+    4900, /* 104BC (66748) */
+    4901, /* 104BD (66749) */
+    4902, /* 104BE (66750) */
+    4903, /* 104BF (66751) */
+    4904, /* 104C0 (66752) */
+    4905, /* 104C1 (66753) */
+    4906, /* 104C2 (66754) */
+    4907, /* 104C3 (66755) */
+    4908, /* 104C4 (66756) */
+    4909, /* 104C5 (66757) */
+    4910, /* 104C6 (66758) */
+    4911, /* 104C7 (66759) */
+    4912, /* 104C8 (66760) */
+    4913, /* 104C9 (66761) */
+    4914, /* 104CA (66762) */
+    4915, /* 104CB (66763) */
+    4916, /* 104CC (66764) */
+    4917, /* 104CD (66765) */
+    4918, /* 104CE (66766) */
+    4919, /* 104CF (66767) */
+    4920, /* 104D0 (66768) */
+    4921, /* 104D1 (66769) */
+    4922, /* 104D2 (66770) */
+    4923, /* 104D3 (66771) */
     56, /* 104D4 (66772) */
     56, /* 104D5 (66773) */
     56, /* 104D6 (66774) */
@@ -60556,44 +60556,44 @@ static const uint16_t lxb_unicode_table_map_63743_83527[19784] =
     56, /* 1056D (66925) */
     56, /* 1056E (66926) */
     1, /* 1056F (66927) */
-    4920, /* 10570 (66928) */
-    4921, /* 10571 (66929) */
-    4922, /* 10572 (66930) */
-    4923, /* 10573 (66931) */
-    4924, /* 10574 (66932) */
-    4925, /* 10575 (66933) */
-    4926, /* 10576 (66934) */
-    4927, /* 10577 (66935) */
-    4928, /* 10578 (66936) */
-    4929, /* 10579 (66937) */
-    4930, /* 1057A (66938) */
+    4924, /* 10570 (66928) */
+    4925, /* 10571 (66929) */
+    4926, /* 10572 (66930) */
+    4927, /* 10573 (66931) */
+    4928, /* 10574 (66932) */
+    4929, /* 10575 (66933) */
+    4930, /* 10576 (66934) */
+    4931, /* 10577 (66935) */
+    4932, /* 10578 (66936) */
+    4933, /* 10579 (66937) */
+    4934, /* 1057A (66938) */
     56, /* 1057B (66939) */
-    4931, /* 1057C (66940) */
-    4932, /* 1057D (66941) */
-    4933, /* 1057E (66942) */
-    4934, /* 1057F (66943) */
-    4935, /* 10580 (66944) */
-    4936, /* 10581 (66945) */
-    4937, /* 10582 (66946) */
-    4938, /* 10583 (66947) */
-    4939, /* 10584 (66948) */
-    4940, /* 10585 (66949) */
-    4941, /* 10586 (66950) */
-    4942, /* 10587 (66951) */
-    4943, /* 10588 (66952) */
-    4944, /* 10589 (66953) */
-    4945, /* 1058A (66954) */
+    4935, /* 1057C (66940) */
+    4936, /* 1057D (66941) */
+    4937, /* 1057E (66942) */
+    4938, /* 1057F (66943) */
+    4939, /* 10580 (66944) */
+    4940, /* 10581 (66945) */
+    4941, /* 10582 (66946) */
+    4942, /* 10583 (66947) */
+    4943, /* 10584 (66948) */
+    4944, /* 10585 (66949) */
+    4945, /* 10586 (66950) */
+    4946, /* 10587 (66951) */
+    4947, /* 10588 (66952) */
+    4948, /* 10589 (66953) */
+    4949, /* 1058A (66954) */
     56, /* 1058B (66955) */
-    4946, /* 1058C (66956) */
-    4947, /* 1058D (66957) */
-    4948, /* 1058E (66958) */
-    4949, /* 1058F (66959) */
-    4950, /* 10590 (66960) */
-    4951, /* 10591 (66961) */
-    4952, /* 10592 (66962) */
+    4950, /* 1058C (66956) */
+    4951, /* 1058D (66957) */
+    4952, /* 1058E (66958) */
+    4953, /* 1058F (66959) */
+    4954, /* 10590 (66960) */
+    4955, /* 10591 (66961) */
+    4956, /* 10592 (66962) */
     56, /* 10593 (66963) */
-    4953, /* 10594 (66964) */
-    4954, /* 10595 (66965) */
+    4957, /* 10594 (66964) */
+    4958, /* 10595 (66965) */
     56, /* 10596 (66966) */
     1, /* 10597 (66967) */
     1, /* 10598 (66968) */
@@ -60645,7 +60645,7 @@ static const uint16_t lxb_unicode_table_map_63743_83527[19784] =
     1, /* 105C6 (67014) */
     1, /* 105C7 (67015) */
     1, /* 105C8 (67016) */
-    4955, /* 105C9 (67017) */
+    4959, /* 105C9 (67017) */
     1, /* 105CA (67018) */
     1, /* 105CB (67019) */
     1, /* 105CC (67020) */
@@ -60654,7 +60654,7 @@ static const uint16_t lxb_unicode_table_map_63743_83527[19784] =
     1, /* 105CF (67023) */
     1, /* 105D0 (67024) */
     1, /* 105D1 (67025) */
-    4956, /* 105D2 (67026) */
+    4960, /* 105D2 (67026) */
     1, /* 105D3 (67027) */
     1, /* 105D4 (67028) */
     1, /* 105D5 (67029) */
@@ -60662,7 +60662,7 @@ static const uint16_t lxb_unicode_table_map_63743_83527[19784] =
     1, /* 105D7 (67031) */
     1, /* 105D8 (67032) */
     1, /* 105D9 (67033) */
-    4957, /* 105DA (67034) */
+    4961, /* 105DA (67034) */
     1, /* 105DB (67035) */
     1, /* 105DC (67036) */
     1, /* 105DD (67037) */
@@ -60672,7 +60672,7 @@ static const uint16_t lxb_unicode_table_map_63743_83527[19784] =
     1, /* 105E1 (67041) */
     1, /* 105E2 (67042) */
     1, /* 105E3 (67043) */
-    4958, /* 105E4 (67044) */
+    4962, /* 105E4 (67044) */
     1, /* 105E5 (67045) */
     1, /* 105E6 (67046) */
     1, /* 105E7 (67047) */
@@ -61085,64 +61085,64 @@ static const uint16_t lxb_unicode_table_map_63743_83527[19784] =
     56, /* 1077E (67454) */
     56, /* 1077F (67455) */
     1, /* 10780 (67456) */
-    4959, /* 10781 (67457) */
-    4960, /* 10782 (67458) */
-    4961, /* 10783 (67459) */
-    4962, /* 10784 (67460) */
-    4963, /* 10785 (67461) */
+    4963, /* 10781 (67457) */
+    4964, /* 10782 (67458) */
+    4965, /* 10783 (67459) */
+    4966, /* 10784 (67460) */
+    4967, /* 10785 (67461) */
     56, /* 10786 (67462) */
-    4964, /* 10787 (67463) */
-    4965, /* 10788 (67464) */
-    4966, /* 10789 (67465) */
-    4967, /* 1078A (67466) */
-    4968, /* 1078B (67467) */
-    4969, /* 1078C (67468) */
-    4970, /* 1078D (67469) */
-    4971, /* 1078E (67470) */
-    4972, /* 1078F (67471) */
-    4973, /* 10790 (67472) */
-    4974, /* 10791 (67473) */
-    4975, /* 10792 (67474) */
-    4976, /* 10793 (67475) */
-    4977, /* 10794 (67476) */
-    4978, /* 10795 (67477) */
-    4979, /* 10796 (67478) */
-    4980, /* 10797 (67479) */
-    4981, /* 10798 (67480) */
-    4982, /* 10799 (67481) */
-    4983, /* 1079A (67482) */
-    4984, /* 1079B (67483) */
-    4985, /* 1079C (67484) */
-    4986, /* 1079D (67485) */
-    4987, /* 1079E (67486) */
-    4988, /* 1079F (67487) */
-    4989, /* 107A0 (67488) */
-    4990, /* 107A1 (67489) */
-    4991, /* 107A2 (67490) */
-    4992, /* 107A3 (67491) */
-    4993, /* 107A4 (67492) */
-    4994, /* 107A5 (67493) */
-    4995, /* 107A6 (67494) */
-    4996, /* 107A7 (67495) */
-    4997, /* 107A8 (67496) */
-    4998, /* 107A9 (67497) */
-    4999, /* 107AA (67498) */
-    5000, /* 107AB (67499) */
-    5001, /* 107AC (67500) */
-    5002, /* 107AD (67501) */
-    5003, /* 107AE (67502) */
-    5004, /* 107AF (67503) */
-    5005, /* 107B0 (67504) */
+    4968, /* 10787 (67463) */
+    4969, /* 10788 (67464) */
+    4970, /* 10789 (67465) */
+    4971, /* 1078A (67466) */
+    4972, /* 1078B (67467) */
+    4973, /* 1078C (67468) */
+    4974, /* 1078D (67469) */
+    4975, /* 1078E (67470) */
+    4976, /* 1078F (67471) */
+    4977, /* 10790 (67472) */
+    4978, /* 10791 (67473) */
+    4979, /* 10792 (67474) */
+    4980, /* 10793 (67475) */
+    4981, /* 10794 (67476) */
+    4982, /* 10795 (67477) */
+    4983, /* 10796 (67478) */
+    4984, /* 10797 (67479) */
+    4985, /* 10798 (67480) */
+    4986, /* 10799 (67481) */
+    4987, /* 1079A (67482) */
+    4988, /* 1079B (67483) */
+    4989, /* 1079C (67484) */
+    4990, /* 1079D (67485) */
+    4991, /* 1079E (67486) */
+    4992, /* 1079F (67487) */
+    4993, /* 107A0 (67488) */
+    4994, /* 107A1 (67489) */
+    4995, /* 107A2 (67490) */
+    4996, /* 107A3 (67491) */
+    4997, /* 107A4 (67492) */
+    4998, /* 107A5 (67493) */
+    4999, /* 107A6 (67494) */
+    5000, /* 107A7 (67495) */
+    5001, /* 107A8 (67496) */
+    5002, /* 107A9 (67497) */
+    5003, /* 107AA (67498) */
+    5004, /* 107AB (67499) */
+    5005, /* 107AC (67500) */
+    5006, /* 107AD (67501) */
+    5007, /* 107AE (67502) */
+    5008, /* 107AF (67503) */
+    5009, /* 107B0 (67504) */
     56, /* 107B1 (67505) */
-    5006, /* 107B2 (67506) */
-    5007, /* 107B3 (67507) */
-    5008, /* 107B4 (67508) */
-    5009, /* 107B5 (67509) */
-    5010, /* 107B6 (67510) */
-    5011, /* 107B7 (67511) */
-    5012, /* 107B8 (67512) */
-    5013, /* 107B9 (67513) */
-    5014, /* 107BA (67514) */
+    5010, /* 107B2 (67506) */
+    5011, /* 107B3 (67507) */
+    5012, /* 107B4 (67508) */
+    5013, /* 107B5 (67509) */
+    5014, /* 107B6 (67510) */
+    5015, /* 107B7 (67511) */
+    5016, /* 107B8 (67512) */
+    5017, /* 107B9 (67513) */
+    5018, /* 107BA (67514) */
     56, /* 107BB (67515) */
     56, /* 107BC (67516) */
     56, /* 107BD (67517) */
@@ -61532,32 +61532,32 @@ static const uint16_t lxb_unicode_table_map_63743_83527[19784] =
     56, /* 1093D (67901) */
     56, /* 1093E (67902) */
     1, /* 1093F (67903) */
-    56, /* 10940 (67904) */
-    56, /* 10941 (67905) */
-    56, /* 10942 (67906) */
-    56, /* 10943 (67907) */
-    56, /* 10944 (67908) */
-    56, /* 10945 (67909) */
-    56, /* 10946 (67910) */
-    56, /* 10947 (67911) */
-    56, /* 10948 (67912) */
-    56, /* 10949 (67913) */
-    56, /* 1094A (67914) */
-    56, /* 1094B (67915) */
-    56, /* 1094C (67916) */
-    56, /* 1094D (67917) */
-    56, /* 1094E (67918) */
-    56, /* 1094F (67919) */
-    56, /* 10950 (67920) */
-    56, /* 10951 (67921) */
-    56, /* 10952 (67922) */
-    56, /* 10953 (67923) */
-    56, /* 10954 (67924) */
-    56, /* 10955 (67925) */
-    56, /* 10956 (67926) */
-    56, /* 10957 (67927) */
-    56, /* 10958 (67928) */
-    56, /* 10959 (67929) */
+    1, /* 10940 (67904) */
+    1, /* 10941 (67905) */
+    1, /* 10942 (67906) */
+    1, /* 10943 (67907) */
+    1, /* 10944 (67908) */
+    1, /* 10945 (67909) */
+    1, /* 10946 (67910) */
+    1, /* 10947 (67911) */
+    1, /* 10948 (67912) */
+    1, /* 10949 (67913) */
+    1, /* 1094A (67914) */
+    1, /* 1094B (67915) */
+    1, /* 1094C (67916) */
+    1, /* 1094D (67917) */
+    1, /* 1094E (67918) */
+    1, /* 1094F (67919) */
+    1, /* 10950 (67920) */
+    1, /* 10951 (67921) */
+    1, /* 10952 (67922) */
+    1, /* 10953 (67923) */
+    1, /* 10954 (67924) */
+    1, /* 10955 (67925) */
+    1, /* 10956 (67926) */
+    1, /* 10957 (67927) */
+    1, /* 10958 (67928) */
+    1, /* 10959 (67929) */
     56, /* 1095A (67930) */
     56, /* 1095B (67931) */
     56, /* 1095C (67932) */
@@ -62364,57 +62364,57 @@ static const uint16_t lxb_unicode_table_map_63743_83527[19784] =
     56, /* 10C7D (68733) */
     56, /* 10C7E (68734) */
     56, /* 10C7F (68735) */
-    5015, /* 10C80 (68736) */
-    5016, /* 10C81 (68737) */
-    5017, /* 10C82 (68738) */
-    5018, /* 10C83 (68739) */
-    5019, /* 10C84 (68740) */
-    5020, /* 10C85 (68741) */
-    5021, /* 10C86 (68742) */
-    5022, /* 10C87 (68743) */
-    5023, /* 10C88 (68744) */
-    5024, /* 10C89 (68745) */
-    5025, /* 10C8A (68746) */
-    5026, /* 10C8B (68747) */
-    5027, /* 10C8C (68748) */
-    5028, /* 10C8D (68749) */
-    5029, /* 10C8E (68750) */
-    5030, /* 10C8F (68751) */
-    5031, /* 10C90 (68752) */
-    5032, /* 10C91 (68753) */
-    5033, /* 10C92 (68754) */
-    5034, /* 10C93 (68755) */
-    5035, /* 10C94 (68756) */
-    5036, /* 10C95 (68757) */
-    5037, /* 10C96 (68758) */
-    5038, /* 10C97 (68759) */
-    5039, /* 10C98 (68760) */
-    5040, /* 10C99 (68761) */
-    5041, /* 10C9A (68762) */
-    5042, /* 10C9B (68763) */
-    5043, /* 10C9C (68764) */
-    5044, /* 10C9D (68765) */
-    5045, /* 10C9E (68766) */
-    5046, /* 10C9F (68767) */
-    5047, /* 10CA0 (68768) */
-    5048, /* 10CA1 (68769) */
-    5049, /* 10CA2 (68770) */
-    5050, /* 10CA3 (68771) */
-    5051, /* 10CA4 (68772) */
-    5052, /* 10CA5 (68773) */
-    5053, /* 10CA6 (68774) */
-    5054, /* 10CA7 (68775) */
-    5055, /* 10CA8 (68776) */
-    5056, /* 10CA9 (68777) */
-    5057, /* 10CAA (68778) */
-    5058, /* 10CAB (68779) */
-    5059, /* 10CAC (68780) */
-    5060, /* 10CAD (68781) */
-    5061, /* 10CAE (68782) */
-    5062, /* 10CAF (68783) */
-    5063, /* 10CB0 (68784) */
-    5064, /* 10CB1 (68785) */
-    5065, /* 10CB2 (68786) */
+    5019, /* 10C80 (68736) */
+    5020, /* 10C81 (68737) */
+    5021, /* 10C82 (68738) */
+    5022, /* 10C83 (68739) */
+    5023, /* 10C84 (68740) */
+    5024, /* 10C85 (68741) */
+    5025, /* 10C86 (68742) */
+    5026, /* 10C87 (68743) */
+    5027, /* 10C88 (68744) */
+    5028, /* 10C89 (68745) */
+    5029, /* 10C8A (68746) */
+    5030, /* 10C8B (68747) */
+    5031, /* 10C8C (68748) */
+    5032, /* 10C8D (68749) */
+    5033, /* 10C8E (68750) */
+    5034, /* 10C8F (68751) */
+    5035, /* 10C90 (68752) */
+    5036, /* 10C91 (68753) */
+    5037, /* 10C92 (68754) */
+    5038, /* 10C93 (68755) */
+    5039, /* 10C94 (68756) */
+    5040, /* 10C95 (68757) */
+    5041, /* 10C96 (68758) */
+    5042, /* 10C97 (68759) */
+    5043, /* 10C98 (68760) */
+    5044, /* 10C99 (68761) */
+    5045, /* 10C9A (68762) */
+    5046, /* 10C9B (68763) */
+    5047, /* 10C9C (68764) */
+    5048, /* 10C9D (68765) */
+    5049, /* 10C9E (68766) */
+    5050, /* 10C9F (68767) */
+    5051, /* 10CA0 (68768) */
+    5052, /* 10CA1 (68769) */
+    5053, /* 10CA2 (68770) */
+    5054, /* 10CA3 (68771) */
+    5055, /* 10CA4 (68772) */
+    5056, /* 10CA5 (68773) */
+    5057, /* 10CA6 (68774) */
+    5058, /* 10CA7 (68775) */
+    5059, /* 10CA8 (68776) */
+    5060, /* 10CA9 (68777) */
+    5061, /* 10CAA (68778) */
+    5062, /* 10CAB (68779) */
+    5063, /* 10CAC (68780) */
+    5064, /* 10CAD (68781) */
+    5065, /* 10CAE (68782) */
+    5066, /* 10CAF (68783) */
+    5067, /* 10CB0 (68784) */
+    5068, /* 10CB1 (68785) */
+    5069, /* 10CB2 (68786) */
     56, /* 10CB3 (68787) */
     56, /* 10CB4 (68788) */
     56, /* 10CB5 (68789) */
@@ -62572,28 +62572,28 @@ static const uint16_t lxb_unicode_table_map_63743_83527[19784] =
     1, /* 10D4D (68941) */
     1, /* 10D4E (68942) */
     1, /* 10D4F (68943) */
-    5066, /* 10D50 (68944) */
-    5067, /* 10D51 (68945) */
-    5068, /* 10D52 (68946) */
-    5069, /* 10D53 (68947) */
-    5070, /* 10D54 (68948) */
-    5071, /* 10D55 (68949) */
-    5072, /* 10D56 (68950) */
-    5073, /* 10D57 (68951) */
-    5074, /* 10D58 (68952) */
-    5075, /* 10D59 (68953) */
-    5076, /* 10D5A (68954) */
-    5077, /* 10D5B (68955) */
-    5078, /* 10D5C (68956) */
-    5079, /* 10D5D (68957) */
-    5080, /* 10D5E (68958) */
-    5081, /* 10D5F (68959) */
-    5082, /* 10D60 (68960) */
-    5083, /* 10D61 (68961) */
-    5084, /* 10D62 (68962) */
-    5085, /* 10D63 (68963) */
-    5086, /* 10D64 (68964) */
-    5087, /* 10D65 (68965) */
+    5070, /* 10D50 (68944) */
+    5071, /* 10D51 (68945) */
+    5072, /* 10D52 (68946) */
+    5073, /* 10D53 (68947) */
+    5074, /* 10D54 (68948) */
+    5075, /* 10D55 (68949) */
+    5076, /* 10D56 (68950) */
+    5077, /* 10D57 (68951) */
+    5078, /* 10D58 (68952) */
+    5079, /* 10D59 (68953) */
+    5080, /* 10D5A (68954) */
+    5081, /* 10D5B (68955) */
+    5082, /* 10D5C (68956) */
+    5083, /* 10D5D (68957) */
+    5084, /* 10D5E (68958) */
+    5085, /* 10D5F (68959) */
+    5086, /* 10D60 (68960) */
+    5087, /* 10D61 (68961) */
+    5088, /* 10D62 (68962) */
+    5089, /* 10D63 (68963) */
+    5090, /* 10D64 (68964) */
+    5091, /* 10D65 (68965) */
     56, /* 10D66 (68966) */
     56, /* 10D67 (68967) */
     56, /* 10D68 (68968) */
@@ -62945,9 +62945,9 @@ static const uint16_t lxb_unicode_table_map_63743_83527[19784] =
     1, /* 10EC2 (69314) */
     1, /* 10EC3 (69315) */
     1, /* 10EC4 (69316) */
-    56, /* 10EC5 (69317) */
-    56, /* 10EC6 (69318) */
-    56, /* 10EC7 (69319) */
+    1, /* 10EC5 (69317) */
+    1, /* 10EC6 (69318) */
+    1, /* 10EC7 (69319) */
     56, /* 10EC8 (69320) */
     56, /* 10EC9 (69321) */
     56, /* 10ECA (69322) */
@@ -62956,15 +62956,15 @@ static const uint16_t lxb_unicode_table_map_63743_83527[19784] =
     56, /* 10ECD (69325) */
     56, /* 10ECE (69326) */
     56, /* 10ECF (69327) */
-    56, /* 10ED0 (69328) */
-    56, /* 10ED1 (69329) */
-    56, /* 10ED2 (69330) */
-    56, /* 10ED3 (69331) */
-    56, /* 10ED4 (69332) */
-    56, /* 10ED5 (69333) */
-    56, /* 10ED6 (69334) */
-    56, /* 10ED7 (69335) */
-    56, /* 10ED8 (69336) */
+    1, /* 10ED0 (69328) */
+    1, /* 10ED1 (69329) */
+    1, /* 10ED2 (69330) */
+    1, /* 10ED3 (69331) */
+    1, /* 10ED4 (69332) */
+    1, /* 10ED5 (69333) */
+    1, /* 10ED6 (69334) */
+    1, /* 10ED7 (69335) */
+    1, /* 10ED8 (69336) */
     56, /* 10ED9 (69337) */
     56, /* 10EDA (69338) */
     56, /* 10EDB (69339) */
@@ -62998,8 +62998,8 @@ static const uint16_t lxb_unicode_table_map_63743_83527[19784] =
     56, /* 10EF7 (69367) */
     56, /* 10EF8 (69368) */
     56, /* 10EF9 (69369) */
-    56, /* 10EFA (69370) */
-    56, /* 10EFB (69371) */
+    433, /* 10EFA (69370) */
+    433, /* 10EFB (69371) */
     1, /* 10EFC (69372) */
     433, /* 10EFD (69373) */
     433, /* 10EFE (69374) */
@@ -63413,10 +63413,10 @@ static const uint16_t lxb_unicode_table_map_63743_83527[19784] =
     1, /* 11096 (69782) */
     1, /* 11097 (69783) */
     1, /* 11098 (69784) */
-    5088, /* 11099 (69785) */
-    5089, /* 1109A (69786) */
-    5090, /* 1109B (69787) */
-    5091, /* 1109C (69788) */
+    5092, /* 11099 (69785) */
+    5093, /* 1109A (69786) */
+    5094, /* 1109B (69787) */
+    5095, /* 1109C (69788) */
     1, /* 1109D (69789) */
     1, /* 1109E (69790) */
     1, /* 1109F (69791) */
@@ -63425,13 +63425,13 @@ static const uint16_t lxb_unicode_table_map_63743_83527[19784] =
     1, /* 110A2 (69794) */
     1, /* 110A3 (69795) */
     1, /* 110A4 (69796) */
-    5092, /* 110A5 (69797) */
+    5096, /* 110A5 (69797) */
     1, /* 110A6 (69798) */
     1, /* 110A7 (69799) */
     1, /* 110A8 (69800) */
     1, /* 110A9 (69801) */
     1, /* 110AA (69802) */
-    5093, /* 110AB (69803) */
+    5097, /* 110AB (69803) */
     1, /* 110AC (69804) */
     1, /* 110AD (69805) */
     1, /* 110AE (69806) */
@@ -63562,11 +63562,11 @@ static const uint16_t lxb_unicode_table_map_63743_83527[19784] =
     1, /* 1112B (69931) */
     1, /* 1112C (69932) */
     1, /* 1112D (69933) */
-    5094, /* 1112E (69934) */
-    5095, /* 1112F (69935) */
+    5098, /* 1112E (69934) */
+    5099, /* 1112F (69935) */
     1, /* 11130 (69936) */
-    5096, /* 11131 (69937) */
-    5097, /* 11132 (69938) */
+    5100, /* 11131 (69937) */
+    5101, /* 11132 (69938) */
     852, /* 11133 (69939) */
     852, /* 11134 (69940) */
     56, /* 11135 (69941) */
@@ -64099,12 +64099,12 @@ static const uint16_t lxb_unicode_table_map_63743_83527[19784] =
     1, /* 11344 (70468) */
     56, /* 11345 (70469) */
     56, /* 11346 (70470) */
-    5098, /* 11347 (70471) */
+    5102, /* 11347 (70471) */
     1, /* 11348 (70472) */
     56, /* 11349 (70473) */
     56, /* 1134A (70474) */
-    5099, /* 1134B (70475) */
-    5100, /* 1134C (70476) */
+    5103, /* 1134B (70475) */
+    5104, /* 1134C (70476) */
     852, /* 1134D (70477) */
     56, /* 1134E (70478) */
     56, /* 1134F (70479) */
@@ -64158,22 +64158,22 @@ static const uint16_t lxb_unicode_table_map_63743_83527[19784] =
     56, /* 1137F (70527) */
     1, /* 11380 (70528) */
     1, /* 11381 (70529) */
-    5101, /* 11382 (70530) */
-    5102, /* 11383 (70531) */
-    5103, /* 11384 (70532) */
-    5104, /* 11385 (70533) */
+    5105, /* 11382 (70530) */
+    5106, /* 11383 (70531) */
+    5107, /* 11384 (70532) */
+    5108, /* 11385 (70533) */
     1, /* 11386 (70534) */
     1, /* 11387 (70535) */
     1, /* 11388 (70536) */
     1, /* 11389 (70537) */
     56, /* 1138A (70538) */
-    5105, /* 1138B (70539) */
+    5109, /* 1138B (70539) */
     56, /* 1138C (70540) */
     56, /* 1138D (70541) */
-    5106, /* 1138E (70542) */
+    5110, /* 1138E (70542) */
     56, /* 1138F (70543) */
-    5107, /* 11390 (70544) */
-    5108, /* 11391 (70545) */
+    5111, /* 11390 (70544) */
+    5112, /* 11391 (70545) */
     1, /* 11392 (70546) */
     1, /* 11393 (70547) */
     1, /* 11394 (70548) */
@@ -64222,13 +64222,13 @@ static const uint16_t lxb_unicode_table_map_63743_83527[19784] =
     1, /* 113BF (70591) */
     1, /* 113C0 (70592) */
     56, /* 113C1 (70593) */
-    5109, /* 113C2 (70594) */
+    5113, /* 113C2 (70594) */
     56, /* 113C3 (70595) */
     56, /* 113C4 (70596) */
-    5110, /* 113C5 (70597) */
+    5114, /* 113C5 (70597) */
     56, /* 113C6 (70598) */
-    5111, /* 113C7 (70599) */
-    5112, /* 113C8 (70600) */
+    5115, /* 113C7 (70599) */
+    5116, /* 113C8 (70600) */
     865, /* 113C9 (70601) */
     1, /* 113CA (70602) */
     56, /* 113CB (70603) */
@@ -64469,12 +64469,12 @@ static const uint16_t lxb_unicode_table_map_63743_83527[19784] =
     1, /* 114B6 (70838) */
     1, /* 114B7 (70839) */
     1, /* 114B8 (70840) */
-    5113, /* 114B9 (70841) */
+    5117, /* 114B9 (70841) */
     865, /* 114BA (70842) */
-    5114, /* 114BB (70843) */
-    5115, /* 114BC (70844) */
+    5118, /* 114BB (70843) */
+    5119, /* 114BC (70844) */
     865, /* 114BD (70845) */
-    5116, /* 114BE (70846) */
+    5120, /* 114BE (70846) */
     1, /* 114BF (70847) */
     1, /* 114C0 (70848) */
     1, /* 114C1 (70849) */
@@ -64724,10 +64724,10 @@ static const uint16_t lxb_unicode_table_map_63743_83527[19784] =
     1, /* 115B5 (71093) */
     56, /* 115B6 (71094) */
     56, /* 115B7 (71095) */
-    5117, /* 115B8 (71096) */
-    5118, /* 115B9 (71097) */
-    5119, /* 115BA (71098) */
-    5120, /* 115BB (71099) */
+    5121, /* 115B8 (71096) */
+    5122, /* 115B9 (71097) */
+    5123, /* 115BA (71098) */
+    5124, /* 115BB (71099) */
     1, /* 115BC (71100) */
     1, /* 115BD (71101) */
     1, /* 115BE (71102) */
@@ -65468,38 +65468,38 @@ static const uint16_t lxb_unicode_table_map_63743_83527[19784] =
     56, /* 1189D (71837) */
     56, /* 1189E (71838) */
     56, /* 1189F (71839) */
-    5121, /* 118A0 (71840) */
-    5122, /* 118A1 (71841) */
-    5123, /* 118A2 (71842) */
-    5124, /* 118A3 (71843) */
-    5125, /* 118A4 (71844) */
-    5126, /* 118A5 (71845) */
-    5127, /* 118A6 (71846) */
-    5128, /* 118A7 (71847) */
-    5129, /* 118A8 (71848) */
-    5130, /* 118A9 (71849) */
-    5131, /* 118AA (71850) */
-    5132, /* 118AB (71851) */
-    5133, /* 118AC (71852) */
-    5134, /* 118AD (71853) */
-    5135, /* 118AE (71854) */
-    5136, /* 118AF (71855) */
-    5137, /* 118B0 (71856) */
-    5138, /* 118B1 (71857) */
-    5139, /* 118B2 (71858) */
-    5140, /* 118B3 (71859) */
-    5141, /* 118B4 (71860) */
-    5142, /* 118B5 (71861) */
-    5143, /* 118B6 (71862) */
-    5144, /* 118B7 (71863) */
-    5145, /* 118B8 (71864) */
-    5146, /* 118B9 (71865) */
-    5147, /* 118BA (71866) */
-    5148, /* 118BB (71867) */
-    5149, /* 118BC (71868) */
-    5150, /* 118BD (71869) */
-    5151, /* 118BE (71870) */
-    5152, /* 118BF (71871) */
+    5125, /* 118A0 (71840) */
+    5126, /* 118A1 (71841) */
+    5127, /* 118A2 (71842) */
+    5128, /* 118A3 (71843) */
+    5129, /* 118A4 (71844) */
+    5130, /* 118A5 (71845) */
+    5131, /* 118A6 (71846) */
+    5132, /* 118A7 (71847) */
+    5133, /* 118A8 (71848) */
+    5134, /* 118A9 (71849) */
+    5135, /* 118AA (71850) */
+    5136, /* 118AB (71851) */
+    5137, /* 118AC (71852) */
+    5138, /* 118AD (71853) */
+    5139, /* 118AE (71854) */
+    5140, /* 118AF (71855) */
+    5141, /* 118B0 (71856) */
+    5142, /* 118B1 (71857) */
+    5143, /* 118B2 (71858) */
+    5144, /* 118B3 (71859) */
+    5145, /* 118B4 (71860) */
+    5146, /* 118B5 (71861) */
+    5147, /* 118B6 (71862) */
+    5148, /* 118B7 (71863) */
+    5149, /* 118B8 (71864) */
+    5150, /* 118B9 (71865) */
+    5151, /* 118BA (71866) */
+    5152, /* 118BB (71867) */
+    5153, /* 118BC (71868) */
+    5154, /* 118BD (71869) */
+    5155, /* 118BE (71870) */
+    5156, /* 118BF (71871) */
     1, /* 118C0 (71872) */
     1, /* 118C1 (71873) */
     1, /* 118C2 (71874) */
@@ -65617,10 +65617,10 @@ static const uint16_t lxb_unicode_table_map_63743_83527[19784] =
     1, /* 11932 (71986) */
     1, /* 11933 (71987) */
     1, /* 11934 (71988) */
-    5153, /* 11935 (71989) */
+    5157, /* 11935 (71989) */
     56, /* 11936 (71990) */
     1, /* 11937 (71991) */
-    5154, /* 11938 (71992) */
+    5158, /* 11938 (71992) */
     56, /* 11939 (71993) */
     56, /* 1193A (71994) */
     1, /* 1193B (71995) */
@@ -66172,14 +66172,14 @@ static const uint16_t lxb_unicode_table_map_63743_83527[19784] =
     56, /* 11B5D (72541) */
     56, /* 11B5E (72542) */
     56, /* 11B5F (72543) */
-    56, /* 11B60 (72544) */
-    56, /* 11B61 (72545) */
-    56, /* 11B62 (72546) */
-    56, /* 11B63 (72547) */
-    56, /* 11B64 (72548) */
-    56, /* 11B65 (72549) */
-    56, /* 11B66 (72550) */
-    56, /* 11B67 (72551) */
+    1, /* 11B60 (72544) */
+    1, /* 11B61 (72545) */
+    1, /* 11B62 (72546) */
+    1, /* 11B63 (72547) */
+    1, /* 11B64 (72548) */
+    1, /* 11B65 (72549) */
+    1, /* 11B66 (72550) */
+    1, /* 11B67 (72551) */
     56, /* 11B68 (72552) */
     56, /* 11B69 (72553) */
     56, /* 11B6A (72554) */
@@ -66764,64 +66764,64 @@ static const uint16_t lxb_unicode_table_map_63743_83527[19784] =
     56, /* 11DAD (73133) */
     56, /* 11DAE (73134) */
     56, /* 11DAF (73135) */
-    56, /* 11DB0 (73136) */
-    56, /* 11DB1 (73137) */
-    56, /* 11DB2 (73138) */
-    56, /* 11DB3 (73139) */
-    56, /* 11DB4 (73140) */
-    56, /* 11DB5 (73141) */
-    56, /* 11DB6 (73142) */
-    56, /* 11DB7 (73143) */
-    56, /* 11DB8 (73144) */
-    56, /* 11DB9 (73145) */
-    56, /* 11DBA (73146) */
-    56, /* 11DBB (73147) */
-    56, /* 11DBC (73148) */
-    56, /* 11DBD (73149) */
-    56, /* 11DBE (73150) */
-    56, /* 11DBF (73151) */
-    56, /* 11DC0 (73152) */
-    56, /* 11DC1 (73153) */
-    56, /* 11DC2 (73154) */
-    56, /* 11DC3 (73155) */
-    56, /* 11DC4 (73156) */
-    56, /* 11DC5 (73157) */
-    56, /* 11DC6 (73158) */
-    56, /* 11DC7 (73159) */
-    56, /* 11DC8 (73160) */
-    56, /* 11DC9 (73161) */
-    56, /* 11DCA (73162) */
-    56, /* 11DCB (73163) */
-    56, /* 11DCC (73164) */
-    56, /* 11DCD (73165) */
-    56, /* 11DCE (73166) */
-    56, /* 11DCF (73167) */
-    56, /* 11DD0 (73168) */
-    56, /* 11DD1 (73169) */
-    56, /* 11DD2 (73170) */
-    56, /* 11DD3 (73171) */
-    56, /* 11DD4 (73172) */
-    56, /* 11DD5 (73173) */
-    56, /* 11DD6 (73174) */
-    56, /* 11DD7 (73175) */
-    56, /* 11DD8 (73176) */
-    56, /* 11DD9 (73177) */
-    56, /* 11DDA (73178) */
-    56, /* 11DDB (73179) */
+    1, /* 11DB0 (73136) */
+    1, /* 11DB1 (73137) */
+    1, /* 11DB2 (73138) */
+    1, /* 11DB3 (73139) */
+    1, /* 11DB4 (73140) */
+    1, /* 11DB5 (73141) */
+    1, /* 11DB6 (73142) */
+    1, /* 11DB7 (73143) */
+    1, /* 11DB8 (73144) */
+    1, /* 11DB9 (73145) */
+    1, /* 11DBA (73146) */
+    1, /* 11DBB (73147) */
+    1, /* 11DBC (73148) */
+    1, /* 11DBD (73149) */
+    1, /* 11DBE (73150) */
+    1, /* 11DBF (73151) */
+    1, /* 11DC0 (73152) */
+    1, /* 11DC1 (73153) */
+    1, /* 11DC2 (73154) */
+    1, /* 11DC3 (73155) */
+    1, /* 11DC4 (73156) */
+    1, /* 11DC5 (73157) */
+    1, /* 11DC6 (73158) */
+    1, /* 11DC7 (73159) */
+    1, /* 11DC8 (73160) */
+    1, /* 11DC9 (73161) */
+    1, /* 11DCA (73162) */
+    1, /* 11DCB (73163) */
+    1, /* 11DCC (73164) */
+    1, /* 11DCD (73165) */
+    1, /* 11DCE (73166) */
+    1, /* 11DCF (73167) */
+    1, /* 11DD0 (73168) */
+    1, /* 11DD1 (73169) */
+    1, /* 11DD2 (73170) */
+    1, /* 11DD3 (73171) */
+    1, /* 11DD4 (73172) */
+    1, /* 11DD5 (73173) */
+    1, /* 11DD6 (73174) */
+    1, /* 11DD7 (73175) */
+    1, /* 11DD8 (73176) */
+    1, /* 11DD9 (73177) */
+    1, /* 11DDA (73178) */
+    1, /* 11DDB (73179) */
     56, /* 11DDC (73180) */
     56, /* 11DDD (73181) */
     56, /* 11DDE (73182) */
     56, /* 11DDF (73183) */
-    56, /* 11DE0 (73184) */
-    56, /* 11DE1 (73185) */
-    56, /* 11DE2 (73186) */
-    56, /* 11DE3 (73187) */
-    56, /* 11DE4 (73188) */
-    56, /* 11DE5 (73189) */
-    56, /* 11DE6 (73190) */
-    56, /* 11DE7 (73191) */
-    56, /* 11DE8 (73192) */
-    56, /* 11DE9 (73193) */
+    1, /* 11DE0 (73184) */
+    1, /* 11DE1 (73185) */
+    1, /* 11DE2 (73186) */
+    1, /* 11DE3 (73187) */
+    1, /* 11DE4 (73188) */
+    1, /* 11DE5 (73189) */
+    1, /* 11DE6 (73190) */
+    1, /* 11DE7 (73191) */
+    1, /* 11DE8 (73192) */
+    1, /* 11DE9 (73193) */
     56, /* 11DEA (73194) */
     56, /* 11DEB (73195) */
     56, /* 11DEC (73196) */
@@ -77157,8 +77157,8 @@ static const uint16_t lxb_unicode_table_map_63743_83527[19784] =
     1, /* 14646 (83526) */
 };
 
-/* From: 16100; To: 18D08 */
-static const uint16_t lxb_unicode_table_map_90368_101641[11273] =
+/* From: 16100; To: 18DF2 */
+static const uint16_t lxb_unicode_table_map_90368_101875[11507] =
 {
     1, /* 16100 (90368) */
     1, /* 16101 (90369) */
@@ -77190,18 +77190,18 @@ static const uint16_t lxb_unicode_table_map_90368_101641[11273] =
     1, /* 1611B (90395) */
     1, /* 1611C (90396) */
     1, /* 1611D (90397) */
-    5155, /* 1611E (90398) */
+    5159, /* 1611E (90398) */
     865, /* 1611F (90399) */
     865, /* 16120 (90400) */
-    5156, /* 16121 (90401) */
-    5157, /* 16122 (90402) */
-    5158, /* 16123 (90403) */
-    5159, /* 16124 (90404) */
-    5160, /* 16125 (90405) */
-    5161, /* 16126 (90406) */
-    5162, /* 16127 (90407) */
-    5163, /* 16128 (90408) */
-    5164, /* 16129 (90409) */
+    5160, /* 16121 (90401) */
+    5161, /* 16122 (90402) */
+    5162, /* 16123 (90403) */
+    5163, /* 16124 (90404) */
+    5164, /* 16125 (90405) */
+    5165, /* 16126 (90406) */
+    5166, /* 16127 (90407) */
+    5167, /* 16128 (90408) */
+    5168, /* 16129 (90409) */
     1, /* 1612A (90410) */
     1, /* 1612B (90411) */
     1, /* 1612C (90412) */
@@ -80331,14 +80331,14 @@ static const uint16_t lxb_unicode_table_map_90368_101641[11273] =
     1, /* 16D60 (93536) */
     1, /* 16D61 (93537) */
     1, /* 16D62 (93538) */
-    5165, /* 16D63 (93539) */
+    5169, /* 16D63 (93539) */
     1, /* 16D64 (93540) */
     1, /* 16D65 (93541) */
     1, /* 16D66 (93542) */
-    5166, /* 16D67 (93543) */
-    5167, /* 16D68 (93544) */
-    5168, /* 16D69 (93545) */
-    5169, /* 16D6A (93546) */
+    5170, /* 16D67 (93543) */
+    5171, /* 16D68 (93544) */
+    5172, /* 16D69 (93545) */
+    5173, /* 16D6A (93546) */
     1, /* 16D6B (93547) */
     1, /* 16D6C (93548) */
     1, /* 16D6D (93549) */
@@ -80552,38 +80552,38 @@ static const uint16_t lxb_unicode_table_map_90368_101641[11273] =
     56, /* 16E3D (93757) */
     56, /* 16E3E (93758) */
     56, /* 16E3F (93759) */
-    5170, /* 16E40 (93760) */
-    5171, /* 16E41 (93761) */
-    5172, /* 16E42 (93762) */
-    5173, /* 16E43 (93763) */
-    5174, /* 16E44 (93764) */
-    5175, /* 16E45 (93765) */
-    5176, /* 16E46 (93766) */
-    5177, /* 16E47 (93767) */
-    5178, /* 16E48 (93768) */
-    5179, /* 16E49 (93769) */
-    5180, /* 16E4A (93770) */
-    5181, /* 16E4B (93771) */
-    5182, /* 16E4C (93772) */
-    5183, /* 16E4D (93773) */
-    5184, /* 16E4E (93774) */
-    5185, /* 16E4F (93775) */
-    5186, /* 16E50 (93776) */
-    5187, /* 16E51 (93777) */
-    5188, /* 16E52 (93778) */
-    5189, /* 16E53 (93779) */
-    5190, /* 16E54 (93780) */
-    5191, /* 16E55 (93781) */
-    5192, /* 16E56 (93782) */
-    5193, /* 16E57 (93783) */
-    5194, /* 16E58 (93784) */
-    5195, /* 16E59 (93785) */
-    5196, /* 16E5A (93786) */
-    5197, /* 16E5B (93787) */
-    5198, /* 16E5C (93788) */
-    5199, /* 16E5D (93789) */
-    5200, /* 16E5E (93790) */
-    5201, /* 16E5F (93791) */
+    5174, /* 16E40 (93760) */
+    5175, /* 16E41 (93761) */
+    5176, /* 16E42 (93762) */
+    5177, /* 16E43 (93763) */
+    5178, /* 16E44 (93764) */
+    5179, /* 16E45 (93765) */
+    5180, /* 16E46 (93766) */
+    5181, /* 16E47 (93767) */
+    5182, /* 16E48 (93768) */
+    5183, /* 16E49 (93769) */
+    5184, /* 16E4A (93770) */
+    5185, /* 16E4B (93771) */
+    5186, /* 16E4C (93772) */
+    5187, /* 16E4D (93773) */
+    5188, /* 16E4E (93774) */
+    5189, /* 16E4F (93775) */
+    5190, /* 16E50 (93776) */
+    5191, /* 16E51 (93777) */
+    5192, /* 16E52 (93778) */
+    5193, /* 16E53 (93779) */
+    5194, /* 16E54 (93780) */
+    5195, /* 16E55 (93781) */
+    5196, /* 16E56 (93782) */
+    5197, /* 16E57 (93783) */
+    5198, /* 16E58 (93784) */
+    5199, /* 16E59 (93785) */
+    5200, /* 16E5A (93786) */
+    5201, /* 16E5B (93787) */
+    5202, /* 16E5C (93788) */
+    5203, /* 16E5D (93789) */
+    5204, /* 16E5E (93790) */
+    5205, /* 16E5F (93791) */
     1, /* 16E60 (93792) */
     1, /* 16E61 (93793) */
     1, /* 16E62 (93794) */
@@ -80648,58 +80648,58 @@ static const uint16_t lxb_unicode_table_map_90368_101641[11273] =
     56, /* 16E9D (93853) */
     56, /* 16E9E (93854) */
     56, /* 16E9F (93855) */
-    56, /* 16EA0 (93856) */
-    56, /* 16EA1 (93857) */
-    56, /* 16EA2 (93858) */
-    56, /* 16EA3 (93859) */
-    56, /* 16EA4 (93860) */
-    56, /* 16EA5 (93861) */
-    56, /* 16EA6 (93862) */
-    56, /* 16EA7 (93863) */
-    56, /* 16EA8 (93864) */
-    56, /* 16EA9 (93865) */
-    56, /* 16EAA (93866) */
-    56, /* 16EAB (93867) */
-    56, /* 16EAC (93868) */
-    56, /* 16EAD (93869) */
-    56, /* 16EAE (93870) */
-    56, /* 16EAF (93871) */
-    56, /* 16EB0 (93872) */
-    56, /* 16EB1 (93873) */
-    56, /* 16EB2 (93874) */
-    56, /* 16EB3 (93875) */
-    56, /* 16EB4 (93876) */
-    56, /* 16EB5 (93877) */
-    56, /* 16EB6 (93878) */
-    56, /* 16EB7 (93879) */
-    56, /* 16EB8 (93880) */
+    5206, /* 16EA0 (93856) */
+    5207, /* 16EA1 (93857) */
+    5208, /* 16EA2 (93858) */
+    5209, /* 16EA3 (93859) */
+    5210, /* 16EA4 (93860) */
+    5211, /* 16EA5 (93861) */
+    5212, /* 16EA6 (93862) */
+    5213, /* 16EA7 (93863) */
+    5214, /* 16EA8 (93864) */
+    5215, /* 16EA9 (93865) */
+    5216, /* 16EAA (93866) */
+    5217, /* 16EAB (93867) */
+    5218, /* 16EAC (93868) */
+    5219, /* 16EAD (93869) */
+    5220, /* 16EAE (93870) */
+    5221, /* 16EAF (93871) */
+    5222, /* 16EB0 (93872) */
+    5223, /* 16EB1 (93873) */
+    5224, /* 16EB2 (93874) */
+    5225, /* 16EB3 (93875) */
+    5226, /* 16EB4 (93876) */
+    5227, /* 16EB5 (93877) */
+    5228, /* 16EB6 (93878) */
+    5229, /* 16EB7 (93879) */
+    5230, /* 16EB8 (93880) */
     56, /* 16EB9 (93881) */
     56, /* 16EBA (93882) */
-    56, /* 16EBB (93883) */
-    56, /* 16EBC (93884) */
-    56, /* 16EBD (93885) */
-    56, /* 16EBE (93886) */
-    56, /* 16EBF (93887) */
-    56, /* 16EC0 (93888) */
-    56, /* 16EC1 (93889) */
-    56, /* 16EC2 (93890) */
-    56, /* 16EC3 (93891) */
-    56, /* 16EC4 (93892) */
-    56, /* 16EC5 (93893) */
-    56, /* 16EC6 (93894) */
-    56, /* 16EC7 (93895) */
-    56, /* 16EC8 (93896) */
-    56, /* 16EC9 (93897) */
-    56, /* 16ECA (93898) */
-    56, /* 16ECB (93899) */
-    56, /* 16ECC (93900) */
-    56, /* 16ECD (93901) */
-    56, /* 16ECE (93902) */
-    56, /* 16ECF (93903) */
-    56, /* 16ED0 (93904) */
-    56, /* 16ED1 (93905) */
-    56, /* 16ED2 (93906) */
-    56, /* 16ED3 (93907) */
+    1, /* 16EBB (93883) */
+    1, /* 16EBC (93884) */
+    1, /* 16EBD (93885) */
+    1, /* 16EBE (93886) */
+    1, /* 16EBF (93887) */
+    1, /* 16EC0 (93888) */
+    1, /* 16EC1 (93889) */
+    1, /* 16EC2 (93890) */
+    1, /* 16EC3 (93891) */
+    1, /* 16EC4 (93892) */
+    1, /* 16EC5 (93893) */
+    1, /* 16EC6 (93894) */
+    1, /* 16EC7 (93895) */
+    1, /* 16EC8 (93896) */
+    1, /* 16EC9 (93897) */
+    1, /* 16ECA (93898) */
+    1, /* 16ECB (93899) */
+    1, /* 16ECC (93900) */
+    1, /* 16ECD (93901) */
+    1, /* 16ECE (93902) */
+    1, /* 16ECF (93903) */
+    1, /* 16ED0 (93904) */
+    1, /* 16ED1 (93905) */
+    1, /* 16ED2 (93906) */
+    1, /* 16ED3 (93907) */
     56, /* 16ED4 (93908) */
     56, /* 16ED5 (93909) */
     56, /* 16ED6 (93910) */
@@ -80984,13 +80984,13 @@ static const uint16_t lxb_unicode_table_map_90368_101641[11273] =
     56, /* 16FED (94189) */
     56, /* 16FEE (94190) */
     56, /* 16FEF (94191) */
-    5202, /* 16FF0 (94192) */
-    5202, /* 16FF1 (94193) */
-    56, /* 16FF2 (94194) */
-    56, /* 16FF3 (94195) */
-    56, /* 16FF4 (94196) */
-    56, /* 16FF5 (94197) */
-    56, /* 16FF6 (94198) */
+    5231, /* 16FF0 (94192) */
+    5231, /* 16FF1 (94193) */
+    1, /* 16FF2 (94194) */
+    1, /* 16FF3 (94195) */
+    1, /* 16FF4 (94196) */
+    1, /* 16FF5 (94197) */
+    1, /* 16FF6 (94198) */
     56, /* 16FF7 (94199) */
     56, /* 16FF8 (94200) */
     56, /* 16FF9 (94201) */
@@ -87136,14 +87136,14 @@ static const uint16_t lxb_unicode_table_map_90368_101641[11273] =
     1, /* 187F5 (100341) */
     1, /* 187F6 (100342) */
     1, /* 187F7 (100343) */
-    56, /* 187F8 (100344) */
-    56, /* 187F9 (100345) */
-    56, /* 187FA (100346) */
-    56, /* 187FB (100347) */
-    56, /* 187FC (100348) */
-    56, /* 187FD (100349) */
-    56, /* 187FE (100350) */
-    56, /* 187FF (100351) */
+    1, /* 187F8 (100344) */
+    1, /* 187F9 (100345) */
+    1, /* 187FA (100346) */
+    1, /* 187FB (100347) */
+    1, /* 187FC (100348) */
+    1, /* 187FD (100349) */
+    1, /* 187FE (100350) */
+    1, /* 187FF (100351) */
     1, /* 18800 (100352) */
     1, /* 18801 (100353) */
     1, /* 18802 (100354) */
@@ -88433,10 +88433,244 @@ static const uint16_t lxb_unicode_table_map_90368_101641[11273] =
     1, /* 18D06 (101638) */
     1, /* 18D07 (101639) */
     1, /* 18D08 (101640) */
+    1, /* 18D09 (101641) */
+    1, /* 18D0A (101642) */
+    1, /* 18D0B (101643) */
+    1, /* 18D0C (101644) */
+    1, /* 18D0D (101645) */
+    1, /* 18D0E (101646) */
+    1, /* 18D0F (101647) */
+    1, /* 18D10 (101648) */
+    1, /* 18D11 (101649) */
+    1, /* 18D12 (101650) */
+    1, /* 18D13 (101651) */
+    1, /* 18D14 (101652) */
+    1, /* 18D15 (101653) */
+    1, /* 18D16 (101654) */
+    1, /* 18D17 (101655) */
+    1, /* 18D18 (101656) */
+    1, /* 18D19 (101657) */
+    1, /* 18D1A (101658) */
+    1, /* 18D1B (101659) */
+    1, /* 18D1C (101660) */
+    1, /* 18D1D (101661) */
+    1, /* 18D1E (101662) */
+    56, /* 18D1F (101663) */
+    56, /* 18D20 (101664) */
+    56, /* 18D21 (101665) */
+    56, /* 18D22 (101666) */
+    56, /* 18D23 (101667) */
+    56, /* 18D24 (101668) */
+    56, /* 18D25 (101669) */
+    56, /* 18D26 (101670) */
+    56, /* 18D27 (101671) */
+    56, /* 18D28 (101672) */
+    56, /* 18D29 (101673) */
+    56, /* 18D2A (101674) */
+    56, /* 18D2B (101675) */
+    56, /* 18D2C (101676) */
+    56, /* 18D2D (101677) */
+    56, /* 18D2E (101678) */
+    56, /* 18D2F (101679) */
+    56, /* 18D30 (101680) */
+    56, /* 18D31 (101681) */
+    56, /* 18D32 (101682) */
+    56, /* 18D33 (101683) */
+    56, /* 18D34 (101684) */
+    56, /* 18D35 (101685) */
+    56, /* 18D36 (101686) */
+    56, /* 18D37 (101687) */
+    56, /* 18D38 (101688) */
+    56, /* 18D39 (101689) */
+    56, /* 18D3A (101690) */
+    56, /* 18D3B (101691) */
+    56, /* 18D3C (101692) */
+    56, /* 18D3D (101693) */
+    56, /* 18D3E (101694) */
+    56, /* 18D3F (101695) */
+    56, /* 18D40 (101696) */
+    56, /* 18D41 (101697) */
+    56, /* 18D42 (101698) */
+    56, /* 18D43 (101699) */
+    56, /* 18D44 (101700) */
+    56, /* 18D45 (101701) */
+    56, /* 18D46 (101702) */
+    56, /* 18D47 (101703) */
+    56, /* 18D48 (101704) */
+    56, /* 18D49 (101705) */
+    56, /* 18D4A (101706) */
+    56, /* 18D4B (101707) */
+    56, /* 18D4C (101708) */
+    56, /* 18D4D (101709) */
+    56, /* 18D4E (101710) */
+    56, /* 18D4F (101711) */
+    56, /* 18D50 (101712) */
+    56, /* 18D51 (101713) */
+    56, /* 18D52 (101714) */
+    56, /* 18D53 (101715) */
+    56, /* 18D54 (101716) */
+    56, /* 18D55 (101717) */
+    56, /* 18D56 (101718) */
+    56, /* 18D57 (101719) */
+    56, /* 18D58 (101720) */
+    56, /* 18D59 (101721) */
+    56, /* 18D5A (101722) */
+    56, /* 18D5B (101723) */
+    56, /* 18D5C (101724) */
+    56, /* 18D5D (101725) */
+    56, /* 18D5E (101726) */
+    56, /* 18D5F (101727) */
+    56, /* 18D60 (101728) */
+    56, /* 18D61 (101729) */
+    56, /* 18D62 (101730) */
+    56, /* 18D63 (101731) */
+    56, /* 18D64 (101732) */
+    56, /* 18D65 (101733) */
+    56, /* 18D66 (101734) */
+    56, /* 18D67 (101735) */
+    56, /* 18D68 (101736) */
+    56, /* 18D69 (101737) */
+    56, /* 18D6A (101738) */
+    56, /* 18D6B (101739) */
+    56, /* 18D6C (101740) */
+    56, /* 18D6D (101741) */
+    56, /* 18D6E (101742) */
+    56, /* 18D6F (101743) */
+    56, /* 18D70 (101744) */
+    56, /* 18D71 (101745) */
+    56, /* 18D72 (101746) */
+    56, /* 18D73 (101747) */
+    56, /* 18D74 (101748) */
+    56, /* 18D75 (101749) */
+    56, /* 18D76 (101750) */
+    56, /* 18D77 (101751) */
+    56, /* 18D78 (101752) */
+    56, /* 18D79 (101753) */
+    56, /* 18D7A (101754) */
+    56, /* 18D7B (101755) */
+    56, /* 18D7C (101756) */
+    56, /* 18D7D (101757) */
+    56, /* 18D7E (101758) */
+    56, /* 18D7F (101759) */
+    1, /* 18D80 (101760) */
+    1, /* 18D81 (101761) */
+    1, /* 18D82 (101762) */
+    1, /* 18D83 (101763) */
+    1, /* 18D84 (101764) */
+    1, /* 18D85 (101765) */
+    1, /* 18D86 (101766) */
+    1, /* 18D87 (101767) */
+    1, /* 18D88 (101768) */
+    1, /* 18D89 (101769) */
+    1, /* 18D8A (101770) */
+    1, /* 18D8B (101771) */
+    1, /* 18D8C (101772) */
+    1, /* 18D8D (101773) */
+    1, /* 18D8E (101774) */
+    1, /* 18D8F (101775) */
+    1, /* 18D90 (101776) */
+    1, /* 18D91 (101777) */
+    1, /* 18D92 (101778) */
+    1, /* 18D93 (101779) */
+    1, /* 18D94 (101780) */
+    1, /* 18D95 (101781) */
+    1, /* 18D96 (101782) */
+    1, /* 18D97 (101783) */
+    1, /* 18D98 (101784) */
+    1, /* 18D99 (101785) */
+    1, /* 18D9A (101786) */
+    1, /* 18D9B (101787) */
+    1, /* 18D9C (101788) */
+    1, /* 18D9D (101789) */
+    1, /* 18D9E (101790) */
+    1, /* 18D9F (101791) */
+    1, /* 18DA0 (101792) */
+    1, /* 18DA1 (101793) */
+    1, /* 18DA2 (101794) */
+    1, /* 18DA3 (101795) */
+    1, /* 18DA4 (101796) */
+    1, /* 18DA5 (101797) */
+    1, /* 18DA6 (101798) */
+    1, /* 18DA7 (101799) */
+    1, /* 18DA8 (101800) */
+    1, /* 18DA9 (101801) */
+    1, /* 18DAA (101802) */
+    1, /* 18DAB (101803) */
+    1, /* 18DAC (101804) */
+    1, /* 18DAD (101805) */
+    1, /* 18DAE (101806) */
+    1, /* 18DAF (101807) */
+    1, /* 18DB0 (101808) */
+    1, /* 18DB1 (101809) */
+    1, /* 18DB2 (101810) */
+    1, /* 18DB3 (101811) */
+    1, /* 18DB4 (101812) */
+    1, /* 18DB5 (101813) */
+    1, /* 18DB6 (101814) */
+    1, /* 18DB7 (101815) */
+    1, /* 18DB8 (101816) */
+    1, /* 18DB9 (101817) */
+    1, /* 18DBA (101818) */
+    1, /* 18DBB (101819) */
+    1, /* 18DBC (101820) */
+    1, /* 18DBD (101821) */
+    1, /* 18DBE (101822) */
+    1, /* 18DBF (101823) */
+    1, /* 18DC0 (101824) */
+    1, /* 18DC1 (101825) */
+    1, /* 18DC2 (101826) */
+    1, /* 18DC3 (101827) */
+    1, /* 18DC4 (101828) */
+    1, /* 18DC5 (101829) */
+    1, /* 18DC6 (101830) */
+    1, /* 18DC7 (101831) */
+    1, /* 18DC8 (101832) */
+    1, /* 18DC9 (101833) */
+    1, /* 18DCA (101834) */
+    1, /* 18DCB (101835) */
+    1, /* 18DCC (101836) */
+    1, /* 18DCD (101837) */
+    1, /* 18DCE (101838) */
+    1, /* 18DCF (101839) */
+    1, /* 18DD0 (101840) */
+    1, /* 18DD1 (101841) */
+    1, /* 18DD2 (101842) */
+    1, /* 18DD3 (101843) */
+    1, /* 18DD4 (101844) */
+    1, /* 18DD5 (101845) */
+    1, /* 18DD6 (101846) */
+    1, /* 18DD7 (101847) */
+    1, /* 18DD8 (101848) */
+    1, /* 18DD9 (101849) */
+    1, /* 18DDA (101850) */
+    1, /* 18DDB (101851) */
+    1, /* 18DDC (101852) */
+    1, /* 18DDD (101853) */
+    1, /* 18DDE (101854) */
+    1, /* 18DDF (101855) */
+    1, /* 18DE0 (101856) */
+    1, /* 18DE1 (101857) */
+    1, /* 18DE2 (101858) */
+    1, /* 18DE3 (101859) */
+    1, /* 18DE4 (101860) */
+    1, /* 18DE5 (101861) */
+    1, /* 18DE6 (101862) */
+    1, /* 18DE7 (101863) */
+    1, /* 18DE8 (101864) */
+    1, /* 18DE9 (101865) */
+    1, /* 18DEA (101866) */
+    1, /* 18DEB (101867) */
+    1, /* 18DEC (101868) */
+    1, /* 18DED (101869) */
+    1, /* 18DEE (101870) */
+    1, /* 18DEF (101871) */
+    1, /* 18DF0 (101872) */
+    1, /* 18DF1 (101873) */
+    1, /* 18DF2 (101874) */
 };
 
-/* From: 1AFF0; To: 323AF */
-static const uint32_t lxb_unicode_table_map_110576_205744[95168] =
+/* From: 1AFF0; To: 33479 */
+static const uint32_t lxb_unicode_table_map_110576_210042[99466] =
 {
     1, /* 1AFF0 (110576) */
     1, /* 1AFF1 (110577) */
@@ -95836,45 +96070,45 @@ static const uint32_t lxb_unicode_table_map_110576_205744[95168] =
     1, /* 1CCD3 (117971) */
     1, /* 1CCD4 (117972) */
     1, /* 1CCD5 (117973) */
-    5203, /* 1CCD6 (117974) */
+    5232, /* 1CCD6 (117974) */
     1755, /* 1CCD7 (117975) */
     1730, /* 1CCD8 (117976) */
     1773, /* 1CCD9 (117977) */
     1757, /* 1CCDA (117978) */
     1758, /* 1CCDB (117979) */
-    5204, /* 1CCDC (117980) */
+    5233, /* 1CCDC (117980) */
     1737, /* 1CCDD (117981) */
     1740, /* 1CCDE (117982) */
-    5205, /* 1CCDF (117983) */
-    5206, /* 1CCE0 (117984) */
+    5234, /* 1CCDF (117983) */
+    5235, /* 1CCE0 (117984) */
     1741, /* 1CCE1 (117985) */
     1760, /* 1CCE2 (117986) */
     1743, /* 1CCE3 (117987) */
-    5207, /* 1CCE4 (117988) */
+    5236, /* 1CCE4 (117988) */
     1745, /* 1CCE5 (117989) */
     1746, /* 1CCE6 (117990) */
     1747, /* 1CCE7 (117991) */
-    5208, /* 1CCE8 (117992) */
-    5209, /* 1CCE9 (117993) */
-    5210, /* 1CCEA (117994) */
-    5211, /* 1CCEB (117995) */
-    5212, /* 1CCEC (117996) */
-    5213, /* 1CCED (117997) */
-    5214, /* 1CCEE (117998) */
+    5237, /* 1CCE8 (117992) */
+    5238, /* 1CCE9 (117993) */
+    5239, /* 1CCEA (117994) */
+    5240, /* 1CCEB (117995) */
+    5241, /* 1CCEC (117996) */
+    5242, /* 1CCED (117997) */
+    5243, /* 1CCEE (117998) */
     1751, /* 1CCEF (117999) */
-    5215, /* 1CCF0 (118000) */
-    5216, /* 1CCF1 (118001) */
-    5217, /* 1CCF2 (118002) */
-    5218, /* 1CCF3 (118003) */
-    5219, /* 1CCF4 (118004) */
-    5220, /* 1CCF5 (118005) */
-    5221, /* 1CCF6 (118006) */
-    5222, /* 1CCF7 (118007) */
-    5223, /* 1CCF8 (118008) */
-    5224, /* 1CCF9 (118009) */
-    56, /* 1CCFA (118010) */
-    56, /* 1CCFB (118011) */
-    56, /* 1CCFC (118012) */
+    5244, /* 1CCF0 (118000) */
+    5245, /* 1CCF1 (118001) */
+    5246, /* 1CCF2 (118002) */
+    5247, /* 1CCF3 (118003) */
+    5248, /* 1CCF4 (118004) */
+    5249, /* 1CCF5 (118005) */
+    5250, /* 1CCF6 (118006) */
+    5251, /* 1CCF7 (118007) */
+    5252, /* 1CCF8 (118008) */
+    5253, /* 1CCF9 (118009) */
+    1, /* 1CCFA (118010) */
+    1, /* 1CCFB (118011) */
+    1, /* 1CCFC (118012) */
     56, /* 1CCFD (118013) */
     56, /* 1CCFE (118014) */
     56, /* 1CCFF (118015) */
@@ -96320,29 +96554,29 @@ static const uint32_t lxb_unicode_table_map_110576_205744[95168] =
     56, /* 1CEB7 (118455) */
     56, /* 1CEB8 (118456) */
     56, /* 1CEB9 (118457) */
-    56, /* 1CEBA (118458) */
-    56, /* 1CEBB (118459) */
-    56, /* 1CEBC (118460) */
-    56, /* 1CEBD (118461) */
-    56, /* 1CEBE (118462) */
-    56, /* 1CEBF (118463) */
-    56, /* 1CEC0 (118464) */
-    56, /* 1CEC1 (118465) */
-    56, /* 1CEC2 (118466) */
-    56, /* 1CEC3 (118467) */
-    56, /* 1CEC4 (118468) */
-    56, /* 1CEC5 (118469) */
-    56, /* 1CEC6 (118470) */
-    56, /* 1CEC7 (118471) */
-    56, /* 1CEC8 (118472) */
-    56, /* 1CEC9 (118473) */
-    56, /* 1CECA (118474) */
-    56, /* 1CECB (118475) */
-    56, /* 1CECC (118476) */
-    56, /* 1CECD (118477) */
-    56, /* 1CECE (118478) */
-    56, /* 1CECF (118479) */
-    56, /* 1CED0 (118480) */
+    1, /* 1CEBA (118458) */
+    1, /* 1CEBB (118459) */
+    1, /* 1CEBC (118460) */
+    1, /* 1CEBD (118461) */
+    1, /* 1CEBE (118462) */
+    1, /* 1CEBF (118463) */
+    1, /* 1CEC0 (118464) */
+    1, /* 1CEC1 (118465) */
+    1, /* 1CEC2 (118466) */
+    1, /* 1CEC3 (118467) */
+    1, /* 1CEC4 (118468) */
+    1, /* 1CEC5 (118469) */
+    1, /* 1CEC6 (118470) */
+    1, /* 1CEC7 (118471) */
+    1, /* 1CEC8 (118472) */
+    1, /* 1CEC9 (118473) */
+    1, /* 1CECA (118474) */
+    1, /* 1CECB (118475) */
+    1, /* 1CECC (118476) */
+    1, /* 1CECD (118477) */
+    1, /* 1CECE (118478) */
+    1, /* 1CECF (118479) */
+    1, /* 1CED0 (118480) */
     56, /* 1CED1 (118481) */
     56, /* 1CED2 (118482) */
     56, /* 1CED3 (118483) */
@@ -96358,23 +96592,23 @@ static const uint32_t lxb_unicode_table_map_110576_205744[95168] =
     56, /* 1CEDD (118493) */
     56, /* 1CEDE (118494) */
     56, /* 1CEDF (118495) */
-    56, /* 1CEE0 (118496) */
-    56, /* 1CEE1 (118497) */
-    56, /* 1CEE2 (118498) */
-    56, /* 1CEE3 (118499) */
-    56, /* 1CEE4 (118500) */
-    56, /* 1CEE5 (118501) */
-    56, /* 1CEE6 (118502) */
-    56, /* 1CEE7 (118503) */
-    56, /* 1CEE8 (118504) */
-    56, /* 1CEE9 (118505) */
-    56, /* 1CEEA (118506) */
-    56, /* 1CEEB (118507) */
-    56, /* 1CEEC (118508) */
-    56, /* 1CEED (118509) */
-    56, /* 1CEEE (118510) */
-    56, /* 1CEEF (118511) */
-    56, /* 1CEF0 (118512) */
+    1, /* 1CEE0 (118496) */
+    1, /* 1CEE1 (118497) */
+    1, /* 1CEE2 (118498) */
+    1, /* 1CEE3 (118499) */
+    1, /* 1CEE4 (118500) */
+    1, /* 1CEE5 (118501) */
+    1, /* 1CEE6 (118502) */
+    1, /* 1CEE7 (118503) */
+    1, /* 1CEE8 (118504) */
+    1, /* 1CEE9 (118505) */
+    1, /* 1CEEA (118506) */
+    1, /* 1CEEB (118507) */
+    1, /* 1CEEC (118508) */
+    1, /* 1CEED (118509) */
+    1, /* 1CEEE (118510) */
+    1, /* 1CEEF (118511) */
+    1, /* 1CEF0 (118512) */
     56, /* 1CEF1 (118513) */
     56, /* 1CEF2 (118514) */
     56, /* 1CEF3 (118515) */
@@ -96989,20 +97223,20 @@ static const uint32_t lxb_unicode_table_map_110576_205744[95168] =
     1, /* 1D154 (119124) */
     1, /* 1D155 (119125) */
     1, /* 1D156 (119126) */
-    5225, /* 1D157 (119127) */
-    5226, /* 1D158 (119128) */
+    5254, /* 1D157 (119127) */
+    5255, /* 1D158 (119128) */
     1, /* 1D159 (119129) */
     1, /* 1D15A (119130) */
     1, /* 1D15B (119131) */
     1, /* 1D15C (119132) */
     1, /* 1D15D (119133) */
-    5227, /* 1D15E (119134) */
-    5228, /* 1D15F (119135) */
-    5229, /* 1D160 (119136) */
-    5230, /* 1D161 (119137) */
-    5231, /* 1D162 (119138) */
-    5232, /* 1D163 (119139) */
-    5233, /* 1D164 (119140) */
+    5256, /* 1D15E (119134) */
+    5257, /* 1D15F (119135) */
+    5258, /* 1D160 (119136) */
+    5259, /* 1D161 (119137) */
+    5260, /* 1D162 (119138) */
+    5261, /* 1D163 (119139) */
+    5262, /* 1D164 (119140) */
     930, /* 1D165 (119141) */
     930, /* 1D166 (119142) */
     438, /* 1D167 (119143) */
@@ -97011,7 +97245,7 @@ static const uint32_t lxb_unicode_table_map_110576_205744[95168] =
     1, /* 1D16A (119146) */
     1, /* 1D16B (119147) */
     1, /* 1D16C (119148) */
-    5234, /* 1D16D (119149) */
+    5263, /* 1D16D (119149) */
     930, /* 1D16E (119150) */
     930, /* 1D16F (119151) */
     930, /* 1D170 (119152) */
@@ -97087,14 +97321,14 @@ static const uint32_t lxb_unicode_table_map_110576_205744[95168] =
     1, /* 1D1B6 (119222) */
     1, /* 1D1B7 (119223) */
     1, /* 1D1B8 (119224) */
-    5235, /* 1D1B9 (119225) */
-    5236, /* 1D1BA (119226) */
-    5237, /* 1D1BB (119227) */
-    5238, /* 1D1BC (119228) */
-    5239, /* 1D1BD (119229) */
-    5240, /* 1D1BE (119230) */
-    5241, /* 1D1BF (119231) */
-    5242, /* 1D1C0 (119232) */
+    5264, /* 1D1B9 (119225) */
+    5265, /* 1D1BA (119226) */
+    5266, /* 1D1BB (119227) */
+    5267, /* 1D1BC (119228) */
+    5268, /* 1D1BD (119229) */
+    5269, /* 1D1BE (119230) */
+    5270, /* 1D1BF (119231) */
+    5271, /* 1D1C0 (119232) */
     1, /* 1D1C1 (119233) */
     1, /* 1D1C2 (119234) */
     1, /* 1D1C3 (119235) */
@@ -97670,1030 +97904,1030 @@ static const uint32_t lxb_unicode_table_map_110576_205744[95168] =
     56, /* 1D3FD (119805) */
     56, /* 1D3FE (119806) */
     56, /* 1D3FF (119807) */
-    5203, /* 1D400 (119808) */
+    5232, /* 1D400 (119808) */
     1755, /* 1D401 (119809) */
     1730, /* 1D402 (119810) */
     1773, /* 1D403 (119811) */
     1757, /* 1D404 (119812) */
     1758, /* 1D405 (119813) */
-    5204, /* 1D406 (119814) */
+    5233, /* 1D406 (119814) */
     1737, /* 1D407 (119815) */
     1740, /* 1D408 (119816) */
-    5205, /* 1D409 (119817) */
-    5206, /* 1D40A (119818) */
+    5234, /* 1D409 (119817) */
+    5235, /* 1D40A (119818) */
     1741, /* 1D40B (119819) */
     1760, /* 1D40C (119820) */
     1743, /* 1D40D (119821) */
-    5207, /* 1D40E (119822) */
+    5236, /* 1D40E (119822) */
     1745, /* 1D40F (119823) */
     1746, /* 1D410 (119824) */
     1747, /* 1D411 (119825) */
-    5208, /* 1D412 (119826) */
-    5209, /* 1D413 (119827) */
-    5210, /* 1D414 (119828) */
-    5211, /* 1D415 (119829) */
-    5212, /* 1D416 (119830) */
-    5213, /* 1D417 (119831) */
-    5214, /* 1D418 (119832) */
+    5237, /* 1D412 (119826) */
+    5238, /* 1D413 (119827) */
+    5239, /* 1D414 (119828) */
+    5240, /* 1D415 (119829) */
+    5241, /* 1D416 (119830) */
+    5242, /* 1D417 (119831) */
+    5243, /* 1D418 (119832) */
     1751, /* 1D419 (119833) */
-    5243, /* 1D41A (119834) */
-    5244, /* 1D41B (119835) */
-    5245, /* 1D41C (119836) */
+    5272, /* 1D41A (119834) */
+    5273, /* 1D41B (119835) */
+    5274, /* 1D41C (119836) */
     1774, /* 1D41D (119837) */
     1756, /* 1D41E (119838) */
-    5246, /* 1D41F (119839) */
+    5275, /* 1D41F (119839) */
     1736, /* 1D420 (119840) */
     1738, /* 1D421 (119841) */
     1766, /* 1D422 (119842) */
     1775, /* 1D423 (119843) */
-    5247, /* 1D424 (119844) */
+    5276, /* 1D424 (119844) */
     1742, /* 1D425 (119845) */
-    5248, /* 1D426 (119846) */
-    5249, /* 1D427 (119847) */
+    5277, /* 1D426 (119846) */
+    5278, /* 1D427 (119847) */
     1761, /* 1D428 (119848) */
-    5250, /* 1D429 (119849) */
-    5251, /* 1D42A (119850) */
-    5252, /* 1D42B (119851) */
-    5253, /* 1D42C (119852) */
-    5254, /* 1D42D (119853) */
-    5255, /* 1D42E (119854) */
-    5256, /* 1D42F (119855) */
-    5257, /* 1D430 (119856) */
-    5258, /* 1D431 (119857) */
-    5259, /* 1D432 (119858) */
-    5260, /* 1D433 (119859) */
-    5203, /* 1D434 (119860) */
+    5279, /* 1D429 (119849) */
+    5280, /* 1D42A (119850) */
+    5281, /* 1D42B (119851) */
+    5282, /* 1D42C (119852) */
+    5283, /* 1D42D (119853) */
+    5284, /* 1D42E (119854) */
+    5285, /* 1D42F (119855) */
+    5286, /* 1D430 (119856) */
+    5287, /* 1D431 (119857) */
+    5288, /* 1D432 (119858) */
+    5289, /* 1D433 (119859) */
+    5232, /* 1D434 (119860) */
     1755, /* 1D435 (119861) */
     1730, /* 1D436 (119862) */
     1773, /* 1D437 (119863) */
     1757, /* 1D438 (119864) */
     1758, /* 1D439 (119865) */
-    5204, /* 1D43A (119866) */
+    5233, /* 1D43A (119866) */
     1737, /* 1D43B (119867) */
     1740, /* 1D43C (119868) */
-    5205, /* 1D43D (119869) */
-    5206, /* 1D43E (119870) */
+    5234, /* 1D43D (119869) */
+    5235, /* 1D43E (119870) */
     1741, /* 1D43F (119871) */
     1760, /* 1D440 (119872) */
     1743, /* 1D441 (119873) */
-    5207, /* 1D442 (119874) */
+    5236, /* 1D442 (119874) */
     1745, /* 1D443 (119875) */
     1746, /* 1D444 (119876) */
     1747, /* 1D445 (119877) */
-    5208, /* 1D446 (119878) */
-    5209, /* 1D447 (119879) */
-    5210, /* 1D448 (119880) */
-    5211, /* 1D449 (119881) */
-    5212, /* 1D44A (119882) */
-    5213, /* 1D44B (119883) */
-    5214, /* 1D44C (119884) */
+    5237, /* 1D446 (119878) */
+    5238, /* 1D447 (119879) */
+    5239, /* 1D448 (119880) */
+    5240, /* 1D449 (119881) */
+    5241, /* 1D44A (119882) */
+    5242, /* 1D44B (119883) */
+    5243, /* 1D44C (119884) */
     1751, /* 1D44D (119885) */
-    5243, /* 1D44E (119886) */
-    5244, /* 1D44F (119887) */
-    5245, /* 1D450 (119888) */
+    5272, /* 1D44E (119886) */
+    5273, /* 1D44F (119887) */
+    5274, /* 1D450 (119888) */
     1774, /* 1D451 (119889) */
     1756, /* 1D452 (119890) */
-    5246, /* 1D453 (119891) */
+    5275, /* 1D453 (119891) */
     1736, /* 1D454 (119892) */
     56, /* 1D455 (119893) */
     1766, /* 1D456 (119894) */
     1775, /* 1D457 (119895) */
-    5247, /* 1D458 (119896) */
+    5276, /* 1D458 (119896) */
     1742, /* 1D459 (119897) */
-    5248, /* 1D45A (119898) */
-    5249, /* 1D45B (119899) */
+    5277, /* 1D45A (119898) */
+    5278, /* 1D45B (119899) */
     1761, /* 1D45C (119900) */
-    5250, /* 1D45D (119901) */
-    5251, /* 1D45E (119902) */
-    5252, /* 1D45F (119903) */
-    5253, /* 1D460 (119904) */
-    5254, /* 1D461 (119905) */
-    5255, /* 1D462 (119906) */
-    5256, /* 1D463 (119907) */
-    5257, /* 1D464 (119908) */
-    5258, /* 1D465 (119909) */
-    5259, /* 1D466 (119910) */
-    5260, /* 1D467 (119911) */
-    5203, /* 1D468 (119912) */
+    5279, /* 1D45D (119901) */
+    5280, /* 1D45E (119902) */
+    5281, /* 1D45F (119903) */
+    5282, /* 1D460 (119904) */
+    5283, /* 1D461 (119905) */
+    5284, /* 1D462 (119906) */
+    5285, /* 1D463 (119907) */
+    5286, /* 1D464 (119908) */
+    5287, /* 1D465 (119909) */
+    5288, /* 1D466 (119910) */
+    5289, /* 1D467 (119911) */
+    5232, /* 1D468 (119912) */
     1755, /* 1D469 (119913) */
     1730, /* 1D46A (119914) */
     1773, /* 1D46B (119915) */
     1757, /* 1D46C (119916) */
     1758, /* 1D46D (119917) */
-    5204, /* 1D46E (119918) */
+    5233, /* 1D46E (119918) */
     1737, /* 1D46F (119919) */
     1740, /* 1D470 (119920) */
-    5205, /* 1D471 (119921) */
-    5206, /* 1D472 (119922) */
+    5234, /* 1D471 (119921) */
+    5235, /* 1D472 (119922) */
     1741, /* 1D473 (119923) */
     1760, /* 1D474 (119924) */
     1743, /* 1D475 (119925) */
-    5207, /* 1D476 (119926) */
+    5236, /* 1D476 (119926) */
     1745, /* 1D477 (119927) */
     1746, /* 1D478 (119928) */
     1747, /* 1D479 (119929) */
-    5208, /* 1D47A (119930) */
-    5209, /* 1D47B (119931) */
-    5210, /* 1D47C (119932) */
-    5211, /* 1D47D (119933) */
-    5212, /* 1D47E (119934) */
-    5213, /* 1D47F (119935) */
-    5214, /* 1D480 (119936) */
+    5237, /* 1D47A (119930) */
+    5238, /* 1D47B (119931) */
+    5239, /* 1D47C (119932) */
+    5240, /* 1D47D (119933) */
+    5241, /* 1D47E (119934) */
+    5242, /* 1D47F (119935) */
+    5243, /* 1D480 (119936) */
     1751, /* 1D481 (119937) */
-    5243, /* 1D482 (119938) */
-    5244, /* 1D483 (119939) */
-    5245, /* 1D484 (119940) */
+    5272, /* 1D482 (119938) */
+    5273, /* 1D483 (119939) */
+    5274, /* 1D484 (119940) */
     1774, /* 1D485 (119941) */
     1756, /* 1D486 (119942) */
-    5246, /* 1D487 (119943) */
+    5275, /* 1D487 (119943) */
     1736, /* 1D488 (119944) */
     1738, /* 1D489 (119945) */
     1766, /* 1D48A (119946) */
     1775, /* 1D48B (119947) */
-    5247, /* 1D48C (119948) */
+    5276, /* 1D48C (119948) */
     1742, /* 1D48D (119949) */
-    5248, /* 1D48E (119950) */
-    5249, /* 1D48F (119951) */
+    5277, /* 1D48E (119950) */
+    5278, /* 1D48F (119951) */
     1761, /* 1D490 (119952) */
-    5250, /* 1D491 (119953) */
-    5251, /* 1D492 (119954) */
-    5252, /* 1D493 (119955) */
-    5253, /* 1D494 (119956) */
-    5254, /* 1D495 (119957) */
-    5255, /* 1D496 (119958) */
-    5256, /* 1D497 (119959) */
-    5257, /* 1D498 (119960) */
-    5258, /* 1D499 (119961) */
-    5259, /* 1D49A (119962) */
-    5260, /* 1D49B (119963) */
-    5203, /* 1D49C (119964) */
+    5279, /* 1D491 (119953) */
+    5280, /* 1D492 (119954) */
+    5281, /* 1D493 (119955) */
+    5282, /* 1D494 (119956) */
+    5283, /* 1D495 (119957) */
+    5284, /* 1D496 (119958) */
+    5285, /* 1D497 (119959) */
+    5286, /* 1D498 (119960) */
+    5287, /* 1D499 (119961) */
+    5288, /* 1D49A (119962) */
+    5289, /* 1D49B (119963) */
+    5232, /* 1D49C (119964) */
     56, /* 1D49D (119965) */
     1730, /* 1D49E (119966) */
     1773, /* 1D49F (119967) */
     56, /* 1D4A0 (119968) */
     56, /* 1D4A1 (119969) */
-    5204, /* 1D4A2 (119970) */
+    5233, /* 1D4A2 (119970) */
     56, /* 1D4A3 (119971) */
     56, /* 1D4A4 (119972) */
-    5205, /* 1D4A5 (119973) */
-    5206, /* 1D4A6 (119974) */
+    5234, /* 1D4A5 (119973) */
+    5235, /* 1D4A6 (119974) */
     56, /* 1D4A7 (119975) */
     56, /* 1D4A8 (119976) */
     1743, /* 1D4A9 (119977) */
-    5207, /* 1D4AA (119978) */
+    5236, /* 1D4AA (119978) */
     1745, /* 1D4AB (119979) */
     1746, /* 1D4AC (119980) */
     56, /* 1D4AD (119981) */
-    5208, /* 1D4AE (119982) */
-    5209, /* 1D4AF (119983) */
-    5210, /* 1D4B0 (119984) */
-    5211, /* 1D4B1 (119985) */
-    5212, /* 1D4B2 (119986) */
-    5213, /* 1D4B3 (119987) */
-    5214, /* 1D4B4 (119988) */
+    5237, /* 1D4AE (119982) */
+    5238, /* 1D4AF (119983) */
+    5239, /* 1D4B0 (119984) */
+    5240, /* 1D4B1 (119985) */
+    5241, /* 1D4B2 (119986) */
+    5242, /* 1D4B3 (119987) */
+    5243, /* 1D4B4 (119988) */
     1751, /* 1D4B5 (119989) */
-    5243, /* 1D4B6 (119990) */
-    5244, /* 1D4B7 (119991) */
-    5245, /* 1D4B8 (119992) */
+    5272, /* 1D4B6 (119990) */
+    5273, /* 1D4B7 (119991) */
+    5274, /* 1D4B8 (119992) */
     1774, /* 1D4B9 (119993) */
     56, /* 1D4BA (119994) */
-    5246, /* 1D4BB (119995) */
+    5275, /* 1D4BB (119995) */
     56, /* 1D4BC (119996) */
     1738, /* 1D4BD (119997) */
     1766, /* 1D4BE (119998) */
     1775, /* 1D4BF (119999) */
-    5247, /* 1D4C0 (120000) */
+    5276, /* 1D4C0 (120000) */
     1742, /* 1D4C1 (120001) */
-    5248, /* 1D4C2 (120002) */
-    5249, /* 1D4C3 (120003) */
+    5277, /* 1D4C2 (120002) */
+    5278, /* 1D4C3 (120003) */
     56, /* 1D4C4 (120004) */
-    5250, /* 1D4C5 (120005) */
-    5251, /* 1D4C6 (120006) */
-    5252, /* 1D4C7 (120007) */
-    5253, /* 1D4C8 (120008) */
-    5254, /* 1D4C9 (120009) */
-    5255, /* 1D4CA (120010) */
-    5256, /* 1D4CB (120011) */
-    5257, /* 1D4CC (120012) */
-    5258, /* 1D4CD (120013) */
-    5259, /* 1D4CE (120014) */
-    5260, /* 1D4CF (120015) */
-    5203, /* 1D4D0 (120016) */
+    5279, /* 1D4C5 (120005) */
+    5280, /* 1D4C6 (120006) */
+    5281, /* 1D4C7 (120007) */
+    5282, /* 1D4C8 (120008) */
+    5283, /* 1D4C9 (120009) */
+    5284, /* 1D4CA (120010) */
+    5285, /* 1D4CB (120011) */
+    5286, /* 1D4CC (120012) */
+    5287, /* 1D4CD (120013) */
+    5288, /* 1D4CE (120014) */
+    5289, /* 1D4CF (120015) */
+    5232, /* 1D4D0 (120016) */
     1755, /* 1D4D1 (120017) */
     1730, /* 1D4D2 (120018) */
     1773, /* 1D4D3 (120019) */
     1757, /* 1D4D4 (120020) */
     1758, /* 1D4D5 (120021) */
-    5204, /* 1D4D6 (120022) */
+    5233, /* 1D4D6 (120022) */
     1737, /* 1D4D7 (120023) */
     1740, /* 1D4D8 (120024) */
-    5205, /* 1D4D9 (120025) */
-    5206, /* 1D4DA (120026) */
+    5234, /* 1D4D9 (120025) */
+    5235, /* 1D4DA (120026) */
     1741, /* 1D4DB (120027) */
     1760, /* 1D4DC (120028) */
     1743, /* 1D4DD (120029) */
-    5207, /* 1D4DE (120030) */
+    5236, /* 1D4DE (120030) */
     1745, /* 1D4DF (120031) */
     1746, /* 1D4E0 (120032) */
     1747, /* 1D4E1 (120033) */
-    5208, /* 1D4E2 (120034) */
-    5209, /* 1D4E3 (120035) */
-    5210, /* 1D4E4 (120036) */
-    5211, /* 1D4E5 (120037) */
-    5212, /* 1D4E6 (120038) */
-    5213, /* 1D4E7 (120039) */
-    5214, /* 1D4E8 (120040) */
+    5237, /* 1D4E2 (120034) */
+    5238, /* 1D4E3 (120035) */
+    5239, /* 1D4E4 (120036) */
+    5240, /* 1D4E5 (120037) */
+    5241, /* 1D4E6 (120038) */
+    5242, /* 1D4E7 (120039) */
+    5243, /* 1D4E8 (120040) */
     1751, /* 1D4E9 (120041) */
-    5243, /* 1D4EA (120042) */
-    5244, /* 1D4EB (120043) */
-    5245, /* 1D4EC (120044) */
+    5272, /* 1D4EA (120042) */
+    5273, /* 1D4EB (120043) */
+    5274, /* 1D4EC (120044) */
     1774, /* 1D4ED (120045) */
     1756, /* 1D4EE (120046) */
-    5246, /* 1D4EF (120047) */
+    5275, /* 1D4EF (120047) */
     1736, /* 1D4F0 (120048) */
     1738, /* 1D4F1 (120049) */
     1766, /* 1D4F2 (120050) */
     1775, /* 1D4F3 (120051) */
-    5247, /* 1D4F4 (120052) */
+    5276, /* 1D4F4 (120052) */
     1742, /* 1D4F5 (120053) */
-    5248, /* 1D4F6 (120054) */
-    5249, /* 1D4F7 (120055) */
+    5277, /* 1D4F6 (120054) */
+    5278, /* 1D4F7 (120055) */
     1761, /* 1D4F8 (120056) */
-    5250, /* 1D4F9 (120057) */
-    5251, /* 1D4FA (120058) */
-    5252, /* 1D4FB (120059) */
-    5253, /* 1D4FC (120060) */
-    5254, /* 1D4FD (120061) */
-    5255, /* 1D4FE (120062) */
-    5256, /* 1D4FF (120063) */
-    5257, /* 1D500 (120064) */
-    5258, /* 1D501 (120065) */
-    5259, /* 1D502 (120066) */
-    5260, /* 1D503 (120067) */
-    5203, /* 1D504 (120068) */
+    5279, /* 1D4F9 (120057) */
+    5280, /* 1D4FA (120058) */
+    5281, /* 1D4FB (120059) */
+    5282, /* 1D4FC (120060) */
+    5283, /* 1D4FD (120061) */
+    5284, /* 1D4FE (120062) */
+    5285, /* 1D4FF (120063) */
+    5286, /* 1D500 (120064) */
+    5287, /* 1D501 (120065) */
+    5288, /* 1D502 (120066) */
+    5289, /* 1D503 (120067) */
+    5232, /* 1D504 (120068) */
     1755, /* 1D505 (120069) */
     56, /* 1D506 (120070) */
     1773, /* 1D507 (120071) */
     1757, /* 1D508 (120072) */
     1758, /* 1D509 (120073) */
-    5204, /* 1D50A (120074) */
+    5233, /* 1D50A (120074) */
     56, /* 1D50B (120075) */
     56, /* 1D50C (120076) */
-    5205, /* 1D50D (120077) */
-    5206, /* 1D50E (120078) */
+    5234, /* 1D50D (120077) */
+    5235, /* 1D50E (120078) */
     1741, /* 1D50F (120079) */
     1760, /* 1D510 (120080) */
     1743, /* 1D511 (120081) */
-    5207, /* 1D512 (120082) */
+    5236, /* 1D512 (120082) */
     1745, /* 1D513 (120083) */
     1746, /* 1D514 (120084) */
     56, /* 1D515 (120085) */
-    5208, /* 1D516 (120086) */
-    5209, /* 1D517 (120087) */
-    5210, /* 1D518 (120088) */
-    5211, /* 1D519 (120089) */
-    5212, /* 1D51A (120090) */
-    5213, /* 1D51B (120091) */
-    5214, /* 1D51C (120092) */
+    5237, /* 1D516 (120086) */
+    5238, /* 1D517 (120087) */
+    5239, /* 1D518 (120088) */
+    5240, /* 1D519 (120089) */
+    5241, /* 1D51A (120090) */
+    5242, /* 1D51B (120091) */
+    5243, /* 1D51C (120092) */
     56, /* 1D51D (120093) */
-    5243, /* 1D51E (120094) */
-    5244, /* 1D51F (120095) */
-    5245, /* 1D520 (120096) */
+    5272, /* 1D51E (120094) */
+    5273, /* 1D51F (120095) */
+    5274, /* 1D520 (120096) */
     1774, /* 1D521 (120097) */
     1756, /* 1D522 (120098) */
-    5246, /* 1D523 (120099) */
+    5275, /* 1D523 (120099) */
     1736, /* 1D524 (120100) */
     1738, /* 1D525 (120101) */
     1766, /* 1D526 (120102) */
     1775, /* 1D527 (120103) */
-    5247, /* 1D528 (120104) */
+    5276, /* 1D528 (120104) */
     1742, /* 1D529 (120105) */
-    5248, /* 1D52A (120106) */
-    5249, /* 1D52B (120107) */
+    5277, /* 1D52A (120106) */
+    5278, /* 1D52B (120107) */
     1761, /* 1D52C (120108) */
-    5250, /* 1D52D (120109) */
-    5251, /* 1D52E (120110) */
-    5252, /* 1D52F (120111) */
-    5253, /* 1D530 (120112) */
-    5254, /* 1D531 (120113) */
-    5255, /* 1D532 (120114) */
-    5256, /* 1D533 (120115) */
-    5257, /* 1D534 (120116) */
-    5258, /* 1D535 (120117) */
-    5259, /* 1D536 (120118) */
-    5260, /* 1D537 (120119) */
-    5203, /* 1D538 (120120) */
+    5279, /* 1D52D (120109) */
+    5280, /* 1D52E (120110) */
+    5281, /* 1D52F (120111) */
+    5282, /* 1D530 (120112) */
+    5283, /* 1D531 (120113) */
+    5284, /* 1D532 (120114) */
+    5285, /* 1D533 (120115) */
+    5286, /* 1D534 (120116) */
+    5287, /* 1D535 (120117) */
+    5288, /* 1D536 (120118) */
+    5289, /* 1D537 (120119) */
+    5232, /* 1D538 (120120) */
     1755, /* 1D539 (120121) */
     56, /* 1D53A (120122) */
     1773, /* 1D53B (120123) */
     1757, /* 1D53C (120124) */
     1758, /* 1D53D (120125) */
-    5204, /* 1D53E (120126) */
+    5233, /* 1D53E (120126) */
     56, /* 1D53F (120127) */
     1740, /* 1D540 (120128) */
-    5205, /* 1D541 (120129) */
-    5206, /* 1D542 (120130) */
+    5234, /* 1D541 (120129) */
+    5235, /* 1D542 (120130) */
     1741, /* 1D543 (120131) */
     1760, /* 1D544 (120132) */
     56, /* 1D545 (120133) */
-    5207, /* 1D546 (120134) */
+    5236, /* 1D546 (120134) */
     56, /* 1D547 (120135) */
     56, /* 1D548 (120136) */
     56, /* 1D549 (120137) */
-    5208, /* 1D54A (120138) */
-    5209, /* 1D54B (120139) */
-    5210, /* 1D54C (120140) */
-    5211, /* 1D54D (120141) */
-    5212, /* 1D54E (120142) */
-    5213, /* 1D54F (120143) */
-    5214, /* 1D550 (120144) */
+    5237, /* 1D54A (120138) */
+    5238, /* 1D54B (120139) */
+    5239, /* 1D54C (120140) */
+    5240, /* 1D54D (120141) */
+    5241, /* 1D54E (120142) */
+    5242, /* 1D54F (120143) */
+    5243, /* 1D550 (120144) */
     56, /* 1D551 (120145) */
-    5243, /* 1D552 (120146) */
-    5244, /* 1D553 (120147) */
-    5245, /* 1D554 (120148) */
+    5272, /* 1D552 (120146) */
+    5273, /* 1D553 (120147) */
+    5274, /* 1D554 (120148) */
     1774, /* 1D555 (120149) */
     1756, /* 1D556 (120150) */
-    5246, /* 1D557 (120151) */
+    5275, /* 1D557 (120151) */
     1736, /* 1D558 (120152) */
     1738, /* 1D559 (120153) */
     1766, /* 1D55A (120154) */
     1775, /* 1D55B (120155) */
-    5247, /* 1D55C (120156) */
+    5276, /* 1D55C (120156) */
     1742, /* 1D55D (120157) */
-    5248, /* 1D55E (120158) */
-    5249, /* 1D55F (120159) */
+    5277, /* 1D55E (120158) */
+    5278, /* 1D55F (120159) */
     1761, /* 1D560 (120160) */
-    5250, /* 1D561 (120161) */
-    5251, /* 1D562 (120162) */
-    5252, /* 1D563 (120163) */
-    5253, /* 1D564 (120164) */
-    5254, /* 1D565 (120165) */
-    5255, /* 1D566 (120166) */
-    5256, /* 1D567 (120167) */
-    5257, /* 1D568 (120168) */
-    5258, /* 1D569 (120169) */
-    5259, /* 1D56A (120170) */
-    5260, /* 1D56B (120171) */
-    5203, /* 1D56C (120172) */
+    5279, /* 1D561 (120161) */
+    5280, /* 1D562 (120162) */
+    5281, /* 1D563 (120163) */
+    5282, /* 1D564 (120164) */
+    5283, /* 1D565 (120165) */
+    5284, /* 1D566 (120166) */
+    5285, /* 1D567 (120167) */
+    5286, /* 1D568 (120168) */
+    5287, /* 1D569 (120169) */
+    5288, /* 1D56A (120170) */
+    5289, /* 1D56B (120171) */
+    5232, /* 1D56C (120172) */
     1755, /* 1D56D (120173) */
     1730, /* 1D56E (120174) */
     1773, /* 1D56F (120175) */
     1757, /* 1D570 (120176) */
     1758, /* 1D571 (120177) */
-    5204, /* 1D572 (120178) */
+    5233, /* 1D572 (120178) */
     1737, /* 1D573 (120179) */
     1740, /* 1D574 (120180) */
-    5205, /* 1D575 (120181) */
-    5206, /* 1D576 (120182) */
+    5234, /* 1D575 (120181) */
+    5235, /* 1D576 (120182) */
     1741, /* 1D577 (120183) */
     1760, /* 1D578 (120184) */
     1743, /* 1D579 (120185) */
-    5207, /* 1D57A (120186) */
+    5236, /* 1D57A (120186) */
     1745, /* 1D57B (120187) */
     1746, /* 1D57C (120188) */
     1747, /* 1D57D (120189) */
-    5208, /* 1D57E (120190) */
-    5209, /* 1D57F (120191) */
-    5210, /* 1D580 (120192) */
-    5211, /* 1D581 (120193) */
-    5212, /* 1D582 (120194) */
-    5213, /* 1D583 (120195) */
-    5214, /* 1D584 (120196) */
+    5237, /* 1D57E (120190) */
+    5238, /* 1D57F (120191) */
+    5239, /* 1D580 (120192) */
+    5240, /* 1D581 (120193) */
+    5241, /* 1D582 (120194) */
+    5242, /* 1D583 (120195) */
+    5243, /* 1D584 (120196) */
     1751, /* 1D585 (120197) */
-    5243, /* 1D586 (120198) */
-    5244, /* 1D587 (120199) */
-    5245, /* 1D588 (120200) */
+    5272, /* 1D586 (120198) */
+    5273, /* 1D587 (120199) */
+    5274, /* 1D588 (120200) */
     1774, /* 1D589 (120201) */
     1756, /* 1D58A (120202) */
-    5246, /* 1D58B (120203) */
+    5275, /* 1D58B (120203) */
     1736, /* 1D58C (120204) */
     1738, /* 1D58D (120205) */
     1766, /* 1D58E (120206) */
     1775, /* 1D58F (120207) */
-    5247, /* 1D590 (120208) */
+    5276, /* 1D590 (120208) */
     1742, /* 1D591 (120209) */
-    5248, /* 1D592 (120210) */
-    5249, /* 1D593 (120211) */
+    5277, /* 1D592 (120210) */
+    5278, /* 1D593 (120211) */
     1761, /* 1D594 (120212) */
-    5250, /* 1D595 (120213) */
-    5251, /* 1D596 (120214) */
-    5252, /* 1D597 (120215) */
-    5253, /* 1D598 (120216) */
-    5254, /* 1D599 (120217) */
-    5255, /* 1D59A (120218) */
-    5256, /* 1D59B (120219) */
-    5257, /* 1D59C (120220) */
-    5258, /* 1D59D (120221) */
-    5259, /* 1D59E (120222) */
-    5260, /* 1D59F (120223) */
-    5203, /* 1D5A0 (120224) */
+    5279, /* 1D595 (120213) */
+    5280, /* 1D596 (120214) */
+    5281, /* 1D597 (120215) */
+    5282, /* 1D598 (120216) */
+    5283, /* 1D599 (120217) */
+    5284, /* 1D59A (120218) */
+    5285, /* 1D59B (120219) */
+    5286, /* 1D59C (120220) */
+    5287, /* 1D59D (120221) */
+    5288, /* 1D59E (120222) */
+    5289, /* 1D59F (120223) */
+    5232, /* 1D5A0 (120224) */
     1755, /* 1D5A1 (120225) */
     1730, /* 1D5A2 (120226) */
     1773, /* 1D5A3 (120227) */
     1757, /* 1D5A4 (120228) */
     1758, /* 1D5A5 (120229) */
-    5204, /* 1D5A6 (120230) */
+    5233, /* 1D5A6 (120230) */
     1737, /* 1D5A7 (120231) */
     1740, /* 1D5A8 (120232) */
-    5205, /* 1D5A9 (120233) */
-    5206, /* 1D5AA (120234) */
+    5234, /* 1D5A9 (120233) */
+    5235, /* 1D5AA (120234) */
     1741, /* 1D5AB (120235) */
     1760, /* 1D5AC (120236) */
     1743, /* 1D5AD (120237) */
-    5207, /* 1D5AE (120238) */
+    5236, /* 1D5AE (120238) */
     1745, /* 1D5AF (120239) */
     1746, /* 1D5B0 (120240) */
     1747, /* 1D5B1 (120241) */
-    5208, /* 1D5B2 (120242) */
-    5209, /* 1D5B3 (120243) */
-    5210, /* 1D5B4 (120244) */
-    5211, /* 1D5B5 (120245) */
-    5212, /* 1D5B6 (120246) */
-    5213, /* 1D5B7 (120247) */
-    5214, /* 1D5B8 (120248) */
+    5237, /* 1D5B2 (120242) */
+    5238, /* 1D5B3 (120243) */
+    5239, /* 1D5B4 (120244) */
+    5240, /* 1D5B5 (120245) */
+    5241, /* 1D5B6 (120246) */
+    5242, /* 1D5B7 (120247) */
+    5243, /* 1D5B8 (120248) */
     1751, /* 1D5B9 (120249) */
-    5243, /* 1D5BA (120250) */
-    5244, /* 1D5BB (120251) */
-    5245, /* 1D5BC (120252) */
+    5272, /* 1D5BA (120250) */
+    5273, /* 1D5BB (120251) */
+    5274, /* 1D5BC (120252) */
     1774, /* 1D5BD (120253) */
     1756, /* 1D5BE (120254) */
-    5246, /* 1D5BF (120255) */
+    5275, /* 1D5BF (120255) */
     1736, /* 1D5C0 (120256) */
     1738, /* 1D5C1 (120257) */
     1766, /* 1D5C2 (120258) */
     1775, /* 1D5C3 (120259) */
-    5247, /* 1D5C4 (120260) */
+    5276, /* 1D5C4 (120260) */
     1742, /* 1D5C5 (120261) */
-    5248, /* 1D5C6 (120262) */
-    5249, /* 1D5C7 (120263) */
+    5277, /* 1D5C6 (120262) */
+    5278, /* 1D5C7 (120263) */
     1761, /* 1D5C8 (120264) */
-    5250, /* 1D5C9 (120265) */
-    5251, /* 1D5CA (120266) */
-    5252, /* 1D5CB (120267) */
-    5253, /* 1D5CC (120268) */
-    5254, /* 1D5CD (120269) */
-    5255, /* 1D5CE (120270) */
-    5256, /* 1D5CF (120271) */
-    5257, /* 1D5D0 (120272) */
-    5258, /* 1D5D1 (120273) */
-    5259, /* 1D5D2 (120274) */
-    5260, /* 1D5D3 (120275) */
-    5203, /* 1D5D4 (120276) */
+    5279, /* 1D5C9 (120265) */
+    5280, /* 1D5CA (120266) */
+    5281, /* 1D5CB (120267) */
+    5282, /* 1D5CC (120268) */
+    5283, /* 1D5CD (120269) */
+    5284, /* 1D5CE (120270) */
+    5285, /* 1D5CF (120271) */
+    5286, /* 1D5D0 (120272) */
+    5287, /* 1D5D1 (120273) */
+    5288, /* 1D5D2 (120274) */
+    5289, /* 1D5D3 (120275) */
+    5232, /* 1D5D4 (120276) */
     1755, /* 1D5D5 (120277) */
     1730, /* 1D5D6 (120278) */
     1773, /* 1D5D7 (120279) */
     1757, /* 1D5D8 (120280) */
     1758, /* 1D5D9 (120281) */
-    5204, /* 1D5DA (120282) */
+    5233, /* 1D5DA (120282) */
     1737, /* 1D5DB (120283) */
     1740, /* 1D5DC (120284) */
-    5205, /* 1D5DD (120285) */
-    5206, /* 1D5DE (120286) */
+    5234, /* 1D5DD (120285) */
+    5235, /* 1D5DE (120286) */
     1741, /* 1D5DF (120287) */
     1760, /* 1D5E0 (120288) */
     1743, /* 1D5E1 (120289) */
-    5207, /* 1D5E2 (120290) */
+    5236, /* 1D5E2 (120290) */
     1745, /* 1D5E3 (120291) */
     1746, /* 1D5E4 (120292) */
     1747, /* 1D5E5 (120293) */
-    5208, /* 1D5E6 (120294) */
-    5209, /* 1D5E7 (120295) */
-    5210, /* 1D5E8 (120296) */
-    5211, /* 1D5E9 (120297) */
-    5212, /* 1D5EA (120298) */
-    5213, /* 1D5EB (120299) */
-    5214, /* 1D5EC (120300) */
+    5237, /* 1D5E6 (120294) */
+    5238, /* 1D5E7 (120295) */
+    5239, /* 1D5E8 (120296) */
+    5240, /* 1D5E9 (120297) */
+    5241, /* 1D5EA (120298) */
+    5242, /* 1D5EB (120299) */
+    5243, /* 1D5EC (120300) */
     1751, /* 1D5ED (120301) */
-    5243, /* 1D5EE (120302) */
-    5244, /* 1D5EF (120303) */
-    5245, /* 1D5F0 (120304) */
+    5272, /* 1D5EE (120302) */
+    5273, /* 1D5EF (120303) */
+    5274, /* 1D5F0 (120304) */
     1774, /* 1D5F1 (120305) */
     1756, /* 1D5F2 (120306) */
-    5246, /* 1D5F3 (120307) */
+    5275, /* 1D5F3 (120307) */
     1736, /* 1D5F4 (120308) */
     1738, /* 1D5F5 (120309) */
     1766, /* 1D5F6 (120310) */
     1775, /* 1D5F7 (120311) */
-    5247, /* 1D5F8 (120312) */
+    5276, /* 1D5F8 (120312) */
     1742, /* 1D5F9 (120313) */
-    5248, /* 1D5FA (120314) */
-    5249, /* 1D5FB (120315) */
+    5277, /* 1D5FA (120314) */
+    5278, /* 1D5FB (120315) */
     1761, /* 1D5FC (120316) */
-    5250, /* 1D5FD (120317) */
-    5251, /* 1D5FE (120318) */
-    5252, /* 1D5FF (120319) */
-    5253, /* 1D600 (120320) */
-    5254, /* 1D601 (120321) */
-    5255, /* 1D602 (120322) */
-    5256, /* 1D603 (120323) */
-    5257, /* 1D604 (120324) */
-    5258, /* 1D605 (120325) */
-    5259, /* 1D606 (120326) */
-    5260, /* 1D607 (120327) */
-    5203, /* 1D608 (120328) */
+    5279, /* 1D5FD (120317) */
+    5280, /* 1D5FE (120318) */
+    5281, /* 1D5FF (120319) */
+    5282, /* 1D600 (120320) */
+    5283, /* 1D601 (120321) */
+    5284, /* 1D602 (120322) */
+    5285, /* 1D603 (120323) */
+    5286, /* 1D604 (120324) */
+    5287, /* 1D605 (120325) */
+    5288, /* 1D606 (120326) */
+    5289, /* 1D607 (120327) */
+    5232, /* 1D608 (120328) */
     1755, /* 1D609 (120329) */
     1730, /* 1D60A (120330) */
     1773, /* 1D60B (120331) */
     1757, /* 1D60C (120332) */
     1758, /* 1D60D (120333) */
-    5204, /* 1D60E (120334) */
+    5233, /* 1D60E (120334) */
     1737, /* 1D60F (120335) */
     1740, /* 1D610 (120336) */
-    5205, /* 1D611 (120337) */
-    5206, /* 1D612 (120338) */
+    5234, /* 1D611 (120337) */
+    5235, /* 1D612 (120338) */
     1741, /* 1D613 (120339) */
     1760, /* 1D614 (120340) */
     1743, /* 1D615 (120341) */
-    5207, /* 1D616 (120342) */
+    5236, /* 1D616 (120342) */
     1745, /* 1D617 (120343) */
     1746, /* 1D618 (120344) */
     1747, /* 1D619 (120345) */
-    5208, /* 1D61A (120346) */
-    5209, /* 1D61B (120347) */
-    5210, /* 1D61C (120348) */
-    5211, /* 1D61D (120349) */
-    5212, /* 1D61E (120350) */
-    5213, /* 1D61F (120351) */
-    5214, /* 1D620 (120352) */
+    5237, /* 1D61A (120346) */
+    5238, /* 1D61B (120347) */
+    5239, /* 1D61C (120348) */
+    5240, /* 1D61D (120349) */
+    5241, /* 1D61E (120350) */
+    5242, /* 1D61F (120351) */
+    5243, /* 1D620 (120352) */
     1751, /* 1D621 (120353) */
-    5243, /* 1D622 (120354) */
-    5244, /* 1D623 (120355) */
-    5245, /* 1D624 (120356) */
+    5272, /* 1D622 (120354) */
+    5273, /* 1D623 (120355) */
+    5274, /* 1D624 (120356) */
     1774, /* 1D625 (120357) */
     1756, /* 1D626 (120358) */
-    5246, /* 1D627 (120359) */
+    5275, /* 1D627 (120359) */
     1736, /* 1D628 (120360) */
     1738, /* 1D629 (120361) */
     1766, /* 1D62A (120362) */
     1775, /* 1D62B (120363) */
-    5247, /* 1D62C (120364) */
+    5276, /* 1D62C (120364) */
     1742, /* 1D62D (120365) */
-    5248, /* 1D62E (120366) */
-    5249, /* 1D62F (120367) */
+    5277, /* 1D62E (120366) */
+    5278, /* 1D62F (120367) */
     1761, /* 1D630 (120368) */
-    5250, /* 1D631 (120369) */
-    5251, /* 1D632 (120370) */
-    5252, /* 1D633 (120371) */
-    5253, /* 1D634 (120372) */
-    5254, /* 1D635 (120373) */
-    5255, /* 1D636 (120374) */
-    5256, /* 1D637 (120375) */
-    5257, /* 1D638 (120376) */
-    5258, /* 1D639 (120377) */
-    5259, /* 1D63A (120378) */
-    5260, /* 1D63B (120379) */
-    5203, /* 1D63C (120380) */
+    5279, /* 1D631 (120369) */
+    5280, /* 1D632 (120370) */
+    5281, /* 1D633 (120371) */
+    5282, /* 1D634 (120372) */
+    5283, /* 1D635 (120373) */
+    5284, /* 1D636 (120374) */
+    5285, /* 1D637 (120375) */
+    5286, /* 1D638 (120376) */
+    5287, /* 1D639 (120377) */
+    5288, /* 1D63A (120378) */
+    5289, /* 1D63B (120379) */
+    5232, /* 1D63C (120380) */
     1755, /* 1D63D (120381) */
     1730, /* 1D63E (120382) */
     1773, /* 1D63F (120383) */
     1757, /* 1D640 (120384) */
     1758, /* 1D641 (120385) */
-    5204, /* 1D642 (120386) */
+    5233, /* 1D642 (120386) */
     1737, /* 1D643 (120387) */
     1740, /* 1D644 (120388) */
-    5205, /* 1D645 (120389) */
-    5206, /* 1D646 (120390) */
+    5234, /* 1D645 (120389) */
+    5235, /* 1D646 (120390) */
     1741, /* 1D647 (120391) */
     1760, /* 1D648 (120392) */
     1743, /* 1D649 (120393) */
-    5207, /* 1D64A (120394) */
+    5236, /* 1D64A (120394) */
     1745, /* 1D64B (120395) */
     1746, /* 1D64C (120396) */
     1747, /* 1D64D (120397) */
-    5208, /* 1D64E (120398) */
-    5209, /* 1D64F (120399) */
-    5210, /* 1D650 (120400) */
-    5211, /* 1D651 (120401) */
-    5212, /* 1D652 (120402) */
-    5213, /* 1D653 (120403) */
-    5214, /* 1D654 (120404) */
+    5237, /* 1D64E (120398) */
+    5238, /* 1D64F (120399) */
+    5239, /* 1D650 (120400) */
+    5240, /* 1D651 (120401) */
+    5241, /* 1D652 (120402) */
+    5242, /* 1D653 (120403) */
+    5243, /* 1D654 (120404) */
     1751, /* 1D655 (120405) */
-    5243, /* 1D656 (120406) */
-    5244, /* 1D657 (120407) */
-    5245, /* 1D658 (120408) */
+    5272, /* 1D656 (120406) */
+    5273, /* 1D657 (120407) */
+    5274, /* 1D658 (120408) */
     1774, /* 1D659 (120409) */
     1756, /* 1D65A (120410) */
-    5246, /* 1D65B (120411) */
+    5275, /* 1D65B (120411) */
     1736, /* 1D65C (120412) */
     1738, /* 1D65D (120413) */
     1766, /* 1D65E (120414) */
     1775, /* 1D65F (120415) */
-    5247, /* 1D660 (120416) */
+    5276, /* 1D660 (120416) */
     1742, /* 1D661 (120417) */
-    5248, /* 1D662 (120418) */
-    5249, /* 1D663 (120419) */
+    5277, /* 1D662 (120418) */
+    5278, /* 1D663 (120419) */
     1761, /* 1D664 (120420) */
-    5250, /* 1D665 (120421) */
-    5251, /* 1D666 (120422) */
-    5252, /* 1D667 (120423) */
-    5253, /* 1D668 (120424) */
-    5254, /* 1D669 (120425) */
-    5255, /* 1D66A (120426) */
-    5256, /* 1D66B (120427) */
-    5257, /* 1D66C (120428) */
-    5258, /* 1D66D (120429) */
-    5259, /* 1D66E (120430) */
-    5260, /* 1D66F (120431) */
-    5203, /* 1D670 (120432) */
+    5279, /* 1D665 (120421) */
+    5280, /* 1D666 (120422) */
+    5281, /* 1D667 (120423) */
+    5282, /* 1D668 (120424) */
+    5283, /* 1D669 (120425) */
+    5284, /* 1D66A (120426) */
+    5285, /* 1D66B (120427) */
+    5286, /* 1D66C (120428) */
+    5287, /* 1D66D (120429) */
+    5288, /* 1D66E (120430) */
+    5289, /* 1D66F (120431) */
+    5232, /* 1D670 (120432) */
     1755, /* 1D671 (120433) */
     1730, /* 1D672 (120434) */
     1773, /* 1D673 (120435) */
     1757, /* 1D674 (120436) */
     1758, /* 1D675 (120437) */
-    5204, /* 1D676 (120438) */
+    5233, /* 1D676 (120438) */
     1737, /* 1D677 (120439) */
     1740, /* 1D678 (120440) */
-    5205, /* 1D679 (120441) */
-    5206, /* 1D67A (120442) */
+    5234, /* 1D679 (120441) */
+    5235, /* 1D67A (120442) */
     1741, /* 1D67B (120443) */
     1760, /* 1D67C (120444) */
     1743, /* 1D67D (120445) */
-    5207, /* 1D67E (120446) */
+    5236, /* 1D67E (120446) */
     1745, /* 1D67F (120447) */
     1746, /* 1D680 (120448) */
     1747, /* 1D681 (120449) */
-    5208, /* 1D682 (120450) */
-    5209, /* 1D683 (120451) */
-    5210, /* 1D684 (120452) */
-    5211, /* 1D685 (120453) */
-    5212, /* 1D686 (120454) */
-    5213, /* 1D687 (120455) */
-    5214, /* 1D688 (120456) */
+    5237, /* 1D682 (120450) */
+    5238, /* 1D683 (120451) */
+    5239, /* 1D684 (120452) */
+    5240, /* 1D685 (120453) */
+    5241, /* 1D686 (120454) */
+    5242, /* 1D687 (120455) */
+    5243, /* 1D688 (120456) */
     1751, /* 1D689 (120457) */
-    5243, /* 1D68A (120458) */
-    5244, /* 1D68B (120459) */
-    5245, /* 1D68C (120460) */
+    5272, /* 1D68A (120458) */
+    5273, /* 1D68B (120459) */
+    5274, /* 1D68C (120460) */
     1774, /* 1D68D (120461) */
     1756, /* 1D68E (120462) */
-    5246, /* 1D68F (120463) */
+    5275, /* 1D68F (120463) */
     1736, /* 1D690 (120464) */
     1738, /* 1D691 (120465) */
     1766, /* 1D692 (120466) */
     1775, /* 1D693 (120467) */
-    5247, /* 1D694 (120468) */
+    5276, /* 1D694 (120468) */
     1742, /* 1D695 (120469) */
-    5248, /* 1D696 (120470) */
-    5249, /* 1D697 (120471) */
+    5277, /* 1D696 (120470) */
+    5278, /* 1D697 (120471) */
     1761, /* 1D698 (120472) */
-    5250, /* 1D699 (120473) */
-    5251, /* 1D69A (120474) */
-    5252, /* 1D69B (120475) */
-    5253, /* 1D69C (120476) */
-    5254, /* 1D69D (120477) */
-    5255, /* 1D69E (120478) */
-    5256, /* 1D69F (120479) */
-    5257, /* 1D6A0 (120480) */
-    5258, /* 1D6A1 (120481) */
-    5259, /* 1D6A2 (120482) */
-    5260, /* 1D6A3 (120483) */
-    5261, /* 1D6A4 (120484) */
-    5262, /* 1D6A5 (120485) */
+    5279, /* 1D699 (120473) */
+    5280, /* 1D69A (120474) */
+    5281, /* 1D69B (120475) */
+    5282, /* 1D69C (120476) */
+    5283, /* 1D69D (120477) */
+    5284, /* 1D69E (120478) */
+    5285, /* 1D69F (120479) */
+    5286, /* 1D6A0 (120480) */
+    5287, /* 1D6A1 (120481) */
+    5288, /* 1D6A2 (120482) */
+    5289, /* 1D6A3 (120483) */
+    5290, /* 1D6A4 (120484) */
+    5291, /* 1D6A5 (120485) */
     56, /* 1D6A6 (120486) */
     56, /* 1D6A7 (120487) */
-    5263, /* 1D6A8 (120488) */
-    5264, /* 1D6A9 (120489) */
+    5292, /* 1D6A8 (120488) */
+    5293, /* 1D6A9 (120489) */
     1770, /* 1D6AA (120490) */
-    5265, /* 1D6AB (120491) */
-    5266, /* 1D6AC (120492) */
-    5267, /* 1D6AD (120493) */
-    5268, /* 1D6AE (120494) */
-    5269, /* 1D6AF (120495) */
-    5270, /* 1D6B0 (120496) */
-    5271, /* 1D6B1 (120497) */
-    5272, /* 1D6B2 (120498) */
-    5273, /* 1D6B3 (120499) */
-    5274, /* 1D6B4 (120500) */
-    5275, /* 1D6B5 (120501) */
-    5276, /* 1D6B6 (120502) */
+    5294, /* 1D6AB (120491) */
+    5295, /* 1D6AC (120492) */
+    5296, /* 1D6AD (120493) */
+    5297, /* 1D6AE (120494) */
+    5298, /* 1D6AF (120495) */
+    5299, /* 1D6B0 (120496) */
+    5300, /* 1D6B1 (120497) */
+    5301, /* 1D6B2 (120498) */
+    5302, /* 1D6B3 (120499) */
+    5303, /* 1D6B4 (120500) */
+    5304, /* 1D6B5 (120501) */
+    5305, /* 1D6B6 (120502) */
     1771, /* 1D6B7 (120503) */
-    5277, /* 1D6B8 (120504) */
-    5278, /* 1D6B9 (120505) */
-    5279, /* 1D6BA (120506) */
-    5280, /* 1D6BB (120507) */
-    5281, /* 1D6BC (120508) */
-    5282, /* 1D6BD (120509) */
-    5283, /* 1D6BE (120510) */
-    5284, /* 1D6BF (120511) */
-    5285, /* 1D6C0 (120512) */
-    5286, /* 1D6C1 (120513) */
-    5287, /* 1D6C2 (120514) */
-    5288, /* 1D6C3 (120515) */
+    5306, /* 1D6B8 (120504) */
+    5307, /* 1D6B9 (120505) */
+    5308, /* 1D6BA (120506) */
+    5309, /* 1D6BB (120507) */
+    5310, /* 1D6BC (120508) */
+    5311, /* 1D6BD (120509) */
+    5312, /* 1D6BE (120510) */
+    5313, /* 1D6BF (120511) */
+    5314, /* 1D6C0 (120512) */
+    5315, /* 1D6C1 (120513) */
+    5316, /* 1D6C2 (120514) */
+    5317, /* 1D6C3 (120515) */
     1769, /* 1D6C4 (120516) */
-    5289, /* 1D6C5 (120517) */
-    5290, /* 1D6C6 (120518) */
-    5291, /* 1D6C7 (120519) */
-    5292, /* 1D6C8 (120520) */
-    5293, /* 1D6C9 (120521) */
-    5294, /* 1D6CA (120522) */
-    5295, /* 1D6CB (120523) */
-    5296, /* 1D6CC (120524) */
-    5297, /* 1D6CD (120525) */
-    5298, /* 1D6CE (120526) */
-    5299, /* 1D6CF (120527) */
-    5300, /* 1D6D0 (120528) */
+    5318, /* 1D6C5 (120517) */
+    5319, /* 1D6C6 (120518) */
+    5320, /* 1D6C7 (120519) */
+    5321, /* 1D6C8 (120520) */
+    5322, /* 1D6C9 (120521) */
+    5323, /* 1D6CA (120522) */
+    5324, /* 1D6CB (120523) */
+    5325, /* 1D6CC (120524) */
+    5326, /* 1D6CD (120525) */
+    5327, /* 1D6CE (120526) */
+    5328, /* 1D6CF (120527) */
+    5329, /* 1D6D0 (120528) */
     1768, /* 1D6D1 (120529) */
-    5301, /* 1D6D2 (120530) */
-    5302, /* 1D6D3 (120531) */
-    5303, /* 1D6D4 (120532) */
-    5304, /* 1D6D5 (120533) */
-    5305, /* 1D6D6 (120534) */
-    5306, /* 1D6D7 (120535) */
-    5307, /* 1D6D8 (120536) */
-    5308, /* 1D6D9 (120537) */
-    5309, /* 1D6DA (120538) */
-    5310, /* 1D6DB (120539) */
-    5311, /* 1D6DC (120540) */
-    5312, /* 1D6DD (120541) */
-    5313, /* 1D6DE (120542) */
-    5314, /* 1D6DF (120543) */
-    5315, /* 1D6E0 (120544) */
-    5316, /* 1D6E1 (120545) */
-    5263, /* 1D6E2 (120546) */
-    5264, /* 1D6E3 (120547) */
+    5330, /* 1D6D2 (120530) */
+    5331, /* 1D6D3 (120531) */
+    5332, /* 1D6D4 (120532) */
+    5333, /* 1D6D5 (120533) */
+    5334, /* 1D6D6 (120534) */
+    5335, /* 1D6D7 (120535) */
+    5336, /* 1D6D8 (120536) */
+    5337, /* 1D6D9 (120537) */
+    5338, /* 1D6DA (120538) */
+    5339, /* 1D6DB (120539) */
+    5340, /* 1D6DC (120540) */
+    5341, /* 1D6DD (120541) */
+    5342, /* 1D6DE (120542) */
+    5343, /* 1D6DF (120543) */
+    5344, /* 1D6E0 (120544) */
+    5345, /* 1D6E1 (120545) */
+    5292, /* 1D6E2 (120546) */
+    5293, /* 1D6E3 (120547) */
     1770, /* 1D6E4 (120548) */
-    5265, /* 1D6E5 (120549) */
-    5266, /* 1D6E6 (120550) */
-    5267, /* 1D6E7 (120551) */
-    5268, /* 1D6E8 (120552) */
-    5269, /* 1D6E9 (120553) */
-    5270, /* 1D6EA (120554) */
-    5271, /* 1D6EB (120555) */
-    5272, /* 1D6EC (120556) */
-    5273, /* 1D6ED (120557) */
-    5274, /* 1D6EE (120558) */
-    5275, /* 1D6EF (120559) */
-    5276, /* 1D6F0 (120560) */
+    5294, /* 1D6E5 (120549) */
+    5295, /* 1D6E6 (120550) */
+    5296, /* 1D6E7 (120551) */
+    5297, /* 1D6E8 (120552) */
+    5298, /* 1D6E9 (120553) */
+    5299, /* 1D6EA (120554) */
+    5300, /* 1D6EB (120555) */
+    5301, /* 1D6EC (120556) */
+    5302, /* 1D6ED (120557) */
+    5303, /* 1D6EE (120558) */
+    5304, /* 1D6EF (120559) */
+    5305, /* 1D6F0 (120560) */
     1771, /* 1D6F1 (120561) */
-    5277, /* 1D6F2 (120562) */
-    5317, /* 1D6F3 (120563) */
-    5279, /* 1D6F4 (120564) */
-    5280, /* 1D6F5 (120565) */
-    5281, /* 1D6F6 (120566) */
-    5282, /* 1D6F7 (120567) */
-    5283, /* 1D6F8 (120568) */
-    5284, /* 1D6F9 (120569) */
-    5285, /* 1D6FA (120570) */
-    5286, /* 1D6FB (120571) */
-    5287, /* 1D6FC (120572) */
-    5288, /* 1D6FD (120573) */
+    5306, /* 1D6F2 (120562) */
+    5346, /* 1D6F3 (120563) */
+    5308, /* 1D6F4 (120564) */
+    5309, /* 1D6F5 (120565) */
+    5310, /* 1D6F6 (120566) */
+    5311, /* 1D6F7 (120567) */
+    5312, /* 1D6F8 (120568) */
+    5313, /* 1D6F9 (120569) */
+    5314, /* 1D6FA (120570) */
+    5315, /* 1D6FB (120571) */
+    5316, /* 1D6FC (120572) */
+    5317, /* 1D6FD (120573) */
     1769, /* 1D6FE (120574) */
-    5289, /* 1D6FF (120575) */
-    5290, /* 1D700 (120576) */
-    5291, /* 1D701 (120577) */
-    5292, /* 1D702 (120578) */
-    5293, /* 1D703 (120579) */
-    5294, /* 1D704 (120580) */
-    5295, /* 1D705 (120581) */
-    5296, /* 1D706 (120582) */
-    5297, /* 1D707 (120583) */
-    5298, /* 1D708 (120584) */
-    5299, /* 1D709 (120585) */
-    5300, /* 1D70A (120586) */
+    5318, /* 1D6FF (120575) */
+    5319, /* 1D700 (120576) */
+    5320, /* 1D701 (120577) */
+    5321, /* 1D702 (120578) */
+    5322, /* 1D703 (120579) */
+    5323, /* 1D704 (120580) */
+    5324, /* 1D705 (120581) */
+    5325, /* 1D706 (120582) */
+    5326, /* 1D707 (120583) */
+    5327, /* 1D708 (120584) */
+    5328, /* 1D709 (120585) */
+    5329, /* 1D70A (120586) */
     1768, /* 1D70B (120587) */
-    5301, /* 1D70C (120588) */
-    5302, /* 1D70D (120589) */
-    5303, /* 1D70E (120590) */
-    5304, /* 1D70F (120591) */
-    5305, /* 1D710 (120592) */
-    5306, /* 1D711 (120593) */
-    5307, /* 1D712 (120594) */
-    5308, /* 1D713 (120595) */
-    5309, /* 1D714 (120596) */
-    5310, /* 1D715 (120597) */
-    5318, /* 1D716 (120598) */
-    5319, /* 1D717 (120599) */
-    5320, /* 1D718 (120600) */
-    5321, /* 1D719 (120601) */
-    5322, /* 1D71A (120602) */
-    5323, /* 1D71B (120603) */
-    5263, /* 1D71C (120604) */
-    5264, /* 1D71D (120605) */
+    5330, /* 1D70C (120588) */
+    5331, /* 1D70D (120589) */
+    5332, /* 1D70E (120590) */
+    5333, /* 1D70F (120591) */
+    5334, /* 1D710 (120592) */
+    5335, /* 1D711 (120593) */
+    5336, /* 1D712 (120594) */
+    5337, /* 1D713 (120595) */
+    5338, /* 1D714 (120596) */
+    5339, /* 1D715 (120597) */
+    5347, /* 1D716 (120598) */
+    5348, /* 1D717 (120599) */
+    5349, /* 1D718 (120600) */
+    5350, /* 1D719 (120601) */
+    5351, /* 1D71A (120602) */
+    5352, /* 1D71B (120603) */
+    5292, /* 1D71C (120604) */
+    5293, /* 1D71D (120605) */
     1770, /* 1D71E (120606) */
-    5265, /* 1D71F (120607) */
-    5266, /* 1D720 (120608) */
-    5267, /* 1D721 (120609) */
-    5268, /* 1D722 (120610) */
-    5269, /* 1D723 (120611) */
-    5270, /* 1D724 (120612) */
-    5271, /* 1D725 (120613) */
-    5272, /* 1D726 (120614) */
-    5273, /* 1D727 (120615) */
-    5274, /* 1D728 (120616) */
-    5275, /* 1D729 (120617) */
-    5276, /* 1D72A (120618) */
+    5294, /* 1D71F (120607) */
+    5295, /* 1D720 (120608) */
+    5296, /* 1D721 (120609) */
+    5297, /* 1D722 (120610) */
+    5298, /* 1D723 (120611) */
+    5299, /* 1D724 (120612) */
+    5300, /* 1D725 (120613) */
+    5301, /* 1D726 (120614) */
+    5302, /* 1D727 (120615) */
+    5303, /* 1D728 (120616) */
+    5304, /* 1D729 (120617) */
+    5305, /* 1D72A (120618) */
     1771, /* 1D72B (120619) */
-    5277, /* 1D72C (120620) */
-    5324, /* 1D72D (120621) */
-    5279, /* 1D72E (120622) */
-    5280, /* 1D72F (120623) */
-    5281, /* 1D730 (120624) */
-    5282, /* 1D731 (120625) */
-    5283, /* 1D732 (120626) */
-    5284, /* 1D733 (120627) */
-    5285, /* 1D734 (120628) */
-    5286, /* 1D735 (120629) */
-    5287, /* 1D736 (120630) */
-    5288, /* 1D737 (120631) */
+    5306, /* 1D72C (120620) */
+    5353, /* 1D72D (120621) */
+    5308, /* 1D72E (120622) */
+    5309, /* 1D72F (120623) */
+    5310, /* 1D730 (120624) */
+    5311, /* 1D731 (120625) */
+    5312, /* 1D732 (120626) */
+    5313, /* 1D733 (120627) */
+    5314, /* 1D734 (120628) */
+    5315, /* 1D735 (120629) */
+    5316, /* 1D736 (120630) */
+    5317, /* 1D737 (120631) */
     1769, /* 1D738 (120632) */
-    5289, /* 1D739 (120633) */
-    5290, /* 1D73A (120634) */
-    5291, /* 1D73B (120635) */
-    5292, /* 1D73C (120636) */
-    5293, /* 1D73D (120637) */
-    5294, /* 1D73E (120638) */
-    5295, /* 1D73F (120639) */
-    5296, /* 1D740 (120640) */
-    5297, /* 1D741 (120641) */
-    5298, /* 1D742 (120642) */
-    5299, /* 1D743 (120643) */
-    5300, /* 1D744 (120644) */
+    5318, /* 1D739 (120633) */
+    5319, /* 1D73A (120634) */
+    5320, /* 1D73B (120635) */
+    5321, /* 1D73C (120636) */
+    5322, /* 1D73D (120637) */
+    5323, /* 1D73E (120638) */
+    5324, /* 1D73F (120639) */
+    5325, /* 1D740 (120640) */
+    5326, /* 1D741 (120641) */
+    5327, /* 1D742 (120642) */
+    5328, /* 1D743 (120643) */
+    5329, /* 1D744 (120644) */
     1768, /* 1D745 (120645) */
-    5301, /* 1D746 (120646) */
-    5302, /* 1D747 (120647) */
-    5303, /* 1D748 (120648) */
-    5304, /* 1D749 (120649) */
-    5305, /* 1D74A (120650) */
-    5306, /* 1D74B (120651) */
-    5307, /* 1D74C (120652) */
-    5308, /* 1D74D (120653) */
-    5309, /* 1D74E (120654) */
-    5310, /* 1D74F (120655) */
-    5325, /* 1D750 (120656) */
-    5326, /* 1D751 (120657) */
-    5327, /* 1D752 (120658) */
-    5328, /* 1D753 (120659) */
-    5329, /* 1D754 (120660) */
-    5330, /* 1D755 (120661) */
-    5263, /* 1D756 (120662) */
-    5264, /* 1D757 (120663) */
+    5330, /* 1D746 (120646) */
+    5331, /* 1D747 (120647) */
+    5332, /* 1D748 (120648) */
+    5333, /* 1D749 (120649) */
+    5334, /* 1D74A (120650) */
+    5335, /* 1D74B (120651) */
+    5336, /* 1D74C (120652) */
+    5337, /* 1D74D (120653) */
+    5338, /* 1D74E (120654) */
+    5339, /* 1D74F (120655) */
+    5354, /* 1D750 (120656) */
+    5355, /* 1D751 (120657) */
+    5356, /* 1D752 (120658) */
+    5357, /* 1D753 (120659) */
+    5358, /* 1D754 (120660) */
+    5359, /* 1D755 (120661) */
+    5292, /* 1D756 (120662) */
+    5293, /* 1D757 (120663) */
     1770, /* 1D758 (120664) */
-    5265, /* 1D759 (120665) */
-    5266, /* 1D75A (120666) */
-    5267, /* 1D75B (120667) */
-    5268, /* 1D75C (120668) */
-    5269, /* 1D75D (120669) */
-    5270, /* 1D75E (120670) */
-    5271, /* 1D75F (120671) */
-    5272, /* 1D760 (120672) */
-    5273, /* 1D761 (120673) */
-    5274, /* 1D762 (120674) */
-    5275, /* 1D763 (120675) */
-    5276, /* 1D764 (120676) */
+    5294, /* 1D759 (120665) */
+    5295, /* 1D75A (120666) */
+    5296, /* 1D75B (120667) */
+    5297, /* 1D75C (120668) */
+    5298, /* 1D75D (120669) */
+    5299, /* 1D75E (120670) */
+    5300, /* 1D75F (120671) */
+    5301, /* 1D760 (120672) */
+    5302, /* 1D761 (120673) */
+    5303, /* 1D762 (120674) */
+    5304, /* 1D763 (120675) */
+    5305, /* 1D764 (120676) */
     1771, /* 1D765 (120677) */
-    5277, /* 1D766 (120678) */
-    5331, /* 1D767 (120679) */
-    5279, /* 1D768 (120680) */
-    5280, /* 1D769 (120681) */
-    5281, /* 1D76A (120682) */
-    5282, /* 1D76B (120683) */
-    5283, /* 1D76C (120684) */
-    5284, /* 1D76D (120685) */
-    5285, /* 1D76E (120686) */
-    5286, /* 1D76F (120687) */
-    5287, /* 1D770 (120688) */
-    5288, /* 1D771 (120689) */
+    5306, /* 1D766 (120678) */
+    5360, /* 1D767 (120679) */
+    5308, /* 1D768 (120680) */
+    5309, /* 1D769 (120681) */
+    5310, /* 1D76A (120682) */
+    5311, /* 1D76B (120683) */
+    5312, /* 1D76C (120684) */
+    5313, /* 1D76D (120685) */
+    5314, /* 1D76E (120686) */
+    5315, /* 1D76F (120687) */
+    5316, /* 1D770 (120688) */
+    5317, /* 1D771 (120689) */
     1769, /* 1D772 (120690) */
-    5289, /* 1D773 (120691) */
-    5290, /* 1D774 (120692) */
-    5291, /* 1D775 (120693) */
-    5292, /* 1D776 (120694) */
-    5293, /* 1D777 (120695) */
-    5294, /* 1D778 (120696) */
-    5295, /* 1D779 (120697) */
-    5296, /* 1D77A (120698) */
-    5297, /* 1D77B (120699) */
-    5298, /* 1D77C (120700) */
-    5299, /* 1D77D (120701) */
-    5300, /* 1D77E (120702) */
+    5318, /* 1D773 (120691) */
+    5319, /* 1D774 (120692) */
+    5320, /* 1D775 (120693) */
+    5321, /* 1D776 (120694) */
+    5322, /* 1D777 (120695) */
+    5323, /* 1D778 (120696) */
+    5324, /* 1D779 (120697) */
+    5325, /* 1D77A (120698) */
+    5326, /* 1D77B (120699) */
+    5327, /* 1D77C (120700) */
+    5328, /* 1D77D (120701) */
+    5329, /* 1D77E (120702) */
     1768, /* 1D77F (120703) */
-    5301, /* 1D780 (120704) */
-    5302, /* 1D781 (120705) */
-    5303, /* 1D782 (120706) */
-    5304, /* 1D783 (120707) */
-    5305, /* 1D784 (120708) */
-    5306, /* 1D785 (120709) */
-    5307, /* 1D786 (120710) */
-    5308, /* 1D787 (120711) */
-    5309, /* 1D788 (120712) */
-    5310, /* 1D789 (120713) */
-    5332, /* 1D78A (120714) */
-    5333, /* 1D78B (120715) */
-    5334, /* 1D78C (120716) */
-    5335, /* 1D78D (120717) */
-    5336, /* 1D78E (120718) */
-    5337, /* 1D78F (120719) */
-    5263, /* 1D790 (120720) */
-    5264, /* 1D791 (120721) */
+    5330, /* 1D780 (120704) */
+    5331, /* 1D781 (120705) */
+    5332, /* 1D782 (120706) */
+    5333, /* 1D783 (120707) */
+    5334, /* 1D784 (120708) */
+    5335, /* 1D785 (120709) */
+    5336, /* 1D786 (120710) */
+    5337, /* 1D787 (120711) */
+    5338, /* 1D788 (120712) */
+    5339, /* 1D789 (120713) */
+    5361, /* 1D78A (120714) */
+    5362, /* 1D78B (120715) */
+    5363, /* 1D78C (120716) */
+    5364, /* 1D78D (120717) */
+    5365, /* 1D78E (120718) */
+    5366, /* 1D78F (120719) */
+    5292, /* 1D790 (120720) */
+    5293, /* 1D791 (120721) */
     1770, /* 1D792 (120722) */
-    5265, /* 1D793 (120723) */
-    5266, /* 1D794 (120724) */
-    5267, /* 1D795 (120725) */
-    5268, /* 1D796 (120726) */
-    5269, /* 1D797 (120727) */
-    5270, /* 1D798 (120728) */
-    5271, /* 1D799 (120729) */
-    5272, /* 1D79A (120730) */
-    5273, /* 1D79B (120731) */
-    5274, /* 1D79C (120732) */
-    5275, /* 1D79D (120733) */
-    5276, /* 1D79E (120734) */
+    5294, /* 1D793 (120723) */
+    5295, /* 1D794 (120724) */
+    5296, /* 1D795 (120725) */
+    5297, /* 1D796 (120726) */
+    5298, /* 1D797 (120727) */
+    5299, /* 1D798 (120728) */
+    5300, /* 1D799 (120729) */
+    5301, /* 1D79A (120730) */
+    5302, /* 1D79B (120731) */
+    5303, /* 1D79C (120732) */
+    5304, /* 1D79D (120733) */
+    5305, /* 1D79E (120734) */
     1771, /* 1D79F (120735) */
-    5277, /* 1D7A0 (120736) */
-    5338, /* 1D7A1 (120737) */
-    5279, /* 1D7A2 (120738) */
-    5280, /* 1D7A3 (120739) */
-    5281, /* 1D7A4 (120740) */
-    5282, /* 1D7A5 (120741) */
-    5283, /* 1D7A6 (120742) */
-    5284, /* 1D7A7 (120743) */
-    5285, /* 1D7A8 (120744) */
-    5286, /* 1D7A9 (120745) */
-    5287, /* 1D7AA (120746) */
-    5288, /* 1D7AB (120747) */
+    5306, /* 1D7A0 (120736) */
+    5367, /* 1D7A1 (120737) */
+    5308, /* 1D7A2 (120738) */
+    5309, /* 1D7A3 (120739) */
+    5310, /* 1D7A4 (120740) */
+    5311, /* 1D7A5 (120741) */
+    5312, /* 1D7A6 (120742) */
+    5313, /* 1D7A7 (120743) */
+    5314, /* 1D7A8 (120744) */
+    5315, /* 1D7A9 (120745) */
+    5316, /* 1D7AA (120746) */
+    5317, /* 1D7AB (120747) */
     1769, /* 1D7AC (120748) */
-    5289, /* 1D7AD (120749) */
-    5290, /* 1D7AE (120750) */
-    5291, /* 1D7AF (120751) */
-    5292, /* 1D7B0 (120752) */
-    5293, /* 1D7B1 (120753) */
-    5294, /* 1D7B2 (120754) */
-    5295, /* 1D7B3 (120755) */
-    5296, /* 1D7B4 (120756) */
-    5297, /* 1D7B5 (120757) */
-    5298, /* 1D7B6 (120758) */
-    5299, /* 1D7B7 (120759) */
-    5300, /* 1D7B8 (120760) */
+    5318, /* 1D7AD (120749) */
+    5319, /* 1D7AE (120750) */
+    5320, /* 1D7AF (120751) */
+    5321, /* 1D7B0 (120752) */
+    5322, /* 1D7B1 (120753) */
+    5323, /* 1D7B2 (120754) */
+    5324, /* 1D7B3 (120755) */
+    5325, /* 1D7B4 (120756) */
+    5326, /* 1D7B5 (120757) */
+    5327, /* 1D7B6 (120758) */
+    5328, /* 1D7B7 (120759) */
+    5329, /* 1D7B8 (120760) */
     1768, /* 1D7B9 (120761) */
-    5301, /* 1D7BA (120762) */
-    5302, /* 1D7BB (120763) */
-    5303, /* 1D7BC (120764) */
-    5304, /* 1D7BD (120765) */
-    5305, /* 1D7BE (120766) */
-    5306, /* 1D7BF (120767) */
-    5307, /* 1D7C0 (120768) */
-    5308, /* 1D7C1 (120769) */
-    5309, /* 1D7C2 (120770) */
-    5310, /* 1D7C3 (120771) */
-    5339, /* 1D7C4 (120772) */
-    5340, /* 1D7C5 (120773) */
-    5341, /* 1D7C6 (120774) */
-    5342, /* 1D7C7 (120775) */
-    5343, /* 1D7C8 (120776) */
-    5344, /* 1D7C9 (120777) */
-    5345, /* 1D7CA (120778) */
-    5346, /* 1D7CB (120779) */
+    5330, /* 1D7BA (120762) */
+    5331, /* 1D7BB (120763) */
+    5332, /* 1D7BC (120764) */
+    5333, /* 1D7BD (120765) */
+    5334, /* 1D7BE (120766) */
+    5335, /* 1D7BF (120767) */
+    5336, /* 1D7C0 (120768) */
+    5337, /* 1D7C1 (120769) */
+    5338, /* 1D7C2 (120770) */
+    5339, /* 1D7C3 (120771) */
+    5368, /* 1D7C4 (120772) */
+    5369, /* 1D7C5 (120773) */
+    5370, /* 1D7C6 (120774) */
+    5371, /* 1D7C7 (120775) */
+    5372, /* 1D7C8 (120776) */
+    5373, /* 1D7C9 (120777) */
+    5374, /* 1D7CA (120778) */
+    5375, /* 1D7CB (120779) */
     56, /* 1D7CC (120780) */
     56, /* 1D7CD (120781) */
-    5215, /* 1D7CE (120782) */
-    5216, /* 1D7CF (120783) */
-    5217, /* 1D7D0 (120784) */
-    5218, /* 1D7D1 (120785) */
-    5219, /* 1D7D2 (120786) */
-    5220, /* 1D7D3 (120787) */
-    5221, /* 1D7D4 (120788) */
-    5222, /* 1D7D5 (120789) */
-    5223, /* 1D7D6 (120790) */
-    5224, /* 1D7D7 (120791) */
-    5215, /* 1D7D8 (120792) */
-    5216, /* 1D7D9 (120793) */
-    5217, /* 1D7DA (120794) */
-    5218, /* 1D7DB (120795) */
-    5219, /* 1D7DC (120796) */
-    5220, /* 1D7DD (120797) */
-    5221, /* 1D7DE (120798) */
-    5222, /* 1D7DF (120799) */
-    5223, /* 1D7E0 (120800) */
-    5224, /* 1D7E1 (120801) */
-    5215, /* 1D7E2 (120802) */
-    5216, /* 1D7E3 (120803) */
-    5217, /* 1D7E4 (120804) */
-    5218, /* 1D7E5 (120805) */
-    5219, /* 1D7E6 (120806) */
-    5220, /* 1D7E7 (120807) */
-    5221, /* 1D7E8 (120808) */
-    5222, /* 1D7E9 (120809) */
-    5223, /* 1D7EA (120810) */
-    5224, /* 1D7EB (120811) */
-    5215, /* 1D7EC (120812) */
-    5216, /* 1D7ED (120813) */
-    5217, /* 1D7EE (120814) */
-    5218, /* 1D7EF (120815) */
-    5219, /* 1D7F0 (120816) */
-    5220, /* 1D7F1 (120817) */
-    5221, /* 1D7F2 (120818) */
-    5222, /* 1D7F3 (120819) */
-    5223, /* 1D7F4 (120820) */
-    5224, /* 1D7F5 (120821) */
-    5215, /* 1D7F6 (120822) */
-    5216, /* 1D7F7 (120823) */
-    5217, /* 1D7F8 (120824) */
-    5218, /* 1D7F9 (120825) */
-    5219, /* 1D7FA (120826) */
-    5220, /* 1D7FB (120827) */
-    5221, /* 1D7FC (120828) */
-    5222, /* 1D7FD (120829) */
-    5223, /* 1D7FE (120830) */
-    5224, /* 1D7FF (120831) */
+    5244, /* 1D7CE (120782) */
+    5245, /* 1D7CF (120783) */
+    5246, /* 1D7D0 (120784) */
+    5247, /* 1D7D1 (120785) */
+    5248, /* 1D7D2 (120786) */
+    5249, /* 1D7D3 (120787) */
+    5250, /* 1D7D4 (120788) */
+    5251, /* 1D7D5 (120789) */
+    5252, /* 1D7D6 (120790) */
+    5253, /* 1D7D7 (120791) */
+    5244, /* 1D7D8 (120792) */
+    5245, /* 1D7D9 (120793) */
+    5246, /* 1D7DA (120794) */
+    5247, /* 1D7DB (120795) */
+    5248, /* 1D7DC (120796) */
+    5249, /* 1D7DD (120797) */
+    5250, /* 1D7DE (120798) */
+    5251, /* 1D7DF (120799) */
+    5252, /* 1D7E0 (120800) */
+    5253, /* 1D7E1 (120801) */
+    5244, /* 1D7E2 (120802) */
+    5245, /* 1D7E3 (120803) */
+    5246, /* 1D7E4 (120804) */
+    5247, /* 1D7E5 (120805) */
+    5248, /* 1D7E6 (120806) */
+    5249, /* 1D7E7 (120807) */
+    5250, /* 1D7E8 (120808) */
+    5251, /* 1D7E9 (120809) */
+    5252, /* 1D7EA (120810) */
+    5253, /* 1D7EB (120811) */
+    5244, /* 1D7EC (120812) */
+    5245, /* 1D7ED (120813) */
+    5246, /* 1D7EE (120814) */
+    5247, /* 1D7EF (120815) */
+    5248, /* 1D7F0 (120816) */
+    5249, /* 1D7F1 (120817) */
+    5250, /* 1D7F2 (120818) */
+    5251, /* 1D7F3 (120819) */
+    5252, /* 1D7F4 (120820) */
+    5253, /* 1D7F5 (120821) */
+    5244, /* 1D7F6 (120822) */
+    5245, /* 1D7F7 (120823) */
+    5246, /* 1D7F8 (120824) */
+    5247, /* 1D7F9 (120825) */
+    5248, /* 1D7FA (120826) */
+    5249, /* 1D7FB (120827) */
+    5250, /* 1D7FC (120828) */
+    5251, /* 1D7FD (120829) */
+    5252, /* 1D7FE (120830) */
+    5253, /* 1D7FF (120831) */
     1, /* 1D800 (120832) */
     1, /* 1D801 (120833) */
     1, /* 1D802 (120834) */
@@ -100790,68 +101024,68 @@ static const uint32_t lxb_unicode_table_map_110576_205744[95168] =
     56, /* 1E02D (122925) */
     56, /* 1E02E (122926) */
     56, /* 1E02F (122927) */
-    5347, /* 1E030 (122928) */
-    5348, /* 1E031 (122929) */
-    5349, /* 1E032 (122930) */
-    5350, /* 1E033 (122931) */
-    5351, /* 1E034 (122932) */
-    5352, /* 1E035 (122933) */
-    5353, /* 1E036 (122934) */
-    5354, /* 1E037 (122935) */
-    5355, /* 1E038 (122936) */
-    5356, /* 1E039 (122937) */
-    5357, /* 1E03A (122938) */
-    5358, /* 1E03B (122939) */
-    5359, /* 1E03C (122940) */
-    5360, /* 1E03D (122941) */
-    5361, /* 1E03E (122942) */
-    5362, /* 1E03F (122943) */
-    5363, /* 1E040 (122944) */
-    5364, /* 1E041 (122945) */
-    5365, /* 1E042 (122946) */
-    5366, /* 1E043 (122947) */
-    5367, /* 1E044 (122948) */
-    5368, /* 1E045 (122949) */
-    5369, /* 1E046 (122950) */
-    5370, /* 1E047 (122951) */
-    5371, /* 1E048 (122952) */
-    5372, /* 1E049 (122953) */
-    5373, /* 1E04A (122954) */
-    5374, /* 1E04B (122955) */
-    5375, /* 1E04C (122956) */
-    5376, /* 1E04D (122957) */
-    5377, /* 1E04E (122958) */
-    5378, /* 1E04F (122959) */
-    5379, /* 1E050 (122960) */
-    5380, /* 1E051 (122961) */
-    5381, /* 1E052 (122962) */
-    5382, /* 1E053 (122963) */
-    5383, /* 1E054 (122964) */
-    5384, /* 1E055 (122965) */
-    5385, /* 1E056 (122966) */
-    5386, /* 1E057 (122967) */
-    5387, /* 1E058 (122968) */
-    5388, /* 1E059 (122969) */
-    5389, /* 1E05A (122970) */
-    5390, /* 1E05B (122971) */
-    5391, /* 1E05C (122972) */
-    5392, /* 1E05D (122973) */
-    5393, /* 1E05E (122974) */
-    5394, /* 1E05F (122975) */
-    5395, /* 1E060 (122976) */
-    5396, /* 1E061 (122977) */
-    5397, /* 1E062 (122978) */
-    5398, /* 1E063 (122979) */
-    5399, /* 1E064 (122980) */
-    5400, /* 1E065 (122981) */
-    5401, /* 1E066 (122982) */
-    5402, /* 1E067 (122983) */
-    5403, /* 1E068 (122984) */
-    5404, /* 1E069 (122985) */
-    5405, /* 1E06A (122986) */
-    5406, /* 1E06B (122987) */
-    5407, /* 1E06C (122988) */
-    5408, /* 1E06D (122989) */
+    5376, /* 1E030 (122928) */
+    5377, /* 1E031 (122929) */
+    5378, /* 1E032 (122930) */
+    5379, /* 1E033 (122931) */
+    5380, /* 1E034 (122932) */
+    5381, /* 1E035 (122933) */
+    5382, /* 1E036 (122934) */
+    5383, /* 1E037 (122935) */
+    5384, /* 1E038 (122936) */
+    5385, /* 1E039 (122937) */
+    5386, /* 1E03A (122938) */
+    5387, /* 1E03B (122939) */
+    5388, /* 1E03C (122940) */
+    5389, /* 1E03D (122941) */
+    5390, /* 1E03E (122942) */
+    5391, /* 1E03F (122943) */
+    5392, /* 1E040 (122944) */
+    5393, /* 1E041 (122945) */
+    5394, /* 1E042 (122946) */
+    5395, /* 1E043 (122947) */
+    5396, /* 1E044 (122948) */
+    5397, /* 1E045 (122949) */
+    5398, /* 1E046 (122950) */
+    5399, /* 1E047 (122951) */
+    5400, /* 1E048 (122952) */
+    5401, /* 1E049 (122953) */
+    5402, /* 1E04A (122954) */
+    5403, /* 1E04B (122955) */
+    5404, /* 1E04C (122956) */
+    5405, /* 1E04D (122957) */
+    5406, /* 1E04E (122958) */
+    5407, /* 1E04F (122959) */
+    5408, /* 1E050 (122960) */
+    5409, /* 1E051 (122961) */
+    5410, /* 1E052 (122962) */
+    5411, /* 1E053 (122963) */
+    5412, /* 1E054 (122964) */
+    5413, /* 1E055 (122965) */
+    5414, /* 1E056 (122966) */
+    5415, /* 1E057 (122967) */
+    5416, /* 1E058 (122968) */
+    5417, /* 1E059 (122969) */
+    5418, /* 1E05A (122970) */
+    5419, /* 1E05B (122971) */
+    5420, /* 1E05C (122972) */
+    5421, /* 1E05D (122973) */
+    5422, /* 1E05E (122974) */
+    5423, /* 1E05F (122975) */
+    5424, /* 1E060 (122976) */
+    5425, /* 1E061 (122977) */
+    5426, /* 1E062 (122978) */
+    5427, /* 1E063 (122979) */
+    5428, /* 1E064 (122980) */
+    5429, /* 1E065 (122981) */
+    5430, /* 1E066 (122982) */
+    5431, /* 1E067 (122983) */
+    5432, /* 1E068 (122984) */
+    5433, /* 1E069 (122985) */
+    5434, /* 1E06A (122986) */
+    5435, /* 1E06B (122987) */
+    5436, /* 1E06C (122988) */
+    5437, /* 1E06D (122989) */
     56, /* 1E06E (122990) */
     56, /* 1E06F (122991) */
     56, /* 1E070 (122992) */
@@ -102470,60 +102704,60 @@ static const uint32_t lxb_unicode_table_map_110576_205744[95168] =
     56, /* 1E6BD (124605) */
     56, /* 1E6BE (124606) */
     56, /* 1E6BF (124607) */
-    56, /* 1E6C0 (124608) */
-    56, /* 1E6C1 (124609) */
-    56, /* 1E6C2 (124610) */
-    56, /* 1E6C3 (124611) */
-    56, /* 1E6C4 (124612) */
-    56, /* 1E6C5 (124613) */
-    56, /* 1E6C6 (124614) */
-    56, /* 1E6C7 (124615) */
-    56, /* 1E6C8 (124616) */
-    56, /* 1E6C9 (124617) */
-    56, /* 1E6CA (124618) */
-    56, /* 1E6CB (124619) */
-    56, /* 1E6CC (124620) */
-    56, /* 1E6CD (124621) */
-    56, /* 1E6CE (124622) */
-    56, /* 1E6CF (124623) */
-    56, /* 1E6D0 (124624) */
-    56, /* 1E6D1 (124625) */
-    56, /* 1E6D2 (124626) */
-    56, /* 1E6D3 (124627) */
-    56, /* 1E6D4 (124628) */
-    56, /* 1E6D5 (124629) */
-    56, /* 1E6D6 (124630) */
-    56, /* 1E6D7 (124631) */
-    56, /* 1E6D8 (124632) */
-    56, /* 1E6D9 (124633) */
-    56, /* 1E6DA (124634) */
-    56, /* 1E6DB (124635) */
-    56, /* 1E6DC (124636) */
-    56, /* 1E6DD (124637) */
-    56, /* 1E6DE (124638) */
+    1, /* 1E6C0 (124608) */
+    1, /* 1E6C1 (124609) */
+    1, /* 1E6C2 (124610) */
+    1, /* 1E6C3 (124611) */
+    1, /* 1E6C4 (124612) */
+    1, /* 1E6C5 (124613) */
+    1, /* 1E6C6 (124614) */
+    1, /* 1E6C7 (124615) */
+    1, /* 1E6C8 (124616) */
+    1, /* 1E6C9 (124617) */
+    1, /* 1E6CA (124618) */
+    1, /* 1E6CB (124619) */
+    1, /* 1E6CC (124620) */
+    1, /* 1E6CD (124621) */
+    1, /* 1E6CE (124622) */
+    1, /* 1E6CF (124623) */
+    1, /* 1E6D0 (124624) */
+    1, /* 1E6D1 (124625) */
+    1, /* 1E6D2 (124626) */
+    1, /* 1E6D3 (124627) */
+    1, /* 1E6D4 (124628) */
+    1, /* 1E6D5 (124629) */
+    1, /* 1E6D6 (124630) */
+    1, /* 1E6D7 (124631) */
+    1, /* 1E6D8 (124632) */
+    1, /* 1E6D9 (124633) */
+    1, /* 1E6DA (124634) */
+    1, /* 1E6DB (124635) */
+    1, /* 1E6DC (124636) */
+    1, /* 1E6DD (124637) */
+    1, /* 1E6DE (124638) */
     56, /* 1E6DF (124639) */
-    56, /* 1E6E0 (124640) */
-    56, /* 1E6E1 (124641) */
-    56, /* 1E6E2 (124642) */
-    56, /* 1E6E3 (124643) */
-    56, /* 1E6E4 (124644) */
-    56, /* 1E6E5 (124645) */
-    56, /* 1E6E6 (124646) */
-    56, /* 1E6E7 (124647) */
-    56, /* 1E6E8 (124648) */
-    56, /* 1E6E9 (124649) */
-    56, /* 1E6EA (124650) */
-    56, /* 1E6EB (124651) */
-    56, /* 1E6EC (124652) */
-    56, /* 1E6ED (124653) */
-    56, /* 1E6EE (124654) */
-    56, /* 1E6EF (124655) */
-    56, /* 1E6F0 (124656) */
-    56, /* 1E6F1 (124657) */
-    56, /* 1E6F2 (124658) */
-    56, /* 1E6F3 (124659) */
-    56, /* 1E6F4 (124660) */
-    56, /* 1E6F5 (124661) */
+    1, /* 1E6E0 (124640) */
+    1, /* 1E6E1 (124641) */
+    1, /* 1E6E2 (124642) */
+    431, /* 1E6E3 (124643) */
+    1, /* 1E6E4 (124644) */
+    1, /* 1E6E5 (124645) */
+    431, /* 1E6E6 (124646) */
+    1, /* 1E6E7 (124647) */
+    1, /* 1E6E8 (124648) */
+    1, /* 1E6E9 (124649) */
+    1, /* 1E6EA (124650) */
+    1, /* 1E6EB (124651) */
+    1, /* 1E6EC (124652) */
+    1, /* 1E6ED (124653) */
+    431, /* 1E6EE (124654) */
+    431, /* 1E6EF (124655) */
+    1, /* 1E6F0 (124656) */
+    1, /* 1E6F1 (124657) */
+    1, /* 1E6F2 (124658) */
+    1, /* 1E6F3 (124659) */
+    1, /* 1E6F4 (124660) */
+    431, /* 1E6F5 (124661) */
     56, /* 1E6F6 (124662) */
     56, /* 1E6F7 (124663) */
     56, /* 1E6F8 (124664) */
@@ -102532,8 +102766,8 @@ static const uint32_t lxb_unicode_table_map_110576_205744[95168] =
     56, /* 1E6FB (124667) */
     56, /* 1E6FC (124668) */
     56, /* 1E6FD (124669) */
-    56, /* 1E6FE (124670) */
-    56, /* 1E6FF (124671) */
+    1, /* 1E6FE (124670) */
+    1, /* 1E6FF (124671) */
     56, /* 1E700 (124672) */
     56, /* 1E701 (124673) */
     56, /* 1E702 (124674) */
@@ -103046,40 +103280,40 @@ static const uint32_t lxb_unicode_table_map_110576_205744[95168] =
     56, /* 1E8FD (125181) */
     56, /* 1E8FE (125182) */
     56, /* 1E8FF (125183) */
-    5409, /* 1E900 (125184) */
-    5410, /* 1E901 (125185) */
-    5411, /* 1E902 (125186) */
-    5412, /* 1E903 (125187) */
-    5413, /* 1E904 (125188) */
-    5414, /* 1E905 (125189) */
-    5415, /* 1E906 (125190) */
-    5416, /* 1E907 (125191) */
-    5417, /* 1E908 (125192) */
-    5418, /* 1E909 (125193) */
-    5419, /* 1E90A (125194) */
-    5420, /* 1E90B (125195) */
-    5421, /* 1E90C (125196) */
-    5422, /* 1E90D (125197) */
-    5423, /* 1E90E (125198) */
-    5424, /* 1E90F (125199) */
-    5425, /* 1E910 (125200) */
-    5426, /* 1E911 (125201) */
-    5427, /* 1E912 (125202) */
-    5428, /* 1E913 (125203) */
-    5429, /* 1E914 (125204) */
-    5430, /* 1E915 (125205) */
-    5431, /* 1E916 (125206) */
-    5432, /* 1E917 (125207) */
-    5433, /* 1E918 (125208) */
-    5434, /* 1E919 (125209) */
-    5435, /* 1E91A (125210) */
-    5436, /* 1E91B (125211) */
-    5437, /* 1E91C (125212) */
-    5438, /* 1E91D (125213) */
-    5439, /* 1E91E (125214) */
-    5440, /* 1E91F (125215) */
-    5441, /* 1E920 (125216) */
-    5442, /* 1E921 (125217) */
+    5438, /* 1E900 (125184) */
+    5439, /* 1E901 (125185) */
+    5440, /* 1E902 (125186) */
+    5441, /* 1E903 (125187) */
+    5442, /* 1E904 (125188) */
+    5443, /* 1E905 (125189) */
+    5444, /* 1E906 (125190) */
+    5445, /* 1E907 (125191) */
+    5446, /* 1E908 (125192) */
+    5447, /* 1E909 (125193) */
+    5448, /* 1E90A (125194) */
+    5449, /* 1E90B (125195) */
+    5450, /* 1E90C (125196) */
+    5451, /* 1E90D (125197) */
+    5452, /* 1E90E (125198) */
+    5453, /* 1E90F (125199) */
+    5454, /* 1E910 (125200) */
+    5455, /* 1E911 (125201) */
+    5456, /* 1E912 (125202) */
+    5457, /* 1E913 (125203) */
+    5458, /* 1E914 (125204) */
+    5459, /* 1E915 (125205) */
+    5460, /* 1E916 (125206) */
+    5461, /* 1E917 (125207) */
+    5462, /* 1E918 (125208) */
+    5463, /* 1E919 (125209) */
+    5464, /* 1E91A (125210) */
+    5465, /* 1E91B (125211) */
+    5466, /* 1E91C (125212) */
+    5467, /* 1E91D (125213) */
+    5468, /* 1E91E (125214) */
+    5469, /* 1E91F (125215) */
+    5470, /* 1E920 (125216) */
+    5471, /* 1E921 (125217) */
     1, /* 1E922 (125218) */
     1, /* 1E923 (125219) */
     1, /* 1E924 (125220) */
@@ -104326,194 +104560,194 @@ static const uint32_t lxb_unicode_table_map_110576_205744[95168] =
     56, /* 1EDFD (126461) */
     56, /* 1EDFE (126462) */
     56, /* 1EDFF (126463) */
-    5443, /* 1EE00 (126464) */
-    5444, /* 1EE01 (126465) */
-    5445, /* 1EE02 (126466) */
-    5446, /* 1EE03 (126467) */
+    5472, /* 1EE00 (126464) */
+    5473, /* 1EE01 (126465) */
+    5474, /* 1EE02 (126466) */
+    5475, /* 1EE03 (126467) */
     56, /* 1EE04 (126468) */
-    5447, /* 1EE05 (126469) */
-    5448, /* 1EE06 (126470) */
-    5449, /* 1EE07 (126471) */
-    5450, /* 1EE08 (126472) */
-    5451, /* 1EE09 (126473) */
-    5452, /* 1EE0A (126474) */
-    5453, /* 1EE0B (126475) */
-    5454, /* 1EE0C (126476) */
-    5455, /* 1EE0D (126477) */
-    5456, /* 1EE0E (126478) */
-    5457, /* 1EE0F (126479) */
-    5458, /* 1EE10 (126480) */
-    5459, /* 1EE11 (126481) */
-    5460, /* 1EE12 (126482) */
-    5461, /* 1EE13 (126483) */
-    5462, /* 1EE14 (126484) */
-    5463, /* 1EE15 (126485) */
-    5464, /* 1EE16 (126486) */
-    5465, /* 1EE17 (126487) */
-    5466, /* 1EE18 (126488) */
-    5467, /* 1EE19 (126489) */
-    5468, /* 1EE1A (126490) */
-    5469, /* 1EE1B (126491) */
-    5470, /* 1EE1C (126492) */
-    5471, /* 1EE1D (126493) */
-    5472, /* 1EE1E (126494) */
-    5473, /* 1EE1F (126495) */
+    5476, /* 1EE05 (126469) */
+    5477, /* 1EE06 (126470) */
+    5478, /* 1EE07 (126471) */
+    5479, /* 1EE08 (126472) */
+    5480, /* 1EE09 (126473) */
+    5481, /* 1EE0A (126474) */
+    5482, /* 1EE0B (126475) */
+    5483, /* 1EE0C (126476) */
+    5484, /* 1EE0D (126477) */
+    5485, /* 1EE0E (126478) */
+    5486, /* 1EE0F (126479) */
+    5487, /* 1EE10 (126480) */
+    5488, /* 1EE11 (126481) */
+    5489, /* 1EE12 (126482) */
+    5490, /* 1EE13 (126483) */
+    5491, /* 1EE14 (126484) */
+    5492, /* 1EE15 (126485) */
+    5493, /* 1EE16 (126486) */
+    5494, /* 1EE17 (126487) */
+    5495, /* 1EE18 (126488) */
+    5496, /* 1EE19 (126489) */
+    5497, /* 1EE1A (126490) */
+    5498, /* 1EE1B (126491) */
+    5499, /* 1EE1C (126492) */
+    5500, /* 1EE1D (126493) */
+    5501, /* 1EE1E (126494) */
+    5502, /* 1EE1F (126495) */
     56, /* 1EE20 (126496) */
-    5444, /* 1EE21 (126497) */
-    5445, /* 1EE22 (126498) */
+    5473, /* 1EE21 (126497) */
+    5474, /* 1EE22 (126498) */
     56, /* 1EE23 (126499) */
-    5474, /* 1EE24 (126500) */
+    5503, /* 1EE24 (126500) */
     56, /* 1EE25 (126501) */
     56, /* 1EE26 (126502) */
-    5449, /* 1EE27 (126503) */
+    5478, /* 1EE27 (126503) */
     56, /* 1EE28 (126504) */
-    5451, /* 1EE29 (126505) */
-    5452, /* 1EE2A (126506) */
-    5453, /* 1EE2B (126507) */
-    5454, /* 1EE2C (126508) */
-    5455, /* 1EE2D (126509) */
-    5456, /* 1EE2E (126510) */
-    5457, /* 1EE2F (126511) */
-    5458, /* 1EE30 (126512) */
-    5459, /* 1EE31 (126513) */
-    5460, /* 1EE32 (126514) */
+    5480, /* 1EE29 (126505) */
+    5481, /* 1EE2A (126506) */
+    5482, /* 1EE2B (126507) */
+    5483, /* 1EE2C (126508) */
+    5484, /* 1EE2D (126509) */
+    5485, /* 1EE2E (126510) */
+    5486, /* 1EE2F (126511) */
+    5487, /* 1EE30 (126512) */
+    5488, /* 1EE31 (126513) */
+    5489, /* 1EE32 (126514) */
     56, /* 1EE33 (126515) */
-    5462, /* 1EE34 (126516) */
-    5463, /* 1EE35 (126517) */
-    5464, /* 1EE36 (126518) */
-    5465, /* 1EE37 (126519) */
+    5491, /* 1EE34 (126516) */
+    5492, /* 1EE35 (126517) */
+    5493, /* 1EE36 (126518) */
+    5494, /* 1EE37 (126519) */
     56, /* 1EE38 (126520) */
-    5467, /* 1EE39 (126521) */
+    5496, /* 1EE39 (126521) */
     56, /* 1EE3A (126522) */
-    5469, /* 1EE3B (126523) */
+    5498, /* 1EE3B (126523) */
     56, /* 1EE3C (126524) */
     56, /* 1EE3D (126525) */
     56, /* 1EE3E (126526) */
     56, /* 1EE3F (126527) */
     56, /* 1EE40 (126528) */
     56, /* 1EE41 (126529) */
-    5445, /* 1EE42 (126530) */
+    5474, /* 1EE42 (126530) */
     56, /* 1EE43 (126531) */
     56, /* 1EE44 (126532) */
     56, /* 1EE45 (126533) */
     56, /* 1EE46 (126534) */
-    5449, /* 1EE47 (126535) */
+    5478, /* 1EE47 (126535) */
     56, /* 1EE48 (126536) */
-    5451, /* 1EE49 (126537) */
+    5480, /* 1EE49 (126537) */
     56, /* 1EE4A (126538) */
-    5453, /* 1EE4B (126539) */
+    5482, /* 1EE4B (126539) */
     56, /* 1EE4C (126540) */
-    5455, /* 1EE4D (126541) */
-    5456, /* 1EE4E (126542) */
-    5457, /* 1EE4F (126543) */
+    5484, /* 1EE4D (126541) */
+    5485, /* 1EE4E (126542) */
+    5486, /* 1EE4F (126543) */
     56, /* 1EE50 (126544) */
-    5459, /* 1EE51 (126545) */
-    5460, /* 1EE52 (126546) */
+    5488, /* 1EE51 (126545) */
+    5489, /* 1EE52 (126546) */
     56, /* 1EE53 (126547) */
-    5462, /* 1EE54 (126548) */
+    5491, /* 1EE54 (126548) */
     56, /* 1EE55 (126549) */
     56, /* 1EE56 (126550) */
-    5465, /* 1EE57 (126551) */
+    5494, /* 1EE57 (126551) */
     56, /* 1EE58 (126552) */
-    5467, /* 1EE59 (126553) */
+    5496, /* 1EE59 (126553) */
     56, /* 1EE5A (126554) */
-    5469, /* 1EE5B (126555) */
+    5498, /* 1EE5B (126555) */
     56, /* 1EE5C (126556) */
-    5471, /* 1EE5D (126557) */
+    5500, /* 1EE5D (126557) */
     56, /* 1EE5E (126558) */
-    5473, /* 1EE5F (126559) */
+    5502, /* 1EE5F (126559) */
     56, /* 1EE60 (126560) */
-    5444, /* 1EE61 (126561) */
-    5445, /* 1EE62 (126562) */
+    5473, /* 1EE61 (126561) */
+    5474, /* 1EE62 (126562) */
     56, /* 1EE63 (126563) */
-    5474, /* 1EE64 (126564) */
+    5503, /* 1EE64 (126564) */
     56, /* 1EE65 (126565) */
     56, /* 1EE66 (126566) */
-    5449, /* 1EE67 (126567) */
-    5450, /* 1EE68 (126568) */
-    5451, /* 1EE69 (126569) */
-    5452, /* 1EE6A (126570) */
+    5478, /* 1EE67 (126567) */
+    5479, /* 1EE68 (126568) */
+    5480, /* 1EE69 (126569) */
+    5481, /* 1EE6A (126570) */
     56, /* 1EE6B (126571) */
-    5454, /* 1EE6C (126572) */
-    5455, /* 1EE6D (126573) */
-    5456, /* 1EE6E (126574) */
-    5457, /* 1EE6F (126575) */
-    5458, /* 1EE70 (126576) */
-    5459, /* 1EE71 (126577) */
-    5460, /* 1EE72 (126578) */
+    5483, /* 1EE6C (126572) */
+    5484, /* 1EE6D (126573) */
+    5485, /* 1EE6E (126574) */
+    5486, /* 1EE6F (126575) */
+    5487, /* 1EE70 (126576) */
+    5488, /* 1EE71 (126577) */
+    5489, /* 1EE72 (126578) */
     56, /* 1EE73 (126579) */
-    5462, /* 1EE74 (126580) */
-    5463, /* 1EE75 (126581) */
-    5464, /* 1EE76 (126582) */
-    5465, /* 1EE77 (126583) */
+    5491, /* 1EE74 (126580) */
+    5492, /* 1EE75 (126581) */
+    5493, /* 1EE76 (126582) */
+    5494, /* 1EE77 (126583) */
     56, /* 1EE78 (126584) */
-    5467, /* 1EE79 (126585) */
-    5468, /* 1EE7A (126586) */
-    5469, /* 1EE7B (126587) */
-    5470, /* 1EE7C (126588) */
+    5496, /* 1EE79 (126585) */
+    5497, /* 1EE7A (126586) */
+    5498, /* 1EE7B (126587) */
+    5499, /* 1EE7C (126588) */
     56, /* 1EE7D (126589) */
-    5472, /* 1EE7E (126590) */
+    5501, /* 1EE7E (126590) */
     56, /* 1EE7F (126591) */
-    5443, /* 1EE80 (126592) */
-    5444, /* 1EE81 (126593) */
-    5445, /* 1EE82 (126594) */
-    5446, /* 1EE83 (126595) */
-    5474, /* 1EE84 (126596) */
-    5447, /* 1EE85 (126597) */
-    5448, /* 1EE86 (126598) */
-    5449, /* 1EE87 (126599) */
-    5450, /* 1EE88 (126600) */
-    5451, /* 1EE89 (126601) */
+    5472, /* 1EE80 (126592) */
+    5473, /* 1EE81 (126593) */
+    5474, /* 1EE82 (126594) */
+    5475, /* 1EE83 (126595) */
+    5503, /* 1EE84 (126596) */
+    5476, /* 1EE85 (126597) */
+    5477, /* 1EE86 (126598) */
+    5478, /* 1EE87 (126599) */
+    5479, /* 1EE88 (126600) */
+    5480, /* 1EE89 (126601) */
     56, /* 1EE8A (126602) */
-    5453, /* 1EE8B (126603) */
-    5454, /* 1EE8C (126604) */
-    5455, /* 1EE8D (126605) */
-    5456, /* 1EE8E (126606) */
-    5457, /* 1EE8F (126607) */
-    5458, /* 1EE90 (126608) */
-    5459, /* 1EE91 (126609) */
-    5460, /* 1EE92 (126610) */
-    5461, /* 1EE93 (126611) */
-    5462, /* 1EE94 (126612) */
-    5463, /* 1EE95 (126613) */
-    5464, /* 1EE96 (126614) */
-    5465, /* 1EE97 (126615) */
-    5466, /* 1EE98 (126616) */
-    5467, /* 1EE99 (126617) */
-    5468, /* 1EE9A (126618) */
-    5469, /* 1EE9B (126619) */
+    5482, /* 1EE8B (126603) */
+    5483, /* 1EE8C (126604) */
+    5484, /* 1EE8D (126605) */
+    5485, /* 1EE8E (126606) */
+    5486, /* 1EE8F (126607) */
+    5487, /* 1EE90 (126608) */
+    5488, /* 1EE91 (126609) */
+    5489, /* 1EE92 (126610) */
+    5490, /* 1EE93 (126611) */
+    5491, /* 1EE94 (126612) */
+    5492, /* 1EE95 (126613) */
+    5493, /* 1EE96 (126614) */
+    5494, /* 1EE97 (126615) */
+    5495, /* 1EE98 (126616) */
+    5496, /* 1EE99 (126617) */
+    5497, /* 1EE9A (126618) */
+    5498, /* 1EE9B (126619) */
     56, /* 1EE9C (126620) */
     56, /* 1EE9D (126621) */
     56, /* 1EE9E (126622) */
     56, /* 1EE9F (126623) */
     56, /* 1EEA0 (126624) */
-    5444, /* 1EEA1 (126625) */
-    5445, /* 1EEA2 (126626) */
-    5446, /* 1EEA3 (126627) */
+    5473, /* 1EEA1 (126625) */
+    5474, /* 1EEA2 (126626) */
+    5475, /* 1EEA3 (126627) */
     56, /* 1EEA4 (126628) */
-    5447, /* 1EEA5 (126629) */
-    5448, /* 1EEA6 (126630) */
-    5449, /* 1EEA7 (126631) */
-    5450, /* 1EEA8 (126632) */
-    5451, /* 1EEA9 (126633) */
+    5476, /* 1EEA5 (126629) */
+    5477, /* 1EEA6 (126630) */
+    5478, /* 1EEA7 (126631) */
+    5479, /* 1EEA8 (126632) */
+    5480, /* 1EEA9 (126633) */
     56, /* 1EEAA (126634) */
-    5453, /* 1EEAB (126635) */
-    5454, /* 1EEAC (126636) */
-    5455, /* 1EEAD (126637) */
-    5456, /* 1EEAE (126638) */
-    5457, /* 1EEAF (126639) */
-    5458, /* 1EEB0 (126640) */
-    5459, /* 1EEB1 (126641) */
-    5460, /* 1EEB2 (126642) */
-    5461, /* 1EEB3 (126643) */
-    5462, /* 1EEB4 (126644) */
-    5463, /* 1EEB5 (126645) */
-    5464, /* 1EEB6 (126646) */
-    5465, /* 1EEB7 (126647) */
-    5466, /* 1EEB8 (126648) */
-    5467, /* 1EEB9 (126649) */
-    5468, /* 1EEBA (126650) */
-    5469, /* 1EEBB (126651) */
+    5482, /* 1EEAB (126635) */
+    5483, /* 1EEAC (126636) */
+    5484, /* 1EEAD (126637) */
+    5485, /* 1EEAE (126638) */
+    5486, /* 1EEAF (126639) */
+    5487, /* 1EEB0 (126640) */
+    5488, /* 1EEB1 (126641) */
+    5489, /* 1EEB2 (126642) */
+    5490, /* 1EEB3 (126643) */
+    5491, /* 1EEB4 (126644) */
+    5492, /* 1EEB5 (126645) */
+    5493, /* 1EEB6 (126646) */
+    5494, /* 1EEB7 (126647) */
+    5495, /* 1EEB8 (126648) */
+    5496, /* 1EEB9 (126649) */
+    5497, /* 1EEBA (126650) */
+    5498, /* 1EEBB (126651) */
     56, /* 1EEBC (126652) */
     56, /* 1EEBD (126653) */
     56, /* 1EEBE (126654) */
@@ -105094,86 +105328,86 @@ static const uint32_t lxb_unicode_table_map_110576_205744[95168] =
     56, /* 1F0FD (127229) */
     56, /* 1F0FE (127230) */
     56, /* 1F0FF (127231) */
-    5475, /* 1F100 (127232) */
-    5476, /* 1F101 (127233) */
-    5477, /* 1F102 (127234) */
-    5478, /* 1F103 (127235) */
-    5479, /* 1F104 (127236) */
-    5480, /* 1F105 (127237) */
-    5481, /* 1F106 (127238) */
-    5482, /* 1F107 (127239) */
-    5483, /* 1F108 (127240) */
-    5484, /* 1F109 (127241) */
-    5485, /* 1F10A (127242) */
+    5504, /* 1F100 (127232) */
+    5505, /* 1F101 (127233) */
+    5506, /* 1F102 (127234) */
+    5507, /* 1F103 (127235) */
+    5508, /* 1F104 (127236) */
+    5509, /* 1F105 (127237) */
+    5510, /* 1F106 (127238) */
+    5511, /* 1F107 (127239) */
+    5512, /* 1F108 (127240) */
+    5513, /* 1F109 (127241) */
+    5514, /* 1F10A (127242) */
     1, /* 1F10B (127243) */
     1, /* 1F10C (127244) */
     1, /* 1F10D (127245) */
     1, /* 1F10E (127246) */
     1, /* 1F10F (127247) */
-    5486, /* 1F110 (127248) */
-    5487, /* 1F111 (127249) */
-    5488, /* 1F112 (127250) */
-    5489, /* 1F113 (127251) */
-    5490, /* 1F114 (127252) */
-    5491, /* 1F115 (127253) */
-    5492, /* 1F116 (127254) */
-    5493, /* 1F117 (127255) */
-    5494, /* 1F118 (127256) */
-    5495, /* 1F119 (127257) */
-    5496, /* 1F11A (127258) */
-    5497, /* 1F11B (127259) */
-    5498, /* 1F11C (127260) */
-    5499, /* 1F11D (127261) */
-    5500, /* 1F11E (127262) */
-    5501, /* 1F11F (127263) */
-    5502, /* 1F120 (127264) */
-    5503, /* 1F121 (127265) */
-    5504, /* 1F122 (127266) */
-    5505, /* 1F123 (127267) */
-    5506, /* 1F124 (127268) */
-    5507, /* 1F125 (127269) */
-    5508, /* 1F126 (127270) */
-    5509, /* 1F127 (127271) */
-    5510, /* 1F128 (127272) */
-    5511, /* 1F129 (127273) */
-    5512, /* 1F12A (127274) */
+    5515, /* 1F110 (127248) */
+    5516, /* 1F111 (127249) */
+    5517, /* 1F112 (127250) */
+    5518, /* 1F113 (127251) */
+    5519, /* 1F114 (127252) */
+    5520, /* 1F115 (127253) */
+    5521, /* 1F116 (127254) */
+    5522, /* 1F117 (127255) */
+    5523, /* 1F118 (127256) */
+    5524, /* 1F119 (127257) */
+    5525, /* 1F11A (127258) */
+    5526, /* 1F11B (127259) */
+    5527, /* 1F11C (127260) */
+    5528, /* 1F11D (127261) */
+    5529, /* 1F11E (127262) */
+    5530, /* 1F11F (127263) */
+    5531, /* 1F120 (127264) */
+    5532, /* 1F121 (127265) */
+    5533, /* 1F122 (127266) */
+    5534, /* 1F123 (127267) */
+    5535, /* 1F124 (127268) */
+    5536, /* 1F125 (127269) */
+    5537, /* 1F126 (127270) */
+    5538, /* 1F127 (127271) */
+    5539, /* 1F128 (127272) */
+    5540, /* 1F129 (127273) */
+    5541, /* 1F12A (127274) */
     2005, /* 1F12B (127275) */
     2020, /* 1F12C (127276) */
-    5513, /* 1F12D (127277) */
-    5514, /* 1F12E (127278) */
+    5542, /* 1F12D (127277) */
+    5543, /* 1F12E (127278) */
     1, /* 1F12F (127279) */
-    5515, /* 1F130 (127280) */
-    5516, /* 1F131 (127281) */
-    5517, /* 1F132 (127282) */
-    5518, /* 1F133 (127283) */
-    5519, /* 1F134 (127284) */
-    5520, /* 1F135 (127285) */
-    5521, /* 1F136 (127286) */
-    5522, /* 1F137 (127287) */
-    5523, /* 1F138 (127288) */
-    5524, /* 1F139 (127289) */
-    5525, /* 1F13A (127290) */
-    5526, /* 1F13B (127291) */
-    5527, /* 1F13C (127292) */
-    5528, /* 1F13D (127293) */
-    5529, /* 1F13E (127294) */
-    5530, /* 1F13F (127295) */
-    5531, /* 1F140 (127296) */
-    5532, /* 1F141 (127297) */
-    5533, /* 1F142 (127298) */
-    5534, /* 1F143 (127299) */
-    5535, /* 1F144 (127300) */
-    5536, /* 1F145 (127301) */
-    5537, /* 1F146 (127302) */
-    5538, /* 1F147 (127303) */
-    5539, /* 1F148 (127304) */
-    5540, /* 1F149 (127305) */
-    5541, /* 1F14A (127306) */
+    5544, /* 1F130 (127280) */
+    5545, /* 1F131 (127281) */
+    5546, /* 1F132 (127282) */
+    5547, /* 1F133 (127283) */
+    5548, /* 1F134 (127284) */
+    5549, /* 1F135 (127285) */
+    5550, /* 1F136 (127286) */
+    5551, /* 1F137 (127287) */
+    5552, /* 1F138 (127288) */
+    5553, /* 1F139 (127289) */
+    5554, /* 1F13A (127290) */
+    5555, /* 1F13B (127291) */
+    5556, /* 1F13C (127292) */
+    5557, /* 1F13D (127293) */
+    5558, /* 1F13E (127294) */
+    5559, /* 1F13F (127295) */
+    5560, /* 1F140 (127296) */
+    5561, /* 1F141 (127297) */
+    5562, /* 1F142 (127298) */
+    5563, /* 1F143 (127299) */
+    5564, /* 1F144 (127300) */
+    5565, /* 1F145 (127301) */
+    5566, /* 1F146 (127302) */
+    5567, /* 1F147 (127303) */
+    5568, /* 1F148 (127304) */
+    5569, /* 1F149 (127305) */
+    5570, /* 1F14A (127306) */
     3053, /* 1F14B (127307) */
-    5542, /* 1F14C (127308) */
-    5543, /* 1F14D (127309) */
-    5544, /* 1F14E (127310) */
-    5545, /* 1F14F (127311) */
+    5571, /* 1F14C (127308) */
+    5572, /* 1F14D (127309) */
+    5573, /* 1F14E (127310) */
+    5574, /* 1F14F (127311) */
     1, /* 1F150 (127312) */
     1, /* 1F151 (127313) */
     1, /* 1F152 (127314) */
@@ -105200,9 +105434,9 @@ static const uint32_t lxb_unicode_table_map_110576_205744[95168] =
     1, /* 1F167 (127335) */
     1, /* 1F168 (127336) */
     1, /* 1F169 (127337) */
-    5546, /* 1F16A (127338) */
-    5547, /* 1F16B (127339) */
-    5548, /* 1F16C (127340) */
+    5575, /* 1F16A (127338) */
+    5576, /* 1F16B (127339) */
+    5577, /* 1F16C (127340) */
     1, /* 1F16D (127341) */
     1, /* 1F16E (127342) */
     1, /* 1F16F (127343) */
@@ -105238,7 +105472,7 @@ static const uint32_t lxb_unicode_table_map_110576_205744[95168] =
     1, /* 1F18D (127373) */
     1, /* 1F18E (127374) */
     1, /* 1F18F (127375) */
-    5549, /* 1F190 (127376) */
+    5578, /* 1F190 (127376) */
     1, /* 1F191 (127377) */
     1, /* 1F192 (127378) */
     1, /* 1F193 (127379) */
@@ -105350,9 +105584,9 @@ static const uint32_t lxb_unicode_table_map_110576_205744[95168] =
     1, /* 1F1FD (127485) */
     1, /* 1F1FE (127486) */
     1, /* 1F1FF (127487) */
-    5550, /* 1F200 (127488) */
-    5551, /* 1F201 (127489) */
-    5552, /* 1F202 (127490) */
+    5579, /* 1F200 (127488) */
+    5580, /* 1F201 (127489) */
+    5581, /* 1F202 (127490) */
     56, /* 1F203 (127491) */
     56, /* 1F204 (127492) */
     56, /* 1F205 (127493) */
@@ -105366,63 +105600,63 @@ static const uint32_t lxb_unicode_table_map_110576_205744[95168] =
     56, /* 1F20D (127501) */
     56, /* 1F20E (127502) */
     56, /* 1F20F (127503) */
-    5553, /* 1F210 (127504) */
-    5554, /* 1F211 (127505) */
-    5555, /* 1F212 (127506) */
-    5556, /* 1F213 (127507) */
-    5557, /* 1F214 (127508) */
-    5558, /* 1F215 (127509) */
-    5559, /* 1F216 (127510) */
-    5560, /* 1F217 (127511) */
-    5561, /* 1F218 (127512) */
-    5562, /* 1F219 (127513) */
-    5563, /* 1F21A (127514) */
-    5564, /* 1F21B (127515) */
-    5565, /* 1F21C (127516) */
-    5566, /* 1F21D (127517) */
-    5567, /* 1F21E (127518) */
-    5568, /* 1F21F (127519) */
-    5569, /* 1F220 (127520) */
-    5570, /* 1F221 (127521) */
-    5571, /* 1F222 (127522) */
-    5572, /* 1F223 (127523) */
-    5573, /* 1F224 (127524) */
-    5574, /* 1F225 (127525) */
-    5575, /* 1F226 (127526) */
-    5576, /* 1F227 (127527) */
-    5577, /* 1F228 (127528) */
-    5578, /* 1F229 (127529) */
-    5579, /* 1F22A (127530) */
-    5580, /* 1F22B (127531) */
-    5581, /* 1F22C (127532) */
-    5582, /* 1F22D (127533) */
-    5583, /* 1F22E (127534) */
-    5584, /* 1F22F (127535) */
-    5585, /* 1F230 (127536) */
-    5586, /* 1F231 (127537) */
-    5587, /* 1F232 (127538) */
-    5588, /* 1F233 (127539) */
-    5589, /* 1F234 (127540) */
-    5590, /* 1F235 (127541) */
-    5591, /* 1F236 (127542) */
-    5592, /* 1F237 (127543) */
-    5593, /* 1F238 (127544) */
-    5594, /* 1F239 (127545) */
-    5595, /* 1F23A (127546) */
-    5596, /* 1F23B (127547) */
+    5582, /* 1F210 (127504) */
+    5583, /* 1F211 (127505) */
+    5584, /* 1F212 (127506) */
+    5585, /* 1F213 (127507) */
+    5586, /* 1F214 (127508) */
+    5587, /* 1F215 (127509) */
+    5588, /* 1F216 (127510) */
+    5589, /* 1F217 (127511) */
+    5590, /* 1F218 (127512) */
+    5591, /* 1F219 (127513) */
+    5592, /* 1F21A (127514) */
+    5593, /* 1F21B (127515) */
+    5594, /* 1F21C (127516) */
+    5595, /* 1F21D (127517) */
+    5596, /* 1F21E (127518) */
+    5597, /* 1F21F (127519) */
+    5598, /* 1F220 (127520) */
+    5599, /* 1F221 (127521) */
+    5600, /* 1F222 (127522) */
+    5601, /* 1F223 (127523) */
+    5602, /* 1F224 (127524) */
+    5603, /* 1F225 (127525) */
+    5604, /* 1F226 (127526) */
+    5605, /* 1F227 (127527) */
+    5606, /* 1F228 (127528) */
+    5607, /* 1F229 (127529) */
+    5608, /* 1F22A (127530) */
+    5609, /* 1F22B (127531) */
+    5610, /* 1F22C (127532) */
+    5611, /* 1F22D (127533) */
+    5612, /* 1F22E (127534) */
+    5613, /* 1F22F (127535) */
+    5614, /* 1F230 (127536) */
+    5615, /* 1F231 (127537) */
+    5616, /* 1F232 (127538) */
+    5617, /* 1F233 (127539) */
+    5618, /* 1F234 (127540) */
+    5619, /* 1F235 (127541) */
+    5620, /* 1F236 (127542) */
+    5621, /* 1F237 (127543) */
+    5622, /* 1F238 (127544) */
+    5623, /* 1F239 (127545) */
+    5624, /* 1F23A (127546) */
+    5625, /* 1F23B (127547) */
     56, /* 1F23C (127548) */
     56, /* 1F23D (127549) */
     56, /* 1F23E (127550) */
     56, /* 1F23F (127551) */
-    5597, /* 1F240 (127552) */
-    5598, /* 1F241 (127553) */
-    5599, /* 1F242 (127554) */
-    5600, /* 1F243 (127555) */
-    5601, /* 1F244 (127556) */
-    5602, /* 1F245 (127557) */
-    5603, /* 1F246 (127558) */
-    5604, /* 1F247 (127559) */
-    5605, /* 1F248 (127560) */
+    5626, /* 1F240 (127552) */
+    5627, /* 1F241 (127553) */
+    5628, /* 1F242 (127554) */
+    5629, /* 1F243 (127555) */
+    5630, /* 1F244 (127556) */
+    5631, /* 1F245 (127557) */
+    5632, /* 1F246 (127558) */
+    5633, /* 1F247 (127559) */
+    5634, /* 1F248 (127560) */
     56, /* 1F249 (127561) */
     56, /* 1F24A (127562) */
     56, /* 1F24B (127563) */
@@ -105430,8 +105664,8 @@ static const uint32_t lxb_unicode_table_map_110576_205744[95168] =
     56, /* 1F24D (127565) */
     56, /* 1F24E (127566) */
     56, /* 1F24F (127567) */
-    5606, /* 1F250 (127568) */
-    5607, /* 1F251 (127569) */
+    5635, /* 1F250 (127568) */
+    5636, /* 1F251 (127569) */
     56, /* 1F252 (127570) */
     56, /* 1F253 (127571) */
     56, /* 1F254 (127572) */
@@ -106590,7 +106824,7 @@ static const uint32_t lxb_unicode_table_map_110576_205744[95168] =
     1, /* 1F6D5 (128725) */
     1, /* 1F6D6 (128726) */
     1, /* 1F6D7 (128727) */
-    56, /* 1F6D8 (128728) */
+    1, /* 1F6D8 (128728) */
     56, /* 1F6D9 (128729) */
     56, /* 1F6DA (128730) */
     56, /* 1F6DB (128731) */
@@ -106749,10 +106983,10 @@ static const uint32_t lxb_unicode_table_map_110576_205744[95168] =
     1, /* 1F774 (128884) */
     1, /* 1F775 (128885) */
     1, /* 1F776 (128886) */
-    56, /* 1F777 (128887) */
-    56, /* 1F778 (128888) */
-    56, /* 1F779 (128889) */
-    56, /* 1F77A (128890) */
+    1, /* 1F777 (128887) */
+    1, /* 1F778 (128888) */
+    1, /* 1F779 (128889) */
+    1, /* 1F77A (128890) */
     1, /* 1F77B (128891) */
     1, /* 1F77C (128892) */
     1, /* 1F77D (128893) */
@@ -107094,15 +107328,15 @@ static const uint32_t lxb_unicode_table_map_110576_205744[95168] =
     56, /* 1F8CD (129229) */
     56, /* 1F8CE (129230) */
     56, /* 1F8CF (129231) */
-    56, /* 1F8D0 (129232) */
-    56, /* 1F8D1 (129233) */
-    56, /* 1F8D2 (129234) */
-    56, /* 1F8D3 (129235) */
-    56, /* 1F8D4 (129236) */
-    56, /* 1F8D5 (129237) */
-    56, /* 1F8D6 (129238) */
-    56, /* 1F8D7 (129239) */
-    56, /* 1F8D8 (129240) */
+    1, /* 1F8D0 (129232) */
+    1, /* 1F8D1 (129233) */
+    1, /* 1F8D2 (129234) */
+    1, /* 1F8D3 (129235) */
+    1, /* 1F8D4 (129236) */
+    1, /* 1F8D5 (129237) */
+    1, /* 1F8D6 (129238) */
+    1, /* 1F8D7 (129239) */
+    1, /* 1F8D8 (129240) */
     56, /* 1F8D9 (129241) */
     56, /* 1F8DA (129242) */
     56, /* 1F8DB (129243) */
@@ -107482,10 +107716,10 @@ static const uint32_t lxb_unicode_table_map_110576_205744[95168] =
     1, /* 1FA51 (129617) */
     1, /* 1FA52 (129618) */
     1, /* 1FA53 (129619) */
-    56, /* 1FA54 (129620) */
-    56, /* 1FA55 (129621) */
-    56, /* 1FA56 (129622) */
-    56, /* 1FA57 (129623) */
+    1, /* 1FA54 (129620) */
+    1, /* 1FA55 (129621) */
+    1, /* 1FA56 (129622) */
+    1, /* 1FA57 (129623) */
     56, /* 1FA58 (129624) */
     56, /* 1FA59 (129625) */
     56, /* 1FA5A (129626) */
@@ -107536,11 +107770,11 @@ static const uint32_t lxb_unicode_table_map_110576_205744[95168] =
     1, /* 1FA87 (129671) */
     1, /* 1FA88 (129672) */
     1, /* 1FA89 (129673) */
-    56, /* 1FA8A (129674) */
+    1, /* 1FA8A (129674) */
     56, /* 1FA8B (129675) */
     56, /* 1FA8C (129676) */
     56, /* 1FA8D (129677) */
-    56, /* 1FA8E (129678) */
+    1, /* 1FA8E (129678) */
     1, /* 1FA8F (129679) */
     1, /* 1FA90 (129680) */
     1, /* 1FA91 (129681) */
@@ -107598,12 +107832,12 @@ static const uint32_t lxb_unicode_table_map_110576_205744[95168] =
     1, /* 1FAC5 (129733) */
     1, /* 1FAC6 (129734) */
     56, /* 1FAC7 (129735) */
-    56, /* 1FAC8 (129736) */
+    1, /* 1FAC8 (129736) */
     56, /* 1FAC9 (129737) */
     56, /* 1FACA (129738) */
     56, /* 1FACB (129739) */
     56, /* 1FACC (129740) */
-    56, /* 1FACD (129741) */
+    1, /* 1FACD (129741) */
     1, /* 1FACE (129742) */
     1, /* 1FACF (129743) */
     1, /* 1FAD0 (129744) */
@@ -107632,12 +107866,12 @@ static const uint32_t lxb_unicode_table_map_110576_205744[95168] =
     1, /* 1FAE7 (129767) */
     1, /* 1FAE8 (129768) */
     1, /* 1FAE9 (129769) */
-    56, /* 1FAEA (129770) */
+    1, /* 1FAEA (129770) */
     56, /* 1FAEB (129771) */
     56, /* 1FAEC (129772) */
     56, /* 1FAED (129773) */
     56, /* 1FAEE (129774) */
-    56, /* 1FAEF (129775) */
+    1, /* 1FAEF (129775) */
     1, /* 1FAF0 (129776) */
     1, /* 1FAF1 (129777) */
     1, /* 1FAF2 (129778) */
@@ -107894,17 +108128,17 @@ static const uint32_t lxb_unicode_table_map_110576_205744[95168] =
     1, /* 1FBED (130029) */
     1, /* 1FBEE (130030) */
     1, /* 1FBEF (130031) */
-    5215, /* 1FBF0 (130032) */
-    5216, /* 1FBF1 (130033) */
-    5217, /* 1FBF2 (130034) */
-    5218, /* 1FBF3 (130035) */
-    5219, /* 1FBF4 (130036) */
-    5220, /* 1FBF5 (130037) */
-    5221, /* 1FBF6 (130038) */
-    5222, /* 1FBF7 (130039) */
-    5223, /* 1FBF8 (130040) */
-    5224, /* 1FBF9 (130041) */
-    56, /* 1FBFA (130042) */
+    5244, /* 1FBF0 (130032) */
+    5245, /* 1FBF1 (130033) */
+    5246, /* 1FBF2 (130034) */
+    5247, /* 1FBF3 (130035) */
+    5248, /* 1FBF4 (130036) */
+    5249, /* 1FBF5 (130037) */
+    5250, /* 1FBF6 (130038) */
+    5251, /* 1FBF7 (130039) */
+    5252, /* 1FBF8 (130040) */
+    5253, /* 1FBF9 (130041) */
+    1, /* 1FBFA (130042) */
     56, /* 1FBFB (130043) */
     56, /* 1FBFC (130044) */
     56, /* 1FBFD (130045) */
@@ -155840,12 +156074,12 @@ static const uint32_t lxb_unicode_table_map_110576_205744[95168] =
     1, /* 2B737 (177975) */
     1, /* 2B738 (177976) */
     1, /* 2B739 (177977) */
-    56, /* 2B73A (177978) */
-    56, /* 2B73B (177979) */
-    56, /* 2B73C (177980) */
-    56, /* 2B73D (177981) */
-    56, /* 2B73E (177982) */
-    56, /* 2B73F (177983) */
+    1, /* 2B73A (177978) */
+    1, /* 2B73B (177979) */
+    1, /* 2B73C (177980) */
+    1, /* 2B73D (177981) */
+    1, /* 2B73E (177982) */
+    1, /* 2B73F (177983) */
     1, /* 2B740 (177984) */
     1, /* 2B741 (177985) */
     1, /* 2B742 (177986) */
@@ -161832,18 +162066,18 @@ static const uint32_t lxb_unicode_table_map_110576_205744[95168] =
     1, /* 2CE9F (183967) */
     1, /* 2CEA0 (183968) */
     1, /* 2CEA1 (183969) */
-    56, /* 2CEA2 (183970) */
-    56, /* 2CEA3 (183971) */
-    56, /* 2CEA4 (183972) */
-    56, /* 2CEA5 (183973) */
-    56, /* 2CEA6 (183974) */
-    56, /* 2CEA7 (183975) */
-    56, /* 2CEA8 (183976) */
-    56, /* 2CEA9 (183977) */
-    56, /* 2CEAA (183978) */
-    56, /* 2CEAB (183979) */
-    56, /* 2CEAC (183980) */
-    56, /* 2CEAD (183981) */
+    1, /* 2CEA2 (183970) */
+    1, /* 2CEA3 (183971) */
+    1, /* 2CEA4 (183972) */
+    1, /* 2CEA5 (183973) */
+    1, /* 2CEA6 (183974) */
+    1, /* 2CEA7 (183975) */
+    1, /* 2CEA8 (183976) */
+    1, /* 2CEA9 (183977) */
+    1, /* 2CEAA (183978) */
+    1, /* 2CEAB (183979) */
+    1, /* 2CEAC (183980) */
+    1, /* 2CEAD (183981) */
     56, /* 2CEAE (183982) */
     56, /* 2CEAF (183983) */
     1, /* 2CEB0 (183984) */
@@ -172422,548 +172656,548 @@ static const uint32_t lxb_unicode_table_map_110576_205744[95168] =
     56, /* 2F7FD (194557) */
     56, /* 2F7FE (194558) */
     56, /* 2F7FF (194559) */
-    5608, /* 2F800 (194560) */
-    5609, /* 2F801 (194561) */
-    5610, /* 2F802 (194562) */
-    5611, /* 2F803 (194563) */
-    5612, /* 2F804 (194564) */
-    3630, /* 2F805 (194565) */
-    5613, /* 2F806 (194566) */
-    5614, /* 2F807 (194567) */
-    5615, /* 2F808 (194568) */
-    5616, /* 2F809 (194569) */
-    3631, /* 2F80A (194570) */
-    5617, /* 2F80B (194571) */
-    5618, /* 2F80C (194572) */
-    5619, /* 2F80D (194573) */
-    3632, /* 2F80E (194574) */
-    5620, /* 2F80F (194575) */
-    5621, /* 2F810 (194576) */
-    5622, /* 2F811 (194577) */
-    5623, /* 2F812 (194578) */
-    5624, /* 2F813 (194579) */
-    5625, /* 2F814 (194580) */
-    5626, /* 2F815 (194581) */
-    5627, /* 2F816 (194582) */
-    5628, /* 2F817 (194583) */
-    5629, /* 2F818 (194584) */
-    5630, /* 2F819 (194585) */
-    5631, /* 2F81A (194586) */
-    3690, /* 2F81B (194587) */
-    5632, /* 2F81C (194588) */
-    5633, /* 2F81D (194589) */
-    5634, /* 2F81E (194590) */
-    5635, /* 2F81F (194591) */
-    5636, /* 2F820 (194592) */
-    5637, /* 2F821 (194593) */
-    5638, /* 2F822 (194594) */
-    5639, /* 2F823 (194595) */
-    5640, /* 2F824 (194596) */
-    3695, /* 2F825 (194597) */
-    3633, /* 2F826 (194598) */
-    3634, /* 2F827 (194599) */
-    3696, /* 2F828 (194600) */
-    5641, /* 2F829 (194601) */
-    5642, /* 2F82A (194602) */
-    3441, /* 2F82B (194603) */
-    5643, /* 2F82C (194604) */
-    3635, /* 2F82D (194605) */
-    5644, /* 2F82E (194606) */
-    5645, /* 2F82F (194607) */
-    5646, /* 2F830 (194608) */
-    5647, /* 2F831 (194609) */
-    5647, /* 2F832 (194610) */
-    5647, /* 2F833 (194611) */
-    5648, /* 2F834 (194612) */
-    5649, /* 2F835 (194613) */
-    5650, /* 2F836 (194614) */
-    5651, /* 2F837 (194615) */
-    5652, /* 2F838 (194616) */
-    5653, /* 2F839 (194617) */
-    5654, /* 2F83A (194618) */
-    5655, /* 2F83B (194619) */
-    5656, /* 2F83C (194620) */
-    5657, /* 2F83D (194621) */
-    5658, /* 2F83E (194622) */
-    5659, /* 2F83F (194623) */
-    5660, /* 2F840 (194624) */
-    5661, /* 2F841 (194625) */
-    5662, /* 2F842 (194626) */
-    5663, /* 2F843 (194627) */
-    5664, /* 2F844 (194628) */
-    5665, /* 2F845 (194629) */
-    5665, /* 2F846 (194630) */
-    3698, /* 2F847 (194631) */
-    5666, /* 2F848 (194632) */
-    5667, /* 2F849 (194633) */
-    5668, /* 2F84A (194634) */
-    5669, /* 2F84B (194635) */
-    3637, /* 2F84C (194636) */
-    5670, /* 2F84D (194637) */
-    5671, /* 2F84E (194638) */
-    5672, /* 2F84F (194639) */
-    3594, /* 2F850 (194640) */
-    5673, /* 2F851 (194641) */
-    5674, /* 2F852 (194642) */
-    5675, /* 2F853 (194643) */
-    5676, /* 2F854 (194644) */
-    5677, /* 2F855 (194645) */
-    5678, /* 2F856 (194646) */
-    5679, /* 2F857 (194647) */
-    5680, /* 2F858 (194648) */
-    5681, /* 2F859 (194649) */
-    5682, /* 2F85A (194650) */
-    5683, /* 2F85B (194651) */
-    5684, /* 2F85C (194652) */
-    5685, /* 2F85D (194653) */
-    5686, /* 2F85E (194654) */
-    5687, /* 2F85F (194655) */
-    5688, /* 2F860 (194656) */
-    5689, /* 2F861 (194657) */
-    5690, /* 2F862 (194658) */
-    5691, /* 2F863 (194659) */
-    5692, /* 2F864 (194660) */
-    5693, /* 2F865 (194661) */
-    5694, /* 2F866 (194662) */
-    5695, /* 2F867 (194663) */
-    5696, /* 2F868 (194664) */
-    5697, /* 2F869 (194665) */
-    5698, /* 2F86A (194666) */
-    5698, /* 2F86B (194667) */
-    5699, /* 2F86C (194668) */
-    5700, /* 2F86D (194669) */
-    5701, /* 2F86E (194670) */
-    3437, /* 2F86F (194671) */
-    5702, /* 2F870 (194672) */
-    5703, /* 2F871 (194673) */
-    5704, /* 2F872 (194674) */
-    5705, /* 2F873 (194675) */
-    5706, /* 2F874 (194676) */
-    5707, /* 2F875 (194677) */
-    5708, /* 2F876 (194678) */
-    5709, /* 2F877 (194679) */
-    3642, /* 2F878 (194680) */
-    5710, /* 2F879 (194681) */
-    5711, /* 2F87A (194682) */
-    5712, /* 2F87B (194683) */
-    5713, /* 2F87C (194684) */
-    5714, /* 2F87D (194685) */
-    5715, /* 2F87E (194686) */
-    5716, /* 2F87F (194687) */
-    5717, /* 2F880 (194688) */
-    5718, /* 2F881 (194689) */
-    5719, /* 2F882 (194690) */
-    5720, /* 2F883 (194691) */
-    5721, /* 2F884 (194692) */
-    5722, /* 2F885 (194693) */
-    5723, /* 2F886 (194694) */
-    5724, /* 2F887 (194695) */
-    5725, /* 2F888 (194696) */
-    5726, /* 2F889 (194697) */
-    5727, /* 2F88A (194698) */
-    5728, /* 2F88B (194699) */
-    5729, /* 2F88C (194700) */
-    5730, /* 2F88D (194701) */
-    3383, /* 2F88E (194702) */
-    5731, /* 2F88F (194703) */
-    5732, /* 2F890 (194704) */
-    5733, /* 2F891 (194705) */
-    5733, /* 2F892 (194706) */
-    5734, /* 2F893 (194707) */
-    5735, /* 2F894 (194708) */
-    5735, /* 2F895 (194709) */
-    5736, /* 2F896 (194710) */
-    5737, /* 2F897 (194711) */
-    5738, /* 2F898 (194712) */
-    5739, /* 2F899 (194713) */
-    5740, /* 2F89A (194714) */
-    5741, /* 2F89B (194715) */
-    5742, /* 2F89C (194716) */
-    5743, /* 2F89D (194717) */
-    5744, /* 2F89E (194718) */
-    5745, /* 2F89F (194719) */
-    5746, /* 2F8A0 (194720) */
-    5747, /* 2F8A1 (194721) */
-    5748, /* 2F8A2 (194722) */
-    3643, /* 2F8A3 (194723) */
-    5749, /* 2F8A4 (194724) */
-    5750, /* 2F8A5 (194725) */
-    5751, /* 2F8A6 (194726) */
-    5752, /* 2F8A7 (194727) */
-    3710, /* 2F8A8 (194728) */
-    5752, /* 2F8A9 (194729) */
-    5753, /* 2F8AA (194730) */
-    3645, /* 2F8AB (194731) */
-    5754, /* 2F8AC (194732) */
-    5755, /* 2F8AD (194733) */
-    5756, /* 2F8AE (194734) */
-    5757, /* 2F8AF (194735) */
-    3646, /* 2F8B0 (194736) */
-    3356, /* 2F8B1 (194737) */
-    5758, /* 2F8B2 (194738) */
-    5759, /* 2F8B3 (194739) */
-    5760, /* 2F8B4 (194740) */
-    5761, /* 2F8B5 (194741) */
-    5762, /* 2F8B6 (194742) */
-    5763, /* 2F8B7 (194743) */
-    5764, /* 2F8B8 (194744) */
-    5765, /* 2F8B9 (194745) */
-    5766, /* 2F8BA (194746) */
-    5767, /* 2F8BB (194747) */
-    5768, /* 2F8BC (194748) */
-    5769, /* 2F8BD (194749) */
-    5770, /* 2F8BE (194750) */
-    5771, /* 2F8BF (194751) */
-    5772, /* 2F8C0 (194752) */
-    5773, /* 2F8C1 (194753) */
-    5774, /* 2F8C2 (194754) */
-    5775, /* 2F8C3 (194755) */
-    5776, /* 2F8C4 (194756) */
-    5777, /* 2F8C5 (194757) */
-    5778, /* 2F8C6 (194758) */
-    5779, /* 2F8C7 (194759) */
-    3647, /* 2F8C8 (194760) */
-    5780, /* 2F8C9 (194761) */
-    5781, /* 2F8CA (194762) */
-    5782, /* 2F8CB (194763) */
-    5783, /* 2F8CC (194764) */
-    5784, /* 2F8CD (194765) */
-    5785, /* 2F8CE (194766) */
-    3649, /* 2F8CF (194767) */
-    5786, /* 2F8D0 (194768) */
-    5787, /* 2F8D1 (194769) */
-    5788, /* 2F8D2 (194770) */
-    5789, /* 2F8D3 (194771) */
-    5790, /* 2F8D4 (194772) */
-    5791, /* 2F8D5 (194773) */
-    5792, /* 2F8D6 (194774) */
-    5793, /* 2F8D7 (194775) */
-    3384, /* 2F8D8 (194776) */
-    3718, /* 2F8D9 (194777) */
-    5794, /* 2F8DA (194778) */
-    5795, /* 2F8DB (194779) */
-    5796, /* 2F8DC (194780) */
-    5797, /* 2F8DD (194781) */
-    5798, /* 2F8DE (194782) */
-    5799, /* 2F8DF (194783) */
-    5800, /* 2F8E0 (194784) */
-    5801, /* 2F8E1 (194785) */
-    3650, /* 2F8E2 (194786) */
-    5802, /* 2F8E3 (194787) */
-    5803, /* 2F8E4 (194788) */
-    5804, /* 2F8E5 (194789) */
-    5805, /* 2F8E6 (194790) */
-    3761, /* 2F8E7 (194791) */
-    5806, /* 2F8E8 (194792) */
-    5807, /* 2F8E9 (194793) */
-    5808, /* 2F8EA (194794) */
-    5809, /* 2F8EB (194795) */
-    5810, /* 2F8EC (194796) */
-    5811, /* 2F8ED (194797) */
-    5812, /* 2F8EE (194798) */
-    5813, /* 2F8EF (194799) */
-    5814, /* 2F8F0 (194800) */
-    5815, /* 2F8F1 (194801) */
-    5816, /* 2F8F2 (194802) */
-    5817, /* 2F8F3 (194803) */
-    5818, /* 2F8F4 (194804) */
-    3454, /* 2F8F5 (194805) */
-    5819, /* 2F8F6 (194806) */
-    5820, /* 2F8F7 (194807) */
-    5821, /* 2F8F8 (194808) */
-    5822, /* 2F8F9 (194809) */
-    5823, /* 2F8FA (194810) */
-    5824, /* 2F8FB (194811) */
-    5825, /* 2F8FC (194812) */
-    5826, /* 2F8FD (194813) */
-    5827, /* 2F8FE (194814) */
-    5828, /* 2F8FF (194815) */
-    5829, /* 2F900 (194816) */
-    3651, /* 2F901 (194817) */
-    3541, /* 2F902 (194818) */
-    5830, /* 2F903 (194819) */
-    5831, /* 2F904 (194820) */
-    5832, /* 2F905 (194821) */
-    5833, /* 2F906 (194822) */
-    5834, /* 2F907 (194823) */
-    5835, /* 2F908 (194824) */
-    5836, /* 2F909 (194825) */
-    5837, /* 2F90A (194826) */
-    3722, /* 2F90B (194827) */
-    5838, /* 2F90C (194828) */
-    5839, /* 2F90D (194829) */
-    5840, /* 2F90E (194830) */
-    5841, /* 2F90F (194831) */
-    5842, /* 2F910 (194832) */
-    5843, /* 2F911 (194833) */
-    5844, /* 2F912 (194834) */
-    5845, /* 2F913 (194835) */
-    3723, /* 2F914 (194836) */
-    5846, /* 2F915 (194837) */
-    5847, /* 2F916 (194838) */
-    5848, /* 2F917 (194839) */
-    5849, /* 2F918 (194840) */
-    5850, /* 2F919 (194841) */
-    5851, /* 2F91A (194842) */
-    5852, /* 2F91B (194843) */
-    5853, /* 2F91C (194844) */
-    5854, /* 2F91D (194845) */
-    5855, /* 2F91E (194846) */
-    5856, /* 2F91F (194847) */
-    5857, /* 2F920 (194848) */
-    3725, /* 2F921 (194849) */
-    5858, /* 2F922 (194850) */
-    5859, /* 2F923 (194851) */
-    5860, /* 2F924 (194852) */
-    5861, /* 2F925 (194853) */
-    5862, /* 2F926 (194854) */
-    5863, /* 2F927 (194855) */
-    5864, /* 2F928 (194856) */
-    5865, /* 2F929 (194857) */
-    5866, /* 2F92A (194858) */
-    5867, /* 2F92B (194859) */
-    5868, /* 2F92C (194860) */
-    5868, /* 2F92D (194861) */
-    5869, /* 2F92E (194862) */
-    5870, /* 2F92F (194863) */
-    3727, /* 2F930 (194864) */
-    5871, /* 2F931 (194865) */
-    5872, /* 2F932 (194866) */
-    5873, /* 2F933 (194867) */
-    5874, /* 2F934 (194868) */
-    5875, /* 2F935 (194869) */
-    5876, /* 2F936 (194870) */
-    5877, /* 2F937 (194871) */
-    3440, /* 2F938 (194872) */
-    5878, /* 2F939 (194873) */
-    5879, /* 2F93A (194874) */
-    5880, /* 2F93B (194875) */
-    5881, /* 2F93C (194876) */
-    5882, /* 2F93D (194877) */
-    5883, /* 2F93E (194878) */
-    5884, /* 2F93F (194879) */
-    3733, /* 2F940 (194880) */
-    5885, /* 2F941 (194881) */
-    5886, /* 2F942 (194882) */
-    5887, /* 2F943 (194883) */
-    5888, /* 2F944 (194884) */
-    5889, /* 2F945 (194885) */
-    5890, /* 2F946 (194886) */
-    5890, /* 2F947 (194887) */
-    3734, /* 2F948 (194888) */
-    3763, /* 2F949 (194889) */
-    5891, /* 2F94A (194890) */
-    5892, /* 2F94B (194891) */
-    5893, /* 2F94C (194892) */
-    5894, /* 2F94D (194893) */
-    5895, /* 2F94E (194894) */
-    3402, /* 2F94F (194895) */
-    3736, /* 2F950 (194896) */
-    5896, /* 2F951 (194897) */
-    5897, /* 2F952 (194898) */
-    3662, /* 2F953 (194899) */
-    5898, /* 2F954 (194900) */
-    5899, /* 2F955 (194901) */
-    3616, /* 2F956 (194902) */
-    5900, /* 2F957 (194903) */
-    5901, /* 2F958 (194904) */
-    3666, /* 2F959 (194905) */
-    5902, /* 2F95A (194906) */
-    5903, /* 2F95B (194907) */
-    5904, /* 2F95C (194908) */
-    5905, /* 2F95D (194909) */
-    5905, /* 2F95E (194910) */
-    5906, /* 2F95F (194911) */
-    5907, /* 2F960 (194912) */
-    5908, /* 2F961 (194913) */
-    5909, /* 2F962 (194914) */
-    5910, /* 2F963 (194915) */
-    5911, /* 2F964 (194916) */
-    5912, /* 2F965 (194917) */
-    5913, /* 2F966 (194918) */
-    5914, /* 2F967 (194919) */
-    5915, /* 2F968 (194920) */
-    5916, /* 2F969 (194921) */
-    5917, /* 2F96A (194922) */
-    5918, /* 2F96B (194923) */
-    5919, /* 2F96C (194924) */
-    5920, /* 2F96D (194925) */
-    5921, /* 2F96E (194926) */
-    5922, /* 2F96F (194927) */
-    5923, /* 2F970 (194928) */
-    5924, /* 2F971 (194929) */
-    5925, /* 2F972 (194930) */
-    5926, /* 2F973 (194931) */
-    5927, /* 2F974 (194932) */
-    5928, /* 2F975 (194933) */
-    5929, /* 2F976 (194934) */
-    5930, /* 2F977 (194935) */
-    5931, /* 2F978 (194936) */
-    5932, /* 2F979 (194937) */
-    3672, /* 2F97A (194938) */
-    5933, /* 2F97B (194939) */
-    5934, /* 2F97C (194940) */
-    5935, /* 2F97D (194941) */
-    5936, /* 2F97E (194942) */
-    5937, /* 2F97F (194943) */
-    5938, /* 2F980 (194944) */
-    5939, /* 2F981 (194945) */
-    5940, /* 2F982 (194946) */
-    5941, /* 2F983 (194947) */
-    5942, /* 2F984 (194948) */
-    5943, /* 2F985 (194949) */
-    5944, /* 2F986 (194950) */
-    5945, /* 2F987 (194951) */
-    5946, /* 2F988 (194952) */
-    5947, /* 2F989 (194953) */
-    5948, /* 2F98A (194954) */
-    5734, /* 2F98B (194955) */
-    5949, /* 2F98C (194956) */
-    5950, /* 2F98D (194957) */
-    5951, /* 2F98E (194958) */
-    5952, /* 2F98F (194959) */
-    5953, /* 2F990 (194960) */
-    5954, /* 2F991 (194961) */
-    5955, /* 2F992 (194962) */
-    5956, /* 2F993 (194963) */
-    5957, /* 2F994 (194964) */
-    5958, /* 2F995 (194965) */
-    5959, /* 2F996 (194966) */
-    5960, /* 2F997 (194967) */
-    3458, /* 2F998 (194968) */
-    5961, /* 2F999 (194969) */
-    5962, /* 2F99A (194970) */
-    5963, /* 2F99B (194971) */
-    5964, /* 2F99C (194972) */
-    5965, /* 2F99D (194973) */
-    5966, /* 2F99E (194974) */
-    3675, /* 2F99F (194975) */
-    5967, /* 2F9A0 (194976) */
-    5968, /* 2F9A1 (194977) */
-    5969, /* 2F9A2 (194978) */
-    5970, /* 2F9A3 (194979) */
-    5971, /* 2F9A4 (194980) */
-    5972, /* 2F9A5 (194981) */
-    5973, /* 2F9A6 (194982) */
-    5974, /* 2F9A7 (194983) */
-    5975, /* 2F9A8 (194984) */
-    5976, /* 2F9A9 (194985) */
-    5977, /* 2F9AA (194986) */
-    5978, /* 2F9AB (194987) */
-    5979, /* 2F9AC (194988) */
-    5980, /* 2F9AD (194989) */
-    5981, /* 2F9AE (194990) */
-    5982, /* 2F9AF (194991) */
-    5983, /* 2F9B0 (194992) */
-    5984, /* 2F9B1 (194993) */
-    5985, /* 2F9B2 (194994) */
-    5986, /* 2F9B3 (194995) */
-    3397, /* 2F9B4 (194996) */
-    5987, /* 2F9B5 (194997) */
-    5988, /* 2F9B6 (194998) */
-    5989, /* 2F9B7 (194999) */
-    5990, /* 2F9B8 (195000) */
-    5991, /* 2F9B9 (195001) */
-    5992, /* 2F9BA (195002) */
-    3743, /* 2F9BB (195003) */
-    5993, /* 2F9BC (195004) */
-    5994, /* 2F9BD (195005) */
-    5995, /* 2F9BE (195006) */
-    5996, /* 2F9BF (195007) */
-    5997, /* 2F9C0 (195008) */
-    5998, /* 2F9C1 (195009) */
-    5999, /* 2F9C2 (195010) */
-    6000, /* 2F9C3 (195011) */
-    6001, /* 2F9C4 (195012) */
-    6002, /* 2F9C5 (195013) */
-    6003, /* 2F9C6 (195014) */
-    6004, /* 2F9C7 (195015) */
-    6005, /* 2F9C8 (195016) */
-    6006, /* 2F9C9 (195017) */
-    6007, /* 2F9CA (195018) */
-    6008, /* 2F9CB (195019) */
-    6009, /* 2F9CC (195020) */
-    6010, /* 2F9CD (195021) */
-    6011, /* 2F9CE (195022) */
-    6012, /* 2F9CF (195023) */
-    3748, /* 2F9D0 (195024) */
-    3749, /* 2F9D1 (195025) */
-    6013, /* 2F9D2 (195026) */
-    6014, /* 2F9D3 (195027) */
-    6015, /* 2F9D4 (195028) */
-    6016, /* 2F9D5 (195029) */
-    6017, /* 2F9D6 (195030) */
-    6018, /* 2F9D7 (195031) */
-    6019, /* 2F9D8 (195032) */
-    6020, /* 2F9D9 (195033) */
-    6021, /* 2F9DA (195034) */
-    6022, /* 2F9DB (195035) */
-    6023, /* 2F9DC (195036) */
-    6024, /* 2F9DD (195037) */
-    6025, /* 2F9DE (195038) */
-    3750, /* 2F9DF (195039) */
-    6026, /* 2F9E0 (195040) */
-    6027, /* 2F9E1 (195041) */
-    6028, /* 2F9E2 (195042) */
-    6029, /* 2F9E3 (195043) */
-    6030, /* 2F9E4 (195044) */
-    6031, /* 2F9E5 (195045) */
-    6032, /* 2F9E6 (195046) */
-    6033, /* 2F9E7 (195047) */
-    6034, /* 2F9E8 (195048) */
-    6035, /* 2F9E9 (195049) */
-    6036, /* 2F9EA (195050) */
-    6037, /* 2F9EB (195051) */
-    6038, /* 2F9EC (195052) */
-    6039, /* 2F9ED (195053) */
-    6040, /* 2F9EE (195054) */
-    6041, /* 2F9EF (195055) */
-    6042, /* 2F9F0 (195056) */
-    6043, /* 2F9F1 (195057) */
-    6044, /* 2F9F2 (195058) */
-    6045, /* 2F9F3 (195059) */
-    6046, /* 2F9F4 (195060) */
-    6047, /* 2F9F5 (195061) */
-    6048, /* 2F9F6 (195062) */
-    6049, /* 2F9F7 (195063) */
-    6050, /* 2F9F8 (195064) */
-    6051, /* 2F9F9 (195065) */
-    6052, /* 2F9FA (195066) */
-    6053, /* 2F9FB (195067) */
-    6054, /* 2F9FC (195068) */
-    6055, /* 2F9FD (195069) */
-    3756, /* 2F9FE (195070) */
-    3756, /* 2F9FF (195071) */
-    6056, /* 2FA00 (195072) */
-    6057, /* 2FA01 (195073) */
-    6058, /* 2FA02 (195074) */
-    6059, /* 2FA03 (195075) */
-    6060, /* 2FA04 (195076) */
-    6061, /* 2FA05 (195077) */
-    6062, /* 2FA06 (195078) */
-    6063, /* 2FA07 (195079) */
-    6064, /* 2FA08 (195080) */
-    6065, /* 2FA09 (195081) */
-    3757, /* 2FA0A (195082) */
-    6066, /* 2FA0B (195083) */
-    6067, /* 2FA0C (195084) */
-    6068, /* 2FA0D (195085) */
-    6069, /* 2FA0E (195086) */
-    6070, /* 2FA0F (195087) */
-    6071, /* 2FA10 (195088) */
-    6072, /* 2FA11 (195089) */
-    6073, /* 2FA12 (195090) */
-    6074, /* 2FA13 (195091) */
-    6075, /* 2FA14 (195092) */
-    6076, /* 2FA15 (195093) */
-    6077, /* 2FA16 (195094) */
-    6078, /* 2FA17 (195095) */
-    6079, /* 2FA18 (195096) */
-    6080, /* 2FA19 (195097) */
-    6081, /* 2FA1A (195098) */
-    6082, /* 2FA1B (195099) */
-    6083, /* 2FA1C (195100) */
-    6084, /* 2FA1D (195101) */
+    5637, /* 2F800 (194560) */
+    5638, /* 2F801 (194561) */
+    5639, /* 2F802 (194562) */
+    5640, /* 2F803 (194563) */
+    5641, /* 2F804 (194564) */
+    3634, /* 2F805 (194565) */
+    5642, /* 2F806 (194566) */
+    5643, /* 2F807 (194567) */
+    5644, /* 2F808 (194568) */
+    5645, /* 2F809 (194569) */
+    3635, /* 2F80A (194570) */
+    5646, /* 2F80B (194571) */
+    5647, /* 2F80C (194572) */
+    5648, /* 2F80D (194573) */
+    3636, /* 2F80E (194574) */
+    5649, /* 2F80F (194575) */
+    5650, /* 2F810 (194576) */
+    5651, /* 2F811 (194577) */
+    5652, /* 2F812 (194578) */
+    5653, /* 2F813 (194579) */
+    5654, /* 2F814 (194580) */
+    5655, /* 2F815 (194581) */
+    5656, /* 2F816 (194582) */
+    5657, /* 2F817 (194583) */
+    5658, /* 2F818 (194584) */
+    5659, /* 2F819 (194585) */
+    5660, /* 2F81A (194586) */
+    3694, /* 2F81B (194587) */
+    5661, /* 2F81C (194588) */
+    5662, /* 2F81D (194589) */
+    5663, /* 2F81E (194590) */
+    5664, /* 2F81F (194591) */
+    5665, /* 2F820 (194592) */
+    5666, /* 2F821 (194593) */
+    5667, /* 2F822 (194594) */
+    5668, /* 2F823 (194595) */
+    5669, /* 2F824 (194596) */
+    3699, /* 2F825 (194597) */
+    3637, /* 2F826 (194598) */
+    3638, /* 2F827 (194599) */
+    3700, /* 2F828 (194600) */
+    5670, /* 2F829 (194601) */
+    5671, /* 2F82A (194602) */
+    3445, /* 2F82B (194603) */
+    5672, /* 2F82C (194604) */
+    3639, /* 2F82D (194605) */
+    5673, /* 2F82E (194606) */
+    5674, /* 2F82F (194607) */
+    5675, /* 2F830 (194608) */
+    5676, /* 2F831 (194609) */
+    5676, /* 2F832 (194610) */
+    5676, /* 2F833 (194611) */
+    5677, /* 2F834 (194612) */
+    5678, /* 2F835 (194613) */
+    5679, /* 2F836 (194614) */
+    5680, /* 2F837 (194615) */
+    5681, /* 2F838 (194616) */
+    5682, /* 2F839 (194617) */
+    5683, /* 2F83A (194618) */
+    5684, /* 2F83B (194619) */
+    5685, /* 2F83C (194620) */
+    5686, /* 2F83D (194621) */
+    5687, /* 2F83E (194622) */
+    5688, /* 2F83F (194623) */
+    5689, /* 2F840 (194624) */
+    5690, /* 2F841 (194625) */
+    5691, /* 2F842 (194626) */
+    5692, /* 2F843 (194627) */
+    5693, /* 2F844 (194628) */
+    5694, /* 2F845 (194629) */
+    5694, /* 2F846 (194630) */
+    3702, /* 2F847 (194631) */
+    5695, /* 2F848 (194632) */
+    5696, /* 2F849 (194633) */
+    5697, /* 2F84A (194634) */
+    5698, /* 2F84B (194635) */
+    3641, /* 2F84C (194636) */
+    5699, /* 2F84D (194637) */
+    5700, /* 2F84E (194638) */
+    5701, /* 2F84F (194639) */
+    3598, /* 2F850 (194640) */
+    5702, /* 2F851 (194641) */
+    5703, /* 2F852 (194642) */
+    5704, /* 2F853 (194643) */
+    5705, /* 2F854 (194644) */
+    5706, /* 2F855 (194645) */
+    5707, /* 2F856 (194646) */
+    5708, /* 2F857 (194647) */
+    5709, /* 2F858 (194648) */
+    5710, /* 2F859 (194649) */
+    5711, /* 2F85A (194650) */
+    5712, /* 2F85B (194651) */
+    5713, /* 2F85C (194652) */
+    5714, /* 2F85D (194653) */
+    5715, /* 2F85E (194654) */
+    5716, /* 2F85F (194655) */
+    5717, /* 2F860 (194656) */
+    5718, /* 2F861 (194657) */
+    5719, /* 2F862 (194658) */
+    5720, /* 2F863 (194659) */
+    5721, /* 2F864 (194660) */
+    5722, /* 2F865 (194661) */
+    5723, /* 2F866 (194662) */
+    5724, /* 2F867 (194663) */
+    5725, /* 2F868 (194664) */
+    5726, /* 2F869 (194665) */
+    5727, /* 2F86A (194666) */
+    5727, /* 2F86B (194667) */
+    5728, /* 2F86C (194668) */
+    5729, /* 2F86D (194669) */
+    5730, /* 2F86E (194670) */
+    3441, /* 2F86F (194671) */
+    5731, /* 2F870 (194672) */
+    5732, /* 2F871 (194673) */
+    5733, /* 2F872 (194674) */
+    5734, /* 2F873 (194675) */
+    5735, /* 2F874 (194676) */
+    5736, /* 2F875 (194677) */
+    5737, /* 2F876 (194678) */
+    5738, /* 2F877 (194679) */
+    3646, /* 2F878 (194680) */
+    5739, /* 2F879 (194681) */
+    5740, /* 2F87A (194682) */
+    5741, /* 2F87B (194683) */
+    5742, /* 2F87C (194684) */
+    5743, /* 2F87D (194685) */
+    5744, /* 2F87E (194686) */
+    5745, /* 2F87F (194687) */
+    5746, /* 2F880 (194688) */
+    5747, /* 2F881 (194689) */
+    5748, /* 2F882 (194690) */
+    5749, /* 2F883 (194691) */
+    5750, /* 2F884 (194692) */
+    5751, /* 2F885 (194693) */
+    5752, /* 2F886 (194694) */
+    5753, /* 2F887 (194695) */
+    5754, /* 2F888 (194696) */
+    5755, /* 2F889 (194697) */
+    5756, /* 2F88A (194698) */
+    5757, /* 2F88B (194699) */
+    5758, /* 2F88C (194700) */
+    5759, /* 2F88D (194701) */
+    3387, /* 2F88E (194702) */
+    5760, /* 2F88F (194703) */
+    5761, /* 2F890 (194704) */
+    5762, /* 2F891 (194705) */
+    5762, /* 2F892 (194706) */
+    5763, /* 2F893 (194707) */
+    5764, /* 2F894 (194708) */
+    5764, /* 2F895 (194709) */
+    5765, /* 2F896 (194710) */
+    5766, /* 2F897 (194711) */
+    5767, /* 2F898 (194712) */
+    5768, /* 2F899 (194713) */
+    5769, /* 2F89A (194714) */
+    5770, /* 2F89B (194715) */
+    5771, /* 2F89C (194716) */
+    5772, /* 2F89D (194717) */
+    5773, /* 2F89E (194718) */
+    5774, /* 2F89F (194719) */
+    5775, /* 2F8A0 (194720) */
+    5776, /* 2F8A1 (194721) */
+    5777, /* 2F8A2 (194722) */
+    3647, /* 2F8A3 (194723) */
+    5778, /* 2F8A4 (194724) */
+    5779, /* 2F8A5 (194725) */
+    5780, /* 2F8A6 (194726) */
+    5781, /* 2F8A7 (194727) */
+    3714, /* 2F8A8 (194728) */
+    5781, /* 2F8A9 (194729) */
+    5782, /* 2F8AA (194730) */
+    3649, /* 2F8AB (194731) */
+    5783, /* 2F8AC (194732) */
+    5784, /* 2F8AD (194733) */
+    5785, /* 2F8AE (194734) */
+    5786, /* 2F8AF (194735) */
+    3650, /* 2F8B0 (194736) */
+    3360, /* 2F8B1 (194737) */
+    5787, /* 2F8B2 (194738) */
+    5788, /* 2F8B3 (194739) */
+    5789, /* 2F8B4 (194740) */
+    5790, /* 2F8B5 (194741) */
+    5791, /* 2F8B6 (194742) */
+    5792, /* 2F8B7 (194743) */
+    5793, /* 2F8B8 (194744) */
+    5794, /* 2F8B9 (194745) */
+    5795, /* 2F8BA (194746) */
+    5796, /* 2F8BB (194747) */
+    5797, /* 2F8BC (194748) */
+    5798, /* 2F8BD (194749) */
+    5799, /* 2F8BE (194750) */
+    5800, /* 2F8BF (194751) */
+    5801, /* 2F8C0 (194752) */
+    5802, /* 2F8C1 (194753) */
+    5803, /* 2F8C2 (194754) */
+    5804, /* 2F8C3 (194755) */
+    5805, /* 2F8C4 (194756) */
+    5806, /* 2F8C5 (194757) */
+    5807, /* 2F8C6 (194758) */
+    5808, /* 2F8C7 (194759) */
+    3651, /* 2F8C8 (194760) */
+    5809, /* 2F8C9 (194761) */
+    5810, /* 2F8CA (194762) */
+    5811, /* 2F8CB (194763) */
+    5812, /* 2F8CC (194764) */
+    5813, /* 2F8CD (194765) */
+    5814, /* 2F8CE (194766) */
+    3653, /* 2F8CF (194767) */
+    5815, /* 2F8D0 (194768) */
+    5816, /* 2F8D1 (194769) */
+    5817, /* 2F8D2 (194770) */
+    5818, /* 2F8D3 (194771) */
+    5819, /* 2F8D4 (194772) */
+    5820, /* 2F8D5 (194773) */
+    5821, /* 2F8D6 (194774) */
+    5822, /* 2F8D7 (194775) */
+    3388, /* 2F8D8 (194776) */
+    3722, /* 2F8D9 (194777) */
+    5823, /* 2F8DA (194778) */
+    5824, /* 2F8DB (194779) */
+    5825, /* 2F8DC (194780) */
+    5826, /* 2F8DD (194781) */
+    5827, /* 2F8DE (194782) */
+    5828, /* 2F8DF (194783) */
+    5829, /* 2F8E0 (194784) */
+    5830, /* 2F8E1 (194785) */
+    3654, /* 2F8E2 (194786) */
+    5831, /* 2F8E3 (194787) */
+    5832, /* 2F8E4 (194788) */
+    5833, /* 2F8E5 (194789) */
+    5834, /* 2F8E6 (194790) */
+    3765, /* 2F8E7 (194791) */
+    5835, /* 2F8E8 (194792) */
+    5836, /* 2F8E9 (194793) */
+    5837, /* 2F8EA (194794) */
+    5838, /* 2F8EB (194795) */
+    5839, /* 2F8EC (194796) */
+    5840, /* 2F8ED (194797) */
+    5841, /* 2F8EE (194798) */
+    5842, /* 2F8EF (194799) */
+    5843, /* 2F8F0 (194800) */
+    5844, /* 2F8F1 (194801) */
+    5845, /* 2F8F2 (194802) */
+    5846, /* 2F8F3 (194803) */
+    5847, /* 2F8F4 (194804) */
+    3458, /* 2F8F5 (194805) */
+    5848, /* 2F8F6 (194806) */
+    5849, /* 2F8F7 (194807) */
+    5850, /* 2F8F8 (194808) */
+    5851, /* 2F8F9 (194809) */
+    5852, /* 2F8FA (194810) */
+    5853, /* 2F8FB (194811) */
+    5854, /* 2F8FC (194812) */
+    5855, /* 2F8FD (194813) */
+    5856, /* 2F8FE (194814) */
+    5857, /* 2F8FF (194815) */
+    5858, /* 2F900 (194816) */
+    3655, /* 2F901 (194817) */
+    3545, /* 2F902 (194818) */
+    5859, /* 2F903 (194819) */
+    5860, /* 2F904 (194820) */
+    5861, /* 2F905 (194821) */
+    5862, /* 2F906 (194822) */
+    5863, /* 2F907 (194823) */
+    5864, /* 2F908 (194824) */
+    5865, /* 2F909 (194825) */
+    5866, /* 2F90A (194826) */
+    3726, /* 2F90B (194827) */
+    5867, /* 2F90C (194828) */
+    5868, /* 2F90D (194829) */
+    5869, /* 2F90E (194830) */
+    5870, /* 2F90F (194831) */
+    5871, /* 2F910 (194832) */
+    5872, /* 2F911 (194833) */
+    5873, /* 2F912 (194834) */
+    5874, /* 2F913 (194835) */
+    3727, /* 2F914 (194836) */
+    5875, /* 2F915 (194837) */
+    5876, /* 2F916 (194838) */
+    5877, /* 2F917 (194839) */
+    5878, /* 2F918 (194840) */
+    5879, /* 2F919 (194841) */
+    5880, /* 2F91A (194842) */
+    5881, /* 2F91B (194843) */
+    5882, /* 2F91C (194844) */
+    5883, /* 2F91D (194845) */
+    5884, /* 2F91E (194846) */
+    5885, /* 2F91F (194847) */
+    5886, /* 2F920 (194848) */
+    3729, /* 2F921 (194849) */
+    5887, /* 2F922 (194850) */
+    5888, /* 2F923 (194851) */
+    5889, /* 2F924 (194852) */
+    5890, /* 2F925 (194853) */
+    5891, /* 2F926 (194854) */
+    5892, /* 2F927 (194855) */
+    5893, /* 2F928 (194856) */
+    5894, /* 2F929 (194857) */
+    5895, /* 2F92A (194858) */
+    5896, /* 2F92B (194859) */
+    5897, /* 2F92C (194860) */
+    5897, /* 2F92D (194861) */
+    5898, /* 2F92E (194862) */
+    5899, /* 2F92F (194863) */
+    3731, /* 2F930 (194864) */
+    5900, /* 2F931 (194865) */
+    5901, /* 2F932 (194866) */
+    5902, /* 2F933 (194867) */
+    5903, /* 2F934 (194868) */
+    5904, /* 2F935 (194869) */
+    5905, /* 2F936 (194870) */
+    5906, /* 2F937 (194871) */
+    3444, /* 2F938 (194872) */
+    5907, /* 2F939 (194873) */
+    5908, /* 2F93A (194874) */
+    5909, /* 2F93B (194875) */
+    5910, /* 2F93C (194876) */
+    5911, /* 2F93D (194877) */
+    5912, /* 2F93E (194878) */
+    5913, /* 2F93F (194879) */
+    3737, /* 2F940 (194880) */
+    5914, /* 2F941 (194881) */
+    5915, /* 2F942 (194882) */
+    5916, /* 2F943 (194883) */
+    5917, /* 2F944 (194884) */
+    5918, /* 2F945 (194885) */
+    5919, /* 2F946 (194886) */
+    5919, /* 2F947 (194887) */
+    3738, /* 2F948 (194888) */
+    3767, /* 2F949 (194889) */
+    5920, /* 2F94A (194890) */
+    5921, /* 2F94B (194891) */
+    5922, /* 2F94C (194892) */
+    5923, /* 2F94D (194893) */
+    5924, /* 2F94E (194894) */
+    3406, /* 2F94F (194895) */
+    3740, /* 2F950 (194896) */
+    5925, /* 2F951 (194897) */
+    5926, /* 2F952 (194898) */
+    3666, /* 2F953 (194899) */
+    5927, /* 2F954 (194900) */
+    5928, /* 2F955 (194901) */
+    3620, /* 2F956 (194902) */
+    5929, /* 2F957 (194903) */
+    5930, /* 2F958 (194904) */
+    3670, /* 2F959 (194905) */
+    5931, /* 2F95A (194906) */
+    5932, /* 2F95B (194907) */
+    5933, /* 2F95C (194908) */
+    5934, /* 2F95D (194909) */
+    5934, /* 2F95E (194910) */
+    5935, /* 2F95F (194911) */
+    5936, /* 2F960 (194912) */
+    5937, /* 2F961 (194913) */
+    5938, /* 2F962 (194914) */
+    5939, /* 2F963 (194915) */
+    5940, /* 2F964 (194916) */
+    5941, /* 2F965 (194917) */
+    5942, /* 2F966 (194918) */
+    5943, /* 2F967 (194919) */
+    5944, /* 2F968 (194920) */
+    5945, /* 2F969 (194921) */
+    5946, /* 2F96A (194922) */
+    5947, /* 2F96B (194923) */
+    5948, /* 2F96C (194924) */
+    5949, /* 2F96D (194925) */
+    5950, /* 2F96E (194926) */
+    5951, /* 2F96F (194927) */
+    5952, /* 2F970 (194928) */
+    5953, /* 2F971 (194929) */
+    5954, /* 2F972 (194930) */
+    5955, /* 2F973 (194931) */
+    5956, /* 2F974 (194932) */
+    5957, /* 2F975 (194933) */
+    5958, /* 2F976 (194934) */
+    5959, /* 2F977 (194935) */
+    5960, /* 2F978 (194936) */
+    5961, /* 2F979 (194937) */
+    3676, /* 2F97A (194938) */
+    5962, /* 2F97B (194939) */
+    5963, /* 2F97C (194940) */
+    5964, /* 2F97D (194941) */
+    5965, /* 2F97E (194942) */
+    5966, /* 2F97F (194943) */
+    5967, /* 2F980 (194944) */
+    5968, /* 2F981 (194945) */
+    5969, /* 2F982 (194946) */
+    5970, /* 2F983 (194947) */
+    5971, /* 2F984 (194948) */
+    5972, /* 2F985 (194949) */
+    5973, /* 2F986 (194950) */
+    5974, /* 2F987 (194951) */
+    5975, /* 2F988 (194952) */
+    5976, /* 2F989 (194953) */
+    5977, /* 2F98A (194954) */
+    5763, /* 2F98B (194955) */
+    5978, /* 2F98C (194956) */
+    5979, /* 2F98D (194957) */
+    5980, /* 2F98E (194958) */
+    5981, /* 2F98F (194959) */
+    5982, /* 2F990 (194960) */
+    5983, /* 2F991 (194961) */
+    5984, /* 2F992 (194962) */
+    5985, /* 2F993 (194963) */
+    5986, /* 2F994 (194964) */
+    5987, /* 2F995 (194965) */
+    5988, /* 2F996 (194966) */
+    5989, /* 2F997 (194967) */
+    3462, /* 2F998 (194968) */
+    5990, /* 2F999 (194969) */
+    5991, /* 2F99A (194970) */
+    5992, /* 2F99B (194971) */
+    5993, /* 2F99C (194972) */
+    5994, /* 2F99D (194973) */
+    5995, /* 2F99E (194974) */
+    3679, /* 2F99F (194975) */
+    5996, /* 2F9A0 (194976) */
+    5997, /* 2F9A1 (194977) */
+    5998, /* 2F9A2 (194978) */
+    5999, /* 2F9A3 (194979) */
+    6000, /* 2F9A4 (194980) */
+    6001, /* 2F9A5 (194981) */
+    6002, /* 2F9A6 (194982) */
+    6003, /* 2F9A7 (194983) */
+    6004, /* 2F9A8 (194984) */
+    6005, /* 2F9A9 (194985) */
+    6006, /* 2F9AA (194986) */
+    6007, /* 2F9AB (194987) */
+    6008, /* 2F9AC (194988) */
+    6009, /* 2F9AD (194989) */
+    6010, /* 2F9AE (194990) */
+    6011, /* 2F9AF (194991) */
+    6012, /* 2F9B0 (194992) */
+    6013, /* 2F9B1 (194993) */
+    6014, /* 2F9B2 (194994) */
+    6015, /* 2F9B3 (194995) */
+    3401, /* 2F9B4 (194996) */
+    6016, /* 2F9B5 (194997) */
+    6017, /* 2F9B6 (194998) */
+    6018, /* 2F9B7 (194999) */
+    6019, /* 2F9B8 (195000) */
+    6020, /* 2F9B9 (195001) */
+    6021, /* 2F9BA (195002) */
+    3747, /* 2F9BB (195003) */
+    6022, /* 2F9BC (195004) */
+    6023, /* 2F9BD (195005) */
+    6024, /* 2F9BE (195006) */
+    6025, /* 2F9BF (195007) */
+    6026, /* 2F9C0 (195008) */
+    6027, /* 2F9C1 (195009) */
+    6028, /* 2F9C2 (195010) */
+    6029, /* 2F9C3 (195011) */
+    6030, /* 2F9C4 (195012) */
+    6031, /* 2F9C5 (195013) */
+    6032, /* 2F9C6 (195014) */
+    6033, /* 2F9C7 (195015) */
+    6034, /* 2F9C8 (195016) */
+    6035, /* 2F9C9 (195017) */
+    6036, /* 2F9CA (195018) */
+    6037, /* 2F9CB (195019) */
+    6038, /* 2F9CC (195020) */
+    6039, /* 2F9CD (195021) */
+    6040, /* 2F9CE (195022) */
+    6041, /* 2F9CF (195023) */
+    3752, /* 2F9D0 (195024) */
+    3753, /* 2F9D1 (195025) */
+    6042, /* 2F9D2 (195026) */
+    6043, /* 2F9D3 (195027) */
+    6044, /* 2F9D4 (195028) */
+    6045, /* 2F9D5 (195029) */
+    6046, /* 2F9D6 (195030) */
+    6047, /* 2F9D7 (195031) */
+    6048, /* 2F9D8 (195032) */
+    6049, /* 2F9D9 (195033) */
+    6050, /* 2F9DA (195034) */
+    6051, /* 2F9DB (195035) */
+    6052, /* 2F9DC (195036) */
+    6053, /* 2F9DD (195037) */
+    6054, /* 2F9DE (195038) */
+    3754, /* 2F9DF (195039) */
+    6055, /* 2F9E0 (195040) */
+    6056, /* 2F9E1 (195041) */
+    6057, /* 2F9E2 (195042) */
+    6058, /* 2F9E3 (195043) */
+    6059, /* 2F9E4 (195044) */
+    6060, /* 2F9E5 (195045) */
+    6061, /* 2F9E6 (195046) */
+    6062, /* 2F9E7 (195047) */
+    6063, /* 2F9E8 (195048) */
+    6064, /* 2F9E9 (195049) */
+    6065, /* 2F9EA (195050) */
+    6066, /* 2F9EB (195051) */
+    6067, /* 2F9EC (195052) */
+    6068, /* 2F9ED (195053) */
+    6069, /* 2F9EE (195054) */
+    6070, /* 2F9EF (195055) */
+    6071, /* 2F9F0 (195056) */
+    6072, /* 2F9F1 (195057) */
+    6073, /* 2F9F2 (195058) */
+    6074, /* 2F9F3 (195059) */
+    6075, /* 2F9F4 (195060) */
+    6076, /* 2F9F5 (195061) */
+    6077, /* 2F9F6 (195062) */
+    6078, /* 2F9F7 (195063) */
+    6079, /* 2F9F8 (195064) */
+    6080, /* 2F9F9 (195065) */
+    6081, /* 2F9FA (195066) */
+    6082, /* 2F9FB (195067) */
+    6083, /* 2F9FC (195068) */
+    6084, /* 2F9FD (195069) */
+    3760, /* 2F9FE (195070) */
+    3760, /* 2F9FF (195071) */
+    6085, /* 2FA00 (195072) */
+    6086, /* 2FA01 (195073) */
+    6087, /* 2FA02 (195074) */
+    6088, /* 2FA03 (195075) */
+    6089, /* 2FA04 (195076) */
+    6090, /* 2FA05 (195077) */
+    6091, /* 2FA06 (195078) */
+    6092, /* 2FA07 (195079) */
+    6093, /* 2FA08 (195080) */
+    6094, /* 2FA09 (195081) */
+    3761, /* 2FA0A (195082) */
+    6095, /* 2FA0B (195083) */
+    6096, /* 2FA0C (195084) */
+    6097, /* 2FA0D (195085) */
+    6098, /* 2FA0E (195086) */
+    6099, /* 2FA0F (195087) */
+    6100, /* 2FA10 (195088) */
+    6101, /* 2FA11 (195089) */
+    6102, /* 2FA12 (195090) */
+    6103, /* 2FA13 (195091) */
+    6104, /* 2FA14 (195092) */
+    6105, /* 2FA15 (195093) */
+    6106, /* 2FA16 (195094) */
+    6107, /* 2FA17 (195095) */
+    6108, /* 2FA18 (195096) */
+    6109, /* 2FA19 (195097) */
+    6110, /* 2FA1A (195098) */
+    6111, /* 2FA1B (195099) */
+    6112, /* 2FA1C (195100) */
+    6113, /* 2FA1D (195101) */
     56, /* 2FA1E (195102) */
     56, /* 2FA1F (195103) */
     56, /* 2FA20 (195104) */
@@ -183606,6 +183840,4304 @@ static const uint32_t lxb_unicode_table_map_110576_205744[95168] =
     1, /* 323AD (205741) */
     1, /* 323AE (205742) */
     1, /* 323AF (205743) */
+    1, /* 323B0 (205744) */
+    1, /* 323B1 (205745) */
+    1, /* 323B2 (205746) */
+    1, /* 323B3 (205747) */
+    1, /* 323B4 (205748) */
+    1, /* 323B5 (205749) */
+    1, /* 323B6 (205750) */
+    1, /* 323B7 (205751) */
+    1, /* 323B8 (205752) */
+    1, /* 323B9 (205753) */
+    1, /* 323BA (205754) */
+    1, /* 323BB (205755) */
+    1, /* 323BC (205756) */
+    1, /* 323BD (205757) */
+    1, /* 323BE (205758) */
+    1, /* 323BF (205759) */
+    1, /* 323C0 (205760) */
+    1, /* 323C1 (205761) */
+    1, /* 323C2 (205762) */
+    1, /* 323C3 (205763) */
+    1, /* 323C4 (205764) */
+    1, /* 323C5 (205765) */
+    1, /* 323C6 (205766) */
+    1, /* 323C7 (205767) */
+    1, /* 323C8 (205768) */
+    1, /* 323C9 (205769) */
+    1, /* 323CA (205770) */
+    1, /* 323CB (205771) */
+    1, /* 323CC (205772) */
+    1, /* 323CD (205773) */
+    1, /* 323CE (205774) */
+    1, /* 323CF (205775) */
+    1, /* 323D0 (205776) */
+    1, /* 323D1 (205777) */
+    1, /* 323D2 (205778) */
+    1, /* 323D3 (205779) */
+    1, /* 323D4 (205780) */
+    1, /* 323D5 (205781) */
+    1, /* 323D6 (205782) */
+    1, /* 323D7 (205783) */
+    1, /* 323D8 (205784) */
+    1, /* 323D9 (205785) */
+    1, /* 323DA (205786) */
+    1, /* 323DB (205787) */
+    1, /* 323DC (205788) */
+    1, /* 323DD (205789) */
+    1, /* 323DE (205790) */
+    1, /* 323DF (205791) */
+    1, /* 323E0 (205792) */
+    1, /* 323E1 (205793) */
+    1, /* 323E2 (205794) */
+    1, /* 323E3 (205795) */
+    1, /* 323E4 (205796) */
+    1, /* 323E5 (205797) */
+    1, /* 323E6 (205798) */
+    1, /* 323E7 (205799) */
+    1, /* 323E8 (205800) */
+    1, /* 323E9 (205801) */
+    1, /* 323EA (205802) */
+    1, /* 323EB (205803) */
+    1, /* 323EC (205804) */
+    1, /* 323ED (205805) */
+    1, /* 323EE (205806) */
+    1, /* 323EF (205807) */
+    1, /* 323F0 (205808) */
+    1, /* 323F1 (205809) */
+    1, /* 323F2 (205810) */
+    1, /* 323F3 (205811) */
+    1, /* 323F4 (205812) */
+    1, /* 323F5 (205813) */
+    1, /* 323F6 (205814) */
+    1, /* 323F7 (205815) */
+    1, /* 323F8 (205816) */
+    1, /* 323F9 (205817) */
+    1, /* 323FA (205818) */
+    1, /* 323FB (205819) */
+    1, /* 323FC (205820) */
+    1, /* 323FD (205821) */
+    1, /* 323FE (205822) */
+    1, /* 323FF (205823) */
+    1, /* 32400 (205824) */
+    1, /* 32401 (205825) */
+    1, /* 32402 (205826) */
+    1, /* 32403 (205827) */
+    1, /* 32404 (205828) */
+    1, /* 32405 (205829) */
+    1, /* 32406 (205830) */
+    1, /* 32407 (205831) */
+    1, /* 32408 (205832) */
+    1, /* 32409 (205833) */
+    1, /* 3240A (205834) */
+    1, /* 3240B (205835) */
+    1, /* 3240C (205836) */
+    1, /* 3240D (205837) */
+    1, /* 3240E (205838) */
+    1, /* 3240F (205839) */
+    1, /* 32410 (205840) */
+    1, /* 32411 (205841) */
+    1, /* 32412 (205842) */
+    1, /* 32413 (205843) */
+    1, /* 32414 (205844) */
+    1, /* 32415 (205845) */
+    1, /* 32416 (205846) */
+    1, /* 32417 (205847) */
+    1, /* 32418 (205848) */
+    1, /* 32419 (205849) */
+    1, /* 3241A (205850) */
+    1, /* 3241B (205851) */
+    1, /* 3241C (205852) */
+    1, /* 3241D (205853) */
+    1, /* 3241E (205854) */
+    1, /* 3241F (205855) */
+    1, /* 32420 (205856) */
+    1, /* 32421 (205857) */
+    1, /* 32422 (205858) */
+    1, /* 32423 (205859) */
+    1, /* 32424 (205860) */
+    1, /* 32425 (205861) */
+    1, /* 32426 (205862) */
+    1, /* 32427 (205863) */
+    1, /* 32428 (205864) */
+    1, /* 32429 (205865) */
+    1, /* 3242A (205866) */
+    1, /* 3242B (205867) */
+    1, /* 3242C (205868) */
+    1, /* 3242D (205869) */
+    1, /* 3242E (205870) */
+    1, /* 3242F (205871) */
+    1, /* 32430 (205872) */
+    1, /* 32431 (205873) */
+    1, /* 32432 (205874) */
+    1, /* 32433 (205875) */
+    1, /* 32434 (205876) */
+    1, /* 32435 (205877) */
+    1, /* 32436 (205878) */
+    1, /* 32437 (205879) */
+    1, /* 32438 (205880) */
+    1, /* 32439 (205881) */
+    1, /* 3243A (205882) */
+    1, /* 3243B (205883) */
+    1, /* 3243C (205884) */
+    1, /* 3243D (205885) */
+    1, /* 3243E (205886) */
+    1, /* 3243F (205887) */
+    1, /* 32440 (205888) */
+    1, /* 32441 (205889) */
+    1, /* 32442 (205890) */
+    1, /* 32443 (205891) */
+    1, /* 32444 (205892) */
+    1, /* 32445 (205893) */
+    1, /* 32446 (205894) */
+    1, /* 32447 (205895) */
+    1, /* 32448 (205896) */
+    1, /* 32449 (205897) */
+    1, /* 3244A (205898) */
+    1, /* 3244B (205899) */
+    1, /* 3244C (205900) */
+    1, /* 3244D (205901) */
+    1, /* 3244E (205902) */
+    1, /* 3244F (205903) */
+    1, /* 32450 (205904) */
+    1, /* 32451 (205905) */
+    1, /* 32452 (205906) */
+    1, /* 32453 (205907) */
+    1, /* 32454 (205908) */
+    1, /* 32455 (205909) */
+    1, /* 32456 (205910) */
+    1, /* 32457 (205911) */
+    1, /* 32458 (205912) */
+    1, /* 32459 (205913) */
+    1, /* 3245A (205914) */
+    1, /* 3245B (205915) */
+    1, /* 3245C (205916) */
+    1, /* 3245D (205917) */
+    1, /* 3245E (205918) */
+    1, /* 3245F (205919) */
+    1, /* 32460 (205920) */
+    1, /* 32461 (205921) */
+    1, /* 32462 (205922) */
+    1, /* 32463 (205923) */
+    1, /* 32464 (205924) */
+    1, /* 32465 (205925) */
+    1, /* 32466 (205926) */
+    1, /* 32467 (205927) */
+    1, /* 32468 (205928) */
+    1, /* 32469 (205929) */
+    1, /* 3246A (205930) */
+    1, /* 3246B (205931) */
+    1, /* 3246C (205932) */
+    1, /* 3246D (205933) */
+    1, /* 3246E (205934) */
+    1, /* 3246F (205935) */
+    1, /* 32470 (205936) */
+    1, /* 32471 (205937) */
+    1, /* 32472 (205938) */
+    1, /* 32473 (205939) */
+    1, /* 32474 (205940) */
+    1, /* 32475 (205941) */
+    1, /* 32476 (205942) */
+    1, /* 32477 (205943) */
+    1, /* 32478 (205944) */
+    1, /* 32479 (205945) */
+    1, /* 3247A (205946) */
+    1, /* 3247B (205947) */
+    1, /* 3247C (205948) */
+    1, /* 3247D (205949) */
+    1, /* 3247E (205950) */
+    1, /* 3247F (205951) */
+    1, /* 32480 (205952) */
+    1, /* 32481 (205953) */
+    1, /* 32482 (205954) */
+    1, /* 32483 (205955) */
+    1, /* 32484 (205956) */
+    1, /* 32485 (205957) */
+    1, /* 32486 (205958) */
+    1, /* 32487 (205959) */
+    1, /* 32488 (205960) */
+    1, /* 32489 (205961) */
+    1, /* 3248A (205962) */
+    1, /* 3248B (205963) */
+    1, /* 3248C (205964) */
+    1, /* 3248D (205965) */
+    1, /* 3248E (205966) */
+    1, /* 3248F (205967) */
+    1, /* 32490 (205968) */
+    1, /* 32491 (205969) */
+    1, /* 32492 (205970) */
+    1, /* 32493 (205971) */
+    1, /* 32494 (205972) */
+    1, /* 32495 (205973) */
+    1, /* 32496 (205974) */
+    1, /* 32497 (205975) */
+    1, /* 32498 (205976) */
+    1, /* 32499 (205977) */
+    1, /* 3249A (205978) */
+    1, /* 3249B (205979) */
+    1, /* 3249C (205980) */
+    1, /* 3249D (205981) */
+    1, /* 3249E (205982) */
+    1, /* 3249F (205983) */
+    1, /* 324A0 (205984) */
+    1, /* 324A1 (205985) */
+    1, /* 324A2 (205986) */
+    1, /* 324A3 (205987) */
+    1, /* 324A4 (205988) */
+    1, /* 324A5 (205989) */
+    1, /* 324A6 (205990) */
+    1, /* 324A7 (205991) */
+    1, /* 324A8 (205992) */
+    1, /* 324A9 (205993) */
+    1, /* 324AA (205994) */
+    1, /* 324AB (205995) */
+    1, /* 324AC (205996) */
+    1, /* 324AD (205997) */
+    1, /* 324AE (205998) */
+    1, /* 324AF (205999) */
+    1, /* 324B0 (206000) */
+    1, /* 324B1 (206001) */
+    1, /* 324B2 (206002) */
+    1, /* 324B3 (206003) */
+    1, /* 324B4 (206004) */
+    1, /* 324B5 (206005) */
+    1, /* 324B6 (206006) */
+    1, /* 324B7 (206007) */
+    1, /* 324B8 (206008) */
+    1, /* 324B9 (206009) */
+    1, /* 324BA (206010) */
+    1, /* 324BB (206011) */
+    1, /* 324BC (206012) */
+    1, /* 324BD (206013) */
+    1, /* 324BE (206014) */
+    1, /* 324BF (206015) */
+    1, /* 324C0 (206016) */
+    1, /* 324C1 (206017) */
+    1, /* 324C2 (206018) */
+    1, /* 324C3 (206019) */
+    1, /* 324C4 (206020) */
+    1, /* 324C5 (206021) */
+    1, /* 324C6 (206022) */
+    1, /* 324C7 (206023) */
+    1, /* 324C8 (206024) */
+    1, /* 324C9 (206025) */
+    1, /* 324CA (206026) */
+    1, /* 324CB (206027) */
+    1, /* 324CC (206028) */
+    1, /* 324CD (206029) */
+    1, /* 324CE (206030) */
+    1, /* 324CF (206031) */
+    1, /* 324D0 (206032) */
+    1, /* 324D1 (206033) */
+    1, /* 324D2 (206034) */
+    1, /* 324D3 (206035) */
+    1, /* 324D4 (206036) */
+    1, /* 324D5 (206037) */
+    1, /* 324D6 (206038) */
+    1, /* 324D7 (206039) */
+    1, /* 324D8 (206040) */
+    1, /* 324D9 (206041) */
+    1, /* 324DA (206042) */
+    1, /* 324DB (206043) */
+    1, /* 324DC (206044) */
+    1, /* 324DD (206045) */
+    1, /* 324DE (206046) */
+    1, /* 324DF (206047) */
+    1, /* 324E0 (206048) */
+    1, /* 324E1 (206049) */
+    1, /* 324E2 (206050) */
+    1, /* 324E3 (206051) */
+    1, /* 324E4 (206052) */
+    1, /* 324E5 (206053) */
+    1, /* 324E6 (206054) */
+    1, /* 324E7 (206055) */
+    1, /* 324E8 (206056) */
+    1, /* 324E9 (206057) */
+    1, /* 324EA (206058) */
+    1, /* 324EB (206059) */
+    1, /* 324EC (206060) */
+    1, /* 324ED (206061) */
+    1, /* 324EE (206062) */
+    1, /* 324EF (206063) */
+    1, /* 324F0 (206064) */
+    1, /* 324F1 (206065) */
+    1, /* 324F2 (206066) */
+    1, /* 324F3 (206067) */
+    1, /* 324F4 (206068) */
+    1, /* 324F5 (206069) */
+    1, /* 324F6 (206070) */
+    1, /* 324F7 (206071) */
+    1, /* 324F8 (206072) */
+    1, /* 324F9 (206073) */
+    1, /* 324FA (206074) */
+    1, /* 324FB (206075) */
+    1, /* 324FC (206076) */
+    1, /* 324FD (206077) */
+    1, /* 324FE (206078) */
+    1, /* 324FF (206079) */
+    1, /* 32500 (206080) */
+    1, /* 32501 (206081) */
+    1, /* 32502 (206082) */
+    1, /* 32503 (206083) */
+    1, /* 32504 (206084) */
+    1, /* 32505 (206085) */
+    1, /* 32506 (206086) */
+    1, /* 32507 (206087) */
+    1, /* 32508 (206088) */
+    1, /* 32509 (206089) */
+    1, /* 3250A (206090) */
+    1, /* 3250B (206091) */
+    1, /* 3250C (206092) */
+    1, /* 3250D (206093) */
+    1, /* 3250E (206094) */
+    1, /* 3250F (206095) */
+    1, /* 32510 (206096) */
+    1, /* 32511 (206097) */
+    1, /* 32512 (206098) */
+    1, /* 32513 (206099) */
+    1, /* 32514 (206100) */
+    1, /* 32515 (206101) */
+    1, /* 32516 (206102) */
+    1, /* 32517 (206103) */
+    1, /* 32518 (206104) */
+    1, /* 32519 (206105) */
+    1, /* 3251A (206106) */
+    1, /* 3251B (206107) */
+    1, /* 3251C (206108) */
+    1, /* 3251D (206109) */
+    1, /* 3251E (206110) */
+    1, /* 3251F (206111) */
+    1, /* 32520 (206112) */
+    1, /* 32521 (206113) */
+    1, /* 32522 (206114) */
+    1, /* 32523 (206115) */
+    1, /* 32524 (206116) */
+    1, /* 32525 (206117) */
+    1, /* 32526 (206118) */
+    1, /* 32527 (206119) */
+    1, /* 32528 (206120) */
+    1, /* 32529 (206121) */
+    1, /* 3252A (206122) */
+    1, /* 3252B (206123) */
+    1, /* 3252C (206124) */
+    1, /* 3252D (206125) */
+    1, /* 3252E (206126) */
+    1, /* 3252F (206127) */
+    1, /* 32530 (206128) */
+    1, /* 32531 (206129) */
+    1, /* 32532 (206130) */
+    1, /* 32533 (206131) */
+    1, /* 32534 (206132) */
+    1, /* 32535 (206133) */
+    1, /* 32536 (206134) */
+    1, /* 32537 (206135) */
+    1, /* 32538 (206136) */
+    1, /* 32539 (206137) */
+    1, /* 3253A (206138) */
+    1, /* 3253B (206139) */
+    1, /* 3253C (206140) */
+    1, /* 3253D (206141) */
+    1, /* 3253E (206142) */
+    1, /* 3253F (206143) */
+    1, /* 32540 (206144) */
+    1, /* 32541 (206145) */
+    1, /* 32542 (206146) */
+    1, /* 32543 (206147) */
+    1, /* 32544 (206148) */
+    1, /* 32545 (206149) */
+    1, /* 32546 (206150) */
+    1, /* 32547 (206151) */
+    1, /* 32548 (206152) */
+    1, /* 32549 (206153) */
+    1, /* 3254A (206154) */
+    1, /* 3254B (206155) */
+    1, /* 3254C (206156) */
+    1, /* 3254D (206157) */
+    1, /* 3254E (206158) */
+    1, /* 3254F (206159) */
+    1, /* 32550 (206160) */
+    1, /* 32551 (206161) */
+    1, /* 32552 (206162) */
+    1, /* 32553 (206163) */
+    1, /* 32554 (206164) */
+    1, /* 32555 (206165) */
+    1, /* 32556 (206166) */
+    1, /* 32557 (206167) */
+    1, /* 32558 (206168) */
+    1, /* 32559 (206169) */
+    1, /* 3255A (206170) */
+    1, /* 3255B (206171) */
+    1, /* 3255C (206172) */
+    1, /* 3255D (206173) */
+    1, /* 3255E (206174) */
+    1, /* 3255F (206175) */
+    1, /* 32560 (206176) */
+    1, /* 32561 (206177) */
+    1, /* 32562 (206178) */
+    1, /* 32563 (206179) */
+    1, /* 32564 (206180) */
+    1, /* 32565 (206181) */
+    1, /* 32566 (206182) */
+    1, /* 32567 (206183) */
+    1, /* 32568 (206184) */
+    1, /* 32569 (206185) */
+    1, /* 3256A (206186) */
+    1, /* 3256B (206187) */
+    1, /* 3256C (206188) */
+    1, /* 3256D (206189) */
+    1, /* 3256E (206190) */
+    1, /* 3256F (206191) */
+    1, /* 32570 (206192) */
+    1, /* 32571 (206193) */
+    1, /* 32572 (206194) */
+    1, /* 32573 (206195) */
+    1, /* 32574 (206196) */
+    1, /* 32575 (206197) */
+    1, /* 32576 (206198) */
+    1, /* 32577 (206199) */
+    1, /* 32578 (206200) */
+    1, /* 32579 (206201) */
+    1, /* 3257A (206202) */
+    1, /* 3257B (206203) */
+    1, /* 3257C (206204) */
+    1, /* 3257D (206205) */
+    1, /* 3257E (206206) */
+    1, /* 3257F (206207) */
+    1, /* 32580 (206208) */
+    1, /* 32581 (206209) */
+    1, /* 32582 (206210) */
+    1, /* 32583 (206211) */
+    1, /* 32584 (206212) */
+    1, /* 32585 (206213) */
+    1, /* 32586 (206214) */
+    1, /* 32587 (206215) */
+    1, /* 32588 (206216) */
+    1, /* 32589 (206217) */
+    1, /* 3258A (206218) */
+    1, /* 3258B (206219) */
+    1, /* 3258C (206220) */
+    1, /* 3258D (206221) */
+    1, /* 3258E (206222) */
+    1, /* 3258F (206223) */
+    1, /* 32590 (206224) */
+    1, /* 32591 (206225) */
+    1, /* 32592 (206226) */
+    1, /* 32593 (206227) */
+    1, /* 32594 (206228) */
+    1, /* 32595 (206229) */
+    1, /* 32596 (206230) */
+    1, /* 32597 (206231) */
+    1, /* 32598 (206232) */
+    1, /* 32599 (206233) */
+    1, /* 3259A (206234) */
+    1, /* 3259B (206235) */
+    1, /* 3259C (206236) */
+    1, /* 3259D (206237) */
+    1, /* 3259E (206238) */
+    1, /* 3259F (206239) */
+    1, /* 325A0 (206240) */
+    1, /* 325A1 (206241) */
+    1, /* 325A2 (206242) */
+    1, /* 325A3 (206243) */
+    1, /* 325A4 (206244) */
+    1, /* 325A5 (206245) */
+    1, /* 325A6 (206246) */
+    1, /* 325A7 (206247) */
+    1, /* 325A8 (206248) */
+    1, /* 325A9 (206249) */
+    1, /* 325AA (206250) */
+    1, /* 325AB (206251) */
+    1, /* 325AC (206252) */
+    1, /* 325AD (206253) */
+    1, /* 325AE (206254) */
+    1, /* 325AF (206255) */
+    1, /* 325B0 (206256) */
+    1, /* 325B1 (206257) */
+    1, /* 325B2 (206258) */
+    1, /* 325B3 (206259) */
+    1, /* 325B4 (206260) */
+    1, /* 325B5 (206261) */
+    1, /* 325B6 (206262) */
+    1, /* 325B7 (206263) */
+    1, /* 325B8 (206264) */
+    1, /* 325B9 (206265) */
+    1, /* 325BA (206266) */
+    1, /* 325BB (206267) */
+    1, /* 325BC (206268) */
+    1, /* 325BD (206269) */
+    1, /* 325BE (206270) */
+    1, /* 325BF (206271) */
+    1, /* 325C0 (206272) */
+    1, /* 325C1 (206273) */
+    1, /* 325C2 (206274) */
+    1, /* 325C3 (206275) */
+    1, /* 325C4 (206276) */
+    1, /* 325C5 (206277) */
+    1, /* 325C6 (206278) */
+    1, /* 325C7 (206279) */
+    1, /* 325C8 (206280) */
+    1, /* 325C9 (206281) */
+    1, /* 325CA (206282) */
+    1, /* 325CB (206283) */
+    1, /* 325CC (206284) */
+    1, /* 325CD (206285) */
+    1, /* 325CE (206286) */
+    1, /* 325CF (206287) */
+    1, /* 325D0 (206288) */
+    1, /* 325D1 (206289) */
+    1, /* 325D2 (206290) */
+    1, /* 325D3 (206291) */
+    1, /* 325D4 (206292) */
+    1, /* 325D5 (206293) */
+    1, /* 325D6 (206294) */
+    1, /* 325D7 (206295) */
+    1, /* 325D8 (206296) */
+    1, /* 325D9 (206297) */
+    1, /* 325DA (206298) */
+    1, /* 325DB (206299) */
+    1, /* 325DC (206300) */
+    1, /* 325DD (206301) */
+    1, /* 325DE (206302) */
+    1, /* 325DF (206303) */
+    1, /* 325E0 (206304) */
+    1, /* 325E1 (206305) */
+    1, /* 325E2 (206306) */
+    1, /* 325E3 (206307) */
+    1, /* 325E4 (206308) */
+    1, /* 325E5 (206309) */
+    1, /* 325E6 (206310) */
+    1, /* 325E7 (206311) */
+    1, /* 325E8 (206312) */
+    1, /* 325E9 (206313) */
+    1, /* 325EA (206314) */
+    1, /* 325EB (206315) */
+    1, /* 325EC (206316) */
+    1, /* 325ED (206317) */
+    1, /* 325EE (206318) */
+    1, /* 325EF (206319) */
+    1, /* 325F0 (206320) */
+    1, /* 325F1 (206321) */
+    1, /* 325F2 (206322) */
+    1, /* 325F3 (206323) */
+    1, /* 325F4 (206324) */
+    1, /* 325F5 (206325) */
+    1, /* 325F6 (206326) */
+    1, /* 325F7 (206327) */
+    1, /* 325F8 (206328) */
+    1, /* 325F9 (206329) */
+    1, /* 325FA (206330) */
+    1, /* 325FB (206331) */
+    1, /* 325FC (206332) */
+    1, /* 325FD (206333) */
+    1, /* 325FE (206334) */
+    1, /* 325FF (206335) */
+    1, /* 32600 (206336) */
+    1, /* 32601 (206337) */
+    1, /* 32602 (206338) */
+    1, /* 32603 (206339) */
+    1, /* 32604 (206340) */
+    1, /* 32605 (206341) */
+    1, /* 32606 (206342) */
+    1, /* 32607 (206343) */
+    1, /* 32608 (206344) */
+    1, /* 32609 (206345) */
+    1, /* 3260A (206346) */
+    1, /* 3260B (206347) */
+    1, /* 3260C (206348) */
+    1, /* 3260D (206349) */
+    1, /* 3260E (206350) */
+    1, /* 3260F (206351) */
+    1, /* 32610 (206352) */
+    1, /* 32611 (206353) */
+    1, /* 32612 (206354) */
+    1, /* 32613 (206355) */
+    1, /* 32614 (206356) */
+    1, /* 32615 (206357) */
+    1, /* 32616 (206358) */
+    1, /* 32617 (206359) */
+    1, /* 32618 (206360) */
+    1, /* 32619 (206361) */
+    1, /* 3261A (206362) */
+    1, /* 3261B (206363) */
+    1, /* 3261C (206364) */
+    1, /* 3261D (206365) */
+    1, /* 3261E (206366) */
+    1, /* 3261F (206367) */
+    1, /* 32620 (206368) */
+    1, /* 32621 (206369) */
+    1, /* 32622 (206370) */
+    1, /* 32623 (206371) */
+    1, /* 32624 (206372) */
+    1, /* 32625 (206373) */
+    1, /* 32626 (206374) */
+    1, /* 32627 (206375) */
+    1, /* 32628 (206376) */
+    1, /* 32629 (206377) */
+    1, /* 3262A (206378) */
+    1, /* 3262B (206379) */
+    1, /* 3262C (206380) */
+    1, /* 3262D (206381) */
+    1, /* 3262E (206382) */
+    1, /* 3262F (206383) */
+    1, /* 32630 (206384) */
+    1, /* 32631 (206385) */
+    1, /* 32632 (206386) */
+    1, /* 32633 (206387) */
+    1, /* 32634 (206388) */
+    1, /* 32635 (206389) */
+    1, /* 32636 (206390) */
+    1, /* 32637 (206391) */
+    1, /* 32638 (206392) */
+    1, /* 32639 (206393) */
+    1, /* 3263A (206394) */
+    1, /* 3263B (206395) */
+    1, /* 3263C (206396) */
+    1, /* 3263D (206397) */
+    1, /* 3263E (206398) */
+    1, /* 3263F (206399) */
+    1, /* 32640 (206400) */
+    1, /* 32641 (206401) */
+    1, /* 32642 (206402) */
+    1, /* 32643 (206403) */
+    1, /* 32644 (206404) */
+    1, /* 32645 (206405) */
+    1, /* 32646 (206406) */
+    1, /* 32647 (206407) */
+    1, /* 32648 (206408) */
+    1, /* 32649 (206409) */
+    1, /* 3264A (206410) */
+    1, /* 3264B (206411) */
+    1, /* 3264C (206412) */
+    1, /* 3264D (206413) */
+    1, /* 3264E (206414) */
+    1, /* 3264F (206415) */
+    1, /* 32650 (206416) */
+    1, /* 32651 (206417) */
+    1, /* 32652 (206418) */
+    1, /* 32653 (206419) */
+    1, /* 32654 (206420) */
+    1, /* 32655 (206421) */
+    1, /* 32656 (206422) */
+    1, /* 32657 (206423) */
+    1, /* 32658 (206424) */
+    1, /* 32659 (206425) */
+    1, /* 3265A (206426) */
+    1, /* 3265B (206427) */
+    1, /* 3265C (206428) */
+    1, /* 3265D (206429) */
+    1, /* 3265E (206430) */
+    1, /* 3265F (206431) */
+    1, /* 32660 (206432) */
+    1, /* 32661 (206433) */
+    1, /* 32662 (206434) */
+    1, /* 32663 (206435) */
+    1, /* 32664 (206436) */
+    1, /* 32665 (206437) */
+    1, /* 32666 (206438) */
+    1, /* 32667 (206439) */
+    1, /* 32668 (206440) */
+    1, /* 32669 (206441) */
+    1, /* 3266A (206442) */
+    1, /* 3266B (206443) */
+    1, /* 3266C (206444) */
+    1, /* 3266D (206445) */
+    1, /* 3266E (206446) */
+    1, /* 3266F (206447) */
+    1, /* 32670 (206448) */
+    1, /* 32671 (206449) */
+    1, /* 32672 (206450) */
+    1, /* 32673 (206451) */
+    1, /* 32674 (206452) */
+    1, /* 32675 (206453) */
+    1, /* 32676 (206454) */
+    1, /* 32677 (206455) */
+    1, /* 32678 (206456) */
+    1, /* 32679 (206457) */
+    1, /* 3267A (206458) */
+    1, /* 3267B (206459) */
+    1, /* 3267C (206460) */
+    1, /* 3267D (206461) */
+    1, /* 3267E (206462) */
+    1, /* 3267F (206463) */
+    1, /* 32680 (206464) */
+    1, /* 32681 (206465) */
+    1, /* 32682 (206466) */
+    1, /* 32683 (206467) */
+    1, /* 32684 (206468) */
+    1, /* 32685 (206469) */
+    1, /* 32686 (206470) */
+    1, /* 32687 (206471) */
+    1, /* 32688 (206472) */
+    1, /* 32689 (206473) */
+    1, /* 3268A (206474) */
+    1, /* 3268B (206475) */
+    1, /* 3268C (206476) */
+    1, /* 3268D (206477) */
+    1, /* 3268E (206478) */
+    1, /* 3268F (206479) */
+    1, /* 32690 (206480) */
+    1, /* 32691 (206481) */
+    1, /* 32692 (206482) */
+    1, /* 32693 (206483) */
+    1, /* 32694 (206484) */
+    1, /* 32695 (206485) */
+    1, /* 32696 (206486) */
+    1, /* 32697 (206487) */
+    1, /* 32698 (206488) */
+    1, /* 32699 (206489) */
+    1, /* 3269A (206490) */
+    1, /* 3269B (206491) */
+    1, /* 3269C (206492) */
+    1, /* 3269D (206493) */
+    1, /* 3269E (206494) */
+    1, /* 3269F (206495) */
+    1, /* 326A0 (206496) */
+    1, /* 326A1 (206497) */
+    1, /* 326A2 (206498) */
+    1, /* 326A3 (206499) */
+    1, /* 326A4 (206500) */
+    1, /* 326A5 (206501) */
+    1, /* 326A6 (206502) */
+    1, /* 326A7 (206503) */
+    1, /* 326A8 (206504) */
+    1, /* 326A9 (206505) */
+    1, /* 326AA (206506) */
+    1, /* 326AB (206507) */
+    1, /* 326AC (206508) */
+    1, /* 326AD (206509) */
+    1, /* 326AE (206510) */
+    1, /* 326AF (206511) */
+    1, /* 326B0 (206512) */
+    1, /* 326B1 (206513) */
+    1, /* 326B2 (206514) */
+    1, /* 326B3 (206515) */
+    1, /* 326B4 (206516) */
+    1, /* 326B5 (206517) */
+    1, /* 326B6 (206518) */
+    1, /* 326B7 (206519) */
+    1, /* 326B8 (206520) */
+    1, /* 326B9 (206521) */
+    1, /* 326BA (206522) */
+    1, /* 326BB (206523) */
+    1, /* 326BC (206524) */
+    1, /* 326BD (206525) */
+    1, /* 326BE (206526) */
+    1, /* 326BF (206527) */
+    1, /* 326C0 (206528) */
+    1, /* 326C1 (206529) */
+    1, /* 326C2 (206530) */
+    1, /* 326C3 (206531) */
+    1, /* 326C4 (206532) */
+    1, /* 326C5 (206533) */
+    1, /* 326C6 (206534) */
+    1, /* 326C7 (206535) */
+    1, /* 326C8 (206536) */
+    1, /* 326C9 (206537) */
+    1, /* 326CA (206538) */
+    1, /* 326CB (206539) */
+    1, /* 326CC (206540) */
+    1, /* 326CD (206541) */
+    1, /* 326CE (206542) */
+    1, /* 326CF (206543) */
+    1, /* 326D0 (206544) */
+    1, /* 326D1 (206545) */
+    1, /* 326D2 (206546) */
+    1, /* 326D3 (206547) */
+    1, /* 326D4 (206548) */
+    1, /* 326D5 (206549) */
+    1, /* 326D6 (206550) */
+    1, /* 326D7 (206551) */
+    1, /* 326D8 (206552) */
+    1, /* 326D9 (206553) */
+    1, /* 326DA (206554) */
+    1, /* 326DB (206555) */
+    1, /* 326DC (206556) */
+    1, /* 326DD (206557) */
+    1, /* 326DE (206558) */
+    1, /* 326DF (206559) */
+    1, /* 326E0 (206560) */
+    1, /* 326E1 (206561) */
+    1, /* 326E2 (206562) */
+    1, /* 326E3 (206563) */
+    1, /* 326E4 (206564) */
+    1, /* 326E5 (206565) */
+    1, /* 326E6 (206566) */
+    1, /* 326E7 (206567) */
+    1, /* 326E8 (206568) */
+    1, /* 326E9 (206569) */
+    1, /* 326EA (206570) */
+    1, /* 326EB (206571) */
+    1, /* 326EC (206572) */
+    1, /* 326ED (206573) */
+    1, /* 326EE (206574) */
+    1, /* 326EF (206575) */
+    1, /* 326F0 (206576) */
+    1, /* 326F1 (206577) */
+    1, /* 326F2 (206578) */
+    1, /* 326F3 (206579) */
+    1, /* 326F4 (206580) */
+    1, /* 326F5 (206581) */
+    1, /* 326F6 (206582) */
+    1, /* 326F7 (206583) */
+    1, /* 326F8 (206584) */
+    1, /* 326F9 (206585) */
+    1, /* 326FA (206586) */
+    1, /* 326FB (206587) */
+    1, /* 326FC (206588) */
+    1, /* 326FD (206589) */
+    1, /* 326FE (206590) */
+    1, /* 326FF (206591) */
+    1, /* 32700 (206592) */
+    1, /* 32701 (206593) */
+    1, /* 32702 (206594) */
+    1, /* 32703 (206595) */
+    1, /* 32704 (206596) */
+    1, /* 32705 (206597) */
+    1, /* 32706 (206598) */
+    1, /* 32707 (206599) */
+    1, /* 32708 (206600) */
+    1, /* 32709 (206601) */
+    1, /* 3270A (206602) */
+    1, /* 3270B (206603) */
+    1, /* 3270C (206604) */
+    1, /* 3270D (206605) */
+    1, /* 3270E (206606) */
+    1, /* 3270F (206607) */
+    1, /* 32710 (206608) */
+    1, /* 32711 (206609) */
+    1, /* 32712 (206610) */
+    1, /* 32713 (206611) */
+    1, /* 32714 (206612) */
+    1, /* 32715 (206613) */
+    1, /* 32716 (206614) */
+    1, /* 32717 (206615) */
+    1, /* 32718 (206616) */
+    1, /* 32719 (206617) */
+    1, /* 3271A (206618) */
+    1, /* 3271B (206619) */
+    1, /* 3271C (206620) */
+    1, /* 3271D (206621) */
+    1, /* 3271E (206622) */
+    1, /* 3271F (206623) */
+    1, /* 32720 (206624) */
+    1, /* 32721 (206625) */
+    1, /* 32722 (206626) */
+    1, /* 32723 (206627) */
+    1, /* 32724 (206628) */
+    1, /* 32725 (206629) */
+    1, /* 32726 (206630) */
+    1, /* 32727 (206631) */
+    1, /* 32728 (206632) */
+    1, /* 32729 (206633) */
+    1, /* 3272A (206634) */
+    1, /* 3272B (206635) */
+    1, /* 3272C (206636) */
+    1, /* 3272D (206637) */
+    1, /* 3272E (206638) */
+    1, /* 3272F (206639) */
+    1, /* 32730 (206640) */
+    1, /* 32731 (206641) */
+    1, /* 32732 (206642) */
+    1, /* 32733 (206643) */
+    1, /* 32734 (206644) */
+    1, /* 32735 (206645) */
+    1, /* 32736 (206646) */
+    1, /* 32737 (206647) */
+    1, /* 32738 (206648) */
+    1, /* 32739 (206649) */
+    1, /* 3273A (206650) */
+    1, /* 3273B (206651) */
+    1, /* 3273C (206652) */
+    1, /* 3273D (206653) */
+    1, /* 3273E (206654) */
+    1, /* 3273F (206655) */
+    1, /* 32740 (206656) */
+    1, /* 32741 (206657) */
+    1, /* 32742 (206658) */
+    1, /* 32743 (206659) */
+    1, /* 32744 (206660) */
+    1, /* 32745 (206661) */
+    1, /* 32746 (206662) */
+    1, /* 32747 (206663) */
+    1, /* 32748 (206664) */
+    1, /* 32749 (206665) */
+    1, /* 3274A (206666) */
+    1, /* 3274B (206667) */
+    1, /* 3274C (206668) */
+    1, /* 3274D (206669) */
+    1, /* 3274E (206670) */
+    1, /* 3274F (206671) */
+    1, /* 32750 (206672) */
+    1, /* 32751 (206673) */
+    1, /* 32752 (206674) */
+    1, /* 32753 (206675) */
+    1, /* 32754 (206676) */
+    1, /* 32755 (206677) */
+    1, /* 32756 (206678) */
+    1, /* 32757 (206679) */
+    1, /* 32758 (206680) */
+    1, /* 32759 (206681) */
+    1, /* 3275A (206682) */
+    1, /* 3275B (206683) */
+    1, /* 3275C (206684) */
+    1, /* 3275D (206685) */
+    1, /* 3275E (206686) */
+    1, /* 3275F (206687) */
+    1, /* 32760 (206688) */
+    1, /* 32761 (206689) */
+    1, /* 32762 (206690) */
+    1, /* 32763 (206691) */
+    1, /* 32764 (206692) */
+    1, /* 32765 (206693) */
+    1, /* 32766 (206694) */
+    1, /* 32767 (206695) */
+    1, /* 32768 (206696) */
+    1, /* 32769 (206697) */
+    1, /* 3276A (206698) */
+    1, /* 3276B (206699) */
+    1, /* 3276C (206700) */
+    1, /* 3276D (206701) */
+    1, /* 3276E (206702) */
+    1, /* 3276F (206703) */
+    1, /* 32770 (206704) */
+    1, /* 32771 (206705) */
+    1, /* 32772 (206706) */
+    1, /* 32773 (206707) */
+    1, /* 32774 (206708) */
+    1, /* 32775 (206709) */
+    1, /* 32776 (206710) */
+    1, /* 32777 (206711) */
+    1, /* 32778 (206712) */
+    1, /* 32779 (206713) */
+    1, /* 3277A (206714) */
+    1, /* 3277B (206715) */
+    1, /* 3277C (206716) */
+    1, /* 3277D (206717) */
+    1, /* 3277E (206718) */
+    1, /* 3277F (206719) */
+    1, /* 32780 (206720) */
+    1, /* 32781 (206721) */
+    1, /* 32782 (206722) */
+    1, /* 32783 (206723) */
+    1, /* 32784 (206724) */
+    1, /* 32785 (206725) */
+    1, /* 32786 (206726) */
+    1, /* 32787 (206727) */
+    1, /* 32788 (206728) */
+    1, /* 32789 (206729) */
+    1, /* 3278A (206730) */
+    1, /* 3278B (206731) */
+    1, /* 3278C (206732) */
+    1, /* 3278D (206733) */
+    1, /* 3278E (206734) */
+    1, /* 3278F (206735) */
+    1, /* 32790 (206736) */
+    1, /* 32791 (206737) */
+    1, /* 32792 (206738) */
+    1, /* 32793 (206739) */
+    1, /* 32794 (206740) */
+    1, /* 32795 (206741) */
+    1, /* 32796 (206742) */
+    1, /* 32797 (206743) */
+    1, /* 32798 (206744) */
+    1, /* 32799 (206745) */
+    1, /* 3279A (206746) */
+    1, /* 3279B (206747) */
+    1, /* 3279C (206748) */
+    1, /* 3279D (206749) */
+    1, /* 3279E (206750) */
+    1, /* 3279F (206751) */
+    1, /* 327A0 (206752) */
+    1, /* 327A1 (206753) */
+    1, /* 327A2 (206754) */
+    1, /* 327A3 (206755) */
+    1, /* 327A4 (206756) */
+    1, /* 327A5 (206757) */
+    1, /* 327A6 (206758) */
+    1, /* 327A7 (206759) */
+    1, /* 327A8 (206760) */
+    1, /* 327A9 (206761) */
+    1, /* 327AA (206762) */
+    1, /* 327AB (206763) */
+    1, /* 327AC (206764) */
+    1, /* 327AD (206765) */
+    1, /* 327AE (206766) */
+    1, /* 327AF (206767) */
+    1, /* 327B0 (206768) */
+    1, /* 327B1 (206769) */
+    1, /* 327B2 (206770) */
+    1, /* 327B3 (206771) */
+    1, /* 327B4 (206772) */
+    1, /* 327B5 (206773) */
+    1, /* 327B6 (206774) */
+    1, /* 327B7 (206775) */
+    1, /* 327B8 (206776) */
+    1, /* 327B9 (206777) */
+    1, /* 327BA (206778) */
+    1, /* 327BB (206779) */
+    1, /* 327BC (206780) */
+    1, /* 327BD (206781) */
+    1, /* 327BE (206782) */
+    1, /* 327BF (206783) */
+    1, /* 327C0 (206784) */
+    1, /* 327C1 (206785) */
+    1, /* 327C2 (206786) */
+    1, /* 327C3 (206787) */
+    1, /* 327C4 (206788) */
+    1, /* 327C5 (206789) */
+    1, /* 327C6 (206790) */
+    1, /* 327C7 (206791) */
+    1, /* 327C8 (206792) */
+    1, /* 327C9 (206793) */
+    1, /* 327CA (206794) */
+    1, /* 327CB (206795) */
+    1, /* 327CC (206796) */
+    1, /* 327CD (206797) */
+    1, /* 327CE (206798) */
+    1, /* 327CF (206799) */
+    1, /* 327D0 (206800) */
+    1, /* 327D1 (206801) */
+    1, /* 327D2 (206802) */
+    1, /* 327D3 (206803) */
+    1, /* 327D4 (206804) */
+    1, /* 327D5 (206805) */
+    1, /* 327D6 (206806) */
+    1, /* 327D7 (206807) */
+    1, /* 327D8 (206808) */
+    1, /* 327D9 (206809) */
+    1, /* 327DA (206810) */
+    1, /* 327DB (206811) */
+    1, /* 327DC (206812) */
+    1, /* 327DD (206813) */
+    1, /* 327DE (206814) */
+    1, /* 327DF (206815) */
+    1, /* 327E0 (206816) */
+    1, /* 327E1 (206817) */
+    1, /* 327E2 (206818) */
+    1, /* 327E3 (206819) */
+    1, /* 327E4 (206820) */
+    1, /* 327E5 (206821) */
+    1, /* 327E6 (206822) */
+    1, /* 327E7 (206823) */
+    1, /* 327E8 (206824) */
+    1, /* 327E9 (206825) */
+    1, /* 327EA (206826) */
+    1, /* 327EB (206827) */
+    1, /* 327EC (206828) */
+    1, /* 327ED (206829) */
+    1, /* 327EE (206830) */
+    1, /* 327EF (206831) */
+    1, /* 327F0 (206832) */
+    1, /* 327F1 (206833) */
+    1, /* 327F2 (206834) */
+    1, /* 327F3 (206835) */
+    1, /* 327F4 (206836) */
+    1, /* 327F5 (206837) */
+    1, /* 327F6 (206838) */
+    1, /* 327F7 (206839) */
+    1, /* 327F8 (206840) */
+    1, /* 327F9 (206841) */
+    1, /* 327FA (206842) */
+    1, /* 327FB (206843) */
+    1, /* 327FC (206844) */
+    1, /* 327FD (206845) */
+    1, /* 327FE (206846) */
+    1, /* 327FF (206847) */
+    1, /* 32800 (206848) */
+    1, /* 32801 (206849) */
+    1, /* 32802 (206850) */
+    1, /* 32803 (206851) */
+    1, /* 32804 (206852) */
+    1, /* 32805 (206853) */
+    1, /* 32806 (206854) */
+    1, /* 32807 (206855) */
+    1, /* 32808 (206856) */
+    1, /* 32809 (206857) */
+    1, /* 3280A (206858) */
+    1, /* 3280B (206859) */
+    1, /* 3280C (206860) */
+    1, /* 3280D (206861) */
+    1, /* 3280E (206862) */
+    1, /* 3280F (206863) */
+    1, /* 32810 (206864) */
+    1, /* 32811 (206865) */
+    1, /* 32812 (206866) */
+    1, /* 32813 (206867) */
+    1, /* 32814 (206868) */
+    1, /* 32815 (206869) */
+    1, /* 32816 (206870) */
+    1, /* 32817 (206871) */
+    1, /* 32818 (206872) */
+    1, /* 32819 (206873) */
+    1, /* 3281A (206874) */
+    1, /* 3281B (206875) */
+    1, /* 3281C (206876) */
+    1, /* 3281D (206877) */
+    1, /* 3281E (206878) */
+    1, /* 3281F (206879) */
+    1, /* 32820 (206880) */
+    1, /* 32821 (206881) */
+    1, /* 32822 (206882) */
+    1, /* 32823 (206883) */
+    1, /* 32824 (206884) */
+    1, /* 32825 (206885) */
+    1, /* 32826 (206886) */
+    1, /* 32827 (206887) */
+    1, /* 32828 (206888) */
+    1, /* 32829 (206889) */
+    1, /* 3282A (206890) */
+    1, /* 3282B (206891) */
+    1, /* 3282C (206892) */
+    1, /* 3282D (206893) */
+    1, /* 3282E (206894) */
+    1, /* 3282F (206895) */
+    1, /* 32830 (206896) */
+    1, /* 32831 (206897) */
+    1, /* 32832 (206898) */
+    1, /* 32833 (206899) */
+    1, /* 32834 (206900) */
+    1, /* 32835 (206901) */
+    1, /* 32836 (206902) */
+    1, /* 32837 (206903) */
+    1, /* 32838 (206904) */
+    1, /* 32839 (206905) */
+    1, /* 3283A (206906) */
+    1, /* 3283B (206907) */
+    1, /* 3283C (206908) */
+    1, /* 3283D (206909) */
+    1, /* 3283E (206910) */
+    1, /* 3283F (206911) */
+    1, /* 32840 (206912) */
+    1, /* 32841 (206913) */
+    1, /* 32842 (206914) */
+    1, /* 32843 (206915) */
+    1, /* 32844 (206916) */
+    1, /* 32845 (206917) */
+    1, /* 32846 (206918) */
+    1, /* 32847 (206919) */
+    1, /* 32848 (206920) */
+    1, /* 32849 (206921) */
+    1, /* 3284A (206922) */
+    1, /* 3284B (206923) */
+    1, /* 3284C (206924) */
+    1, /* 3284D (206925) */
+    1, /* 3284E (206926) */
+    1, /* 3284F (206927) */
+    1, /* 32850 (206928) */
+    1, /* 32851 (206929) */
+    1, /* 32852 (206930) */
+    1, /* 32853 (206931) */
+    1, /* 32854 (206932) */
+    1, /* 32855 (206933) */
+    1, /* 32856 (206934) */
+    1, /* 32857 (206935) */
+    1, /* 32858 (206936) */
+    1, /* 32859 (206937) */
+    1, /* 3285A (206938) */
+    1, /* 3285B (206939) */
+    1, /* 3285C (206940) */
+    1, /* 3285D (206941) */
+    1, /* 3285E (206942) */
+    1, /* 3285F (206943) */
+    1, /* 32860 (206944) */
+    1, /* 32861 (206945) */
+    1, /* 32862 (206946) */
+    1, /* 32863 (206947) */
+    1, /* 32864 (206948) */
+    1, /* 32865 (206949) */
+    1, /* 32866 (206950) */
+    1, /* 32867 (206951) */
+    1, /* 32868 (206952) */
+    1, /* 32869 (206953) */
+    1, /* 3286A (206954) */
+    1, /* 3286B (206955) */
+    1, /* 3286C (206956) */
+    1, /* 3286D (206957) */
+    1, /* 3286E (206958) */
+    1, /* 3286F (206959) */
+    1, /* 32870 (206960) */
+    1, /* 32871 (206961) */
+    1, /* 32872 (206962) */
+    1, /* 32873 (206963) */
+    1, /* 32874 (206964) */
+    1, /* 32875 (206965) */
+    1, /* 32876 (206966) */
+    1, /* 32877 (206967) */
+    1, /* 32878 (206968) */
+    1, /* 32879 (206969) */
+    1, /* 3287A (206970) */
+    1, /* 3287B (206971) */
+    1, /* 3287C (206972) */
+    1, /* 3287D (206973) */
+    1, /* 3287E (206974) */
+    1, /* 3287F (206975) */
+    1, /* 32880 (206976) */
+    1, /* 32881 (206977) */
+    1, /* 32882 (206978) */
+    1, /* 32883 (206979) */
+    1, /* 32884 (206980) */
+    1, /* 32885 (206981) */
+    1, /* 32886 (206982) */
+    1, /* 32887 (206983) */
+    1, /* 32888 (206984) */
+    1, /* 32889 (206985) */
+    1, /* 3288A (206986) */
+    1, /* 3288B (206987) */
+    1, /* 3288C (206988) */
+    1, /* 3288D (206989) */
+    1, /* 3288E (206990) */
+    1, /* 3288F (206991) */
+    1, /* 32890 (206992) */
+    1, /* 32891 (206993) */
+    1, /* 32892 (206994) */
+    1, /* 32893 (206995) */
+    1, /* 32894 (206996) */
+    1, /* 32895 (206997) */
+    1, /* 32896 (206998) */
+    1, /* 32897 (206999) */
+    1, /* 32898 (207000) */
+    1, /* 32899 (207001) */
+    1, /* 3289A (207002) */
+    1, /* 3289B (207003) */
+    1, /* 3289C (207004) */
+    1, /* 3289D (207005) */
+    1, /* 3289E (207006) */
+    1, /* 3289F (207007) */
+    1, /* 328A0 (207008) */
+    1, /* 328A1 (207009) */
+    1, /* 328A2 (207010) */
+    1, /* 328A3 (207011) */
+    1, /* 328A4 (207012) */
+    1, /* 328A5 (207013) */
+    1, /* 328A6 (207014) */
+    1, /* 328A7 (207015) */
+    1, /* 328A8 (207016) */
+    1, /* 328A9 (207017) */
+    1, /* 328AA (207018) */
+    1, /* 328AB (207019) */
+    1, /* 328AC (207020) */
+    1, /* 328AD (207021) */
+    1, /* 328AE (207022) */
+    1, /* 328AF (207023) */
+    1, /* 328B0 (207024) */
+    1, /* 328B1 (207025) */
+    1, /* 328B2 (207026) */
+    1, /* 328B3 (207027) */
+    1, /* 328B4 (207028) */
+    1, /* 328B5 (207029) */
+    1, /* 328B6 (207030) */
+    1, /* 328B7 (207031) */
+    1, /* 328B8 (207032) */
+    1, /* 328B9 (207033) */
+    1, /* 328BA (207034) */
+    1, /* 328BB (207035) */
+    1, /* 328BC (207036) */
+    1, /* 328BD (207037) */
+    1, /* 328BE (207038) */
+    1, /* 328BF (207039) */
+    1, /* 328C0 (207040) */
+    1, /* 328C1 (207041) */
+    1, /* 328C2 (207042) */
+    1, /* 328C3 (207043) */
+    1, /* 328C4 (207044) */
+    1, /* 328C5 (207045) */
+    1, /* 328C6 (207046) */
+    1, /* 328C7 (207047) */
+    1, /* 328C8 (207048) */
+    1, /* 328C9 (207049) */
+    1, /* 328CA (207050) */
+    1, /* 328CB (207051) */
+    1, /* 328CC (207052) */
+    1, /* 328CD (207053) */
+    1, /* 328CE (207054) */
+    1, /* 328CF (207055) */
+    1, /* 328D0 (207056) */
+    1, /* 328D1 (207057) */
+    1, /* 328D2 (207058) */
+    1, /* 328D3 (207059) */
+    1, /* 328D4 (207060) */
+    1, /* 328D5 (207061) */
+    1, /* 328D6 (207062) */
+    1, /* 328D7 (207063) */
+    1, /* 328D8 (207064) */
+    1, /* 328D9 (207065) */
+    1, /* 328DA (207066) */
+    1, /* 328DB (207067) */
+    1, /* 328DC (207068) */
+    1, /* 328DD (207069) */
+    1, /* 328DE (207070) */
+    1, /* 328DF (207071) */
+    1, /* 328E0 (207072) */
+    1, /* 328E1 (207073) */
+    1, /* 328E2 (207074) */
+    1, /* 328E3 (207075) */
+    1, /* 328E4 (207076) */
+    1, /* 328E5 (207077) */
+    1, /* 328E6 (207078) */
+    1, /* 328E7 (207079) */
+    1, /* 328E8 (207080) */
+    1, /* 328E9 (207081) */
+    1, /* 328EA (207082) */
+    1, /* 328EB (207083) */
+    1, /* 328EC (207084) */
+    1, /* 328ED (207085) */
+    1, /* 328EE (207086) */
+    1, /* 328EF (207087) */
+    1, /* 328F0 (207088) */
+    1, /* 328F1 (207089) */
+    1, /* 328F2 (207090) */
+    1, /* 328F3 (207091) */
+    1, /* 328F4 (207092) */
+    1, /* 328F5 (207093) */
+    1, /* 328F6 (207094) */
+    1, /* 328F7 (207095) */
+    1, /* 328F8 (207096) */
+    1, /* 328F9 (207097) */
+    1, /* 328FA (207098) */
+    1, /* 328FB (207099) */
+    1, /* 328FC (207100) */
+    1, /* 328FD (207101) */
+    1, /* 328FE (207102) */
+    1, /* 328FF (207103) */
+    1, /* 32900 (207104) */
+    1, /* 32901 (207105) */
+    1, /* 32902 (207106) */
+    1, /* 32903 (207107) */
+    1, /* 32904 (207108) */
+    1, /* 32905 (207109) */
+    1, /* 32906 (207110) */
+    1, /* 32907 (207111) */
+    1, /* 32908 (207112) */
+    1, /* 32909 (207113) */
+    1, /* 3290A (207114) */
+    1, /* 3290B (207115) */
+    1, /* 3290C (207116) */
+    1, /* 3290D (207117) */
+    1, /* 3290E (207118) */
+    1, /* 3290F (207119) */
+    1, /* 32910 (207120) */
+    1, /* 32911 (207121) */
+    1, /* 32912 (207122) */
+    1, /* 32913 (207123) */
+    1, /* 32914 (207124) */
+    1, /* 32915 (207125) */
+    1, /* 32916 (207126) */
+    1, /* 32917 (207127) */
+    1, /* 32918 (207128) */
+    1, /* 32919 (207129) */
+    1, /* 3291A (207130) */
+    1, /* 3291B (207131) */
+    1, /* 3291C (207132) */
+    1, /* 3291D (207133) */
+    1, /* 3291E (207134) */
+    1, /* 3291F (207135) */
+    1, /* 32920 (207136) */
+    1, /* 32921 (207137) */
+    1, /* 32922 (207138) */
+    1, /* 32923 (207139) */
+    1, /* 32924 (207140) */
+    1, /* 32925 (207141) */
+    1, /* 32926 (207142) */
+    1, /* 32927 (207143) */
+    1, /* 32928 (207144) */
+    1, /* 32929 (207145) */
+    1, /* 3292A (207146) */
+    1, /* 3292B (207147) */
+    1, /* 3292C (207148) */
+    1, /* 3292D (207149) */
+    1, /* 3292E (207150) */
+    1, /* 3292F (207151) */
+    1, /* 32930 (207152) */
+    1, /* 32931 (207153) */
+    1, /* 32932 (207154) */
+    1, /* 32933 (207155) */
+    1, /* 32934 (207156) */
+    1, /* 32935 (207157) */
+    1, /* 32936 (207158) */
+    1, /* 32937 (207159) */
+    1, /* 32938 (207160) */
+    1, /* 32939 (207161) */
+    1, /* 3293A (207162) */
+    1, /* 3293B (207163) */
+    1, /* 3293C (207164) */
+    1, /* 3293D (207165) */
+    1, /* 3293E (207166) */
+    1, /* 3293F (207167) */
+    1, /* 32940 (207168) */
+    1, /* 32941 (207169) */
+    1, /* 32942 (207170) */
+    1, /* 32943 (207171) */
+    1, /* 32944 (207172) */
+    1, /* 32945 (207173) */
+    1, /* 32946 (207174) */
+    1, /* 32947 (207175) */
+    1, /* 32948 (207176) */
+    1, /* 32949 (207177) */
+    1, /* 3294A (207178) */
+    1, /* 3294B (207179) */
+    1, /* 3294C (207180) */
+    1, /* 3294D (207181) */
+    1, /* 3294E (207182) */
+    1, /* 3294F (207183) */
+    1, /* 32950 (207184) */
+    1, /* 32951 (207185) */
+    1, /* 32952 (207186) */
+    1, /* 32953 (207187) */
+    1, /* 32954 (207188) */
+    1, /* 32955 (207189) */
+    1, /* 32956 (207190) */
+    1, /* 32957 (207191) */
+    1, /* 32958 (207192) */
+    1, /* 32959 (207193) */
+    1, /* 3295A (207194) */
+    1, /* 3295B (207195) */
+    1, /* 3295C (207196) */
+    1, /* 3295D (207197) */
+    1, /* 3295E (207198) */
+    1, /* 3295F (207199) */
+    1, /* 32960 (207200) */
+    1, /* 32961 (207201) */
+    1, /* 32962 (207202) */
+    1, /* 32963 (207203) */
+    1, /* 32964 (207204) */
+    1, /* 32965 (207205) */
+    1, /* 32966 (207206) */
+    1, /* 32967 (207207) */
+    1, /* 32968 (207208) */
+    1, /* 32969 (207209) */
+    1, /* 3296A (207210) */
+    1, /* 3296B (207211) */
+    1, /* 3296C (207212) */
+    1, /* 3296D (207213) */
+    1, /* 3296E (207214) */
+    1, /* 3296F (207215) */
+    1, /* 32970 (207216) */
+    1, /* 32971 (207217) */
+    1, /* 32972 (207218) */
+    1, /* 32973 (207219) */
+    1, /* 32974 (207220) */
+    1, /* 32975 (207221) */
+    1, /* 32976 (207222) */
+    1, /* 32977 (207223) */
+    1, /* 32978 (207224) */
+    1, /* 32979 (207225) */
+    1, /* 3297A (207226) */
+    1, /* 3297B (207227) */
+    1, /* 3297C (207228) */
+    1, /* 3297D (207229) */
+    1, /* 3297E (207230) */
+    1, /* 3297F (207231) */
+    1, /* 32980 (207232) */
+    1, /* 32981 (207233) */
+    1, /* 32982 (207234) */
+    1, /* 32983 (207235) */
+    1, /* 32984 (207236) */
+    1, /* 32985 (207237) */
+    1, /* 32986 (207238) */
+    1, /* 32987 (207239) */
+    1, /* 32988 (207240) */
+    1, /* 32989 (207241) */
+    1, /* 3298A (207242) */
+    1, /* 3298B (207243) */
+    1, /* 3298C (207244) */
+    1, /* 3298D (207245) */
+    1, /* 3298E (207246) */
+    1, /* 3298F (207247) */
+    1, /* 32990 (207248) */
+    1, /* 32991 (207249) */
+    1, /* 32992 (207250) */
+    1, /* 32993 (207251) */
+    1, /* 32994 (207252) */
+    1, /* 32995 (207253) */
+    1, /* 32996 (207254) */
+    1, /* 32997 (207255) */
+    1, /* 32998 (207256) */
+    1, /* 32999 (207257) */
+    1, /* 3299A (207258) */
+    1, /* 3299B (207259) */
+    1, /* 3299C (207260) */
+    1, /* 3299D (207261) */
+    1, /* 3299E (207262) */
+    1, /* 3299F (207263) */
+    1, /* 329A0 (207264) */
+    1, /* 329A1 (207265) */
+    1, /* 329A2 (207266) */
+    1, /* 329A3 (207267) */
+    1, /* 329A4 (207268) */
+    1, /* 329A5 (207269) */
+    1, /* 329A6 (207270) */
+    1, /* 329A7 (207271) */
+    1, /* 329A8 (207272) */
+    1, /* 329A9 (207273) */
+    1, /* 329AA (207274) */
+    1, /* 329AB (207275) */
+    1, /* 329AC (207276) */
+    1, /* 329AD (207277) */
+    1, /* 329AE (207278) */
+    1, /* 329AF (207279) */
+    1, /* 329B0 (207280) */
+    1, /* 329B1 (207281) */
+    1, /* 329B2 (207282) */
+    1, /* 329B3 (207283) */
+    1, /* 329B4 (207284) */
+    1, /* 329B5 (207285) */
+    1, /* 329B6 (207286) */
+    1, /* 329B7 (207287) */
+    1, /* 329B8 (207288) */
+    1, /* 329B9 (207289) */
+    1, /* 329BA (207290) */
+    1, /* 329BB (207291) */
+    1, /* 329BC (207292) */
+    1, /* 329BD (207293) */
+    1, /* 329BE (207294) */
+    1, /* 329BF (207295) */
+    1, /* 329C0 (207296) */
+    1, /* 329C1 (207297) */
+    1, /* 329C2 (207298) */
+    1, /* 329C3 (207299) */
+    1, /* 329C4 (207300) */
+    1, /* 329C5 (207301) */
+    1, /* 329C6 (207302) */
+    1, /* 329C7 (207303) */
+    1, /* 329C8 (207304) */
+    1, /* 329C9 (207305) */
+    1, /* 329CA (207306) */
+    1, /* 329CB (207307) */
+    1, /* 329CC (207308) */
+    1, /* 329CD (207309) */
+    1, /* 329CE (207310) */
+    1, /* 329CF (207311) */
+    1, /* 329D0 (207312) */
+    1, /* 329D1 (207313) */
+    1, /* 329D2 (207314) */
+    1, /* 329D3 (207315) */
+    1, /* 329D4 (207316) */
+    1, /* 329D5 (207317) */
+    1, /* 329D6 (207318) */
+    1, /* 329D7 (207319) */
+    1, /* 329D8 (207320) */
+    1, /* 329D9 (207321) */
+    1, /* 329DA (207322) */
+    1, /* 329DB (207323) */
+    1, /* 329DC (207324) */
+    1, /* 329DD (207325) */
+    1, /* 329DE (207326) */
+    1, /* 329DF (207327) */
+    1, /* 329E0 (207328) */
+    1, /* 329E1 (207329) */
+    1, /* 329E2 (207330) */
+    1, /* 329E3 (207331) */
+    1, /* 329E4 (207332) */
+    1, /* 329E5 (207333) */
+    1, /* 329E6 (207334) */
+    1, /* 329E7 (207335) */
+    1, /* 329E8 (207336) */
+    1, /* 329E9 (207337) */
+    1, /* 329EA (207338) */
+    1, /* 329EB (207339) */
+    1, /* 329EC (207340) */
+    1, /* 329ED (207341) */
+    1, /* 329EE (207342) */
+    1, /* 329EF (207343) */
+    1, /* 329F0 (207344) */
+    1, /* 329F1 (207345) */
+    1, /* 329F2 (207346) */
+    1, /* 329F3 (207347) */
+    1, /* 329F4 (207348) */
+    1, /* 329F5 (207349) */
+    1, /* 329F6 (207350) */
+    1, /* 329F7 (207351) */
+    1, /* 329F8 (207352) */
+    1, /* 329F9 (207353) */
+    1, /* 329FA (207354) */
+    1, /* 329FB (207355) */
+    1, /* 329FC (207356) */
+    1, /* 329FD (207357) */
+    1, /* 329FE (207358) */
+    1, /* 329FF (207359) */
+    1, /* 32A00 (207360) */
+    1, /* 32A01 (207361) */
+    1, /* 32A02 (207362) */
+    1, /* 32A03 (207363) */
+    1, /* 32A04 (207364) */
+    1, /* 32A05 (207365) */
+    1, /* 32A06 (207366) */
+    1, /* 32A07 (207367) */
+    1, /* 32A08 (207368) */
+    1, /* 32A09 (207369) */
+    1, /* 32A0A (207370) */
+    1, /* 32A0B (207371) */
+    1, /* 32A0C (207372) */
+    1, /* 32A0D (207373) */
+    1, /* 32A0E (207374) */
+    1, /* 32A0F (207375) */
+    1, /* 32A10 (207376) */
+    1, /* 32A11 (207377) */
+    1, /* 32A12 (207378) */
+    1, /* 32A13 (207379) */
+    1, /* 32A14 (207380) */
+    1, /* 32A15 (207381) */
+    1, /* 32A16 (207382) */
+    1, /* 32A17 (207383) */
+    1, /* 32A18 (207384) */
+    1, /* 32A19 (207385) */
+    1, /* 32A1A (207386) */
+    1, /* 32A1B (207387) */
+    1, /* 32A1C (207388) */
+    1, /* 32A1D (207389) */
+    1, /* 32A1E (207390) */
+    1, /* 32A1F (207391) */
+    1, /* 32A20 (207392) */
+    1, /* 32A21 (207393) */
+    1, /* 32A22 (207394) */
+    1, /* 32A23 (207395) */
+    1, /* 32A24 (207396) */
+    1, /* 32A25 (207397) */
+    1, /* 32A26 (207398) */
+    1, /* 32A27 (207399) */
+    1, /* 32A28 (207400) */
+    1, /* 32A29 (207401) */
+    1, /* 32A2A (207402) */
+    1, /* 32A2B (207403) */
+    1, /* 32A2C (207404) */
+    1, /* 32A2D (207405) */
+    1, /* 32A2E (207406) */
+    1, /* 32A2F (207407) */
+    1, /* 32A30 (207408) */
+    1, /* 32A31 (207409) */
+    1, /* 32A32 (207410) */
+    1, /* 32A33 (207411) */
+    1, /* 32A34 (207412) */
+    1, /* 32A35 (207413) */
+    1, /* 32A36 (207414) */
+    1, /* 32A37 (207415) */
+    1, /* 32A38 (207416) */
+    1, /* 32A39 (207417) */
+    1, /* 32A3A (207418) */
+    1, /* 32A3B (207419) */
+    1, /* 32A3C (207420) */
+    1, /* 32A3D (207421) */
+    1, /* 32A3E (207422) */
+    1, /* 32A3F (207423) */
+    1, /* 32A40 (207424) */
+    1, /* 32A41 (207425) */
+    1, /* 32A42 (207426) */
+    1, /* 32A43 (207427) */
+    1, /* 32A44 (207428) */
+    1, /* 32A45 (207429) */
+    1, /* 32A46 (207430) */
+    1, /* 32A47 (207431) */
+    1, /* 32A48 (207432) */
+    1, /* 32A49 (207433) */
+    1, /* 32A4A (207434) */
+    1, /* 32A4B (207435) */
+    1, /* 32A4C (207436) */
+    1, /* 32A4D (207437) */
+    1, /* 32A4E (207438) */
+    1, /* 32A4F (207439) */
+    1, /* 32A50 (207440) */
+    1, /* 32A51 (207441) */
+    1, /* 32A52 (207442) */
+    1, /* 32A53 (207443) */
+    1, /* 32A54 (207444) */
+    1, /* 32A55 (207445) */
+    1, /* 32A56 (207446) */
+    1, /* 32A57 (207447) */
+    1, /* 32A58 (207448) */
+    1, /* 32A59 (207449) */
+    1, /* 32A5A (207450) */
+    1, /* 32A5B (207451) */
+    1, /* 32A5C (207452) */
+    1, /* 32A5D (207453) */
+    1, /* 32A5E (207454) */
+    1, /* 32A5F (207455) */
+    1, /* 32A60 (207456) */
+    1, /* 32A61 (207457) */
+    1, /* 32A62 (207458) */
+    1, /* 32A63 (207459) */
+    1, /* 32A64 (207460) */
+    1, /* 32A65 (207461) */
+    1, /* 32A66 (207462) */
+    1, /* 32A67 (207463) */
+    1, /* 32A68 (207464) */
+    1, /* 32A69 (207465) */
+    1, /* 32A6A (207466) */
+    1, /* 32A6B (207467) */
+    1, /* 32A6C (207468) */
+    1, /* 32A6D (207469) */
+    1, /* 32A6E (207470) */
+    1, /* 32A6F (207471) */
+    1, /* 32A70 (207472) */
+    1, /* 32A71 (207473) */
+    1, /* 32A72 (207474) */
+    1, /* 32A73 (207475) */
+    1, /* 32A74 (207476) */
+    1, /* 32A75 (207477) */
+    1, /* 32A76 (207478) */
+    1, /* 32A77 (207479) */
+    1, /* 32A78 (207480) */
+    1, /* 32A79 (207481) */
+    1, /* 32A7A (207482) */
+    1, /* 32A7B (207483) */
+    1, /* 32A7C (207484) */
+    1, /* 32A7D (207485) */
+    1, /* 32A7E (207486) */
+    1, /* 32A7F (207487) */
+    1, /* 32A80 (207488) */
+    1, /* 32A81 (207489) */
+    1, /* 32A82 (207490) */
+    1, /* 32A83 (207491) */
+    1, /* 32A84 (207492) */
+    1, /* 32A85 (207493) */
+    1, /* 32A86 (207494) */
+    1, /* 32A87 (207495) */
+    1, /* 32A88 (207496) */
+    1, /* 32A89 (207497) */
+    1, /* 32A8A (207498) */
+    1, /* 32A8B (207499) */
+    1, /* 32A8C (207500) */
+    1, /* 32A8D (207501) */
+    1, /* 32A8E (207502) */
+    1, /* 32A8F (207503) */
+    1, /* 32A90 (207504) */
+    1, /* 32A91 (207505) */
+    1, /* 32A92 (207506) */
+    1, /* 32A93 (207507) */
+    1, /* 32A94 (207508) */
+    1, /* 32A95 (207509) */
+    1, /* 32A96 (207510) */
+    1, /* 32A97 (207511) */
+    1, /* 32A98 (207512) */
+    1, /* 32A99 (207513) */
+    1, /* 32A9A (207514) */
+    1, /* 32A9B (207515) */
+    1, /* 32A9C (207516) */
+    1, /* 32A9D (207517) */
+    1, /* 32A9E (207518) */
+    1, /* 32A9F (207519) */
+    1, /* 32AA0 (207520) */
+    1, /* 32AA1 (207521) */
+    1, /* 32AA2 (207522) */
+    1, /* 32AA3 (207523) */
+    1, /* 32AA4 (207524) */
+    1, /* 32AA5 (207525) */
+    1, /* 32AA6 (207526) */
+    1, /* 32AA7 (207527) */
+    1, /* 32AA8 (207528) */
+    1, /* 32AA9 (207529) */
+    1, /* 32AAA (207530) */
+    1, /* 32AAB (207531) */
+    1, /* 32AAC (207532) */
+    1, /* 32AAD (207533) */
+    1, /* 32AAE (207534) */
+    1, /* 32AAF (207535) */
+    1, /* 32AB0 (207536) */
+    1, /* 32AB1 (207537) */
+    1, /* 32AB2 (207538) */
+    1, /* 32AB3 (207539) */
+    1, /* 32AB4 (207540) */
+    1, /* 32AB5 (207541) */
+    1, /* 32AB6 (207542) */
+    1, /* 32AB7 (207543) */
+    1, /* 32AB8 (207544) */
+    1, /* 32AB9 (207545) */
+    1, /* 32ABA (207546) */
+    1, /* 32ABB (207547) */
+    1, /* 32ABC (207548) */
+    1, /* 32ABD (207549) */
+    1, /* 32ABE (207550) */
+    1, /* 32ABF (207551) */
+    1, /* 32AC0 (207552) */
+    1, /* 32AC1 (207553) */
+    1, /* 32AC2 (207554) */
+    1, /* 32AC3 (207555) */
+    1, /* 32AC4 (207556) */
+    1, /* 32AC5 (207557) */
+    1, /* 32AC6 (207558) */
+    1, /* 32AC7 (207559) */
+    1, /* 32AC8 (207560) */
+    1, /* 32AC9 (207561) */
+    1, /* 32ACA (207562) */
+    1, /* 32ACB (207563) */
+    1, /* 32ACC (207564) */
+    1, /* 32ACD (207565) */
+    1, /* 32ACE (207566) */
+    1, /* 32ACF (207567) */
+    1, /* 32AD0 (207568) */
+    1, /* 32AD1 (207569) */
+    1, /* 32AD2 (207570) */
+    1, /* 32AD3 (207571) */
+    1, /* 32AD4 (207572) */
+    1, /* 32AD5 (207573) */
+    1, /* 32AD6 (207574) */
+    1, /* 32AD7 (207575) */
+    1, /* 32AD8 (207576) */
+    1, /* 32AD9 (207577) */
+    1, /* 32ADA (207578) */
+    1, /* 32ADB (207579) */
+    1, /* 32ADC (207580) */
+    1, /* 32ADD (207581) */
+    1, /* 32ADE (207582) */
+    1, /* 32ADF (207583) */
+    1, /* 32AE0 (207584) */
+    1, /* 32AE1 (207585) */
+    1, /* 32AE2 (207586) */
+    1, /* 32AE3 (207587) */
+    1, /* 32AE4 (207588) */
+    1, /* 32AE5 (207589) */
+    1, /* 32AE6 (207590) */
+    1, /* 32AE7 (207591) */
+    1, /* 32AE8 (207592) */
+    1, /* 32AE9 (207593) */
+    1, /* 32AEA (207594) */
+    1, /* 32AEB (207595) */
+    1, /* 32AEC (207596) */
+    1, /* 32AED (207597) */
+    1, /* 32AEE (207598) */
+    1, /* 32AEF (207599) */
+    1, /* 32AF0 (207600) */
+    1, /* 32AF1 (207601) */
+    1, /* 32AF2 (207602) */
+    1, /* 32AF3 (207603) */
+    1, /* 32AF4 (207604) */
+    1, /* 32AF5 (207605) */
+    1, /* 32AF6 (207606) */
+    1, /* 32AF7 (207607) */
+    1, /* 32AF8 (207608) */
+    1, /* 32AF9 (207609) */
+    1, /* 32AFA (207610) */
+    1, /* 32AFB (207611) */
+    1, /* 32AFC (207612) */
+    1, /* 32AFD (207613) */
+    1, /* 32AFE (207614) */
+    1, /* 32AFF (207615) */
+    1, /* 32B00 (207616) */
+    1, /* 32B01 (207617) */
+    1, /* 32B02 (207618) */
+    1, /* 32B03 (207619) */
+    1, /* 32B04 (207620) */
+    1, /* 32B05 (207621) */
+    1, /* 32B06 (207622) */
+    1, /* 32B07 (207623) */
+    1, /* 32B08 (207624) */
+    1, /* 32B09 (207625) */
+    1, /* 32B0A (207626) */
+    1, /* 32B0B (207627) */
+    1, /* 32B0C (207628) */
+    1, /* 32B0D (207629) */
+    1, /* 32B0E (207630) */
+    1, /* 32B0F (207631) */
+    1, /* 32B10 (207632) */
+    1, /* 32B11 (207633) */
+    1, /* 32B12 (207634) */
+    1, /* 32B13 (207635) */
+    1, /* 32B14 (207636) */
+    1, /* 32B15 (207637) */
+    1, /* 32B16 (207638) */
+    1, /* 32B17 (207639) */
+    1, /* 32B18 (207640) */
+    1, /* 32B19 (207641) */
+    1, /* 32B1A (207642) */
+    1, /* 32B1B (207643) */
+    1, /* 32B1C (207644) */
+    1, /* 32B1D (207645) */
+    1, /* 32B1E (207646) */
+    1, /* 32B1F (207647) */
+    1, /* 32B20 (207648) */
+    1, /* 32B21 (207649) */
+    1, /* 32B22 (207650) */
+    1, /* 32B23 (207651) */
+    1, /* 32B24 (207652) */
+    1, /* 32B25 (207653) */
+    1, /* 32B26 (207654) */
+    1, /* 32B27 (207655) */
+    1, /* 32B28 (207656) */
+    1, /* 32B29 (207657) */
+    1, /* 32B2A (207658) */
+    1, /* 32B2B (207659) */
+    1, /* 32B2C (207660) */
+    1, /* 32B2D (207661) */
+    1, /* 32B2E (207662) */
+    1, /* 32B2F (207663) */
+    1, /* 32B30 (207664) */
+    1, /* 32B31 (207665) */
+    1, /* 32B32 (207666) */
+    1, /* 32B33 (207667) */
+    1, /* 32B34 (207668) */
+    1, /* 32B35 (207669) */
+    1, /* 32B36 (207670) */
+    1, /* 32B37 (207671) */
+    1, /* 32B38 (207672) */
+    1, /* 32B39 (207673) */
+    1, /* 32B3A (207674) */
+    1, /* 32B3B (207675) */
+    1, /* 32B3C (207676) */
+    1, /* 32B3D (207677) */
+    1, /* 32B3E (207678) */
+    1, /* 32B3F (207679) */
+    1, /* 32B40 (207680) */
+    1, /* 32B41 (207681) */
+    1, /* 32B42 (207682) */
+    1, /* 32B43 (207683) */
+    1, /* 32B44 (207684) */
+    1, /* 32B45 (207685) */
+    1, /* 32B46 (207686) */
+    1, /* 32B47 (207687) */
+    1, /* 32B48 (207688) */
+    1, /* 32B49 (207689) */
+    1, /* 32B4A (207690) */
+    1, /* 32B4B (207691) */
+    1, /* 32B4C (207692) */
+    1, /* 32B4D (207693) */
+    1, /* 32B4E (207694) */
+    1, /* 32B4F (207695) */
+    1, /* 32B50 (207696) */
+    1, /* 32B51 (207697) */
+    1, /* 32B52 (207698) */
+    1, /* 32B53 (207699) */
+    1, /* 32B54 (207700) */
+    1, /* 32B55 (207701) */
+    1, /* 32B56 (207702) */
+    1, /* 32B57 (207703) */
+    1, /* 32B58 (207704) */
+    1, /* 32B59 (207705) */
+    1, /* 32B5A (207706) */
+    1, /* 32B5B (207707) */
+    1, /* 32B5C (207708) */
+    1, /* 32B5D (207709) */
+    1, /* 32B5E (207710) */
+    1, /* 32B5F (207711) */
+    1, /* 32B60 (207712) */
+    1, /* 32B61 (207713) */
+    1, /* 32B62 (207714) */
+    1, /* 32B63 (207715) */
+    1, /* 32B64 (207716) */
+    1, /* 32B65 (207717) */
+    1, /* 32B66 (207718) */
+    1, /* 32B67 (207719) */
+    1, /* 32B68 (207720) */
+    1, /* 32B69 (207721) */
+    1, /* 32B6A (207722) */
+    1, /* 32B6B (207723) */
+    1, /* 32B6C (207724) */
+    1, /* 32B6D (207725) */
+    1, /* 32B6E (207726) */
+    1, /* 32B6F (207727) */
+    1, /* 32B70 (207728) */
+    1, /* 32B71 (207729) */
+    1, /* 32B72 (207730) */
+    1, /* 32B73 (207731) */
+    1, /* 32B74 (207732) */
+    1, /* 32B75 (207733) */
+    1, /* 32B76 (207734) */
+    1, /* 32B77 (207735) */
+    1, /* 32B78 (207736) */
+    1, /* 32B79 (207737) */
+    1, /* 32B7A (207738) */
+    1, /* 32B7B (207739) */
+    1, /* 32B7C (207740) */
+    1, /* 32B7D (207741) */
+    1, /* 32B7E (207742) */
+    1, /* 32B7F (207743) */
+    1, /* 32B80 (207744) */
+    1, /* 32B81 (207745) */
+    1, /* 32B82 (207746) */
+    1, /* 32B83 (207747) */
+    1, /* 32B84 (207748) */
+    1, /* 32B85 (207749) */
+    1, /* 32B86 (207750) */
+    1, /* 32B87 (207751) */
+    1, /* 32B88 (207752) */
+    1, /* 32B89 (207753) */
+    1, /* 32B8A (207754) */
+    1, /* 32B8B (207755) */
+    1, /* 32B8C (207756) */
+    1, /* 32B8D (207757) */
+    1, /* 32B8E (207758) */
+    1, /* 32B8F (207759) */
+    1, /* 32B90 (207760) */
+    1, /* 32B91 (207761) */
+    1, /* 32B92 (207762) */
+    1, /* 32B93 (207763) */
+    1, /* 32B94 (207764) */
+    1, /* 32B95 (207765) */
+    1, /* 32B96 (207766) */
+    1, /* 32B97 (207767) */
+    1, /* 32B98 (207768) */
+    1, /* 32B99 (207769) */
+    1, /* 32B9A (207770) */
+    1, /* 32B9B (207771) */
+    1, /* 32B9C (207772) */
+    1, /* 32B9D (207773) */
+    1, /* 32B9E (207774) */
+    1, /* 32B9F (207775) */
+    1, /* 32BA0 (207776) */
+    1, /* 32BA1 (207777) */
+    1, /* 32BA2 (207778) */
+    1, /* 32BA3 (207779) */
+    1, /* 32BA4 (207780) */
+    1, /* 32BA5 (207781) */
+    1, /* 32BA6 (207782) */
+    1, /* 32BA7 (207783) */
+    1, /* 32BA8 (207784) */
+    1, /* 32BA9 (207785) */
+    1, /* 32BAA (207786) */
+    1, /* 32BAB (207787) */
+    1, /* 32BAC (207788) */
+    1, /* 32BAD (207789) */
+    1, /* 32BAE (207790) */
+    1, /* 32BAF (207791) */
+    1, /* 32BB0 (207792) */
+    1, /* 32BB1 (207793) */
+    1, /* 32BB2 (207794) */
+    1, /* 32BB3 (207795) */
+    1, /* 32BB4 (207796) */
+    1, /* 32BB5 (207797) */
+    1, /* 32BB6 (207798) */
+    1, /* 32BB7 (207799) */
+    1, /* 32BB8 (207800) */
+    1, /* 32BB9 (207801) */
+    1, /* 32BBA (207802) */
+    1, /* 32BBB (207803) */
+    1, /* 32BBC (207804) */
+    1, /* 32BBD (207805) */
+    1, /* 32BBE (207806) */
+    1, /* 32BBF (207807) */
+    1, /* 32BC0 (207808) */
+    1, /* 32BC1 (207809) */
+    1, /* 32BC2 (207810) */
+    1, /* 32BC3 (207811) */
+    1, /* 32BC4 (207812) */
+    1, /* 32BC5 (207813) */
+    1, /* 32BC6 (207814) */
+    1, /* 32BC7 (207815) */
+    1, /* 32BC8 (207816) */
+    1, /* 32BC9 (207817) */
+    1, /* 32BCA (207818) */
+    1, /* 32BCB (207819) */
+    1, /* 32BCC (207820) */
+    1, /* 32BCD (207821) */
+    1, /* 32BCE (207822) */
+    1, /* 32BCF (207823) */
+    1, /* 32BD0 (207824) */
+    1, /* 32BD1 (207825) */
+    1, /* 32BD2 (207826) */
+    1, /* 32BD3 (207827) */
+    1, /* 32BD4 (207828) */
+    1, /* 32BD5 (207829) */
+    1, /* 32BD6 (207830) */
+    1, /* 32BD7 (207831) */
+    1, /* 32BD8 (207832) */
+    1, /* 32BD9 (207833) */
+    1, /* 32BDA (207834) */
+    1, /* 32BDB (207835) */
+    1, /* 32BDC (207836) */
+    1, /* 32BDD (207837) */
+    1, /* 32BDE (207838) */
+    1, /* 32BDF (207839) */
+    1, /* 32BE0 (207840) */
+    1, /* 32BE1 (207841) */
+    1, /* 32BE2 (207842) */
+    1, /* 32BE3 (207843) */
+    1, /* 32BE4 (207844) */
+    1, /* 32BE5 (207845) */
+    1, /* 32BE6 (207846) */
+    1, /* 32BE7 (207847) */
+    1, /* 32BE8 (207848) */
+    1, /* 32BE9 (207849) */
+    1, /* 32BEA (207850) */
+    1, /* 32BEB (207851) */
+    1, /* 32BEC (207852) */
+    1, /* 32BED (207853) */
+    1, /* 32BEE (207854) */
+    1, /* 32BEF (207855) */
+    1, /* 32BF0 (207856) */
+    1, /* 32BF1 (207857) */
+    1, /* 32BF2 (207858) */
+    1, /* 32BF3 (207859) */
+    1, /* 32BF4 (207860) */
+    1, /* 32BF5 (207861) */
+    1, /* 32BF6 (207862) */
+    1, /* 32BF7 (207863) */
+    1, /* 32BF8 (207864) */
+    1, /* 32BF9 (207865) */
+    1, /* 32BFA (207866) */
+    1, /* 32BFB (207867) */
+    1, /* 32BFC (207868) */
+    1, /* 32BFD (207869) */
+    1, /* 32BFE (207870) */
+    1, /* 32BFF (207871) */
+    1, /* 32C00 (207872) */
+    1, /* 32C01 (207873) */
+    1, /* 32C02 (207874) */
+    1, /* 32C03 (207875) */
+    1, /* 32C04 (207876) */
+    1, /* 32C05 (207877) */
+    1, /* 32C06 (207878) */
+    1, /* 32C07 (207879) */
+    1, /* 32C08 (207880) */
+    1, /* 32C09 (207881) */
+    1, /* 32C0A (207882) */
+    1, /* 32C0B (207883) */
+    1, /* 32C0C (207884) */
+    1, /* 32C0D (207885) */
+    1, /* 32C0E (207886) */
+    1, /* 32C0F (207887) */
+    1, /* 32C10 (207888) */
+    1, /* 32C11 (207889) */
+    1, /* 32C12 (207890) */
+    1, /* 32C13 (207891) */
+    1, /* 32C14 (207892) */
+    1, /* 32C15 (207893) */
+    1, /* 32C16 (207894) */
+    1, /* 32C17 (207895) */
+    1, /* 32C18 (207896) */
+    1, /* 32C19 (207897) */
+    1, /* 32C1A (207898) */
+    1, /* 32C1B (207899) */
+    1, /* 32C1C (207900) */
+    1, /* 32C1D (207901) */
+    1, /* 32C1E (207902) */
+    1, /* 32C1F (207903) */
+    1, /* 32C20 (207904) */
+    1, /* 32C21 (207905) */
+    1, /* 32C22 (207906) */
+    1, /* 32C23 (207907) */
+    1, /* 32C24 (207908) */
+    1, /* 32C25 (207909) */
+    1, /* 32C26 (207910) */
+    1, /* 32C27 (207911) */
+    1, /* 32C28 (207912) */
+    1, /* 32C29 (207913) */
+    1, /* 32C2A (207914) */
+    1, /* 32C2B (207915) */
+    1, /* 32C2C (207916) */
+    1, /* 32C2D (207917) */
+    1, /* 32C2E (207918) */
+    1, /* 32C2F (207919) */
+    1, /* 32C30 (207920) */
+    1, /* 32C31 (207921) */
+    1, /* 32C32 (207922) */
+    1, /* 32C33 (207923) */
+    1, /* 32C34 (207924) */
+    1, /* 32C35 (207925) */
+    1, /* 32C36 (207926) */
+    1, /* 32C37 (207927) */
+    1, /* 32C38 (207928) */
+    1, /* 32C39 (207929) */
+    1, /* 32C3A (207930) */
+    1, /* 32C3B (207931) */
+    1, /* 32C3C (207932) */
+    1, /* 32C3D (207933) */
+    1, /* 32C3E (207934) */
+    1, /* 32C3F (207935) */
+    1, /* 32C40 (207936) */
+    1, /* 32C41 (207937) */
+    1, /* 32C42 (207938) */
+    1, /* 32C43 (207939) */
+    1, /* 32C44 (207940) */
+    1, /* 32C45 (207941) */
+    1, /* 32C46 (207942) */
+    1, /* 32C47 (207943) */
+    1, /* 32C48 (207944) */
+    1, /* 32C49 (207945) */
+    1, /* 32C4A (207946) */
+    1, /* 32C4B (207947) */
+    1, /* 32C4C (207948) */
+    1, /* 32C4D (207949) */
+    1, /* 32C4E (207950) */
+    1, /* 32C4F (207951) */
+    1, /* 32C50 (207952) */
+    1, /* 32C51 (207953) */
+    1, /* 32C52 (207954) */
+    1, /* 32C53 (207955) */
+    1, /* 32C54 (207956) */
+    1, /* 32C55 (207957) */
+    1, /* 32C56 (207958) */
+    1, /* 32C57 (207959) */
+    1, /* 32C58 (207960) */
+    1, /* 32C59 (207961) */
+    1, /* 32C5A (207962) */
+    1, /* 32C5B (207963) */
+    1, /* 32C5C (207964) */
+    1, /* 32C5D (207965) */
+    1, /* 32C5E (207966) */
+    1, /* 32C5F (207967) */
+    1, /* 32C60 (207968) */
+    1, /* 32C61 (207969) */
+    1, /* 32C62 (207970) */
+    1, /* 32C63 (207971) */
+    1, /* 32C64 (207972) */
+    1, /* 32C65 (207973) */
+    1, /* 32C66 (207974) */
+    1, /* 32C67 (207975) */
+    1, /* 32C68 (207976) */
+    1, /* 32C69 (207977) */
+    1, /* 32C6A (207978) */
+    1, /* 32C6B (207979) */
+    1, /* 32C6C (207980) */
+    1, /* 32C6D (207981) */
+    1, /* 32C6E (207982) */
+    1, /* 32C6F (207983) */
+    1, /* 32C70 (207984) */
+    1, /* 32C71 (207985) */
+    1, /* 32C72 (207986) */
+    1, /* 32C73 (207987) */
+    1, /* 32C74 (207988) */
+    1, /* 32C75 (207989) */
+    1, /* 32C76 (207990) */
+    1, /* 32C77 (207991) */
+    1, /* 32C78 (207992) */
+    1, /* 32C79 (207993) */
+    1, /* 32C7A (207994) */
+    1, /* 32C7B (207995) */
+    1, /* 32C7C (207996) */
+    1, /* 32C7D (207997) */
+    1, /* 32C7E (207998) */
+    1, /* 32C7F (207999) */
+    1, /* 32C80 (208000) */
+    1, /* 32C81 (208001) */
+    1, /* 32C82 (208002) */
+    1, /* 32C83 (208003) */
+    1, /* 32C84 (208004) */
+    1, /* 32C85 (208005) */
+    1, /* 32C86 (208006) */
+    1, /* 32C87 (208007) */
+    1, /* 32C88 (208008) */
+    1, /* 32C89 (208009) */
+    1, /* 32C8A (208010) */
+    1, /* 32C8B (208011) */
+    1, /* 32C8C (208012) */
+    1, /* 32C8D (208013) */
+    1, /* 32C8E (208014) */
+    1, /* 32C8F (208015) */
+    1, /* 32C90 (208016) */
+    1, /* 32C91 (208017) */
+    1, /* 32C92 (208018) */
+    1, /* 32C93 (208019) */
+    1, /* 32C94 (208020) */
+    1, /* 32C95 (208021) */
+    1, /* 32C96 (208022) */
+    1, /* 32C97 (208023) */
+    1, /* 32C98 (208024) */
+    1, /* 32C99 (208025) */
+    1, /* 32C9A (208026) */
+    1, /* 32C9B (208027) */
+    1, /* 32C9C (208028) */
+    1, /* 32C9D (208029) */
+    1, /* 32C9E (208030) */
+    1, /* 32C9F (208031) */
+    1, /* 32CA0 (208032) */
+    1, /* 32CA1 (208033) */
+    1, /* 32CA2 (208034) */
+    1, /* 32CA3 (208035) */
+    1, /* 32CA4 (208036) */
+    1, /* 32CA5 (208037) */
+    1, /* 32CA6 (208038) */
+    1, /* 32CA7 (208039) */
+    1, /* 32CA8 (208040) */
+    1, /* 32CA9 (208041) */
+    1, /* 32CAA (208042) */
+    1, /* 32CAB (208043) */
+    1, /* 32CAC (208044) */
+    1, /* 32CAD (208045) */
+    1, /* 32CAE (208046) */
+    1, /* 32CAF (208047) */
+    1, /* 32CB0 (208048) */
+    1, /* 32CB1 (208049) */
+    1, /* 32CB2 (208050) */
+    1, /* 32CB3 (208051) */
+    1, /* 32CB4 (208052) */
+    1, /* 32CB5 (208053) */
+    1, /* 32CB6 (208054) */
+    1, /* 32CB7 (208055) */
+    1, /* 32CB8 (208056) */
+    1, /* 32CB9 (208057) */
+    1, /* 32CBA (208058) */
+    1, /* 32CBB (208059) */
+    1, /* 32CBC (208060) */
+    1, /* 32CBD (208061) */
+    1, /* 32CBE (208062) */
+    1, /* 32CBF (208063) */
+    1, /* 32CC0 (208064) */
+    1, /* 32CC1 (208065) */
+    1, /* 32CC2 (208066) */
+    1, /* 32CC3 (208067) */
+    1, /* 32CC4 (208068) */
+    1, /* 32CC5 (208069) */
+    1, /* 32CC6 (208070) */
+    1, /* 32CC7 (208071) */
+    1, /* 32CC8 (208072) */
+    1, /* 32CC9 (208073) */
+    1, /* 32CCA (208074) */
+    1, /* 32CCB (208075) */
+    1, /* 32CCC (208076) */
+    1, /* 32CCD (208077) */
+    1, /* 32CCE (208078) */
+    1, /* 32CCF (208079) */
+    1, /* 32CD0 (208080) */
+    1, /* 32CD1 (208081) */
+    1, /* 32CD2 (208082) */
+    1, /* 32CD3 (208083) */
+    1, /* 32CD4 (208084) */
+    1, /* 32CD5 (208085) */
+    1, /* 32CD6 (208086) */
+    1, /* 32CD7 (208087) */
+    1, /* 32CD8 (208088) */
+    1, /* 32CD9 (208089) */
+    1, /* 32CDA (208090) */
+    1, /* 32CDB (208091) */
+    1, /* 32CDC (208092) */
+    1, /* 32CDD (208093) */
+    1, /* 32CDE (208094) */
+    1, /* 32CDF (208095) */
+    1, /* 32CE0 (208096) */
+    1, /* 32CE1 (208097) */
+    1, /* 32CE2 (208098) */
+    1, /* 32CE3 (208099) */
+    1, /* 32CE4 (208100) */
+    1, /* 32CE5 (208101) */
+    1, /* 32CE6 (208102) */
+    1, /* 32CE7 (208103) */
+    1, /* 32CE8 (208104) */
+    1, /* 32CE9 (208105) */
+    1, /* 32CEA (208106) */
+    1, /* 32CEB (208107) */
+    1, /* 32CEC (208108) */
+    1, /* 32CED (208109) */
+    1, /* 32CEE (208110) */
+    1, /* 32CEF (208111) */
+    1, /* 32CF0 (208112) */
+    1, /* 32CF1 (208113) */
+    1, /* 32CF2 (208114) */
+    1, /* 32CF3 (208115) */
+    1, /* 32CF4 (208116) */
+    1, /* 32CF5 (208117) */
+    1, /* 32CF6 (208118) */
+    1, /* 32CF7 (208119) */
+    1, /* 32CF8 (208120) */
+    1, /* 32CF9 (208121) */
+    1, /* 32CFA (208122) */
+    1, /* 32CFB (208123) */
+    1, /* 32CFC (208124) */
+    1, /* 32CFD (208125) */
+    1, /* 32CFE (208126) */
+    1, /* 32CFF (208127) */
+    1, /* 32D00 (208128) */
+    1, /* 32D01 (208129) */
+    1, /* 32D02 (208130) */
+    1, /* 32D03 (208131) */
+    1, /* 32D04 (208132) */
+    1, /* 32D05 (208133) */
+    1, /* 32D06 (208134) */
+    1, /* 32D07 (208135) */
+    1, /* 32D08 (208136) */
+    1, /* 32D09 (208137) */
+    1, /* 32D0A (208138) */
+    1, /* 32D0B (208139) */
+    1, /* 32D0C (208140) */
+    1, /* 32D0D (208141) */
+    1, /* 32D0E (208142) */
+    1, /* 32D0F (208143) */
+    1, /* 32D10 (208144) */
+    1, /* 32D11 (208145) */
+    1, /* 32D12 (208146) */
+    1, /* 32D13 (208147) */
+    1, /* 32D14 (208148) */
+    1, /* 32D15 (208149) */
+    1, /* 32D16 (208150) */
+    1, /* 32D17 (208151) */
+    1, /* 32D18 (208152) */
+    1, /* 32D19 (208153) */
+    1, /* 32D1A (208154) */
+    1, /* 32D1B (208155) */
+    1, /* 32D1C (208156) */
+    1, /* 32D1D (208157) */
+    1, /* 32D1E (208158) */
+    1, /* 32D1F (208159) */
+    1, /* 32D20 (208160) */
+    1, /* 32D21 (208161) */
+    1, /* 32D22 (208162) */
+    1, /* 32D23 (208163) */
+    1, /* 32D24 (208164) */
+    1, /* 32D25 (208165) */
+    1, /* 32D26 (208166) */
+    1, /* 32D27 (208167) */
+    1, /* 32D28 (208168) */
+    1, /* 32D29 (208169) */
+    1, /* 32D2A (208170) */
+    1, /* 32D2B (208171) */
+    1, /* 32D2C (208172) */
+    1, /* 32D2D (208173) */
+    1, /* 32D2E (208174) */
+    1, /* 32D2F (208175) */
+    1, /* 32D30 (208176) */
+    1, /* 32D31 (208177) */
+    1, /* 32D32 (208178) */
+    1, /* 32D33 (208179) */
+    1, /* 32D34 (208180) */
+    1, /* 32D35 (208181) */
+    1, /* 32D36 (208182) */
+    1, /* 32D37 (208183) */
+    1, /* 32D38 (208184) */
+    1, /* 32D39 (208185) */
+    1, /* 32D3A (208186) */
+    1, /* 32D3B (208187) */
+    1, /* 32D3C (208188) */
+    1, /* 32D3D (208189) */
+    1, /* 32D3E (208190) */
+    1, /* 32D3F (208191) */
+    1, /* 32D40 (208192) */
+    1, /* 32D41 (208193) */
+    1, /* 32D42 (208194) */
+    1, /* 32D43 (208195) */
+    1, /* 32D44 (208196) */
+    1, /* 32D45 (208197) */
+    1, /* 32D46 (208198) */
+    1, /* 32D47 (208199) */
+    1, /* 32D48 (208200) */
+    1, /* 32D49 (208201) */
+    1, /* 32D4A (208202) */
+    1, /* 32D4B (208203) */
+    1, /* 32D4C (208204) */
+    1, /* 32D4D (208205) */
+    1, /* 32D4E (208206) */
+    1, /* 32D4F (208207) */
+    1, /* 32D50 (208208) */
+    1, /* 32D51 (208209) */
+    1, /* 32D52 (208210) */
+    1, /* 32D53 (208211) */
+    1, /* 32D54 (208212) */
+    1, /* 32D55 (208213) */
+    1, /* 32D56 (208214) */
+    1, /* 32D57 (208215) */
+    1, /* 32D58 (208216) */
+    1, /* 32D59 (208217) */
+    1, /* 32D5A (208218) */
+    1, /* 32D5B (208219) */
+    1, /* 32D5C (208220) */
+    1, /* 32D5D (208221) */
+    1, /* 32D5E (208222) */
+    1, /* 32D5F (208223) */
+    1, /* 32D60 (208224) */
+    1, /* 32D61 (208225) */
+    1, /* 32D62 (208226) */
+    1, /* 32D63 (208227) */
+    1, /* 32D64 (208228) */
+    1, /* 32D65 (208229) */
+    1, /* 32D66 (208230) */
+    1, /* 32D67 (208231) */
+    1, /* 32D68 (208232) */
+    1, /* 32D69 (208233) */
+    1, /* 32D6A (208234) */
+    1, /* 32D6B (208235) */
+    1, /* 32D6C (208236) */
+    1, /* 32D6D (208237) */
+    1, /* 32D6E (208238) */
+    1, /* 32D6F (208239) */
+    1, /* 32D70 (208240) */
+    1, /* 32D71 (208241) */
+    1, /* 32D72 (208242) */
+    1, /* 32D73 (208243) */
+    1, /* 32D74 (208244) */
+    1, /* 32D75 (208245) */
+    1, /* 32D76 (208246) */
+    1, /* 32D77 (208247) */
+    1, /* 32D78 (208248) */
+    1, /* 32D79 (208249) */
+    1, /* 32D7A (208250) */
+    1, /* 32D7B (208251) */
+    1, /* 32D7C (208252) */
+    1, /* 32D7D (208253) */
+    1, /* 32D7E (208254) */
+    1, /* 32D7F (208255) */
+    1, /* 32D80 (208256) */
+    1, /* 32D81 (208257) */
+    1, /* 32D82 (208258) */
+    1, /* 32D83 (208259) */
+    1, /* 32D84 (208260) */
+    1, /* 32D85 (208261) */
+    1, /* 32D86 (208262) */
+    1, /* 32D87 (208263) */
+    1, /* 32D88 (208264) */
+    1, /* 32D89 (208265) */
+    1, /* 32D8A (208266) */
+    1, /* 32D8B (208267) */
+    1, /* 32D8C (208268) */
+    1, /* 32D8D (208269) */
+    1, /* 32D8E (208270) */
+    1, /* 32D8F (208271) */
+    1, /* 32D90 (208272) */
+    1, /* 32D91 (208273) */
+    1, /* 32D92 (208274) */
+    1, /* 32D93 (208275) */
+    1, /* 32D94 (208276) */
+    1, /* 32D95 (208277) */
+    1, /* 32D96 (208278) */
+    1, /* 32D97 (208279) */
+    1, /* 32D98 (208280) */
+    1, /* 32D99 (208281) */
+    1, /* 32D9A (208282) */
+    1, /* 32D9B (208283) */
+    1, /* 32D9C (208284) */
+    1, /* 32D9D (208285) */
+    1, /* 32D9E (208286) */
+    1, /* 32D9F (208287) */
+    1, /* 32DA0 (208288) */
+    1, /* 32DA1 (208289) */
+    1, /* 32DA2 (208290) */
+    1, /* 32DA3 (208291) */
+    1, /* 32DA4 (208292) */
+    1, /* 32DA5 (208293) */
+    1, /* 32DA6 (208294) */
+    1, /* 32DA7 (208295) */
+    1, /* 32DA8 (208296) */
+    1, /* 32DA9 (208297) */
+    1, /* 32DAA (208298) */
+    1, /* 32DAB (208299) */
+    1, /* 32DAC (208300) */
+    1, /* 32DAD (208301) */
+    1, /* 32DAE (208302) */
+    1, /* 32DAF (208303) */
+    1, /* 32DB0 (208304) */
+    1, /* 32DB1 (208305) */
+    1, /* 32DB2 (208306) */
+    1, /* 32DB3 (208307) */
+    1, /* 32DB4 (208308) */
+    1, /* 32DB5 (208309) */
+    1, /* 32DB6 (208310) */
+    1, /* 32DB7 (208311) */
+    1, /* 32DB8 (208312) */
+    1, /* 32DB9 (208313) */
+    1, /* 32DBA (208314) */
+    1, /* 32DBB (208315) */
+    1, /* 32DBC (208316) */
+    1, /* 32DBD (208317) */
+    1, /* 32DBE (208318) */
+    1, /* 32DBF (208319) */
+    1, /* 32DC0 (208320) */
+    1, /* 32DC1 (208321) */
+    1, /* 32DC2 (208322) */
+    1, /* 32DC3 (208323) */
+    1, /* 32DC4 (208324) */
+    1, /* 32DC5 (208325) */
+    1, /* 32DC6 (208326) */
+    1, /* 32DC7 (208327) */
+    1, /* 32DC8 (208328) */
+    1, /* 32DC9 (208329) */
+    1, /* 32DCA (208330) */
+    1, /* 32DCB (208331) */
+    1, /* 32DCC (208332) */
+    1, /* 32DCD (208333) */
+    1, /* 32DCE (208334) */
+    1, /* 32DCF (208335) */
+    1, /* 32DD0 (208336) */
+    1, /* 32DD1 (208337) */
+    1, /* 32DD2 (208338) */
+    1, /* 32DD3 (208339) */
+    1, /* 32DD4 (208340) */
+    1, /* 32DD5 (208341) */
+    1, /* 32DD6 (208342) */
+    1, /* 32DD7 (208343) */
+    1, /* 32DD8 (208344) */
+    1, /* 32DD9 (208345) */
+    1, /* 32DDA (208346) */
+    1, /* 32DDB (208347) */
+    1, /* 32DDC (208348) */
+    1, /* 32DDD (208349) */
+    1, /* 32DDE (208350) */
+    1, /* 32DDF (208351) */
+    1, /* 32DE0 (208352) */
+    1, /* 32DE1 (208353) */
+    1, /* 32DE2 (208354) */
+    1, /* 32DE3 (208355) */
+    1, /* 32DE4 (208356) */
+    1, /* 32DE5 (208357) */
+    1, /* 32DE6 (208358) */
+    1, /* 32DE7 (208359) */
+    1, /* 32DE8 (208360) */
+    1, /* 32DE9 (208361) */
+    1, /* 32DEA (208362) */
+    1, /* 32DEB (208363) */
+    1, /* 32DEC (208364) */
+    1, /* 32DED (208365) */
+    1, /* 32DEE (208366) */
+    1, /* 32DEF (208367) */
+    1, /* 32DF0 (208368) */
+    1, /* 32DF1 (208369) */
+    1, /* 32DF2 (208370) */
+    1, /* 32DF3 (208371) */
+    1, /* 32DF4 (208372) */
+    1, /* 32DF5 (208373) */
+    1, /* 32DF6 (208374) */
+    1, /* 32DF7 (208375) */
+    1, /* 32DF8 (208376) */
+    1, /* 32DF9 (208377) */
+    1, /* 32DFA (208378) */
+    1, /* 32DFB (208379) */
+    1, /* 32DFC (208380) */
+    1, /* 32DFD (208381) */
+    1, /* 32DFE (208382) */
+    1, /* 32DFF (208383) */
+    1, /* 32E00 (208384) */
+    1, /* 32E01 (208385) */
+    1, /* 32E02 (208386) */
+    1, /* 32E03 (208387) */
+    1, /* 32E04 (208388) */
+    1, /* 32E05 (208389) */
+    1, /* 32E06 (208390) */
+    1, /* 32E07 (208391) */
+    1, /* 32E08 (208392) */
+    1, /* 32E09 (208393) */
+    1, /* 32E0A (208394) */
+    1, /* 32E0B (208395) */
+    1, /* 32E0C (208396) */
+    1, /* 32E0D (208397) */
+    1, /* 32E0E (208398) */
+    1, /* 32E0F (208399) */
+    1, /* 32E10 (208400) */
+    1, /* 32E11 (208401) */
+    1, /* 32E12 (208402) */
+    1, /* 32E13 (208403) */
+    1, /* 32E14 (208404) */
+    1, /* 32E15 (208405) */
+    1, /* 32E16 (208406) */
+    1, /* 32E17 (208407) */
+    1, /* 32E18 (208408) */
+    1, /* 32E19 (208409) */
+    1, /* 32E1A (208410) */
+    1, /* 32E1B (208411) */
+    1, /* 32E1C (208412) */
+    1, /* 32E1D (208413) */
+    1, /* 32E1E (208414) */
+    1, /* 32E1F (208415) */
+    1, /* 32E20 (208416) */
+    1, /* 32E21 (208417) */
+    1, /* 32E22 (208418) */
+    1, /* 32E23 (208419) */
+    1, /* 32E24 (208420) */
+    1, /* 32E25 (208421) */
+    1, /* 32E26 (208422) */
+    1, /* 32E27 (208423) */
+    1, /* 32E28 (208424) */
+    1, /* 32E29 (208425) */
+    1, /* 32E2A (208426) */
+    1, /* 32E2B (208427) */
+    1, /* 32E2C (208428) */
+    1, /* 32E2D (208429) */
+    1, /* 32E2E (208430) */
+    1, /* 32E2F (208431) */
+    1, /* 32E30 (208432) */
+    1, /* 32E31 (208433) */
+    1, /* 32E32 (208434) */
+    1, /* 32E33 (208435) */
+    1, /* 32E34 (208436) */
+    1, /* 32E35 (208437) */
+    1, /* 32E36 (208438) */
+    1, /* 32E37 (208439) */
+    1, /* 32E38 (208440) */
+    1, /* 32E39 (208441) */
+    1, /* 32E3A (208442) */
+    1, /* 32E3B (208443) */
+    1, /* 32E3C (208444) */
+    1, /* 32E3D (208445) */
+    1, /* 32E3E (208446) */
+    1, /* 32E3F (208447) */
+    1, /* 32E40 (208448) */
+    1, /* 32E41 (208449) */
+    1, /* 32E42 (208450) */
+    1, /* 32E43 (208451) */
+    1, /* 32E44 (208452) */
+    1, /* 32E45 (208453) */
+    1, /* 32E46 (208454) */
+    1, /* 32E47 (208455) */
+    1, /* 32E48 (208456) */
+    1, /* 32E49 (208457) */
+    1, /* 32E4A (208458) */
+    1, /* 32E4B (208459) */
+    1, /* 32E4C (208460) */
+    1, /* 32E4D (208461) */
+    1, /* 32E4E (208462) */
+    1, /* 32E4F (208463) */
+    1, /* 32E50 (208464) */
+    1, /* 32E51 (208465) */
+    1, /* 32E52 (208466) */
+    1, /* 32E53 (208467) */
+    1, /* 32E54 (208468) */
+    1, /* 32E55 (208469) */
+    1, /* 32E56 (208470) */
+    1, /* 32E57 (208471) */
+    1, /* 32E58 (208472) */
+    1, /* 32E59 (208473) */
+    1, /* 32E5A (208474) */
+    1, /* 32E5B (208475) */
+    1, /* 32E5C (208476) */
+    1, /* 32E5D (208477) */
+    1, /* 32E5E (208478) */
+    1, /* 32E5F (208479) */
+    1, /* 32E60 (208480) */
+    1, /* 32E61 (208481) */
+    1, /* 32E62 (208482) */
+    1, /* 32E63 (208483) */
+    1, /* 32E64 (208484) */
+    1, /* 32E65 (208485) */
+    1, /* 32E66 (208486) */
+    1, /* 32E67 (208487) */
+    1, /* 32E68 (208488) */
+    1, /* 32E69 (208489) */
+    1, /* 32E6A (208490) */
+    1, /* 32E6B (208491) */
+    1, /* 32E6C (208492) */
+    1, /* 32E6D (208493) */
+    1, /* 32E6E (208494) */
+    1, /* 32E6F (208495) */
+    1, /* 32E70 (208496) */
+    1, /* 32E71 (208497) */
+    1, /* 32E72 (208498) */
+    1, /* 32E73 (208499) */
+    1, /* 32E74 (208500) */
+    1, /* 32E75 (208501) */
+    1, /* 32E76 (208502) */
+    1, /* 32E77 (208503) */
+    1, /* 32E78 (208504) */
+    1, /* 32E79 (208505) */
+    1, /* 32E7A (208506) */
+    1, /* 32E7B (208507) */
+    1, /* 32E7C (208508) */
+    1, /* 32E7D (208509) */
+    1, /* 32E7E (208510) */
+    1, /* 32E7F (208511) */
+    1, /* 32E80 (208512) */
+    1, /* 32E81 (208513) */
+    1, /* 32E82 (208514) */
+    1, /* 32E83 (208515) */
+    1, /* 32E84 (208516) */
+    1, /* 32E85 (208517) */
+    1, /* 32E86 (208518) */
+    1, /* 32E87 (208519) */
+    1, /* 32E88 (208520) */
+    1, /* 32E89 (208521) */
+    1, /* 32E8A (208522) */
+    1, /* 32E8B (208523) */
+    1, /* 32E8C (208524) */
+    1, /* 32E8D (208525) */
+    1, /* 32E8E (208526) */
+    1, /* 32E8F (208527) */
+    1, /* 32E90 (208528) */
+    1, /* 32E91 (208529) */
+    1, /* 32E92 (208530) */
+    1, /* 32E93 (208531) */
+    1, /* 32E94 (208532) */
+    1, /* 32E95 (208533) */
+    1, /* 32E96 (208534) */
+    1, /* 32E97 (208535) */
+    1, /* 32E98 (208536) */
+    1, /* 32E99 (208537) */
+    1, /* 32E9A (208538) */
+    1, /* 32E9B (208539) */
+    1, /* 32E9C (208540) */
+    1, /* 32E9D (208541) */
+    1, /* 32E9E (208542) */
+    1, /* 32E9F (208543) */
+    1, /* 32EA0 (208544) */
+    1, /* 32EA1 (208545) */
+    1, /* 32EA2 (208546) */
+    1, /* 32EA3 (208547) */
+    1, /* 32EA4 (208548) */
+    1, /* 32EA5 (208549) */
+    1, /* 32EA6 (208550) */
+    1, /* 32EA7 (208551) */
+    1, /* 32EA8 (208552) */
+    1, /* 32EA9 (208553) */
+    1, /* 32EAA (208554) */
+    1, /* 32EAB (208555) */
+    1, /* 32EAC (208556) */
+    1, /* 32EAD (208557) */
+    1, /* 32EAE (208558) */
+    1, /* 32EAF (208559) */
+    1, /* 32EB0 (208560) */
+    1, /* 32EB1 (208561) */
+    1, /* 32EB2 (208562) */
+    1, /* 32EB3 (208563) */
+    1, /* 32EB4 (208564) */
+    1, /* 32EB5 (208565) */
+    1, /* 32EB6 (208566) */
+    1, /* 32EB7 (208567) */
+    1, /* 32EB8 (208568) */
+    1, /* 32EB9 (208569) */
+    1, /* 32EBA (208570) */
+    1, /* 32EBB (208571) */
+    1, /* 32EBC (208572) */
+    1, /* 32EBD (208573) */
+    1, /* 32EBE (208574) */
+    1, /* 32EBF (208575) */
+    1, /* 32EC0 (208576) */
+    1, /* 32EC1 (208577) */
+    1, /* 32EC2 (208578) */
+    1, /* 32EC3 (208579) */
+    1, /* 32EC4 (208580) */
+    1, /* 32EC5 (208581) */
+    1, /* 32EC6 (208582) */
+    1, /* 32EC7 (208583) */
+    1, /* 32EC8 (208584) */
+    1, /* 32EC9 (208585) */
+    1, /* 32ECA (208586) */
+    1, /* 32ECB (208587) */
+    1, /* 32ECC (208588) */
+    1, /* 32ECD (208589) */
+    1, /* 32ECE (208590) */
+    1, /* 32ECF (208591) */
+    1, /* 32ED0 (208592) */
+    1, /* 32ED1 (208593) */
+    1, /* 32ED2 (208594) */
+    1, /* 32ED3 (208595) */
+    1, /* 32ED4 (208596) */
+    1, /* 32ED5 (208597) */
+    1, /* 32ED6 (208598) */
+    1, /* 32ED7 (208599) */
+    1, /* 32ED8 (208600) */
+    1, /* 32ED9 (208601) */
+    1, /* 32EDA (208602) */
+    1, /* 32EDB (208603) */
+    1, /* 32EDC (208604) */
+    1, /* 32EDD (208605) */
+    1, /* 32EDE (208606) */
+    1, /* 32EDF (208607) */
+    1, /* 32EE0 (208608) */
+    1, /* 32EE1 (208609) */
+    1, /* 32EE2 (208610) */
+    1, /* 32EE3 (208611) */
+    1, /* 32EE4 (208612) */
+    1, /* 32EE5 (208613) */
+    1, /* 32EE6 (208614) */
+    1, /* 32EE7 (208615) */
+    1, /* 32EE8 (208616) */
+    1, /* 32EE9 (208617) */
+    1, /* 32EEA (208618) */
+    1, /* 32EEB (208619) */
+    1, /* 32EEC (208620) */
+    1, /* 32EED (208621) */
+    1, /* 32EEE (208622) */
+    1, /* 32EEF (208623) */
+    1, /* 32EF0 (208624) */
+    1, /* 32EF1 (208625) */
+    1, /* 32EF2 (208626) */
+    1, /* 32EF3 (208627) */
+    1, /* 32EF4 (208628) */
+    1, /* 32EF5 (208629) */
+    1, /* 32EF6 (208630) */
+    1, /* 32EF7 (208631) */
+    1, /* 32EF8 (208632) */
+    1, /* 32EF9 (208633) */
+    1, /* 32EFA (208634) */
+    1, /* 32EFB (208635) */
+    1, /* 32EFC (208636) */
+    1, /* 32EFD (208637) */
+    1, /* 32EFE (208638) */
+    1, /* 32EFF (208639) */
+    1, /* 32F00 (208640) */
+    1, /* 32F01 (208641) */
+    1, /* 32F02 (208642) */
+    1, /* 32F03 (208643) */
+    1, /* 32F04 (208644) */
+    1, /* 32F05 (208645) */
+    1, /* 32F06 (208646) */
+    1, /* 32F07 (208647) */
+    1, /* 32F08 (208648) */
+    1, /* 32F09 (208649) */
+    1, /* 32F0A (208650) */
+    1, /* 32F0B (208651) */
+    1, /* 32F0C (208652) */
+    1, /* 32F0D (208653) */
+    1, /* 32F0E (208654) */
+    1, /* 32F0F (208655) */
+    1, /* 32F10 (208656) */
+    1, /* 32F11 (208657) */
+    1, /* 32F12 (208658) */
+    1, /* 32F13 (208659) */
+    1, /* 32F14 (208660) */
+    1, /* 32F15 (208661) */
+    1, /* 32F16 (208662) */
+    1, /* 32F17 (208663) */
+    1, /* 32F18 (208664) */
+    1, /* 32F19 (208665) */
+    1, /* 32F1A (208666) */
+    1, /* 32F1B (208667) */
+    1, /* 32F1C (208668) */
+    1, /* 32F1D (208669) */
+    1, /* 32F1E (208670) */
+    1, /* 32F1F (208671) */
+    1, /* 32F20 (208672) */
+    1, /* 32F21 (208673) */
+    1, /* 32F22 (208674) */
+    1, /* 32F23 (208675) */
+    1, /* 32F24 (208676) */
+    1, /* 32F25 (208677) */
+    1, /* 32F26 (208678) */
+    1, /* 32F27 (208679) */
+    1, /* 32F28 (208680) */
+    1, /* 32F29 (208681) */
+    1, /* 32F2A (208682) */
+    1, /* 32F2B (208683) */
+    1, /* 32F2C (208684) */
+    1, /* 32F2D (208685) */
+    1, /* 32F2E (208686) */
+    1, /* 32F2F (208687) */
+    1, /* 32F30 (208688) */
+    1, /* 32F31 (208689) */
+    1, /* 32F32 (208690) */
+    1, /* 32F33 (208691) */
+    1, /* 32F34 (208692) */
+    1, /* 32F35 (208693) */
+    1, /* 32F36 (208694) */
+    1, /* 32F37 (208695) */
+    1, /* 32F38 (208696) */
+    1, /* 32F39 (208697) */
+    1, /* 32F3A (208698) */
+    1, /* 32F3B (208699) */
+    1, /* 32F3C (208700) */
+    1, /* 32F3D (208701) */
+    1, /* 32F3E (208702) */
+    1, /* 32F3F (208703) */
+    1, /* 32F40 (208704) */
+    1, /* 32F41 (208705) */
+    1, /* 32F42 (208706) */
+    1, /* 32F43 (208707) */
+    1, /* 32F44 (208708) */
+    1, /* 32F45 (208709) */
+    1, /* 32F46 (208710) */
+    1, /* 32F47 (208711) */
+    1, /* 32F48 (208712) */
+    1, /* 32F49 (208713) */
+    1, /* 32F4A (208714) */
+    1, /* 32F4B (208715) */
+    1, /* 32F4C (208716) */
+    1, /* 32F4D (208717) */
+    1, /* 32F4E (208718) */
+    1, /* 32F4F (208719) */
+    1, /* 32F50 (208720) */
+    1, /* 32F51 (208721) */
+    1, /* 32F52 (208722) */
+    1, /* 32F53 (208723) */
+    1, /* 32F54 (208724) */
+    1, /* 32F55 (208725) */
+    1, /* 32F56 (208726) */
+    1, /* 32F57 (208727) */
+    1, /* 32F58 (208728) */
+    1, /* 32F59 (208729) */
+    1, /* 32F5A (208730) */
+    1, /* 32F5B (208731) */
+    1, /* 32F5C (208732) */
+    1, /* 32F5D (208733) */
+    1, /* 32F5E (208734) */
+    1, /* 32F5F (208735) */
+    1, /* 32F60 (208736) */
+    1, /* 32F61 (208737) */
+    1, /* 32F62 (208738) */
+    1, /* 32F63 (208739) */
+    1, /* 32F64 (208740) */
+    1, /* 32F65 (208741) */
+    1, /* 32F66 (208742) */
+    1, /* 32F67 (208743) */
+    1, /* 32F68 (208744) */
+    1, /* 32F69 (208745) */
+    1, /* 32F6A (208746) */
+    1, /* 32F6B (208747) */
+    1, /* 32F6C (208748) */
+    1, /* 32F6D (208749) */
+    1, /* 32F6E (208750) */
+    1, /* 32F6F (208751) */
+    1, /* 32F70 (208752) */
+    1, /* 32F71 (208753) */
+    1, /* 32F72 (208754) */
+    1, /* 32F73 (208755) */
+    1, /* 32F74 (208756) */
+    1, /* 32F75 (208757) */
+    1, /* 32F76 (208758) */
+    1, /* 32F77 (208759) */
+    1, /* 32F78 (208760) */
+    1, /* 32F79 (208761) */
+    1, /* 32F7A (208762) */
+    1, /* 32F7B (208763) */
+    1, /* 32F7C (208764) */
+    1, /* 32F7D (208765) */
+    1, /* 32F7E (208766) */
+    1, /* 32F7F (208767) */
+    1, /* 32F80 (208768) */
+    1, /* 32F81 (208769) */
+    1, /* 32F82 (208770) */
+    1, /* 32F83 (208771) */
+    1, /* 32F84 (208772) */
+    1, /* 32F85 (208773) */
+    1, /* 32F86 (208774) */
+    1, /* 32F87 (208775) */
+    1, /* 32F88 (208776) */
+    1, /* 32F89 (208777) */
+    1, /* 32F8A (208778) */
+    1, /* 32F8B (208779) */
+    1, /* 32F8C (208780) */
+    1, /* 32F8D (208781) */
+    1, /* 32F8E (208782) */
+    1, /* 32F8F (208783) */
+    1, /* 32F90 (208784) */
+    1, /* 32F91 (208785) */
+    1, /* 32F92 (208786) */
+    1, /* 32F93 (208787) */
+    1, /* 32F94 (208788) */
+    1, /* 32F95 (208789) */
+    1, /* 32F96 (208790) */
+    1, /* 32F97 (208791) */
+    1, /* 32F98 (208792) */
+    1, /* 32F99 (208793) */
+    1, /* 32F9A (208794) */
+    1, /* 32F9B (208795) */
+    1, /* 32F9C (208796) */
+    1, /* 32F9D (208797) */
+    1, /* 32F9E (208798) */
+    1, /* 32F9F (208799) */
+    1, /* 32FA0 (208800) */
+    1, /* 32FA1 (208801) */
+    1, /* 32FA2 (208802) */
+    1, /* 32FA3 (208803) */
+    1, /* 32FA4 (208804) */
+    1, /* 32FA5 (208805) */
+    1, /* 32FA6 (208806) */
+    1, /* 32FA7 (208807) */
+    1, /* 32FA8 (208808) */
+    1, /* 32FA9 (208809) */
+    1, /* 32FAA (208810) */
+    1, /* 32FAB (208811) */
+    1, /* 32FAC (208812) */
+    1, /* 32FAD (208813) */
+    1, /* 32FAE (208814) */
+    1, /* 32FAF (208815) */
+    1, /* 32FB0 (208816) */
+    1, /* 32FB1 (208817) */
+    1, /* 32FB2 (208818) */
+    1, /* 32FB3 (208819) */
+    1, /* 32FB4 (208820) */
+    1, /* 32FB5 (208821) */
+    1, /* 32FB6 (208822) */
+    1, /* 32FB7 (208823) */
+    1, /* 32FB8 (208824) */
+    1, /* 32FB9 (208825) */
+    1, /* 32FBA (208826) */
+    1, /* 32FBB (208827) */
+    1, /* 32FBC (208828) */
+    1, /* 32FBD (208829) */
+    1, /* 32FBE (208830) */
+    1, /* 32FBF (208831) */
+    1, /* 32FC0 (208832) */
+    1, /* 32FC1 (208833) */
+    1, /* 32FC2 (208834) */
+    1, /* 32FC3 (208835) */
+    1, /* 32FC4 (208836) */
+    1, /* 32FC5 (208837) */
+    1, /* 32FC6 (208838) */
+    1, /* 32FC7 (208839) */
+    1, /* 32FC8 (208840) */
+    1, /* 32FC9 (208841) */
+    1, /* 32FCA (208842) */
+    1, /* 32FCB (208843) */
+    1, /* 32FCC (208844) */
+    1, /* 32FCD (208845) */
+    1, /* 32FCE (208846) */
+    1, /* 32FCF (208847) */
+    1, /* 32FD0 (208848) */
+    1, /* 32FD1 (208849) */
+    1, /* 32FD2 (208850) */
+    1, /* 32FD3 (208851) */
+    1, /* 32FD4 (208852) */
+    1, /* 32FD5 (208853) */
+    1, /* 32FD6 (208854) */
+    1, /* 32FD7 (208855) */
+    1, /* 32FD8 (208856) */
+    1, /* 32FD9 (208857) */
+    1, /* 32FDA (208858) */
+    1, /* 32FDB (208859) */
+    1, /* 32FDC (208860) */
+    1, /* 32FDD (208861) */
+    1, /* 32FDE (208862) */
+    1, /* 32FDF (208863) */
+    1, /* 32FE0 (208864) */
+    1, /* 32FE1 (208865) */
+    1, /* 32FE2 (208866) */
+    1, /* 32FE3 (208867) */
+    1, /* 32FE4 (208868) */
+    1, /* 32FE5 (208869) */
+    1, /* 32FE6 (208870) */
+    1, /* 32FE7 (208871) */
+    1, /* 32FE8 (208872) */
+    1, /* 32FE9 (208873) */
+    1, /* 32FEA (208874) */
+    1, /* 32FEB (208875) */
+    1, /* 32FEC (208876) */
+    1, /* 32FED (208877) */
+    1, /* 32FEE (208878) */
+    1, /* 32FEF (208879) */
+    1, /* 32FF0 (208880) */
+    1, /* 32FF1 (208881) */
+    1, /* 32FF2 (208882) */
+    1, /* 32FF3 (208883) */
+    1, /* 32FF4 (208884) */
+    1, /* 32FF5 (208885) */
+    1, /* 32FF6 (208886) */
+    1, /* 32FF7 (208887) */
+    1, /* 32FF8 (208888) */
+    1, /* 32FF9 (208889) */
+    1, /* 32FFA (208890) */
+    1, /* 32FFB (208891) */
+    1, /* 32FFC (208892) */
+    1, /* 32FFD (208893) */
+    1, /* 32FFE (208894) */
+    1, /* 32FFF (208895) */
+    1, /* 33000 (208896) */
+    1, /* 33001 (208897) */
+    1, /* 33002 (208898) */
+    1, /* 33003 (208899) */
+    1, /* 33004 (208900) */
+    1, /* 33005 (208901) */
+    1, /* 33006 (208902) */
+    1, /* 33007 (208903) */
+    1, /* 33008 (208904) */
+    1, /* 33009 (208905) */
+    1, /* 3300A (208906) */
+    1, /* 3300B (208907) */
+    1, /* 3300C (208908) */
+    1, /* 3300D (208909) */
+    1, /* 3300E (208910) */
+    1, /* 3300F (208911) */
+    1, /* 33010 (208912) */
+    1, /* 33011 (208913) */
+    1, /* 33012 (208914) */
+    1, /* 33013 (208915) */
+    1, /* 33014 (208916) */
+    1, /* 33015 (208917) */
+    1, /* 33016 (208918) */
+    1, /* 33017 (208919) */
+    1, /* 33018 (208920) */
+    1, /* 33019 (208921) */
+    1, /* 3301A (208922) */
+    1, /* 3301B (208923) */
+    1, /* 3301C (208924) */
+    1, /* 3301D (208925) */
+    1, /* 3301E (208926) */
+    1, /* 3301F (208927) */
+    1, /* 33020 (208928) */
+    1, /* 33021 (208929) */
+    1, /* 33022 (208930) */
+    1, /* 33023 (208931) */
+    1, /* 33024 (208932) */
+    1, /* 33025 (208933) */
+    1, /* 33026 (208934) */
+    1, /* 33027 (208935) */
+    1, /* 33028 (208936) */
+    1, /* 33029 (208937) */
+    1, /* 3302A (208938) */
+    1, /* 3302B (208939) */
+    1, /* 3302C (208940) */
+    1, /* 3302D (208941) */
+    1, /* 3302E (208942) */
+    1, /* 3302F (208943) */
+    1, /* 33030 (208944) */
+    1, /* 33031 (208945) */
+    1, /* 33032 (208946) */
+    1, /* 33033 (208947) */
+    1, /* 33034 (208948) */
+    1, /* 33035 (208949) */
+    1, /* 33036 (208950) */
+    1, /* 33037 (208951) */
+    1, /* 33038 (208952) */
+    1, /* 33039 (208953) */
+    1, /* 3303A (208954) */
+    1, /* 3303B (208955) */
+    1, /* 3303C (208956) */
+    1, /* 3303D (208957) */
+    1, /* 3303E (208958) */
+    1, /* 3303F (208959) */
+    1, /* 33040 (208960) */
+    1, /* 33041 (208961) */
+    1, /* 33042 (208962) */
+    1, /* 33043 (208963) */
+    1, /* 33044 (208964) */
+    1, /* 33045 (208965) */
+    1, /* 33046 (208966) */
+    1, /* 33047 (208967) */
+    1, /* 33048 (208968) */
+    1, /* 33049 (208969) */
+    1, /* 3304A (208970) */
+    1, /* 3304B (208971) */
+    1, /* 3304C (208972) */
+    1, /* 3304D (208973) */
+    1, /* 3304E (208974) */
+    1, /* 3304F (208975) */
+    1, /* 33050 (208976) */
+    1, /* 33051 (208977) */
+    1, /* 33052 (208978) */
+    1, /* 33053 (208979) */
+    1, /* 33054 (208980) */
+    1, /* 33055 (208981) */
+    1, /* 33056 (208982) */
+    1, /* 33057 (208983) */
+    1, /* 33058 (208984) */
+    1, /* 33059 (208985) */
+    1, /* 3305A (208986) */
+    1, /* 3305B (208987) */
+    1, /* 3305C (208988) */
+    1, /* 3305D (208989) */
+    1, /* 3305E (208990) */
+    1, /* 3305F (208991) */
+    1, /* 33060 (208992) */
+    1, /* 33061 (208993) */
+    1, /* 33062 (208994) */
+    1, /* 33063 (208995) */
+    1, /* 33064 (208996) */
+    1, /* 33065 (208997) */
+    1, /* 33066 (208998) */
+    1, /* 33067 (208999) */
+    1, /* 33068 (209000) */
+    1, /* 33069 (209001) */
+    1, /* 3306A (209002) */
+    1, /* 3306B (209003) */
+    1, /* 3306C (209004) */
+    1, /* 3306D (209005) */
+    1, /* 3306E (209006) */
+    1, /* 3306F (209007) */
+    1, /* 33070 (209008) */
+    1, /* 33071 (209009) */
+    1, /* 33072 (209010) */
+    1, /* 33073 (209011) */
+    1, /* 33074 (209012) */
+    1, /* 33075 (209013) */
+    1, /* 33076 (209014) */
+    1, /* 33077 (209015) */
+    1, /* 33078 (209016) */
+    1, /* 33079 (209017) */
+    1, /* 3307A (209018) */
+    1, /* 3307B (209019) */
+    1, /* 3307C (209020) */
+    1, /* 3307D (209021) */
+    1, /* 3307E (209022) */
+    1, /* 3307F (209023) */
+    1, /* 33080 (209024) */
+    1, /* 33081 (209025) */
+    1, /* 33082 (209026) */
+    1, /* 33083 (209027) */
+    1, /* 33084 (209028) */
+    1, /* 33085 (209029) */
+    1, /* 33086 (209030) */
+    1, /* 33087 (209031) */
+    1, /* 33088 (209032) */
+    1, /* 33089 (209033) */
+    1, /* 3308A (209034) */
+    1, /* 3308B (209035) */
+    1, /* 3308C (209036) */
+    1, /* 3308D (209037) */
+    1, /* 3308E (209038) */
+    1, /* 3308F (209039) */
+    1, /* 33090 (209040) */
+    1, /* 33091 (209041) */
+    1, /* 33092 (209042) */
+    1, /* 33093 (209043) */
+    1, /* 33094 (209044) */
+    1, /* 33095 (209045) */
+    1, /* 33096 (209046) */
+    1, /* 33097 (209047) */
+    1, /* 33098 (209048) */
+    1, /* 33099 (209049) */
+    1, /* 3309A (209050) */
+    1, /* 3309B (209051) */
+    1, /* 3309C (209052) */
+    1, /* 3309D (209053) */
+    1, /* 3309E (209054) */
+    1, /* 3309F (209055) */
+    1, /* 330A0 (209056) */
+    1, /* 330A1 (209057) */
+    1, /* 330A2 (209058) */
+    1, /* 330A3 (209059) */
+    1, /* 330A4 (209060) */
+    1, /* 330A5 (209061) */
+    1, /* 330A6 (209062) */
+    1, /* 330A7 (209063) */
+    1, /* 330A8 (209064) */
+    1, /* 330A9 (209065) */
+    1, /* 330AA (209066) */
+    1, /* 330AB (209067) */
+    1, /* 330AC (209068) */
+    1, /* 330AD (209069) */
+    1, /* 330AE (209070) */
+    1, /* 330AF (209071) */
+    1, /* 330B0 (209072) */
+    1, /* 330B1 (209073) */
+    1, /* 330B2 (209074) */
+    1, /* 330B3 (209075) */
+    1, /* 330B4 (209076) */
+    1, /* 330B5 (209077) */
+    1, /* 330B6 (209078) */
+    1, /* 330B7 (209079) */
+    1, /* 330B8 (209080) */
+    1, /* 330B9 (209081) */
+    1, /* 330BA (209082) */
+    1, /* 330BB (209083) */
+    1, /* 330BC (209084) */
+    1, /* 330BD (209085) */
+    1, /* 330BE (209086) */
+    1, /* 330BF (209087) */
+    1, /* 330C0 (209088) */
+    1, /* 330C1 (209089) */
+    1, /* 330C2 (209090) */
+    1, /* 330C3 (209091) */
+    1, /* 330C4 (209092) */
+    1, /* 330C5 (209093) */
+    1, /* 330C6 (209094) */
+    1, /* 330C7 (209095) */
+    1, /* 330C8 (209096) */
+    1, /* 330C9 (209097) */
+    1, /* 330CA (209098) */
+    1, /* 330CB (209099) */
+    1, /* 330CC (209100) */
+    1, /* 330CD (209101) */
+    1, /* 330CE (209102) */
+    1, /* 330CF (209103) */
+    1, /* 330D0 (209104) */
+    1, /* 330D1 (209105) */
+    1, /* 330D2 (209106) */
+    1, /* 330D3 (209107) */
+    1, /* 330D4 (209108) */
+    1, /* 330D5 (209109) */
+    1, /* 330D6 (209110) */
+    1, /* 330D7 (209111) */
+    1, /* 330D8 (209112) */
+    1, /* 330D9 (209113) */
+    1, /* 330DA (209114) */
+    1, /* 330DB (209115) */
+    1, /* 330DC (209116) */
+    1, /* 330DD (209117) */
+    1, /* 330DE (209118) */
+    1, /* 330DF (209119) */
+    1, /* 330E0 (209120) */
+    1, /* 330E1 (209121) */
+    1, /* 330E2 (209122) */
+    1, /* 330E3 (209123) */
+    1, /* 330E4 (209124) */
+    1, /* 330E5 (209125) */
+    1, /* 330E6 (209126) */
+    1, /* 330E7 (209127) */
+    1, /* 330E8 (209128) */
+    1, /* 330E9 (209129) */
+    1, /* 330EA (209130) */
+    1, /* 330EB (209131) */
+    1, /* 330EC (209132) */
+    1, /* 330ED (209133) */
+    1, /* 330EE (209134) */
+    1, /* 330EF (209135) */
+    1, /* 330F0 (209136) */
+    1, /* 330F1 (209137) */
+    1, /* 330F2 (209138) */
+    1, /* 330F3 (209139) */
+    1, /* 330F4 (209140) */
+    1, /* 330F5 (209141) */
+    1, /* 330F6 (209142) */
+    1, /* 330F7 (209143) */
+    1, /* 330F8 (209144) */
+    1, /* 330F9 (209145) */
+    1, /* 330FA (209146) */
+    1, /* 330FB (209147) */
+    1, /* 330FC (209148) */
+    1, /* 330FD (209149) */
+    1, /* 330FE (209150) */
+    1, /* 330FF (209151) */
+    1, /* 33100 (209152) */
+    1, /* 33101 (209153) */
+    1, /* 33102 (209154) */
+    1, /* 33103 (209155) */
+    1, /* 33104 (209156) */
+    1, /* 33105 (209157) */
+    1, /* 33106 (209158) */
+    1, /* 33107 (209159) */
+    1, /* 33108 (209160) */
+    1, /* 33109 (209161) */
+    1, /* 3310A (209162) */
+    1, /* 3310B (209163) */
+    1, /* 3310C (209164) */
+    1, /* 3310D (209165) */
+    1, /* 3310E (209166) */
+    1, /* 3310F (209167) */
+    1, /* 33110 (209168) */
+    1, /* 33111 (209169) */
+    1, /* 33112 (209170) */
+    1, /* 33113 (209171) */
+    1, /* 33114 (209172) */
+    1, /* 33115 (209173) */
+    1, /* 33116 (209174) */
+    1, /* 33117 (209175) */
+    1, /* 33118 (209176) */
+    1, /* 33119 (209177) */
+    1, /* 3311A (209178) */
+    1, /* 3311B (209179) */
+    1, /* 3311C (209180) */
+    1, /* 3311D (209181) */
+    1, /* 3311E (209182) */
+    1, /* 3311F (209183) */
+    1, /* 33120 (209184) */
+    1, /* 33121 (209185) */
+    1, /* 33122 (209186) */
+    1, /* 33123 (209187) */
+    1, /* 33124 (209188) */
+    1, /* 33125 (209189) */
+    1, /* 33126 (209190) */
+    1, /* 33127 (209191) */
+    1, /* 33128 (209192) */
+    1, /* 33129 (209193) */
+    1, /* 3312A (209194) */
+    1, /* 3312B (209195) */
+    1, /* 3312C (209196) */
+    1, /* 3312D (209197) */
+    1, /* 3312E (209198) */
+    1, /* 3312F (209199) */
+    1, /* 33130 (209200) */
+    1, /* 33131 (209201) */
+    1, /* 33132 (209202) */
+    1, /* 33133 (209203) */
+    1, /* 33134 (209204) */
+    1, /* 33135 (209205) */
+    1, /* 33136 (209206) */
+    1, /* 33137 (209207) */
+    1, /* 33138 (209208) */
+    1, /* 33139 (209209) */
+    1, /* 3313A (209210) */
+    1, /* 3313B (209211) */
+    1, /* 3313C (209212) */
+    1, /* 3313D (209213) */
+    1, /* 3313E (209214) */
+    1, /* 3313F (209215) */
+    1, /* 33140 (209216) */
+    1, /* 33141 (209217) */
+    1, /* 33142 (209218) */
+    1, /* 33143 (209219) */
+    1, /* 33144 (209220) */
+    1, /* 33145 (209221) */
+    1, /* 33146 (209222) */
+    1, /* 33147 (209223) */
+    1, /* 33148 (209224) */
+    1, /* 33149 (209225) */
+    1, /* 3314A (209226) */
+    1, /* 3314B (209227) */
+    1, /* 3314C (209228) */
+    1, /* 3314D (209229) */
+    1, /* 3314E (209230) */
+    1, /* 3314F (209231) */
+    1, /* 33150 (209232) */
+    1, /* 33151 (209233) */
+    1, /* 33152 (209234) */
+    1, /* 33153 (209235) */
+    1, /* 33154 (209236) */
+    1, /* 33155 (209237) */
+    1, /* 33156 (209238) */
+    1, /* 33157 (209239) */
+    1, /* 33158 (209240) */
+    1, /* 33159 (209241) */
+    1, /* 3315A (209242) */
+    1, /* 3315B (209243) */
+    1, /* 3315C (209244) */
+    1, /* 3315D (209245) */
+    1, /* 3315E (209246) */
+    1, /* 3315F (209247) */
+    1, /* 33160 (209248) */
+    1, /* 33161 (209249) */
+    1, /* 33162 (209250) */
+    1, /* 33163 (209251) */
+    1, /* 33164 (209252) */
+    1, /* 33165 (209253) */
+    1, /* 33166 (209254) */
+    1, /* 33167 (209255) */
+    1, /* 33168 (209256) */
+    1, /* 33169 (209257) */
+    1, /* 3316A (209258) */
+    1, /* 3316B (209259) */
+    1, /* 3316C (209260) */
+    1, /* 3316D (209261) */
+    1, /* 3316E (209262) */
+    1, /* 3316F (209263) */
+    1, /* 33170 (209264) */
+    1, /* 33171 (209265) */
+    1, /* 33172 (209266) */
+    1, /* 33173 (209267) */
+    1, /* 33174 (209268) */
+    1, /* 33175 (209269) */
+    1, /* 33176 (209270) */
+    1, /* 33177 (209271) */
+    1, /* 33178 (209272) */
+    1, /* 33179 (209273) */
+    1, /* 3317A (209274) */
+    1, /* 3317B (209275) */
+    1, /* 3317C (209276) */
+    1, /* 3317D (209277) */
+    1, /* 3317E (209278) */
+    1, /* 3317F (209279) */
+    1, /* 33180 (209280) */
+    1, /* 33181 (209281) */
+    1, /* 33182 (209282) */
+    1, /* 33183 (209283) */
+    1, /* 33184 (209284) */
+    1, /* 33185 (209285) */
+    1, /* 33186 (209286) */
+    1, /* 33187 (209287) */
+    1, /* 33188 (209288) */
+    1, /* 33189 (209289) */
+    1, /* 3318A (209290) */
+    1, /* 3318B (209291) */
+    1, /* 3318C (209292) */
+    1, /* 3318D (209293) */
+    1, /* 3318E (209294) */
+    1, /* 3318F (209295) */
+    1, /* 33190 (209296) */
+    1, /* 33191 (209297) */
+    1, /* 33192 (209298) */
+    1, /* 33193 (209299) */
+    1, /* 33194 (209300) */
+    1, /* 33195 (209301) */
+    1, /* 33196 (209302) */
+    1, /* 33197 (209303) */
+    1, /* 33198 (209304) */
+    1, /* 33199 (209305) */
+    1, /* 3319A (209306) */
+    1, /* 3319B (209307) */
+    1, /* 3319C (209308) */
+    1, /* 3319D (209309) */
+    1, /* 3319E (209310) */
+    1, /* 3319F (209311) */
+    1, /* 331A0 (209312) */
+    1, /* 331A1 (209313) */
+    1, /* 331A2 (209314) */
+    1, /* 331A3 (209315) */
+    1, /* 331A4 (209316) */
+    1, /* 331A5 (209317) */
+    1, /* 331A6 (209318) */
+    1, /* 331A7 (209319) */
+    1, /* 331A8 (209320) */
+    1, /* 331A9 (209321) */
+    1, /* 331AA (209322) */
+    1, /* 331AB (209323) */
+    1, /* 331AC (209324) */
+    1, /* 331AD (209325) */
+    1, /* 331AE (209326) */
+    1, /* 331AF (209327) */
+    1, /* 331B0 (209328) */
+    1, /* 331B1 (209329) */
+    1, /* 331B2 (209330) */
+    1, /* 331B3 (209331) */
+    1, /* 331B4 (209332) */
+    1, /* 331B5 (209333) */
+    1, /* 331B6 (209334) */
+    1, /* 331B7 (209335) */
+    1, /* 331B8 (209336) */
+    1, /* 331B9 (209337) */
+    1, /* 331BA (209338) */
+    1, /* 331BB (209339) */
+    1, /* 331BC (209340) */
+    1, /* 331BD (209341) */
+    1, /* 331BE (209342) */
+    1, /* 331BF (209343) */
+    1, /* 331C0 (209344) */
+    1, /* 331C1 (209345) */
+    1, /* 331C2 (209346) */
+    1, /* 331C3 (209347) */
+    1, /* 331C4 (209348) */
+    1, /* 331C5 (209349) */
+    1, /* 331C6 (209350) */
+    1, /* 331C7 (209351) */
+    1, /* 331C8 (209352) */
+    1, /* 331C9 (209353) */
+    1, /* 331CA (209354) */
+    1, /* 331CB (209355) */
+    1, /* 331CC (209356) */
+    1, /* 331CD (209357) */
+    1, /* 331CE (209358) */
+    1, /* 331CF (209359) */
+    1, /* 331D0 (209360) */
+    1, /* 331D1 (209361) */
+    1, /* 331D2 (209362) */
+    1, /* 331D3 (209363) */
+    1, /* 331D4 (209364) */
+    1, /* 331D5 (209365) */
+    1, /* 331D6 (209366) */
+    1, /* 331D7 (209367) */
+    1, /* 331D8 (209368) */
+    1, /* 331D9 (209369) */
+    1, /* 331DA (209370) */
+    1, /* 331DB (209371) */
+    1, /* 331DC (209372) */
+    1, /* 331DD (209373) */
+    1, /* 331DE (209374) */
+    1, /* 331DF (209375) */
+    1, /* 331E0 (209376) */
+    1, /* 331E1 (209377) */
+    1, /* 331E2 (209378) */
+    1, /* 331E3 (209379) */
+    1, /* 331E4 (209380) */
+    1, /* 331E5 (209381) */
+    1, /* 331E6 (209382) */
+    1, /* 331E7 (209383) */
+    1, /* 331E8 (209384) */
+    1, /* 331E9 (209385) */
+    1, /* 331EA (209386) */
+    1, /* 331EB (209387) */
+    1, /* 331EC (209388) */
+    1, /* 331ED (209389) */
+    1, /* 331EE (209390) */
+    1, /* 331EF (209391) */
+    1, /* 331F0 (209392) */
+    1, /* 331F1 (209393) */
+    1, /* 331F2 (209394) */
+    1, /* 331F3 (209395) */
+    1, /* 331F4 (209396) */
+    1, /* 331F5 (209397) */
+    1, /* 331F6 (209398) */
+    1, /* 331F7 (209399) */
+    1, /* 331F8 (209400) */
+    1, /* 331F9 (209401) */
+    1, /* 331FA (209402) */
+    1, /* 331FB (209403) */
+    1, /* 331FC (209404) */
+    1, /* 331FD (209405) */
+    1, /* 331FE (209406) */
+    1, /* 331FF (209407) */
+    1, /* 33200 (209408) */
+    1, /* 33201 (209409) */
+    1, /* 33202 (209410) */
+    1, /* 33203 (209411) */
+    1, /* 33204 (209412) */
+    1, /* 33205 (209413) */
+    1, /* 33206 (209414) */
+    1, /* 33207 (209415) */
+    1, /* 33208 (209416) */
+    1, /* 33209 (209417) */
+    1, /* 3320A (209418) */
+    1, /* 3320B (209419) */
+    1, /* 3320C (209420) */
+    1, /* 3320D (209421) */
+    1, /* 3320E (209422) */
+    1, /* 3320F (209423) */
+    1, /* 33210 (209424) */
+    1, /* 33211 (209425) */
+    1, /* 33212 (209426) */
+    1, /* 33213 (209427) */
+    1, /* 33214 (209428) */
+    1, /* 33215 (209429) */
+    1, /* 33216 (209430) */
+    1, /* 33217 (209431) */
+    1, /* 33218 (209432) */
+    1, /* 33219 (209433) */
+    1, /* 3321A (209434) */
+    1, /* 3321B (209435) */
+    1, /* 3321C (209436) */
+    1, /* 3321D (209437) */
+    1, /* 3321E (209438) */
+    1, /* 3321F (209439) */
+    1, /* 33220 (209440) */
+    1, /* 33221 (209441) */
+    1, /* 33222 (209442) */
+    1, /* 33223 (209443) */
+    1, /* 33224 (209444) */
+    1, /* 33225 (209445) */
+    1, /* 33226 (209446) */
+    1, /* 33227 (209447) */
+    1, /* 33228 (209448) */
+    1, /* 33229 (209449) */
+    1, /* 3322A (209450) */
+    1, /* 3322B (209451) */
+    1, /* 3322C (209452) */
+    1, /* 3322D (209453) */
+    1, /* 3322E (209454) */
+    1, /* 3322F (209455) */
+    1, /* 33230 (209456) */
+    1, /* 33231 (209457) */
+    1, /* 33232 (209458) */
+    1, /* 33233 (209459) */
+    1, /* 33234 (209460) */
+    1, /* 33235 (209461) */
+    1, /* 33236 (209462) */
+    1, /* 33237 (209463) */
+    1, /* 33238 (209464) */
+    1, /* 33239 (209465) */
+    1, /* 3323A (209466) */
+    1, /* 3323B (209467) */
+    1, /* 3323C (209468) */
+    1, /* 3323D (209469) */
+    1, /* 3323E (209470) */
+    1, /* 3323F (209471) */
+    1, /* 33240 (209472) */
+    1, /* 33241 (209473) */
+    1, /* 33242 (209474) */
+    1, /* 33243 (209475) */
+    1, /* 33244 (209476) */
+    1, /* 33245 (209477) */
+    1, /* 33246 (209478) */
+    1, /* 33247 (209479) */
+    1, /* 33248 (209480) */
+    1, /* 33249 (209481) */
+    1, /* 3324A (209482) */
+    1, /* 3324B (209483) */
+    1, /* 3324C (209484) */
+    1, /* 3324D (209485) */
+    1, /* 3324E (209486) */
+    1, /* 3324F (209487) */
+    1, /* 33250 (209488) */
+    1, /* 33251 (209489) */
+    1, /* 33252 (209490) */
+    1, /* 33253 (209491) */
+    1, /* 33254 (209492) */
+    1, /* 33255 (209493) */
+    1, /* 33256 (209494) */
+    1, /* 33257 (209495) */
+    1, /* 33258 (209496) */
+    1, /* 33259 (209497) */
+    1, /* 3325A (209498) */
+    1, /* 3325B (209499) */
+    1, /* 3325C (209500) */
+    1, /* 3325D (209501) */
+    1, /* 3325E (209502) */
+    1, /* 3325F (209503) */
+    1, /* 33260 (209504) */
+    1, /* 33261 (209505) */
+    1, /* 33262 (209506) */
+    1, /* 33263 (209507) */
+    1, /* 33264 (209508) */
+    1, /* 33265 (209509) */
+    1, /* 33266 (209510) */
+    1, /* 33267 (209511) */
+    1, /* 33268 (209512) */
+    1, /* 33269 (209513) */
+    1, /* 3326A (209514) */
+    1, /* 3326B (209515) */
+    1, /* 3326C (209516) */
+    1, /* 3326D (209517) */
+    1, /* 3326E (209518) */
+    1, /* 3326F (209519) */
+    1, /* 33270 (209520) */
+    1, /* 33271 (209521) */
+    1, /* 33272 (209522) */
+    1, /* 33273 (209523) */
+    1, /* 33274 (209524) */
+    1, /* 33275 (209525) */
+    1, /* 33276 (209526) */
+    1, /* 33277 (209527) */
+    1, /* 33278 (209528) */
+    1, /* 33279 (209529) */
+    1, /* 3327A (209530) */
+    1, /* 3327B (209531) */
+    1, /* 3327C (209532) */
+    1, /* 3327D (209533) */
+    1, /* 3327E (209534) */
+    1, /* 3327F (209535) */
+    1, /* 33280 (209536) */
+    1, /* 33281 (209537) */
+    1, /* 33282 (209538) */
+    1, /* 33283 (209539) */
+    1, /* 33284 (209540) */
+    1, /* 33285 (209541) */
+    1, /* 33286 (209542) */
+    1, /* 33287 (209543) */
+    1, /* 33288 (209544) */
+    1, /* 33289 (209545) */
+    1, /* 3328A (209546) */
+    1, /* 3328B (209547) */
+    1, /* 3328C (209548) */
+    1, /* 3328D (209549) */
+    1, /* 3328E (209550) */
+    1, /* 3328F (209551) */
+    1, /* 33290 (209552) */
+    1, /* 33291 (209553) */
+    1, /* 33292 (209554) */
+    1, /* 33293 (209555) */
+    1, /* 33294 (209556) */
+    1, /* 33295 (209557) */
+    1, /* 33296 (209558) */
+    1, /* 33297 (209559) */
+    1, /* 33298 (209560) */
+    1, /* 33299 (209561) */
+    1, /* 3329A (209562) */
+    1, /* 3329B (209563) */
+    1, /* 3329C (209564) */
+    1, /* 3329D (209565) */
+    1, /* 3329E (209566) */
+    1, /* 3329F (209567) */
+    1, /* 332A0 (209568) */
+    1, /* 332A1 (209569) */
+    1, /* 332A2 (209570) */
+    1, /* 332A3 (209571) */
+    1, /* 332A4 (209572) */
+    1, /* 332A5 (209573) */
+    1, /* 332A6 (209574) */
+    1, /* 332A7 (209575) */
+    1, /* 332A8 (209576) */
+    1, /* 332A9 (209577) */
+    1, /* 332AA (209578) */
+    1, /* 332AB (209579) */
+    1, /* 332AC (209580) */
+    1, /* 332AD (209581) */
+    1, /* 332AE (209582) */
+    1, /* 332AF (209583) */
+    1, /* 332B0 (209584) */
+    1, /* 332B1 (209585) */
+    1, /* 332B2 (209586) */
+    1, /* 332B3 (209587) */
+    1, /* 332B4 (209588) */
+    1, /* 332B5 (209589) */
+    1, /* 332B6 (209590) */
+    1, /* 332B7 (209591) */
+    1, /* 332B8 (209592) */
+    1, /* 332B9 (209593) */
+    1, /* 332BA (209594) */
+    1, /* 332BB (209595) */
+    1, /* 332BC (209596) */
+    1, /* 332BD (209597) */
+    1, /* 332BE (209598) */
+    1, /* 332BF (209599) */
+    1, /* 332C0 (209600) */
+    1, /* 332C1 (209601) */
+    1, /* 332C2 (209602) */
+    1, /* 332C3 (209603) */
+    1, /* 332C4 (209604) */
+    1, /* 332C5 (209605) */
+    1, /* 332C6 (209606) */
+    1, /* 332C7 (209607) */
+    1, /* 332C8 (209608) */
+    1, /* 332C9 (209609) */
+    1, /* 332CA (209610) */
+    1, /* 332CB (209611) */
+    1, /* 332CC (209612) */
+    1, /* 332CD (209613) */
+    1, /* 332CE (209614) */
+    1, /* 332CF (209615) */
+    1, /* 332D0 (209616) */
+    1, /* 332D1 (209617) */
+    1, /* 332D2 (209618) */
+    1, /* 332D3 (209619) */
+    1, /* 332D4 (209620) */
+    1, /* 332D5 (209621) */
+    1, /* 332D6 (209622) */
+    1, /* 332D7 (209623) */
+    1, /* 332D8 (209624) */
+    1, /* 332D9 (209625) */
+    1, /* 332DA (209626) */
+    1, /* 332DB (209627) */
+    1, /* 332DC (209628) */
+    1, /* 332DD (209629) */
+    1, /* 332DE (209630) */
+    1, /* 332DF (209631) */
+    1, /* 332E0 (209632) */
+    1, /* 332E1 (209633) */
+    1, /* 332E2 (209634) */
+    1, /* 332E3 (209635) */
+    1, /* 332E4 (209636) */
+    1, /* 332E5 (209637) */
+    1, /* 332E6 (209638) */
+    1, /* 332E7 (209639) */
+    1, /* 332E8 (209640) */
+    1, /* 332E9 (209641) */
+    1, /* 332EA (209642) */
+    1, /* 332EB (209643) */
+    1, /* 332EC (209644) */
+    1, /* 332ED (209645) */
+    1, /* 332EE (209646) */
+    1, /* 332EF (209647) */
+    1, /* 332F0 (209648) */
+    1, /* 332F1 (209649) */
+    1, /* 332F2 (209650) */
+    1, /* 332F3 (209651) */
+    1, /* 332F4 (209652) */
+    1, /* 332F5 (209653) */
+    1, /* 332F6 (209654) */
+    1, /* 332F7 (209655) */
+    1, /* 332F8 (209656) */
+    1, /* 332F9 (209657) */
+    1, /* 332FA (209658) */
+    1, /* 332FB (209659) */
+    1, /* 332FC (209660) */
+    1, /* 332FD (209661) */
+    1, /* 332FE (209662) */
+    1, /* 332FF (209663) */
+    1, /* 33300 (209664) */
+    1, /* 33301 (209665) */
+    1, /* 33302 (209666) */
+    1, /* 33303 (209667) */
+    1, /* 33304 (209668) */
+    1, /* 33305 (209669) */
+    1, /* 33306 (209670) */
+    1, /* 33307 (209671) */
+    1, /* 33308 (209672) */
+    1, /* 33309 (209673) */
+    1, /* 3330A (209674) */
+    1, /* 3330B (209675) */
+    1, /* 3330C (209676) */
+    1, /* 3330D (209677) */
+    1, /* 3330E (209678) */
+    1, /* 3330F (209679) */
+    1, /* 33310 (209680) */
+    1, /* 33311 (209681) */
+    1, /* 33312 (209682) */
+    1, /* 33313 (209683) */
+    1, /* 33314 (209684) */
+    1, /* 33315 (209685) */
+    1, /* 33316 (209686) */
+    1, /* 33317 (209687) */
+    1, /* 33318 (209688) */
+    1, /* 33319 (209689) */
+    1, /* 3331A (209690) */
+    1, /* 3331B (209691) */
+    1, /* 3331C (209692) */
+    1, /* 3331D (209693) */
+    1, /* 3331E (209694) */
+    1, /* 3331F (209695) */
+    1, /* 33320 (209696) */
+    1, /* 33321 (209697) */
+    1, /* 33322 (209698) */
+    1, /* 33323 (209699) */
+    1, /* 33324 (209700) */
+    1, /* 33325 (209701) */
+    1, /* 33326 (209702) */
+    1, /* 33327 (209703) */
+    1, /* 33328 (209704) */
+    1, /* 33329 (209705) */
+    1, /* 3332A (209706) */
+    1, /* 3332B (209707) */
+    1, /* 3332C (209708) */
+    1, /* 3332D (209709) */
+    1, /* 3332E (209710) */
+    1, /* 3332F (209711) */
+    1, /* 33330 (209712) */
+    1, /* 33331 (209713) */
+    1, /* 33332 (209714) */
+    1, /* 33333 (209715) */
+    1, /* 33334 (209716) */
+    1, /* 33335 (209717) */
+    1, /* 33336 (209718) */
+    1, /* 33337 (209719) */
+    1, /* 33338 (209720) */
+    1, /* 33339 (209721) */
+    1, /* 3333A (209722) */
+    1, /* 3333B (209723) */
+    1, /* 3333C (209724) */
+    1, /* 3333D (209725) */
+    1, /* 3333E (209726) */
+    1, /* 3333F (209727) */
+    1, /* 33340 (209728) */
+    1, /* 33341 (209729) */
+    1, /* 33342 (209730) */
+    1, /* 33343 (209731) */
+    1, /* 33344 (209732) */
+    1, /* 33345 (209733) */
+    1, /* 33346 (209734) */
+    1, /* 33347 (209735) */
+    1, /* 33348 (209736) */
+    1, /* 33349 (209737) */
+    1, /* 3334A (209738) */
+    1, /* 3334B (209739) */
+    1, /* 3334C (209740) */
+    1, /* 3334D (209741) */
+    1, /* 3334E (209742) */
+    1, /* 3334F (209743) */
+    1, /* 33350 (209744) */
+    1, /* 33351 (209745) */
+    1, /* 33352 (209746) */
+    1, /* 33353 (209747) */
+    1, /* 33354 (209748) */
+    1, /* 33355 (209749) */
+    1, /* 33356 (209750) */
+    1, /* 33357 (209751) */
+    1, /* 33358 (209752) */
+    1, /* 33359 (209753) */
+    1, /* 3335A (209754) */
+    1, /* 3335B (209755) */
+    1, /* 3335C (209756) */
+    1, /* 3335D (209757) */
+    1, /* 3335E (209758) */
+    1, /* 3335F (209759) */
+    1, /* 33360 (209760) */
+    1, /* 33361 (209761) */
+    1, /* 33362 (209762) */
+    1, /* 33363 (209763) */
+    1, /* 33364 (209764) */
+    1, /* 33365 (209765) */
+    1, /* 33366 (209766) */
+    1, /* 33367 (209767) */
+    1, /* 33368 (209768) */
+    1, /* 33369 (209769) */
+    1, /* 3336A (209770) */
+    1, /* 3336B (209771) */
+    1, /* 3336C (209772) */
+    1, /* 3336D (209773) */
+    1, /* 3336E (209774) */
+    1, /* 3336F (209775) */
+    1, /* 33370 (209776) */
+    1, /* 33371 (209777) */
+    1, /* 33372 (209778) */
+    1, /* 33373 (209779) */
+    1, /* 33374 (209780) */
+    1, /* 33375 (209781) */
+    1, /* 33376 (209782) */
+    1, /* 33377 (209783) */
+    1, /* 33378 (209784) */
+    1, /* 33379 (209785) */
+    1, /* 3337A (209786) */
+    1, /* 3337B (209787) */
+    1, /* 3337C (209788) */
+    1, /* 3337D (209789) */
+    1, /* 3337E (209790) */
+    1, /* 3337F (209791) */
+    1, /* 33380 (209792) */
+    1, /* 33381 (209793) */
+    1, /* 33382 (209794) */
+    1, /* 33383 (209795) */
+    1, /* 33384 (209796) */
+    1, /* 33385 (209797) */
+    1, /* 33386 (209798) */
+    1, /* 33387 (209799) */
+    1, /* 33388 (209800) */
+    1, /* 33389 (209801) */
+    1, /* 3338A (209802) */
+    1, /* 3338B (209803) */
+    1, /* 3338C (209804) */
+    1, /* 3338D (209805) */
+    1, /* 3338E (209806) */
+    1, /* 3338F (209807) */
+    1, /* 33390 (209808) */
+    1, /* 33391 (209809) */
+    1, /* 33392 (209810) */
+    1, /* 33393 (209811) */
+    1, /* 33394 (209812) */
+    1, /* 33395 (209813) */
+    1, /* 33396 (209814) */
+    1, /* 33397 (209815) */
+    1, /* 33398 (209816) */
+    1, /* 33399 (209817) */
+    1, /* 3339A (209818) */
+    1, /* 3339B (209819) */
+    1, /* 3339C (209820) */
+    1, /* 3339D (209821) */
+    1, /* 3339E (209822) */
+    1, /* 3339F (209823) */
+    1, /* 333A0 (209824) */
+    1, /* 333A1 (209825) */
+    1, /* 333A2 (209826) */
+    1, /* 333A3 (209827) */
+    1, /* 333A4 (209828) */
+    1, /* 333A5 (209829) */
+    1, /* 333A6 (209830) */
+    1, /* 333A7 (209831) */
+    1, /* 333A8 (209832) */
+    1, /* 333A9 (209833) */
+    1, /* 333AA (209834) */
+    1, /* 333AB (209835) */
+    1, /* 333AC (209836) */
+    1, /* 333AD (209837) */
+    1, /* 333AE (209838) */
+    1, /* 333AF (209839) */
+    1, /* 333B0 (209840) */
+    1, /* 333B1 (209841) */
+    1, /* 333B2 (209842) */
+    1, /* 333B3 (209843) */
+    1, /* 333B4 (209844) */
+    1, /* 333B5 (209845) */
+    1, /* 333B6 (209846) */
+    1, /* 333B7 (209847) */
+    1, /* 333B8 (209848) */
+    1, /* 333B9 (209849) */
+    1, /* 333BA (209850) */
+    1, /* 333BB (209851) */
+    1, /* 333BC (209852) */
+    1, /* 333BD (209853) */
+    1, /* 333BE (209854) */
+    1, /* 333BF (209855) */
+    1, /* 333C0 (209856) */
+    1, /* 333C1 (209857) */
+    1, /* 333C2 (209858) */
+    1, /* 333C3 (209859) */
+    1, /* 333C4 (209860) */
+    1, /* 333C5 (209861) */
+    1, /* 333C6 (209862) */
+    1, /* 333C7 (209863) */
+    1, /* 333C8 (209864) */
+    1, /* 333C9 (209865) */
+    1, /* 333CA (209866) */
+    1, /* 333CB (209867) */
+    1, /* 333CC (209868) */
+    1, /* 333CD (209869) */
+    1, /* 333CE (209870) */
+    1, /* 333CF (209871) */
+    1, /* 333D0 (209872) */
+    1, /* 333D1 (209873) */
+    1, /* 333D2 (209874) */
+    1, /* 333D3 (209875) */
+    1, /* 333D4 (209876) */
+    1, /* 333D5 (209877) */
+    1, /* 333D6 (209878) */
+    1, /* 333D7 (209879) */
+    1, /* 333D8 (209880) */
+    1, /* 333D9 (209881) */
+    1, /* 333DA (209882) */
+    1, /* 333DB (209883) */
+    1, /* 333DC (209884) */
+    1, /* 333DD (209885) */
+    1, /* 333DE (209886) */
+    1, /* 333DF (209887) */
+    1, /* 333E0 (209888) */
+    1, /* 333E1 (209889) */
+    1, /* 333E2 (209890) */
+    1, /* 333E3 (209891) */
+    1, /* 333E4 (209892) */
+    1, /* 333E5 (209893) */
+    1, /* 333E6 (209894) */
+    1, /* 333E7 (209895) */
+    1, /* 333E8 (209896) */
+    1, /* 333E9 (209897) */
+    1, /* 333EA (209898) */
+    1, /* 333EB (209899) */
+    1, /* 333EC (209900) */
+    1, /* 333ED (209901) */
+    1, /* 333EE (209902) */
+    1, /* 333EF (209903) */
+    1, /* 333F0 (209904) */
+    1, /* 333F1 (209905) */
+    1, /* 333F2 (209906) */
+    1, /* 333F3 (209907) */
+    1, /* 333F4 (209908) */
+    1, /* 333F5 (209909) */
+    1, /* 333F6 (209910) */
+    1, /* 333F7 (209911) */
+    1, /* 333F8 (209912) */
+    1, /* 333F9 (209913) */
+    1, /* 333FA (209914) */
+    1, /* 333FB (209915) */
+    1, /* 333FC (209916) */
+    1, /* 333FD (209917) */
+    1, /* 333FE (209918) */
+    1, /* 333FF (209919) */
+    1, /* 33400 (209920) */
+    1, /* 33401 (209921) */
+    1, /* 33402 (209922) */
+    1, /* 33403 (209923) */
+    1, /* 33404 (209924) */
+    1, /* 33405 (209925) */
+    1, /* 33406 (209926) */
+    1, /* 33407 (209927) */
+    1, /* 33408 (209928) */
+    1, /* 33409 (209929) */
+    1, /* 3340A (209930) */
+    1, /* 3340B (209931) */
+    1, /* 3340C (209932) */
+    1, /* 3340D (209933) */
+    1, /* 3340E (209934) */
+    1, /* 3340F (209935) */
+    1, /* 33410 (209936) */
+    1, /* 33411 (209937) */
+    1, /* 33412 (209938) */
+    1, /* 33413 (209939) */
+    1, /* 33414 (209940) */
+    1, /* 33415 (209941) */
+    1, /* 33416 (209942) */
+    1, /* 33417 (209943) */
+    1, /* 33418 (209944) */
+    1, /* 33419 (209945) */
+    1, /* 3341A (209946) */
+    1, /* 3341B (209947) */
+    1, /* 3341C (209948) */
+    1, /* 3341D (209949) */
+    1, /* 3341E (209950) */
+    1, /* 3341F (209951) */
+    1, /* 33420 (209952) */
+    1, /* 33421 (209953) */
+    1, /* 33422 (209954) */
+    1, /* 33423 (209955) */
+    1, /* 33424 (209956) */
+    1, /* 33425 (209957) */
+    1, /* 33426 (209958) */
+    1, /* 33427 (209959) */
+    1, /* 33428 (209960) */
+    1, /* 33429 (209961) */
+    1, /* 3342A (209962) */
+    1, /* 3342B (209963) */
+    1, /* 3342C (209964) */
+    1, /* 3342D (209965) */
+    1, /* 3342E (209966) */
+    1, /* 3342F (209967) */
+    1, /* 33430 (209968) */
+    1, /* 33431 (209969) */
+    1, /* 33432 (209970) */
+    1, /* 33433 (209971) */
+    1, /* 33434 (209972) */
+    1, /* 33435 (209973) */
+    1, /* 33436 (209974) */
+    1, /* 33437 (209975) */
+    1, /* 33438 (209976) */
+    1, /* 33439 (209977) */
+    1, /* 3343A (209978) */
+    1, /* 3343B (209979) */
+    1, /* 3343C (209980) */
+    1, /* 3343D (209981) */
+    1, /* 3343E (209982) */
+    1, /* 3343F (209983) */
+    1, /* 33440 (209984) */
+    1, /* 33441 (209985) */
+    1, /* 33442 (209986) */
+    1, /* 33443 (209987) */
+    1, /* 33444 (209988) */
+    1, /* 33445 (209989) */
+    1, /* 33446 (209990) */
+    1, /* 33447 (209991) */
+    1, /* 33448 (209992) */
+    1, /* 33449 (209993) */
+    1, /* 3344A (209994) */
+    1, /* 3344B (209995) */
+    1, /* 3344C (209996) */
+    1, /* 3344D (209997) */
+    1, /* 3344E (209998) */
+    1, /* 3344F (209999) */
+    1, /* 33450 (210000) */
+    1, /* 33451 (210001) */
+    1, /* 33452 (210002) */
+    1, /* 33453 (210003) */
+    1, /* 33454 (210004) */
+    1, /* 33455 (210005) */
+    1, /* 33456 (210006) */
+    1, /* 33457 (210007) */
+    1, /* 33458 (210008) */
+    1, /* 33459 (210009) */
+    1, /* 3345A (210010) */
+    1, /* 3345B (210011) */
+    1, /* 3345C (210012) */
+    1, /* 3345D (210013) */
+    1, /* 3345E (210014) */
+    1, /* 3345F (210015) */
+    1, /* 33460 (210016) */
+    1, /* 33461 (210017) */
+    1, /* 33462 (210018) */
+    1, /* 33463 (210019) */
+    1, /* 33464 (210020) */
+    1, /* 33465 (210021) */
+    1, /* 33466 (210022) */
+    1, /* 33467 (210023) */
+    1, /* 33468 (210024) */
+    1, /* 33469 (210025) */
+    1, /* 3346A (210026) */
+    1, /* 3346B (210027) */
+    1, /* 3346C (210028) */
+    1, /* 3346D (210029) */
+    1, /* 3346E (210030) */
+    1, /* 3346F (210031) */
+    1, /* 33470 (210032) */
+    1, /* 33471 (210033) */
+    1, /* 33472 (210034) */
+    1, /* 33473 (210035) */
+    1, /* 33474 (210036) */
+    1, /* 33475 (210037) */
+    1, /* 33476 (210038) */
+    1, /* 33477 (210039) */
+    1, /* 33478 (210040) */
+    1, /* 33479 (210041) */
 };
 
 /* From: E0001; To: E01EF */
@@ -184130,6093 +188662,6122 @@ static const uint16_t lxb_unicode_table_map_1114109_1114110[1] =
 };
 
 
-static const lxb_unicode_entry_t lxb_unicode_entries[6085] =
+static const lxb_unicode_entry_t lxb_unicode_entries[6114] =
 {
     {0, 0},
-    {0, 2},
-    {4898, 2},
-    {4917, 2},
-    {5037, 2},
-    {4936, 181},
-    {5109, 171},
-    {4880, 7},
-    {5117, 101},
-    {4981, 551},
-    {5057, 184},
-    {5073, 286},
-    {4885, 29},
-    {4828, 482},
-    {5006, 68},
-    {5087, 320},
-    {4947, 268},
-    {5027, 134},
-    {4961, 131},
-    {4833, 485},
-    {4956, 307},
-    {0, 191},
-    {4980, 37},
-    {5042, 544},
-    {4877, 198},
-    {4950, 57},
-    {5095, 107},
-    {4859, 44},
-    {5053, 162},
-    {5039, 120},
-    {5065, 5},
-    {5016, 2},
-    {4970, 2},
-    {4840, 2},
-    {4957, 2},
-    {5002, 2},
-    {5041, 2},
-    {4995, 2},
-    {5059, 2},
-    {4983, 2},
-    {4899, 2},
-    {4962, 2},
-    {5101, 2},
-    {4901, 2},
-    {4978, 2},
-    {4997, 2},
-    {5046, 2},
-    {5072, 2},
-    {4987, 2},
-    {4914, 2},
-    {4974, 2},
-    {5105, 2},
-    {4913, 2},
-    {4986, 2},
-    {4949, 2},
-    {4900, 2},
     {0, 1},
-    {1410, 722},
-    {3338, 445},
-    {1487, 181},
-    {0, 13},
-    {1069, 444},
-    {3139, 731},
-    {2328, 432},
-    {823, 176},
-    {2025, 291},
-    {1817, 3783},
-    {1733, 222},
-    {142, 485},
-    {3907, 3840},
-    {487, 2642},
-    {4501, 2018},
-    {2403, 2058},
-    {3068, 1844},
-    {2696, 2271},
-    {2761, 792},
-    {3951, 1047},
-    {4504, 2692},
-    {4865, 487},
-    {3694, 3656},
-    {3689, 3913},
-    {2780, 3113},
-    {1519, 3848},
-    {3327, 3661},
-    {3556, 325},
-    {3627, 2809},
-    {4265, 3050},
-    {3692, 2132},
-    {0, 16},
-    {4525, 1832},
-    {1592, 2219},
-    {696, 3128},
-    {4180, 2301},
-    {1257, 2525},
-    {888, 2038},
-    {4984, 2826},
-    {1589, 172},
-    {3513, 2206},
-    {1908, 560},
-    {1853, 463},
-    {377, 1573},
-    {0, 404},
-    {0, 22},
-    {811, 2},
-    {729, 2},
-    {2410, 2},
-    {1844, 2},
-    {3506, 2},
-    {2132, 2},
-    {4965, 2},
-    {1932, 2},
-    {3125, 2},
-    {1299, 2},
-    {1680, 2},
-    {1622, 2},
-    {352, 2},
-    {957, 2},
-    {3737, 2},
-    {675, 2},
-    {3547, 2},
-    {2309, 2},
-    {3008, 2},
-    {2784, 2},
-    {2710, 2},
-    {4062, 2},
-    {4954, 2},
-    {3777, 2},
-    {3652, 2},
-    {2778, 2},
-    {1497, 2},
-    {3357, 2},
-    {3637, 2},
-    {4280, 2373},
-    {3650, 2},
-    {873, 951},
-    {4541, 2},
-    {3562, 1011},
-    {4598, 2},
-    {1111, 1068},
-    {4006, 2},
-    {3653, 3135},
-    {3727, 2},
-    {2940, 2119},
-    {3557, 2},
-    {1609, 3265},
-    {2649, 2},
-    {3496, 3664},
-    {4648, 2},
-    {0, 3703},
-    {3852, 540},
-    {3791, 2},
-    {2878, 2902},
-    {3494, 2},
-    {1834, 464},
-    {2568, 2},
-    {4123, 3440},
-    {2871, 2},
-    {1683, 3477},
-    {3468, 2},
-    {3121, 857},
-    {3169, 2},
-    {4643, 2646},
-    {4121, 2},
-    {1049, 771},
-    {4377, 2},
-    {329, 2886},
-    {1326, 2},
-    {2509, 2843},
-    {1915, 2},
-    {0, 1693},
-    {971, 3646},
-    {334, 2},
-    {4296, 1507},
-    {1252, 2},
-    {651, 2736},
-    {1631, 2},
-    {2827, 2790},
-    {2216, 2},
-    {1991, 1481},
-    {1255, 748},
-    {653, 748},
-    {4568, 1710},
-    {974, 2},
-    {2739, 3492},
-    {3722, 2},
-    {4267, 3223},
-    {4603, 2},
-    {4519, 2377},
-    {3331, 2},
-    {2738, 1685},
-    {1948, 2},
-    {3623, 1340},
-    {2532, 1340},
-    {0, 233},
-    {4425, 1705},
-    {4642, 2},
-    {4726, 652},
-    {3123, 2},
-    {2530, 3309},
-    {2104, 2},
-    {3396, 3369},
-    {0, 1831},
-    {2411, 1754},
-    {3059, 2},
-    {2705, 2563},
-    {2767, 2},
-    {3956, 690},
-    {4514, 2},
-    {0, 571},
-    {852, 3172},
-    {1994, 2},
-    {3149, 3139},
-    {1408, 2},
-    {1627, 1066},
-    {1704, 2},
-    {278, 2223},
-    {856, 2},
-    {3679, 1132},
-    {610, 2},
-    {627, 2501},
-    {1619, 2},
-    {2797, 2566},
-    {2246, 2},
-    {2004, 1753},
-    {1925, 2},
-    {1263, 3407},
-    {626, 2},
-    {0, 1952},
-    {2007, 1967},
-    {877, 2},
-    {4397, 1916},
-    {215, 2},
-    {629, 2641},
-    {547, 2},
-    {1349, 827},
-    {2002, 2},
-    {2759, 2479},
-    {1648, 2},
-    {2085, 2983},
-    {808, 2},
-    {4335, 2946},
-    {136, 2},
-    {384, 1296},
-    {471, 2},
-    {1418, 3760},
-    {2081, 946},
-    {2522, 2},
-    {1721, 882},
-    {179, 2},
-    {1421, 3166},
-    {2707, 2},
-    {2035, 544},
-    {0, 3052},
-    {0, 3127},
-    {0, 2153},
-    {0, 2659},
-    {0, 2957},
-    {0, 395},
-    {0, 43},
-    {0, 2763},
-    {0, 298},
-    {0, 1041},
-    {0, 133},
-    {0, 1286},
-    {0, 374},
-    {0, 2071},
-    {0, 1218},
-    {0, 175},
-    {0, 3866},
-    {0, 1950},
-    {0, 1803},
-    {0, 895},
-    {3300, 1192},
-    {2786, 2},
-    {0, 2276},
-    {0, 3723},
-    {0, 2097},
-    {0, 3861},
-    {0, 3027},
-    {0, 369},
-    {0, 987},
-    {3609, 2267},
-    {2444, 2},
-    {0, 1772},
-    {0, 973},
-    {0, 2541},
-    {0, 1300},
-    {5012, 1646},
-    {0, 1798},
-    {0, 2457},
-    {2844, 668},
-    {2204, 668},
-    {1979, 668},
-    {1900, 1788},
-    {1228, 1788},
-    {672, 1788},
-    {4620, 2880},
-    {955, 2880},
-    {1978, 2880},
-    {903, 2337},
-    {4376, 2},
-    {252, 3479},
-    {676, 2},
-    {594, 2678},
-    {1391, 2},
-    {1976, 1449},
-    {2733, 2},
-    {1685, 1533},
-    {2042, 2},
-    {831, 1493},
-    {4309, 2},
-    {174, 132},
-    {445, 2},
-    {513, 1331},
-    {1463, 2},
-    {2487, 3722},
-    {1763, 2},
-    {106, 709},
-    {1469, 2},
-    {2647, 790},
-    {2097, 2},
-    {0, 3315},
-    {832, 1853},
-    {105, 2},
-    {4428, 3481},
-    {1114, 2},
-    {3968, 1585},
-    {3050, 2},
-    {1867, 1489},
-    {3585, 2},
-    {3209, 2786},
-    {3287, 2},
-    {4487, 2},
-    {3971, 2818},
-    {1177, 2818},
-    {4226, 2818},
-    {2122, 3421},
-    {772, 2},
-    {0, 3483},
-    {0, 3269},
-    {503, 845},
-    {439, 2},
-    {1535, 2629},
-    {2123, 2},
-    {2562, 797},
-    {1831, 2},
-    {4720, 2778},
-    {3432, 2},
-    {2214, 2730},
-    {2835, 2},
-    {2610, 1591},
-    {2535, 2},
-    {4203, 3569},
-    {4719, 2},
-    {484, 1640},
-    {3899, 2},
-    {4518, 1001},
-    {3591, 2},
-    {2418, 1063},
-    {3047, 2},
-    {2674, 3144},
-    {2742, 2},
-    {3941, 2109},
-    {4515, 2},
-    {612, 3271},
-    {3681, 2},
-    {2498, 661},
-    {3918, 2},
-    {319, 572},
-    {4461, 2},
-    {4652, 3679},
-    {4735, 2},
-    {3129, 1679},
-    {2502, 2},
-    {2020, 3527},
-    {3401, 2},
-    {0, 3088},
-    {4017, 3059},
-    {1107, 2},
-    {0, 1422},
-    {0, 649},
-    {0, 1240},
-    {2119, 3620},
-    {744, 2},
-    {4229, 3676},
-    {86, 2},
-    {542, 578},
-    {460, 2},
-    {1558, 2852},
-    {2116, 2},
-    {2592, 522},
-    {1875, 2},
-    {544, 477},
-    {1737, 2},
-    {3000, 418},
-    {2317, 2},
-    {0, 3270},
-    {0, 2397},
-    {0, 3425},
-    {0, 1170},
-    {0, 1393},
-    {0, 1605},
-    {0, 2230},
-    {0, 1266},
-    {0, 3865},
-    {0, 301},
-    {0, 3041},
-    {0, 52},
-    {0, 2353},
-    {5103, 2},
-    {4457, 29},
-    {1067, 2598},
-    {3932, 68},
-    {3052, 37},
-    {1802, 1532},
-    {3636, 1267},
-    {3276, 2762},
-    {3354, 44},
-    {4543, 120},
-    {3140, 3571},
-    {2329, 2307},
-    {1147, 953},
-    {2262, 2004},
-    {3456, 1052},
-    {1696, 742},
-    {613, 2071},
-    {1149, 268},
-    {3943, 544},
-    {281, 162},
-    {4239, 2467},
-    {4764, 2},
-    {4773, 2},
-    {4785, 2},
-    {4774, 2},
-    {4765, 2},
-    {4793, 2},
-    {4759, 2},
-    {4767, 2},
-    {4776, 2},
-    {4758, 2},
-    {2458, 1121},
-    {3013, 868},
-    {2734, 1891},
-    {3935, 2159},
-    {4760, 480},
-    {4805, 2},
-    {4779, 2},
-    {0, 3508},
-    {0, 3469},
-    {2454, 874},
-    {0, 2602},
-    {3988, 2806},
-    {3224, 530},
-    {0, 3919},
-    {4659, 1577},
-    {1131, 383},
-    {4145, 41},
-    {3915, 1045},
-    {3838, 1263},
-    {2922, 1522},
-    {1812, 201},
-    {794, 1907},
-    {2043, 710},
-    {3219, 2},
-    {4851, 59},
-    {0, 106},
-    {0, 215},
-    {0, 173},
-    {5107, 15},
-    {0, 278},
-    {5082, 155},
-    {0, 72},
-    {5125, 480},
-    {0, 615},
-    {0, 1324},
-    {0, 291},
-    {0, 205},
-    {0, 64},
-    {4854, 83},
-    {0, 36},
-    {4866, 240},
+    {5003, 1},
+    {4934, 1},
+    {5123, 1},
+    {5119, 196},
+    {5000, 158},
+    {5033, 48},
+    {5008, 57},
+    {4832, 154},
+    {5012, 187},
+    {4918, 169},
+    {5130, 119},
+    {4944, 167},
+    {4883, 4},
+    {5128, 163},
+    {4991, 115},
+    {5019, 55},
+    {5014, 22},
+    {4844, 157},
+    {4987, 160},
+    {0, 397},
+    {5081, 54},
+    {4904, 80},
+    {4851, 139},
+    {5075, 213},
+    {5028, 76},
+    {4996, 150},
+    {4985, 212},
+    {4869, 19},
+    {4850, 67},
+    {4843, 1},
+    {4855, 1},
+    {5029, 1},
+    {5038, 1},
+    {4990, 1},
+    {5027, 1},
+    {5085, 1},
+    {5015, 1},
+    {5084, 1},
+    {4865, 1},
+    {5031, 1},
+    {5099, 1},
+    {4984, 1},
+    {4906, 1},
+    {4964, 1},
+    {4916, 1},
+    {4926, 1},
+    {4866, 1},
+    {5080, 1},
+    {4902, 1},
+    {4859, 1},
+    {4974, 1},
+    {5107, 1},
+    {5079, 1},
+    {5093, 1},
+    {0, 2},
+    {1247, 291},
+    {228, 2803},
+    {1914, 196},
+    {0, 20},
+    {1462, 1967},
+    {3575, 89},
+    {4719, 21},
+    {3297, 608},
+    {1248, 726},
+    {2754, 2344},
+    {4654, 206},
+    {2054, 157},
+    {235, 1136},
+    {1548, 3105},
+    {2613, 1368},
+    {3741, 1427},
+    {2830, 2049},
+    {4280, 1684},
+    {2826, 2739},
+    {618, 310},
+    {4588, 2563},
+    {4901, 1923},
+    {833, 1842},
+    {3470, 439},
+    {2064, 3405},
+    {4574, 366},
+    {3134, 830},
+    {4003, 78},
+    {3130, 3842},
+    {977, 1488},
+    {3749, 3178},
+    {0, 888},
+    {498, 1031},
+    {1206, 3698},
+    {4372, 880},
+    {2422, 3661},
+    {982, 3366},
+    {1849, 3891},
+    {4969, 2786},
+    {1500, 1185},
+    {4192, 1378},
+    {2949, 3288},
+    {1951, 176},
+    {3427, 3200},
+    {0, 81},
+    {0, 658},
+    {37, 1},
+    {2344, 1},
+    {4649, 1},
+    {386, 1},
+    {2604, 1},
+    {3700, 1},
+    {5069, 1},
+    {2127, 1},
+    {4659, 1},
+    {3344, 1},
+    {4068, 1},
+    {3348, 1},
+    {722, 1},
+    {3811, 1},
+    {1877, 1},
+    {580, 1},
+    {4179, 1},
+    {1568, 1},
+    {563, 1},
+    {2191, 1},
+    {565, 1},
+    {2879, 1},
+    {5078, 1},
+    {3354, 1},
+    {1044, 1},
+    {4254, 1},
+    {2225, 1},
+    {849, 1},
+    {848, 1},
+    {3236, 277},
+    {1337, 1},
+    {4010, 3695},
+    {2820, 1},
+    {4597, 737},
+    {826, 1},
+    {3486, 647},
+    {4199, 1},
+    {2901, 980},
+    {4200, 1},
+    {2216, 1733},
+    {2622, 1},
+    {446, 2243},
+    {1727, 1},
+    {1402, 227},
+    {2902, 1},
+    {0, 309},
+    {825, 628},
+    {1665, 1},
+    {4146, 1428},
+    {1104, 1},
+    {3100, 2838},
+    {4332, 1},
+    {4580, 2985},
+    {847, 1},
+    {3449, 2920},
+    {4257, 1},
+    {2850, 2680},
+    {4255, 1},
+    {2165, 3785},
+    {2618, 1},
+    {370, 430},
+    {1734, 1},
+    {3060, 1720},
+    {1572, 1},
+    {4176, 1776},
+    {2688, 1},
+    {0, 2056},
+    {134, 747},
+    {4490, 1},
+    {2408, 3191},
+    {1237, 1},
+    {192, 3700},
+    {4125, 1},
+    {1460, 3663},
+    {667, 1},
+    {2110, 3887},
+    {2791, 1180},
+    {2391, 1180},
+    {4441, 1370},
+    {3268, 1},
+    {2635, 443},
+    {1691, 1},
+    {2789, 838},
+    {4311, 1},
+    {2790, 3851},
+    {681, 1},
+    {4607, 3176},
+    {1995, 1},
+    {808, 1018},
+    {4150, 1018},
+    {0, 1207},
+    {3861, 3119},
+    {3598, 1},
+    {3862, 416},
+    {1396, 1},
+    {3305, 903},
+    {1186, 1},
+    {2479, 3541},
+    {0, 1181},
+    {1404, 3348},
+    {409, 1},
+    {2038, 3157},
+    {412, 1},
+    {3020, 2453},
+    {2301, 1},
+    {0, 1953},
+    {3384, 1915},
+    {1993, 1},
+    {4517, 1863},
+    {3207, 1},
+    {3926, 2103},
+    {3209, 1},
+    {899, 851},
+    {3662, 1},
+    {1710, 3282},
+    {424, 1},
+    {2741, 2890},
+    {1919, 1},
+    {3881, 2955},
+    {2980, 1},
+    {4436, 2764},
+    {2979, 1},
+    {457, 3814},
+    {4714, 1},
+    {0, 465},
+    {1532, 3516},
+    {2912, 1},
+    {275, 3447},
+    {1887, 1},
+    {933, 3265},
+    {1888, 1},
+    {3967, 2565},
+    {1228, 1},
+    {3324, 2086},
+    {4348, 1},
+    {4643, 3751},
+    {935, 1},
+    {3526, 3796},
+    {4471, 1},
+    {2911, 3620},
+    {4472, 1},
+    {1955, 2967},
+    {2685, 648},
+    {625, 1},
+    {1837, 3349},
+    {1473, 1},
+    {2978, 2428},
+    {190, 1},
+    {1920, 80},
+    {0, 663},
+    {0, 248},
+    {0, 3666},
+    {0, 930},
+    {0, 1596},
     {0, 130},
-    {0, 1260},
-    {5085, 1418},
-    {0, 78},
-    {0, 287},
-    {0, 216},
-    {4864, 297},
-    {3382, 908},
-    {2084, 1009},
-    {2516, 2},
-    {3908, 2},
-    {325, 2},
-    {4450, 2},
-    {4666, 2},
-    {4910, 2},
-    {4992, 2},
-    {4850, 2},
-    {4825, 2},
-    {5068, 2},
-    {5015, 2},
-    {5051, 2},
-    {4976, 2},
-    {3706, 2},
-    {2726, 2},
-    {1545, 2},
-    {3303, 2},
-    {3534, 2},
-    {0, 1620},
-    {4254, 106},
-    {3707, 72},
-    {911, 1418},
-    {4510, 1907},
-    {3346, 1009},
-    {4246, 78},
-    {755, 36},
-    {0, 3138},
-    {0, 2117},
-    {0, 1213},
-    {0, 1279},
-    {0, 1235},
-    {0, 2998},
-    {0, 12},
-    {0, 3065},
-    {0, 529},
-    {0, 2386},
-    {0, 3237},
-    {0, 2589},
-    {721, 615},
-    {2390, 240},
-    {1271, 130},
-    {3734, 72},
-    {3519, 15},
-    {0, 370},
-    {446, 130},
+    {0, 2447},
+    {0, 2030},
+    {0, 1164},
+    {0, 278},
+    {0, 1651},
+    {0, 2733},
+    {0, 958},
+    {0, 2020},
+    {0, 788},
+    {0, 752},
+    {0, 3219},
+    {0, 1281},
+    {0, 2691},
+    {0, 743},
+    {2785, 3527},
+    {2400, 1},
+    {0, 1194},
+    {0, 1977},
+    {0, 1511},
+    {0, 1469},
+    {0, 2639},
+    {0, 3390},
+    {0, 279},
+    {1813, 2608},
+    {3831, 1},
+    {0, 1258},
+    {0, 677},
+    {0, 2983},
+    {0, 2378},
+    {5076, 915},
+    {0, 3555},
+    {0, 3840},
+    {1386, 42},
+    {493, 42},
+    {2000, 42},
+    {490, 2124},
+    {2957, 2124},
+    {2285, 2124},
+    {4318, 615},
+    {3076, 615},
+    {3737, 615},
+    {494, 2490},
+    {2609, 1},
+    {3976, 1903},
+    {3140, 1},
+    {3977, 3089},
+    {1885, 1},
+    {3453, 2259},
+    {724, 1},
+    {2059, 2008},
+    {2353, 1},
+    {3139, 3079},
+    {1172, 1},
+    {1961, 1245},
+    {495, 1},
+    {1964, 2491},
+    {4470, 1},
+    {2812, 3462},
+    {4000, 1},
+    {3767, 3121},
+    {491, 1},
+    {2624, 3170},
+    {3933, 1},
+    {0, 3416},
+    {1925, 2308},
+    {3480, 1},
+    {795, 1779},
+    {2045, 1},
+    {3294, 470},
+    {2497, 1},
+    {4427, 413},
+    {3557, 1},
+    {3890, 26},
+    {3559, 1},
+    {1122, 1},
+    {4139, 1061},
+    {1484, 1061},
+    {354, 1061},
+    {2529, 3142},
+    {1662, 1},
+    {0, 3211},
+    {0, 3900},
+    {4196, 3393},
+    {2895, 1},
+    {536, 2330},
+    {4511, 1},
+    {2034, 1818},
+    {771, 1},
+    {335, 1137},
+    {4148, 1},
+    {1599, 1217},
+    {534, 1},
+    {2219, 895},
+    {535, 1},
+    {2907, 2188},
+    {2484, 1},
+    {4402, 2652},
+    {3300, 1},
+    {1695, 3350},
+    {2647, 1},
+    {471, 3402},
+    {1369, 1},
+    {1130, 3216},
+    {1372, 1},
+    {3887, 2510},
+    {802, 1},
+    {3397, 2015},
+    {4619, 1},
+    {2738, 3867},
+    {1917, 1},
+    {3875, 3927},
+    {2974, 1},
+    {4434, 3690},
+    {2975, 1},
+    {462, 3097},
+    {4720, 1},
+    {2084, 1699},
+    {1006, 1},
+    {0, 1238},
+    {2375, 1323},
+    {1017, 1},
+    {0, 1580},
+    {0, 106},
+    {0, 3602},
+    {97, 2667},
+    {4044, 1},
+    {1412, 2605},
+    {417, 1},
+    {2043, 2367},
+    {415, 1},
+    {3017, 3461},
+    {2294, 1},
+    {4216, 1121},
+    {3212, 1},
+    {3692, 3776},
+    {402, 1},
+    {2545, 3821},
+    {3995, 1},
+    {0, 3542},
+    {0, 616},
+    {0, 3563},
+    {0, 3245},
+    {0, 342},
+    {0, 3935},
     {0, 1725},
-    {0, 3101},
-    {0, 2432},
-    {0, 1280},
-    {3726, 3302},
-    {3253, 1586},
-    {0, 2680},
-    {3927, 2204},
-    {0, 591},
-    {0, 3473},
-    {4919, 100},
-    {4435, 2888},
-    {0, 702},
-    {0, 1593},
-    {0, 3502},
-    {0, 1283},
-    {355, 2429},
-    {1048, 1974},
-    {1539, 249},
-    {0, 1784},
-    {4836, 319},
-    {0, 1364},
-    {0, 1146},
-    {4955, 2411},
-    {0, 1104},
-    {4963, 1084},
-    {4857, 584},
-    {5075, 1661},
-    {4826, 2130},
-    {187, 433},
-    {4903, 1462},
-    {0, 2340},
-    {0, 1814},
-    {0, 516},
-    {5076, 1115},
-    {0, 170},
-    {0, 2392},
-    {0, 636},
-    {0, 203},
-    {5000, 2047},
-    {0, 1696},
-    {0, 316},
-    {0, 1906},
-    {5119, 142},
-    {0, 1400},
-    {0, 475},
-    {0, 2535},
-    {4930, 425},
-    {0, 1665},
-    {4928, 2738},
-    {0, 2665},
-    {0, 1166},
-    {4835, 2},
-    {5058, 2},
-    {4938, 2},
-    {5040, 2},
-    {4939, 2},
-    {4863, 2},
-    {2093, 2},
-    {4998, 2},
-    {4891, 2},
-    {5044, 2},
-    {5115, 2},
-    {4929, 2},
-    {4991, 2},
-    {4090, 2},
-    {3488, 2},
-    {3861, 2},
-    {4922, 2},
-    {1799, 2},
-    {3630, 2},
-    {2526, 2},
-    {4747, 2},
-    {0, 1787},
-    {0, 1509},
+    {0, 2214},
+    {0, 1764},
+    {0, 2042},
+    {0, 763},
+    {0, 3183},
+    {0, 2975},
+    {4874, 1},
+    {3985, 119},
+    {2875, 2984},
+    {1866, 4},
+    {2766, 54},
+    {638, 382},
+    {1504, 863},
+    {1265, 83},
+    {1503, 150},
+    {3747, 19},
+    {2056, 1179},
+    {712, 3017},
+    {1830, 2942},
+    {2674, 1986},
+    {578, 2996},
+    {1550, 2420},
+    {3712, 2020},
+    {945, 115},
+    {3635, 80},
+    {4651, 212},
+    {4479, 203},
+    {4762, 1},
+    {4774, 1},
+    {4791, 1},
+    {4776, 1},
+    {4771, 1},
+    {4797, 1},
+    {4765, 1},
+    {4760, 1},
+    {4775, 1},
+    {4767, 1},
+    {4363, 3595},
+    {3619, 3523},
+    {3618, 283},
+    {1060, 2747},
+    {4761, 369},
+    {4779, 1},
+    {4780, 1},
+    {0, 2128},
+    {0, 2182},
+    {2610, 1891},
+    {0, 1216},
+    {2756, 2840},
+    {4485, 2411},
+    {0, 1228},
+    {2476, 2246},
+    {4450, 1305},
+    {3562, 2184},
+    {3866, 1569},
+    {3564, 2212},
+    {1116, 137},
+    {1467, 1944},
+    {772, 1919},
+    {4512, 71},
+    {1986, 1},
+    {4837, 254},
+    {0, 341},
+    {0, 583},
+    {0, 27},
+    {4957, 6},
+    {0, 112},
+    {4917, 927},
+    {0, 94},
+    {5122, 369},
+    {0, 533},
+    {0, 186},
+    {0, 726},
+    {0, 1575},
+    {0, 484},
+    {5048, 2239},
+    {0, 15},
+    {5129, 351},
+    {0, 123},
+    {0, 887},
+    {4888, 314},
+    {0, 697},
+    {0, 258},
+    {0, 807},
+    {4942, 63},
+    {1397, 3518},
+    {55, 1606},
+    {475, 1},
+    {3779, 1},
+    {1699, 1},
+    {67, 1},
+    {2322, 1},
+    {4961, 1},
+    {4884, 1},
+    {5118, 1},
+    {5010, 1},
+    {5127, 1},
+    {5001, 1},
+    {5057, 1},
+    {4992, 1},
+    {1868, 1},
+    {2775, 1},
+    {608, 1},
+    {1515, 1},
+    {1272, 1},
     {0, 2913},
-    {0, 3530},
+    {3745, 341},
+    {991, 94},
+    {3520, 314},
+    {4743, 1919},
+    {4447, 1606},
+    {1291, 697},
+    {3307, 15},
+    {0, 3799},
+    {0, 2783},
+    {0, 1350},
+    {0, 1012},
+    {0, 946},
+    {0, 689},
+    {0, 1968},
+    {0, 2472},
+    {0, 3209},
+    {0, 1754},
     {0, 1825},
-    {0, 2051},
-    {0, 3531},
-    {0, 2720},
-    {0, 3756},
-    {0, 2080},
-    {4846, 2543},
-    {4887, 2},
-    {1902, 160},
-    {654, 2},
-    {0, 1338},
-    {0, 518},
-    {0, 2508},
-    {0, 976},
-    {0, 2727},
-    {0, 2916},
-    {0, 3742},
-    {0, 2716},
-    {0, 763},
-    {0, 3544},
-    {0, 2040},
-    {0, 1006},
-    {0, 1804},
-    {0, 3617},
-    {0, 2574},
-    {0, 271},
-    {0, 1386},
-    {0, 573},
-    {0, 2667},
-    {0, 3890},
-    {0, 1972},
-    {0, 926},
-    {0, 2202},
-    {0, 3873},
-    {0, 2154},
-    {0, 1770},
-    {0, 691},
-    {0, 2017},
-    {0, 3798},
-    {0, 2950},
-    {0, 671},
-    {0, 1781},
-    {0, 971},
-    {2752, 3340},
-    {4499, 2},
-    {0, 1404},
-    {0, 1595},
-    {0, 2891},
-    {0, 3098},
-    {0, 2520},
-    {0, 334},
-    {2362, 2057},
-    {178, 2},
-    {3521, 1051},
-    {4055, 2},
-    {0, 1846},
-    {3946, 3551},
-    {2732, 2},
-    {5123, 56},
-    {5055, 2},
-    {2149, 2483},
-    {434, 2},
-    {3289, 3366},
-    {3699, 2},
-    {2571, 2274},
-    {3510, 2},
-    {0, 187},
-    {2811, 2766},
-    {1917, 2},
-    {2050, 1060},
-    {507, 2},
-    {3208, 2110},
-    {3755, 2},
-    {5029, 794},
-    {4944, 2},
-    {3680, 2740},
-    {3021, 2},
-    {3867, 3008},
-    {1244, 2},
-    {1087, 744},
-    {1454, 2},
-    {4553, 1834},
-    {2971, 2},
-    {4173, 1044},
-    {4227, 2},
-    {3044, 2928},
-    {3656, 2},
-    {0, 2074},
-    {492, 3609},
-    {2030, 2},
-    {0, 2784},
-    {0, 3817},
-    {0, 2048},
-    {0, 303},
-    {0, 2682},
-    {0, 3503},
-    {0, 2435},
-    {0, 252},
-    {0, 1886},
-    {0, 3852},
-    {0, 3051},
-    {0, 3654},
-    {0, 1992},
-    {0, 3526},
-    {0, 1417},
-    {0, 322},
-    {0, 1716},
-    {0, 3436},
-    {0, 2690},
-    {0, 292},
-    {0, 1433},
-    {0, 623},
-    {0, 2584},
-    {0, 3458},
-    {0, 1361},
-    {0, 217},
-    {0, 1637},
+    {0, 216},
+    {4528, 533},
+    {590, 351},
+    {604, 123},
+    {2818, 94},
+    {1998, 6},
+    {0, 491},
+    {3715, 123},
+    {0, 2818},
+    {0, 2771},
+    {0, 1812},
+    {0, 2401},
+    {4226, 1897},
+    {1399, 3386},
+    {0, 315},
+    {1630, 3136},
+    {0, 1916},
+    {0, 75},
+    {5067, 660},
+    {2418, 2637},
+    {0, 1674},
+    {0, 2977},
+    {0, 1562},
+    {0, 3659},
+    {284, 1060},
+    {149, 3884},
+    {4276, 1543},
+    {0, 2598},
+    {5007, 402},
     {0, 713},
-    {0, 3255},
-    {0, 1876},
-    {0, 1635},
-    {0, 2487},
-    {0, 539},
-    {0, 2265},
-    {0, 1363},
-    {0, 2805},
-    {0, 3279},
-    {0, 1000},
-    {0, 893},
-    {0, 2434},
-    {0, 3102},
-    {0, 2052},
-    {0, 3916},
-    {0, 1842},
-    {0, 2893},
-    {0, 1469},
-    {0, 863},
-    {0, 3384},
-    {0, 2342},
-    {0, 842},
-    {0, 574},
-    {0, 3313},
-    {0, 1677},
-    {0, 3143},
-    {0, 270},
-    {0, 3655},
-    {0, 2451},
-    {0, 2014},
-    {0, 2618},
-    {0, 1095},
-    {0, 210},
-    {0, 3154},
-    {0, 1373},
-    {0, 3359},
-    {0, 548},
-    {1811, 2094},
-    {4784, 2},
-    {4791, 2},
-    {4813, 2},
-    {4795, 2},
-    {4814, 2},
-    {4794, 2},
-    {4817, 2},
-    {4800, 2},
-    {4786, 2},
-    {4823, 2},
-    {4775, 2},
-    {4796, 2},
-    {4811, 2},
-    {4798, 2},
-    {4812, 2},
-    {4799, 2},
-    {4821, 2},
-    {4788, 2},
-    {4973, 2},
-    {5031, 2},
-    {5084, 2},
-    {5110, 2},
-    {4948, 2},
-    {5030, 2},
-    {4911, 2},
-    {5062, 2},
-    {4844, 2},
-    {5092, 2},
-    {4845, 2},
-    {5024, 2},
-    {4856, 2},
-    {4888, 2},
-    {5081, 2},
-    {4977, 2},
-    {5033, 2},
-    {4909, 2},
-    {4953, 2},
-    {5120, 2},
-    {4883, 2},
-    {5080, 2},
-    {5097, 2},
-    {4787, 2},
-    {4804, 2},
-    {4801, 2},
-    {2185, 2},
-    {2556, 2},
-    {2718, 2},
-    {4625, 2},
-    {1439, 2},
-    {5089, 2},
-    {4862, 2},
-    {5122, 2},
-    {4797, 2},
-    {4778, 2},
-    {4820, 2},
-    {4815, 2},
-    {4803, 2},
-    {4822, 2},
-    {4542, 3463},
-    {1526, 1487},
-    {777, 2270},
-    {1958, 4},
-    {4135, 2},
-    {5067, 2},
-    {2021, 2},
-    {4958, 2},
-    {1600, 2},
-    {5049, 2},
-    {4818, 2},
-    {4842, 2},
-    {4941, 2},
-    {5023, 2},
-    {5116, 2},
-    {5001, 2},
-    {4906, 2},
-    {5003, 2},
-    {1521, 2},
-    {5096, 2},
-    {4969, 2},
-    {5129, 2},
-    {2963, 2},
-    {4892, 2},
-    {357, 2},
-    {4763, 2},
-    {4783, 2},
-    {3252, 239},
-    {4033, 3162},
-    {2099, 1345},
-    {165, 3357},
-    {1323, 532},
-    {2453, 3826},
-    {59, 2638},
-    {1876, 1797},
-    {4940, 2},
-    {4843, 2},
-    {5114, 2},
-    {4782, 2},
-    {4761, 2},
-    {4852, 2},
-    {3107, 2},
-    {4158, 2},
-    {1161, 677},
-    {1703, 3043},
-    {941, 2460},
-    {4905, 2},
-    {4982, 2},
-    {5118, 2},
-    {5018, 2},
-    {4896, 2},
-    {1458, 3621},
-    {2494, 2582},
-    {4868, 2},
-    {2500, 49},
-    {2648, 1715},
-    {2370, 3896},
-    {3380, 2450},
-    {5022, 2},
-    {4886, 2},
-    {4996, 2},
-    {994, 2},
-    {1688, 2},
-    {1839, 2},
-    {419, 2464},
-    {1503, 1970},
-    {4890, 2},
-    {1778, 2},
-    {5060, 2},
-    {4873, 2},
-    {1547, 2},
-    {433, 2},
-    {4193, 2},
-    {5034, 2},
-    {2538, 2},
-    {4806, 2},
-    {4762, 2},
-    {4841, 2},
-    {4018, 2},
-    {4912, 2},
-    {1233, 2},
-    {1080, 2},
-    {4616, 2},
-    {2965, 2},
-    {4920, 2},
-    {5011, 2},
-    {3073, 2},
-    {4279, 2},
-    {1809, 2},
-    {4771, 2},
-    {4943, 2},
-    {1186, 2},
-    {2369, 2},
-    {814, 2},
-    {978, 2},
-    {465, 262},
-    {4808, 2},
-    {4792, 2},
-    {2543, 2516},
-    {4802, 2},
-    {4781, 2},
-    {2240, 1968},
-    {652, 3789},
-    {3900, 2131},
-    {4777, 2},
-    {5104, 2},
-    {4942, 2},
-    {3371, 2810},
-    {4988, 2},
-    {4736, 3628},
-    {4990, 2},
-    {4391, 1704},
-    {5013, 2},
-    {1217, 2857},
-    {5045, 2},
-    {226, 1427},
-    {3390, 2025},
-    {4819, 2},
-    {4789, 2},
-    {3477, 3396},
-    {4807, 2},
-    {3917, 3912},
-    {3415, 2619},
-    {4472, 1829},
-    {3628, 2448},
-    {1522, 879},
-    {3435, 2114},
-    {4975, 2},
-    {5112, 2},
-    {1747, 1603},
-    {4921, 2},
-    {2552, 1013},
-    {5020, 2},
-    {3213, 2897},
-    {4993, 2},
-    {2425, 1728},
-    {4918, 2},
-    {4332, 3713},
-    {4967, 2},
-    {5028, 2},
-    {2644, 2029},
-    {4855, 2},
-    {2889, 2},
-    {0, 93},
-    {0, 3578},
-    {0, 2321},
-    {0, 2136},
-    {0, 2504},
-    {0, 958},
-    {0, 27},
-    {0, 3234},
-    {0, 1238},
-    {0, 3467},
-    {0, 393},
-    {0, 3746},
-    {0, 2537},
-    {0, 1917},
-    {0, 1510},
-    {0, 3765},
-    {0, 3156},
-    {0, 206},
-    {0, 2261},
-    {0, 556},
-    {0, 3363},
-    {0, 997},
-    {0, 1624},
-    {0, 2804},
-    {0, 804},
-    {0, 2382},
-    {0, 3058},
-    {0, 2024},
-    {0, 3859},
-    {0, 1756},
-    {0, 2819},
-    {0, 1388},
-    {0, 915},
-    {0, 3323},
-    {0, 1439},
-    {0, 3708},
-    {0, 3509},
-    {0, 454},
-    {0, 143},
-    {0, 1630},
-    {2868, 368},
-    {0, 1429},
-    {0, 2308},
-    {0, 313},
-    {0, 2560},
-    {0, 1706},
-    {0, 3077},
-    {4927, 2},
-    {2525, 2},
-    {4926, 2},
-    {396, 2},
-    {5005, 2},
-    {4400, 2},
-    {5099, 2},
-    {879, 2},
-    {5083, 2},
-    {35, 2},
-    {4972, 2},
-    {4536, 2},
-    {4952, 2},
-    {2169, 2},
-    {5093, 2},
-    {615, 2},
-    {5130, 2},
-    {4861, 2},
-    {2741, 2},
-    {3385, 2},
-    {4946, 2},
-    {2822, 2},
-    {0, 1115},
-    {0, 1885},
-    {0, 1217},
-    {0, 3464},
-    {0, 411},
-    {0, 2604},
-    {0, 3},
-    {0, 3243},
-    {0, 844},
-    {0, 1447},
-    {0, 2919},
-    {0, 308},
-    {0, 2885},
-    {0, 2676},
-    {0, 1558},
-    {0, 368},
-    {0, 1305},
-    {0, 2437},
-    {0, 1987},
-    {0, 277},
-    {0, 3790},
-    {0, 616},
-    {0, 3104},
-    {0, 2440},
-    {0, 1314},
-    {0, 3288},
-    {0, 1561},
-    {0, 2675},
-    {0, 2194},
+    {0, 488},
+    {4915, 1235},
+    {0, 1229},
+    {4860, 1301},
+    {5117, 266},
+    {4941, 2173},
+    {4968, 633},
+    {2416, 2937},
+    {5068, 848},
+    {0, 925},
+    {0, 2449},
+    {0, 1762},
+    {4847, 2058},
+    {0, 1143},
+    {0, 612},
+    {0, 652},
+    {0, 876},
+    {5002, 1317},
+    {0, 681},
+    {0, 1774},
+    {0, 417},
+    {5049, 2208},
+    {0, 890},
+    {0, 2480},
+    {0, 1421},
+    {5066, 1612},
+    {0, 928},
+    {4952, 1602},
+    {0, 476},
+    {0, 2004},
+    {4933, 1},
+    {4838, 1},
+    {4909, 1},
+    {4946, 1},
+    {5131, 1},
+    {5102, 1},
+    {2680, 1},
+    {4830, 1},
+    {5036, 1},
+    {5020, 1},
+    {4882, 1},
+    {5043, 1},
+    {4963, 1},
+    {1000, 1},
+    {2707, 1},
+    {3048, 1},
+    {4970, 1},
+    {1033, 1},
+    {1432, 1},
+    {1561, 1},
+    {3338, 1},
+    {0, 1138},
+    {0, 184},
+    {0, 2527},
+    {0, 3804},
+    {0, 2542},
+    {0, 61},
+    {0, 2741},
+    {0, 2876},
+    {0, 3312},
+    {0, 2851},
+    {4929, 813},
+    {4947, 1},
+    {3349, 2394},
+    {1932, 1},
+    {0, 2337},
+    {0, 3623},
+    {0, 2294},
+    {0, 3387},
+    {0, 2063},
+    {0, 3545},
+    {0, 3389},
+    {0, 2959},
+    {0, 2232},
+    {0, 3732},
+    {0, 1397},
+    {0, 1254},
+    {0, 655},
+    {0, 1283},
+    {0, 2577},
+    {0, 1204},
+    {0, 1015},
+    {0, 1556},
+    {0, 1045},
+    {0, 622},
+    {0, 3046},
+    {0, 2640},
+    {0, 3345},
+    {0, 1087},
+    {0, 1080},
+    {0, 1952},
+    {0, 2143},
     {0, 562},
-    {0, 3589},
-    {0, 3856},
-    {0, 1643},
-    {0, 1882},
-    {0, 2745},
-    {0, 807},
-    {0, 2936},
-    {0, 2127},
-    {0, 2572},
-    {0, 3881},
-    {0, 76},
-    {0, 1735},
-    {0, 3887},
-    {0, 3277},
-    {0, 194},
-    {0, 2400},
-    {0, 1147},
-    {0, 1632},
-    {0, 2774},
-    {4195, 181},
-    {2536, 487},
-    {3306, 171},
-    {1671, 101},
-    {889, 551},
-    {2872, 298},
-    {4651, 286},
-    {3593, 29},
-    {2472, 482},
-    {4714, 68},
-    {3084, 320},
-    {1355, 268},
-    {3498, 134},
-    {3638, 131},
-    {2407, 485},
-    {459, 649},
-    {1666, 307},
-    {2033, 37},
-    {468, 198},
-    {1432, 57},
-    {3058, 44},
-    {1970, 2696},
-    {572, 1743},
-    {3194, 3552},
-    {3812, 171},
-    {2787, 101},
-    {3425, 551},
-    {3882, 1041},
-    {2850, 133},
-    {2960, 1645},
-    {2044, 286},
-    {659, 320},
-    {3085, 134},
-    {3886, 1831},
-    {3443, 2659},
-    {3806, 3838},
-    {2867, 197},
-    {4073, 307},
-    {792, 198},
-    {931, 57},
-    {1583, 3601},
-    {4458, 1950},
-    {2484, 107},
-    {3760, 1158},
-    {4661, 106},
-    {2631, 215},
-    {4120, 173},
-    {486, 78},
-    {4324, 287},
-    {4443, 482},
-    {2838, 37},
-    {919, 57},
-    {1303, 107},
-    {125, 106},
-    {1138, 215},
-    {1373, 240},
-    {557, 78},
-    {4611, 287},
-    {4132, 516},
-    {2869, 2243},
-    {2175, 7},
-    {2542, 2746},
-    {2709, 16},
-    {1433, 184},
-    {830, 1353},
-    {1903, 673},
-    {1815, 1796},
-    {712, 175},
-    {2406, 1218},
-    {3257, 376},
-    {1739, 3194},
-    {1584, 2673},
-    {950, 1144},
-    {2851, 3016},
-    {4707, 894},
-    {3573, 3615},
-    {2622, 196},
-    {4656, 1803},
-    {3192, 2657},
-    {4263, 85},
-    {408, 895},
-    {576, 2463},
-    {1965, 1657},
-    {4134, 3027},
-    {3466, 1409},
-    {4548, 2230},
-    {3903, 1772},
-    {3403, 149},
-    {4463, 973},
-    {3296, 1266},
-    {1879, 5},
-    {1706, 3320},
-    {913, 565},
-    {2899, 1646},
-    {4678, 72},
-    {4810, 2},
-    {4790, 2},
-    {269, 3883},
-    {4630, 2},
-    {4482, 1983},
-    {2727, 2},
-    {1038, 922},
-    {1791, 2},
-    {601, 2195},
-    {820, 2},
-    {1776, 3849},
-    {172, 2},
-    {3937, 2581},
-    {746, 2},
-    {884, 254},
-    {1677, 2},
-    {4347, 1397},
-    {2598, 2},
-    {3666, 588},
-    {4692, 2},
-    {2503, 2695},
-    {4154, 2},
-    {4449, 3460},
-    {643, 2},
-    {490, 1359},
-    {2032, 2},
-    {4067, 238},
-    {3528, 2},
-    {4752, 1644},
-    {3712, 2},
-    {3620, 3491},
-    {4275, 2},
-    {3092, 2616},
-    {1639, 2},
-    {1777, 212},
-    {851, 2},
-    {2966, 1374},
-    {4618, 2},
-    {3384, 553},
-    {2750, 2},
-    {4498, 2647},
-    {3318, 2},
-    {1905, 3496},
-    {2817, 2},
-    {2956, 1445},
-    {4305, 2},
-    {1770, 288},
-    {1076, 2},
-    {2242, 1692},
-    {1554, 2},
-    {1041, 3428},
-    {2165, 2},
-    {2518, 3308},
-    {2218, 2},
-    {2361, 1689},
-    {181, 2},
-    {3523, 630},
-    {4056, 2},
-    {2799, 1446},
-    {3295, 2},
-    {3945, 3226},
-    {2729, 2},
-    {2892, 824},
-    {1981, 2},
-    {2150, 3038},
-    {432, 2},
-    {3288, 3869},
-    {3697, 2},
-    {2570, 2844},
-    {3511, 2},
-    {3741, 931},
-    {2935, 2},
-    {2812, 2413},
-    {1916, 2},
-    {2047, 633},
-    {508, 2},
-    {3211, 1741},
-    {3758, 2},
-    {2491, 364},
-    {3580, 2},
-    {3676, 2379},
-    {3019, 2},
-    {3868, 2685},
-    {1241, 2},
-    {1086, 300},
-    {1457, 2},
-    {4555, 1440},
-    {2972, 2},
-    {4174, 626},
-    {4225, 2},
-    {3042, 2587},
-    {3655, 2},
-    {4448, 1707},
-    {644, 2},
-    {491, 3293},
-    {2031, 2},
-    {4065, 2445},
-    {3533, 2},
-    {4750, 2979},
-    {3713, 2},
-    {3618, 1682},
-    {4277, 2},
-    {189, 747},
-    {4557, 2},
-    {4686, 3006},
-    {2481, 2},
-    {1240, 3812},
-    {1563, 2},
-    {524, 2777},
-    {887, 2},
-    {1701, 704},
-    {248, 2},
-    {4181, 1237},
-    {967, 2},
-    {813, 3352},
-    {1760, 2},
-    {4291, 2506},
-    {2691, 2},
-    {3865, 3159},
-    {4486, 2},
-    {2744, 1343},
-    {3926, 2},
-    {2550, 3639},
-    {2195, 2},
-    {2321, 2140},
-    {133, 2},
-    {3551, 1137},
-    {4001, 2},
-    {2840, 1936},
-    {3333, 2},
-    {3990, 3717},
-    {2773, 2},
-    {3873, 2802},
-    {1238, 2},
-    {1089, 1125},
-    {1450, 2},
-    {4562, 2155},
-    {2980, 2},
-    {4166, 855},
-    {4220, 2},
-    {3035, 2900},
-    {3645, 2},
-    {370, 3670},
-    {4695, 2},
-    {4572, 2201},
-    {2658, 2},
-    {1102, 1183},
-    {1731, 2},
-    {658, 1979},
-    {748, 2},
-    {1869, 3643},
-    {61, 2},
-    {4409, 2},
-    {685, 2},
-    {528, 2},
-    {2090, 2},
-    {4021, 935},
-    {3559, 2979},
-    {0, 3872},
-    {4635, 580},
-    {287, 2},
-    {91, 2341},
-    {2462, 2},
-    {3685, 3225},
-    {3351, 2},
-    {4375, 2578},
-    {4045, 2},
-    {3226, 629},
-    {4595, 2},
-    {4701, 3106},
-    {364, 2},
-    {203, 890},
-    {2379, 2},
-    {3750, 1954},
-    {3281, 2},
-    {4424, 1153},
-    {3944, 2},
-    {3291, 3032},
-    {4505, 2},
-    {3097, 2869},
-    {1635, 2},
-    {1783, 1176},
-    {847, 2},
-    {2969, 2211},
-    {4626, 2},
-    {3376, 938},
-    {2748, 2},
-    {4493, 2828},
-    {3316, 2},
-    {2548, 1994},
-    {2197, 2},
-    {2324, 3879},
-    {126, 2},
-    {3546, 3084},
-    {4007, 2},
-    {2839, 3692},
-    {3337, 2},
-    {3985, 1887},
-    {2775, 2},
-    {2067, 494},
-    {2961, 2},
-    {2825, 2304},
-    {4433, 2},
-    {1644, 3171},
-    {1231, 2},
-    {2371, 2518},
-    {1407, 2},
-    {1184, 384},
-    {2009, 2},
-    {3372, 2049},
-    {1333, 2},
-    {1489, 3532},
-    {1120, 2},
-    {2687, 2721},
-    {4340, 2},
-    {3106, 3751},
-    {3045, 2},
-    {4233, 2076},
-    {3607, 2},
-    {1656, 2671},
-    {3205, 2},
-    {3358, 321},
-    {3984, 2},
-    {2130, 1415},
-    {94, 2},
-    {1372, 608},
-    {2343, 2},
-    {124, 2575},
-    {1756, 2},
-    {592, 3510},
-    {4367, 2},
-    {4245, 1435},
-    {3031, 2},
-    {759, 294},
-    {1518, 2},
-    {283, 1699},
-    {1109, 2},
-    {1444, 3426},
-    {531, 2},
-    {4091, 2613},
-    {908, 2},
-    {771, 219},
-    {1877, 2},
-    {4258, 1362},
-    {2791, 2},
-    {3805, 538},
-    {4586, 2},
-    {2659, 2660},
-    {4035, 2},
-    {0, 2366},
-    {0, 541},
-    {0, 1638},
-    {894, 2},
-    {511, 2},
-    {2077, 2},
-    {1094, 2},
-    {985, 2},
-    {4175, 2},
-    {4009, 2},
-    {3222, 2},
-    {516, 3103},
-    {2325, 733},
-    {1242, 3705},
-    {69, 347},
-    {2457, 1898},
-    {751, 2522},
-    {916, 3215},
-    {4081, 1926},
-    {3931, 2},
-    {3297, 2},
-    {448, 2},
-    {2399, 2},
-    {1175, 2},
-    {175, 2},
-    {2298, 3447},
-    {2569, 2137},
-    {2736, 1372},
-    {4491, 2260},
-    {1543, 208},
-    {718, 2494},
-    {835, 2},
-    {2358, 2},
-    {1658, 2},
-    {3202, 2},
-    {3350, 2},
-    {3989, 2},
-    {2135, 2},
-    {90, 2},
-    {1375, 2596},
-    {2339, 2139},
-    {134, 647},
-    {1750, 3534},
-    {3615, 1776},
-    {1540, 3150},
-    {1395, 3761},
-    {1180, 1103},
-    {2573, 2},
-    {4395, 2},
-    {3282, 2},
-    {2808, 2},
-    {4431, 2},
-    {3369, 2},
-    {2014, 2},
-    {2880, 2},
-    {3027, 2565},
-    {4230, 1708},
-    {1846, 3406},
-    {1016, 1425},
-    {2264, 2310},
-    {1464, 1847},
-    {1116, 74},
-    {2059, 3878},
-    {1642, 2},
-    {3090, 2},
-    {3223, 2},
-    {4004, 2},
-    {2065, 2},
-    {122, 2},
-    {95, 3199},
-    {1838, 1099},
-    {645, 2224},
-    {4447, 714},
-    {4316, 438},
-    {2984, 3445},
-    {312, 2},
-    {999, 2},
-    {1517, 2},
-    {381, 2},
-    {4208, 2},
-    {938, 2},
-    {790, 2},
-    {1729, 2},
-    {2660, 2410},
-    {4532, 2781},
-    {3964, 1160},
-    {3902, 2105},
-    {3780, 2},
-    {3563, 2},
-    {152, 2},
-    {2079, 2},
-    {958, 2},
-    {407, 2},
-    {2110, 2},
-    {1019, 2},
-    {862, 989},
-    {4136, 2472},
-    {3987, 2715},
-    {3353, 1931},
-    {427, 3541},
-    {2455, 2141},
-    {1159, 2917},
-    {156, 1502},
-    {2326, 2},
-    {805, 383},
-    {933, 2},
-    {4216, 1045},
-    {4071, 2},
-    {3277, 1263},
-    {494, 2},
-    {2383, 1522},
-    {1225, 2},
-    {42, 201},
-    {2397, 2},
-    {737, 1907},
-    {2188, 2},
-    {2554, 710},
-    {1440, 1600},
-    {838, 657},
-    {1899, 161},
-    {1820, 349},
-    {717, 2251},
-    {2412, 735},
-    {1641, 1222},
-    {3091, 3090},
-    {3225, 1600},
-    {4003, 657},
-    {2064, 161},
-    {138, 349},
-    {1300, 2251},
-    {2427, 735},
-    {87, 1222},
-    {1841, 3090},
-    {3553, 1107},
-    {1441, 2626},
-    {1290, 1654},
-    {1237, 1854},
-    {2551, 3232},
-    {4432, 86},
-    {3271, 2334},
-    {2929, 429},
-    {4393, 1107},
-    {3507, 2626},
-    {1890, 1654},
-    {2861, 1854},
-    {2999, 3232},
-    {4343, 86},
-    {1746, 2334},
-    {1117, 429},
-    {2208, 1951},
-    {1525, 1094},
-    {1015, 1161},
-    {2137, 2725},
-    {3715, 3036},
-    {998, 613},
-    {1140, 888},
-    {1345, 1691},
-    {4654, 1951},
-    {2876, 1094},
-    {3958, 1161},
-    {4446, 2725},
-    {2849, 3036},
-    {3884, 613},
-    {2746, 888},
-    {2435, 1691},
-    {2278, 2},
-    {258, 2},
-    {3452, 909},
-    {4117, 1871},
-    {3015, 2183},
-    {4191, 2},
-    {2493, 195},
-    {1549, 3040},
-    {3579, 552},
-    {3441, 819},
-    {3793, 383},
-    {2267, 1871},
-    {546, 3422},
-    {1848, 480},
-    {1914, 3422},
-    {692, 3073},
-    {1308, 1250},
-    {3298, 2839},
-    {1874, 214},
-    {1714, 1100},
-    {2903, 2},
-    {4682, 3566},
-    {3597, 817},
-    {2508, 1045},
-    {4694, 2863},
-    {3118, 1263},
-    {3516, 214},
-    {1473, 3696},
-    {1332, 3498},
-    {1261, 471},
-    {2501, 2},
-    {4470, 2},
-    {3245, 2},
-    {2887, 945},
-    {3577, 2},
-    {1550, 2},
-    {1398, 2143},
-    {1198, 2918},
-    {2581, 1139},
-    {4398, 1522},
-    {2815, 2388},
-    {4413, 3712},
-    {3381, 413},
-    {4219, 2},
-    {458, 2},
-    {607, 2},
-    {2001, 2728},
-    {4092, 2},
-    {3495, 2},
-    {4509, 2},
-    {3875, 2},
-    {3367, 3891},
-    {4429, 81},
-    {3717, 1113},
-    {997, 1907},
-    {1137, 2817},
-    {1348, 1760},
-    {4655, 1577},
-    {2874, 1064},
-    {2852, 1199},
-    {3883, 1316},
-    {881, 1215},
-    {3938, 2},
-    {3308, 546},
-    {450, 2502},
-    {2402, 201},
-    {1202, 3155},
-    {192, 710},
-    {2350, 1316},
-    {833, 176},
-    {4480, 754},
-    {272, 722},
-    {2290, 722},
-    {216, 722},
-    {3687, 3362},
-    {4022, 720},
-    {402, 1},
-    {1523, 1},
-    {3143, 1},
-    {1006, 2222},
-    {2770, 281},
-    {3173, 1680},
-    {2986, 3063},
-    {1423, 3695},
-    {2702, 2703},
-    {2028, 1058},
-    {4053, 3079},
-    {3518, 785},
-    {3682, 1581},
-    {2611, 50},
-    {4353, 482},
-    {4478, 30},
-    {3416, 800},
-    {4503, 167},
-    {48, 1077},
-    {251, 105},
-    {2266, 637},
-    {3792, 420},
-    {3176, 362},
-    {4235, 447},
-    {4150, 755},
-    {3105, 28},
-    {4688, 131},
-    {1051, 50},
-    {3664, 222},
-    {3800, 731},
-    {3453, 432},
-    {259, 30},
-    {1955, 800},
-    {740, 167},
-    {668, 1077},
-    {1936, 105},
-    {1254, 637},
-    {3925, 420},
-    {760, 362},
-    {900, 447},
-    {1699, 755},
-    {4370, 28},
-    {3690, 181},
-    {4711, 551},
-    {2480, 485},
-    {4184, 162},
-    {3733, 1041},
-    {1123, 29},
-    {1268, 320},
-    {1344, 268},
-    {4725, 134},
-    {2857, 131},
-    {4031, 307},
-    {4379, 544},
-    {2885, 198},
-    {3030, 1275},
-    {1511, 1528},
-    {374, 2859},
-    {111, 7},
-    {4386, 1539},
-    {3057, 2812},
-    {703, 705},
-    {1533, 133},
-    {1062, 2499},
-    {522, 286},
-    {71, 29},
-    {85, 29},
-    {3703, 1693},
-    {431, 482},
-    {415, 268},
-    {632, 268},
-    {582, 131},
-    {1985, 667},
-    {286, 307},
-    {598, 191},
-    {166, 37},
-    {2782, 1651},
-    {2393, 3846},
-    {2248, 3236},
-    {151, 5},
-    {3069, 297},
-    {1664, 320},
-    {3177, 2692},
-    {467, 171},
-    {46, 551},
-    {298, 551},
-    {774, 184},
-    {0, 1126},
-    {426, 134},
-    {616, 485},
-    {3111, 1547},
-    {3234, 1807},
-    {4028, 2807},
-    {2069, 700},
-    {144, 482},
-    {2449, 2486},
-    {56, 36},
-    {1866, 215},
-    {635, 215},
-    {74, 36},
-    {4344, 716},
-    {284, 101},
-    {271, 101},
-    {559, 68},
-    {2762, 3779},
-    {3970, 317},
-    {1226, 3586},
-    {3901, 1336},
-    {3763, 2108},
-    {3554, 3083},
-    {115, 1070},
-    {2060, 2849},
-    {925, 1852},
-    {404, 2319},
-    {2139, 3556},
-    {1017, 612},
-    {868, 70},
-    {4112, 2713},
-    {3952, 2473},
-    {3330, 1678},
-    {375, 482},
-    {2416, 521},
-    {1146, 791},
-    {112, 1769},
-    {2330, 107},
-    {786, 3851},
-    {946, 1062},
-    {4197, 140},
-    {4050, 1048},
-    {3256, 162},
-    {477, 2073},
-    {2347, 3394},
-    {1218, 268},
-    {5, 7},
-    {2405, 101},
-    {704, 134},
-    {2202, 482},
-    {2524, 521},
-    {2699, 791},
-    {4601, 1769},
-    {1419, 107},
-    {822, 3851},
-    {1887, 1062},
-    {1798, 140},
-    {723, 1048},
-    {2391, 162},
-    {1604, 2073},
-    {3108, 3394},
-    {3233, 268},
-    {4029, 7},
-    {2070, 101},
-    {139, 134},
-    {0, 2420},
-    {4412, 1333},
-    {4837, 2},
-    {4870, 2},
-    {5021, 2},
-    {3953, 2},
-    {3328, 2},
-    {1832, 2},
-    {3940, 2},
-    {2166, 2},
-    {31, 2},
-    {5090, 2},
-    {5056, 2},
-    {4834, 2},
-    {4872, 2},
-    {2257, 2},
-    {5032, 2},
-    {4415, 2},
-    {4951, 2},
-    {2344, 2},
-    {5098, 2},
-    {1829, 2},
-    {4959, 2},
-    {3161, 2},
-    {339, 680},
-    {1634, 3499},
-    {3232, 694},
-    {3109, 408},
-    {4924, 2},
-    {275, 2},
-    {5063, 2},
-    {4196, 2},
-    {4985, 2},
-    {2215, 2},
-    {5108, 2},
-    {209, 2},
-    {4923, 2},
-    {1430, 2},
-    {4858, 2},
-    {3439, 2},
-    {5050, 2},
-    {4935, 2},
-    {2497, 2},
-    {1258, 2},
-    {1587, 2},
-    {541, 2},
-    {907, 2},
-    {5061, 2},
-    {4853, 2},
-    {3732, 2},
-    {1124, 2},
-    {4931, 2},
-    {5009, 2},
-    {4723, 2},
-    {2856, 2},
-    {5121, 2},
-    {4894, 2},
-    {5111, 2},
-    {4893, 2},
-    {4159, 2},
-    {3077, 2},
-    {4904, 2},
-    {5019, 2},
-    {1096, 2},
-    {247, 2},
-    {5074, 2},
-    {4831, 2},
-    {1052, 2},
-    {3662, 2},
-    {4916, 2},
-    {5086, 2},
-    {4832, 2},
-    {5007, 2},
-    {4932, 2},
-    {4933, 2},
-    {1735, 2},
-    {1974, 2},
-    {566, 2},
-    {1378, 2},
-    {4838, 2},
-    {5069, 2},
-    {4875, 2},
-    {5066, 2},
-    {1340, 2},
-    {678, 2},
-    {4489, 2},
-    {77, 2},
-    {3080, 2},
-    {4708, 2},
-    {4300, 2},
-    {537, 2},
-    {267, 1271},
-    {82, 1724},
-    {3119, 222},
-    {4188, 731},
-    {1941, 432},
-    {332, 30},
-    {1475, 800},
-    {2293, 167},
-    {254, 1077},
-    {1705, 105},
-    {2939, 637},
-    {2071, 1414},
-    {1933, 2167},
-    {680, 3000},
-    {3110, 1162},
-    {3916, 2782},
-    {2679, 1960},
-    {3463, 2409},
-    {3787, 3630},
-    {2888, 525},
-    {2382, 3895},
-    {2662, 1714},
-    {2483, 1961},
-    {4703, 2779},
-    {1318, 880},
-    {932, 2992},
-    {2054, 2165},
-    {1686, 2634},
-    {912, 3828},
-    {2280, 165},
-    {2160, 526},
-    {3017, 3064},
-    {2866, 2390},
-    {4352, 1228},
-    {1673, 3241},
-    {1129, 1497},
-    {2434, 2591},
-    {1309, 2142},
-    {1267, 643},
-    {1912, 3529},
-    {2080, 3066},
-    {2936, 663},
-    {2802, 1},
-    {4407, 1},
-    {1608, 1},
-    {1214, 1},
-    {2354, 1},
-    {1380, 1},
-    {1193, 1},
-    {1983, 1},
-    {1115, 1},
-    {3723, 1},
-    {3856, 1},
-    {3364, 1},
-    {345, 1},
-    {1886, 1},
-    {827, 1},
-    {588, 1},
-    {1999, 1},
-    {1174, 1},
-    {469, 1},
-    {4337, 1},
-    {4464, 2247},
-    {2853, 1056},
-    {940, 746},
-    {1328, 738},
-    {162, 1411},
-    {1162, 345},
-    {1354, 1900},
-    {579, 2528},
-    {4716, 341},
-    {337, 2997},
-    {171, 2318},
-    {2345, 472},
-    {3730, 1138},
-    {3260, 1713},
-    {4417, 1571},
-    {3922, 1747},
-    {3305, 443},
-    {4481, 2837},
-    {834, 402},
-    {3991, 3365},
-    {4153, 2937},
-    {3081, 279},
-    {664, 2737},
-    {2180, 1092},
-    {1100, 3333},
-    {242, 431},
-    {2287, 181},
-    {883, 171},
-    {102, 7},
-    {1249, 101},
-    {1103, 551},
-    {1462, 184},
-    {4571, 286},
-    {2988, 29},
-    {4152, 482},
-    {4231, 68},
-    {3048, 320},
-    {3660, 268},
-    {2540, 134},
-    {2179, 131},
-    {2305, 485},
-    {113, 307},
-    {3541, 191},
-    {163, 37},
-    {2848, 544},
-    {3326, 198},
-    {3976, 57},
-    {2764, 107},
-    {1291, 44},
-    {3421, 162},
-    {3550, 120},
-    {3767, 5},
-    {2322, 181},
-    {519, 171},
-    {1572, 7},
-    {2118, 101},
-    {424, 551},
-    {1506, 184},
-    {3133, 286},
-    {1585, 29},
-    {1741, 482},
-    {800, 68},
-    {2998, 320},
-    {4578, 268},
-    {3436, 134},
-    {2779, 131},
-    {4517, 485},
-    {3339, 307},
-    {3491, 191},
-    {1377, 37},
-    {1529, 544},
-    {1036, 198},
-    {2793, 57},
-    {4253, 107},
-    {3189, 44},
-    {3002, 162},
-    {4327, 120},
-    {3570, 5},
-    {3413, 50},
-    {1171, 3561},
-    {4302, 999},
-    {457, 1878},
-    {4494, 354},
-    {1274, 2749},
-    {4867, 2},
-    {0, 642},
-    {0, 967},
-    {0, 920},
+    {0, 2106},
+    {0, 451},
+    {0, 2916},
+    {0, 3032},
+    {0, 2779},
+    {504, 499},
+    {4550, 1},
+    {0, 2071},
+    {0, 2947},
+    {0, 2664},
+    {0, 3112},
+    {0, 3358},
+    {0, 2921},
+    {2560, 1453},
+    {2273, 1},
+    {1970, 1320},
+    {3777, 1},
+    {0, 740},
+    {1049, 1348},
+    {4076, 1},
+    {5120, 68},
+    {5064, 1},
+    {4578, 1801},
+    {123, 1},
+    {503, 1909},
+    {3369, 1},
+    {3323, 280},
+    {3145, 1},
+    {0, 1946},
+    {292, 1099},
+    {3360, 1},
+    {2563, 2614},
+    {2272, 1},
+    {1972, 2545},
+    {3776, 1},
+    {5070, 3679},
+    {4972, 1},
+    {1051, 2520},
+    {4078, 1},
+    {2582, 2452},
+    {707, 1},
+    {306, 1024},
+    {4711, 1},
+    {4456, 1195},
+    {1461, 1},
+    {1752, 1710},
+    {1864, 1},
+    {3627, 1153},
+    {1763, 1},
+    {0, 142},
+    {4286, 2682},
+    {470, 1},
     {0, 2827},
-    {0, 3001},
-    {0, 3678},
-    {0, 2371},
-    {0, 3548},
-    {0, 1277},
-    {0, 1456},
-    {0, 3904},
-    {0, 3344},
-    {0, 3290},
-    {0, 1401},
-    {0, 1608},
-    {0, 314},
-    {0, 3694},
-    {0, 2303},
-    {0, 682},
-    {0, 832},
-    {0, 2590},
-    {0, 2970},
-    {0, 2813},
-    {0, 937},
-    {0, 988},
-    {0, 1890},
-    {0, 381},
-    {0, 2160},
+    {0, 3253},
+    {0, 2811},
+    {0, 1955},
+    {0, 3406},
+    {0, 3528},
+    {0, 3090},
     {0, 3497},
-    {0, 3375},
-    {0, 1824},
-    {0, 1407},
-    {0, 1568},
-    {0, 3331},
-    {0, 3268},
-    {0, 2556},
-    {0, 3839},
-    {0, 2497},
-    {0, 1086},
-    {0, 1164},
-    {0, 2407},
-    {0, 2733},
-    {0, 3078},
-    {0, 1106},
-    {0, 753},
-    {0, 2196},
-    {0, 1662},
+    {0, 3795},
+    {0, 1495},
+    {0, 1635},
+    {0, 1145},
+    {0, 1589},
+    {0, 3931},
+    {0, 1643},
+    {0, 1475},
     {0, 962},
-    {0, 2158},
-    {0, 2980},
-    {0, 3116},
-    {0, 356},
-    {0, 3049},
-    {0, 3884},
-    {0, 3740},
-    {0, 1743},
-    {0, 3615},
-    {0, 2696},
-    {0, 2243},
-    {0, 1335},
-    {0, 2517},
-    {3423, 68},
-    {1364, 107},
-    {0, 40},
-    {0, 1911},
-    {0, 3306},
-    {0, 2078},
-    {0, 1303},
-    {0, 3482},
-    {0, 655},
-    {0, 3338},
-    {0, 1925},
-    {0, 1674},
-    {0, 3157},
-    {0, 3071},
-    {0, 2035},
-    {0, 3218},
-    {0, 3832},
-    {0, 1768},
-    {0, 2399},
-    {0, 1249},
-    {0, 3831},
-    {0, 3216},
-    {0, 1499},
-    {0, 1318},
-    {0, 2338},
-    {0, 985},
-    {0, 67},
-    {0, 2592},
-    {0, 3274},
-    {0, 96},
-    {0, 3026},
-    {0, 2344},
-    {0, 396},
-    {0, 1621},
-    {0, 2579},
-    {0, 729},
-    {0, 453},
-    {0, 2384},
-    {0, 2650},
-    {0, 1548},
-    {0, 3635},
-    {0, 3442},
-    {0, 1232},
-    {0, 2179},
-    {0, 2956},
-    {0, 230},
-    {0, 1109},
-    {0, 2712},
-    {0, 555},
-    {0, 3412},
-    {0, 1963},
-    {0, 1722},
-    {0, 3185},
-    {0, 3614},
-    {0, 1765},
-    {0, 3321},
-    {0, 3915},
-    {4544, 2610},
-    {2643, 2085},
-    {2626, 1718},
-    {1384, 1655},
-    {2151, 3579},
-    {1002, 1569},
-    {3454, 2163},
-    {1035, 547},
-    {4345, 3543},
-    {164, 892},
-    {4546, 2780},
-    {2846, 1128},
-    {1893, 3120},
-    {4628, 1830},
-    {3924, 1986},
-    {2758, 3525},
-    {257, 3738},
-    {2790, 3720},
-    {1676, 1905},
-    {3571, 2112},
-    {1530, 878},
-    {4702, 961},
-    {358, 1664},
-    {2908, 3922},
-    {3617, 3799},
-    {4218, 1297},
-    {1954, 1896},
-    {4257, 2075},
-    {1139, 3736},
-    {4034, 3685},
-    {770, 2994},
-    {3539, 3871},
-    {1443, 2455},
-    {3933, 1046},
-    {4636, 1189},
-    {3184, 2447},
-    {739, 2701},
-    {3187, 3110},
-    {2426, 1122},
-    {2854, 798},
-    {1963, 825},
-    {2612, 596},
-    {2258, 2003},
-    {4411, 3385},
-    {3728, 3517},
-    {2981, 1997},
-    {670, 1226},
-    {3003, 1498},
-    {1304, 3450},
-    {3359, 3206},
-    {1744, 2633},
-    {4679, 2199},
-    {208, 473},
-    {2821, 2931},
-    {3532, 3060},
-    {4338, 265},
-    {1937, 732},
-    {4325, 224},
-    {1260, 3096},
-    {3967, 2741},
-    {791, 3830},
-    {3182, 2237},
-    {1665, 3645},
-    {3857, 1470},
-    {4293, 1298},
-    {3542, 3796},
-    {1253, 3456},
-    {3572, 3186},
-    {1909, 1205},
-    {2789, 1717},
-    {2333, 164},
-    {4301, 1111},
-    {521, 1538},
-    {2794, 3820},
-    {3207, 1307},
-    {4647, 1437},
-    {2400, 1790},
-    {4627, 1659},
-    {730, 3829},
-    {3858, 3591},
-    {1176, 3095},
-    {510, 2606},
-    {4312, 3741},
-    {2394, 1557},
-    {1655, 1730},
-    {253, 3707},
-    {2766, 3145},
-    {280, 968},
-    {3965, 1156},
-    {1259, 1323},
-    {3808, 621},
-    {660, 2825},
-    {4438, 3130},
-    {2253, 1819},
-    {1805, 1971},
-    {67, 3507},
-    {2602, 3754},
-    {80, 3709},
-    {4118, 1928},
-    {1112, 2098},
-    {3672, 901},
-    {1913, 1752},
-    {2823, 139},
-    {212, 2884},
-    {714, 2752},
-    {2428, 457},
-    {4653, 1129},
-    {2446, 734},
-    {3183, 2719},
-    {1474, 3068},
-    {3605, 3616},
-    {4149, 3659},
-    {991, 2220},
-    {3492, 761},
-    {3070, 944},
-    {3668, 2686},
-    {1347, 2908},
-    {3671, 2894},
-    {563, 840},
-    {4581, 1079},
-    {79, 1945},
-    {3405, 2026},
-    {1295, 563},
-    {4089, 3109},
-    {4497, 2971},
-    {3335, 146},
-    {886, 829},
-    {3342, 1050},
-    {2277, 2905},
-    {2994, 2874},
-    {2121, 3803},
-    {4570, 3054},
-    {185, 3329},
-    {3055, 2090},
-    {3482, 2208},
-    {4349, 3294},
-    {2117, 3528},
-    {4380, 3906},
-    {1001, 2149},
-    {4189, 1860},
-    {915, 1143},
-    {3794, 1673},
-    {1201, 954},
-    {3135, 2536},
-    {2701, 2694},
-    {3999, 936},
-    {1573, 14},
-    {4030, 656},
-    {311, 2603},
-    {4238, 2023},
-    {533, 3480},
-    {3464, 1196},
-    {1389, 1565},
-    {4209, 3748},
-    {4619, 1791},
-    {3246, 1403},
-    {943, 1823},
-    {3215, 2162},
-    {2213, 1382},
-    {3011, 3576},
-    {2051, 3018},
-    {4350, 1806},
-    {614, 2823},
-    {2531, 150},
-    {3263, 144},
-    {4566, 2973},
-    {2181, 2593},
-    {4582, 2296},
-    {937, 18},
-    {3669, 622},
-    {1110, 1325},
-    {843, 2174},
-    {3994, 511},
-    {1515, 2934},
-    {1968, 3020},
-    {1196, 223},
-    {3643, 788},
-    {1185, 1102},
-    {4278, 3075},
-    {351, 2704},
-    {4634, 3864},
-    {4012, 3520},
-    {829, 2965},
-    {3619, 412},
-    {2909, 601},
-    {3790, 2830},
-    {1505, 2280},
-    {3819, 2611},
-    {382, 648},
-    {4722, 87},
-    {289, 1636},
-    {4161, 3715},
-    {981, 2291},
-    {3484, 697},
-    {3061, 869},
-    {3657, 2612},
-    {1360, 2960},
-    {3683, 2834},
-    {545, 924},
-    {4597, 1002},
-    {93, 1495},
-    {3099, 757},
-    {1630, 1458},
-    {3824, 3653},
-    {4260, 3545},
-    {3575, 1517},
-    {1150, 2193},
-    {3616, 1775},
-    {1949, 3581},
-    {2678, 3843},
-    {2456, 2729},
-    {669, 759},
-    {4427, 3180},
-    {2250, 1757},
-    {1800, 1130},
-    {57, 2045},
-    {2613, 3801},
-    {1837, 722},
-    {0, 327},
-    {4780, 2},
-    {2928, 2032},
-    {1967, 3580},
-    {4224, 3862},
-    {4827, 2},
-    {5078, 2},
-    {3814, 2},
-    {4966, 2},
-    {3795, 2},
-    {5036, 2},
-    {4704, 2},
-    {4839, 2},
-    {4369, 2},
-    {4847, 2},
-    {2553, 2},
-    {4860, 2},
-    {4590, 2},
-    {5038, 2},
-    {4554, 2},
-    {4971, 2},
-    {3654, 2},
-    {5054, 2},
-    {2864, 2},
-    {5094, 2},
-    {4743, 2},
-    {5070, 2},
-    {2664, 2},
-    {4937, 2},
-    {2671, 2},
-    {4960, 2},
-    {1472, 2},
-    {4882, 2},
-    {1189, 2},
-    {5004, 2},
-    {2722, 2},
-    {5052, 2},
-    {3930, 2},
-    {753, 2},
-    {4829, 2},
-    {2834, 2},
-    {3853, 2},
-    {4878, 2},
-    {3877, 2},
-    {475, 2},
-    {4889, 2},
-    {372, 2},
-    {768, 2},
-    {5017, 2},
-    {1436, 2},
-    {1896, 2},
-    {1461, 2},
-    {4770, 2},
-    {3269, 2655},
-    {4574, 897},
-    {5048, 2},
-    {4569, 2},
-    {944, 2571},
-    {4849, 2},
-    {4879, 2},
-    {3670, 2},
-    {4994, 2},
-    {3278, 2},
-    {5008, 2},
-    {4192, 2},
-    {4881, 2},
-    {4151, 2},
-    {5124, 2},
-    {4351, 2},
-    {4902, 2},
-    {4724, 2},
-    {4908, 2},
-    {2923, 2},
-    {4925, 2},
-    {4244, 2},
-    {5126, 2},
-    {4234, 2},
-    {4884, 2},
-    {4014, 2},
-    {4989, 2},
-    {2485, 2},
-    {4999, 2},
-    {4387, 2},
-    {4945, 2},
-    {564, 2},
-    {4964, 2},
-    {1346, 2},
-    {4897, 2},
-    {1878, 2},
-    {5127, 2},
-    {3661, 2},
-    {575, 2},
-    {5106, 2},
-    {60, 2},
-    {4010, 2},
-    {5077, 2},
-    {3622, 2},
-    {2911, 2},
-    {4871, 2},
-    {1504, 2},
-    {3815, 2},
-    {5014, 2},
-    {4729, 2},
-    {282, 2},
-    {4848, 2},
-    {5071, 2},
-    {5025, 2},
-    {5010, 2},
-    {1156, 2},
-    {3851, 2},
-    {1546, 2},
-    {2925, 2},
-    {2356, 2},
-    {4907, 2},
-    {2624, 2},
-    {3345, 1114},
-    {2991, 452},
-    {3739, 1909},
-    {1294, 1771},
-    {3736, 2511},
-    {648, 503},
-    {4492, 269},
-    {183, 1503},
-    {2656, 1165},
-    {2373, 726},
-    {4264, 1182},
-    {3829, 1579},
-    {2877, 1375},
-    {392, 1857},
-    {2896, 1384},
-    {1493, 1837},
-    {3126, 2147},
-    {1710, 3042},
-    {2386, 2329},
-    {2642, 3025},
-    {406, 1504},
-    {1153, 896},
-    {1997, 1127},
-    {4289, 782},
-    {1996, 2213},
-    {3639, 1744},
-    {1615, 1255},
-    {3154, 550},
-    {2234, 703},
-    {2478, 1195},
-    {577, 461},
-    {1026, 1762},
-    {2163, 1472},
-    {4403, 1488},
-    {2156, 3399},
-    {3497, 1990},
-    {1766, 2036},
-    {3294, 816},
-    {371, 1826},
-    {4687, 124},
-    {1964, 860},
-    {1513, 1032},
-    {452, 390},
-    {2931, 1200},
-    {441, 681},
-    {3842, 1220},
-    {826, 1383},
-    {3934, 3570},
-    {3389, 3387},
-    {1306, 1526},
-    {4133, 241},
-    {4540, 850},
-    {3312, 13},
-    {875, 2963},
-    {3293, 2840},
-    {2254, 916},
-    {2951, 1014},
-    {2155, 1868},
-    {4212, 2079},
-    {930, 640},
-    {3465, 3061},
-    {3040, 2929},
-    {3714, 35},
-    {1414, 917},
-    {3709, 964},
-    {606, 2968},
-    {4609, 2801},
-    {16, 3766},
-    {2959, 3115},
-    {2056, 3374},
-    {4549, 2019},
-    {4142, 2157},
-    {2593, 3259},
-    {32, 3587},
-    {2563, 3874},
-    {1824, 2190},
-    {3366, 1812},
-    {1388, 1098},
-    {3171, 1742},
-    {1674, 1030},
-    {3904, 2470},
-    {4333, 2608},
-    {3526, 861},
-    {1234, 125},
-    {3522, 592},
-    {1898, 2663},
-    {2730, 2272},
-    {2360, 3423},
-    {4087, 1134},
-    {901, 1492},
-    {3402, 3800},
-    {2974, 3921},
-    {3724, 1471},
-    {1282, 1759},
-    {3748, 2203},
-    {2594, 1655},
-    {2270, 892},
-    {4462, 263},
-    {3773, 38},
-    {2953, 491},
-    {657, 108},
-    {2952, 765},
-    {1288, 116},
-    {3292, 547},
-    {1765, 1253},
-    {3280, 3917},
-    {1720, 391},
-    {3674, 963},
-    {4364, 1128},
-    {1316, 2315},
-    {3378, 3688},
-    {858, 1351},
-    {11, 1258},
-    {1835, 3762},
-    {4116, 3486},
-    {1870, 3151},
-    {2601, 1344},
-    {2105, 1653},
-    {3049, 51},
-    {3395, 760},
-    {1302, 1455},
-    {4125, 3657},
-    {4534, 3547},
-    {3304, 1513},
-    {880, 2191},
-    {3301, 1773},
-    {2259, 3583},
-    {2943, 3844},
-    {2159, 2726},
-    {3536, 481},
-    {1456, 2188},
-    {3974, 3465},
-    {4674, 3332},
-    {3164, 1774},
-    {731, 1459},
-    {3152, 1516},
-    {2401, 3377},
-    {2809, 3233},
-    {1987, 2485},
-    {3751, 3516},
-    {3343, 407},
-    {2618, 595},
-    {4093, 2835},
-    {1822, 2282},
-    {4085, 2614},
-    {33, 645},
-    {4416, 82},
-    {602, 1639},
-    {2377, 1556},
-    {2645, 1197},
-    {418, 2605},
-    {1163, 2461},
-    {2008, 666},
-    {4283, 353},
-    {1988, 372},
-    {3634, 2538},
-    {1625, 2336},
-    {3153, 3367},
-    {497, 3292},
-    {4323, 2760},
-    {2448, 6},
-    {1698, 253},
-    {233, 3046},
-    {2749, 2539},
-    {210, 2368},
-    {3939, 359},
-    {1221, 427},
-    {3832, 1365},
-    {1632, 123},
-    {3088, 1989},
-    {1167, 3244},
-    {422, 3129},
-    {1557, 2005},
-    {3843, 1740},
-    {1537, 1212},
-    {2930, 3188},
-    {2346, 3424},
-    {2728, 2273},
-    {2172, 1717},
-    {3012, 2453},
-    {443, 2228},
-    {4240, 3649},
-    {2307, 1451},
-    {1564, 1287},
-    {338, 3788},
-    {2703, 3471},
-    {368, 3176},
-    {4049, 1239},
-    {1200, 1697},
-    {3879, 183},
-    {1561, 2189},
-    {3578, 483},
-    {798, 2915},
-    {314, 3047},
-    {1628, 251},
-    {4074, 756},
-    {1623, 452},
-    {2714, 2511},
-    {1990, 1503},
-    {2810, 726},
-    {2945, 3042},
-    {2075, 2329},
-    {4524, 896},
-    {4115, 782},
-    {2566, 2213},
-    {18, 1255},
-    {2588, 550},
-    {1794, 703},
-    {3399, 1195},
-    {1412, 461},
-    {2101, 1201},
-    {2937, 867},
-    {27, 2430},
-    {867, 2288},
-    {2286, 1023},
-    {4551, 585},
-    {2283, 114},
-    {3347, 2233},
-    {1315, 2632},
-    {3461, 3212},
-    {1938, 1999},
-    {2803, 598},
-    {230, 3100},
-    {727, 2964},
-    {2447, 110},
-    {4680, 847},
-    {2430, 1022},
-    {1467, 1655},
-    {3584, 892},
-    {697, 263},
-    {4406, 38},
-    {2255, 2060},
-    {1813, 1836},
-    {78, 3289},
-    {2629, 1986},
-    {66, 3903},
-    {4130, 1896},
-    {1099, 1790},
-    {3667, 1156},
-    {3116, 968},
-    {1606, 1659},
-    {3845, 622},
-    {4281, 1189},
-    {3606, 1307},
-    {1165, 1908},
-    {3586, 2082},
-    {1961, 3726},
-    {2669, 3690},
-    {2429, 2986},
-    {3919, 2832},
-    {1211, 3114},
-    {3167, 1838},
-    {2743, 1993},
-    {3975, 3519},
-    {1709, 825},
-    {3961, 3718},
-    {273, 1912},
-    {4331, 2103},
-    {394, 891},
-    {2675, 1778},
-    {2352, 248},
-    {4287, 2889},
-    {3848, 2761},
-    {2900, 491},
-    {414, 108},
-    {2873, 765},
-    {1528, 355},
-    {3082, 805},
-    {1678, 3602},
-    {3479, 2238},
-    {1381, 3642},
-    {4205, 1474},
-    {4612, 1301},
-    {3230, 3793},
-    {963, 3454},
-    {3229, 3184},
-    {2206, 1208},
-    {3022, 1721},
-    {2062, 158},
-    {3797, 3590},
-    {1194, 2424},
-    {3130, 858},
-    {2692, 698},
-    {3992, 2474},
-    {1581, 3092},
-    {4044, 2717},
-    {297, 745},
-    {4247, 1110},
-    {543, 1801},
-    {2905, 600},
-    {1984, 2000},
-    {4745, 3389},
-    {4061, 3521},
-    {2670, 1991},
-    {333, 1221},
-    {2667, 1746},
-    {1590, 3452},
-    {3587, 3210},
-    {1468, 2627},
-    {4084, 1582},
-    {906, 1178},
-    {3407, 2620},
-    {2982, 2481},
-    {3729, 689},
-    {1281, 336},
-    {3746, 399},
-    {622, 2531},
-    {4511, 2346},
-    {196, 602},
-    {910, 996},
-    {4076, 871},
-    {1286, 1097},
-    {2034, 979},
-    {1108, 2255},
-    {3438, 2091},
-    {1104, 632},
-    {4467, 1074},
-    {62, 839},
-    {4573, 65},
-    {766, 898},
-    {3928, 983},
-    {1437, 204},
-    {1897, 61},
-    {1266, 2943},
-    {3568, 2658},
-    {1251, 2254},
-    {4334, 180},
-    {261, 403},
-    {4699, 1233},
-    {1883, 290},
-    {3284, 1863},
-    {1075, 462},
-    {640, 244},
-    {1324, 1530},
-    {3785, 1614},
-    {1320, 1349},
-    {2997, 849},
-    {2276, 692},
-    {2490, 2387},
-    {4248, 2320},
-    {437, 2722},
-    {2713, 741},
-    {3144, 1116},
-    {4712, 1793},
-    {2338, 925},
-    {4698, 1293},
-    {799, 1321},
-    {3798, 1672},
-    {1250, 21},
-    {2788, 631},
-    {2392, 1922},
-    {4307, 3360},
-    {3874, 3435},
-    {2855, 1631},
-    {540, 1330},
-    {2845, 1652},
-    {1471, 3475},
-    {3185, 3140},
-    {1580, 2597},
-    {3813, 3413},
-    {1181, 3072},
-    {3145, 549},
-    {2716, 450},
-    {4037, 2742},
-    {1594, 2396},
-    {3995, 2512},
-    {335, 501},
-    {4223, 264},
-    {509, 1505},
-    {4591, 1078},
-    {167, 1701},
-    {3072, 3845},
-    {3499, 3776},
-    {4368, 1262},
-    {2136, 1937},
-    {4362, 2042},
-    {1027, 3813},
-    {4164, 3658},
-    {896, 2914},
-    {2665, 1549},
-    {2372, 1091},
-    {4259, 2645},
-    {3823, 2557},
-    {2862, 799},
-    {400, 227},
-    {2906, 524},
-    {1498, 2489},
-    {3114, 2446},
-    {1711, 3381},
-    {4042, 2866},
-    {815, 3197},
-    {3635, 1810},
-    {2920, 1895},
-    {3804, 3434},
-    {1527, 3806},
-    {3799, 3629},
-    {413, 1948},
-    {4696, 2016},
-    {260, 836},
-    {2912, 492},
-    {1975, 2184},
-    {4693, 3462},
-    {3998, 3336},
-    {2700, 1779},
-    {342, 1461},
-    {2715, 1518},
-    {1621, 3380},
-    {3632, 3229},
-    {1434, 2488},
-    {1962, 2984},
-    {2917, 3494},
-    {373, 2125},
-    {850, 2039},
-    {2342, 3148},
-    {4706, 3680},
-    {2304, 3758},
-    {3117, 2111},
-    {1499, 1899},
-    {3540, 970},
-    {2127, 2306},
-    {3064, 3691},
-    {200, 1356},
-    {989, 1256},
-    {2211, 3759},
-    {4576, 3484},
-    {2177, 3149},
-    {3250, 1337},
-    {1352, 1658},
-    {3409, 45},
-    {411, 1431},
-    {4269, 775},
-    {2385, 2245},
-    {1640, 2335},
-    {330, 1105},
-    {2673, 517},
-    {296, 225},
-    {4038, 2406},
-    {1135, 2462},
-    {3881, 3256},
-    {3349, 3207},
-    {1803, 2854},
-    {3745, 234},
-    {4430, 80},
-    {3433, 2954},
-    {1113, 2637},
-    {3410, 2269},
-    {2102, 156},
-    {2599, 597},
-    {2176, 1209},
-    {3678, 1711},
-    {1046, 1067},
-    {3273, 2513},
-    {2549, 2583},
-    {4187, 815},
-    {1740, 169},
-    {4156, 543},
-    {159, 2639},
-    {4348, 2229},
-    {663, 3457},
-    {2628, 2564},
-    {2251, 3880},
-    {4426, 1642},
-    {3743, 1541},
-    {2992, 3575},
-    {694, 3272},
-    {2987, 3371},
-    {1327, 1601},
-    {3332, 1406},
-    {1727, 375},
-    {3561, 2113},
-    {1427, 606},
-    {3949, 3030},
-    {4646, 2947},
-    {3206, 94},
-    {752, 887},
-    {3174, 1010},
-    {2450, 2985},
-    {2843, 2848},
-    {1944, 3727},
-    {3756, 441},
-    {1085, 2124},
-    {3299, 3488},
-    {2575, 3420},
-    {4122, 1859},
-    {1830, 1350},
-    {4128, 1616},
-    {63, 3356},
-    {4468, 3295},
-    {571, 2529},
-    {2990, 333},
-    {2026, 2305},
-    {4513, 717},
-    {4101, 814},
-    {2633, 2586},
-    {76, 2999},
-    {2600, 2811},
-    {1871, 883},
-    {3408, 972},
-    {1351, 1901},
-    {1660, 1490},
-    {3188, 1136},
-    {1239, 2674},
-    {504, 2534},
-    {1417, 736},
-    {3862, 272},
-    {1442, 459},
-    {2800, 2482},
-    {2409, 2393},
-    {2723, 3418},
-    {3200, 3774},
-    {1652, 2570},
-    {3870, 1155},
-    {4304, 1076},
-    {3565, 611},
-    {1272, 2796},
-    {3549, 3012},
-    {1926, 981},
-    {2771, 940},
-    {2320, 2054},
-    {3361, 3164},
-    {1797, 2793},
-    {3738, 312},
-    {4422, 179},
-    {3424, 3013},
-    {1127, 1859},
-    {3419, 2325},
-    {2089, 60},
-    {2608, 662},
-    {2192, 1281},
-    {3978, 237},
-    {707, 1799},
-    {3531, 3208},
-    {2820, 3283},
-    {3914, 2180},
-    {1483, 1527},
-    {3893, 1442},
-    {529, 3221},
-    {4664, 3388},
-    {307, 1675},
-    {2138, 2244},
-    {3053, 1675},
-    {188, 1430},
-    {980, 1320},
-    {2201, 3805},
-    {4588, 1265},
-    {2191, 3191},
-    {3238, 1265},
-    {1362, 1729},
-    {3420, 148},
-    {103, 1},
-    {4483, 2044},
-    {2029, 3401},
-    {1285, 1482},
-    {679, 1947},
-    {3009, 1},
-    {677, 1703},
-    {3784, 3438},
-    {890, 3174},
-    {4170, 2688},
-    {1369, 3347},
-    {3490, 3034},
-    {993, 611},
-    {202, 502},
-    {1754, 2770},
-    {4176, 2349},
-    {1717, 2547},
-    {2504, 451},
-    {2112, 333},
-    {2973, 1594},
-    {2336, 982},
-    {2697, 1650},
-    {456, 1},
-    {1197, 3811},
-    {1969, 1315},
-    {4251, 1880},
-    {1951, 2092},
-    {3601, 3775},
-    {1582, 3699},
-    {3180, 2978},
-    {117, 1609},
-    {4613, 1154},
-    {2152, 2567},
-    {1387, 2490},
-    {560, 712},
-    {3023, 330},
-    {583, 434},
-    {3651, 2558},
-    {965, 2363},
-    {4141, 3335},
-    {1748, 2792},
-    {3261, 3163},
-    {1047, 1855},
-    {611, 1946},
-    {1374, 3476},
-    {3686, 3770},
-    {1361, 3668},
-    {3038, 1893},
-    {2194, 2059},
-    {2609, 943},
-    {3500, 1241},
-    {1367, 826},
-    {4190, 2443},
-    {4589, 2295},
-    {3274, 1049},
-    {979, 567},
-    {3258, 145},
-    {2235, 2216},
-    {3056, 2662},
-    {2018, 3189},
-    {1358, 3559},
-    {3504, 2356},
-    {0, 2343},
+    {0, 1521},
+    {0, 1210},
+    {0, 2583},
+    {0, 2473},
+    {0, 3754},
+    {0, 2485},
+    {0, 3870},
+    {0, 1690},
+    {0, 1541},
+    {0, 1041},
+    {0, 2576},
+    {0, 3124},
+    {0, 2750},
+    {0, 1792},
+    {0, 2422},
+    {0, 1914},
+    {0, 3346},
+    {0, 343},
+    {0, 3154},
+    {0, 1896},
+    {0, 2718},
+    {0, 3641},
+    {0, 2414},
+    {0, 1430},
+    {0, 2769},
     {0, 1342},
-    {0, 3888},
-    {0, 3276},
-    {0, 1580},
-    {0, 2787},
-    {0, 625},
-    {0, 903},
-    {0, 2972},
-    {0, 324},
-    {0, 3160},
-    {0, 2135},
-    {0, 1369},
-    {0, 3341},
-    {0, 3767},
-    {0, 1167},
-    {0, 2322},
+    {0, 3862},
+    {0, 795},
+    {0, 3682},
+    {0, 1303},
+    {0, 2389},
+    {0, 419},
+    {0, 2077},
     {0, 3004},
-    {0, 934},
-    {0, 545},
-    {0, 3414},
-    {0, 1959},
-    {0, 3898},
-    {0, 3285},
-    {0, 1599},
-    {0, 1216},
-    {0, 2290},
-    {0, 1033},
-    {0, 126},
-    {0, 2640},
-    {0, 3260},
-    {0, 135},
-    {0, 3112},
-    {0, 2452},
-    {0, 515},
-    {0, 1508},
-    {2919, 2535},
-    {3633, 1665},
-    {0, 2580},
-    {0, 33},
-    {0, 728},
-    {0, 3675},
-    {0, 1623},
-    {0, 1864},
-    {0, 3918},
-    {0, 1943},
-    {0, 3404},
-    {0, 3598},
-    {0, 2187},
-    {0, 54},
-    {0, 3297},
-    {0, 2086},
-    {0, 1310},
-    {0, 3489},
-    {0, 975},
-    {0, 3910},
-    {0, 1312},
-    {0, 2089},
-    {0, 3689},
-    {0, 3863},
-    {0, 1053},
-    {0, 2441},
-    {0, 3105},
-    {0, 780},
-    {0, 2006},
-    {0, 3097},
-    {0, 117},
-    {0, 1027},
-    {0, 2851},
-    {0, 3648},
-    {0, 740},
-    {0, 2672},
-    {0, 2879},
-    {0, 1071},
-    {0, 669},
-    {0, 1554},
-    {2143, 1554},
-    {0, 129},
-    {0, 2615},
-    {0, 48},
-    {0, 603},
-    {0, 2754},
-    {0, 1904},
-    {0, 3325},
-    {0, 3536},
-    {0, 977},
-    {0, 1796},
-    {0, 635},
-    {0, 2316},
-    {0, 236},
-    {0, 2952},
-    {0, 2266},
-    {0, 599},
-    {0, 1820},
-    {0, 2816},
-    {0, 379},
-    {0, 674},
-    {0, 3019},
-    {0, 1562},
-    {0, 2598},
-    {0, 1645},
-    {0, 673},
-    {0, 357},
-    {0, 376},
-    {0, 2328},
-    {0, 3372},
-    {0, 2673},
-    {0, 3791},
-    {0, 1491},
-    {0, 3647},
+    {0, 1650},
+    {0, 3052},
+    {0, 92},
+    {0, 3507},
+    {0, 377},
+    {0, 3083},
+    {0, 1966},
+    {0, 3051},
+    {0, 3530},
+    {0, 627},
+    {0, 3808},
+    {0, 460},
+    {0, 2813},
+    {0, 2017},
+    {2202, 2528},
+    {4809, 1},
+    {4796, 1},
+    {4792, 1},
+    {4808, 1},
+    {4807, 1},
+    {4794, 1},
+    {4824, 1},
+    {4823, 1},
+    {4814, 1},
+    {4782, 1},
+    {4789, 1},
+    {4804, 1},
+    {4786, 1},
+    {4790, 1},
+    {4802, 1},
+    {4819, 1},
+    {4800, 1},
+    {4821, 1},
+    {5004, 1},
+    {4899, 1},
+    {4854, 1},
+    {4875, 1},
+    {5125, 1},
+    {5124, 1},
+    {5062, 1},
+    {4903, 1},
+    {5100, 1},
+    {5046, 1},
+    {4943, 1},
+    {5098, 1},
+    {4842, 1},
+    {4892, 1},
+    {4932, 1},
+    {4857, 1},
+    {4879, 1},
+    {5073, 1},
+    {5109, 1},
+    {4890, 1},
+    {4891, 1},
+    {4835, 1},
+    {4827, 1},
+    {4788, 1},
+    {4785, 1},
+    {4806, 1},
+    {1202, 1},
+    {2942, 1},
+    {3442, 1},
+    {1410, 1},
+    {1778, 1},
+    {4939, 1},
+    {4936, 1},
+    {5034, 1},
+    {4801, 1},
+    {4778, 1},
+    {4813, 1},
+    {4815, 1},
+    {4818, 1},
+    {4787, 1},
+    {4273, 1544},
+    {4610, 2953},
+    {1651, 275},
+    {1615, 3410},
+    {1387, 1},
+    {5106, 1},
+    {895, 1},
+    {5105, 1},
+    {2505, 1},
+    {5111, 1},
+    {4803, 1},
+    {4960, 1},
+    {4981, 1},
+    {4872, 1},
+    {4923, 1},
+    {4908, 1},
+    {4959, 1},
+    {4853, 1},
+    {2284, 1},
+    {4885, 1},
+    {4980, 1},
+    {4925, 1},
+    {3386, 1},
+    {4831, 1},
+    {576, 1},
+    {4766, 1},
+    {4777, 1},
+    {4564, 1522},
+    {107, 3023},
+    {526, 1608},
+    {3396, 3616},
+    {3340, 1073},
+    {3180, 3794},
+    {1443, 1645},
+    {3330, 2498},
+    {5016, 1},
+    {4900, 1},
+    {5045, 1},
+    {4783, 1},
+    {4759, 1},
+    {5013, 1},
+    {2776, 1},
+    {2194, 1},
+    {2459, 538},
+    {4121, 2768},
+    {3908, 2956},
+    {5114, 1},
+    {5116, 1},
+    {5061, 1},
+    {5052, 1},
+    {4858, 1},
+    {4310, 2129},
+    {894, 2902},
+    {4911, 1},
+    {784, 2819},
+    {2512, 976},
+    {782, 1571},
+    {4448, 2618},
+    {4913, 1},
+    {4965, 1},
+    {5024, 1},
+    {1586, 1},
+    {2867, 1},
+    {3502, 1},
+    {3682, 1052},
+    {971, 3860},
+    {5055, 1},
+    {266, 1},
+    {4868, 1},
+    {4910, 1},
+    {2620, 1},
+    {2221, 1},
+    {903, 1},
+    {5051, 1},
+    {4399, 1},
+    {4825, 1},
+    {4769, 1},
+    {5089, 1},
+    {1476, 1},
+    {4998, 1},
+    {2209, 1},
+    {1390, 1},
+    {3081, 1},
+    {145, 1},
+    {5094, 1},
+    {4975, 1},
+    {1933, 1},
+    {3347, 1},
+    {3586, 1},
+    {4763, 1},
+    {4893, 1},
+    {1805, 1},
+    {3383, 1},
+    {1797, 1},
+    {4679, 1},
+    {4594, 205},
+    {4820, 1},
+    {4816, 1},
+    {2485, 51},
+    {4795, 1},
+    {4781, 1},
+    {1423, 576},
+    {4267, 2740},
+    {3373, 3895},
+    {4793, 1},
+    {5041, 1},
+    {4876, 1},
+    {3024, 1718},
+    {4828, 1},
+    {1606, 2699},
+    {4919, 1},
+    {2727, 3141},
+    {4889, 1},
+    {4145, 1775},
+    {4886, 1},
+    {4120, 3858},
+    {4362, 1772},
+    {4822, 1},
+    {4784, 1},
+    {3067, 2649},
+    {4811, 1},
+    {2718, 2397},
+    {2103, 708},
+    {2516, 3688},
+    {4127, 777},
+    {2379, 1287},
+    {353, 1318},
+    {5096, 1},
+    {4954, 1},
+    {2376, 3190},
+    {4841, 1},
+    {1286, 1239},
+    {4861, 1},
+    {2094, 1177},
+    {4966, 1},
+    {1193, 2596},
+    {4873, 1},
+    {3572, 3893},
+    {5044, 1},
+    {4940, 1},
+    {2192, 2416},
+    {4922, 1},
+    {413, 1},
+    {0, 2793},
+    {0, 1773},
+    {0, 3271},
+    {0, 121},
+    {0, 3306},
+    {0, 2824},
+    {0, 1872},
+    {0, 2233},
+    {0, 1726},
+    {0, 3540},
+    {0, 49},
+    {0, 3304},
+    {0, 1743},
+    {0, 2856},
+    {0, 1644},
+    {0, 1196},
+    {0, 3928},
+    {0, 459},
+    {0, 3807},
+    {0, 1398},
+    {0, 2507},
+    {0, 1591},
+    {0, 3836},
+    {0, 1082},
+    {0, 921},
+    {0, 1413},
+    {0, 2391},
+    {0, 1711},
+    {0, 2215},
+    {0, 1208},
+    {0, 3559},
+    {0, 891},
+    {0, 2265},
+    {0, 1438},
+    {0, 2814},
+    {0, 3321},
+    {0, 344},
+    {0, 3596},
+    {0, 3050},
+    {0, 3192},
+    {3482, 551},
+    {0, 2748},
+    {0, 1457},
+    {0, 2874},
+    {0, 392},
+    {0, 3326},
+    {0, 95},
+    {4907, 1},
+    {3968, 1},
+    {5112, 1},
+    {2451, 1},
+    {5037, 1},
+    {4534, 1},
+    {4956, 1},
+    {406, 1},
+    {4896, 1},
+    {3235, 1},
+    {5060, 1},
+    {947, 1},
+    {4988, 1},
+    {4481, 1},
+    {4948, 1},
+    {1070, 1},
+    {4921, 1},
+    {4880, 1},
+    {2950, 1},
+    {2821, 1},
+    {4930, 1},
+    {2916, 1},
+    {0, 2058},
+    {0, 1300},
+    {0, 1595},
+    {0, 896},
+    {0, 3203},
+    {0, 772},
+    {0, 2568},
+    {0, 1346},
+    {0, 2383},
+    {0, 742},
+    {0, 3677},
+    {0, 1445},
+    {0, 809},
+    {0, 3649},
+    {0, 90},
+    {0, 551},
+    {0, 1654},
+    {0, 2251},
+    {0, 1450},
+    {0, 3569},
+    {0, 904},
+    {0, 2066},
+    {0, 408},
+    {0, 3354},
+    {0, 1109},
     {0, 3455},
-    {0, 1261},
-    {0, 486},
-    {0, 3459},
-    {0, 1783},
-    {0, 1519},
-    {0, 3227},
-    {0, 1657},
-    {0, 2439},
-    {0, 3588},
-    {0, 1405},
-    {0, 3378},
-    {0, 3254},
-    {0, 1304},
-    {0, 47},
-    {0, 2585},
-    {0, 2767},
-    {0, 1919},
-    {3270, 7},
-    {987, 184},
-    {3266, 191},
-    {0, 3897},
-    {4667, 1693},
-    {225, 571},
-    {898, 728},
-    {4183, 2381},
-    {1256, 2980},
-    {3866, 2323},
-    {3363, 3573},
-    {0, 1553},
-    {0, 366},
-    {0, 2100},
-    {0, 619},
-    {0, 3021},
-    {0, 2938},
-    {0, 77},
-    {0, 912},
-    {0, 991},
-    {0, 3010},
-    {0, 2820},
-    {0, 3744},
-    {0, 3652},
-    {0, 2221},
+    {0, 1798},
+    {0, 3012},
+    {0, 2021},
+    {0, 3484},
+    {0, 447},
+    {0, 1707},
+    {0, 1123},
+    {0, 3880},
+    {0, 374},
+    {0, 3757},
+    {0, 1455},
+    {0, 2451},
+    {0, 1658},
+    {0, 3790},
+    {0, 1157},
+    {0, 2743},
+    {0, 3109},
+    {0, 8},
+    {0, 3684},
+    {0, 273},
+    {0, 2766},
+    {0, 217},
+    {0, 3206},
+    {962, 196},
+    {3695, 1923},
+    {4754, 158},
+    {2239, 57},
+    {2528, 154},
+    {2806, 1164},
+    {1105, 169},
+    {954, 119},
+    {706, 167},
+    {3688, 4},
+    {964, 163},
+    {2122, 115},
+    {3816, 55},
+    {4283, 22},
+    {176, 157},
+    {3101, 106},
+    {3629, 160},
+    {3468, 54},
+    {1771, 139},
+    {3624, 213},
+    {980, 150},
+    {3117, 2043},
+    {1672, 1778},
+    {1358, 2177},
+    {4331, 158},
+    {4642, 57},
+    {4542, 154},
+    {400, 278},
+    {4633, 1651},
+    {893, 873},
+    {380, 169},
+    {3889, 163},
+    {4168, 55},
+    {2389, 1181},
+    {2185, 930},
+    {2751, 2220},
+    {2076, 1465},
+    {1944, 160},
+    {3710, 139},
+    {4469, 213},
+    {674, 2722},
+    {322, 1281},
+    {3277, 76},
+    {3446, 682},
+    {3641, 341},
+    {1893, 583},
+    {3438, 27},
+    {4539, 697},
+    {1625, 258},
+    {2465, 167},
+    {2734, 54},
+    {3031, 213},
+    {1183, 76},
+    {855, 341},
+    {985, 583},
+    {3903, 351},
+    {864, 697},
+    {3156, 258},
+    {3647, 1762},
+    {525, 1042},
+    {1748, 48},
+    {4565, 3692},
+    {4069, 888},
+    {1225, 187},
+    {3014, 2562},
+    {2580, 1333},
+    {2683, 866},
+    {2152, 752},
+    {2546, 788},
+    {376, 311},
+    {3417, 1827},
+    {3033, 2790},
+    {2203, 1286},
+    {2466, 2727},
+    {4123, 597},
+    {3748, 3149},
+    {3912, 329},
+    {1003, 2691},
+    {3721, 1931},
+    {2326, 1249},
+    {4027, 743},
+    {4678, 3598},
+    {261, 340},
+    {527, 2639},
+    {3616, 1476},
+    {3085, 1725},
+    {3258, 1258},
+    {1468, 3708},
+    {3089, 677},
+    {3199, 2214},
+    {118, 67},
+    {887, 744},
+    {4061, 3319},
+    {3847, 915},
+    {2190, 94},
+    {4817, 1},
+    {4810, 1},
+    {2784, 3594},
+    {1101, 1},
+    {672, 1241},
+    {4458, 1},
+    {4718, 1404},
+    {1852, 1},
+    {1416, 864},
+    {1617, 1},
+    {3299, 1362},
+    {1411, 1},
+    {4030, 1728},
+    {2327, 1},
+    {1798, 3193},
+    {3224, 1},
+    {3574, 3308},
+    {651, 1},
+    {78, 2880},
+    {216, 1},
+    {4401, 3291},
+    {70, 1},
+    {3782, 1902},
+    {2026, 1},
+    {1478, 3246},
+    {3521, 1},
+    {3255, 3138},
+    {285, 1},
+    {425, 2723},
+    {529, 1},
+    {4668, 3116},
+    {434, 1},
+    {472, 2849},
+    {3493, 1},
+    {2958, 197},
+    {2120, 1},
+    {2396, 97},
+    {4180, 1},
+    {3675, 1745},
+    {3844, 1},
+    {914, 31},
+    {3652, 1},
+    {2646, 1831},
+    {814, 1},
+    {219, 3298},
+    {4655, 1},
+    {4391, 3204},
+    {1569, 1},
+    {1667, 2784},
+    {1796, 1},
+    {3536, 3168},
+    {1687, 1},
+    {3944, 1525},
+    {2266, 1},
+    {1926, 3839},
+    {3339, 1},
+    {3579, 3894},
+    {564, 1},
+    {106, 2631},
+    {325, 1},
+    {4433, 3925},
+    {120, 1},
+    {3198, 2120},
+    {119, 1},
+    {885, 3535},
+    {4062, 1},
+    {3846, 3396},
+    {2193, 1},
+    {2291, 2969},
+    {2394, 1},
+    {2973, 3424},
+    {2263, 1},
+    {3943, 2231},
+    {2264, 1},
+    {1924, 765},
+    {3341, 1},
+    {3578, 905},
+    {566, 1},
+    {110, 1463},
+    {328, 1},
+    {4432, 882},
+    {117, 1},
+    {1906, 825},
+    {4715, 1},
+    {3929, 2405},
+    {728, 1},
+    {1098, 2327},
+    {2878, 1},
+    {2702, 3617},
+    {2537, 1},
+    {2012, 2300},
+    {2696, 1},
+    {3496, 3054},
+    {456, 1},
+    {1192, 531},
+    {3815, 1},
+    {4109, 418},
+    {2453, 1},
+    {1996, 2007},
+    {2091, 1},
+    {2699, 359},
+    {2005, 1},
+    {766, 3240},
+    {2540, 1},
+    {3291, 1883},
+    {1867, 1},
+    {1621, 1823},
+    {4375, 1},
+    {4606, 162},
+    {4713, 1},
+    {686, 1783},
+    {4600, 1},
+    {2030, 1444},
+    {3784, 1},
+    {4393, 3646},
+    {573, 1},
+    {225, 3581},
+    {3355, 1},
+    {3381, 2258},
+    {3571, 1},
+    {1808, 3570},
+    {3372, 1},
+    {2332, 3384},
+    {4017, 1},
+    {4637, 2055},
+    {198, 1},
+    {601, 2171},
+    {3611, 1},
+    {3127, 579},
+    {3252, 1},
+    {1536, 2205},
+    {3114, 1},
+    {3159, 401},
+    {143, 1},
+    {976, 2988},
+    {4126, 1},
+    {3804, 3060},
+    {2208, 1},
+    {2222, 3515},
+    {2421, 1},
+    {2917, 3081},
+    {2248, 1},
+    {1153, 3430},
+    {2862, 1},
+    {3507, 1982},
+    {1466, 1},
+    {1845, 2115},
+    {4710, 1},
+    {4262, 515},
+    {4373, 1},
+    {278, 2139},
+    {4219, 1},
+    {1942, 1},
+    {3707, 1},
+    {4465, 1},
+    {676, 1},
+    {321, 1282},
+    {3280, 2007},
+    {0, 1253},
+    {511, 3188},
+    {3440, 1},
+    {2951, 1717},
+    {2114, 1},
+    {2427, 1877},
+    {4141, 1},
+    {3678, 245},
+    {3799, 1},
+    {943, 1840},
+    {3708, 1},
+    {1945, 1215},
+    {3709, 1},
+    {4468, 2588},
+    {675, 1},
+    {323, 2466},
+    {3278, 1},
+    {3445, 3746},
+    {3640, 1},
+    {1892, 2495},
+    {3439, 1},
+    {4487, 2538},
+    {1565, 1},
+    {1962, 997},
+    {2788, 1},
+    {2548, 1077},
+    {804, 1},
+    {1215, 1600},
+    {1032, 1},
+    {3960, 1129},
+    {1227, 1},
+    {136, 91},
+    {3181, 1},
+    {2665, 2759},
+    {2384, 1},
+    {2146, 2852},
+    {3882, 1},
+    {3981, 3296},
+    {4097, 1},
+    {1222, 2877},
+    {3969, 1},
+    {2829, 2050},
+    {1034, 1},
+    {644, 3376},
+    {4446, 1},
+    {4732, 3441},
+    {1794, 1},
+    {1431, 3029},
+    {1560, 1},
+    {3334, 3459},
+    {1439, 1},
+    {4016, 3779},
+    {2331, 1},
+    {1847, 1581},
+    {3270, 1},
+    {3511, 1652},
+    {666, 1},
+    {12, 1173},
+    {243, 1},
+    {4356, 1681},
+    {21, 1},
+    {609, 141},
+    {3633, 1},
+    {2815, 2679},
+    {2003, 1},
+    {2251, 2832},
+    {4056, 1},
+    {3810, 3262},
+    {3716, 1},
+    {742, 2800},
+    {3797, 1},
+    {3905, 3177},
+    {2179, 1},
+    {1360, 1734},
+    {3395, 1},
+    {3121, 1854},
+    {112, 1},
+    {559, 264},
+    {384, 1},
+    {4525, 1836},
+    {593, 1},
+    {1876, 58},
+    {4738, 1},
+    {3951, 2742},
+    {768, 1},
+    {1054, 2878},
+    {2900, 1},
+    {2690, 3310},
+    {2578, 1},
+    {1982, 2853},
+    {2652, 1},
+    {0, 1135},
+    {0, 2646},
+    {0, 2529},
+    {4170, 1},
+    {4021, 1},
+    {1167, 1},
+    {4167, 1},
+    {2460, 1},
+    {4164, 1},
+    {4543, 1},
+    {86, 1},
+    {388, 3070},
+    {3488, 66},
+    {3216, 3492},
+    {3120, 353},
+    {1324, 3106},
+    {3244, 1947},
+    {236, 3657},
+    {3243, 2393},
+    {2602, 1},
+    {2308, 1},
+    {2081, 1},
+    {3676, 1},
+    {4174, 1},
+    {4022, 1},
+    {2616, 1227},
+    {840, 745},
+    {260, 3604},
+    {4681, 325},
+    {4336, 3717},
+    {1600, 1506},
+    {3515, 1},
+    {1652, 1},
+    {2169, 1},
+    {3920, 1},
+    {4232, 1},
+    {421, 1},
+    {30, 1},
+    {3211, 1},
+    {3524, 549},
+    {3426, 3418},
+    {1646, 2117},
+    {3517, 2978},
+    {4652, 2684},
+    {1832, 3194},
+    {2360, 146},
+    {2640, 3715},
+    {2847, 1},
+    {1073, 1},
+    {986, 1},
+    {839, 1},
+    {3731, 1},
+    {996, 1},
+    {3637, 1},
+    {615, 1},
+    {1058, 2238},
+    {3667, 1867},
+    {3955, 2381},
+    {2298, 1038},
+    {2129, 3681},
+    {1947, 792},
+    {2569, 2346},
+    {2141, 1354},
+    {3720, 1},
+    {2075, 1},
+    {1519, 1},
+    {3560, 1},
+    {3248, 1},
+    {362, 1},
+    {4647, 2434},
+    {377, 1242},
+    {509, 3585},
+    {3437, 2313},
+    {2948, 1335},
+    {2115, 2850},
+    {3679, 1},
+    {3800, 1},
+    {940, 1},
+    {3706, 1},
+    {2599, 1},
+    {865, 1},
+    {244, 1},
+    {4662, 1},
+    {1613, 1070},
+    {1848, 764},
+    {1627, 1328},
+    {2247, 2111},
+    {1884, 1},
+    {3292, 1},
+    {3646, 1},
+    {556, 1},
+    {156, 1},
+    {318, 1},
+    {4480, 1},
+    {144, 1},
+    {3157, 1007},
+    {141, 1501},
+    {974, 2461},
+    {4129, 2135},
+    {3803, 2591},
+    {2210, 754},
+    {2223, 3889},
+    {2423, 1067},
+    {2915, 1},
+    {2246, 1305},
+    {3945, 1},
+    {2245, 1569},
+    {1883, 1},
+    {3293, 2212},
+    {3644, 1},
+    {558, 137},
+    {158, 1},
+    {320, 1944},
+    {4478, 1},
+    {142, 1919},
+    {1901, 1},
+    {4731, 71},
+    {1035, 1572},
+    {2882, 2052},
+    {2668, 1662},
+    {2544, 1767},
+    {1949, 1178},
+    {2684, 111},
+    {3433, 1677},
+    {524, 2471},
+    {1208, 1572},
+    {3834, 2052},
+    {4093, 1662},
+    {2493, 1767},
+    {1969, 1178},
+    {2149, 111},
+    {2677, 1677},
+    {1953, 2471},
+    {745, 855},
+    {2550, 3572},
+    {3350, 96},
+    {1930, 1803},
+    {1564, 823},
+    {4390, 1439},
+    {4553, 1374},
+    {4727, 398},
+    {631, 855},
+    {4566, 3572},
+    {2077, 96},
+    {3722, 1803},
+    {4371, 823},
+    {548, 1439},
+    {245, 1374},
+    {3284, 398},
+    {3408, 2027},
+    {3506, 9},
+    {1839, 445},
+    {3418, 1715},
+    {1541, 2078},
+    {4338, 3011},
+    {3746, 555},
+    {1124, 2196},
+    {845, 2027},
+    {2508, 9},
+    {3034, 445},
+    {2843, 1715},
+    {2350, 2078},
+    {3046, 3011},
+    {2930, 555},
+    {1219, 2196},
+    {499, 1},
+    {4316, 1},
+    {4571, 2952},
+    {1678, 276},
+    {1592, 3409},
+    {3185, 1},
+    {1552, 2113},
+    {257, 3536},
+    {3226, 3031},
+    {2617, 2123},
+    {2324, 1305},
+    {2066, 276},
+    {3661, 3318},
+    {4151, 369},
+    {4007, 3318},
+    {1147, 1998},
+    {4188, 3061},
+    {1898, 3612},
+    {4722, 2227},
+    {3978, 1237},
+    {1037, 1},
+    {2884, 3801},
+    {2666, 834},
+    {2559, 1569},
+    {1957, 1384},
+    {2672, 2212},
+    {952, 2227},
+    {2675, 2789},
+    {3142, 1826},
+    {1696, 2280},
+    {1442, 1},
+    {4206, 1},
+    {4751, 1},
+    {4572, 3315},
+    {1900, 1},
+    {4724, 1},
+    {3979, 2483},
+    {793, 2104},
+    {1038, 2570},
+    {2883, 137},
+    {2556, 1010},
+    {1958, 2602},
+    {2673, 1536},
+    {3957, 1},
+    {2255, 1},
+    {1873, 1},
+    {3288, 3331},
+    {3636, 1},
+    {552, 1},
+    {164, 1},
+    {314, 1},
+    {4476, 982},
+    {153, 3911},
+    {1234, 257},
+    {2920, 1919},
+    {3451, 2866},
+    {1413, 1327},
+    {1741, 2246},
+    {4497, 560},
+    {138, 2778},
+    {4484, 1833},
+    {3317, 2180},
+    {727, 1},
+    {3930, 948},
+    {3711, 3340},
+    {2049, 1944},
+    {2435, 2909},
+    {2257, 71},
+    {2824, 1833},
+    {2415, 608},
+    {4335, 3873},
+    {2063, 291},
+    {2893, 291},
+    {396, 291},
+    {3755, 1524},
+    {215, 3558},
+    {2175, 2},
+    {2607, 2},
+    {166, 2},
+    {336, 1844},
+    {649, 2364},
+    {3170, 3642},
+    {3356, 719},
+    {2689, 2090},
+    {2132, 183},
+    {4596, 1124},
+    {4292, 3464},
+    {1385, 1791},
+    {3464, 2260},
+    {3165, 360},
+    {77, 167},
+    {4591, 265},
+    {607, 350},
+    {592, 1141},
+    {3503, 387},
+    {2869, 529},
+    {2041, 1546},
+    {2340, 567},
+    {3924, 1248},
+    {3896, 454},
+    {3724, 109},
+    {861, 1821},
+    {3910, 22},
+    {2653, 360},
+    {968, 206},
+    {147, 89},
+    {4601, 21},
+    {4302, 265},
+    {1392, 350},
+    {1889, 1141},
+    {1781, 387},
+    {3455, 529},
+    {1869, 1546},
+    {4161, 567},
+    {2463, 1248},
+    {1631, 454},
+    {3074, 109},
+    {3420, 1821},
+    {272, 196},
+    {25, 154},
+    {4264, 157},
+    {238, 212},
+    {3239, 278},
+    {241, 119},
+    {870, 163},
+    {4047, 115},
+    {3727, 55},
+    {1992, 22},
+    {2454, 160},
+    {2333, 80},
+    {2858, 139},
+    {1648, 1708},
+    {749, 564},
+    {3791, 3395},
+    {427, 48},
+    {3792, 806},
+    {479, 93},
+    {131, 3584},
+    {3069, 1651},
+    {3431, 1451},
+    {89, 169},
+    {765, 119},
+    {113, 119},
+    {2968, 2056},
+    {187, 167},
+    {751, 115},
+    {268, 115},
+    {76, 22},
+    {313, 1965},
+    {379, 160},
+    {42, 397},
+    {394, 54},
+    {2919, 116},
+    {1233, 1729},
+    {502, 2697},
+    {983, 67},
+    {1585, 63},
+    {4158, 163},
+    {2473, 2563},
+    {729, 158},
+    {486, 154},
+    {270, 154},
+    {18, 187},
+    {0, 884},
+    {253, 55},
+    {599, 157},
+    {4237, 557},
+    {3915, 3472},
+    {1314, 956},
+    {987, 1704},
+    {46, 167},
+    {3038, 2156},
+    {175, 15},
+    {1110, 583},
+    {1276, 583},
+    {1068, 15},
+    {628, 571},
+    {346, 57},
+    {830, 57},
+    {258, 4},
+    {1252, 3428},
+    {4013, 528},
+    {1768, 1255},
+    {4563, 736},
+    {4098, 3601},
+    {916, 332},
+    {1214, 3730},
+    {2997, 1481},
+    {2552, 2426},
+    {2659, 1261},
+    {2121, 3705},
+    {2588, 684},
+    {710, 1841},
+    {2586, 289},
+    {3327, 3283},
+    {1918, 798},
+    {1590, 167},
+    {4416, 1701},
+    {4570, 2674},
+    {4750, 1862},
+    {639, 76},
+    {4560, 240},
+    {1766, 2497},
+    {4561, 1102},
+    {4096, 1054},
+    {919, 212},
+    {1212, 1170},
+    {3001, 2261},
+    {2554, 115},
+    {2663, 48},
+    {2119, 57},
+    {2585, 55},
+    {4071, 167},
+    {2431, 1701},
+    {1745, 2674},
+    {3190, 1862},
+    {3454, 76},
+    {437, 240},
+    {312, 2497},
+    {163, 1102},
+    {4301, 1054},
+    {286, 212},
+    {1050, 1170},
+    {2810, 2261},
+    {3643, 115},
+    {1624, 48},
+    {1878, 57},
+    {4675, 55},
+    {0, 3292},
+    {2212, 3276},
+    {4978, 1},
+    {5018, 1},
+    {4897, 1},
+    {210, 1},
+    {4648, 1},
+    {1494, 1},
+    {4477, 1},
+    {4700, 1},
+    {1834, 1},
+    {4839, 1},
+    {4989, 1},
+    {5011, 1},
+    {5097, 1},
+    {201, 1},
+    {5053, 1},
+    {2914, 1},
+    {4997, 1},
+    {1092, 1},
+    {4878, 1},
+    {1703, 1},
+    {4877, 1},
+    {4113, 1},
+    {2116, 2296},
+    {2504, 1400},
+    {2502, 2980},
+    {3303, 2041},
+    {4928, 1},
+    {2393, 1},
+    {4867, 1},
+    {3842, 1},
+    {5115, 1},
+    {2746, 1},
+    {4914, 1},
+    {2956, 1},
+    {4971, 1},
+    {2595, 1},
+    {4898, 1},
+    {247, 1},
+    {5082, 1},
+    {5035, 1},
+    {920, 1},
+    {1213, 1},
+    {3002, 1},
+    {2553, 1},
+    {2662, 1},
+    {5095, 1},
+    {4976, 1},
+    {3735, 1},
+    {2068, 1},
+    {5092, 1},
+    {5091, 1},
+    {3232, 1},
+    {341, 1},
+    {4938, 1},
+    {5113, 1},
+    {5074, 1},
+    {4905, 1},
+    {629, 1},
+    {4431, 1},
+    {5030, 1},
+    {5077, 1},
+    {1440, 1},
+    {1587, 1},
+    {5022, 1},
+    {4871, 1},
+    {4291, 1},
+    {1434, 1},
+    {4937, 1},
+    {4953, 1},
+    {5059, 1},
+    {5110, 1},
+    {5108, 1},
+    {5039, 1},
+    {735, 1},
+    {975, 1},
+    {3814, 1},
+    {717, 1},
+    {5021, 1},
+    {5026, 1},
+    {4979, 1},
+    {5090, 1},
+    {2832, 1},
+    {2411, 1},
+    {4626, 1},
+    {1858, 1},
+    {3736, 1},
+    {992, 1},
+    {2767, 1},
+    {994, 1},
+    {2204, 952},
+    {1384, 641},
+    {2996, 206},
+    {2181, 89},
+    {2492, 21},
+    {4094, 265},
+    {3774, 350},
+    {3885, 1141},
+    {1019, 387},
+    {3770, 529},
+    {2535, 1546},
+    {769, 3577},
+    {350, 702},
+    {4739, 3235},
+    {4426, 804},
+    {1502, 2548},
+    {1709, 1390},
+    {1908, 2309},
+    {3588, 832},
+    {1721, 3613},
+    {4048, 3064},
+    {2305, 3452},
+    {1822, 540},
+    {3245, 3769},
+    {3547, 406},
+    {626, 2848},
+    {61, 2002},
+    {196, 3093},
+    {4385, 362},
+    {85, 3538},
+    {3077, 2499},
+    {87, 3760},
+    {1016, 953},
+    {4165, 3474},
+    {3884, 1126},
+    {2144, 2298},
+    {2316, 1642},
+    {2494, 2546},
+    {3011, 1079},
+    {2310, 3837},
+    {4049, 1937},
+    {2307, 269},
+    {1824, 2},
+    {3242, 2},
+    {3548, 2},
+    {621, 2},
+    {57, 2},
+    {193, 2},
+    {4387, 2},
+    {88, 2},
+    {1800, 2},
+    {4680, 2},
+    {4029, 2},
+    {841, 2},
+    {1126, 2},
+    {2822, 2},
+    {2735, 2},
+    {2644, 2},
+    {2050, 2},
+    {2723, 2},
+    {3376, 2},
+    {420, 2},
+    {1318, 3085},
+    {3919, 593},
+    {4142, 703},
+    {2425, 1288},
+    {2022, 1415},
+    {2207, 1502},
+    {2728, 994},
+    {2047, 365},
+    {815, 781},
+    {2641, 1262},
+    {3254, 2250},
+    {1831, 827},
+    {1475, 2369},
+    {4473, 29},
+    {4520, 3501},
+    {4683, 117},
+    {554, 2387},
+    {4500, 1310},
+    {1999, 1702},
+    {3669, 536},
+    {4422, 159},
+    {616, 3062},
+    {342, 305},
+    {3231, 1945},
+    {3499, 1889},
+    {3601, 1873},
+    {1936, 196},
+    {3478, 158},
+    {932, 48},
+    {4051, 57},
+    {4674, 154},
+    {255, 187},
+    {555, 169},
+    {3642, 119},
+    {3086, 167},
+    {3276, 4},
+    {1485, 163},
+    {3079, 115},
+    {3204, 55},
+    {105, 22},
+    {930, 157},
+    {4102, 160},
+    {3838, 397},
+    {2187, 54},
+    {2258, 80},
+    {2387, 139},
+    {2961, 213},
+    {2287, 76},
+    {1114, 150},
+    {2896, 212},
+    {3541, 19},
+    {1510, 67},
+    {1816, 196},
+    {4746, 158},
+    {4214, 48},
+    {4412, 57},
+    {232, 154},
+    {4198, 187},
+    {1983, 169},
+    {3672, 119},
+    {4438, 167},
+    {633, 4},
+    {364, 163},
+    {3253, 115},
+    {3491, 55},
+    {3612, 22},
+    {1931, 157},
+    {3483, 160},
+    {477, 397},
+    {3484, 54},
+    {2981, 80},
+    {2151, 139},
+    {2392, 213},
+    {4169, 76},
+    {3648, 150},
+    {3835, 212},
+    {892, 19},
+    {3673, 67},
+    {1985, 360},
+    {3112, 1151},
+    {4677, 326},
+    {1810, 1292},
+    {3531, 1224},
+    {1354, 1671},
+    {5063, 1},
+    {0, 381},
+    {0, 1564},
+    {0, 3117},
+    {0, 2888},
+    {0, 1570},
+    {0, 575},
+    {0, 511},
+    {0, 1334},
+    {0, 2236},
+    {0, 1679},
+    {0, 3509},
+    {0, 2581},
+    {0, 293},
+    {0, 1756},
+    {0, 2594},
+    {0, 3435},
+    {0, 2999},
+    {0, 3660},
+    {0, 916},
+    {0, 3764},
+    {0, 1992},
+    {0, 1035},
+    {0, 2721},
+    {0, 3284},
+    {0, 1019},
+    {0, 2093},
+    {0, 2092},
+    {0, 771},
+    {0, 3553},
+    {0, 1191},
+    {0, 3069},
+    {0, 3871},
+    {0, 1899},
+    {0, 101},
+    {0, 3879},
+    {0, 3001},
+    {0, 667},
+    {0, 2198},
+    {0, 3008},
+    {0, 1810},
+    {0, 3593},
+    {0, 2720},
+    {0, 1037},
+    {0, 1634},
+    {0, 2732},
+    {0, 3722},
+    {0, 1297},
+    {0, 546},
+    {0, 3724},
+    {0, 773},
+    {0, 2796},
+    {0, 862},
+    {0, 2523},
+    {0, 659},
+    {0, 2165},
+    {0, 1778},
+    {0, 3149},
+    {0, 2043},
+    {0, 1042},
+    {0, 2677},
+    {0, 3373},
+    {2206, 4},
+    {3878, 76},
+    {0, 1273},
+    {0, 596},
+    {0, 3487},
+    {0, 2336},
+    {0, 1560},
+    {0, 3111},
+    {0, 220},
+    {0, 2460},
+    {0, 3289},
+    {0, 605},
+    {0, 2382},
+    {0, 1901},
+    {0, 3815},
+    {0, 2808},
+    {0, 2088},
+    {0, 3714},
+    {0, 2843},
+    {0, 1039},
+    {0, 1849},
+    {0, 3009},
+    {0, 902},
+    {0, 1353},
+    {0, 3521},
+    {0, 2264},
+    {0, 1533},
+    {0, 3195},
+    {0, 2776},
+    {0, 1190},
+    {0, 1739},
+    {0, 2934},
     {0, 758},
-    {0, 939},
-    {0, 2691},
-    {0, 2912},
-    {0, 2896},
-    {0, 837},
-    {0, 1075},
-    {0, 1949},
-    {0, 1354},
-    {0, 718},
-    {0, 2317},
-    {0, 2391},
-    {0, 1148},
-    {0, 446},
+    {0, 507},
+    {0, 2242},
+    {0, 3503},
     {0, 295},
-    {0, 2345},
-    {0, 2532},
-    {0, 3296},
-    {0, 2123},
-    {0, 440},
-    {0, 2990},
-    {0, 3067},
-    {0, 293},
-    {0, 721},
-    {0, 1145},
-    {0, 3028},
+    {0, 2587},
+    {0, 3199},
+    {0, 1694},
+    {0, 84},
+    {0, 3365},
+    {0, 1309},
+    {0, 233},
+    {0, 2488},
+    {0, 3322},
+    {0, 625},
+    {0, 2352},
     {0, 2756},
-    {0, 3907},
-    {0, 2935},
-    {0, 3443},
-    {0, 2173},
-    {0, 2099},
-    {0, 3196},
+    {0, 1163},
+    {0, 1727},
+    {0, 2905},
+    {0, 785},
+    {0, 1855},
+    {0, 2757},
+    {0, 2846},
     {0, 3636},
-    {0, 3809},
-    {0, 2050},
-    {0, 1966},
-    {0, 1055},
-    {0, 1112},
-    {0, 1535},
-    {0, 3824},
-    {0, 3892},
-    {0, 1434},
-    {0, 1785},
-    {0, 2176},
-    {0, 3833},
-    {0, 3592},
-    {0, 3093},
-    {0, 2747},
-    {0, 3214},
-    {0, 1953},
-    {0, 1861},
-    {0, 3419},
-    {0, 3835},
-    {0, 3619},
-    {0, 1795},
-    {0, 2207},
-    {0, 737},
-    {0, 1884},
-    {0, 71},
-    {0, 2788},
-    {0, 2875},
-    {0, 624},
-    {0, 984},
-    {0, 902},
-    {0, 2800},
-    {4757, 2},
-    {4172, 1542},
-    {1716, 2170},
-    {4179, 1806},
-    {116, 3608},
-    {4373, 3860},
-    {682, 2708},
-    {3322, 3080},
-    {1825, 2045},
-    {4418, 2129},
-    {3417, 622},
-    {1088, 3605},
-    {3426, 3842},
-    {146, 1914},
-    {2621, 1780},
-    {2198, 1123},
-    {4359, 2101},
-    {605, 617},
-    {2521, 3035},
-    {3254, 2948},
-    {2693, 89},
-    {2190, 875},
-    {4594, 1003},
-    {923, 2993},
-    {3684, 2833},
-    {1125, 3737},
-    {3996, 2559},
-    {841, 3882},
-    {3625, 1648},
-    {2914, 1552},
-    {3796, 3568},
-    {1501, 3263},
-    {3810, 3361},
-    {403, 1610},
-    {4709, 1399},
-    {279, 388},
-    {3240, 3773},
-    {1761, 2569},
-    {3718, 1157},
-    {4404, 1073},
-    {3476, 928},
-    {1030, 115},
-    {3448, 3014},
-    {2140, 980},
-    {2471, 941},
-    {2273, 2061},
-    {4564, 310},
-    {197, 1856},
-    {3065, 3165},
-    {3486, 3230},
-    {4355, 2128},
-    {2113, 1597},
-    {4372, 1050},
-    {1018, 3267},
-    {3644, 2107},
-    {904, 2362},
-    {383, 2403},
-    {4286, 3611},
-    {2353, 1247},
-    {1614, 1015},
-    {301, 3834},
-    {2650, 3417},
-    {323, 3219},
-    {4015, 1443},
-    {1152, 1495},
-    {3911, 273},
-    {4273, 927},
-    {397, 1295},
-    {2690, 3554},
-    {3127, 3662},
-    {4756, 1668},
-    {2368, 2055},
-    {4731, 1921},
-    {839, 3701},
-    {3830, 3768},
-    {1210, 2794},
-    {4399, 650},
-    {561, 2069},
-    {2507, 3342},
-    {3248, 3466},
-    {4622, 1923},
-    {2232, 1282},
-    {4605, 1671},
-    {992, 3501},
-    {3695, 3161},
-    {1061, 2573},
-    {2921, 3400},
-    {1957, 3085},
-    {4727, 582},
-    {4043, 405},
-    {2720, 2723},
-    {356, 2428},
-    {1637, 436},
-    {3621, 242},
-    {812, 1180},
-    {871, 1731},
-    {2958, 1043},
-    {1334, 2361},
-    {1601, 2588},
-    {1079, 834},
-    {3383, 147},
-    {1060, 570},
-    {4437, 2679},
-    {4, 2258},
-    {4606, 3433},
-    {1399, 3167},
-    {3455, 2899},
-    {956, 256},
-    {158, 24},
-    {1780, 2909},
-    {1610, 2689},
-    {1151, 2218},
-    {2555, 150},
-    {2148, 527},
-    {2941, 1274},
-    {38, 346},
-    {4521, 1833},
-    {2076, 3117},
-    {1329, 3239},
-    {647, 2151},
-    {2964, 1592},
-    {634, 1394},
-    {3740, 3301},
-    {859, 3349},
-    {4201, 2351},
-    {1223, 3704},
-    {3897, 2299},
-    {1713, 676},
-    {2465, 825},
-    {738, 2600},
-    {3160, 2976},
-    {702, 2815},
-    {4641, 929},
-    {479, 994},
-    {4262, 1881},
-    {1275, 2360},
-    {3440, 3553},
-    {895, 961},
-    {68, 1463},
-    {1806, 3899},
-    {4077, 3334},
-    {1810, 3286},
-    {2572, 1412},
-    {2037, 1596},
-    {3071, 331},
-    {641, 2072},
-    {4459, 651},
-    {2303, 3039},
-    {1884, 2911},
-    {45, 23},
-    {2580, 942},
-    {3, 956},
-    {4096, 2974},
-    {1063, 2797},
-    {3696, 3772},
-    {3827, 3631},
-    {1166, 2253},
-    {3089, 784},
-    {2653, 911},
-    {4052, 2654},
-    {4069, 2867},
-    {353, 808},
-    {4271, 1038},
-    {489, 1980},
-    {1155, 1385},
-    {3833, 687},
-    {1646, 2285},
-    {2387, 2415},
-    {3101, 409},
-    {779, 344},
-    {4718, 2376},
-    {390, 2554},
-    {4320, 3275},
-    {1029, 2148},
-    {3704, 398},
-    {1782, 2962},
-    {2238, 3086},
-    {961, 343},
-    {3242, 693},
-    {927, 1179},
-    {4593, 3053},
-    {552, 2775},
-    {4453, 3886},
-    {1512, 2906},
-    {3629, 3468},
-    {848, 2192},
-    {367, 2066},
-    {1599, 1749},
-    {1567, 3784},
-    {2682, 2028},
-    {1946, 1938},
-    {2829, 1088},
-    {4537, 1130},
-    {20, 1500},
-    {2962, 3802},
-    {3388, 3920},
-    {4471, 1465},
-    {2083, 1751},
-    {1095, 2197},
-    {1126, 3854},
-    {4105, 3613},
-    {926, 3070},
-    {3039, 2724},
-    {2153, 3235},
-    {4621, 1985},
-    {4211, 1836},
-    {2506, 3397},
-    {148, 3858},
-    {2476, 3596},
-    {1749, 1761},
-    {3446, 2181},
-    {1310, 769},
-    {4137, 1927},
-    {857, 17},
-    {3379, 2764},
-    {3781, 653},
-    {1336, 949},
-    {3764, 933},
-    {681, 2824},
-    {4531, 3007},
-    {114, 3672},
-    {4336, 2375},
-    {483, 3542},
-    {2755, 1309},
-    {3172, 1475},
-    {4684, 3909},
-    {2443, 3316},
-    {4649, 3298},
-    {767, 18},
-    {3888, 1613},
-    {1133, 299},
-    {2977, 3724},
-    {2041, 2275},
-    {4495, 685},
-    {4088, 854},
-    {2615, 2622},
-    {51, 2967},
-    {2616, 2846},
-    {1843, 918},
-    {3428, 1012},
-    {1370, 1874},
-    {3774, 400},
-    {1068, 1079},
-    {3321, 3522},
-    {2597, 3398},
-    {4147, 1835},
-    {1859, 1379},
-    {4102, 1584},
-    {88, 3328},
-    {4454, 3273},
-    {553, 2552},
-    {720, 3351},
-    {3973, 3031},
-    {1445, 607},
-    {1904, 497},
-    {1206, 2772},
-    {3524, 2354},
-    {1235, 2548},
-    {4295, 437},
-    {235, 14},
-    {4753, 1578},
-    {3981, 2023},
-    {709, 568},
-    {3530, 3111},
-    {2819, 2982},
-    {2689, 1040},
-    {3909, 587},
-    {853, 828},
-    {2459, 373},
-    {1922, 1555},
-    {3779, 1042},
-    {1339, 564},
-    {3769, 138},
-    {687, 2225},
-    {3290, 2648},
-    {130, 3200},
-    {3199, 829},
-    {3871, 1302},
-    {763, 3326},
-    {936, 1376},
-    {2772, 1622},
-    {2227, 3284},
-    {1771, 3168},
-    {140, 2067},
-    {2517, 1686},
-    {129, 1291},
-    {4186, 3136},
-    {1009, 3091},
-    {3768, 2324},
-    {2300, 2594},
-    {656, 1828},
-    {646, 1572},
-    {155, 957},
-    {2073, 58},
-    {1289, 1454},
-    {2061, 3495},
-    {3429, 1683},
-    {1842, 1319},
-    {3228, 628},
-    {1023, 1498},
-    {201, 1133},
-    {1787, 2668},
-    {348, 255},
-    {962, 743},
-    {2437, 111},
-    {922, 468},
-    {1764, 2468},
-    {506, 2402},
-    {3809, 2711},
-    {324, 2920},
-    {810, 2882},
-    {781, 2185},
-    {1553, 2062},
-    {417, 3178},
-    {2897, 3665},
-    {393, 3726},
-    {3801, 2020},
-    {795, 1941},
-    {3960, 1083},
-    {2187, 2507},
-    {2544, 3114},
-    {591, 575},
-    {1042, 387},
-    {573, 1392},
-    {4358, 2438},
-    {41, 1035},
-    {1751, 211},
-    {3352, 1545},
-    {951, 830},
-    {2049, 872},
-    {1403, 3585},
-    {1032, 1734},
-    {3469, 2027},
-    {1008, 1973},
-    {747, 3539},
-    {132, 1360},
-    {2804, 53},
-    {2147, 2484},
-    {733, 2881},
-    {121, 1700},
-    {2223, 3600},
-    {3759, 542},
-    {2230, 2743},
-    {3265, 1544},
-    {1400, 1457},
-    {3373, 484},
-    {4623, 3911},
-    {481, 1641},
-    {2510, 1311},
-    {149, 1913},
-    {2474, 2088},
-    {1752, 3730},
-    {3447, 84},
-    {1311, 2699},
-    {1992, 1897},
-    {1039, 3044},
-    {4075, 3182},
-    {315, 1663},
-    {2636, 1308},
-    {1595, 3123},
-    {3583, 3490},
-    {1449, 2313},
-    {4374, 3250},
-    {597, 2706},
-    {2545, 151},
-    {3272, 361},
-    {4583, 3108},
-    {2203, 188},
-    {4561, 2442},
-    {3646, 509},
-    {1693, 1214},
-    {3157, 859},
-    {1229, 2426},
-    {499, 2294},
-    {1491, 1025},
-    {2537, 1995},
-    {2420, 2625},
-    {2637, 3095},
-    {1643, 466},
-    {1574, 122},
-    {23, 2235},
-    {4717, 583},
-    {385, 178},
-    {4318, 1709},
-    {1687, 803},
-    {485, 3512},
-    {1222, 3382},
-    {1924, 1816},
-    {4342, 1398},
-    {3566, 3337},
-    {1118, 3266},
-    {3094, 2013},
-    {1330, 3729},
-    {3032, 2358},
-    {878, 1177},
-    {1873, 2283},
-    {4129, 2836},
-    {2630, 974},
-    {3020, 2120},
-    {1247, 2526},
-    {1357, 3560},
-    {1657, 1660},
-    {2395, 1483},
-    {3178, 3307},
-    {4668, 1576},
-    {1930, 8},
-    {239, 2755},
-    {1053, 634},
-    {4675, 960},
-    {2419, 914},
-    {3204, 2841},
-    {1451, 2989},
-    {1864, 3069},
-    {2765, 435},
-    {1065, 1037},
-    {2019, 493},
-    {2595, 283},
-    {2236, 1485},
-    {1881, 558},
-    {3283, 660},
-    {299, 3045},
-    {642, 2923},
-    {1325, 10},
-    {3786, 932},
-    {1321, 950},
-    {2996, 2981},
-    {4328, 3461},
-    {1262, 1733},
-    {3962, 1264},
-    {788, 536},
-    {3604, 1587},
-    {1538, 1173},
-    {4072, 1173},
-    {587, 3710},
-    {3028, 3755},
-    {1376, 2063},
-    {3218, 1889},
-    {1847, 986},
-    {1953, 2359},
-    {4824, 2},
-    {1136, 382},
-    {4040, 318},
-    {778, 1547},
-    {3124, 700},
-    {1603, 1288},
-    {3839, 3549},
-    {4274, 3651},
-    {3599, 1681},
-    {1173, 2065},
-    {3592, 1932},
-    {1972, 420},
-    {2657, 3777},
-    {2433, 2791},
-    {1552, 3192},
-    {3589, 2870},
-    {804, 220},
-    {326, 75},
-    {1636, 2939},
-    {4066, 2652},
-    {1613, 2248},
-    {2724, 193},
-    {1980, 561},
-    {2801, 1244},
-    {3574, 1840},
-    {4060, 2838},
-    {4744, 2709},
-    {3098, 410},
-    {782, 1181},
-    {3100, 696},
-    {2895, 3037},
-    {3449, 1589},
-    {1406, 1175},
-    {4608, 2469},
-    {3220, 695},
-    {3237, 406},
-    {2193, 2519},
-    {3037, 2357},
-    {2091, 3345},
-    {3789, 2684},
-    {1204, 3787},
-    {3137, 1515},
-    {2704, 1684},
-    {4011, 3660},
-    {1565, 3170},
-    {4023, 1736},
-    {306, 1736},
-    {4241, 458},
-    {526, 458},
-    {2271, 458},
-    {2591, 458},
-    {631, 1466},
-    {1064, 1466},
-    {2057, 1466},
-    {4451, 1466},
-    {2092, 1479},
-    {3418, 1479},
-    {1855, 1479},
-    {3236, 1479},
-    {554, 1210},
-    {4401, 1210},
-    {2221, 1210},
-    {1762, 1210},
-    {119, 1473},
-    {2475, 1473},
-    {150, 1473},
-    {4169, 1473},
-    {1022, 235},
-    {3783, 235},
-    {1840, 235},
-    {3310, 235},
-    {1057, 654},
-    {624, 654},
-    {1307, 654},
-    {3762, 654},
-    {1337, 9},
-    {2975, 9},
-    {2297, 9},
-    {2505, 9},
-    {1906, 1764},
-    {2826, 1764},
-    {218, 1764},
-    {719, 1764},
-    {2436, 1839},
-    {4650, 1839},
-    {2438, 1839},
-    {3181, 1839},
-    {1478, 724},
-    {3603, 724},
-    {684, 724},
-    {4419, 724},
-    {2261, 121},
-    {1823, 121},
-    {99, 121},
-    {2620, 121},
-    {49, 42},
-    {4140, 42},
-    {1093, 614},
-    {3649, 614},
-    {1298, 1174},
-    {3391, 1174},
-    {863, 3733},
-    {25, 3733},
-    {1852, 1380},
-    {4107, 1380},
-    {1857, 2144},
-    {2607, 2144},
-    {2088, 670},
-    {3036, 670},
-    {1790, 670},
-    {3214, 670},
-    {1021, 1564},
-    {569, 1564},
-    {1397, 1564},
-    {3721, 1564},
-    {1394, 1822},
-    {3074, 1822},
-    {2220, 1822},
-    {2574, 1822},
-    {3217, 1332},
-    {1775, 1332},
-    {3700, 1332},
-    {4384, 1332},
-    {3450, 659},
-    {1004, 659},
-    {3473, 112},
-    {2106, 112},
-    {2512, 112},
-    {2295, 112},
-    {3095, 2949},
-    {1629, 2949},
-    {3825, 2102},
-    {4261, 2102},
-    {3576, 2102},
-    {1143, 2102},
-    {3614, 1020},
-    {1947, 1020},
-    {2681, 1020},
-    {2463, 1020},
-    {4165, 426},
-    {982, 426},
-    {3483, 3015},
-    {3060, 3015},
-    {2768, 764},
-    {1929, 764},
-    {2886, 764},
-    {2274, 764},
-    {2583, 821},
-    {628, 821},
-    {1059, 1059},
-    {2052, 1059},
-    {4456, 157},
-    {2096, 157},
-    {3400, 2270},
-    {1880, 2669},
-    {3247, 2669},
-    {285, 772},
-    {4632, 772},
-    {1895, 3557},
-    {1435, 3557},
-    {534, 1537},
-    {2859, 1537},
-    {520, 1537},
-    {3906, 1537},
-    {749, 2121},
-    {4000, 2121},
-    {1681, 2951},
-    {3166, 2951},
-    {1212, 500},
-    {476, 500},
-    {1453, 2264},
-    {3891, 2264},
-    {1484, 559},
-    {2831, 559},
-    {2461, 109},
-    {2680, 109},
-    {1868, 2284},
-    {3286, 2284},
-    {1077, 1225},
-    {649, 1225},
-    {1331, 1225},
-    {1071, 1313},
-    {1317, 1313},
-    {2989, 1313},
-    {2281, 97},
-    {2486, 97},
-    {3302, 97},
-    {1863, 97},
-    {3754, 3318},
-    {4442, 1766},
-    {3362, 1230},
-    {3394, 1811},
-    {2023, 3217},
-    {2589, 2510},
-    {2243, 2697},
-    {3151, 136},
-    {1702, 2171},
-    {3887, 3141},
-    {4321, 947},
-    {3514, 1809},
-    {1219, 1424},
-    {3537, 1231},
-    {1885, 3403},
-    {2751, 2252},
-    {2376, 2454},
-    {4086, 31},
-    {899, 2991},
-    {3404, 448},
-    {2976, 557},
-    {3725, 2458},
-    {1283, 2314},
-    {3749, 1732},
-    {623, 618},
-    {4506, 32},
-    {204, 1666},
-    {1989, 1598},
-    {2890, 1168},
-    {300, 1521},
-    {787, 1252},
-    {2351, 520},
-    {4741, 137},
-    {2375, 421},
-    {3128, 2561},
-    {1562, 577},
-    {3538, 1057},
-    {211, 843},
-    {4676, 231},
-    {1910, 62},
-    {1452, 207},
-    {474, 3024},
-    {2807, 1566},
-    {496, 1191},
-    {3854, 311},
-    {734, 380},
-    {4070, 678},
-    {1536, 168},
-    {3611, 1958},
-    {789, 338},
-    {305, 385},
-    {1617, 2037},
-    {4047, 442},
-    {1633, 1254},
-    {2706, 1290},
-    {1998, 2339},
-    {2818, 2242},
-    {2225, 3599},
-    {2496, 930},
-    {549, 812},
-    {996, 706},
-    {2146, 952},
-    {4396, 1016},
-    {2173, 2263},
-    {3485, 789},
-    {1779, 39},
-    {3319, 19},
-    {369, 2256},
-    {4685, 848},
-    {1966, 1416},
-    {1514, 1317},
-    {453, 2855},
-    {2932, 3446},
-    {442, 3202},
-    {3841, 243},
-    {828, 99},
-    {3936, 141},
-    {1624, 386},
-    {3104, 512},
-    {1130, 2298},
-    {376, 177},
-    {1531, 209},
-    {3835, 779},
-    {1560, 1096},
-    {2913, 323},
-    {2378, 1850},
-    {2753, 3158},
-    {92, 1649},
-    {4490, 2198},
-    {2036, 1625},
-    {1287, 1529},
-    {686, 3565},
-    {3005, 2595},
-    {671, 3358},
-    {3778, 1615},
-    {893, 1381},
-    {4162, 401},
-    {4496, 1039},
-    {73, 1738},
-    {2978, 3875},
-    {3406, 3752},
-    {4410, 1230},
-    {2027, 1965},
-    {1058, 1811},
-    {4097, 3633},
-    {995, 2942},
-    {4633, 136},
-    {277, 1976},
-    {2842, 2171},
-    {3544, 3141},
-    {4294, 2015},
-    {1888, 1726},
-    {4308, 1231},
-    {1205, 3175},
-    {3948, 3403},
-    {844, 2252},
-    {2578, 3310},
-    {2289, 2748},
-    {4441, 31},
-    {3752, 275},
-    {2934, 2991},
-    {636, 448},
-    {2967, 1958},
-    {1278, 338},
-    {3314, 442},
-    {1784, 1254},
-    {1182, 1290},
-    {3811, 930},
-    {1571, 812},
-    {2311, 706},
-    {818, 952},
-    {3136, 39},
-    {845, 19},
-    {4734, 2256},
-    {464, 2577},
-    {4310, 2855},
-    {1654, 3500},
-    {3193, 2977},
-    {1246, 386},
-    {512, 579},
-    {1420, 512},
-    {3859, 2298},
-    {1438, 2595},
-    {2796, 664},
-    {2414, 63},
-    {2719, 1649},
-    {436, 476},
-    {4249, 2198},
-    {2319, 1625},
-    {1576, 3318},
-    {347, 1766},
-    {2698, 1477},
-    {361, 1230},
-    {4057, 1370},
-    {1192, 3217},
-    {3869, 2510},
-    {975, 2697},
-    {4177, 136},
-    {1350, 1124},
-    {2111, 947},
-    {1040, 1809},
-    {3489, 1424},
-    {1050, 1231},
-    {4383, 1036},
-    {199, 31},
-    {4512, 557},
-    {1645, 2458},
-    {3079, 2314},
-    {1154, 1732},
-    {410, 618},
-    {1548, 1666},
-    {3850, 1598},
-    {1544, 1168},
-    {2927, 1521},
-    {2355, 1252},
-    {2735, 520},
-    {350, 1977},
-    {4705, 137},
-    {1943, 421},
-    {1496, 2561},
-    {435, 577},
-    {2918, 1057},
-    {463, 843},
-    {3826, 62},
-    {846, 207},
-    {3950, 3024},
-    {715, 1566},
-    {3969, 1191},
-    {1446, 311},
-    {1907, 380},
-    {1209, 678},
-    {3520, 168},
-    {1230, 385},
-    {4292, 2037},
-    {237, 2339},
-    {4754, 2242},
-    {3983, 3599},
-    {711, 930},
-    {3529, 812},
-    {2814, 1016},
-    {3912, 2263},
-    {1486, 789},
-    {3895, 39},
-    {532, 1072},
-    {4662, 848},
-    {302, 1416},
-    {4146, 1317},
-    {854, 2855},
-    {3374, 243},
-    {2955, 99},
-    {3775, 141},
-    {1343, 386},
-    {3771, 2118},
-    {691, 177},
-    {4527, 209},
-    {127, 1223},
-    {3197, 323},
-    {1651, 1850},
-    {3872, 3158},
-    {4306, 1649},
-    {3567, 2134},
-    {1270, 1230},
-    {3548, 1370},
-    {1923, 136},
-    {2776, 1124},
-    {2323, 1231},
-    {585, 1036},
-    {4381, 31},
-    {2228, 1346},
-    {1772, 1252},
-    {141, 1468},
-    {2511, 1525},
-    {128, 1536},
-    {4182, 930},
-    {1010, 812},
-    {3770, 39},
-    {2301, 386},
-    {2561, 2118},
-    {639, 1649},
-    {1073, 2134},
-    {2068, 1865},
-    {4477, 1334},
-    {2066, 1626},
-    {3431, 228},
-    {1836, 495},
-    {3221, 2515},
-    {1020, 2417},
-    {3710, 3076},
-    {1788, 534},
-    {2245, 422},
-    {964, 1794},
-    {3231, 1867},
-    {918, 2493},
-    {4587, 508},
-    {558, 261},
-    {4445, 1506},
-    {328, 1069},
-    {4739, 851},
-    {2003, 899},
-    {1551, 1322},
-    {416, 1259},
-    {2901, 1964},
-    {395, 1647},
-    {3807, 1377},
-    {793, 1888},
-    {3957, 2926},
-    {2183, 1525},
-    {2541, 1117},
-    {593, 2425},
-    {1043, 2550},
-    {2115, 767},
-    {4356, 228},
-    {2131, 495},
-    {3442, 2515},
-    {1755, 2417},
-    {3356, 3076},
-    {960, 534},
-    {4200, 422},
-    {1401, 1794},
-    {2164, 1867},
-    {1028, 2493},
-    {3475, 508},
-    {1011, 261},
-    {4371, 1506},
-    {123, 1069},
-    {4526, 851},
-    {3816, 899},
-    {1178, 1322},
-    {3142, 1259},
-    {2712, 1964},
-    {4025, 1647},
-    {1596, 1377},
-    {4008, 1888},
-    {317, 2926},
-    {4236, 1525},
-    {515, 1117},
-    {1188, 2425},
-    {3803, 2550},
-    {1568, 767},
-    {2308, 1377},
-    {816, 1888},
-    {3138, 2926},
-    {849, 1525},
-    {4738, 1468},
-    {462, 1536},
-    {4313, 231},
-    {1045, 1598},
-    {3675, 1168},
-    {1726, 1521},
-    {2182, 1377},
-    {970, 1888},
-    {3264, 2926},
-    {984, 231},
-    {4602, 62},
-    {619, 1108},
-    {4436, 1108},
-    {4099, 719},
-    {983, 1845},
-    {3063, 1845},
-    {2126, 332},
-    {4559, 2829},
-    {4157, 2714},
-    {2528, 416},
-    {176, 1186},
-    {2547, 699},
-    {1757, 699},
-    {3509, 3033},
-    {1292, 3558},
-    {4079, 2895},
-    {909, 3173},
-    {3412, 1777},
-    {2985, 1934},
-    {3731, 1934},
-    {1277, 3781},
-    {3744, 1978},
-    {637, 1978},
-    {4500, 811},
-    {190, 811},
-    {4299, 1467},
-    {530, 751},
-    {2763, 751},
-    {3175, 2385},
-    {4629, 456},
-    {2398, 456},
-    {4644, 266},
-    {710, 266},
-    {3876, 2509},
-    {1203, 866},
-    {2970, 866},
-    {2048, 1203},
-    {4535, 1203},
-    {4126, 3714},
-    {2579, 1748},
-    {44, 2011},
-    {2576, 1996},
-    {1816, 1996},
-    {3368, 3819},
-    {1393, 2853},
-    {3735, 3391},
-    {1106, 3099},
-    {3323, 417},
-    {2603, 417},
-    {4078, 1327},
-    {1807, 2419},
-    {4100, 620},
-    {7, 474},
-    {4434, 229},
-    {618, 1357},
-    {461, 1357},
-    {4228, 715},
-    {2331, 715},
-    {1588, 1152},
-    {359, 1152},
-    {2717, 449},
-    {349, 302},
-    {4064, 2352},
-    {1187, 2524},
-    {3860, 3299},
-    {4237, 3650},
-    {451, 2227},
-    {4689, 2681},
-    {2327, 2904},
-    {4728, 2892},
-    {785, 831},
-    {3817, 1080},
-    {1273, 1942},
-    {4354, 1942},
-    {609, 2921},
-    {2529, 489},
-    {3262, 658},
-    {4565, 2214},
-    {2184, 2214},
-    {4584, 2683},
-    {920, 566},
-    {3693, 185},
-    {1121, 1698},
-    {2884, 419},
-    {2000, 2138},
-    {4730, 3515},
-    {4046, 3392},
-    {2635, 1843},
-    {310, 1390},
-    {2688, 1590},
-    {1575, 3319},
-    {3608, 3280},
-    {1488, 2545},
-    {891, 2599},
-    {4095, 3747},
-    {1276, 1563},
-    {2022, 1723},
-    {1092, 3706},
-    {3414, 3142},
-    {1122, 3505},
-    {4444, 1667},
-    {97, 1327},
-    {4585, 620},
-    {1359, 11},
-    {3503, 1933},
-    {968, 3146},
-    {173, 3177},
-    {1723, 1285},
-    {4163, 337},
-    {1743, 1285},
-    {2468, 3146},
-    {2142, 3474},
-    {3004, 2326},
-    {58, 3247},
-    {4507, 2710},
-    {2024, 103},
-    {1279, 337},
-    {667, 2011},
-    {2983, 1467},
-    {690, 2433},
-    {3772, 274},
-    {1236, 1634},
-    {3847, 90},
-    {4341, 776},
-    {472, 1432},
-    {2737, 3638},
-    {3159, 3572},
-    {4670, 1540},
-    {2460, 2168},
-    {4665, 1802},
-    {764, 3604},
-    {3890, 3867},
-    {1144, 2702},
-    {4474, 507},
-    {953, 1607},
-    {4199, 1159},
-    {1404, 1},
-    {2167, 1272},
-    {1033, 530},
-    {3472, 289},
-    {1003, 428},
-    {4366, 2555},
-    {137, 2372},
-    {4529, 1},
-    {1626, 1},
-    {2366, 701},
-    {797, 2496},
-    {796, 25},
-    {4713, 755},
-    {391, 28},
-    {4330, 1151},
-    {1365, 725},
-    {3493, 2768},
-    {966, 1421},
-    {169, 1328},
-    {1719, 3807},
-    {4171, 3441},
-    {1753, 3193},
-    {2473, 1271},
-    {2133, 1724},
-    {3010, 153},
-    {586, 2084},
-    {4382, 506},
-    {2226, 2933},
-    {2513, 793},
-    {135, 818},
-    {4185, 2703},
-    {1005, 2703},
-    {3765, 2703},
-    {1759, 2703},
-    {565, 25},
-    {1390, 1607},
-    {3698, 1159},
-    {1402, 1},
-    {2229, 530},
-    {2584, 1272},
-    {3235, 428},
-    {1767, 289},
-    {3720, 701},
-    {4405, 755},
-    {3478, 28},
-    {1024, 1151},
-    {3444, 725},
-    {2134, 2768},
-    {2477, 1421},
-    {2265, 1269},
-    {3112, 1619},
-    {1618, 1141},
-    {3846, 420},
-    {4282, 2505},
-    {3610, 723},
-    {1164, 296},
-    {3582, 447},
-    {2638, 1251},
-    {2421, 3317},
-    {4178, 2651},
-    {976, 3810},
-    {3648, 3437},
-    {584, 1702},
-    {4558, 1234},
-    {1928, 496},
-    {238, 3429},
-    {732, 3350},
-    {2452, 1792},
-    {4673, 1438},
-    {2422, 1524},
-    {3201, 3416},
-    {1448, 3238},
-    {3581, 2478},
-    {321, 2401},
-    {4742, 3612},
-    {2010, 1246},
-    {1555, 1348},
-    {420, 1348},
-    {2891, 3220},
-    {388, 3220},
-    {3821, 1441},
-    {780, 1441},
-    {3954, 276},
-    {1480, 276},
-    {3515, 906},
-    {728, 906},
-    {234, 906},
-    {1700, 906},
-    {3980, 69},
-    {1684, 69},
-    {2781, 806},
-    {1920, 806},
-    {2881, 806},
-    {2288, 806},
-    {2577, 1877},
-    {655, 1877},
-    {1083, 1358},
-    {2100, 1358},
-    {4465, 1358},
-    {2046, 1358},
-    {3437, 260},
-    {1833, 260},
-    {3210, 260},
-    {245, 260},
-    {4645, 166},
-    {1892, 166},
-    {1431, 166},
-    {525, 166},
-    {2832, 79},
-    {527, 79},
-    {3894, 79},
-    {765, 79},
-    {4024, 1061},
-    {1695, 1061},
-    {3156, 1061},
-    {1232, 1061},
-    {500, 1347},
-    {1492, 1347},
-    {3910, 1520},
-    {1447, 1520},
-    {2860, 554},
-    {2423, 554},
-    {2640, 1163},
-    {2950, 1163},
-    {2072, 306},
-    {4516, 306},
-    {4106, 306},
-    {2558, 306},
-    {24, 786},
-    {2596, 786},
-    {1801, 786},
-    {3387, 786},
-    {1415, 163},
-    {2095, 163},
-    {2938, 163},
-    {34, 163},
-    {872, 371},
-    {2292, 371},
-    {4545, 371},
-    {2275, 371},
-    {3340, 199},
-    {1322, 199},
-    {3458, 199},
-    {1939, 199},
-    {2795, 1453},
-    {229, 1453},
-    {726, 1453},
-    {2445, 1453},
-    {4681, 329},
-    {2431, 329},
-    {3195, 329},
-    {1466, 329},
-    {3596, 498},
-    {695, 498},
-    {4414, 498},
-    {2256, 498},
-    {1814, 609},
-    {81, 609},
-    {2627, 609},
-    {64, 609},
-    {4127, 127},
-    {1101, 127},
-    {3659, 127},
-    {3120, 127},
-    {1605, 787},
-    {3837, 787},
-    {4270, 787},
-    {3598, 787},
-    {1170, 221},
-    {3595, 221},
-    {1971, 221},
-    {2654, 221},
-    {2432, 189},
-    {3921, 189},
-    {1207, 189},
-    {3162, 189},
-    {2740, 328},
-    {3972, 328},
-    {1712, 328},
-    {3963, 328},
-    {276, 95},
-    {4326, 95},
-    {401, 95},
-    {2672, 95},
-    {2363, 352},
-    {4288, 352},
-    {3849, 2121},
-    {2904, 2121},
-    {412, 304},
-    {2870, 304},
-    {1520, 304},
-    {3083, 304},
-    {1672, 2287},
-    {3474, 2287},
-    {1382, 904},
-    {4207, 904},
-    {4614, 778},
-    {3244, 778},
-    {952, 2785},
-    {3216, 2785},
-    {1199, 289},
-    {3132, 1368},
-    {2695, 1269},
-    {3993, 3317},
-    {1579, 2651},
-    {4039, 1619},
-    {295, 1326},
-    {4255, 755},
-    {539, 28},
-    {2898, 1141},
-    {1986, 420},
-    {4748, 1607},
-    {4068, 2505},
-    {2677, 327},
-    {327, 707},
-    {2655, 50},
-    {1586, 222},
-    {3594, 731},
-    {1465, 432},
-    {2365, 30},
-    {2663, 800},
-    {428, 167},
-    {1169, 1077},
-    {2015, 105},
-    {4272, 637},
-    {1982, 1272},
-    {3640, 530},
-    {1611, 723},
-    {3147, 447},
-    {2651, 296},
-    {2380, 428},
-    {4266, 3810},
-    {3831, 181},
-    {2879, 171},
-    {389, 7},
-    {2894, 101},
-    {1508, 551},
-    {3102, 184},
-    {1697, 286},
-    {2470, 29},
-    {2244, 482},
-    {4392, 68},
-    {3711, 320},
-    {3026, 268},
-    {551, 134},
-    {3034, 131},
-    {1363, 485},
-    {3243, 307},
-    {1862, 191},
-    {4691, 37},
-    {363, 544},
-    {2916, 198},
-    {3626, 57},
-    {4232, 107},
-    {1945, 44},
-    {4242, 162},
-    {1145, 120},
-    {4019, 5},
-    {762, 793},
-    {1296, 1251},
-    {3393, 818},
-    {861, 2398},
-    {22, 25},
-    {1849, 1064},
-    {4104, 181},
-    {1860, 171},
-    {2605, 7},
-    {2082, 101},
-    {3033, 551},
-    {921, 184},
-    {4217, 286},
-    {1392, 29},
-    {2158, 482},
-    {1012, 68},
-    {3445, 320},
-    {1025, 268},
-    {4357, 134},
-    {147, 131},
-    {4533, 485},
-    {2063, 307},
-    {2954, 191},
-    {6, 37},
-    {855, 544},
-    {2269, 198},
-    {4530, 57},
-    {2299, 107},
-    {3325, 44},
-    {1335, 162},
-    {3480, 120},
-    {1679, 5},
-    {3170, 1151},
-    {1216, 1150},
-    {480, 725},
-    {1460, 2312},
-    {3889, 2803},
-    {1477, 2988},
-    {2847, 327},
-    {2442, 153},
-    {2676, 2084},
-    {905, 1159},
-    {4082, 3889},
-    {1293, 1631},
-    {2040, 1523},
-    {1119, 3563},
-    {3427, 3281},
-    {1091, 3354},
-    {4476, 1611},
-    {52, 1391},
-    {4560, 394},
-    {2272, 1870},
-    {2590, 98},
-    {633, 2776},
-    {1066, 2346},
-    {2058, 602},
-    {4455, 996},
-    {2086, 871},
-    {3422, 1097},
-    {1858, 979},
-    {3241, 2255},
-    {2170, 2091},
-    {3016, 632},
-    {153, 1074},
-    {948, 839},
-    {2233, 65},
-    {4617, 898},
-    {2219, 983},
-    {3268, 204},
-    {1396, 61},
-    {3370, 2943},
-    {3029, 2658},
-    {2161, 2254},
-    {4600, 180},
-    {4194, 403},
-    {2467, 1233},
-    {131, 290},
-    {2519, 1863},
-    {1724, 462},
-    {3470, 244},
-    {1338, 1530},
-    {2882, 1614},
-    {2006, 1349},
-    {4737, 849},
-    {4048, 692},
-    {2646, 2387},
-    {304, 2320},
-    {2683, 2722},
-    {1566, 741},
-    {3613, 1116},
-    {1481, 1793},
-    {4361, 925},
-    {604, 1293},
-    {2523, 1321},
-    {3259, 1672},
-    {4556, 21},
-    {2196, 631},
-    {4592, 1922},
-    {928, 3700},
-    {3688, 3771},
-    {1128, 2798},
-    {1682, 13},
-    {3165, 452},
-    {1213, 1909},
-    {478, 1771},
-    {1455, 2511},
-    {3892, 503},
-    {1482, 269},
-    {2833, 1503},
-    {2466, 1165},
-    {2684, 726},
-    {1142, 1182},
-    {3844, 1579},
-    {1607, 1375},
-    {2348, 1857},
-    {784, 1384},
-    {3093, 1837},
-    {806, 2147},
-    {4690, 3042},
-    {425, 2329},
-    {4339, 3025},
-    {2424, 1504},
-    {2747, 896},
-    {482, 1127},
-    {1220, 782},
-    {1919, 2213},
-    {4322, 1744},
-    {1927, 1255},
-    {3555, 550},
-    {1694, 703},
-    {3113, 1195},
-    {1319, 461},
-    {1827, 1762},
-    {4124, 1472},
-    {1882, 1488},
-    {2604, 3399},
-    {2094, 1990},
-    {3051, 2036},
-    {1663, 816},
-    {2404, 1826},
-    {754, 124},
-    {3203, 860},
-    {750, 1032},
-    {4671, 390},
-    {1921, 1200},
-    {2813, 681},
-    {205, 1220},
-    {701, 1383},
-    {2415, 3570},
-    {4663, 3387},
-    {1479, 1526},
-    {3612, 241},
-    {2103, 850},
-    {2284, 2769},
-    {4550, 2347},
-    {2282, 2544},
-    {3348, 444},
-    {1312, 339},
-    {3459, 1588},
-    {2946, 2031},
-    {4522, 3107},
-    {4114, 2975},
-    {2565, 152},
-    {14, 838},
-    {2586, 1054},
-    {1795, 2910},
-    {3397, 2871},
-    {0, 2858},
-    {0, 3204},
-    {0, 1786},
-    {0, 1873},
-    {0, 3431},
-    {0, 3823},
-    {0, 3626},
-    {0, 1955},
-    {0, 2008},
-    {0, 856},
-    {0, 1423},
-    {0, 781},
-    {0, 2249},
-    {0, 2332},
-    {0, 1101},
-    {0, 513},
-    {0, 218},
-    {0, 2404},
-    {0, 2465},
-    {0, 3252},
-    {0, 801},
-    {0, 1268},
-    {0, 3603},
-    {0, 3671},
-    {0, 1695},
+    {4702, 1405},
+    {3898, 3775},
+    {691, 1697},
+    {2885, 688},
+    {1307, 3906},
+    {3285, 2179},
+    {1177, 1095},
+    {1334, 1510},
+    {4211, 3114},
+    {1981, 1104},
+    {3683, 2024},
+    {1217, 1636},
+    {989, 133},
+    {2605, 3143},
+    {979, 512},
+    {3631, 2642},
+    {819, 3444},
+    {1683, 1473},
+    {4532, 657},
+    {2275, 1220},
+    {3936, 2514},
+    {3009, 422},
+    {2697, 3033},
+    {790, 2169},
+    {2693, 2706},
+    {549, 666},
+    {2572, 1796},
+    {4579, 3753},
+    {1702, 2673},
+    {4009, 1806},
+    {2352, 861},
+    {2587, 1116},
+    {2845, 1770},
+    {1275, 2717},
+    {2861, 1158},
+    {173, 3944},
+    {2982, 3010},
+    {4411, 911},
+    {1507, 1252},
+    {3823, 3016},
+    {2117, 1344},
+    {2679, 3820},
+    {3036, 2791},
+    {1170, 1939},
+    {3030, 2891},
+    {308, 992},
+    {2888, 2019},
+    {4213, 3574},
+    {1331, 2421},
+    {3659, 2023},
+    {2007, 1105},
+    {2147, 1610},
+    {2449, 179},
+    {4023, 3123},
+    {2456, 636},
+    {4489, 2619},
+    {2295, 3488},
+    {75, 1437},
+    {3107, 679},
+    {767, 3480},
+    {2533, 2535},
+    {2551, 2536},
+    {2877, 3232},
+    {1239, 335},
+    {2866, 3336},
+    {130, 1530},
+    {3018, 148},
+    {4394, 2266},
+    {1544, 3709},
+    {3856, 453},
+    {2089, 1609},
+    {2615, 1011},
+    {2809, 1860},
+    {1230, 2845},
+    {2816, 1989},
+    {31, 3759},
+    {2960, 523},
+    {4445, 654},
+    {1559, 1468},
+    {3863, 2986},
+    {2220, 2559},
+    {843, 1491},
+    {1066, 336},
+    {2913, 3229},
+    {1055, 494},
+    {3106, 2500},
+    {1194, 3367},
+    {1607, 1326},
+    {4491, 842},
+    {2218, 3382},
+    {3869, 2660},
+    {259, 2465},
+    {624, 3324},
+    {3458, 191},
+    {611, 3431},
+    {2768, 1539},
+    {474, 432},
+    {2016, 2301},
+    {3691, 3674},
+    {1380, 435},
+    {4205, 1683},
+    {4682, 2130},
+    {4435, 732},
+    {1417, 3589},
+    {4424, 1162},
+    {2490, 3104},
+    {4285, 3855},
+    {2831, 1921},
+    {1076, 36},
+    {3413, 3846},
+    {391, 2963},
+    {4334, 2586},
+    {4749, 3174},
+    {1746, 104},
+    {4741, 3495},
+    {2168, 1700},
+    {4618, 519},
+    {2517, 2425},
+    {748, 3552},
+    {3103, 506},
+    {52, 1551},
+    {1601, 759},
+    {1823, 2146},
+    {4501, 3059},
+    {1811, 1755},
+    {3830, 3550},
+    {1655, 2047},
+    {852, 728},
+    {2650, 1680},
+    {182, 2777},
+    {3138, 3668},
+    {1639, 3892},
+    {1445, 2752},
+    {4461, 1744},
+    {1453, 3074},
+    {3996, 1203},
+    {1611, 2114},
+    {1184, 3729},
+    {2938, 2221},
+    {543, 2109},
+    {3551, 1008},
+    {1828, 1071},
+    {1594, 1852},
+    {4277, 2870},
+    {1576, 1973},
+    {4156, 3777},
+    {1424, 2973},
+    {1080, 699},
+    {2827, 1423},
+    {448, 1672},
+    {3363, 3845},
+    {3514, 2556},
+    {3343, 3198},
+    {152, 40},
+    {3351, 872},
+    {1253, 1664},
+    {3208, 548},
+    {3921, 2404},
+    {2236, 3028},
+    {4510, 559},
+    {1671, 1584},
+    {1650, 1583},
+    {1433, 228},
+    {4475, 1419},
+    {1429, 395},
+    {4011, 2484},
+    {1604, 3411},
+    {1198, 1279},
+    {2932, 877},
+    {533, 2332},
+    {3568, 2557},
+    {501, 3763},
+    {43, 2879},
+    {3218, 1824},
+    {29, 2995},
+    {2807, 1013},
+    {218, 1999},
+    {2487, 3610},
+    {4194, 2380},
+    {1938, 2012},
+    {4696, 1198},
+    {3467, 2506},
+    {3111, 3251},
+    {274, 304},
+    {3119, 3355},
+    {1061, 1493},
+    {3257, 469},
+    {4144, 2230},
+    {2452, 3738},
+    {4691, 487},
+    {1939, 1647},
+    {2923, 1540},
+    {2763, 234},
+    {859, 3297},
+    {2774, 410},
+    {635, 2468},
+    {2643, 3422},
+    {4494, 1232},
+    {1643, 933},
+    {3938, 3426},
+    {2268, 2603},
+    {2093, 3098},
+    {2488, 665},
+    {4039, 780},
+    {2495, 3864},
+    {4437, 2127},
+    {2355, 1183},
+    {6, 2825},
+    {3088, 3165},
+    {741, 1167},
+    {2567, 1949},
+    {2441, 1112},
+    {2162, 44},
+    {3753, 3212},
+    {2177, 290},
+    {4756, 586},
+    {2031, 3514},
+    {2002, 291},
+    {0, 1311},
+    {4805, 1},
+    {2825, 3899},
+    {1084, 3630},
+    {1422, 1976},
+    {4958, 1},
+    {4962, 1},
+    {401, 1},
+    {5086, 1},
+    {4709, 1},
+    {4983, 1},
+    {4136, 1},
+    {5040, 1},
+    {3042, 1},
+    {5058, 1},
+    {738, 1},
+    {5050, 1},
+    {585, 1},
+    {4912, 1},
+    {4612, 1},
+    {4870, 1},
+    {4036, 1},
+    {4849, 1},
+    {2470, 1},
+    {5088, 1},
+    {3713, 1},
+    {5103, 1},
+    {4657, 1},
+    {4951, 1},
+    {476, 1},
+    {4833, 1},
+    {2908, 1},
+    {4829, 1},
+    {2584, 1},
+    {5087, 1},
+    {2579, 1},
+    {5009, 1},
+    {1178, 1},
+    {713, 1},
+    {5083, 1},
+    {726, 1},
+    {3424, 1},
+    {5042, 1},
+    {1929, 1},
+    {4730, 1},
+    {5006, 1},
+    {4149, 1},
+    {2846, 1},
+    {4977, 1},
+    {937, 1},
+    {2577, 1},
+    {746, 1},
+    {4764, 1},
+    {1577, 270},
+    {4159, 2355},
+    {4862, 1},
+    {1081, 1},
+    {2835, 1047},
+    {5054, 1},
+    {4864, 1},
+    {4239, 1},
+    {4852, 1},
+    {1872, 1},
+    {4863, 1},
+    {2058, 1},
+    {4993, 1},
+    {2694, 1},
+    {5121, 1},
+    {3267, 1},
+    {5065, 1},
+    {4333, 1},
+    {5032, 1},
+    {1744, 1},
+    {5023, 1},
+    {2167, 1},
+    {4894, 1},
+    {2514, 1},
+    {4935, 1},
+    {3102, 1},
+    {4949, 1},
+    {248, 1},
+    {4994, 1},
+    {3441, 1},
+    {5017, 1},
+    {483, 1},
+    {4950, 1},
+    {3699, 1},
+    {4967, 1},
+    {4203, 1},
+    {4986, 1},
+    {2719, 1},
+    {957, 1},
+    {5101, 1},
+    {213, 1},
+    {1335, 1},
+    {4881, 1},
+    {4734, 1},
+    {1779, 1},
+    {4840, 1},
+    {1928, 1},
+    {890, 1},
+    {5071, 1},
+    {205, 1},
+    {3264, 1},
+    {4887, 1},
+    {4895, 1},
+    {4826, 1},
+    {5005, 1},
+    {2506, 1},
+    {755, 1},
+    {1750, 1},
+    {4611, 1},
+    {2365, 1},
+    {5104, 1},
+    {2823, 1},
+    {1203, 3755},
+    {2576, 28},
+    {372, 3096},
+    {2711, 525},
+    {4704, 1363},
+    {1905, 56},
+    {4147, 1395},
+    {2481, 748},
+    {3906, 2898},
+    {4074, 2462},
+    {2242, 820},
+    {4059, 3101},
+    {1534, 2037},
+    {3932, 988},
+    {3210, 734},
+    {140, 1753},
+    {2631, 978},
+    {821, 2194},
+    {2178, 1749},
+    {2430, 908},
+    {3972, 1212},
+    {2444, 1446},
+    {4359, 361},
+    {2282, 1577},
+    {92, 388},
+    {3160, 2862},
+    {827, 854},
+    {2628, 554},
+    {1361, 468},
+    {1742, 1417},
+    {4752, 572},
+    {1757, 1049},
+    {3750, 1971},
+    {1909, 2550},
+    {910, 30},
+    {2657, 1917},
+    {185, 1156},
+    {3279, 3184},
+    {3393, 556},
+    {3193, 2571},
+    {357, 1811},
+    {3200, 1369},
+    {1132, 796},
+    {3316, 2149},
+    {4090, 3302},
+    {2374, 250},
+    {4624, 2159},
+    {1855, 969},
+    {3122, 391},
+    {3452, 373},
+    {627, 1657},
+    {3469, 241},
+    {851, 20},
+    {3600, 2611},
+    {3828, 242},
+    {2143, 1786},
+    {4403, 2617},
+    {1474, 3347},
+    {111, 2695},
+    {435, 3948},
+    {3550, 1075},
+    {452, 3633},
+    {2518, 1766},
+    {581, 704},
+    {2172, 2966},
+    {3880, 3469},
+    {1579, 715},
+    {4466, 1925},
+    {561, 2200},
+    {315, 664},
+    {3143, 3614},
+    {300, 1098},
+    {3032, 3037},
+    {127, 3910},
+    {2269, 1879},
+    {3983, 128},
+    {1688, 3917},
+    {4493, 2894},
+    {385, 2931},
+    {168, 3702},
+    {3325, 829},
+    {178, 3813},
+    {2852, 2051},
+    {349, 959},
+    {2377, 2780},
+    {4087, 3238},
+    {1809, 968},
+    {4673, 2160},
+    {4526, 589},
+    {4306, 1267},
+    {1549, 2307},
+    {4290, 1628},
+    {2328, 3453},
+    {4452, 2653},
+    {2965, 198},
+    {594, 688},
+    {281, 1104},
+    {3182, 1394},
+    {294, 2522},
+    {3065, 480},
+    {96, 1500},
+    {2279, 349},
+    {3948, 2798},
+    {1668, 1510},
+    {4515, 587},
+    {850, 746},
+    {1047, 2138},
+    {2931, 3055},
+    {1063, 1636},
+    {3419, 1477},
+    {3154, 318},
+    {301, 3242},
+    {3144, 474},
+    {1162, 2521},
+    {3287, 3353},
+    {4131, 1312},
+    {2419, 860},
+    {4666, 3360},
+    {1815, 2672},
+    {389, 1029},
+    {162, 1875},
+    {3329, 2837},
+    {181, 2003},
+    {2854, 3748},
+    {345, 2994},
+    {2380, 672},
+    {4092, 1458},
+    {1812, 3003},
+    {4676, 3876},
+    {1274, 3810},
+    {934, 2817},
+    {2590, 1890},
+    {953, 2927},
+    {3530, 935},
+    {764, 2067},
+    {1718, 3571},
+    {4547, 2436},
+    {2300, 2076},
+    {4052, 1131},
+    {3883, 623},
+    {2289, 2335},
+    {4114, 1598},
+    {1493, 3490},
+    {3958, 2623},
+    {3155, 230},
+    {90, 1781},
+    {2594, 2615},
+    {875, 3342},
+    {4166, 3933},
+    {3806, 2686},
+    {1960, 1817},
+    {3818, 3015},
+    {1841, 1149},
+    {3665, 2163},
+    {3475, 3670},
+    {513, 2295},
+    {2905, 2157},
+    {1111, 957},
+    {2385, 1247},
+    {2211, 634},
+    {3772, 3443},
+    {2217, 175},
+    {4706, 2284},
+    {2069, 3159},
+    {371, 1552},
+    {3378, 1114},
+    {1057, 3153},
+    {2814, 2431},
+    {2055, 2670},
+    {2256, 3132},
+    {4060, 165},
+    {2243, 3450},
+    {4218, 1627},
+    {2404, 607},
+    {339, 2386},
+    {3359, 3592},
+    {1024, 602},
+    {2726, 1478},
+    {2174, 453},
+    {2433, 313},
+    {2747, 3896},
+    {2945, 2709},
+    {1039, 1780},
+    {2934, 3034},
+    {242, 1097},
+    {2804, 2186},
+    {4321, 3648},
+    {1446, 2338},
+    {3780, 2192},
+    {2021, 998},
+    {2082, 999},
+    {2226, 1912},
+    {4099, 2816},
+    {2235, 2034},
+    {4260, 3824},
+    {2369, 2908},
+    {355, 28},
+    {3322, 1363},
+    {1012, 748},
+    {2740, 2462},
+    {4568, 2194},
+    {4241, 1749},
+    {1527, 1446},
+    {4227, 1577},
+    {2237, 388},
+    {4392, 854},
+    {3021, 554},
+    {1254, 468},
+    {3589, 1417},
+    {690, 572},
+    {1759, 2917},
+    {1346, 3742},
+    {4352, 803},
+    {1362, 3838},
+    {3963, 2025},
+    {1477, 1002},
+    {1292, 2746},
+    {3052, 3256},
+    {688, 995},
+    {3597, 2185},
+    {2445, 1970},
+    {2160, 929},
+    {3757, 3650},
+    {2182, 1064},
+    {4757, 2950},
+    {2027, 3788},
+    {432, 1784},
+    {1074, 688},
+    {2800, 1104},
+    {2710, 1394},
+    {2987, 2522},
+    {1137, 86},
+    {2994, 3494},
+    {361, 1692},
+    {2849, 512},
+    {4242, 2433},
+    {1365, 1796},
+    {3685, 523},
+    {1974, 842},
+    {2929, 1326},
+    {2762, 654},
+    {863, 2332},
+    {2777, 1158},
+    {637, 1989},
+    {2639, 3850},
+    {4499, 1927},
+    {1647, 59},
+    {3940, 3859},
+    {2271, 2970},
+    {1298, 3185},
+    {905, 2595},
+    {2523, 1656},
+    {922, 2272},
+    {3558, 12},
+    {739, 1344},
+    {1736, 3351},
+    {4605, 3086},
+    {2357, 1357},
+    {4002, 251},
+    {709, 565},
+    {1180, 1315},
+    {3027, 2262},
+    {1166, 1665},
+    {3135, 480},
+    {1315, 1500},
+    {1469, 349},
+    {4377, 1142},
+    {2111, 1294},
+    {3827, 3397},
+    {946, 3427},
+    {1262, 2360},
+    {2857, 1456},
+    {1268, 2464},
+    {3332, 400},
+    {1131, 1548},
+    {1363, 3163},
+    {4244, 2842},
+    {2011, 1554},
+    {3654, 522},
+    {3786, 2097},
+    {4189, 778},
+    {2335, 3565},
+    {4171, 1200},
+    {1558, 3073},
+    {4058, 3882},
+    {3080, 1886},
+    {32, 88},
+    {2536, 3869},
+    {758, 2992},
+    {756, 2991},
+    {1148, 3656},
+    {3061, 909},
+    {1159, 3758},
+    {3178, 1981},
+    {1281, 1021},
+    {1486, 2729},
+    {4343, 3290},
+    {2088, 1032},
+    {3860, 2099},
+    {2759, 3526},
+    {2925, 2222},
+    {1053, 1347},
+    {2910, 2561},
+    {264, 568},
+    {2787, 1659},
+    {4330, 3259},
+    {1430, 2753},
+    {3769, 1661},
+    {2040, 386},
+    {988, 1101},
+    {1218, 2885},
+    {2817, 687},
+    {1231, 1110},
+    {3229, 2022},
+    {1090, 1093},
+    {1395, 2861},
+    {4289, 1845},
+    {2044, 1106},
+    {3766, 1020},
+    {44, 1979},
+    {496, 751},
+    {3638, 2388},
+    {507, 1176},
+    {2611, 1221},
+    {658, 2525},
+    {2107, 1941},
+    {3795, 24},
+    {1459, 3374},
+    {4420, 1480},
+    {4518, 496},
+    {4319, 2247},
+    {1618, 223},
+    {4325, 504},
+    {2319, 1557},
+    {4454, 414},
+    {2941, 255},
+    {1181, 3286},
+    {3501, 403},
+    {595, 1696},
+    {4240, 1954},
+    {4567, 914},
+    {1875, 912},
+    {4586, 1051},
+    {2060, 2593},
+    {4707, 3088},
+    {2695, 1763},
+    {966, 253},
+    {3269, 3771},
+    {202, 2144},
+    {1408, 1166},
+    {1680, 2475},
+    {4669, 1568},
+    {1689, 2370},
+    {3655, 244},
+    {1843, 1448},
+    {984, 3478},
+    {2733, 2945},
+    {303, 1435},
+    {3336, 5},
+    {1829, 396},
+    {1593, 1467},
+    {4275, 2351},
+    {1575, 1578},
+    {4157, 3399},
+    {1425, 2493},
+    {1079, 136},
+    {2828, 1859},
+    {450, 2489},
+    {3364, 3524},
+    {1640, 3520},
+    {1444, 2278},
+    {4460, 1306},
+    {1451, 2607},
+    {3998, 530},
+    {1612, 1705},
+    {1182, 3241},
+    {2940, 2762},
+    {544, 1695},
+    {3553, 405},
+    {3406, 1984},
+    {3183, 869},
+    {283, 3678},
+    {3162, 1006},
+    {1142, 2993},
+    {3306, 3743},
+    {4118, 1805},
+    {2447, 221},
+    {4687, 3752},
+    {1791, 3075},
+    {1854, 3076},
+    {1551, 3587},
+    {4307, 733},
+    {1574, 3890},
+    {4193, 2102},
+    {1400, 1218},
+    {1087, 2801},
+    {2808, 3202},
+    {418, 1211},
+    {3390, 1983},
+    {1863, 642},
+    {1539, 1251},
+    {4229, 2322},
+    {1529, 1616},
+    {4070, 3473},
+    {1393, 2638},
+    {1113, 259},
+    {2874, 1769},
+    {492, 2633},
+    {3474, 3332},
+    {4748, 2131},
+    {4337, 731},
+    {1357, 3588},
+    {4347, 1161},
+    {2446, 3102},
+    {4202, 3853},
+    {2898, 1922},
+    {1143, 38},
+    {3477, 3849},
+    {485, 2964},
+    {3966, 3043},
+    {3744, 3599},
+    {2173, 710},
+    {3752, 3903},
+    {1749, 2211},
+    {3876, 1085},
+    {3540, 2863},
+    {586, 3130},
+    {2969, 1078},
+    {1188, 2028},
+    {779, 1490},
+    {1125, 339},
+    {3000, 3230},
+    {1141, 495},
+    {3197, 2502},
+    {1259, 3368},
+    {1511, 1325},
+    {4409, 840},
+    {2140, 3381},
+    {3802, 2657},
+    {1067, 2906},
+    {842, 3728},
+    {2772, 800},
+    {856, 3831},
+    {3462, 2016},
+    {1013, 990},
+    {1814, 2754},
+    {4629, 3260},
+    {2370, 1000},
+    {4133, 2193},
+    {2909, 323},
+    {2510, 1479},
+    {921, 2540},
+    {2521, 1367},
+    {439, 3274},
+    {2655, 2396},
+    {4747, 558},
+    {1912, 2039},
+    {4152, 2403},
+    {2472, 3131},
+    {2681, 3333},
+    {3035, 2430},
+    {1169, 1383},
+    {3029, 2537},
+    {309, 461},
+    {2889, 1517},
+    {4212, 3173},
+    {1333, 2834},
+    {3660, 1523},
+    {2008, 635},
+    {2589, 581},
+    {2844, 1264},
+    {1273, 2290},
+    {2860, 1623},
+    {174, 3448},
+    {2984, 2647},
+    {4410, 202},
+    {1508, 1822},
+    {3825, 2658},
+    {2118, 3380},
+    {1967, 2935},
+    {2346, 3707},
+    {4175, 849},
+    {2337, 3817},
+    {4288, 2053},
+    {2482, 965},
+    {231, 2775},
+    {3230, 3225},
+    {898, 951},
+    {2709, 2153},
+    {2660, 2152},
+    {3044, 685},
+    {1157, 3603},
+    {3056, 1118},
+    {298, 3021},
+    {2906, 3923},
+    {4197, 1834},
+    {1340, 180},
+    {3668, 3929},
+    {1994, 2936},
+    {3916, 3471},
+    {4065, 2286},
+    {2253, 1289},
+    {4073, 2622},
+    {1545, 638},
+    {3923, 1599},
+    {3205, 3307},
+    {129, 2696},
+    {2623, 1590},
+    {829, 458},
+    {2164, 3099},
+    {2440, 3564},
+    {3956, 779},
+    {2434, 3863},
+    {4346, 2125},
+    {2290, 1182},
+    {104, 2826},
+    {3177, 3166},
+    {832, 1169},
+    {2621, 1951},
+    {1348, 2206},
+    {1755, 675},
+    {4745, 3622},
+    {1747, 1111},
+    {3740, 3041},
+    {1915, 2053},
+    {931, 1870},
+    {2669, 113},
+    {194, 3907},
+    {3271, 2889},
+    {3382, 2504},
+    {3201, 3252},
+    {343, 306},
+    {3189, 3356},
+    {1118, 1494},
+    {3331, 471},
+    {4100, 2229},
+    {2390, 3736},
+    {4632, 485},
+    {1846, 833},
+    {3109, 2014},
+    {2708, 833},
+    {617, 3704},
+    {3461, 975},
+    {837, 2904},
+    {3607, 346},
+    {3839, 1724},
+    {2153, 346},
+    {4415, 3822},
+    {1463, 3049},
+    {98, 2},
+    {445, 2526},
+    {3534, 1513},
+    {436, 2045},
+    {2501, 320},
+    {591, 2},
+    {2186, 3539},
+    {3891, 2896},
+    {1591, 1388},
+    {4457, 118},
+    {574, 464},
+    {302, 1409},
+    {3149, 2125},
+    {310, 1529},
+    {3039, 3335},
+    {121, 2543},
+    {2259, 52},
+    {3975, 1935},
+    {1679, 2152},
+    {4502, 3467},
+    {373, 3449},
+    {180, 2329},
+    {3313, 2},
+    {161, 2668},
+    {2839, 584},
+    {360, 1639},
+    {2388, 3301},
+    {4103, 2712},
+    {1821, 1646},
+    {4661, 486},
+    {4536, 2059},
+    {4294, 805},
+    {1573, 3741},
+    {4304, 941},
+    {2342, 2940},
+    {4442, 3802},
+    {2962, 1741},
+    {1223, 301},
+    {3561, 3797},
+    {537, 3024},
+    {584, 3025},
+    {293, 3631},
+    {3173, 644},
+    {287, 3943},
+    {3053, 2155},
+    {108, 1139},
+    {2288, 2857},
+    {3961, 3151},
+    {1673, 1150},
+    {4509, 2057},
+    {2936, 3548},
+    {2755, 3080},
+    {872, 2105},
+    {2748, 2760},
+    {645, 749},
+    {2630, 1740},
+    {4516, 3803},
+    {1634, 2610},
+    {3931, 1746},
+    {2280, 932},
+    {1211, 2289},
+    {997, 3477},
+    {0, 2342},
+    {0, 378},
+    {0, 1432},
+    {0, 2626},
+    {0, 239},
+    {0, 3505},
+    {0, 2240},
+    {0, 1487},
+    {0, 3207},
+    {0, 3685},
+    {0, 1990},
+    {0, 919},
+    {0, 3941},
+    {0, 1846},
+    {0, 723},
+    {0, 3068},
+    {0, 3554},
+    {0, 950},
+    {0, 2767},
+    {0, 3719},
+    {0, 2083},
+    {0, 859},
+    {0, 2432},
+    {0, 1693},
+    {0, 3239},
+    {0, 2678},
+    {0, 673},
+    {0, 1782},
+    {0, 2951},
+    {0, 695},
+    {0, 1225},
+    {0, 3446},
+    {0, 2292},
+    {0, 1542},
+    {0, 3147},
+    {0, 3938},
+    {2836, 1421},
+    {1210, 928},
+    {0, 3164},
+    {0, 1555},
+    {0, 527},
+    {0, 2244},
+    {0, 3519},
+    {0, 286},
+    {0, 2585},
+    {0, 2541},
+    {0, 3273},
+    {0, 561},
+    {0, 2406},
+    {0, 1874},
+    {0, 3772},
+    {0, 2864},
+    {0, 2209},
+    {0, 3662},
+    {0, 2829},
+    {0, 972},
+    {0, 1920},
+    {0, 3103},
+    {0, 824},
+    {0, 1231},
+    {0, 3456},
+    {0, 2299},
+    {0, 1538},
+    {0, 3139},
+    {0, 2685},
+    {0, 1107},
+    {0, 1789},
+    {0, 2946},
+    {0, 680},
+    {0, 643},
+    {0, 2320},
+    {0, 3475},
+    {0, 256},
+    {0, 2632},
+    {0, 3133},
+    {0, 122},
+    {3854, 122},
+    {0, 1416},
+    {0, 2448},
     {0, 2046},
-    {0, 1940},
-    {0, 3640},
-    {0, 3780},
-    {0, 2901},
-    {0, 3409},
-    {0, 3074},
-    {0, 531},
-    {0, 423},
-    {0, 2735},
-    {0, 2412},
-    {0, 2500},
+    {0, 2441},
+    {0, 2705},
+    {0, 1140},
+    {0, 1807},
+    {0, 2987},
+    {0, 1004},
+    {0, 866},
+    {0, 2107},
+    {0, 3733},
+    {0, 433},
+    {0, 1471},
+    {0, 2644},
+    {0, 201},
+    {0, 3739},
+    {0, 2061},
+    {0, 845},
+    {0, 3886},
+    {0, 1906},
+    {0, 934},
+    {0, 2984},
+    {0, 873},
+    {0, 1333},
+    {0, 1626},
+    {0, 311},
+    {0, 2847},
+    {0, 3546},
+    {0, 2790},
+    {0, 2579},
+    {0, 1668},
+    {0, 34},
+    {0, 3337},
+    {0, 1338},
+    {0, 725},
+    {0, 3067},
+    {0, 3557},
+    {0, 947},
+    {0, 2765},
+    {0, 340},
+    {0, 2601},
+    {0, 3187},
+    {0, 3506},
+    {0, 532},
+    {0, 2445},
+    {0, 543},
+    {0, 1316},
+    {0, 3493},
+    {0, 2219},
+    {0, 1503},
+    {0, 3222},
+    {0, 2362},
+    {0, 354},
+    {697, 80},
+    {2731, 48},
+    {517, 187},
+    {1943, 397},
+    {0, 2481},
+    {3194, 2056},
+    {3394, 1953},
+    {4173, 527},
+    {2458, 755},
+    {2986, 773},
+    {2715, 2091},
+    {2100, 3434},
+    {0, 260},
+    {0, 1336},
+    {0, 1337},
     {0, 510},
-    {0, 259},
-    {0, 1511},
-    {0, 3567},
-    {0, 1851},
-    {0, 2156},
-    {0, 679},
-    {0, 884},
+    {0, 3534},
+    {0, 13},
+    {0, 2274},
+    {0, 3169},
+    {0, 1520},
+    {0, 1187},
+    {0, 3179},
+    {0, 2368},
+    {0, 2694},
+    {0, 3949},
+    {0, 1074},
+    {0, 3634},
+    {0, 1765},
+    {0, 705},
+    {0, 2965},
+    {0, 3470},
+    {0, 716},
+    {0, 1924},
+    {0, 3167},
+    {0, 2578},
+    {0, 1667},
+    {0, 2257},
+    {0, 33},
+    {0, 1330},
+    {0, 3339},
+    {0, 3100},
     {0, 1339},
-    {0, 3562},
-    {0, 3627},
-    {0, 1629},
-    {0, 2106},
-    {0, 1872},
-    {0, 3693},
-    {0, 3728},
-    {0, 2842},
-    {0, 2995},
-    {0, 3485},
-    {0, 2122},
-    {0, 2034},
-    {0, 3153},
-    {0, 3686},
-    {0, 3764},
-    {0, 2104},
-    {0, 1915},
-    {0, 959},
-    {0, 2169},
-    {0, 519},
-    {0, 2945},
-    {0, 3023},
-    {0, 200},
-    {0, 777},
-    {0, 1090},
-    {0, 3082},
-    {0, 2700},
-    {0, 3870},
-    {0, 2631},
-    {0, 3818},
-    {0, 2873},
-    {0, 3804},
-    {0, 3057},
-    {0, 3322},
-    {0, 2083},
-    {0, 2212},
-    {0, 3303},
-    {0, 3533},
+    {0, 271},
+    {0, 114},
+    {0, 1622},
+    {0, 2628},
+    {0, 1263},
+    {0, 3128},
+    {0, 2318},
+    {0, 363},
+    {0, 2207},
+    {0, 2325},
+    {0, 3277},
+    {0, 3737},
+    {0, 2907},
+    {0, 2062},
+    {0, 2804},
+    {0, 846},
+    {0, 1911},
+    {0, 3885},
+    {0, 2505},
+    {0, 1905},
+    {0, 651},
+    {0, 345},
+    {0, 1504},
+    {0, 2539},
+    {0, 1386},
+    {0, 3258},
+    {0, 2419},
+    {0, 570},
+    {0, 2013},
+    {0, 2408},
+    {0, 3110},
+    {0, 2899},
+    {0, 3726},
+    {0, 821},
+    {0, 3828},
+    {0, 2038},
+    {0, 987},
+    {0, 2735},
+    {0, 3270},
+    {0, 977},
+    {0, 2195},
+    {0, 1934},
+    {0, 945},
+    {0, 3835},
+    {0, 808},
+    {0, 2836},
+    {0, 3694},
+    {0, 2121},
+    {0, 463},
+    {4758, 1},
+    {3907, 1086},
+    {1704, 2210},
+    {801, 1583},
+    {2573, 2315},
+    {63, 2199},
+    {3092, 973},
+    {4449, 1265},
+    {1677, 586},
+    {4665, 120},
+    {2101, 2332},
+    {4530, 3118},
+    {2619, 1563},
+    {816, 1091},
+    {3146, 3107},
+    {165, 2415},
+    {4538, 2621},
+    {4272, 3144},
+    {1597, 147},
+    {4282, 3465},
+    {2366, 1615},
+    {4429, 621},
+    {2970, 2349},
+    {1200, 3628},
+    {3543, 617},
+    {551, 1531},
+    {4646, 1482},
+    {4467, 324},
+    {1438, 3247},
+    {4455, 483},
+    {2461, 2530},
+    {4322, 3359},
+    {2803, 1304},
+    {1045, 852},
+    {3370, 3357},
+    {433, 2669},
+    {598, 3947},
+    {291, 2693},
+    {3174, 1794},
+    {297, 3022},
+    {3057, 1117},
+    {95, 1065},
+    {2281, 3683},
+    {3950, 2287},
+    {1663, 2178},
+    {4519, 943},
+    {4523, 944},
+    {4296, 1926},
+    {1563, 2809},
+    {4287, 2054},
+    {2338, 3816},
+    {4453, 2925},
+    {2964, 728},
+    {1232, 1408},
+    {1465, 2919},
+    {528, 3945},
+    {3422, 769},
+    {3150, 2087},
+    {304, 3094},
+    {1697, 1713},
+    {1165, 3580},
+    {3286, 2734},
+    {4134, 986},
+    {2426, 1670},
+    {4670, 2603},
+    {1819, 3664},
+    {383, 1284},
+    {170, 606},
+    {3326, 3460},
+    {179, 140},
+    {2851, 2319},
+    {348, 3129},
+    {2378, 1576},
+    {4086, 1088},
+    {1807, 3134},
+    {4672, 2400},
+    {1269, 2273},
+    {938, 3502},
+    {2583, 553},
+    {948, 3180},
+    {3527, 1329},
+    {770, 32},
+    {1714, 2553},
+    {4545, 3857},
+    {2296, 53},
+    {4050, 1429},
+    {3886, 1838},
+    {4107, 1055},
+    {2293, 3765},
+    {4116, 918},
+    {1499, 2858},
+    {3949, 3675},
+    {93, 426},
+    {2596, 3671},
+    {876, 77},
+    {4163, 2356},
+    {1168, 853},
+    {1956, 384},
+    {1420, 3316},
+    {1840, 1449},
+    {3670, 243},
+    {3472, 2613},
+    {510, 3782},
+    {2903, 236},
+    {1109, 1349},
+    {2383, 1066},
+    {2213, 1848},
+    {3768, 2873},
+    {2215, 1969},
+    {4703, 3773},
+    {2072, 653},
+    {369, 706},
+    {3374, 1419},
+    {1052, 2957},
+    {2811, 3852},
+    {2057, 188},
+    {2250, 3000},
+    {4063, 1957},
+    {2244, 2884},
+    {4223, 885},
+    {2403, 1876},
+    {340, 3908},
+    {3362, 2477},
+    {1027, 1871},
+    {2729, 770},
+    {2180, 753},
+    {2429, 2142},
+    {3970, 3063},
+    {2443, 1344},
+    {4360, 3549},
+    {2283, 2782},
+    {91, 960},
+    {3161, 1676},
+    {828, 2773},
+    {2629, 3672},
+    {2749, 2374},
+    {2943, 3391},
+    {1040, 422},
+    {2935, 3287},
+    {246, 1461},
+    {2802, 200},
+    {4323, 2656},
+    {1448, 3766},
+    {3785, 207},
+    {2024, 1321},
+    {2079, 1322},
+    {2227, 574},
+    {4095, 3498},
+    {2232, 98},
+    {518, 2224},
+    {2373, 3220},
+    {352, 1497},
+    {3320, 1189},
+    {1009, 3215},
+    {2739, 2373},
+    {4575, 2710},
+    {4238, 3902},
+    {1531, 1147},
+    {4231, 3597},
+    {2240, 1820},
+    {3023, 2982},
+    {1257, 3445},
+    {3592, 645},
+    {694, 1907},
+    {1754, 3224},
+    {1349, 2574},
+    {4349, 1682},
+    {1359, 2249},
+    {1481, 1324},
+    {1288, 3371},
+    {3047, 3056},
+    {683, 1319},
+    {3594, 189},
+    {2442, 178},
+    {2163, 1611},
+    {3754, 2661},
+    {2176, 1244},
+    {4755, 3146},
+    {2032, 2303},
+    {426, 431},
+    {3400, 2151},
+    {1072, 2291},
+    {2798, 3231},
+    {2712, 3687},
+    {2985, 2923},
+    {1139, 2029},
+    {2998, 2812},
+    {363, 815},
+    {4249, 3854},
+    {1367, 2549},
+    {3686, 1930},
+    {1975, 711},
+    {2924, 290},
+    {2765, 1515},
+    {860, 2519},
+    {2773, 1399},
+    {634, 3243},
+    {2645, 2427},
+    {969, 517},
+    {1644, 2084},
+    {3939, 2438},
+    {2267, 3162},
+    {1294, 2928},
+    {907, 3696},
+    {2520, 836},
+    {917, 3494},
+    {3552, 2044},
+    {743, 954},
+    {1731, 2785},
+    {4603, 3237},
+    {2354, 967},
+    {3997, 2166},
+    {714, 1904},
+    {1176, 991},
+    {3028, 3800},
+    {3137, 2787},
+    {1311, 3731},
+    {1472, 2112},
+    {4382, 482},
+    {2113, 3735},
+    {3829, 2711},
+    {950, 2690},
+    {1260, 3940},
+    {2859, 1081},
+    {1270, 3629},
+    {3337, 1761},
+    {1127, 700},
+    {1366, 2972},
+    {4251, 877},
+    {2013, 712},
+    {3656, 1929},
+    {3789, 327},
+    {4187, 1486},
+    {2339, 2547},
+    {4178, 1377},
+    {1566, 3280},
+    {4054, 2407},
+    {3083, 547},
+    {34, 2031},
+    {2541, 2398},
+    {761, 3126},
+    {754, 3125},
+    {1149, 506},
+    {3058, 1592},
+    {1158, 2328},
+    {3176, 107},
+    {1283, 1280},
+    {1483, 3408},
+    {4339, 3038},
+    {2086, 1285},
+    {3859, 328},
+    {1010, 1083},
+    {4544, 1802},
+    {1903, 2702},
+    {4555, 2190},
+    {2080, 3915},
+    {4695, 3039},
+    {2703, 875},
+    {939, 1277},
+    {3261, 2973},
+    {224, 3832},
+    {1319, 1672},
+    {1776, 103},
+    {4728, 3175},
+    {1761, 578},
+    {896, 1380},
+    {227, 3412},
+    {2424, 3160},
+    {3973, 127},
+    {2412, 683},
+    {4366, 1593},
+    {2274, 637},
+    {125, 2363},
+    {3152, 2871},
+    {807, 629},
+    {2642, 1516},
+    {3012, 2047},
+    {786, 3727},
+    {546, 1246},
+    {873, 316},
+    {4001, 3805},
+    {1031, 338},
+    {2937, 3334},
+    {237, 1528},
+    {2801, 446},
+    {4324, 2267},
+    {1452, 3710},
+    {711, 457},
+    {2029, 1613},
+    {891, 812},
+    {720, 2068},
+    {2881, 1993},
+    {1308, 1618},
+    {3282, 1653},
+    {1175, 2823},
+    {1336, 1186},
+    {4215, 1519},
+    {1973, 2831},
+    {3684, 3625},
+    {1156, 3574},
+    {731, 2435},
+    {2670, 1918},
+    {438, 1553},
+    {3141, 231},
+    {909, 2026},
+    {1911, 3590},
+    {3289, 611},
+    {2491, 2033},
+    {1048, 1089},
+    {1245, 1133},
+    {972, 897},
+    {2547, 2708},
+    {965, 2168},
+    {3505, 3920},
+    {796, 3018},
+    {1712, 59},
+    {4587, 1234},
+    {2321, 3027},
+    {4032, 3806},
+    {22, 2513},
+    {3812, 2595},
+    {1952, 312},
+    {3821, 3361},
+    {1774, 1508},
+    {3663, 490},
+    {3479, 2218},
+    {2899, 481},
+    {1115, 1637},
+    {1160, 1638},
+    {723, 134},
+    {2682, 3140},
+    {705, 603},
+    {904, 2429},
+    {1934, 1472},
+    {2687, 656},
+    {1394, 3436},
+    {4143, 2511},
+    {1042, 3861},
+    {866, 2774},
+    {2757, 1716},
+    {329, 1154},
+    {646, 2136},
+    {869, 3711},
+    {4641, 2268},
+    {2399, 2141},
+    {4115, 1056},
+    {999, 132},
+    {2592, 2582},
+    {516, 1607},
+    {2732, 618},
+    {4688, 2353},
+    {1838, 3638},
+    {1201, 626},
+    {2397, 1532},
+    {3247, 62},
+    {5, 2572},
+    {3237, 545},
+    {3095, 3522},
+    {4038, 1379},
+    {2368, 794},
+    {4616, 3531},
+    {1700, 2496},
+    {1603, 3002},
+    {1827, 3665},
+    {4496, 913},
+    {1817, 3768},
+    {3822, 1994},
+    {1654, 1040},
+    {862, 2715},
+    {171, 1027},
+    {1895, 1582},
+    {1518, 222},
+    {4247, 3313},
+    {1506, 393},
+    {4083, 2482},
+    {316, 878},
+    {469, 3403},
+    {3494, 2559},
+    {1414, 1975},
+    {2933, 1160},
+    {1870, 1861},
+    {1085, 2487},
+    {2214, 1856},
+    {398, 789},
+    {1041, 302},
+    {1857, 2887},
+    {4531, 1956},
+    {1978, 3787},
+    {4663, 2948},
+    {978, 1431},
+    {280, 2384},
+    {356, 1505},
+    {4482, 3874},
+    {3094, 867},
+    {1645, 1758},
+    {2138, 1213},
+    {4504, 2096},
+    {857, 2237},
+    {116, 1025},
+    {319, 1550},
+    {568, 263},
+    {3423, 3285},
+    {579, 428},
+    {414, 3433},
+    {3725, 917},
+    {3281, 2589},
+    {1509, 100},
+    {1948, 358},
+    {4690, 516},
+    {2730, 2424},
+    {1002, 3551},
+    {3310, 505},
+    {3436, 1737},
+    {2048, 738},
+    {692, 2962},
+    {2134, 1355},
+    {4396, 3084},
+    {1480, 3793},
+    {13, 1605},
+    {514, 171},
+    {3123, 2252},
+    {520, 632},
+    {2600, 2616},
+    {693, 3482},
+    {2085, 1442},
+    {3805, 692},
+    {9, 1100},
+    {3090, 1559},
+    {730, 2875},
+    {2571, 3573},
+    {2329, 3792},
+    {1971, 1864},
+    {3793, 1864},
+    {2006, 3071},
+    {464, 857},
+    {3460, 1298},
+    {1121, 3066},
+    {2892, 3749},
+    {2532, 411},
+    {4798, 1},
+    {1780, 3686},
+    {4053, 421},
+    {2297, 557},
+    {2361, 1704},
+    {1946, 45},
+    {3819, 3208},
+    {1950, 537},
+    {4541, 2590},
+    {2090, 3512},
+    {685, 1410},
+    {3615, 567},
+    {1287, 3504},
+    {3015, 2454},
+    {4577, 161},
+    {4225, 1594},
+    {1546, 2671},
+    {4234, 1230},
+    {2252, 3161},
+    {4389, 2283},
+    {3008, 412},
+    {1236, 2170},
+    {3584, 2282},
+    {696, 3244},
+    {1740, 1759},
+    {4345, 3872},
+    {1345, 760},
+    {3959, 2770},
+    {1492, 3566},
+    {1300, 2069},
+    {704, 3561},
+    {2439, 2726},
+    {2184, 3913},
+    {2171, 3608},
+    {4744, 1800},
+    {454, 2997},
+    {3414, 3439},
+    {1083, 661},
+    {2794, 1893},
+    {2705, 1366},
+    {3003, 479},
+    {1117, 3344},
+    {2990, 322},
+    {344, 2413},
+    {2855, 3257},
+    {4266, 1003},
+    {1379, 1003},
+    {3689, 2333},
+    {1966, 2333},
+    {2922, 2333},
+    {2779, 2333},
+    {838, 837},
+    {2771, 837},
+    {613, 837},
+    {2648, 837},
+    {4506, 850},
+    {1657, 850},
+    {3942, 850},
+    {2261, 850},
+    {1290, 493},
+    {925, 493},
+    {2500, 493},
+    {911, 493},
+    {3535, 105},
+    {747, 105},
+    {1756, 105},
+    {4623, 105},
+    {2363, 2531},
+    {3994, 2531},
+    {718, 2531},
+    {1163, 2531},
+    {3040, 281},
+    {1171, 281},
+    {3148, 281},
+    {1310, 281},
+    {1457, 164},
+    {4367, 164},
+    {2104, 164},
+    {3833, 164},
+    {941, 131},
+    {1277, 131},
+    {2840, 131},
+    {1266, 131},
+    {3312, 394},
+    {1136, 394},
+    {1377, 394},
+    {4270, 394},
+    {2014, 2334},
+    {3651, 2334},
+    {3801, 2334},
+    {4185, 2334},
+    {2343, 811},
+    {4191, 811},
+    {1571, 811},
+    {4041, 811},
+    {3075, 3078},
+    {23, 3078},
+    {2527, 801},
+    {775, 801},
+    {737, 1134},
+    {1152, 1134},
+    {3054, 701},
+    {1146, 701},
+    {3172, 2675},
+    {1301, 2675},
+    {1490, 620},
+    {4350, 620},
+    {2098, 906},
+    {3845, 906},
+    {2561, 906},
+    {2865, 906},
+    {1255, 1832},
+    {2871, 1832},
+    {146, 1832},
+    {3013, 1832},
+    {4383, 1119},
+    {1526, 1119},
+    {3850, 1119},
+    {2092, 1119},
+    {734, 303},
+    {1150, 303},
+    {3050, 303},
+    {1144, 303},
+    {3171, 1243},
+    {1304, 1243},
+    {1487, 940},
+    {4355, 940},
+    {2097, 940},
+    {3849, 940},
+    {290, 2385},
+    {597, 2385},
+    {3403, 219},
+    {588, 219},
+    {2654, 219},
+    {440, 219},
+    {2037, 226},
+    {3756, 226},
+    {1421, 226},
+    {4317, 226},
+    {4694, 1193},
+    {4419, 1193},
+    {1364, 774},
+    {4408, 774},
+    {3025, 901},
+    {663, 901},
+    {3606, 901},
+    {1891, 901},
+    {1522, 2010},
+    {4245, 2010},
+    {1505, 1881},
+    {4081, 1881},
+    {1375, 1094},
+    {1138, 1094},
+    {2856, 275},
+    {467, 2882},
+    {3492, 2882},
+    {3639, 2256},
+    {3222, 2256},
+    {33, 569},
+    {3228, 569},
+    {1229, 7},
+    {3071, 7},
+    {4046, 7},
+    {2334, 7},
+    {4592, 23},
+    {1728, 23},
+    {1735, 434},
+    {1352, 434},
+    {4344, 272},
+    {1344, 272},
+    {3952, 2357},
+    {1495, 2357},
+    {1297, 1046},
+    {3059, 1046},
+    {700, 2254},
+    {3580, 2254},
+    {4576, 2377},
+    {4224, 2377},
+    {1543, 389},
+    {4233, 389},
+    {2249, 389},
+    {1496, 284},
+    {3007, 284},
+    {1240, 284},
+    {3583, 573},
+    {698, 573},
+    {1738, 573},
+    {1350, 573},
+    {4342, 802},
+    {1341, 2064},
+    {3954, 735},
+    {1295, 1751},
+    {3063, 942},
+    {702, 996},
+    {3581, 2181},
+    {2437, 646},
+    {2183, 931},
+    {3739, 2655},
+    {2170, 1063},
+    {4740, 2949},
+    {2033, 3789},
+    {451, 1785},
+    {3415, 232},
+    {1082, 497},
+    {2795, 3082},
+    {2706, 514},
+    {3006, 3171},
+    {1120, 85},
+    {2992, 2914},
+    {347, 1691},
+    {2853, 513},
+    {4269, 1371},
+    {1376, 2552},
+    {3690, 524},
+    {1965, 455},
+    {2918, 1076},
+    {2778, 727},
+    {836, 2692},
+    {2770, 16},
+    {610, 610},
+    {2649, 1223},
+    {4505, 1928},
+    {1658, 60},
+    {3941, 3476},
+    {2265, 2612},
+    {1293, 247},
+    {928, 883},
+    {2503, 1290},
+    {913, 2271},
+    {3538, 10},
+    {744, 1345},
+    {1758, 2981},
+    {4620, 1960},
+    {2364, 1358},
+    {3992, 249},
+    {721, 566},
+    {1164, 790},
+    {3041, 1375},
+    {1174, 1666},
+    {3151, 2494},
+    {1309, 2569},
+    {1458, 348},
+    {4365, 1721},
+    {2106, 1868},
+    {3832, 793},
+    {942, 2410},
+    {1280, 1171},
+    {2842, 441},
+    {1267, 2463},
+    {3314, 399},
+    {1133, 1549},
+    {1378, 1365},
+    {4265, 333},
+    {2015, 1496},
+    {3650, 521},
+    {3798, 2098},
+    {4182, 347},
+    {2341, 1276},
+    {4190, 1201},
+    {1567, 424},
+    {4042, 3881},
+    {3072, 1885},
+    {24, 87},
+    {2526, 261},
+    {777, 2348},
+    {733, 2990},
+    {1151, 2802},
+    {3051, 907},
+    {1145, 1058},
+    {3167, 1980},
+    {1303, 1022},
+    {1489, 2730},
+    {4353, 2763},
+    {2096, 1033},
+    {3848, 1219},
+    {2410, 1723},
+    {2201, 709},
+    {3718, 856},
+    {2196, 1144},
+    {4721, 3013},
+    {2046, 2101},
+    {422, 1847},
+    {3429, 156},
+    {1093, 3942},
+    {2783, 2924},
+    {4105, 526},
+    {3893, 1343},
+    {2078, 2245},
+    {3901, 1687},
+    {1899, 735},
+    {3758, 2592},
+    {375, 1751},
+    {2781, 2584},
+    {1102, 3429},
+    {4556, 646},
+    {4243, 2321},
+    {1521, 931},
+    {4259, 2655},
+    {2233, 609},
+    {4407, 1625},
+    {2988, 1785},
+    {1263, 2716},
+    {3604, 232},
+    {671, 497},
+    {103, 993},
+    {430, 1908},
+    {3556, 514},
+    {441, 2032},
+    {2522, 3171},
+    {587, 85},
+    {2159, 790},
+    {3872, 1375},
+    {1581, 2569},
+    {4459, 348},
+    {521, 1721},
+    {4, 1171},
+    {3251, 441},
+    {15, 2463},
+    {2837, 399},
+    {189, 1496},
+    {2489, 521},
+    {4154, 2098},
+    {1913, 1509},
+    {4717, 424},
+    {3391, 1888},
+    {3186, 974},
+    {365, 2990},
+    {3196, 831},
+    {1140, 2802},
+    {3319, 907},
+    {4084, 2101},
+    {2372, 500},
+    {4631, 3720},
+    {1853, 1723},
+    {3346, 2918},
+    {3518, 709},
+    {393, 856},
+    {3509, 802},
+    {959, 2064},
+    {3371, 937},
+    {3781, 735},
+    {2061, 2922},
+    {4320, 942},
+    {1415, 996},
+    {3175, 2181},
+    {3405, 646},
+    {600, 720},
+    {3410, 1063},
+    {753, 2949},
+    {3544, 3789},
+    {3874, 1785},
+    {2157, 143},
+    {4428, 514},
+    {1616, 2914},
+    {1437, 1691},
+    {1635, 513},
+    {4645, 1371},
+    {1626, 2552},
+    {3701, 455},
+    {1804, 1076},
+    {1025, 727},
+    {2752, 2692},
+    {338, 16},
+    {3298, 610},
+    {3335, 613},
+    {3522, 1223},
+    {381, 1928},
+    {3529, 60},
+    {949, 3476},
+    {3375, 2612},
+    {3764, 247},
+    {2071, 1290},
+    {4326, 2271},
+    {1409, 10},
+    {2838, 1345},
+    {2593, 2981},
+    {1001, 1960},
+    {2601, 1358},
+    {522, 249},
+    {2722, 566},
+    {4685, 1666},
+    {1835, 2494},
+    {4108, 1868},
+    {2407, 793},
+    {1036, 2410},
+    {880, 1171},
+    {2745, 441},
+    {867, 1549},
+    {3430, 1365},
+    {1028, 333},
+    {1801, 1496},
+    {4656, 3825},
+    {2401, 347},
+    {4111, 1276},
+    {640, 1201},
+    {252, 424},
+    {3128, 87},
+    {234, 261},
+    {2939, 2348},
+    {71, 2990},
+    {2318, 1614},
+    {3999, 1058},
+    {1707, 1980},
+    {4604, 2270},
+    {4444, 2763},
+    {4667, 1033},
+    {1682, 1219},
+    {4660, 1723},
+    {2108, 1752},
+    {4533, 735},
+    {2614, 2922},
+    {809, 646},
+    {3153, 720},
+    {159, 1785},
+    {4723, 143},
+    {4376, 514},
+    {1323, 3543},
+    {4364, 16},
+    {2413, 2275},
+    {4217, 639},
+    {2886, 1518},
+    {1173, 1171},
+    {3498, 441},
+    {458, 1496},
+    {1787, 2990},
+    {1622, 1614},
+    {4314, 1723},
+    {1610, 1752},
+    {4138, 1165},
+    {1454, 2145},
+    {1043, 3699},
+    {2797, 2263},
+    {407, 1483},
+    {3399, 1043},
+    {1436, 797},
+    {1649, 2116},
+    {4634, 2390},
+    {1659, 1735},
+    {3693, 415},
+    {1806, 2755},
+    {1014, 989},
+    {2769, 229},
+    {351, 2663},
+    {3295, 3640},
+    {1556, 214},
+    {1851, 1296},
+    {4529, 1991},
+    {1844, 2859},
+    {3794, 108},
+    {1685, 1853},
+    {811, 1588},
+    {2612, 630},
+    {128, 1168},
+    {3187, 722},
+    {3328, 639},
+    {3519, 550},
+    {387, 3508},
+    {3525, 64},
+    {956, 1730},
+    {3385, 2263},
+    {3759, 1483},
+    {2067, 1043},
+    {4328, 797},
+    {1406, 2116},
+    {1441, 2390},
+    {1641, 1735},
+    {4640, 415},
+    {1629, 2755},
+    {3698, 989},
+    {1799, 229},
+    {1029, 2663},
+    {2758, 3640},
+    {333, 214},
+    {3302, 1296},
+    {132, 1991},
+    {403, 2859},
+    {3508, 108},
+    {392, 1853},
+    {2555, 1588},
+    {557, 630},
+    {2205, 1168},
+    {3914, 722},
+    {1623, 639},
+    {4423, 550},
+    {3179, 3508},
+    {3401, 64},
+    {603, 1730},
+    {3411, 630},
+    {757, 1168},
+    {3539, 722},
+    {3877, 639},
+    {2161, 2275},
+    {4430, 1518},
+    {1620, 883},
+    {2671, 1076},
+    {3049, 727},
+    {1154, 2692},
+    {3066, 630},
+    {296, 1168},
+    {2897, 722},
+    {4201, 883},
+    {1347, 1290},
+    {3664, 3040},
+    {2001, 3040},
+    {762, 2903},
+    {2538, 2402},
+    {3888, 2402},
+    {4110, 3364},
+    {2286, 467},
+    {4119, 3264},
+    {1488, 1387},
+    {3947, 331},
+    {3169, 2555},
+    {99, 2555},
+    {2591, 321},
+    {881, 1278},
+    {3974, 1526},
+    {3729, 297},
+    {2195, 3275},
+    {3717, 456},
+    {1767, 456},
+    {3871, 3338},
+    {3570, 816},
+    {577, 816},
+    {2966, 2627},
+    {1189, 2627},
+    {4101, 1537},
+    {3894, 177},
+    {2074, 177},
+    {3899, 3442},
+    {1896, 595},
+    {3760, 595},
+    {3380, 2372},
+    {374, 2372},
+    {2780, 582},
+    {1097, 955},
+    {1224, 955},
+    {993, 1938},
+    {2603, 1938},
+    {981, 2065},
+    {3628, 3798},
+    {810, 429},
+    {1686, 766},
+    {4535, 766},
+    {2270, 2938},
+    {3937, 3934},
+    {3965, 3936},
+    {3738, 2687},
+    {2189, 1816},
+    {3751, 1816},
+    {1760, 1036},
+    {3879, 2162},
+    {3537, 2100},
+    {582, 2293},
+    {2972, 2154},
+    {1187, 539},
+    {1320, 539},
+    {1777, 1360},
+    {4729, 1360},
+    {1762, 1709},
+    {3726, 1709},
+    {1941, 2609},
+    {897, 298},
+    {2686, 1738},
+    {229, 2597},
+    {3256, 3413},
+    {4261, 2158},
+    {4546, 690},
+    {2083, 3026},
+    {4693, 3926},
+    {2704, 1830},
+    {936, 166},
+    {3262, 3918},
+    {221, 2930},
+    {3904, 2930},
+    {4089, 3576},
+    {2231, 756},
+    {4106, 3878},
+    {1514, 1202},
+    {3934, 1202},
+    {3192, 2788},
+    {167, 3217},
+    {2638, 1192},
+    {817, 1996},
+    {1302, 1573},
+    {912, 209},
+    {2513, 3311},
+    {926, 371},
+    {3546, 2478},
+    {736, 3400},
+    {1743, 1295},
+    {4608, 886},
+    {2351, 3407},
+    {4005, 2566},
+    {1005, 2989},
+    {1205, 3655},
+    {2834, 910},
+    {1216, 3756},
+    {3246, 1978},
+    {1069, 1023},
+    {1418, 2731},
+    {4278, 3293},
+    {2025, 1036},
+    {3783, 2100},
+    {2720, 194},
+    {2991, 1566},
+    {1134, 2011},
+    {3005, 1454},
+    {359, 585},
+    {2841, 2375},
+    {4252, 585},
+    {1371, 2011},
+    {3680, 2379},
+    {1980, 3218},
+    {2863, 3425},
+    {2564, 2347},
+    {963, 1459},
+    {2542, 2375},
+    {395, 429},
+    {2700, 1537},
+    {4712, 3145},
+    {1874, 2860},
+    {2890, 1771},
+    {1119, 814},
+    {2457, 2276},
+    {2137, 3513},
+    {3697, 563},
+    {2150, 3189},
+    {4639, 1340},
+    {2010, 46},
+    {460, 2544},
+    {3448, 3847},
+    {1129, 37},
+    {2887, 1424},
+    {1661, 1293},
+    {3416, 518},
+    {3163, 473},
+    {295, 2},
+    {3184, 317},
+    {1155, 2411},
+    {3296, 357},
+    {4112, 1259},
+    {2438, 1001},
+    {4684, 3261},
+    {1803, 2},
+    {3622, 2},
+    {523, 2724},
+    {2597, 650},
+    {689, 938},
+    {3813, 109},
+    {1479, 1821},
+    {4395, 841},
+    {4228, 1403},
+    {4590, 450},
+    {1860, 3115},
+    {4569, 294},
+    {2053, 2444},
+    {4716, 3234},
+    {2698, 1678},
+    {970, 952},
+    {3273, 641},
+    {186, 1617},
+    {277, 449},
+    {606, 3481},
+    {3471, 580},
+    {461, 170},
+    {2009, 799},
+    {3681, 183},
+    {1373, 183},
+    {4210, 183},
+    {288, 183},
+    {583, 938},
+    {2658, 518},
+    {447, 473},
+    {2036, 2},
+    {1426, 2411},
+    {4309, 317},
+    {3352, 1259},
+    {3504, 357},
+    {408, 2724},
+    {3516, 109},
+    {973, 1821},
+    {3368, 841},
+    {3773, 1403},
+    {2052, 450},
+    {4313, 3115},
+    {1419, 192},
+    {2570, 1630},
+    {2868, 2248},
+    {1249, 567},
+    {2876, 3172},
+    {139, 1352},
+    {3010, 14},
+    {4388, 454},
+    {3843, 25},
+    {2095, 1443},
+    {2276, 1850},
+    {2042, 741},
+    {569, 2172},
+    {3569, 404},
+    {1220, 3676},
+    {1977, 2366},
+    {4186, 368},
+    {2349, 3328},
+    {4299, 1426},
+    {2475, 268},
+    {209, 2629},
+    {3219, 3770},
+    {884, 252},
+    {2716, 1332},
+    {3778, 1053},
+    {3925, 1839},
+    {2402, 2883},
+    {3928, 1958},
+    {1389, 1958},
+    {4064, 676},
+    {3345, 676},
+    {332, 1436},
+    {2744, 1436},
+    {1004, 3651},
+    {4082, 3651},
+    {3895, 900},
+    {2070, 900},
+    {3892, 900},
+    {1894, 900},
+    {3771, 784},
+    {3389, 784},
+    {382, 509},
+    {2786, 509},
+    {1089, 509},
+    {3988, 509},
+    {3723, 2133},
+    {2200, 2133},
+    {3734, 936},
+    {1775, 936},
+    {3864, 936},
+    {3567, 936},
+    {571, 126},
+    {2959, 126},
+    {1199, 126},
+    {1059, 126},
+    {858, 409},
+    {2764, 409},
+    {844, 409},
+    {3450, 409},
+    {1015, 210},
+    {1826, 210},
+    {4638, 210},
+    {2386, 210},
+    {4122, 375},
+    {4072, 375},
+    {3909, 375},
+    {2065, 375},
+    {3917, 74},
+    {1880, 74},
+    {3775, 1256},
+    {3366, 1256},
+    {390, 285},
+    {2793, 285},
+    {1077, 508},
+    {3055, 508},
+    {2656, 786},
+    {752, 786},
+    {2661, 786},
+    {596, 786},
+    {2509, 70},
+    {4602, 70},
+    {1732, 70},
+    {4026, 70},
+    {2320, 204},
+    {1244, 204},
+    {967, 204},
+    {2557, 204},
+    {960, 135},
+    {3512, 135},
+    {800, 135},
+    {1705, 135},
+    {4582, 145},
+    {2325, 145},
+    {4025, 145},
+    {399, 145},
+    {151, 39},
+    {3342, 39},
+    {135, 39},
+    {2864, 39},
+    {334, 383},
+    {2406, 383},
+    {4079, 383},
+    {1795, 383},
+    {4686, 218},
+    {4207, 218},
+    {4599, 218},
+    {1923, 218},
+    {4595, 390},
+    {2039, 390},
+    {4735, 390},
+    {2691, 390},
+    {900, 11},
+    {3225, 11},
+    {263, 11},
+    {4527, 11},
+    {4303, 238},
+    {1555, 238},
+    {4293, 238},
+    {2330, 238},
+    {4451, 865},
+    {2967, 865},
+    {1235, 865},
+    {3573, 865},
+    {531, 1452},
+    {1701, 1452},
+    {1391, 1452},
+    {4386, 1452},
+    {1388, 1057},
+    {3922, 1057},
+    {1540, 1057},
+    {1258, 1057},
+    {3022, 898},
+    {652, 898},
+    {3621, 898},
+    {1512, 898},
+    {1890, 696},
+    {4558, 696},
+    {1897, 23},
+    {3900, 23},
+    {1719, 1090},
+    {759, 1090},
+    {2574, 1090},
+    {79, 1090},
+    {3078, 3568},
+    {1325, 3568},
+    {1784, 2095},
+    {4725, 2095},
+    {1769, 739},
+    {3719, 739},
+    {1935, 1757},
+    {901, 1757},
+    {3459, 357},
+    {623, 3432},
+    {3465, 192},
+    {846, 1443},
+    {3603, 1850},
+    {3826, 1630},
+    {2142, 1034},
+    {4400, 109},
+    {1470, 1821},
+    {1530, 2248},
+    {1871, 567},
+    {4573, 518},
+    {1861, 3172},
+    {3913, 1311},
+    {1708, 102},
+    {797, 360},
+    {2565, 206},
+    {69, 89},
+    {3087, 21},
+    {3808, 265},
+    {4162, 350},
+    {2358, 1141},
+    {4153, 387},
+    {1582, 529},
+    {4037, 1546},
+    {3096, 317},
+    {16, 2411},
+    {2524, 1352},
+    {785, 454},
+    {2130, 14},
+    {2462, 1259},
+    {4004, 741},
+    {2467, 196},
+    {4462, 158},
+    {2317, 48},
+    {49, 57},
+    {3126, 154},
+    {789, 187},
+    {2515, 169},
+    {1449, 119},
+    {1632, 167},
+    {4650, 4},
+    {1638, 163},
+    {3704, 115},
+    {1789, 55},
+    {1021, 22},
+    {2750, 157},
+    {326, 160},
+    {3308, 397},
+    {3500, 54},
+    {3073, 80},
+    {223, 139},
+    {3084, 213},
+    {1095, 76},
+    {3215, 150},
+    {4184, 212},
+    {2478, 19},
+    {4726, 67},
+    {1904, 170},
+    {3147, 25},
+    {3421, 799},
+    {575, 3734},
+    {3428, 938},
+    {719, 560},
+    {3563, 196},
+    {3867, 158},
+    {2197, 48},
+    {4439, 57},
+    {1605, 154},
+    {68, 187},
+    {482, 169},
+    {3590, 119},
+    {489, 167},
+    {2627, 4},
+    {641, 163},
+    {2128, 115},
+    {3851, 55},
+    {1528, 22},
+    {4357, 157},
+    {614, 160},
+    {273, 397},
+    {3110, 54},
+    {262, 80},
+    {2921, 139},
+    {84, 213},
+    {2304, 76},
+    {4018, 150},
+    {1729, 212},
+    {4593, 19},
+    {508, 67},
+    {26, 841},
+    {3227, 1257},
+    {47, 1403},
+    {2813, 619},
+    {204, 1603},
+    {2480, 3327},
+    {4181, 1311},
+    {1927, 1617},
+    {4705, 449},
+    {4552, 473},
+    {4268, 844},
+    {1501, 244},
+    {4253, 983},
+    {2224, 2912},
+    {4413, 3823},
+    {3004, 1719},
+    {1279, 334},
+    {3610, 3819},
+    {665, 3045},
+    {647, 3044},
+    {239, 3605},
+    {3131, 678},
+    {249, 1661},
+    {2946, 386},
+    {60, 1101},
+    {2311, 2885},
+    {3991, 687},
+    {1692, 1110},
+    {4614, 2022},
+    {3617, 1093},
+    {3241, 2861},
+    {11, 1845},
+    {3234, 1106},
+    {1207, 1020},
+    {3099, 1979},
+    {4033, 751},
+    {2362, 2388},
+    {4622, 1176},
+    {1690, 1221},
+    {648, 2525},
+    {240, 1941},
+    {3132, 24},
+    {251, 3374},
+    {2947, 1480},
+    {58, 496},
+    {2312, 2247},
+    {3990, 223},
+    {1694, 504},
+    {4613, 1557},
+    {1046, 414},
+    {871, 255},
+    {2753, 3286},
+    {879, 403},
+    {3435, 1696},
+    {1018, 1954},
+    {1792, 914},
+    {4644, 912},
+    {2395, 1051},
+    {4117, 2593},
+    {3658, 3088},
+    {4045, 1763},
+    {2483, 253},
+    {4057, 3771},
+    {1405, 2144},
+    {4172, 1166},
+    {3221, 2475},
+    {214, 3186},
+    {2678, 1155},
+    {958, 1959},
+    {3986, 20},
+    {3728, 28},
+    {2199, 3096},
+    {3732, 525},
+    {1773, 1363},
+    {3865, 56},
+    {3565, 1395},
+    {567, 748},
+    {2954, 2898},
+    {1197, 2462},
+    {2323, 820},
+    {1991, 3101},
+    {3855, 2037},
+    {1997, 988},
+    {4513, 734},
+    {2123, 1753},
+    {643, 978},
+    {3585, 2194},
+    {1238, 1749},
+    {3064, 908},
+    {2139, 1212},
+    {2455, 1446},
+    {4015, 361},
+    {2450, 1577},
+    {4483, 388},
+    {2309, 2862},
+    {82, 854},
+    {3116, 554},
+    {778, 468},
+    {2530, 1417},
+    {1979, 572},
+    {4300, 1049},
+    {2474, 1971},
+    {211, 2550},
+    {3223, 30},
+    {886, 1917},
+    {2721, 1156},
+    {1264, 3184},
+    {2848, 556},
+    {160, 2571},
+    {2995, 1811},
+    {4421, 1369},
+    {1520, 796},
+    {2131, 2149},
+    {2464, 3302},
+    {4008, 250},
+    {2469, 2159},
+    {4463, 969},
+    {2314, 391},
+    {791, 373},
+    {2511, 1657},
+    {3809, 241},
+    {1584, 3329},
+    {4034, 2358},
+    {3097, 614},
+    {14, 1967},
+    {2525, 2345},
+    {783, 3182},
+    {2133, 1942},
+    {4006, 3829},
+    {2468, 819},
+    {4464, 2815},
+    {2315, 3706},
+    {50, 2140},
+    {3125, 438},
+    {792, 3697},
+    {0, 2797},
+    {0, 3826},
+    {0, 964},
+    {0, 3723},
+    {0, 1913},
+    {0, 847},
+    {0, 3053},
+    {0, 3379},
+    {0, 839},
+    {0, 1809},
+    {0, 1777},
+    {0, 1128},
     {0, 3914},
-    {0, 2152},
-    {0, 1858},
-    {0, 948},
-    {0, 1687},
-    {0, 3902},
-    {0, 3786},
-    {0, 1278},
-    {0, 1918},
-    {0, 2053},
-    {0, 3750},
-    {0, 3667},
-    {0, 3011},
+    {0, 694},
+    {0, 2704},
+    {0, 3624},
+    {0, 1948},
+    {0, 631},
+    {0, 3618},
     {0, 2821},
-    {0, 3132},
-    {0, 1815},
-    {0, 1969},
-    {0, 3513},
-    {0, 3711},
-    {0, 1924},
-    {0, 2096},
-    {0, 905},
-    {0, 1758},
-    {0, 280},
-    {0, 2883},
-    {0, 465},
-    {0, 1135},
-    {1653, 2},
-    {5128, 2},
-    {4869, 2},
-    {1385, 2},
-    {2711, 3470},
-    {1995, 3190},
-    {2806, 487},
-    {232, 3327},
-    {4658, 3052},
-    {1485, 460},
-    {495, 2758},
-    {2816, 2389},
-    {473, 2533},
-    {3878, 395},
-    {705, 43},
-    {4051, 1618},
-    {1084, 955},
-    {3757, 1676},
-    {1856, 3900},
-    {2285, 3378},
-    {866, 1289},
-    {3320, 374},
-    {864, 2064},
-    {4502, 1693},
-    {630, 3673},
-    {4389, 3002},
-    {1428, 1559},
-    {3558, 1194},
-    {741, 2601},
-    {246, 357},
-    {1650, 675},
-    {3929, 360},
-    {1668, 378},
-    {2725, 2540},
-    {1901, 2331},
-    {2933, 3373},
-    {501, 2826},
-    {4319, 3131},
-    {2439, 1818},
-    {1689, 191},
-    {220, 3506},
-    {2754, 3753},
-    {217, 356},
-    {3942, 1929},
-    {1215, 2097},
-    {3834, 900},
-    {638, 3815},
-    {4466, 2644},
-    {2263, 1093},
-    {1826, 987},
-    {2, 2257},
-    {43, 2944},
-    {4080, 1081},
-    {1078, 833},
-    {3719, 2022},
-    {4473, 1574},
-    {625, 1187},
-    {2585, 2621},
-    {3311, 2475},
-    {4538, 686},
-    {0, 245},
-    {0, 2394},
-    {0, 2476},
-    {0, 3242},
-    {0, 3198},
-    {0, 2865},
-    {0, 213},
-    {0, 66},
-    {0, 2941},
-    {0, 2656},
-    {0, 2250},
-    {0, 182},
-    {0, 576},
-    {0, 1229},
-    {0, 1694},
-    {0, 1085},
-    {0, 2498},
-    {0, 2576},
-    {0, 802},
-    {0, 186},
-    {0, 533},
-    {0, 2661},
-    {0, 2215},
-    {0, 3472},
-    {0, 2553},
-    {0, 3885},
-    {0, 1628},
-    {0, 1531},
-    {0, 3564},
-    {0, 3282},
-    {0, 3355},
-    {0, 1617},
-    {0, 1387},
-    {0, 397},
-    {0, 2095},
-    {0, 627},
-    {0, 3022},
+    {0, 3269},
+    {0, 2518},
+    {0, 1514},
+    {0, 2409},
+    {0, 319},
+    {0, 1381},
+    {0, 3544},
+    {0, 2892},
+    {0, 1385},
+    {0, 124},
+    {0, 125},
+    {0, 1632},
+    {0, 2635},
+    {0, 1271},
+    {0, 3135},
+    {0, 2326},
+    {0, 356},
+    {0, 2203},
+    {0, 2317},
+    {0, 3268},
+    {0, 50},
+    {0, 1933},
+    {0, 2551},
+    {0, 3466},
+    {0, 3812},
+    {0, 2828},
+    {0, 1887},
     {0, 2932},
-    {0, 73},
-    {0, 907},
-    {0, 990},
-    {0, 3003},
-    {0, 2822},
-    {0, 3743},
-    {0, 424},
-    {0, 2133},
-    {0, 3478},
-    {0, 3410},
-    {0, 1848},
-    {0, 1367},
-    {0, 1602},
-    {0, 2887},
-    {0, 2241},
-    {0, 2677},
-    {0, 589},
-    {0, 174},
-    {0, 1712},
-    {0, 1202},
-    {0, 865},
-    {0, 2431},
-    {0, 2289},
-    {0, 1024},
-    {0, 586},
-    {0, 113},
+    {0, 939},
+    {0, 2070},
+    {0, 3562},
+    {0, 2437},
+    {0, 2079},
+    {0, 1120},
+    {0, 1392},
+    {0, 440},
+    {0, 3378},
+    {0, 287},
+    {0, 2439},
+    {0, 3227},
+    {0, 1686},
+    {0, 963},
+    {0, 3233},
+    {0, 2306},
+    {0, 2503},
+    {0, 3250},
+    {0, 308},
+    {0, 3352},
+    {0, 1492},
+    {0, 472},
     {0, 2234},
-    {0, 2630},
-    {0, 3211},
-    {0, 2364},
-    {0, 3550},
-    {0, 1284},
-    {0, 1448},
-    {0, 3901},
-    {0, 3339},
-    {5035, 2},
-    {2865, 2},
-    {4968, 2},
-    {3086, 2},
-    {5026, 2},
-    {2224, 2},
-    {2209, 2},
-    {4579, 2},
-    {4895, 2},
-    {5100, 2},
-    {4876, 2},
-    {455, 2},
-    {2910, 2},
-    {5113, 2},
-    {4054, 2},
-    {4934, 2},
-    {2017, 2},
-    {4830, 2},
-    {4508, 2},
-    {5091, 2},
-    {83, 2},
-    {4769, 2},
-    {2098, 2},
-    {2174, 2},
-    {4740, 2},
-    {4915, 2},
-    {1556, 2},
-    {421, 2},
-    {386, 2},
-    {4979, 2},
-    {5102, 2},
-    {2039, 2},
-    {3076, 2},
-    {0, 523},
-    {0, 2166},
-    {0, 3432},
-    {0, 3364},
+    {0, 3740},
+    {0, 489},
+    {0, 1649},
+    {0, 1587},
+    {0, 153},
+    {0, 2418},
+    {0, 3122},
+    {0, 3600},
+    {0, 3042},
+    {0, 2174},
+    {0, 2713},
+    {0, 674},
+    {0, 1804},
+    {0, 3745},
+    {0, 2665},
+    {0, 1795},
+    {0, 129},
+    {0, 1633},
+    {0, 2634},
+    {0, 1274},
+    {0, 3137},
+    {0, 2324},
+    {0, 355},
+    {0, 2202},
+    {0, 2316},
+    {0, 3267},
+    {0, 3048},
+    {0, 3609},
+    {0, 693},
+    {0, 3916},
+    {0, 2189},
+    {0, 2881},
+    {0, 3108},
+    {0, 1092},
+    {0, 2018},
+    {0, 1787},
+    {0, 1146},
+    {0, 3905},
+    {0, 2681},
+    {0, 3635},
+    {3677, 1},
+    {4999, 1},
+    {4927, 1},
+    {1370, 1},
+    {3796, 3468},
+    {1471, 714},
+    {4398, 1923},
+    {703, 2201},
+    {188, 663},
+    {200, 1096},
+    {2977, 3035},
+    {3, 3909},
+    {2359, 1880},
+    {4031, 130},
+    {1739, 2447},
+    {4589, 2895},
+    {480, 2933},
+    {62, 3701},
+    {3272, 828},
+    {53, 532},
+    {2796, 2048},
+    {254, 958},
+    {2471, 2781},
+    {4140, 2056},
+    {1886, 970},
+    {4742, 2161},
+    {4615, 591},
+    {4195, 1266},
+    {1498, 2305},
+    {4204, 1626},
+    {2292, 3451},
+    {4340, 2651},
+    {3043, 199},
+    {1284, 1808},
+    {3620, 2643},
+    {653, 3377},
+    {662, 2786},
+    {230, 2412},
+    {3068, 1391},
+    {206, 397},
+    {2953, 477},
+    {38, 1498},
+    {2345, 862},
+    {4055, 2799},
+    {1772, 1511},
+    {4551, 590},
+    {3613, 1396},
+    {3259, 436},
+    {81, 3375},
+    {3265, 279},
+    {1195, 2440},
+    {4014, 1688},
+    {2302, 966},
+    {4548, 3236},
+    {1783, 2311},
+    {661, 926},
+    {233, 1964},
+    {3070, 2976},
+    {207, 1843},
+    {2952, 3673},
+    {0, 2492},
+    {0, 3904},
+    {0, 149},
+    {0, 1373},
     {0, 1813},
-    {0, 1428},
-    {0, 1550},
-    {0, 3405},
-    {0, 3258},
-    {0, 2456},
-    {0, 2405},
-    {0, 3607},
-    {0, 1273},
-    {0, 1371},
-    {0, 3836},
-    {0, 3402},
-    {0, 3222},
-    {0, 1426},
+    {0, 1103},
+    {0, 3919},
+    {0, 669},
+    {0, 2707},
+    {0, 3606},
+    {0, 2006},
+    {0, 594},
+    {0, 3611},
+    {0, 2792},
+    {0, 3437},
+    {0, 2314},
+    {0, 1240},
+    {0, 2645},
+    {0, 604},
+    {0, 1620},
+    {0, 3294},
+    {0, 2725},
+    {0, 1624},
+    {0, 501},
+    {0, 155},
+    {0, 1586},
+    {0, 2666},
+    {0, 1222},
+    {0, 3152},
+    {0, 2281},
+    {0, 420},
+    {0, 2175},
+    {0, 2285},
+    {0, 3248},
+    {0, 3255},
+    {0, 2501},
+    {0, 1527},
+    {0, 2395},
+    {0, 337},
+    {0, 1361},
+    {0, 3533},
+    {0, 2911},
+    {0, 1372},
+    {0, 151},
+    {0, 1793},
+    {0, 1148},
+    {0, 3901},
+    {0, 717},
+    {0, 2689},
+    {0, 3637},
+    {0, 1963},
+    {0, 1534},
+    {0, 452},
+    {0, 2255},
+    {0, 3703},
+    {0, 444},
+    {0, 1601},
+    {0, 822},
+    {0, 2074},
+    {0, 2897},
+    {0, 1943},
+    {0, 3693},
+    {0, 2830},
+    {0, 1174},
     {0, 1512},
-    {0, 257},
-    {0, 1341},
-    {0, 881},
-    {0, 2350},
-    {0, 2262},
-    {0, 1008},
-    {0, 610},
-    {0, 91},
-    {0, 2309},
-    {0, 2623},
-    {0, 3118},
-    {0, 2789},
-    {0, 3261},
-    {5047, 2},
-    {578, 2},
-    {4768, 2},
-    {1074, 2},
-    {3285, 2},
-    {2560, 2},
-    {4109, 2},
-    {1845, 2},
-    {4143, 2},
-    {55, 2},
-    {4475, 2},
-    {4772, 2},
-    {5064, 2},
-    {4766, 2},
-    {265, 2},
-    {2792, 2},
-    {263, 2},
-    {0, 1821},
-    {0, 363},
-    {0, 2814},
-    {0, 2705},
-    {0, 377},
-    {0, 1190},
-    {0, 672},
-    {0, 2765},
-    {0, 3017},
-    {0, 3577},
-    {0, 2277},
-    {0, 3721},
-    {0, 1396},
-    {0, 1219},
-    {0, 3725},
-    {0, 3514},
-    {0, 3119},
-    {0, 1306},
-    {0, 1633},
-    {0, 92},
-    {0, 3540},
-    {0, 2378},
-    {0, 913},
-    {0, 739},
-    {0, 2530},
-    {0, 3062},
-    {0, 2757},
-    {0, 688},
-    {0, 1142},
-    {0, 1862},
-    {0, 638},
-    {0, 2081},
-    {4816, 2},
-    {161, 181},
-    {1055, 286},
-    {438, 68},
-    {548, 320},
-    {104, 485},
-    {37, 544},
-    {145, 198},
-    {665, 57},
-    {1, 107},
-    {240, 44},
-    {379, 162},
-    {255, 120},
-    {470, 50},
-    {1134, 222},
-    {12, 731},
-    {182, 432},
-    {21, 30},
-    {440, 800},
-    {662, 167},
-    {313, 1077},
-    {228, 105},
-    {580, 637},
-    {5088, 2},
-    {4874, 2},
-    {3631, 1408},
-    {3377, 2514},
-    {3501, 820},
-    {3920, 3682},
-    {1007, 2367},
-    {3923, 1007},
-    {3481, 2955},
-    {4809, 2},
-    {5043, 2},
-    {5079, 2},
-    {4479, 3411},
-    {398, 2924},
-    {4484, 232},
-    {4285, 998},
-    {3855, 3681},
-    {1931, 1688},
-    {84, 181},
-    {186, 171},
-    {214, 7},
-    {745, 184},
-    {1341, 320},
-    {9, 134},
-    {1044, 131},
-    {600, 307},
-    {207, 191},
-    {262, 37},
-    {47, 544},
-    {331, 198},
-    {288, 57},
-    {405, 107},
-    {493, 44},
-    {28, 162},
-    {293, 120},
-    {100, 5},
-    {769, 886},
-    {917, 3785},
-    {725, 59},
-    {224, 106},
-    {517, 173},
-    {10, 15},
-    {1502, 278},
-    {870, 155},
-    {154, 72},
-    {110, 480},
-    {599, 615},
-    {227, 1324},
-    {825, 291},
-    {1034, 205},
-    {194, 64},
-    {934, 83},
-    {650, 240},
-    {2078, 72},
-    {1828, 130},
-    {454, 1260},
-    {1422, 1418},
-    {213, 78},
-    {266, 287},
-    {120, 216},
-    {54, 297},
-    {336, 499},
-    {290, 59},
-    {589, 106},
-    {1195, 173},
-    {574, 15},
-    {2162, 278},
-    {969, 155},
-    {423, 72},
-    {568, 480},
-    {344, 615},
-    {343, 1324},
-    {40, 291},
-    {198, 205},
-    {1301, 64},
-    {1248, 83},
-    {674, 240},
-    {409, 130},
-    {98, 130},
-    {292, 1260},
-    {241, 1418},
-    {876, 78},
-    {988, 287},
-    {1692, 216},
-    {1148, 297},
-    {1424, 192},
-    {947, 15},
-    {70, 72},
-    {3313, 615},
-    {775, 78},
-    {2314, 240},
-    {2296, 36},
-    {742, 72},
-    {1082, 15},
-    {4026, 72},
-    {2291, 615},
-    {1732, 78},
-    {4615, 240},
-    {2340, 36},
-    {1037, 72},
-    {3434, 15},
-    {3840, 72},
-    {1054, 615},
-    {4002, 78},
-    {2053, 240},
-    {1379, 36},
-    {2639, 72},
-    {4421, 15},
-    {4268, 72},
-    {4298, 615},
-    {3014, 78},
-    {1934, 240},
-    {2557, 36},
-    {949, 72},
-    {366, 15},
-    {2515, 72},
-    {4111, 615},
-    {4036, 78},
-    {3982, 240},
-    {3267, 36},
-    {1649, 1213},
-    {3457, 1213},
-    {1675, 319},
-    {3487, 1364},
-    {3163, 1146},
-    {2708, 2411},
-    {807, 1104},
-    {3279, 1084},
-    {4488, 584},
-    {4749, 1661},
-    {4639, 2130},
-    {2495, 1462},
-    {2417, 2340},
-    {3067, 1814},
-    {4672, 1115},
-    {4013, 170},
-    {2381, 2392},
-    {4599, 636},
-    {3329, 203},
-    {3115, 2047},
-    {3198, 1696},
-    {4206, 316},
-    {706, 1906},
-    {3663, 142},
-    {2451, 1400},
-    {1569, 425},
-    {4746, 2738},
-    {2200, 2665},
-    {892, 2290},
-    {803, 56},
-    {761, 100},
-    {1789, 702},
-    {3155, 794},
-    {1356, 3873},
-    {4660, 971},
-    {4020, 319},
-    {2349, 1364},
-    {4552, 1146},
-    {3355, 2411},
-    {3087, 1104},
-    {3179, 1084},
-    {4204, 584},
-    {735, 1661},
-    {3677, 2130},
-    {756, 1462},
-    {308, 2340},
-    {3146, 1115},
-    {954, 170},
-    {2268, 636},
-    {2341, 2047},
-    {2464, 1696},
-    {191, 316},
-    {4631, 1906},
-    {567, 142},
-    {3896, 1400},
-    {4243, 2535},
-    {1534, 425},
-    {3658, 763},
-    {3006, 100},
-    {2863, 3473},
-    {2830, 1784},
-    {4388, 926},
-    {498, 903},
-    {4575, 2154},
-    {0, 285},
-    {0, 3370},
+    {0, 2820},
+    {0, 3619},
+    {0, 3834},
+    {0, 2805},
+    {0, 1936},
+    {0, 2910},
+    {0, 981},
+    {0, 2035},
+    {4955, 1},
+    {1723, 1},
+    {4836, 1},
+    {2306, 1},
+    {4995, 1},
+    {2566, 1},
+    {906, 1},
+    {3409, 1},
+    {4845, 1},
+    {4834, 1},
+    {4973, 1},
+    {4128, 1},
+    {3290, 1},
+    {4945, 1},
+    {122, 1},
+    {4982, 1},
+    {114, 1},
+    {5047, 1},
+    {3630, 1},
+    {4856, 1},
+    {680, 1},
+    {4773, 1},
+    {2254, 1},
+    {1666, 1},
+    {4248, 1},
+    {4848, 1},
+    {4298, 1},
+    {2348, 1},
+    {2955, 1},
+    {5072, 1},
+    {5056, 1},
+    {2087, 1},
+    {3858, 1},
+    {0, 2728},
+    {0, 3912},
+    {0, 1127},
+    {0, 3607},
+    {0, 1799},
+    {0, 671},
+    {0, 2998},
+    {0, 3440},
+    {0, 662},
     {0, 1894},
-    {0, 2862},
-    {0, 3249},
-    {0, 2043},
-    {0, 537},
-    {0, 3201},
-    {0, 2116},
-    {0, 2175},
-    {0, 1480},
-    {0, 2330},
-    {0, 978},
-    {0, 3816},
-    {0, 2466},
-    {0, 810},
-    {0, 2890},
-    {0, 2021},
-    {0, 3121},
-    {0, 3251},
-    {0, 3618},
-    {0, 1193},
+    {0, 598},
+    {0, 1272},
     {0, 2302},
+    {0, 1631},
+    {0, 3457},
+    {0, 2662},
+    {0, 190},
+    {0, 1815},
+    {0, 2650},
+    {0, 3372},
+    {0, 3148},
+    {0, 2624},
+    {0, 1640},
+    {0, 2288},
+    {0, 181},
     {0, 1236},
-    {0, 770},
-    {0, 2687},
-    {0, 3179},
-    {0, 569},
-    {0, 2847},
-    {0, 2707},
-    {0, 2395},
-    {0, 1560},
-    {0, 3697},
-    {0, 835},
-    {1070, 69},
-    {708, 806},
-    {1224, 166},
-    {596, 1347},
-    {143, 352},
-    {514, 1163},
-    {264, 79},
-    {1141, 199},
-    {556, 304},
-    {1532, 787},
-    {1098, 221},
-    {29, 189},
-    {354, 328},
-    {219, 306},
-    {13, 329},
-    {1429, 609},
-    {1661, 163},
-    {316, 127},
-    {1383, 554},
-    {15, 786},
-    {360, 1358},
-    {231, 260},
-    {1072, 1061},
-    {2774, 1520},
-    {1708, 371},
-    {2005, 1453},
-    {699, 498},
-    {757, 469},
-    {3309, 659},
-    {3880, 1004},
-    {3375, 326},
-    {444, 95},
-    {1872, 1},
-    {3947, 3518},
-    {2694, 3778},
-    {2587, 864},
-    {2546, 2480},
-    {4669, 1575},
-    {107, 992},
-    {4297, 2374},
-    {2499, 282},
-    {3334, 3393},
-    {39, 1827},
-    {1758, 2247},
-    {3552, 1056},
-    {157, 746},
-    {885, 738},
-    {2582, 1411},
-    {268, 345},
-    {1578, 1900},
-    {1865, 2528},
-    {1742, 341},
-    {736, 2997},
-    {4202, 2318},
-    {1243, 472},
-    {2489, 1138},
-    {3341, 1713},
-    {8, 1571},
-    {2757, 1747},
-    {4041, 443},
-    {4113, 2837},
-    {4160, 402},
-    {3158, 3365},
-    {1785, 2937},
-    {3564, 279},
-    {1736, 2737},
-    {2279, 1092},
-    {4098, 3333},
-    {1707, 431},
-    {294, 3814},
-    {2408, 1482},
-    {2527, 1087},
-    {3460, 181},
-    {2993, 171},
-    {1056, 7},
-    {3545, 101},
-    {4252, 551},
-    {4440, 184},
-    {4346, 286},
-    {2805, 29},
-    {2171, 482},
-    {2783, 68},
-    {1314, 320},
-    {2120, 268},
-    {3701, 134},
-    {1495, 131},
-    {538, 485},
-    {555, 307},
-    {661, 191},
-    {1993, 37},
-    {2968, 544},
-    {2332, 198},
-    {4256, 57},
-    {3885, 107},
-    {1894, 44},
-    {4469, 162},
-    {3462, 120},
-    {3560, 5},
-    {3600, 2693},
-    {1183, 1149},
-    {4108, 2300},
-    {430, 3511},
-    {1227, 20},
-    {2312, 3825},
-    {2948, 1243},
-    {4710, 3134},
-    {2335, 1727},
-    {3315, 1930},
-    {1509, 3346},
-    {2488, 839},
-    {1952, 3456},
-    {2087, 1018},
-    {2129, 2414},
-    {502, 1395},
-    {4390, 892},
-    {249, 2527},
-    {3702, 3300},
-    {4439, 391},
-    {1313, 2698},
-    {3863, 2831},
-    {2924, 2327},
-    {2947, 1749},
-    {3066, 3597},
-    {4317, 684},
-    {570, 1329},
-    {4640, 3908},
-    {1774, 1903},
-    {2252, 2959},
-    {4139, 139},
-    {1669, 342},
-    {341, 708},
-    {36, 3857},
-    {195, 1224},
-    {2441, 2278},
-    {2469, 3574},
-    {1889, 1655},
-    {2231, 263},
-    {1804, 3089},
-    {4547, 355},
-    {2413, 108},
-    {819, 805},
-    {874, 3732},
-    {986, 1382},
-    {1690, 2421},
-    {3212, 3637},
-    {1425, 1486},
-    {945, 3324},
-    {65, 348},
-    {3317, 2082},
-    {776, 1790},
-    {2313, 2568},
-    {2294, 1211},
-    {2210, 3847},
-    {222, 1184},
-    {869, 2459},
-    {3186, 2617},
-    {4700, 3005},
-    {4539, 1984},
-    {4580, 3390},
-    {2756, 414},
-    {2222, 2093},
-    {2836, 3312},
-    {935, 3537},
-    {4624, 1883},
-    {536, 3330},
-    {118, 923},
-    {902, 3734},
-    {2564, 1242},
-    {244, 1389},
-    {1597, 1849},
-    {1722, 119},
-    {716, 3126},
-    {4214, 2783},
-    {1265, 644},
-    {4528, 2077},
-    {1821, 3169},
-    {3979, 3305},
-    {2634, 1140},
-    {2520, 2240},
-    {4637, 1299},
-    {170, 711},
-    {4329, 2609},
-    {1013, 2996},
-    {688, 1329},
-    {3365, 3444},
-    {1245, 3353},
-    {1977, 3894},
-    {2045, 766},
-    {2108, 2624},
-    {4402, 1188},
-    {270, 2112},
-    {3761, 3684},
-    {4363, 995},
-    {1386, 2246},
-    {3788, 2348},
-    {2858, 1211},
-    {3018, 2182},
-    {2979, 3213},
-    {2189, 2186},
-    {4213, 3304},
-    {250, 3625},
-    {89, 2369},
-    {2367, 1452},
-    {2559, 822},
-    {1950, 488},
-    {929, 2751},
-    {3131, 2898},
-    {4638, 2259},
-    {4604, 1670},
-    {4485, 3546},
-    {2661, 762},
-    {2302, 1248},
-    {2926, 3876},
-    {1081, 1975},
-    {590, 2922},
-    {3467, 46},
-    {1191, 258},
-    {1891, 768},
-    {2168, 3893},
-    {2038, 1276},
-    {429, 2226},
-    {4460, 3610},
-    {340, 1737},
-    {3041, 284},
-    {449, 26},
-    {1426, 877},
-    {1405, 3782},
-    {1172, 2365},
-    {3766, 3683},
-    {817, 1567},
-    {2109, 246},
-    {3716, 3056},
-    {1510, 2907},
-    {518, 2643},
-    {581, 1292},
-    {689, 3905},
-    {2016, 1120},
-    {2949, 1719},
-    {2310, 3582},
-    {3782, 3868},
-    {4360, 752},
-    {1413, 2521},
-    {3820, 2527},
-    {2837, 2958},
-    {3046, 1935},
-    {3001, 3343},
-    {4276, 478},
-    {620, 2041},
-    {4697, 3253},
-    {1305, 3584},
-    {2141, 1119},
-    {3708, 2380},
-    {1507, 2217},
-    {535, 2860},
-    {562, 2070},
-    {666, 247},
-    {2957, 1962},
-    {2337, 3376},
-    {3007, 1782},
-    {608, 351},
-    {2893, 154},
-    {3898, 813},
-    {3673, 3745},
-    {3776, 1402},
-    {3641, 1997},
-    {1280, 3623},
-    {3078, 1514},
-    {1745, 2732},
-    {4610, 439},
-    {2318, 528},
-    {758, 1031},
-    {939, 3669},
-    {897, 1606},
-    {1612, 2492},
-    {3307, 3794},
-    {1524, 1419},
-    {2479, 795},
-    {3360, 3841},
-    {19, 1355},
-    {2769, 1270},
-    {4032, 1988},
-    {4119, 3009},
-    {4167, 315},
-    {3148, 3228},
-    {1769, 2877},
-    {3569, 514},
-    {1940, 1204},
-    {1500, 2666},
-    {2125, 730},
-    {1105, 224},
-    {1158, 1910},
-    {1409, 415},
-    {1718, 2007},
-    {2798, 870},
-    {3642, 3797},
-    {399, 1294},
-    {3062, 1478},
-    {3742, 1805},
-    {3836, 3055},
-    {3864, 34},
-    {3451, 3187},
-    {1476, 2731},
-    {3275, 590},
-    {221, 2427},
-    {824, 1494},
-    {2686, 3555},
-    {1792, 3195},
-    {1638, 639},
-    {1667, 2750},
-    {942, 1763},
-    {722, 2292},
-    {3122, 3663},
-    {990, 3538},
-    {2247, 3262},
-    {2384, 455},
-    {4657, 309},
-    {603, 2969},
-    {2440, 1021},
-    {1577, 3644},
-    {4755, 1669},
-    {2212, 1484},
-    {882, 2172},
-    {809, 2753},
-    {773, 641},
-    {1773, 3451},
-    {3150, 3081},
-    {1366, 118},
-    {4683, 581},
-    {3997, 3181},
-    {2364, 2056},
-    {4577, 2200},
-    {3336, 1546},
-    {3103, 2383},
-    {3190, 969},
-    {4210, 3792},
-    {713, 2495},
-    {3647, 853},
-    {1591, 3453},
-    {4733, 1920},
-    {2178, 1755},
-    {914, 1420},
-    {783, 2523},
-    {743, 919},
-    {3168, 2408},
-    {1368, 1026},
-    {3196, 2236},
-    {2668, 1745},
-    {836, 3702},
-    {3249, 3595},
-    {4520, 3224},
-    {4721, 392},
-    {2389, 202},
-    {3024, 2930},
-    {1459, 2628},
-    {1960, 1245},
-    {3828, 3769},
-    {1353, 3827},
-    {693, 3383},
-    {380, 305},
-    {2157, 2033},
-    {2828, 490},
-    {2207, 2850},
-    {3590, 3209},
-    {1208, 2795},
-    {3411, 2744},
-    {4378, 2436},
-    {4315, 1612},
-    {4221, 3677},
-    {2942, 823},
-    {2012, 1450},
-    {2619, 3822},
-    {673, 749},
-    {1031, 3853},
-    {3054, 1413},
-    {387, 1227},
-    {1490, 1939},
-    {1297, 340},
-    {1179, 3246},
-    {3747, 2864},
-    {801, 470},
-    {4423, 1464},
-    {3705, 2471},
-    {2145, 665},
-    {4284, 846},
-    {3512, 190},
-    {3508, 3524},
-    {3392, 1841},
-    {4059, 2205},
-    {2249, 3641},
-    {1781, 1028},
-    {4567, 2297},
-    {2357, 2416},
-    {724, 2734},
-    {977, 2146},
-    {860, 3124},
-    {3344, 1808},
-    {1559, 3448},
-    {1796, 3535},
-    {2237, 1171},
-    {4168, 2444},
-    {1616, 2286},
-    {223, 2799},
-    {184, 2012},
-    {2315, 335},
-    {2623, 1892},
-    {2013, 3314},
-    {50, 1501},
-    {959, 2422},
-    {2533, 1198},
-    {303, 1034},
-    {1691, 535},
-    {1730, 3122},
-    {1850, 2145},
-    {821, 3094},
-    {4094, 3439},
-    {2614, 2210},
-    {3239, 2718},
-    {168, 389},
-    {2652, 593},
-    {3986, 1082},
-    {4148, 3716},
-    {4103, 1583},
-    {3134, 2477},
-    {1818, 3808},
-    {3602, 1476},
-    {101, 1767},
-    {2539, 365},
-    {322, 128},
-    {1734, 3731},
-    {1861, 1378},
-    {837, 2423},
-    {4083, 3634},
-    {1132, 1496},
-    {4110, 3593},
-    {4596, 1131},
-    {4016, 2232},
-    {2785, 2872},
-    {2482, 2087},
-    {2606, 3311},
-    {4732, 267},
-    {30, 1944},
-    {4250, 3386},
-    {550, 774},
-    {3502, 2562},
-    {1157, 2636},
-    {1918, 2903},
-    {2128, 1866},
-    {466, 505},
-    {3691, 2739},
-    {4452, 2177},
-    {1284, 3264},
-    {3913, 3205},
-    {2883, 3666},
-    {4311, 1436},
-    {595, 841},
-    {1342, 3449},
-    {2114, 104},
-    {1516, 3087},
-    {523, 2503},
-    {683, 3739},
-    {2011, 1019},
-    {2944, 1551},
-    {2306, 2927},
-    {3075, 1998},
-    {1014, 3504},
-    {3624, 3395},
-    {4303, 3837},
-    {4394, 683},
-    {4420, 2607},
-    {2875, 1750},
-    {2074, 1089},
-    {2721, 2239},
-    {865, 467},
-    {177, 3248},
-    {3251, 2161},
-    {842, 2009},
-    {2388, 1690},
-    {2241, 2279},
-    {2260, 1172},
-    {320, 3855},
-    {4523, 2649},
-    {447, 750},
-    {26, 646},
-    {972, 3125},
-    {2514, 2030},
-    {365, 2150},
-    {1647, 1604},
-    {1786, 2418},
-    {1819, 1029},
-    {802, 3735},
-    {1190, 921},
-    {1854, 2878},
-    {2186, 2002},
-    {4215, 3137},
-    {1598, 3240},
-    {243, 3606},
-    {160, 1185},
-    {96, 2293},
-    {2374, 1206},
-    {2567, 796},
-    {1956, 2664},
-    {4144, 2231},
-    {4563, 1739},
-    {1768, 3698},
-    {4027, 3594},
-    {2777, 3231},
-    {2617, 2845},
-    {4751, 1982},
-    {17, 226},
-    {4222, 2925},
-    {1851, 2670},
-    {2205, 1207},
-    {4198, 3749},
-    {1570, 3850},
-    {291, 3408},
-    {108, 350},
-    {53, 2966},
-    {2359, 2001},
-    {1959, 2876},
-    {2625, 594},
-    {3227, 3183},
-    {193, 2068},
-    {2685, 2209},
-    {3955, 1543},
-    {4138, 965},
-    {3141, 3795},
-    {1793, 2491},
-    {3588, 862},
-    {2055, 159},
-    {1371, 3427},
-    {4385, 1879},
-    {1942, 1789},
-    {1269, 1460},
-    {1000, 2549},
-    {1090, 889},
-    {1542, 3622},
-    {3398, 2449},
-    {1593, 1065},
-    {3025, 1720},
-    {3430, 2268},
-    {621, 993},
-    {2841, 1118},
-    {3818, 479},
-    {3753, 3278},
-    {3517, 2953},
-    {1411, 3379},
-    {3191, 1957},
-    {1470, 2311},
-    {1973, 1627},
-    {3822, 3632},
-    {698, 3291},
-    {378, 504},
-    {505, 2861},
-    {2154, 1869},
-    {2824, 367},
-    {2199, 2987},
-    {3527, 3687},
-    {2915, 1017},
-    {1168, 656},
-    {3505, 2355},
-    {4408, 2759},
-    {4290, 2178},
-    {4314, 3203},
-    {3043, 102},
-    {1911, 1817},
-    {2534, 3493},
-    {700, 1352},
-    {362, 2551},
-    {3096, 783},
-    {973, 885},
-    {2396, 1791},
-    {109, 2773},
-    {4677, 3133},
-    {617, 2126},
-    {206, 1257},
-    {840, 2635},
-    {2666, 910},
-    {180, 773},
-    {1808, 250},
-    {1620, 3348},
-    {1659, 1875},
-    {924, 2856},
-    {3977, 3257},
-    {1670, 3763},
-    {2334, 873},
-    {4058, 2653},
-    {1728, 2546},
-    {75, 3048},
-    {309, 1800},
-    {256, 3430},
-    {2217, 605},
-    {2745, 2164},
-    {2144, 3147},
-    {3966, 3487},
-    {4715, 88},
-    {1602, 2940},
-    {4155, 3029},
-    {2632, 2542},
-    {2641, 1444},
-    {2760, 3821},
-    {4607, 1005},
-    {236, 1570},
-    {4365, 3674},
-    {1715, 3152},
-    {2316, 604},
-    {4063, 2868},
-    {1738, 2771},
-    {72, 2370},
-    {318, 1534},
-    {274, 3624},
-    {2239, 876},
-    {2731, 1410},
-    {2107, 3757},
-    {346, 809},
-    {2492, 727},
-    {4131, 358},
-    {4005, 3415},
-    {3959, 1956},
-    {3255, 2808},
-    {1662, 3287},
-    {3471, 2115},
-    {1935, 1656},
-    {1494, 2281},
-    {2124, 1169},
-    {1097, 430},
-    {1160, 3245},
-    {1264, 2010},
-    {1416, 2961},
-    {3525, 3368},
-    {1725, 1902},
-    {2902, 55},
-    {3543, 3523},
-    {488, 1981},
-    {2995, 1458},
-    {3665, 1366},
-    {3905, 2193},
-    {3802, 852},
-    {3386, 3719},
-    {1541, 2333},
-    {3324, 966},
-    {3535, 759},
-    {2907, 3877}
+    {0, 3414},
+    {0, 3020},
+    {0, 1226},
+    {0, 299},
+    {0, 330},
+    {0, 1484},
+    {4931, 1},
+    {1242, 1},
+    {4768, 1},
+    {4621, 1},
+    {1907, 1},
+    {4609, 1},
+    {2023, 1},
+    {4753, 1},
+    {2667, 1},
+    {927, 1},
+    {3240, 1},
+    {4772, 1},
+    {5025, 1},
+    {4770, 1},
+    {2260, 1},
+    {4379, 1},
+    {3037, 1},
+    {0, 3065},
+    {0, 3578},
+    {0, 729},
+    {0, 3883},
+    {0, 2085},
+    {0, 1205},
+    {0, 2810},
+    {0, 3205},
+    {0, 1214},
+    {0, 1995},
+    {0, 1961},
+    {0, 923},
+    {0, 3645},
+    {0, 1059},
+    {0, 2943},
+    {0, 3780},
+    {0, 1790},
+    {0, 237},
+    {0, 3784},
+    {0, 3087},
+    {0, 3532},
+    {0, 2235},
+    {0, 1356},
+    {0, 2567},
+    {0, 577},
+    {0, 1663},
+    {0, 3249},
+    {0, 2749},
+    {0, 1655},
+    {0, 372},
+    {0, 370},
+    {0, 1460},
+    {0, 73},
+    {0, 1910},
+    {0, 2508},
+    {0, 3454},
+    {0, 3226},
+    {0, 2533},
+    {0, 1499},
+    {0, 2423},
+    {0, 300},
+    {0, 1393},
+    {0, 3500},
+    {0, 2939},
+    {0, 1406},
+    {0, 185},
+    {0, 110},
+    {0, 1619},
+    {0, 2630},
+    {0, 1260},
+    {0, 3127},
+    {0, 2312},
+    {0, 367},
+    {0, 2204},
+    {0, 2323},
+    {0, 3281},
+    {0, 2835},
+    {4812, 1},
+    {1596, 196},
+    {45, 169},
+    {1562, 4},
+    {682, 163},
+    {27, 157},
+    {276, 80},
+    {94, 139},
+    {2051, 213},
+    {35, 76},
+    {269, 150},
+    {806, 212},
+    {1725, 19},
+    {923, 360},
+    {805, 206},
+    {17, 89},
+    {715, 21},
+    {835, 265},
+    {155, 350},
+    {212, 1141},
+    {1209, 387},
+    {708, 529},
+    {542, 1546},
+    {4924, 1},
+    {5126, 1},
+    {3481, 874},
+    {1642, 352},
+    {3158, 3415},
+    {3788, 2459},
+    {3964, 3626},
+    {124, 1026},
+    {1317, 3091},
+    {4799, 1},
+    {4846, 1},
+    {4920, 1},
+    {1553, 2446},
+    {1753, 3865},
+    {2534, 835},
+    {2539, 3898},
+    {831, 1382},
+    {4177, 2512},
+    {397, 196},
+    {41, 158},
+    {66, 48},
+    {36, 187},
+    {157, 163},
+    {788, 55},
+    {64, 22},
+    {184, 160},
+    {337, 397},
+    {732, 54},
+    {199, 80},
+    {630, 139},
+    {133, 213},
+    {51, 76},
+    {1086, 150},
+    {1, 212},
+    {888, 19},
+    {250, 67},
+    {4183, 3652},
+    {1190, 3266},
+    {54, 254},
+    {812, 341},
+    {177, 27},
+    {1128, 6},
+    {1185, 112},
+    {780, 927},
+    {2651, 94},
+    {1020, 369},
+    {48, 533},
+    {532, 186},
+    {411, 726},
+    {944, 1575},
+    {39, 484},
+    {1094, 2239},
+    {632, 351},
+    {4035, 94},
+    {787, 123},
+    {1598, 887},
+    {794, 314},
+    {673, 697},
+    {1241, 258},
+    {1713, 807},
+    {2019, 63},
+    {545, 274},
+    {83, 254},
+    {299, 341},
+    {453, 27},
+    {740, 6},
+    {1062, 112},
+    {955, 927},
+    {763, 94},
+    {1226, 369},
+    {2432, 533},
+    {902, 186},
+    {455, 726},
+    {1299, 1575},
+    {1940, 484},
+    {1737, 2239},
+    {203, 351},
+    {2944, 123},
+    {1161, 123},
+    {547, 887},
+    {877, 314},
+    {1022, 697},
+    {889, 258},
+    {1256, 807},
+    {1064, 63},
+    {1674, 544},
+    {3333, 6},
+    {256, 94},
+    {4495, 533},
+    {1342, 697},
+    {3444, 351},
+    {1670, 15},
+    {3311, 94},
+    {3623, 6},
+    {2109, 94},
+    {1108, 533},
+    {2782, 697},
+    {2135, 351},
+    {4124, 15},
+    {1007, 94},
+    {760, 6},
+    {1609, 94},
+    {1722, 533},
+    {2562, 697},
+    {1881, 351},
+    {4636, 15},
+    {1711, 94},
+    {1088, 6},
+    {4012, 94},
+    {725, 533},
+    {1588, 697},
+    {1764, 351},
+    {2499, 15},
+    {1578, 94},
+    {3250, 6},
+    {539, 94},
+    {4440, 533},
+    {271, 697},
+    {4733, 351},
+    {2833, 15},
+    {2676, 1350},
+    {1910, 1350},
+    {3447, 402},
+    {1984, 713},
+    {1987, 488},
+    {3763, 1235},
+    {1251, 1229},
+    {2737, 1301},
+    {2381, 266},
+    {3026, 2173},
+    {2156, 633},
+    {150, 848},
+    {619, 925},
+    {3853, 2449},
+    {4507, 2058},
+    {1716, 1143},
+    {3361, 612},
+    {678, 652},
+    {4405, 876},
+    {305, 1317},
+    {4635, 681},
+    {2872, 1774},
+    {2761, 417},
+    {1788, 2208},
+    {2136, 890},
+    {3897, 1612},
+    {1107, 1602},
+    {2606, 476},
+    {2229, 673},
+    {2891, 68},
+    {2004, 660},
+    {330, 1674},
+    {468, 3679},
+    {3705, 1087},
+    {654, 2779},
+    {3528, 402},
+    {1382, 713},
+    {4522, 488},
+    {183, 1235},
+    {4209, 1229},
+    {466, 1301},
+    {2398, 266},
+    {2017, 2173},
+    {3443, 633},
+    {3596, 848},
+    {541, 925},
+    {4220, 2058},
+    {1675, 1143},
+    {3203, 652},
+    {1330, 1317},
+    {3457, 681},
+    {4067, 1774},
+    {3694, 417},
+    {488, 2208},
+    {1246, 890},
+    {2927, 1421},
+    {1990, 1612},
+    {3980, 2232},
+    {853, 660},
+    {3657, 75},
+    {1123, 2598},
+    {1785, 2640},
+    {1374, 1487},
+    {2873, 1080},
+    {0, 3323},
+    {0, 3691},
+    {0, 1030},
+    {0, 2009},
+    {0, 144},
+    {0, 3420},
+    {0, 2479},
+    {0, 787},
+    {0, 3875},
+    {0, 718},
+    {0, 2253},
+    {0, 2700},
+    {0, 2089},
+    {0, 1199},
+    {0, 1376},
+    {0, 2600},
+    {0, 2636},
+    {0, 810},
+    {0, 3809},
+    {0, 879},
+    {0, 2417},
+    {0, 2867},
+    {0, 2075},
+    {0, 961},
+    {0, 1351},
+    {0, 2515},
+    {0, 3155},
+    {0, 2060},
+    {0, 2822},
+    {0, 1988},
+    {0, 3383},
+    {0, 3747},
+    {0, 818},
+    {0, 1940},
+    {172, 784},
+    {2496, 509},
+    {570, 409},
+    {550, 74},
+    {1278, 696},
+    {868, 508},
+    {669, 210},
+    {2549, 145},
+    {222, 1090},
+    {2428, 238},
+    {307, 865},
+    {803, 1452},
+    {572, 1057},
+    {1954, 786},
+    {19, 383},
+    {924, 390},
+    {102, 204},
+    {59, 11},
+    {656, 285},
+    {1100, 70},
+    {1726, 936},
+    {716, 126},
+    {195, 375},
+    {773, 1256},
+    {154, 135},
+    {3407, 39},
+    {431, 218},
+    {2598, 2554},
+    {378, 1243},
+    {1820, 1470},
+    {74, 262},
+    {1637, 898},
+    {1730, 2},
+    {4327, 1567},
+    {423, 3833},
+    {4554, 3394},
+    {28, 307},
+    {2166, 1411},
+    {2347, 1184},
+    {3098, 3712},
+    {2976, 1768},
+    {1313, 3343},
+    {3742, 296},
+    {4295, 3085},
+    {1075, 593},
+    {7, 703},
+    {3136, 1288},
+    {1921, 1415},
+    {4486, 1502},
+    {560, 994},
+    {4697, 365},
+    {220, 781},
+    {2035, 1262},
+    {2477, 2250},
+    {3233, 827},
+    {2356, 2369},
+    {3982, 29},
+    {915, 3501},
+    {2928, 117},
+    {2198, 2387},
+    {2701, 1310},
+    {2486, 1702},
+    {449, 536},
+    {208, 159},
+    {4155, 3062},
+    {4028, 305},
+    {2262, 1945},
+    {2664, 1889},
+    {1196, 1873},
+    {3868, 3263},
+    {3412, 2045},
+    {3220, 3},
+    {1733, 196},
+    {4524, 158},
+    {197, 48},
+    {3532, 57},
+    {1554, 154},
+    {3260, 187},
+    {1937, 169},
+    {1078, 119},
+    {882, 167},
+    {4737, 4},
+    {4583, 163},
+    {1656, 115},
+    {3266, 55},
+    {562, 22},
+    {4492, 157},
+    {217, 160},
+    {4698, 397},
+    {2792, 54},
+    {2717, 80},
+    {1879, 139},
+    {4488, 213},
+    {1542, 76},
+    {3379, 150},
+    {2, 212},
+    {4585, 19},
+    {443, 67},
+    {4315, 2683},
+    {2805, 2455},
+    {1435, 1291},
+    {4627, 448},
+    {1865, 2703},
+    {2634, 3423},
+    {1660, 152},
+    {2148, 2443},
+    {1030, 3479},
+    {3840, 3774},
+    {605, 668},
+    {505, 1106},
+    {1338, 148},
+    {3195, 768},
+    {1681, 3950},
+    {1285, 3019},
+    {813, 1104},
+    {4540, 588},
+    {1583, 1414},
+    {4368, 2138},
+    {444, 707},
+    {3113, 3866},
+    {1770, 1648},
+    {3377, 815},
+    {1407, 2701},
+    {929, 3627},
+    {1091, 2279},
+    {4279, 1268},
+    {4281, 2399},
+    {1332, 1108},
+    {3542, 732},
+    {267, 1172},
+    {4736, 2620},
+    {538, 3095},
+    {4443, 1797},
+    {2498, 649},
+    {2963, 1565},
+    {1589, 688},
+    {1595, 1394},
+    {4381, 3621},
+    {428, 1142},
+    {3105, 1500},
+    {1782, 1294},
+    {3388, 1714},
+    {1401, 3028},
+    {908, 3937},
+    {1096, 2361},
+    {4284, 1629},
+    {4160, 3341},
+    {2417, 1788},
+    {2507, 1927},
+    {1056, 523},
+    {3730, 3120},
+    {776, 1882},
+    {4043, 1130},
+    {3533, 2150},
+    {602, 3946},
+    {3263, 767},
+    {1922, 2339},
+    {3523, 2736},
+    {1570, 2176},
+    {750, 1132},
+    {1221, 1433},
+    {4425, 2654},
+    {1071, 35},
+    {1557, 3491},
+    {2971, 195},
+    {4135, 2688},
+    {2371, 466},
+    {2568, 3228},
+    {1099, 376},
+    {3761, 2900},
+    {4019, 1407},
+    {3513, 282},
+    {3104, 2119},
+    {2313, 2807},
+    {4085, 2134},
+    {798, 2772},
+    {2819, 2187},
+    {2531, 3897},
+    {2303, 757},
+    {553, 1750},
+    {72, 462},
+    {3989, 3213},
+    {4708, 1050},
+    {1818, 2279},
+    {3129, 1675},
+    {419, 2331},
+    {4329, 775},
+    {20, 138},
+    {4562, 3496},
+    {2575, 3689},
+    {1693, 1220},
+    {1916, 2147},
+    {4671, 3314},
+    {10, 425},
+    {3387, 3254},
+    {1403, 1882},
+    {3118, 1364},
+    {1765, 2476},
+    {331, 3537},
+    {4557, 72},
+    {3367, 2122},
+    {3133, 2213},
+    {3902, 3210},
+    {3993, 2901},
+    {80, 1009},
+    {4246, 1660},
+    {1664, 2310},
+    {3214, 721},
+    {1351, 182},
+    {3434, 3525},
+    {4088, 2564},
+    {3714, 3725},
+    {473, 1175},
+    {459, 3781},
+    {3365, 1331},
+    {1523, 2604},
+    {4689, 1269},
+    {327, 3582},
+    {4341, 3113},
+    {650, 534},
+    {2230, 1703},
+    {2124, 817},
+    {3602, 870},
+    {4263, 1307},
+    {1669, 2641},
+    {3206, 1152},
+    {1343, 640},
+    {4104, 2228},
+    {3703, 3827},
+    {465, 750},
+    {2692, 552},
+    {2234, 3221},
+    {3674, 624},
+    {1103, 3092},
+    {3953, 2625},
+    {874, 1314},
+    {1513, 99},
+    {1628, 2040},
+    {2637, 2761},
+    {3463, 3643},
+    {404, 1669},
+    {4406, 2223},
+    {1836, 588},
+    {3357, 3841},
+    {1497, 3489},
+    {3577, 65},
+    {3935, 1313},
+    {3857, 985},
+    {622, 3560},
+    {3696, 2191},
+    {2062, 3278},
+    {2989, 478},
+    {995, 3320},
+    {4077, 1932},
+    {1296, 1434},
+    {3191, 2509},
+    {3599, 2737},
+    {2155, 2073},
+    {2020, 385},
+    {1261, 2108},
+    {2724, 2676},
+    {2405, 47},
+    {3062, 686},
+    {2126, 3888},
+    {169, 992},
+    {655, 3272},
+    {3836, 520},
+    {1447, 1673},
+    {3605, 2216},
+    {289, 1604},
+    {4653, 3856},
+    {701, 3483},
+    {4384, 69},
+    {2636, 1302},
+    {3019, 979},
+    {1516, 3567},
+    {1327, 2751},
+    {4274, 364},
+    {668, 3300},
+    {3353, 437},
+    {1833, 2974},
+    {3582, 2534},
+    {1491, 1466},
+    {820, 211},
+    {1289, 2197},
+    {4370, 2841},
+    {3082, 2758},
+    {101, 427},
+    {1614, 502},
+    {3549, 1437},
+    {1882, 1418},
+    {1464, 246},
+    {226, 2164},
+    {3490, 3848},
+    {429, 1441},
+    {4380, 2456},
+    {1802, 1389},
+    {3301, 3639},
+    {1533, 3279},
+    {3626, 407},
+    {3984, 1547},
+    {3807, 691},
+    {657, 3761},
+    {677, 1209},
+    {3554, 2371},
+    {1322, 1579},
+    {109, 924},
+    {4235, 292},
+    {515, 3404},
+    {2414, 1044},
+    {3495, 3547},
+    {4374, 2350},
+    {1790, 1507},
+    {3304, 3744},
+    {1547, 3385},
+    {3817, 1125},
+    {670, 3658},
+    {818, 1748},
+    {2519, 3421},
+    {2409, 267},
+    {3841, 3362},
+    {1305, 1997},
+    {4075, 1485},
+    {998, 2359},
+    {1326, 3330},
+    {1842, 3030},
+    {2743, 1858},
+    {3632, 724},
+    {589, 2467},
+    {4208, 1425},
+    {1636, 2532},
+    {3168, 1005},
+    {1383, 503},
+    {3487, 3309},
+    {4130, 2354},
+    {3666, 3930},
+    {497, 893},
+    {2158, 174},
+    {2894, 3463},
+    {878, 82},
+    {3946, 2714},
+    {1106, 2241},
+    {3671, 1597},
+    {3476, 1829},
+    {1963, 3047},
+    {2102, 3511},
+    {3873, 1837},
+    {1179, 2958},
+    {2632, 1892},
+    {2278, 3303},
+    {2870, 3716},
+    {512, 172},
+    {3649, 3398},
+    {4369, 730},
+    {1580, 2474},
+    {3497, 1420},
+    {137, 2524},
+    {4537, 1014},
+    {478, 498},
+    {2742, 2343},
+    {2904, 3924},
+    {1328, 899},
+    {1517, 1851},
+    {463, 43},
+    {3164, 3438},
+    {1633, 2118},
+    {3489, 1621},
+    {1381, 2277},
+    {1011, 3181},
+    {1112, 2929},
+    {4258, 1722},
+    {1368, 225},
+    {4308, 3058},
+    {636, 1731},
+    {3309, 3005},
+    {1786, 541},
+    {1538, 3586},
+    {854, 2745},
+    {1243, 3369},
+    {4404, 18},
+    {1724, 1585},
+    {4514, 3575},
+    {265, 1206},
+    {3545, 3615},
+    {1619, 1359},
+    {3249, 1760},
+    {1862, 3077},
+    {4701, 1685},
+    {4699, 2458},
+    {1793, 762},
+    {3115, 3843},
+    {442, 670},
+    {4312, 2225},
+    {8, 2719},
+    {4584, 2132},
+    {2558, 1401},
+    {1720, 2575},
+    {1717, 1474},
+    {4508, 3877},
+    {279, 783},
+    {3555, 3921},
+    {1608, 1706},
+    {3238, 2148},
+    {1065, 3579},
+    {961, 2516},
+    {4692, 1341},
+    {3765, 3295},
+    {1989, 2110},
+    {2926, 2738},
+    {918, 2167},
+    {4137, 3499},
+    {1204, 3939},
+    {3918, 776},
+    {3124, 1712},
+    {3510, 475},
+    {1902, 2392},
+    {4658, 1197},
+    {73, 3583},
+    {3404, 1115},
+    {1455, 2606},
+    {3093, 3007},
+    {1698, 1736},
+    {1191, 782},
+    {799, 1489},
+    {4559, 2269},
+    {951, 601},
+    {2299, 2036},
+    {3743, 2844},
+    {4040, 920},
+    {781, 3830},
+    {1602, 2915},
+    {1706, 3223},
+    {2581, 442},
+    {2713, 1987},
+    {1023, 3214},
+    {2028, 3158},
+    {2799, 1742},
+    {2367, 1250},
+    {2543, 2560},
+    {4474, 3529},
+    {4581, 2795},
+    {774, 2137},
+    {3358, 1188},
+    {1715, 3591},
+    {4271, 1122},
+    {405, 2599},
+    {4617, 3014},
+    {56, 791},
+    {3217, 3196},
+    {282, 2000},
+    {4598, 2872},
+    {1450, 2081},
+    {3402, 3419},
+    {3870, 1865},
+    {4024, 600},
+    {3275, 3197},
+    {366, 2001},
+    {1398, 2080},
+    {3398, 3417},
+    {3108, 868},
+    {3911, 1866},
+    {4020, 599},
+    {65, 2558},
+    {530, 892},
+    {4236, 3750},
+    {1684, 826},
+    {3188, 2341},
+    {1321, 2833},
+    {3466, 1985},
+    {4080, 1016},
+    {3687, 1275},
+    {481, 2470},
+    {484, 1698},
+    {3392, 3669},
+    {1535, 1069},
+    {4664, 3721},
+    {358, 1462},
+    {4378, 1895},
+    {612, 2961},
+    {2238, 3791},
+    {2145, 2297},
+    {3587, 1561},
+    {3595, 2217},
+    {540, 1028},
+    {4221, 3647},
+    {1676, 971},
+    {3202, 2450},
+    {1329, 2941},
+    {3456, 1857},
+    {4066, 889},
+    {487, 2365},
+    {1026, 79},
+    {2714, 2979},
+    {2241, 1878},
+    {3653, 2926},
+    {1135, 423},
+    {3987, 949},
+    {834, 3654},
+    {1525, 2886},
+    {1653, 3458},
+    {2625, 235},
+    {3432, 1299},
+    {368, 3762},
+    {4397, 881},
+    {1856, 3818},
+    {3315, 1535},
+    {3609, 2865},
+    {3927, 3653},
+    {3824, 2659},
+    {642, 1440},
+    {3702, 3363},
+    {2073, 1819},
+    {3016, 3036},
+    {990, 1747},
+    {4091, 3150},
+    {1306, 3556},
+    {3837, 1084},
+    {3213, 2183},
+    {2125, 3485},
+    {1988, 3072},
+    {3762, 208},
+    {1250, 3401},
+    {2736, 288},
+    {2382, 2854},
+    {2154, 1574},
+    {148, 380},
+    {620, 1814},
+    {3852, 2954},
+    {4222, 1308},
+    {1427, 3767},
+    {3593, 871},
+    {324, 3811},
+    {4625, 1545},
+    {664, 2072},
+    {4414, 2869},
+    {2626, 3644},
+    {2983, 2648},
+    {1524, 1447},
+    {1356, 224},
+    {4305, 3057},
+    {684, 1732},
+    {3318, 3006},
+    {1859, 542},
+    {3608, 1113},
+    {824, 2744},
+    {1316, 3370},
+    {4358, 17},
+    {191, 1689},
+    {3283, 3667},
+    {1751, 1072},
+    {416, 1464},
+    {4549, 1900},
+    {40, 2960},
+    {2188, 3786},
+    {2336, 2304},
+    {3091, 1558},
+    {699, 41},
+    {3576, 2944},
+    {1339, 699},
+    {4498, 2893},
+    {126, 379},
+    {4256, 984},
+    {500, 3680},
+    {2436, 2855},
+    {1976, 3486},
+    {3485, 193},
+    {3473, 3201},
+    {410, 2005},
+    {4361, 2868},
+    {1825, 2082},
+    {3634, 872},
+    {3962, 1869},
+    {3787, 592},
+    {687, 3325},
+    {695, 535},
+    {3566, 2839},
+    {1353, 1974},
+    {4503, 2794},
+    {115, 215},
+    {4250, 843},
+    {506, 3783},
+    {2448, 2968},
+    {1968, 3156},
+    {2725, 2580},
+    {883, 922},
+    {3971, 3778},
+    {2018, 858},
+    {2880, 2376},
+    {2228, 2806},
+    {2608, 1950},
+    {4354, 1048},
+    {4521, 1233},
+    {822, 2486},
+    {519, 3510},
+    {3425, 1828},
+    {1482, 2971},
+    {4630, 1898},
+    {317, 3299},
+    {4417, 3718},
+    {660, 1062},
+    {2277, 1972},
+    {2112, 173},
+    {3625, 3388},
+    {1959, 1412},
+    {3733, 3932},
+    {1282, 698},
+    {2760, 3868},
+    {2420, 1641},
+    {2999, 2094},
+    {2105, 2698},
+    {100, 3632},
+    {679, 2469},
+    {3820, 1270},
+    {3045, 1422},
+    {1008, 2517},
+    {4132, 1017},
+    {1271, 492},
+    {3790, 3317},
+    {3166, 2340},
+    {3645, 3922},
+    {2099, 894},
+    {1355, 3517},
+    {4297, 1835},
+    {3321, 1884},
+    {1850, 3305},
+    {3614, 3713},
+    {1456, 1068},
+    {823, 1962},
+    {1312, 168},
+    {4351, 3392},
+    {4230, 2457},
+    {1428, 761},
+    {3591, 3844},
+    {311, 665},
+    {4628, 2226},
+    {659, 1183},
+    {4418, 2126},
+    {2633, 1159},
+    {2993, 1402},
+    {1537, 2573},
+    {3274, 1112},
+    {367, 2442}
 };
 
 static const lxb_codepoint_t lxb_unicode_decomposition_cps[6982] =
@@ -191096,7 +195657,7 @@ static const lxb_codepoint_t lxb_unicode_decomposition_cps[6982] =
     0x4D56, 0x9EFE, 0x9F05, 0x9F0F, 0x9F16, 0x2A600
 };
 
-static const lxb_codepoint_t lxb_unicode_idna_cps[5400] =
+static const lxb_codepoint_t lxb_unicode_idna_cps[5428] =
 {
     0x0073, 0x0073, 0x03C3, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065,
     0x0066, 0x0067, 0x0068, 0x0069, 0x006A, 0x006B, 0x006C, 0x006D,
@@ -191477,9364 +196038,9397 @@ static const lxb_codepoint_t lxb_unicode_idna_cps[5400] =
     0xA791, 0xA793, 0xA797, 0xA799, 0xA79B, 0xA79D, 0xA79F, 0xA7A1,
     0xA7A3, 0xA7A5, 0xA7A7, 0xA7A9, 0x026C, 0x029E, 0x0287, 0xAB53,
     0xA7B5, 0xA7B7, 0xA7B9, 0xA7BB, 0xA7BD, 0xA7BF, 0xA7C1, 0xA7C3,
-    0xA794, 0x1D8E, 0xA7C8, 0xA7CA, 0x0264, 0xA7CD, 0xA7D1, 0xA7D7,
-    0xA7D9, 0xA7DB, 0x019B, 0xA7F6, 0xAB37, 0xAB52, 0x028D, 0x13A0,
-    0x13A1, 0x13A2, 0x13A3, 0x13A4, 0x13A5, 0x13A6, 0x13A7, 0x13A8,
-    0x13A9, 0x13AA, 0x13AB, 0x13AC, 0x13AD, 0x13AE, 0x13AF, 0x13B0,
-    0x13B1, 0x13B2, 0x13B3, 0x13B4, 0x13B5, 0x13B6, 0x13B7, 0x13B8,
-    0x13B9, 0x13BA, 0x13BB, 0x13BC, 0x13BD, 0x13BE, 0x13BF, 0x13C0,
-    0x13C1, 0x13C2, 0x13C3, 0x13C4, 0x13C5, 0x13C6, 0x13C7, 0x13C8,
-    0x13C9, 0x13CA, 0x13CB, 0x13CC, 0x13CD, 0x13CE, 0x13CF, 0x13D0,
-    0x13D1, 0x13D2, 0x13D3, 0x13D4, 0x13D5, 0x13D6, 0x13D7, 0x13D8,
-    0x13D9, 0x13DA, 0x13DB, 0x13DC, 0x13DD, 0x13DE, 0x13DF, 0x13E0,
-    0x13E1, 0x13E2, 0x13E3, 0x13E4, 0x13E5, 0x13E6, 0x13E7, 0x13E8,
-    0x13E9, 0x13EA, 0x13EB, 0x13EC, 0x13ED, 0x13EE, 0x13EF, 0x8C48,
-    0x66F4, 0x8CC8, 0x6ED1, 0x4E32, 0x53E5, 0x5951, 0x5587, 0x5948,
-    0x61F6, 0x7669, 0x7F85, 0x863F, 0x87BA, 0x88F8, 0x908F, 0x6A02,
-    0x6D1B, 0x70D9, 0x73DE, 0x843D, 0x916A, 0x99F1, 0x4E82, 0x5375,
-    0x6B04, 0x721B, 0x862D, 0x9E1E, 0x5D50, 0x6FEB, 0x85CD, 0x8964,
-    0x62C9, 0x81D8, 0x881F, 0x5ECA, 0x6717, 0x6D6A, 0x72FC, 0x90CE,
-    0x4F86, 0x51B7, 0x52DE, 0x64C4, 0x6AD3, 0x7210, 0x76E7, 0x8606,
-    0x865C, 0x8DEF, 0x9732, 0x9B6F, 0x9DFA, 0x788C, 0x797F, 0x7DA0,
-    0x83C9, 0x9304, 0x8AD6, 0x58DF, 0x5F04, 0x7C60, 0x807E, 0x7262,
-    0x78CA, 0x8CC2, 0x96F7, 0x58D8, 0x5C62, 0x6A13, 0x6DDA, 0x6F0F,
-    0x7D2F, 0x7E37, 0x964B, 0x52D2, 0x808B, 0x51DC, 0x51CC, 0x7A1C,
-    0x7DBE, 0x83F1, 0x9675, 0x8B80, 0x62CF, 0x8AFE, 0x4E39, 0x5BE7,
-    0x6012, 0x7387, 0x7570, 0x5317, 0x78FB, 0x4FBF, 0x5FA9, 0x4E0D,
-    0x6CCC, 0x6578, 0x7D22, 0x53C3, 0x585E, 0x7701, 0x8449, 0x8AAA,
-    0x6BBA, 0x6C88, 0x62FE, 0x82E5, 0x63A0, 0x7565, 0x4EAE, 0x5169,
-    0x51C9, 0x6881, 0x7CE7, 0x826F, 0x8AD2, 0x91CF, 0x52F5, 0x5442,
-    0x5EEC, 0x65C5, 0x6FFE, 0x792A, 0x95AD, 0x9A6A, 0x9E97, 0x9ECE,
-    0x66C6, 0x6B77, 0x8F62, 0x5E74, 0x6190, 0x6200, 0x649A, 0x6F23,
-    0x7149, 0x7489, 0x79CA, 0x7DF4, 0x806F, 0x8F26, 0x84EE, 0x9023,
-    0x934A, 0x5217, 0x52A3, 0x54BD, 0x70C8, 0x88C2, 0x5EC9, 0x5FF5,
-    0x637B, 0x6BAE, 0x7C3E, 0x7375, 0x56F9, 0x5DBA, 0x601C, 0x73B2,
-    0x7469, 0x7F9A, 0x8046, 0x9234, 0x96F6, 0x9748, 0x9818, 0x4F8B,
-    0x79AE, 0x91B4, 0x96B8, 0x60E1, 0x4E86, 0x50DA, 0x5BEE, 0x5C3F,
-    0x6599, 0x71CE, 0x7642, 0x84FC, 0x907C, 0x6688, 0x962E, 0x5289,
-    0x677B, 0x67F3, 0x6D41, 0x6E9C, 0x7409, 0x7559, 0x786B, 0x7D10,
-    0x985E, 0x622E, 0x9678, 0x502B, 0x5D19, 0x6DEA, 0x8F2A, 0x5F8B,
-    0x6144, 0x6817, 0x9686, 0x5229, 0x540F, 0x5C65, 0x6613, 0x674E,
-    0x68A8, 0x6CE5, 0x7406, 0x75E2, 0x7F79, 0x88CF, 0x88E1, 0x96E2,
-    0x533F, 0x6EBA, 0x541D, 0x71D0, 0x7498, 0x85FA, 0x96A3, 0x9C57,
-    0x9E9F, 0x6797, 0x6DCB, 0x81E8, 0x7B20, 0x7C92, 0x72C0, 0x7099,
-    0x8B58, 0x4EC0, 0x8336, 0x523A, 0x5207, 0x5EA6, 0x62D3, 0x7CD6,
-    0x5B85, 0x6D1E, 0x66B4, 0x8F3B, 0x964D, 0x5ED3, 0x5140, 0x55C0,
-    0x585A, 0x6674, 0x51DE, 0x732A, 0x76CA, 0x793C, 0x795E, 0x7965,
-    0x798F, 0x9756, 0x7CBE, 0x8612, 0x8AF8, 0x9038, 0x90FD, 0x98EF,
-    0x98FC, 0x9928, 0x9DB4, 0x90DE, 0x96B7, 0x4FAE, 0x50E7, 0x514D,
-    0x52C9, 0x52E4, 0x5351, 0x559D, 0x5606, 0x5668, 0x5840, 0x58A8,
-    0x5C64, 0x6094, 0x6168, 0x618E, 0x61F2, 0x654F, 0x65E2, 0x6691,
-    0x6885, 0x6D77, 0x6E1A, 0x6F22, 0x716E, 0x722B, 0x7422, 0x7891,
-    0x7949, 0x7948, 0x7950, 0x7956, 0x798D, 0x798E, 0x7A40, 0x7A81,
-    0x7BC0, 0x7E09, 0x7E41, 0x7F72, 0x8005, 0x81ED, 0x8279, 0x8457,
-    0x8910, 0x8996, 0x8B01, 0x8B39, 0x8CD3, 0x8D08, 0x8FB6, 0x96E3,
-    0x97FF, 0x983B, 0x6075, 0x242EE, 0x8218, 0x4E26, 0x51B5, 0x5168,
-    0x4F80, 0x5145, 0x5180, 0x52C7, 0x52FA, 0x5555, 0x5599, 0x55E2,
-    0x58B3, 0x5944, 0x5954, 0x5A62, 0x5B28, 0x5ED2, 0x5ED9, 0x5F69,
-    0x5FAD, 0x60D8, 0x614E, 0x6108, 0x6160, 0x6234, 0x63C4, 0x641C,
-    0x6452, 0x6556, 0x671B, 0x6756, 0x6EDB, 0x6ECB, 0x701E, 0x77A7,
-    0x7235, 0x72AF, 0x7471, 0x7506, 0x753B, 0x761D, 0x761F, 0x76DB,
-    0x76F4, 0x774A, 0x7740, 0x78CC, 0x7AB1, 0x7C7B, 0x7D5B, 0x7F3E,
-    0x8352, 0x83EF, 0x8779, 0x8941, 0x8986, 0x8ABF, 0x8ACB, 0x8AED,
-    0x8B8A, 0x8F38, 0x9072, 0x9199, 0x9276, 0x967C, 0x97DB, 0x980B,
-    0x9B12, 0x2284A, 0x22844, 0x233D5, 0x3B9D, 0x4018, 0x4039, 0x25249,
-    0x25CD0, 0x27ED3, 0x9F43, 0x9F8E, 0x0066, 0x0066, 0x0066, 0x0069,
-    0x0066, 0x006C, 0x0066, 0x0066, 0x0069, 0x0066, 0x0066, 0x006C,
-    0x0073, 0x0074, 0x0574, 0x0576, 0x0574, 0x0565, 0x0574, 0x056B,
-    0x057E, 0x0576, 0x0574, 0x056D, 0x05D9, 0x05B4, 0x05F2, 0x05B7,
-    0x05E2, 0x05D4, 0x05DB, 0x05DC, 0x05DD, 0x05E8, 0x05EA, 0x05E9,
-    0x05C1, 0x05E9, 0x05C2, 0x05E9, 0x05BC, 0x05C1, 0x05E9, 0x05BC,
-    0x05C2, 0x05D0, 0x05B7, 0x05D0, 0x05B8, 0x05D0, 0x05BC, 0x05D1,
-    0x05BC, 0x05D2, 0x05BC, 0x05D3, 0x05BC, 0x05D4, 0x05BC, 0x05D5,
-    0x05BC, 0x05D6, 0x05BC, 0x05D8, 0x05BC, 0x05D9, 0x05BC, 0x05DA,
-    0x05BC, 0x05DB, 0x05BC, 0x05DC, 0x05BC, 0x05DE, 0x05BC, 0x05E0,
-    0x05BC, 0x05E1, 0x05BC, 0x05E3, 0x05BC, 0x05E4, 0x05BC, 0x05E6,
-    0x05BC, 0x05E7, 0x05BC, 0x05E8, 0x05BC, 0x05EA, 0x05BC, 0x05D5,
-    0x05B9, 0x05D1, 0x05BF, 0x05DB, 0x05BF, 0x05E4, 0x05BF, 0x05D0,
-    0x05DC, 0x0671, 0x067B, 0x067E, 0x0680, 0x067A, 0x067F, 0x0679,
-    0x06A4, 0x06A6, 0x0684, 0x0683, 0x0686, 0x0687, 0x068D, 0x068C,
-    0x068E, 0x0688, 0x0698, 0x0691, 0x06A9, 0x06AF, 0x06B3, 0x06B1,
-    0x06BA, 0x06BB, 0x06C0, 0x06C1, 0x06BE, 0x06D2, 0x06D3, 0x06AD,
-    0x06C6, 0x06C8, 0x06CB, 0x06C5, 0x06C9, 0x06D0, 0x0649, 0x0626,
-    0x0627, 0x0626, 0x06D5, 0x0626, 0x0648, 0x0626, 0x06C7, 0x0626,
-    0x06C6, 0x0626, 0x06C8, 0x0626, 0x06D0, 0x0626, 0x0649, 0x06CC,
-    0x0626, 0x062C, 0x0626, 0x062D, 0x0626, 0x0645, 0x0626, 0x064A,
-    0x0628, 0x062C, 0x0628, 0x062D, 0x0628, 0x062E, 0x0628, 0x0645,
-    0x0628, 0x0649, 0x0628, 0x064A, 0x062A, 0x062C, 0x062A, 0x062D,
-    0x062A, 0x062E, 0x062A, 0x0645, 0x062A, 0x0649, 0x062A, 0x064A,
-    0x062B, 0x062C, 0x062B, 0x0645, 0x062B, 0x0649, 0x062B, 0x064A,
-    0x062C, 0x062D, 0x062C, 0x0645, 0x062D, 0x062C, 0x062D, 0x0645,
-    0x062E, 0x062C, 0x062E, 0x062D, 0x062E, 0x0645, 0x0633, 0x062C,
-    0x0633, 0x062D, 0x0633, 0x062E, 0x0633, 0x0645, 0x0635, 0x062D,
-    0x0635, 0x0645, 0x0636, 0x062C, 0x0636, 0x062D, 0x0636, 0x062E,
-    0x0636, 0x0645, 0x0637, 0x062D, 0x0637, 0x0645, 0x0638, 0x0645,
-    0x0639, 0x062C, 0x0639, 0x0645, 0x063A, 0x062C, 0x063A, 0x0645,
-    0x0641, 0x062C, 0x0641, 0x062D, 0x0641, 0x062E, 0x0641, 0x0645,
-    0x0641, 0x0649, 0x0641, 0x064A, 0x0642, 0x062D, 0x0642, 0x0645,
-    0x0642, 0x0649, 0x0642, 0x064A, 0x0643, 0x0627, 0x0643, 0x062C,
-    0x0643, 0x062D, 0x0643, 0x062E, 0x0643, 0x0644, 0x0643, 0x0645,
-    0x0643, 0x0649, 0x0643, 0x064A, 0x0644, 0x062C, 0x0644, 0x062D,
-    0x0644, 0x062E, 0x0644, 0x0645, 0x0644, 0x0649, 0x0644, 0x064A,
-    0x0645, 0x062C, 0x0645, 0x062D, 0x0645, 0x062E, 0x0645, 0x0645,
-    0x0645, 0x0649, 0x0645, 0x064A, 0x0646, 0x062C, 0x0646, 0x062D,
-    0x0646, 0x062E, 0x0646, 0x0645, 0x0646, 0x0649, 0x0646, 0x064A,
-    0x0647, 0x062C, 0x0647, 0x0645, 0x0647, 0x0649, 0x0647, 0x064A,
-    0x064A, 0x062C, 0x064A, 0x062D, 0x064A, 0x062E, 0x064A, 0x0645,
-    0x064A, 0x0649, 0x064A, 0x064A, 0x0630, 0x0670, 0x0631, 0x0670,
-    0x0649, 0x0670, 0x0020, 0x064C, 0x0651, 0x0020, 0x064D, 0x0651,
-    0x0020, 0x064E, 0x0651, 0x0020, 0x064F, 0x0651, 0x0020, 0x0650,
-    0x0651, 0x0020, 0x0651, 0x0670, 0x0626, 0x0631, 0x0626, 0x0632,
-    0x0626, 0x0646, 0x0628, 0x0631, 0x0628, 0x0632, 0x0628, 0x0646,
-    0x062A, 0x0631, 0x062A, 0x0632, 0x062A, 0x0646, 0x062B, 0x0631,
-    0x062B, 0x0632, 0x062B, 0x0646, 0x0645, 0x0627, 0x0646, 0x0631,
-    0x0646, 0x0632, 0x0646, 0x0646, 0x064A, 0x0631, 0x064A, 0x0632,
-    0x064A, 0x0646, 0x0626, 0x062E, 0x0626, 0x0647, 0x0628, 0x0647,
-    0x062A, 0x0647, 0x0635, 0x062E, 0x0644, 0x0647, 0x0646, 0x0647,
-    0x0647, 0x0670, 0x064A, 0x0647, 0x062B, 0x0647, 0x0633, 0x0647,
-    0x0634, 0x0645, 0x0634, 0x0647, 0x0640, 0x064E, 0x0651, 0x0640,
-    0x064F, 0x0651, 0x0640, 0x0650, 0x0651, 0x0637, 0x0649, 0x0637,
-    0x064A, 0x0639, 0x0649, 0x0639, 0x064A, 0x063A, 0x0649, 0x063A,
-    0x064A, 0x0633, 0x0649, 0x0633, 0x064A, 0x0634, 0x0649, 0x0634,
-    0x064A, 0x062D, 0x0649, 0x062D, 0x064A, 0x062C, 0x0649, 0x062C,
-    0x064A, 0x062E, 0x0649, 0x062E, 0x064A, 0x0635, 0x0649, 0x0635,
-    0x064A, 0x0636, 0x0649, 0x0636, 0x064A, 0x0634, 0x062C, 0x0634,
-    0x062D, 0x0634, 0x062E, 0x0634, 0x0631, 0x0633, 0x0631, 0x0635,
-    0x0631, 0x0636, 0x0631, 0x0627, 0x064B, 0x062A, 0x062C, 0x0645,
-    0x062A, 0x062D, 0x062C, 0x062A, 0x062D, 0x0645, 0x062A, 0x062E,
-    0x0645, 0x062A, 0x0645, 0x062C, 0x062A, 0x0645, 0x062D, 0x062A,
-    0x0645, 0x062E, 0x062C, 0x0645, 0x062D, 0x062D, 0x0645, 0x064A,
-    0x062D, 0x0645, 0x0649, 0x0633, 0x062D, 0x062C, 0x0633, 0x062C,
-    0x062D, 0x0633, 0x062C, 0x0649, 0x0633, 0x0645, 0x062D, 0x0633,
-    0x0645, 0x062C, 0x0633, 0x0645, 0x0645, 0x0635, 0x062D, 0x062D,
-    0x0635, 0x0645, 0x0645, 0x0634, 0x062D, 0x0645, 0x0634, 0x062C,
-    0x064A, 0x0634, 0x0645, 0x062E, 0x0634, 0x0645, 0x0645, 0x0636,
-    0x062D, 0x0649, 0x0636, 0x062E, 0x0645, 0x0637, 0x0645, 0x062D,
-    0x0637, 0x0645, 0x0645, 0x0637, 0x0645, 0x064A, 0x0639, 0x062C,
-    0x0645, 0x0639, 0x0645, 0x0645, 0x0639, 0x0645, 0x0649, 0x063A,
-    0x0645, 0x0645, 0x063A, 0x0645, 0x064A, 0x063A, 0x0645, 0x0649,
-    0x0641, 0x062E, 0x0645, 0x0642, 0x0645, 0x062D, 0x0642, 0x0645,
-    0x0645, 0x0644, 0x062D, 0x0645, 0x0644, 0x062D, 0x064A, 0x0644,
-    0x062D, 0x0649, 0x0644, 0x062C, 0x062C, 0x0644, 0x062E, 0x0645,
-    0x0644, 0x0645, 0x062D, 0x0645, 0x062D, 0x062C, 0x0645, 0x062D,
-    0x0645, 0x0645, 0x062D, 0x064A, 0x0645, 0x062C, 0x062D, 0x0645,
-    0x062C, 0x0645, 0x0645, 0x062E, 0x062C, 0x0645, 0x062E, 0x0645,
-    0x0645, 0x062C, 0x062E, 0x0647, 0x0645, 0x062C, 0x0647, 0x0645,
-    0x0645, 0x0646, 0x062D, 0x0645, 0x0646, 0x062D, 0x0649, 0x0646,
-    0x062C, 0x0645, 0x0646, 0x062C, 0x0649, 0x0646, 0x0645, 0x064A,
-    0x0646, 0x0645, 0x0649, 0x064A, 0x0645, 0x0645, 0x0628, 0x062E,
-    0x064A, 0x062A, 0x062C, 0x064A, 0x062A, 0x062C, 0x0649, 0x062A,
-    0x062E, 0x064A, 0x062A, 0x062E, 0x0649, 0x062A, 0x0645, 0x064A,
-    0x062A, 0x0645, 0x0649, 0x062C, 0x0645, 0x064A, 0x062C, 0x062D,
-    0x0649, 0x062C, 0x0645, 0x0649, 0x0633, 0x062E, 0x0649, 0x0635,
-    0x062D, 0x064A, 0x0634, 0x062D, 0x064A, 0x0636, 0x062D, 0x064A,
-    0x0644, 0x062C, 0x064A, 0x0644, 0x0645, 0x064A, 0x064A, 0x062D,
-    0x064A, 0x064A, 0x062C, 0x064A, 0x064A, 0x0645, 0x064A, 0x0645,
-    0x0645, 0x064A, 0x0642, 0x0645, 0x064A, 0x0646, 0x062D, 0x064A,
-    0x0639, 0x0645, 0x064A, 0x0643, 0x0645, 0x064A, 0x0646, 0x062C,
-    0x062D, 0x0645, 0x062E, 0x064A, 0x0644, 0x062C, 0x0645, 0x0643,
-    0x0645, 0x0645, 0x062C, 0x062D, 0x064A, 0x062D, 0x062C, 0x064A,
-    0x0645, 0x062C, 0x064A, 0x0641, 0x0645, 0x064A, 0x0628, 0x062D,
-    0x064A, 0x0633, 0x062E, 0x064A, 0x0646, 0x062C, 0x064A, 0x0635,
-    0x0644, 0x06D2, 0x0642, 0x0644, 0x06D2, 0x0627, 0x0644, 0x0644,
-    0x0647, 0x0627, 0x0643, 0x0628, 0x0631, 0x0645, 0x062D, 0x0645,
-    0x062F, 0x0635, 0x0644, 0x0639, 0x0645, 0x0631, 0x0633, 0x0648,
-    0x0644, 0x0639, 0x0644, 0x064A, 0x0647, 0x0648, 0x0633, 0x0644,
-    0x0645, 0x0635, 0x0644, 0x0649, 0x0635, 0x0644, 0x0649, 0x0020,
-    0x0627, 0x0644, 0x0644, 0x0647, 0x0020, 0x0639, 0x0644, 0x064A,
-    0x0647, 0x0020, 0x0648, 0x0633, 0x0644, 0x0645, 0x062C, 0x0644,
-    0x0020, 0x062C, 0x0644, 0x0627, 0x0644, 0x0647, 0x0631, 0x06CC,
-    0x0627, 0x0644, 0x002C, 0x3001, 0x3016, 0x3017, 0x2014, 0x2013,
-    0x005F, 0x007B, 0x007D, 0x3014, 0x3015, 0x3010, 0x3011, 0x300A,
-    0x300B, 0x300C, 0x300D, 0x300E, 0x300F, 0x005B, 0x005D, 0x0023,
-    0x0026, 0x002A, 0x002D, 0x003C, 0x003E, 0x005C, 0x0024, 0x0025,
-    0x0040, 0x0020, 0x064B, 0x0640, 0x064B, 0x0640, 0x0651, 0x0020,
-    0x0652, 0x0640, 0x0652, 0x0621, 0x0622, 0x0623, 0x0624, 0x0625,
-    0x0629, 0x062F, 0x0632, 0x0644, 0x0622, 0x0644, 0x0623, 0x0644,
-    0x0625, 0x0644, 0x0627, 0x0022, 0x0027, 0x002F, 0x005E, 0x007C,
-    0x007E, 0x2985, 0x2986, 0x30FB, 0x30A1, 0x30A3, 0x30A5, 0x30A7,
-    0x30A9, 0x30E3, 0x30E5, 0x30E7, 0x30C3, 0x30FC, 0x30F3, 0x3099,
-    0x309A, 0x00A2, 0x00A3, 0x00AC, 0x00A6, 0x00A5, 0x20A9, 0x2502,
-    0x2190, 0x2191, 0x2192, 0x2193, 0x25A0, 0x25CB, 0x10428, 0x10429,
-    0x1042A, 0x1042B, 0x1042C, 0x1042D, 0x1042E, 0x1042F, 0x10430, 0x10431,
-    0x10432, 0x10433, 0x10434, 0x10435, 0x10436, 0x10437, 0x10438, 0x10439,
-    0x1043A, 0x1043B, 0x1043C, 0x1043D, 0x1043E, 0x1043F, 0x10440, 0x10441,
-    0x10442, 0x10443, 0x10444, 0x10445, 0x10446, 0x10447, 0x10448, 0x10449,
-    0x1044A, 0x1044B, 0x1044C, 0x1044D, 0x1044E, 0x1044F, 0x104D8, 0x104D9,
-    0x104DA, 0x104DB, 0x104DC, 0x104DD, 0x104DE, 0x104DF, 0x104E0, 0x104E1,
-    0x104E2, 0x104E3, 0x104E4, 0x104E5, 0x104E6, 0x104E7, 0x104E8, 0x104E9,
-    0x104EA, 0x104EB, 0x104EC, 0x104ED, 0x104EE, 0x104EF, 0x104F0, 0x104F1,
-    0x104F2, 0x104F3, 0x104F4, 0x104F5, 0x104F6, 0x104F7, 0x104F8, 0x104F9,
-    0x104FA, 0x104FB, 0x10597, 0x10598, 0x10599, 0x1059A, 0x1059B, 0x1059C,
-    0x1059D, 0x1059E, 0x1059F, 0x105A0, 0x105A1, 0x105A3, 0x105A4, 0x105A5,
-    0x105A6, 0x105A7, 0x105A8, 0x105A9, 0x105AA, 0x105AB, 0x105AC, 0x105AD,
-    0x105AE, 0x105AF, 0x105B0, 0x105B1, 0x105B3, 0x105B4, 0x105B5, 0x105B6,
-    0x105B7, 0x105B8, 0x105B9, 0x105BB, 0x105BC, 0x02D0, 0x02D1, 0x0299,
-    0x02A3, 0xAB66, 0x02A5, 0x02A4, 0x1D91, 0x0258, 0x025E, 0x02A9,
-    0x0262, 0x029B, 0x029C, 0x0267, 0x0284, 0x02AA, 0x02AB, 0x1DF04,
-    0xA78E, 0x026E, 0x1DF05, 0x028E, 0x1DF06, 0x0276, 0x0277, 0x027A,
-    0x1DF08, 0x027E, 0x02A8, 0x02A6, 0xAB67, 0x02A7, 0x2C71, 0x028F,
-    0x02A1, 0x02A2, 0x0298, 0x01C0, 0x01C1, 0x01C2, 0x1DF0A, 0x1DF1E,
-    0x10CC0, 0x10CC1, 0x10CC2, 0x10CC3, 0x10CC4, 0x10CC5, 0x10CC6, 0x10CC7,
-    0x10CC8, 0x10CC9, 0x10CCA, 0x10CCB, 0x10CCC, 0x10CCD, 0x10CCE, 0x10CCF,
-    0x10CD0, 0x10CD1, 0x10CD2, 0x10CD3, 0x10CD4, 0x10CD5, 0x10CD6, 0x10CD7,
-    0x10CD8, 0x10CD9, 0x10CDA, 0x10CDB, 0x10CDC, 0x10CDD, 0x10CDE, 0x10CDF,
-    0x10CE0, 0x10CE1, 0x10CE2, 0x10CE3, 0x10CE4, 0x10CE5, 0x10CE6, 0x10CE7,
-    0x10CE8, 0x10CE9, 0x10CEA, 0x10CEB, 0x10CEC, 0x10CED, 0x10CEE, 0x10CEF,
-    0x10CF0, 0x10CF1, 0x10CF2, 0x10D70, 0x10D71, 0x10D72, 0x10D73, 0x10D74,
-    0x10D75, 0x10D76, 0x10D77, 0x10D78, 0x10D79, 0x10D7A, 0x10D7B, 0x10D7C,
-    0x10D7D, 0x10D7E, 0x10D7F, 0x10D80, 0x10D81, 0x10D82, 0x10D83, 0x10D84,
-    0x10D85, 0x118C0, 0x118C1, 0x118C2, 0x118C3, 0x118C4, 0x118C5, 0x118C6,
-    0x118C7, 0x118C8, 0x118C9, 0x118CA, 0x118CB, 0x118CC, 0x118CD, 0x118CE,
-    0x118CF, 0x118D0, 0x118D1, 0x118D2, 0x118D3, 0x118D4, 0x118D5, 0x118D6,
-    0x118D7, 0x118D8, 0x118D9, 0x118DA, 0x118DB, 0x118DC, 0x118DD, 0x118DE,
-    0x118DF, 0x16E60, 0x16E61, 0x16E62, 0x16E63, 0x16E64, 0x16E65, 0x16E66,
-    0x16E67, 0x16E68, 0x16E69, 0x16E6A, 0x16E6B, 0x16E6C, 0x16E6D, 0x16E6E,
-    0x16E6F, 0x16E70, 0x16E71, 0x16E72, 0x16E73, 0x16E74, 0x16E75, 0x16E76,
-    0x16E77, 0x16E78, 0x16E79, 0x16E7A, 0x16E7B, 0x16E7C, 0x16E7D, 0x16E7E,
-    0x16E7F, 0x1D157, 0x1D165, 0x1D158, 0x1D165, 0x1D158, 0x1D165, 0x1D16E,
-    0x1D158, 0x1D165, 0x1D16F, 0x1D158, 0x1D165, 0x1D170, 0x1D158, 0x1D165,
-    0x1D171, 0x1D158, 0x1D165, 0x1D172, 0x1D1B9, 0x1D165, 0x1D1BA, 0x1D165,
-    0x1D1B9, 0x1D165, 0x1D16E, 0x1D1BA, 0x1D165, 0x1D16E, 0x1D1B9, 0x1D165,
-    0x1D16F, 0x1D1BA, 0x1D165, 0x1D16F, 0x0131, 0x0237, 0x2207, 0x2202,
-    0x1E922, 0x1E923, 0x1E924, 0x1E925, 0x1E926, 0x1E927, 0x1E928, 0x1E929,
-    0x1E92A, 0x1E92B, 0x1E92C, 0x1E92D, 0x1E92E, 0x1E92F, 0x1E930, 0x1E931,
-    0x1E932, 0x1E933, 0x1E934, 0x1E935, 0x1E936, 0x1E937, 0x1E938, 0x1E939,
-    0x1E93A, 0x1E93B, 0x1E93C, 0x1E93D, 0x1E93E, 0x1E93F, 0x1E940, 0x1E941,
-    0x1E942, 0x1E943, 0x066E, 0x06A1, 0x066F, 0x0030, 0x002C, 0x0031,
-    0x002C, 0x0032, 0x002C, 0x0033, 0x002C, 0x0034, 0x002C, 0x0035,
-    0x002C, 0x0036, 0x002C, 0x0037, 0x002C, 0x0038, 0x002C, 0x0039,
-    0x002C, 0x3014, 0x0073, 0x3015, 0x0077, 0x007A, 0x0068, 0x0076,
-    0x0073, 0x0064, 0x0070, 0x0070, 0x0076, 0x0077, 0x0063, 0x006D,
-    0x0063, 0x006D, 0x0064, 0x006D, 0x0072, 0x0064, 0x006A, 0x307B,
-    0x304B, 0x30B3, 0x30B3, 0x5B57, 0x53CC, 0x591A, 0x89E3, 0x4EA4,
-    0x6620, 0x7121, 0x524D, 0x5F8C, 0x518D, 0x65B0, 0x521D, 0x7D42,
-    0x8CA9, 0x58F0, 0x5439, 0x6F14, 0x6295, 0x6355, 0x904A, 0x6307,
-    0x6253, 0x7981, 0x7A7A, 0x5408, 0x6E80, 0x7533, 0x5272, 0x55B6,
-    0x914D, 0x3014, 0x672C, 0x3015, 0x3014, 0x4E09, 0x3015, 0x3014,
-    0x4E8C, 0x3015, 0x3014, 0x5B89, 0x3015, 0x3014, 0x70B9, 0x3015,
-    0x3014, 0x6253, 0x3015, 0x3014, 0x76D7, 0x3015, 0x3014, 0x52DD,
-    0x3015, 0x3014, 0x6557, 0x3015, 0x5F97, 0x53EF, 0x4E3D, 0x4E38,
-    0x4E41, 0x20122, 0x4F60, 0x4FBB, 0x5002, 0x507A, 0x5099, 0x50CF,
-    0x349E, 0x2063A, 0x5154, 0x5164, 0x5177, 0x2051C, 0x34B9, 0x5167,
-    0x2054B, 0x5197, 0x51A4, 0x4ECC, 0x51AC, 0x291DF, 0x5203, 0x34DF,
-    0x523B, 0x5246, 0x5277, 0x3515, 0x5305, 0x5306, 0x5349, 0x535A,
-    0x5373, 0x537D, 0x537F, 0x20A2C, 0x7070, 0x53CA, 0x53DF, 0x20B63,
-    0x53EB, 0x53F1, 0x5406, 0x549E, 0x5438, 0x5448, 0x5468, 0x54A2,
-    0x54F6, 0x5510, 0x5553, 0x5563, 0x5584, 0x55AB, 0x55B3, 0x55C2,
-    0x5716, 0x5717, 0x5651, 0x5674, 0x58EE, 0x57CE, 0x57F4, 0x580D,
-    0x578B, 0x5832, 0x5831, 0x58AC, 0x214E4, 0x58F2, 0x58F7, 0x5906,
-    0x5922, 0x5962, 0x216A8, 0x216EA, 0x59EC, 0x5A1B, 0x5A27, 0x59D8,
-    0x5A66, 0x36EE, 0x36FC, 0x5B08, 0x5B3E, 0x219C8, 0x5BC3, 0x5BD8,
-    0x5BF3, 0x21B18, 0x5BFF, 0x5C06, 0x5F53, 0x3781, 0x5C60, 0x5CC0,
-    0x5C8D, 0x21DE4, 0x5D43, 0x21DE6, 0x5D6E, 0x5D6B, 0x5D7C, 0x5DE1,
-    0x5DE2, 0x382F, 0x5DFD, 0x5E28, 0x5E3D, 0x5E69, 0x3862, 0x22183,
-    0x387C, 0x5EB0, 0x5EB3, 0x5EB6, 0x2A392, 0x22331, 0x8201, 0x5F22,
-    0x38C7, 0x232B8, 0x261DA, 0x5F62, 0x5F6B, 0x38E3, 0x5F9A, 0x5FCD,
-    0x5FD7, 0x5FF9, 0x6081, 0x393A, 0x391C, 0x226D4, 0x60C7, 0x6148,
-    0x614C, 0x617A, 0x61B2, 0x61A4, 0x61AF, 0x61DE, 0x6210, 0x621B,
-    0x625D, 0x62B1, 0x62D4, 0x6350, 0x22B0C, 0x633D, 0x62FC, 0x6368,
-    0x6383, 0x63E4, 0x22BF1, 0x6422, 0x63C5, 0x63A9, 0x3A2E, 0x6469,
-    0x647E, 0x649D, 0x6477, 0x3A6C, 0x656C, 0x2300A, 0x65E3, 0x66F8,
-    0x6649, 0x3B19, 0x3B08, 0x3AE4, 0x5192, 0x5195, 0x6700, 0x669C,
-    0x80AD, 0x43D9, 0x6721, 0x675E, 0x6753, 0x233C3, 0x3B49, 0x67FA,
-    0x6785, 0x6852, 0x2346D, 0x688E, 0x681F, 0x6914, 0x6942, 0x69A3,
-    0x69EA, 0x6AA8, 0x236A3, 0x6ADB, 0x3C18, 0x6B21, 0x238A7, 0x6B54,
-    0x3C4E, 0x6B72, 0x6B9F, 0x6BBB, 0x23A8D, 0x21D0B, 0x23AFA, 0x6C4E,
-    0x23CBC, 0x6CBF, 0x6CCD, 0x6C67, 0x6D16, 0x6D3E, 0x6D69, 0x6D78,
-    0x6D85, 0x23D1E, 0x6D34, 0x6E2F, 0x6E6E, 0x3D33, 0x6EC7, 0x23ED1,
-    0x6DF9, 0x6F6E, 0x23F5E, 0x23F8E, 0x6FC6, 0x7039, 0x701B, 0x3D96,
-    0x704A, 0x707D, 0x7077, 0x70AD, 0x20525, 0x7145, 0x24263, 0x719C,
-    0x243AB, 0x7228, 0x7250, 0x24608, 0x7280, 0x7295, 0x24735, 0x24814,
-    0x737A, 0x738B, 0x3EAC, 0x73A5, 0x3EB8, 0x7447, 0x745C, 0x7485,
-    0x74CA, 0x3F1B, 0x7524, 0x24C36, 0x753E, 0x24C92, 0x2219F, 0x7610,
-    0x24FA1, 0x24FB8, 0x25044, 0x3FFC, 0x4008, 0x250F3, 0x250F2, 0x25119,
-    0x25133, 0x771E, 0x771F, 0x778B, 0x4046, 0x4096, 0x2541D, 0x784E,
-    0x40E3, 0x25626, 0x2569A, 0x256C5, 0x79EB, 0x412F, 0x7A4A, 0x7A4F,
-    0x2597C, 0x25AA7, 0x7AEE, 0x4202, 0x25BAB, 0x7BC6, 0x7BC9, 0x4227,
-    0x25C80, 0x7CD2, 0x42A0, 0x7CE8, 0x7CE3, 0x7D00, 0x25F86, 0x7D63,
-    0x4301, 0x7DC7, 0x7E02, 0x7E45, 0x4334, 0x26228, 0x26247, 0x4359,
-    0x262D9, 0x7F7A, 0x2633E, 0x7F95, 0x7FFA, 0x264DA, 0x26523, 0x8060,
-    0x265A8, 0x8070, 0x2335F, 0x43D5, 0x80B2, 0x8103, 0x440B, 0x813E,
-    0x5AB5, 0x267A7, 0x267B5, 0x23393, 0x2339C, 0x8204, 0x8F9E, 0x446B,
-    0x8291, 0x828B, 0x829D, 0x52B3, 0x82B1, 0x82B3, 0x82BD, 0x82E6,
-    0x26B3C, 0x831D, 0x8363, 0x83AD, 0x8323, 0x83BD, 0x83E7, 0x8353,
-    0x83CA, 0x83CC, 0x83DC, 0x26C36, 0x26D6B, 0x26CD5, 0x452B, 0x84F1,
-    0x84F3, 0x8516, 0x273CA, 0x8564, 0x26F2C, 0x455D, 0x4561, 0x26FB1,
-    0x270D2, 0x456B, 0x8650, 0x8667, 0x8669, 0x86A9, 0x8688, 0x870E,
-    0x86E2, 0x8728, 0x876B, 0x8786, 0x45D7, 0x87E1, 0x8801, 0x45F9,
-    0x8860, 0x27667, 0x88D7, 0x88DE, 0x4635, 0x88FA, 0x34BB, 0x278AE,
-    0x27966, 0x46BE, 0x46C7, 0x8AA0, 0x27CA8, 0x8CAB, 0x8CC1, 0x8D1B,
-    0x8D77, 0x27F2F, 0x20804, 0x8DCB, 0x8DBC, 0x8DF0, 0x208DE, 0x8ED4,
-    0x285D2, 0x285ED, 0x9094, 0x90F1, 0x9111, 0x2872E, 0x911B, 0x9238,
-    0x92D7, 0x92D8, 0x927C, 0x93F9, 0x9415, 0x28BFA, 0x958B, 0x4995,
-    0x95B7, 0x28D77, 0x49E6, 0x96C3, 0x5DB2, 0x9723, 0x29145, 0x2921A,
-    0x4A6E, 0x4A76, 0x97E0, 0x2940A, 0x4AB2, 0x29496, 0x9829, 0x295B6,
-    0x98E2, 0x4B33, 0x9929, 0x99A7, 0x99C2, 0x99FE, 0x4BCE, 0x29B30,
-    0x9C40, 0x9CFD, 0x4CCE, 0x4CED, 0x9D67, 0x2A0CE, 0x4CF8, 0x2A105,
-    0x2A20E, 0x2A291, 0x4D56, 0x9EFE, 0x9F05, 0x9F0F, 0x9F16, 0x2A600
+    0xA794, 0x1D8E, 0xA7C8, 0xA7CA, 0x0264, 0xA7CD, 0xA7CF, 0xA7D1,
+    0xA7D3, 0xA7D5, 0xA7D7, 0xA7D9, 0xA7DB, 0x019B, 0xA7F6, 0xAB37,
+    0xAB52, 0x028D, 0x13A0, 0x13A1, 0x13A2, 0x13A3, 0x13A4, 0x13A5,
+    0x13A6, 0x13A7, 0x13A8, 0x13A9, 0x13AA, 0x13AB, 0x13AC, 0x13AD,
+    0x13AE, 0x13AF, 0x13B0, 0x13B1, 0x13B2, 0x13B3, 0x13B4, 0x13B5,
+    0x13B6, 0x13B7, 0x13B8, 0x13B9, 0x13BA, 0x13BB, 0x13BC, 0x13BD,
+    0x13BE, 0x13BF, 0x13C0, 0x13C1, 0x13C2, 0x13C3, 0x13C4, 0x13C5,
+    0x13C6, 0x13C7, 0x13C8, 0x13C9, 0x13CA, 0x13CB, 0x13CC, 0x13CD,
+    0x13CE, 0x13CF, 0x13D0, 0x13D1, 0x13D2, 0x13D3, 0x13D4, 0x13D5,
+    0x13D6, 0x13D7, 0x13D8, 0x13D9, 0x13DA, 0x13DB, 0x13DC, 0x13DD,
+    0x13DE, 0x13DF, 0x13E0, 0x13E1, 0x13E2, 0x13E3, 0x13E4, 0x13E5,
+    0x13E6, 0x13E7, 0x13E8, 0x13E9, 0x13EA, 0x13EB, 0x13EC, 0x13ED,
+    0x13EE, 0x13EF, 0x8C48, 0x66F4, 0x8CC8, 0x6ED1, 0x4E32, 0x53E5,
+    0x5951, 0x5587, 0x5948, 0x61F6, 0x7669, 0x7F85, 0x863F, 0x87BA,
+    0x88F8, 0x908F, 0x6A02, 0x6D1B, 0x70D9, 0x73DE, 0x843D, 0x916A,
+    0x99F1, 0x4E82, 0x5375, 0x6B04, 0x721B, 0x862D, 0x9E1E, 0x5D50,
+    0x6FEB, 0x85CD, 0x8964, 0x62C9, 0x81D8, 0x881F, 0x5ECA, 0x6717,
+    0x6D6A, 0x72FC, 0x90CE, 0x4F86, 0x51B7, 0x52DE, 0x64C4, 0x6AD3,
+    0x7210, 0x76E7, 0x8606, 0x865C, 0x8DEF, 0x9732, 0x9B6F, 0x9DFA,
+    0x788C, 0x797F, 0x7DA0, 0x83C9, 0x9304, 0x8AD6, 0x58DF, 0x5F04,
+    0x7C60, 0x807E, 0x7262, 0x78CA, 0x8CC2, 0x96F7, 0x58D8, 0x5C62,
+    0x6A13, 0x6DDA, 0x6F0F, 0x7D2F, 0x7E37, 0x964B, 0x52D2, 0x808B,
+    0x51DC, 0x51CC, 0x7A1C, 0x7DBE, 0x83F1, 0x9675, 0x8B80, 0x62CF,
+    0x8AFE, 0x4E39, 0x5BE7, 0x6012, 0x7387, 0x7570, 0x5317, 0x78FB,
+    0x4FBF, 0x5FA9, 0x4E0D, 0x6CCC, 0x6578, 0x7D22, 0x53C3, 0x585E,
+    0x7701, 0x8449, 0x8AAA, 0x6BBA, 0x6C88, 0x62FE, 0x82E5, 0x63A0,
+    0x7565, 0x4EAE, 0x5169, 0x51C9, 0x6881, 0x7CE7, 0x826F, 0x8AD2,
+    0x91CF, 0x52F5, 0x5442, 0x5EEC, 0x65C5, 0x6FFE, 0x792A, 0x95AD,
+    0x9A6A, 0x9E97, 0x9ECE, 0x66C6, 0x6B77, 0x8F62, 0x5E74, 0x6190,
+    0x6200, 0x649A, 0x6F23, 0x7149, 0x7489, 0x79CA, 0x7DF4, 0x806F,
+    0x8F26, 0x84EE, 0x9023, 0x934A, 0x5217, 0x52A3, 0x54BD, 0x70C8,
+    0x88C2, 0x5EC9, 0x5FF5, 0x637B, 0x6BAE, 0x7C3E, 0x7375, 0x56F9,
+    0x5DBA, 0x601C, 0x73B2, 0x7469, 0x7F9A, 0x8046, 0x9234, 0x96F6,
+    0x9748, 0x9818, 0x4F8B, 0x79AE, 0x91B4, 0x96B8, 0x60E1, 0x4E86,
+    0x50DA, 0x5BEE, 0x5C3F, 0x6599, 0x71CE, 0x7642, 0x84FC, 0x907C,
+    0x6688, 0x962E, 0x5289, 0x677B, 0x67F3, 0x6D41, 0x6E9C, 0x7409,
+    0x7559, 0x786B, 0x7D10, 0x985E, 0x622E, 0x9678, 0x502B, 0x5D19,
+    0x6DEA, 0x8F2A, 0x5F8B, 0x6144, 0x6817, 0x9686, 0x5229, 0x540F,
+    0x5C65, 0x6613, 0x674E, 0x68A8, 0x6CE5, 0x7406, 0x75E2, 0x7F79,
+    0x88CF, 0x88E1, 0x96E2, 0x533F, 0x6EBA, 0x541D, 0x71D0, 0x7498,
+    0x85FA, 0x96A3, 0x9C57, 0x9E9F, 0x6797, 0x6DCB, 0x81E8, 0x7B20,
+    0x7C92, 0x72C0, 0x7099, 0x8B58, 0x4EC0, 0x8336, 0x523A, 0x5207,
+    0x5EA6, 0x62D3, 0x7CD6, 0x5B85, 0x6D1E, 0x66B4, 0x8F3B, 0x964D,
+    0x5ED3, 0x5140, 0x55C0, 0x585A, 0x6674, 0x51DE, 0x732A, 0x76CA,
+    0x793C, 0x795E, 0x7965, 0x798F, 0x9756, 0x7CBE, 0x8612, 0x8AF8,
+    0x9038, 0x90FD, 0x98EF, 0x98FC, 0x9928, 0x9DB4, 0x90DE, 0x96B7,
+    0x4FAE, 0x50E7, 0x514D, 0x52C9, 0x52E4, 0x5351, 0x559D, 0x5606,
+    0x5668, 0x5840, 0x58A8, 0x5C64, 0x6094, 0x6168, 0x618E, 0x61F2,
+    0x654F, 0x65E2, 0x6691, 0x6885, 0x6D77, 0x6E1A, 0x6F22, 0x716E,
+    0x722B, 0x7422, 0x7891, 0x7949, 0x7948, 0x7950, 0x7956, 0x798D,
+    0x798E, 0x7A40, 0x7A81, 0x7BC0, 0x7E09, 0x7E41, 0x7F72, 0x8005,
+    0x81ED, 0x8279, 0x8457, 0x8910, 0x8996, 0x8B01, 0x8B39, 0x8CD3,
+    0x8D08, 0x8FB6, 0x96E3, 0x97FF, 0x983B, 0x6075, 0x242EE, 0x8218,
+    0x4E26, 0x51B5, 0x5168, 0x4F80, 0x5145, 0x5180, 0x52C7, 0x52FA,
+    0x5555, 0x5599, 0x55E2, 0x58B3, 0x5944, 0x5954, 0x5A62, 0x5B28,
+    0x5ED2, 0x5ED9, 0x5F69, 0x5FAD, 0x60D8, 0x614E, 0x6108, 0x6160,
+    0x6234, 0x63C4, 0x641C, 0x6452, 0x6556, 0x671B, 0x6756, 0x6EDB,
+    0x6ECB, 0x701E, 0x77A7, 0x7235, 0x72AF, 0x7471, 0x7506, 0x753B,
+    0x761D, 0x761F, 0x76DB, 0x76F4, 0x774A, 0x7740, 0x78CC, 0x7AB1,
+    0x7C7B, 0x7D5B, 0x7F3E, 0x8352, 0x83EF, 0x8779, 0x8941, 0x8986,
+    0x8ABF, 0x8ACB, 0x8AED, 0x8B8A, 0x8F38, 0x9072, 0x9199, 0x9276,
+    0x967C, 0x97DB, 0x980B, 0x9B12, 0x2284A, 0x22844, 0x233D5, 0x3B9D,
+    0x4018, 0x4039, 0x25249, 0x25CD0, 0x27ED3, 0x9F43, 0x9F8E, 0x0066,
+    0x0066, 0x0066, 0x0069, 0x0066, 0x006C, 0x0066, 0x0066, 0x0069,
+    0x0066, 0x0066, 0x006C, 0x0073, 0x0074, 0x0574, 0x0576, 0x0574,
+    0x0565, 0x0574, 0x056B, 0x057E, 0x0576, 0x0574, 0x056D, 0x05D9,
+    0x05B4, 0x05F2, 0x05B7, 0x05E2, 0x05D4, 0x05DB, 0x05DC, 0x05DD,
+    0x05E8, 0x05EA, 0x05E9, 0x05C1, 0x05E9, 0x05C2, 0x05E9, 0x05BC,
+    0x05C1, 0x05E9, 0x05BC, 0x05C2, 0x05D0, 0x05B7, 0x05D0, 0x05B8,
+    0x05D0, 0x05BC, 0x05D1, 0x05BC, 0x05D2, 0x05BC, 0x05D3, 0x05BC,
+    0x05D4, 0x05BC, 0x05D5, 0x05BC, 0x05D6, 0x05BC, 0x05D8, 0x05BC,
+    0x05D9, 0x05BC, 0x05DA, 0x05BC, 0x05DB, 0x05BC, 0x05DC, 0x05BC,
+    0x05DE, 0x05BC, 0x05E0, 0x05BC, 0x05E1, 0x05BC, 0x05E3, 0x05BC,
+    0x05E4, 0x05BC, 0x05E6, 0x05BC, 0x05E7, 0x05BC, 0x05E8, 0x05BC,
+    0x05EA, 0x05BC, 0x05D5, 0x05B9, 0x05D1, 0x05BF, 0x05DB, 0x05BF,
+    0x05E4, 0x05BF, 0x05D0, 0x05DC, 0x0671, 0x067B, 0x067E, 0x0680,
+    0x067A, 0x067F, 0x0679, 0x06A4, 0x06A6, 0x0684, 0x0683, 0x0686,
+    0x0687, 0x068D, 0x068C, 0x068E, 0x0688, 0x0698, 0x0691, 0x06A9,
+    0x06AF, 0x06B3, 0x06B1, 0x06BA, 0x06BB, 0x06C0, 0x06C1, 0x06BE,
+    0x06D2, 0x06D3, 0x06AD, 0x06C6, 0x06C8, 0x06CB, 0x06C5, 0x06C9,
+    0x06D0, 0x0649, 0x0626, 0x0627, 0x0626, 0x06D5, 0x0626, 0x0648,
+    0x0626, 0x06C7, 0x0626, 0x06C6, 0x0626, 0x06C8, 0x0626, 0x06D0,
+    0x0626, 0x0649, 0x06CC, 0x0626, 0x062C, 0x0626, 0x062D, 0x0626,
+    0x0645, 0x0626, 0x064A, 0x0628, 0x062C, 0x0628, 0x062D, 0x0628,
+    0x062E, 0x0628, 0x0645, 0x0628, 0x0649, 0x0628, 0x064A, 0x062A,
+    0x062C, 0x062A, 0x062D, 0x062A, 0x062E, 0x062A, 0x0645, 0x062A,
+    0x0649, 0x062A, 0x064A, 0x062B, 0x062C, 0x062B, 0x0645, 0x062B,
+    0x0649, 0x062B, 0x064A, 0x062C, 0x062D, 0x062C, 0x0645, 0x062D,
+    0x062C, 0x062D, 0x0645, 0x062E, 0x062C, 0x062E, 0x062D, 0x062E,
+    0x0645, 0x0633, 0x062C, 0x0633, 0x062D, 0x0633, 0x062E, 0x0633,
+    0x0645, 0x0635, 0x062D, 0x0635, 0x0645, 0x0636, 0x062C, 0x0636,
+    0x062D, 0x0636, 0x062E, 0x0636, 0x0645, 0x0637, 0x062D, 0x0637,
+    0x0645, 0x0638, 0x0645, 0x0639, 0x062C, 0x0639, 0x0645, 0x063A,
+    0x062C, 0x063A, 0x0645, 0x0641, 0x062C, 0x0641, 0x062D, 0x0641,
+    0x062E, 0x0641, 0x0645, 0x0641, 0x0649, 0x0641, 0x064A, 0x0642,
+    0x062D, 0x0642, 0x0645, 0x0642, 0x0649, 0x0642, 0x064A, 0x0643,
+    0x0627, 0x0643, 0x062C, 0x0643, 0x062D, 0x0643, 0x062E, 0x0643,
+    0x0644, 0x0643, 0x0645, 0x0643, 0x0649, 0x0643, 0x064A, 0x0644,
+    0x062C, 0x0644, 0x062D, 0x0644, 0x062E, 0x0644, 0x0645, 0x0644,
+    0x0649, 0x0644, 0x064A, 0x0645, 0x062C, 0x0645, 0x062D, 0x0645,
+    0x062E, 0x0645, 0x0645, 0x0645, 0x0649, 0x0645, 0x064A, 0x0646,
+    0x062C, 0x0646, 0x062D, 0x0646, 0x062E, 0x0646, 0x0645, 0x0646,
+    0x0649, 0x0646, 0x064A, 0x0647, 0x062C, 0x0647, 0x0645, 0x0647,
+    0x0649, 0x0647, 0x064A, 0x064A, 0x062C, 0x064A, 0x062D, 0x064A,
+    0x062E, 0x064A, 0x0645, 0x064A, 0x0649, 0x064A, 0x064A, 0x0630,
+    0x0670, 0x0631, 0x0670, 0x0649, 0x0670, 0x0020, 0x064C, 0x0651,
+    0x0020, 0x064D, 0x0651, 0x0020, 0x064E, 0x0651, 0x0020, 0x064F,
+    0x0651, 0x0020, 0x0650, 0x0651, 0x0020, 0x0651, 0x0670, 0x0626,
+    0x0631, 0x0626, 0x0632, 0x0626, 0x0646, 0x0628, 0x0631, 0x0628,
+    0x0632, 0x0628, 0x0646, 0x062A, 0x0631, 0x062A, 0x0632, 0x062A,
+    0x0646, 0x062B, 0x0631, 0x062B, 0x0632, 0x062B, 0x0646, 0x0645,
+    0x0627, 0x0646, 0x0631, 0x0646, 0x0632, 0x0646, 0x0646, 0x064A,
+    0x0631, 0x064A, 0x0632, 0x064A, 0x0646, 0x0626, 0x062E, 0x0626,
+    0x0647, 0x0628, 0x0647, 0x062A, 0x0647, 0x0635, 0x062E, 0x0644,
+    0x0647, 0x0646, 0x0647, 0x0647, 0x0670, 0x064A, 0x0647, 0x062B,
+    0x0647, 0x0633, 0x0647, 0x0634, 0x0645, 0x0634, 0x0647, 0x0640,
+    0x064E, 0x0651, 0x0640, 0x064F, 0x0651, 0x0640, 0x0650, 0x0651,
+    0x0637, 0x0649, 0x0637, 0x064A, 0x0639, 0x0649, 0x0639, 0x064A,
+    0x063A, 0x0649, 0x063A, 0x064A, 0x0633, 0x0649, 0x0633, 0x064A,
+    0x0634, 0x0649, 0x0634, 0x064A, 0x062D, 0x0649, 0x062D, 0x064A,
+    0x062C, 0x0649, 0x062C, 0x064A, 0x062E, 0x0649, 0x062E, 0x064A,
+    0x0635, 0x0649, 0x0635, 0x064A, 0x0636, 0x0649, 0x0636, 0x064A,
+    0x0634, 0x062C, 0x0634, 0x062D, 0x0634, 0x062E, 0x0634, 0x0631,
+    0x0633, 0x0631, 0x0635, 0x0631, 0x0636, 0x0631, 0x0627, 0x064B,
+    0x062A, 0x062C, 0x0645, 0x062A, 0x062D, 0x062C, 0x062A, 0x062D,
+    0x0645, 0x062A, 0x062E, 0x0645, 0x062A, 0x0645, 0x062C, 0x062A,
+    0x0645, 0x062D, 0x062A, 0x0645, 0x062E, 0x062C, 0x0645, 0x062D,
+    0x062D, 0x0645, 0x064A, 0x062D, 0x0645, 0x0649, 0x0633, 0x062D,
+    0x062C, 0x0633, 0x062C, 0x062D, 0x0633, 0x062C, 0x0649, 0x0633,
+    0x0645, 0x062D, 0x0633, 0x0645, 0x062C, 0x0633, 0x0645, 0x0645,
+    0x0635, 0x062D, 0x062D, 0x0635, 0x0645, 0x0645, 0x0634, 0x062D,
+    0x0645, 0x0634, 0x062C, 0x064A, 0x0634, 0x0645, 0x062E, 0x0634,
+    0x0645, 0x0645, 0x0636, 0x062D, 0x0649, 0x0636, 0x062E, 0x0645,
+    0x0637, 0x0645, 0x062D, 0x0637, 0x0645, 0x0645, 0x0637, 0x0645,
+    0x064A, 0x0639, 0x062C, 0x0645, 0x0639, 0x0645, 0x0645, 0x0639,
+    0x0645, 0x0649, 0x063A, 0x0645, 0x0645, 0x063A, 0x0645, 0x064A,
+    0x063A, 0x0645, 0x0649, 0x0641, 0x062E, 0x0645, 0x0642, 0x0645,
+    0x062D, 0x0642, 0x0645, 0x0645, 0x0644, 0x062D, 0x0645, 0x0644,
+    0x062D, 0x064A, 0x0644, 0x062D, 0x0649, 0x0644, 0x062C, 0x062C,
+    0x0644, 0x062E, 0x0645, 0x0644, 0x0645, 0x062D, 0x0645, 0x062D,
+    0x062C, 0x0645, 0x062D, 0x0645, 0x0645, 0x062D, 0x064A, 0x0645,
+    0x062C, 0x062D, 0x0645, 0x062C, 0x0645, 0x0645, 0x062E, 0x062C,
+    0x0645, 0x062E, 0x0645, 0x0645, 0x062C, 0x062E, 0x0647, 0x0645,
+    0x062C, 0x0647, 0x0645, 0x0645, 0x0646, 0x062D, 0x0645, 0x0646,
+    0x062D, 0x0649, 0x0646, 0x062C, 0x0645, 0x0646, 0x062C, 0x0649,
+    0x0646, 0x0645, 0x064A, 0x0646, 0x0645, 0x0649, 0x064A, 0x0645,
+    0x0645, 0x0628, 0x062E, 0x064A, 0x062A, 0x062C, 0x064A, 0x062A,
+    0x062C, 0x0649, 0x062A, 0x062E, 0x064A, 0x062A, 0x062E, 0x0649,
+    0x062A, 0x0645, 0x064A, 0x062A, 0x0645, 0x0649, 0x062C, 0x0645,
+    0x064A, 0x062C, 0x062D, 0x0649, 0x062C, 0x0645, 0x0649, 0x0633,
+    0x062E, 0x0649, 0x0635, 0x062D, 0x064A, 0x0634, 0x062D, 0x064A,
+    0x0636, 0x062D, 0x064A, 0x0644, 0x062C, 0x064A, 0x0644, 0x0645,
+    0x064A, 0x064A, 0x062D, 0x064A, 0x064A, 0x062C, 0x064A, 0x064A,
+    0x0645, 0x064A, 0x0645, 0x0645, 0x064A, 0x0642, 0x0645, 0x064A,
+    0x0646, 0x062D, 0x064A, 0x0639, 0x0645, 0x064A, 0x0643, 0x0645,
+    0x064A, 0x0646, 0x062C, 0x062D, 0x0645, 0x062E, 0x064A, 0x0644,
+    0x062C, 0x0645, 0x0643, 0x0645, 0x0645, 0x062C, 0x062D, 0x064A,
+    0x062D, 0x062C, 0x064A, 0x0645, 0x062C, 0x064A, 0x0641, 0x0645,
+    0x064A, 0x0628, 0x062D, 0x064A, 0x0633, 0x062E, 0x064A, 0x0646,
+    0x062C, 0x064A, 0x0635, 0x0644, 0x06D2, 0x0642, 0x0644, 0x06D2,
+    0x0627, 0x0644, 0x0644, 0x0647, 0x0627, 0x0643, 0x0628, 0x0631,
+    0x0645, 0x062D, 0x0645, 0x062F, 0x0635, 0x0644, 0x0639, 0x0645,
+    0x0631, 0x0633, 0x0648, 0x0644, 0x0639, 0x0644, 0x064A, 0x0647,
+    0x0648, 0x0633, 0x0644, 0x0645, 0x0635, 0x0644, 0x0649, 0x0635,
+    0x0644, 0x0649, 0x0020, 0x0627, 0x0644, 0x0644, 0x0647, 0x0020,
+    0x0639, 0x0644, 0x064A, 0x0647, 0x0020, 0x0648, 0x0633, 0x0644,
+    0x0645, 0x062C, 0x0644, 0x0020, 0x062C, 0x0644, 0x0627, 0x0644,
+    0x0647, 0x0631, 0x06CC, 0x0627, 0x0644, 0x002C, 0x3001, 0x3016,
+    0x3017, 0x2014, 0x2013, 0x005F, 0x007B, 0x007D, 0x3014, 0x3015,
+    0x3010, 0x3011, 0x300A, 0x300B, 0x300C, 0x300D, 0x300E, 0x300F,
+    0x005B, 0x005D, 0x0023, 0x0026, 0x002A, 0x002D, 0x003C, 0x003E,
+    0x005C, 0x0024, 0x0025, 0x0040, 0x0020, 0x064B, 0x0640, 0x064B,
+    0x0640, 0x0651, 0x0020, 0x0652, 0x0640, 0x0652, 0x0621, 0x0622,
+    0x0623, 0x0624, 0x0625, 0x0629, 0x062F, 0x0632, 0x0644, 0x0622,
+    0x0644, 0x0623, 0x0644, 0x0625, 0x0644, 0x0627, 0x0022, 0x0027,
+    0x002F, 0x005E, 0x007C, 0x007E, 0x2985, 0x2986, 0x30FB, 0x30A1,
+    0x30A3, 0x30A5, 0x30A7, 0x30A9, 0x30E3, 0x30E5, 0x30E7, 0x30C3,
+    0x30FC, 0x30F3, 0x3099, 0x309A, 0x00A2, 0x00A3, 0x00AC, 0x00A6,
+    0x00A5, 0x20A9, 0x2502, 0x2190, 0x2191, 0x2192, 0x2193, 0x25A0,
+    0x25CB, 0x10428, 0x10429, 0x1042A, 0x1042B, 0x1042C, 0x1042D, 0x1042E,
+    0x1042F, 0x10430, 0x10431, 0x10432, 0x10433, 0x10434, 0x10435, 0x10436,
+    0x10437, 0x10438, 0x10439, 0x1043A, 0x1043B, 0x1043C, 0x1043D, 0x1043E,
+    0x1043F, 0x10440, 0x10441, 0x10442, 0x10443, 0x10444, 0x10445, 0x10446,
+    0x10447, 0x10448, 0x10449, 0x1044A, 0x1044B, 0x1044C, 0x1044D, 0x1044E,
+    0x1044F, 0x104D8, 0x104D9, 0x104DA, 0x104DB, 0x104DC, 0x104DD, 0x104DE,
+    0x104DF, 0x104E0, 0x104E1, 0x104E2, 0x104E3, 0x104E4, 0x104E5, 0x104E6,
+    0x104E7, 0x104E8, 0x104E9, 0x104EA, 0x104EB, 0x104EC, 0x104ED, 0x104EE,
+    0x104EF, 0x104F0, 0x104F1, 0x104F2, 0x104F3, 0x104F4, 0x104F5, 0x104F6,
+    0x104F7, 0x104F8, 0x104F9, 0x104FA, 0x104FB, 0x10597, 0x10598, 0x10599,
+    0x1059A, 0x1059B, 0x1059C, 0x1059D, 0x1059E, 0x1059F, 0x105A0, 0x105A1,
+    0x105A3, 0x105A4, 0x105A5, 0x105A6, 0x105A7, 0x105A8, 0x105A9, 0x105AA,
+    0x105AB, 0x105AC, 0x105AD, 0x105AE, 0x105AF, 0x105B0, 0x105B1, 0x105B3,
+    0x105B4, 0x105B5, 0x105B6, 0x105B7, 0x105B8, 0x105B9, 0x105BB, 0x105BC,
+    0x02D0, 0x02D1, 0x0299, 0x02A3, 0xAB66, 0x02A5, 0x02A4, 0x1D91,
+    0x0258, 0x025E, 0x02A9, 0x0262, 0x029B, 0x029C, 0x0267, 0x0284,
+    0x02AA, 0x02AB, 0x1DF04, 0xA78E, 0x026E, 0x1DF05, 0x028E, 0x1DF06,
+    0x0276, 0x0277, 0x027A, 0x1DF08, 0x027E, 0x02A8, 0x02A6, 0xAB67,
+    0x02A7, 0x2C71, 0x028F, 0x02A1, 0x02A2, 0x0298, 0x01C0, 0x01C1,
+    0x01C2, 0x1DF0A, 0x1DF1E, 0x10CC0, 0x10CC1, 0x10CC2, 0x10CC3, 0x10CC4,
+    0x10CC5, 0x10CC6, 0x10CC7, 0x10CC8, 0x10CC9, 0x10CCA, 0x10CCB, 0x10CCC,
+    0x10CCD, 0x10CCE, 0x10CCF, 0x10CD0, 0x10CD1, 0x10CD2, 0x10CD3, 0x10CD4,
+    0x10CD5, 0x10CD6, 0x10CD7, 0x10CD8, 0x10CD9, 0x10CDA, 0x10CDB, 0x10CDC,
+    0x10CDD, 0x10CDE, 0x10CDF, 0x10CE0, 0x10CE1, 0x10CE2, 0x10CE3, 0x10CE4,
+    0x10CE5, 0x10CE6, 0x10CE7, 0x10CE8, 0x10CE9, 0x10CEA, 0x10CEB, 0x10CEC,
+    0x10CED, 0x10CEE, 0x10CEF, 0x10CF0, 0x10CF1, 0x10CF2, 0x10D70, 0x10D71,
+    0x10D72, 0x10D73, 0x10D74, 0x10D75, 0x10D76, 0x10D77, 0x10D78, 0x10D79,
+    0x10D7A, 0x10D7B, 0x10D7C, 0x10D7D, 0x10D7E, 0x10D7F, 0x10D80, 0x10D81,
+    0x10D82, 0x10D83, 0x10D84, 0x10D85, 0x118C0, 0x118C1, 0x118C2, 0x118C3,
+    0x118C4, 0x118C5, 0x118C6, 0x118C7, 0x118C8, 0x118C9, 0x118CA, 0x118CB,
+    0x118CC, 0x118CD, 0x118CE, 0x118CF, 0x118D0, 0x118D1, 0x118D2, 0x118D3,
+    0x118D4, 0x118D5, 0x118D6, 0x118D7, 0x118D8, 0x118D9, 0x118DA, 0x118DB,
+    0x118DC, 0x118DD, 0x118DE, 0x118DF, 0x16E60, 0x16E61, 0x16E62, 0x16E63,
+    0x16E64, 0x16E65, 0x16E66, 0x16E67, 0x16E68, 0x16E69, 0x16E6A, 0x16E6B,
+    0x16E6C, 0x16E6D, 0x16E6E, 0x16E6F, 0x16E70, 0x16E71, 0x16E72, 0x16E73,
+    0x16E74, 0x16E75, 0x16E76, 0x16E77, 0x16E78, 0x16E79, 0x16E7A, 0x16E7B,
+    0x16E7C, 0x16E7D, 0x16E7E, 0x16E7F, 0x16EBB, 0x16EBC, 0x16EBD, 0x16EBE,
+    0x16EBF, 0x16EC0, 0x16EC1, 0x16EC2, 0x16EC3, 0x16EC4, 0x16EC5, 0x16EC6,
+    0x16EC7, 0x16EC8, 0x16EC9, 0x16ECA, 0x16ECB, 0x16ECC, 0x16ECD, 0x16ECE,
+    0x16ECF, 0x16ED0, 0x16ED1, 0x16ED2, 0x16ED3, 0x1D157, 0x1D165, 0x1D158,
+    0x1D165, 0x1D158, 0x1D165, 0x1D16E, 0x1D158, 0x1D165, 0x1D16F, 0x1D158,
+    0x1D165, 0x1D170, 0x1D158, 0x1D165, 0x1D171, 0x1D158, 0x1D165, 0x1D172,
+    0x1D1B9, 0x1D165, 0x1D1BA, 0x1D165, 0x1D1B9, 0x1D165, 0x1D16E, 0x1D1BA,
+    0x1D165, 0x1D16E, 0x1D1B9, 0x1D165, 0x1D16F, 0x1D1BA, 0x1D165, 0x1D16F,
+    0x0131, 0x0237, 0x2207, 0x2202, 0x1E922, 0x1E923, 0x1E924, 0x1E925,
+    0x1E926, 0x1E927, 0x1E928, 0x1E929, 0x1E92A, 0x1E92B, 0x1E92C, 0x1E92D,
+    0x1E92E, 0x1E92F, 0x1E930, 0x1E931, 0x1E932, 0x1E933, 0x1E934, 0x1E935,
+    0x1E936, 0x1E937, 0x1E938, 0x1E939, 0x1E93A, 0x1E93B, 0x1E93C, 0x1E93D,
+    0x1E93E, 0x1E93F, 0x1E940, 0x1E941, 0x1E942, 0x1E943, 0x066E, 0x06A1,
+    0x066F, 0x0030, 0x002C, 0x0031, 0x002C, 0x0032, 0x002C, 0x0033,
+    0x002C, 0x0034, 0x002C, 0x0035, 0x002C, 0x0036, 0x002C, 0x0037,
+    0x002C, 0x0038, 0x002C, 0x0039, 0x002C, 0x3014, 0x0073, 0x3015,
+    0x0077, 0x007A, 0x0068, 0x0076, 0x0073, 0x0064, 0x0070, 0x0070,
+    0x0076, 0x0077, 0x0063, 0x006D, 0x0063, 0x006D, 0x0064, 0x006D,
+    0x0072, 0x0064, 0x006A, 0x307B, 0x304B, 0x30B3, 0x30B3, 0x5B57,
+    0x53CC, 0x591A, 0x89E3, 0x4EA4, 0x6620, 0x7121, 0x524D, 0x5F8C,
+    0x518D, 0x65B0, 0x521D, 0x7D42, 0x8CA9, 0x58F0, 0x5439, 0x6F14,
+    0x6295, 0x6355, 0x904A, 0x6307, 0x6253, 0x7981, 0x7A7A, 0x5408,
+    0x6E80, 0x7533, 0x5272, 0x55B6, 0x914D, 0x3014, 0x672C, 0x3015,
+    0x3014, 0x4E09, 0x3015, 0x3014, 0x4E8C, 0x3015, 0x3014, 0x5B89,
+    0x3015, 0x3014, 0x70B9, 0x3015, 0x3014, 0x6253, 0x3015, 0x3014,
+    0x76D7, 0x3015, 0x3014, 0x52DD, 0x3015, 0x3014, 0x6557, 0x3015,
+    0x5F97, 0x53EF, 0x4E3D, 0x4E38, 0x4E41, 0x20122, 0x4F60, 0x4FBB,
+    0x5002, 0x507A, 0x5099, 0x50CF, 0x349E, 0x2063A, 0x5154, 0x5164,
+    0x5177, 0x2051C, 0x34B9, 0x5167, 0x2054B, 0x5197, 0x51A4, 0x4ECC,
+    0x51AC, 0x291DF, 0x5203, 0x34DF, 0x523B, 0x5246, 0x5277, 0x3515,
+    0x5305, 0x5306, 0x5349, 0x535A, 0x5373, 0x537D, 0x537F, 0x20A2C,
+    0x7070, 0x53CA, 0x53DF, 0x20B63, 0x53EB, 0x53F1, 0x5406, 0x549E,
+    0x5438, 0x5448, 0x5468, 0x54A2, 0x54F6, 0x5510, 0x5553, 0x5563,
+    0x5584, 0x55AB, 0x55B3, 0x55C2, 0x5716, 0x5717, 0x5651, 0x5674,
+    0x58EE, 0x57CE, 0x57F4, 0x580D, 0x578B, 0x5832, 0x5831, 0x58AC,
+    0x214E4, 0x58F2, 0x58F7, 0x5906, 0x5922, 0x5962, 0x216A8, 0x216EA,
+    0x59EC, 0x5A1B, 0x5A27, 0x59D8, 0x5A66, 0x36EE, 0x36FC, 0x5B08,
+    0x5B3E, 0x219C8, 0x5BC3, 0x5BD8, 0x5BF3, 0x21B18, 0x5BFF, 0x5C06,
+    0x5F53, 0x3781, 0x5C60, 0x5CC0, 0x5C8D, 0x21DE4, 0x5D43, 0x21DE6,
+    0x5D6E, 0x5D6B, 0x5D7C, 0x5DE1, 0x5DE2, 0x382F, 0x5DFD, 0x5E28,
+    0x5E3D, 0x5E69, 0x3862, 0x22183, 0x387C, 0x5EB0, 0x5EB3, 0x5EB6,
+    0x2A392, 0x22331, 0x8201, 0x5F22, 0x38C7, 0x232B8, 0x261DA, 0x5F62,
+    0x5F6B, 0x38E3, 0x5F9A, 0x5FCD, 0x5FD7, 0x5FF9, 0x6081, 0x393A,
+    0x391C, 0x226D4, 0x60C7, 0x6148, 0x614C, 0x617A, 0x61B2, 0x61A4,
+    0x61AF, 0x61DE, 0x6210, 0x621B, 0x625D, 0x62B1, 0x62D4, 0x6350,
+    0x22B0C, 0x633D, 0x62FC, 0x6368, 0x6383, 0x63E4, 0x22BF1, 0x6422,
+    0x63C5, 0x63A9, 0x3A2E, 0x6469, 0x647E, 0x649D, 0x6477, 0x3A6C,
+    0x656C, 0x2300A, 0x65E3, 0x66F8, 0x6649, 0x3B19, 0x3B08, 0x3AE4,
+    0x5192, 0x5195, 0x6700, 0x669C, 0x80AD, 0x43D9, 0x6721, 0x675E,
+    0x6753, 0x233C3, 0x3B49, 0x67FA, 0x6785, 0x6852, 0x2346D, 0x688E,
+    0x681F, 0x6914, 0x6942, 0x69A3, 0x69EA, 0x6AA8, 0x236A3, 0x6ADB,
+    0x3C18, 0x6B21, 0x238A7, 0x6B54, 0x3C4E, 0x6B72, 0x6B9F, 0x6BBB,
+    0x23A8D, 0x21D0B, 0x23AFA, 0x6C4E, 0x23CBC, 0x6CBF, 0x6CCD, 0x6C67,
+    0x6D16, 0x6D3E, 0x6D69, 0x6D78, 0x6D85, 0x23D1E, 0x6D34, 0x6E2F,
+    0x6E6E, 0x3D33, 0x6EC7, 0x23ED1, 0x6DF9, 0x6F6E, 0x23F5E, 0x23F8E,
+    0x6FC6, 0x7039, 0x701B, 0x3D96, 0x704A, 0x707D, 0x7077, 0x70AD,
+    0x20525, 0x7145, 0x24263, 0x719C, 0x243AB, 0x7228, 0x7250, 0x24608,
+    0x7280, 0x7295, 0x24735, 0x24814, 0x737A, 0x738B, 0x3EAC, 0x73A5,
+    0x3EB8, 0x7447, 0x745C, 0x7485, 0x74CA, 0x3F1B, 0x7524, 0x24C36,
+    0x753E, 0x24C92, 0x2219F, 0x7610, 0x24FA1, 0x24FB8, 0x25044, 0x3FFC,
+    0x4008, 0x250F3, 0x250F2, 0x25119, 0x25133, 0x771E, 0x771F, 0x778B,
+    0x4046, 0x4096, 0x2541D, 0x784E, 0x40E3, 0x25626, 0x2569A, 0x256C5,
+    0x79EB, 0x412F, 0x7A4A, 0x7A4F, 0x2597C, 0x25AA7, 0x7AEE, 0x4202,
+    0x25BAB, 0x7BC6, 0x7BC9, 0x4227, 0x25C80, 0x7CD2, 0x42A0, 0x7CE8,
+    0x7CE3, 0x7D00, 0x25F86, 0x7D63, 0x4301, 0x7DC7, 0x7E02, 0x7E45,
+    0x4334, 0x26228, 0x26247, 0x4359, 0x262D9, 0x7F7A, 0x2633E, 0x7F95,
+    0x7FFA, 0x264DA, 0x26523, 0x8060, 0x265A8, 0x8070, 0x2335F, 0x43D5,
+    0x80B2, 0x8103, 0x440B, 0x813E, 0x5AB5, 0x267A7, 0x267B5, 0x23393,
+    0x2339C, 0x8204, 0x8F9E, 0x446B, 0x8291, 0x828B, 0x829D, 0x52B3,
+    0x82B1, 0x82B3, 0x82BD, 0x82E6, 0x26B3C, 0x831D, 0x8363, 0x83AD,
+    0x8323, 0x83BD, 0x83E7, 0x8353, 0x83CA, 0x83CC, 0x83DC, 0x26C36,
+    0x26D6B, 0x26CD5, 0x452B, 0x84F1, 0x84F3, 0x8516, 0x273CA, 0x8564,
+    0x26F2C, 0x455D, 0x4561, 0x26FB1, 0x270D2, 0x456B, 0x8650, 0x8667,
+    0x8669, 0x86A9, 0x8688, 0x870E, 0x86E2, 0x8728, 0x876B, 0x8786,
+    0x45D7, 0x87E1, 0x8801, 0x45F9, 0x8860, 0x27667, 0x88D7, 0x88DE,
+    0x4635, 0x88FA, 0x34BB, 0x278AE, 0x27966, 0x46BE, 0x46C7, 0x8AA0,
+    0x27CA8, 0x8CAB, 0x8CC1, 0x8D1B, 0x8D77, 0x27F2F, 0x20804, 0x8DCB,
+    0x8DBC, 0x8DF0, 0x208DE, 0x8ED4, 0x285D2, 0x285ED, 0x9094, 0x90F1,
+    0x9111, 0x2872E, 0x911B, 0x9238, 0x92D7, 0x92D8, 0x927C, 0x93F9,
+    0x9415, 0x28BFA, 0x958B, 0x4995, 0x95B7, 0x28D77, 0x49E6, 0x96C3,
+    0x5DB2, 0x9723, 0x29145, 0x2921A, 0x4A6E, 0x4A76, 0x97E0, 0x2940A,
+    0x4AB2, 0x29496, 0x9829, 0x295B6, 0x98E2, 0x4B33, 0x9929, 0x99A7,
+    0x99C2, 0x99FE, 0x4BCE, 0x29B30, 0x9C40, 0x9CFD, 0x4CCE, 0x4CED,
+    0x9D67, 0x2A0CE, 0x4CF8, 0x2A105, 0x2A20E, 0x2A291, 0x4D56, 0x9EFE,
+    0x9F05, 0x9F0F, 0x9F16, 0x2A600
 };
 
-static const lxb_unicode_normalization_entry_t lxb_unicode_normalization_entries[5131] =
+static const lxb_unicode_normalization_entry_t lxb_unicode_normalization_entries[5132] =
 {
     {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_FONT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 1301, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6059, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4619, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4574, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 36, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_WIDE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 276, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_FINAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 5504, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 6391, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_FONT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 975, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_FONT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 614, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 3225, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_FONT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 594, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 1329, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6023, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_FINAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5171, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4812, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2975, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 6355, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6738, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 4882, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6542, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_NARROW, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3056, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 1518, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4874, 0},
+    {LXB_UNICODE_CANONICAL_SEPARATELY|LXB_UNICODE_DECOMPOSITION_TYPE_WIDE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 6001, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_FINAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5175, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_WIDE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 604, 0},
     {LXB_UNICODE_DECOMPOSITION_TYPE_FONT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_FONT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 1089, 0},
     {LXB_UNICODE_DECOMPOSITION_TYPE_FONT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5135, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_NARROW, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2433, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_FONT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5324, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3178, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6853, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_CIRCLE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3137, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6624, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4659, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_FONT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2285, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_WIDE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5758, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4836, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_ISOLATED, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5324, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_FINAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5004, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6827, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_CIRCLE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 3479, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_FONT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 594, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_FONT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5191, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6785, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 2441, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3184, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 3346, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_MEDIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5117, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 949, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6472, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_FONT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 286, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4585, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 6347, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_FONT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 10, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4782, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 644, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6060, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_FINAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 5474, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4617, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_FONT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 90, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_FONT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 288, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2288, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_ISOLATED, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5001, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6751, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4700, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_NARROW, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5834, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6861, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_FONT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 624, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_MAYBE|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_MAYBE|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 6122, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_FONT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 663, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2983, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_FINAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 5660, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 817, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 3082, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 1351, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_CIRCLE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3058, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 4100, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_MEDIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5143, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6482, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_CIRCLE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3517, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2863, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4606, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 1637, 276},
-    {LXB_UNICODE_CANONICAL_SEPARATELY|LXB_UNICODE_DECOMPOSITION_TYPE_FONT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6199, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_FONT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 198, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6950, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_ISOLATED, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 5256, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_FONT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2334, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6930, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 4119, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 2519, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_CIRCLE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3516, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2888, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2865, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_FINAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5143, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2530, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 6089, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_FONT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_FONT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 200, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 549, 104},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 4, 1947, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4711, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6549, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 1703, 292},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 1372, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_ISOLATED, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5229, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2968, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 1545, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 1788, 307},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6842, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_INITIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 5495, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_FONT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6192, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_INITIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5000, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_FONT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 346, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6770, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_CIRCLE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 36, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 4, 4307, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6537, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 1527, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4777, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_FINAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5001, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_ISOLATED, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5203, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SUB, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 90, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_WIDE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5759, 0},
     {LXB_UNICODE_DECOMPOSITION_TYPE_FONT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 56, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 443, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 431, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 6339, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6860, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6914, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_FONT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 618, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_FONT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 36, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 2387, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_CIRCLE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 967, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4685, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_FRACTION, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 2355, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4479, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 4380, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6516, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_ISOLATED, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4993, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_FONT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6186, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4796, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 1785, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_FINAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5363, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 1554, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SUB, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 650, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 1457, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_INITIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5316, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_MEDIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5326, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4745, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4736, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_NARROW, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3619, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4792, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 1298, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 1710, 295},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_VERTICAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5772, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 336, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_VERTICAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5746, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 4, 1935, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 975, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4743, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_MEDIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5322, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 14, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_FONT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 779, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_FONT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 98, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_FONT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 302, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4486, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_WIDE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 106, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4672, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4806, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_INITIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4993, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_FONT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 344, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 1841, 314},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_NARROW, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3056, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_FONT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 667, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4752, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 1878, 327},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 6355, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4579, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 4014, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6841, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_FONT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 24, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 2687, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_CIRCLE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 274, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2777, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 811, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_FONT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 274, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 4, 3696, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6762, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_VERTICAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5763, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6531, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 2705, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 1040, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_FINAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 5645, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 413, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 1665, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_INITIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 5411, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6818, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 711, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 350, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6920, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 1137, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_FONT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 7, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3118, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6747, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2900, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_FONT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 971, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 683, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 4291, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 1243, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_INITIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 5441, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SUB, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6310, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 624, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6866, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 6335, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2942, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 1700, 291},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2843, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_CIRCLE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 3566, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_ISOLATED, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5023, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4702, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_FONT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 1301, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_FONT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 992, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 76, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6050, 0},
     {LXB_UNICODE_DECOMPOSITION_TYPE_FONT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6179, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6473, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_CIRCLE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3614, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4520, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_FONT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6190, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_INITIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5089, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 3904, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4759, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 4338, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 1400, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_ISOLATED, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5107, 0},
-    {LXB_UNICODE_CANONICAL_SEPARATELY|LXB_UNICODE_DECOMPOSITION_TYPE_NARROW, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5977, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6917, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_FONT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2753, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2820, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 2469, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 3403, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_ISOLATED, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5129, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2871, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_FONT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6184, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6897, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_FONT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 971, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_FONT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2318, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2940, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_CIRCLE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3062, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_FONT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 182, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_FONT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 98, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_WIDE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5760, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_FONT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6175, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_WIDE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 158, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_NARROW, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6010, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_FONT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 983, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2888, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6031, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_FONT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 611, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 631, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6792, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 2632, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_NARROW, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3619, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_FONT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5155, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_NARROW, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3098, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 2565, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6029, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4480, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_FONT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 106, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6807, 0},
     {LXB_UNICODE_DECOMPOSITION_TYPE_FONT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 88, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 316, 92},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 0, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6051, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_INITIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4997, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_FONT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5109, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6049, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6648, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6486, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6746, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_FONT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6172, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4471, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 906, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_FONT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6176, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_FONT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2289, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_FINAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5133, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_CIRCLE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 3499, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_FONT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5087, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6019, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 3397, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_INITIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 783, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2914, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6944, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_INITIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5165, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_ISOLATED, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5247, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4862, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_FONT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 334, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_FONT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 641, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 2750, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6840, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6519, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_MEDIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5087, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6040, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 2499, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 1267, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6459, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6548, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2289, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 389, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2853, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_CIRCLE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2288, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_FONT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 74, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6932, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2784, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 2077, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SUB, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2285, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 6, 3807, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_CIRCLE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3617, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_FONT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 276, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 6132, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_FONT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5099, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_MAYBE|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_MAYBE|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 6128, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_FONT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6185, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2529, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 6364, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 1021, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2787, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_FONT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 160, 0},
-    {LXB_UNICODE_CANONICAL_SEPARATELY|LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2245, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_CIRCLE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3529, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6952, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 2463, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_ISOLATED, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5215, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_FINAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5272, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 286, 85},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4508, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2855, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 594, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 3096, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 1574, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_FONT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 158, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_ISOLATED, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5022, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_FONT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 967, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 1370, 260},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_FONT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 118, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2958, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 639, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_WIDE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 992, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_WIDE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 1061, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_INITIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5209, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6531, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6762, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_FONT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6326, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2825, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_FONT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 54, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 98, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 1055, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_MEDIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 783, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6552, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6057, 0},
+    {LXB_UNICODE_CANONICAL_SEPARATELY|LXB_UNICODE_DECOMPOSITION_TYPE_NARROW, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5920, 0},
     {LXB_UNICODE_DECOMPOSITION_TYPE_FONT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 633, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6859, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_FONT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6193, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_FONT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 126, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 6427, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_WIDE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5821, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 3956, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_CIRCLE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 3566, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_FONT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 38, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4876, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_ISOLATED, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5113, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4532, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_INITIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5193, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6754, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_NARROW, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3624, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_ISOLATED, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5155, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_FINAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4988, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 4285, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SUB, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6303, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6931, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_FINAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 5597, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2916, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 1804, 309},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_FONT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2288, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_CIRCLE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 3469, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4814, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_FONT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5155, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_FINAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5381, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6951, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 527, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6824, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_ISOLATED, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5803, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6772, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4534, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4768, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 637, 117},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 4934, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_WIDE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5822, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_ISOLATED, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5363, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 194, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 4, 3949, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_FONT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 304, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_CIRCLE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2285, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 3582, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 204, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 3681, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_FONT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6187, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 2702, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_CIRCLE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 3451, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 2453, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6570, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6471, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 3835, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_FONT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6189, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_FONT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 664, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 2651, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6956, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_INITIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 5054, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4761, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_INITIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 5522, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_INITIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5310, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2947, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 98, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4629, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_FONT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5203, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 677, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4562, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 803, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2790, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_INITIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 5516, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_FONT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5075, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_INITIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 5057, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6911, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_WIDE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 286, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 1397, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6830, 0},
-    {LXB_UNICODE_CANONICAL_SEPARATELY|LXB_UNICODE_DECOMPOSITION_TYPE_FONT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6280, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4653, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_CIRCLE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 3455, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_ISOLATED, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5189, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 1333, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3149, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 3030, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 4, 3865, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 2301, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 46, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_ISOLATED, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5215, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 74, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6896, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_FONT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 1329, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6703, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 1811, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2956, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4528, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 338, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4838, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 6101, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6719, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_FINAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 777, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_WIDE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 36, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4638, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_VERTICAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2295, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3124, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3520, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_CIRCLE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3531, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_ISOLATED, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5375, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 943, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4538, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 6156, 457},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6640, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 3760, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_INITIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5215, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2254, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4506, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_FRACTION, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 2364, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_FONT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 983, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3131, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 1850, 317},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 1009, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_FONT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 666, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_INITIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5103, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 6, 3931, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_ISOLATED, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 783, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 3801, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_CIRCLE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3209, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_FONT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 232, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_ISOLATED, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5371, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4772, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 3361, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 849, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_FINAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 775, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 6099, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 3424, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_FONT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 651, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_CIRCLE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 90, 0},
-    {LXB_UNICODE_CANONICAL_SEPARATELY|LXB_UNICODE_DECOMPOSITION_TYPE_NARROW, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5896, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_FONT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 965, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 1869, 324},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_WIDE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2287, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6568, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 6440, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_FONT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 46, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 1159, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 857, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_WIDE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 118, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 2574, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 1627, 272},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 4, 2580, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 2638, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_FONT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 184, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 3346, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4600, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3135, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4563, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_FONT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 302, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4514, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3209, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 431, 101},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 4, 4307, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_INITIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 5414, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6953, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6633, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_FONT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5117, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_FINAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5280, 0},
+    {LXB_UNICODE_CANONICAL_SEPARATELY|LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 4182, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_CIRCLE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 54, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 1143, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 807, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 4416, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6651, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 1185, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3169, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 1571, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_FONT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 200, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 6085, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6921, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4854, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 1194, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 346, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 1155, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 1151, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 4342, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 6083, 0},
     {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 723, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_INITIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5125, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_FINAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5298, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_CIRCLE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3625, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_FONT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 224, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 471, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 6148, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4733, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6904, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3184, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_ISOLATED, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5379, 0},
+    {LXB_UNICODE_CANONICAL_SEPARATELY|LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 4153, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2833, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 2309, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_FINAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5367, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_FONT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 118, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 202, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_INITIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5133, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 1448, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6701, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 2220, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SMALL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2477, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3126, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 1861, 321},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 646, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 1315, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 1856, 319},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 871, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_INITIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5008, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SUB, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6870, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 679, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 695, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_ISOLATED, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5133, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2921, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 2201, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_FONT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5121, 0},
     {LXB_UNICODE_DECOMPOSITION_TYPE_FONT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2286, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3155, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_ISOLATED, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5201, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 3442, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_FONT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5215, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 416, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 668, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6826, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 1656, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6572, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 2233, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_INITIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 5537, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3153, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_ISOLATED, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5197, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_FONT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6183, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 6079, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 4, 4359, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 2761, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 2185, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 966, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 554, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_FINAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 5510, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_INITIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5326, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_INITIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5129, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_FINAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5286, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 889, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6792, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_FONT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 963, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 302, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 2669, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_FONT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2284, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 340, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_ISOLATED, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 4, 5685, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6024, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_ISOLATED, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5137, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 3028, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_FINAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 5029, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 2400, 0},
-    {LXB_UNICODE_CANONICAL_SEPARATELY|LXB_UNICODE_DECOMPOSITION_TYPE_NARROW, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5851, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4602, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_WIDE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5760, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4804, 0},
-    {LXB_UNICODE_CANONICAL_SEPARATELY|LXB_UNICODE_DECOMPOSITION_TYPE_NARROW, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5908, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4687, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 499, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4841, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 662, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_FRACTION, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 18, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6975, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4631, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 1069, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 1225, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 769, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_FONT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 336, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 1887, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6022, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_ISOLATED, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5141, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 3385, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6322, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4830, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_ISOLATED, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5809, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 485, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 3074, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 469, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 4137, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6897, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4766, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 739, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 1179, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 4, 3688, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2849, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 1610, 266},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_FINAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5292, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 419, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_FONT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5810, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_FINAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5383, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 1630, 273},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 1847, 316},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_FONT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 230, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 1889, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_MEDIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5081, 0},
+    {LXB_UNICODE_CANONICAL_SEPARATELY|LXB_UNICODE_DECOMPOSITION_TYPE_NARROW, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5959, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 4363, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 3249, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 4, 2417, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 2194, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4488, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 2257, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_FINAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 5573, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3190, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2813, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4538, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4826, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_FONT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 775, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2803, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 4062, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_FONT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 663, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 56, 0},
     {LXB_UNICODE_DECOMPOSITION_TYPE_FONT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6173, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6581, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_CIRCLE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 971, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_INITIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5024, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2840, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_FONT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 184, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6803, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 1261, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_MEDIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5095, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_FINAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4989, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_FINAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5099, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 1357, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 4281, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_FINAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 5447, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 1583, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_INITIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5312, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2918, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_ISOLATED, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5024, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6600, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_CIRCLE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6515, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 2527, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 56, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_WIDE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2295, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 3635, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 2481, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 551, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_CIRCLE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 3570, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 567, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2966, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 2100, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 320, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_FONT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 228, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_ISOLATED, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5173, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6787, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_WIDE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 965, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4648, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4713, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_ISOLATED, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4992, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3192, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4540, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 4357, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 3255, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2897, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SUB, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 691, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_FONT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 980, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3147, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_VERTICAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5767, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_FONT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 46, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6020, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_FINAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5185, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 354, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6892, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 210, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 2634, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 4247, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_FONT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5103, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 2568, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 36, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 1298, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_FONT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 288, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6021, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 2443, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_CIRCLE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3633, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_FONT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 665, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_WIDE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5826, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 3094, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2753, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6067, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 6409, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_ISOLATED, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5253, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 2431, 0},
+    {LXB_UNICODE_CANONICAL_SEPARATELY|LXB_UNICODE_DECOMPOSITION_TYPE_NARROW, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5941, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_FONT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2287, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 3082, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_NARROW, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5839, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 2252, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 1057, 0},
     {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 967, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2944, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 1113, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 6373, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_FINAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 5555, 0},
     {LXB_UNICODE_DECOMPOSITION_TYPE_FONT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 783, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SUB, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 662, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_ISOLATED, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5359, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_WIDE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 302, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4722, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 1277, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6637, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4727, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 1, 54},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_INITIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 5528, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6047, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 4098, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_CIRCLE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 90, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6065, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_INITIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5205, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_FRACTION, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 15, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 1646, 279},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4743, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SUB, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 594, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_NARROW, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5837, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_NARROW, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3074, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SUB, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 200, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_CIRCLE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 3451, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 1521, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 1820, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 4, 2007, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4607, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 2473, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 3068, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_NARROW, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3613, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_FONT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 346, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_NARROW, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3617, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_INITIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5197, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_FONT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 965, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6033, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_CIRCLE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 1089, 0},
+    {LXB_UNICODE_CANONICAL_SEPARATELY|LXB_UNICODE_DECOMPOSITION_TYPE_FONT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6199, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 2092, 0},
     {LXB_UNICODE_DECOMPOSITION_TYPE_FONT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 226, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 4388, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4548, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6601, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2886, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 3072, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5758, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 2509, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SUB, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 767, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_FONT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 626, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_FINAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5008, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6466, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 4104, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 969, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4780, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_FONT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 635, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 3080, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 1010, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3141, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 6107, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 2696, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_FONT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2290, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6582, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_FONT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 54, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 4392, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_MEDIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5799, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_MEDIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5308, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2859, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 1672, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 1011, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_WIDE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 288, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_INITIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5155, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 3603, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6727, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 853, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6470, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_FONT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 234, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_FONT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 334, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_FONT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 38, 0},
+    {LXB_UNICODE_CANONICAL_SEPARATELY|LXB_UNICODE_DECOMPOSITION_TYPE_FONT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6289, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SUB, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_WIDE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2753, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2951, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 314, 91},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_FONT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 286, 0},
     {LXB_UNICODE_DECOMPOSITION_TYPE_VERTICAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5768, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 4901, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 2660, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_FONT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 650, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6562, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4778, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 1558, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_ISOLATED, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5385, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 393, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6799, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_FONT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5809, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4820, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_FONT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2318, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_FONT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6175, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_FONT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 980, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 1033, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 3352, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6661, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_NARROW, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3630, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4490, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3176, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 2187, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6606, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_FINAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 5558, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 292, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 1349, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6744, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4846, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2777, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6794, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 6, 3747, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 677, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 1077, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 594, 0},
     {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 4410, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 519, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 593, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2930, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 955, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_FONT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 14, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6916, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_INITIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 5510, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_FINAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5391, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6594, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6885, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 3610, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_ISOLATED, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5103, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_FINAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4995, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6065, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 308, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 294, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_FINAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 789, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 318, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6035, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_ISOLATED, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4990, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_FONT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 234, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_NARROW, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5838, 0},
+    {LXB_UNICODE_CANONICAL_SEPARATELY|LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5785, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6615, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_ISOLATED, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 793, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4510, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 733, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 4404, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3207, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_VERTICAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5744, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_MEDIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5379, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4512, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 4117, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_FONT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 650, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3182, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 3222, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 4334, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 5, 3646, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4530, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 699, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 753, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_FONT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5179, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2813, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 4035, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 4338, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2970, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 2414, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 2316, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 2196, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3180, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4832, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6940, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 1850, 317},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4855, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 644, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 1361, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 982, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 1406, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6876, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 1146, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_WIDE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 967, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6565, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 1188, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4797, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6315, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6546, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_ISOLATED, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 779, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_FINAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5363, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_ISOLATED, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5135, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 483, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 2260, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_FONT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2753, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_INITIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5115, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 3433, 0},
     {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4591, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_FONT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2333, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_FINAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5093, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_INITIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 5438, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6055, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_MEDIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5229, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_CIRCLE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3078, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4613, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4877, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 1066, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 1223, 256},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 1792, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4751, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4589, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3116, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_FINAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 5044, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_FONT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2205, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 210, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 895, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 222, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 703, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_FINAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5808, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4750, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3209, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 1345, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 230, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2859, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2318, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_FONT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2287, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 4020, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 2491, 0},
     {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 2741, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_FONT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 66, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6602, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_INITIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 5474, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SUB, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2288, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2979, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2814, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_ISOLATED, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 5241, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 377, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6716, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_FONT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 665, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 104, 73},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 391, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 4324, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 2515, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 4, 4317, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_CIRCLE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 2535, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4683, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4481, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6804, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_INITIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4999, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 1355, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_ISOLATED, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5237, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4734, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6466, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6583, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_FINAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 5669, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_INITIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5215, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 2102, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6702, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 4038, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_FINAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5139, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 58, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_CIRCLE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3206, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6895, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_FONT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5139, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6910, 0},
-    {LXB_UNICODE_CANONICAL_SEPARATELY|LXB_UNICODE_DECOMPOSITION_TYPE_NARROW, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5980, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4600, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 2309, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 965, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6026, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6311, 0},
-    {LXB_UNICODE_CANONICAL_SEPARATELY|LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 6, 4258, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_FONT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5063, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4723, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_INITIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 5456, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_INITIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5171, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 996, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6680, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2872, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_INITIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5139, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6522, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 4, 1909, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 1681, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_MEDIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4997, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4714, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 664, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6655, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 2421, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6737, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_FONT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 611, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_INITIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5133, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_CIRCLE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 3501, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_FINAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 783, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 78, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2846, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 4, 3302, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_MEDIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5328, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4795, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_ISOLATED, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5145, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SUB, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 731, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 6376, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 646, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4598, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2804, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SUB, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2287, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6039, 0},
-    {LXB_UNICODE_CANONICAL_SEPARATELY|LXB_UNICODE_DECOMPOSITION_TYPE_FONT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6214, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6687, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 434, 102},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_FONT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 992, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 1045, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4791, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 1347, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_INITIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5025, 0},
-    {LXB_UNICODE_CANONICAL_SEPARATELY|LXB_UNICODE_DECOMPOSITION_TYPE_NARROW, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5965, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 1643, 278},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 4064, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 3020, 0},
-    {LXB_UNICODE_CANONICAL_SEPARATELY|LXB_UNICODE_DECOMPOSITION_TYPE_NARROW, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5959, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 663, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SUB, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 695, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_FONT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6324, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6616, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 1568, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SUB, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2292, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 693, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_WIDE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5771, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4738, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_ISOLATED, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 5709, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_MEDIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5099, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_CIRCLE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3062, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2936, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 3032, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_FONT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6170, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2798, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 1592, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 467, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6668, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_FONT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 1089, 0},
-    {LXB_UNICODE_CANONICAL_SEPARATELY|LXB_UNICODE_DECOMPOSITION_TYPE_FONT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6205, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2844, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 789, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_FONT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2326, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4636, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_FINAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 779, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4770, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 4956, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6686, 0},
-    {LXB_UNICODE_CANONICAL_SEPARATELY|LXB_UNICODE_DECOMPOSITION_TYPE_NARROW, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5884, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_INITIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 5549, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 2389, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_ISOLATED, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5115, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 4888, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_ISOLATED, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5153, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 1820, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2828, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 304, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_ISOLATED, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5379, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 622, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4775, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_VERTICAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5758, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_VERTICAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5757, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_CIRCLE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 3467, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_CIRCLE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3631, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_CIRCLE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 226, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6724, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6834, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 723, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 4932, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 633, 0},
-    {LXB_UNICODE_CANONICAL_SEPARATELY|LXB_UNICODE_DECOMPOSITION_TYPE_NARROW, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5890, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6302, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 332, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6667, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4769, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 76, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4565, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 1273, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 884, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 3784, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_INITIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5379, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6577, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_FINAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5177, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3537, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 1035, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6758, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 2412, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 8, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6649, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_FONT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6177, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3157, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 2657, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_ISOLATED, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5205, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2950, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 993, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 407, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 441, 0},
-    {LXB_UNICODE_CANONICAL_SEPARATELY|LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 2239, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 2729, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 1684, 285},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6692, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6775, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 1898, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4544, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6918, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4500, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6820, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2939, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_FINAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5085, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_FINAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5187, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_INITIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5135, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 1433, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4652, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_INITIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5324, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 3869, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 1095, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 274, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4728, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_INITIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5197, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_WIDE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 288, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 288, 86},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4678, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 3222, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4593, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6739, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_WIDE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5823, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 1859, 320},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_ISOLATED, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5004, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6034, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6817, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6032, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_CIRCLE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 3481, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_FRACTION, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 2373, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 6487, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_FONT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 616, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4566, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_ISOLATED, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5121, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 134, 79},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6477, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3164, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_FONT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 662, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 312, 90},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4850, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 947, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 4271, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 4984, 0},
     {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 4, 3262, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 2225, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6666, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_CIRCLE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 963, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 1047, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 6358, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2894, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 1263, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 64, 64},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 38, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 4328, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_FINAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 5612, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6314, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_ISOLATED, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 5247, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 1608, 265},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2789, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 5, 3732, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6618, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4472, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_ISOLATED, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5091, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SUB, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2293, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3200, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6517, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 385, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4527, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_NARROW, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5743, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 3594, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 2483, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 1589, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_INITIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 5426, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_CIRCLE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3098, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 622, 129},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 2571, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 1020, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6685, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2908, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 1646, 279},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_FONT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6171, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_ISOLATED, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5355, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SUB, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 118, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_FINAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 5573, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_WIDE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 992, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4764, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4496, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6924, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_FRACTION, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 2361, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4667, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4646, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_NARROW, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5839, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6553, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3170, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 118, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 2562, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 1883, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_FONT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 620, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 6511, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4739, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2936, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 1817, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6617, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 2681, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 829, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6654, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2924, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_VERTICAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 3046, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6481, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 2391, 0},
-    {LXB_UNICODE_CANONICAL_SEPARATELY|LXB_UNICODE_DECOMPOSITION_TYPE_FONT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6196, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_NARROW, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3058, 0},
-    {LXB_UNICODE_CANONICAL_SEPARATELY|LXB_UNICODE_DECOMPOSITION_TYPE_FONT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6277, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 1001, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4785, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_ISOLATED, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5811, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_VERTICAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5742, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SUB, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6305, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 381, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4578, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 100, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 1847, 316},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6752, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_FINAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5347, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4644, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4762, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_CIRCLE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3544, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_ISOLATED, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5351, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 4396, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_VERTICAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5762, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 1271, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_INITIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 5642, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_FONT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 637, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_MEDIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5379, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 202, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6828, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6913, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 226, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_INITIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5067, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SMALL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5796, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6738, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 887, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 4446, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 4293, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2960, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_FINAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 797, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_FINAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 5396, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_MEDIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5131, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 1618, 269},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2926, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 1089, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_FONT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 987, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 4, 3907, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6657, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2880, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4554, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 4336, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 843, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_FINAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5270, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_ISOLATED, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5175, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 622, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 4, 2033, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 1806, 310},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6878, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2906, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2773, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_VERTICAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2274, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_FINAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5011, 0},
-    {LXB_UNICODE_CANONICAL_SEPARATELY|LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5777, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 2260, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 6145, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4790, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4747, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_MEDIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5173, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_FINAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5359, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_WIDE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 226, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6533, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6809, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 4, 2021, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 1757, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_FRACTION, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 2370, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4525, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 1856, 319},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_ISOLATED, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5343, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_ISOLATED, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5008, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_ISOLATED, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4994, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2815, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SMALL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5759, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_WIDE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 234, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3142, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 6, 3720, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_FINAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5355, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4640, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4514, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6717, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4788, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_VERTICAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 604, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_FONT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6178, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2775, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_CIRCLE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 304, 0},
-    {LXB_UNICODE_CANONICAL_SEPARATELY|LXB_UNICODE_DECOMPOSITION_TYPE_FONT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6235, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 1029, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4812, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_INITIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5077, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 1127, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4779, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_ISOLATED, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5387, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_FONT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 106, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_MEDIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5109, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 3999, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 4407, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 679, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_FONT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 158, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_ISOLATED, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5097, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4542, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3194, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_CIRCLE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 2533, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_ISOLATED, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5359, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4619, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 924, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 370, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_CIRCLE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3112, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4847, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3151, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6821, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_INITIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 5648, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 4368, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_CIRCLE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3516, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 1785, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4654, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_CIRCLE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 230, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_FINAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5209, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6801, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6981, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6847, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4582, 0},
     {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 190, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_INITIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5081, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SUB, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2284, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 2501, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4863, 0},
-    {LXB_UNICODE_CANONICAL_SEPARATELY|LXB_UNICODE_DECOMPOSITION_TYPE_FONT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6244, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_FONT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 182, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 36, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_ISOLATED, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4995, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 3403, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3113, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 4354, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_INITIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 5456, 0},
     {LXB_UNICODE_DECOMPOSITION_TYPE_FINAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 5060, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_ISOLATED, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5015, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4572, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4556, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 2313, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4621, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_FINAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4990, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4870, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_NARROW, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3613, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 577, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2887, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 4, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_FONT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 775, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_ISOLATED, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 5047, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_FONT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5103, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_MEDIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5318, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_MAYBE|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_MAYBE|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 6109, 445},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_CIRCLE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3621, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 1119, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_ISOLATED, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 5044, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6062, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4570, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 867, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6561, 0},
-    {LXB_UNICODE_CANONICAL_SEPARATELY|LXB_UNICODE_DECOMPOSITION_TYPE_FONT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6217, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_ISOLATED, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5075, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6028, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 4086, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 1203, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 753, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4484, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 1317, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6879, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_NARROW, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5832, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_FINAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 5624, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_ISOLATED, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5002, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 1615, 268},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4664, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 2497, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6967, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_FONT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5179, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_CIRCLE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2844, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 2747, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_FINAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5155, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 1341, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_CIRCLE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 38, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_CIRCLE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3054, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2825, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_FINAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 5489, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 545, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_CIRCLE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3050, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 998, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 1790, 308},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_FONT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5011, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_FONT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 967, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 184, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_INITIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5121, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_ISOLATED, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5063, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4537, 0},
     {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 1577, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2938, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 142, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2867, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 3987, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 447, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 2640, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 1766, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 4, 2011, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4846, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_NARROW, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5830, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 1509, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_FINAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 5579, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_FINAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 5630, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SUB, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 200, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 2487, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4498, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4665, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 4239, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_NARROW, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5841, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 4, 2596, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_ISOLATED, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5213, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 611, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6777, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4694, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_FONT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 13, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 3963, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 4913, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 2205, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SUB, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 985, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2796, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 4, 2037, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_FONT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5129, 0},
-    {LXB_UNICODE_CANONICAL_SEPARATELY|LXB_UNICODE_DECOMPOSITION_TYPE_NARROW, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5872, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_MEDIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 795, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_ISOLATED, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 8, 5730, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_WIDE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 74, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 2384, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 585, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_FONT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 648, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 234, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2974, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4582, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2968, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3132, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_INITIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5101, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4632, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 3098, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6789, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6635, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 1875, 326},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6968, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 825, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 2690, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 3364, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SMALL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2479, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_CIRCLE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3518, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4624, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 3421, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2915, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_WIDE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2288, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_ISOLATED, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5179, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 4, 2754, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6575, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_FONT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4920, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 2666, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 1662, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2848, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 367, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3189, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 82, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_ISOLATED, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5385, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 1630, 273},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 3246, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_ISOLATED, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5237, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2878, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_FINAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5373, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_FINAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5233, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_FONT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 274, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_INITIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 5474, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 0, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_FONT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4839, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_MEDIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5129, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 972, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 2988, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 570, 0},
     {LXB_UNICODE_DECOMPOSITION_TYPE_FINAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5369, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6722, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 1725, 300},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 3659, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_FINAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5163, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 6436, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 1494, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2945, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 880, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_INITIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 5528, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_FINAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5385, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 3014, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6835, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6564, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_INITIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5063, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 2636, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_CIRCLE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 3554, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6588, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6790, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 947, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_ISOLATED, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5339, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SMALL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5756, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 264, 84},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6911, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_FONT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6177, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 268, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 938, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4859, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 554, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6895, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 549, 104},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 3804, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6535, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 2672, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 1697, 290},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_ISOLATED, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 5241, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 6331, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 292, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 1079, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4646, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_FONT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 36, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3536, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6639, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_FINAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5282, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_FONT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5139, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_CIRCLE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 3512, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4508, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 1086, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3170, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 4315, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 2412, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4761, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 4005, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_MEDIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 795, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_FINAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5284, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6736, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 344, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6461, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 4311, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 154, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SMALL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5743, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2917, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 6406, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 4, 3684, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_ISOLATED, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5081, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3172, 0},
     {LXB_UNICODE_DECOMPOSITION_TYPE_FONT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 986, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2943, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 4363, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 2161, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_WIDE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2270, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_CIRCLE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 3459, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2910, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 2235, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_FINAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 5462, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 4978, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_FINAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5278, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4718, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_INITIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5191, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 4970, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_FONT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 10, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 1223, 256},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 306, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_MEDIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5185, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6561, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_ISOLATED, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 4, 5705, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_VERTICAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5771, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 535, 0},
     {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6708, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 4903, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6577, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SUB, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 687, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_ISOLATED, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5021, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 747, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4833, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 771, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 507, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 1089, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6560, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2864, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 633, 116},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 3010, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_CIRCLE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2753, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6703, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 2306, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6028, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6816, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_WIDE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 184, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 3072, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6817, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 3894, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_FONT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 90, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6835, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SUB, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 767, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_WIDE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 98, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 373, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 434, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 6, 3848, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 367, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 385, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 416, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_CIRCLE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3064, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6681, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 54, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 2075, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6906, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2939, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 2324, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 725, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 705, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3058, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6923, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_CIRCLE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3068, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_WIDE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 346, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 1792, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4573, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 1368, 259},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6696, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 3376, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4875, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6653, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4805, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 1089, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4617, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6936, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4877, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_FINAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5163, 0},
     {LXB_UNICODE_DECOMPOSITION_TYPE_INITIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5147, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4546, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_CIRCLE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3524, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_ISOLATED, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 5029, 0},
-    {LXB_UNICODE_CANONICAL_SEPARATELY|LXB_UNICODE_DECOMPOSITION_TYPE_NARROW, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5848, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 2630, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6053, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_WIDE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5824, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 904, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 232, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_ISOLATED, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5079, 0},
-    {LXB_UNICODE_CANONICAL_SEPARATELY|LXB_UNICODE_DECOMPOSITION_TYPE_NARROW, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5911, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 3409, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4842, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4595, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_VERTICAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5756, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 4, 1921, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 989, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 809, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 1012, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4527, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 1081, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6808, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_ISOLATED, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5191, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_FONT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6176, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2937, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 489, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 493, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 473, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 4398, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6472, 0},
+    {LXB_UNICODE_CANONICAL_SEPARATELY|LXB_UNICODE_DECOMPOSITION_TYPE_FONT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6283, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6828, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SUB, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6303, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_FONT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2290, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2907, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 6, 3726, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_FONT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6187, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4738, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_FONT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6193, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 4, 2003, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2793, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_FONT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5809, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4498, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 2192, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6530, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 2723, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_CIRCLE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 182, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 1844, 315},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_FINAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5377, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 639, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 1574, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 6367, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3179, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 54, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 110, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 1141, 254},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 114, 75},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 1183, 0},
+    {LXB_UNICODE_CANONICAL_SEPARATELY|LXB_UNICODE_DECOMPOSITION_TYPE_NARROW, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5863, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4856, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_ISOLATED, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5797, 0},
     {LXB_UNICODE_DECOMPOSITION_TYPE_FONT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5095, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 1889, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_FRACTION, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 4, 2342, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 6443, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 375, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4829, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_INITIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5155, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 1488, 264},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_MEDIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5103, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 865, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3194, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4720, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_ISOLATED, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 5675, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 4, 1965, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 1315, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 4134, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 1255, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 1200, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 1634, 275},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 6382, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 751, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6535, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_FINAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5209, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4855, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_FONT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 644, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_CIRCLE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 158, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_CIRCLE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3633, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_CIRCLE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3074, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 208, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2834, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SUB, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2290, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 220, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4474, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 62, 63},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 2477, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2857, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2826, 0},
-    {LXB_UNICODE_CANONICAL_SEPARATELY|LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 2141, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 4884, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 306, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6969, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6524, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_CIRCLE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3070, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 4, 2608, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SUB, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 230, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6877, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_MEDIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 5057, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_ISOLATED, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5087, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_FONT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5203, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 1275, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 4332, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_WIDE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5823, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 803, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_INITIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 5438, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 589, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4858, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 104, 73},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3174, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_FINAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 5504, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5758, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 4401, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 2998, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 5, 3920, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_FINAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5093, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_FINAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 795, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6673, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 665, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 4321, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2287, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 1583, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2771, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_CIRCLE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3623, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_MEDIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5109, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_FINAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 793, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4509, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_FONT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 14, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_INITIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5306, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 1301, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 6487, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_FINAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5389, 0},
     {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 666, 0},
-    {LXB_UNICODE_CANONICAL_SEPARATELY|LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 4175, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_FINAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 5555, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 2766, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4604, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_FINAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 5618, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_INITIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 5435, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_FINAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5153, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_INITIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 5651, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 6455, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_VERTICAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5769, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2286, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 644, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 1530, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_ISOLATED, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5117, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2862, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6823, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_INITIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4990, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_WIDE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 980, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 1747, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 2738, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 4291, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 32, 56},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6303, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6871, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 2630, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6595, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_WIDE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5820, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2860, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 346, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 2562, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3161, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_FONT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2335, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 2493, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_FONT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 304, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 1985, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_FONT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2205, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_CIRCLE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 226, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4662, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2963, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6718, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_CIRCLE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2842, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 578, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 1301, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_INITIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5195, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_WIDE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 230, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6854, 0},
+    {LXB_UNICODE_CANONICAL_SEPARATELY|LXB_UNICODE_DECOMPOSITION_TYPE_NARROW, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5890, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 1482, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 4443, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4798, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_NARROW, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5836, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_NARROW, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3072, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 2262, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6567, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 1053, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_FINAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5215, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6046, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6317, 0},
     {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6611, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 3605, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3204, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_ISOLATED, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5099, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6795, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 4315, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_CIRCLE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3616, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_ISOLATED, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5235, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3211, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4754, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 4, 1961, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_CIRCLE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 334, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_FINAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 5420, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_NARROW, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3106, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3114, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2890, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_WIDE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5793, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6721, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_ISOLATED, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5003, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 92, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 4, 1939, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_FONT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6191, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 3249, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SUB, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 983, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2816, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6596, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3160, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_INITIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4995, 0},
-    {LXB_UNICODE_CANONICAL_SEPARATELY|LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 2104, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 4, 2604, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4676, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4810, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_WIDE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6005, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6461, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 228, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_CIRCLE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 3491, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 3216, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_FINAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 5047, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 2559, 0},
-    {LXB_UNICODE_CANONICAL_SEPARATELY|LXB_UNICODE_DECOMPOSITION_TYPE_NARROW, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5932, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_CIRCLE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3090, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4880, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_FINAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5129, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 813, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_CIRCLE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3082, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4878, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 196, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 4044, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 2684, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4588, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4848, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_INITIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 5044, 0},
-    {LXB_UNICODE_CANONICAL_SEPARATELY|LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 2135, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 1503, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4568, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_WIDE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 594, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4681, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_ISOLATED, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4996, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_NARROW, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3082, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4732, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 2513, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_FONT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 230, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6800, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_INITIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5209, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SUB, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 234, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 4, 2041, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 3074, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2884, 0},
-    {LXB_UNICODE_CANONICAL_SEPARATELY|LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 2207, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 322, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_INITIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5306, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 4127, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 4, 3925, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6701, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 2693, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 232, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6316, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4856, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 4461, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_FINAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 5636, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2964, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 4419, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 4303, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_WIDE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 56, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 1301, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_VERTICAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5760, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6671, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 4434, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6689, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 4332, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4704, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6874, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 1548, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SUB, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 665, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 4413, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 1706, 293},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 4905, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_CIRCLE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 276, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 2511, 0},
-    {LXB_UNICODE_CANONICAL_SEPARATELY|LXB_UNICODE_DECOMPOSITION_TYPE_FONT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6253, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 2634, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_CIRCLE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3540, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_ISOLATED, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 5814, 0},
     {LXB_UNICODE_DECOMPOSITION_TYPE_FONT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5237, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2771, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 6015, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6542, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 4386, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3188, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2920, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SMALL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5742, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 395, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_WIDE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 200, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_FINAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 5483, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_ISOLATED, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5009, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 1722, 299},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_NARROW, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3068, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_INITIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5008, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 2159, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4576, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4801, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_FINAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5351, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SMALL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2254, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4787, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_VERTICAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5744, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6574, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 4964, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 1492, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 280, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6636, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_NOBREAK, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 0, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6890, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_CIRCLE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3141, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6589, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3174, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_ISOLATED, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5117, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6970, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 4140, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 342, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 983, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_FINAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5211, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 352, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_FONT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 622, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 2270, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_FONT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6195, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6480, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6573, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 4055, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6037, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_FONT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5143, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 2471, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_INITIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5095, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 66, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 992, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 3854, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_FINAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5023, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 3034, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_CIRCLE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3066, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_FINAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5239, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 783, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 1895, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 1958, 0},
-    {LXB_UNICODE_CANONICAL_SEPARATELY|LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 4148, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2800, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 1580, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4716, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_INITIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5143, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_FINAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5235, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_ISOLATED, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5256, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4818, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 1319, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4867, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_ISOLATED, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5135, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_ISOLATED, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 5032, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 755, 0},
-    {LXB_UNICODE_CANONICAL_SEPARATELY|LXB_UNICODE_DECOMPOSITION_TYPE_NARROW, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5854, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 4, 3286, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6647, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_CIRCLE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3072, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2974, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6942, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6064, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 485, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_FINAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5014, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6878, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_NARROW, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5835, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 1515, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 216, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6624, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_FONT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5099, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6661, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_FINAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5085, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 1025, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_FONT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6184, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 981, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 1403, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 1359, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6648, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6307, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6954, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 6089, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 238, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_FONT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 228, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4638, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6885, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_FONT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4921, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 1265, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6916, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_CIRCLE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 3491, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_VERTICAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5758, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_CIRCLE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3141, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2770, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4870, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4879, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4631, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6917, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 4946, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 286, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_FINAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5050, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6901, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_ISOLATED, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 5038, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6617, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_ISOLATED, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5065, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6019, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 4960, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4788, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 46, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 751, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_FONT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2289, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_CIRCLE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3532, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_FRACTION, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 2373, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4747, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 583, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 3020, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4677, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_FONT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 7, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_FONT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5087, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 2511, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_INITIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4994, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_WIDE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2219, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4750, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_ISOLATED, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5149, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 98, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4786, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 399, 0},
+    {LXB_UNICODE_CANONICAL_SEPARATELY|LXB_UNICODE_DECOMPOSITION_TYPE_FONT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6265, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 3022, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 2228, 334},
     {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 1206, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 831, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6698, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_WIDE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5825, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_FONT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 963, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 4886, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4759, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_FONT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 276, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_ISOLATED, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5209, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_ISOLATED, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5010, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 2505, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_FINAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 5597, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_ISOLATED, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5003, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 2996, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_CIRCLE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2808, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_FONT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 635, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2977, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 1554, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4672, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_ISOLATED, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5139, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 1955, 0},
     {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 3038, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_CIRCLE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 1089, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 422, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 1763, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_WIDE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 7, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_MEDIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5135, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_CIRCLE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2771, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 3590, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 434, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6892, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 4, 3642, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 3012, 0},
-    {LXB_UNICODE_CANONICAL_SEPARATELY|LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 2129, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2877, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_CIRCLE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2286, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6646, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_WIDE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5827, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_ISOLATED, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4999, 0},
-    {LXB_UNICODE_CANONICAL_SEPARATELY|LXB_UNICODE_DECOMPOSITION_TYPE_NARROW, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5989, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_FINAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 781, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_NARROW, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3628, 0},
-    {LXB_UNICODE_CANONICAL_SEPARATELY|LXB_UNICODE_DECOMPOSITION_TYPE_NARROW, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5860, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 4277, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_ISOLATED, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 5035, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6021, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_INITIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5183, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_FINAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 5609, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 1506, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6720, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4831, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_FINAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5809, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3126, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6965, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 54, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_INITIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5123, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 124, 78},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 4, 3767, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 4, 3890, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6633, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4504, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_FONT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6174, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 851, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 3090, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2954, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_CIRCLE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 992, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6599, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_WIDE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 38, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 6455, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6580, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_FINAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4993, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2886, 0},
     {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 2298, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4650, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3152, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_ISOLATED, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5195, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2941, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6802, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 6502, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_FONT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 232, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_FINAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5109, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_INITIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5077, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4705, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 3100, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_CIRCLE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 3572, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_INITIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5379, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_CIRCLE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 3570, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_FINAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 783, 0},
+    {LXB_UNICODE_CANONICAL_SEPARATELY|LXB_UNICODE_DECOMPOSITION_TYPE_FONT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6238, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4704, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_INITIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 5393, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_FONT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 651, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 4, 3302, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_FONT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 198, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 1243, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2827, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 1594, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_CIRCLE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 2531, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4552, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 481, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 622, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_FONT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5235, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6786, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_FINAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5002, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6484, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_ISOLATED, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5207, 0},
+    {LXB_UNICODE_CANONICAL_SEPARATELY|LXB_UNICODE_DECOMPOSITION_TYPE_NARROW, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5926, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 6, 3931, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_FONT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 616, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6774, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 839, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_WIDE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6006, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 835, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_WIDE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2293, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4737, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_FONT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 668, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_FONT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 975, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_WIDE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 1089, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2791, 0},
+    {LXB_UNICODE_CANONICAL_SEPARATELY|LXB_UNICODE_DECOMPOSITION_TYPE_NARROW, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5989, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_NARROW, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6012, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 2161, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_FONT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 622, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 445, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4773, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_WIDE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2284, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6526, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6768, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_INITIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5121, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2929, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 517, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_FONT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5191, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 1438, 262},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_FONT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 13, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_FONT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 1329, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4735, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 244, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_MEDIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5069, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_FINAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 5474, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_ISOLATED, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5375, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_FONT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6172, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2777, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 1111, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 2699, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4486, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_FINAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 5579, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6662, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2784, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6629, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3128, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6935, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6970, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6889, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 162, 81},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 140, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3137, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4602, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 4163, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_FONT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 160, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 6164, 0},
+    {LXB_UNICODE_CANONICAL_SEPARATELY|LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 4194, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 36, 59},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6842, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_FONT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2285, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_ISOLATED, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5113, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 4295, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_ISOLATED, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4990, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 1735, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 1670, 284},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 2648, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 3974, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2849, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_INITIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5095, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 2045, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_WIDE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5794, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 176, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 128, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 126, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3213, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3163, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2895, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SUB, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 693, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6722, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SUB, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 650, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 3982, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4853, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_ISOLATED, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5095, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2961, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4660, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2295, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4825, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_CIRCLE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2937, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SUB, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 662, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 1817, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4795, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_INITIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5179, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_FONT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5810, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4799, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SUB, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 230, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_NARROW, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3090, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 4437, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4739, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6583, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 3352, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4565, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_FONT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 641, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6684, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_NARROW, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3622, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_INITIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5171, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_FINAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 5420, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 46, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6927, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_ISOLATED, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5256, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 1157, 0},
+    {LXB_UNICODE_CANONICAL_SEPARATELY|LXB_UNICODE_DECOMPOSITION_TYPE_NARROW, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5947, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 1019, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_FONT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 126, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_FONT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 987, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 3092, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4749, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_CIRCLE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 126, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 974, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 833, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 795, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4726, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_INITIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 5522, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 4102, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 286, 85},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_ISOLATED, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5155, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_FINAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5811, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_FONT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6189, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 859, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4789, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_CIRCLE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3524, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 6075, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4669, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6478, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4763, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3145, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_MEDIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4992, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_FINAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 5585, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_ISOLATED, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5135, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 1105, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 6391, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_FRACTION, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 2352, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3515, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6754, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 1329, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 2475, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 4001, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_CIRCLE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3526, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_FONT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2284, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_FONT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5143, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_FINAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4992, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_FINAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 5591, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_MAYBE|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_MAYBE|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 6122, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_ISOLATED, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5131, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6465, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_CIRCLE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 56, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 4241, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_CIRCLE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 36, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 318, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 4, 3286, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 332, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_INITIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 5549, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 3034, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4548, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4721, 0},
     {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 1808, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 1571, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 42, 60},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_INITIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 783, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 799, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 921, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 2255, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6621, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 2018, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 787, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 3797, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_CIRCLE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3536, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_CIRCLE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 288, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2788, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_ISOLATED, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5217, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_FONT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5163, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2312, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SUB, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 771, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 473, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_ISOLATED, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5149, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 3433, 0},
-    {LXB_UNICODE_CANONICAL_SEPARATELY|LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 4894, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 681, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 1719, 298},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6979, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6880, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 1678, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_INITIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5111, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 644, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 3102, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 855, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_INITIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5107, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 2092, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 2156, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_ISOLATED, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5369, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 4926, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_ISOLATED, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4997, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_ISOLATED, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5169, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 1388, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_FONT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6178, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 234, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_CIRCLE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3539, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 951, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4550, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_INITIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5125, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4686, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6770, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 2127, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 4, 3294, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 198, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_FONT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 637, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_ISOLATED, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5389, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 3080, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_NARROW, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5841, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_INITIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 5054, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_ISOLATED, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5121, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6749, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 24, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_FINAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 5666, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 228, 0},
     {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4771, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 1124, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_ISOLATED, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 775, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 6097, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 3427, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 557, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6741, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_ISOLATED, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5221, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_CIRCLE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 3463, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_ISOLATED, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5125, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 1258, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_CIRCLE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 3449, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 4986, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_NARROW, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3626, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4655, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_FINAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5389, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 771, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_CIRCLE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3631, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_INITIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5117, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SUB, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 13, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4664, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_VERTICAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2529, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 851, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4769, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SMALL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2295, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 1863, 322},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 2507, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 1317, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 50, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4845, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2782, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 334, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_INITIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 5468, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 62, 63},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_FONT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 344, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 5, 3637, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SUB, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 985, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 1732, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2329, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_CIRCLE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3098, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2780, 0},
     {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6858, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_FINAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5173, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_CIRCLE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 88, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2914, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4835, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_FINAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 5603, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_INITIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 5051, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6663, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 6367, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_WIDE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5795, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 3651, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_CIRCLE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 3562, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 4374, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 981, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 1000, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_CIRCLE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 200, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_WIDE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 13, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 2479, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_FINAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 5516, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 66, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 3586, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6682, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 56, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6882, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 3675, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4816, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_FINAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5377, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6520, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6839, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4654, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 797, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4569, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6938, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_FONT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4916, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 2423, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_ISOLATED, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5163, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_CIRCLE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2845, 0},
-    {LXB_UNICODE_CANONICAL_SEPARATELY|LXB_UNICODE_DECOMPOSITION_TYPE_NARROW, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5878, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 2628, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 154, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4581, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_WIDE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2477, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6619, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 4940, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4531, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3137, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6745, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_ISOLATED, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5157, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SMALL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5791, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 296, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6922, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 4, 3844, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 96, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_CIRCLE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3112, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_ISOLATED, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5209, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 3379, 0},
-    {LXB_UNICODE_CANONICAL_SEPARATELY|LXB_UNICODE_DECOMPOSITION_TYPE_VERTICAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5752, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 282, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_CIRCLE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 3471, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_FINAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 793, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2970, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 212, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 3415, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_ISOLATED, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5161, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 2455, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 1427, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 4936, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4563, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6652, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 1091, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 4, 3945, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 4, 1917, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 1772, 305},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4834, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 1486, 263},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_INITIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5097, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3635, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6831, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 328, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_FONT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6298, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6041, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_INITIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5225, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 4167, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 6013, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_FINAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5288, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2852, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 1530, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4857, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 1688, 287},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6923, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 4129, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_FONT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5117, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6962, 0},
-    {LXB_UNICODE_CANONICAL_SEPARATELY|LXB_UNICODE_DECOMPOSITION_TYPE_NARROW, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5953, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 228, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2830, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 967, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6653, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6043, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6470, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6926, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 158, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_ISOLATED, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 5811, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 4, 2592, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3190, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 711, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2786, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 1049, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_CIRCLE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3538, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_WIDE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 346, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 94, 72},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_ISOLATED, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 5026, 0},
-    {LXB_UNICODE_CANONICAL_SEPARATELY|LXB_UNICODE_DECOMPOSITION_TYPE_NARROW, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5842, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 178, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_FINAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 775, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 401, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 2568, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 651, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 2523, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_FINAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 5465, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 2527, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6599, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 1741, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 4464, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6668, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4803, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 687, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_INITIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5143, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4866, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 1006, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_ISOLATED, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 781, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_FINAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 5612, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 541, 0},
+    {LXB_UNICODE_CANONICAL_SEPARATELY|LXB_UNICODE_DECOMPOSITION_TYPE_FONT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6235, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6957, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4621, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4714, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6713, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_CIRCLE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3118, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 3987, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_ISOLATED, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5355, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_ISOLATED, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5099, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 4, 2584, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 545, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_NARROW, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3624, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_CIRCLE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2288, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_FONT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 618, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_WIDE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 54, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_FONT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 662, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6779, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_CIRCLE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3439, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_INITIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5111, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6836, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4593, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_INITIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5183, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_FINAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5359, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 6451, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4741, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 1442, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 693, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 1480, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 1895, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_INITIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5169, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 2118, 333},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 2163, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_CIRCLE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 3447, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2789, 0},
     {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4840, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 845, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2753, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6478, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6755, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_FONT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6194, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4827, 0},
-    {LXB_UNICODE_CANONICAL_SEPARATELY|LXB_UNICODE_DECOMPOSITION_TYPE_NARROW, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5926, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_FINAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5103, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 591, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_WIDE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 182, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 3394, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SUB, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2294, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_MEDIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 783, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 1265, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_ISOLATED, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5071, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 827, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 284, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_CIRCLE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2289, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 1019, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 6424, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_FONT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5121, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_CIRCLE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2808, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3128, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 5, 3776, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_INITIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5203, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4597, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 2115, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6946, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4478, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 4344, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6637, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_VERTICAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5764, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4794, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_MEDIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 5334, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 120, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4506, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_NARROW, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3086, 0},
     {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3214, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 348, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6521, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_INITIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 5648, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_NARROW, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3621, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6972, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4767, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 717, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 2423, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 745, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4583, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 3597, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 1596, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2852, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2844, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 3409, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 1750, 303},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_MEDIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5087, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 230, 2, 599, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2953, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_FONT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6188, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2779, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_FONT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 648, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6748, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2850, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 5, 3969, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_FONT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2334, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_FINAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 5627, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 955, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 6511, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4648, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 1730, 302},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_CIRCLE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2771, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 6352, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2876, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_ISOLATED, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5810, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 198, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 3678, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2915, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 3044, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_ISOLATED, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5085, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 4974, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2986, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4837, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_FONT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 336, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 3799, 0},
+    {LXB_UNICODE_CANONICAL_SEPARATELY|LXB_UNICODE_DECOMPOSITION_TYPE_FONT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6259, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_INITIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5063, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_CIRCLE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3052, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6466, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 2447, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_ISOLATED, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 5247, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_FONT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 620, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_WIDE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 1301, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6479, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_FINAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 5462, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 1209, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6519, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_FONT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5324, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 1023, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_FINAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5270, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6581, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 168, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 182, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6686, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 751, 0},
+    {LXB_UNICODE_CANONICAL_SEPARATELY|LXB_UNICODE_DECOMPOSITION_TYPE_FONT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6223, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4575, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_FONT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 985, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 3382, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6714, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 6, 3838, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_CIRCLE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 334, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4784, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 618, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 4980, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 4275, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_ISOLATED, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 5678, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_ISOLATED, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5093, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 4907, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 463, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SUB, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6320, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 4, 2041, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 3937, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 2651, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4691, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_FONT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 614, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_ISOLATED, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 18, 5712, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 511, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_CIRCLE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3544, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3153, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_ISOLATED, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5179, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_INITIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 5642, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6840, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_FINAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4998, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_CIRCLE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3514, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_FINAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5016, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4652, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_FINAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5211, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 4, 3945, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 3757, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 5, 3885, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_MEDIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5010, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_ISOLATED, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5215, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_FINAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5004, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 2102, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_CIRCLE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 3574, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2887, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_FINAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5010, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_ISOLATED, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5211, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_FINAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5003, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 1333, 0},
     {LXB_UNICODE_DECOMPOSITION_TYPE_MEDIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5113, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 4050, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6929, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 1823, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_VERTICAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 604, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2815, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 4110, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4707, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 3578, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4785, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_FONT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6192, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 3228, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_MEDIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4994, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_ISOLATED, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5151, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4532, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_CIRCLE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3535, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 1612, 267},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4567, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 4029, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2811, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_FINAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4995, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 410, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_MEDIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5171, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_ISOLATED, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5155, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4754, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4678, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2774, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 3018, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6692, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_CIRCLE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3533, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_CIRCLE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3094, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 3718, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SUB, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 983, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2905, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_FONT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6174, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 258, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_INITIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 5510, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 3929, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_INITIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 5441, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_FONT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6171, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6767, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 1225, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 932, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2854, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6059, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 6424, 0},
+    {LXB_UNICODE_CANONICAL_SEPARATELY|LXB_UNICODE_DECOMPOSITION_TYPE_NARROW, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5869, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2935, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_INITIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5087, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4496, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4809, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 775, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_VERTICAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 3110, 0},
     {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6756, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 1343, 0},
-    {LXB_UNICODE_CANONICAL_SEPARATELY|LXB_UNICODE_DECOMPOSITION_TYPE_FONT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6226, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 13, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6773, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 2505, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 6415, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 570, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6949, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 999, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 4008, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_CIRCLE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 98, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 6373, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_FINAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 5648, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2818, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6613, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 4, 2007, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 926, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 4401, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4674, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 1713, 296},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4783, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4808, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_VERTICAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5766, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 4340, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_FINAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5343, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 1556, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_INITIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 5414, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 6349, 0},
-    {LXB_UNICODE_CANONICAL_SEPARATELY|LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5785, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 1275, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4510, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_MEDIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4992, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 428, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4765, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3212, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3147, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SMALL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2270, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6848, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_FINAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 5615, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 56, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_NARROW, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3060, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 1925, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_FONT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2288, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4468, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 4461, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 2400, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 2477, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_FRACTION, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 2355, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 1440, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_FINAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 5621, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2779, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_CIRCLE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3615, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 4, 2071, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_ISOLATED, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5241, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 6505, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 1472, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 4394, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_INITIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 5462, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 992, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_FONT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 626, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 1446, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 324, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_ISOLATED, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5024, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2841, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_CIRCLE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3048, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4525, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 2321, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 2203, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_INITIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5179, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 4942, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 208, 0},
+    {LXB_UNICODE_CANONICAL_SEPARATELY|LXB_UNICODE_DECOMPOSITION_TYPE_NARROW, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5896, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2831, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_INITIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 5047, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_FONT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6185, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 6107, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6723, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_FINAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5117, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4768, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SUB, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6312, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_NOBREAK, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 0, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 10, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SMALL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2291, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6866, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6302, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_FRACTION, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 2336, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2923, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_CIRCLE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3139, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_ISOLATED, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5008, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_FONT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6194, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4629, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_MEDIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5203, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 3953, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4687, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6606, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_CIRCLE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3540, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_FINAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5278, 0},
+    {LXB_UNICODE_CANONICAL_SEPARATELY|LXB_UNICODE_DECOMPOSITION_TYPE_NARROW, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5953, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 580, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_MEDIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4997, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_ISOLATED, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5175, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_CIRCLE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3542, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4547, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4689, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6959, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 648, 128},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 4057, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 4, 3282, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2801, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_FONT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2333, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_FINAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4997, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_FONT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 779, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_NARROW, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5833, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_ISOLATED, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5171, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 3582, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6948, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4709, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6044, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 3074, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 928, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 4922, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4636, 0},
     {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6630, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 1117, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4742, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_MEDIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5115, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_ISOLATED, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4992, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 662, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_CIRCLE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 3487, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_ISOLATED, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5129, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4668, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_ISOLATED, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 5060, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6601, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_ISOLATED, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 5035, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_CIRCLE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3523, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_FONT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6190, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 4958, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_FINAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5005, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_FINAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 5582, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_ISOLATED, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5219, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_FINAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5011, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6666, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6860, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2772, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4752, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_ISOLATED, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5159, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_MEDIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4995, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4681, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6971, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 6345, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2328, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_CIRCLE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3209, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6890, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 6151, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 2675, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2917, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_FINAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 5510, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6812, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6650, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_MEDIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5320, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 1640, 277},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_FINAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 5811, 0},
     {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6669, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6468, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_FINAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5010, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 1037, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 1093, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 853, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_ISOLATED, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5185, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4580, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6734, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4642, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 1430, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_FINAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5161, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 6409, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6622, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6706, 0},
     {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6832, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4760, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_ISOLATED, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5347, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6315, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_INITIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5007, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 1031, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6651, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6871, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_CIRCLE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3139, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_NARROW, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6011, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6742, 0},
-    {LXB_UNICODE_CANONICAL_SEPARATELY|LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 4215, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 4, 2417, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 693, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2982, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_INITIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5324, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 578, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 3974, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6476, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2862, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4607, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_FINAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 5498, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6921, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 878, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4609, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 773, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 620, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_CIRCLE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3515, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_ISOLATED, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5143, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 995, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_INITIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 5477, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 11, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6768, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6833, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 4, 1905, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6526, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 3340, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_FINAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5000, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3186, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2983, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6058, 0},
-    {LXB_UNICODE_CANONICAL_SEPARATELY|LXB_UNICODE_DECOMPOSITION_TYPE_NARROW, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5935, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_FONT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 668, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 2449, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 4096, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 481, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 2435, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_FINAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5087, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 170, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 3228, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_ISOLATED, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5339, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_WIDE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 0, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 1790, 308},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 847, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_INITIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4994, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 4, 1951, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4757, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4702, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 82, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_MAYBE|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_MAYBE|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 6117, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 1754, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 4909, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 626, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_WIDE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2219, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6757, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6855, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_ISOLATED, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5005, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 72, 66},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6836, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_INITIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4991, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6030, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_ISOLATED, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5006, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_NARROW, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3048, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4709, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_WIDE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 971, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6774, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_WIDE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2318, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_MEDIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5050, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4868, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 6370, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_FONT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 985, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 453, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_ISOLATED, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 5041, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 1349, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 3234, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SUB, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 699, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2816, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6469, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 4044, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2775, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 3084, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4755, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 132, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2834, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2915, 0},
     {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 4123, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 6327, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4851, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 2113, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 565, 106},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 819, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 1594, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 3076, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 346, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_ISOLATED, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5021, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4874, 0},
-    {LXB_UNICODE_CANONICAL_SEPARATELY|LXB_UNICODE_DECOMPOSITION_TYPE_NARROW, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5941, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_CIRCLE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3619, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4616, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_ISOLATED, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5083, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 2654, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 2414, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_FINAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5276, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2771, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 4, 1991, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6565, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_FINAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5095, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2780, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 334, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_ISOLATED, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5023, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 3036, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_CIRCLE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3068, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3196, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 4, 1901, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 373, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6045, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 701, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 994, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4717, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 1109, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_ISOLATED, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4997, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_INITIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5145, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 70, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2836, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_ISOLATED, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5133, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6908, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 4, 2612, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2869, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 2100, 332},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 200, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 1175, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 735, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6790, 0},
-    {LXB_UNICODE_CANONICAL_SEPARATELY|LXB_UNICODE_DECOMPOSITION_TYPE_NARROW, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5914, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_FINAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5063, 0},
-    {LXB_UNICODE_CANONICAL_SEPARATELY|LXB_UNICODE_DECOMPOSITION_TYPE_NARROW, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5971, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4730, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_MEDIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5069, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4843, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 304, 0},
-    {LXB_UNICODE_CANONICAL_SEPARATELY|LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 4189, 0},
-    {LXB_UNICODE_CANONICAL_SEPARATELY|LXB_UNICODE_DECOMPOSITION_TYPE_NARROW, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5920, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_ISOLATED, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5244, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_FINAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5014, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4861, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 6167, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 88, 71},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_CIRCLE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 2533, 0},
-    {LXB_UNICODE_CANONICAL_SEPARATELY|LXB_UNICODE_DECOMPOSITION_TYPE_FONT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6271, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_ISOLATED, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 5054, 0},
+    {LXB_UNICODE_CANONICAL_SEPARATELY|LXB_UNICODE_DECOMPOSITION_TYPE_FONT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6205, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6574, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_FINAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 5029, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 4952, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_CIRCLE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 3477, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_MEDIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5133, 0},
+    {LXB_UNICODE_CANONICAL_SEPARATELY|LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 4208, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4633, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_MEDIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5050, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6556, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_FINAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 5026, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6919, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 2766, 0},
     {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6964, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SUB, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2289, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2824, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_CIRCLE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 3495, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_MEDIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5129, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6632, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_CIRCLE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 7, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6876, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_INITIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5121, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 4082, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_WIDE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 334, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4657, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_FINAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5013, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 242, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2976, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6552, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 4370, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2834, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 4911, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2794, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6883, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 4, 3865, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 970, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4634, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 1562, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3139, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_CIRCLE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 3481, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_CIRCLE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3545, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_ISOLATED, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 797, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_CIRCLE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2794, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4692, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4656, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6716, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 509, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 6015, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_FINAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 5642, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 513, 0},
+    {LXB_UNICODE_CANONICAL_SEPARATELY|LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5777, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6322, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_ISOLATED, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5016, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_ISOLATED, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5103, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_INITIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4998, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_ISOLATED, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5181, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_FINAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4988, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2867, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6712, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SUB, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6300, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6677, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2530, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 2278, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 364, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 793, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_ISOLATED, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5203, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_FINAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 775, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 867, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_INITIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5191, 0},
     {LXB_UNICODE_DECOMPOSITION_TYPE_SUB, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2286, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6845, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4558, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 791, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6863, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6699, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_CIRCLE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3520, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 5, 3857, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2808, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3151, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 1011, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_ISOLATED, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5193, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2986, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2942, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 4366, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 968, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_INITIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5179, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_FONT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2291, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6893, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 2507, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 5, 3817, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 397, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6536, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 383, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 370, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 4944, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 1155, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_WIDE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2758, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 2638, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_CIRCLE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 3574, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 2316, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_WIDE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2291, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 7, 3318, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 3373, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_ISOLATED, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5109, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_CIRCLE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3118, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 218, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4811, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 274, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 276, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 3835, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4792, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_CIRCLE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3054, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 254, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 629, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6802, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 671, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 3797, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2926, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 158, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6484, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 262, 83},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_NARROW, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3633, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_FINAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5345, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6464, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_CIRCLE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3634, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_INITIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5137, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 781, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 1040, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 547, 103},
+    {LXB_UNICODE_CANONICAL_SEPARATELY|LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 2207, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4834, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_INITIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5065, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 1033, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2871, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_FINAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 5630, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SMALL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5789, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4569, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_INITIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5013, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2987, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 893, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2914, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 3675, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SMALL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 604, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6874, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6974, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2932, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 3610, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 1490, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 695, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2930, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 2503, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 6438, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_ISOLATED, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5343, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_INITIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5097, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4501, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 1497, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 2497, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_FINAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5347, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 2147, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 817, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 4, 3696, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2900, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_CIRCLE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 3457, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6613, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4610, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_WIDE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 198, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6796, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 4, 3704, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4746, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2902, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_MEDIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 5331, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6764, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6969, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_ISOLATED, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4996, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_ISOLATED, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5161, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_CIRCLE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3617, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 214, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 759, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 4, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 4305, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6636, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4526, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 1339, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 620, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 1016, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_CIRCLE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3210, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_WIDE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2295, 0},
     {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6018, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3135, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3133, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_ISOLATED, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5165, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 2663, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_FINAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 5585, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 641, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 324, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_ISOLATED, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5367, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 302, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_FONT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5133, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_NARROW, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3090, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4682, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 350, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3168, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 2711, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 863, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_CIRCLE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 3485, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 1069, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_VERTICAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2295, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4873, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4635, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6938, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4710, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 367, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_CIRCLE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 228, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 3584, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_ISOLATED, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5012, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_INITIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 5408, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_ISOLATED, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5221, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_ISOLATED, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5006, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6628, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 4956, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 3337, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 2435, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_FINAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 5032, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_ISOLATED, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 5047, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6591, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6039, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4561, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 66, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_NARROW, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3106, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_CIRCLE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 2539, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 336, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 579, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_ISOLATED, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5015, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4830, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2806, 0},
+    {LXB_UNICODE_CANONICAL_SEPARATELY|LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 4073, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4862, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_CIRCLE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 344, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 3956, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_MEDIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5215, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6584, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_FINAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 5567, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 646, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6621, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6707, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4828, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 1776, 0},
+    {LXB_UNICODE_CANONICAL_SEPARATELY|LXB_UNICODE_DECOMPOSITION_TYPE_NARROW, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5968, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_FINAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5071, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_ISOLATED, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 789, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6563, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6882, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6843, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_FINAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5009, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_CIRCLE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3132, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_WIDE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 106, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 4, 3828, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_WIDE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5791, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4625, 0},
     {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 310, 89},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 3367, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 1497, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_ISOLATED, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5807, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6805, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6714, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6750, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 1744, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6643, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3123, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6819, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 1309, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6980, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6721, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 5, 3817, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_INITIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5203, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 4, 2029, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 1301, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_ISOLATED, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 5044, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2836, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 4140, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 4932, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6659, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_FRACTION, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 18, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3201, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 591, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 3784, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 2089, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 6154, 456},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 38, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_FINAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5163, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_ISOLATED, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5363, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_CIRCLE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6514, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_CIRCLE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 3560, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2846, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 1492, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 697, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_FONT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 224, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4521, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 4, 1969, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 1427, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4699, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_ISOLATED, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5197, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 108, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 1119, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 6499, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_INITIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5000, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 196, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 4384, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 3791, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 6, 3665, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2912, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 3040, 0},
+    {LXB_UNICODE_CANONICAL_SEPARATELY|LXB_UNICODE_DECOMPOSITION_TYPE_FONT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6277, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3177, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6699, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_FINAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5159, 0},
     {LXB_UNICODE_DECOMPOSITION_TYPE_WIDE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2289, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6584, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 6085, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 4458, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4871, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 539, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 795, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_FINAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 5621, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_ISOLATED, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5063, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_FINAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 5666, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 10, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 4108, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_FINAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 5265, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 2274, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 4313, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 771, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 1228, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 1072, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 274, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_CIRCLE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3048, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 288, 93},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_ISOLATED, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5233, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4611, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6567, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 6103, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_NARROW, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5829, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4696, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 404, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 624, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 184, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6537, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_MEDIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5075, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 1177, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_FINAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 5465, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4786, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 737, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2928, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_FINAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5015, 0},
-    {LXB_UNICODE_CANONICAL_SEPARATELY|LXB_UNICODE_DECOMPOSITION_TYPE_FONT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6250, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 2565, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6873, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3180, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_INITIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4990, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_NARROW, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3614, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 1769, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_FRACTION, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 2358, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4755, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_CIRCLE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 3550, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_WIDE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 980, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 4, 1931, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 1782, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_MEDIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 5334, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 1478, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_MEDIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 5328, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2329, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 160, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_CIRCLE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 2531, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_ISOLATED, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5109, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4753, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6815, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_CIRCLE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3129, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4587, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 1612, 267},
-    {LXB_UNICODE_CANONICAL_SEPARATELY|LXB_UNICODE_DECOMPOSITION_TYPE_FONT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6180, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 1844, 315},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 4, 2616, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 344, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_WIDE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 160, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4663, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 631, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 330, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_NARROW, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3615, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6457, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_ISOLATED, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5007, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 4244, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 1359, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 4926, 426},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_ISOLATED, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4991, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 685, 0},
-    {LXB_UNICODE_CANONICAL_SEPARATELY|LXB_UNICODE_DECOMPOSITION_TYPE_NARROW, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5947, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_FINAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5117, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_FINAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5016, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 439, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_MAYBE|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_MAYBE|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 6091, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 809, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_FINAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5075, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_CIRCLE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 3475, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 3991, 0},
-    {LXB_UNICODE_CANONICAL_SEPARATELY|LXB_UNICODE_DECOMPOSITION_TYPE_NARROW, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5995, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 258, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 3240, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_FINAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5012, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6955, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6538, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6578, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 1853, 318},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_INITIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5075, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 4349, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4524, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6801, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_ISOLATED, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5389, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 560, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6460, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_WIDE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5998, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 624, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 843, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 2499, 0},
+    {LXB_UNICODE_CANONICAL_SEPARATELY|LXB_UNICODE_DECOMPOSITION_TYPE_FONT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6268, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2771, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 46, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 4328, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 2084, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 3659, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2910, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3206, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_FONT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 24, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4491, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_FONT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6183, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 487, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 1681, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2889, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6775, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4819, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2934, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_WIDE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 90, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 900, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2855, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6746, 0},
+    {LXB_UNICODE_CANONICAL_SEPARATELY|LXB_UNICODE_DECOMPOSITION_TYPE_FONT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6241, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_MEDIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5318, 0},
     {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2904, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_CIRCLE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 160, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 431, 101},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 232, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2898, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 465, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 476, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6966, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6634, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_INITIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 5399, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 5, 3896, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6791, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6458, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 1542, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_FINAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5339, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 86, 69},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_VERTICAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2530, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SMALL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5761, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 1700, 291},
     {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 6, 3712, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 4, 2025, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 4287, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_FRACTION, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 2367, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4516, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6597, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_FINAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 5654, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4469, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6935, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6727, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_ISOLATED, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5177, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4794, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4583, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 721, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 1157, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2772, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 4384, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4669, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6898, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3168, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3145, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6704, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_WIDE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 98, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 4, 3278, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 2577, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_NARROW, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3074, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_FONT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6188, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3143, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 1826, 311},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6634, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 791, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_INITIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5095, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 1035, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_CIRCLE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3621, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6729, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_INITIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5131, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 1255, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_MEDIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5314, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_FINAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5324, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 88, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 987, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_INITIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5103, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 1831, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6585, 0},
     {LXB_UNICODE_DECOMPOSITION_TYPE_FINAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5353, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 1129, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 2439, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_VERTICAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2758, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6566, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 953, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_NARROW, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3052, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 46, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_CIRCLE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2837, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_ISOLATED, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5181, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_MAYBE|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_MAYBE|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 6093, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 88, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 3995, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 3917, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6684, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_CIRCLE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 54, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 2744, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2934, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_MEDIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5377, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_ISOLATED, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5324, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_INITIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 5567, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 775, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6837, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4777, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 1893, 330},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6546, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4494, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 4299, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 4250, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 4972, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 4425, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 1292, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_NARROW, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3634, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 1451, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4488, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6900, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6313, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 4295, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 98, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4824, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 367, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6856, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_CIRCLE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 3546, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6706, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 2015, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 6075, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6485, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 3911, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6665, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2926, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 487, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 2467, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 216, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6933, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 1133, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_NARROW, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3064, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_INITIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5009, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_INITIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4992, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 6505, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4797, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 6073, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_ISOLATED, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5169, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_VERTICAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5770, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4741, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_MEDIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5320, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SMALL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 604, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4799, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3206, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4552, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_NARROW, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3060, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3139, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 4452, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4873, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6743, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4643, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6953, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 893, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6822, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 1121, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_ISOLATED, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5067, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 673, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SUB, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2293, 0},
     {LXB_UNICODE_DECOMPOSITION_TYPE_WIDE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 46, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6710, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 4452, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_INITIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5099, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6675, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_FONT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5215, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_WIDE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 228, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2899, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 4, 3692, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_FINAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5349, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 6137, 453},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2966, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4665, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4850, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 1710, 295},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_CIRCLE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3520, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 2296, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_ISOLATED, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5345, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2929, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 789, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 1686, 286},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6844, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4824, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2894, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 232, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_FINAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4991, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_ISOLATED, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5123, 0},
     {LXB_UNICODE_DECOMPOSITION_TYPE_ISOLATED, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5349, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 300, 88},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6658, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 2324, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6733, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2981, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 4026, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6469, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2861, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3166, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_CIRCLE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3514, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_MEDIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5139, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 2443, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2810, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 4, 3270, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6823, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_ISOLATED, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5000, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 587, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6057, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 1760, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SMALL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5789, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2290, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 2098, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SUB, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6307, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_WIDE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 304, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2777, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_INITIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4989, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_NARROW, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5836, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4518, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_MEDIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5014, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_MEDIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5121, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_CIRCLE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3622, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2896, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 2075, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 6418, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 2574, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_ISOLATED, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5050, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_WIDE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6000, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_CIRCLE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 3487, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_WIDE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5998, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6031, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_CIRCLE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 3483, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_CIRCLE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 24, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_MEDIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5063, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_FINAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5282, 0},
-    {LXB_UNICODE_CANONICAL_SEPARATELY|LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2248, 0},
-    {LXB_UNICODE_CANONICAL_SEPARATELY|LXB_UNICODE_DECOMPOSITION_TYPE_FONT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6223, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_FINAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5121, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_CIRCLE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2287, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6484, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_MEDIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5012, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 6447, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_ISOLATED, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 4, 5738, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 467, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4517, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6554, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 164, 82},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_MAYBE|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_MAYBE|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 6093, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 1121, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2775, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6572, 0},
     {LXB_UNICODE_CANONICAL_SEPARATELY|LXB_UNICODE_DECOMPOSITION_TYPE_FONT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6211, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_INITIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4996, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 1668, 283},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_WIDE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 983, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4749, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2928, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 969, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 4425, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_FONT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6195, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SUB, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6305, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6830, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2983, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 2082, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 4349, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_CIRCLE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3100, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6458, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_INITIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5227, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2785, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6810, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_ISOLATED, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5373, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_FINAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 5477, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 1129, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3187, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_CIRCLE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3104, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_NARROW, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3070, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 230, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_NARROW, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3048, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2787, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_NARROW, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3078, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 503, 0},
+    {LXB_UNICODE_CANONICAL_SEPARATELY|LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 2141, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4531, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6766, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 637, 117},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4818, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_FINAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5191, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2796, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 2449, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4478, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_MEDIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5121, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6776, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_INITIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5217, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_WIDE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5822, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_CIRCLE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 2541, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 290, 0},
+    {LXB_UNICODE_CANONICAL_SEPARATELY|LXB_UNICODE_DECOMPOSITION_TYPE_FONT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6256, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3520, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_FONT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6186, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4553, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6788, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6305, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6742, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 4, 3306, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_ISOLATED, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 783, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6741, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_CIRCLE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 2547, 0},
+    {LXB_UNICODE_CANONICAL_SEPARATELY|LXB_UNICODE_DECOMPOSITION_TYPE_FONT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6244, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 6069, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6725, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_FONT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 74, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_FONT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5075, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 156, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_MEDIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5025, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_WIDE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 594, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 6327, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4673, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_INITIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5324, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 24, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 192, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_ISOLATED, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 5026, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_CIRCLE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3528, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_FONT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 644, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_INITIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5050, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6026, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 4948, 0},
+    {LXB_UNICODE_CANONICAL_SEPARATELY|LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 2213, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3140, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_FINAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 5600, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 3060, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 2407, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2881, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 4227, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 88, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 3911, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 3102, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6894, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 761, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 6156, 457},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4632, 0},
+    {LXB_UNICODE_CANONICAL_SEPARATELY|LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 4215, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_INITIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4993, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3142, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_ISOLATED, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5141, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_CIRCLE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 3475, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_FINAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 5495, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4725, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_FINAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 5516, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 767, 0},
+    {LXB_UNICODE_CANONICAL_SEPARATELY|LXB_UNICODE_DECOMPOSITION_TYPE_FONT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6271, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6545, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 2391, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_INITIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 5432, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_FRACTION, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 4, 2342, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_ISOLATED, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 5817, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6463, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 302, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6053, 0},
+    {LXB_UNICODE_CANONICAL_SEPARATELY|LXB_UNICODE_DECOMPOSITION_TYPE_NARROW, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5854, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4780, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_FINAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5075, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4723, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_FINAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 5513, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 783, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 3088, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 4913, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SUB, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2288, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3537, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6063, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_ISOLATED, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 5814, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6321, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6720, 0},
     {LXB_UNICODE_DECOMPOSITION_TYPE_MEDIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5209, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6559, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4615, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 4, 3881, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_CIRCLE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 56, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6807, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_CIRCLE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 3447, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_INITIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5377, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 108, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6586, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_FINAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5175, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 6445, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6483, 0},
-    {LXB_UNICODE_CANONICAL_SEPARATELY|LXB_UNICODE_DECOMPOSITION_TYPE_FONT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6208, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6748, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6947, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 575, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6615, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_FINAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5233, 0},
-    {LXB_UNICODE_CANONICAL_SEPARATELY|LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 4201, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 1295, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 767, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_WIDE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 965, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6657, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 5, 3776, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_NARROW, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3625, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6734, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 1488, 264},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_MEDIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5135, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 1124, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 884, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 1047, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_FINAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5357, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 2640, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_INITIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5185, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6641, 0},
+    {LXB_UNICODE_CANONICAL_SEPARATELY|LXB_UNICODE_DECOMPOSITION_TYPE_VERTICAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 5747, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_INITIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5109, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 880, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_ISOLATED, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5353, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4545, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 1285, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3197, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 2761, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2892, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 4, 3274, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 360, 96},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 3989, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 3243, 0},
     {LXB_UNICODE_DECOMPOSITION_TYPE_CIRCLE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_MEDIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5081, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 1454, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 1632, 274},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 1881, 328},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_INITIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 5543, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 7, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 583, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 1301, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_INITIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 5513, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 302, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2838, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6927, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 6451, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 4354, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6604, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_CIRCLE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3629, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 1708, 294},
-    {LXB_UNICODE_CANONICAL_SEPARATELY|LXB_UNICODE_DECOMPOSITION_TYPE_FONT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6232, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SUB, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 699, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 4, 3872, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 1551, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 2447, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4822, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6466, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4536, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_FONT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6325, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 4374, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 2553, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2890, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 2624, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6913, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_FINAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5099, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4820, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2909, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 5, 3654, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 585, 0},
     {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 2708, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_CIRCLE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3439, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 2402, 0},
-    {LXB_UNICODE_CANONICAL_SEPARATELY|LXB_UNICODE_DECOMPOSITION_TYPE_NARROW, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5881, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SUB, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6300, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 2237, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_ISOLATED, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5117, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_CIRCLE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3533, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4530, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 2632, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_INITIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5115, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 3106, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6736, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 1686, 286},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6862, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3198, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 1135, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 709, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_ISOLATED, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 779, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6674, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_WIDE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2285, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_VERTICAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5756, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6550, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4542, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 882, 225},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 839, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 1490, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 6, 3741, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3120, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6843, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_ISOLATED, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5121, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_ISOLATED, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5087, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 3355, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_ISOLATED, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5225, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 1403, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_WIDE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2274, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6306, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_CIRCLE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 2549, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 639, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6659, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 5, 3940, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3129, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4634, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6821, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6696, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 665, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 594, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_CIRCLE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3100, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 2321, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2851, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4858, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2922, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 1891, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_INITIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 5453, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 1659, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2844, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 4, 3310, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 1719, 298},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6626, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 2441, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_INITIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5157, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6459, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 348, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4808, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 4, 2021, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4570, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 3367, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6670, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 3635, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_ISOLATED, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5369, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 1341, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 4285, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 1506, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 1828, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 64, 64},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6967, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_ISOLATED, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5365, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 1031, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_FINAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5229, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 3781, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3158, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6849, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4841, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 2519, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6887, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_VERTICAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5762, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_WIDE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5792, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6731, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 4, 3813, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 763, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 6443, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 226, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 1252, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 626, 126},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SUB, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2290, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4836, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_WIDE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2291, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 3050, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 2187, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_FINAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 5672, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_CIRCLE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3626, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 1586, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 102, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 160, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 302, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_FINAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5809, 0},
+    {LXB_UNICODE_CANONICAL_SEPARATELY|LXB_UNICODE_DECOMPOSITION_TYPE_FONT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6250, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6635, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 1885, 329},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 1837, 312},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 395, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6035, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 316, 92},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 320, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SUB, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2287, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_ISOLATED, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 779, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_MEDIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5014, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 1418, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 985, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_MEDIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 783, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4827, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_FINAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 5453, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_ISOLATED, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5025, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 2110, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_FINAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 5057, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 2154, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 1893, 330},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6760, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4716, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_WIDE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5771, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3116, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 1197, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_MAYBE|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_MAYBE|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 6111, 446},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_CIRCLE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 2543, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3144, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_FONT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6299, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4764, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 4014, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_FINAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5286, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 4239, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6540, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 525, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_FRACTION, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 15, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 296, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 288, 93},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 6361, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 6493, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_MEDIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5139, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 1177, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 441, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 1135, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_NARROW, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5767, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 3090, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 3026, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 4, 1965, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_CIRCLE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 14, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 703, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 874, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4790, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_ISOLATED, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5811, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_CIRCLE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 24, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 182, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2947, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2958, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_FONT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6191, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_INITIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 5519, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 1353, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2318, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 980, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 1394, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_FONT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4916, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 1763, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4863, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 4, 1909, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_FONT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4918, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 72, 66},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4778, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 4, 1951, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_FONT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5109, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 342, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4568, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 2125, 0},
+    {LXB_UNICODE_CANONICAL_SEPARATELY|LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 2171, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6946, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 3361, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 413, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 1430, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6689, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 419, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_ISOLATED, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5107, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_FINAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4989, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 4084, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6925, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 4, 1939, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 713, 0},
+    {LXB_UNICODE_CANONICAL_SEPARATELY|LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 4894, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 741, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4757, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_CIRCLE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2856, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4658, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6908, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_ISOLATED, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5244, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4843, 0},
+    {LXB_UNICODE_CANONICAL_SEPARATELY|LXB_UNICODE_DECOMPOSITION_TYPE_NARROW, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5932, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_FINAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 5657, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2777, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 1604, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_CIRCLE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 184, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6300, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_CIRCLE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2284, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 626, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6301, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6864, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6752, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SUB, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 771, 0},
+    {LXB_UNICODE_CANONICAL_SEPARATELY|LXB_UNICODE_DECOMPOSITION_TYPE_NARROW, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5875, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SUB, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 106, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 276, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 4127, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 242, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 1235, 0},
+    {LXB_UNICODE_CANONICAL_SEPARATELY|LXB_UNICODE_DECOMPOSITION_TYPE_NARROW, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5881, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 635, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 2729, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 370, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_ISOLATED, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5391, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_WIDE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 0, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 1539, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 693, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 1241, 258},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 4901, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2818, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 4050, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_VERTICAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5772, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_ISOLATED, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 4, 5701, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_CIRCLE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 3548, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 1217, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4693, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_ISOLATED, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4999, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_ISOLATED, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5185, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2865, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SUB, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 731, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6929, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_FONT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 624, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6605, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_CIRCLE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 3461, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 2687, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_MAYBE|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_MAYBE|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 6115, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4612, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_INITIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 5495, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 1066, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_CIRCLE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 4, 3508, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6780, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4748, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 1269, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2984, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4645, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_ISOLATED, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5079, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 479, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 6376, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SMALL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2254, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_ISOLATED, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5013, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 266, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_FINAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5143, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_CIRCLE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3614, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2290, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SMALL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5796, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 551, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_CIRCLE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3058, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 447, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_ISOLATED, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5239, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 2696, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4869, 0},
     {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 620, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 24, 0},
-    {LXB_UNICODE_CANONICAL_SEPARATELY|LXB_UNICODE_DECOMPOSITION_TYPE_NARROW, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5956, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 158, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 997, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 56, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_CIRCLE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 6430, 0},
-    {LXB_UNICODE_CANONICAL_SEPARATELY|LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 4158, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 80, 67},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 262, 83},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 4, 1913, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3209, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_FINAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5296, 0},
-    {LXB_UNICODE_CANONICAL_SEPARATELY|LXB_UNICODE_DECOMPOSITION_TYPE_NARROW, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5983, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 2382, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6303, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 507, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4865, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4833, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 2663, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_FONT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 66, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SMALL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5761, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_VERTICAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5764, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 14, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 3415, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 581, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4585, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 3052, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 401, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_CIRCLE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3628, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_INITIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 5303, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6597, 0},
+    {LXB_UNICODE_CANONICAL_SEPARATELY|LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2245, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 40, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_MEDIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5103, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 2098, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_FINAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5341, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 2487, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 3400, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_FINAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 783, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_INITIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5133, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4581, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6856, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_INITIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 5447, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 1774, 306},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 979, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 4, 1991, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_FINAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 5259, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4613, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4718, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 1656, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_CIRCLE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 3463, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_INITIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 5540, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 539, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4880, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4712, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 6103, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 3588, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2838, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_FONT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4920, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 1237, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_MEDIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5009, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2969, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 930, 0},
     {LXB_UNICODE_DECOMPOSITION_TYPE_SMALL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5794, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_ISOLATED, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5253, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_FINAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5237, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_ISOLATED, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5225, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_INITIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5012, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_ISOLATED, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5007, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6963, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4476, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2937, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6690, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 914, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_INITIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4996, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6952, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_ISOLATED, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5165, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_CIRCLE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3074, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_INITIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5318, 0},
+    {LXB_UNICODE_CANONICAL_SEPARATELY|LXB_UNICODE_DECOMPOSITION_TYPE_FONT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6220, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 218, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_CIRCLE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3537, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6944, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4684, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 1374, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 1801, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 2453, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2808, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 4082, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 158, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 1095, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_FRACTION, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 2367, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 232, 0},
+    {LXB_UNICODE_CANONICAL_SEPARATELY|LXB_UNICODE_DECOMPOSITION_TYPE_NARROW, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5887, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6569, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6863, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6610, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 88, 71},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_WIDE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 234, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 1760, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_WIDE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2479, 0},
+    {LXB_UNICODE_CANONICAL_SEPARATELY|LXB_UNICODE_DECOMPOSITION_TYPE_NARROW, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5971, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 2272, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_WIDE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6007, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4871, 0},
+    {LXB_UNICODE_CANONICAL_SEPARATELY|LXB_UNICODE_DECOMPOSITION_TYPE_FONT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6229, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6312, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_ISOLATED, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 4, 5685, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4851, 0},
     {LXB_UNICODE_CANONICAL_SEPARATELY|LXB_UNICODE_DECOMPOSITION_TYPE_NARROW, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5902, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 932, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2806, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 3963, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 1769, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_WIDE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5821, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3166, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 4, 2596, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6825, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 1460, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2819, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 6449, 0},
     {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 4, 1943, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2873, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_CIRCLE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3522, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_CIRCLE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 3512, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_FINAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5135, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_ISOLATED, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5191, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 4924, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 4, 2600, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 4, 2071, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_ISOLATED, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4998, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4763, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_INITIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4998, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6048, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6662, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6474, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_NARROW, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5767, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4691, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 362, 97},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_MEDIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5133, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2875, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_CIRCLE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 5, 3503, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 3391, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 2330, 0},
-    {LXB_UNICODE_CANONICAL_SEPARATELY|LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 4073, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6312, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_ISOLATED, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5250, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 815, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 601, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_ISOLATED, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 4, 5693, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_CIRCLE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 304, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 996, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 4301, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6869, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6604, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 685, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_INITIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5308, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6682, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_FINAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5151, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_CIRCLE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 3497, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_INITIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5322, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2980, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4641, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 4165, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 186, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 6337, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 3062, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2883, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 1688, 287},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_ISOLATED, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5075, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 4966, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3175, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 3904, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_CIRCLE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2837, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2254, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4643, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2982, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3129, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 1560, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4595, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_CIRCLE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_CIRCLE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 3501, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_ISOLATED, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5071, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 4964, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 977, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 4324, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_CIRCLE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 274, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6898, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_FINAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 5492, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 651, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 112, 74},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 936, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 1163, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 823, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_FINAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 5429, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_ISOLATED, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5235, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_WIDE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 88, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 6397, 0},
+    {LXB_UNICODE_CANONICAL_SEPARATELY|LXB_UNICODE_DECOMPOSITION_TYPE_NARROW, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5848, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_FINAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5808, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_ISOLATED, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5231, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 773, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 1001, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2529, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_FINAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5379, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SUB, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 226, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 2690, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 1323, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 865, 0},
     {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 1872, 325},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2978, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 1640, 277},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 230, 1, 596, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4729, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_ISOLATED, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 4, 5701, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_ISOLATED, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 5038, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 1374, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_MEDIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5013, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SUB, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6309, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2808, 0},
-    {LXB_UNICODE_CANONICAL_SEPARATELY|LXB_UNICODE_DECOMPOSITION_TYPE_NARROW, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5866, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_NARROW, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3618, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_FINAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 5642, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6475, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_WIDE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 198, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4517, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 46, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_VERTICAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2529, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4807, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_FINAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4993, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4673, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SMALL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5762, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3140, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6622, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SUB, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 14, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 1252, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6782, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 2553, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 983, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 3068, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_FINAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5050, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 425, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3058, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 6385, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_CIRCLE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3623, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 1185, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6957, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 2089, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 833, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 695, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_ISOLATED, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5171, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 2475, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 523, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 6343, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 835, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 2147, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 537, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 1059, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 4347, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_MEDIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4996, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4671, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4549, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 614, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 198, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4805, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_MEDIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5324, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_INITIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5012, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_VERTICAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5771, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6829, 0},
-    {LXB_UNICODE_CANONICAL_SEPARATELY|LXB_UNICODE_DECOMPOSITION_TYPE_FONT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6283, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 633, 116},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4744, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 1131, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_NARROW, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3620, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6529, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4491, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 346, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_NARROW, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3631, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 2405, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 941, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 697, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_CIRCLE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 6432, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_INITIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 5408, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 3388, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_FRACTION, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 2428, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4577, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4838, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4579, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 150, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 3394, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2857, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 491, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2848, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 857, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 1325, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 1875, 326},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_NARROW, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5830, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 124, 78},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_CIRCLE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 3465, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4614, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6931, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6314, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6568, 0},
     {LXB_UNICODE_DECOMPOSITION_TYPE_FINAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 5561, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 256, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2931, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 246, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6753, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6909, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 493, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 437, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4832, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 861, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6771, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_CIRCLE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 965, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_ISOLATED, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5383, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 990, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 891, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3524, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4821, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 6335, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_FINAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 5414, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 1448, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 4003, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 1289, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 4, 1969, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 928, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 2996, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 648, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2931, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 777, 0},
-    {LXB_UNICODE_CANONICAL_SEPARATELY|LXB_UNICODE_DECOMPOSITION_TYPE_FONT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6274, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_MEDIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5109, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6551, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_MAYBE|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_MAYBE|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 6113, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_MEDIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5314, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 479, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3185, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6518, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_NARROW, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6009, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4616, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_FINAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5274, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6579, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_CIRCLE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 3469, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2926, 0},
     {LXB_UNICODE_DECOMPOSITION_TYPE_CIRCLE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3135, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6844, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 172, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 1670, 284},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6824, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 158, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4627, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6838, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3121, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 3424, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4588, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 635, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 633, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 1834, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 1331, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_INITIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 5044, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4586, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 1542, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 4936, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 4134, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_MAYBE|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_MAYBE|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 6091, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 2185, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 3418, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 624, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_CIRCLE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 286, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 4344, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_MAYBE|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_MAYBE|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 6128, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_MEDIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4991, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 6418, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 1171, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 1175, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_ISOLATED, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5127, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 1133, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4667, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2968, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3185, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_FINAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 5480, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_CIRCLE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3522, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 739, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 711, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4732, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2787, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SMALL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5795, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6943, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6694, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3210, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 4458, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4515, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3134, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4599, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 799, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 377, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_INITIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 5402, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_CIRCLE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 1301, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 4419, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 3331, 0},
+    {LXB_UNICODE_CANONICAL_SEPARATELY|LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 4175, 0},
     {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 1165, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 729, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4610, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 1728, 301},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_MEDIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5009, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6041, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4559, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 560, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2824, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4555, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_FONT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2326, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 1757, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6771, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 4, 3314, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 272, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6061, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6529, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_WIDE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 983, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_CIRCLE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 2551, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 6071, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 4, 2620, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 1654, 282},
+    {LXB_UNICODE_CANONICAL_SEPARATELY|LXB_UNICODE_DECOMPOSITION_TYPE_NARROW, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5917, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 4, 2612, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_NARROW, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3615, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_NARROW, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3620, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6524, 0},
+    {LXB_UNICODE_CANONICAL_SEPARATELY|LXB_UNICODE_DECOMPOSITION_TYPE_NARROW, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5986, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_NARROW, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2433, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 4, 2600, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_WIDE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 36, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_INITIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5314, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_CIRCLE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3082, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_ISOLATED, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5117, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4775, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 641, 0},
+    {LXB_UNICODE_CANONICAL_SEPARATELY|LXB_UNICODE_DECOMPOSITION_TYPE_NARROW, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5872, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 611, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_FINAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5129, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 1008, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 1045, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3203, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 4891, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_MEDIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5163, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 1503, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 1289, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SUB, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 288, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_MEDIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5024, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_CIRCLE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 3556, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6899, 0},
     {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 4, 4090, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_FINAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 5477, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_ISOLATED, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5808, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_FINAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5280, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_FINAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 5471, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4618, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 2163, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 6361, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_ISOLATED, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 789, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SMALL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2758, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6066, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_NARROW, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6010, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 6333, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_CIRCLE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3138, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_ISOLATED, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5065, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_NARROW, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5837, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_MEDIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4989, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 563, 105},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3183, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2771, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4872, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_FINAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5324, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4707, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 1053, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4523, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4697, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2291, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_ISOLATED, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5193, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 4388, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_ISOLATED, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5000, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 78, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6051, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 4086, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 6339, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 6099, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_MEDIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5328, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 4, 2059, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_FINAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 5606, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2798, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 404, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4675, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2974, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 6385, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_CIRCLE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3530, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_WIDE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2287, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6024, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 1722, 299},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_FONT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2329, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_NARROW, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3066, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_ISOLATED, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4994, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_ISOLATED, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5145, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 3106, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4493, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6782, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4816, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_CIRCLE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 3473, 0},
     {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 3993, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 4121, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6517, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_FINAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5294, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4618, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3156, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 543, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 926, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3195, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4543, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 921, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 4, 3266, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 707, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6868, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4576, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 1457, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 3385, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_MEDIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5099, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_CIRCLE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 302, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 4370, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 976, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 4281, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 222, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_CIRCLE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 118, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 2463, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 1167, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_NARROW, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3627, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 1097, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4810, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SUB, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 707, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4801, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 358, 95},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_INITIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5191, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_ISOLATED, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5807, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4590, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 3430, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6608, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_FINAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5135, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_INITIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5167, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 206, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6664, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_ISOLATED, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5229, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 2515, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4730, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_MEDIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5322, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6654, 0},
+    {LXB_UNICODE_CANONICAL_SEPARATELY|LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 2239, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 683, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6482, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 675, 0},
     {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 3237, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2864, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_INITIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 5492, 0},
-    {LXB_UNICODE_CANONICAL_SEPARATELY|LXB_UNICODE_DECOMPOSITION_TYPE_NARROW, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5944, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_WIDE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 88, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6783, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_FINAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5006, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 4247, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 4428, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 491, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2284, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2809, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2984, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6760, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4699, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4701, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6851, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 3334, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6715, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_MEDIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5000, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4487, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 1005, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6749, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 3108, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6864, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2770, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_INITIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5143, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 4023, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_CIRCLE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2782, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4853, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 985, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6940, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 4117, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6528, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_FINAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 5594, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4815, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2848, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SMALL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5793, 0},
-    {LXB_UNICODE_CANONICAL_SEPARATELY|LXB_UNICODE_DECOMPOSITION_TYPE_FONT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6256, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_ISOLATED, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5810, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6941, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6950, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 1327, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 60, 62},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 1878, 327},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4728, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 2684, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4535, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 1376, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_FONT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5163, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4596, 0},
     {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3130, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2769, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 936, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 3358, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_NARROW, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3623, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 437, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 837, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 156, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4533, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_WIDE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2479, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6763, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4626, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_MEDIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5179, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_WIDE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2284, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3119, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 4922, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 1339, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 1604, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 1826, 311},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6558, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_CIRCLE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 2551, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_WIDE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2286, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 3008, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 4, 3737, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6919, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 3584, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6691, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_CIRCLE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3521, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 3580, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 3010, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_MEDIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5215, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 3953, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 511, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_CIRCLE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3532, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_NARROW, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5768, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_WIDE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2254, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2977, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_CIRCLE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 2541, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_FINAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 5038, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_INITIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5013, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4656, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_NARROW, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3625, 0},
-    {LXB_UNICODE_CANONICAL_SEPARATELY|LXB_UNICODE_DECOMPOSITION_TYPE_NARROW, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5869, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6867, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6650, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 1512, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_FINAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 5600, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4726, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4539, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 1279, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_CIRCLE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 3558, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4493, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 6331, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_WIDE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5789, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 28, 55},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 4357, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_INITIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 5300, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 2407, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 3832, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2912, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 2272, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_CIRCLE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 3453, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 4982, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 266, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_ISOLATED, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5163, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 354, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 691, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 991, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 114, 75},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6017, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_FINAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5373, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_CIRCLE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3626, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_CIRCLE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3115, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 6, 3838, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 6, 3665, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_INITIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 5519, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 779, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_FINAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5229, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4561, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6816, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 3016, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 4163, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 4942, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6044, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 641, 127},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 1027, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_CIRCLE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3440, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 1151, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3197, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6954, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 719, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 399, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 230, 1, 598, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_INITIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5117, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 1672, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_ISOLATED, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 4, 5689, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 240, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 228, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_ISOLATED, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5203, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 957, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 513, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_CIRCLE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3526, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 1285, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6934, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 4, 2067, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 2405, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_FONT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 664, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_CIRCLE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3441, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 4171, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 2235, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6907, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_ISOLATED, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5069, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_VERTICAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5745, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 4962, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 4167, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2979, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4640, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2808, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3132, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_CIRCLE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 3495, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 4, 3872, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 4, 3767, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6924, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2820, 0},
+    {LXB_UNICODE_CANONICAL_SEPARATELY|LXB_UNICODE_DECOMPOSITION_TYPE_NARROW, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5911, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 943, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2956, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 1233, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SUB, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 980, 0},
     {LXB_UNICODE_CANONICAL_SEPARATELY|LXB_UNICODE_DECOMPOSITION_TYPE_NARROW, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5905, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 1442, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 3400, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 1103, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_ISOLATED, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5085, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 705, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_ISOLATED, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5227, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6050, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4688, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 6502, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 6394, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2783, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 326, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6942, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 30, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_FRACTION, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 2336, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_INITIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 5447, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_CIRCLE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 1301, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4869, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2854, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 268, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_ISOLATED, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5014, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6625, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 2262, 0},
-    {LXB_UNICODE_CANONICAL_SEPARATELY|LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 4194, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4740, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 1311, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_FONT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5235, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 1475, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_MEDIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5306, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6850, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 122, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_CIRCLE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 106, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 40, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_ISOLATED, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5063, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 2319, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 224, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 112, 74},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6781, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 358, 95},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 160, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_CIRCLE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3634, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2837, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2785, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 1598, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 6130, 450},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_CIRCLE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 118, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2841, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_ISOLATED, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5133, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_FINAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5294, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 298, 87},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6638, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 1143, 0},
-    {LXB_UNICODE_CANONICAL_SEPARATELY|LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 4153, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 4946, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 2624, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_CIRCLE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 3497, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4793, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 198, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 439, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_ISOLATED, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5139, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 1735, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 4, 3314, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_CIRCLE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3120, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 733, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 1173, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2822, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_ISOLATED, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 4, 5681, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4473, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 825, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 1618, 269},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4503, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_WIDE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2274, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SUB, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2292, 0},
     {LXB_UNICODE_CANONICAL_SEPARATELY|LXB_UNICODE_DECOMPOSITION_TYPE_NARROW, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5974, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_INITIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5179, 0},
-    {LXB_UNICODE_CANONICAL_SEPARATELY|LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 2165, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6023, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 1111, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_ISOLATED, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5167, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4725, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 4273, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2821, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 961, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2870, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6899, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 1482, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_FINAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4997, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 214, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6705, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4658, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SUB, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6320, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_FINAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 5035, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_ISOLATED, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5099, 0},
-    {LXB_UNICODE_CANONICAL_SEPARATELY|LXB_UNICODE_DECOMPOSITION_TYPE_NARROW, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5863, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 3022, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 489, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 6508, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6590, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SUB, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 276, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 1466, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 1305, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6886, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_FINAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5071, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 4080, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 364, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 5, 3637, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2779, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_NARROW, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5744, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_CIRCLE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 286, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 4, 2059, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 973, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SUB, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 98, 0},
     {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 1002, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 2220, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 2678, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2807, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_CIRCLE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3106, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 2491, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SUB, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 106, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6484, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_FINAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5024, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_ISOLATED, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5237, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 4, 1995, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 3757, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SUB, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6319, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_WIDE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 24, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_NARROW, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2431, 0},
+    {LXB_UNICODE_CANONICAL_SEPARATELY|LXB_UNICODE_DECOMPOSITION_TYPE_NARROW, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5980, 0},
     {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 3004, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 6069, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 4, 2584, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 979, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 940, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 989, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_FINAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 783, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 176, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 964, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_CIRCLE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3210, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2219, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6814, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6034, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 4020, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 34, 0},
+    {LXB_UNICODE_CANONICAL_SEPARATELY|LXB_UNICODE_DECOMPOSITION_TYPE_NARROW, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5938, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_MEDIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5331, 0},
+    {LXB_UNICODE_CANONICAL_SEPARATELY|LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 605, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 6379, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_WIDE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 74, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 260, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_WIDE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5827, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3118, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 4096, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_NARROW, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3631, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 497, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 891, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 6403, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2945, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2970, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_FINAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5187, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2873, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4766, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_CIRCLE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 7, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 4, 1935, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 4, 2604, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2972, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_FONT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5063, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 451, 100},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6474, 0},
+    {LXB_UNICODE_CANONICAL_SEPARATELY|LXB_UNICODE_DECOMPOSITION_TYPE_FONT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6274, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_INITIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4992, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 4, 4317, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 2458, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_ISOLATED, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5133, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 2455, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 797, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 3098, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3519, 0},
     {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 2048, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3123, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 166, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_WIDE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 963, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 1747, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_INITIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5063, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_NARROW, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3086, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6797, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_FINAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 5582, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SUB, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 304, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_INITIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5014, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 626, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_CIRCLE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 2547, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 938, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_ISOLATED, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5111, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_ISOLATED, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 777, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 1153, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6607, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_WIDE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 158, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 4960, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3125, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4773, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_WIDE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5791, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 461, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_CIRCLE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3208, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_ISOLATED, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5373, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6973, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 2118, 333},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_FINAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5025, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_CIRCLE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 3572, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 4, 3763, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6981, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2791, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2952, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 6081, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 3088, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 4, 3813, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_ISOLATED, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5223, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4502, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6902, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_WIDE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 302, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 3862, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_INITIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5127, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4467, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 3791, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4557, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 618, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 3060, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6463, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 3104, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6560, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_INITIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5113, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2985, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 4, 1981, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 3436, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3154, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_ISOLATED, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5199, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6046, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_ISOLATED, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5324, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 3999, 0},
+    {LXB_UNICODE_CANONICAL_SEPARATELY|LXB_UNICODE_DECOMPOSITION_TYPE_NARROW, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5992, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 837, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_FINAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 5588, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 3064, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_WIDE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 182, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 916, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2885, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3173, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6663, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4670, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 4003, 0},
     {LXB_UNICODE_DECOMPOSITION_TYPE_FINAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5091, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 1171, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 4, 2620, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_CIRCLE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 3477, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_INITIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5117, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_CIRCLE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3525, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_WIDE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2477, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_WIDE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6005, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_ISOLATED, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5205, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_ISOLATED, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5002, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 38, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 465, 0},
+    {LXB_UNICODE_CANONICAL_SEPARATELY|LXB_UNICODE_DECOMPOSITION_TYPE_NARROW, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5929, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6528, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 4911, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2828, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 6158, 0},
     {LXB_UNICODE_DECOMPOSITION_TYPE_CIRCLE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2290, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 150, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4584, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6713, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 4, 3274, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6806, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_CIRCLE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3128, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_WIDE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6007, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4654, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 6447, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6585, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_FINAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5810, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3167, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3210, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3208, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_WIDE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2753, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_INITIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5205, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 1113, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6603, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4567, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3179, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 974, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 1480, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4660, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 801, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4590, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 871, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 1097, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_FINAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5151, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 286, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_CIRCLE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 3568, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 1215, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_FINAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 5396, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 6161, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 1246, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4703, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_INITIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 5651, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6783, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 4, 1905, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 573, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 997, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4770, 0},
     {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 1436, 261},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_INITIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 5462, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 759, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 1211, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 4351, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3202, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_FINAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4996, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_ISOLATED, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5095, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4695, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_FINAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 5259, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6545, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 1323, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2813, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 3600, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_INITIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 5444, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 1801, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_FINAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 5432, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 2267, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 4041, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_CIRCLE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 198, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_INITIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 5047, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 4106, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_FONT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5129, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 1958, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2829, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_FRACTION, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 2361, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 2481, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 232, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_FINAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5375, 0},
+    {LXB_UNICODE_CANONICAL_SEPARATELY|LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 2165, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_MEDIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5117, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6740, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 614, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 709, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_INITIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5007, 0},
+    {LXB_UNICODE_CANONICAL_SEPARATELY|LXB_UNICODE_DECOMPOSITION_TYPE_FONT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6247, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 737, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_FINAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 5663, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_WIDE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 13, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 6073, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2978, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6518, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 1766, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SMALL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5790, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 4888, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2794, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4479, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_INITIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 783, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6539, 0},
     {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3112, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 4035, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 963, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2897, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2970, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4881, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_CIRCLE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3094, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_CIRCLE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 230, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 4, 1999, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 573, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6592, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_CIRCLE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 594, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2815, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_FINAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 5657, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_ISOLATED, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5239, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SUB, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 693, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6605, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 110, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 4321, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_VERTICAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5767, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2927, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_CIRCLE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3441, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 230, 1, 597, 0},
-    {LXB_UNICODE_CANONICAL_SEPARATELY|LXB_UNICODE_DECOMPOSITION_TYPE_FONT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6268, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 2084, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_NARROW, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3054, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 4, 2580, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6544, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 1194, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4854, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 747, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_CIRCLE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 3548, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 4390, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6697, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6883, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_WIDE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 232, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 1750, 303},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 4903, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_NARROW, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3072, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 2296, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 1565, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4849, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_WIDE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 90, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_WIDE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 54, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 1329, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_FINAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5007, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 4974, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 4422, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4668, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3172, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6571, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 1217, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6907, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 765, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 1521, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6591, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 509, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_CIRCLE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 228, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 3243, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 451, 100},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 3036, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 1602, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 3016, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 994, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6777, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 749, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4549, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 3014, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 965, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_FRACTION, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 2376, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2799, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_FRACTION, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 2370, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 4053, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 4, 3290, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_FINAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 5417, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4804, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_INITIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5141, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 3349, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 2471, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4564, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_VERTICAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5757, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_FONT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6324, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 1814, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4878, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_INITIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5145, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 1652, 281},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_INITIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 5465, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 84, 68},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2781, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6313, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 2255, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6932, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 387, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 601, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_CIRCLE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3070, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_ISOLATED, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5377, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_FRACTION, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 21, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_MEDIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 5303, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2839, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 1668, 283},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 2096, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 188, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4485, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 855, 0},
+    {LXB_UNICODE_CANONICAL_SEPARATELY|LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 4201, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 152, 0},
+    {LXB_UNICODE_CANONICAL_SEPARATELY|LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 4158, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 437, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6845, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6880, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_WIDE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 226, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3138, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4603, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 4446, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3127, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6693, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6978, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 6445, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 228, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6619, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6586, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_FINAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 5576, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_CIRCLE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3518, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 1725, 300},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 2702, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4736, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2964, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 2660, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4663, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 1109, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 505, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_MEDIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4990, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_ISOLATED, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5119, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2896, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_FONT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 667, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 1606, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SUB, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2284, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_INITIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 795, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 4008, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_ISOLATED, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5109, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3146, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SMALL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5742, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_FRACTION, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 2364, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 4106, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_INITIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5109, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 2483, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 36, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 6421, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 1454, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 2123, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_MAYBE|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_MAYBE|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 6119, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 4, 1901, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 4244, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4760, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_MEDIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5109, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 616, 0},
+    {LXB_UNICODE_CANONICAL_SEPARATELY|LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 2177, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 587, 0},
+    {LXB_UNICODE_CANONICAL_SEPARATELY|LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 2129, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_FONT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6298, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 4, 1947, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_NARROW, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5840, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2809, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 685, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 4023, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4787, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 995, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 4, 1913, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 344, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_FINAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 5525, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4791, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 200, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 2270, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 1600, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_MEDIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5143, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6578, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2792, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 3054, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_CIRCLE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3630, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 1219, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2790, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_VERTICAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5766, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 1239, 257},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_INITIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 5444, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 6400, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 1213, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4720, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_INITIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 5546, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 4976, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_ISOLATED, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5089, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 689, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 4289, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 4104, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_CIRCLE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3206, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3114, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4650, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6778, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6837, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4475, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_MEDIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5801, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 286, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 912, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 3078, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_FINAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 5636, 0},
     {LXB_UNICODE_CANONICAL_SEPARATELY|LXB_UNICODE_DECOMPOSITION_TYPE_NARROW, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5950, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_INITIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5149, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 2666, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6607, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6926, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_CIRCLE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3440, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 902, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 2693, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4594, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4865, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 36, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4806, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 4, 3642, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SUB, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 276, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 2657, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6867, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 687, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 523, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4622, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_CIRCLE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3120, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 294, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6704, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6671, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_FINAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 779, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_INITIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5173, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 2467, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 3442, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 4440, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4604, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_WIDE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 56, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 978, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_INITIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5113, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_NARROW, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3094, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 11, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 4434, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 602, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4796, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_FINAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5361, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 3592, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6949, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6311, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_CIRCLE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2845, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2960, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_FINAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5095, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4659, 0},
     {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 276, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 4289, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6718, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2901, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 4455, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 2306, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 334, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 264, 84},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_FINAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 797, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 2525, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2863, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_ISOLATED, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5357, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_ISOLATED, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5115, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_FINAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4990, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 6, 3976, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4661, 0},
     {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2962, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6641, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_INITIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 5396, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 3901, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4521, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6464, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6304, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 26, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 624, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2882, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4612, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 4, 3700, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 874, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_FINAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5009, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6808, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 6105, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 2495, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6612, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_INITIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5099, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 2521, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 2738, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_CIRCLE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3537, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_MEDIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 783, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 228, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 975, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 6071, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SUB, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6302, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 3418, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4625, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 1774, 306},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 4, 1921, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 1089, 0},
-    {LXB_UNICODE_CANONICAL_SEPARATELY|LXB_UNICODE_DECOMPOSITION_TYPE_NARROW, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5887, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4847, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_ISOLATED, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 793, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6912, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 1424, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 4954, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2969, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 4958, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4635, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_WIDE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 1089, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6677, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_ISOLATED, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5211, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2295, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 1518, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 641, 127},
     {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 821, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_CIRCLE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2802, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_ISOLATED, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5111, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_MEDIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4989, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_FINAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 5459, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_FINAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5268, 0},
+    {LXB_UNICODE_CANONICAL_SEPARATELY|LXB_UNICODE_DECOMPOSITION_TYPE_FONT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6226, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_ISOLATED, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 5250, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 1021, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 356, 94},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_FINAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5063, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 3605, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 1433, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 232, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 236, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 220, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 274, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_FINAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5237, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 4926, 426},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_ISOLATED, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5087, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6032, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_ISOLATED, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5337, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4649, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6781, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_CIRCLE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2777, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4744, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4608, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4505, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_CIRCLE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 3453, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 6436, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 964, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2943, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 3801, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2840, 0},
     {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 2425, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 2460, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_CIRCLE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 2537, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2326, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SMALL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5790, 0},
-    {LXB_UNICODE_CANONICAL_SEPARATELY|LXB_UNICODE_DECOMPOSITION_TYPE_NARROW, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5929, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 5, 3771, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 699, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_CIRCLE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2855, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 5, 3885, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 616, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_CIRCLE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 13, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_MEDIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5155, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 182, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6656, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 254, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_FONT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2329, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 90, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3127, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4540, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_ISOLATED, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5123, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 535, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_CIRCLE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 3556, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6554, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_WIDE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5820, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_CIRCLE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 184, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6767, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2911, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_FINAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5185, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 4980, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_INITIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5381, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 581, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6870, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_FINAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5371, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 2257, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_CIRCLE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3627, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 3662, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SUB, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 743, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_WIDE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2293, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6629, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 278, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6670, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_ISOLATED, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5069, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 4, 3306, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 3382, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3138, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 747, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_INITIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5103, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4828, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 6406, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_ISOLATED, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 4, 5693, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4599, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 2451, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_MEDIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5191, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6301, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 4, 3298, 0},
-    {LXB_UNICODE_CANONICAL_SEPARATELY|LXB_UNICODE_DECOMPOSITION_TYPE_NARROW, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5845, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_FINAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 5026, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_CIRCLE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3525, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6688, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 184, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_WIDE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5759, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3189, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4689, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 2265, 0},
-    {LXB_UNICODE_CANONICAL_SEPARATELY|LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 4066, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_FINAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 5450, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2292, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 34, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4859, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SUB, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 687, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 4377, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_MEDIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4998, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2829, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2876, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2803, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 5, 3646, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 6490, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2805, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 4131, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_CIRCLE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 336, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6678, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6891, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 1007, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_FINAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5290, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 970, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_INITIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5135, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6690, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_INITIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5223, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6309, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2894, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 4165, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_MEDIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5334, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 1691, 288},
-    {LXB_UNICODE_CANONICAL_SEPARATELY|LXB_UNICODE_DECOMPOSITION_TYPE_NARROW, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5962, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4866, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 1533, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 4062, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4584, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 425, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_WIDE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5825, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 3412, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 1536, 0},
     {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2842, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 741, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 459, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_INITIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5087, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 1181, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6479, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 930, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_MEDIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5007, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2925, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_FINAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5811, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_ISOLATED, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5010, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 4907, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 626, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 4968, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_ISOLATED, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5341, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 1627, 272},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 1776, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 604, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 1925, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 1388, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6865, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4758, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_CIRCLE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3545, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_CIRCLE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3543, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_ISOLATED, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5353, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 2458, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 234, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2327, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SMALL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2274, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_MEDIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4991, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 4970, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 4301, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6761, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4509, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_NARROW, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3050, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4645, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_WIDE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 967, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_FINAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 5817, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 2151, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2923, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_FINAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5021, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4550, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6693, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 5, 3920, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6819, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 805, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 671, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4492, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6961, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 1329, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 998, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 4449, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_NARROW, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3632, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 2714, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 4404, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_FINAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 5564, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2932, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_MEDIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5381, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4800, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2318, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_CIRCLE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3616, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 667, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6527, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 136, 80},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 959, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 2654, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 3108, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 2237, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2985, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 30, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2916, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 3681, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 1478, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 26, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2875, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 2513, 0},
     {LXB_UNICODE_CANONICAL_SEPARATELY|LXB_UNICODE_DECOMPOSITION_TYPE_FONT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6295, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_NARROW, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3066, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 3040, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 36, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 4, 1977, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4822, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 4001, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 4443, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6647, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 580, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 637, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 3050, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 687, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3213, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 1409, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 1732, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4875, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_CIRCLE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3620, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_MAYBE|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_MAYBE|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 6111, 446},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_FINAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 5041, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 461, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 1161, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 725, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4735, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 1418, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2775, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3165, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3148, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 1146, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 1018, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 1654, 282},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 2110, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 4088, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 356, 94},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 4, 3266, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_INITIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5050, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 646, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_FINAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 5618, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_VERTICAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 3046, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4467, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_FINAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5177, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_INITIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5139, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 4366, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_INITIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4997, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_FINAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 5651, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_ISOLATED, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5173, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 4, 2055, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 4055, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2800, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 3032, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 1728, 301},
+    {LXB_UNICODE_CANONICAL_SEPARATELY|LXB_UNICODE_DECOMPOSITION_TYPE_NARROW, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5956, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_CIRCLE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2782, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 182, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4541, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3193, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_ISOLATED, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5099, 0},
     {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 4, 3258, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 2723, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 963, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6620, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 2230, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_FONT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5011, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_MEDIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4994, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6067, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3163, 0},
-    {LXB_UNICODE_CANONICAL_SEPARATELY|LXB_UNICODE_DECOMPOSITION_TYPE_FONT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6202, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_FINAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5159, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 6453, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 1446, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3519, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 1107, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_ISOLATED, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5187, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6033, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4706, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4482, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_FINAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 5492, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6980, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_WIDE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 336, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_CIRCLE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 302, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 44, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 2433, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6308, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_FRACTION, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 15, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 238, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 4047, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 1307, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 6345, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2893, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6676, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 1469, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 1, 54},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_CIRCLE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 980, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_ISOLATED, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5129, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 6388, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2895, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 3331, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6740, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_VERTICAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 3110, 0},
-    {LXB_UNICODE_CANONICAL_SEPARATELY|LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 657, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_CIRCLE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 3489, 0},
-    {LXB_UNICODE_CANONICAL_SEPARATELY|LXB_UNICODE_DECOMPOSITION_TYPE_WIDE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 6001, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 5, 3969, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 1694, 289},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 1379, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4784, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 1866, 323},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 336, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SUB, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 691, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_FINAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5345, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 126, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 1536, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2817, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6623, 0},
-    {LXB_UNICODE_CANONICAL_SEPARATELY|LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 4208, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_ISOLATED, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 5057, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4476, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 2648, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6534, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3187, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 2199, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_FINAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 5480, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 1741, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_NARROW, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3070, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 898, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 1500, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4802, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_INITIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5203, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_FONT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6326, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 1440, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 6137, 453},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 3219, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4679, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 841, 0},
-    {LXB_UNICODE_CANONICAL_SEPARATELY|LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 2177, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 629, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4571, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 1101, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 959, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6978, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_MEDIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5324, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4661, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3159, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 908, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_FINAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5003, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6731, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_WIDE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5772, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_ISOLATED, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 5060, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 3246, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 260, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_NARROW, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6012, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6881, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_CIRCLE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3140, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 4986, 0},
     {LXB_UNICODE_CANONICAL_SEPARATELY|LXB_UNICODE_DECOMPOSITION_TYPE_ISOLATED, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5017, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 541, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3201, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 1016, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_ISOLATED, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5093, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2889, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_FINAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 5262, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 3597, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 4125, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 3929, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 3989, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6709, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_FINAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 5429, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_CIRCLE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2284, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_FINAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 5627, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 914, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2286, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2937, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_FINAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4991, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 4241, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 4305, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_CIRCLE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 1329, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_NARROW, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3616, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SUB, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 226, 0},
-    {LXB_UNICODE_CANONICAL_SEPARATELY|LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 4, 4230, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 90, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4485, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_NARROW, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5831, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4703, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4756, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6884, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_ISOLATED, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5337, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 485, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 3985, 0},
-    {LXB_UNICODE_CANONICAL_SEPARATELY|LXB_UNICODE_DECOMPOSITION_TYPE_FONT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6238, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 924, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_CIRCLE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 975, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_ISOLATED, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5087, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_CIRCLE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3052, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 2473, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4605, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 2096, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_FINAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5341, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 977, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SMALL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5760, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_WIDE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 230, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4675, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4809, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4515, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 4962, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_ISOLATED, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5011, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6645, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 2079, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SUB, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 7, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2774, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4577, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 589, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_FONT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6299, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_INITIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5129, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_WIDE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6006, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 24, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_CIRCLE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 3493, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 74, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_CIRCLE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 2543, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2919, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3171, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 1013, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6563, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 180, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4789, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_NARROW, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3078, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6963, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_VERTICAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2270, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_ISOLATED, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5012, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_FINAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 5811, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_FINAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5357, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4513, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 910, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SMALL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2295, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_CIRCLE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3539, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_WIDE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 126, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 6151, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2902, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_ISOLATED, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 797, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2961, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_ISOLATED, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5183, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4522, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6300, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 689, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_INITIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5079, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 4334, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_CIRCLE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2753, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2881, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_VERTICAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5761, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 168, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 2192, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 158, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3146, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 965, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 4, 3704, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 4431, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 6139, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6788, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_FINAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 5639, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 4464, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6903, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 84, 68},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 1988, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6730, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_FINAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 5417, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 731, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 1167, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6729, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 68, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_ISOLATED, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5077, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_ISOLATED, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 783, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 2127, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6889, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 2278, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 635, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_INITIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5149, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 713, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3195, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 1139, 253},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4719, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6971, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3193, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6901, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 1077, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_INITIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5173, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4724, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 4271, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2822, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 1233, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 648, 128},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2979, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 4, 3282, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_ISOLATED, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5081, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_ISOLATED, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5127, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2799, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 3894, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_CIRCLE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2318, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2833, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6974, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_FINAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5073, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 158, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 1460, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 106, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_MEDIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 5303, 0},
-    {LXB_UNICODE_CANONICAL_SEPARATELY|LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 4182, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_CIRCLE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 74, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 1301, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 6352, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 1955, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_FRACTION, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 2352, 0},
-    {LXB_UNICODE_CANONICAL_SEPARATELY|LXB_UNICODE_DECOMPOSITION_TYPE_NARROW, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5923, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 46, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 152, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6038, 0},
-    {LXB_UNICODE_CANONICAL_SEPARATELY|LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 1363, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 344, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 4053, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 138, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 1839, 313},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 6412, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 4173, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4845, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_INITIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5318, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_CIRCLE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3072, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6631, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_CIRCLE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 346, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2787, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2835, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 1004, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 4948, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2973, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_INITIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 795, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 2154, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_CIRCLE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 3465, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 2094, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 1188, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_MEDIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5801, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SMALL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2293, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4817, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_CIRCLE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2777, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 456, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_CIRCLE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3519, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 3588, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6872, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 4929, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6707, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 505, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_FONT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4921, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 198, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_WIDE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_FINAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5179, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_ISOLATED, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5139, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 2123, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_MEDIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5163, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_FONT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4919, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 6434, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 4372, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6769, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_FINAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4999, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 4891, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2878, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_CIRCLE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2842, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 1527, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_FINAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 5606, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 360, 96},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SMALL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2477, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_ISOLATED, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5151, 0},
-    {LXB_UNICODE_CANONICAL_SEPARATELY|LXB_UNICODE_DECOMPOSITION_TYPE_NARROW, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5992, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_NARROW, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3627, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_ISOLATED, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5013, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 1716, 297},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2975, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2792, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 1239, 257},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2951, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 1083, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4564, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 3086, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 244, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6810, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4501, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_WIDE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 66, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 48, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 919, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4651, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 695, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 6135, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 6, 3848, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4468, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 3376, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 4, 3787, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 579, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 128, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 54, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3136, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_WIDE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 604, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2813, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6639, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2944, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4526, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 1331, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4826, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6681, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_ISOLATED, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5797, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_FINAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5002, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 132, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 4394, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 120, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_CIRCLE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3541, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SUB, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 304, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4688, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 4060, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2802, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 1335, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_FINAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 5660, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_MEDIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5133, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_MEDIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5007, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2832, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 845, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SMALL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5791, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2289, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6695, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_FINAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5008, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6310, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6323, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 4, 3844, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 577, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SMALL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5792, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2830, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 1211, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 116, 76},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6930, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4751, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 1898, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 618, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 2120, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2771, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_MEDIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5326, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_ISOLATED, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 8, 5730, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2814, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 4038, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_ISOLATED, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 5675, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 723, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 4909, 0},
+    {LXB_UNICODE_CANONICAL_SEPARATELY|LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2248, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6683, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 471, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_CIRCLE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 1329, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_MEDIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5381, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 4, 3881, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4783, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 1598, 0},
     {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 146, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 3002, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 1219, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 767, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2963, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SUB, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6318, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_INITIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5155, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_CIRCLE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 232, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 3078, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 2503, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 767, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SUB, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 13, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6976, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 1055, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_CIRCLE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2856, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2883, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2937, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 3048, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2885, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2868, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6609, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3215, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_MEDIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5111, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 1191, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SUB, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 685, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 160, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4574, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6705, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 3379, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 4119, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 495, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 3012, 0},
     {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 3997, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 290, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 745, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 521, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 4, 2280, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2965, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4497, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 1376, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 4416, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_NOBREAK, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2251, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_NARROW, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5840, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 38, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SUB, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6793, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 52, 61},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_FINAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 5576, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 36, 59},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4555, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4622, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 1163, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SMALL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5743, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 727, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_INITIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5010, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 965, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6460, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 3600, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 338, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 312, 90},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2851, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 2445, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 1881, 328},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 961, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 1329, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_ISOLATED, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5109, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 2319, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 622, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_WIDE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 304, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_INITIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4989, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2959, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2982, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 3594, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6753, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SUB, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4467, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 6394, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_CIRCLE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2855, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 4, 2067, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3215, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2936, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4835, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_CIRCLE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 3449, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4606, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 4431, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4742, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2906, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_INITIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5207, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 6, 3720, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_CIRCLE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3090, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 777, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4605, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_FONT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 666, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_CIRCLE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 3445, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_NARROW, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3614, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_NARROW, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3618, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 1798, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 70, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 957, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 1372, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6068, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6049, 0},
+    {LXB_UNICODE_CANONICAL_SEPARATELY|LXB_UNICODE_DECOMPOSITION_TYPE_NARROW, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5866, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 6101, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 2469, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 375, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 1093, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_FINAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5087, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2844, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_CIRCLE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 66, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 4392, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6475, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2895, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3205, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_FINAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 5441, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_FINAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5179, 0},
     {LXB_UNICODE_DECOMPOSITION_TYPE_FONT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2315, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4641, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6726, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 626, 126},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 651, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 4, 3925, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4495, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_CIRCLE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6515, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_FINAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 5507, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 1169, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 529, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 533, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 6343, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6022, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 352, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 304, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 300, 88},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_CIRCLE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 288, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2804, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6881, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 4064, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4651, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4474, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_CIRCLE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3207, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_FINAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5081, 0},
     {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6598, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3175, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_ISOLATED, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5345, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_WIDE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 228, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 1081, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 1237, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3173, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 4, 2029, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6579, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 2203, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4511, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6063, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SMALL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5756, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 4982, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_FINAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 5639, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_ISOLATED, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5095, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6979, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_CIRCLE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3515, 0},
+    {LXB_UNICODE_CANONICAL_SEPARATELY|LXB_UNICODE_DECOMPOSITION_TYPE_NARROW, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5962, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_CIRCLE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 13, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_FRACTION, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 2358, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4653, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6951, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 5, 3940, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 2402, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 2479, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 4978, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_NARROW, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5832, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_FINAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 5645, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_ISOLATED, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5091, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_FINAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 5047, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 4940, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2789, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SMALL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2479, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 4, 2608, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2894, 0},
     {LXB_UNICODE_DECOMPOSITION_TYPE_MEDIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5008, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 230, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 2642, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3203, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_ISOLATED, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5097, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 669, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 148, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 993, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 4924, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6857, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 557, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2834, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6620, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 270, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_CIRCLE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3138, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_ISOLATED, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5215, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4628, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 898, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_ISOLATED, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5014, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 731, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_CIRCLE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3534, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4679, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 4032, 0},
     {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2812, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 3603, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 2711, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_INITIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 5432, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 2485, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SUB, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 118, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3183, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 1000, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 4, 2051, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 4026, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2810, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 6132, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 2330, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 4340, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_ISOLATED, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4995, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_ISOLATED, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5153, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 2994, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6043, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 4108, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6956, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 4, 2063, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4637, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 691, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_MEDIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5111, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_INITIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5010, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_ISOLATED, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5213, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_CIRCLE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 3489, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 4413, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_ISOLATED, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5004, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_FINAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5810, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 4, 4113, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4513, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4706, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_FINAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 5035, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 194, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 3576, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6609, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_ISOLATED, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5063, 0},
+    {LXB_UNICODE_CANONICAL_SEPARATELY|LXB_UNICODE_DECOMPOSITION_TYPE_NARROW, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5899, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3208, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_MEDIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5377, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 910, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6048, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2312, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6066, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_FINAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5024, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_ISOLATED, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5201, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_WIDE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 286, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SUB, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2294, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_ISOLATED, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5001, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 381, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 2577, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_ISOLATED, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 5811, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_CIRCLE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 232, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_CIRCLE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 3564, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 869, 221},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6632, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4701, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_WIDE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 66, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 1014, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_CIRCLE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 46, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_WIDE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 7, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2976, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 1017, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 4884, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6900, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4481, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6765, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4849, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4814, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_WIDE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2758, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_WIDE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6000, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 6341, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_NARROW, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3062, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 170, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 966, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 3066, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2887, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6523, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3209, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2853, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2826, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6804, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 4287, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_WIDE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 276, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2950, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 4, 2754, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6462, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 1311, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6735, 0},
+    {LXB_UNICODE_CANONICAL_SEPARATELY|LXB_UNICODE_DECOMPOSITION_TYPE_NARROW, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5923, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 968, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6544, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2952, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 1637, 276},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 1568, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3159, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4876, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6758, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_NARROW, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6011, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_WIDE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 38, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 1305, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_INITIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5203, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6534, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 48, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_NARROW, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5838, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_NARROW, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3076, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6549, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 44, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_CIRCLE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3208, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 6358, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4680, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2898, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 407, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 391, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4762, 0},
+    {LXB_UNICODE_CANONICAL_SEPARATELY|LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 2135, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3181, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 3225, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 731, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4487, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_WIDE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5793, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_INITIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4995, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 4336, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4529, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_ISOLATED, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5157, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4734, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_MEDIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5306, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 3219, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 3343, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SUB, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 987, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 1859, 320},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 6139, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 1313, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3136, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4601, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 4, 3753, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_VERTICAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5743, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6709, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2284, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6961, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_ISOLATED, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5217, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6676, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_FINAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 5414, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 2265, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_ISOLATED, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5011, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_ISOLATED, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5005, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 4407, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4511, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_INITIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5067, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4708, 0},
+    {LXB_UNICODE_CANONICAL_SEPARATELY|LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 4189, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 3580, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_FINAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5385, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 815, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 1451, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3206, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 6, 3741, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_VERTICAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2758, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 2087, 331},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_FINAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5290, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_ISOLATED, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5381, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6811, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 4273, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 2410, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6602, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_FINAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 5570, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3150, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4470, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6457, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_FINAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5292, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 4, 3949, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 1153, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 1018, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3152, 0},
+    {LXB_UNICODE_CANONICAL_SEPARATELY|LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 6, 4258, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6831, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SUB, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6307, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_CIRCLE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 965, 0},
+    {LXB_UNICODE_CANONICAL_SEPARATELY|LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 4148, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6573, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 280, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2924, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 284, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3125, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 1703, 292},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 565, 106},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6862, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6555, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_WIDE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 334, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 1634, 275},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6793, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2941, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_MEDIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5334, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_CIRCLE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 6432, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_NARROW, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3100, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_FINAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5022, 0},
+    {LXB_UNICODE_CANONICAL_SEPARATELY|LXB_UNICODE_DECOMPOSITION_TYPE_NARROW, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5944, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 1049, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_FINAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5155, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 2094, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_WIDE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5824, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_FINAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5023, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_CIRCLE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3050, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 4100, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 2744, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 2489, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 6382, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_NARROW, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3058, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 949, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 130, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4813, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6747, 0},
     {LXB_UNICODE_DECOMPOSITION_TYPE_SUB, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 972, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 667, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_FINAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 5486, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3115, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 102, 0},
-    {LXB_UNICODE_CANONICAL_SEPARATELY|LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 4220, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3113, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4592, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 1169, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_MAYBE|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_MAYBE|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 6125, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_NARROW, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3054, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 2626, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 1649, 280},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 1643, 278},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 2556, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_FINAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 5624, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4811, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 1782, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6730, 0},
+    {LXB_UNICODE_CANONICAL_SEPARATELY|LXB_UNICODE_DECOMPOSITION_TYPE_FONT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6280, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_FINAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5173, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 1307, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_CIRCLE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 234, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 2705, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 1075, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_INITIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 5531, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2954, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 1015, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6056, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 1089, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2914, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_FINAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 5552, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 6490, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 3096, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6058, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 965, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 3056, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 226, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_CIRCLE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3632, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 1509, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 4250, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6030, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_VERTICAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2530, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2979, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6800, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_CIRCLE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 224, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 983, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 1409, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3148, 0},
+    {LXB_UNICODE_CANONICAL_SEPARATELY|LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 1363, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4861, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4753, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6893, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 4, 2011, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2773, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4533, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 3231, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 641, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4765, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 6081, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 1249, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 1839, 313},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 637, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 449, 99},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_ISOLATED, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5361, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_VERTICAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2270, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 8, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_INITIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5117, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 1037, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 501, 0},
     {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6642, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 4032, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_FINAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 5438, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 6, 3976, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 3608, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6723, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3205, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_ISOLATED, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5101, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 1406, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 6, 3325, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_FINAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5284, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6888, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_ISOLATED, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 5051, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 743, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 4084, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6029, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 1183, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4798, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 984, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6540, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_MEDIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4995, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_FRACTION, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 2349, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4682, 0},
-    {LXB_UNICODE_CANONICAL_SEPARATELY|LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5781, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6576, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_CIRCLE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 344, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4748, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4733, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_MEDIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5185, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_INITIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5314, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_FINAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 5672, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3207, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4705, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_INITIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5207, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6610, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_FINAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5365, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 2460, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6658, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 256, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 3760, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 663, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_WIDE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2318, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6719, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4867, 0},
+    {LXB_UNICODE_CANONICAL_SEPARATELY|LXB_UNICODE_DECOMPOSITION_TYPE_FONT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6214, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_ISOLATED, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4998, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 4, 4359, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_ISOLATED, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5177, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6850, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3154, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 2225, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6886, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_FINAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5213, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4620, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6966, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_CIRCLE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3115, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 729, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 326, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3191, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4539, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_FRACTION, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 2379, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_ISOLATED, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5324, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 3252, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 819, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 4277, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_CIRCLE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3543, 0},
+    {LXB_UNICODE_CANONICAL_SEPARATELY|LXB_UNICODE_DECOMPOSITION_TYPE_FONT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6196, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 1494, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_INITIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5310, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 3651, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4690, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 699, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 1137, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 813, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 1179, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_FINAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5133, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2920, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 92, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_FINAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 777, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_FINAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5298, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 876, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 96, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 701, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 4, 1961, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2922, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SMALL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2274, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6625, 0},
     {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 118, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_ISOLATED, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 5244, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4731, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 1837, 312},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4680, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6587, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_FINAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4994, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 4326, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_CIRCLE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3086, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4879, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_CIRCLE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 2545, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 1279, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 2267, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6590, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6787, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 3436, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 735, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6306, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4592, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2918, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 4, 3688, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6562, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_FINAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5235, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6548, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SMALL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5759, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 727, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4507, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_INITIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 5300, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 1287, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_NOBREAK, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 897, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2931, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_INITIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5127, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 2669, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4654, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 3406, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 334, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_FINAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 5456, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 1281, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 5, 4253, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 882, 225},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 274, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_FINAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5337, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 801, 0},
     {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6543, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 4976, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2953, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 164, 82},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2291, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 611, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2909, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 2990, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4503, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_CIRCLE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 3552, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_CIRCLE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3632, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 3799, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SUB, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4774, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6977, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6477, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_FINAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 775, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 6, 3807, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_FINAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5288, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6818, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3149, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4471, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 1565, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 811, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 519, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6803, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_ISOLATED, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5341, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4647, 0},
     {LXB_UNICODE_DECOMPOSITION_TYPE_FINAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5387, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 3794, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 1600, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 978, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_ISOLATED, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5377, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2858, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4767, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4505, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_FINAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5171, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 971, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 5, 3654, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 2988, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 3092, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_FINAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5367, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_FINAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 5552, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6887, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2955, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6459, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_ISOLATED, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 779, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6894, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 4, 3753, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2971, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6797, 0},
     {LXB_UNICODE_DECOMPOSITION_TYPE_ISOLATED, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 795, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_INITIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5133, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4623, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6700, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3122, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4545, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_WIDE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 24, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 3412, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4633, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6054, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_ISOLATED, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5219, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6643, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_FINAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5163, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 616, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_FONT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4917, 0},
-    {LXB_UNICODE_CANONICAL_SEPARATELY|LXB_UNICODE_DECOMPOSITION_TYPE_FONT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6241, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_ISOLATED, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5203, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3156, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 3430, 0},
-    {LXB_UNICODE_CANONICAL_SEPARATELY|LXB_UNICODE_DECOMPOSITION_TYPE_NARROW, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5875, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_CIRCLE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2937, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SMALL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2291, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_ISOLATED, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 5678, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_CIRCLE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3535, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_ISOLATED, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5025, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_INITIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5109, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 3100, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 162, 81},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6763, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_INITIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5069, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 4, 3737, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_FONT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5133, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 2015, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 6077, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_INITIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5075, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_INITIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5377, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_CIRCLE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 6430, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2877, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 4972, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_ISOLATED, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5083, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_VERTICAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5742, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 999, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 4, 2025, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 3216, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SUB, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2295, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_WIDE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5772, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4528, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4857, 0},
     {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 3024, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_ISOLATED, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5143, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 6164, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 2645, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2831, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2847, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_FINAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5213, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_INITIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 5531, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 691, 0},
-    {LXB_UNICODE_CANONICAL_SEPARATELY|LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 4143, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6462, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6644, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 1281, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4475, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 749, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 1197, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_INITIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5065, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 4169, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4737, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_INITIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5227, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 1313, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_CIRCLE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3104, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 2196, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_FINAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 5459, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 3026, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6025, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_CIRCLE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 3461, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_FONT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6325, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 4, 3965, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 972, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 2223, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 4, 2063, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 1301, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 976, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_ISOLATED, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5073, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4693, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_WIDE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5826, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_ISOLATED, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 18, 5712, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_FINAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 5032, 0},
-    {LXB_UNICODE_CANONICAL_SEPARATELY|LXB_UNICODE_DECOMPOSITION_TYPE_NARROW, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5857, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 4279, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_INITIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5099, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_INITIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5185, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SUB, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6312, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4596, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6608, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 501, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_NOBREAK, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 897, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_FRACTION, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 2346, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 1834, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 1015, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3191, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2974, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_MEDIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5024, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_FRACTION, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 15, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 635, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4727, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_ISOLATED, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5235, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4536, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6937, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 1708, 294},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 74, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_WIDE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5758, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_ISOLATED, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 5244, 0},
     {LXB_UNICODE_DECOMPOSITION_TYPE_INITIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5181, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6796, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 4275, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 614, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_CIRCLE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 2539, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 912, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 525, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_CIRCLE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3523, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 6142, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_FINAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5191, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 2720, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 6148, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2782, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SUB, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2291, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 1287, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 673, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_CIRCLE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3064, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6042, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 3018, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 1652, 281},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 226, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2801, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3158, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 230, 2, 599, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_ISOLATED, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5207, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 1043, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 2228, 334},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 3406, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 2437, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 515, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6052, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 288, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 1415, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 1149, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 717, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 6329, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_FINAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5083, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 4057, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_INITIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5137, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 32, 56},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_FRACTION, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 2379, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 2431, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_ISOLATED, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 781, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6868, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 270, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_ISOLATED, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5381, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 4, 2051, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6960, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4776, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_CIRCLE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3528, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 4886, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_MEDIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5203, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 1831, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2856, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6936, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2827, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 449, 99},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_INITIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5141, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_FRACTION, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 2339, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 364, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_FINAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5203, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4715, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 4, 3290, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_CIRCLE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3527, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_CIRCLE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 66, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6925, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 5, 4253, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6527, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_ISOLATED, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 775, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2917, 0},
-    {LXB_UNICODE_CANONICAL_SEPARATELY|LXB_UNICODE_DECOMPOSITION_TYPE_FONT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6292, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_INITIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5169, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 1539, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 1472, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6764, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 1863, 322},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 602, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 1697, 290},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 1309, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 2732, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_CIRCLE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 3560, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_WIDE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5794, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2940, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 3678, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4499, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6673, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 4, 3828, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2913, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_MEDIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5025, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 1303, 0},
-    {LXB_UNICODE_CANONICAL_SEPARATELY|LXB_UNICODE_DECOMPOSITION_TYPE_FONT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6247, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 1928, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 1779, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6959, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 144, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 1463, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_FINAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5379, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 1624, 271},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 3084, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 4984, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 2313, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6846, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 4, 1917, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6557, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_NARROW, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3623, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4868, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 1795, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 986, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 1421, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 1370, 260},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 3070, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 779, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SUB, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 685, 0},
+    {LXB_UNICODE_CANONICAL_SEPARATELY|LXB_UNICODE_DECOMPOSITION_TYPE_FONT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6208, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 1412, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 984, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 711, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_ISOLATED, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 5709, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 178, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_MEDIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5095, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 2205, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3160, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 397, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 983, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SUB, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2289, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6833, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SUB, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6309, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2861, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_WIDE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2270, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 4905, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 4293, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 3985, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6587, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 4, 2280, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_WIDE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5789, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6813, 0},
     {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2949, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6305, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 3066, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4535, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6780, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 543, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 863, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_WIDE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 344, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SUB, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 711, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 1361, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 2252, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_ISOLATED, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4988, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_ISOLATED, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5103, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_FINAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5375, 0},
-    {LXB_UNICODE_CANONICAL_SEPARATELY|LXB_UNICODE_DECOMPOSITION_TYPE_FONT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6220, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6849, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2328, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 88, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2915, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SUB, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 980, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6626, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 807, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2797, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 1606, 0},
-    {LXB_UNICODE_CANONICAL_SEPARATELY|LXB_UNICODE_DECOMPOSITION_TYPE_FONT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6289, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 4, 3671, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 4, 3959, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_WIDE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5790, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_FONT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4915, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 6397, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 3781, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4560, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_CIRCLE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 3564, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 1385, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_FINAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 5591, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_ISOLATED, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5159, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_NARROW, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3622, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_CIRCLE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 3457, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 2398, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6027, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4627, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 2276, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 6083, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 715, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 1141, 254},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_INITIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 5303, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6928, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6732, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 4950, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 3578, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 116, 76},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6948, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_FINAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 5525, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 1231, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 4938, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 1075, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_WIDE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5792, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4628, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_ISOLATED, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5147, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 1885, 329},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 4899, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 980, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_CIRCLE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 3473, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4813, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_CIRCLE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3615, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4608, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_FINAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 5495, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_INITIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 5423, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6061, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 1649, 280},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_NARROW, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5828, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6776, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 3592, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 3343, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_ISOLATED, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5089, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3199, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4698, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2891, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 687, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 1586, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 2190, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 3337, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 274, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3162, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 38, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_VERTICAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5770, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4572, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6910, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 3854, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 3373, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6688, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 4, 3890, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_CIRCLE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 963, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4782, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 443, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 6135, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 940, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_CIRCLE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 980, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_CIRCLE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 276, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6909, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 142, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6678, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 1632, 274},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6711, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6638, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_CIRCLE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 975, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_FINAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5021, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 1091, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2848, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6655, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 1221, 255},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6700, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_MEDIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5173, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 2747, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_WIDE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 274, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_CIRCLE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3622, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 847, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2288, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SMALL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2270, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4772, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 2018, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 1337, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_FINAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5371, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_INITIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 5051, 0},
     {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6759, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_FINAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 5615, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4620, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_FINAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5268, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 6421, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_INITIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 5393, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 1512, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_FINAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5121, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6522, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2919, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 1684, 285},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SMALL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2294, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 1713, 296},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_FINAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5231, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_ISOLATED, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5383, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 622, 129},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 1072, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_INITIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5119, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 6496, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 1706, 293},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_ISOLATED, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5387, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 334, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4551, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SUB, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 711, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_INITIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5123, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 4, 3298, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 2763, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 158, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6486, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 4313, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_ISOLATED, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4993, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 1127, 0},
     {LXB_UNICODE_DECOMPOSITION_TYPE_FINAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 5501, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 4, 4113, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4710, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6766, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_WIDE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4666, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_INITIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5109, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_FINAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5005, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 6438, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_MAYBE|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_MAYBE|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 6115, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6778, 0},
-    {LXB_UNICODE_CANONICAL_SEPARATELY|LXB_UNICODE_DECOMPOSITION_TYPE_FONT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6286, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_FRACTION, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 2376, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 6400, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_NARROW, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2431, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_CIRCLE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3134, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 3231, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 2082, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2866, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6627, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 986, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 188, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 4094, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 174, 0},
-    {LXB_UNICODE_CANONICAL_SEPARATELY|LXB_UNICODE_DECOMPOSITION_TYPE_NARROW, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5938, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 3252, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_INITIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 5468, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_ISOLATED, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5155, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 4098, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4852, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_CIRCLE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2794, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6958, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 988, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3161, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 1012, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 793, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 1861, 321},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4677, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6869, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_ISOLATED, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5137, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_INITIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5381, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 3917, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_CIRCLE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 74, 0},
     {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2870, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_FINAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5001, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 4398, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3182, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_MAYBE|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_MAYBE|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 6119, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6846, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 613, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_INITIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5195, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4708, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6765, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2879, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2294, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 3054, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_CIRCLE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 46, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 2735, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 1061, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6939, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 4011, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_INITIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 5405, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 823, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 2493, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 6403, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2959, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_ISOLATED, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 5250, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_FINAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 5651, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 6, 3726, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_ISOLATED, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 797, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 1325, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6628, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6744, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_MEDIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4993, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 4330, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_VERTICAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5765, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4477, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 761, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 1213, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 1621, 270},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 4342, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_INITIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5069, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SMALL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5795, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2929, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 60, 62},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 1269, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_MEDIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5171, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4473, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SUB, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 594, 0},
-    {LXB_UNICODE_CANONICAL_SEPARATELY|LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5773, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4746, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 4005, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_CIRCLE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2907, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 4437, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 2087, 331},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 3052, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 859, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_NARROW, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3617, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 24, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 2465, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 4, 2394, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6857, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_VERTICAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5743, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_FINAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5349, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4594, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 6379, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 495, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SUB, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 707, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_CIRCLE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3541, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6310, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_FINAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 5814, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 1814, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2921, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6679, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3515, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3169, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6547, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6523, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6838, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 635, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_WIDE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 184, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2793, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 2183, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 1327, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6712, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6854, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 4, 3684, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2987, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 1215, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 370, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 763, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_FINAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 5513, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 547, 103},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 1752, 304},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_CIRCLE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 224, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_WIDE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 1301, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 1524, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 3064, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2293, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_FINAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5324, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_INITIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 5534, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2917, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 595, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_CIRCLE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 3445, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_ISOLATED, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4989, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_WIDE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 1329, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SUB, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4467, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 3062, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 1562, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 662, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_CIRCLE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 3568, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_CIRCLE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3624, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_FINAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5231, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6786, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 4368, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 38, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_CIRCLE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 983, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 650, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_WIDE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2294, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 66, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2795, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 1596, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 6, 3747, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2972, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_FINAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 795, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4603, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 1008, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3121, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 50, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_WIDE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5796, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 232, 0},
-    {LXB_UNICODE_CANONICAL_SEPARATELY|LXB_UNICODE_DECOMPOSITION_TYPE_FONT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6262, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 3937, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_INITIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5163, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4630, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_WIDE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2290, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4537, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_FONT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4918, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 1086, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6593, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 1241, 258},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2946, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 876, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 130, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_CIRCLE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2802, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SMALL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5792, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 3370, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4497, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_INITIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5079, 0},
     {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6728, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 6161, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4529, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_CIRCLE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3534, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_FINAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 779, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3134, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6905, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 1277, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_INITIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5157, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2832, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_FINAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5274, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4721, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 206, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 6341, 0},
-    {LXB_UNICODE_CANONICAL_SEPARATELY|LXB_UNICODE_DECOMPOSITION_TYPE_FONT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6265, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_FINAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 5444, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 2525, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2839, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 2758, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6811, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 4171, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 1115, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_INITIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5229, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_CIRCLE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3102, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_FINAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5081, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 410, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_FINAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5197, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6798, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2850, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_INITIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5131, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6906, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6711, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 1798, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6465, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4839, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6047, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4639, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_ISOLATED, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5075, 0},
-    {LXB_UNICODE_CANONICAL_SEPARATELY|LXB_UNICODE_DECOMPOSITION_TYPE_NARROW, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5917, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 3388, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 987, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2825, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_FINAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5215, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_CIRCLE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 126, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 4882, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6532, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_VERTICAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5759, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_CIRCLE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3530, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_FINAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 5594, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 2559, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 2628, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2825, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3171, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2908, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4671, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 5, 3732, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6649, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6745, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_FINAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5089, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 456, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_CIRCLE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3527, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 461, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 1779, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 4396, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 613, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_WIDE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 616, 0},
+    {LXB_UNICODE_CANONICAL_SEPARATELY|LXB_UNICODE_DECOMPOSITION_TYPE_NARROW, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5860, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6918, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_MEDIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5075, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2938, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_MEDIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5799, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_FINAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 5438, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 1283, 0},
     {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 934, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3192, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_CIRCLE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3076, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 334, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4686, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 2672, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2823, 0},
-    {LXB_UNICODE_CANONICAL_SEPARATELY|LXB_UNICODE_DECOMPOSITION_TYPE_NARROW, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5899, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 1515, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_ISOLATED, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 4, 5681, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4844, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 4, 2003, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_FONT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2335, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2776, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 182, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_MEDIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5179, 0},
     {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 1051, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 4017, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2903, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2929, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 3056, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 4, 2588, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 98, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_INITIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 5555, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4523, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_FINAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5337, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_WIDE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 975, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4781, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4489, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6588, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_NARROW, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3629, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 3718, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6541, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2779, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6902, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6592, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 1181, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 1139, 253},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_FINAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 5038, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_ISOLATED, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5067, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6627, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_ISOLATED, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5050, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 4944, 0},
+    {LXB_UNICODE_CANONICAL_SEPARATELY|LXB_UNICODE_DECOMPOSITION_TYPE_NARROW, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5893, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 878, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6826, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_CIRCLE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 2545, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_CIRCLE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3140, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_WIDE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 200, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6975, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4630, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6875, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4639, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6827, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SUB, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 695, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_CIRCLE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 3493, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 250, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6603, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3164, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 2750, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6570, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_WIDE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5795, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_FINAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5083, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6614, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_INITIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5014, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 4297, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6888, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6851, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_NARROW, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5834, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 1303, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_CIRCLE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 106, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6055, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6968, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_FONT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2291, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 1013, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_NARROW, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3052, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 230, 1, 598, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 230, 1, 597, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6045, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_INITIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5215, 0},
+    {LXB_UNICODE_CANONICAL_SEPARATELY|LXB_UNICODE_DECOMPOSITION_TYPE_VERTICAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5752, 0},
+    {LXB_UNICODE_CANONICAL_SEPARATELY|LXB_UNICODE_DECOMPOSITION_TYPE_FONT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6217, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 66, 0},
     {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6945, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_VERTICAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5745, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 1560, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 4, 3708, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 2994, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SUB, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2295, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_FINAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5361, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2895, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4480, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4819, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6644, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 765, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_FINAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 5471, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 967, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 6087, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2783, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6672, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 1533, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2922, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 288, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 2190, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 1744, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_CIRCLE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3066, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_ISOLATED, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5022, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 1415, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 650, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_CIRCLE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 198, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 234, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 1887, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6962, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 1841, 314},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 988, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_CIRCLE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 336, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6697, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_ISOLATED, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5187, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_FINAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4999, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 1107, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6839, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_CIRCLE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 3550, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_CIRCLE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3106, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4694, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SUB, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6319, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_NARROW, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3629, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2817, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 4047, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 2100, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 288, 86},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4781, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_FINAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5391, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 3370, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6680, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 1752, 304},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 4125, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 2732, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4571, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6687, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_CIRCLE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 200, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_CIRCLE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 346, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6580, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 1101, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 1659, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 6013, 0},
     {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 1382, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 387, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 192, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6710, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SUB, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 288, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2905, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_MEDIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5089, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_VERTICAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5769, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_INITIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5308, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_MEDIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5010, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6875, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 2304, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 3070, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6321, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6036, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2777, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 902, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_WIDE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 224, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 1985, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6812, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 1730, 302},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_ISOLATED, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5179, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 314, 91},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 618, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4547, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 945, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_FINAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4992, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6539, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3144, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4512, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SMALL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2294, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_CIRCLE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3207, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 2626, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6904, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 1353, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_FINAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 5057, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2811, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_FRACTION, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 2428, 0},
-    {LXB_UNICODE_CANONICAL_SEPARATELY|LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 2171, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_INITIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5139, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 2445, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 3349, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 2717, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4483, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_MEDIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4999, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6813, 0},
-    {LXB_UNICODE_CANONICAL_SEPARATELY|LXB_UNICODE_DECOMPOSITION_TYPE_FONT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6259, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 4227, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6725, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 1412, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 248, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 4029, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2980, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 445, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 2201, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 3982, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 1738, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 4, 1973, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 1484, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_FINAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 5507, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 675, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_ISOLATED, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5391, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4573, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2860, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3214, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 1089, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_FINAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5089, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_ISOLATED, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 5054, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SUB, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 98, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_FINAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 5633, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_ISOLATED, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5361, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 4, 2055, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 1795, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 1221, 255},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 1063, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 639, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_MEDIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4990, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6794, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4649, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4712, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_NARROW, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3098, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_ISOLATED, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5016, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 200, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 982, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4614, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6569, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 529, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3206, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 1017, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 2675, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_INITIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5075, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6056, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_CIRCLE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3056, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 4102, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 1329, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 2149, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4662, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 916, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6064, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_ISOLATED, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 4, 5738, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_MAYBE|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_MAYBE|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 6125, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_NARROW, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5833, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_MEDIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 5331, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2285, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 6154, 456},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 2243, 335},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 2726, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 1025, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 4311, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 6158, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6557, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 1283, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 463, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 707, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 2517, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_ISOLATED, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5231, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 1675, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3117, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 1444, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 2763, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4697, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_ISOLATED, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 5253, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2892, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 1105, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 707, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_FINAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 5441, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_FRACTION, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 21, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2315, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2287, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 34, 57},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 1421, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 1804, 309},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_FINAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 5654, 0},
+    {LXB_UNICODE_CANONICAL_SEPARATELY|LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5773, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 849, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2778, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4758, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_CIRCLE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2844, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4657, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6815, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 224, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_ISOLATED, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4989, 0},
     {LXB_UNICODE_DECOMPOSITION_TYPE_ISOLATED, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5105, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_FINAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 5663, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 6087, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 2194, 0},
-    {LXB_UNICODE_CANONICAL_SEPARATELY|LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 652, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_CIRCLE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3613, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_INITIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5095, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 4110, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 272, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 517, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_FINAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5109, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_CIRCLE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 14, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 503, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 236, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6694, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4586, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_NARROW, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6008, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6825, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_CIRCLE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3132, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 54, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_FINAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5365, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_INITIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5217, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6525, 0},
-    {LXB_UNICODE_CANONICAL_SEPARATELY|LXB_UNICODE_DECOMPOSITION_TYPE_VERTICAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 5747, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_WIDE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 118, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4684, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 1828, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_WIDE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 14, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 3255, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_INITIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 5465, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 951, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2982, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6068, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 6496, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3162, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 136, 80},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 785, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2866, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 567, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_ISOLATED, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5351, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SUB, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6311, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 437, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6596, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_ISOLATED, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 4, 5689, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_FINAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5355, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 3074, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 86, 69},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_INITIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5107, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6855, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6576, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_WIDE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 232, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6316, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 1811, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 1355, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 1391, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 1397, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 304, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 2233, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 593, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 3006, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6559, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 668, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 1551, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_FINAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 5432, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_ISOLATED, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5233, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_FINAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 5817, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 1772, 305},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 1007, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 4, 1995, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_ISOLATED, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5808, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2294, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4860, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_INITIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 5516, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SUB, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 975, 0},
+    {LXB_UNICODE_CANONICAL_SEPARATELY|LXB_UNICODE_DECOMPOSITION_TYPE_NARROW, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5845, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_INITIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 5426, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6483, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 1738, 0},
+    {LXB_UNICODE_CANONICAL_SEPARATELY|LXB_UNICODE_DECOMPOSITION_TYPE_NARROW, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5851, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6947, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_ISOLATED, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5075, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 2485, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 2521, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 383, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_FINAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 5489, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_ISOLATED, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5073, 0},
+    {LXB_UNICODE_CANONICAL_SEPARATELY|LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 4, 4230, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 24, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 6347, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6772, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 3901, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 650, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 4, 2037, 0},
     {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 126, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2768, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_INITIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5121, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2778, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3536, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 1014, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3181, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_WIDE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5999, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_CIRCLE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 3485, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SUB, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6301, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 757, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 3000, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 1209, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_NARROW, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3633, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 1246, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_ISOLATED, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5241, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_INITIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 5402, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_NARROW, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5835, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4825, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 1321, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6847, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4519, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_FINAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 5567, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2933, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6735, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 224, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 3044, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2899, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_CIRCLE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 182, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 1337, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 1004, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 52, 61},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3143, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_INITIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 5492, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 4, 3907, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2981, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4642, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_NOBREAK, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2251, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_FINAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5013, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_CIRCLE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 3499, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_FINAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 5265, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_FINAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5339, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_INITIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 5453, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6520, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6865, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 691, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_INITIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5129, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6751, 0},
     {LXB_UNICODE_DECOMPOSITION_TYPE_CIRCLE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3060, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 3042, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6323, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 3914, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6675, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_CIRCLE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 234, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 6077, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 6499, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2887, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2935, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4823, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_FINAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 5570, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 431, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4578, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_CIRCLE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3613, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_CIRCLE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2289, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_ISOLATED, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 775, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 3391, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SMALL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5760, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_CIRCLE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2286, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_ISOLATED, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5235, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 743, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 715, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_ISOLATED, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5803, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 635, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_CIRCLE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 3459, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_INITIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 5057, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 1063, 0},
     {LXB_UNICODE_DECOMPOSITION_TYPE_INITIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 5501, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 1602, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_ISOLATED, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5357, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 4297, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 4440, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 2998, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 4, 3692, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_NARROW, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3100, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4647, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4495, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 1391, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6779, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2967, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 140, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6307, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_NARROW, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3076, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 2410, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_MEDIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5133, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 234, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6556, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4553, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4575, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6943, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 4966, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3177, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6614, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SUB, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 987, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_CIRCLE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3542, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 4382, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_ISOLATED, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 5817, 0},
-    {LXB_UNICODE_CANONICAL_SEPARATELY|LXB_UNICODE_DECOMPOSITION_TYPE_FONT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6229, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 869, 221},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_NARROW, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3062, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 1099, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2922, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 379, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4670, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4551, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4803, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_CIRCLE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6514, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 781, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 1438, 262},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2845, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2781, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_FINAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 5453, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 1023, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SUB, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6311, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_FINAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5022, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_FINAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5069, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2948, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 1368, 259},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2802, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6530, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6555, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 685, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6467, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4601, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 250, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 186, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_FINAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 5456, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_ISOLATED, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5095, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 4060, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2843, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 160, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4692, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_FINAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4998, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 182, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 531, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2874, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 2045, 0},
-    {LXB_UNICODE_CANONICAL_SEPARATELY|LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 2213, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 1006, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6660, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6020, 0},
-    {LXB_UNICODE_CANONICAL_SEPARATELY|LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 605, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6317, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 650, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_INITIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5191, 0},
-    {LXB_UNICODE_CANONICAL_SEPARATELY|LXB_UNICODE_DECOMPOSITION_TYPE_NARROW, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5986, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 4283, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_ISOLATED, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 4, 5705, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 641, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4470, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4860, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 6337, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_ISOLATED, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 4, 5697, 0},
-    {LXB_UNICODE_CANONICAL_SEPARATELY|LXB_UNICODE_DECOMPOSITION_TYPE_NARROW, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5968, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 743, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_MEDIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5331, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 4, 3294, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4864, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_ISOLATED, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5131, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 1271, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4611, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_CIRCLE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 3552, 0},
     {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6915, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 651, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2819, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_CIRCLE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 4, 3508, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_ISOLATED, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5135, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 2120, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6672, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4690, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_ISOLATED, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5191, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 1249, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3150, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 6142, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4695, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6960, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 2301, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 2304, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 4899, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_ISOLATED, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5371, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_CIRCLE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3076, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6017, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 1556, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_ISOLATED, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5189, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 1385, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 1806, 310},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_INITIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4999, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 4, 3965, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 1869, 324},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 1321, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4881, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 3358, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6646, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_WIDE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2285, 0},
+    {LXB_UNICODE_CANONICAL_SEPARATELY|LXB_UNICODE_DECOMPOSITION_TYPE_NARROW, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5995, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 1548, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 100, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3524, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_VERTICAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2294, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 2509, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 1228, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 965, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6660, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 3364, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_FONT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4917, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6955, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4779, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4823, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2807, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6853, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 4080, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_WIDE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5790, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_CIRCLE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3538, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3165, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4685, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2893, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 362, 97},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_ISOLATED, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5167, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_MEDIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4996, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 1928, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_CIRCLE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 594, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6612, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6861, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_CIRCLE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2318, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 4299, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 6453, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6665, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 2465, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SMALL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5793, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 1103, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_FINAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5007, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 1161, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 461, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_ISOLATED, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5227, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_MEDIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5012, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_INITIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5009, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_WIDE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 975, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6872, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6304, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4469, 0},
+    {LXB_UNICODE_CANONICAL_SEPARATELY|LXB_UNICODE_DECOMPOSITION_TYPE_NARROW, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5878, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2837, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6594, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 6105, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4713, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 3590, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 248, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 252, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2847, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_INITIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5075, 0},
+    {LXB_UNICODE_CANONICAL_SEPARATELY|LXB_UNICODE_DECOMPOSITION_TYPE_NARROW, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5857, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 614, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_WIDE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 971, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 6427, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2858, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6798, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_INITIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 5435, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_FINAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5153, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6691, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_INITIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5081, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 527, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 3914, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_INITIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5324, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 1301, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_FINAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 5498, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3176, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 298, 87},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 1463, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 6, 3325, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 4, 2592, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_CIRCLE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2287, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4557, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 515, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_INITIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 5396, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 230, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 459, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 4326, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_INITIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 783, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_ISOLATED, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 5256, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_FINAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 5447, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_ISOLATED, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 783, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2293, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 771, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2769, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_FINAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 5450, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_FINAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5025, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_FINAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 5262, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6550, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SUB, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 665, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_INITIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 5555, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 1558, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3119, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4477, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 829, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_INITIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5103, 0},
     {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 106, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_INITIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 5540, 0},
-    {LXB_UNICODE_CANONICAL_SEPARATELY|LXB_UNICODE_DECOMPOSITION_TYPE_NARROW, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5893, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_WIDE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 274, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 1057, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 6, 3822, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 2125, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 1335, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 3804, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6595, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_CIRCLE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3630, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_CIRCLE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3618, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 6493, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 1394, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2789, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 2556, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6805, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 1005, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_WIDE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2254, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_FINAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5381, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2327, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 4129, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_ISOLATED, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5809, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6757, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 2678, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 1691, 288},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2925, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_FINAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5203, 0},
+    {LXB_UNICODE_CANONICAL_SEPARATELY|LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 4143, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2292, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_MEDIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5805, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 282, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6852, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_ISOLATED, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 775, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 1203, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 2230, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 4455, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3124, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 439, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_INITIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 5567, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6593, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2788, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_FINAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 5483, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2967, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4666, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_CIRCLE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3521, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_ISOLATED, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5125, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_INITIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4991, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 1173, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 1131, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 1883, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6685, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_INITIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 5411, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3211, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4562, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4516, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 1592, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_ISOLATED, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 5032, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6582, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_ISOLATED, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 5057, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 1754, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 4169, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 2183, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 3340, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 4954, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 1444, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 4422, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6914, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_CIRCLE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 3483, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 6145, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_FINAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 5486, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 5, 3896, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 322, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 941, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 1475, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4597, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6928, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3131, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4729, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_INITIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 5423, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 4347, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 389, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 393, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 2115, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 2159, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SUB, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6318, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 1466, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 6388, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3186, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6645, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 200, 0},
+    {LXB_UNICODE_CANONICAL_SEPARATELY|LXB_UNICODE_DECOMPOSITION_TYPE_NARROW, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5842, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6841, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_MEDIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5063, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6532, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_NARROW, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3621, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_NARROW, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3616, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_ISOLATED, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5147, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6551, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_FINAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4994, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 575, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2903, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4676, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 4, 3708, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_INITIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5215, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 428, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4740, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_CIRCLE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3531, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 46, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_WIDE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5796, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_FINAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 5609, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_NARROW, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6008, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 2100, 332},
+    {LXB_UNICODE_CANONICAL_SEPARATELY|LXB_UNICODE_DECOMPOSITION_TYPE_NARROW, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5977, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2797, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 134, 79},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2933, 0},
+    {LXB_UNICODE_CANONICAL_SEPARATELY|LXB_UNICODE_DECOMPOSITION_TYPE_FONT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6262, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_FRACTION, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 2339, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6060, 0},
+    {LXB_UNICODE_CANONICAL_SEPARATELY|LXB_UNICODE_DECOMPOSITION_TYPE_NARROW, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5908, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 1500, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 1292, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_WIDE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 336, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6521, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6806, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 1610, 266},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 1665, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2821, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6799, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_INITIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5129, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_MEDIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5324, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 1009, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 6415, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 2645, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 1043, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6025, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4776, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_NARROW, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3064, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_WIDE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5999, 0},
+    {LXB_UNICODE_CANONICAL_SEPARATELY|LXB_UNICODE_DECOMPOSITION_TYPE_FONT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6180, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 3002, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_WIDE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2290, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4815, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2971, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6773, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_MEDIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5000, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_ISOLATED, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5199, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6485, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 434, 102},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_NARROW, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3630, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_INITIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5024, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SUB, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 234, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_CIRCLE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 2549, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 4, 2616, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4556, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_CIRCLE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 158, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 7, 3318, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_FONT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4915, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4700, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6052, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 1545, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_NARROW, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3632, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_CIRCLE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 3562, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3122, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 3421, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 1020, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 1159, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4587, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_ISOLATED, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 777, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 4131, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6834, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SUB, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6310, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 94, 72},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 991, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 3832, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 98, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_FINAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5103, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 4137, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3120, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6667, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 719, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6600, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 747, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_INITIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5135, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6814, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_FINAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5015, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_FINAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 781, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4831, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_FINAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5239, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6525, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4544, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3196, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6558, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_FINAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 5558, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3155, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6859, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 4, 3270, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 4, 1931, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_CIRCLE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2285, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4615, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 2398, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 1469, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_FRACTION, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 2349, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_CIRCLE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 3467, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 4279, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_FINAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 5444, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_CIRCLE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 967, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 4372, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6575, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_ISOLATED, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 5253, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_FINAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 5564, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4558, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_INITIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5165, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 1231, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_INITIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 5399, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_INITIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5193, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_VERTICAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2274, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 2451, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 3334, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4802, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4560, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_NARROW, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3628, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 4, 3763, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_INITIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 5405, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 906, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 827, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_ISOLATED, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5103, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 1003, 0},
+    {LXB_UNICODE_CANONICAL_SEPARATELY|LXB_UNICODE_DECOMPOSITION_TYPE_FONT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6232, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 212, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 1319, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 919, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 6079, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 1866, 323},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6679, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 3234, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6958, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 3995, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4534, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6516, 0},
     {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 2992, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_INITIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5119, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6755, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_MEDIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 5328, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 364, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2315, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 1379, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 2681, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4793, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2955, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 904, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 166, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3117, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 485, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 3030, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 246, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 626, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 4017, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_WIDE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2288, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_FINAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5189, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 6412, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2913, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 4, 3671, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 228, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 3042, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6481, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SUB, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2291, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_WIDE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2286, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4566, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 1621, 270},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 4, 2588, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 3355, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 1615, 268},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 975, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_CIRCLE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 983, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 1608, 265},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_CIRCLE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 3558, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_NARROW, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3634, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4472, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 1662, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 4088, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 198, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 6167, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4698, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 106, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 1099, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_NARROW, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5744, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_ISOLATED, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5191, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_FONT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6170, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_WIDE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 1329, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_MEDIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4999, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_ISOLATED, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5247, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4696, 0},
+    {LXB_UNICODE_CANONICAL_SEPARATELY|LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 2104, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_CIRCLE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 3554, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_ISOLATED, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5195, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_FINAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5000, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 68, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 3794, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2946, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6038, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 469, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 4121, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_CIRCLE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 992, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 144, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 148, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_MEDIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5131, 0},
     {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 5, 3876, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 1003, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 2523, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4507, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 6449, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SUB, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 90, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_CIRCLE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3628, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_VERTICAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2294, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 224, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6937, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 2699, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4837, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4637, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 497, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 483, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6695, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2957, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 2489, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 3076, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6040, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2868, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 2149, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_FINAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5139, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6674, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SUB, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6302, 0},
+    {LXB_UNICODE_CANONICAL_SEPARATELY|LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5781, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2776, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 4041, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2815, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_CIRCLE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 88, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4756, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 563, 105},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_MEDIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5324, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 3427, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 1351, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SUB, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 743, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6829, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6873, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4589, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_FINAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 5041, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 4929, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 669, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_CIRCLE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3134, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_VERTICAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5760, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 6, 3822, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6973, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4626, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 1694, 289},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_FINAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 5044, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 4934, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6652, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6809, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2326, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4624, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 3048, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_CIRCLE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3624, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_CIRCLE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3129, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_CIRCLE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3517, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_FINAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5272, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_CIRCLE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 3546, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_FINAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 789, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6553, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4829, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_MAYBE|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_MAYBE|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 6095, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4655, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6922, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2936, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_FINAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 5648, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_NARROW, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5829, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 122, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 184, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6905, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 180, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6715, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_FINAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5073, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_CIRCLE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 3471, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_INITIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 5534, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 1345, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6571, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SUB, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 14, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_ISOLATED, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5183, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_ISOLATED, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4988, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 895, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_NARROW, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5828, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_ISOLATED, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5101, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_MEDIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4998, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6789, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4490, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 785, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6623, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 3662, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 681, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2911, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_FINAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 5633, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6467, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 28, 55},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6468, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4492, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 54, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6480, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2874, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 769, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4522, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 4094, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_CIRCLE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3056, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3202, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 2501, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 2276, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_INITIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5163, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 4382, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 6349, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4520, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6965, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 6097, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_ISOLATED, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5250, 0},
+    {LXB_UNICODE_CANONICAL_SEPARATELY|LXB_UNICODE_DECOMPOSITION_TYPE_NARROW, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5935, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 2421, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SUB, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2285, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_ISOLATED, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5163, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 4386, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6884, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3200, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 4, 3787, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6717, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SMALL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2758, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 831, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 234, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6737, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SMALL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5762, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_MEDIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5229, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 6434, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 2077, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_MEDIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5013, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 379, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_CIRCLE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3620, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_INITIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5063, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_CIRCLE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 3455, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4504, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4609, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4745, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_CIRCLE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3078, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_INITIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5135, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 6329, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_FINAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5343, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6536, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 3608, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 971, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 172, 0},
     {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 3058, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SUB, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 975, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 252, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4559, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_INITIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 5546, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 3094, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_FINAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 5588, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4543, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2879, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 2243, 335},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 1678, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 3862, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 4, 2033, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4711, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6042, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6566, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_ISOLATED, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 5051, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 3586, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_ISOLATED, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 5029, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 4950, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 4173, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 3869, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 328, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3635, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_FINAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5006, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6972, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_CIRCLE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 3479, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_ISOLATED, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5223, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6933, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_FINAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5012, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 1524, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_WIDE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 14, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6891, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3133, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4598, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6912, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 908, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 230, 1, 596, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_MEDIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5115, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_ISOLATED, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5163, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4731, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_FINAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4996, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3214, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6698, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6631, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 4, 1999, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 58, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 1347, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6656, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 1258, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_MEDIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5089, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_CIRCLE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3536, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6822, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 6130, 450},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6640, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6476, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4683, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_ISOLATED, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5009, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6618, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 2571, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_MEDIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5191, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 2636, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SMALL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2293, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 4938, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 4, 1973, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 1117, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_CIRCLE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3137, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 1273, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2835, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_VERTICAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5759, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4872, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6848, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 439, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 861, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_WIDE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2294, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 1059, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 499, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3167, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6724, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6308, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6589, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_FINAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5276, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_FINAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 797, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 4, 3959, 0},
+    {LXB_UNICODE_CANONICAL_SEPARATELY|LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 4066, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2805, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_CIRCLE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 160, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_NARROW, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5831, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6879, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 4303, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 2382, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6941, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6977, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_FINAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 797, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_CIRCLE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3618, 0},
+    {LXB_UNICODE_CANONICAL_SEPARATELY|LXB_UNICODE_DECOMPOSITION_TYPE_NARROW, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5965, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 2735, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_FINAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5383, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2872, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 6508, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_CIRCLE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 2537, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 453, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_INITIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5089, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4494, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_INITIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5326, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 2495, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 1191, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 1149, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 531, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2870, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 302, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2973, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_CIRCLE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 98, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_WIDE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 160, 0},
+    {LXB_UNICODE_CANONICAL_SEPARATELY|LXB_UNICODE_DECOMPOSITION_TYPE_FONT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6286, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 224, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 4390, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6473, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_INITIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5223, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2845, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 1484, 0},
+    {LXB_UNICODE_CANONICAL_SEPARATELY|LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 657, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 841, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4482, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 611, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_ISOLATED, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5179, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3204, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4524, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_CIRCLE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3086, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4502, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 757, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 4330, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 1027, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_FINAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5161, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 4, 3700, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2901, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_WIDE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 963, 0},
+    {LXB_UNICODE_CANONICAL_SEPARATELY|LXB_UNICODE_DECOMPOSITION_TYPE_NARROW, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5983, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_NARROW, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6009, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 1357, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3178, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4500, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 1400, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 118, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 422, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 336, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 340, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 2714, 0},
     {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6784, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6683, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_FINAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5189, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 533, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 900, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_NARROW, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3094, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_INITIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5322, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_ISOLATED, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5365, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_MAYBE|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_MAYBE|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 6095, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_ISOLATED, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5119, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_MEDIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5805, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 3006, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 4952, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 3576, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 751, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 699, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2931, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 2199, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 2437, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 1891, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 595, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 1853, 318},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 953, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4848, 0},
+    {LXB_UNICODE_CANONICAL_SEPARATELY|LXB_UNICODE_DECOMPOSITION_TYPE_NARROW, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5914, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 2223, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 604, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 6364, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 1424, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 66, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2823, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 204, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2856, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 56, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3188, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2965, 0},
+    {LXB_UNICODE_CANONICAL_SEPARATELY|LXB_UNICODE_DECOMPOSITION_TYPE_FONT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6202, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4821, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2219, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6903, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_CIRCLE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3519, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 2726, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2891, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 4351, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6920, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4852, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_ISOLATED, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5121, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_ISOLATED, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4991, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 743, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6743, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 4428, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2927, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 476, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 624, 0},
+    {LXB_UNICODE_CANONICAL_SEPARATELY|LXB_UNICODE_DECOMPOSITION_TYPE_NARROW, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5884, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6726, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3212, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 4449, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 278, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_CIRCLE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3619, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4518, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 2717, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6934, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SUB, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6301, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4519, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 963, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 1580, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3199, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_MEDIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5155, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 664, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_ISOLATED, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5367, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4484, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4842, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2786, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_MEDIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 5057, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 945, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_INITIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 5477, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 4380, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6702, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4489, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 662, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6459, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_FONT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4919, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 90, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 1624, 271},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4715, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4554, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_INITIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 5537, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 4, 3310, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6062, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6896, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 707, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6054, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_NARROW, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5743, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 4, 1977, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 6333, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4717, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_FINAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5069, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6547, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_FINAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 779, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6769, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 2389, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 4, 2394, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6538, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_FRACTION, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 2346, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 805, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 990, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 1988, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_CIRCLE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3625, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_CIRCLE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3128, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_VERTICAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5763, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 2384, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 2079, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 626, 0},
     {LXB_UNICODE_DECOMPOSITION_TYPE_WIDE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5742, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 731, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 1235, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6852, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 1079, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4722, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE_INITIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5167, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6664, 0},
-    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4541, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 42, 60},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4623, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_ISOLATED, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 5041, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 4926, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 721, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2795, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 174, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6785, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_ISOLATED, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5129, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 228, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6739, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 74, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_CIRCLE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3627, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4774, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 34, 57},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6027, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_VERTICAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5761, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2285, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_INITIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5025, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_WIDE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 126, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 889, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_ISOLATED, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5143, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 2274, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 138, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6795, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_INITIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5139, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 1267, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SUB, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 7, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_FINAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5324, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4674, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_INITIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5316, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_CIRCLE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3529, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 1261, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 240, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_FINAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 5603, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_MAYBE|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_MAYBE|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 6113, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 787, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 3104, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 3000, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_NARROW, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3082, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_NARROW, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3050, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6037, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4817, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6791, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2884, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 521, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_ISOLATED, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5143, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_MAYBE|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_MAYBE|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 6109, 445},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_NARROW, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3068, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_MEDIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4993, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3157, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6877, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 2517, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 6440, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6976, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 3991, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6939, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_FINAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5296, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 4283, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 973, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_ISOLATED, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5347, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6309, 0},
+    {LXB_UNICODE_CANONICAL_SEPARATELY|LXB_UNICODE_DECOMPOSITION_TYPE_FONT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6253, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 1295, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_INITIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5099, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_ISOLATED, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 4, 5697, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_FINAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5351, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4800, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 160, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 330, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_NARROW, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3626, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_INITIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5101, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4499, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 1788, 307},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 2433, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 80, 67},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_WIDE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 224, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 594, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 1716, 297},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6616, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 13, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 1115, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_INITIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5312, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 3008, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6761, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 90, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_INITIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5229, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 4377, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 1823, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4844, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6820, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4483, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 3240, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_INITIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5225, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 1083, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_CIRCLE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3102, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2968, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6541, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4546, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3198, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_CIRCLE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 38, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 975, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 4, 3278, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 2758, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 1010, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 887, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 2642, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 1675, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2869, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 2720, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_VERTICAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5746, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_INITIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5155, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_ISOLATED, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5139, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 5, 3771, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4807, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6564, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4864, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2957, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6750, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_INITIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 5543, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_ISOLATED, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 797, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4719, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2948, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 6370, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2318, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6733, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 2439, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6732, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2768, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4580, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3115, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_NARROW, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5768, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 3397, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_CIRCLE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3629, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6533, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 2990, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 1343, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 755, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_FINAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 5669, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 1263, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 308, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 1200, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_VERTICAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5765, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_FINAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5197, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 1029, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 7, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 537, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_ISOLATED, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5237, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 2113, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_MEDIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5308, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 2156, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_FINAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 5814, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_WIDE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 344, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 4, 1981, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4724, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_INITIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 5513, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 3028, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 648, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 1486, 263},
+    {LXB_UNICODE_CANONICAL_SEPARATELY|LXB_UNICODE_DECOMPOSITION_TYPE_FONT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6292, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 3086, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_INITIAL, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 5143, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6471, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 224, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 1589, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_CIRCLE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 2535, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_ISOLATED, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 5077, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2882, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 6036, 0},
+    {LXB_UNICODE_CANONICAL_SEPARATELY|LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 652, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 4968, 0},
+    {LXB_UNICODE_CANONICAL_SEPARATELY|LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 4220, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_CIRCLE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 971, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 4011, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SQUARE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 5, 3857, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2880, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 2387, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 3, 2151, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 3141, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_MAYBE|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_MAYBE|LXB_UNICODE_QUICK_NFKD_NO, 0, 2, 6117, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_SUPER, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 963, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE__UNDEF, LXB_UNICODE_QUICK_NFC_NO|LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 4644, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_COMPAT, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 1, 2983, 0},
+    {LXB_UNICODE_DECOMPOSITION_TYPE_CIRCLE, LXB_UNICODE_QUICK_NFKC_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 5, 3503, 0},
     {0, LXB_UNICODE_QUICK_NFD_NO|LXB_UNICODE_QUICK_NFKD_NO, 0, 0, 0, 0},
-    {0, LXB_UNICODE_QUICK_NFC_MAYBE|LXB_UNICODE_QUICK_NFKC_MAYBE, 1, 0, 0, 0},
-    {0, LXB_UNICODE_QUICK_NFC_MAYBE|LXB_UNICODE_QUICK_NFKC_MAYBE, 220, 0, 0, 0},
-    {0, LXB_UNICODE_QUICK_NFC_MAYBE|LXB_UNICODE_QUICK_NFKC_MAYBE, 240, 0, 0, 0},
     {0, LXB_UNICODE_QUICK_NFC_MAYBE|LXB_UNICODE_QUICK_NFKC_MAYBE, 0, 0, 0, 0},
-    {0, LXB_UNICODE_QUICK_NFC_MAYBE|LXB_UNICODE_QUICK_NFKC_MAYBE, 91, 0, 0, 0},
-    {0, LXB_UNICODE_QUICK_NFC_MAYBE|LXB_UNICODE_QUICK_NFKC_MAYBE, 7, 0, 0, 0},
-    {0, LXB_UNICODE_QUICK_NFC_MAYBE|LXB_UNICODE_QUICK_NFKC_MAYBE, 230, 0, 0, 0},
-    {0, LXB_UNICODE_QUICK_NFC_MAYBE|LXB_UNICODE_QUICK_NFKC_MAYBE, 216, 0, 0, 0},
-    {0, LXB_UNICODE_QUICK_NFC_MAYBE|LXB_UNICODE_QUICK_NFKC_MAYBE, 0, 0, 0, 449},
     {0, LXB_UNICODE_QUICK_NFC_MAYBE|LXB_UNICODE_QUICK_NFKC_MAYBE, 202, 0, 0, 0},
-    {0, LXB_UNICODE_QUICK_NFC_MAYBE|LXB_UNICODE_QUICK_NFKC_MAYBE, 0, 0, 0, 444},
-    {0, LXB_UNICODE_QUICK_NFC_MAYBE|LXB_UNICODE_QUICK_NFKC_MAYBE, 0, 0, 0, 439},
-    {0, LXB_UNICODE_QUICK_NFC_MAYBE|LXB_UNICODE_QUICK_NFKC_MAYBE, 8, 0, 0, 0},
+    {0, LXB_UNICODE_QUICK_NFC_MAYBE|LXB_UNICODE_QUICK_NFKC_MAYBE, 240, 0, 0, 0},
+    {0, LXB_UNICODE_QUICK_NFC_MAYBE|LXB_UNICODE_QUICK_NFKC_MAYBE, 230, 0, 0, 0},
     {0, LXB_UNICODE_QUICK_NFC_MAYBE|LXB_UNICODE_QUICK_NFKC_MAYBE, 9, 0, 0, 0},
+    {0, LXB_UNICODE_QUICK_NFC_MAYBE|LXB_UNICODE_QUICK_NFKC_MAYBE, 8, 0, 0, 0},
+    {0, LXB_UNICODE_QUICK_NFC_MAYBE|LXB_UNICODE_QUICK_NFKC_MAYBE, 220, 0, 0, 0},
+    {0, LXB_UNICODE_QUICK_NFC_MAYBE|LXB_UNICODE_QUICK_NFKC_MAYBE, 7, 0, 0, 0},
+    {0, LXB_UNICODE_QUICK_NFC_MAYBE|LXB_UNICODE_QUICK_NFKC_MAYBE, 1, 0, 0, 0},
+    {0, LXB_UNICODE_QUICK_NFC_MAYBE|LXB_UNICODE_QUICK_NFKC_MAYBE, 0, 0, 0, 444},
+    {0, LXB_UNICODE_QUICK_NFC_MAYBE|LXB_UNICODE_QUICK_NFKC_MAYBE, 91, 0, 0, 0},
+    {0, LXB_UNICODE_QUICK_NFC_MAYBE|LXB_UNICODE_QUICK_NFKC_MAYBE, 0, 0, 0, 449},
+    {0, LXB_UNICODE_QUICK_NFC_MAYBE|LXB_UNICODE_QUICK_NFKC_MAYBE, 216, 0, 0, 0},
     {0, LXB_UNICODE_QUICK_NFC_MAYBE|LXB_UNICODE_QUICK_NFKC_MAYBE, 0, 0, 0, 447},
+    {0, LXB_UNICODE_QUICK_NFC_MAYBE|LXB_UNICODE_QUICK_NFKC_MAYBE, 0, 0, 0, 439},
     {0, LXB_UNICODE_QUICK__UNDEF, 230, 0, 0, 0},
-    {0, LXB_UNICODE_QUICK__UNDEF, 220, 0, 0, 0},
-    {0, LXB_UNICODE_QUICK__UNDEF, 18, 0, 0, 0},
     {0, LXB_UNICODE_QUICK__UNDEF, 1, 0, 0, 0},
-    {0, LXB_UNICODE_QUICK__UNDEF, 216, 0, 0, 0},
+    {0, LXB_UNICODE_QUICK__UNDEF, 220, 0, 0, 0},
+    {0, LXB_UNICODE_QUICK__UNDEF, 9, 0, 0, 0},
     {0, LXB_UNICODE_QUICK__UNDEF, 28, 0, 0, 0},
+    {0, LXB_UNICODE_QUICK__UNDEF, 233, 0, 0, 0},
     {0, LXB_UNICODE_QUICK__UNDEF, 234, 0, 0, 0},
-    {0, LXB_UNICODE_QUICK__UNDEF, 224, 0, 0, 0},
     {0, LXB_UNICODE_QUICK__UNDEF, 122, 0, 0, 0},
+    {0, LXB_UNICODE_QUICK__UNDEF, 17, 0, 0, 0},
     {0, LXB_UNICODE_QUICK__UNDEF, 7, 0, 0, 0},
-    {0, LXB_UNICODE_QUICK__UNDEF, 9, 0, 0, 0},
-    {0, LXB_UNICODE_QUICK__UNDEF, 222, 0, 0, 0},
-    {0, LXB_UNICODE_QUICK__UNDEF, 232, 0, 0, 0},
-    {0, LXB_UNICODE_QUICK__UNDEF, 16, 0, 0, 0},
-    {0, LXB_UNICODE_QUICK__UNDEF, 30, 0, 0, 0},
-    {0, LXB_UNICODE_QUICK__UNDEF, 25, 0, 0, 0},
     {0, LXB_UNICODE_QUICK__UNDEF, 130, 0, 0, 0},
-    {0, LXB_UNICODE_QUICK__UNDEF, 218, 0, 0, 0},
-    {0, LXB_UNICODE_QUICK__UNDEF, 228, 0, 0, 0},
-    {0, LXB_UNICODE_QUICK__UNDEF, 107, 0, 0, 0},
-    {0, LXB_UNICODE_QUICK__UNDEF, 202, 0, 0, 0},
-    {0, LXB_UNICODE_QUICK__UNDEF, 13, 0, 0, 0},
-    {0, LXB_UNICODE_QUICK__UNDEF, 11, 0, 0, 0},
-    {0, LXB_UNICODE_QUICK__UNDEF, 19, 0, 0, 0},
-    {0, LXB_UNICODE_QUICK__UNDEF, 27, 0, 0, 0},
+    {0, LXB_UNICODE_QUICK__UNDEF, 31, 0, 0, 0},
+    {0, LXB_UNICODE_QUICK__UNDEF, 20, 0, 0, 0},
+    {0, LXB_UNICODE_QUICK__UNDEF, 35, 0, 0, 0},
+    {0, LXB_UNICODE_QUICK__UNDEF, 30, 0, 0, 0},
+    {0, LXB_UNICODE_QUICK__UNDEF, 18, 0, 0, 0},
     {0, LXB_UNICODE_QUICK__UNDEF, 21, 0, 0, 0},
-    {0, LXB_UNICODE_QUICK__UNDEF, 23, 0, 0, 0},
-    {0, LXB_UNICODE_QUICK__UNDEF, 15, 0, 0, 0},
-    {0, LXB_UNICODE_QUICK__UNDEF, 32, 0, 0, 0},
+    {0, LXB_UNICODE_QUICK__UNDEF, 232, 0, 0, 0},
+    {0, LXB_UNICODE_QUICK__UNDEF, 10, 0, 0, 0},
+    {0, LXB_UNICODE_QUICK__UNDEF, 216, 0, 0, 0},
+    {0, LXB_UNICODE_QUICK__UNDEF, 13, 0, 0, 0},
     {0, LXB_UNICODE_QUICK__UNDEF, 118, 0, 0, 0},
-    {0, LXB_UNICODE_QUICK__UNDEF, 34, 0, 0, 0},
-    {0, LXB_UNICODE_QUICK__UNDEF, 31, 0, 0, 0},
-    {0, LXB_UNICODE_QUICK__UNDEF, 233, 0, 0, 0},
-    {0, LXB_UNICODE_QUICK__UNDEF, 84, 0, 0, 0},
-    {0, LXB_UNICODE_QUICK__UNDEF, 132, 0, 0, 0},
-    {0, LXB_UNICODE_QUICK__UNDEF, 103, 0, 0, 0},
+    {0, LXB_UNICODE_QUICK__UNDEF, 228, 0, 0, 0},
+    {0, LXB_UNICODE_QUICK__UNDEF, 202, 0, 0, 0},
+    {0, LXB_UNICODE_QUICK__UNDEF, 26, 0, 0, 0},
     {0, LXB_UNICODE_QUICK__UNDEF, 226, 0, 0, 0},
-    {0, LXB_UNICODE_QUICK__UNDEF, 214, 0, 0, 0},
-    {0, LXB_UNICODE_QUICK__UNDEF, 20, 0, 0, 0},
+    {0, LXB_UNICODE_QUICK__UNDEF, 24, 0, 0, 0},
+    {0, LXB_UNICODE_QUICK__UNDEF, 27, 0, 0, 0},
     {0, LXB_UNICODE_QUICK__UNDEF, 22, 0, 0, 0},
-    {0, LXB_UNICODE_QUICK__UNDEF, 10, 0, 0, 0},
+    {0, LXB_UNICODE_QUICK__UNDEF, 36, 0, 0, 0},
+    {0, LXB_UNICODE_QUICK__UNDEF, 19, 0, 0, 0},
+    {0, LXB_UNICODE_QUICK__UNDEF, 224, 0, 0, 0},
+    {0, LXB_UNICODE_QUICK__UNDEF, 32, 0, 0, 0},
     {0, LXB_UNICODE_QUICK__UNDEF, 12, 0, 0, 0},
-    {0, LXB_UNICODE_QUICK__UNDEF, 33, 0, 0, 0},
+    {0, LXB_UNICODE_QUICK__UNDEF, 11, 0, 0, 0},
+    {0, LXB_UNICODE_QUICK__UNDEF, 222, 0, 0, 0},
+    {0, LXB_UNICODE_QUICK__UNDEF, 218, 0, 0, 0},
+    {0, LXB_UNICODE_QUICK__UNDEF, 132, 0, 0, 0},
     {0, LXB_UNICODE_QUICK__UNDEF, 6, 0, 0, 0},
-    {0, LXB_UNICODE_QUICK__UNDEF, 14, 0, 0, 0},
-    {0, LXB_UNICODE_QUICK__UNDEF, 36, 0, 0, 0},
-    {0, LXB_UNICODE_QUICK__UNDEF, 129, 0, 0, 232},
     {0, LXB_UNICODE_QUICK__UNDEF, 29, 0, 0, 0},
-    {0, LXB_UNICODE_QUICK__UNDEF, 24, 0, 0, 0},
-    {0, LXB_UNICODE_QUICK__UNDEF, 35, 0, 0, 0},
-    {0, LXB_UNICODE_QUICK__UNDEF, 17, 0, 0, 0},
-    {0, LXB_UNICODE_QUICK__UNDEF, 26, 0, 0, 0},
-    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 121},
-    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 136},
-    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 378},
-    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 12},
-    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 395},
-    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 437},
-    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 366},
-    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 369},
-    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 18},
-    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 341},
-    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 143},
-    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 131},
-    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 336},
-    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 373},
-    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 382},
-    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 31},
-    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 219},
-    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 191},
-    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 203},
-    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 170},
-    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 172},
-    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 156},
-    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 383},
-    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 421},
-    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 400},
-    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 120},
-    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 108},
-    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 205},
-    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 356},
-    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 112},
-    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 241},
-    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 174},
-    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 134},
-    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 352},
-    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 25},
-    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 384},
-    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 251},
-    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 186},
-    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 148},
-    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 115},
-    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 58},
-    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 113},
-    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 377},
-    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 211},
-    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 428},
-    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 337},
-    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 419},
-    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 342},
-    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 217},
-    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 452},
-    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 375},
-    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 434},
-    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 22},
-    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 396},
-    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 401},
-    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 6},
-    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 404},
+    {0, LXB_UNICODE_QUICK__UNDEF, 16, 0, 0, 0},
+    {0, LXB_UNICODE_QUICK__UNDEF, 33, 0, 0, 0},
+    {0, LXB_UNICODE_QUICK__UNDEF, 107, 0, 0, 0},
+    {0, LXB_UNICODE_QUICK__UNDEF, 214, 0, 0, 0},
+    {0, LXB_UNICODE_QUICK__UNDEF, 34, 0, 0, 0},
+    {0, LXB_UNICODE_QUICK__UNDEF, 23, 0, 0, 0},
+    {0, LXB_UNICODE_QUICK__UNDEF, 103, 0, 0, 0},
+    {0, LXB_UNICODE_QUICK__UNDEF, 25, 0, 0, 0},
+    {0, LXB_UNICODE_QUICK__UNDEF, 129, 0, 0, 232},
+    {0, LXB_UNICODE_QUICK__UNDEF, 15, 0, 0, 0},
+    {0, LXB_UNICODE_QUICK__UNDEF, 14, 0, 0, 0},
+    {0, LXB_UNICODE_QUICK__UNDEF, 84, 0, 0, 0},
+    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 423},
+    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 184},
+    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 228},
     {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 392},
-    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 182},
-    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 410},
-    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 11},
-    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 213},
-    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 157},
-    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 175},
-    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 397},
-    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 215},
-    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 150},
+    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 149},
     {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 201},
-    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 362},
-    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 360},
+    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 8},
+    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 391},
+    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 433},
+    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 183},
+    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 430},
+    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 108},
+    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 144},
+    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 339},
+    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 419},
+    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 235},
+    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 174},
+    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 29},
+    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 18},
     {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 432},
+    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 454},
+    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 138},
+    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 440},
+    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 387},
+    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 28},
+    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 22},
+    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 402},
+    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 197},
+    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 164},
+    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 30},
+    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 438},
+    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 177},
     {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 210},
-    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 415},
-    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 1},
+    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 49},
+    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 133},
+    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 236},
+    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 399},
+    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 403},
+    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 401},
     {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 38},
-    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 53},
-    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 41},
-    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 406},
-    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 137},
-    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 363},
-    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 206},
-    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 196},
-    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 425},
-    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 407},
-    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 179},
-    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 118},
-    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 168},
-    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 220},
-    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 50},
-    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 47},
-    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 440},
-    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 367},
-    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 2},
+    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 46},
+    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 348},
+    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 216},
+    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 27},
+    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 386},
+    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 366},
+    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 193},
     {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 238},
-    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 130},
-    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 222},
-    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 235},
-    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 155},
-    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 351},
-    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 347},
-    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 408},
-    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 243},
-    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 242},
-    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 142},
-    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 153},
-    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 141},
-    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 357},
-    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 371},
-    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 372},
-    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 436},
-    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 354},
-    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 4},
-    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 390},
-    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 145},
-    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 147},
-    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 202},
-    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 192},
+    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 107},
+    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 165},
     {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 227},
-    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 224},
-    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 161},
-    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 413},
-    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 252},
-    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 15},
-    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 166},
-    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 52},
-    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 23},
-    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 344},
-    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 248},
-    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 180},
-    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 77},
-    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 132},
-    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 19},
-    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 32},
-    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 189},
     {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 346},
-    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 391},
-    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 17},
-    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 39},
-    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 133},
-    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 414},
-    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 70},
-    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 380},
-    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 239},
-    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 430},
-    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 199},
-    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 30},
-    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 386},
-    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 247},
-    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 162},
+    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 345},
+    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 178},
+    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 251},
+    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 418},
+    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 152},
+    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 13},
+    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 119},
+    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 198},
+    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 231},
+    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 421},
+    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 114},
+    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 230},
+    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 181},
+    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 182},
+    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 175},
+    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 224},
+    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 409},
+    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 422},
+    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 246},
+    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 338},
+    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 352},
+    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 163},
+    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 203},
+    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 58},
     {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 48},
-    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 233},
-    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 125},
-    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 177},
+    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 169},
+    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 21},
+    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 362},
     {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 42},
-    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 441},
-    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 20},
-    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 8},
-    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 207},
-    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 37},
-    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 65},
-    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 349},
-    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 51},
-    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 46},
-    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 228},
-    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 411},
+    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 242},
+    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 195},
+    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 145},
+    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 217},
+    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 211},
+    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 385},
+    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 212},
+    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 350},
+    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 132},
+    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 44},
+    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 110},
+    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 10},
     {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 229},
-    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 154},
-    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 119},
-    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 237},
-    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 402},
-    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 35},
-    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 214},
+    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 455},
+    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 250},
+    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 241},
+    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 194},
+    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 451},
+    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 200},
+    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 45},
+    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 428},
+    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 347},
+    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 156},
+    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 252},
+    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 443},
+    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 176},
+    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 143},
+    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 2},
+    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 410},
+    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 186},
+    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 367},
+    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 359},
+    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 185},
+    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 240},
+    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 135},
+    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 115},
+    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 172},
+    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 12},
+    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 435},
+    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 146},
+    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 157},
+    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 249},
+    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 411},
+    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 414},
+    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 390},
+    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 142},
+    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 368},
+    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 234},
+    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 429},
+    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 245},
+    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 109},
+    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 378},
+    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 196},
+    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 191},
+    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 118},
+    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 379},
+    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 154},
     {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 43},
-    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 149},
-    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 412},
-    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 139},
-    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 195},
-    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 33},
-    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 197},
-    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 393},
-    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 244},
-    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 13},
-    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 370},
-    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 403},
-    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 358},
-    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 424},
+    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 213},
+    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 237},
+    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 415},
+    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 136},
+    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 65},
+    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 155},
+    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 351},
+    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 161},
+    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 434},
+    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 50},
     {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 223},
-    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 98},
-    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 230},
-    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 420},
-    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 123},
-    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 29},
+    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 356},
     {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 398},
-    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 209},
-    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 364},
-    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 236},
-    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 338},
-    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 212},
-    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 193},
-    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 173},
-    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 423},
-    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 431},
-    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 16},
-    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 240},
-    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 160},
-    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 167},
-    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 163},
-    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 343},
-    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 178},
-    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 218},
-    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 429},
+    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 336},
+    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 375},
+    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 199},
+    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 192},
+    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 436},
     {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 381},
-    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 3},
-    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 385},
-    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 27},
-    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 146},
-    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 34},
-    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 21},
-    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 454},
-    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 151},
-    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 231},
-    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 44},
-    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 443},
-    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 399},
-    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 190},
-    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 353},
-    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 124},
-    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 394},
+    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 41},
     {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 26},
-    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 387},
-    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 159},
+    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 416},
+    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 19},
+    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 248},
     {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 340},
+    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 33},
+    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 15},
+    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 125},
+    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 404},
+    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 412},
+    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 431},
+    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 25},
+    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 344},
+    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 220},
+    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 427},
+    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 5},
+    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 123},
+    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 139},
+    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 1},
+    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 162},
+    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 424},
+    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 397},
+    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 131},
+    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 7},
+    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 394},
+    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 121},
+    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 341},
     {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 9},
-    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 144},
+    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 205},
+    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 17},
     {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 36},
-    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 216},
-    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 355},
-    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 169},
-    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 348},
+    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 202},
+    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 413},
+    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 337},
+    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 16},
+    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 151},
+    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 373},
+    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 365},
+    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 408},
+    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 214},
     {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 448},
-    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 28},
-    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 376},
-    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 188},
-    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 122},
     {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 374},
-    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 389},
-    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 422},
-    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 45},
-    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 10},
-    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 365},
-    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 135},
-    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 138},
-    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 418},
-    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 379},
-    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 455},
-    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 183},
-    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 176},
-    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 110},
-    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 246},
-    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 164},
-    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 114},
-    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 368},
-    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 14},
-    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 451},
-    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 185},
-    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 339},
-    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 438},
-    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 171},
-    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 249},
-    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 388},
+    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 34},
     {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 24},
-    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 198},
-    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 184},
-    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 345},
-    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 245},
-    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 433},
-    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 40},
-    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 442},
-    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 107},
+    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 31},
+    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 363},
+    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 39},
+    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 407},
+    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 6},
+    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 187},
+    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 354},
+    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 150},
+    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 244},
+    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 32},
+    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 372},
+    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 382},
     {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 226},
-    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 49},
-    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 417},
-    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 109},
-    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 350},
-    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 5},
-    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 165},
-    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 361},
-    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 234},
-    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 435},
+    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 396},
+    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 153},
+    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 239},
     {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 204},
-    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 152},
-    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 194},
-    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 7},
-    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 208},
+    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 171},
+    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 437},
+    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 112},
     {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 140},
-    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 181},
-    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 359},
-    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 187},
-    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 158},
-    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 405},
-    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 111},
-    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 409},
-    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 416},
-    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 427},
-    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 200},
-    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 250}
-};
-
-static const lxb_unicode_idna_entry_t lxb_unicode_idna_entries[3923] =
-{
-    {0, 0, 0},
-    {LXB_UNICODE_IDNA_DISALLOWED, 0, 0},
-    {LXB_UNICODE_IDNA_VALID, 0, 0},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 673},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 532},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 27},
-    {LXB_UNICODE_IDNA_MAPPED, 3, 1976},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 5},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3511},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3641},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3528},
-    {LXB_UNICODE_IDNA_MAPPED, 3, 4264},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 327},
-    {LXB_UNICODE_IDNA_IGNORED, 0, 0},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 1635},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 301},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 66},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3328},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 1657},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 3820},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 4861},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 2218},
-    {LXB_UNICODE_IDNA_DEVIATION, 0, 0},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3267},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3229},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4376},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4990},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 627},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 1070},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 10},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 1060},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 3722},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 3738},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 2962},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 5062},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 1778},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 310},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 20},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 1812},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 3818},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 1434},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 290},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3646},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 154},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 24},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 2479},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4981},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3039},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3001},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 560},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 1059},
-    {LXB_UNICODE_IDNA_MAPPED, 3, 1848},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 253},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3443},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 2972},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 5391},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 442},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 22},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3403},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 297},
-    {LXB_UNICODE_IDNA_MAPPED, 3, 2730},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 2192},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 3766},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 3926},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 308},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 2188},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4623},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 1458},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 12},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 526},
-    {LXB_UNICODE_IDNA_MAPPED, 3, 1144},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3120},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 304},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4654},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 898},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 3579},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 706},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3053},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 314},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3732},
-    {LXB_UNICODE_IDNA_MAPPED, 3, 2525},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 1016},
-    {LXB_UNICODE_IDNA_MAPPED, 3, 1934},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 309},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3459},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 737},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 944},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 1678},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 5355},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3143},
-    {LXB_UNICODE_IDNA_MAPPED, 3, 4306},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4715},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4740},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 621},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 2605},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3848},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 1461},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3687},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4444},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 3838},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 344},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 6},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 5325},
-    {LXB_UNICODE_IDNA_MAPPED, 3, 4294},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 5219},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 1064},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 298},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 23},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 1814},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 3679},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 2074},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3413},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3657},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4679},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 2066},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3164},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 1816},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 2989},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 5089},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4939},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 26},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3645},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3485},
-    {LXB_UNICODE_IDNA_MAPPED, 3, 2000},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 1756},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 1799},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 2953},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3788},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 5190},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 2999},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 2},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 16},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 196},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 158},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 15},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 2956},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 3702},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 3752},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3383},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 1591},
-    {LXB_UNICODE_IDNA_MAPPED, 4, 1165},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 3840},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 377},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 659},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 1653},
-    {LXB_UNICODE_IDNA_MAPPED, 3, 2907},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 1614},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3221},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 2780},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 741},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 1652},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3471},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4457},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4385},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 5025},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 303},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 2534},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3665},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 2115},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 5291},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 397},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 922},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 25},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3750},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 1559},
-    {LXB_UNICODE_IDNA_MAPPED, 3, 1235},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3728},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 1062},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 3782},
-    {LXB_UNICODE_IDNA_MAPPED, 3, 2551},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 369},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 74},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 300},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4671},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 163},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 35},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 3848},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3488},
-    {LXB_UNICODE_IDNA_MAPPED, 3, 2720},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 2196},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4627},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 2046},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 8},
-    {LXB_UNICODE_IDNA_MAPPED, 3, 4204},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4635},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 446},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3474},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3824},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 5147},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 19},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4791},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 3587},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 710},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 972},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 735},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 720},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 21},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3762},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4530},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 294},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 5114},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 372},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 2191},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 307},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 638},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 3768},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 882},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 3850},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 519},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3433},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 760},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4622},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 985},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 299},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 316},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 484},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4478},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 863},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 3577},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3812},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 40},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 1664},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 1546},
-    {LXB_UNICODE_IDNA_MAPPED, 3, 2502},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 5271},
-    {LXB_UNICODE_IDNA_MAPPED, 3, 2334},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 3965},
-    {LXB_UNICODE_IDNA_MAPPED, 3, 4135},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 1477},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 3764},
-    {LXB_UNICODE_IDNA_MAPPED, 3, 4776},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 115},
-    {LXB_UNICODE_IDNA_MAPPED, 5, 2520},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3639},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3010},
-    {LXB_UNICODE_IDNA_MAPPED, 5, 2739},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 756},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 534},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 311},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 1767},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3214},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 3836},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 2202},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4616},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4996},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 5020},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 2098},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 352},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 5339},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 2056},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 466},
-    {LXB_UNICODE_IDNA_MAPPED, 3, 1979},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 750},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3411},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3228},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4708},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4982},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4500},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3720},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 3987},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 572},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 1811},
-    {LXB_UNICODE_IDNA_MAPPED, 4, 2269},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 1544},
-    {LXB_UNICODE_IDNA_MAPPED, 3, 4084},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 5202},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 14},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 1723},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 513},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 413},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 2678},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3186},
-    {LXB_UNICODE_IDNA_MAPPED, 3, 4300},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 3914},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4415},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 685},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 302},
-    {LXB_UNICODE_IDNA_MAPPED, 3, 1348},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4569},
-    {LXB_UNICODE_IDNA_MAPPED, 3, 1037},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 4843},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3522},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4989},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4792},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 9},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 315},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 766},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 1045},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 2199},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 37},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 478},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3083},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 859},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3075},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4396},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 317},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 156},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3344},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 785},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 251},
-    {LXB_UNICODE_IDNA_MAPPED, 3, 4150},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 462},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 532},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 5121},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3742},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 18},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 678},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 5078},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3169},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 3776},
-    {LXB_UNICODE_IDNA_MAPPED, 3, 2717},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 664},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 1392},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 5046},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 375},
-    {LXB_UNICODE_IDNA_MAPPED, 3, 1110},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3560},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 354},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 13},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 853},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 474},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 3856},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 2934},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 62},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4828},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 1706},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3836},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3768},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 2848},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3262},
-    {LXB_UNICODE_IDNA_MAPPED, 3, 4027},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 2641},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 437},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 5166},
-    {LXB_UNICODE_IDNA_MAPPED, 3, 2170},
-    {LXB_UNICODE_IDNA_MAPPED, 3, 4279},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 3786},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4452},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 5139},
-    {LXB_UNICODE_IDNA_MAPPED, 3, 1309},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4888},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3294},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3286},
-    {LXB_UNICODE_IDNA_MAPPED, 3, 1300},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3235},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 873},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4900},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 924},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 5278},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 5024},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 528},
-    {LXB_UNICODE_IDNA_MAPPED, 3, 1955},
-    {LXB_UNICODE_IDNA_MAPPED, 3, 1372},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 2101},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 1428},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3020},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 5376},
-    {LXB_UNICODE_IDNA_MAPPED, 3, 1991},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4592},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3472},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 1067},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4722},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 782},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 5189},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3048},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 5317},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 661},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 174},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 333},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3754},
-    {LXB_UNICODE_IDNA_MAPPED, 3, 1958},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3379},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 160},
-    {LXB_UNICODE_IDNA_MAPPED, 3, 2593},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 728},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4725},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4593},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3016},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 3778},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 1403},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 3558},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 289},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 846},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 3788},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 3842},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3429},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3158},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 5180},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 1759},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 1819},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 5113},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 631},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4442},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 153},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 1464},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4649},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3291},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 2173},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3355},
-    {LXB_UNICODE_IDNA_MAPPED, 3, 3883},
-    {LXB_UNICODE_IDNA_MAPPED, 3, 1339},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 2197},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 79},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3210},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 3615},
-    {LXB_UNICODE_IDNA_MAPPED, 3, 1916},
-    {LXB_UNICODE_IDNA_MAPPED, 3, 1187},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3285},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 3599},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 671},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 1672},
-    {LXB_UNICODE_IDNA_MAPPED, 3, 1011},
-    {LXB_UNICODE_IDNA_MAPPED, 3, 4920},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 5054},
-    {LXB_UNICODE_IDNA_MAPPED, 3, 4036},
-    {LXB_UNICODE_IDNA_MAPPED, 3, 4120},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 241},
-    {LXB_UNICODE_IDNA_MAPPED, 3, 4210},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 1066},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 3754},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 3977},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4495},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4660},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 381},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3661},
-    {LXB_UNICODE_IDNA_MAPPED, 3, 1994},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 1049},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 948},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 5385},
-    {LXB_UNICODE_IDNA_MAPPED, 3, 1360},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 34},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 363},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 2850},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3519},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3213},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3371},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 904},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 5032},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3080},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 2619},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 3792},
-    {LXB_UNICODE_IDNA_MAPPED, 3, 1333},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 31},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 29},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3074},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 1068},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 3726},
-    {LXB_UNICODE_IDNA_MAPPED, 3, 4147},
-    {LXB_UNICODE_IDNA_MAPPED, 5, 2251},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 2811},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 1718},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 1468},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 658},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 5077},
-    {LXB_UNICODE_IDNA_MAPPED, 3, 4081},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 1594},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3634},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 2680},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4576},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 1747},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 2201},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 77},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 91},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4571},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3484},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 5235},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3414},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4826},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 5142},
-    {LXB_UNICODE_IDNA_MAPPED, 3, 998},
-    {LXB_UNICODE_IDNA_MAPPED, 3, 1318},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 1541},
-    {LXB_UNICODE_IDNA_MAPPED, 3, 4132},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 379},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 3928},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 240},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 5011},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 5305},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 277},
-    {LXB_UNICODE_IDNA_MAPPED, 3, 1881},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 11},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 2050},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3452},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 17},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3028},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 56},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4970},
-    {LXB_UNICODE_IDNA_MAPPED, 3, 4189},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 5123},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 1813},
-    {LXB_UNICODE_IDNA_MAPPED, 3, 2381},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3521},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 842},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 3967},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 3877},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3367},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3772},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4790},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 3673},
-    {LXB_UNICODE_IDNA_MAPPED, 3, 2266},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 2802},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 1722},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 5314},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 5210},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4387},
-    {LXB_UNICODE_IDNA_MAPPED, 4, 4366},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 3985},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3476},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4499},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 1661},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 3844},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4477},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 5049},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 2959},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 367},
-    {LXB_UNICODE_IDNA_MAPPED, 3, 2499},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 399},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4527},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 3750},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 1153},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 239},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4689},
-    {LXB_UNICODE_IDNA_MAPPED, 3, 2337},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 1208},
-    {LXB_UNICODE_IDNA_MAPPED, 3, 1238},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3233},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 5033},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 329},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 284},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4494},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 542},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4636},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 3975},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 5173},
-    {LXB_UNICODE_IDNA_MAPPED, 3, 3538},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4798},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 865},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 491},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 89},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 868},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3448},
-    {LXB_UNICODE_IDNA_MAPPED, 3, 2554},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 0},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 2944},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 1029},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 1496},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 523},
-    {LXB_UNICODE_IDNA_MAPPED, 3, 2248},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 1744},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 7},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 975},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 762},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3870},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 1480},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 640},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 3728},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3524},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 3677},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 76},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 3589},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 695},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 1611},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3382},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 743},
-    {LXB_UNICODE_IDNA_MAPPED, 3, 4201},
-    {LXB_UNICODE_IDNA_MAPPED, 3, 2904},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3373},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4819},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3222},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 125},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 226},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 415},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 509},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3428},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4628},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 3758},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 237},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 3922},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 822},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 5090},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3209},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3487},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 360},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 2065},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4678},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3377},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 752},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4670},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 5065},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 342},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 1800},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 5181},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 5282},
-    {LXB_UNICODE_IDNA_MAPPED, 3, 1919},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 1530},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 2536},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 2071},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3013},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 2137},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 1673},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 2179},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3002},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 5365},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 5351},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 2598},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3366},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 855},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3776},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4714},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 2696},
-    {LXB_UNICODE_IDNA_MAPPED, 3, 1141},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 960},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3647},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 305},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 687},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3140},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 3736},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3050},
-    {LXB_UNICODE_IDNA_MAPPED, 3, 4129},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 1579},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 1658},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 480},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3123},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 2931},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 787},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4651},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3408},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 826},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 771},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 2219},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 2186},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 780},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3513},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3008},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 371},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 1065},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4751},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 5070},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 1775},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 5086},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 1377},
-    {LXB_UNICODE_IDNA_MAPPED, 4, 1269},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4942},
-    {LXB_UNICODE_IDNA_MAPPED, 3, 1931},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 5245},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 886},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 1677},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 233},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3197},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3264},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 117},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3330},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3640},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 1440},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 1636},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 920},
-    {LXB_UNICODE_IDNA_MAPPED, 3, 4192},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3656},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3525},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 225},
-    {LXB_UNICODE_IDNA_MAPPED, 3, 2733},
-    {LXB_UNICODE_IDNA_MAPPED, 4, 1281},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 3924},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 5145},
-    {LXB_UNICODE_IDNA_MAPPED, 3, 1952},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 1089},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 184},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 2997},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3652},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 428},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4727},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 726},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3017},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4591},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3247},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 550},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 3780},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4505},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 1180},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 1761},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 1395},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 5230},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4883},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3347},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4615},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3283},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4748},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 2168},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 124},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 424},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 2207},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3295},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 1185},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 3613},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 3603},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 1682},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 2123},
-    {LXB_UNICODE_IDNA_MAPPED, 3, 4042},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 1102},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4374},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 346},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 1745},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 798},
-    {LXB_UNICODE_IDNA_MAPPED, 3, 1084},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 3808},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4429},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4889},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 199},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 296},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4949},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 2846},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 486},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 903},
-    {LXB_UNICODE_IDNA_MAPPED, 3, 4141},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 1106},
-    {LXB_UNICODE_IDNA_MAPPED, 3, 2645},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3070},
-    {LXB_UNICODE_IDNA_MAPPED, 3, 4021},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 1033},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3084},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 28},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4395},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3644},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4378},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 1726},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 5375},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 2963},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 1467},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 5052},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 33},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 1545},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 871},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 1596},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 928},
-    {LXB_UNICODE_IDNA_MAPPED, 3, 2675},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3118},
-    {LXB_UNICODE_IDNA_MAPPED, 3, 1294},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4744},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 2993},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 2211},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 269},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3412},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 453},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 2131},
-    {LXB_UNICODE_IDNA_MAPPED, 3, 1291},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 794},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 106},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 5134},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 5244},
-    {LXB_UNICODE_IDNA_MAPPED, 3, 4075},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 5006},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 1421},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 1005},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 1069},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 2058},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 1690},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3061},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 1700},
-    {LXB_UNICODE_IDNA_MAPPED, 3, 1851},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 1602},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4976},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 406},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3663},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 1815},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4955},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 4017},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4983},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3326},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4816},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 96},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3667},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 5338},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 5205},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 2486},
-    {LXB_UNICODE_IDNA_MAPPED, 4, 4309},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4531},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 4423},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 3852},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 2986},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4473},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 1740},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 5330},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3275},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 1053},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3952},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3796},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 1665},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 3816},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 200},
-    {LXB_UNICODE_IDNA_MAPPED, 3, 1155},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 53},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4389},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 450},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 5040},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 5262},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 214},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 1528},
-    {LXB_UNICODE_IDNA_MAPPED, 3, 2331},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 1061},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4482},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4634},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3490},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 645},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 2102},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3696},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 701},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3279},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 5374},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4807},
-    {LXB_UNICODE_IDNA_MAPPED, 3, 4069},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 3806},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 5026},
-    {LXB_UNICODE_IDNA_MAPPED, 4, 2648},
-    {LXB_UNICODE_IDNA_MAPPED, 3, 2548},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 1754},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 991},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4390},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 966},
-    {LXB_UNICODE_IDNA_MAPPED, 3, 4757},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 530},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4969},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 5131},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 774},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 1529},
-    {LXB_UNICODE_IDNA_MAPPED, 3, 2892},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 139},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3378},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 1615},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3435},
-    {LXB_UNICODE_IDNA_MAPPED, 3, 4177},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 1396},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4609},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3220},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4825},
-    {LXB_UNICODE_IDNA_MAPPED, 5, 2376},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3066},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4458},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 2187},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 1607},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 5217},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 508},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 3762},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 675},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 212},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 5146},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 2076},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 3824},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 2206},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 1768},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 3993},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 5395},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 5099},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3348},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 812},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4471},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 94},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 2121},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3478},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 1757},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 1798},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 5290},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 505},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 4833},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4674},
-    {LXB_UNICODE_IDNA_MAPPED, 3, 4090},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 2061},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 273},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 1683},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 5056},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 2181},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3436},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 5345},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 280},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3144},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 5371},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4991},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 1509},
-    {LXB_UNICODE_IDNA_MAPPED, 3, 604},
-    {LXB_UNICODE_IDNA_MAPPED, 3, 1220},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4710},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 146},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 2658},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4506},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 5331},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4788},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 2607},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 962},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 5297},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 828},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 2096},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 1498},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 497},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 733},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 167},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 1738},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 1712},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 2189},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 3995},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4602},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 1589},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3125},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 2932},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 4421},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4567},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3671},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4655},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 318},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 966},
+    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 384},
+    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 218},
+    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 209},
+    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 343},
+    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 400},
+    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 215},
+    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 442},
+    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 124},
+    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 383},
+    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 369},
+    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 247},
+    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 208},
+    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 168},
+    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 377},
+    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 159},
+    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 406},
+    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 141},
+    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 130},
+    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 137},
+    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 70},
+    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 160},
+    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 420},
+    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 441},
+    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 179},
+    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 361},
+    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 23},
+    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 98},
+    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 364},
+    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 77},
+    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 52},
+    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 47},
+    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 20},
+    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 353},
+    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 395},
+    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 37},
+    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 35},
+    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 380},
+    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 393},
+    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 388},
+    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 219},
+    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 376},
+    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 358},
+    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 357},
+    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 53},
+    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 222},
+    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 355},
+    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 233},
+    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 342},
+    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 173},
+    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 40},
+    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 170},
+    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 417},
+    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 148},
+    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 389},
+    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 425},
+    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 189},
+    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 188},
+    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 51},
+    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 371},
+    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 180},
+    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 370},
+    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 190},
+    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 243},
+    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 360},
+    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 206},
+    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 349},
+    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 207},
+    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 134},
+    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 120},
+    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 4},
+    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 158},
+    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 405},
+    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 111},
+    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 3},
+    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 167},
+    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 166},
+    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 452},
+    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 122},
+    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 14},
+    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 113},
+    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 11},
+    {0, LXB_UNICODE_QUICK__UNDEF, 0, 0, 0, 147}
+};
+
+static const lxb_unicode_idna_entry_t lxb_unicode_idna_entries[3951] =
+{
+    {0, 0, 0},
+    {LXB_UNICODE_IDNA_VALID, 0, 0},
+    {LXB_UNICODE_IDNA_DISALLOWED, 0, 0},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 4880},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 12},
+    {LXB_UNICODE_IDNA_MAPPED, 3, 2238},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 301},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3672},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 709},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 952},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 3773},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3791},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 2092},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3055},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4399},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 310},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 3751},
     {LXB_UNICODE_IDNA_MAPPED, 1, 5337},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3276},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3054},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4743},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3515},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 653},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 1771},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 1779},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3352},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 5105},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 1379},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 5253},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 746},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4934},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 1687},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 2214},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 419},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3187},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3163},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3251},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 3804},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 778},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3529},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3332},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 2943},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 819},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 1634},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 1400},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 835},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3062},
-    {LXB_UNICODE_IDNA_MAPPED, 3, 2706},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3167},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3268},
-    {LXB_UNICODE_IDNA_MAPPED, 3, 2886},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 1603},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 1001},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 145},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 3708},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4549},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3331},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3530},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 81},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 3810},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 263},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 1631},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4581},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 5170},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 26},
+    {LXB_UNICODE_IDNA_IGNORED, 0, 0},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 34},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 16},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3673},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 2196},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4400},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 206},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 300},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 1718},
+    {LXB_UNICODE_IDNA_MAPPED, 3, 1324},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 1751},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 763},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3205},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3076},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3025},
+    {LXB_UNICODE_IDNA_MAPPED, 3, 4957},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 1597},
+    {LXB_UNICODE_IDNA_MAPPED, 18, 4343},
+    {LXB_UNICODE_IDNA_MAPPED, 4, 2439},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3769},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 1642},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 5347},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 184},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 5154},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 1701},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3564},
+    {LXB_UNICODE_IDNA_MAPPED, 4, 4332},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 5054},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 5},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 631},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4505},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 574},
+    {LXB_UNICODE_IDNA_MAPPED, 3, 2808},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3208},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 20},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 15},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 1722},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 6},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 862},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 2085},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 3759},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 391},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3464},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 317},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 4018},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 5038},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 871},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 27},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 442},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 5064},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3955},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 296},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4993},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4756},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4420},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 343},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 23},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3218},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 62},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 5282},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 0},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 79},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 5130},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 258},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 1472},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 3729},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 2079},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 3839},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 2131},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 33},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 681},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 837},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 512},
+    {LXB_UNICODE_IDNA_MAPPED, 3, 1081},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 304},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 667},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 938},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 761},
     {LXB_UNICODE_IDNA_MAPPED, 1, 3269},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3402},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 626},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4525},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3514},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 1510},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 1424},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 1820},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 1780},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 5287},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 5398},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 1378},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 1576},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 5096},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 2446},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 430},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 2660},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 178},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3503},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 2977},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 401},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3007},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4804},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 2183},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3166},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 2704},
-    {LXB_UNICODE_IDNA_MAPPED, 3, 2816},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 2190},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3124},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 1457},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 3554},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 175},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 1401},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 910},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4656},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3055},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 4839},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 5303},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3252},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4959},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 2180},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 642},
-    {LXB_UNICODE_IDNA_MAPPED, 3, 4779},
-    {LXB_UNICODE_IDNA_MAPPED, 3, 1367},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 496},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 220},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 1688},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3145},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4827},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 5361},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 409},
-    {LXB_UNICODE_IDNA_MAPPED, 3, 4766},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4713},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 319},
-    {LXB_UNICODE_IDNA_MAPPED, 3, 2609},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 82},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3353},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 611},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 1772},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3181},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 3812},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 5320},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4875},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 5223},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3660},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 5080},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 2078},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 2064},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4677},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3481},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 5107},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 2990},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 5152},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 5251},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 1795},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 5034},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 1758},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 2952},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 5172},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3432},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 3936},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3520},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3280},
-    {LXB_UNICODE_IDNA_MAPPED, 3, 3886},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 5030},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3515},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 1410},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4432},
     {LXB_UNICODE_IDNA_MAPPED, 1, 3376},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 157},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3381},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3217},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 455},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 291},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 1522},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 54},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 1169},
-    {LXB_UNICODE_IDNA_MAPPED, 3, 2901},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 1616},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 439},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 267},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 2983},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4459},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3098},
-    {LXB_UNICODE_IDNA_MAPPED, 3, 1288},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 3760},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 1049},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3664},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 448},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3736},
-    {LXB_UNICODE_IDNA_MAPPED, 3, 1162},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 221},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 1022},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 5300},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 128},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 2542},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 83},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 3991},
-    {LXB_UNICODE_IDNA_MAPPED, 3, 1126},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 2996},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 3940},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3162},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 1716},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3067},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 2694},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 1063},
-    {LXB_UNICODE_IDNA_MAPPED, 3, 2277},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 1608},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 1602},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3641},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 233},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3361},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 4002},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 1069},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4770},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 928},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 302},
+    {LXB_UNICODE_IDNA_MAPPED, 3, 2730},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3082},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 14},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 1091},
+    {LXB_UNICODE_IDNA_MAPPED, 3, 1330},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 2593},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 10},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3136},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 624},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 2998},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 2},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4494},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4495},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3723},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3382},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 1791},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4552},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 153},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3645},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3456},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 1501},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3439},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3757},
+    {LXB_UNICODE_IDNA_MAPPED, 3, 2263},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 293},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4983},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 21},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3193},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 852},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 457},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 3939},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4824},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3765},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 890},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3144},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 1555},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4621},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 24},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4662},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 4893},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4540},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 7},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4643},
+    {LXB_UNICODE_IDNA_MAPPED, 3, 3880},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 17},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4},
+    {LXB_UNICODE_IDNA_MAPPED, 3, 1345},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 18},
+    {LXB_UNICODE_IDNA_MAPPED, 3, 3574},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 797},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 13},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3644},
+    {LXB_UNICODE_IDNA_MAPPED, 3, 2006},
     {LXB_UNICODE_IDNA_MAPPED, 3, 4180},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4608},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 5182},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3426},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 359},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4631},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 1415},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 4852},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3308},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 5233},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4532},
-    {LXB_UNICODE_IDNA_MAPPED, 5, 2317},
-    {LXB_UNICODE_IDNA_MAPPED, 3, 1354},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4605},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 952},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 518},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 3854},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 2182},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 1793},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 901},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 987},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4476},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 1666},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 891},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 358},
-    {LXB_UNICODE_IDNA_MAPPED, 3, 2496},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 1420},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 934},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 4019},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 1478},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 2133},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 1560},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3099},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 1017},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 1716},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 368},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 2212},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 4011},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 5304},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 5015},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 11},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 5417},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 9},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4392},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3528},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 5142},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 5390},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 5128},
+    {LXB_UNICODE_IDNA_MAPPED, 3, 1979},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 77},
+    {LXB_UNICODE_IDNA_MAPPED, 3, 4078},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3293},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 1541},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 2658},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4716},
     {LXB_UNICODE_IDNA_MAPPED, 1, 5002},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 272},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 1527},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3138},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 3934},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 810},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 1098},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 1739},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 1500},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 1595},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 1703},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 5197},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 130},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3409},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 1804},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4572},
-    {LXB_UNICODE_IDNA_MAPPED, 3, 2666},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 806},
-    {LXB_UNICODE_IDNA_MAPPED, 3, 1321},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 1004},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4946},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4393},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4749},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 1629},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 731},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3085},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 356},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 712},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3073},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 4856},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4431},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4377},
-    {LXB_UNICODE_IDNA_MAPPED, 3, 4144},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 830},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 2840},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 2692},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 1577},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3161},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 722},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4371},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 908},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 954},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 1198},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4418},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 1416},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 1725},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 385},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 2940},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 3744},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 5384},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 245},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 5161},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 5241},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 3544},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3648},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 3609},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 833},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3500},
-    {LXB_UNICODE_IDNA_MAPPED, 3, 2159},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3296},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3215},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 3601},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 1727},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 816},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4904},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 5259},
-    {LXB_UNICODE_IDNA_MAPPED, 3, 4039},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4612},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4957},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 1523},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4726},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 3774},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 168},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4813},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4589},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 1746},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 1640},
-    {LXB_UNICODE_IDNA_MAPPED, 3, 1943},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 5171},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 1023},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 1760},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 2060},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4673},
-    {LXB_UNICODE_IDNA_MAPPED, 3, 4093},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 5050},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 1557},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 5261},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 5274},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 2111},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 2538},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3637},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4902},
-    {LXB_UNICODE_IDNA_MAPPED, 3, 2018},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 323},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3477},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 1027},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 2950},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 669},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 162},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4734},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 1762},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 2147},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 930},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 3944},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4891},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 3683},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 1535},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 5137},
-    {LXB_UNICODE_IDNA_MAPPED, 4, 1249},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4629},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 3692},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 3714},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 1474},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 2198},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 3874},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 325},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4815},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 799},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 629},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 2042},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 234},
-    {LXB_UNICODE_IDNA_MAPPED, 3, 2889},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4936},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 4865},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 3591},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 5117},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4411},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3180},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4977},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 1451},
-    {LXB_UNICODE_IDNA_MAPPED, 3, 980},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4397},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 3748},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 1817},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 3794},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 1743},
-    {LXB_UNICODE_IDNA_MAPPED, 4, 2457},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 5335},
-    {LXB_UNICODE_IDNA_MAPPED, 3, 1830},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 3999},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 312},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3027},
-    {LXB_UNICODE_IDNA_MAPPED, 4, 2288},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 292},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 3536},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 2774},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 249},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 257},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4483},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4391},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 5043},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 1190},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 1367},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4701},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3234},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 1071},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4985},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 1385},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4553},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 324},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 337},
-    {LXB_UNICODE_IDNA_MAPPED, 3, 2736},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3202},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 349},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4685},
-    {LXB_UNICODE_IDNA_MAPPED, 3, 4276},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 159},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 2034},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3561},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4584},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 3796},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3395},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 5000},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 2215},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 5058},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3188},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 143},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 1514},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 1553},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4948},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 180},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 2107},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3387},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 1438},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3038},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 682},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4738},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 1563},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3465},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3338},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 2975},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3455},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 2979},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 3685},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 690},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 2824},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 1025},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 3828},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 1455},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3407},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 2770},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 2216},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 3997},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 1578},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 306},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 1659},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4428},
-    {LXB_UNICODE_IDNA_MAPPED, 3, 4123},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4381},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4884},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 2224},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 197},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3655},
-    {LXB_UNICODE_IDNA_MAPPED, 3, 1177},
-    {LXB_UNICODE_IDNA_MAPPED, 3, 3959},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 1432},
-    {LXB_UNICODE_IDNA_MAPPED, 3, 1117},
-    {LXB_UNICODE_IDNA_MAPPED, 5, 2470},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 398},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4507},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 113},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4709},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 2926},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 803},
-    {LXB_UNICODE_IDNA_MAPPED, 3, 1842},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 538},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 3948},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4417},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4412},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 2205},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 2631},
-    {LXB_UNICODE_IDNA_MAPPED, 3, 1827},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 5328},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 725},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3069},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 5042},
-    {LXB_UNICODE_IDNA_MAPPED, 3, 2454},
-    {LXB_UNICODE_IDNA_MAPPED, 3, 4138},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3708},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 755},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3442},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 483},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 864},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 493},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 355},
-    {LXB_UNICODE_IDNA_MAPPED, 3, 1997},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 5394},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4665},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4427},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 2937},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 3932},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4702},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 880},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 521},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 761},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 1729},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3389},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 4005},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 5192},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3359},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3650},
-    {LXB_UNICODE_IDNA_MAPPED, 3, 3880},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 1647},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 1763},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 1731},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3282},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 414},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4648},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 652},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4937},
-    {LXB_UNICODE_IDNA_MAPPED, 3, 4225},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4441},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3430},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 246},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3241},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 2362},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4733},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 751},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3494},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3157},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 378},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 1390},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 5028},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 1644},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 432},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3035},
-    {LXB_UNICODE_IDNA_MAPPED, 3, 2590},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 1408},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 4753},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 740},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 5372},
-    {LXB_UNICODE_IDNA_MAPPED, 3, 1297},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3260},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 5136},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 1192},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 854},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 3826},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 473},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 313},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 5039},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 5103},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4380},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 232},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4472},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 3712},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 895},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4706},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 589},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4694},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 662},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 2768},
-    {LXB_UNICODE_IDNA_MAPPED, 5, 2481},
-    {LXB_UNICODE_IDNA_MAPPED, 4, 4313},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 479},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3103},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 858},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 5216},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 1564},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 3959},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 655},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 786},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4414},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 2758},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3185},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 5359},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 765},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 772},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 676},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4686},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 193},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 5132},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 2032},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4968},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3766},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3404},
-    {LXB_UNICODE_IDNA_MAPPED, 3, 1854},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 1386},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3451},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 1691},
-    {LXB_UNICODE_IDNA_MAPPED, 3, 1896},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 5295},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 2398},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 364},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3256},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 5143},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3312},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3635},
-    {LXB_UNICODE_IDNA_MAPPED, 3, 4072},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 3950},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 504},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 1552},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 1808},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 1749},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3638},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 2106},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3339},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 5187},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 3930},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 5059},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3636},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4802},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 104},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 2786},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3508},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 5083},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3523},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4898},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 528},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 1750},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 205},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 2664},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3024},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 1805},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 195},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 5067},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 1689},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 5195},
-    {LXB_UNICODE_IDNA_MAPPED, 4, 1257},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 1536},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 1454},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3309},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 5169},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 917},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 1724},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 1737},
-    {LXB_UNICODE_IDNA_MAPPED, 4, 2273},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 3989},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 101},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 2960},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 1047},
     {LXB_UNICODE_IDNA_MAPPED, 1, 387},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 635},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4501},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4707},
-    {LXB_UNICODE_IDNA_MAPPED, 3, 1863},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 5030},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 3625},
-    {LXB_UNICODE_IDNA_MAPPED, 3, 1899},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 1694},
-    {LXB_UNICODE_IDNA_MAPPED, 5, 2400},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3031},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3868},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 3746},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 293},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4436},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 3886},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 3952},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 1766},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 2756},
-    {LXB_UNICODE_IDNA_MAPPED, 3, 1073},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 3868},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 2203},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4643},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 256},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 194},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 5369},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3100},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 3954},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3669},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 1561},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 1079},
-    {LXB_UNICODE_IDNA_MAPPED, 4, 4325},
-    {LXB_UNICODE_IDNA_MAPPED, 3, 2575},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3127},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 5286},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3450},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3434},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 5094},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 1099},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 1471},
-    {LXB_UNICODE_IDNA_MAPPED, 3, 2314},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4695},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 5224},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3152},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3047},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 2998},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3380},
-    {LXB_UNICODE_IDNA_MAPPED, 3, 1940},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 1572},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 681},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4588},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4823},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 692},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3019},
-    {LXB_UNICODE_IDNA_MAPPED, 3, 4246},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3653},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 1641},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 3772},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4995},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 1409},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 1494},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 5362},
-    {LXB_UNICODE_IDNA_MAPPED, 3, 1327},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3401},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 78},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4611},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 4837},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3510},
-    {LXB_UNICODE_IDNA_MAPPED, 3, 286},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3372},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 1728},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 2929},
-    {LXB_UNICODE_IDNA_MAPPED, 4, 1055},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 2157},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 5184},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3360},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 204},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 339},
-    {LXB_UNICODE_IDNA_MAPPED, 3, 3541},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4453},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 3607},
-    {LXB_UNICODE_IDNA_MAPPED, 3, 4228},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 217},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3240},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 347},
-    {LXB_UNICODE_IDNA_MAPPED, 3, 2813},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 433},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4769},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 306},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 8},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3238},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3292},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4708},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 1582},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4394},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 5355},
+    {LXB_UNICODE_IDNA_MAPPED, 3, 4267},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4961},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 760},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 1810},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4596},
     {LXB_UNICODE_IDNA_MAPPED, 1, 3261},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3174},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 3742},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 2949},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 918},
-    {LXB_UNICODE_IDNA_MAPPED, 3, 2587},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4666},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 609},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 5249},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 247},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 5036},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4370},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 1391},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 2838},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3156},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4440},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 5129},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3343},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 2204},
-    {LXB_UNICODE_IDNA_MAPPED, 3, 3877},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 2633},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4647},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4580},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4392},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 320},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 1465},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3390},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 2965},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 643},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 3866},
-    {LXB_UNICODE_IDNA_MAPPED, 3, 3962},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3013},
+    {LXB_UNICODE_IDNA_MAPPED, 3, 2609},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 271},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3753},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 572},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 40},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3264},
     {LXB_UNICODE_IDNA_MAPPED, 1, 5311},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4642},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4510},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 660},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 2223},
+    {LXB_UNICODE_IDNA_MAPPED, 3, 4216},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3735},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 5075},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 25},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 22},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 3994},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 5367},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 332},
     {LXB_UNICODE_IDNA_MAPPED, 1, 713},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4739},
-    {LXB_UNICODE_IDNA_MAPPED, 3, 4303},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 489},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 1679},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 485},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 869},
-    {LXB_UNICODE_IDNA_MAPPED, 3, 1937},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 219},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3454},
-    {LXB_UNICODE_IDNA_MAPPED, 3, 2572},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 698},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 757},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 718},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 181},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 4003},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3151},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 3862},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 2819},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 1091},
-    {LXB_UNICODE_IDNA_MAPPED, 4, 2226},
-    {LXB_UNICODE_IDNA_MAPPED, 3, 1845},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 938},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 1492},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 5382},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 739},
-    {LXB_UNICODE_IDNA_MAPPED, 4, 2475},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 1566},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3507},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 361},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 1423},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3464},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 1511},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 382},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 3740},
-    {LXB_UNICODE_IDNA_MAPPED, 3, 4261},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3191},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3775},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3662},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 1440},
+    {LXB_UNICODE_IDNA_MAPPED, 4, 2340},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3481},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 2201},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 5329},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 5162},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3663},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 87},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 1651},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 3988},
+    {LXB_UNICODE_IDNA_MAPPED, 3, 1928},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3415},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 3719},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 1475},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 1681},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 5291},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3227},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4741},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3799},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 2929},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 1160},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 1768},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 1770},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3224},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 2223},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 825},
     {LXB_UNICODE_IDNA_MAPPED, 1, 5082},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4974},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3203},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 2217},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 1630},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 1443},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 2764},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4582},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 511},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 41},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 228},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 1040},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3564},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 793},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3406},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 3627},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 112},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3394},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4550},
-    {LXB_UNICODE_IDNA_MAPPED, 3, 4785},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 770},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 5239},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 964},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 767},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 99},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4630},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4486},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 374},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 2044},
-    {LXB_UNICODE_IDNA_MAPPED, 3, 4207},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 3765},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 149},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 3783},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 1762},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 2096},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 3892},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 2216},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 297},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 2205},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 2995},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 1017},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 315},
+    {LXB_UNICODE_IDNA_MAPPED, 5, 2400},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3050},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 3841},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4856},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3509},
     {LXB_UNICODE_IDNA_MAPPED, 1, 860},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3446},
-    {LXB_UNICODE_IDNA_MAPPED, 3, 2280},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 4403},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 2792},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 585},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 116},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 666},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 789},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 893},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3489},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 108},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 1060},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 360},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 5110},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 3962},
+    {LXB_UNICODE_IDNA_MAPPED, 4, 1281},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 1710},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3081},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 3676},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 711},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4818},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 530},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 968},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 80},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 157},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 175},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 445},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3643},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4968},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 274},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 3688},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3873},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 2966},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4522},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 5313},
+    {LXB_UNICODE_IDNA_MAPPED, 3, 1147},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 1703},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 28},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 5098},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 1389},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4384},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 1468},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 4875},
+    {LXB_UNICODE_IDNA_MAPPED, 3, 4057},
+    {LXB_UNICODE_IDNA_MAPPED, 3, 4153},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4721},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4764},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 2852},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3493},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3658},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 1672},
+    {LXB_UNICODE_IDNA_MAPPED, 3, 1351},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 2750},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 4863},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4531},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 88},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 54},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 728},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3431},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 2026},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 313},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 340},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3392},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 1367},
+    {LXB_UNICODE_IDNA_MAPPED, 3, 1824},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4489},
+    {LXB_UNICODE_IDNA_MAPPED, 4, 2788},
+    {LXB_UNICODE_IDNA_MAPPED, 3, 4048},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 3630},
     {LXB_UNICODE_IDNA_MAPPED, 2, 2540},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4672},
-    {LXB_UNICODE_IDNA_MAPPED, 3, 1324},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 1212},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 562},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 475},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3153},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 881},
+    {LXB_UNICODE_IDNA_MAPPED, 3, 1367},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3348},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3366},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 735},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4722},
+    {LXB_UNICODE_IDNA_MAPPED, 3, 4042},
+    {LXB_UNICODE_IDNA_MAPPED, 3, 1123},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 3819},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4443},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 1552},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 1571},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4657},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3394},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 2486},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 739},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 298},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 246},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 493},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 657},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3102},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 2774},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 3827},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 3797},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 1815},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 1061},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 311},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 4783},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 873},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3045},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4558},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4501},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 1045},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3516},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 793},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 1059},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 1739},
+    {LXB_UNICODE_IDNA_MAPPED, 3, 1232},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3088},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 5069},
+    {LXB_UNICODE_IDNA_MAPPED, 3, 1306},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 60},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4776},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 3883},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 277},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4754},
+    {LXB_UNICODE_IDNA_MAPPED, 3, 4222},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4753},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 1766},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 700},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3739},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4965},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 514},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 2926},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 5350},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 5316},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 1377},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 256},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3771},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3221},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 5051},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 2179},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 1063},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 1741},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 3686},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3779},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 1765},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 665},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3483},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3646},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 1653},
+    {LXB_UNICODE_IDNA_MAPPED, 4, 2241},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 19},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 948},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 3813},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 2108},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 809},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 354},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 2207},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 4406},
+    {LXB_UNICODE_IDNA_MAPPED, 5, 2309},
+    {LXB_UNICODE_IDNA_MAPPED, 3, 1220},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 5090},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 688},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3731},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 1683},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 3559},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 3588},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 205},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 2204},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 3982},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 117},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 376},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 791},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 507},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4649},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3563},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 1510},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 5286},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 3833},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4988},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3216},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 5079},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3511},
+    {LXB_UNICODE_IDNA_MAPPED, 3, 4105},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 96},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3299},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 1585},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3010},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 3674},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 1588},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4607},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 5071},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4463},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 58},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4520},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 3809},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 5223},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 109},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4674},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 954},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3397},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 696},
+    {LXB_UNICODE_IDNA_MAPPED, 3, 4886},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4389},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4382},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 427},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4671},
     {LXB_UNICODE_IDNA_MAPPED, 1, 1558},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 1491},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 5003},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 5301},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 2113},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 1483},
-    {LXB_UNICODE_IDNA_MAPPED, 3, 4249},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 1191},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 334},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 3906},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 4869},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 615},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 2778},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 1068},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 3743},
+    {LXB_UNICODE_IDNA_MAPPED, 3, 4063},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3400},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 2686},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 638},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 521},
+    {LXB_UNICODE_IDNA_MAPPED, 3, 2578},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4977},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3129},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 2798},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 135},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4963},
+    {LXB_UNICODE_IDNA_MAPPED, 3, 4033},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 1745},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 1675},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 204},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 2756},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4534},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4374},
+    {LXB_UNICODE_IDNA_MAPPED, 3, 1830},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 5205},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 384},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4602},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 5044},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 3626},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 1813},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3436},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3336},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3155},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 308},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 2762},
+    {LXB_UNICODE_IDNA_MAPPED, 3, 2835},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 1678},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 356},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4537},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3434},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 333},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 5405},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3640},
     {LXB_UNICODE_IDNA_MAPPED, 1, 1573},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3216},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 3734},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 3534},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3438},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 707},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3633},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4988},
-    {LXB_UNICODE_IDNA_MAPPED, 3, 3889},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 5265},
-    {LXB_UNICODE_IDNA_MAPPED, 3, 2015},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 781},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 1794},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 716},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 1742},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 5109},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 2149},
-    {LXB_UNICODE_IDNA_MAPPED, 3, 1330},
-    {LXB_UNICODE_IDNA_MAPPED, 3, 4099},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3304},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 5232},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3313},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 1590},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 133},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 122},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 5102},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 650},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 1702},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4568},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 1809},
-    {LXB_UNICODE_IDNA_MAPPED, 3, 1019},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3324},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 1748},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 5072},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3642},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 1486},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 3690},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 5188},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 1449},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 1158},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 423},
+    {LXB_UNICODE_IDNA_MAPPED, 4, 2492},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 2199},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 3721},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 5149},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 431},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 3927},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4642},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 5080},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 5123},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 2202},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3520},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 1608},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 1465},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4421},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3699},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3053},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 1383},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 1503},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 3735},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 3725},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 817},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3517},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3317},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4373},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 1605},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 5058},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 3823},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 2115},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 1565},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 3741},
     {LXB_UNICODE_IDNA_MAPPED, 1, 1720},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 177},
-    {LXB_UNICODE_IDNA_MAPPED, 3, 1869},
-    {LXB_UNICODE_IDNA_MAPPED, 3, 1893},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 1696},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 888},
-    {LXB_UNICODE_IDNA_MAPPED, 3, 4057},
+    {LXB_UNICODE_IDNA_MAPPED, 3, 3889},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 2963},
+    {LXB_UNICODE_IDNA_MAPPED, 3, 1110},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 1064},
+    {LXB_UNICODE_IDNA_MAPPED, 4, 2288},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 790},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3036},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 305},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 5013},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 5363},
+    {LXB_UNICODE_IDNA_MAPPED, 3, 1342},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3566},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 550},
+    {LXB_UNICODE_IDNA_MAPPED, 3, 4141},
+    {LXB_UNICODE_IDNA_MAPPED, 3, 1214},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 5166},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 5333},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3038},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4819},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3466},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 1424},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3354},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 1645},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 884},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 4014},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 661},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 5024},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3202},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 1744},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 962},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 1755},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 1099},
+    {LXB_UNICODE_IDNA_MAPPED, 3, 2554},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 1648},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 1022},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 2970},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 425},
+    {LXB_UNICODE_IDNA_MAPPED, 4, 4320},
+    {LXB_UNICODE_IDNA_MAPPED, 3, 1073},
     {LXB_UNICODE_IDNA_MAPPED, 1, 2097},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 2396},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3137},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 429},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 5023},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3030},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 353},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3104},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4464},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 386},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 186},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 5294},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 1565},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 1643},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 3883},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 2213},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 3979},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3116},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 727},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 548},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 182},
-    {LXB_UNICODE_IDNA_MAPPED, 6, 2744},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 5349},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 2135},
-    {LXB_UNICODE_IDNA_MAPPED, 4, 4333},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 166},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 3785},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 1066},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 2168},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3671},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3108},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 1106},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 1747},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3690},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3267},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 1382},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 576},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4748},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3378},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 807},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4391},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 2596},
+    {LXB_UNICODE_IDNA_MAPPED, 3, 4090},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 299},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 2824},
+    {LXB_UNICODE_IDNA_MAPPED, 3, 4279},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 1704},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 1817},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4905},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 1804},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4605},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4591},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 5361},
+    {LXB_UNICODE_IDNA_MAPPED, 3, 1288},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4630},
+    {LXB_UNICODE_IDNA_MAPPED, 3, 4084},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 1435},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 733},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4702},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 5252},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 5245},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 5216},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 2024},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3441},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4637},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 1443},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3191},
+    {LXB_UNICODE_IDNA_MAPPED, 3, 2015},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 35},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 3907},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 3753},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3418},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 370},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 3941},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4454},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 188},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 243},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3150},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3459},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4435},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3654},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3147},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 417},
+    {LXB_UNICODE_IDNA_MAPPED, 4, 1912},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 5026},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 1478},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3462},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 519},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 89},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3388},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 4008},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4482},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3530},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 362},
+    {LXB_UNICODE_IDNA_MAPPED, 3, 1973},
+    {LXB_UNICODE_IDNA_MAPPED, 3, 2593},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 1543},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3385},
+    {LXB_UNICODE_IDNA_MAPPED, 3, 2675},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 3955},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 5020},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 1191},
+    {LXB_UNICODE_IDNA_MAPPED, 3, 2381},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 2992},
+    {LXB_UNICODE_IDNA_MAPPED, 3, 2865},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3283},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 3705},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 83},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 145},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4920},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4378},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3101},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 371},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3234},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 1566},
     {LXB_UNICODE_IDNA_MAPPED, 1, 410},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 5060},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 1650},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 1100},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 5158},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 3710},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3444},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 1507},
+    {LXB_UNICODE_IDNA_DEVIATION, 0, 0},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 1430},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 344},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 3622},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4700},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 148},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 1785},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 1691},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 1514},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 1413},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 4901},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4626},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 5182},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4697},
+    {LXB_UNICODE_IDNA_MAPPED, 3, 1869},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 2951},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4547},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 2715},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4416},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 178},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4448},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 1547},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 2991},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 374},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 722},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3383},
+    {LXB_UNICODE_IDNA_MAPPED, 3, 1141},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 2643},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 5055},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 2182},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 1492},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 326},
+    {LXB_UNICODE_IDNA_MAPPED, 3, 4168},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 5092},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3534},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4564},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4478},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 2954},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 528},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 314},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 5394},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 1636},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3344},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3652},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 1194},
+    {LXB_UNICODE_IDNA_MAPPED, 3, 1291},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 1779},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3067},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3235},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4907},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 597},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 3867},
+    {LXB_UNICODE_IDNA_MAPPED, 3, 2454},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3311},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3346},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 355},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4577},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 1782},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3070},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4666},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4829},
+    {LXB_UNICODE_IDNA_MAPPED, 3, 1042},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 3937},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 5001},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 4012},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 2939},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 5118},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3028},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 37},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 3747},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 1616},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4726},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 5144},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 2422},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 1591},
     {LXB_UNICODE_IDNA_MAPPED, 3, 2359},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 3694},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 1792},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4693},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 366},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4561},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3493},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 5326},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4598},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 1582},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3014},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4721},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3654},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 1645},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 1407},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 390},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 1755},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 4847},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3400},
-    {LXB_UNICODE_IDNA_MAPPED, 3, 599},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 1502},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 121},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 67},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3236},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 454},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3358},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 2080},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 1732},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 2090},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3643},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 3593},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 5149},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 502},
-    {LXB_UNICODE_IDNA_MAPPED, 3, 4222},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 51},
-    {LXB_UNICODE_IDNA_MAPPED, 3, 4024},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 1731},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 3695},
+    {LXB_UNICODE_IDNA_MAPPED, 3, 1117},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 82},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3522},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 4426},
     {LXB_UNICODE_IDNA_MAPPED, 1, 440},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4403},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 676},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 167},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 742},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 879},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 1818},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 100},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 1724},
+    {LXB_UNICODE_IDNA_MAPPED, 3, 2901},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 5023},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 2190},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 163},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3248},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 915},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3047},
+    {LXB_UNICODE_IDNA_MAPPED, 3, 4192},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4975},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 1464},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 1610},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 3600},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 5420},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 5180},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 252},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 907},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 780},
+    {LXB_UNICODE_IDNA_MAPPED, 3, 4108},
+    {LXB_UNICODE_IDNA_MAPPED, 3, 4936},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4903},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3181},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3247},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 1404},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 672},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 1426},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3665},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4982},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 5203},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 602},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 2119},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 2692},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 1692},
+    {LXB_UNICODE_IDNA_MAPPED, 3, 1309},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 5213},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 5190},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 526},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 1484},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3745},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4827},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 162},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3492},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 3787},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 5238},
     {LXB_UNICODE_IDNA_MAPPED, 1, 897},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4664},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4938},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 3858},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4503},
-    {LXB_UNICODE_IDNA_MAPPED, 3, 1132},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 202},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 940},
-    {LXB_UNICODE_IDNA_MAPPED, 3, 2865},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3170},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 1730},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4548},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 2629},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 1628},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3112},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4750},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 2200},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 2966},
-    {LXB_UNICODE_IDNA_MAPPED, 3, 3956},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 5209},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 3981},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 1773},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 5316},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4443},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 968},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4512},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4465},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3354},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 5341},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 488},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4416},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 1370},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 5293},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 2826},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3253},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 699},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4932},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3119},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 668},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 467},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 841},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 4007},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 3552},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 1402},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 274},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 5167},
-    {LXB_UNICODE_IDNA_MAPPED, 3, 2880},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4794},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 2362},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 1515},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3461},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 874},
-    {LXB_UNICODE_IDNA_MAPPED, 3, 2443},
-    {LXB_UNICODE_IDNA_MAPPED, 3, 1303},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 2662},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 5390},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4886},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3004},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 1507},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 376},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 295},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 2083},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 1719},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 5053},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 1435},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 2094},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3456},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3136},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4524},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 137},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 634},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4554},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3042},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 5101},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3193},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 2220},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3201},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4565},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 1442},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 877},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3327},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 1587},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4601},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 4871},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 913},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3566},
-    {LXB_UNICODE_IDNA_MAPPED, 3, 4267},
-    {LXB_UNICODE_IDNA_MAPPED, 3, 4060},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 5009},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 807},
-    {LXB_UNICODE_IDNA_MAPPED, 4, 2292},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 3803},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3469},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 503},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 1759},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 3974},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 41},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4393},
+    {LXB_UNICODE_IDNA_MAPPED, 5, 2520},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3650},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 3691},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 2062},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 1198},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 2840},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 1079},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 316},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3125},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 679},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4837},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3648},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3402},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 396},
+    {LXB_UNICODE_IDNA_MAPPED, 3, 4309},
     {LXB_UNICODE_IDNA_MAPPED, 1, 3307},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 5138},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4488},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3425},
-    {LXB_UNICODE_IDNA_MAPPED, 3, 4183},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 2968},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 5203},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 1609},
-    {LXB_UNICODE_IDNA_MAPPED, 3, 2868},
-    {LXB_UNICODE_IDNA_MAPPED, 4, 2788},
-    {LXB_UNICODE_IDNA_MAPPED, 3, 2370},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3068},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 165},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 950},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 135},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3111},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 829},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4469},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 5378},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 5309},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 3784},
+    {LXB_UNICODE_IDNA_MAPPED, 3, 4069},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 5015},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4852},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4459},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 1727},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3114},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4676},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 942},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 2981},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 784},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 5256},
+    {LXB_UNICODE_IDNA_MAPPED, 3, 1318},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4586},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 1796},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 61},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 3925},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 1206},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 2764},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 991},
+    {LXB_UNICODE_IDNA_MAPPED, 3, 4804},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3323},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3638},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 110},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4473},
+    {LXB_UNICODE_IDNA_MAPPED, 4, 2505},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4380},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 1577},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 5368},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4438},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3016},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3096},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4470},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 364},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 2623},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3639},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 129},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3159},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3220},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 1743},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 934},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 3869},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 3551},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 5375},
     {LXB_UNICODE_IDNA_MAPPED, 1, 2946},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 1202},
-    {LXB_UNICODE_IDNA_MAPPED, 3, 1214},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 5021},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 1482},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 4001},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 3896},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3097},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 136},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 576},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4562},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 570},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 1583},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 418},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3440},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 351},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4979},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 3902},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 3938},
-    {LXB_UNICODE_IDNA_MAPPED, 3, 4066},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 817},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3281},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 5393},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 5270},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 745},
-    {LXB_UNICODE_IDNA_MAPPED, 3, 4914},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3320},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 1503},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 684},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 5044},
-    {LXB_UNICODE_IDNA_MAPPED, 3, 2003},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 1752},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 2145},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 471},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 2091},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 837},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3482},
-    {LXB_UNICODE_IDNA_MAPPED, 3, 4105},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 1534},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 5226},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 2070},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 2139},
+    {LXB_UNICODE_IDNA_MAPPED, 3, 1842},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 1519},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 1428},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 257},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 747},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3815},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 727},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3502},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 5250},
+    {LXB_UNICODE_IDNA_MAPPED, 5, 2317},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 5016},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 5321},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 1643},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 718},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 4781},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3373},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 372},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 1657},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3485},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4839},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 69},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 5294},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 783},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 3767},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 1098},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3242},
+    {LXB_UNICODE_IDNA_MAPPED, 3, 4234},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 312},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 66},
     {LXB_UNICODE_IDNA_MAPPED, 1, 5280},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 5255},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 1531},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 265},
-    {LXB_UNICODE_IDNA_MAPPED, 3, 2012},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 2987},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 5055},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4470},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 5238},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 5387},
-    {LXB_UNICODE_IDNA_MAPPED, 3, 4102},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 5165},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3497},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 516},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 3904},
-    {LXB_UNICODE_IDNA_MAPPED, 3, 2373},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 425},
-    {LXB_UNICODE_IDNA_MAPPED, 3, 47},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 1786},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3424},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4809},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4610},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 1638},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 648},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 591},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 1610},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3439},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3306},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 619},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 5247},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4454},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 1707},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 378},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 652},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 5254},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 5127},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 5409},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 217},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 670},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3422},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3851},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 5152},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3674},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3666},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 1454},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 118},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 686},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 781},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3655},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 3849},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 1736},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 2141},
+    {LXB_UNICODE_IDNA_MAPPED, 3, 4249},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 1526},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 2211},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3474},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 2210},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 181},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 1395},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3513},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3213},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 2936},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 5219},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 645},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 5373},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4735},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 5097},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 365},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4614},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 303},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 382},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 2071},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 151},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 3707},
+    {LXB_UNICODE_IDNA_MAPPED, 3, 2916},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 1687},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3019},
+    {LXB_UNICODE_IDNA_MAPPED, 3, 1893},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3711},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 3933},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4379},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4513},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3660},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 2844},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 3699},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3171},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3172},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3123},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 325},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3031},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 1029},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 5287},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 2942},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 2637},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 1190},
+    {LXB_UNICODE_IDNA_MAPPED, 4, 1245},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3325},
+    {LXB_UNICODE_IDNA_MAPPED, 3, 4093},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 1101},
+    {LXB_UNICODE_IDNA_MAPPED, 3, 1967},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 160},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 1799},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3253},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4843},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 475},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4526},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4467},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 2631},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4611},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3328},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 1802},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 1764},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4589},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 5276},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 2978},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3134},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 3923},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 2770},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 562},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3120},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 1733},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 5066},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 84},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4690},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 1015},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4439},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 5351},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 5040},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3187},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3117},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 1730},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 3986},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 2530},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3331},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 1534},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 3913},
+    {LXB_UNICODE_IDNA_MAPPED, 3, 1303},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 2068},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 3701},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 833},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 2046},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 2048},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 2536},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4375},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 2065},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3636},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3007},
     {LXB_UNICODE_IDNA_MAPPED, 1, 5122},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4519},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 1446},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 1753},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 3790},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 72},
-    {LXB_UNICODE_IDNA_MAPPED, 3, 2427},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 408},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 5012},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 2296},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4797},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 2782},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 1704},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4487},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 373},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 461},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 847},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3096},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 391},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 500},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4555},
-    {LXB_UNICODE_IDNA_MAPPED, 3, 2709},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3192},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 5092},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 438},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 50},
-    {LXB_UNICODE_IDNA_MAPPED, 3, 2883},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 2079},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3168},
+    {LXB_UNICODE_IDNA_MAPPED, 4, 2327},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 910},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 1629},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4998},
+    {LXB_UNICODE_IDNA_MAPPED, 3, 1005},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 1560},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 324},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 1664},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 5148},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 414},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 5260},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 5404},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 113},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 1401},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 2188},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 2147},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 3855},
+    {LXB_UNICODE_IDNA_MAPPED, 3, 4258},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 453},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3507},
+    {LXB_UNICODE_IDNA_MAPPED, 3, 4794},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3479},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 5274},
+    {LXB_UNICODE_IDNA_MAPPED, 3, 1851},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4822},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 67},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 2153},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 3861},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4431},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 1398},
+    {LXB_UNICODE_IDNA_MAPPED, 3, 4126},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 1419},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 895},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 1451},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3477},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 485},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 723},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 3972},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 5100},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 416},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 3680},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 1714},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 5379},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 1748},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4979},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 2212},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 568},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 4410},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 1169},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3211},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3455},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3839},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 3851},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4737},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 350},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 207},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 5388},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 3711},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 2073},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3167},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3229},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 917},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 5415},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 5265},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 906},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 1630},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 5340},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 542},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3064},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 1776},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 3745},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 834},
+    {LXB_UNICODE_IDNA_MAPPED, 4, 2475},
+    {LXB_UNICODE_IDNA_MAPPED, 4, 1269},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 422},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3341},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 644},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3367},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 5307},
+    {LXB_UNICODE_IDNA_MAPPED, 3, 2464},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3130},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 421},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3197},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3420},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 532},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3139},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4569},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 2185},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3668},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 1495},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4579},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 2036},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 1787},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 447},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 3535},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 2180},
+    {LXB_UNICODE_IDNA_MAPPED, 4, 1165},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4624},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 1498},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 1539},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 2187},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 2988},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4915},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 690},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 2183},
+    {LXB_UNICODE_IDNA_MAPPED, 3, 2720},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 1700},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 5334},
+    {LXB_UNICODE_IDNA_MAPPED, 3, 1991},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 5209},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 1520},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3166},
+    {LXB_UNICODE_IDNA_MAPPED, 4, 2648},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3657},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4518},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 239},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 5235},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 698},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 1049},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 5106},
+    {LXB_UNICODE_IDNA_MAPPED, 4, 1253},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4694},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4476},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 836},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4931},
+    {LXB_UNICODE_IDNA_MAPPED, 4, 1908},
+    {LXB_UNICODE_IDNA_MAPPED, 3, 4948},
     {LXB_UNICODE_IDNA_MAPPED, 1, 3421},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 3550},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4585},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3565},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3303},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3393},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 5284},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3198},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3651},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 867},
+    {LXB_UNICODE_IDNA_MAPPED, 3, 41},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 215},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 386},
+    {LXB_UNICODE_IDNA_MAPPED, 3, 2874},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3004},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 1062},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 2101},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 369},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 3871},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 470},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4572},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3278},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4664},
+    {LXB_UNICODE_IDNA_MAPPED, 3, 1952},
+    {LXB_UNICODE_IDNA_MAPPED, 3, 2883},
+    {LXB_UNICODE_IDNA_MAPPED, 4, 1363},
     {LXB_UNICODE_IDNA_MAPPED, 1, 5019},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 161},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3263},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 456},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3450},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4450},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 1753},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 706},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 1523},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 5424},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3488},
+    {LXB_UNICODE_IDNA_MAPPED, 3, 2427},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 1593},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 1481},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 156},
+    {LXB_UNICODE_IDNA_MAPPED, 3, 3959},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 2219},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 1698},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 4010},
+    {LXB_UNICODE_IDNA_MAPPED, 3, 2706},
     {LXB_UNICODE_IDNA_MAPPED, 2, 1171},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 457},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 1516},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 851},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4943},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 1437},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 1774},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 395},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4752},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 2084},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4542},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4386},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 1490},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 2974},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 5200},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3457},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 2980},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 1622},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 2185},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 2828},
-    {LXB_UNICODE_IDNA_MAPPED, 3, 4923},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 524},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4650},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4566},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 171},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 1588},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3092},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3049},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3139},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3659},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 2095},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4523},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 909},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4511},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3176},
-    {LXB_UNICODE_IDNA_MAPPED, 3, 1120},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 223},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 449},
-    {LXB_UNICODE_IDNA_MAPPED, 4, 2439},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 3807},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4916},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 850},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4682},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 5006},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 2192},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 613},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 926},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 259},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 106},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 121},
+    {LXB_UNICODE_IDNA_MAPPED, 3, 2698},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 1695},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 4867},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 74},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3408},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3059},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 5233},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3273},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 1461},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 1406},
+    {LXB_UNICODE_IDNA_MAPPED, 3, 4207},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3664},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 169},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 454},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 636},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 5207},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 1669},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4833},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 2123},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 3831},
+    {LXB_UNICODE_IDNA_MAPPED, 3, 4198},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 1624},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 413},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4729},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 5173},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 115},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 650},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 5094},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 477},
+    {LXB_UNICODE_IDNA_MAPPED, 3, 2373},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 1737},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3504},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4732},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 827},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 281},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 216},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 2366},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 3863},
     {LXB_UNICODE_IDNA_MAPPED, 1, 1508},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 2596},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 2193},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4646},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 3755},
+    {LXB_UNICODE_IDNA_MAPPED, 3, 1372},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 2955},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4720},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 878},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 285},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 358},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 3582},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 2982},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 1686},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 5380},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3427},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 357},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4717},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 987},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 230},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 611},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4635},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 745},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 901},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3659},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3296},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 196},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3391},
+    {LXB_UNICODE_IDNA_MAPPED, 3, 1970},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 1067},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 737},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 5228},
+    {LXB_UNICODE_IDNA_MAPPED, 4, 2384},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 1527},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 821},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 409},
+    {LXB_UNICODE_IDNA_MAPPED, 4, 1113},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3871},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4434},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 177},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 1049},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4773},
+    {LXB_UNICODE_IDNA_MAPPED, 3, 1135},
+    {LXB_UNICODE_IDNA_MAPPED, 3, 1312},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3085},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 2598},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3135},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4592},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 1805},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4913},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 5010},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 5401},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4498},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4703},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 1434},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4555},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 5261},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 3829},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3374},
+    {LXB_UNICODE_IDNA_MAPPED, 3, 4051},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 1656},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3362},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 165},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 819},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 411},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3190},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3365},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 731},
+    {LXB_UNICODE_IDNA_MAPPED, 3, 604},
+    {LXB_UNICODE_IDNA_MAPPED, 3, 1294},
+    {LXB_UNICODE_IDNA_MAPPED, 3, 2669},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 3769},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 0},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 1370},
+    {LXB_UNICODE_IDNA_MAPPED, 4, 4369},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 2102},
+    {LXB_UNICODE_IDNA_MAPPED, 3, 4231},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 3996},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 1423},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 3553},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 5292},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 668},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 359},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 5065},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 505},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3158},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 289},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 2283},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 5017},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 5319},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 1474},
+    {LXB_UNICODE_IDNA_MAPPED, 3, 1336},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 1706},
+    {LXB_UNICODE_IDNA_MAPPED, 3, 1839},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 5039},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 5029},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 2098},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3039},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 373},
     {LXB_UNICODE_IDNA_MAPPED, 2, 607},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 5381},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4800},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 322},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 3942},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 85},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3504},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3670},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4518},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3079},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 2621},
-    {LXB_UNICODE_IDNA_MAPPED, 3, 2424},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 5334},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 703},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3173},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3133},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 362},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 580},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 65},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4661},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 3946},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 2936},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 624},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 879},
-    {LXB_UNICODE_IDNA_MAPPED, 3, 4213},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 885},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 805},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 915},
-    {LXB_UNICODE_IDNA_MAPPED, 4, 1265},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 1002},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3651},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3291},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 439},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3265},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3266},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 231},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3288},
+    {LXB_UNICODE_IDNA_MAPPED, 3, 2502},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 1576},
+    {LXB_UNICODE_IDNA_MAPPED, 3, 1019},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 908},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3204},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3077},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 5008},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 4408},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 726},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 1384},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 904},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3051},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3052},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3027},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3080},
+    {LXB_UNICODE_IDNA_MAPPED, 4, 4328},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 5196},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 501},
+    {LXB_UNICODE_IDNA_MAPPED, 3, 3892},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 1529},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 3775},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 674},
+    {LXB_UNICODE_IDNA_MAPPED, 3, 2162},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 441},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3228},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 323},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4844},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4398},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 1455},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 899},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3524},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4746},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 2095},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 3781},
     {LXB_UNICODE_IDNA_MAPPED, 1, 5175},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 5156},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 1733},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3290},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 1627},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 5248},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3239},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4547},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 150},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 422},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 811},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4504},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 1787},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 1425},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 275},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 1404},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 5237},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 1646},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 1495},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 5352},
-    {LXB_UNICODE_IDNA_MAPPED, 3, 1226},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4690},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 1194},
-    {LXB_UNICODE_IDNA_MAPPED, 4, 4329},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4526},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3128},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 3704},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 5084},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3091},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 1660},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4801},
+    {LXB_UNICODE_IDNA_MAPPED, 3, 4144},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4658},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 748},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 1721},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4990},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 3817},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 3624},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 2546},
+    {LXB_UNICODE_IDNA_MAPPED, 3, 47},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 1758},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 108},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 3737},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4661},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4622},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 946},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 3789},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4834},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3351},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 75},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3468},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3379},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4490},
+    {LXB_UNICODE_IDNA_MAPPED, 3, 4810},
+    {LXB_UNICODE_IDNA_MAPPED, 3, 2572},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 983},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4493},
     {LXB_UNICODE_IDNA_MAPPED, 1, 3105},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 5212},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 5323},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 1475},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 2754},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3325},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4962},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 970},
-    {LXB_UNICODE_IDNA_MAPPED, 4, 2384},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3420},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4964},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 2971},
-    {LXB_UNICODE_IDNA_MAPPED, 3, 1884},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 2048},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 1791},
-    {LXB_UNICODE_IDNA_MAPPED, 3, 1866},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3302},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 1695},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 694},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 747},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 1422},
+    {LXB_UNICODE_IDNA_MAPPED, 3, 4039},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 2796},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 5087},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 1202},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4601},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4519},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4765},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 1811},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 1723},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4606},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 408},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 640},
     {LXB_UNICODE_IDNA_MAPPED, 1, 3314},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 3864},
+    {LXB_UNICODE_IDNA_MAPPED, 3, 1182},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 5186},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 5425},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4381},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 746},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 1489},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4768},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4967},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3178},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 2800},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3569},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 4865},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 5392},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 646},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4906},
+    {LXB_UNICODE_IDNA_MAPPED, 3, 1297},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 2999},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 1746},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 5081},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 1652},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 5146},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 380},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 5402},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 1637},
+    {LXB_UNICODE_IDNA_MAPPED, 8, 4361},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 5120},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 3886},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 50},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 90},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3209},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 499},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3498},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 2927},
+    {LXB_UNICODE_IDNA_MAPPED, 3, 4951},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 5047},
+    {LXB_UNICODE_IDNA_MAPPED, 4, 2234},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4417},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 1546},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 654},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 944},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 5300},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 5085},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3533},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4401},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 799},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 678},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 1738},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 5328},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 2224},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3223},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 684},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 1087},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3827},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 438},
+    {LXB_UNICODE_IDNA_MAPPED, 3, 4276},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 702},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 2106},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 663},
+    {LXB_UNICODE_IDNA_MAPPED, 3, 1872},
+    {LXB_UNICODE_IDNA_MAPPED, 3, 4297},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4755},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3260},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 5267},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 782},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 5341},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 720},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 5074},
+    {LXB_UNICODE_IDNA_MAPPED, 3, 2245},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 1567},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 172},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4855},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3011},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3443},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 1506},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 5188},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 474},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 740},
+    {LXB_UNICODE_IDNA_MAPPED, 3, 1821},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 2025},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 2542},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 2198},
+    {LXB_UNICODE_IDNA_MAPPED, 3, 1129},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3152},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 3970},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4723},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 5113},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3349},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 2932},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 64},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 5214},
+    {LXB_UNICODE_IDNA_MAPPED, 5, 2481},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 1570},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4533},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 1674},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 2754},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 468},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 3821},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3272},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4603},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4762},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 1814},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 911},
+    {LXB_UNICODE_IDNA_MAPPED, 3, 1300},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3042},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3103},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3500},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 883},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 5103},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3433},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 3919},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 1496},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 171},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4683},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 2784},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4487},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3312},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3389},
+    {LXB_UNICODE_IDNA_MAPPED, 3, 2581},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 3957},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3409},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3058},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 476},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 534},
+    {LXB_UNICODE_IDNA_MAPPED, 3, 2590},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 1032},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 769},
+    {LXB_UNICODE_IDNA_MAPPED, 3, 4054},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4655},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3396},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 2802},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 1554},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3151},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3463},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 1458},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4670},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 5296},
+    {LXB_UNICODE_IDNA_MAPPED, 3, 1011},
+    {LXB_UNICODE_IDNA_MAPPED, 3, 4075},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 2985},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 1584},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 1680},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 484},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 2958},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 352},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 526},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 5323},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 1065},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 5091},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 2109},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 3815},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3508},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 1609},
+    {LXB_UNICODE_IDNA_MAPPED, 3, 1988},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3414},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 2113},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 2962},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 415},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 2203},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 5346},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 3537},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 1438},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 5272},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 348},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3138},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 1378},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4921},
+    {LXB_UNICODE_IDNA_MAPPED, 3, 4270},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 4857},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 2221},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 291},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 1381},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 564},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 918},
+    {LXB_UNICODE_IDNA_MAPPED, 3, 4213},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 5315},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 307},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3196},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 1740},
+    {LXB_UNICODE_IDNA_MAPPED, 5, 2251},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 5096},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 232},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 848},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3480},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 1650},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 1649},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 5171},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4644},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4539},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 4006},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 471},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 2684},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 642},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3359},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3384},
+    {LXB_UNICODE_IDNA_MAPPED, 3, 3577},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 669},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 152},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 5133},
+    {LXB_UNICODE_IDNA_MAPPED, 3, 1919},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 2678},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 835},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4675},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 383},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4436},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 5061},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3527},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 319},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3458},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 538},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 1559},
     {LXB_UNICODE_IDNA_MAPPED, 1, 1540},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 5093},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 815},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 420},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 1810},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 341},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 5150},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 75},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3117},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 1623},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 5285},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 5178},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 834},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4543},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 1741},
-    {LXB_UNICODE_IDNA_MAPPED, 3, 4195},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3294},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 381},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3401},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 3945},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3146},
+    {LXB_UNICODE_IDNA_MAPPED, 3, 2393},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4388},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3405},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4771},
     {LXB_UNICODE_IDNA_MAPPED, 1, 4638},
-    {LXB_UNICODE_IDNA_MAPPED, 3, 2910},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 5017},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3232},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 68},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 1601},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3060},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 1035},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 129},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 902},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3384},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4986},
-    {LXB_UNICODE_IDNA_MAPPED, 3, 4165},
-    {LXB_UNICODE_IDNA_MAPPED, 3, 2027},
-    {LXB_UNICODE_IDNA_MAPPED, 3, 2560},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 5157},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3083},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 2603},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4641},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 3909},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3020},
+    {LXB_UNICODE_IDNA_MAPPED, 3, 2012},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 1807},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4926},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4395},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4705},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4496},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4553},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 1420},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 469},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 1500},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3437},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3438},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 2826},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4714},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 5396},
+    {LXB_UNICODE_IDNA_MAPPED, 4, 1261},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 473},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 635},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 546},
+    {LXB_UNICODE_IDNA_MAPPED, 3, 2832},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 1679},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4909},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4538},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 510},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 158},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 849},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3406},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 682},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4752},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 2090},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 1767},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 704},
+    {LXB_UNICODE_IDNA_MAPPED, 3, 2170},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4999},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 2178},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 922},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4749},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 1644},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 2100},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 3791},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3074},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3024},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 5034},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3188},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 1375},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 1638},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 5059},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 346},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4980},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3254},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 930},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4387},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 1386},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 1617},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 851},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 2224},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 1589},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 52},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 5178},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4525},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 3897},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4610},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 5338},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 483},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 3733},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 2081},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 2948},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 1471},
+    {LXB_UNICODE_IDNA_MAPPED, 6, 2303},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 2208},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 1491},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 5263},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 229},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 1604},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 1153},
+    {LXB_UNICODE_IDNA_MAPPED, 3, 1339},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 5014},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 1102},
+    {LXB_UNICODE_IDNA_MAPPED, 4, 2292},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 5192},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 697},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 1071},
+    {LXB_UNICODE_IDNA_MAPPED, 3, 4147},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 455},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 648},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 5204},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3184},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4923},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 956},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3449},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 823},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 581},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4442},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 97},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 3799},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 5161},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 3865},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 2776},
     {LXB_UNICODE_IDNA_MAPPED, 1, 248},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 5264},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 5198},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 2067},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4680},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3486},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 629},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 1482},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 749},
+    {LXB_UNICODE_IDNA_MAPPED, 3, 1093},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 4020},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 5164},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 5331},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 85},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 858},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 3980},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 5212},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3521},
+    {LXB_UNICODE_IDNA_MAPPED, 3, 4156},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 1462},
+    {LXB_UNICODE_IDNA_MAPPED, 3, 2904},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 2850},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 5227},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 633},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 1622},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 762},
+    {LXB_UNICODE_IDNA_MAPPED, 3, 2913},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 5304},
     {LXB_UNICODE_IDNA_MAPPED, 1, 5108},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 1550},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 2104},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 5234},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4947},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4668},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 3800},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 723},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 2766},
-    {LXB_UNICODE_IDNA_MAPPED, 4, 2488},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4960},
-    {LXB_UNICODE_IDNA_MAPPED, 3, 1285},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 3585},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 1735},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4976},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 3697},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 3949},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 1732},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 330},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 1613},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 1390},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 4428},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3503},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 3596},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 5176},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3343},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 367},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 2215},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 250},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3066},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 1778},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 924},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 4871},
+    {LXB_UNICODE_IDNA_MAPPED, 4, 2405},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 1521},
+    {LXB_UNICODE_IDNA_MAPPED, 3, 4306},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 591},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 622},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 375},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 587},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 98},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4475},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 716},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 203},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 2032},
+    {LXB_UNICODE_IDNA_MAPPED, 3, 1931},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 2952},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 798},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 2078},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 3717},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 1771},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4571},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4928},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 2989},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4740},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 1053},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 489},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4663},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3164},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4551},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 1515},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4919},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 692},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4696},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 3616},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 443},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3368},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 940},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4548},
+    {LXB_UNICODE_IDNA_MAPPED, 3, 2337},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 1518},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3005},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4597},
     {LXB_UNICODE_IDNA_MAPPED, 1, 4474},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4626},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 926},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 3718},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3274},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 2195},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 2184},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 3822},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4606},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3224},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4973},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 881},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 639},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4712},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 3814},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 3675},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 492},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3012},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 176},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 1416},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 1757},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 336},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4623},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 5317},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4709},
+    {LXB_UNICODE_IDNA_MAPPED, 3, 4123},
+    {LXB_UNICODE_IDNA_MAPPED, 3, 1946},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 214},
     {LXB_UNICODE_IDNA_MAPPED, 1, 5302},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 2532},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 530},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 52},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 1802},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 2025},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 445},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3346},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 169},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4731},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4892},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 5240},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 1675},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3280},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 1070},
+    {LXB_UNICODE_IDNA_MAPPED, 3, 2612},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 796},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 1662},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 331},
+    {LXB_UNICODE_IDNA_MAPPED, 3, 995},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 729},
     {LXB_UNICODE_IDNA_MAPPED, 1, 5383},
-    {LXB_UNICODE_IDNA_MAPPED, 3, 1925},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3501},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 3681},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 2224},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 5163},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 4419},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 2063},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4676},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 2951},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 1681},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 5073},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 5260},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3480},
-    {LXB_UNICODE_IDNA_MAPPED, 3, 2898},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 1656},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 5134},
+    {LXB_UNICODE_IDNA_MAPPED, 3, 4177},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 764},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3656},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 1025},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 2656},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 5411},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 861},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 5137},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3210},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 4412},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 826},
+    {LXB_UNICODE_IDNA_MAPPED, 3, 1144},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 57},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4617},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 1035},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 1716},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 2938},
+    {LXB_UNICODE_IDNA_MAPPED, 3, 3877},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3230},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 1452},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4402},
     {LXB_UNICODE_IDNA_MAPPED, 1, 5153},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 3846},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 1631},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 4004},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 859},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 1485},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3491},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 5279},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 5117},
+    {LXB_UNICODE_IDNA_MAPPED, 3, 2266},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 1561},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3489},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 1158},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 127},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 3547},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 5244},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 5251},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 893},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 3801},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 5360},
+    {LXB_UNICODE_IDNA_MAPPED, 3, 2727},
     {LXB_UNICODE_IDNA_MAPPED, 1, 3246},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 0},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 70},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4814},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 1394},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 843},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 2643},
-    {LXB_UNICODE_IDNA_MAPPED, 3, 2448},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 261},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 663},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4716},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 896},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 5310},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4432},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3468},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 3732},
-    {LXB_UNICODE_IDNA_MAPPED, 3, 1821},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3009},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 627},
+    {LXB_UNICODE_IDNA_MAPPED, 3, 1360},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 2972},
+    {LXB_UNICODE_IDNA_MAPPED, 3, 1854},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3243},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 824},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 5284},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 1790},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4582},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3667},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4930},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 795},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 5412},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 3837},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 2129},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4511},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 3921},
+    {LXB_UNICODE_IDNA_MAPPED, 3, 1357},
+    {LXB_UNICODE_IDNA_MAPPED, 3, 1887},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 280},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 5139},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 3574},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4701},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 5268},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 495},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 338},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 5385},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 1409},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 5342},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 1445},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 754},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 191},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3330},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3100},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3018},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3284},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 3915},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 444},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4757},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3097},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 2050},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4469},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 491},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 126},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 342},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 1752},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3413},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 295},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 2979},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 1596},
+    {LXB_UNICODE_IDNA_MAPPED, 3, 2436},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 56},
     {LXB_UNICODE_IDNA_MAPPED, 1, 3071},
-    {LXB_UNICODE_IDNA_MAPPED, 3, 1315},
-    {LXB_UNICODE_IDNA_MAPPED, 3, 1135},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 1783},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3173},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 2084},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 3757},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3347},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3310},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 736},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 5046},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4506},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3122},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 2811},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4688},
+    {LXB_UNICODE_IDNA_MAPPED, 4, 1277},
+    {LXB_UNICODE_IDNA_MAPPED, 3, 4096},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 1532},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4853},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 2195},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4457},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4679},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 294},
+    {LXB_UNICODE_IDNA_MAPPED, 3, 1354},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 446},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 875},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4481},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 1699},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 5378},
+    {LXB_UNICODE_IDNA_MAPPED, 3, 2709},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 423},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 125},
     {LXB_UNICODE_IDNA_MAPPED, 1, 2209},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 623},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 2941},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3045},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3398},
-    {LXB_UNICODE_IDNA_MAPPED, 3, 2727},
-    {LXB_UNICODE_IDNA_MAPPED, 3, 4285},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4881},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3021},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 1735},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4803},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4595},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4475},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 5397},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 946},
-    {LXB_UNICODE_IDNA_MAPPED, 4, 2492},
-    {LXB_UNICODE_IDNA_MAPPED, 3, 1964},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 190},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 1456},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 3798},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 365},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 823},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 507},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 2925},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 1463},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3076},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 2178},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4450},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4961},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 2806},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4711},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3244},
-    {LXB_UNICODE_IDNA_MAPPED, 3, 4153},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 254},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3369},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 5321},
-    {LXB_UNICODE_IDNA_MAPPED, 3, 2922},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 3619},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3499},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 3556},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3254},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3218},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3177},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 2854},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4683},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4993},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 867},
-    {LXB_UNICODE_IDNA_MAPPED, 3, 4763},
-    {LXB_UNICODE_IDNA_MAPPED, 3, 1988},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4967},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 5368},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 1383},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4373},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 80},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 4841},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3336},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3287},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 111},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4742},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 783},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 5016},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3044},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 646},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 5095},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 1469},
-    {LXB_UNICODE_IDNA_MAPPED, 3, 4078},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 330},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 2208},
-    {LXB_UNICODE_IDNA_MAPPED, 3, 1005},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4578},
-    {LXB_UNICODE_IDNA_MAPPED, 4, 1245},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3072},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 370},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 2684},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4617},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4822},
-    {LXB_UNICODE_IDNA_MAPPED, 3, 2260},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 243},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4430},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 1450},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 711},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 4407},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 462},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3495},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3240},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4415},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4451},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 3779},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4734},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 5416},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4669},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4615},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 1089},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 516},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 31},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 327},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3232},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 2070},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 1749},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 5389},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 1633},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 5365},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3487},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 1709},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 170},
+    {LXB_UNICODE_IDNA_MAPPED, 3, 4255},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 2189},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 3853},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 2145},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 815},
+    {LXB_UNICODE_IDNA_MAPPED, 5, 2376},
+    {LXB_UNICODE_IDNA_MAPPED, 3, 2314},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 5259},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 265},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 5224},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4849},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 1563},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 2935},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 3998},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 1397},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3404},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3476},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4733},
+    {LXB_UNICODE_IDNA_MAPPED, 3, 4210},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 5112},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 978},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 1665},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 5240},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 5247},
+    {LXB_UNICODE_IDNA_MAPPED, 3, 1226},
+    {LXB_UNICODE_IDNA_MAPPED, 3, 1860},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 385},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 5357},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4629},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 792},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 194},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4823},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 530},
+    {LXB_UNICODE_IDNA_MAPPED, 3, 4273},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 1668},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3109},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 2766},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 224},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 2528},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 523},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4570},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 1535},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 161},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 694},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 2184},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 1538},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 1499},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 2064},
     {LXB_UNICODE_IDNA_MAPPED, 1, 3416},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3178},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4479},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4699},
-    {LXB_UNICODE_IDNA_MAPPED, 4, 2505},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 1417},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 5106},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 1204},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 906},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 357},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4497},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 779},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4876},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3284},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 5154},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 3971},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 5250},
-    {LXB_UNICODE_IDNA_MAPPED, 3, 4126},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 1176},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4896},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 5170},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 5193},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 2119},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 4013},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3479},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 5066},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3212},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 350},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 2062},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4675},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 336},
-    {LXB_UNICODE_IDNA_MAPPED, 3, 4297},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 498},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 465},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 5128},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 683},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3431},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3033},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 689},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 2984},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3475},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 950},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 2479},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3305},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 155},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3355},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 3917},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3419},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 2054},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4691},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 5217},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 1729},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3116},
+    {LXB_UNICODE_IDNA_MAPPED, 3, 2557},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 5031},
+    {LXB_UNICODE_IDNA_MAPPED, 3, 1187},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 251},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 715},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3324},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 2786},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3001},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 1615},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4587},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 51},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 842},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 1798},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 920},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 2629},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3175},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 805},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 99},
+    {LXB_UNICODE_IDNA_MAPPED, 3, 2886},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 368},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 2838},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4847},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3015},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3094},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 402},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 3693},
+    {LXB_UNICODE_IDNA_MAPPED, 3, 4099},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 687},
+    {LXB_UNICODE_IDNA_MAPPED, 3, 1896},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3403},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 3606},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4514},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 432},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 5324},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 5050},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4677},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4842},
+    {LXB_UNICODE_IDNA_MAPPED, 3, 1905},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 508},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 958},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4517},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 5248},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 5242},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 5359},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 2945},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3318},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4728},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 140},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3182},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 1448},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4832},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 1045},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3048},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 1403},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 1402},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 5397},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 4424},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3505},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 2117},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 3825},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 2155},
+    {LXB_UNICODE_IDNA_MAPPED, 3, 4132},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 3875},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 2364},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 128},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 1003},
     {LXB_UNICODE_IDNA_MAPPED, 3, 2895},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 5162},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 791},
-    {LXB_UNICODE_IDNA_MAPPED, 5, 2344},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 1524},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 602},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 5299},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 566},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 515},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 2958},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 2026},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 3720},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 1521},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4698},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 183},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 3730},
-    {LXB_UNICODE_IDNA_MAPPED, 3, 4905},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 554},
-    {LXB_UNICODE_IDNA_MAPPED, 3, 1949},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 2509},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 738},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 568},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4480},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4806},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 271},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3415},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 3611},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 1796},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 5144},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 911},
-    {LXB_UNICODE_IDNA_MAPPED, 3, 1150},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 2125},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4614},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4618},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 426},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3008},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 5052},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 1628},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 5198},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 909},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3335},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 972},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 1625},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 816},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 3976},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 886},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 5156},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4969},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 774},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3128},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4994},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 966},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 186},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 2696},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 5423},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 1694},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 278},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 556},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 1590},
+    {LXB_UNICODE_IDNA_MAPPED, 5, 2417},
     {LXB_UNICODE_IDNA_MAPPED, 1, 5185},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 4405},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 140},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 4835},
-    {LXB_UNICODE_IDNA_MAPPED, 3, 2165},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 2682},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 443},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3444},
-    {LXB_UNICODE_IDNA_MAPPED, 4, 1908},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4419},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4971},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 913},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3451},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 5232},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 1819},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 818},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4462},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3454},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3249},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 424},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 2218},
+    {LXB_UNICODE_IDNA_MAPPED, 3, 3962},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 1611},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4986},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 5193},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 1760},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4932},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3300},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 2641},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 2639},
+    {LXB_UNICODE_IDNA_MAPPED, 3, 4138},
+    {LXB_UNICODE_IDNA_MAPPED, 3, 2871},
     {LXB_UNICODE_IDNA_MAPPED, 3, 1103},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 490},
-    {LXB_UNICODE_IDNA_MAPPED, 3, 2414},
-    {LXB_UNICODE_IDNA_MAPPED, 4, 2340},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 2844},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 5289},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 5037},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 3983},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 883},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 5098},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4375},
+    {LXB_UNICODE_IDNA_MAPPED, 3, 1964},
+    {LXB_UNICODE_IDNA_MAPPED, 3, 4165},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 1763},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 1803},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4590},
+    {LXB_UNICODE_IDNA_MAPPED, 3, 4129},
+    {LXB_UNICODE_IDNA_MAPPED, 3, 1955},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 5083},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 1431},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3329},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 5200},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3424},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 1512},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 3590},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 806},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 4404},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 361},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4545},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4650},
+    {LXB_UNICODE_IDNA_MAPPED, 3, 4945},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 717},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3170},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 1494},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 1027},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 3703},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 279},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 5308},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 290},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 2069},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 2038},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4973},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 218},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4566},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3370},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 5042},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 2044},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 2538},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 1734},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3121},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 964},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 5076},
     {LXB_UNICODE_IDNA_MAPPED, 1, 1414},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4632},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 1087},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4498},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 131},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 1031},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 5221},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 625},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4394},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 801},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3427},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 400},
-    {LXB_UNICODE_IDNA_MAPPED, 3, 4087},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 3698},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 1721},
-    {LXB_UNICODE_IDNA_MAPPED, 3, 2263},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 2544},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 4755},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 3969},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 574},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 1433},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 845},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 3617},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 436},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 5007},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 875},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 5104},
-    {LXB_UNICODE_IDNA_MAPPED, 3, 4156},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 71},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3505},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4877},
-    {LXB_UNICODE_IDNA_MAPPED, 3, 1306},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 2639},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3133},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 1784},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4578},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4559},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4502},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4777},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 808},
+    {LXB_UNICODE_IDNA_MAPPED, 3, 2712},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3089},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 377},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 2975},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3131},
+    {LXB_UNICODE_IDNA_MAPPED, 3, 2461},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 292},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4995},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 249},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 649},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 5060},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 5273},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3435},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3041},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 719},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 1627},
+    {LXB_UNICODE_IDNA_MAPPED, 3, 2159},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 5035},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3270},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 5183},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 5422},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 985},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 5021},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 2758},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 1676},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 779},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 406},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 628},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4535},
     {LXB_UNICODE_IDNA_MAPPED, 1, 4745},
-    {LXB_UNICODE_IDNA_MAPPED, 3, 2175},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3077},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4579},
-    {LXB_UNICODE_IDNA_MAPPED, 3, 2672},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 380},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 1632},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 633},
-    {LXB_UNICODE_IDNA_MAPPED, 3, 1961},
-    {LXB_UNICODE_IDNA_MAPPED, 3, 1985},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4594},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 179},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 5358},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 396},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4451},
-    {LXB_UNICODE_IDNA_MAPPED, 3, 4237},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 5347},
-    {LXB_UNICODE_IDNA_MAPPED, 3, 2808},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3370},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 5296},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 4015},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 5329},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3363},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4640},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3288},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4372},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 1412},
-    {LXB_UNICODE_IDNA_MAPPED, 4, 2327},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 2852},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3149},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 665},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 3756},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 5206},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 123},
-    {LXB_UNICODE_IDNA_MAPPED, 3, 2566},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 1385},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3506},
     {LXB_UNICODE_IDNA_MAPPED, 1, 892},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 132},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 2842},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4901},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3160},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 2690},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 1714},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 704},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3206},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 412},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 856},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4633},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 3916},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 825},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 309},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 2931},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 5132},
     {LXB_UNICODE_IDNA_MAPPED, 1, 1466},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 2961},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 749},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 558},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 2546},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 481},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3040},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 2652},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 86},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 2964},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 3895},
+    {LXB_UNICODE_IDNA_MAPPED, 3, 286},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 2200},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4396},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3287},
+    {LXB_UNICODE_IDNA_MAPPED, 3, 1315},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 683},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3529},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4830},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 3682},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4672},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3670},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3075},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 802},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 193},
+    {LXB_UNICODE_IDNA_MAPPED, 4, 1055},
+    {LXB_UNICODE_IDNA_MAPPED, 3, 1173},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 2099},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 3968},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 1457},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 653},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 1556},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3398},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3453},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 5215},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 3947},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 3771},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 2091},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3200},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3056},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 3953},
+    {LXB_UNICODE_IDNA_MAPPED, 4, 4312},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 5158},
+    {LXB_UNICODE_IDNA_MAPPED, 3, 2280},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4912},
+    {LXB_UNICODE_IDNA_MAPPED, 3, 998},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4648},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 3592},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 3586},
+    {LXB_UNICODE_IDNA_MAPPED, 3, 1982},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4651},
+    {LXB_UNICODE_IDNA_MAPPED, 3, 2666},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3169},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4715},
+    {LXB_UNICODE_IDNA_MAPPED, 3, 2919},
+    {LXB_UNICODE_IDNA_MAPPED, 3, 2600},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3301},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 2957},
+    {LXB_UNICODE_IDNA_MAPPED, 3, 4135},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 400},
+    {LXB_UNICODE_IDNA_MAPPED, 3, 1961},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 1180},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 5271},
+    {LXB_UNICODE_IDNA_MAPPED, 4, 1257},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 2984},
     {LXB_UNICODE_IDNA_MAPPED, 1, 788},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3219},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 332},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 1397},
-    {LXB_UNICODE_IDNA_MAPPED, 4, 1261},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 1459},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 1655},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3399},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 3872},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 884},
-    {LXB_UNICODE_IDNA_MAPPED, 3, 2238},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 255},
-    {LXB_UNICODE_IDNA_MAPPED, 3, 4240},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3248},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4590},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 281},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 1637},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 672},
-    {LXB_UNICODE_IDNA_MAPPED, 3, 1946},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 1570},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 5231},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 1797},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4950},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 1489},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 1676},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 1684},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 862},
-    {LXB_UNICODE_IDNA_MAPPED, 3, 1928},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3000},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 759},
-    {LXB_UNICODE_IDNA_MAPPED, 3, 4908},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 517},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 597},
-    {LXB_UNICODE_IDNA_MAPPED, 3, 2162},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 1586},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4704},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3298},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 5345},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4593},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4528},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 1806},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 202},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 1204},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 5000},
     {LXB_UNICODE_IDNA_MAPPED, 1, 4613},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3349},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4717},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4956},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3483},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 936},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 2155},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 5116},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4775},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 903},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4634},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3132},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4560},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4503},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3087},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3194},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 2993},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 3905},
+    {LXB_UNICODE_IDNA_MAPPED, 5, 2388},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4778},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4557},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3090},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4500},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 786},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3360},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 2819},
     {LXB_UNICODE_IDNA_MAPPED, 1, 213},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4681},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4536},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 2068},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 1539},
-    {LXB_UNICODE_IDNA_MAPPED, 3, 1229},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 5336},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 5207},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 2530},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 546},
-    {LXB_UNICODE_IDNA_MAPPED, 3, 2557},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 2954},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 138},
-    {LXB_UNICODE_IDNA_MAPPED, 3, 44},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4999},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4604},
-    {LXB_UNICODE_IDNA_MAPPED, 5, 2322},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 95},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 763},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3385},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 5243},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 1470},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4399},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 3583},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 5346},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3277},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 1710},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4625},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 736},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 2194},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 151},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 866},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4637},
-    {LXB_UNICODE_IDNA_MAPPED, 3, 2913},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 1801},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 5263},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 384},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 5051},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 416},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3410},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3666},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 5273},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 852},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 2994},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 730},
-    {LXB_UNICODE_IDNA_MAPPED, 3, 2669},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 693},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 680},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4669},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 192},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3223},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 340},
-    {LXB_UNICODE_IDNA_MAPPED, 3, 4168},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 463},
-    {LXB_UNICODE_IDNA_MAPPED, 3, 4198},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 3621},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 784},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 1604},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4817},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 2593},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3231},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 477},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3063},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 55},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 4854},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 1633},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 753},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 715},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 3700},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4879},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3460},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4534},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 1525},
-    {LXB_UNICODE_IDNA_MAPPED, 8, 4358},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 1047},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 1668},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4724},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3470},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4821},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3131},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 3597},
-    {LXB_UNICODE_IDNA_MAPPED, 3, 4291},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3417},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4981},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 1658},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3637},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3647},
+    {LXB_UNICODE_IDNA_MAPPED, 3, 1916},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 1437},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 398},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 2042},
+    {LXB_UNICODE_IDNA_MAPPED, 3, 4939},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 5407},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 5257},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 2925},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 5150},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 38},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4455},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 898},
+    {LXB_UNICODE_IDNA_MAPPED, 3, 4294},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 3843},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3148},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 5102},
+    {LXB_UNICODE_IDNA_MAPPED, 3, 2248},
     {LXB_UNICODE_IDNA_MAPPED, 1, 1479},
-    {LXB_UNICODE_IDNA_MAPPED, 3, 1147},
-    {LXB_UNICODE_IDNA_MAPPED, 3, 4033},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 912},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 405},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 2129},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3460},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 5125},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 1712},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3219},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 3678},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4453},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 5114},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 2105},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4925},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3044},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3386},
+    {LXB_UNICODE_IDNA_MAPPED, 3, 1037},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 5281},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 3880},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 237},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3061},
+    {LXB_UNICODE_IDNA_MAPPED, 3, 1321},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 2222},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 5095},
+    {LXB_UNICODE_IDNA_MAPPED, 3, 4087},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3275},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3257},
+    {LXB_UNICODE_IDNA_MAPPED, 3, 4282},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 5376},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 3684},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 180},
+    {LXB_UNICODE_IDNA_MAPPED, 3, 4285},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 1667},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 894},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 1444},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 675},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3499},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3661},
+    {LXB_UNICODE_IDNA_MAPPED, 3, 2018},
+    {LXB_UNICODE_IDNA_MAPPED, 3, 1333},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 2191},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 506},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 3978},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 647},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 5206},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 877},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 397},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4656},
+    {LXB_UNICODE_IDNA_MAPPED, 3, 2551},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 595},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3356},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4914},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3199},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 337},
+    {LXB_UNICODE_IDNA_MAPPED, 3, 4027},
+    {LXB_UNICODE_IDNA_MAPPED, 3, 2560},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 1646},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 785},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 2971},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3353},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3110},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4488},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 3805},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 284},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4600},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 3632},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 498},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3141},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 619},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4840},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4541},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3107},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 269},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 1537},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 490},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4763},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3518},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 1606},
+    {LXB_UNICODE_IDNA_MAPPED, 3, 1132},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3316},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 147},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3442},
+    {LXB_UNICODE_IDNA_MAPPED, 3, 2569},
+    {LXB_UNICODE_IDNA_MAPPED, 3, 1997},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 2947},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 2082},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 900},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3412},
+    {LXB_UNICODE_IDNA_MAPPED, 3, 1902},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4516},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3319},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4523},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4609},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3002},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 5427},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 4895},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4385},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3037},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 4800},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 154},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3000},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 366},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 5277},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 703},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 452},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 124},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 3572},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 4884},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 5086},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 5419},
     {LXB_UNICODE_IDNA_MAPPED, 1, 5179},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 1597},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 393},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 849},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 2210},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3211},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3318},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 956},
-    {LXB_UNICODE_IDNA_MAPPED, 3, 1878},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 402},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 1014},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 1699},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 216},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 5064},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 5031},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 1418},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 5155},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4496},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 102},
-    {LXB_UNICODE_IDNA_MAPPED, 3, 1351},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 383},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 5211},
+    {LXB_UNICODE_IDNA_MAPPED, 3, 4788},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 1441},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 912},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 1726},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 3811},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 2107},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 1580},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 829},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 5119},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 1684},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 5400},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 5262},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 932},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 328},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 479},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 5145},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 2220},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4991},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3245},
+    {LXB_UNICODE_IDNA_MAPPED, 3, 4225},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4826},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 379},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3046},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3484},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 1002},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 1654},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 481},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 5381},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3490},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 1476},
+    {LXB_UNICODE_IDNA_MAPPED, 4, 2269},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 190},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 197},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4619},
+    {LXB_UNICODE_IDNA_MAPPED, 3, 2260},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 3793},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 831},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3471},
+    {LXB_UNICODE_IDNA_MAPPED, 3, 1162},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 548},
+    {LXB_UNICODE_IDNA_MAPPED, 3, 1238},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 1574},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4654},
+    {LXB_UNICODE_IDNA_MAPPED, 3, 2496},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4529},
+    {LXB_UNICODE_IDNA_MAPPED, 5, 2739},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3099},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 1670},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 641},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4758},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 5048},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 223},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3446},
+    {LXB_UNICODE_IDNA_MAPPED, 3, 4813},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3430},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 1509},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4845},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 5195},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 5403},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4486},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3313},
     {LXB_UNICODE_IDNA_MAPPED, 1, 451},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 1548},
-    {LXB_UNICODE_IDNA_MAPPED, 4, 2256},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3449},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 5127},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 700},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 724},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3109},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 3912},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 1375},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 5071},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4971},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 1593},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 5085},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3003},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3512},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3087},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4747},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4577},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 5322},
-    {LXB_UNICODE_IDNA_MAPPED, 3, 1973},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 2100},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 258},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 155},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3329},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4728},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 447},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3041},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4379},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4449},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 2804},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 5367},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3368},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 5332},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 714},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3298},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4445},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 797},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 215},
-    {LXB_UNICODE_IDNA_MAPPED, 3, 1217},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 1499},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 907},
+    {LXB_UNICODE_IDNA_MAPPED, 3, 1833},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 1812},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 1429},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 5147},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 2194},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 2782},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 388},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 524},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 869},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3156},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3642},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 5121},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4761},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 5073},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 1549},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 1550},
+    {LXB_UNICODE_IDNA_MAPPED, 3, 2575},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 832},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3104},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 2544},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 2968},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 390},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 2806},
+    {LXB_UNICODE_IDNA_MAPPED, 4, 4336},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 449},
+    {LXB_UNICODE_IDNA_MAPPED, 4, 1265},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3350},
     {LXB_UNICODE_IDNA_MAPPED, 2, 1200},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4941},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 459},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 4425},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 206},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 2930},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3121},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4719},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 103},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 3569},
-    {LXB_UNICODE_IDNA_MAPPED, 3, 2859},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 2715},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3196},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 5126},
-    {LXB_UNICODE_IDNA_MAPPED, 3, 2698},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3271},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4448},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 5164},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3126},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 1782},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 809},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4433},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 644},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 494},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 282},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 1101},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 5379},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 63},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 581},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 2656},
-    {LXB_UNICODE_IDNA_MAPPED, 3, 1081},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 1399},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4723},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3250},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3015},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 1018},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 207},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 651},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3057},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4559},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4658},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 1651},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3333},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 1580},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 73},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 1380},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 836},
-    {LXB_UNICODE_IDNA_MAPPED, 3, 4030},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 1674},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4880},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 2088},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3147},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 1686},
-    {LXB_UNICODE_IDNA_MAPPED, 3, 1922},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3502},
-    {LXB_UNICODE_IDNA_MAPPED, 3, 1336},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 3595},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 983},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 1770},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3516},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4515},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 98},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 777},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 5269},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3351},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4820},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 2615},
-    {LXB_UNICODE_IDNA_MAPPED, 3, 1129},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 5124},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 2991},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 238},
-    {LXB_UNICODE_IDNA_MAPPED, 3, 4111},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 2518},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 3830},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 5342},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 587},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4462},
-    {LXB_UNICODE_IDNA_MAPPED, 3, 1076},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3309},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 1750},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4507},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 3739},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3206},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4854},
+    {LXB_UNICODE_IDNA_MAPPED, 3, 4045},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 1640},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 1659},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 5253},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 1569},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 5229},
+    {LXB_UNICODE_IDNA_MAPPED, 3, 2165},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 725},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 55},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 5004},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 139},
+    {LXB_UNICODE_IDNA_MAPPED, 3, 4240},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4747},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 673},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 3795},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 1004},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 1756},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3465},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 5426},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3286},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 5187},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 486},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 412},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3073},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3023},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 5372},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 1388},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3457},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 478},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 3901},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 2967},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 1600},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 1469},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 828},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3514},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3567},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 914},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 3899},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 2213},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 1391},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 2089},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 615},
+    {LXB_UNICODE_IDNA_MAPPED, 3, 4159},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 353},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 5236},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4835},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3033},
+    {LXB_UNICODE_IDNA_MAPPED, 3, 1008},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 1689},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 5009},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 236},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 5210},
+    {LXB_UNICODE_IDNA_MAPPED, 3, 2285},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 176},
+    {LXB_UNICODE_IDNA_MAPPED, 3, 4150},
+    {LXB_UNICODE_IDNA_MAPPED, 3, 2910},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 1769},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 3763},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3225},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 448},
+    {LXB_UNICODE_IDNA_MAPPED, 3, 1934},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3531},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 1772},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 566},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 1544},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4917},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3142},
+    {LXB_UNICODE_IDNA_MAPPED, 3, 2672},
+    {LXB_UNICODE_IDNA_MAPPED, 3, 1925},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4713},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 5028},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 2928},
+    {LXB_UNICODE_IDNA_MAPPED, 3, 4072},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3084},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 3889},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4772},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 772},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 2996},
+    {LXB_UNICODE_IDNA_MAPPED, 5, 2409},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4554},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4497},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4836},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 345},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 2398},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 173},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 419},
     {LXB_UNICODE_IDNA_MAPPED, 1, 5018},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 5315},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4795},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 983},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 5141},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4621},
-    {LXB_UNICODE_IDNA_MAPPED, 3, 2353},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3278},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 5366},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 832},
-    {LXB_UNICODE_IDNA_MAPPED, 3, 3574},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4461},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 1504},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4598},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3012},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4636},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 868},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 2607},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 5327},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 593},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4710},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4595},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 219},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 1809},
+    {LXB_UNICODE_IDNA_MAPPED, 3, 4954},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 3709},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3262},
+    {LXB_UNICODE_IDNA_MAPPED, 3, 2511},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 2615},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 5299},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 1579},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3295},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4707},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 3990},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 434},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4550},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4645},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 235},
+    {LXB_UNICODE_IDNA_MAPPED, 3, 2821},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3161},
+    {LXB_UNICODE_IDNA_MAPPED, 3, 2000},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 3580},
+    {LXB_UNICODE_IDNA_MAPPED, 3, 1848},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 1517},
+    {LXB_UNICODE_IDNA_MAPPED, 3, 1155},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3653},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 5053},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 1432},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 2950},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 853},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 94},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4574},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 458},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 4882},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 888},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 2987},
+    {LXB_UNICODE_IDNA_MAPPED, 3, 1943},
+    {LXB_UNICODE_IDNA_MAPPED, 3, 4120},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4962},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4667},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3339},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 166},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 3749},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3163},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3062},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 1774},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 2682},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 1096},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 5398},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 583},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4831},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4910},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3369},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 4889},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4479},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3003},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 1513},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4627},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3423},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 2030},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3276},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3338},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 2830},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4546},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 5131},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3478},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 3911},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 1522},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 496},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 5184},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 1418},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 1399},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 721},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 757},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4377},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4640},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 3610},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 732},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4692},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 2149},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 3857},
+    {LXB_UNICODE_IDNA_MAPPED, 3, 4261},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 1421},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 159},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3186},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3118},
+    {LXB_UNICODE_IDNA_MAPPED, 3, 4942},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 5049},
     {LXB_UNICODE_IDNA_MAPPED, 1, 5199},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4538},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 1618},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3122},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 5281},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 5048},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 5254},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 2995},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 188},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3445},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3419},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4570},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 1592},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 679},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 97},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4667},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 345},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 2099},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4808},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 434},
-    {LXB_UNICODE_IDNA_MAPPED, 3, 4174},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 503},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 1606},
-    {LXB_UNICODE_IDNA_MAPPED, 3, 4051},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3065},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 613},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 53},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 578},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 392},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 863},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 707},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 5335},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 5168},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 2066},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 275},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 662},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4751},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 488},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 5068},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 1621},
+    {LXB_UNICODE_IDNA_MAPPED, 3, 2175},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 2532},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 3984},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 1480},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 1486},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 5078},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 838},
+    {LXB_UNICODE_IDNA_MAPPED, 3, 2898},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 5032},
+    {LXB_UNICODE_IDNA_MAPPED, 5, 2298},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 3859},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 133},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3032},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 712},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 2943},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 552},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 500},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 3602},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 335},
     {LXB_UNICODE_IDNA_MAPPED, 1, 4972},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3227},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 813},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4491},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 90},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 5208},
-    {LXB_UNICODE_IDNA_MAPPED, 3, 4171},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 1617},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3300},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4998},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 1605},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3230},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3255},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3448},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 2633},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 1460},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 1618},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 1023},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 430},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 1800},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4588},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3252},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 322},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 767},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3326},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 73},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3333},
+    {LXB_UNICODE_IDNA_MAPPED, 3, 4201},
+    {LXB_UNICODE_IDNA_MAPPED, 3, 992},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 730},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 1531},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4632},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 621},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 5366},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 5231},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 1427},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4465},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 1816},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4604},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 856},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 2368},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 3847},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 29},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3095},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4687},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 5377},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4970},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 1447},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3174},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4730},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 461},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3306},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 522},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 655},
     {LXB_UNICODE_IDNA_MAPPED, 1, 4460},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3266},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3064},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 388},
-    {LXB_UNICODE_IDNA_MAPPED, 5, 2309},
     {LXB_UNICODE_IDNA_MAPPED, 2, 2052},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 403},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 916},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 1003},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 677},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3418},
-    {LXB_UNICODE_IDNA_MAPPED, 3, 4186},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4980},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3527},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 4774},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 5272},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 4009},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 5225},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 456},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 1777},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 5115},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 1542},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4653},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4388},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 1662},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3089},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 702},
-    {LXB_UNICODE_IDNA_MAPPED, 3, 1345},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3052},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 3581},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 5356},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4624},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 3900},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 2193},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4607},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4528},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 142},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 2603},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3142},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3658},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 427},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 3671},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3011},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 5307},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 2528},
-    {LXB_UNICODE_IDNA_MAPPED, 3, 4769},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 1476},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 152},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 5008},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4887},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 1685},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 5388},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3292},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 1769},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 2073},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 1671},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 5279},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3350},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 1781},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 5079},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 1398},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 1613},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 2933},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 1654},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3270},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4456},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3249},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 3920},
-    {LXB_UNICODE_IDNA_MAPPED, 3, 2835},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 792},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 1426},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3531},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3375},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 141},
-    {LXB_UNICODE_IDNA_MAPPED, 5, 2417},
-    {LXB_UNICODE_IDNA_MAPPED, 3, 2612},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 2087},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 5318},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4434},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3517},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3081},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 3724},
-    {LXB_UNICODE_IDNA_MAPPED, 3, 1223},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3146},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 1519},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4516},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4951},
-    {LXB_UNICODE_IDNA_MAPPED, 3, 1312},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 326},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 2654},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 1196},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 1381},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4587},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4657},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 2942},
-    {LXB_UNICODE_IDNA_MAPPED, 3, 4911},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 795},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3334},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 452},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 5045},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3056},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4558},
+    {LXB_UNICODE_IDNA_MAPPED, 3, 1884},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 334},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 560},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4684},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4484},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4848},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3407},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 626},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 1696},
     {LXB_UNICODE_IDNA_MAPPED, 3, 2701},
-    {LXB_UNICODE_IDNA_MAPPED, 4, 2723},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3165},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3662},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 732},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4729},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 1649},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3018},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 1663},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3051},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4652},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4529},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 3770},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 1736},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 1462},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 173},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3086},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 5357},
-    {LXB_UNICODE_IDNA_MAPPED, 3, 2600},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3365},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 831},
-    {LXB_UNICODE_IDNA_MAPPED, 3, 4045},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 2800},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3141},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 958},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 3605},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 775},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3265},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 974},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 252},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 1734},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 552},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3462},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3526},
-    {LXB_UNICODE_IDNA_MAPPED, 3, 1982},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 2054},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 5348},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 1429},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 64},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 469},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 148},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3297},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 1620},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 5061},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4997},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4540},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 647},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 231},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 1543},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 1776},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4746},
-    {LXB_UNICODE_IDNA_MAPPED, 3, 1042},
-    {LXB_UNICODE_IDNA_MAPPED, 4, 1241},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 328},
-    {LXB_UNICODE_IDNA_MAPPED, 4, 1277},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3082},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 1598},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3518},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3317},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 1445},
-    {LXB_UNICODE_IDNA_MAPPED, 3, 2245},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 978},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4493},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 1667},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 3973},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 667},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 1419},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 1051},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3132},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 5088},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4533},
-    {LXB_UNICODE_IDNA_MAPPED, 3, 1123},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 459},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4510},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 2977},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4681},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3410},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 854},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 5258},
+    {LXB_UNICODE_IDNA_MAPPED, 3, 2587},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4780},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3126},
+    {LXB_UNICODE_IDNA_MAPPED, 3, 1857},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 91},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 5364},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 282},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 5077},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 2111},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 1450},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 5218},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 1562},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 1487},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3021},
+    {LXB_UNICODE_IDNA_MAPPED, 3, 1223},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 759},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 905},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 395},
     {LXB_UNICODE_IDNA_MAPPED, 1, 839},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3208},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3293},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 5220},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 230},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4894},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 932},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3397},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 2127},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3108},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 5176},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 1569},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 1547},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 2988},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 435},
-    {LXB_UNICODE_IDNA_MAPPED, 3, 4117},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 2072},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 335},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 499},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 870},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 688},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 2985},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 827},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4455},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3473},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 1612},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 1526},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3374},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 2957},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 59},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 2089},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 1784},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 1427},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3237},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4718},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4737},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 1501},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4810},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 5174},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3466},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 5157},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 5246},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4940},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 149},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 69},
-    {LXB_UNICODE_IDNA_MAPPED, 3, 2009},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 1581},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4597},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4560},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 5333},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 4867},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 84},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3396},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 5256},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 321},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 127},
-    {LXB_UNICODE_IDNA_MAPPED, 4, 2234},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 3706},
-    {LXB_UNICODE_IDNA_MAPPED, 3, 4255},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 512},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 222},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 1575},
-    {LXB_UNICODE_IDNA_MAPPED, 3, 4270},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 866},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 5314},
     {LXB_UNICODE_IDNA_MAPPED, 1, 5353},
-    {LXB_UNICODE_IDNA_MAPPED, 3, 2430},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 634},
+    {LXB_UNICODE_IDNA_MAPPED, 3, 2877},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3214},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 4000},
+    {LXB_UNICODE_IDNA_MAPPED, 3, 4303},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 2186},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 1742},
     {LXB_UNICODE_IDNA_MAPPED, 3, 2467},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 889},
-    {LXB_UNICODE_IDNA_MAPPED, 3, 1839},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 5364},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4520},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 520},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 2974},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 5297},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 1018},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4841},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 5358},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 5325},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 1632},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3387},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 5241},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3231},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 664},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 3539},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 393},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 841},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 864},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 1661},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 752},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4567},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3669},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4414},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3241},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 2181},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 5289},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3494},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 1380},
+    {LXB_UNICODE_IDNA_MAPPED, 3, 2736},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 131},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 1533},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4492},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 5349},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 1793},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4583},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 2794},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4678},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 1725},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3112},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4966},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4997},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 558},
+    {LXB_UNICODE_IDNA_MAPPED, 3, 4024},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 2772},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 1483},
+    {LXB_UNICODE_IDNA_MAPPED, 4, 2514},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3093},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 2058},
     {LXB_UNICODE_IDNA_MAPPED, 1, 1023},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 637},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 1444},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 3860},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 802},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 2935},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3205},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 536},
-    {LXB_UNICODE_IDNA_MAPPED, 3, 2862},
-    {LXB_UNICODE_IDNA_MAPPED, 3, 2712},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3171},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 147},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3226},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3392},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4944},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 3631},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 844},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 126},
-    {LXB_UNICODE_IDNA_MAPPED, 3, 4054},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 2796},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 3908},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 2040},
-    {LXB_UNICODE_IDNA_MAPPED, 3, 4273},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3422},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4818},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 1701},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 5091},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3463},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4689},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4660},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4440},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 320},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 3731},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 5221},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 428},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 2060},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 3931},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3179},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 93},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 437},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 3935},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3304},
+    {LXB_UNICODE_IDNA_MAPPED, 3, 3886},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3177},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 5285},
+    {LXB_UNICODE_IDNA_MAPPED, 3, 1890},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3321},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 5160},
+    {LXB_UNICODE_IDNA_MAPPED, 3, 4186},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 1794},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4512},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4584},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 1463},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 2619},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 2662},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 363},
+    {LXB_UNICODE_IDNA_MAPPED, 3, 4111},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4767},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 2846},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 5278},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 263},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4738},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 5348},
+    {LXB_UNICODE_IDNA_MAPPED, 4, 2230},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 2990},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 433},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3497},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 3713},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 2074},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 2953},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 966},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 528},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 5318},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 132},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 554},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3236},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 5138},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 405},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 5343},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 5269},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3523},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 1599},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 2446},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3068},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 1780},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 144},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 5370},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 777},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 2087},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 5384},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3345},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 1635},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 5072},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 254},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4616},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 347},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 887},
     {LXB_UNICODE_IDNA_MAPPED, 1, 5283},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 2110},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 1484},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 1556},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 5063},
-    {LXB_UNICODE_IDNA_MAPPED, 3, 2021},
-    {LXB_UNICODE_IDNA_MAPPED, 3, 2916},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4574},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 2776},
-    {LXB_UNICODE_IDNA_MAPPED, 3, 3571},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4384},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 729},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 5069},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3093},
-    {LXB_UNICODE_IDNA_MAPPED, 3, 2356},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4620},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 900},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3386},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4799},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 3834},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 5324},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4463},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 5214},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 1538},
-    {LXB_UNICODE_IDNA_MAPPED, 4, 2514},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 2750},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 5125},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 2153},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4682},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 2069},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4963},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3110},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 876},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 1185},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 3777},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3281},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 179},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 255},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 92},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 1568},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3006},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 810},
+    {LXB_UNICODE_IDNA_MAPPED, 3, 4243},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 3845},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 2137},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 2135},
+    {LXB_UNICODE_IDNA_MAPPED, 3, 2331},
+    {LXB_UNICODE_IDNA_MAPPED, 3, 1866},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 1663},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 267},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 3618},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4698},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 1393},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3239},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 1412},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3472},
+    {LXB_UNICODE_IDNA_MAPPED, 3, 1875},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 509},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 5165},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 5332},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 5211},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 1415},
     {LXB_UNICODE_IDNA_MAPPED, 1, 1453},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 3696},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 1447},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3184},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4413},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 2760},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4705},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 110},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 5112},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 824},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 773},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3032},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 5047},
-    {LXB_UNICODE_IDNA_MAPPED, 5, 2409},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3172},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 5268},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 942},
-    {LXB_UNICODE_IDNA_MAPPED, 3, 1905},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 628},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3319},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 1096},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 331},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 3889},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3238},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 5257},
-    {LXB_UNICODE_IDNA_MAPPED, 4, 1253},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4619},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 674},
-    {LXB_UNICODE_IDNA_MAPPED, 3, 2006},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 5386},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 5140},
-    {LXB_UNICODE_IDNA_MAPPED, 3, 4288},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 5236},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4796},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3469},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4811},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4481},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 5013},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3037},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 487},
-    {LXB_UNICODE_IDNA_MAPPED, 3, 2511},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 5343},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4697},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 1788},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 2955},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4720},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 5076},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3154},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 5213},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 86},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3496},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3175},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 1411},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 211},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 242},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 224},
-    {LXB_UNICODE_IDNA_MAPPED, 3, 2581},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3362},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 1460},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3289},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 2928},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 709},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 5306},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 495},
-    {LXB_UNICODE_IDNA_MAPPED, 3, 4234},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4438},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4645},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 2752},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3391},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 2948},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3259},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 5380},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 691},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 2081},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 1389},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 5313},
-    {LXB_UNICODE_IDNA_MAPPED, 3, 1970},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 790},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 1624},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 2637},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3078},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 2973},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3342},
-    {LXB_UNICODE_IDNA_MAPPED, 3, 4159},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4878},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3242},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 338},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4544},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4965},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4945},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 1436},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3509},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 769},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 118},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 3910},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 5201},
-    {LXB_UNICODE_IDNA_MAPPED, 3, 4926},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 510},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 5168},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 201},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3341},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4398},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 3688},
-    {LXB_UNICODE_IDNA_MAPPED, 3, 4231},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 742},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 1487},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4541},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 654},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4899},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3005},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3388},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4575},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3361},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 1621},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4933},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 1410},
-    {LXB_UNICODE_IDNA_MAPPED, 3, 1890},
-    {LXB_UNICODE_IDNA_MAPPED, 3, 1357},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3258},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 1525},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 960},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 693},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 3873},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 5237},
+    {LXB_UNICODE_IDNA_MAPPED, 3, 1949},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 1528},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 261},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3426},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 2362},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4719},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 2652},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3165},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 536},
     {LXB_UNICODE_IDNA_MAPPED, 3, 2856},
-    {LXB_UNICODE_IDNA_MAPPED, 3, 2393},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3495},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 1441},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4688},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 431},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 2938},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3199},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 5010},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 1388},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 3571},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 4873},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 2798},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 5340},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3243},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 3956},
+    {LXB_UNICODE_IDNA_MAPPED, 3, 2859},
+    {LXB_UNICODE_IDNA_MAPPED, 3, 4171},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3428},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 1647},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 845},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 5116},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 975},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 429},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 1511},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 2034},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4580},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 5303},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 1788},
     {LXB_UNICODE_IDNA_MAPPED, 1, 3364},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 800},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4953},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4439},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4646},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 2635},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 540},
-    {LXB_UNICODE_IDNA_MAPPED, 3, 3874},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 522},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 2221},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3155},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 1032},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 641},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4692},
-    {LXB_UNICODE_IDNA_MAPPED, 3, 1342},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 444},
-    {LXB_UNICODE_IDNA_MAPPED, 3, 1967},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 5389},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 119},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4793},
-    {LXB_UNICODE_IDNA_MAPPED, 3, 2584},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3022},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4596},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 1785},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 1406},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 5022},
-    {LXB_UNICODE_IDNA_MAPPED, 3, 1902},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3036},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 5308},
-    {LXB_UNICODE_IDNA_MAPPED, 4, 2405},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3372},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 4022},
+    {LXB_UNICODE_IDNA_MAPPED, 4, 2723},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4544},
+    {LXB_UNICODE_IDNA_MAPPED, 3, 2448},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4446},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4445},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 418},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 5135},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4562},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 2780},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 659},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 517},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 511},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4471},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 789},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 1820},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3290},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 5330},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 5163},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 1612},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 811},
+    {LXB_UNICODE_IDNA_MAPPED, 3, 980},
+    {LXB_UNICODE_IDNA_MAPPED, 3, 1348},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3250},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 1210},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4724},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 3555},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3029},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 2940},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 1407},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 870},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 3549},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 5310},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 2125},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 1623},
     {LXB_UNICODE_IDNA_MAPPED, 4, 2349},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3492},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 5120},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 506},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 1532},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 5204},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 1765},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 2762},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 2141},
-    {LXB_UNICODE_IDNA_MAPPED, 3, 4917},
-    {LXB_UNICODE_IDNA_MAPPED, 3, 4114},
-    {LXB_UNICODE_IDNA_MAPPED, 3, 4219},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 4845},
-    {LXB_UNICODE_IDNA_MAPPED, 3, 1173},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 5228},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 593},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3321},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3357},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 1751},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3207},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 2784},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4704},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 3716},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 2969},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4696},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 894},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 134},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 5277},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4492},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4663},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 4772},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 1481},
-    {LXB_UNICODE_IDNA_MAPPED, 4, 2241},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 2945},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 5377},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 3962},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3183},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 2686},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3113},
-    {LXB_UNICODE_IDNA_MAPPED, 4, 2625},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 209},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 976},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 1803},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 2024},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 244},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 861},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 5292},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 768},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 3880},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 5350},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4466},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4691},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3225},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 2364},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 2222},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 476},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 4401},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 2794},
+    {LXB_UNICODE_IDNA_MAPPED, 3, 2353},
     {LXB_UNICODE_IDNA_MAPPED, 1, 5177},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 92},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4383},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 1473},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3090},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4952},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 905},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 3832},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 878},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 5159},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 5218},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 1537},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 5087},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 2151},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 5100},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 2109},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3026},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 1555},
-    {LXB_UNICODE_IDNA_MAPPED, 3, 2563},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 482},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3029},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 754},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 3532},
-    {LXB_UNICODE_IDNA_MAPPED, 5, 2388},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 526},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 670},
-    {LXB_UNICODE_IDNA_MAPPED, 3, 1887},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3200},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 630},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3301},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 279},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4573},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 2038},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4639},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 343},
-    {LXB_UNICODE_IDNA_MAPPED, 3, 4282},
-    {LXB_UNICODE_IDNA_MAPPED, 4, 2230},
-    {LXB_UNICODE_IDNA_MAPPED, 3, 2871},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 93},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4662},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 191},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 1639},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 203},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3649},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 195},
+    {LXB_UNICODE_IDNA_MAPPED, 3, 2892},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 813},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 3723},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 515},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3525},
+    {LXB_UNICODE_IDNA_MAPPED, 3, 1285},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 2094},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4743},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 2214},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 192},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 465},
+    {LXB_UNICODE_IDNA_MAPPED, 3, 4797},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 5027},
+    {LXB_UNICODE_IDNA_MAPPED, 3, 1229},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3183},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4918},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 1719},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 228},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 1690},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 2688},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3079},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 1728},
+    {LXB_UNICODE_IDNA_MAPPED, 3, 2430},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 2980},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 1594},
+    {LXB_UNICODE_IDNA_MAPPED, 3, 44},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 874},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3140},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4568},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 708},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3111},
     {LXB_UNICODE_IDNA_MAPPED, 1, 1439},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 210},
-    {LXB_UNICODE_IDNA_MAPPED, 3, 2464},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4517},
-    {LXB_UNICODE_IDNA_MAPPED, 3, 1836},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 5354},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 2623},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 2976},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3467},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 758},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 109},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 5327},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 2422},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3405},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 764},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 1405},
-    {LXB_UNICODE_IDNA_MAPPED, 3, 995},
-    {LXB_UNICODE_IDNA_MAPPED, 3, 1182},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 3918},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3204},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 348},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 464},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 5227},
-    {LXB_UNICODE_IDNA_MAPPED, 3, 4258},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4599},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 1584},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 278},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 657},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 857},
-    {LXB_UNICODE_IDNA_MAPPED, 3, 4858},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3491},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4563},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4736},
-    {LXB_UNICODE_IDNA_MAPPED, 3, 4216},
-    {LXB_UNICODE_IDNA_MAPPED, 4, 1912},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 1533},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 4829},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 2092},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 1670},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 2143},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3356},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 5392},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 5148},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 1504},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 472},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 229},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 1625},
-    {LXB_UNICODE_IDNA_MAPPED, 4, 1273},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 389},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 392},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 848},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4545},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 887},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 5160},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3006},
-    {LXB_UNICODE_IDNA_MAPPED, 3, 4929},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 5075},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3441},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4741},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 914},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3337},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 435},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 5012},
     {LXB_UNICODE_IDNA_MAPPED, 1, 1497},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 407},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 1693},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4975},
-    {LXB_UNICODE_IDNA_MAPPED, 3, 1860},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 1384},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3562},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4684},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 441},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 717},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3255},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3189},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 5068},
-    {LXB_UNICODE_IDNA_MAPPED, 3, 1138},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3668},
-    {LXB_UNICODE_IDNA_MAPPED, 3, 4048},
-    {LXB_UNICODE_IDNA_MAPPED, 3, 2919},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3506},
-    {LXB_UNICODE_IDNA_MAPPED, 4, 1363},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4508},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4437},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4644},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 3870},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 989},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4502},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3153},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 218},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 1764},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 259},
-    {LXB_UNICODE_IDNA_MAPPED, 4, 4321},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3046},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4893},
-    {LXB_UNICODE_IDNA_MAPPED, 3, 2578},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 1648},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4730},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 622},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 1493},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 1708},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4383},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 758},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 1379},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3137},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 116},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4929},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 199},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4542},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 1542},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 487},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3358},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3357},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4774},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3086},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3195},
+    {LXB_UNICODE_IDNA_MAPPED, 5, 2470},
+    {LXB_UNICODE_IDNA_MAPPED, 3, 2563},
+    {LXB_UNICODE_IDNA_MAPPED, 3, 2003},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 2997},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3198},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4499},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 341},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4556},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 756},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 2986},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3440},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 585},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 209},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 1502},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3143},
+    {LXB_UNICODE_IDNA_MAPPED, 3, 4300},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3297},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 2959},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4712},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 734},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 5305},
+    {LXB_UNICODE_IDNA_MAPPED, 3, 2880},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4647},
+    {LXB_UNICODE_IDNA_MAPPED, 3, 1994},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 494},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4846},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 5371},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 123},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 5226},
+    {LXB_UNICODE_IDNA_MAPPED, 3, 1985},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3381},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 3584},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3320},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 2110},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 2961},
     {LXB_UNICODE_IDNA_MAPPED, 1, 1697},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 5004},
-    {LXB_UNICODE_IDNA_MAPPED, 3, 1872},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 5014},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3437},
-    {LXB_UNICODE_IDNA_MAPPED, 4, 1113},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 1789},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 2704},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3072},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 768},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3057},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 200},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 3727},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4397},
+    {LXB_UNICODE_IDNA_MAPPED, 3, 2584},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 1601},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3377},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 112},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 857},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 65},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3060},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3203},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 5159},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4456},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 253},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 1754},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 2088},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4449},
     {LXB_UNICODE_IDNA_MAPPED, 1, 3034},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 696},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 2117},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 1568},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3107},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 5196},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 5267},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 5111},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3323},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4882},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 2970},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 3802},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3447},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 721},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 2103},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4484},
-    {LXB_UNICODE_IDNA_MAPPED, 3, 4337},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3134},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 5258},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4700},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3129},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 458},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4987},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3179},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 4409},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3316},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 1485},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 734},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 1599},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 411},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4812},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3115},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 235},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 556},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 5298},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 5029},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 5370},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4966},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4468},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4509},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 583},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 2368},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 1206},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3273},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 5312},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 3898},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 5194},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 1472},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3094},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4897},
-    {LXB_UNICODE_IDNA_MAPPED, 4, 4317},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 804},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4489},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 5151},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 2105},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 818},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 5081},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 822},
+    {LXB_UNICODE_IDNA_MAPPED, 4, 4324},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 609},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 101},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 660},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 750},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 889},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 1459},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 5239},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 5246},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 1641},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 1470},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 78},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 5356},
+    {LXB_UNICODE_IDNA_MAPPED, 3, 2370},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 671},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 766},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4731},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 714},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 2933},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3565},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 329},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4996},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 210},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 1702},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4978},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 5225},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3274},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 222},
+    {LXB_UNICODE_IDNA_MAPPED, 3, 4204},
+    {LXB_UNICODE_IDNA_MAPPED, 3, 4288},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 164},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3271},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 5025},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3043},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 5222},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3285},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 2635},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4760},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4524},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4964},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 1572},
+    {LXB_UNICODE_IDNA_MAPPED, 4, 2488},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3302},
     {LXB_UNICODE_IDNA_MAPPED, 1, 1551},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 100},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3025},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 2992},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 2030},
-    {LXB_UNICODE_IDNA_MAPPED, 3, 4162},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3563},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3059},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 1692},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 470},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 514},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 57},
-    {LXB_UNICODE_IDNA_MAPPED, 3, 1857},
-    {LXB_UNICODE_IDNA_MAPPED, 6, 2303},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 1600},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 3629},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 61},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3190},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 5074},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 87},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3423},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 5215},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4557},
-    {LXB_UNICODE_IDNA_MAPPED, 3, 2877},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 5035},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 814},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4527},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4386},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 1196},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4612},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3327},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 1801},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 2949},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 794},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 2296},
+    {LXB_UNICODE_IDNA_MAPPED, 3, 1827},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3315},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 3594},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 245},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 755},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3154},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4652},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4750},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4530},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 1671},
+    {LXB_UNICODE_IDNA_MAPPED, 6, 2744},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 460},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4989},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4653},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 2067},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 3634},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3106},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 2173},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 2534},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4376},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 855},
+    {LXB_UNICODE_IDNA_MAPPED, 3, 4877},
+    {LXB_UNICODE_IDNA_MAPPED, 3, 4036},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 138},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4817},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4561},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4504},
     {LXB_UNICODE_IDNA_MAPPED, 1, 4485},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3335},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4586},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 5363},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 2964},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 236},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 5130},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 1382},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 227},
-    {LXB_UNICODE_IDNA_MAPPED, 3, 2433},
-    {LXB_UNICODE_IDNA_MAPPED, 3, 4782},
-    {LXB_UNICODE_IDNA_MAPPED, 3, 4760},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4994},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4958},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 1518},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4521},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 5319},
-    {LXB_UNICODE_IDNA_MAPPED, 3, 1824},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 2981},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 2086},
-    {LXB_UNICODE_IDNA_MAPPED, 3, 2451},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3119},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 623},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 5057},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 2969},
+    {LXB_UNICODE_IDNA_MAPPED, 3, 2548},
+    {LXB_UNICODE_IDNA_MAPPED, 3, 4060},
+    {LXB_UNICODE_IDNA_MAPPED, 3, 1177},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3091},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 5043},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 5089},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3352},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4779},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 130},
+    {LXB_UNICODE_IDNA_MAPPED, 3, 1150},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 1400},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3510},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 2206},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3259},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 76},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 1442},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 2151},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 753},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 1176},
+    {LXB_UNICODE_IDNA_MAPPED, 3, 4264},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4639},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 5197},
     {LXB_UNICODE_IDNA_MAPPED, 1, 840},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4513},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 1393},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 1045},
-    {LXB_UNICODE_IDNA_MAPPED, 3, 992},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4824},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 5266},
-    {LXB_UNICODE_IDNA_MAPPED, 3, 2832},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4446},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3194},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 5110},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 88},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3245},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 872},
-    {LXB_UNICODE_IDNA_MAPPED, 3, 4252},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 1574},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 1682},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 765},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 5386},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 5070},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 2828},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 1761},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 5140},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 632},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 5413},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 625},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 2680},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 751},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 5124},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 865},
+    {LXB_UNICODE_IDNA_MAPPED, 3, 4219},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 394},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3482},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4987},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 1001},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3222},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 5406},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 976},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 743},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 5045},
     {LXB_UNICODE_IDNA_MAPPED, 1, 656},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 1586},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 3546},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4564},
-    {LXB_UNICODE_IDNA_MAPPED, 3, 1008},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 617},
-    {LXB_UNICODE_IDNA_MAPPED, 3, 4096},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 1680},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 5183},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 808},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 1477},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4820},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 1581},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 5362},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 666},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4437},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 3959},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4452},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 5115},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 1014},
+    {LXB_UNICODE_IDNA_MAPPED, 3, 2414},
+    {LXB_UNICODE_IDNA_MAPPED, 3, 2566},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3395},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 2804},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 1553},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3026},
+    {LXB_UNICODE_IDNA_MAPPED, 3, 4066},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3078},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 1031},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4927},
+    {LXB_UNICODE_IDNA_MAPPED, 3, 1937},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 4873},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 3628},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 420},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 492},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 1773},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 122},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 146},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 220},
     {LXB_UNICODE_IDNA_MAPPED, 1, 2093},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 5396},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 1506},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4732},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 198},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 170},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3345},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4735},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 2085},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4532},
+    {LXB_UNICODE_IDNA_MAPPED, 3, 1836},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 689},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 1673},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 2752},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3160},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 436},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3157},
+    {LXB_UNICODE_IDNA_MAPPED, 3, 1845},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3432},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 5111},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 5301},
+    {LXB_UNICODE_IDNA_MAPPED, 3, 4030},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 1473},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 71},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 1575},
+    {LXB_UNICODE_IDNA_MAPPED, 3, 2499},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 5169},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 5336},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3289},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4711},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 1433},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 2197},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4608},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 843},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4599},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4521},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4472},
     {LXB_UNICODE_IDNA_MAPPED, 2, 2617},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4514},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3498},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3458},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 5191},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4895},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3649},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4935},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 5252},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 1517},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3148},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 1505},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 5222},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 1431},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 1571},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 2509},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 1578},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4850},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 804},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 5105},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 339},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 401},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 5391},
     {LXB_UNICODE_IDNA_MAPPED, 1, 404},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4659},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3058},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 5027},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 632},
-    {LXB_UNICODE_IDNA_MAPPED, 3, 4243},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 1642},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 5275},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4556},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 850},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 3894},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4600},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 1585},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 3548},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 394},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 5373},
-    {LXB_UNICODE_IDNA_MAPPED, 3, 2436},
-    {LXB_UNICODE_IDNA_MAPPED, 3, 2461},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 144},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 890},
-    {LXB_UNICODE_IDNA_MAPPED, 3, 1833},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 5344},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4522},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 636},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 1783},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 2939},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3195},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 5118},
-    {LXB_UNICODE_IDNA_MAPPED, 3, 2874},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4447},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3272},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3159},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 2688},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 2830},
-    {LXB_UNICODE_IDNA_MAPPED, 3, 2285},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 3567},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 4831},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 174},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3258},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 5418},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 212},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 4861},
+    {LXB_UNICODE_IDNA_MAPPED, 3, 1076},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 776},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 2103},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 5143},
+    {LXB_UNICODE_IDNA_MAPPED, 4, 2256},
+    {LXB_UNICODE_IDNA_MAPPED, 3, 4228},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 5312},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 221},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3486},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 5099},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 59},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 463},
+    {LXB_UNICODE_IDNA_MAPPED, 3, 4237},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3363},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 970},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 532},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 1655},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3380},
+    {LXB_UNICODE_IDNA_MAPPED, 3, 4162},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4718},
+    {LXB_UNICODE_IDNA_MAPPED, 3, 4785},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 201},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 5249},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 885},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 5243},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4825},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 5109},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 1685},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 4891},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 778},
+    {LXB_UNICODE_IDNA_MAPPED, 3, 4291},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 1688},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 2104},
     {LXB_UNICODE_IDNA_MAPPED, 3, 1107},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4490},
-    {LXB_UNICODE_IDNA_MAPPED, 3, 4063},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 3903},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 814},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 1583},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4430},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3512},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3049},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 1392},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3445},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4633},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 5155},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 3620},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4699},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 844},
+    {LXB_UNICODE_IDNA_MAPPED, 3, 4081},
+    {LXB_UNICODE_IDNA_MAPPED, 3, 1976},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 1505},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3282},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 2956},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 137},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 2605},
+    {LXB_UNICODE_IDNA_MAPPED, 3, 2816},
+    {LXB_UNICODE_IDNA_MAPPED, 3, 2009},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4594},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 1212},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 1808},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4759},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 691},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 2983},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4706},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 5290},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 846},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3192},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 238},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 198},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 5129},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 1051},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3145},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4508},
+    {LXB_UNICODE_IDNA_MAPPED, 3, 2813},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4576},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 1781},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3069},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 2664},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 1100},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 2396},
+    {LXB_UNICODE_IDNA_MAPPED, 4, 1249},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 2994},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 3761},
+    {LXB_UNICODE_IDNA_MAPPED, 3, 2922},
+    {LXB_UNICODE_IDNA_MAPPED, 4, 2226},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 4897},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 1548},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4390},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3532},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 5063},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 695},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 5309},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 5354},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 1436},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 1545},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 5037},
+    {LXB_UNICODE_IDNA_MAPPED, 3, 1922},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4960},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 872},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3040},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 2080},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 1603},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4984},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 466},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3268},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 5201},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4766},
+    {LXB_UNICODE_IDNA_MAPPED, 3, 1327},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3201},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 1467},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 3570},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 2930},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3035},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 513},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 4016},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 1387},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 5382},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 5136},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3568},
+    {LXB_UNICODE_IDNA_MAPPED, 4, 4316},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 1705},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 812},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 136},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 5410},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 318},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 2965},
+    {LXB_UNICODE_IDNA_MAPPED, 3, 2277},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 1456},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3467},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 273},
+    {LXB_UNICODE_IDNA_MAPPED, 4, 2273},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 5003},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 2157},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 168},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 464},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 5230},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 518},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3470},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4744},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4659},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3054},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 775},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 974},
     {LXB_UNICODE_IDNA_MAPPED, 1, 4992},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 38},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3305},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4789},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4552},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 3623},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 2036},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 578},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 686},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3023},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 5097},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 2108},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 5038},
+    {LXB_UNICODE_IDNA_MAPPED, 3, 1235},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 2792},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 630},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 119},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 242},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 3951},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4491},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 403},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3022},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 5101},
+    {LXB_UNICODE_IDNA_MAPPED, 3, 2889},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3251},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 1614},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3519},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 1607},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 1405},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 2941},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 182},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 5306},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3030},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 1033},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 651},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 5041},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 3608},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4515},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 244},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 2690},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 2121},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 3604},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 5067},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 4422},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 685},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 803},
+    {LXB_UNICODE_IDNA_MAPPED, 3, 1899},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 936},
+    {LXB_UNICODE_IDNA_MAPPED, 3, 3541},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 1536},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 5172},
+    {LXB_UNICODE_IDNA_MAPPED, 3, 4189},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 1192},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4725},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 5194},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3185},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 801},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 5011},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 5208},
+    {LXB_UNICODE_IDNA_MAPPED, 3, 1084},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 902},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 5167},
+    {LXB_UNICODE_IDNA_MAPPED, 3, 2356},
+    {LXB_UNICODE_IDNA_MAPPED, 3, 2424},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 1592},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3417},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 5234},
+    {LXB_UNICODE_IDNA_MAPPED, 3, 2021},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 1417},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 744},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 272},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 658},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3279},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 738},
+    {LXB_UNICODE_IDNA_MAPPED, 3, 2451},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4543},
+    {LXB_UNICODE_IDNA_MAPPED, 3, 1120},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 234},
+    {LXB_UNICODE_IDNA_MAPPED, 3, 2645},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 880},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4447},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4628},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4695},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 3614},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4563},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 1666},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4631},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 983},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 1208},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 1786},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 5174},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 540},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 787},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4483},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4685},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 143},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4922},
+    {LXB_UNICODE_IDNA_MAPPED, 3, 2717},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 399},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4480},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3411},
+    {LXB_UNICODE_IDNA_MAPPED, 3, 4791},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4911},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3149},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3342},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 1708},
+    {LXB_UNICODE_IDNA_MAPPED, 3, 2862},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 5399},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 1777},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3065},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4575},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 1488},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4668},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3461},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 5088},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 3992},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 497},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 1040},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 5033},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 5326},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4736},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 800},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 5275},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 2040},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 680},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 2072},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4418},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4816},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 5298},
     {LXB_UNICODE_IDNA_MAPPED, 1, 5288},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 1554},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 5057},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 426},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 1513},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 1806},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 1705},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3310},
+    {LXB_UNICODE_IDNA_MAPPED, 3, 4246},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 2139},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 876},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 5107},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 349},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 1394},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 70},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 2976},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 103},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3189},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3473},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 150},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 5339},
     {LXB_UNICODE_IDNA_MAPPED, 1, 1619},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4539},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 2772},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 2366},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4382},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 5186},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3095},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4400},
-    {LXB_UNICODE_IDNA_MAPPED, 3, 2821},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 796},
-    {LXB_UNICODE_IDNA_MAPPED, 5, 2298},
-    {LXB_UNICODE_IDNA_MAPPED, 3, 4849},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4603},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4805},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 460},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4537},
-    {LXB_UNICODE_IDNA_MAPPED, 3, 4108},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 1562},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 5360},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 5133},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4467},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3101},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 4863},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 544},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 5119},
-    {LXB_UNICODE_IDNA_MAPPED, 3, 1232},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 1567},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 1549},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 1452},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 1448},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3106},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3182},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3114},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4703},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 5229},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 719},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 1413},
-    {LXB_UNICODE_IDNA_MAPPED, 3, 41},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 5041},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3135},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 1698},
-    {LXB_UNICODE_IDNA_MAPPED, 3, 1875},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 2283},
-    {LXB_UNICODE_IDNA_MAPPED, 3, 1093},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4903},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 60},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 748},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 5276},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 1160},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 468},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 5135},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3315},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 5242},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 697},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4890},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 5264},
+    {LXB_UNICODE_IDNA_MAPPED, 3, 1958},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3217},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3256},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4618},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 1587},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3215},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 3877},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 677},
+    {LXB_UNICODE_IDNA_MAPPED, 5, 2322},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 450},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 5352},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 896},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 504},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3168},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 710},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 2934},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 3561},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3303},
+    {LXB_UNICODE_IDNA_MAPPED, 3, 599},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4985},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 227},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4821},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 724},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4680},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3127},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 81},
     {LXB_UNICODE_IDNA_MAPPED, 1, 3322},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 649},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3130},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 172},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 1709},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 2982},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 1669},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 250},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 164},
-    {LXB_UNICODE_IDNA_MAPPED, 18, 4340},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4464},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 68},
+    {LXB_UNICODE_IDNA_MAPPED, 3, 3965},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 102},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4585},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 1795},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4673},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 2768},
+    {LXB_UNICODE_IDNA_MAPPED, 3, 1138},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4461},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 2621},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 741},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 1557},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3399},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3452},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 4869},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 5414},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 1449},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 891},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 5141},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 882},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 5387},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 2944},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 3929},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 5266},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 1422},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4468},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 1425},
     {LXB_UNICODE_IDNA_MAPPED, 1, 5005},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 776},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4535},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 1520},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 821},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 421},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 1790},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 3892},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4978},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 5399},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 899},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 838},
-    {LXB_UNICODE_IDNA_MAPPED, 3, 2569},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 705},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3150},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 744},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 1430},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4641},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3299},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 708},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 2927},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4435},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 417},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 1015},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3102},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4984},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4954},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 1210},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 564},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3043},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 2947},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3257},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4583},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4687},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4551},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 2082},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 1387},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 5001},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3113},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3390},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 2518},
     {LXB_UNICODE_IDNA_MAPPED, 1, 1626},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3088},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4885},
+    {LXB_UNICODE_IDNA_MAPPED, 3, 1126},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3334},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 407},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3009},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4433},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3337},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 2760},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3092},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 1677},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3014},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4536},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 2842},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 2061},
+    {LXB_UNICODE_IDNA_MAPPED, 3, 2334},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 5104},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4549},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 830},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4851},
+    {LXB_UNICODE_IDNA_MAPPED, 3, 1863},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 3557},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 5255},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 141},
+    {LXB_UNICODE_IDNA_MAPPED, 5, 2344},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 1516},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 480},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 1716},
+    {LXB_UNICODE_IDNA_MAPPED, 3, 4252},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 701},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 2143},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 1564},
+    {LXB_UNICODE_IDNA_MAPPED, 4, 1241},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 5093},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 5293},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 1660},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 1396},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3212},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3263},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 5320},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3475},
+    {LXB_UNICODE_IDNA_MAPPED, 3, 1217},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 3965},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 2217},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 2973},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3233},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 4899},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 1490},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 240},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 1634},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 5374},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 847},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4739},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 5007},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3226},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 5369},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4742},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 95},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 5344},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3496},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 2076},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 3715},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 705},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 5270},
+    {LXB_UNICODE_IDNA_MAPPED, 3, 3544},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3526},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 544},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 467},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 142},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 2854},
+    {LXB_UNICODE_IDNA_MAPPED, 3, 4102},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 321},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3332},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 989},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 2848},
+    {LXB_UNICODE_IDNA_MAPPED, 3, 2907},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 389},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3393},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3429},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 639},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 520},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4838},
+    {LXB_UNICODE_IDNA_MAPPED, 3, 1881},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 5322},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4509},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 1797},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 134},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 1446},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3176},
+    {LXB_UNICODE_IDNA_MAPPED, 4, 2625},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 5295},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4444},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 1530},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 241},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 2778},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4441},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 2056},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 3943},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4466},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 5022},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3115},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4458},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 5220},
+    {LXB_UNICODE_IDNA_MAPPED, 3, 2525},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3375},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 4859},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4686},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3124},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 643},
+    {LXB_UNICODE_IDNA_MAPPED, 4, 1273},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 2063},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 770},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 183},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 5036},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 63},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 5181},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 5421},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 1639},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 1598},
+    {LXB_UNICODE_IDNA_MAPPED, 3, 4340},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 5084},
+    {LXB_UNICODE_IDNA_MAPPED, 3, 2443},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 2083},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 111},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3237},
+    {LXB_UNICODE_IDNA_MAPPED, 3, 2433},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3308},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 1595},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 5062},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3207},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 589},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 2086},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 570},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3447},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 502},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 2694},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 1693},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 4802},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4908},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 225},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 5395},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 2133},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 482},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 1408},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 3598},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 1005},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3501},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4828},
+    {LXB_UNICODE_IDNA_MAPPED, 3, 1878},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 5189},
+    {LXB_UNICODE_IDNA_MAPPED, 3, 4195},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 1411},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 699},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 3835},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 2127},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4727},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 351},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3098},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3017},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 104},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 5056},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 916},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 2362},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 72},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 1620},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 617},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 771},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 580},
+    {LXB_UNICODE_IDNA_MAPPED, 3, 2027},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4974},
+    {LXB_UNICODE_IDNA_MAPPED, 3, 4807},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 1707},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 211},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4665},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3277},
+    {LXB_UNICODE_IDNA_MAPPED, 4, 2457},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4620},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4573},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 1493},
+    {LXB_UNICODE_IDNA_MAPPED, 3, 2733},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3244},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4581},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 1789},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 1016},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4693},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 3612},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4477},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3371},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4565},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 1792},
+    {LXB_UNICODE_IDNA_MAPPED, 3, 4183},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4625},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3425},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 5191},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 5408},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 2654},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 5151},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 773},
+    {LXB_UNICODE_IDNA_MAPPED, 3, 4174},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 226},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 637},
+    {LXB_UNICODE_IDNA_MAPPED, 2, 2660},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 5126},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 472},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 5393},
+    {LXB_UNICODE_IDNA_MAPPED, 3, 1940},
+    {LXB_UNICODE_IDNA_MAPPED, 3, 4114},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 247},
+    {LXB_UNICODE_IDNA_MAPPED, 3, 4117},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4924},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 2960},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 5202},
     {LXB_UNICODE_IDNA_MAPPED, 1, 3340},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 2978},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3453},
-    {LXB_UNICODE_IDNA_MAPPED, 2, 595},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 58},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 4546},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 1488},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 501},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 1818},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 2967},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 285},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 3311},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 1807},
-    {LXB_UNICODE_IDNA_MAPPED, 1, 1512}
+    {LXB_UNICODE_IDNA_MAPPED, 1, 2937},
+    {LXB_UNICODE_IDNA_MAPPED, 3, 3883},
+    {LXB_UNICODE_IDNA_MAPPED, 3, 2868},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 1524},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3180},
+    {LXB_UNICODE_IDNA_MAPPED, 3, 4933},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3162},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 1775},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 3063},
+    {LXB_UNICODE_IDNA_MAPPED, 1, 4904}
 };
 
 static const lxb_unicode_composition_entry_t lxb_unicode_composition_entries[458] =
diff --git a/ext/lexbor/lexbor/unicode/unicode.c b/ext/lexbor/lexbor/unicode/unicode.c
index 991fc0a38823..ced80b430a7c 100644
--- a/ext/lexbor/lexbor/unicode/unicode.c
+++ b/ext/lexbor/lexbor/unicode/unicode.c
@@ -451,7 +451,7 @@ lxb_unicode_normalize_body(lxb_unicode_normalizer_t *uc, const void *data,
                     uc->starter = p;
                     uc->ican = p;
 
-                    if (p - buf >= uc->flush_cp) {
+                    if (lxb_size(p - buf) >= uc->flush_cp) {
                         if (!is_cp) {
                             status = lxb_unicode_flush(uc, cb->cb, ctx);
                         }
@@ -887,7 +887,7 @@ lxb_unicode_entry(lxb_codepoint_t cp)
         return &lxb_unicode_entries[0];
     }
 
-    if (cp < 205744) {
+    if (cp < 210042) {
         if (cp < 83527) {
             if (cp < 57345) {
                 return &lxb_unicode_entries[lxb_unicode_table_map_0_57345[cp - 0]];
@@ -897,11 +897,11 @@ lxb_unicode_entry(lxb_codepoint_t cp)
             }
         }
         else if (cp >= 90368) {
-            if (cp < 101641) {
-                return &lxb_unicode_entries[lxb_unicode_table_map_90368_101641[cp - 90368]];
+            if (cp < 101875) {
+                return &lxb_unicode_entries[lxb_unicode_table_map_90368_101875[cp - 90368]];
             }
             else if (cp >= 110576) {
-                return &lxb_unicode_entries[lxb_unicode_table_map_110576_205744[cp - 110576]];
+                return &lxb_unicode_entries[lxb_unicode_table_map_110576_210042[cp - 110576]];
             }
         }
     }
diff --git a/ext/lexbor/lexbor/url/base.h b/ext/lexbor/lexbor/url/base.h
index c95377ab89e1..94d0e2a1901c 100644
--- a/ext/lexbor/lexbor/url/base.h
+++ b/ext/lexbor/lexbor/url/base.h
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2023-2024 Alexander Borisov
+ * Copyright (C) 2023-2025 Alexander Borisov
  *
  * Author: Alexander Borisov 
  */
@@ -17,7 +17,7 @@ extern "C" {
 
 
 #define LXB_URL_VERSION_MAJOR 0
-#define LXB_URL_VERSION_MINOR 3
+#define LXB_URL_VERSION_MINOR 4
 #define LXB_URL_VERSION_PATCH 0
 
 #define LXB_URL_VERSION_STRING LEXBOR_STRINGIZE(LXB_URL_VERSION_MAJOR) "."    \
diff --git a/ext/lexbor/lexbor/url/url.c b/ext/lexbor/lexbor/url/url.c
index 0eef7a6deba4..a5b323f2df09 100644
--- a/ext/lexbor/lexbor/url/url.c
+++ b/ext/lexbor/lexbor/url/url.c
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2023-2025 Alexander Borisov
+ * Copyright (C) 2023-2026 Alexander Borisov
  *
  * Author: Alexander Borisov 
  */
@@ -14,14 +14,14 @@
 #include "lexbor/core/swar.h"
 #include "lexbor/unicode/idna.h"
 
-#define LEXBOR_STR_RES_MAP_LOWERCASE
-#define LEXBOR_STR_RES_ALPHANUMERIC_CHARACTER
-#define LEXBOR_STR_RES_ALPHA_CHARACTER
-#define LEXBOR_STR_RES_CHAR_TO_TWO_HEX_VALUE
-#define LEXBOR_STR_RES_MAP_HEX
-#define LEXBOR_STR_RES_MAP_NUM
-#include "lexbor/core/str_res.h"
-
+#ifndef LEXBOR_DISABLE_INTERNAL_EXTERN
+    LXB_EXTERN const lxb_char_t lexbor_str_res_map_lowercase[256];
+    LXB_EXTERN const size_t     lexbor_str_res_alphanumeric_character[256];
+    LXB_EXTERN const size_t     lexbor_str_res_alpha_character[256];
+    LXB_EXTERN const char       *lexbor_str_res_char_to_two_hex_value[257];
+    LXB_EXTERN const lxb_char_t lexbor_str_res_map_num[256];
+    LXB_EXTERN const lxb_char_t lexbor_str_res_map_hex[256];
+#endif
 
 #define LXB_URL_BUFFER_SIZE 4096
 #define LXB_URL_BUFFER_NUM_SIZE 128
@@ -860,7 +860,7 @@ lxb_url_is_url_codepoint(lxb_codepoint_t cp)
     return lxb_url_codepoint_alphanumeric[(lxb_char_t) cp] != 0xFF;
 }
 
-lxb_inline bool
+bool
 lxb_url_is_special(const lxb_url_t *url)
 {
     return url->scheme.type != LXB_URL_SCHEMEL_TYPE__UNKNOWN;
diff --git a/ext/lexbor/lexbor/url/url.h b/ext/lexbor/lexbor/url/url.h
index 4ed3f32aa646..6cc6f1081c8a 100644
--- a/ext/lexbor/lexbor/url/url.h
+++ b/ext/lexbor/lexbor/url/url.h
@@ -763,6 +763,15 @@ LXB_API lxb_status_t
 lxb_url_search_params_serialize(lxb_url_search_params_t *search_params,
                                 lexbor_callback_f cb, void *ctx);
 
+/**
+ * Returns whether the URL is special.
+ *
+ * @param[in] lxb_url_t *. Cannot be NULL.
+ * @return true if URL is special, false otherwise.
+ */
+LXB_API bool
+lxb_url_is_special(const lxb_url_t *url);
+
 /*
  * Inline functions.
  */
diff --git a/ext/lexbor/patches/0001-Expose-line-and-column-information-for-use-in-PHP.patch b/ext/lexbor/patches/0001-Expose-line-and-column-information-for-use-in-PHP.patch
index 0da274053ec2..32d9d42d2bf1 100644
--- a/ext/lexbor/patches/0001-Expose-line-and-column-information-for-use-in-PHP.patch
+++ b/ext/lexbor/patches/0001-Expose-line-and-column-information-for-use-in-PHP.patch
@@ -1,4 +1,4 @@
-From 4c133fe5adfe4b8ccdd8b014d884b685143b9e66 Mon Sep 17 00:00:00 2001
+From 0cd2add6c46400b808329442f81451b369863983 Mon Sep 17 00:00:00 2001
 From: Niels Dossche <7771979+nielsdos@users.noreply.github.com>
 Date: Sat, 26 Aug 2023 15:08:59 +0200
 Subject: [PATCH 1/6] Expose line and column information for use in PHP
@@ -15,10 +15,10 @@ Subject: [PATCH 1/6] Expose line and column information for use in PHP
  8 files changed, 48 insertions(+), 5 deletions(-)
 
 diff --git a/source/lexbor/dom/interfaces/node.h b/source/lexbor/dom/interfaces/node.h
-index b052cf5..b5d2c50 100644
+index 6c74ac5..b95373c 100644
 --- a/source/lexbor/dom/interfaces/node.h
 +++ b/source/lexbor/dom/interfaces/node.h
-@@ -83,6 +83,8 @@ struct lxb_dom_node {
+@@ -86,6 +86,8 @@ struct lxb_dom_node {
  
      lxb_dom_node_type_t    type;
  
@@ -41,10 +41,10 @@ index 79accd0..0b7f4fd 100644
      const lxb_char_t      *text_start;
      const lxb_char_t      *text_end;
 diff --git a/source/lexbor/html/tokenizer.c b/source/lexbor/html/tokenizer.c
-index 741bced..0bd9aec 100644
+index 22b88ed..1d9f378 100644
 --- a/source/lexbor/html/tokenizer.c
 +++ b/source/lexbor/html/tokenizer.c
-@@ -91,6 +91,7 @@ lxb_html_tokenizer_init(lxb_html_tokenizer_t *tkz)
+@@ -92,6 +92,7 @@ lxb_html_tokenizer_init(lxb_html_tokenizer_t *tkz)
  
      tkz->pos = tkz->start;
      tkz->end = tkz->start + LXB_HTML_TKZ_TEMP_SIZE;
@@ -52,7 +52,7 @@ index 741bced..0bd9aec 100644
  
      tkz->tree = NULL;
      tkz->tags = NULL;
-@@ -152,6 +153,8 @@ lxb_html_tokenizer_inherit(lxb_html_tokenizer_t *tkz_to,
+@@ -153,6 +154,8 @@ lxb_html_tokenizer_inherit(lxb_html_tokenizer_t *tkz_to,
      tkz_to->start = tkz_from->start;
      tkz_to->end = tkz_from->end;
      tkz_to->pos = tkz_to->start;
@@ -61,7 +61,7 @@ index 741bced..0bd9aec 100644
  
      return LXB_STATUS_OK;
  }
-@@ -312,7 +315,26 @@ lxb_html_tokenizer_chunk(lxb_html_tokenizer_t *tkz, const lxb_char_t *data,
+@@ -571,7 +574,26 @@ lxb_html_tokenizer_chunk(lxb_html_tokenizer_t *tkz, const lxb_char_t *data,
      tkz->last = end;
  
      while (data < end) {
@@ -90,10 +90,10 @@ index 741bced..0bd9aec 100644
  
      return tkz->status;
 diff --git a/source/lexbor/html/tokenizer.h b/source/lexbor/html/tokenizer.h
-index ba9602f..74bb55e 100644
+index 12b7c81..aa1ac37 100644
 --- a/source/lexbor/html/tokenizer.h
 +++ b/source/lexbor/html/tokenizer.h
-@@ -73,6 +73,8 @@ struct lxb_html_tokenizer {
+@@ -79,6 +79,8 @@ struct lxb_html_tokenizer {
      const lxb_char_t                 *end;
      const lxb_char_t                 *begin;
      const lxb_char_t                 *last;
@@ -103,7 +103,7 @@ index ba9602f..74bb55e 100644
      /* Entities */
      const lexbor_sbst_entry_static_t *entity;
 diff --git a/source/lexbor/html/tokenizer/state.h b/source/lexbor/html/tokenizer/state.h
-index 17939b9..5b095b4 100644
+index 5e91444..52eaa9a 100644
 --- a/source/lexbor/html/tokenizer/state.h
 +++ b/source/lexbor/html/tokenizer/state.h
 @@ -90,6 +90,8 @@ extern "C" {
@@ -116,10 +116,10 @@ index 17939b9..5b095b4 100644
      while (0)
  
 diff --git a/source/lexbor/html/tree.c b/source/lexbor/html/tree.c
-index ece26e9..91bfd17 100644
+index 062ea56..3f4c18d 100644
 --- a/source/lexbor/html/tree.c
 +++ b/source/lexbor/html/tree.c
-@@ -427,6 +427,9 @@ lxb_html_tree_create_element_for_token(lxb_html_tree_t *tree,
+@@ -431,6 +431,9 @@ lxb_html_tree_create_element_for_token(lxb_html_tree_t *tree,
          return NULL;
      }
  
@@ -129,7 +129,7 @@ index ece26e9..91bfd17 100644
      lxb_status_t status;
      lxb_dom_element_t *element = lxb_dom_interface_element(node);
  
-@@ -763,6 +766,11 @@ lxb_html_tree_insert_character_for_data(lxb_html_tree_t *tree,
+@@ -767,6 +770,11 @@ lxb_html_tree_insert_character_for_data(lxb_html_tree_t *tree,
  
      lxb_dom_interface_text(text)->char_data.data = *str;
  
@@ -141,7 +141,7 @@ index ece26e9..91bfd17 100644
      if (ret_node != NULL) {
          *ret_node = text;
      }
-@@ -802,6 +810,9 @@ lxb_html_tree_insert_comment(lxb_html_tree_t *tree,
+@@ -806,6 +814,9 @@ lxb_html_tree_insert_comment(lxb_html_tree_t *tree,
          return NULL;
      }
  
@@ -152,10 +152,10 @@ index ece26e9..91bfd17 100644
                                              tree->document->dom_document.text);
      if (tree->status != LXB_STATUS_OK) {
 diff --git a/source/lexbor/html/tree/error.c b/source/lexbor/html/tree/error.c
-index e6e43f4..88ad8c4 100644
+index ffdc55c..ef36eab 100644
 --- a/source/lexbor/html/tree/error.c
 +++ b/source/lexbor/html/tree/error.c
-@@ -21,8 +21,9 @@ lxb_html_tree_error_add(lexbor_array_obj_t *parse_errors,
+@@ -22,8 +22,9 @@ lxb_html_tree_error_add(lexbor_array_obj_t *parse_errors,
      }
  
      entry->id = id;
@@ -168,10 +168,10 @@ index e6e43f4..88ad8c4 100644
      return entry;
  }
 diff --git a/source/lexbor/html/tree/error.h b/source/lexbor/html/tree/error.h
-index 2fd06cb..ed1859f 100644
+index 7a212af..b186772 100644
 --- a/source/lexbor/html/tree/error.h
 +++ b/source/lexbor/html/tree/error.h
-@@ -97,8 +97,9 @@ lxb_html_tree_error_id_t;
+@@ -109,8 +109,9 @@ lxb_html_tree_error_id_t;
  
  typedef struct {
      lxb_html_tree_error_id_t id;
@@ -184,5 +184,5 @@ index 2fd06cb..ed1859f 100644
  lxb_html_tree_error_t;
  
 -- 
-2.49.0
+2.51.2
 
diff --git a/ext/lexbor/patches/0002-Track-implied-added-nodes-for-options-use-in-PHP.patch b/ext/lexbor/patches/0002-Track-implied-added-nodes-for-options-use-in-PHP.patch
index a2df20e3bae4..1902abf96e3a 100644
--- a/ext/lexbor/patches/0002-Track-implied-added-nodes-for-options-use-in-PHP.patch
+++ b/ext/lexbor/patches/0002-Track-implied-added-nodes-for-options-use-in-PHP.patch
@@ -1,4 +1,4 @@
-From eb5e3769950cd9c0bc59066d94d6da9291f43af8 Mon Sep 17 00:00:00 2001
+From a4c29ba8d1ea1065ce6bd4a34382d53140cf1924 Mon Sep 17 00:00:00 2001
 From: Niels Dossche <7771979+nielsdos@users.noreply.github.com>
 Date: Mon, 14 Aug 2023 20:18:51 +0200
 Subject: [PATCH 2/6] Track implied added nodes for options use in PHP
@@ -11,7 +11,7 @@ Subject: [PATCH 2/6] Track implied added nodes for options use in PHP
  4 files changed, 8 insertions(+)
 
 diff --git a/source/lexbor/html/tree.h b/source/lexbor/html/tree.h
-index 9564608..8ad32a4 100644
+index 4912efb..7b2c620 100644
 --- a/source/lexbor/html/tree.h
 +++ b/source/lexbor/html/tree.h
 @@ -55,6 +55,9 @@ struct lxb_html_tree {
@@ -63,5 +63,5 @@ index 05fe738..1e09cda 100644
  
              break;
 -- 
-2.49.0
+2.51.2
 
diff --git a/ext/lexbor/patches/0003-Patch-utilities-and-data-structure-to-be-able-to-gen.patch b/ext/lexbor/patches/0003-Patch-utilities-and-data-structure-to-be-able-to-gen.patch
index 4c3cdc67a65d..51f77483bc6e 100644
--- a/ext/lexbor/patches/0003-Patch-utilities-and-data-structure-to-be-able-to-gen.patch
+++ b/ext/lexbor/patches/0003-Patch-utilities-and-data-structure-to-be-able-to-gen.patch
@@ -1,4 +1,4 @@
-From de74c24d95342280266ebdac6f8dabc70ccfacab Mon Sep 17 00:00:00 2001
+From 46fc776449252e74795569759a19d13857a59069 Mon Sep 17 00:00:00 2001
 From: Niels Dossche <7771979+nielsdos@users.noreply.github.com>
 Date: Thu, 24 Aug 2023 22:57:48 +0200
 Subject: [PATCH 3/6] Patch utilities and data structure to be able to generate
@@ -8,10 +8,10 @@ Changed the generation script to check if everything fits in 32-bits.
 And change the actual field types to 32-bits. This decreases the hash
 tables in size.
 ---
- source/lexbor/core/shs.h             |   4 +-
- utils/lexbor/encoding/single-byte.py |   2 +-
- utils/lexbor/lexbor/LXB.py           |  12 +-
- 3 files changed, 12 insertions(+), 6 deletions(-)
+ source/lexbor/core/shs.h             |  4 ++--
+ utils/lexbor/encoding/single-byte.py |  4 ++--
+ utils/lexbor/lexbor/LXB.py           | 12 +++++++++---
+ 3 files changed, 13 insertions(+), 7 deletions(-)
 
 diff --git a/source/lexbor/core/shs.h b/source/lexbor/core/shs.h
 index 7a63a07..c84dfaa 100644
@@ -30,7 +30,7 @@ index 7a63a07..c84dfaa 100644
  lexbor_shs_hash_t;
  
 diff --git a/utils/lexbor/encoding/single-byte.py b/utils/lexbor/encoding/single-byte.py
-index 9a85d54..ec2023c 100755
+index d7d1bb2..5420c16 100755
 --- a/utils/lexbor/encoding/single-byte.py
 +++ b/utils/lexbor/encoding/single-byte.py
 @@ -128,7 +128,7 @@ class SingleByte:
@@ -42,6 +42,15 @@ index 9a85d54..ec2023c 100755
  
          return hash_key.create(rate = 1)
  
+@@ -161,7 +161,7 @@ def toHex(s):
+     lst = []
+ 
+     for ch in bytes(s, 'utf-8'):
+-        hv = hex(ch).replace('0x', '\\\\x')
++        hv = hex(ch).replace('0x', '\\x')
+         lst.append("'{}'".format(hv))
+ 
+     return ', '.join(lst)
 diff --git a/utils/lexbor/lexbor/LXB.py b/utils/lexbor/lexbor/LXB.py
 index 3e75812..2370c66 100755
 --- a/utils/lexbor/lexbor/LXB.py
@@ -84,5 +93,5 @@ index 3e75812..2370c66 100755
          result.append("};")
  
 -- 
-2.49.0
+2.51.2
 
diff --git a/ext/lexbor/patches/0004-Remove-unused-upper-case-tag-static-data.patch b/ext/lexbor/patches/0004-Remove-unused-upper-case-tag-static-data.patch
index c678146f2ada..6cb6658a164b 100644
--- a/ext/lexbor/patches/0004-Remove-unused-upper-case-tag-static-data.patch
+++ b/ext/lexbor/patches/0004-Remove-unused-upper-case-tag-static-data.patch
@@ -1,4 +1,4 @@
-From 1837e6a296a2bac71e37e566435542f208b4fa23 Mon Sep 17 00:00:00 2001
+From ae9d7254ac129cc3be34de6fd34af27baf3bb396 Mon Sep 17 00:00:00 2001
 From: Niels Dossche <7771979+nielsdos@users.noreply.github.com>
 Date: Wed, 29 Nov 2023 21:26:47 +0100
 Subject: [PATCH 4/6] Remove unused upper case tag static data
@@ -9,10 +9,10 @@ Subject: [PATCH 4/6] Remove unused upper case tag static data
  2 files changed, 4 insertions(+)
 
 diff --git a/source/lexbor/tag/res.h b/source/lexbor/tag/res.h
-index c7190c5..4ad1f37 100644
+index 604757f..5672d4a 100644
 --- a/source/lexbor/tag/res.h
 +++ b/source/lexbor/tag/res.h
-@@ -224,6 +224,7 @@ static const lxb_tag_data_t lxb_tag_res_data_default[LXB_TAG__LAST_ENTRY] =
+@@ -226,6 +226,7 @@ static const lxb_tag_data_t lxb_tag_res_data_default[LXB_TAG__LAST_ENTRY] =
      {{.u.short_str = "xmp", .length = 3, .next = NULL}, LXB_TAG_XMP, 1, true}
  };
  
@@ -20,13 +20,13 @@ index c7190c5..4ad1f37 100644
  static const lxb_tag_data_t lxb_tag_res_data_upper_default[LXB_TAG__LAST_ENTRY] = 
  {
      {{.u.short_str = "#UNDEF", .length = 6, .next = NULL}, LXB_TAG__UNDEF, 1, true},
-@@ -423,6 +424,7 @@ static const lxb_tag_data_t lxb_tag_res_data_upper_default[LXB_TAG__LAST_ENTRY]
+@@ -427,6 +428,7 @@ static const lxb_tag_data_t lxb_tag_res_data_upper_default[LXB_TAG__LAST_ENTRY]
      {{.u.short_str = "WBR", .length = 3, .next = NULL}, LXB_TAG_WBR, 1, true},
      {{.u.short_str = "XMP", .length = 3, .next = NULL}, LXB_TAG_XMP, 1, true}
  };
 +#endif
  
- static const lexbor_shs_entry_t lxb_tag_res_shs_data_default[] = 
+ static const lexbor_shs_entry_t lxb_tag_res_shs_data_default[263] = 
  {
 diff --git a/source/lexbor/tag/tag.c b/source/lexbor/tag/tag.c
 index 780bc47..be5bb30 100644
@@ -49,5 +49,5 @@ index 780bc47..be5bb30 100644
  /*
   * No inline functions for ABI.
 -- 
-2.49.0
+2.51.2
 
diff --git a/ext/lexbor/patches/0005-Shrink-size-of-static-binary-search-tree.patch b/ext/lexbor/patches/0005-Shrink-size-of-static-binary-search-tree.patch
index bf2acce1a848..9ef6e305e498 100644
--- a/ext/lexbor/patches/0005-Shrink-size-of-static-binary-search-tree.patch
+++ b/ext/lexbor/patches/0005-Shrink-size-of-static-binary-search-tree.patch
@@ -1,4 +1,4 @@
-From 065923a993a004b8891ad3992c99e7e63e77bad3 Mon Sep 17 00:00:00 2001
+From 19cf6183813e013dfe0eb2303c15eaf6e01b9faf Mon Sep 17 00:00:00 2001
 From: Niels Dossche <7771979+nielsdos@users.noreply.github.com>
 Date: Wed, 29 Nov 2023 21:29:31 +0100
 Subject: [PATCH 5/6] Shrink size of static binary search tree
@@ -7,10 +7,9 @@ This also makes it more efficient on the data cache.
 ---
  source/lexbor/core/sbst.h                   | 19 ++++++++++++++-----
  source/lexbor/html/tokenizer/state.c        |  2 +-
- utils/lexbor/html/tmp/tokenizer_res.h       |  2 +-
- utils/lexbor/html/tokenizer_entities_bst.py | 10 +++++-----
+ utils/lexbor/html/tokenizer_entities_bst.py |  8 ++++----
  utils/lexbor/lexbor/LXB.py                  |  2 +-
- 5 files changed, 21 insertions(+), 12 deletions(-)
+ 4 files changed, 20 insertions(+), 11 deletions(-)
 
 diff --git a/source/lexbor/core/sbst.h b/source/lexbor/core/sbst.h
 index b0fbc54..15a1d40 100644
@@ -48,10 +47,10 @@ index b0fbc54..15a1d40 100644
  lexbor_sbst_entry_static_t;
  
 diff --git a/source/lexbor/html/tokenizer/state.c b/source/lexbor/html/tokenizer/state.c
-index 158aade..207b909 100644
+index db362c6..6c3cbeb 100644
 --- a/source/lexbor/html/tokenizer/state.c
 +++ b/source/lexbor/html/tokenizer/state.c
-@@ -1820,7 +1820,7 @@ lxb_html_tokenizer_state_char_ref_named(lxb_html_tokenizer_t *tkz,
+@@ -1825,7 +1825,7 @@ lxb_html_tokenizer_state_char_ref_named(lxb_html_tokenizer_t *tkz,
              goto done;
          }
  
@@ -60,21 +59,8 @@ index 158aade..207b909 100644
              tkz->entity_end = (tkz->pos + (data - begin)) - tkz->start;
              tkz->entity_match = entry;
          }
-diff --git a/utils/lexbor/html/tmp/tokenizer_res.h b/utils/lexbor/html/tmp/tokenizer_res.h
-index b3701d5..73ab66e 100644
---- a/utils/lexbor/html/tmp/tokenizer_res.h
-+++ b/utils/lexbor/html/tmp/tokenizer_res.h
-@@ -6,7 +6,7 @@
- 
- /*
-  * Caution!!! Important!!!
-- * This file generated by the script
-+ * This file is generated by the script
-  * "utils/lexbor/html/tokenizer_entities_bst.py"!
-  * Do not change this file!
-  */
 diff --git a/utils/lexbor/html/tokenizer_entities_bst.py b/utils/lexbor/html/tokenizer_entities_bst.py
-index 4fa0999..8bd83b2 100755
+index b34bca1..2bfea81 100755
 --- a/utils/lexbor/html/tokenizer_entities_bst.py
 +++ b/utils/lexbor/html/tokenizer_entities_bst.py
 @@ -1,6 +1,6 @@
@@ -112,15 +98,8 @@ index 4fa0999..8bd83b2 100755
          lst.append(hv)
  
      return ''.join(lst)
-@@ -210,5 +210,5 @@ def entities_bst_print(bst):
- 
- if __name__ == "__main__":
-     entities_bst("tmp/tokenizer_res.h",
--                 "../../../source/lexbor/html/tokenizer_res.h",
-+                 "../../../source/lexbor/html/tokenizer/res.h",
-                  "data/entities.json");
 diff --git a/utils/lexbor/lexbor/LXB.py b/utils/lexbor/lexbor/LXB.py
-index 3e75812..b068ea3 100755
+index 2370c66..c41e645 100755
 --- a/utils/lexbor/lexbor/LXB.py
 +++ b/utils/lexbor/lexbor/LXB.py
 @@ -27,7 +27,7 @@ class Temp:
@@ -133,5 +112,5 @@ index 3e75812..b068ea3 100755
          fh.close()
  
 -- 
-2.49.0
+2.51.2
 
diff --git a/ext/lexbor/patches/0006-Patch-out-unused-CSS-style-code.patch b/ext/lexbor/patches/0006-Patch-out-unused-CSS-style-code.patch
index aa64d88ceb18..a643f9716488 100644
--- a/ext/lexbor/patches/0006-Patch-out-unused-CSS-style-code.patch
+++ b/ext/lexbor/patches/0006-Patch-out-unused-CSS-style-code.patch
@@ -1,19 +1,17 @@
-From fbb1e8945c4b12d43e7fddc3c34670b5792e2dca Mon Sep 17 00:00:00 2001
+From 54399ee441d922d89c32909e2028f899f6091cd6 Mon Sep 17 00:00:00 2001
 From: Niels Dossche <7771979+nielsdos@users.noreply.github.com>
 Date: Sun, 7 Jan 2024 21:59:28 +0100
 Subject: [PATCH 6/6] Patch out unused CSS style code
 
 ---
- source/lexbor/css/rule.h                       |  2 ++
- source/lexbor/style/dom/interfaces/document.c  | 12 ++++++++----
- source/lexbor/style/html/interfaces/document.h |  2 ++
- 3 files changed, 12 insertions(+), 4 deletions(-)
+ source/lexbor/css/rule.h | 2 ++
+ 1 file changed, 2 insertions(+)
 
 diff --git a/source/lexbor/css/rule.h b/source/lexbor/css/rule.h
-index 7cc4f0b..bd191f9 100644
+index 308dced..d192a01 100644
 --- a/source/lexbor/css/rule.h
 +++ b/source/lexbor/css/rule.h
-@@ -339,6 +339,7 @@ lxb_css_rule_ref_dec(lxb_css_rule_t *rule)
+@@ -361,6 +361,7 @@ lxb_css_rule_ref_dec(lxb_css_rule_t *rule)
  lxb_inline void
  lxb_css_rule_ref_dec_destroy(lxb_css_rule_t *rule)
  {
@@ -21,7 +19,7 @@ index 7cc4f0b..bd191f9 100644
      if (rule->ref_count > 0) {
          rule->ref_count--;
      }
-@@ -346,6 +347,7 @@ lxb_css_rule_ref_dec_destroy(lxb_css_rule_t *rule)
+@@ -368,6 +369,7 @@ lxb_css_rule_ref_dec_destroy(lxb_css_rule_t *rule)
      if (rule->ref_count == 0) {
          (void) lxb_css_rule_destroy(rule, true);
      }
@@ -29,96 +27,6 @@ index 7cc4f0b..bd191f9 100644
  }
  
  lxb_inline void
-diff --git a/source/lexbor/style/dom/interfaces/document.c b/source/lexbor/style/dom/interfaces/document.c
-index 8a63e8e..f885dc3 100644
---- a/source/lexbor/style/dom/interfaces/document.c
-+++ b/source/lexbor/style/dom/interfaces/document.c
-@@ -280,6 +280,7 @@ lxb_status_t
- lxb_dom_document_stylesheet_apply(lxb_dom_document_t *document,
-                                   lxb_css_stylesheet_t *sst)
- {
-+#if 0
-     lxb_status_t status = LXB_STATUS_OK;
-     lxb_css_rule_t *rule;
-     lxb_css_rule_list_t *list;
-@@ -310,7 +311,7 @@ lxb_dom_document_stylesheet_apply(lxb_dom_document_t *document,
- 
-         rule = rule->next;
-     }
--
-+#endif
-     return LXB_STATUS_OK;
- }
- 
-@@ -329,6 +330,7 @@ lxb_status_t
- lxb_dom_document_stylesheet_remove(lxb_dom_document_t *document,
-                                    lxb_css_stylesheet_t *sst)
- {
-+#if 0
-     size_t i, length;
-     lxb_status_t status = LXB_STATUS_OK;
-     lxb_css_rule_t *rule;
-@@ -372,13 +374,14 @@ lxb_dom_document_stylesheet_remove(lxb_dom_document_t *document,
-             length = lexbor_array_length(document->css->stylesheets);
-         }
-     }
--
-+#endif
-     return LXB_STATUS_OK;
- }
- 
- lxb_status_t
- lxb_dom_document_element_styles_attach(lxb_dom_element_t *element)
- {
-+#if 0
-     lxb_status_t status = LXB_STATUS_OK;
-     lxb_css_rule_t *rule;
-     lexbor_array_t *ssts;
-@@ -413,7 +416,7 @@ lxb_dom_document_element_styles_attach(lxb_dom_element_t *element)
-             rule = rule->next;
-         }
-     }
--
-+#endif
-     return LXB_STATUS_OK;
- }
- 
-@@ -521,6 +524,7 @@ lxb_dom_document_style_attach_cb(lxb_dom_node_t *node,
- lxb_status_t
- lxb_document_apply_stylesheets(lxb_dom_document_t *document)
- {
-+#if 0
-     size_t i, length;
-     lxb_status_t status;
-     lxb_css_stylesheet_t *sst;
-@@ -539,6 +543,6 @@ lxb_document_apply_stylesheets(lxb_dom_document_t *document)
-             return status;
-         }
-     }
--
-+#endif
-     return LXB_STATUS_OK;
- }
-diff --git a/source/lexbor/style/html/interfaces/document.h b/source/lexbor/style/html/interfaces/document.h
-index 0307cd9..127c4cd 100644
---- a/source/lexbor/style/html/interfaces/document.h
-+++ b/source/lexbor/style/html/interfaces/document.h
-@@ -134,6 +134,7 @@ lxb_html_document_stylesheet_destroy_all(lxb_html_document_t *document,
-                                             destroy_memory);
- }
- 
-+#if 0
- lxb_inline lxb_status_t
- lxb_html_document_style_attach(lxb_html_document_t *document,
-                                lxb_css_rule_style_t *style)
-@@ -158,6 +159,7 @@ lxb_html_document_style_attach_by_element(lxb_html_document_t *document,
-     return lxb_dom_document_style_attach_by_element(lxb_dom_interface_document(document),
-                                                     element, style);
- }
-+#endif
- 
- lxb_inline lxb_status_t
- lxb_html_document_apply_stylesheets(lxb_html_document_t *document)
 -- 
-2.49.0
+2.51.2
 
diff --git a/ext/lexbor/patches/0007-Add-Is_Special_Url_Support.patch b/ext/lexbor/patches/0007-Add-Is_Special_Url_Support.patch
new file mode 100644
index 000000000000..6f5e126336d0
--- /dev/null
+++ b/ext/lexbor/patches/0007-Add-Is_Special_Url_Support.patch
@@ -0,0 +1,44 @@
+From 9181fce509ab9b37c02994545f3971687433e770 Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?M=C3=A1t=C3=A9=20Kocsis?= 
+Date: Sun, 17 May 2026 22:17:14 +0200
+Subject: [PATCH] Add lxb_url_is_special() to the public API (#362)
+
+As https://wiki.php.net/rfc/uri_followup#uri_type_detection relies on this information.
+---
+ source/lexbor/url/url.c | 2 +-
+ source/lexbor/url/url.h | 9 +++++++++
+ 2 files changed, 10 insertions(+), 1 deletion(-)
+
+diff --git a/source/lexbor/url/url.c b/source/lexbor/url/url.c
+index 5a114346..a5b323f2 100644
+--- a/source/lexbor/url/url.c
++++ b/source/lexbor/url/url.c
+@@ -860,7 +860,7 @@ lxb_url_is_url_codepoint(lxb_codepoint_t cp)
+     return lxb_url_codepoint_alphanumeric[(lxb_char_t) cp] != 0xFF;
+ }
+ 
+-lxb_inline bool
++bool
+ lxb_url_is_special(const lxb_url_t *url)
+ {
+     return url->scheme.type != LXB_URL_SCHEMEL_TYPE__UNKNOWN;
+diff --git a/source/lexbor/url/url.h b/source/lexbor/url/url.h
+index 4ed3f32a..6cc6f108 100644
+--- a/source/lexbor/url/url.h
++++ b/source/lexbor/url/url.h
+@@ -763,6 +763,15 @@ LXB_API lxb_status_t
+ lxb_url_search_params_serialize(lxb_url_search_params_t *search_params,
+                                 lexbor_callback_f cb, void *ctx);
+ 
++/**
++ * Returns whether the URL is special.
++ *
++ * @param[in] lxb_url_t *. Cannot be NULL.
++ * @return true if URL is special, false otherwise.
++ */
++LXB_API bool
++lxb_url_is_special(const lxb_url_t *url);
++
+ /*
+  * Inline functions.
+  */
\ No newline at end of file
diff --git a/ext/lexbor/patches/README.md b/ext/lexbor/patches/README.md
index 53d58e03da08..6c7b78fd59fa 100644
--- a/ext/lexbor/patches/README.md
+++ b/ext/lexbor/patches/README.md
@@ -1,7 +1,10 @@
 # Lexbor patches
 
+> [!IMPORTANT]
+> This process was largely automated in update-lexbor.sh.
+
 Upon syncing the Lexbor sources, the patches in this directory need to be applied.
-The current Lexbor version is 2.5.0.
+The current Lexbor version is 2.7.0.
 
 ## Overview
 
diff --git a/ext/lexbor/patches/update-lexbor.sh b/ext/lexbor/patches/update-lexbor.sh
new file mode 100755
index 000000000000..55e330a87644
--- /dev/null
+++ b/ext/lexbor/patches/update-lexbor.sh
@@ -0,0 +1,54 @@
+#!/usr/bin/env bash
+
+set -e
+
+PATCHES_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
+LEXBOR_REPO="https://github.com/lexbor/lexbor"
+LEXBOR_REF="v2.7.0"
+LEXBOR_BASE="$(cd "$PATCHES_DIR/.." && pwd)"
+LEXBOR_DIR="$LEXBOR_BASE/lexbor"
+LEXBOR_TMP_DIR="$LEXBOR_BASE/lexbor_tmp"
+LEXBOR_COMPONENTS=(core css dom encoding html ns ports punycode selectors tag unicode url)
+
+# Clone
+git clone "$LEXBOR_REPO" "$LEXBOR_TMP_DIR"
+(cd "$LEXBOR_TMP_DIR" && git checkout "$LEXBOR_REF")
+
+# Apply patches
+mapfile -t patches < <(ls "$PATCHES_DIR"/*.patch)
+cd "$LEXBOR_TMP_DIR"
+for patch in "${patches[@]}"; do
+    if ! git am -3 "$patch"; then
+        read -p "Patch $(basename "$patch") did not apply cleanly. Resolve, stage and press Enter to continue. "
+        git am --continue
+    fi
+done
+
+# Refresh patches
+NUM_PATCHES=${#patches[@]}
+git format-patch "HEAD~$NUM_PATCHES" -o "$PATCHES_DIR"
+
+# Run code-generation tools
+(cd "$LEXBOR_TMP_DIR/utils/lexbor/encoding" && python3 single-byte.py)
+(cd "$LEXBOR_TMP_DIR/utils/lexbor/html" && python3 tokenizer_entities_bst.py)
+
+# (Re)move files
+mv source/lexbor/encoding/multi_res.c  source/lexbor/encoding/multi.c
+mv source/lexbor/encoding/range_res.c  source/lexbor/encoding/range.c
+mv source/lexbor/encoding/single_res.c source/lexbor/encoding/single.c
+rm source/lexbor/html/serialize.c
+rm source/lexbor/ports/posix/lexbor/core/fs.c
+rm source/lexbor/ports/posix/lexbor/core/perf.c
+rm source/lexbor/ports/windows_nt/lexbor/core/fs.c
+rm source/lexbor/ports/windows_nt/lexbor/core/perf.c
+rm source/lexbor/selectors/selectors.c
+rm source/lexbor/selectors/selectors.h
+find . -name "*.cmake" -delete
+
+# Replace components
+for dir in "${LEXBOR_COMPONENTS[@]}"; do
+    dst="$LEXBOR_DIR/$dir"
+    rm -rf "$dst"
+    cp -r "source/lexbor/$dir" "$dst"
+done
+rm -rf "$LEXBOR_TMP_DIR"
diff --git a/ext/lexbor/php_lexbor.c b/ext/lexbor/php_lexbor.c
index 7f847bfb0afe..85f840624402 100644
--- a/ext/lexbor/php_lexbor.c
+++ b/ext/lexbor/php_lexbor.c
@@ -1,14 +1,12 @@
 /*
    +----------------------------------------------------------------------+
-   | Copyright (c) The PHP Group                                          |
+   | Copyright © The PHP Group and Contributors.                          |
    +----------------------------------------------------------------------+
-   | This source file is subject to version 3.01 of the PHP license,      |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | https://www.php.net/license/3_01.txt                                 |
-   | If you did not receive a copy of the PHP license and are unable to   |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@php.net so we can mail you a copy immediately.               |
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Authors: Niels Dossche                             |
    |          Mate Kocsis                             |
@@ -22,6 +20,7 @@
 #include "php.h"
 #include "zend_globals.h"
 #include "ext/standard/info.h"
+#include "lexbor/core/base.h"
 #include "lexbor/core/types.h"
 #include "lexbor/core/lexbor.h"
 
@@ -53,7 +52,7 @@ static PHP_MINFO_FUNCTION(lexbor)
 {
 	php_info_print_table_start();
 	php_info_print_table_row(2, "Lexbor support", "active");
-	php_info_print_table_row(2, "Lexbor version", LEXBOR_VERSION);
+	php_info_print_table_row(2, "Lexbor version", LEXBOR_VERSION_STRING);
 	php_info_print_table_end();
 }
 
diff --git a/ext/lexbor/php_lexbor.h b/ext/lexbor/php_lexbor.h
index fbdc71746dca..155998388549 100644
--- a/ext/lexbor/php_lexbor.h
+++ b/ext/lexbor/php_lexbor.h
@@ -1,14 +1,12 @@
 /*
    +----------------------------------------------------------------------+
-   | Copyright (c) The PHP Group                                          |
+   | Copyright © The PHP Group and Contributors.                          |
    +----------------------------------------------------------------------+
-   | This source file is subject to version 3.01 of the PHP license,      |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | https://www.php.net/license/3_01.txt                                 |
-   | If you did not receive a copy of the PHP license and are unable to   |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@php.net so we can mail you a copy immediately.               |
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Authors: Niels Dossche                             |
    |          Mate Kocsis                             |
diff --git a/ext/libxml/image_svg.c b/ext/libxml/image_svg.c
index 091f7e283168..69343fe298b0 100644
--- a/ext/libxml/image_svg.c
+++ b/ext/libxml/image_svg.c
@@ -1,14 +1,12 @@
 /*
    +----------------------------------------------------------------------+
-   | Copyright (c) The PHP Group                                          |
+   | Copyright © The PHP Group and Contributors.                          |
    +----------------------------------------------------------------------+
-   | This source file is subject to version 3.01 of the PHP license,      |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | https://www.php.net/license/3_01.txt                                 |
-   | If you did not receive a copy of the PHP license and are unable to   |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@php.net so we can mail you a copy immediately.               |
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Authors: Niels Dossche                             |
    +----------------------------------------------------------------------+
diff --git a/ext/libxml/image_svg.h b/ext/libxml/image_svg.h
index d023334af36b..b665c2c8d912 100644
--- a/ext/libxml/image_svg.h
+++ b/ext/libxml/image_svg.h
@@ -1,16 +1,14 @@
 /*
    +----------------------------------------------------------------------+
-   | Copyright (c) The PHP Group                                          |
+   | Copyright © The PHP Group and Contributors.                          |
    +----------------------------------------------------------------------+
-   | This source file is subject to version 3.01 of the PHP license,      |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | https://www.php.net/license/3_01.txt                                 |
-   | If you did not receive a copy of the PHP license and are unable to   |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@php.net so we can mail you a copy immediately.               |
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
-   | Authors: Niels Dossche                              |
+   | Authors: Niels Dossche                             |
    +----------------------------------------------------------------------+
  */
 
diff --git a/ext/libxml/libxml.c b/ext/libxml/libxml.c
index 5a0e1f3c7a09..1f3d7c4d8789 100644
--- a/ext/libxml/libxml.c
+++ b/ext/libxml/libxml.c
@@ -1,14 +1,12 @@
 /*
    +----------------------------------------------------------------------+
-   | Copyright (c) The PHP Group                                          |
+   | Copyright © The PHP Group and Contributors.                          |
    +----------------------------------------------------------------------+
-   | This source file is subject to version 3.01 of the PHP license,      |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | https://www.php.net/license/3_01.txt                                 |
-   | If you did not receive a copy of the PHP license and are unable to   |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@php.net so we can mail you a copy immediately.               |
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Authors: Shane Caraveo                                |
    |          Wez Furlong                           |
diff --git a/ext/libxml/mime_sniff.c b/ext/libxml/mime_sniff.c
index 14034f3db267..b78a7a2d31bb 100644
--- a/ext/libxml/mime_sniff.c
+++ b/ext/libxml/mime_sniff.c
@@ -1,14 +1,12 @@
 /*
    +----------------------------------------------------------------------+
-   | Copyright (c) The PHP Group                                          |
+   | Copyright © The PHP Group and Contributors.                          |
    +----------------------------------------------------------------------+
-   | This source file is subject to version 3.01 of the PHP license,      |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | https://www.php.net/license/3_01.txt                                 |
-   | If you did not receive a copy of the PHP license and are unable to   |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@php.net so we can mail you a copy immediately.               |
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Authors: Niels Dossche                             |
    +----------------------------------------------------------------------+
@@ -273,7 +271,7 @@ PHP_LIBXML_API zend_string *php_libxml_sniff_charset_from_string(const char *sta
 			/* 11.9.1. Set parameterValue to the result of collecting a sequence of code points that are not ';' */
 			size_t parameter_value_length = collect_a_sequence_of_code_points(start, end, is_not_semicolon);
 			parameter_value = zend_string_init(start, parameter_value_length, false);
-			start += parameter_name_length;
+			start += parameter_value_length;
 
 			/* 11.9.2. Remove trailing HTTP whitespace from parameterValue */
 			while (ZSTR_LEN(parameter_value) > 0 && is_http_whitespace(ZSTR_VAL(parameter_value)[ZSTR_LEN(parameter_value) - 1])) {
diff --git a/ext/libxml/php_libxml.h b/ext/libxml/php_libxml.h
index eb10e7e4cb93..5896f70803f8 100644
--- a/ext/libxml/php_libxml.h
+++ b/ext/libxml/php_libxml.h
@@ -1,14 +1,12 @@
 /*
    +----------------------------------------------------------------------+
-   | Copyright (c) The PHP Group                                          |
+   | Copyright © The PHP Group and Contributors.                          |
    +----------------------------------------------------------------------+
-   | This source file is subject to version 3.01 of the PHP license,      |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | https://www.php.net/license/3_01.txt                                 |
-   | If you did not receive a copy of the PHP license and are unable to   |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@php.net so we can mail you a copy immediately.               |
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Authors: Shane Caraveo                                |
    |          Wez Furlong                           |
diff --git a/ext/libxml/tests/bug61367-read_2.phpt b/ext/libxml/tests/bug61367-read_2.phpt
index f4b0f300293c..ec4ce827336b 100644
--- a/ext/libxml/tests/bug61367-read_2.phpt
+++ b/ext/libxml/tests/bug61367-read_2.phpt
@@ -5,6 +5,7 @@ dom
 --SKIPIF--
 = 2.9.12 only');
+if (preg_match('/[^\x00-\x7F]/', __DIR__)) die('skip path contains non-ASCII characters that libxml URI parser rejects');
 ?>
 --INI--
 open_basedir=.
@@ -58,6 +59,6 @@ bool(true)
 int(4)
 bool(true)
 
-%s: DOMDocument::loadXML(): %Sfailed to load %s
+%s: DOMDocument::loadXML(): %s
 
 Warning: Attempt to read property "nodeValue" on null in %s on line %d
diff --git a/ext/libxml/tests/libxml_disable_entity_loader_2.phpt b/ext/libxml/tests/libxml_disable_entity_loader_2.phpt
index fb71c0c8d756..be386154bb20 100644
--- a/ext/libxml/tests/libxml_disable_entity_loader_2.phpt
+++ b/ext/libxml/tests/libxml_disable_entity_loader_2.phpt
@@ -6,6 +6,7 @@ dom
 --SKIPIF--
 = 2.9.12 only');
+if (preg_match('/[^\x00-\x7F]/', __DIR__)) die('skip path contains non-ASCII characters that libxml URI parser rejects');
 ?>
 --FILE--
 
 --FILE--
 .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
 */
 
diff --git a/ext/mbstring/libmbfl/filters/mbfilter_singlebyte.h b/ext/mbstring/libmbfl/filters/mbfilter_singlebyte.h
index 5cf331a51c7d..775ababfde08 100644
--- a/ext/mbstring/libmbfl/filters/mbfilter_singlebyte.h
+++ b/ext/mbstring/libmbfl/filters/mbfilter_singlebyte.h
@@ -1,14 +1,12 @@
 /*
    +----------------------------------------------------------------------+
-   | Copyright (c) The PHP Group                                          |
+   | Copyright © The PHP Group and Contributors.                          |
    +----------------------------------------------------------------------+
-   | This source file is subject to version 3.01 of the PHP license,      |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | https://www.php.net/license/3_01.txt                                 |
-   | If you did not receive a copy of the PHP license and are unable to   |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@php.net so we can mail you a copy immediately.               |
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
 */
 
diff --git a/ext/mbstring/libmbfl/filters/mbfilter_utf7.c b/ext/mbstring/libmbfl/filters/mbfilter_utf7.c
index 87bdc590e6d5..0ee74c032140 100644
--- a/ext/mbstring/libmbfl/filters/mbfilter_utf7.c
+++ b/ext/mbstring/libmbfl/filters/mbfilter_utf7.c
@@ -260,7 +260,7 @@ int mbfl_filt_conv_utf7_wchar(int c, mbfl_convert_filter *filter)
 		}
 		break;
 
-		EMPTY_SWITCH_DEFAULT_CASE();
+		default: ZEND_UNREACHABLE();
 	}
 
 	return 0;
@@ -368,7 +368,7 @@ int mbfl_filt_conv_wchar_utf7(int c, mbfl_convert_filter *filter)
 		}
 		break;
 
-		EMPTY_SWITCH_DEFAULT_CASE();
+		default: ZEND_UNREACHABLE();
 	}
 
 	return 0;
diff --git a/ext/mbstring/libmbfl/filters/mbfilter_utf7imap.c b/ext/mbstring/libmbfl/filters/mbfilter_utf7imap.c
index ac49e6a165b4..ba34255ebc13 100644
--- a/ext/mbstring/libmbfl/filters/mbfilter_utf7imap.c
+++ b/ext/mbstring/libmbfl/filters/mbfilter_utf7imap.c
@@ -282,7 +282,7 @@ int mbfl_filt_conv_utf7imap_wchar(int c, mbfl_convert_filter *filter)
 		}
 		break;
 
-		EMPTY_SWITCH_DEFAULT_CASE();
+		default: ZEND_UNREACHABLE();
 	}
 
 	return 0;
@@ -409,7 +409,7 @@ int mbfl_filt_conv_wchar_utf7imap(int c, mbfl_convert_filter *filter)
 		}
 		break;
 
-		EMPTY_SWITCH_DEFAULT_CASE();
+		default: ZEND_UNREACHABLE();
 	}
 
 	return 0;
diff --git a/ext/mbstring/libmbfl/mbfl/mbfl_encoding.c b/ext/mbstring/libmbfl/mbfl/mbfl_encoding.c
index 63ca5bc6a2e7..f7c99461719e 100644
--- a/ext/mbstring/libmbfl/mbfl/mbfl_encoding.c
+++ b/ext/mbstring/libmbfl/mbfl/mbfl_encoding.c
@@ -342,7 +342,8 @@ const mbfl_encoding *mbfl_name2encoding_ex(const char *name, size_t name_len)
 	/* search MIME charset name */
 	for (encoding = mbfl_encoding_ptr_list; *encoding; encoding++) {
 		if ((*encoding)->mime_name) {
-			if (strncasecmp((*encoding)->mime_name, name, name_len) == 0 && (*encoding)->mime_name[name_len] == '\0') {
+			size_t mime_len = strlen((*encoding)->mime_name);
+			if (mime_len == name_len && strncasecmp((*encoding)->mime_name, name, name_len) == 0) {
 				return *encoding;
 			}
 		}
@@ -352,7 +353,8 @@ const mbfl_encoding *mbfl_name2encoding_ex(const char *name, size_t name_len)
 	for (encoding = mbfl_encoding_ptr_list; *encoding; encoding++) {
 		if ((*encoding)->aliases) {
 			for (const char **alias = (*encoding)->aliases; *alias; alias++) {
-				if (strncasecmp(name, *alias, name_len) == 0 && (*alias)[name_len] == '\0') {
+				size_t alias_len = strlen(*alias);
+				if (alias_len == name_len && strncasecmp(name, *alias, name_len) == 0) {
 					return *encoding;
 				}
 			}
diff --git a/ext/mbstring/mb_gpc.c b/ext/mbstring/mb_gpc.c
index 4445a0dc5a1b..d0ee90266b52 100644
--- a/ext/mbstring/mb_gpc.c
+++ b/ext/mbstring/mb_gpc.c
@@ -1,14 +1,12 @@
 /*
    +----------------------------------------------------------------------+
-   | Copyright (c) The PHP Group                                          |
+   | Copyright © The PHP Group and Contributors.                          |
    +----------------------------------------------------------------------+
-   | This source file is subject to version 3.01 of the PHP license,      |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | https://www.php.net/license/3_01.txt                                 |
-   | If you did not receive a copy of the PHP license and are unable to   |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@php.net so we can mail you a copy immediately.               |
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Author: Rui Hirokawa                               |
    |         Moriyoshi Koizumi                         |
diff --git a/ext/mbstring/mb_gpc.h b/ext/mbstring/mb_gpc.h
index 63337755cdea..fdbb0c818238 100644
--- a/ext/mbstring/mb_gpc.h
+++ b/ext/mbstring/mb_gpc.h
@@ -1,14 +1,12 @@
 /*
    +----------------------------------------------------------------------+
-   | Copyright (c) The PHP Group                                          |
+   | Copyright © The PHP Group and Contributors.                          |
    +----------------------------------------------------------------------+
-   | This source file is subject to version 3.01 of the PHP license,      |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | https://www.php.net/license/3_01.txt                                 |
-   | If you did not receive a copy of the PHP license and are unable to   |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@php.net so we can mail you a copy immediately.               |
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Author: Rui Hirokawa                               |
    |         Moriyoshi Koizumi                         |
diff --git a/ext/mbstring/mbstring.c b/ext/mbstring/mbstring.c
index 95b624ef1d2d..23420f87131f 100644
--- a/ext/mbstring/mbstring.c
+++ b/ext/mbstring/mbstring.c
@@ -1,14 +1,12 @@
 /*
    +----------------------------------------------------------------------+
-   | Copyright (c) The PHP Group                                          |
+   | Copyright © The PHP Group and Contributors.                          |
    +----------------------------------------------------------------------+
-   | This source file is subject to version 3.01 of the PHP license,      |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | https://www.php.net/license/3_01.txt                                 |
-   | If you did not receive a copy of the PHP license and are unable to   |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@php.net so we can mail you a copy immediately.               |
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Author: Tsukada Takuya               |
    |         Rui Hirokawa                               |
@@ -56,6 +54,7 @@
 #include "mb_gpc.h"
 
 #ifdef HAVE_MBREGEX
+# include "zend_attributes.h"
 # include "php_mbregex.h"
 #endif
 
@@ -625,7 +624,7 @@ static char *php_mb_rfc1867_getword(const zend_encoding *encoding, char **line,
 
 static char *php_mb_rfc1867_getword_conf(const zend_encoding *encoding, char *str) /* {{{ */
 {
-	while (*str && isspace(*(unsigned char *)str)) {
+	while (*str && isspace((unsigned char)*str)) {
 		++str;
 	}
 
@@ -641,7 +640,7 @@ static char *php_mb_rfc1867_getword_conf(const zend_encoding *encoding, char *st
 	} else {
 		char *strend = str;
 
-		while (*strend && !isspace(*(unsigned char *)strend)) {
+		while (*strend && !isspace((unsigned char)*strend)) {
 			++strend;
 		}
 		return php_mb_rfc1867_substring_conf(encoding, str, strend - str, 0);
@@ -1216,17 +1215,17 @@ PHP_FUNCTION(mb_language)
 	ZEND_PARSE_PARAMETERS_END();
 
 	if (name == NULL) {
-		RETVAL_STRING((char *)mbfl_no_language2name(MBSTRG(language)));
+		RETVAL_STRING(mbfl_no_language2name(MBSTRG(language)));
 	} else {
-		zend_string *ini_name = ZSTR_INIT_LITERAL("mbstring.language", 0);
+		zend_string *ini_name = ZSTR_INIT_LITERAL("mbstring.language", false);
 		if (FAILURE == zend_alter_ini_entry(ini_name, name, PHP_INI_USER, PHP_INI_STAGE_RUNTIME)) {
 			zend_argument_value_error(1, "must be a valid language, \"%s\" given", ZSTR_VAL(name));
-			zend_string_release_ex(ini_name, 0);
+			zend_string_release_ex(ini_name, false);
 			RETURN_THROWS();
 		}
 		// TODO Make return void
 		RETVAL_TRUE;
-		zend_string_release_ex(ini_name, 0);
+		zend_string_release_ex(ini_name, false);
 	}
 }
 /* }}} */
@@ -1509,7 +1508,7 @@ PHP_FUNCTION(mb_preferred_mime_name)
 		php_error_docref(NULL, E_WARNING, "No MIME preferred name corresponding to \"%s\"", name);
 		RETVAL_FALSE;
 	} else {
-		RETVAL_STRING((char *)preferred_name);
+		RETVAL_STRING(preferred_name);
 	}
 }
 /* }}} */
@@ -3517,7 +3516,7 @@ PHP_FUNCTION(mb_detect_encoding)
 		RETURN_FALSE;
 	}
 
-	RETVAL_STRING((char *)ret->name);
+	RETVAL_STRING(ret->name);
 }
 /* }}} */
 
@@ -3563,7 +3562,7 @@ PHP_FUNCTION(mb_encoding_aliases)
 	array_init(return_value);
 	if (encoding->aliases != NULL) {
 		for (const char **alias = encoding->aliases; *alias; ++alias) {
-			add_next_index_string(return_value, (char *)*alias);
+			add_next_index_string(return_value, *alias);
 		}
 	}
 }
@@ -4482,12 +4481,14 @@ static int _php_mbstr_parse_mail_headers(HashTable *ht, const char *str, size_t
 								fld_val = zend_string_init(token, token_pos, 0);
 							}
 
-							if (fld_name != NULL && fld_val != NULL) {
-								zval val;
-								zend_str_tolower(ZSTR_VAL(fld_name), ZSTR_LEN(fld_name));
-								ZVAL_STR(&val, fld_val);
+							if (fld_name != NULL) {
+								if (fld_val != NULL) {
+									zval val;
+									zend_str_tolower(ZSTR_VAL(fld_name), ZSTR_LEN(fld_name));
+									ZVAL_STR(&val, fld_val);
 
-								zend_hash_update(ht, fld_name, &val);
+									zend_hash_update(ht, fld_name, &val);
+								}
 
 								zend_string_release_ex(fld_name, 0);
 							}
@@ -4528,11 +4529,13 @@ static int _php_mbstr_parse_mail_headers(HashTable *ht, const char *str, size_t
 		if(token && token_pos > 0) {
 			fld_val = zend_string_init(token, token_pos, 0);
 		}
-		if (fld_name != NULL && fld_val != NULL) {
-			zval val;
-			zend_str_tolower(ZSTR_VAL(fld_name), ZSTR_LEN(fld_name));
-			ZVAL_STR(&val, fld_val);
-			zend_hash_update(ht, fld_name, &val);
+		if (fld_name != NULL) {
+			if (fld_val != NULL) {
+				zval val;
+				zend_str_tolower(ZSTR_VAL(fld_name), ZSTR_LEN(fld_name));
+				ZVAL_STR(&val, fld_val);
+				zend_hash_update(ht, fld_name, &val);
+			}
 
 			zend_string_release_ex(fld_name, 0);
 		}
@@ -4768,7 +4771,7 @@ PHP_FUNCTION(mb_send_mail)
 
 	str_headers = smart_str_extract(&str);
 
-	zend_string *force_extra_parameters = zend_ini_str_ex("mail.force_extra_parameters", strlen("mail.force_extra_parameters"), false, NULL);
+	zend_string *force_extra_parameters = zend_ini_str_literal("mail.force_extra_parameters");
 	if (force_extra_parameters) {
 		extra_cmd = php_escape_shell_cmd(force_extra_parameters);
 	} else if (extra_cmd) {
@@ -4804,7 +4807,7 @@ PHP_FUNCTION(mb_get_info)
 {
 	zend_string *type = NULL;
 	size_t n;
-	char *name;
+	const char *name;
 	zval row;
 	const mbfl_encoding **entry;
 	const mbfl_language *lang = mbfl_no2language(MBSTRG(language));
@@ -4819,26 +4822,26 @@ PHP_FUNCTION(mb_get_info)
 	if (!type || zend_string_equals_literal_ci(type, "all")) {
 		array_init(return_value);
 		if (MBSTRG(current_internal_encoding)) {
-			add_assoc_string(return_value, "internal_encoding", (char *)MBSTRG(current_internal_encoding)->name);
+			add_assoc_string(return_value, "internal_encoding", MBSTRG(current_internal_encoding)->name);
 		}
 		if (MBSTRG(http_input_identify)) {
-			add_assoc_string(return_value, "http_input", (char *)MBSTRG(http_input_identify)->name);
+			add_assoc_string(return_value, "http_input", MBSTRG(http_input_identify)->name);
 		}
 		if (MBSTRG(current_http_output_encoding)) {
-			add_assoc_string(return_value, "http_output", (char *)MBSTRG(current_http_output_encoding)->name);
+			add_assoc_string(return_value, "http_output", MBSTRG(current_http_output_encoding)->name);
 		}
 
 		add_assoc_str(return_value, "http_output_conv_mimetypes",
-			zend_ini_str("mbstring.http_output_conv_mimetypes", sizeof("mbstring.http_output_conv_mimetypes") - 1, 0)
+			zend_string_copy(zend_ini_str_literal("mbstring.http_output_conv_mimetypes"))
 		);
 
-		name = (char *)mbfl_no_encoding2name(lang->mail_charset);
+		name = mbfl_no_encoding2name(lang->mail_charset);
 		add_assoc_string(return_value, "mail_charset", name);
 
-		name = (char *)mbfl_no_encoding2name(lang->mail_header_encoding);
+		name = mbfl_no_encoding2name(lang->mail_header_encoding);
 		add_assoc_string(return_value, "mail_header_encoding", name);
 
-		name = (char *)mbfl_no_encoding2name(lang->mail_body_encoding);
+		name = mbfl_no_encoding2name(lang->mail_body_encoding);
 		add_assoc_string(return_value, "mail_body_encoding", name);
 
 		add_assoc_long(return_value, "illegal_chars", MBSTRG(illegalchars));
@@ -4849,7 +4852,7 @@ PHP_FUNCTION(mb_get_info)
 			add_assoc_string(return_value, "encoding_translation", "Off");
 		}
 
-		name = (char *)mbfl_no_language2name(MBSTRG(language));
+		name = mbfl_no_language2name(MBSTRG(language));
 		add_assoc_string(return_value, "language", name);
 
 		// TODO Seems to always have one entry at least?
@@ -4880,31 +4883,25 @@ PHP_FUNCTION(mb_get_info)
 		}
 	} else if (zend_string_equals_literal_ci(type, "internal_encoding")) {
 		ZEND_ASSERT(MBSTRG(current_internal_encoding));
-		RETURN_STRING((char *)MBSTRG(current_internal_encoding)->name);
+		RETURN_STRING(MBSTRG(current_internal_encoding)->name);
 	} else if (zend_string_equals_literal_ci(type, "http_input")) {
 		if (MBSTRG(http_input_identify)) {
-			RETURN_STRING((char *)MBSTRG(http_input_identify)->name);
+			RETURN_STRING(MBSTRG(http_input_identify)->name);
 		}
 		RETURN_NULL();
 	} else if (zend_string_equals_literal_ci(type, "http_output")) {
 		ZEND_ASSERT(MBSTRG(current_http_output_encoding));
-		RETURN_STRING((char *)MBSTRG(current_http_output_encoding)->name);
+		RETURN_STRING(MBSTRG(current_http_output_encoding)->name);
 	} else if (zend_string_equals_literal_ci(type, "http_output_conv_mimetypes")) {
-		RETURN_STR(
-			zend_ini_str(
-				"mbstring.http_output_conv_mimetypes",
-				sizeof("mbstring.http_output_conv_mimetypes") - 1,
-				false
-			)
-		);
+		RETURN_STR_COPY(zend_ini_str_literal("mbstring.http_output_conv_mimetypes"));
 	} else if (zend_string_equals_literal_ci(type, "mail_charset")) {
-		name = (char *)mbfl_no_encoding2name(lang->mail_charset);
+		name = mbfl_no_encoding2name(lang->mail_charset);
 		RETURN_STRING(name);
 	} else if (zend_string_equals_literal_ci(type, "mail_header_encoding")) {
-		name = (char *)mbfl_no_encoding2name(lang->mail_header_encoding);
+		name = mbfl_no_encoding2name(lang->mail_header_encoding);
 		RETURN_STRING(name);
 	} else if (zend_string_equals_literal_ci(type, "mail_body_encoding")) {
-		name = (char *)mbfl_no_encoding2name(lang->mail_body_encoding);
+		name = mbfl_no_encoding2name(lang->mail_body_encoding);
 		RETURN_STRING(name);
 	} else if (zend_string_equals_literal_ci(type, "illegal_chars")) {
 		RETURN_LONG(MBSTRG(illegalchars));
@@ -4915,7 +4912,7 @@ PHP_FUNCTION(mb_get_info)
 			RETURN_STRING("Off");
 		}
 	} else if (zend_string_equals_literal_ci(type, "language")) {
-		name = (char *)mbfl_no_language2name(MBSTRG(language));
+		name = mbfl_no_language2name(MBSTRG(language));
 		RETURN_STRING(name);
 	} else if (zend_string_equals_literal_ci(type, "detect_order")) {
 		// TODO Seems to always have one entry at least?
@@ -5266,7 +5263,7 @@ static bool mb_fast_check_utf8_default(zend_string *str)
 			}
 			break;
 
-			EMPTY_SWITCH_DEFAULT_CASE();
+			default: ZEND_UNREACHABLE();
 		}
 	}
 
diff --git a/ext/mbstring/mbstring.h b/ext/mbstring/mbstring.h
index 7256605bd246..c12c61290a15 100644
--- a/ext/mbstring/mbstring.h
+++ b/ext/mbstring/mbstring.h
@@ -1,14 +1,12 @@
 /*
    +----------------------------------------------------------------------+
-   | Copyright (c) The PHP Group                                          |
+   | Copyright © The PHP Group and Contributors.                          |
    +----------------------------------------------------------------------+
-   | This source file is subject to version 3.01 of the PHP license,      |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | https://www.php.net/license/3_01.txt                                 |
-   | If you did not receive a copy of the PHP license and are unable to   |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@php.net so we can mail you a copy immediately.               |
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Author: Tsukada Takuya               |
    |         Hironori Sato                              |
diff --git a/ext/mbstring/mbstring.stub.php b/ext/mbstring/mbstring.stub.php
index af9c5cbb93ea..109a3ad564d8 100644
--- a/ext/mbstring/mbstring.stub.php
+++ b/ext/mbstring/mbstring.stub.php
@@ -7,6 +7,7 @@
  * @var string
  * @cvalue php_mb_oniguruma_version
  */
+#[\Deprecated(since: '8.6', message: "because the underlying library is no longer maintained")]
 const MB_ONIGURUMA_VERSION = UNKNOWN;
 #endif
 
@@ -197,57 +198,73 @@ function mb_str_pad(string $string, int $length, string $pad_string = " ", int $
 
 #ifdef HAVE_MBREGEX
 /** @refcount 1 */
+#[\Deprecated(since: '8.6', message: "because the underlying library is no longer maintained")]
 function mb_regex_encoding(?string $encoding = null): string|bool {}
 
 /** @param array $matches */
+#[\Deprecated(since: '8.6', message: "because the underlying library is no longer maintained")]
 function mb_ereg(string $pattern, string $string, &$matches = null): bool {}
 
 /** @param array $matches */
+#[\Deprecated(since: '8.6', message: "because the underlying library is no longer maintained")]
 function mb_eregi(string $pattern, string $string, &$matches = null): bool {}
 
 /** @refcount 1 */
+#[\Deprecated(since: '8.6', message: "because the underlying library is no longer maintained")]
 function mb_ereg_replace(string $pattern, string $replacement, string $string, ?string $options = null): string|false|null {}
 
 /** @refcount 1 */
+#[\Deprecated(since: '8.6', message: "because the underlying library is no longer maintained")]
 function mb_eregi_replace(string $pattern, string $replacement, string $string, ?string $options = null): string|false|null {}
 
 /** @refcount 1 */
+#[\Deprecated(since: '8.6', message: "because the underlying library is no longer maintained")]
 function mb_ereg_replace_callback(string $pattern, callable $callback, string $string, ?string $options = null): string|false|null {}
 
 /**
  * @return array|false
  * @refcount 1
  */
+#[\Deprecated(since: '8.6', message: "because the underlying library is no longer maintained")]
 function mb_split(string $pattern, string $string, int $limit = -1): array|false {}
 
+#[\Deprecated(since: '8.6', message: "because the underlying library is no longer maintained")]
 function mb_ereg_match(string $pattern, string $string, ?string $options = null): bool {}
 
+#[\Deprecated(since: '8.6', message: "because the underlying library is no longer maintained")]
 function mb_ereg_search(?string $pattern = null, ?string $options = null): bool {}
 
 /**
  * @return array|false
  * @refcount 1
  */
+#[\Deprecated(since: '8.6', message: "because the underlying library is no longer maintained")]
 function mb_ereg_search_pos(?string $pattern = null, ?string $options = null): array|false {}
 
 /**
  * @return array|false
  * @refcount 1
  */
+#[\Deprecated(since: '8.6', message: "because the underlying library is no longer maintained")]
 function mb_ereg_search_regs(?string $pattern = null, ?string $options = null): array|false {}
 
+#[\Deprecated(since: '8.6', message: "because the underlying library is no longer maintained")]
 function mb_ereg_search_init(string $string, ?string $pattern = null, ?string $options = null): bool {}
 
 /**
  * @return array|false
  * @refcount 1
  */
+#[\Deprecated(since: '8.6', message: "because the underlying library is no longer maintained")]
 function mb_ereg_search_getregs(): array|false {}
 
+#[\Deprecated(since: '8.6', message: "because the underlying library is no longer maintained")]
 function mb_ereg_search_getpos(): int {}
 
+#[\Deprecated(since: '8.6', message: "because the underlying library is no longer maintained")]
 function mb_ereg_search_setpos(int $offset): bool {}
 
 /** @refcount 1 */
+#[\Deprecated(since: '8.6', message: "because the underlying library is no longer maintained")]
 function mb_regex_set_options(?string $options = null): string {}
 #endif
diff --git a/ext/mbstring/mbstring_arginfo.h b/ext/mbstring/mbstring_arginfo.h
index 8fb83425ee1d..bc9db3d415c1 100644
--- a/ext/mbstring/mbstring_arginfo.h
+++ b/ext/mbstring/mbstring_arginfo.h
@@ -1,5 +1,5 @@
 /* This is a generated file, edit mbstring.stub.php instead.
- * Stub hash: 03c07f68bea7d7b96e6dc11f180f45663b859ed3 */
+ * Stub hash: f02c317efd6814f902ea75c9d222893713546845 */
 
 ZEND_BEGIN_ARG_WITH_RETURN_TYPE_MASK_EX(arginfo_mb_language, 0, 0, MAY_BE_STRING|MAY_BE_BOOL)
 	ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, language, IS_STRING, 1, "null")
@@ -413,22 +413,22 @@ static const zend_function_entry ext_functions[] = {
 	ZEND_FE(mb_chr, arginfo_mb_chr)
 	ZEND_FE(mb_str_pad, arginfo_mb_str_pad)
 #if defined(HAVE_MBREGEX)
-	ZEND_FE(mb_regex_encoding, arginfo_mb_regex_encoding)
-	ZEND_FE(mb_ereg, arginfo_mb_ereg)
-	ZEND_FE(mb_eregi, arginfo_mb_eregi)
-	ZEND_FE(mb_ereg_replace, arginfo_mb_ereg_replace)
-	ZEND_FE(mb_eregi_replace, arginfo_mb_eregi_replace)
-	ZEND_FE(mb_ereg_replace_callback, arginfo_mb_ereg_replace_callback)
-	ZEND_FE(mb_split, arginfo_mb_split)
-	ZEND_FE(mb_ereg_match, arginfo_mb_ereg_match)
-	ZEND_FE(mb_ereg_search, arginfo_mb_ereg_search)
-	ZEND_FE(mb_ereg_search_pos, arginfo_mb_ereg_search_pos)
-	ZEND_FE(mb_ereg_search_regs, arginfo_mb_ereg_search_regs)
-	ZEND_FE(mb_ereg_search_init, arginfo_mb_ereg_search_init)
-	ZEND_FE(mb_ereg_search_getregs, arginfo_mb_ereg_search_getregs)
-	ZEND_FE(mb_ereg_search_getpos, arginfo_mb_ereg_search_getpos)
-	ZEND_FE(mb_ereg_search_setpos, arginfo_mb_ereg_search_setpos)
-	ZEND_FE(mb_regex_set_options, arginfo_mb_regex_set_options)
+	ZEND_RAW_FENTRY("mb_regex_encoding", zif_mb_regex_encoding, arginfo_mb_regex_encoding, ZEND_ACC_DEPRECATED, NULL, NULL)
+	ZEND_RAW_FENTRY("mb_ereg", zif_mb_ereg, arginfo_mb_ereg, ZEND_ACC_DEPRECATED, NULL, NULL)
+	ZEND_RAW_FENTRY("mb_eregi", zif_mb_eregi, arginfo_mb_eregi, ZEND_ACC_DEPRECATED, NULL, NULL)
+	ZEND_RAW_FENTRY("mb_ereg_replace", zif_mb_ereg_replace, arginfo_mb_ereg_replace, ZEND_ACC_DEPRECATED, NULL, NULL)
+	ZEND_RAW_FENTRY("mb_eregi_replace", zif_mb_eregi_replace, arginfo_mb_eregi_replace, ZEND_ACC_DEPRECATED, NULL, NULL)
+	ZEND_RAW_FENTRY("mb_ereg_replace_callback", zif_mb_ereg_replace_callback, arginfo_mb_ereg_replace_callback, ZEND_ACC_DEPRECATED, NULL, NULL)
+	ZEND_RAW_FENTRY("mb_split", zif_mb_split, arginfo_mb_split, ZEND_ACC_DEPRECATED, NULL, NULL)
+	ZEND_RAW_FENTRY("mb_ereg_match", zif_mb_ereg_match, arginfo_mb_ereg_match, ZEND_ACC_DEPRECATED, NULL, NULL)
+	ZEND_RAW_FENTRY("mb_ereg_search", zif_mb_ereg_search, arginfo_mb_ereg_search, ZEND_ACC_DEPRECATED, NULL, NULL)
+	ZEND_RAW_FENTRY("mb_ereg_search_pos", zif_mb_ereg_search_pos, arginfo_mb_ereg_search_pos, ZEND_ACC_DEPRECATED, NULL, NULL)
+	ZEND_RAW_FENTRY("mb_ereg_search_regs", zif_mb_ereg_search_regs, arginfo_mb_ereg_search_regs, ZEND_ACC_DEPRECATED, NULL, NULL)
+	ZEND_RAW_FENTRY("mb_ereg_search_init", zif_mb_ereg_search_init, arginfo_mb_ereg_search_init, ZEND_ACC_DEPRECATED, NULL, NULL)
+	ZEND_RAW_FENTRY("mb_ereg_search_getregs", zif_mb_ereg_search_getregs, arginfo_mb_ereg_search_getregs, ZEND_ACC_DEPRECATED, NULL, NULL)
+	ZEND_RAW_FENTRY("mb_ereg_search_getpos", zif_mb_ereg_search_getpos, arginfo_mb_ereg_search_getpos, ZEND_ACC_DEPRECATED, NULL, NULL)
+	ZEND_RAW_FENTRY("mb_ereg_search_setpos", zif_mb_ereg_search_setpos, arginfo_mb_ereg_search_setpos, ZEND_ACC_DEPRECATED, NULL, NULL)
+	ZEND_RAW_FENTRY("mb_regex_set_options", zif_mb_regex_set_options, arginfo_mb_regex_set_options, ZEND_ACC_DEPRECATED, NULL, NULL)
 #endif
 	ZEND_FE_END
 };
@@ -436,7 +436,7 @@ static const zend_function_entry ext_functions[] = {
 static void register_mbstring_symbols(int module_number)
 {
 #if defined(HAVE_MBREGEX)
-	REGISTER_STRING_CONSTANT("MB_ONIGURUMA_VERSION", php_mb_oniguruma_version, CONST_PERSISTENT);
+	zend_constant *const_MB_ONIGURUMA_VERSION = REGISTER_STRING_CONSTANT("MB_ONIGURUMA_VERSION", php_mb_oniguruma_version, CONST_PERSISTENT | CONST_DEPRECATED);
 #endif
 	REGISTER_LONG_CONSTANT("MB_CASE_UPPER", PHP_UNICODE_CASE_UPPER, CONST_PERSISTENT);
 	REGISTER_LONG_CONSTANT("MB_CASE_LOWER", PHP_UNICODE_CASE_LOWER, CONST_PERSISTENT);
@@ -446,4 +446,145 @@ static void register_mbstring_symbols(int module_number)
 	REGISTER_LONG_CONSTANT("MB_CASE_LOWER_SIMPLE", PHP_UNICODE_CASE_LOWER_SIMPLE, CONST_PERSISTENT);
 	REGISTER_LONG_CONSTANT("MB_CASE_TITLE_SIMPLE", PHP_UNICODE_CASE_TITLE_SIMPLE, CONST_PERSISTENT);
 	REGISTER_LONG_CONSTANT("MB_CASE_FOLD_SIMPLE", PHP_UNICODE_CASE_FOLD_SIMPLE, CONST_PERSISTENT);
+
+#if defined(HAVE_MBREGEX)
+
+	zend_attribute *attribute_Deprecated_func_mb_regex_encoding_0 = zend_add_function_attribute(zend_hash_str_find_ptr(CG(function_table), "mb_regex_encoding", sizeof("mb_regex_encoding") - 1), ZSTR_KNOWN(ZEND_STR_DEPRECATED_CAPITALIZED), 2);
+	zend_string *attribute_Deprecated_func_mb_regex_encoding_0_arg0_str = zend_string_init("8.6", strlen("8.6"), 1);
+	ZVAL_STR(&attribute_Deprecated_func_mb_regex_encoding_0->args[0].value, attribute_Deprecated_func_mb_regex_encoding_0_arg0_str);
+	attribute_Deprecated_func_mb_regex_encoding_0->args[0].name = ZSTR_KNOWN(ZEND_STR_SINCE);
+	zend_string *attribute_Deprecated_func_mb_regex_encoding_0_arg1_str = zend_string_init("because the underlying library is no longer maintained", strlen("because the underlying library is no longer maintained"), 1);
+	ZVAL_STR(&attribute_Deprecated_func_mb_regex_encoding_0->args[1].value, attribute_Deprecated_func_mb_regex_encoding_0_arg1_str);
+	attribute_Deprecated_func_mb_regex_encoding_0->args[1].name = ZSTR_KNOWN(ZEND_STR_MESSAGE);
+
+	zend_attribute *attribute_Deprecated_func_mb_ereg_0 = zend_add_function_attribute(zend_hash_str_find_ptr(CG(function_table), "mb_ereg", sizeof("mb_ereg") - 1), ZSTR_KNOWN(ZEND_STR_DEPRECATED_CAPITALIZED), 2);
+	zend_string *attribute_Deprecated_func_mb_ereg_0_arg0_str = zend_string_init("8.6", strlen("8.6"), 1);
+	ZVAL_STR(&attribute_Deprecated_func_mb_ereg_0->args[0].value, attribute_Deprecated_func_mb_ereg_0_arg0_str);
+	attribute_Deprecated_func_mb_ereg_0->args[0].name = ZSTR_KNOWN(ZEND_STR_SINCE);
+	zend_string *attribute_Deprecated_func_mb_ereg_0_arg1_str = zend_string_init("because the underlying library is no longer maintained", strlen("because the underlying library is no longer maintained"), 1);
+	ZVAL_STR(&attribute_Deprecated_func_mb_ereg_0->args[1].value, attribute_Deprecated_func_mb_ereg_0_arg1_str);
+	attribute_Deprecated_func_mb_ereg_0->args[1].name = ZSTR_KNOWN(ZEND_STR_MESSAGE);
+
+	zend_attribute *attribute_Deprecated_func_mb_eregi_0 = zend_add_function_attribute(zend_hash_str_find_ptr(CG(function_table), "mb_eregi", sizeof("mb_eregi") - 1), ZSTR_KNOWN(ZEND_STR_DEPRECATED_CAPITALIZED), 2);
+	zend_string *attribute_Deprecated_func_mb_eregi_0_arg0_str = zend_string_init("8.6", strlen("8.6"), 1);
+	ZVAL_STR(&attribute_Deprecated_func_mb_eregi_0->args[0].value, attribute_Deprecated_func_mb_eregi_0_arg0_str);
+	attribute_Deprecated_func_mb_eregi_0->args[0].name = ZSTR_KNOWN(ZEND_STR_SINCE);
+	zend_string *attribute_Deprecated_func_mb_eregi_0_arg1_str = zend_string_init("because the underlying library is no longer maintained", strlen("because the underlying library is no longer maintained"), 1);
+	ZVAL_STR(&attribute_Deprecated_func_mb_eregi_0->args[1].value, attribute_Deprecated_func_mb_eregi_0_arg1_str);
+	attribute_Deprecated_func_mb_eregi_0->args[1].name = ZSTR_KNOWN(ZEND_STR_MESSAGE);
+
+	zend_attribute *attribute_Deprecated_func_mb_ereg_replace_0 = zend_add_function_attribute(zend_hash_str_find_ptr(CG(function_table), "mb_ereg_replace", sizeof("mb_ereg_replace") - 1), ZSTR_KNOWN(ZEND_STR_DEPRECATED_CAPITALIZED), 2);
+	zend_string *attribute_Deprecated_func_mb_ereg_replace_0_arg0_str = zend_string_init("8.6", strlen("8.6"), 1);
+	ZVAL_STR(&attribute_Deprecated_func_mb_ereg_replace_0->args[0].value, attribute_Deprecated_func_mb_ereg_replace_0_arg0_str);
+	attribute_Deprecated_func_mb_ereg_replace_0->args[0].name = ZSTR_KNOWN(ZEND_STR_SINCE);
+	zend_string *attribute_Deprecated_func_mb_ereg_replace_0_arg1_str = zend_string_init("because the underlying library is no longer maintained", strlen("because the underlying library is no longer maintained"), 1);
+	ZVAL_STR(&attribute_Deprecated_func_mb_ereg_replace_0->args[1].value, attribute_Deprecated_func_mb_ereg_replace_0_arg1_str);
+	attribute_Deprecated_func_mb_ereg_replace_0->args[1].name = ZSTR_KNOWN(ZEND_STR_MESSAGE);
+
+	zend_attribute *attribute_Deprecated_func_mb_eregi_replace_0 = zend_add_function_attribute(zend_hash_str_find_ptr(CG(function_table), "mb_eregi_replace", sizeof("mb_eregi_replace") - 1), ZSTR_KNOWN(ZEND_STR_DEPRECATED_CAPITALIZED), 2);
+	zend_string *attribute_Deprecated_func_mb_eregi_replace_0_arg0_str = zend_string_init("8.6", strlen("8.6"), 1);
+	ZVAL_STR(&attribute_Deprecated_func_mb_eregi_replace_0->args[0].value, attribute_Deprecated_func_mb_eregi_replace_0_arg0_str);
+	attribute_Deprecated_func_mb_eregi_replace_0->args[0].name = ZSTR_KNOWN(ZEND_STR_SINCE);
+	zend_string *attribute_Deprecated_func_mb_eregi_replace_0_arg1_str = zend_string_init("because the underlying library is no longer maintained", strlen("because the underlying library is no longer maintained"), 1);
+	ZVAL_STR(&attribute_Deprecated_func_mb_eregi_replace_0->args[1].value, attribute_Deprecated_func_mb_eregi_replace_0_arg1_str);
+	attribute_Deprecated_func_mb_eregi_replace_0->args[1].name = ZSTR_KNOWN(ZEND_STR_MESSAGE);
+
+	zend_attribute *attribute_Deprecated_func_mb_ereg_replace_callback_0 = zend_add_function_attribute(zend_hash_str_find_ptr(CG(function_table), "mb_ereg_replace_callback", sizeof("mb_ereg_replace_callback") - 1), ZSTR_KNOWN(ZEND_STR_DEPRECATED_CAPITALIZED), 2);
+	zend_string *attribute_Deprecated_func_mb_ereg_replace_callback_0_arg0_str = zend_string_init("8.6", strlen("8.6"), 1);
+	ZVAL_STR(&attribute_Deprecated_func_mb_ereg_replace_callback_0->args[0].value, attribute_Deprecated_func_mb_ereg_replace_callback_0_arg0_str);
+	attribute_Deprecated_func_mb_ereg_replace_callback_0->args[0].name = ZSTR_KNOWN(ZEND_STR_SINCE);
+	zend_string *attribute_Deprecated_func_mb_ereg_replace_callback_0_arg1_str = zend_string_init("because the underlying library is no longer maintained", strlen("because the underlying library is no longer maintained"), 1);
+	ZVAL_STR(&attribute_Deprecated_func_mb_ereg_replace_callback_0->args[1].value, attribute_Deprecated_func_mb_ereg_replace_callback_0_arg1_str);
+	attribute_Deprecated_func_mb_ereg_replace_callback_0->args[1].name = ZSTR_KNOWN(ZEND_STR_MESSAGE);
+
+	zend_attribute *attribute_Deprecated_func_mb_split_0 = zend_add_function_attribute(zend_hash_str_find_ptr(CG(function_table), "mb_split", sizeof("mb_split") - 1), ZSTR_KNOWN(ZEND_STR_DEPRECATED_CAPITALIZED), 2);
+	zend_string *attribute_Deprecated_func_mb_split_0_arg0_str = zend_string_init("8.6", strlen("8.6"), 1);
+	ZVAL_STR(&attribute_Deprecated_func_mb_split_0->args[0].value, attribute_Deprecated_func_mb_split_0_arg0_str);
+	attribute_Deprecated_func_mb_split_0->args[0].name = ZSTR_KNOWN(ZEND_STR_SINCE);
+	zend_string *attribute_Deprecated_func_mb_split_0_arg1_str = zend_string_init("because the underlying library is no longer maintained", strlen("because the underlying library is no longer maintained"), 1);
+	ZVAL_STR(&attribute_Deprecated_func_mb_split_0->args[1].value, attribute_Deprecated_func_mb_split_0_arg1_str);
+	attribute_Deprecated_func_mb_split_0->args[1].name = ZSTR_KNOWN(ZEND_STR_MESSAGE);
+
+	zend_attribute *attribute_Deprecated_func_mb_ereg_match_0 = zend_add_function_attribute(zend_hash_str_find_ptr(CG(function_table), "mb_ereg_match", sizeof("mb_ereg_match") - 1), ZSTR_KNOWN(ZEND_STR_DEPRECATED_CAPITALIZED), 2);
+	zend_string *attribute_Deprecated_func_mb_ereg_match_0_arg0_str = zend_string_init("8.6", strlen("8.6"), 1);
+	ZVAL_STR(&attribute_Deprecated_func_mb_ereg_match_0->args[0].value, attribute_Deprecated_func_mb_ereg_match_0_arg0_str);
+	attribute_Deprecated_func_mb_ereg_match_0->args[0].name = ZSTR_KNOWN(ZEND_STR_SINCE);
+	zend_string *attribute_Deprecated_func_mb_ereg_match_0_arg1_str = zend_string_init("because the underlying library is no longer maintained", strlen("because the underlying library is no longer maintained"), 1);
+	ZVAL_STR(&attribute_Deprecated_func_mb_ereg_match_0->args[1].value, attribute_Deprecated_func_mb_ereg_match_0_arg1_str);
+	attribute_Deprecated_func_mb_ereg_match_0->args[1].name = ZSTR_KNOWN(ZEND_STR_MESSAGE);
+
+	zend_attribute *attribute_Deprecated_func_mb_ereg_search_0 = zend_add_function_attribute(zend_hash_str_find_ptr(CG(function_table), "mb_ereg_search", sizeof("mb_ereg_search") - 1), ZSTR_KNOWN(ZEND_STR_DEPRECATED_CAPITALIZED), 2);
+	zend_string *attribute_Deprecated_func_mb_ereg_search_0_arg0_str = zend_string_init("8.6", strlen("8.6"), 1);
+	ZVAL_STR(&attribute_Deprecated_func_mb_ereg_search_0->args[0].value, attribute_Deprecated_func_mb_ereg_search_0_arg0_str);
+	attribute_Deprecated_func_mb_ereg_search_0->args[0].name = ZSTR_KNOWN(ZEND_STR_SINCE);
+	zend_string *attribute_Deprecated_func_mb_ereg_search_0_arg1_str = zend_string_init("because the underlying library is no longer maintained", strlen("because the underlying library is no longer maintained"), 1);
+	ZVAL_STR(&attribute_Deprecated_func_mb_ereg_search_0->args[1].value, attribute_Deprecated_func_mb_ereg_search_0_arg1_str);
+	attribute_Deprecated_func_mb_ereg_search_0->args[1].name = ZSTR_KNOWN(ZEND_STR_MESSAGE);
+
+	zend_attribute *attribute_Deprecated_func_mb_ereg_search_pos_0 = zend_add_function_attribute(zend_hash_str_find_ptr(CG(function_table), "mb_ereg_search_pos", sizeof("mb_ereg_search_pos") - 1), ZSTR_KNOWN(ZEND_STR_DEPRECATED_CAPITALIZED), 2);
+	zend_string *attribute_Deprecated_func_mb_ereg_search_pos_0_arg0_str = zend_string_init("8.6", strlen("8.6"), 1);
+	ZVAL_STR(&attribute_Deprecated_func_mb_ereg_search_pos_0->args[0].value, attribute_Deprecated_func_mb_ereg_search_pos_0_arg0_str);
+	attribute_Deprecated_func_mb_ereg_search_pos_0->args[0].name = ZSTR_KNOWN(ZEND_STR_SINCE);
+	zend_string *attribute_Deprecated_func_mb_ereg_search_pos_0_arg1_str = zend_string_init("because the underlying library is no longer maintained", strlen("because the underlying library is no longer maintained"), 1);
+	ZVAL_STR(&attribute_Deprecated_func_mb_ereg_search_pos_0->args[1].value, attribute_Deprecated_func_mb_ereg_search_pos_0_arg1_str);
+	attribute_Deprecated_func_mb_ereg_search_pos_0->args[1].name = ZSTR_KNOWN(ZEND_STR_MESSAGE);
+
+	zend_attribute *attribute_Deprecated_func_mb_ereg_search_regs_0 = zend_add_function_attribute(zend_hash_str_find_ptr(CG(function_table), "mb_ereg_search_regs", sizeof("mb_ereg_search_regs") - 1), ZSTR_KNOWN(ZEND_STR_DEPRECATED_CAPITALIZED), 2);
+	zend_string *attribute_Deprecated_func_mb_ereg_search_regs_0_arg0_str = zend_string_init("8.6", strlen("8.6"), 1);
+	ZVAL_STR(&attribute_Deprecated_func_mb_ereg_search_regs_0->args[0].value, attribute_Deprecated_func_mb_ereg_search_regs_0_arg0_str);
+	attribute_Deprecated_func_mb_ereg_search_regs_0->args[0].name = ZSTR_KNOWN(ZEND_STR_SINCE);
+	zend_string *attribute_Deprecated_func_mb_ereg_search_regs_0_arg1_str = zend_string_init("because the underlying library is no longer maintained", strlen("because the underlying library is no longer maintained"), 1);
+	ZVAL_STR(&attribute_Deprecated_func_mb_ereg_search_regs_0->args[1].value, attribute_Deprecated_func_mb_ereg_search_regs_0_arg1_str);
+	attribute_Deprecated_func_mb_ereg_search_regs_0->args[1].name = ZSTR_KNOWN(ZEND_STR_MESSAGE);
+
+	zend_attribute *attribute_Deprecated_func_mb_ereg_search_init_0 = zend_add_function_attribute(zend_hash_str_find_ptr(CG(function_table), "mb_ereg_search_init", sizeof("mb_ereg_search_init") - 1), ZSTR_KNOWN(ZEND_STR_DEPRECATED_CAPITALIZED), 2);
+	zend_string *attribute_Deprecated_func_mb_ereg_search_init_0_arg0_str = zend_string_init("8.6", strlen("8.6"), 1);
+	ZVAL_STR(&attribute_Deprecated_func_mb_ereg_search_init_0->args[0].value, attribute_Deprecated_func_mb_ereg_search_init_0_arg0_str);
+	attribute_Deprecated_func_mb_ereg_search_init_0->args[0].name = ZSTR_KNOWN(ZEND_STR_SINCE);
+	zend_string *attribute_Deprecated_func_mb_ereg_search_init_0_arg1_str = zend_string_init("because the underlying library is no longer maintained", strlen("because the underlying library is no longer maintained"), 1);
+	ZVAL_STR(&attribute_Deprecated_func_mb_ereg_search_init_0->args[1].value, attribute_Deprecated_func_mb_ereg_search_init_0_arg1_str);
+	attribute_Deprecated_func_mb_ereg_search_init_0->args[1].name = ZSTR_KNOWN(ZEND_STR_MESSAGE);
+
+	zend_attribute *attribute_Deprecated_func_mb_ereg_search_getregs_0 = zend_add_function_attribute(zend_hash_str_find_ptr(CG(function_table), "mb_ereg_search_getregs", sizeof("mb_ereg_search_getregs") - 1), ZSTR_KNOWN(ZEND_STR_DEPRECATED_CAPITALIZED), 2);
+	zend_string *attribute_Deprecated_func_mb_ereg_search_getregs_0_arg0_str = zend_string_init("8.6", strlen("8.6"), 1);
+	ZVAL_STR(&attribute_Deprecated_func_mb_ereg_search_getregs_0->args[0].value, attribute_Deprecated_func_mb_ereg_search_getregs_0_arg0_str);
+	attribute_Deprecated_func_mb_ereg_search_getregs_0->args[0].name = ZSTR_KNOWN(ZEND_STR_SINCE);
+	zend_string *attribute_Deprecated_func_mb_ereg_search_getregs_0_arg1_str = zend_string_init("because the underlying library is no longer maintained", strlen("because the underlying library is no longer maintained"), 1);
+	ZVAL_STR(&attribute_Deprecated_func_mb_ereg_search_getregs_0->args[1].value, attribute_Deprecated_func_mb_ereg_search_getregs_0_arg1_str);
+	attribute_Deprecated_func_mb_ereg_search_getregs_0->args[1].name = ZSTR_KNOWN(ZEND_STR_MESSAGE);
+
+	zend_attribute *attribute_Deprecated_func_mb_ereg_search_getpos_0 = zend_add_function_attribute(zend_hash_str_find_ptr(CG(function_table), "mb_ereg_search_getpos", sizeof("mb_ereg_search_getpos") - 1), ZSTR_KNOWN(ZEND_STR_DEPRECATED_CAPITALIZED), 2);
+	zend_string *attribute_Deprecated_func_mb_ereg_search_getpos_0_arg0_str = zend_string_init("8.6", strlen("8.6"), 1);
+	ZVAL_STR(&attribute_Deprecated_func_mb_ereg_search_getpos_0->args[0].value, attribute_Deprecated_func_mb_ereg_search_getpos_0_arg0_str);
+	attribute_Deprecated_func_mb_ereg_search_getpos_0->args[0].name = ZSTR_KNOWN(ZEND_STR_SINCE);
+	zend_string *attribute_Deprecated_func_mb_ereg_search_getpos_0_arg1_str = zend_string_init("because the underlying library is no longer maintained", strlen("because the underlying library is no longer maintained"), 1);
+	ZVAL_STR(&attribute_Deprecated_func_mb_ereg_search_getpos_0->args[1].value, attribute_Deprecated_func_mb_ereg_search_getpos_0_arg1_str);
+	attribute_Deprecated_func_mb_ereg_search_getpos_0->args[1].name = ZSTR_KNOWN(ZEND_STR_MESSAGE);
+
+	zend_attribute *attribute_Deprecated_func_mb_ereg_search_setpos_0 = zend_add_function_attribute(zend_hash_str_find_ptr(CG(function_table), "mb_ereg_search_setpos", sizeof("mb_ereg_search_setpos") - 1), ZSTR_KNOWN(ZEND_STR_DEPRECATED_CAPITALIZED), 2);
+	zend_string *attribute_Deprecated_func_mb_ereg_search_setpos_0_arg0_str = zend_string_init("8.6", strlen("8.6"), 1);
+	ZVAL_STR(&attribute_Deprecated_func_mb_ereg_search_setpos_0->args[0].value, attribute_Deprecated_func_mb_ereg_search_setpos_0_arg0_str);
+	attribute_Deprecated_func_mb_ereg_search_setpos_0->args[0].name = ZSTR_KNOWN(ZEND_STR_SINCE);
+	zend_string *attribute_Deprecated_func_mb_ereg_search_setpos_0_arg1_str = zend_string_init("because the underlying library is no longer maintained", strlen("because the underlying library is no longer maintained"), 1);
+	ZVAL_STR(&attribute_Deprecated_func_mb_ereg_search_setpos_0->args[1].value, attribute_Deprecated_func_mb_ereg_search_setpos_0_arg1_str);
+	attribute_Deprecated_func_mb_ereg_search_setpos_0->args[1].name = ZSTR_KNOWN(ZEND_STR_MESSAGE);
+
+	zend_attribute *attribute_Deprecated_func_mb_regex_set_options_0 = zend_add_function_attribute(zend_hash_str_find_ptr(CG(function_table), "mb_regex_set_options", sizeof("mb_regex_set_options") - 1), ZSTR_KNOWN(ZEND_STR_DEPRECATED_CAPITALIZED), 2);
+	zend_string *attribute_Deprecated_func_mb_regex_set_options_0_arg0_str = zend_string_init("8.6", strlen("8.6"), 1);
+	ZVAL_STR(&attribute_Deprecated_func_mb_regex_set_options_0->args[0].value, attribute_Deprecated_func_mb_regex_set_options_0_arg0_str);
+	attribute_Deprecated_func_mb_regex_set_options_0->args[0].name = ZSTR_KNOWN(ZEND_STR_SINCE);
+	zend_string *attribute_Deprecated_func_mb_regex_set_options_0_arg1_str = zend_string_init("because the underlying library is no longer maintained", strlen("because the underlying library is no longer maintained"), 1);
+	ZVAL_STR(&attribute_Deprecated_func_mb_regex_set_options_0->args[1].value, attribute_Deprecated_func_mb_regex_set_options_0_arg1_str);
+	attribute_Deprecated_func_mb_regex_set_options_0->args[1].name = ZSTR_KNOWN(ZEND_STR_MESSAGE);
+#endif
+#if defined(HAVE_MBREGEX)
+
+	zend_attribute *attribute_Deprecated_const_MB_ONIGURUMA_VERSION_0 = zend_add_global_constant_attribute(const_MB_ONIGURUMA_VERSION, ZSTR_KNOWN(ZEND_STR_DEPRECATED_CAPITALIZED), 2);
+	zend_string *attribute_Deprecated_const_MB_ONIGURUMA_VERSION_0_arg0_str = zend_string_init("8.6", strlen("8.6"), 1);
+	ZVAL_STR(&attribute_Deprecated_const_MB_ONIGURUMA_VERSION_0->args[0].value, attribute_Deprecated_const_MB_ONIGURUMA_VERSION_0_arg0_str);
+	attribute_Deprecated_const_MB_ONIGURUMA_VERSION_0->args[0].name = ZSTR_KNOWN(ZEND_STR_SINCE);
+	zend_string *attribute_Deprecated_const_MB_ONIGURUMA_VERSION_0_arg1_str = zend_string_init("because the underlying library is no longer maintained", strlen("because the underlying library is no longer maintained"), 1);
+	ZVAL_STR(&attribute_Deprecated_const_MB_ONIGURUMA_VERSION_0->args[1].value, attribute_Deprecated_const_MB_ONIGURUMA_VERSION_0_arg1_str);
+	attribute_Deprecated_const_MB_ONIGURUMA_VERSION_0->args[1].name = ZSTR_KNOWN(ZEND_STR_MESSAGE);
+#endif
 }
diff --git a/ext/mbstring/php_mbregex.c b/ext/mbstring/php_mbregex.c
index a819def4b5bd..1043c4a46eb2 100644
--- a/ext/mbstring/php_mbregex.c
+++ b/ext/mbstring/php_mbregex.c
@@ -1,14 +1,12 @@
 /*
    +----------------------------------------------------------------------+
-   | Copyright (c) The PHP Group                                          |
+   | Copyright © The PHP Group and Contributors.                          |
    +----------------------------------------------------------------------+
-   | This source file is subject to version 3.01 of the PHP license,      |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | https://www.php.net/license/3_01.txt                                 |
-   | If you did not receive a copy of the PHP license and are unable to   |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@php.net so we can mail you a copy immediately.               |
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Author: Tsukada Takuya               |
    +----------------------------------------------------------------------+
@@ -409,8 +407,13 @@ int php_mb_regex_set_mbctype(const char *encname)
 	if (mbctype == ONIG_ENCODING_UNDEF) {
 		return FAILURE;
 	}
+	const mbfl_encoding *mbfl_enc = mbfl_name2encoding(encname);
+	if (mbfl_enc == NULL) {
+		/* Encoding supported by Oniguruma but not by mbfl */
+		return FAILURE;
+	}
 	MBREX(current_mbctype) = mbctype;
-	MBREX(current_mbctype_mbfl_encoding) = mbfl_name2encoding(encname);
+	MBREX(current_mbctype_mbfl_encoding) = mbfl_enc;
 	return SUCCESS;
 }
 /* }}} */
@@ -779,7 +782,7 @@ static inline void mb_regex_substitute(
 						continue;
 					}
 					if (name_end[0] == delim) break;
-					if (maybe_num && !isdigit(name_end[0])) maybe_num = 0;
+					if (maybe_num && !isdigit((unsigned char)name_end[0])) maybe_num = 0;
 					name_end++;
 				}
 				p = name_end + 1;
@@ -1103,7 +1106,7 @@ static void _php_mb_regex_ereg_replace_exec(INTERNAL_FUNCTION_PARAMETERS, OnigOp
 				if (zend_call_function(&arg_replace_fci, &arg_replace_fci_cache) == SUCCESS &&
 						!Z_ISUNDEF(retval)) {
 					convert_to_string(&retval);
-					smart_str_appendl(&out_buf, Z_STRVAL(retval), Z_STRLEN(retval));
+					smart_str_append(&out_buf, Z_STR(retval));
 					smart_str_free(&eval_buf);
 					zval_ptr_dtor(&retval);
 				}
diff --git a/ext/mbstring/php_mbregex.h b/ext/mbstring/php_mbregex.h
index 18a762d5a614..41c98b6d7465 100644
--- a/ext/mbstring/php_mbregex.h
+++ b/ext/mbstring/php_mbregex.h
@@ -1,14 +1,12 @@
 /*
    +----------------------------------------------------------------------+
-   | Copyright (c) The PHP Group                                          |
+   | Copyright © The PHP Group and Contributors.                          |
    +----------------------------------------------------------------------+
-   | This source file is subject to version 3.01 of the PHP license,      |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | https://www.php.net/license/3_01.txt                                 |
-   | If you did not receive a copy of the PHP license and are unable to   |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@php.net so we can mail you a copy immediately.               |
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Author: Moriyoshi Koizumi                         |
    +----------------------------------------------------------------------+
diff --git a/ext/mbstring/php_unicode.c b/ext/mbstring/php_unicode.c
index f4944312bdf5..ce255e401364 100644
--- a/ext/mbstring/php_unicode.c
+++ b/ext/mbstring/php_unicode.c
@@ -1,14 +1,12 @@
 /*
    +----------------------------------------------------------------------+
-   | Copyright (c) The PHP Group                                          |
+   | Copyright © The PHP Group and Contributors.                          |
    +----------------------------------------------------------------------+
-   | This source file is subject to version 3.01 of the PHP license,      |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | https://www.php.net/license/3_01.txt                                 |
-   | If you did not receive a copy of the PHP license and are unable to   |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@php.net so we can mail you a copy immediately.               |
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Author: Wez Furlong (wez@thebrainroom.com)                           |
    +----------------------------------------------------------------------+
@@ -463,7 +461,7 @@ MBSTRING_API zend_string *php_unicode_convert_case(php_case_mode case_mode, cons
 			}
 			break;
 
-			EMPTY_SWITCH_DEFAULT_CASE()
+			default: ZEND_UNREACHABLE();
 		}
 
 		converted_end = p;
diff --git a/ext/mbstring/php_unicode.h b/ext/mbstring/php_unicode.h
index 1326761943dc..ac96f9daee51 100644
--- a/ext/mbstring/php_unicode.h
+++ b/ext/mbstring/php_unicode.h
@@ -1,14 +1,12 @@
 /*
    +----------------------------------------------------------------------+
-   | Copyright (c) The PHP Group                                          |
+   | Copyright © The PHP Group and Contributors.                          |
    +----------------------------------------------------------------------+
-   | This source file is subject to version 3.01 of the PHP license,      |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | https://www.php.net/license/3_01.txt                                 |
-   | If you did not receive a copy of the PHP license and are unable to   |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@php.net so we can mail you a copy immediately.               |
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Author: Wez Furlong (wez@thebrainroom.com)                           |
    +----------------------------------------------------------------------+
diff --git a/ext/mbstring/tests/GHSA-74r9-qxhc-fx53.phpt b/ext/mbstring/tests/GHSA-74r9-qxhc-fx53.phpt
new file mode 100644
index 000000000000..e58be7e50d8a
--- /dev/null
+++ b/ext/mbstring/tests/GHSA-74r9-qxhc-fx53.phpt
@@ -0,0 +1,50 @@
+--TEST--
+GHSA-74r9-qxhc-fx53: Out-of-bounds access in mbfl_name2encoding_ex()
+--CREDITS--
+Akshay Jain (AkshayJainG)
+--EXTENSIONS--
+mbstring
+--FILE--
+getMessage(), "\n";
+    }
+}
+
+ini_set('mbstring.detect_order', $encoding);
+ini_set('mbstring.detect_order', $alias);
+ini_set('mbstring.http_output', $encoding);
+ini_set('mbstring.http_output', $alias);
+
+test(fn () => mb_convert_encoding('foo', $encoding, $encoding));
+test(fn () => mb_convert_encoding('foo', $alias, $alias));
+test(fn () => mb_detect_encoding('foo', $encoding));
+test(fn () => mb_detect_encoding('foo', $alias));
+test(fn () => mb_convert_variables($encoding, $alias, $var));
+test(fn () => mb_detect_order($encoding));
+test(fn () => mb_detect_order($alias));
+
+?>
+--EXPECTF--
+Warning: ini_set(): INI setting contains invalid encoding "UTF-8" in %s on line %d
+
+Warning: ini_set(): INI setting contains invalid encoding "binary" in %s on line %d
+
+Deprecated: ini_set(): Use of mbstring.http_output is deprecated in %s on line %d
+
+Deprecated: ini_set(): Use of mbstring.http_output is deprecated in %s on line %d
+ValueError: mb_convert_encoding(): Argument #3 ($from_encoding) contains invalid encoding "UTF-8"
+ValueError: mb_convert_encoding(): Argument #3 ($from_encoding) contains invalid encoding "binary"
+ValueError: mb_detect_encoding(): Argument #2 ($encodings) contains invalid encoding "UTF-8"
+ValueError: mb_detect_encoding(): Argument #2 ($encodings) contains invalid encoding "binary"
+ValueError: mb_convert_variables(): Argument #2 ($from_encoding) contains invalid encoding "binary"
+ValueError: mb_detect_order(): Argument #1 ($encoding) contains invalid encoding "UTF-8"
+ValueError: mb_detect_order(): Argument #1 ($encoding) contains invalid encoding "binary"
diff --git a/ext/mbstring/tests/bug43994.phpt b/ext/mbstring/tests/bug43994.phpt
index b4ae29ff40e7..cc6953808cc6 100644
--- a/ext/mbstring/tests/bug43994.phpt
+++ b/ext/mbstring/tests/bug43994.phpt
@@ -31,9 +31,13 @@ try {
 
 var_dump($mb_regs);
 ?>
---EXPECT--
+--EXPECTF--
 Without $regs arg:
+
+Deprecated: Function mb_ereg() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
 mb_ereg(): Argument #1 ($pattern) must not be empty
 With $regs arg:
+
+Deprecated: Function mb_ereg() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
 mb_ereg(): Argument #1 ($pattern) must not be empty
 NULL
diff --git a/ext/mbstring/tests/bug69151.phpt b/ext/mbstring/tests/bug69151.phpt
index c95fa05c49f8..9dd546d2eee6 100644
--- a/ext/mbstring/tests/bug69151.phpt
+++ b/ext/mbstring/tests/bug69151.phpt
@@ -18,9 +18,16 @@ var_dump(NULL === mb_ereg_replace('.', "\\0", $str));
 var_dump(false === mb_ereg_search_init("\x80", '.'));
 var_dump(false === mb_ereg_search());
 ?>
---EXPECT--
+--EXPECTF--
+Deprecated: Function mb_eregi() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
 bool(true)
 bool(true)
+
+Deprecated: Function mb_ereg_replace() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
 bool(true)
+
+Deprecated: Function mb_ereg_search_init() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
 bool(true)
+
+Deprecated: Function mb_ereg_search() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
 bool(true)
diff --git a/ext/mbstring/tests/bug72164.phpt b/ext/mbstring/tests/bug72164.phpt
index e4ed04ba5eba..2b8f3950d92c 100644
--- a/ext/mbstring/tests/bug72164.phpt
+++ b/ext/mbstring/tests/bug72164.phpt
@@ -19,5 +19,6 @@ try {
 }
 
 ?>
---EXPECT--
+--EXPECTF--
+Deprecated: Function mb_ereg_replace() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
 Option "e" is not supported
diff --git a/ext/mbstring/tests/bug72399.phpt b/ext/mbstring/tests/bug72399.phpt
index 4d3ea6d28c0b..bf9880c0ab42 100644
--- a/ext/mbstring/tests/bug72399.phpt
+++ b/ext/mbstring/tests/bug72399.phpt
@@ -19,7 +19,12 @@ try {
     echo $e->getMessage() . \PHP_EOL;
 }
 ?>
---EXPECT--
+--EXPECTF--
+Deprecated: Function mb_ereg_search_init() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
 bool(true)
+
+Deprecated: Function mb_eregi_replace() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
 string(0) ""
+
+Deprecated: Function mb_ereg_search_pos() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
 No pattern was provided
diff --git a/ext/mbstring/tests/bug72402.phpt b/ext/mbstring/tests/bug72402.phpt
index 0441887e33c7..511c18bfec2c 100644
--- a/ext/mbstring/tests/bug72402.phpt
+++ b/ext/mbstring/tests/bug72402.phpt
@@ -17,5 +17,6 @@ try {
 } catch(Exception $e) {}
 ?>
 DONE
---EXPECT--
+--EXPECTF--
+Deprecated: Function mb_ereg_replace_callback() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
 DONE
diff --git a/ext/mbstring/tests/bug72691.phpt b/ext/mbstring/tests/bug72691.phpt
index db299e9d9dbc..9147d149fcb3 100644
--- a/ext/mbstring/tests/bug72691.phpt
+++ b/ext/mbstring/tests/bug72691.phpt
@@ -27,23 +27,48 @@ mb_ereg_search('\Z');
 var_dump(mb_ereg_search_getpos());
 var_dump(mb_ereg_search_getregs());
 ?>
---EXPECT--
+--EXPECTF--
+Deprecated: Function mb_ereg_search_init() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
+
+Deprecated: Function mb_ereg_search() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
+
+Deprecated: Function mb_ereg_search_getpos() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
 int(0)
+
+Deprecated: Function mb_ereg_search_getregs() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
 array(1) {
   [0]=>
   string(0) ""
 }
+
+Deprecated: Function mb_ereg_search() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
+
+Deprecated: Function mb_ereg_search_getpos() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
 int(0)
+
+Deprecated: Function mb_ereg_search_getregs() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
 array(1) {
   [0]=>
   string(0) ""
 }
+
+Deprecated: Function mb_ereg_search() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
+
+Deprecated: Function mb_ereg_search_getpos() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
 int(3)
+
+Deprecated: Function mb_ereg_search_getregs() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
 array(1) {
   [0]=>
   string(3) "foo"
 }
+
+Deprecated: Function mb_ereg_search() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
+
+Deprecated: Function mb_ereg_search_getpos() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
 int(3)
+
+Deprecated: Function mb_ereg_search_getregs() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
 array(1) {
   [0]=>
   string(0) ""
diff --git a/ext/mbstring/tests/bug72693.phpt b/ext/mbstring/tests/bug72693.phpt
index 6596eadd5fea..7b120164afab 100644
--- a/ext/mbstring/tests/bug72693.phpt
+++ b/ext/mbstring/tests/bug72693.phpt
@@ -26,18 +26,41 @@ var_dump(mb_ereg_search_getpos());
 var_dump(mb_ereg_search('\Z'));
 var_dump(mb_ereg_search_getpos());
 ?>
---EXPECT--
+--EXPECTF--
+Deprecated: Function mb_ereg_search_init() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
+
+Deprecated: Function mb_ereg_search() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
 bool(true)
+
+Deprecated: Function mb_ereg_search_getpos() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
 int(0)
+
+Deprecated: Function mb_ereg_search() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
 bool(true)
+
+Deprecated: Function mb_ereg_search_getpos() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
 int(0)
+
+Deprecated: Function mb_ereg_search() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
 bool(true)
+
+Deprecated: Function mb_ereg_search_getpos() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
 int(3)
+
+Deprecated: Function mb_ereg_search_getregs() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
 array(1) {
   [0]=>
   string(3) "foo"
 }
+
+Deprecated: Function mb_ereg_search() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
 bool(true)
+
+Deprecated: Function mb_ereg_search_getpos() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
 int(3)
+
+Deprecated: Function mb_ereg_search() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
 bool(true)
+
+Deprecated: Function mb_ereg_search_getpos() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
 int(3)
diff --git a/ext/mbstring/tests/bug72694.phpt b/ext/mbstring/tests/bug72694.phpt
index ed7d2e79250e..0789f3620817 100644
--- a/ext/mbstring/tests/bug72694.phpt
+++ b/ext/mbstring/tests/bug72694.phpt
@@ -16,8 +16,17 @@ var_dump(mb_ereg_search_getpos());
 var_dump(mb_ereg_search('\Z'));
 var_dump(mb_ereg_search_getpos());
 ?>
---EXPECT--
+--EXPECTF--
+Deprecated: Function mb_ereg_search_init() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
+
+Deprecated: Function mb_ereg_search_setpos() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
 bool(true)
+
+Deprecated: Function mb_ereg_search_getpos() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
 int(3)
+
+Deprecated: Function mb_ereg_search() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
 bool(true)
+
+Deprecated: Function mb_ereg_search_getpos() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
 int(3)
diff --git a/ext/mbstring/tests/bug72710.phpt b/ext/mbstring/tests/bug72710.phpt
index ca1558c2ff1f..614abcf542f8 100644
--- a/ext/mbstring/tests/bug72710.phpt
+++ b/ext/mbstring/tests/bug72710.phpt
@@ -11,4 +11,6 @@ if (!function_exists('mb_ereg')) die('skip mbregex support not available');
 mb_ereg('(?<0>a)', 'a');
 ?>
 --EXPECTF--
+Deprecated: Function mb_ereg() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
+
 Warning: mb_ereg(): mbregex compile err: invalid group name <0> in %s on line %d
diff --git a/ext/mbstring/tests/bug73532.phpt b/ext/mbstring/tests/bug73532.phpt
index 27269296894c..1af3e2422904 100644
--- a/ext/mbstring/tests/bug73532.phpt
+++ b/ext/mbstring/tests/bug73532.phpt
@@ -10,5 +10,6 @@ if (!function_exists('mb_ereg')) die('skip mbregex support not available');
 
---EXPECT--
+--EXPECTF--
+Deprecated: Function mb_eregi() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
 bool(false)
diff --git a/ext/mbstring/tests/bug73646.phpt b/ext/mbstring/tests/bug73646.phpt
index 9897b866439e..7b3e98164989 100644
--- a/ext/mbstring/tests/bug73646.phpt
+++ b/ext/mbstring/tests/bug73646.phpt
@@ -11,5 +11,7 @@ if (!function_exists('mb_ereg')) die('skip mbregex support not available');
 var_dump(mb_ereg_search_init(NULL));
 ?>
 --EXPECTF--
+Deprecated: Function mb_ereg_search_init() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
+
 Deprecated: mb_ereg_search_init(): Passing null to parameter #1 ($string) of type string is deprecated in %s on line %d
 bool(true)
diff --git a/ext/mbstring/tests/bug76999.phpt b/ext/mbstring/tests/bug76999.phpt
index 57e286af3b8a..5c6dc442573f 100644
--- a/ext/mbstring/tests/bug76999.phpt
+++ b/ext/mbstring/tests/bug76999.phpt
@@ -19,9 +19,20 @@ try {
 }
 var_dump(mb_regex_set_options());
 ?>
---EXPECT--
+--EXPECTF--
+Deprecated: Function mb_regex_set_options() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
+
+Deprecated: Function mb_regex_set_options() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
 string(2) "pr"
+
+Deprecated: Function mb_regex_set_options() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
 string(2) "mr"
+
+Deprecated: Function mb_regex_set_options() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
 string(3) "imd"
+
+Deprecated: Function mb_regex_set_options() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
 Option "a" is not supported
+
+Deprecated: Function mb_regex_set_options() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
 string(2) "mr"
diff --git a/ext/mbstring/tests/bug77367.phpt b/ext/mbstring/tests/bug77367.phpt
index ad1dac2e07c8..f4a1a373a98f 100644
--- a/ext/mbstring/tests/bug77367.phpt
+++ b/ext/mbstring/tests/bug77367.phpt
@@ -11,5 +11,8 @@ if (!function_exists('mb_split')) die('skip mb_split() not available');
 mb_regex_encoding('UTF-8');
 var_dump(mb_split("\\w", "\xfc"));
 ?>
---EXPECT--
+--EXPECTF--
+Deprecated: Function mb_regex_encoding() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
+
+Deprecated: Function mb_split() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
 bool(false)
diff --git a/ext/mbstring/tests/bug77370.phpt b/ext/mbstring/tests/bug77370.phpt
index a2e3759c120a..8ccb169f83e0 100644
--- a/ext/mbstring/tests/bug77370.phpt
+++ b/ext/mbstring/tests/bug77370.phpt
@@ -11,5 +11,7 @@ if (!function_exists('mb_split')) die('skip mb_split() not available');
 var_dump(mb_split("   \xfd",""));
 ?>
 --EXPECTF--
+Deprecated: Function mb_split() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line 2
+
 Warning: mb_split(): Pattern is not valid under UTF-8 encoding in %s on line %d
 bool(false)
diff --git a/ext/mbstring/tests/bug77371.phpt b/ext/mbstring/tests/bug77371.phpt
index 767533c66a4e..b4a88ffc5124 100644
--- a/ext/mbstring/tests/bug77371.phpt
+++ b/ext/mbstring/tests/bug77371.phpt
@@ -11,5 +11,7 @@ if (!function_exists('mb_ereg')) die('skip mb_ereg() not available');
 var_dump(mb_ereg("()0\xfc00000\xfc00000\xfc00000\xfc",""));
 ?>
 --EXPECTF--
+Deprecated: Function mb_ereg() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
+
 Warning: mb_ereg(): Pattern is not valid under UTF-8 encoding in %s on line %d
 bool(false)
diff --git a/ext/mbstring/tests/bug77381.phpt b/ext/mbstring/tests/bug77381.phpt
index 76607bc9ceba..cde197c49a68 100644
--- a/ext/mbstring/tests/bug77381.phpt
+++ b/ext/mbstring/tests/bug77381.phpt
@@ -14,14 +14,22 @@ var_dump(mb_ereg("0000\\"."\xf5","0"));
 var_dump(mb_ereg("(?i)FFF00000000000000000\xfd",""));
 ?>
 --EXPECTF--
+Deprecated: Function mb_ereg() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
+
 Warning: mb_ereg(): Pattern is not valid under UTF-8 encoding in %s on line %d
 bool(false)
 
+Deprecated: Function mb_ereg() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
+
 Warning: mb_ereg(): Pattern is not valid under UTF-8 encoding in %s on line %d
 bool(false)
 
+Deprecated: Function mb_ereg() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
+
 Warning: mb_ereg(): Pattern is not valid under UTF-8 encoding in %s on line %d
 bool(false)
 
+Deprecated: Function mb_ereg() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
+
 Warning: mb_ereg(): Pattern is not valid under UTF-8 encoding in %s on line %d
 bool(false)
diff --git a/ext/mbstring/tests/bug77418.phpt b/ext/mbstring/tests/bug77418.phpt
index 352e125d689e..2227eef44a1b 100644
--- a/ext/mbstring/tests/bug77418.phpt
+++ b/ext/mbstring/tests/bug77418.phpt
@@ -12,5 +12,8 @@ mb_regex_encoding("UTF-32");
 
 var_dump(mb_split("\x00\x00\x00\x5c\x00\x00\x00B","000000000000000000000000000000"));
 ?>
---EXPECT--
+--EXPECTF--
+Deprecated: Function mb_regex_encoding() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
+
+Deprecated: Function mb_split() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
 bool(false)
diff --git a/ext/mbstring/tests/bug77428.phpt b/ext/mbstring/tests/bug77428.phpt
index c65cd000042f..71f9e09b0b1e 100644
--- a/ext/mbstring/tests/bug77428.phpt
+++ b/ext/mbstring/tests/bug77428.phpt
@@ -15,6 +15,9 @@ var_dump(mb_ereg_replace('(%)', '\\\1', 'a%c'));
 var_dump(mb_ereg_replace('(%)', '\\\\1', 'a%c'));
 
 ?>
---EXPECT--
-string(4) "a\%c"
-string(4) "a\%c"
+--EXPECTF--
+Deprecated: Function mb_ereg_replace() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
+string(4) "a\%%c"
+
+Deprecated: Function mb_ereg_replace() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
+string(4) "a\%%c"
diff --git a/ext/mbstring/tests/bug77514.phpt b/ext/mbstring/tests/bug77514.phpt
index 4b33cca8a309..f6b7ca5d1808 100644
--- a/ext/mbstring/tests/bug77514.phpt
+++ b/ext/mbstring/tests/bug77514.phpt
@@ -13,5 +13,6 @@ $a="abc123";
 var_dump(mb_ereg_replace("123","def\\",$a));
 
 ?>
---EXPECT--
+--EXPECTF--
+Deprecated: Function mb_ereg_replace() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
 string(7) "abcdef\"
diff --git a/ext/mbstring/tests/bug78559.phpt b/ext/mbstring/tests/bug78559.phpt
index e107d1ba864a..18b1fe00f83a 100644
--- a/ext/mbstring/tests/bug78559.phpt
+++ b/ext/mbstring/tests/bug78559.phpt
@@ -12,5 +12,6 @@ $str = "5b5b5b5b5b5b5b492a5bce946b5c4b5d5c6b5c4b5d5c4b5d1cceb04b5d1cceb07a73717e
 $str = hex2bin($str);
 var_dump(mb_eregi($str, $str));
 ?>
---EXPECT--
+--EXPECTF--
+Deprecated: Function mb_eregi() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
 bool(false)
diff --git a/ext/mbstring/tests/bug78633.phpt b/ext/mbstring/tests/bug78633.phpt
index a5dcd48b9bf9..42a1ccc4ed2d 100644
--- a/ext/mbstring/tests/bug78633.phpt
+++ b/ext/mbstring/tests/bug78633.phpt
@@ -15,5 +15,6 @@ if (is_bool($res)) {
     var_dump($res);
 }
 ?>
---EXPECT--
+--EXPECTF--
+Deprecated: Function mb_eregi() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
 ok
diff --git a/ext/mbstring/tests/empty_pattern.phpt b/ext/mbstring/tests/empty_pattern.phpt
index 64e63147ee78..c7a2ca285c29 100644
--- a/ext/mbstring/tests/empty_pattern.phpt
+++ b/ext/mbstring/tests/empty_pattern.phpt
@@ -24,6 +24,11 @@ try {
 }
 
 ?>
---EXPECT--
+--EXPECTF--
+Deprecated: Function mb_ereg_search_init() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
 mb_ereg_search_init(): Argument #2 ($pattern) must not be empty
+
+Deprecated: Function mb_split() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
+
+Deprecated: Function mb_ereg_search_regs() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
 No pattern was provided
diff --git a/ext/mbstring/tests/gh18901.phpt b/ext/mbstring/tests/gh18901.phpt
index 8d862a537c3b..55e41d48377d 100644
--- a/ext/mbstring/tests/gh18901.phpt
+++ b/ext/mbstring/tests/gh18901.phpt
@@ -13,7 +13,8 @@ foreach ($vals as $val) {
     var_dump(mb_split('\d', '123', $val));
 }
 ?>
---EXPECT--
+--EXPECTF--
+Deprecated: Function mb_split() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
 array(4) {
   [0]=>
   string(0) ""
@@ -24,6 +25,8 @@ array(4) {
   [3]=>
   string(0) ""
 }
+
+Deprecated: Function mb_split() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
 array(4) {
   [0]=>
   string(0) ""
@@ -34,6 +37,8 @@ array(4) {
   [3]=>
   string(0) ""
 }
+
+Deprecated: Function mb_split() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
 array(4) {
   [0]=>
   string(0) ""
@@ -44,10 +49,14 @@ array(4) {
   [3]=>
   string(0) ""
 }
+
+Deprecated: Function mb_split() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
 array(1) {
   [0]=>
   string(3) "123"
 }
+
+Deprecated: Function mb_split() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
 array(1) {
   [0]=>
   string(3) "123"
diff --git a/ext/mbstring/tests/mb_ereg-compat-01.phpt b/ext/mbstring/tests/mb_ereg-compat-01.phpt
index e9d407d1013b..c5752806d5c5 100644
--- a/ext/mbstring/tests/mb_ereg-compat-01.phpt
+++ b/ext/mbstring/tests/mb_ereg-compat-01.phpt
@@ -17,6 +17,9 @@ function_exists('mb_ereg') or die("skip mb_ereg() is not available in this build
     echo "ok\n";
   }
 ?>
---EXPECT--
+--EXPECTF--
+Deprecated: Function mb_ereg() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
 ok
+
+Deprecated: Function mb_ereg() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
 ok
diff --git a/ext/mbstring/tests/mb_ereg-compat-02.phpt b/ext/mbstring/tests/mb_ereg-compat-02.phpt
index d30b9927cc53..a47f9c665bc8 100644
--- a/ext/mbstring/tests/mb_ereg-compat-02.phpt
+++ b/ext/mbstring/tests/mb_ereg-compat-02.phpt
@@ -19,7 +19,8 @@ function_exists('mb_ereg') or die("skip mb_ereg() is not available in this build
   echo $registers[2];
   echo "\n";
 ?>
---EXPECT--
+--EXPECTF--
+Deprecated: Function mb_ereg() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
 1
 This is a nice and simple string
 is
diff --git a/ext/mbstring/tests/mb_ereg.phpt b/ext/mbstring/tests/mb_ereg.phpt
index 53bb58e15a86..5b3f9c125fcd 100644
--- a/ext/mbstring/tests/mb_ereg.phpt
+++ b/ext/mbstring/tests/mb_ereg.phpt
@@ -31,16 +31,65 @@ output_handler=
         do_tests( $enc );
     }
 ?>
---EXPECT--
+--EXPECTF--
+Deprecated: Function mb_regex_set_options() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
+
+Deprecated: Function mb_regex_encoding() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
+
+Deprecated: Function mb_ereg() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
 (1)6162632064656620676869206a6b6c2064656620676869206a6b6c
+
+Deprecated: Function mb_regex_encoding() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
+
+Deprecated: Function mb_ereg() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
 (1)a3e1a3e2a3e320a4a2a4aaa4a420a4aba4b3a4ca20a4efa4f1a4f320a3e1a3e2a3e320a4a2a4aaa4a420a4ab20a4b3a4ca20a4efa4f1a4f3
+
+Deprecated: Function mb_regex_encoding() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
+
+Deprecated: Function mb_ereg() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
 (1)a3eda3faa3f8a3e6a3f020a4a6a4aaa4ab20a4ada4ab20a4f2a4f020a3eda3faa3f8a3e6a3f020a4a6a4aaa4ab2020a4ada4ab20a4f2a4f0
+
+Deprecated: Function mb_regex_encoding() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
+
+Deprecated: Function mb_ereg() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
 (1)6162632064656620676869206a6b6c2064656620676869206a6b6c
+
+Deprecated: Function mb_regex_encoding() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
+
+Deprecated: Function mb_ereg() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
 (1)a3e1a3e2a3e320a4a2a4aaa4a420a4aba4b3a4ca20a4efa4f1a4f320a3e1a3e2a3e320a4a2a4aaa4a420a4ab20a4b3a4ca20a4efa4f1a4f3
+
+Deprecated: Function mb_regex_encoding() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
+
+Deprecated: Function mb_ereg() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
 (1)a3eda3faa3f8a3e6a3f020a4a6a4aaa4ab20a4ada4ab20a4f2a4f020a3eda3faa3f8a3e6a3f020a4a6a4aaa4ab2020a4ada4ab20a4f2a4f0
+
+Deprecated: Function mb_regex_encoding() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
+
+Deprecated: Function mb_ereg() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
 (1)6162632064656620676869206a6b6c2064656620676869206a6b6c
+
+Deprecated: Function mb_regex_encoding() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
+
+Deprecated: Function mb_ereg() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
 (1)a3e1a3e2a3e320a4a2a4aaa4a420a4aba4b3a4ca20a4efa4f1a4f320a3e1a3e2a3e320a4a2a4aaa4a420a4ab20a4b3a4ca20a4efa4f1a4f3
+
+Deprecated: Function mb_regex_encoding() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
+
+Deprecated: Function mb_ereg() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
 (1)a3eda3faa3f8a3e6a3f020a4a6a4aaa4ab20a4ada4ab20a4f2a4f020a3eda3faa3f8a3e6a3f020a4a6a4aaa4ab2020a4ada4ab20a4f2a4f0
+
+Deprecated: Function mb_regex_encoding() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
+
+Deprecated: Function mb_ereg() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
 (1)6162632064656620676869206a6b6c2064656620676869206a6b6c
+
+Deprecated: Function mb_regex_encoding() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
+
+Deprecated: Function mb_ereg() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
 (1)a3e1a3e2a3e320a4a2a4aaa4a420a4aba4b3a4ca20a4efa4f1a4f320a3e1a3e2a3e320a4a2a4aaa4a420a4ab20a4b3a4ca20a4efa4f1a4f3
+
+Deprecated: Function mb_regex_encoding() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
+
+Deprecated: Function mb_ereg() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
 (1)a3eda3faa3f8a3e6a3f020a4a6a4aaa4ab20a4ada4ab20a4f2a4f020a3eda3faa3f8a3e6a3f020a4a6a4aaa4ab2020a4ada4ab20a4f2a4f0
diff --git a/ext/mbstring/tests/mb_ereg1.phpt b/ext/mbstring/tests/mb_ereg1.phpt
index 813fe5e41ef0..a92b796423de 100644
--- a/ext/mbstring/tests/mb_ereg1.phpt
+++ b/ext/mbstring/tests/mb_ereg1.phpt
@@ -24,7 +24,8 @@ foreach ($a as $args) {
     var_dump($args);
 }
 ?>
---EXPECT--
+--EXPECTF--
+Deprecated: Function mb_ereg() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
 bool(false)
 array(3) {
   [0]=>
@@ -35,6 +36,8 @@ array(3) {
   array(0) {
   }
 }
+
+Deprecated: Function mb_ereg() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
 ValueError: mb_ereg(): Argument #1 ($pattern) must not be empty
 array(3) {
   [0]=>
@@ -44,6 +47,8 @@ array(3) {
   [2]=>
   string(0) ""
 }
+
+Deprecated: Function mb_ereg() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
 TypeError: mb_ereg(): Argument #1 ($pattern) must be of type string, array given
 array(3) {
   [0]=>
@@ -54,6 +59,8 @@ array(3) {
   [2]=>
   string(0) ""
 }
+
+Deprecated: Function mb_ereg() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
 TypeError: mb_ereg(): Argument #2 ($string) must be of type string, array given
 array(3) {
   [0]=>
@@ -64,6 +71,8 @@ array(3) {
   [2]=>
   string(0) ""
 }
+
+Deprecated: Function mb_ereg() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
 bool(false)
 array(3) {
   [0]=>
diff --git a/ext/mbstring/tests/mb_ereg2.phpt b/ext/mbstring/tests/mb_ereg2.phpt
index f87b5c5410a8..22cd29199dda 100644
--- a/ext/mbstring/tests/mb_ereg2.phpt
+++ b/ext/mbstring/tests/mb_ereg2.phpt
@@ -18,13 +18,16 @@ var_dump($a, $b, $c);
 
 echo "Done\n";
 ?>
---EXPECT--
+--EXPECTF--
+Deprecated: Function mb_ereg() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
 int(-1)
 int(-1)
 array(1) {
   [0]=>
   string(2) "-1"
 }
+
+Deprecated: Function mb_eregi() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
 int(-1)
 int(-1)
 array(1) {
diff --git a/ext/mbstring/tests/mb_ereg_basic.phpt b/ext/mbstring/tests/mb_ereg_basic.phpt
index 094f2949ea43..d54f3bb3be80 100644
--- a/ext/mbstring/tests/mb_ereg_basic.phpt
+++ b/ext/mbstring/tests/mb_ereg_basic.phpt
@@ -71,15 +71,23 @@ function base64_encode_var_dump($regs) {
     }
 }
 ?>
---EXPECT--
+--EXPECTF--
 *** Testing mb_ereg() : basic functionality ***
+
+Deprecated: Function mb_regex_encoding() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
 Regex encoding set to utf-8
 
 **-- ASCII String --**
 -- Without $regs argument--
+
+Deprecated: Function mb_ereg() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
 bool(true)
+
+Deprecated: Function mb_ereg() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
 bool(true)
 --With $regs argument --
+
+Deprecated: Function mb_ereg() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
 bool(true)
 array(2) {
   [0]=>
@@ -87,6 +95,8 @@ array(2) {
   [1]=>
   string(24) "VGhpcyBpcyBhbiBFbmdsaXM="
 }
+
+Deprecated: Function mb_ereg() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
 bool(true)
 array(1) {
   [0]=>
@@ -95,9 +105,15 @@ array(1) {
 
 **-- Multibyte String --**
 -- Without $regs argument --
+
+Deprecated: Function mb_ereg() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
 bool(true)
+
+Deprecated: Function mb_ereg() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
 bool(false)
 -- With $regs argument --
+
+Deprecated: Function mb_ereg() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
 bool(true)
 array(3) {
   [0]=>
@@ -107,6 +123,8 @@ array(3) {
   [2]=>
   string(8) "MTIzNA=="
 }
+
+Deprecated: Function mb_ereg() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
 bool(false)
 array(0) {
 }
diff --git a/ext/mbstring/tests/mb_ereg_dupnames.phpt b/ext/mbstring/tests/mb_ereg_dupnames.phpt
index cf4444682f57..104dba927189 100644
--- a/ext/mbstring/tests/mb_ereg_dupnames.phpt
+++ b/ext/mbstring/tests/mb_ereg_dupnames.phpt
@@ -15,7 +15,10 @@ function_exists('mb_ereg') or die("skip mb_ereg() is not available in this build
     mb_ereg($pattern, '中!', $m);
     var_dump($m);
 ?>
---EXPECT--
+--EXPECTF--
+Deprecated: Function mb_regex_encoding() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
+
+Deprecated: Function mb_ereg() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
 array(4) {
   [0]=>
   string(6) "中?"
@@ -26,6 +29,8 @@ array(4) {
   ["punct"]=>
   string(3) "?"
 }
+
+Deprecated: Function mb_ereg() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
 array(4) {
   [0]=>
   string(6) "中!"
diff --git a/ext/mbstring/tests/mb_ereg_match_basic.phpt b/ext/mbstring/tests/mb_ereg_match_basic.phpt
index 5b7a8c2a5402..671a72d27272 100644
--- a/ext/mbstring/tests/mb_ereg_match_basic.phpt
+++ b/ext/mbstring/tests/mb_ereg_match_basic.phpt
@@ -38,18 +38,27 @@ var_dump(mb_ereg_match($regex2, $string_mb));
 
 echo "Done";
 ?>
---EXPECT--
+--EXPECTF--
+Deprecated: Function mb_regex_encoding() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
 *** Testing mb_ereg_match() : basic functionality ***
 
 -- ASCII string 1 --
+
+Deprecated: Function mb_ereg_match() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
 bool(true)
 
 -- ASCII string 2 --
+
+Deprecated: Function mb_ereg_match() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
 bool(false)
 
 -- Multibyte string 1 --
+
+Deprecated: Function mb_ereg_match() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
 bool(true)
 
 -- Multibyte string 2 --
+
+Deprecated: Function mb_ereg_match() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
 bool(false)
 Done
diff --git a/ext/mbstring/tests/mb_ereg_named_subpatterns.phpt b/ext/mbstring/tests/mb_ereg_named_subpatterns.phpt
index 80c17b729d70..7756b49d2128 100644
--- a/ext/mbstring/tests/mb_ereg_named_subpatterns.phpt
+++ b/ext/mbstring/tests/mb_ereg_named_subpatterns.phpt
@@ -16,7 +16,10 @@ function_exists('mb_ereg') or die("skip mb_ereg() is not available in this build
     mb_ereg('(\s*)(?\w+)', '  中国', $m);
     var_dump($m);
 ?>
---EXPECT--
+--EXPECTF--
+Deprecated: Function mb_regex_encoding() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
+
+Deprecated: Function mb_ereg() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
 array(5) {
   [0]=>
   string(8) "  中国"
@@ -29,6 +32,8 @@ array(5) {
   ["word"]=>
   string(6) "中国"
 }
+
+Deprecated: Function mb_ereg() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
 array(5) {
   [0]=>
   string(3) "国"
@@ -41,6 +46,8 @@ array(5) {
   ["word"]=>
   string(3) "国"
 }
+
+Deprecated: Function mb_ereg() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
 array(3) {
   [0]=>
   string(8) "  中国"
diff --git a/ext/mbstring/tests/mb_ereg_replace-compat-01.phpt b/ext/mbstring/tests/mb_ereg_replace-compat-01.phpt
index 9ce201725219..057460ff01e4 100644
--- a/ext/mbstring/tests/mb_ereg_replace-compat-01.phpt
+++ b/ext/mbstring/tests/mb_ereg_replace-compat-01.phpt
@@ -12,5 +12,6 @@ function_exists('mb_ereg_replace') or die("skip mb_ereg_replace() is not availab
   $a="abc123";
   echo mb_ereg_replace("123","def",$a);
 ?>
---EXPECT--
+--EXPECTF--
+Deprecated: Function mb_ereg_replace() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
 abcdef
diff --git a/ext/mbstring/tests/mb_ereg_replace-compat-02.phpt b/ext/mbstring/tests/mb_ereg_replace-compat-02.phpt
index 8fec03b486af..b9bebcf8d71f 100644
--- a/ext/mbstring/tests/mb_ereg_replace-compat-02.phpt
+++ b/ext/mbstring/tests/mb_ereg_replace-compat-02.phpt
@@ -12,5 +12,6 @@ function_exists('mb_ereg_replace') or die("skip mb_ereg_replace() is not availab
   $a="abc123";
   echo mb_ereg_replace("123","",$a);
 ?>
---EXPECT--
+--EXPECTF--
+Deprecated: Function mb_ereg_replace() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
 abc
diff --git a/ext/mbstring/tests/mb_ereg_replace-compat-03.phpt b/ext/mbstring/tests/mb_ereg_replace-compat-03.phpt
index 0e589a8665bb..167eb6986c87 100644
--- a/ext/mbstring/tests/mb_ereg_replace-compat-03.phpt
+++ b/ext/mbstring/tests/mb_ereg_replace-compat-03.phpt
@@ -12,5 +12,6 @@ function_exists('mb_ereg_replace') or die("skip mb_ereg_replace() is not availab
   $a="\\'test";
   echo mb_ereg_replace("\\\\'","'",$a);
 ?>
---EXPECT--
+--EXPECTF--
+Deprecated: Function mb_ereg_replace() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
 'test
diff --git a/ext/mbstring/tests/mb_ereg_replace-compat-04.phpt b/ext/mbstring/tests/mb_ereg_replace-compat-04.phpt
index a9a4fc953281..70d29c8d1805 100644
--- a/ext/mbstring/tests/mb_ereg_replace-compat-04.phpt
+++ b/ext/mbstring/tests/mb_ereg_replace-compat-04.phpt
@@ -12,5 +12,6 @@ function_exists('mb_ereg_replace') or die("skip mb_ereg_replace() is not availab
   $a="This is a nice and simple string";
   echo mb_ereg_replace("^This","That",$a);
 ?>
---EXPECT--
+--EXPECTF--
+Deprecated: Function mb_ereg_replace() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
 That is a nice and simple string
diff --git a/ext/mbstring/tests/mb_ereg_replace-compat-05.phpt b/ext/mbstring/tests/mb_ereg_replace-compat-05.phpt
index 4e15d8bfb8eb..0eaa22615b10 100644
--- a/ext/mbstring/tests/mb_ereg_replace-compat-05.phpt
+++ b/ext/mbstring/tests/mb_ereg_replace-compat-05.phpt
@@ -13,5 +13,6 @@ function_exists('mb_ereg_replace') or die("skip mb_ereg_replace() is not availab
   $b=mb_ereg_replace("abcd","",$a);
   echo "strlen(\$b)=".strlen($b);
 ?>
---EXPECT--
+--EXPECTF--
+Deprecated: Function mb_ereg_replace() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
 strlen($b)=0
diff --git a/ext/mbstring/tests/mb_ereg_replace-compat-06.phpt b/ext/mbstring/tests/mb_ereg_replace-compat-06.phpt
index 396c8e870a26..6c169388387f 100644
--- a/ext/mbstring/tests/mb_ereg_replace-compat-06.phpt
+++ b/ext/mbstring/tests/mb_ereg_replace-compat-06.phpt
@@ -11,5 +11,6 @@ function_exists('mb_ereg_replace') or die("skip mb_ereg_replace() is not availab
 /* (counterpart: ext/standard/tests/reg/008.phpt) */
   echo mb_ereg_replace("([a-z]*)([-=+|]*)([0-9]+)","\\3 \\1 \\2\n","abc+-|=123");
 ?>
---EXPECT--
+--EXPECTF--
+Deprecated: Function mb_ereg_replace() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
 123 abc +-|=
diff --git a/ext/mbstring/tests/mb_ereg_replace-compat-07.phpt b/ext/mbstring/tests/mb_ereg_replace-compat-07.phpt
index f0cd2edfe273..bc5ff9a6ca30 100644
--- a/ext/mbstring/tests/mb_ereg_replace-compat-07.phpt
+++ b/ext/mbstring/tests/mb_ereg_replace-compat-07.phpt
@@ -12,5 +12,6 @@ function_exists('mb_ereg_replace') or die("skip mb_ereg_replace() is not availab
   $a="abc122222222223";
   echo mb_ereg_replace("1(2*)3","\\1def\\1",$a);
 ?>
---EXPECT--
+--EXPECTF--
+Deprecated: Function mb_ereg_replace() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
 abc2222222222def2222222222
diff --git a/ext/mbstring/tests/mb_ereg_replace-compat-08.phpt b/ext/mbstring/tests/mb_ereg_replace-compat-08.phpt
index 8e23aba9cff9..8368e21a2a88 100644
--- a/ext/mbstring/tests/mb_ereg_replace-compat-08.phpt
+++ b/ext/mbstring/tests/mb_ereg_replace-compat-08.phpt
@@ -12,5 +12,6 @@ function_exists('mb_ereg_replace') or die("skip mb_ereg_replace() is not availab
   $a="abc123";
   echo mb_ereg_replace("123","def\\0ghi",$a);
 ?>
---EXPECT--
+--EXPECTF--
+Deprecated: Function mb_ereg_replace() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
 abcdef123ghi
diff --git a/ext/mbstring/tests/mb_ereg_replace-compat-09.phpt b/ext/mbstring/tests/mb_ereg_replace-compat-09.phpt
index cb8fce9135d8..efa1eb0e9dc4 100644
--- a/ext/mbstring/tests/mb_ereg_replace-compat-09.phpt
+++ b/ext/mbstring/tests/mb_ereg_replace-compat-09.phpt
@@ -12,5 +12,6 @@ function_exists('mb_ereg_replace') or die("skip mb_ereg_replace() is not availab
   $a="abc123";
   echo mb_ereg_replace("123",'def\1ghi',$a);
 ?>
---EXPECT--
+--EXPECTF--
+Deprecated: Function mb_ereg_replace() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
 abcdef\1ghi
diff --git a/ext/mbstring/tests/mb_ereg_replace-compat-10.phpt b/ext/mbstring/tests/mb_ereg_replace-compat-10.phpt
index 96c762bc4d5f..d280e93574cb 100644
--- a/ext/mbstring/tests/mb_ereg_replace-compat-10.phpt
+++ b/ext/mbstring/tests/mb_ereg_replace-compat-10.phpt
@@ -12,5 +12,6 @@ function_exists('mb_ereg_replace') or die("skip mb_ereg_replace() is not availab
   $a="abc123";
   echo mb_ereg_replace("123","def\\g\\\\hi\\",$a);
 ?>
---EXPECT--
+--EXPECTF--
+Deprecated: Function mb_ereg_replace() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
 abcdef\g\\hi\
diff --git a/ext/mbstring/tests/mb_ereg_replace-compat-11.phpt b/ext/mbstring/tests/mb_ereg_replace-compat-11.phpt
index a88f358b4b55..8f4b4fe5b295 100644
--- a/ext/mbstring/tests/mb_ereg_replace-compat-11.phpt
+++ b/ext/mbstring/tests/mb_ereg_replace-compat-11.phpt
@@ -12,5 +12,6 @@ function_exists('mb_ereg_replace') or die("skip mb_ereg_replace() is not availab
   $a="a\\2bxc";
   echo mb_ereg_replace("a(.*)b(.*)c","\\1",$a);
 ?>
---EXPECT--
+--EXPECTF--
+Deprecated: Function mb_ereg_replace() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
 \2
diff --git a/ext/mbstring/tests/mb_ereg_replace-compat-12.phpt b/ext/mbstring/tests/mb_ereg_replace-compat-12.phpt
index 0f371053e508..1dbc9a0416de 100644
--- a/ext/mbstring/tests/mb_ereg_replace-compat-12.phpt
+++ b/ext/mbstring/tests/mb_ereg_replace-compat-12.phpt
@@ -11,5 +11,6 @@ function_exists('mb_ereg_replace') or die("skip mb_ereg_replace() is not availab
 /* (counterpart: ext/standard/tests/reg/015.phpt) */
   echo mb_ereg_replace("^","z","abc123");
 ?>
---EXPECT--
+--EXPECTF--
+Deprecated: Function mb_ereg_replace() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
 zabc123
diff --git a/ext/mbstring/tests/mb_ereg_replace-compat-13.phpt b/ext/mbstring/tests/mb_ereg_replace-compat-13.phpt
index a271eeff405c..4e6eaf017bc4 100644
--- a/ext/mbstring/tests/mb_ereg_replace-compat-13.phpt
+++ b/ext/mbstring/tests/mb_ereg_replace-compat-13.phpt
@@ -11,5 +11,6 @@ function_exists('mb_ereg_replace') or die("skip mb_ereg_replace() is not availab
 /* (counterpart: ext/standard/tests/reg/016.phpt) */
   echo mb_ereg_replace('\?',"abc","?123?");
 ?>
---EXPECT--
+--EXPECTF--
+Deprecated: Function mb_ereg_replace() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
 abc123abc
diff --git a/ext/mbstring/tests/mb_ereg_replace.phpt b/ext/mbstring/tests/mb_ereg_replace.phpt
index 455b13e23ce5..1221b6b366b0 100644
--- a/ext/mbstring/tests/mb_ereg_replace.phpt
+++ b/ext/mbstring/tests/mb_ereg_replace.phpt
@@ -12,6 +12,11 @@ function_exists('mb_ereg_replace') or die("skip mb_ereg_replace() is not availab
     print mb_ereg_replace( ' ', '-', 'a b c d e' )."\n";
     print mb_ereg_replace( '([a-z]+)','[\\1]', 'abc def ghi' );
 ?>
---EXPECT--
+--EXPECTF--
+Deprecated: Function mb_regex_set_options() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
+
+Deprecated: Function mb_ereg_replace() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
 a-b-c-d-e
+
+Deprecated: Function mb_ereg_replace() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
 [abc] [def] [ghi]
diff --git a/ext/mbstring/tests/mb_ereg_replace_basic.phpt b/ext/mbstring/tests/mb_ereg_replace_basic.phpt
index a3f18952d375..7faac7371abd 100644
--- a/ext/mbstring/tests/mb_ereg_replace_basic.phpt
+++ b/ext/mbstring/tests/mb_ereg_replace_basic.phpt
@@ -41,18 +41,28 @@ var_dump(bin2hex($result_4));
 
 echo "Done";
 ?>
---EXPECT--
+--EXPECTF--
 *** Testing mb_ereg_replace() : basic functionality ***
 
+Deprecated: Function mb_regex_encoding() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
+
 -- ASCII string 1 --
+
+Deprecated: Function mb_ereg_replace() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
 string(16) "6162632020313233"
 
 -- ASCII string 2 --
+
+Deprecated: Function mb_ereg_replace() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
 string(14) "61626320646566"
 
 -- Multibyte string 1 --
+
+Deprecated: Function mb_ereg_replace() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
 string(72) "e697a5e69cace8aa9e5f5f5f5f5f31323334efbc95efbc96efbc97efbc98efbc99e38082"
 
 -- Multibyte string 2 --
+
+Deprecated: Function mb_ereg_replace() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
 string(106) "e697a5e69cace8aa9ee38386e382ade382b9e38388e381a7e38199e380823031323334efbc95efbc96efbc97efbc98efbc99e38082"
 Done
diff --git a/ext/mbstring/tests/mb_ereg_replace_callback.phpt b/ext/mbstring/tests/mb_ereg_replace_callback.phpt
index 40120c03eab2..d4541d09cafa 100644
--- a/ext/mbstring/tests/mb_ereg_replace_callback.phpt
+++ b/ext/mbstring/tests/mb_ereg_replace_callback.phpt
@@ -18,6 +18,9 @@ echo mb_ereg_replace_callback('(?\w+) (?\d+).*', function ($m) {
     return sprintf("%s-%s", $m['digit'], $m['word']);
 }, $str), "\n";
 ?>
---EXPECT--
+--EXPECTF--
+Deprecated: Function mb_ereg_replace_callback() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
 abc(3) 123(3) #",;(4) $foo(4)
+
+Deprecated: Function mb_ereg_replace_callback() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
 123-abc
diff --git a/ext/mbstring/tests/mb_ereg_replace_named_subpatterns.phpt b/ext/mbstring/tests/mb_ereg_replace_named_subpatterns.phpt
index 7e4d8e2e4940..8a58e95dffdf 100644
--- a/ext/mbstring/tests/mb_ereg_replace_named_subpatterns.phpt
+++ b/ext/mbstring/tests/mb_ereg_replace_named_subpatterns.phpt
@@ -26,12 +26,29 @@ function_exists('mb_ereg_replace') or die("skip mb_ereg_replace() is not availab
     // An unclosed backref is ignored
     echo mb_ereg_replace('(?\w+)', '-\k
---EXPECT--
+--EXPECTF--
+Deprecated: Function mb_regex_set_options() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
+
+Deprecated: Function mb_ereg_replace() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
 _a_ _b_ _c_ _d_ _e_
+
+Deprecated: Function mb_ereg_replace() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
   
+
+Deprecated: Function mb_ereg_replace() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
 123456789aa-a-
+
+Deprecated: Function mb_ereg_replace() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
 123456789aa-a-
+
+Deprecated: Function mb_ereg_replace() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
 a_\k<01>
+
+Deprecated: Function mb_ereg_replace() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
 -\1-
+
+Deprecated: Function mb_ereg_replace() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
 -\k<>-
+
+Deprecated: Function mb_ereg_replace() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
 -\k
---EXPECT--
+--EXPECTF--
 *** Testing mb_ereg_replace() : usage variations ***
 
 -- Iteration 1 --
+
+Deprecated: Function mb_ereg_replace() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
 string(10) "string_val"
 
 -- Iteration 2 --
+
+Deprecated: Function mb_ereg_replace() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
 string(10) "string_val"
 
 -- Iteration 3 --
+
+Deprecated: Function mb_ereg_replace() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
 string(10) "string_val"
 
 -- Iteration 4 --
+
+Deprecated: Function mb_ereg_replace() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
 string(10) "string_val"
 
 -- Iteration 5 --
+
+Deprecated: Function mb_ereg_replace() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
 string(10) "string_val"
 
 -- Iteration 6 --
+
+Deprecated: Function mb_ereg_replace() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
 string(10) "string_val"
 
 -- Iteration 7 --
+
+Deprecated: Function mb_ereg_replace() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
 string(10) "string_val"
 
 -- Iteration 8 --
+
+Deprecated: Function mb_ereg_replace() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
 string(10) "string_val"
 
 -- Iteration 9 --
+
+Deprecated: Function mb_ereg_replace() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
 string(10) "string_val"
 
 -- Iteration 10 --
+
+Deprecated: Function mb_ereg_replace() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
 string(120) "string_valsstring_valtstring_valrstring_valistring_valnstring_valgstring_val_string_valvstring_valastring_vallstring_val"
 
 -- Iteration 11 --
+
+Deprecated: Function mb_ereg_replace() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
 string(10) "string_val"
 Done
diff --git a/ext/mbstring/tests/mb_ereg_search.phpt b/ext/mbstring/tests/mb_ereg_search.phpt
index f167b9d7607d..25f581b7dd8d 100644
--- a/ext/mbstring/tests/mb_ereg_search.phpt
+++ b/ext/mbstring/tests/mb_ereg_search.phpt
@@ -32,9 +32,26 @@ function_exists('mb_ereg_search') or die("skip mb_ereg_search() is not available
         while($r);
     }
 ?>
---EXPECT--
+--EXPECTF--
+Deprecated: Function mb_regex_encoding() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
+
+Deprecated: Function mb_ereg_search_init() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
+
+Deprecated: Function mb_ereg_search() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
+
+Deprecated: Function mb_ereg_search_getregs() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
 string(9) "中国abc"
+
+Deprecated: Function mb_ereg_search_regs() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
 string(3) "abc"
+
+Deprecated: Function mb_ereg_search_regs() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
 string(6) "字符"
+
+Deprecated: Function mb_ereg_search_regs() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
 string(5) "china"
+
+Deprecated: Function mb_ereg_search_regs() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
 string(6) "string"
+
+Deprecated: Function mb_ereg_search_regs() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
diff --git a/ext/mbstring/tests/mb_ereg_search_invalid_pattern.phpt b/ext/mbstring/tests/mb_ereg_search_invalid_pattern.phpt
index 6979816fe8e0..33ad520e5fe6 100644
--- a/ext/mbstring/tests/mb_ereg_search_invalid_pattern.phpt
+++ b/ext/mbstring/tests/mb_ereg_search_invalid_pattern.phpt
@@ -14,8 +14,15 @@ var_dump(mb_ereg_search_getregs());
 
 ?>
 --EXPECTF--
+Deprecated: Function mb_ereg_search_init() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
+
+Deprecated: Function mb_ereg_search() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
 bool(true)
 
+Deprecated: Function mb_ereg_search() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
+
 Warning: mb_ereg_search(): Pattern is not valid under UTF-8 encoding in %s on line %d
 bool(false)
+
+Deprecated: Function mb_ereg_search_getregs() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
 bool(false)
diff --git a/ext/mbstring/tests/mb_ereg_search_named_subpatterns_1.phpt b/ext/mbstring/tests/mb_ereg_search_named_subpatterns_1.phpt
index 03161cf27cec..bcf73b6b3f40 100644
--- a/ext/mbstring/tests/mb_ereg_search_named_subpatterns_1.phpt
+++ b/ext/mbstring/tests/mb_ereg_search_named_subpatterns_1.phpt
@@ -5,7 +5,7 @@ mbstring
 --SKIPIF--
 
 --FILE--
 =') or die("skip requires oniguruma >= 6.9.4");
+@version_compare(MB_ONIGURUMA_VERSION, '6.9.4', '>=') or die("skip requires oniguruma >= 6.9.4");
 ?>
 --FILE--
 =') or die("skip requires onigu
     mb_ereg_search('(?\s*)(?\w+)(?[?!])');
     var_dump(mb_ereg_search_getregs());
 ?>
---EXPECT--
+--EXPECTF--
+Deprecated: Function mb_regex_encoding() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
+
+Deprecated: Function mb_ereg_search_init() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
+
+Deprecated: Function mb_ereg_search() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
+
+Deprecated: Function mb_ereg_search_getregs() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
 array(7) {
   [0]=>
   string(11) "  中国?"
diff --git a/ext/mbstring/tests/mb_ereg_search_pos.phpt b/ext/mbstring/tests/mb_ereg_search_pos.phpt
index 7f8f99f0c5d2..2c88cff01e04 100644
--- a/ext/mbstring/tests/mb_ereg_search_pos.phpt
+++ b/ext/mbstring/tests/mb_ereg_search_pos.phpt
@@ -22,7 +22,12 @@ else{
     var_dump("false");
 }
 ?>
---EXPECT--
+--EXPECTF--
+Deprecated: Function mb_regex_encoding() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
+
+Deprecated: Function mb_ereg_search_init() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
+
+Deprecated: Function mb_ereg_search_pos() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
 array(2) {
   [0]=>
   int(5)
diff --git a/ext/mbstring/tests/mb_ereg_search_regs.phpt b/ext/mbstring/tests/mb_ereg_search_regs.phpt
index eb883387e620..dd28df903729 100644
--- a/ext/mbstring/tests/mb_ereg_search_regs.phpt
+++ b/ext/mbstring/tests/mb_ereg_search_regs.phpt
@@ -22,7 +22,10 @@ function_exists('mb_ereg_search_regs') or die("skip mb_ereg_search_regs() not av
 
 
 ?>
---EXPECT--
+--EXPECTF--
+Deprecated: Function mb_ereg_search_init() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
+
+Deprecated: Function mb_ereg_search_regs() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
 array(1) {
   [0]=>
   string(4) "ов"
diff --git a/ext/mbstring/tests/mb_ereg_search_setpos.phpt b/ext/mbstring/tests/mb_ereg_search_setpos.phpt
index 6a953447174d..6153d86282df 100644
--- a/ext/mbstring/tests/mb_ereg_search_setpos.phpt
+++ b/ext/mbstring/tests/mb_ereg_search_setpos.phpt
@@ -35,38 +35,77 @@ foreach($positions as $pos) {
     }
 }
 ?>
---EXPECT--
+--EXPECTF--
+Deprecated: Function mb_regex_encoding() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
+
+Deprecated: Function mb_ereg_search_setpos() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
 bool(true)
+
+Deprecated: Function mb_ereg_search_setpos() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
 mb_ereg_search_setpos(): Argument #1 ($offset) is out of range
 
+Deprecated: Function mb_ereg_search_init() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
+
 * Position: 5 :
+
+Deprecated: Function mb_ereg_search_setpos() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
 bool(true)
+
+Deprecated: Function mb_ereg_search_getpos() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
 int(5)
 
 * Position: 20 :
+
+Deprecated: Function mb_ereg_search_setpos() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
 bool(true)
+
+Deprecated: Function mb_ereg_search_getpos() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
 int(20)
 
 * Position: 21 :
+
+Deprecated: Function mb_ereg_search_setpos() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
 mb_ereg_search_setpos(): Argument #1 ($offset) is out of range
+
+Deprecated: Function mb_ereg_search_getpos() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
 int(20)
 
 * Position: 25 :
+
+Deprecated: Function mb_ereg_search_setpos() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
 mb_ereg_search_setpos(): Argument #1 ($offset) is out of range
+
+Deprecated: Function mb_ereg_search_getpos() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
 int(20)
 
 * Position: 0 :
+
+Deprecated: Function mb_ereg_search_setpos() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
 bool(true)
+
+Deprecated: Function mb_ereg_search_getpos() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
 int(0)
 
 * Position: -5 :
+
+Deprecated: Function mb_ereg_search_setpos() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
 bool(true)
+
+Deprecated: Function mb_ereg_search_getpos() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
 int(15)
 
 * Position: -20 :
+
+Deprecated: Function mb_ereg_search_setpos() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
 bool(true)
+
+Deprecated: Function mb_ereg_search_getpos() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
 int(0)
 
 * Position: -30 :
+
+Deprecated: Function mb_ereg_search_setpos() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
 mb_ereg_search_setpos(): Argument #1 ($offset) is out of range
+
+Deprecated: Function mb_ereg_search_getpos() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
 int(0)
diff --git a/ext/mbstring/tests/mb_ereg_search_syntax.phpt b/ext/mbstring/tests/mb_ereg_search_syntax.phpt
index 5e16a91c3695..f6b427a3c7e6 100644
--- a/ext/mbstring/tests/mb_ereg_search_syntax.phpt
+++ b/ext/mbstring/tests/mb_ereg_search_syntax.phpt
@@ -13,5 +13,8 @@ mb_ereg_search_init("a");
 var_dump(mb_ereg_search("a\\{1,2\\}", "b"));
 
 ?>
---EXPECT--
+--EXPECTF--
+Deprecated: Function mb_ereg_search_init() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
+
+Deprecated: Function mb_ereg_search() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
 bool(true)
diff --git a/ext/mbstring/tests/mb_ereg_search_xxx.phpt b/ext/mbstring/tests/mb_ereg_search_xxx.phpt
index 238dcc0e87a5..33d21052ecd3 100644
--- a/ext/mbstring/tests/mb_ereg_search_xxx.phpt
+++ b/ext/mbstring/tests/mb_ereg_search_xxx.phpt
@@ -35,48 +35,409 @@ output_handler=
         do_tests( $enc, 'x' );
     }
 ?>
---EXPECT--
+--EXPECTF--
+Deprecated: Function mb_regex_set_options() is deprecated since 8.6, because the underlying library is no longer maintained in %s line %d
+
+Deprecated: Function mb_regex_encoding() is deprecated since 8.6, because the underlying library is no longer maintained in %s line %d
+
+Deprecated: Function mb_ereg_search_init() is deprecated since 8.6, because the underlying library is no longer maintained in %s line %d
+
+Deprecated: Function mb_ereg_search_pos() is deprecated since 8.6, because the underlying library is no longer maintained in %s line %d
+
+Deprecated: Function mb_ereg_search_getregs() is deprecated since 8.6, because the underlying library is no longer maintained in %s line %d
+
+Deprecated: Function mb_ereg_search_getpos() is deprecated since 8.6, because the underlying library is no longer maintained in %s line %d
 (EUC-JP) (10) 
+
+Deprecated: Function mb_ereg_search_pos() is deprecated since 8.6, because the underlying library is no longer maintained in %s line %d
+
+Deprecated: Function mb_regex_encoding() is deprecated since 8.6, because the underlying library is no longer maintained in %s line %d
+
+Deprecated: Function mb_ereg_search_init() is deprecated since 8.6, because the underlying library is no longer maintained in %s line %d
+
+Deprecated: Function mb_ereg_search_pos() is deprecated since 8.6, because the underlying library is no longer maintained in %s line %d
+
+Deprecated: Function mb_ereg_search_getregs() is deprecated since 8.6, because the underlying library is no longer maintained in %s line %d
+
+Deprecated: Function mb_ereg_search_getpos() is deprecated since 8.6, because the underlying library is no longer maintained in %s line %d
 (EUC-JP) (5) abcde
+
+Deprecated: Function mb_ereg_search_pos() is deprecated since 8.6, because the underlying library is no longer maintained in %s line %d
+
+Deprecated: Function mb_ereg_search_getregs() is deprecated since 8.6, because the underlying library is no longer maintained in %s line %d
+
+Deprecated: Function mb_ereg_search_getpos() is deprecated since 8.6, because the underlying library is no longer maintained in %s line %d
 (EUC-JP) (14) abdeabcf
+
+Deprecated: Function mb_ereg_search_pos() is deprecated since 8.6, because the underlying library is no longer maintained in %s line %d
+
+Deprecated: Function mb_ereg_search_getregs() is deprecated since 8.6, because the underlying library is no longer maintained in %s line %d
+
+Deprecated: Function mb_ereg_search_getpos() is deprecated since 8.6, because the underlying library is no longer maintained in %s line %d
 (EUC-JP) (22) abc
+
+Deprecated: Function mb_ereg_search_pos() is deprecated since 8.6, because the underlying library is no longer maintained in %s line %d
+
+Deprecated: Function mb_ereg_search_getregs() is deprecated since 8.6, because the underlying library is no longer maintained in %s line %d
+
+Deprecated: Function mb_ereg_search_getpos() is deprecated since 8.6, because the underlying library is no longer maintained in %s line %d
 (EUC-JP) (31) abcd
+
+Deprecated: Function mb_ereg_search_pos() is deprecated since 8.6, because the underlying library is no longer maintained in %s line %d
+
+Deprecated: Function mb_regex_encoding() is deprecated since 8.6, because the underlying library is no longer maintained in %s line %d
+
+Deprecated: Function mb_ereg_search_init() is deprecated since 8.6, because the underlying library is no longer maintained in %s line %d
+
+Deprecated: Function mb_ereg_search_pos() is deprecated since 8.6, because the underlying library is no longer maintained in %s line %d
+
+Deprecated: Function mb_ereg_search_getregs() is deprecated since 8.6, because the underlying library is no longer maintained in %s line %d
+
+Deprecated: Function mb_ereg_search_getpos() is deprecated since 8.6, because the underlying library is no longer maintained in %s line %d
 (EUC-JP) (5) ϡ
+
+Deprecated: Function mb_ereg_search_pos() is deprecated since 8.6, because the underlying library is no longer maintained in %s line %d
+
+Deprecated: Function mb_ereg_search_getregs() is deprecated since 8.6, because the underlying library is no longer maintained in %s line %d
+
+Deprecated: Function mb_ereg_search_getpos() is deprecated since 8.6, because the underlying library is no longer maintained in %s line %d
 (EUC-JP) (10) 
+
+Deprecated: Function mb_ereg_search_pos() is deprecated since 8.6, because the underlying library is no longer maintained in %s line %d
+
+Deprecated: Function mb_regex_encoding() is deprecated since 8.6, because the underlying library is no longer maintained in %s line %d
+
+Deprecated: Function mb_ereg_search_init() is deprecated since 8.6, because the underlying library is no longer maintained in %s line %d
+
+Deprecated: Function mb_ereg_search_pos() is deprecated since 8.6, because the underlying library is no longer maintained in %s line %d
+
+Deprecated: Function mb_ereg_search_getregs() is deprecated since 8.6, because the underlying library is no longer maintained in %s line %d
+
+Deprecated: Function mb_ereg_search_getpos() is deprecated since 8.6, because the underlying library is no longer maintained in %s line %d
 (EUC-JP) (5) abcde
+
+Deprecated: Function mb_ereg_search_pos() is deprecated since 8.6, because the underlying library is no longer maintained in %s line %d
+
+Deprecated: Function mb_ereg_search_getregs() is deprecated since 8.6, because the underlying library is no longer maintained in %s line %d
+
+Deprecated: Function mb_ereg_search_getpos() is deprecated since 8.6, because the underlying library is no longer maintained in %s line %d
 (EUC-JP) (14) abdeabcf
+
+Deprecated: Function mb_ereg_search_pos() is deprecated since 8.6, because the underlying library is no longer maintained in %s line %d
+
+Deprecated: Function mb_ereg_search_getregs() is deprecated since 8.6, because the underlying library is no longer maintained in %s line %d
+
+Deprecated: Function mb_ereg_search_getpos() is deprecated since 8.6, because the underlying library is no longer maintained in %s line %d
 (EUC-JP) (22) abc
+
+Deprecated: Function mb_ereg_search_pos() is deprecated since 8.6, because the underlying library is no longer maintained in %s line %d
+
+Deprecated: Function mb_ereg_search_getregs() is deprecated since 8.6, because the underlying library is no longer maintained in %s line %d
+
+Deprecated: Function mb_ereg_search_getpos() is deprecated since 8.6, because the underlying library is no longer maintained in %s line %d
 (EUC-JP) (31) abcd
+
+Deprecated: Function mb_ereg_search_pos() is deprecated since 8.6, because the underlying library is no longer maintained in %s line %d
+
+Deprecated: Function mb_regex_encoding() is deprecated since 8.6, because the underlying library is no longer maintained in %s line %d
+
+Deprecated: Function mb_ereg_search_init() is deprecated since 8.6, because the underlying library is no longer maintained in %s line %d
+
+Deprecated: Function mb_ereg_search_pos() is deprecated since 8.6, because the underlying library is no longer maintained in %s line %d
+
+Deprecated: Function mb_ereg_search_getregs() is deprecated since 8.6, because the underlying library is no longer maintained in %s line %d
+
+Deprecated: Function mb_ereg_search_getpos() is deprecated since 8.6, because the underlying library is no longer maintained in %s line %d
 (Shift_JIS) (10) 
+
+Deprecated: Function mb_ereg_search_pos() is deprecated since 8.6, because the underlying library is no longer maintained in %s line %d
+
+Deprecated: Function mb_regex_encoding() is deprecated since 8.6, because the underlying library is no longer maintained in %s line %d
+
+Deprecated: Function mb_ereg_search_init() is deprecated since 8.6, because the underlying library is no longer maintained in %s line %d
+
+Deprecated: Function mb_ereg_search_pos() is deprecated since 8.6, because the underlying library is no longer maintained in %s line %d
+
+Deprecated: Function mb_ereg_search_getregs() is deprecated since 8.6, because the underlying library is no longer maintained in %s line %d
+
+Deprecated: Function mb_ereg_search_getpos() is deprecated since 8.6, because the underlying library is no longer maintained in %s line %d
 (Shift_JIS) (5) abcde
+
+Deprecated: Function mb_ereg_search_pos() is deprecated since 8.6, because the underlying library is no longer maintained in %s line %d
+
+Deprecated: Function mb_ereg_search_getregs() is deprecated since 8.6, because the underlying library is no longer maintained in %s line %d
+
+Deprecated: Function mb_ereg_search_getpos() is deprecated since 8.6, because the underlying library is no longer maintained in %s line %d
 (Shift_JIS) (14) abdeabcf
+
+Deprecated: Function mb_ereg_search_pos() is deprecated since 8.6, because the underlying library is no longer maintained in %s line %d
+
+Deprecated: Function mb_ereg_search_getregs() is deprecated since 8.6, because the underlying library is no longer maintained in %s line %d
+
+Deprecated: Function mb_ereg_search_getpos() is deprecated since 8.6, because the underlying library is no longer maintained in %s line %d
 (Shift_JIS) (22) abc
+
+Deprecated: Function mb_ereg_search_pos() is deprecated since 8.6, because the underlying library is no longer maintained in %s line %d
+
+Deprecated: Function mb_ereg_search_getregs() is deprecated since 8.6, because the underlying library is no longer maintained in %s line %d
+
+Deprecated: Function mb_ereg_search_getpos() is deprecated since 8.6, because the underlying library is no longer maintained in %s line %d
 (Shift_JIS) (31) abcd
+
+Deprecated: Function mb_ereg_search_pos() is deprecated since 8.6, because the underlying library is no longer maintained in %s line %d
+
+Deprecated: Function mb_regex_encoding() is deprecated since 8.6, because the underlying library is no longer maintained in %s line %d
+
+Deprecated: Function mb_ereg_search_init() is deprecated since 8.6, because the underlying library is no longer maintained in %s line %d
+
+Deprecated: Function mb_ereg_search_pos() is deprecated since 8.6, because the underlying library is no longer maintained in %s line %d
+
+Deprecated: Function mb_ereg_search_getregs() is deprecated since 8.6, because the underlying library is no longer maintained in %s line %d
+
+Deprecated: Function mb_ereg_search_getpos() is deprecated since 8.6, because the underlying library is no longer maintained in %s line %d
 (Shift_JIS) (5) ϡ
+
+Deprecated: Function mb_ereg_search_pos() is deprecated since 8.6, because the underlying library is no longer maintained in %s line %d
+
+Deprecated: Function mb_ereg_search_getregs() is deprecated since 8.6, because the underlying library is no longer maintained in %s line %d
+
+Deprecated: Function mb_ereg_search_getpos() is deprecated since 8.6, because the underlying library is no longer maintained in %s line %d
 (Shift_JIS) (10) 
+
+Deprecated: Function mb_ereg_search_pos() is deprecated since 8.6, because the underlying library is no longer maintained in %s line %d
+
+Deprecated: Function mb_regex_encoding() is deprecated since 8.6, because the underlying library is no longer maintained in %s line %d
+
+Deprecated: Function mb_ereg_search_init() is deprecated since 8.6, because the underlying library is no longer maintained in %s line %d
+
+Deprecated: Function mb_ereg_search_pos() is deprecated since 8.6, because the underlying library is no longer maintained in %s line %d
+
+Deprecated: Function mb_ereg_search_getregs() is deprecated since 8.6, because the underlying library is no longer maintained in %s line %d
+
+Deprecated: Function mb_ereg_search_getpos() is deprecated since 8.6, because the underlying library is no longer maintained in %s line %d
 (Shift_JIS) (5) abcde
+
+Deprecated: Function mb_ereg_search_pos() is deprecated since 8.6, because the underlying library is no longer maintained in %s line %d
+
+Deprecated: Function mb_ereg_search_getregs() is deprecated since 8.6, because the underlying library is no longer maintained in %s line %d
+
+Deprecated: Function mb_ereg_search_getpos() is deprecated since 8.6, because the underlying library is no longer maintained in %s line %d
 (Shift_JIS) (14) abdeabcf
+
+Deprecated: Function mb_ereg_search_pos() is deprecated since 8.6, because the underlying library is no longer maintained in %s line %d
+
+Deprecated: Function mb_ereg_search_getregs() is deprecated since 8.6, because the underlying library is no longer maintained in %s line %d
+
+Deprecated: Function mb_ereg_search_getpos() is deprecated since 8.6, because the underlying library is no longer maintained in %s line %d
 (Shift_JIS) (22) abc
+
+Deprecated: Function mb_ereg_search_pos() is deprecated since 8.6, because the underlying library is no longer maintained in %s line %d
+
+Deprecated: Function mb_ereg_search_getregs() is deprecated since 8.6, because the underlying library is no longer maintained in %s line %d
+
+Deprecated: Function mb_ereg_search_getpos() is deprecated since 8.6, because the underlying library is no longer maintained in %s line %d
 (Shift_JIS) (31) abcd
+
+Deprecated: Function mb_ereg_search_pos() is deprecated since 8.6, because the underlying library is no longer maintained in %s line %d
+
+Deprecated: Function mb_regex_encoding() is deprecated since 8.6, because the underlying library is no longer maintained in %s line %d
+
+Deprecated: Function mb_ereg_search_init() is deprecated since 8.6, because the underlying library is no longer maintained in %s line %d
+
+Deprecated: Function mb_ereg_search_pos() is deprecated since 8.6, because the underlying library is no longer maintained in %s line %d
+
+Deprecated: Function mb_ereg_search_getregs() is deprecated since 8.6, because the underlying library is no longer maintained in %s line %d
+
+Deprecated: Function mb_ereg_search_getpos() is deprecated since 8.6, because the underlying library is no longer maintained in %s line %d
 (SJIS) (10) 
+
+Deprecated: Function mb_ereg_search_pos() is deprecated since 8.6, because the underlying library is no longer maintained in %s line %d
+
+Deprecated: Function mb_regex_encoding() is deprecated since 8.6, because the underlying library is no longer maintained in %s line %d
+
+Deprecated: Function mb_ereg_search_init() is deprecated since 8.6, because the underlying library is no longer maintained in %s line %d
+
+Deprecated: Function mb_ereg_search_pos() is deprecated since 8.6, because the underlying library is no longer maintained in %s line %d
+
+Deprecated: Function mb_ereg_search_getregs() is deprecated since 8.6, because the underlying library is no longer maintained in %s line %d
+
+Deprecated: Function mb_ereg_search_getpos() is deprecated since 8.6, because the underlying library is no longer maintained in %s line %d
 (SJIS) (5) abcde
+
+Deprecated: Function mb_ereg_search_pos() is deprecated since 8.6, because the underlying library is no longer maintained in %s line %d
+
+Deprecated: Function mb_ereg_search_getregs() is deprecated since 8.6, because the underlying library is no longer maintained in %s line %d
+
+Deprecated: Function mb_ereg_search_getpos() is deprecated since 8.6, because the underlying library is no longer maintained in %s line %d
 (SJIS) (14) abdeabcf
+
+Deprecated: Function mb_ereg_search_pos() is deprecated since 8.6, because the underlying library is no longer maintained in %s line %d
+
+Deprecated: Function mb_ereg_search_getregs() is deprecated since 8.6, because the underlying library is no longer maintained in %s line %d
+
+Deprecated: Function mb_ereg_search_getpos() is deprecated since 8.6, because the underlying library is no longer maintained in %s line %d
 (SJIS) (22) abc
+
+Deprecated: Function mb_ereg_search_pos() is deprecated since 8.6, because the underlying library is no longer maintained in %s line %d
+
+Deprecated: Function mb_ereg_search_getregs() is deprecated since 8.6, because the underlying library is no longer maintained in %s line %d
+
+Deprecated: Function mb_ereg_search_getpos() is deprecated since 8.6, because the underlying library is no longer maintained in %s line %d
 (SJIS) (31) abcd
+
+Deprecated: Function mb_ereg_search_pos() is deprecated since 8.6, because the underlying library is no longer maintained in %s line %d
+
+Deprecated: Function mb_regex_encoding() is deprecated since 8.6, because the underlying library is no longer maintained in %s line %d
+
+Deprecated: Function mb_ereg_search_init() is deprecated since 8.6, because the underlying library is no longer maintained in %s line %d
+
+Deprecated: Function mb_ereg_search_pos() is deprecated since 8.6, because the underlying library is no longer maintained in %s line %d
+
+Deprecated: Function mb_ereg_search_getregs() is deprecated since 8.6, because the underlying library is no longer maintained in %s line %d
+
+Deprecated: Function mb_ereg_search_getpos() is deprecated since 8.6, because the underlying library is no longer maintained in %s line %d
 (SJIS) (5) ϡ
+
+Deprecated: Function mb_ereg_search_pos() is deprecated since 8.6, because the underlying library is no longer maintained in %s line %d
+
+Deprecated: Function mb_ereg_search_getregs() is deprecated since 8.6, because the underlying library is no longer maintained in %s line %d
+
+Deprecated: Function mb_ereg_search_getpos() is deprecated since 8.6, because the underlying library is no longer maintained in %s line %d
 (SJIS) (10) 
+
+Deprecated: Function mb_ereg_search_pos() is deprecated since 8.6, because the underlying library is no longer maintained in %s line %d
+
+Deprecated: Function mb_regex_encoding() is deprecated since 8.6, because the underlying library is no longer maintained in %s line %d
+
+Deprecated: Function mb_ereg_search_init() is deprecated since 8.6, because the underlying library is no longer maintained in %s line %d
+
+Deprecated: Function mb_ereg_search_pos() is deprecated since 8.6, because the underlying library is no longer maintained in %s line %d
+
+Deprecated: Function mb_ereg_search_getregs() is deprecated since 8.6, because the underlying library is no longer maintained in %s line %d
+
+Deprecated: Function mb_ereg_search_getpos() is deprecated since 8.6, because the underlying library is no longer maintained in %s line %d
 (SJIS) (5) abcde
+
+Deprecated: Function mb_ereg_search_pos() is deprecated since 8.6, because the underlying library is no longer maintained in %s line %d
+
+Deprecated: Function mb_ereg_search_getregs() is deprecated since 8.6, because the underlying library is no longer maintained in %s line %d
+
+Deprecated: Function mb_ereg_search_getpos() is deprecated since 8.6, because the underlying library is no longer maintained in %s line %d
 (SJIS) (14) abdeabcf
+
+Deprecated: Function mb_ereg_search_pos() is deprecated since 8.6, because the underlying library is no longer maintained in %s line %d
+
+Deprecated: Function mb_ereg_search_getregs() is deprecated since 8.6, because the underlying library is no longer maintained in %s line %d
+
+Deprecated: Function mb_ereg_search_getpos() is deprecated since 8.6, because the underlying library is no longer maintained in %s line %d
 (SJIS) (22) abc
+
+Deprecated: Function mb_ereg_search_pos() is deprecated since 8.6, because the underlying library is no longer maintained in %s line %d
+
+Deprecated: Function mb_ereg_search_getregs() is deprecated since 8.6, because the underlying library is no longer maintained in %s line %d
+
+Deprecated: Function mb_ereg_search_getpos() is deprecated since 8.6, because the underlying library is no longer maintained in %s line %d
 (SJIS) (31) abcd
+
+Deprecated: Function mb_ereg_search_pos() is deprecated since 8.6, because the underlying library is no longer maintained in %s line %d
+
+Deprecated: Function mb_regex_encoding() is deprecated since 8.6, because the underlying library is no longer maintained in %s line %d
+
+Deprecated: Function mb_ereg_search_init() is deprecated since 8.6, because the underlying library is no longer maintained in %s line %d
+
+Deprecated: Function mb_ereg_search_pos() is deprecated since 8.6, because the underlying library is no longer maintained in %s line %d
+
+Deprecated: Function mb_ereg_search_getregs() is deprecated since 8.6, because the underlying library is no longer maintained in %s line %d
+
+Deprecated: Function mb_ereg_search_getpos() is deprecated since 8.6, because the underlying library is no longer maintained in %s line %d
 (UTF-8) (14) 
+
+Deprecated: Function mb_ereg_search_pos() is deprecated since 8.6, because the underlying library is no longer maintained in %s line %d
+
+Deprecated: Function mb_regex_encoding() is deprecated since 8.6, because the underlying library is no longer maintained in %s line %d
+
+Deprecated: Function mb_ereg_search_init() is deprecated since 8.6, because the underlying library is no longer maintained in %s line %d
+
+Deprecated: Function mb_ereg_search_pos() is deprecated since 8.6, because the underlying library is no longer maintained in %s line %d
+
+Deprecated: Function mb_ereg_search_getregs() is deprecated since 8.6, because the underlying library is no longer maintained in %s line %d
+
+Deprecated: Function mb_ereg_search_getpos() is deprecated since 8.6, because the underlying library is no longer maintained in %s line %d
 (UTF-8) (5) abcde
+
+Deprecated: Function mb_ereg_search_pos() is deprecated since 8.6, because the underlying library is no longer maintained in %s line %d
+
+Deprecated: Function mb_ereg_search_getregs() is deprecated since 8.6, because the underlying library is no longer maintained in %s line %d
+
+Deprecated: Function mb_ereg_search_getpos() is deprecated since 8.6, because the underlying library is no longer maintained in %s line %d
 (UTF-8) (14) abdeabcf
+
+Deprecated: Function mb_ereg_search_pos() is deprecated since 8.6, because the underlying library is no longer maintained in %s line %d
+
+Deprecated: Function mb_ereg_search_getregs() is deprecated since 8.6, because the underlying library is no longer maintained in %s line %d
+
+Deprecated: Function mb_ereg_search_getpos() is deprecated since 8.6, because the underlying library is no longer maintained in %s line %d
 (UTF-8) (22) abc
+
+Deprecated: Function mb_ereg_search_pos() is deprecated since 8.6, because the underlying library is no longer maintained in %s line %d
+
+Deprecated: Function mb_ereg_search_getregs() is deprecated since 8.6, because the underlying library is no longer maintained in %s line %d
+
+Deprecated: Function mb_ereg_search_getpos() is deprecated since 8.6, because the underlying library is no longer maintained in %s line %d
 (UTF-8) (31) abcd
+
+Deprecated: Function mb_ereg_search_pos() is deprecated since 8.6, because the underlying library is no longer maintained in %s line %d
+
+Deprecated: Function mb_regex_encoding() is deprecated since 8.6, because the underlying library is no longer maintained in %s line %d
+
+Deprecated: Function mb_ereg_search_init() is deprecated since 8.6, because the underlying library is no longer maintained in %s line %d
+
+Deprecated: Function mb_ereg_search_pos() is deprecated since 8.6, because the underlying library is no longer maintained in %s line %d
+
+Deprecated: Function mb_ereg_search_getregs() is deprecated since 8.6, because the underlying library is no longer maintained in %s line %d
+
+Deprecated: Function mb_ereg_search_getpos() is deprecated since 8.6, because the underlying library is no longer maintained in %s line %d
 (UTF-8) (7) ϡ
+
+Deprecated: Function mb_ereg_search_pos() is deprecated since 8.6, because the underlying library is no longer maintained in %s line %d
+
+Deprecated: Function mb_ereg_search_getregs() is deprecated since 8.6, because the underlying library is no longer maintained in %s line %d
+
+Deprecated: Function mb_ereg_search_getpos() is deprecated since 8.6, because the underlying library is no longer maintained in %s line %d
 (UTF-8) (14) 
+
+Deprecated: Function mb_ereg_search_pos() is deprecated since 8.6, because the underlying library is no longer maintained in %s line %d
+
+Deprecated: Function mb_regex_encoding() is deprecated since 8.6, because the underlying library is no longer maintained in %s line %d
+
+Deprecated: Function mb_ereg_search_init() is deprecated since 8.6, because the underlying library is no longer maintained in %s line %d
+
+Deprecated: Function mb_ereg_search_pos() is deprecated since 8.6, because the underlying library is no longer maintained in %s line %d
+
+Deprecated: Function mb_ereg_search_getregs() is deprecated since 8.6, because the underlying library is no longer maintained in %s line %d
+
+Deprecated: Function mb_ereg_search_getpos() is deprecated since 8.6, because the underlying library is no longer maintained in %s line %d
 (UTF-8) (5) abcde
+
+Deprecated: Function mb_ereg_search_pos() is deprecated since 8.6, because the underlying library is no longer maintained in %s line %d
+
+Deprecated: Function mb_ereg_search_getregs() is deprecated since 8.6, because the underlying library is no longer maintained in %s line %d
+
+Deprecated: Function mb_ereg_search_getpos() is deprecated since 8.6, because the underlying library is no longer maintained in %s line %d
 (UTF-8) (14) abdeabcf
+
+Deprecated: Function mb_ereg_search_pos() is deprecated since 8.6, because the underlying library is no longer maintained in %s line %d
+
+Deprecated: Function mb_ereg_search_getregs() is deprecated since 8.6, because the underlying library is no longer maintained in %s line %d
+
+Deprecated: Function mb_ereg_search_getpos() is deprecated since 8.6, because the underlying library is no longer maintained in %s line %d
 (UTF-8) (22) abc
+
+Deprecated: Function mb_ereg_search_pos() is deprecated since 8.6, because the underlying library is no longer maintained in %s line %d
+
+Deprecated: Function mb_ereg_search_getregs() is deprecated since 8.6, because the underlying library is no longer maintained in %s line %d
+
+Deprecated: Function mb_ereg_search_getpos() is deprecated since 8.6, because the underlying library is no longer maintained in %s line %d
 (UTF-8) (31) abcd
+
+Deprecated: Function mb_ereg_search_pos() is deprecated since 8.6, because the underlying library is no longer maintained in %s line %d
diff --git a/ext/mbstring/tests/mb_ereg_variation3.phpt b/ext/mbstring/tests/mb_ereg_variation3.phpt
index 329c5597d440..5735e8248ef2 100644
--- a/ext/mbstring/tests/mb_ereg_variation3.phpt
+++ b/ext/mbstring/tests/mb_ereg_variation3.phpt
@@ -5,7 +5,7 @@ mbstring
 --SKIPIF--
 =') or die("skip requires oniguruma >= 6.1.0");
+@version_compare(MB_ONIGURUMA_VERSION, '6.1.0', '>=') or die("skip requires oniguruma >= 6.1.0");
 ?>
 --FILE--
 
---EXPECT--
+--EXPECTF--
 *** Testing mb_ereg() : variation ***
 
+Deprecated: Function mb_regex_encoding() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
+
 -- Iteration 1 --
+
+Deprecated: Function mb_ereg() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
 bool(true)
 array(1) {
   [0]=>
@@ -77,6 +81,8 @@ array(1) {
 }
 
 -- Iteration 2 --
+
+Deprecated: Function mb_ereg() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
 bool(true)
 array(1) {
   [0]=>
@@ -84,6 +90,8 @@ array(1) {
 }
 
 -- Iteration 3 --
+
+Deprecated: Function mb_ereg() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
 bool(true)
 array(1) {
   [0]=>
@@ -91,6 +99,8 @@ array(1) {
 }
 
 -- Iteration 4 --
+
+Deprecated: Function mb_ereg() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
 bool(true)
 array(1) {
   [0]=>
@@ -98,6 +108,8 @@ array(1) {
 }
 
 -- Iteration 5 --
+
+Deprecated: Function mb_ereg() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
 bool(true)
 array(1) {
   [0]=>
@@ -105,6 +117,8 @@ array(1) {
 }
 
 -- Iteration 6 --
+
+Deprecated: Function mb_ereg() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
 bool(true)
 array(1) {
   [0]=>
@@ -112,6 +126,8 @@ array(1) {
 }
 
 -- Iteration 7 --
+
+Deprecated: Function mb_ereg() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
 bool(true)
 array(1) {
   [0]=>
@@ -119,6 +135,8 @@ array(1) {
 }
 
 -- Iteration 8 --
+
+Deprecated: Function mb_ereg() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
 bool(true)
 array(1) {
   [0]=>
@@ -126,6 +144,8 @@ array(1) {
 }
 
 -- Iteration 9 --
+
+Deprecated: Function mb_ereg() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
 bool(true)
 array(1) {
   [0]=>
@@ -133,6 +153,8 @@ array(1) {
 }
 
 -- Iteration 10 --
+
+Deprecated: Function mb_ereg() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
 bool(true)
 array(1) {
   [0]=>
@@ -140,6 +162,8 @@ array(1) {
 }
 
 -- Iteration 11 --
+
+Deprecated: Function mb_ereg() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
 bool(true)
 array(1) {
   [0]=>
@@ -147,6 +171,8 @@ array(1) {
 }
 
 -- Iteration 12 --
+
+Deprecated: Function mb_ereg() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
 bool(true)
 array(1) {
   [0]=>
diff --git a/ext/mbstring/tests/mb_ereg_variation4.phpt b/ext/mbstring/tests/mb_ereg_variation4.phpt
index 05b96a9bf40f..559c5fd467cd 100644
--- a/ext/mbstring/tests/mb_ereg_variation4.phpt
+++ b/ext/mbstring/tests/mb_ereg_variation4.phpt
@@ -69,10 +69,14 @@ function base64_encode_var_dump($regs) {
 echo "Done";
 
 ?>
---EXPECT--
+--EXPECTF--
 *** Testing mb_ereg() : usage variations ***
 
+Deprecated: Function mb_regex_encoding() is deprecated since 8.6, because the underlying library is no longer maintained in %s line %d
+
 -- Iteration 1 --
+
+Deprecated: Function mb_ereg() is deprecated since 8.6, because the underlying library is no longer maintained in %s line %d
 bool(true)
 array(1) {
   [0]=>
@@ -80,6 +84,8 @@ array(1) {
 }
 
 -- Iteration 2 --
+
+Deprecated: Function mb_ereg() is deprecated since 8.6, because the underlying library is no longer maintained in %s line %d
 bool(true)
 array(1) {
   [0]=>
@@ -87,6 +93,8 @@ array(1) {
 }
 
 -- Iteration 3 --
+
+Deprecated: Function mb_ereg() is deprecated since 8.6, because the underlying library is no longer maintained in %s line %d
 bool(true)
 array(1) {
   [0]=>
@@ -94,12 +102,18 @@ array(1) {
 }
 
 -- Iteration 4 --
+
+Deprecated: Function mb_ereg() is deprecated since 8.6, because the underlying library is no longer maintained in %s line %d
 bool(false)
 
 -- Iteration 5 --
+
+Deprecated: Function mb_ereg() is deprecated since 8.6, because the underlying library is no longer maintained in %s line %d
 bool(false)
 
 -- Iteration 6 --
+
+Deprecated: Function mb_ereg() is deprecated since 8.6, because the underlying library is no longer maintained in %s line %d
 bool(true)
 array(1) {
   [0]=>
@@ -107,6 +121,8 @@ array(1) {
 }
 
 -- Iteration 7 --
+
+Deprecated: Function mb_ereg() is deprecated since 8.6, because the underlying library is no longer maintained in %s line %d
 bool(true)
 array(1) {
   [0]=>
@@ -114,9 +130,13 @@ array(1) {
 }
 
 -- Iteration 8 --
+
+Deprecated: Function mb_ereg() is deprecated since 8.6, because the underlying library is no longer maintained in %s line %d
 bool(false)
 
 -- Iteration 9 --
+
+Deprecated: Function mb_ereg() is deprecated since 8.6, because the underlying library is no longer maintained in %s line %d
 bool(true)
 array(1) {
   [0]=>
@@ -124,6 +144,8 @@ array(1) {
 }
 
 -- Iteration 10 --
+
+Deprecated: Function mb_ereg() is deprecated since 8.6, because the underlying library is no longer maintained in %s line %d
 bool(true)
 array(1) {
   [0]=>
@@ -131,12 +153,18 @@ array(1) {
 }
 
 -- Iteration 11 --
+
+Deprecated: Function mb_ereg() is deprecated since 8.6, because the underlying library is no longer maintained in %s line %d
 bool(false)
 
 -- Iteration 12 --
+
+Deprecated: Function mb_ereg() is deprecated since 8.6, because the underlying library is no longer maintained in %s line %d
 bool(false)
 
 -- Iteration 13 --
+
+Deprecated: Function mb_ereg() is deprecated since 8.6, because the underlying library is no longer maintained in %s line %d
 bool(true)
 array(1) {
   [0]=>
diff --git a/ext/mbstring/tests/mb_ereg_variation5.phpt b/ext/mbstring/tests/mb_ereg_variation5.phpt
index 569162534dcd..37cb325bf84b 100644
--- a/ext/mbstring/tests/mb_ereg_variation5.phpt
+++ b/ext/mbstring/tests/mb_ereg_variation5.phpt
@@ -57,19 +57,29 @@ function base64_encode_var_dump($regs) {
     }
 }
 ?>
---EXPECT--
+--EXPECTF--
 *** Testing mb_ereg() : usage variations ***
 
-ASCII String without $regs arg:		bool(true)
+Deprecated: Function mb_regex_encoding() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
+
+ASCII String without $regs arg:		
+Deprecated: Function mb_ereg() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
+bool(true)
 ASCII String with $regs arg:
+
+Deprecated: Function mb_ereg() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
 bool(true)
 array(1) {
   [0]=>
   string(52) "VGhpcyBpcyBhbiBFbmdsaXNoIHN0cmluZy4gMDEyMzQ1Njc4OS4="
 }
 
-Multibyte String without $regs arg:	bool(true)
+Multibyte String without $regs arg:	
+Deprecated: Function mb_ereg() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
+bool(true)
 Multubyte String with $regs arg:
+
+Deprecated: Function mb_ereg() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
 bool(true)
 array(1) {
   [0]=>
diff --git a/ext/mbstring/tests/mb_ereg_variation6.phpt b/ext/mbstring/tests/mb_ereg_variation6.phpt
index cea3fcf661b2..33df1eaf051a 100644
--- a/ext/mbstring/tests/mb_ereg_variation6.phpt
+++ b/ext/mbstring/tests/mb_ereg_variation6.phpt
@@ -73,18 +73,24 @@ function base64_encode_var_dump($regs) {
 echo "Done";
 
 ?>
---EXPECT--
+--EXPECTF--
 *** Testing mb_ereg() : usage variations ***
+
+Deprecated: Function mb_regex_encoding() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
 Regex encoding set to utf-8
 
 --** Pattern is: \w+ **--
 -- ASCII String: --
+
+Deprecated: Function mb_ereg() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
 bool(true)
 array(1) {
   [0]=>
   string(8) "VGhpcw=="
 }
 -- Multibyte String: --
+
+Deprecated: Function mb_ereg() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
 bool(true)
 array(1) {
   [0]=>
@@ -93,12 +99,16 @@ array(1) {
 
 --** Pattern is: \W+ **--
 -- ASCII String: --
+
+Deprecated: Function mb_ereg() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
 bool(true)
 array(1) {
   [0]=>
   string(4) "IA=="
 }
 -- Multibyte String: --
+
+Deprecated: Function mb_ereg() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
 bool(true)
 array(1) {
   [0]=>
@@ -107,23 +117,31 @@ array(1) {
 
 --** Pattern is: \s+ **--
 -- ASCII String: --
+
+Deprecated: Function mb_ereg() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
 bool(true)
 array(1) {
   [0]=>
   string(4) "IA=="
 }
 -- Multibyte String: --
+
+Deprecated: Function mb_ereg() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
 bool(false)
 NULL
 
 --** Pattern is: \S+ **--
 -- ASCII String: --
+
+Deprecated: Function mb_ereg() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
 bool(true)
 array(1) {
   [0]=>
   string(8) "VGhpcw=="
 }
 -- Multibyte String: --
+
+Deprecated: Function mb_ereg() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
 bool(true)
 array(1) {
   [0]=>
@@ -132,12 +150,16 @@ array(1) {
 
 --** Pattern is: \d+ **--
 -- ASCII String: --
+
+Deprecated: Function mb_ereg() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
 bool(true)
 array(1) {
   [0]=>
   string(16) "MDEyMzQ1Njc4OQ=="
 }
 -- Multibyte String: --
+
+Deprecated: Function mb_ereg() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
 bool(true)
 array(1) {
   [0]=>
@@ -146,12 +168,16 @@ array(1) {
 
 --** Pattern is: \D+ **--
 -- ASCII String: --
+
+Deprecated: Function mb_ereg() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
 bool(true)
 array(1) {
   [0]=>
   string(36) "VGhpcyBpcyBhbiBFbmdsaXNoIHN0cmluZy4g"
 }
 -- Multibyte String: --
+
+Deprecated: Function mb_ereg() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
 bool(true)
 array(1) {
   [0]=>
@@ -160,12 +186,16 @@ array(1) {
 
 --** Pattern is: \b **--
 -- ASCII String: --
+
+Deprecated: Function mb_ereg() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
 bool(true)
 array(1) {
   [0]=>
   bool(false)
 }
 -- Multibyte String: --
+
+Deprecated: Function mb_ereg() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
 bool(true)
 array(1) {
   [0]=>
@@ -174,12 +204,16 @@ array(1) {
 
 --** Pattern is: \B **--
 -- ASCII String: --
+
+Deprecated: Function mb_ereg() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
 bool(true)
 array(1) {
   [0]=>
   bool(false)
 }
 -- Multibyte String: --
+
+Deprecated: Function mb_ereg() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
 bool(true)
 array(1) {
   [0]=>
diff --git a/ext/mbstring/tests/mb_ereg_variation7.phpt b/ext/mbstring/tests/mb_ereg_variation7.phpt
index 832bbbfb6f3b..8e6ad836668a 100644
--- a/ext/mbstring/tests/mb_ereg_variation7.phpt
+++ b/ext/mbstring/tests/mb_ereg_variation7.phpt
@@ -58,9 +58,13 @@ function base64_encode_var_dump($regs) {
 echo "Done";
 
 ?>
---EXPECT--
+--EXPECTF--
 *** Testing mb_ereg() : usage variations ***
+
+Deprecated: Function mb_regex_encoding() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
 Regex encoding set to utf-8
+
+Deprecated: Function mb_ereg() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
 bool(true)
 array(5) {
   [0]=>
@@ -74,6 +78,8 @@ array(5) {
   [4]=>
   string(4) "ODk="
 }
+
+Deprecated: Function mb_ereg() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
 bool(true)
 array(5) {
   [0]=>
diff --git a/ext/mbstring/tests/mb_eregi.phpt b/ext/mbstring/tests/mb_eregi.phpt
index 2cdef03a6cb4..1660f154fbf1 100644
--- a/ext/mbstring/tests/mb_eregi.phpt
+++ b/ext/mbstring/tests/mb_eregi.phpt
@@ -15,7 +15,14 @@ var_dump(mb_eregi('z', 'XYZ'));
 var_dump(mb_eregi('xyzp', 'XYZ'));
 var_dump(mb_eregi('ö', 'Öäü'));
 ?>
---EXPECT--
+--EXPECTF--
+Deprecated: Function mb_regex_encoding() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
+
+Deprecated: Function mb_eregi() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
 bool(true)
+
+Deprecated: Function mb_eregi() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
 bool(false)
+
+Deprecated: Function mb_eregi() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
 bool(true)
diff --git a/ext/mbstring/tests/mb_eregi_replace.phpt b/ext/mbstring/tests/mb_eregi_replace.phpt
index b03874701f95..89963c922761 100644
--- a/ext/mbstring/tests/mb_eregi_replace.phpt
+++ b/ext/mbstring/tests/mb_eregi_replace.phpt
@@ -33,7 +33,140 @@ function do_translit($st) {
 mb_regex_encoding('ISO-8859-1');
 echo do_translit("Пеар");
 ?>
---EXPECT--
+--EXPECTF--
+Deprecated: Function mb_regex_encoding() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
+
+Deprecated: Function mb_eregi_replace() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
+
+Deprecated: Function mb_eregi_replace() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
+
+Deprecated: Function mb_eregi_replace() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
+
+Deprecated: Function mb_eregi_replace() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
+
+Deprecated: Function mb_eregi_replace() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
+
+Deprecated: Function mb_eregi_replace() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
+
+Deprecated: Function mb_eregi_replace() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
+
+Deprecated: Function mb_eregi_replace() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
+
+Deprecated: Function mb_eregi_replace() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
+
+Deprecated: Function mb_eregi_replace() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
+
+Deprecated: Function mb_eregi_replace() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
+
+Deprecated: Function mb_eregi_replace() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
+
+Deprecated: Function mb_eregi_replace() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
+
+Deprecated: Function mb_eregi_replace() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
+
+Deprecated: Function mb_eregi_replace() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
+
+Deprecated: Function mb_eregi_replace() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
+
+Deprecated: Function mb_eregi_replace() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
+
+Deprecated: Function mb_eregi_replace() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
+
+Deprecated: Function mb_eregi_replace() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
+
+Deprecated: Function mb_eregi_replace() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
+
+Deprecated: Function mb_eregi_replace() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
+
+Deprecated: Function mb_eregi_replace() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
+
+Deprecated: Function mb_eregi_replace() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
+
+Deprecated: Function mb_eregi_replace() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
+
+Deprecated: Function mb_eregi_replace() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
+
+Deprecated: Function mb_eregi_replace() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
+
+Deprecated: Function mb_eregi_replace() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
+
+Deprecated: Function mb_eregi_replace() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
+
+Deprecated: Function mb_eregi_replace() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
+
+Deprecated: Function mb_eregi_replace() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
+
+Deprecated: Function mb_eregi_replace() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
+
+Deprecated: Function mb_eregi_replace() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
+
+Deprecated: Function mb_eregi_replace() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
+
+Deprecated: Function mb_eregi_replace() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
+
+Deprecated: Function mb_eregi_replace() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
+
+Deprecated: Function mb_eregi_replace() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
+
+Deprecated: Function mb_eregi_replace() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
+
+Deprecated: Function mb_eregi_replace() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
+
+Deprecated: Function mb_eregi_replace() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
+
+Deprecated: Function mb_eregi_replace() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
+
+Deprecated: Function mb_eregi_replace() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
+
+Deprecated: Function mb_eregi_replace() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
+
+Deprecated: Function mb_eregi_replace() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
+
+Deprecated: Function mb_eregi_replace() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
+
+Deprecated: Function mb_eregi_replace() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
+
+Deprecated: Function mb_eregi_replace() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
+
+Deprecated: Function mb_eregi_replace() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
+
+Deprecated: Function mb_eregi_replace() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
+
+Deprecated: Function mb_eregi_replace() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
+
+Deprecated: Function mb_eregi_replace() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
+
+Deprecated: Function mb_eregi_replace() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
+
+Deprecated: Function mb_eregi_replace() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
+
+Deprecated: Function mb_eregi_replace() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
+
+Deprecated: Function mb_eregi_replace() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
+
+Deprecated: Function mb_eregi_replace() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
+
+Deprecated: Function mb_eregi_replace() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
+
+Deprecated: Function mb_eregi_replace() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
+
+Deprecated: Function mb_eregi_replace() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
+
+Deprecated: Function mb_eregi_replace() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
+
+Deprecated: Function mb_eregi_replace() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
+
+Deprecated: Function mb_eregi_replace() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
+
+Deprecated: Function mb_eregi_replace() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
+
+Deprecated: Function mb_eregi_replace() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
+
+Deprecated: Function mb_eregi_replace() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
+
+Deprecated: Function mb_eregi_replace() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
+
+Deprecated: Function mb_eregi_replace() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
 Pear
 --CREDITS--
 Testfest Wuerzburg 2009-06-20 (modified by rui 2011-10-15)
diff --git a/ext/mbstring/tests/mb_regex_encoding_basic.phpt b/ext/mbstring/tests/mb_regex_encoding_basic.phpt
index 8492369aceff..745cb0cf021b 100644
--- a/ext/mbstring/tests/mb_regex_encoding_basic.phpt
+++ b/ext/mbstring/tests/mb_regex_encoding_basic.phpt
@@ -25,7 +25,13 @@ echo "Done";
 ?>
 --EXPECTF--
 *** Testing mb_regex_encoding() : basic functionality ***
+
+Deprecated: Function mb_regex_encoding() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
 string(%d) "%s"
+
+Deprecated: Function mb_regex_encoding() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
 bool(true)
+
+Deprecated: Function mb_regex_encoding() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
 string(5) "UTF-8"
 Done
diff --git a/ext/mbstring/tests/mb_regex_encoding_error2.phpt b/ext/mbstring/tests/mb_regex_encoding_error2.phpt
index 6874f5379a6a..ee665e5aa8bd 100644
--- a/ext/mbstring/tests/mb_regex_encoding_error2.phpt
+++ b/ext/mbstring/tests/mb_regex_encoding_error2.phpt
@@ -21,6 +21,8 @@ try {
 }
 
 ?>
---EXPECT--
+--EXPECTF--
 *** Testing mb_regex_encoding() : error conditions ***
+
+Deprecated: Function mb_regex_encoding() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line 9
 mb_regex_encoding(): Argument #1 ($encoding) must be a valid encoding, "unknown" given
diff --git a/ext/mbstring/tests/mb_regex_encoding_variation2.phpt b/ext/mbstring/tests/mb_regex_encoding_variation2.phpt
index 5d46b3ad7936..55d139eb3ad7 100644
--- a/ext/mbstring/tests/mb_regex_encoding_variation2.phpt
+++ b/ext/mbstring/tests/mb_regex_encoding_variation2.phpt
@@ -87,286 +87,622 @@ foreach($encoding as $enc) {
 }
 echo "Done";
 ?>
---EXPECT--
+--EXPECTF--
 *** Testing mb_regex_encoding() : usage variations ***
 
 -- Iteration 1 --
+
+Deprecated: Function mb_regex_encoding() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
 string(5) "UTF-8"
+
+Deprecated: Function mb_regex_encoding() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
 bool(true)
+
+Deprecated: Function mb_regex_encoding() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
 string(5) "UCS-4"
 
 -- Iteration 2 --
+
+Deprecated: Function mb_regex_encoding() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
 string(5) "UCS-4"
+
+Deprecated: Function mb_regex_encoding() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
 mb_regex_encoding(): Argument #1 ($encoding) must be a valid encoding, "UCS-4BE" given
+
+Deprecated: Function mb_regex_encoding() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
 string(5) "UCS-4"
 
 -- Iteration 3 --
+
+Deprecated: Function mb_regex_encoding() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
 string(5) "UCS-4"
+
+Deprecated: Function mb_regex_encoding() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
 bool(true)
+
+Deprecated: Function mb_regex_encoding() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
 string(7) "UCS-4LE"
 
 -- Iteration 4 --
+
+Deprecated: Function mb_regex_encoding() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
 string(7) "UCS-4LE"
+
+Deprecated: Function mb_regex_encoding() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
 mb_regex_encoding(): Argument #1 ($encoding) must be a valid encoding, "UCS-2" given
+
+Deprecated: Function mb_regex_encoding() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
 string(7) "UCS-4LE"
 
 -- Iteration 5 --
+
+Deprecated: Function mb_regex_encoding() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
 string(7) "UCS-4LE"
+
+Deprecated: Function mb_regex_encoding() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
 mb_regex_encoding(): Argument #1 ($encoding) must be a valid encoding, "UCS-2BE" given
+
+Deprecated: Function mb_regex_encoding() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
 string(7) "UCS-4LE"
 
 -- Iteration 6 --
+
+Deprecated: Function mb_regex_encoding() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
 string(7) "UCS-4LE"
+
+Deprecated: Function mb_regex_encoding() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
 mb_regex_encoding(): Argument #1 ($encoding) must be a valid encoding, "UCS-2LE" given
+
+Deprecated: Function mb_regex_encoding() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
 string(7) "UCS-4LE"
 
 -- Iteration 7 --
+
+Deprecated: Function mb_regex_encoding() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
 string(7) "UCS-4LE"
+
+Deprecated: Function mb_regex_encoding() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
 bool(true)
+
+Deprecated: Function mb_regex_encoding() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
 string(5) "UCS-4"
 
 -- Iteration 8 --
+
+Deprecated: Function mb_regex_encoding() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
 string(5) "UCS-4"
+
+Deprecated: Function mb_regex_encoding() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
 bool(true)
+
+Deprecated: Function mb_regex_encoding() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
 string(5) "UCS-4"
 
 -- Iteration 9 --
+
+Deprecated: Function mb_regex_encoding() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
 string(5) "UCS-4"
+
+Deprecated: Function mb_regex_encoding() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
 bool(true)
+
+Deprecated: Function mb_regex_encoding() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
 string(7) "UCS-4LE"
 
 -- Iteration 10 --
+
+Deprecated: Function mb_regex_encoding() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
 string(7) "UCS-4LE"
+
+Deprecated: Function mb_regex_encoding() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
 bool(true)
+
+Deprecated: Function mb_regex_encoding() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
 string(6) "UTF-16"
 
 -- Iteration 11 --
+
+Deprecated: Function mb_regex_encoding() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
 string(6) "UTF-16"
+
+Deprecated: Function mb_regex_encoding() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
 bool(true)
+
+Deprecated: Function mb_regex_encoding() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
 string(6) "UTF-16"
 
 -- Iteration 12 --
+
+Deprecated: Function mb_regex_encoding() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
 string(6) "UTF-16"
+
+Deprecated: Function mb_regex_encoding() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
 bool(true)
+
+Deprecated: Function mb_regex_encoding() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
 string(8) "UTF-16LE"
 
 -- Iteration 13 --
+
+Deprecated: Function mb_regex_encoding() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
 string(8) "UTF-16LE"
+
+Deprecated: Function mb_regex_encoding() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
 mb_regex_encoding(): Argument #1 ($encoding) must be a valid encoding, "UTF-7" given
+
+Deprecated: Function mb_regex_encoding() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
 string(8) "UTF-16LE"
 
 -- Iteration 14 --
+
+Deprecated: Function mb_regex_encoding() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
 string(8) "UTF-16LE"
+
+Deprecated: Function mb_regex_encoding() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
 mb_regex_encoding(): Argument #1 ($encoding) must be a valid encoding, "UTF7-IMAP" given
+
+Deprecated: Function mb_regex_encoding() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
 string(8) "UTF-16LE"
 
 -- Iteration 15 --
+
+Deprecated: Function mb_regex_encoding() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
 string(8) "UTF-16LE"
+
+Deprecated: Function mb_regex_encoding() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
 bool(true)
+
+Deprecated: Function mb_regex_encoding() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
 string(5) "UTF-8"
 
 -- Iteration 16 --
+
+Deprecated: Function mb_regex_encoding() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
 string(5) "UTF-8"
+
+Deprecated: Function mb_regex_encoding() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
 bool(true)
+
+Deprecated: Function mb_regex_encoding() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
 string(5) "ASCII"
 
 -- Iteration 17 --
+
+Deprecated: Function mb_regex_encoding() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
 string(5) "ASCII"
+
+Deprecated: Function mb_regex_encoding() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
 bool(true)
+
+Deprecated: Function mb_regex_encoding() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
 string(6) "EUC-JP"
 
 -- Iteration 18 --
+
+Deprecated: Function mb_regex_encoding() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
 string(6) "EUC-JP"
+
+Deprecated: Function mb_regex_encoding() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
 bool(true)
+
+Deprecated: Function mb_regex_encoding() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
 string(4) "SJIS"
 
 -- Iteration 19 --
+
+Deprecated: Function mb_regex_encoding() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
 string(4) "SJIS"
+
+Deprecated: Function mb_regex_encoding() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
 bool(true)
+
+Deprecated: Function mb_regex_encoding() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
 string(6) "EUC-JP"
 
 -- Iteration 20 --
+
+Deprecated: Function mb_regex_encoding() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
 string(6) "EUC-JP"
+
+Deprecated: Function mb_regex_encoding() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
 bool(true)
+
+Deprecated: Function mb_regex_encoding() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
 string(4) "SJIS"
 
 -- Iteration 21 --
+
+Deprecated: Function mb_regex_encoding() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
 string(4) "SJIS"
+
+Deprecated: Function mb_regex_encoding() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
 mb_regex_encoding(): Argument #1 ($encoding) must be a valid encoding, "ISO-2022-JP" given
+
+Deprecated: Function mb_regex_encoding() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
 string(4) "SJIS"
 
 -- Iteration 22 --
+
+Deprecated: Function mb_regex_encoding() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
 string(4) "SJIS"
+
+Deprecated: Function mb_regex_encoding() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
 mb_regex_encoding(): Argument #1 ($encoding) must be a valid encoding, "JIS" given
+
+Deprecated: Function mb_regex_encoding() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
 string(4) "SJIS"
 
 -- Iteration 23 --
+
+Deprecated: Function mb_regex_encoding() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
 string(4) "SJIS"
+
+Deprecated: Function mb_regex_encoding() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
 bool(true)
+
+Deprecated: Function mb_regex_encoding() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
 string(10) "ISO-8859-1"
 
 -- Iteration 24 --
+
+Deprecated: Function mb_regex_encoding() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
 string(10) "ISO-8859-1"
+
+Deprecated: Function mb_regex_encoding() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
 bool(true)
+
+Deprecated: Function mb_regex_encoding() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
 string(10) "ISO-8859-2"
 
 -- Iteration 25 --
+
+Deprecated: Function mb_regex_encoding() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
 string(10) "ISO-8859-2"
+
+Deprecated: Function mb_regex_encoding() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
 bool(true)
+
+Deprecated: Function mb_regex_encoding() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
 string(10) "ISO-8859-3"
 
 -- Iteration 26 --
+
+Deprecated: Function mb_regex_encoding() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
 string(10) "ISO-8859-3"
+
+Deprecated: Function mb_regex_encoding() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
 bool(true)
+
+Deprecated: Function mb_regex_encoding() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
 string(10) "ISO-8859-4"
 
 -- Iteration 27 --
+
+Deprecated: Function mb_regex_encoding() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
 string(10) "ISO-8859-4"
+
+Deprecated: Function mb_regex_encoding() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
 bool(true)
+
+Deprecated: Function mb_regex_encoding() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
 string(10) "ISO-8859-5"
 
 -- Iteration 28 --
+
+Deprecated: Function mb_regex_encoding() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
 string(10) "ISO-8859-5"
+
+Deprecated: Function mb_regex_encoding() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
 bool(true)
+
+Deprecated: Function mb_regex_encoding() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
 string(10) "ISO-8859-6"
 
 -- Iteration 29 --
+
+Deprecated: Function mb_regex_encoding() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
 string(10) "ISO-8859-6"
+
+Deprecated: Function mb_regex_encoding() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
 bool(true)
+
+Deprecated: Function mb_regex_encoding() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
 string(10) "ISO-8859-7"
 
 -- Iteration 30 --
+
+Deprecated: Function mb_regex_encoding() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
 string(10) "ISO-8859-7"
+
+Deprecated: Function mb_regex_encoding() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
 bool(true)
+
+Deprecated: Function mb_regex_encoding() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
 string(10) "ISO-8859-8"
 
 -- Iteration 31 --
+
+Deprecated: Function mb_regex_encoding() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
 string(10) "ISO-8859-8"
+
+Deprecated: Function mb_regex_encoding() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
 bool(true)
+
+Deprecated: Function mb_regex_encoding() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
 string(10) "ISO-8859-9"
 
 -- Iteration 32 --
+
+Deprecated: Function mb_regex_encoding() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
 string(10) "ISO-8859-9"
+
+Deprecated: Function mb_regex_encoding() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
 bool(true)
+
+Deprecated: Function mb_regex_encoding() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
 string(11) "ISO-8859-10"
 
 -- Iteration 33 --
+
+Deprecated: Function mb_regex_encoding() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
 string(11) "ISO-8859-10"
+
+Deprecated: Function mb_regex_encoding() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
 bool(true)
+
+Deprecated: Function mb_regex_encoding() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
 string(11) "ISO-8859-13"
 
 -- Iteration 34 --
+
+Deprecated: Function mb_regex_encoding() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
 string(11) "ISO-8859-13"
+
+Deprecated: Function mb_regex_encoding() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
 bool(true)
+
+Deprecated: Function mb_regex_encoding() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
 string(11) "ISO-8859-14"
 
 -- Iteration 35 --
+
+Deprecated: Function mb_regex_encoding() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
 string(11) "ISO-8859-14"
+
+Deprecated: Function mb_regex_encoding() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
 bool(true)
+
+Deprecated: Function mb_regex_encoding() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
 string(11) "ISO-8859-15"
 
 -- Iteration 36 --
+
+Deprecated: Function mb_regex_encoding() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
 string(11) "ISO-8859-15"
+
+Deprecated: Function mb_regex_encoding() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
 mb_regex_encoding(): Argument #1 ($encoding) must be a valid encoding, "byte2be" given
+
+Deprecated: Function mb_regex_encoding() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
 string(11) "ISO-8859-15"
 
 -- Iteration 37 --
+
+Deprecated: Function mb_regex_encoding() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
 string(11) "ISO-8859-15"
+
+Deprecated: Function mb_regex_encoding() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
 mb_regex_encoding(): Argument #1 ($encoding) must be a valid encoding, "byte2le" given
+
+Deprecated: Function mb_regex_encoding() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
 string(11) "ISO-8859-15"
 
 -- Iteration 38 --
+
+Deprecated: Function mb_regex_encoding() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
 string(11) "ISO-8859-15"
+
+Deprecated: Function mb_regex_encoding() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
 mb_regex_encoding(): Argument #1 ($encoding) must be a valid encoding, "byte4be" given
+
+Deprecated: Function mb_regex_encoding() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
 string(11) "ISO-8859-15"
 
 -- Iteration 39 --
+
+Deprecated: Function mb_regex_encoding() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
 string(11) "ISO-8859-15"
+
+Deprecated: Function mb_regex_encoding() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
 mb_regex_encoding(): Argument #1 ($encoding) must be a valid encoding, "byte4le" given
+
+Deprecated: Function mb_regex_encoding() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
 string(11) "ISO-8859-15"
 
 -- Iteration 40 --
+
+Deprecated: Function mb_regex_encoding() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
 string(11) "ISO-8859-15"
+
+Deprecated: Function mb_regex_encoding() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
 mb_regex_encoding(): Argument #1 ($encoding) must be a valid encoding, "BASE64" given
+
+Deprecated: Function mb_regex_encoding() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
 string(11) "ISO-8859-15"
 
 -- Iteration 41 --
+
+Deprecated: Function mb_regex_encoding() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
 string(11) "ISO-8859-15"
+
+Deprecated: Function mb_regex_encoding() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
 mb_regex_encoding(): Argument #1 ($encoding) must be a valid encoding, "HTML-ENTITIES" given
+
+Deprecated: Function mb_regex_encoding() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
 string(11) "ISO-8859-15"
 
 -- Iteration 42 --
+
+Deprecated: Function mb_regex_encoding() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
 string(11) "ISO-8859-15"
+
+Deprecated: Function mb_regex_encoding() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
 mb_regex_encoding(): Argument #1 ($encoding) must be a valid encoding, "7bit" given
+
+Deprecated: Function mb_regex_encoding() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
 string(11) "ISO-8859-15"
 
 -- Iteration 43 --
+
+Deprecated: Function mb_regex_encoding() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
 string(11) "ISO-8859-15"
+
+Deprecated: Function mb_regex_encoding() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
 mb_regex_encoding(): Argument #1 ($encoding) must be a valid encoding, "8bit" given
+
+Deprecated: Function mb_regex_encoding() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
 string(11) "ISO-8859-15"
 
 -- Iteration 44 --
+
+Deprecated: Function mb_regex_encoding() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
 string(11) "ISO-8859-15"
+
+Deprecated: Function mb_regex_encoding() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
 bool(true)
+
+Deprecated: Function mb_regex_encoding() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
 string(6) "EUC-CN"
 
 -- Iteration 45 --
+
+Deprecated: Function mb_regex_encoding() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
 string(6) "EUC-CN"
+
+Deprecated: Function mb_regex_encoding() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
 mb_regex_encoding(): Argument #1 ($encoding) must be a valid encoding, "CP936" given
+
+Deprecated: Function mb_regex_encoding() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
 string(6) "EUC-CN"
 
 -- Iteration 46 --
+
+Deprecated: Function mb_regex_encoding() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
 string(6) "EUC-CN"
+
+Deprecated: Function mb_regex_encoding() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
 mb_regex_encoding(): Argument #1 ($encoding) must be a valid encoding, "HZ" given
+
+Deprecated: Function mb_regex_encoding() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
 string(6) "EUC-CN"
 
 -- Iteration 47 --
+
+Deprecated: Function mb_regex_encoding() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
 string(6) "EUC-CN"
+
+Deprecated: Function mb_regex_encoding() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
 bool(true)
+
+Deprecated: Function mb_regex_encoding() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
 string(6) "EUC-TW"
 
 -- Iteration 48 --
+
+Deprecated: Function mb_regex_encoding() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
 string(6) "EUC-TW"
+
+Deprecated: Function mb_regex_encoding() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
 mb_regex_encoding(): Argument #1 ($encoding) must be a valid encoding, "CP950" given
+
+Deprecated: Function mb_regex_encoding() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
 string(6) "EUC-TW"
 
 -- Iteration 49 --
+
+Deprecated: Function mb_regex_encoding() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
 string(6) "EUC-TW"
+
+Deprecated: Function mb_regex_encoding() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
 bool(true)
+
+Deprecated: Function mb_regex_encoding() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
 string(4) "BIG5"
 
 -- Iteration 50 --
+
+Deprecated: Function mb_regex_encoding() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
 string(4) "BIG5"
+
+Deprecated: Function mb_regex_encoding() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
 bool(true)
+
+Deprecated: Function mb_regex_encoding() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
 string(6) "EUC-KR"
 
 -- Iteration 51 --
+
+Deprecated: Function mb_regex_encoding() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
 string(6) "EUC-KR"
+
+Deprecated: Function mb_regex_encoding() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
 mb_regex_encoding(): Argument #1 ($encoding) must be a valid encoding, "UHC" given
+
+Deprecated: Function mb_regex_encoding() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
 string(6) "EUC-KR"
 
 -- Iteration 52 --
+
+Deprecated: Function mb_regex_encoding() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
 string(6) "EUC-KR"
+
+Deprecated: Function mb_regex_encoding() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
 mb_regex_encoding(): Argument #1 ($encoding) must be a valid encoding, "ISO-2022-KR" given
+
+Deprecated: Function mb_regex_encoding() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
 string(6) "EUC-KR"
 
 -- Iteration 53 --
+
+Deprecated: Function mb_regex_encoding() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
 string(6) "EUC-KR"
+
+Deprecated: Function mb_regex_encoding() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
 mb_regex_encoding(): Argument #1 ($encoding) must be a valid encoding, "Windows-1251" given
+
+Deprecated: Function mb_regex_encoding() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
 string(6) "EUC-KR"
 
 -- Iteration 54 --
+
+Deprecated: Function mb_regex_encoding() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
 string(6) "EUC-KR"
+
+Deprecated: Function mb_regex_encoding() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
 mb_regex_encoding(): Argument #1 ($encoding) must be a valid encoding, "Windows-1252" given
+
+Deprecated: Function mb_regex_encoding() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
 string(6) "EUC-KR"
 
 -- Iteration 55 --
+
+Deprecated: Function mb_regex_encoding() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
 string(6) "EUC-KR"
+
+Deprecated: Function mb_regex_encoding() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
 mb_regex_encoding(): Argument #1 ($encoding) must be a valid encoding, "CP866" given
+
+Deprecated: Function mb_regex_encoding() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
 string(6) "EUC-KR"
 
 -- Iteration 56 --
+
+Deprecated: Function mb_regex_encoding() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
 string(6) "EUC-KR"
+
+Deprecated: Function mb_regex_encoding() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
 bool(true)
+
+Deprecated: Function mb_regex_encoding() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
 string(5) "KOI8R"
 Done
diff --git a/ext/mbstring/tests/mb_regex_set_options.phpt b/ext/mbstring/tests/mb_regex_set_options.phpt
index a5fb611cacf3..f6994049f502 100644
--- a/ext/mbstring/tests/mb_regex_set_options.phpt
+++ b/ext/mbstring/tests/mb_regex_set_options.phpt
@@ -14,5 +14,12 @@ function_exists('mb_regex_set_options') or die("skip\n");
     mb_regex_set_options( '' );
     print mb_ereg_replace(' -', '+', '- - - - -' );
 ?>
---EXPECT--
-+ + + + +-++++
+--EXPECTF--
+Deprecated: Function mb_regex_set_options() is deprecated since 8.6, because the underlying library is no longer maintained in %s line %d
+
+Deprecated: Function mb_ereg_replace() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
++ + + + +
+Deprecated: Function mb_regex_set_options() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
+
+Deprecated: Function mb_ereg_replace() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
+-++++
diff --git a/ext/mbstring/tests/mb_split-compat-01.phpt b/ext/mbstring/tests/mb_split-compat-01.phpt
index 69d398cb0de3..8c5dcc0b4f10 100644
--- a/ext/mbstring/tests/mb_split-compat-01.phpt
+++ b/ext/mbstring/tests/mb_split-compat-01.phpt
@@ -16,7 +16,8 @@ test");
           echo $a[$i] . "\n";
         }
 ?>
---EXPECT--
+--EXPECTF--
+Deprecated: Function mb_split() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
 4
 this
 is
diff --git a/ext/mbstring/tests/mb_split.phpt b/ext/mbstring/tests/mb_split.phpt
index 208848ee2bf5..8b8df7411a81 100644
--- a/ext/mbstring/tests/mb_split.phpt
+++ b/ext/mbstring/tests/mb_split.phpt
@@ -33,13 +33,36 @@ function_exists('mb_split') or die("skip mb_split() is not available in this bui
         verify_split( "\xa1\xa1+", "\xa1\xa1\xa1\xa2\xa2\xa1\xa1\xa1\xa1\xa1\xa1\xa2\xa2\xa1\xa1\xa1", $i );
     }
 ?>
---EXPECT--
+--EXPECTF--
+Deprecated: Function mb_regex_set_options() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
+
+Deprecated: Function mb_regex_encoding() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
+
+Deprecated: Function mb_split() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
+
+Deprecated: Function mb_split() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
 bool(true)
+
+Deprecated: Function mb_split() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
 ok
+
+Deprecated: Function mb_split() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
 ok
+
+Deprecated: Function mb_split() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
 ok
+
+Deprecated: Function mb_split() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
 ok
+
+Deprecated: Function mb_split() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
 ok
+
+Deprecated: Function mb_split() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
 2-2
+
+Deprecated: Function mb_split() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
 3-3
+
+Deprecated: Function mb_split() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
 4-4
diff --git a/ext/mbstring/tests/mb_split_empty_match.phpt b/ext/mbstring/tests/mb_split_empty_match.phpt
index 56ee59c31c6d..14604adfa98b 100644
--- a/ext/mbstring/tests/mb_split_empty_match.phpt
+++ b/ext/mbstring/tests/mb_split_empty_match.phpt
@@ -11,7 +11,10 @@ function_exists('mb_split') or die("skip mb_split() is not available in this bui
 mb_regex_set_options('m');
 var_dump(mb_split('^', "a\nb\nc"));
 ?>
---EXPECT--
+--EXPECTF--
+Deprecated: Function mb_regex_set_options() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
+
+Deprecated: Function mb_split() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
 array(3) {
   [0]=>
   string(2) "a
diff --git a/ext/mbstring/tests/mbregex_stack_limit.phpt b/ext/mbstring/tests/mbregex_stack_limit.phpt
index a291c280b18d..5b1ac5b2f080 100644
--- a/ext/mbstring/tests/mbregex_stack_limit.phpt
+++ b/ext/mbstring/tests/mbregex_stack_limit.phpt
@@ -5,7 +5,7 @@ mbstring
 --SKIPIF--
 
@@ -24,8 +24,13 @@ var_dump(mb_ereg('\\s+$', $s));
 
 echo 'OK';
 ?>
---EXPECT--
+--EXPECTF--
+Deprecated: Function mb_ereg() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
 bool(false)
+
+Deprecated: Function mb_ereg() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
 bool(false)
+
+Deprecated: Function mb_ereg() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
 bool(true)
 OK
diff --git a/ext/mbstring/tests/mbregex_stack_limit2.phpt b/ext/mbstring/tests/mbregex_stack_limit2.phpt
index 9c2efcc39ec2..e7860654f3c0 100644
--- a/ext/mbstring/tests/mbregex_stack_limit2.phpt
+++ b/ext/mbstring/tests/mbregex_stack_limit2.phpt
@@ -6,7 +6,7 @@ iconv
 --SKIPIF--
 
@@ -28,6 +28,10 @@ var_dump(mb_trim_regex(str_repeat(' ', 10000)));
 echo 'OK';
 ?>
 --EXPECTF--
+Deprecated: Function mb_ereg_replace() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
+
 Warning: mb_ereg_replace(): mbregex search failure in php_mbereg_replace_exec(): match-stack limit over in %s on line %d
+
+Deprecated: Function mb_ereg_replace() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
 string(0) ""
 OK
diff --git a/ext/mbstring/tests/php_gr_jp_10830.phpt b/ext/mbstring/tests/php_gr_jp_10830.phpt
index 02b46c01d3db..4b7517fd6e0f 100644
--- a/ext/mbstring/tests/php_gr_jp_10830.phpt
+++ b/ext/mbstring/tests/php_gr_jp_10830.phpt
@@ -13,6 +13,7 @@ $a="aaa\n<>";
 var_dump( mb_ereg("^[^><]+$",$a) );
 var_dump( !!preg_match("/^[^><]+$/",$a) );
 ?>
---EXPECT--
+--EXPECTF--
+Deprecated: Function mb_ereg() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
 bool(false)
 bool(false)
diff --git a/ext/mbstring/tests/php_gr_jp_dev_884-1.phpt b/ext/mbstring/tests/php_gr_jp_dev_884-1.phpt
index b9d82bf9af9f..4bf317499527 100644
--- a/ext/mbstring/tests/php_gr_jp_dev_884-1.phpt
+++ b/ext/mbstring/tests/php_gr_jp_dev_884-1.phpt
@@ -12,6 +12,8 @@ set_time_limit(2);
 var_dump(preg_replace("/.*/", "b", "a"));
 var_dump(mb_ereg_replace(".*", "b", "a"));
 ?>
---EXPECT--
+--EXPECTF--
 string(2) "bb"
+
+Deprecated: Function mb_ereg_replace() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
 string(2) "bb"
diff --git a/ext/mbstring/tests/php_gr_jp_dev_884-2.phpt b/ext/mbstring/tests/php_gr_jp_dev_884-2.phpt
index 51086285ed61..405a9f6bf96f 100644
--- a/ext/mbstring/tests/php_gr_jp_dev_884-2.phpt
+++ b/ext/mbstring/tests/php_gr_jp_dev_884-2.phpt
@@ -13,8 +13,11 @@ var_dump(preg_replace("/C?$/", "Z", "ABC"));
 var_dump(mb_ereg_replace("C*$", "Z", "ABC"));
 var_dump(preg_replace("/C*$/", "Z", "ABC"));
 ?>
---EXPECT--
+--EXPECTF--
+Deprecated: Function mb_ereg_replace() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
 string(4) "ABZZ"
 string(4) "ABZZ"
+
+Deprecated: Function mb_ereg_replace() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
 string(4) "ABZZ"
 string(4) "ABZZ"
diff --git a/ext/mbstring/tests/retry_limit.phpt b/ext/mbstring/tests/retry_limit.phpt
index bcb1a1def5c0..1ada020e68c6 100644
--- a/ext/mbstring/tests/retry_limit.phpt
+++ b/ext/mbstring/tests/retry_limit.phpt
@@ -5,7 +5,7 @@ mbstring
 --SKIPIF--
 = 6.9.3');
 }
 ?>
@@ -19,6 +19,9 @@ ini_set('mbstring.regex_retry_limit', '100000');
 var_dump(mb_ereg($regex, $str));
 
 ?>
---EXPECT--
+--EXPECTF--
+Deprecated: Function mb_ereg() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
 bool(true)
+
+Deprecated: Function mb_ereg() is deprecated since 8.6, because the underlying library is no longer maintained in %s on line %d
 bool(false)
diff --git a/ext/mysqli/mysqli.c b/ext/mysqli/mysqli.c
index caefd9432d14..b45e7416c773 100644
--- a/ext/mysqli/mysqli.c
+++ b/ext/mysqli/mysqli.c
@@ -1,14 +1,12 @@
 /*
   +----------------------------------------------------------------------+
-  | Copyright (c) The PHP Group                                          |
+  | Copyright © The PHP Group and Contributors.                          |
   +----------------------------------------------------------------------+
-  | This source file is subject to version 3.01 of the PHP license,      |
-  | that is bundled with this package in the file LICENSE, and is        |
-  | available through the world-wide-web at the following url:           |
-  | https://www.php.net/license/3_01.txt                                 |
-  | If you did not receive a copy of the PHP license and are unable to   |
-  | obtain it through the world-wide-web, please send a note to          |
-  | license@php.net so we can mail you a copy immediately.               |
+  | This source file is subject to the Modified BSD License that is      |
+  | bundled with this package in the file LICENSE, and is available      |
+  | through the World Wide Web at .        |
+  |                                                                      |
+  | SPDX-License-Identifier: BSD-3-Clause                                |
   +----------------------------------------------------------------------+
   | Authors: Georg Richter                                |
   |          Andrey Hristov                              |
@@ -325,7 +323,7 @@ static int mysqli_object_has_property(zend_object *object, zend_string *name, in
 				}
 				break;
 			}
-			EMPTY_SWITCH_DEFAULT_CASE();
+			default: ZEND_UNREACHABLE();
 		}
 	} else {
 		has_property = zend_std_has_property(object, name, has_set_exists, cache_slot);
@@ -360,12 +358,11 @@ HashTable *mysqli_object_get_debug_info(zend_object *object, int *is_temp)
 PHP_MYSQLI_EXPORT(zend_object *) mysqli_objects_new(zend_class_entry *class_type)
 {
 	mysqli_object *intern;
-	zend_class_entry *mysqli_base_class;
 	zend_object_handlers *handlers;
 
 	intern = zend_object_alloc(sizeof(mysqli_object), class_type);
 
-	mysqli_base_class = class_type;
+	const zend_class_entry *mysqli_base_class = class_type;
 	while (mysqli_base_class->type != ZEND_INTERNAL_CLASS &&
 		   mysqli_base_class->parent != NULL) {
 		mysqli_base_class = mysqli_base_class->parent;
@@ -482,7 +479,7 @@ PHP_MINIT_FUNCTION(mysqli)
 	REGISTER_INI_ENTRIES();
 
 	memcpy(&mysqli_object_handlers, &std_object_handlers, sizeof(zend_object_handlers));
-	mysqli_object_handlers.offset = XtOffsetOf(mysqli_object, zo);
+	mysqli_object_handlers.offset = offsetof(mysqli_object, zo);
 	mysqli_object_handlers.free_obj = mysqli_objects_free_storage;
 	mysqli_object_handlers.clone_obj = NULL;
 	mysqli_object_handlers.read_property = mysqli_read_property;
diff --git a/ext/mysqli/mysqli.stub.php b/ext/mysqli/mysqli.stub.php
index 7ca2a20ca1b7..cc6b8c57404a 100644
--- a/ext/mysqli/mysqli.stub.php
+++ b/ext/mysqli/mysqli.stub.php
@@ -906,6 +906,11 @@ public function real_connect(
      */
     public function real_escape_string(string $string): string {}
 
+    /**
+     * @alias mysqli_quote_string
+     */
+    public function quote_string(string $string): string {}
+
     /**
      * @tentative-return-type
      * @alias mysqli_reap_async_query
@@ -1547,6 +1552,8 @@ function mysqli_real_escape_string(mysqli $mysql, string $string): string {}
 /** @alias mysqli_real_escape_string */
 function mysqli_escape_string(mysqli $mysql, string $string): string {}
 
+function mysqli_quote_string(mysqli $mysql, string $string): string {}
+
 function mysqli_real_query(mysqli $mysql, string $query): bool {}
 
 /** @refcount 1 */
diff --git a/ext/mysqli/mysqli_api.c b/ext/mysqli/mysqli_api.c
index 9473f4a06c13..526fd10b2623 100644
--- a/ext/mysqli/mysqli_api.c
+++ b/ext/mysqli/mysqli_api.c
@@ -1,14 +1,12 @@
 /*
   +----------------------------------------------------------------------+
-  | Copyright (c) The PHP Group                                          |
+  | Copyright © The PHP Group and Contributors.                          |
   +----------------------------------------------------------------------+
-  | This source file is subject to version 3.01 of the PHP license,      |
-  | that is bundled with this package in the file LICENSE, and is        |
-  | available through the world-wide-web at the following url:           |
-  | https://www.php.net/license/3_01.txt                                 |
-  | If you did not receive a copy of the PHP license and are unable to   |
-  | obtain it through the world-wide-web, please send a note to          |
-  | license@php.net so we can mail you a copy immediately.               |
+  | This source file is subject to the Modified BSD License that is      |
+  | bundled with this package in the file LICENSE, and is available      |
+  | through the World Wide Web at .        |
+  |                                                                      |
+  | SPDX-License-Identifier: BSD-3-Clause                                |
   +----------------------------------------------------------------------+
   | Authors: Georg Richter                                |
   |          Andrey Hristov                              |
@@ -532,6 +530,10 @@ PHP_FUNCTION(mysqli_execute_query)
 		MYSQLND_PARAM_BIND	*params;
 
 		if (!zend_array_is_list(input_params)) {
+			if (stmt->query) {
+				efree(stmt->query);
+				stmt->query = NULL;
+			}
 			mysqli_stmt_close(stmt->stmt, false);
 			stmt->stmt = NULL;
 			efree(stmt);
@@ -542,6 +544,10 @@ PHP_FUNCTION(mysqli_execute_query)
 		hash_num_elements = zend_hash_num_elements(input_params);
 		param_count = mysql_stmt_param_count(stmt->stmt);
 		if (hash_num_elements != param_count) {
+			if (stmt->query) {
+				efree(stmt->query);
+				stmt->query = NULL;
+			}
 			mysqli_stmt_close(stmt->stmt, false);
 			stmt->stmt = NULL;
 			efree(stmt);
@@ -1198,7 +1204,7 @@ PHP_FUNCTION(mysqli_options)
 		zend_argument_value_error(ERROR_ARG_POS(2), "must be MYSQLI_INIT_COMMAND, MYSQLI_SET_CHARSET_NAME, MYSQLI_SERVER_PUBLIC_KEY, or one of the MYSQLI_OPT_* constants");
 		RETURN_THROWS();
 	}
-	
+
 	if (expected_type != Z_TYPE_P(mysql_value)) {
 		switch (expected_type) {
 			case IS_STRING:
@@ -1363,6 +1369,29 @@ PHP_FUNCTION(mysqli_real_escape_string) {
 	RETURN_NEW_STR(newstr);
 }
 
+PHP_FUNCTION(mysqli_quote_string) {
+	MY_MYSQL	*mysql;
+	zval		*mysql_link = NULL;
+	char		*escapestr;
+	size_t		escapestr_len;
+	zend_string *newstr;
+
+	if (zend_parse_method_parameters(ZEND_NUM_ARGS(), getThis(), "Os", &mysql_link, mysqli_link_class_entry, &escapestr, &escapestr_len) == FAILURE) {
+		RETURN_THROWS();
+	}
+	MYSQLI_FETCH_RESOURCE_CONN(mysql, mysql_link, MYSQLI_STATUS_VALID);
+
+	newstr = zend_string_safe_alloc(2, escapestr_len, 2, 0);
+	char *out = ZSTR_VAL(newstr);
+	*out++ = '\'';
+	out += mysql_real_escape_string(mysql->mysql, out, escapestr, escapestr_len);
+	*out++ = '\'';
+	*out = '\0';
+	newstr = zend_string_truncate(newstr, out - ZSTR_VAL(newstr), 0);
+
+	RETURN_NEW_STR(newstr);
+}
+
 /* {{{ Undo actions from current transaction */
 PHP_FUNCTION(mysqli_rollback)
 {
@@ -1467,6 +1496,15 @@ PHP_FUNCTION(mysqli_stmt_data_seek)
 
 	MYSQLI_FETCH_RESOURCE_STMT(stmt, mysql_stmt, MYSQLI_STATUS_VALID);
 
+	if (!stmt->stmt->data || !stmt->stmt->data->result || !stmt->stmt->data->result->stored_data) {
+		if (hasThis()) {
+			zend_throw_error(NULL, "mysqli_stmt::data_seek(): No result set associated with the statement");
+		} else {
+			zend_throw_error(NULL, "mysqli_stmt_data_seek(): No result set associated with the statement");
+		}
+		RETURN_THROWS();
+	}
+
 	mysql_stmt_data_seek(stmt->stmt, offset);
 }
 /* }}} */
diff --git a/ext/mysqli/mysqli_arginfo.h b/ext/mysqli/mysqli_arginfo.h
index 4439908e55dc..0121f36f3cfd 100644
--- a/ext/mysqli/mysqli_arginfo.h
+++ b/ext/mysqli/mysqli_arginfo.h
@@ -1,5 +1,5 @@
 /* This is a generated file, edit mysqli.stub.php instead.
- * Stub hash: c0af8c627a063fbd2c8b76c63b5e70c8ddd1e4f9 */
+ * Stub hash: dc804bc50cd0a0e14dafc0e03564d5699d641db0 */
 
 ZEND_BEGIN_ARG_WITH_RETURN_TYPE_MASK_EX(arginfo_mysqli_affected_rows, 0, 1, MAY_BE_LONG|MAY_BE_STRING)
 	ZEND_ARG_OBJ_INFO(0, mysql, mysqli, 0)
@@ -252,6 +252,8 @@ ZEND_END_ARG_INFO()
 
 #define arginfo_mysqli_escape_string arginfo_mysqli_real_escape_string
 
+#define arginfo_mysqli_quote_string arginfo_mysqli_real_escape_string
+
 #define arginfo_mysqli_real_query arginfo_mysqli_multi_query
 
 ZEND_BEGIN_ARG_WITH_RETURN_OBJ_TYPE_MASK_EX(arginfo_mysqli_reap_async_query, 0, 1, mysqli_result, MAY_BE_BOOL)
@@ -527,6 +529,10 @@ ZEND_BEGIN_ARG_WITH_TENTATIVE_RETURN_TYPE_INFO_EX(arginfo_class_mysqli_real_esca
 	ZEND_ARG_TYPE_INFO(0, string, IS_STRING, 0)
 ZEND_END_ARG_INFO()
 
+ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_class_mysqli_quote_string, 0, 1, IS_STRING, 0)
+	ZEND_ARG_TYPE_INFO(0, string, IS_STRING, 0)
+ZEND_END_ARG_INFO()
+
 ZEND_BEGIN_ARG_WITH_TENTATIVE_RETURN_OBJ_TYPE_MASK_EX(arginfo_class_mysqli_reap_async_query, 0, 0, mysqli_result, MAY_BE_BOOL)
 ZEND_END_ARG_INFO()
 
@@ -767,6 +773,7 @@ ZEND_FUNCTION(mysqli_report);
 ZEND_FUNCTION(mysqli_query);
 ZEND_FUNCTION(mysqli_real_connect);
 ZEND_FUNCTION(mysqli_real_escape_string);
+ZEND_FUNCTION(mysqli_quote_string);
 ZEND_FUNCTION(mysqli_real_query);
 ZEND_FUNCTION(mysqli_reap_async_query);
 ZEND_FUNCTION(mysqli_release_savepoint);
@@ -883,6 +890,7 @@ static const zend_function_entry ext_functions[] = {
 	ZEND_FE(mysqli_real_connect, arginfo_mysqli_real_connect)
 	ZEND_FE(mysqli_real_escape_string, arginfo_mysqli_real_escape_string)
 	ZEND_RAW_FENTRY("mysqli_escape_string", zif_mysqli_real_escape_string, arginfo_mysqli_escape_string, 0, NULL, NULL)
+	ZEND_FE(mysqli_quote_string, arginfo_mysqli_quote_string)
 	ZEND_FE(mysqli_real_query, arginfo_mysqli_real_query)
 	ZEND_FE(mysqli_reap_async_query, arginfo_mysqli_reap_async_query)
 	ZEND_FE(mysqli_release_savepoint, arginfo_mysqli_release_savepoint)
@@ -957,6 +965,7 @@ static const zend_function_entry class_mysqli_methods[] = {
 	ZEND_RAW_FENTRY("query", zif_mysqli_query, arginfo_class_mysqli_query, ZEND_ACC_PUBLIC, NULL, NULL)
 	ZEND_RAW_FENTRY("real_connect", zif_mysqli_real_connect, arginfo_class_mysqli_real_connect, ZEND_ACC_PUBLIC, NULL, NULL)
 	ZEND_RAW_FENTRY("real_escape_string", zif_mysqli_real_escape_string, arginfo_class_mysqli_real_escape_string, ZEND_ACC_PUBLIC, NULL, NULL)
+	ZEND_RAW_FENTRY("quote_string", zif_mysqli_quote_string, arginfo_class_mysqli_quote_string, ZEND_ACC_PUBLIC, NULL, NULL)
 	ZEND_RAW_FENTRY("reap_async_query", zif_mysqli_reap_async_query, arginfo_class_mysqli_reap_async_query, ZEND_ACC_PUBLIC, NULL, NULL)
 	ZEND_RAW_FENTRY("escape_string", zif_mysqli_real_escape_string, arginfo_class_mysqli_escape_string, ZEND_ACC_PUBLIC, NULL, NULL)
 	ZEND_RAW_FENTRY("real_query", zif_mysqli_real_query, arginfo_class_mysqli_real_query, ZEND_ACC_PUBLIC, NULL, NULL)
diff --git a/ext/mysqli/mysqli_driver.c b/ext/mysqli/mysqli_driver.c
index d2c94d881b44..dadb132efc21 100644
--- a/ext/mysqli/mysqli_driver.c
+++ b/ext/mysqli/mysqli_driver.c
@@ -1,14 +1,12 @@
 /*
   +----------------------------------------------------------------------+
-  | Copyright (c) The PHP Group                                          |
+  | Copyright © The PHP Group and Contributors.                          |
   +----------------------------------------------------------------------+
-  | This source file is subject to version 3.01 of the PHP license,      |
-  | that is bundled with this package in the file LICENSE, and is        |
-  | available through the world-wide-web at the following url:           |
-  | https://www.php.net/license/3_01.txt                                 |
-  | If you did not receive a copy of the PHP license and are unable to   |
-  | obtain it through the world-wide-web, please send a note to          |
-  | license@php.net so we can mail you a copy immediately.               |
+  | This source file is subject to the Modified BSD License that is      |
+  | bundled with this package in the file LICENSE, and is available      |
+  | through the World Wide Web at .        |
+  |                                                                      |
+  | SPDX-License-Identifier: BSD-3-Clause                                |
   +----------------------------------------------------------------------+
   | Author: Georg Richter                                 |
   +----------------------------------------------------------------------+
diff --git a/ext/mysqli/mysqli_exception.c b/ext/mysqli/mysqli_exception.c
index 7ebc29b60ba6..3f34b3e00501 100644
--- a/ext/mysqli/mysqli_exception.c
+++ b/ext/mysqli/mysqli_exception.c
@@ -1,14 +1,12 @@
 /*
   +----------------------------------------------------------------------+
-  | Copyright (c) The PHP Group                                          |
+  | Copyright © The PHP Group and Contributors.                          |
   +----------------------------------------------------------------------+
-  | This source file is subject to version 3.01 of the PHP license,      |
-  | that is bundled with this package in the file LICENSE, and is        |
-  | available through the world-wide-web at the following url:           |
-  | https://www.php.net/license/3_01.txt                                 |
-  | If you did not receive a copy of the PHP license and are unable to   |
-  | obtain it through the world-wide-web, please send a note to          |
-  | license@php.net so we can mail you a copy immediately.               |
+  | This source file is subject to the Modified BSD License that is      |
+  | bundled with this package in the file LICENSE, and is available      |
+  | through the World Wide Web at .        |
+  |                                                                      |
+  | SPDX-License-Identifier: BSD-3-Clause                                |
   +----------------------------------------------------------------------+
   | Author: Georg Richter                                 |
   +----------------------------------------------------------------------+
diff --git a/ext/mysqli/mysqli_mysqlnd.h b/ext/mysqli/mysqli_mysqlnd.h
index 5fb8f542b8fc..b15644c8e1f6 100644
--- a/ext/mysqli/mysqli_mysqlnd.h
+++ b/ext/mysqli/mysqli_mysqlnd.h
@@ -1,14 +1,12 @@
 /*
   +----------------------------------------------------------------------+
-  | Copyright (c) The PHP Group                                          |
+  | Copyright © The PHP Group and Contributors.                          |
   +----------------------------------------------------------------------+
-  | This source file is subject to version 3.01 of the PHP license,      |
-  | that is bundled with this package in the file LICENSE, and is        |
-  | available through the world-wide-web at the following url:           |
-  | https://www.php.net/license/3_01.txt                                 |
-  | If you did not receive a copy of the PHP license and are unable to   |
-  | obtain it through the world-wide-web, please send a note to          |
-  | license@php.net so we can mail you a copy immediately.               |
+  | This source file is subject to the Modified BSD License that is      |
+  | bundled with this package in the file LICENSE, and is available      |
+  | through the World Wide Web at .        |
+  |                                                                      |
+  | SPDX-License-Identifier: BSD-3-Clause                                |
   +----------------------------------------------------------------------+
   | Authors: Georg Richter                                |
   |          Andrey Hristov                              |
diff --git a/ext/mysqli/mysqli_nonapi.c b/ext/mysqli/mysqli_nonapi.c
index 2e51dca3100f..1e46aeedd93b 100644
--- a/ext/mysqli/mysqli_nonapi.c
+++ b/ext/mysqli/mysqli_nonapi.c
@@ -1,14 +1,12 @@
 /*
   +----------------------------------------------------------------------+
-  | Copyright (c) The PHP Group                                          |
+  | Copyright © The PHP Group and Contributors.                          |
   +----------------------------------------------------------------------+
-  | This source file is subject to version 3.01 of the PHP license,      |
-  | that is bundled with this package in the file LICENSE, and is        |
-  | available through the world-wide-web at the following url:           |
-  | https://www.php.net/license/3_01.txt                                 |
-  | If you did not receive a copy of the PHP license and are unable to   |
-  | obtain it through the world-wide-web, please send a note to          |
-  | license@php.net so we can mail you a copy immediately.               |
+  | This source file is subject to the Modified BSD License that is      |
+  | bundled with this package in the file LICENSE, and is available      |
+  | through the World Wide Web at .        |
+  |                                                                      |
+  | SPDX-License-Identifier: BSD-3-Clause                                |
   +----------------------------------------------------------------------+
   | Authors: Georg Richter                                |
   |          Andrey Hristov                              |
diff --git a/ext/mysqli/mysqli_priv.h b/ext/mysqli/mysqli_priv.h
index 5f7c49f0b297..97d9300a2b79 100644
--- a/ext/mysqli/mysqli_priv.h
+++ b/ext/mysqli/mysqli_priv.h
@@ -1,14 +1,12 @@
 /*
   +----------------------------------------------------------------------+
-  | Copyright (c) The PHP Group                                          |
+  | Copyright © The PHP Group and Contributors.                          |
   +----------------------------------------------------------------------+
-  | This source file is subject to version 3.01 of the PHP license,      |
-  | that is bundled with this package in the file LICENSE, and is        |
-  | available through the world-wide-web at the following url:           |
-  | https://www.php.net/license/3_01.txt                                 |
-  | If you did not receive a copy of the PHP license and are unable to   |
-  | obtain it through the world-wide-web, please send a note to          |
-  | license@php.net so we can mail you a copy immediately.               |
+  | This source file is subject to the Modified BSD License that is      |
+  | bundled with this package in the file LICENSE, and is available      |
+  | through the World Wide Web at .        |
+  |                                                                      |
+  | SPDX-License-Identifier: BSD-3-Clause                                |
   +----------------------------------------------------------------------+
   | Author: Georg Richter                                 |
   +----------------------------------------------------------------------+
diff --git a/ext/mysqli/mysqli_prop.c b/ext/mysqli/mysqli_prop.c
index 6d86a6ad4ca8..b54f6fd6ae44 100644
--- a/ext/mysqli/mysqli_prop.c
+++ b/ext/mysqli/mysqli_prop.c
@@ -1,14 +1,12 @@
 /*
   +----------------------------------------------------------------------+
-  | Copyright (c) The PHP Group                                          |
+  | Copyright © The PHP Group and Contributors.                          |
   +----------------------------------------------------------------------+
-  | This source file is subject to version 3.01 of the PHP license,      |
-  | that is bundled with this package in the file LICENSE, and is        |
-  | available through the world-wide-web at the following url:           |
-  | https://www.php.net/license/3_01.txt                                 |
-  | If you did not receive a copy of the PHP license and are unable to   |
-  | obtain it through the world-wide-web, please send a note to          |
-  | license@php.net so we can mail you a copy immediately.               |
+  | This source file is subject to the Modified BSD License that is      |
+  | bundled with this package in the file LICENSE, and is available      |
+  | through the World Wide Web at .        |
+  |                                                                      |
+  | SPDX-License-Identifier: BSD-3-Clause                                |
   +----------------------------------------------------------------------+
   | Author: Georg Richter                                 |
   |         Andrey Hristov                               |
diff --git a/ext/mysqli/mysqli_report.c b/ext/mysqli/mysqli_report.c
index 06611310b0b0..28b5f151d729 100644
--- a/ext/mysqli/mysqli_report.c
+++ b/ext/mysqli/mysqli_report.c
@@ -1,14 +1,12 @@
 /*
   +----------------------------------------------------------------------+
-  | Copyright (c) The PHP Group                                          |
+  | Copyright © The PHP Group and Contributors.                          |
   +----------------------------------------------------------------------+
-  | This source file is subject to version 3.01 of the PHP license,      |
-  | that is bundled with this package in the file LICENSE, and is        |
-  | available through the world-wide-web at the following url:           |
-  | https://www.php.net/license/3_01.txt                                 |
-  | If you did not receive a copy of the PHP license and are unable to   |
-  | obtain it through the world-wide-web, please send a note to          |
-  | license@php.net so we can mail you a copy immediately.               |
+  | This source file is subject to the Modified BSD License that is      |
+  | bundled with this package in the file LICENSE, and is available      |
+  | through the World Wide Web at .        |
+  |                                                                      |
+  | SPDX-License-Identifier: BSD-3-Clause                                |
   +----------------------------------------------------------------------+
   | Author: Georg Richter                                 |
   +----------------------------------------------------------------------+
diff --git a/ext/mysqli/mysqli_result_iterator.c b/ext/mysqli/mysqli_result_iterator.c
index 5dbeaf1e3b22..013f41d38d0b 100644
--- a/ext/mysqli/mysqli_result_iterator.c
+++ b/ext/mysqli/mysqli_result_iterator.c
@@ -1,14 +1,12 @@
 /*
   +----------------------------------------------------------------------+
-  | Copyright (c) The PHP Group                                          |
+  | Copyright © The PHP Group and Contributors.                          |
   +----------------------------------------------------------------------+
-  | This source file is subject to version 3.01 of the PHP license,      |
-  | that is bundled with this package in the file LICENSE, and is        |
-  | available through the world-wide-web at the following url:           |
-  | https://www.php.net/license/3_01.txt                                 |
-  | If you did not receive a copy of the PHP license and are unable to   |
-  | obtain it through the world-wide-web, please send a note to          |
-  | license@php.net so we can mail you a copy immediately.               |
+  | This source file is subject to the Modified BSD License that is      |
+  | bundled with this package in the file LICENSE, and is available      |
+  | through the World Wide Web at .        |
+  |                                                                      |
+  | SPDX-License-Identifier: BSD-3-Clause                                |
   +----------------------------------------------------------------------+
   | Authors: Georg Richter                                |
   |          Andrey Hristov                              |
diff --git a/ext/mysqli/mysqli_warning.c b/ext/mysqli/mysqli_warning.c
index 0bb730ef6cf6..a276ccf0b1ff 100644
--- a/ext/mysqli/mysqli_warning.c
+++ b/ext/mysqli/mysqli_warning.c
@@ -1,14 +1,12 @@
 /*
   +----------------------------------------------------------------------+
-  | Copyright (c) The PHP Group                                          |
+  | Copyright © The PHP Group and Contributors.                          |
   +----------------------------------------------------------------------+
-  | This source file is subject to version 3.01 of the PHP license,      |
-  | that is bundled with this package in the file LICENSE, and is        |
-  | available through the world-wide-web at the following url:           |
-  | https://www.php.net/license/3_01.txt                                 |
-  | If you did not receive a copy of the PHP license and are unable to   |
-  | obtain it through the world-wide-web, please send a note to          |
-  | license@php.net so we can mail you a copy immediately.               |
+  | This source file is subject to the Modified BSD License that is      |
+  | bundled with this package in the file LICENSE, and is available      |
+  | through the World Wide Web at .        |
+  |                                                                      |
+  | SPDX-License-Identifier: BSD-3-Clause                                |
   +----------------------------------------------------------------------+
   | Author: Georg Richter                                 |
   +----------------------------------------------------------------------+
diff --git a/ext/mysqli/php_mysqli.h b/ext/mysqli/php_mysqli.h
index 7ee999b41e04..5f995a4bbc53 100644
--- a/ext/mysqli/php_mysqli.h
+++ b/ext/mysqli/php_mysqli.h
@@ -1,14 +1,12 @@
 /*
   +----------------------------------------------------------------------+
-  | Copyright (c) The PHP Group                                          |
+  | Copyright © The PHP Group and Contributors.                          |
   +----------------------------------------------------------------------+
-  | This source file is subject to version 3.01 of the PHP license,      |
-  | that is bundled with this package in the file LICENSE, and is        |
-  | available through the world-wide-web at the following url:           |
-  | https://www.php.net/license/3_01.txt                                 |
-  | If you did not receive a copy of the PHP license and are unable to   |
-  | obtain it through the world-wide-web, please send a note to          |
-  | license@php.net so we can mail you a copy immediately.               |
+  | This source file is subject to the Modified BSD License that is      |
+  | bundled with this package in the file LICENSE, and is available      |
+  | through the World Wide Web at .        |
+  |                                                                      |
+  | SPDX-License-Identifier: BSD-3-Clause                                |
   +----------------------------------------------------------------------+
   | Authors: Georg Richter                                |
   |          Andrey Hristov                              |
diff --git a/ext/mysqli/php_mysqli_structs.h b/ext/mysqli/php_mysqli_structs.h
index ceab4a44f395..8ccead1a7518 100644
--- a/ext/mysqli/php_mysqli_structs.h
+++ b/ext/mysqli/php_mysqli_structs.h
@@ -1,14 +1,12 @@
 /*
   +----------------------------------------------------------------------+
-  | Copyright (c) The PHP Group                                          |
+  | Copyright © The PHP Group and Contributors.                          |
   +----------------------------------------------------------------------+
-  | This source file is subject to version 3.01 of the PHP license,      |
-  | that is bundled with this package in the file LICENSE, and is        |
-  | available through the world-wide-web at the following url:           |
-  | https://www.php.net/license/3_01.txt                                 |
-  | If you did not receive a copy of the PHP license and are unable to   |
-  | obtain it through the world-wide-web, please send a note to          |
-  | license@php.net so we can mail you a copy immediately.               |
+  | This source file is subject to the Modified BSD License that is      |
+  | bundled with this package in the file LICENSE, and is available      |
+  | through the World Wide Web at .        |
+  |                                                                      |
+  | SPDX-License-Identifier: BSD-3-Clause                                |
   +----------------------------------------------------------------------+
   | Authors: Georg Richter                                |
   |          Andrey Hristov                              |
@@ -63,9 +61,7 @@ typedef struct _mysqli_object {
 	zend_object 		zo;
 } mysqli_object; /* extends zend_object */
 
-static inline mysqli_object *php_mysqli_fetch_object(zend_object *obj) {
-	return (mysqli_object *)((char*)(obj) - XtOffsetOf(mysqli_object, zo));
-}
+#define php_mysqli_fetch_object(obj) ZEND_CONTAINER_OF(obj, mysqli_object, zo)
 
 #define Z_MYSQLI_P(zv) php_mysqli_fetch_object(Z_OBJ_P((zv)))
 
diff --git a/ext/mysqli/tests/mysqli_class_mysqli_interface.phpt b/ext/mysqli/tests/mysqli_class_mysqli_interface.phpt
index bada1d85a5ce..ccac6710edd1 100644
--- a/ext/mysqli/tests/mysqli_class_mysqli_interface.phpt
+++ b/ext/mysqli/tests/mysqli_class_mysqli_interface.phpt
@@ -43,6 +43,7 @@ require_once 'skipifconnectfailure.inc';
         'ping'					=> true,
         'prepare'				=> true,
         'query'					=> true,
+        'quote_string'			=> true,
         'real_connect'			=> true,
         'real_escape_string'	=> true,
         'real_query'			=> true,
diff --git a/ext/mysqli/tests/mysqli_execute_query_leak.phpt b/ext/mysqli/tests/mysqli_execute_query_leak.phpt
new file mode 100644
index 000000000000..11f56877aece
--- /dev/null
+++ b/ext/mysqli/tests/mysqli_execute_query_leak.phpt
@@ -0,0 +1,37 @@
+--TEST--
+mysqli_execute_query() does not leak stmt->query on input_params validation errors with MYSQLI_REPORT_INDEX
+--EXTENSIONS--
+mysqli
+--SKIPIF--
+
+--FILE--
+execute_query('SELECT label, ? AS anon, ? AS num FROM test WHERE id=?', ['foo', 42]);
+} catch (ValueError $e) {
+    echo '[001] '.$e->getMessage()."\n";
+}
+
+try {
+    $link->execute_query('SELECT label, ? AS anon, ? AS num FROM test WHERE id=?', ['foo' => 42]);
+} catch (ValueError $e) {
+    echo '[002] '.$e->getMessage()."\n";
+}
+
+print "done!";
+?>
+--CLEAN--
+
+--EXPECT--
+[001] mysqli::execute_query(): Argument #2 ($params) must consist of exactly 3 elements, 2 present
+[002] mysqli::execute_query(): Argument #2 ($params) must be a list array
+done!
diff --git a/ext/mysqli/tests/mysqli_quote_string.phpt b/ext/mysqli/tests/mysqli_quote_string.phpt
new file mode 100644
index 000000000000..b4a25aa3996f
--- /dev/null
+++ b/ext/mysqli/tests/mysqli_quote_string.phpt
@@ -0,0 +1,86 @@
+--TEST--
+mysqli_quote_string()
+--EXTENSIONS--
+mysqli
+--SKIPIF--
+
+--FILE--
+query("SELECT $escaped AS test");
+$value = $result->fetch_column();
+echo $value . "\n";
+
+$escaped = mysqli_quote_string($link, '" OR 1=1 -- foo');
+echo $escaped . "\n";
+$result = $link->query("SELECT $escaped AS test");
+$value = $result->fetch_column();
+echo $value . "\n";
+
+$escaped = mysqli_quote_string($link, "\n");
+if ($escaped !== "'\\n'") {
+    printf("[001] Expected '\\n', got %s\n", $escaped);
+}
+
+$escaped =  mysqli_quote_string($link, "\r");
+if ($escaped !== "'\\r'") {
+    printf("[002] Expected '\\r', got %s\n", $escaped);
+}
+
+$escaped =  mysqli_quote_string($link, "foo" . chr(0) . "bar");
+if ($escaped !== "'foo\\0bar'") {
+    printf("[003] Expected 'foo\\0bar', got %s\n", $escaped);
+}
+
+echo "=====================\n";
+
+// Test that the SQL injection is impossible with NO_BACKSLASH_ESCAPES mode
+$link->query('SET @@sql_mode="NO_BACKSLASH_ESCAPES"');
+
+echo $link->quote_string('\\') . "\n";
+echo $link->quote_string('"') . "\n";
+echo $link->quote_string("'") . "\n";
+
+$escaped = $link->quote_string("\' \ \"");
+echo $escaped . "\n";
+$result = $link->query("SELECT $escaped AS test");
+$value = $result->fetch_column();
+echo $value . "\n";
+
+$escaped = $link->quote_string('" OR 1=1 -- foo');
+echo $escaped . "\n";
+$result = $link->query("SELECT $escaped AS test");
+$value = $result->fetch_column();
+echo $value . "\n";
+
+echo "done!";
+?>
+--EXPECT--
+'\\'
+'\"'
+'\''
+'\\\' \\ \"'
+\' \ "
+'\" OR 1=1 -- foo'
+" OR 1=1 -- foo
+=====================
+'\'
+'"'
+''''
+'\'' \ "'
+\' \ "
+'" OR 1=1 -- foo'
+" OR 1=1 -- foo
+done!
diff --git a/ext/mysqli/tests/mysqli_real_connect_retry_attr.phpt b/ext/mysqli/tests/mysqli_real_connect_retry_attr.phpt
new file mode 100644
index 000000000000..7f7731807428
--- /dev/null
+++ b/ext/mysqli/tests/mysqli_real_connect_retry_attr.phpt
@@ -0,0 +1,26 @@
+--TEST--
+mysqli_real_connect() retry on same handle does not corrupt mysqlnd connect_attr
+--EXTENSIONS--
+mysqli
+--SKIPIF--
+
+--FILE--
+
+--EXPECT--
+done!
diff --git a/ext/mysqli/tests/mysqli_stmt_data_seek.phpt b/ext/mysqli/tests/mysqli_stmt_data_seek.phpt
index a36daebc7951..e4b913229cd0 100644
--- a/ext/mysqli/tests/mysqli_stmt_data_seek.phpt
+++ b/ext/mysqli/tests/mysqli_stmt_data_seek.phpt
@@ -25,6 +25,11 @@ require_once 'skipifconnectfailure.inc';
     if (true !== ($tmp = mysqli_stmt_execute($stmt)))
         printf("[006] Expecting boolean/true, got %s/%s\n", gettype($tmp), $tmp);
 
+    try {
+        mysqli_stmt_data_seek($stmt, 1);
+    } catch (Error $exception) {
+        echo $exception->getMessage() . "\n";
+    }
 
     $id = null;
     if (!mysqli_stmt_bind_result($stmt, $id))
@@ -82,6 +87,7 @@ require_once 'skipifconnectfailure.inc';
 ?>
 --EXPECT--
 mysqli_stmt object is not fully initialized
+mysqli_stmt_data_seek(): No result set associated with the statement
 int(3)
 int(1)
 int(1)
diff --git a/ext/mysqlnd/mysql_float_to_double.h b/ext/mysqlnd/mysql_float_to_double.h
index a15458b52de2..f92196e792c9 100644
--- a/ext/mysqlnd/mysql_float_to_double.h
+++ b/ext/mysqlnd/mysql_float_to_double.h
@@ -1,14 +1,12 @@
 /*
   +----------------------------------------------------------------------+
-  | Copyright (c) The PHP Group                                          |
+  | Copyright © The PHP Group and Contributors.                          |
   +----------------------------------------------------------------------+
-  | This source file is subject to version 3.01 of the PHP license,      |
-  | that is bundled with this package in the file LICENSE, and is        |
-  | available through the world-wide-web at the following url:           |
-  | https://www.php.net/license/3_01.txt                                 |
-  | If you did not receive a copy of the PHP license and are unable to   |
-  | obtain it through the world-wide-web, please send a note to          |
-  | license@php.net so we can mail you a copy immediately.               |
+  | This source file is subject to the Modified BSD License that is      |
+  | bundled with this package in the file LICENSE, and is available      |
+  | through the World Wide Web at .        |
+  |                                                                      |
+  | SPDX-License-Identifier: BSD-3-Clause                                |
   +----------------------------------------------------------------------+
   | Authors: Keyur Govande                           |
   +----------------------------------------------------------------------+
diff --git a/ext/mysqlnd/mysqlnd.h b/ext/mysqlnd/mysqlnd.h
index 3336d1752afd..032438063bea 100644
--- a/ext/mysqlnd/mysqlnd.h
+++ b/ext/mysqlnd/mysqlnd.h
@@ -1,14 +1,12 @@
 /*
   +----------------------------------------------------------------------+
-  | Copyright (c) The PHP Group                                          |
+  | Copyright © The PHP Group and Contributors.                          |
   +----------------------------------------------------------------------+
-  | This source file is subject to version 3.01 of the PHP license,      |
-  | that is bundled with this package in the file LICENSE, and is        |
-  | available through the world-wide-web at the following url:           |
-  | https://www.php.net/license/3_01.txt                                 |
-  | If you did not receive a copy of the PHP license and are unable to   |
-  | obtain it through the world-wide-web, please send a note to          |
-  | license@php.net so we can mail you a copy immediately.               |
+  | This source file is subject to the Modified BSD License that is      |
+  | bundled with this package in the file LICENSE, and is available      |
+  | through the World Wide Web at .        |
+  |                                                                      |
+  | SPDX-License-Identifier: BSD-3-Clause                                |
   +----------------------------------------------------------------------+
   | Authors: Andrey Hristov                              |
   |          Ulf Wendel                                      |
diff --git a/ext/mysqlnd/mysqlnd_alloc.c b/ext/mysqlnd/mysqlnd_alloc.c
index 06971b3487dd..187298ca9969 100644
--- a/ext/mysqlnd/mysqlnd_alloc.c
+++ b/ext/mysqlnd/mysqlnd_alloc.c
@@ -1,14 +1,12 @@
 /*
   +----------------------------------------------------------------------+
-  | Copyright (c) The PHP Group                                          |
+  | Copyright © The PHP Group and Contributors.                          |
   +----------------------------------------------------------------------+
-  | This source file is subject to version 3.01 of the PHP license,      |
-  | that is bundled with this package in the file LICENSE, and is        |
-  | available through the world-wide-web at the following url:           |
-  | https://www.php.net/license/3_01.txt                                 |
-  | If you did not receive a copy of the PHP license and are unable to   |
-  | obtain it through the world-wide-web, please send a note to          |
-  | license@php.net so we can mail you a copy immediately.               |
+  | This source file is subject to the Modified BSD License that is      |
+  | bundled with this package in the file LICENSE, and is available      |
+  | through the World Wide Web at .        |
+  |                                                                      |
+  | SPDX-License-Identifier: BSD-3-Clause                                |
   +----------------------------------------------------------------------+
   | Authors: Andrey Hristov                              |
   |          Ulf Wendel                                      |
@@ -201,7 +199,7 @@ static void _mysqlnd_efree(void *ptr MYSQLND_MEM_D)
 
 #if PHP_DEBUG
 	{
-		char * fn = strrchr(__zend_filename, PHP_DIR_SEPARATOR);
+		const char * fn = strrchr(__zend_filename, PHP_DIR_SEPARATOR);
 		TRACE_ALLOC_INF_FMT("file=%-15s line=%4d", fn? fn + 1:__zend_filename, __zend_lineno);
 	}
 #endif
@@ -232,7 +230,7 @@ static void _mysqlnd_pefree(void *ptr, bool persistent MYSQLND_MEM_D)
 
 #if PHP_DEBUG
 	{
-		char * fn = strrchr(__zend_filename, PHP_DIR_SEPARATOR);
+		const char * fn = strrchr(__zend_filename, PHP_DIR_SEPARATOR);
 		TRACE_ALLOC_INF_FMT("file=%-15s line=%4d", fn? fn + 1:__zend_filename, __zend_lineno);
 	}
 #endif
@@ -264,7 +262,7 @@ static char * _mysqlnd_pememdup(const char * const ptr, size_t length, bool pers
 
 #if PHP_DEBUG
 	{
-		char * fn = strrchr(__zend_filename, PHP_DIR_SEPARATOR);
+		const char * fn = strrchr(__zend_filename, PHP_DIR_SEPARATOR);
 		TRACE_ALLOC_INF_FMT("file=%-15s line=%4d", fn? fn + 1:__zend_filename, __zend_lineno);
 	}
 #endif
@@ -295,7 +293,7 @@ static char * _mysqlnd_pestrndup(const char * const ptr, size_t length, bool per
 
 #if PHP_DEBUG
 	{
-		char * fn = strrchr(__zend_filename, PHP_DIR_SEPARATOR);
+		const char * fn = strrchr(__zend_filename, PHP_DIR_SEPARATOR);
 		TRACE_ALLOC_INF_FMT("file=%-15s line=%4d", fn? fn + 1:__zend_filename, __zend_lineno);
 	}
 #endif
@@ -336,7 +334,7 @@ static char * _mysqlnd_pestrdup(const char * const ptr, bool persistent MYSQLND_
 	TRACE_ALLOC_ENTER(mysqlnd_pestrdup_name);
 #if PHP_DEBUG
 	{
-		char * fn = strrchr(__zend_filename, PHP_DIR_SEPARATOR);
+		const char * fn = strrchr(__zend_filename, PHP_DIR_SEPARATOR);
 		TRACE_ALLOC_INF_FMT("file=%-15s line=%4d", fn? fn + 1:__zend_filename, __zend_lineno);
 	}
 #endif
diff --git a/ext/mysqlnd/mysqlnd_alloc.h b/ext/mysqlnd/mysqlnd_alloc.h
index deaef3748965..203d7207740a 100644
--- a/ext/mysqlnd/mysqlnd_alloc.h
+++ b/ext/mysqlnd/mysqlnd_alloc.h
@@ -1,14 +1,12 @@
 /*
   +----------------------------------------------------------------------+
-  | Copyright (c) The PHP Group                                          |
+  | Copyright © The PHP Group and Contributors.                          |
   +----------------------------------------------------------------------+
-  | This source file is subject to version 3.01 of the PHP license,      |
-  | that is bundled with this package in the file LICENSE, and is        |
-  | available through the world-wide-web at the following url:           |
-  | https://www.php.net/license/3_01.txt                                 |
-  | If you did not receive a copy of the PHP license and are unable to   |
-  | obtain it through the world-wide-web, please send a note to          |
-  | license@php.net so we can mail you a copy immediately.               |
+  | This source file is subject to the Modified BSD License that is      |
+  | bundled with this package in the file LICENSE, and is available      |
+  | through the World Wide Web at .        |
+  |                                                                      |
+  | SPDX-License-Identifier: BSD-3-Clause                                |
   +----------------------------------------------------------------------+
   | Authors: Andrey Hristov                              |
   |          Ulf Wendel                                      |
diff --git a/ext/mysqlnd/mysqlnd_auth.c b/ext/mysqlnd/mysqlnd_auth.c
index 07c393830905..3504caa2dea1 100644
--- a/ext/mysqlnd/mysqlnd_auth.c
+++ b/ext/mysqlnd/mysqlnd_auth.c
@@ -1,14 +1,12 @@
 /*
   +----------------------------------------------------------------------+
-  | Copyright (c) The PHP Group                                          |
+  | Copyright © The PHP Group and Contributors.                          |
   +----------------------------------------------------------------------+
-  | This source file is subject to version 3.01 of the PHP license,      |
-  | that is bundled with this package in the file LICENSE, and is        |
-  | available through the world-wide-web at the following url:           |
-  | https://www.php.net/license/3_01.txt                                 |
-  | If you did not receive a copy of the PHP license and are unable to   |
-  | obtain it through the world-wide-web, please send a note to          |
-  | license@php.net so we can mail you a copy immediately.               |
+  | This source file is subject to the Modified BSD License that is      |
+  | bundled with this package in the file LICENSE, and is available      |
+  | through the World Wide Web at .        |
+  |                                                                      |
+  | SPDX-License-Identifier: BSD-3-Clause                                |
   +----------------------------------------------------------------------+
   | Authors: Andrey Hristov                              |
   |          Ulf Wendel                                      |
@@ -587,7 +585,7 @@ static struct st_mysqlnd_authentication_plugin mysqlnd_native_auth_plugin =
 		"auth_plugin_mysql_native_password",
 		MYSQLND_VERSION_ID,
 		PHP_MYSQLND_VERSION,
-		"PHP License 3.01",
+		"Modified BSD License (BSD-3-Clause)",
 		"Andrey Hristov ,  Ulf Wendel , Georg Richter ",
 		{
 			NULL, /* no statistics , will be filled later if there are some */
@@ -640,7 +638,7 @@ static struct st_mysqlnd_authentication_plugin mysqlnd_pam_authentication_plugin
 		"auth_plugin_mysql_clear_password",
 		MYSQLND_VERSION_ID,
 		PHP_MYSQLND_VERSION,
-		"PHP License 3.01",
+		"Modified BSD License (BSD-3-Clause)",
 		"Andrey Hristov ,  Ulf Wendel , Georg Richter ",
 		{
 			NULL, /* no statistics , will be filled later if there are some */
@@ -936,7 +934,7 @@ static struct st_mysqlnd_authentication_plugin mysqlnd_sha256_authentication_plu
 		"auth_plugin_sha256_password",
 		MYSQLND_VERSION_ID,
 		PHP_MYSQLND_VERSION,
-		"PHP License 3.01",
+		"Modified BSD License (BSD-3-Clause)",
 		"Andrey Hristov ,  Ulf Wendel ",
 		{
 			NULL, /* no statistics , will be filled later if there are some */
@@ -1297,7 +1295,7 @@ static struct st_mysqlnd_authentication_plugin mysqlnd_caching_sha2_auth_plugin
 		"auth_plugin_caching_sha2_password",
 		MYSQLND_VERSION_ID,
 		PHP_MYSQLND_VERSION,
-		"PHP License 3.01",
+		"Modified BSD License (BSD-3-Clause)",
 		"Johannes Schlüter ",
 		{
 			NULL, /* no statistics , will be filled later if there are some */
diff --git a/ext/mysqlnd/mysqlnd_auth.h b/ext/mysqlnd/mysqlnd_auth.h
index 9ce14a2fc521..f4a0f3146094 100644
--- a/ext/mysqlnd/mysqlnd_auth.h
+++ b/ext/mysqlnd/mysqlnd_auth.h
@@ -1,14 +1,12 @@
 /*
   +----------------------------------------------------------------------+
-  | Copyright (c) The PHP Group                                          |
+  | Copyright © The PHP Group and Contributors.                          |
   +----------------------------------------------------------------------+
-  | This source file is subject to version 3.01 of the PHP license,      |
-  | that is bundled with this package in the file LICENSE, and is        |
-  | available through the world-wide-web at the following url:           |
-  | https://www.php.net/license/3_01.txt                                 |
-  | If you did not receive a copy of the PHP license and are unable to   |
-  | obtain it through the world-wide-web, please send a note to          |
-  | license@php.net so we can mail you a copy immediately.               |
+  | This source file is subject to the Modified BSD License that is      |
+  | bundled with this package in the file LICENSE, and is available      |
+  | through the World Wide Web at .        |
+  |                                                                      |
+  | SPDX-License-Identifier: BSD-3-Clause                                |
   +----------------------------------------------------------------------+
   | Authors: Andrey Hristov                              |
   |          Ulf Wendel                                      |
diff --git a/ext/mysqlnd/mysqlnd_block_alloc.c b/ext/mysqlnd/mysqlnd_block_alloc.c
index dafcbcc8bbb8..db836d3f7b92 100644
--- a/ext/mysqlnd/mysqlnd_block_alloc.c
+++ b/ext/mysqlnd/mysqlnd_block_alloc.c
@@ -1,14 +1,12 @@
 /*
   +----------------------------------------------------------------------+
-  | Copyright (c) The PHP Group                                          |
+  | Copyright © The PHP Group and Contributors.                          |
   +----------------------------------------------------------------------+
-  | This source file is subject to version 3.01 of the PHP license,      |
-  | that is bundled with this package in the file LICENSE, and is        |
-  | available through the world-wide-web at the following url:           |
-  | https://www.php.net/license/3_01.txt                                 |
-  | If you did not receive a copy of the PHP license and are unable to   |
-  | obtain it through the world-wide-web, please send a note to          |
-  | license@php.net so we can mail you a copy immediately.               |
+  | This source file is subject to the Modified BSD License that is      |
+  | bundled with this package in the file LICENSE, and is available      |
+  | through the World Wide Web at .        |
+  |                                                                      |
+  | SPDX-License-Identifier: BSD-3-Clause                                |
   +----------------------------------------------------------------------+
   | Authors: Andrey Hristov                              |
   |          Ulf Wendel                                      |
diff --git a/ext/mysqlnd/mysqlnd_block_alloc.h b/ext/mysqlnd/mysqlnd_block_alloc.h
index 7c9aac3b8e5f..31f315235d72 100644
--- a/ext/mysqlnd/mysqlnd_block_alloc.h
+++ b/ext/mysqlnd/mysqlnd_block_alloc.h
@@ -1,14 +1,12 @@
 /*
   +----------------------------------------------------------------------+
-  | Copyright (c) The PHP Group                                          |
+  | Copyright © The PHP Group and Contributors.                          |
   +----------------------------------------------------------------------+
-  | This source file is subject to version 3.01 of the PHP license,      |
-  | that is bundled with this package in the file LICENSE, and is        |
-  | available through the world-wide-web at the following url:           |
-  | https://www.php.net/license/3_01.txt                                 |
-  | If you did not receive a copy of the PHP license and are unable to   |
-  | obtain it through the world-wide-web, please send a note to          |
-  | license@php.net so we can mail you a copy immediately.               |
+  | This source file is subject to the Modified BSD License that is      |
+  | bundled with this package in the file LICENSE, and is available      |
+  | through the World Wide Web at .        |
+  |                                                                      |
+  | SPDX-License-Identifier: BSD-3-Clause                                |
   +----------------------------------------------------------------------+
   | Authors: Andrey Hristov                              |
   |          Ulf Wendel                                      |
diff --git a/ext/mysqlnd/mysqlnd_charset.c b/ext/mysqlnd/mysqlnd_charset.c
index a767bab392e5..eacf74240fd1 100644
--- a/ext/mysqlnd/mysqlnd_charset.c
+++ b/ext/mysqlnd/mysqlnd_charset.c
@@ -1,14 +1,12 @@
 /*
   +----------------------------------------------------------------------+
-  | Copyright (c) The PHP Group                                          |
+  | Copyright © The PHP Group and Contributors.                          |
   +----------------------------------------------------------------------+
-  | This source file is subject to version 3.01 of the PHP license,      |
-  | that is bundled with this package in the file LICENSE, and is        |
-  | available through the world-wide-web at the following url:           |
-  | https://www.php.net/license/3_01.txt                                 |
-  | If you did not receive a copy of the PHP license and are unable to   |
-  | obtain it through the world-wide-web, please send a note to          |
-  | license@php.net so we can mail you a copy immediately.               |
+  | This source file is subject to the Modified BSD License that is      |
+  | bundled with this package in the file LICENSE, and is available      |
+  | through the World Wide Web at .        |
+  |                                                                      |
+  | SPDX-License-Identifier: BSD-3-Clause                                |
   +----------------------------------------------------------------------+
   | Authors: Andrey Hristov                              |
   |          Ulf Wendel                                      |
@@ -969,40 +967,6 @@ PHPAPI zend_ulong mysqlnd_cset_escape_slashes(const MYSQLND_CHARSET * const cset
 /* }}} */
 
 
-static struct st_mysqlnd_plugin_charsets mysqlnd_plugin_charsets_plugin =
-{
-	{
-		MYSQLND_PLUGIN_API_VERSION,
-		"charsets",
-		MYSQLND_VERSION_ID,
-		PHP_MYSQLND_VERSION,
-		"PHP License 3.01",
-		"Andrey Hristov ,  Ulf Wendel , Georg Richter ",
-		{
-			NULL, /* no statistics , will be filled later if there are some */
-			NULL, /* no statistics */
-		},
-		{
-			NULL /* plugin shutdown */
-		}
-	},
-	{/* methods */
-		mysqlnd_find_charset_nr,
-		mysqlnd_find_charset_name,
-		mysqlnd_cset_escape_quotes,
-		mysqlnd_cset_escape_slashes
-	}
-};
-
-
-/* {{{ mysqlnd_charsets_plugin_register */
-void
-mysqlnd_charsets_plugin_register(void)
-{
-	mysqlnd_plugin_register_ex((struct st_mysqlnd_plugin_header *) &mysqlnd_plugin_charsets_plugin);
-}
-/* }}} */
-
 #if MYSQLND_CHARSETS_SANITY_CHECK
 void mysqlnd_charsets_sanity_check(void)
 {
diff --git a/ext/mysqlnd/mysqlnd_charset.h b/ext/mysqlnd/mysqlnd_charset.h
index a2b1e2f14831..d5e621e38eb1 100644
--- a/ext/mysqlnd/mysqlnd_charset.h
+++ b/ext/mysqlnd/mysqlnd_charset.h
@@ -1,14 +1,12 @@
 /*
   +----------------------------------------------------------------------+
-  | Copyright (c) The PHP Group                                          |
+  | Copyright © The PHP Group and Contributors.                          |
   +----------------------------------------------------------------------+
-  | This source file is subject to version 3.01 of the PHP license,      |
-  | that is bundled with this package in the file LICENSE, and is        |
-  | available through the world-wide-web at the following url:           |
-  | https://www.php.net/license/3_01.txt                                 |
-  | If you did not receive a copy of the PHP license and are unable to   |
-  | obtain it through the world-wide-web, please send a note to          |
-  | license@php.net so we can mail you a copy immediately.               |
+  | This source file is subject to the Modified BSD License that is      |
+  | bundled with this package in the file LICENSE, and is available      |
+  | through the World Wide Web at .        |
+  |                                                                      |
+  | SPDX-License-Identifier: BSD-3-Clause                                |
   +----------------------------------------------------------------------+
   | Authors: Andrey Hristov                              |
   |          Ulf Wendel                                      |
@@ -28,18 +26,4 @@ PHPAPI zend_ulong mysqlnd_cset_escape_quotes(const MYSQLND_CHARSET * const chars
 PHPAPI zend_ulong mysqlnd_cset_escape_slashes(const MYSQLND_CHARSET * const cset, char * newstr,
 										 	  const char * escapestr, const size_t escapestr_len);
 
-struct st_mysqlnd_plugin_charsets
-{
-	const struct st_mysqlnd_plugin_header plugin_header;
-	struct
-	{
-		const MYSQLND_CHARSET * (*const find_charset_by_nr)(unsigned int charsetnr);
-		const MYSQLND_CHARSET * (*const find_charset_by_name)(const char * const name);
-		zend_ulong 			(*const escape_quotes)(const MYSQLND_CHARSET * const cset, char * newstr, const char * escapestr, const size_t escapestr_len);
-		zend_ulong			(*const escape_slashes)(const MYSQLND_CHARSET * const cset, char * newstr, const char * escapestr, const size_t escapestr_len);
-	} methods;
-};
-
-void mysqlnd_charsets_plugin_register(void);
-
 #endif /* MYSQLND_CHARSET_H */
diff --git a/ext/mysqlnd/mysqlnd_commands.c b/ext/mysqlnd/mysqlnd_commands.c
index a3aad43bbd4b..1bb38be089e6 100644
--- a/ext/mysqlnd/mysqlnd_commands.c
+++ b/ext/mysqlnd/mysqlnd_commands.c
@@ -1,14 +1,12 @@
 /*
   +----------------------------------------------------------------------+
-  | Copyright (c) The PHP Group                                          |
+  | Copyright © The PHP Group and Contributors.                          |
   +----------------------------------------------------------------------+
-  | This source file is subject to version 3.01 of the PHP license,      |
-  | that is bundled with this package in the file LICENSE, and is        |
-  | available through the world-wide-web at the following url:           |
-  | https://www.php.net/license/3_01.txt                                 |
-  | If you did not receive a copy of the PHP license and are unable to   |
-  | obtain it through the world-wide-web, please send a note to          |
-  | license@php.net so we can mail you a copy immediately.               |
+  | This source file is subject to the Modified BSD License that is      |
+  | bundled with this package in the file LICENSE, and is available      |
+  | through the World Wide Web at .        |
+  |                                                                      |
+  | SPDX-License-Identifier: BSD-3-Clause                                |
   +----------------------------------------------------------------------+
   | Authors: Andrey Hristov                              |
   |          Ulf Wendel                                      |
diff --git a/ext/mysqlnd/mysqlnd_commands.h b/ext/mysqlnd/mysqlnd_commands.h
index 4203b56ffc15..610de56325ae 100644
--- a/ext/mysqlnd/mysqlnd_commands.h
+++ b/ext/mysqlnd/mysqlnd_commands.h
@@ -1,14 +1,12 @@
 /*
   +----------------------------------------------------------------------+
-  | Copyright (c) The PHP Group                                          |
+  | Copyright © The PHP Group and Contributors.                          |
   +----------------------------------------------------------------------+
-  | This source file is subject to version 3.01 of the PHP license,      |
-  | that is bundled with this package in the file LICENSE, and is        |
-  | available through the world-wide-web at the following url:           |
-  | https://www.php.net/license/3_01.txt                                 |
-  | If you did not receive a copy of the PHP license and are unable to   |
-  | obtain it through the world-wide-web, please send a note to          |
-  | license@php.net so we can mail you a copy immediately.               |
+  | This source file is subject to the Modified BSD License that is      |
+  | bundled with this package in the file LICENSE, and is available      |
+  | through the World Wide Web at .        |
+  |                                                                      |
+  | SPDX-License-Identifier: BSD-3-Clause                                |
   +----------------------------------------------------------------------+
   | Authors: Andrey Hristov                              |
   |          Ulf Wendel                                      |
diff --git a/ext/mysqlnd/mysqlnd_connection.c b/ext/mysqlnd/mysqlnd_connection.c
index 4a9732a02895..517b149c0b4d 100644
--- a/ext/mysqlnd/mysqlnd_connection.c
+++ b/ext/mysqlnd/mysqlnd_connection.c
@@ -1,14 +1,12 @@
 /*
   +----------------------------------------------------------------------+
-  | Copyright (c) The PHP Group                                          |
+  | Copyright © The PHP Group and Contributors.                          |
   +----------------------------------------------------------------------+
-  | This source file is subject to version 3.01 of the PHP license,      |
-  | that is bundled with this package in the file LICENSE, and is        |
-  | available through the world-wide-web at the following url:           |
-  | https://www.php.net/license/3_01.txt                                 |
-  | If you did not receive a copy of the PHP license and are unable to   |
-  | obtain it through the world-wide-web, please send a note to          |
-  | license@php.net so we can mail you a copy immediately.               |
+  | This source file is subject to the Modified BSD License that is      |
+  | bundled with this package in the file LICENSE, and is available      |
+  | through the World Wide Web at .        |
+  |                                                                      |
+  | SPDX-License-Identifier: BSD-3-Clause                                |
   +----------------------------------------------------------------------+
   | Authors: Andrey Hristov                              |
   |          Ulf Wendel                                      |
@@ -552,7 +550,7 @@ MYSQLND_METHOD(mysqlnd_conn_data, get_scheme)(MYSQLND_CONN_DATA * conn, MYSQLND_
 			/* IPv6 without square brackets so without port */
 			transport.l = mnd_sprintf(&transport.s, 0, "tcp://[%s]:%u", hostname.s, port);
 		} else {
-			char *p;
+			const char *p;
 
 			/* IPv6 addresses are in the format [address]:port */
 			if (hostname.s[0] == '[') { /* IPv6 */
@@ -1559,17 +1557,14 @@ MYSQLND_METHOD(mysqlnd_conn_data, set_client_option_2d)(MYSQLND_CONN_DATA * cons
 				zval attrz;
 				zend_string *str;
 
+				str = zend_string_init(key, strlen(key), conn->persistent);
+				ZVAL_NEW_STR(&attrz, zend_string_init(value, strlen(value), conn->persistent));
 				if (conn->persistent) {
-					str = zend_string_init(key, strlen(key), 1);
 					GC_MAKE_PERSISTENT_LOCAL(str);
-					ZVAL_NEW_STR(&attrz, zend_string_init(value, strlen(value), 1));
 					GC_MAKE_PERSISTENT_LOCAL(Z_COUNTED(attrz));
-				} else {
-					str = zend_string_init(key, strlen(key), 0);
-					ZVAL_NEW_STR(&attrz, zend_string_init(value, strlen(value), 0));
 				}
 				zend_hash_update(conn->options->connect_attr, str, &attrz);
-				zend_string_release_ex(str, 1);
+				zend_string_release_ex(str, conn->persistent);
 			}
 			break;
 		default:
diff --git a/ext/mysqlnd/mysqlnd_connection.h b/ext/mysqlnd/mysqlnd_connection.h
index 39d7712b132c..ef71fbd4250c 100644
--- a/ext/mysqlnd/mysqlnd_connection.h
+++ b/ext/mysqlnd/mysqlnd_connection.h
@@ -1,14 +1,12 @@
 /*
   +----------------------------------------------------------------------+
-  | Copyright (c) The PHP Group                                          |
+  | Copyright © The PHP Group and Contributors.                          |
   +----------------------------------------------------------------------+
-  | This source file is subject to version 3.01 of the PHP license,      |
-  | that is bundled with this package in the file LICENSE, and is        |
-  | available through the world-wide-web at the following url:           |
-  | https://www.php.net/license/3_01.txt                                 |
-  | If you did not receive a copy of the PHP license and are unable to   |
-  | obtain it through the world-wide-web, please send a note to          |
-  | license@php.net so we can mail you a copy immediately.               |
+  | This source file is subject to the Modified BSD License that is      |
+  | bundled with this package in the file LICENSE, and is available      |
+  | through the World Wide Web at .        |
+  |                                                                      |
+  | SPDX-License-Identifier: BSD-3-Clause                                |
   +----------------------------------------------------------------------+
   | Authors: Andrey Hristov                              |
   |          Ulf Wendel                                      |
diff --git a/ext/mysqlnd/mysqlnd_debug.c b/ext/mysqlnd/mysqlnd_debug.c
index ff80c620bee1..80765f36131c 100644
--- a/ext/mysqlnd/mysqlnd_debug.c
+++ b/ext/mysqlnd/mysqlnd_debug.c
@@ -1,14 +1,12 @@
 /*
   +----------------------------------------------------------------------+
-  | Copyright (c) The PHP Group                                          |
+  | Copyright © The PHP Group and Contributors.                          |
   +----------------------------------------------------------------------+
-  | This source file is subject to version 3.01 of the PHP license,      |
-  | that is bundled with this package in the file LICENSE, and is        |
-  | available through the world-wide-web at the following url:           |
-  | https://www.php.net/license/3_01.txt                                 |
-  | If you did not receive a copy of the PHP license and are unable to   |
-  | obtain it through the world-wide-web, please send a note to          |
-  | license@php.net so we can mail you a copy immediately.               |
+  | This source file is subject to the Modified BSD License that is      |
+  | bundled with this package in the file LICENSE, and is available      |
+  | through the World Wide Web at .        |
+  |                                                                      |
+  | SPDX-License-Identifier: BSD-3-Clause                                |
   +----------------------------------------------------------------------+
   | Authors: Andrey Hristov                              |
   |          Ulf Wendel                                      |
@@ -742,7 +740,7 @@ static struct st_mysqlnd_plugin_trace_log mysqlnd_plugin_trace_log_plugin =
 		"debug_trace",
 		MYSQLND_VERSION_ID,
 		PHP_MYSQLND_VERSION,
-		"PHP License 3.01",
+		"Modified BSD License (BSD-3-Clause)",
 		"Andrey Hristov ,  Ulf Wendel , Georg Richter ",
 		{
 			NULL, /* no statistics , will be filled later if there are some */
diff --git a/ext/mysqlnd/mysqlnd_debug.h b/ext/mysqlnd/mysqlnd_debug.h
index 24eb67ca1a74..3710551bffd4 100644
--- a/ext/mysqlnd/mysqlnd_debug.h
+++ b/ext/mysqlnd/mysqlnd_debug.h
@@ -1,14 +1,12 @@
 /*
   +----------------------------------------------------------------------+
-  | Copyright (c) The PHP Group                                          |
+  | Copyright © The PHP Group and Contributors.                          |
   +----------------------------------------------------------------------+
-  | This source file is subject to version 3.01 of the PHP license,      |
-  | that is bundled with this package in the file LICENSE, and is        |
-  | available through the world-wide-web at the following url:           |
-  | https://www.php.net/license/3_01.txt                                 |
-  | If you did not receive a copy of the PHP license and are unable to   |
-  | obtain it through the world-wide-web, please send a note to          |
-  | license@php.net so we can mail you a copy immediately.               |
+  | This source file is subject to the Modified BSD License that is      |
+  | bundled with this package in the file LICENSE, and is available      |
+  | through the World Wide Web at .        |
+  |                                                                      |
+  | SPDX-License-Identifier: BSD-3-Clause                                |
   +----------------------------------------------------------------------+
   | Authors: Andrey Hristov                              |
   |          Ulf Wendel                                      |
diff --git a/ext/mysqlnd/mysqlnd_driver.c b/ext/mysqlnd/mysqlnd_driver.c
index 2c1d997177aa..deef03b9a3c1 100644
--- a/ext/mysqlnd/mysqlnd_driver.c
+++ b/ext/mysqlnd/mysqlnd_driver.c
@@ -1,14 +1,12 @@
 /*
   +----------------------------------------------------------------------+
-  | Copyright (c) The PHP Group                                          |
+  | Copyright © The PHP Group and Contributors.                          |
   +----------------------------------------------------------------------+
-  | This source file is subject to version 3.01 of the PHP license,      |
-  | that is bundled with this package in the file LICENSE, and is        |
-  | available through the world-wide-web at the following url:           |
-  | https://www.php.net/license/3_01.txt                                 |
-  | If you did not receive a copy of the PHP license and are unable to   |
-  | obtain it through the world-wide-web, please send a note to          |
-  | license@php.net so we can mail you a copy immediately.               |
+  | This source file is subject to the Modified BSD License that is      |
+  | bundled with this package in the file LICENSE, and is available      |
+  | through the World Wide Web at .        |
+  |                                                                      |
+  | SPDX-License-Identifier: BSD-3-Clause                                |
   +----------------------------------------------------------------------+
   | Authors: Andrey Hristov                              |
   |          Ulf Wendel                                      |
@@ -38,7 +36,7 @@ static struct st_mysqlnd_plugin_core mysqlnd_plugin_core =
 		"mysqlnd",
 		MYSQLND_VERSION_ID,
 		PHP_MYSQLND_VERSION,
-		"PHP License 3.01",
+		"Modified BSD License (BSD-3-Clause)",
 		"Andrey Hristov ,  Ulf Wendel , Georg Richter ",
 		{
 			NULL, /* will be filled later */
diff --git a/ext/mysqlnd/mysqlnd_enum_n_def.h b/ext/mysqlnd/mysqlnd_enum_n_def.h
index 851174032c40..abb5def974c8 100644
--- a/ext/mysqlnd/mysqlnd_enum_n_def.h
+++ b/ext/mysqlnd/mysqlnd_enum_n_def.h
@@ -1,14 +1,12 @@
 /*
   +----------------------------------------------------------------------+
-  | Copyright (c) The PHP Group                                          |
+  | Copyright © The PHP Group and Contributors.                          |
   +----------------------------------------------------------------------+
-  | This source file is subject to version 3.01 of the PHP license,      |
-  | that is bundled with this package in the file LICENSE, and is        |
-  | available through the world-wide-web at the following url:           |
-  | https://www.php.net/license/3_01.txt                                 |
-  | If you did not receive a copy of the PHP license and are unable to   |
-  | obtain it through the world-wide-web, please send a note to          |
-  | license@php.net so we can mail you a copy immediately.               |
+  | This source file is subject to the Modified BSD License that is      |
+  | bundled with this package in the file LICENSE, and is available      |
+  | through the World Wide Web at .        |
+  |                                                                      |
+  | SPDX-License-Identifier: BSD-3-Clause                                |
   +----------------------------------------------------------------------+
   | Authors: Andrey Hristov                              |
   |          Ulf Wendel                                      |
diff --git a/ext/mysqlnd/mysqlnd_ext_plugin.c b/ext/mysqlnd/mysqlnd_ext_plugin.c
index 2ca01d113e3b..5ba377e53433 100644
--- a/ext/mysqlnd/mysqlnd_ext_plugin.c
+++ b/ext/mysqlnd/mysqlnd_ext_plugin.c
@@ -1,14 +1,12 @@
 /*
   +----------------------------------------------------------------------+
-  | Copyright (c) The PHP Group                                          |
+  | Copyright © The PHP Group and Contributors.                          |
   +----------------------------------------------------------------------+
-  | This source file is subject to version 3.01 of the PHP license,      |
-  | that is bundled with this package in the file LICENSE, and is        |
-  | available through the world-wide-web at the following url:           |
-  | https://www.php.net/license/3_01.txt                                 |
-  | If you did not receive a copy of the PHP license and are unable to   |
-  | obtain it through the world-wide-web, please send a note to          |
-  | license@php.net so we can mail you a copy immediately.               |
+  | This source file is subject to the Modified BSD License that is      |
+  | bundled with this package in the file LICENSE, and is available      |
+  | through the World Wide Web at .        |
+  |                                                                      |
+  | SPDX-License-Identifier: BSD-3-Clause                                |
   +----------------------------------------------------------------------+
   | Authors: Andrey Hristov                              |
   |          Johannes Schlüter                         |
diff --git a/ext/mysqlnd/mysqlnd_ext_plugin.h b/ext/mysqlnd/mysqlnd_ext_plugin.h
index 8780ff463045..84cf6c004be4 100644
--- a/ext/mysqlnd/mysqlnd_ext_plugin.h
+++ b/ext/mysqlnd/mysqlnd_ext_plugin.h
@@ -1,14 +1,12 @@
 /*
   +----------------------------------------------------------------------+
-  | Copyright (c) The PHP Group                                          |
+  | Copyright © The PHP Group and Contributors.                          |
   +----------------------------------------------------------------------+
-  | This source file is subject to version 3.01 of the PHP license,      |
-  | that is bundled with this package in the file LICENSE, and is        |
-  | available through the world-wide-web at the following url:           |
-  | https://www.php.net/license/3_01.txt                                 |
-  | If you did not receive a copy of the PHP license and are unable to   |
-  | obtain it through the world-wide-web, please send a note to          |
-  | license@php.net so we can mail you a copy immediately.               |
+  | This source file is subject to the Modified BSD License that is      |
+  | bundled with this package in the file LICENSE, and is available      |
+  | through the World Wide Web at .        |
+  |                                                                      |
+  | SPDX-License-Identifier: BSD-3-Clause                                |
   +----------------------------------------------------------------------+
   | Authors: Andrey Hristov                              |
   |          Johannes Schlüter                         |
diff --git a/ext/mysqlnd/mysqlnd_libmysql_compat.h b/ext/mysqlnd/mysqlnd_libmysql_compat.h
index 646b09d80f4c..0172b554caa0 100644
--- a/ext/mysqlnd/mysqlnd_libmysql_compat.h
+++ b/ext/mysqlnd/mysqlnd_libmysql_compat.h
@@ -1,14 +1,12 @@
 /*
   +----------------------------------------------------------------------+
-  | Copyright (c) The PHP Group                                          |
+  | Copyright © The PHP Group and Contributors.                          |
   +----------------------------------------------------------------------+
-  | This source file is subject to version 3.01 of the PHP license,      |
-  | that is bundled with this package in the file LICENSE, and is        |
-  | available through the world-wide-web at the following url:           |
-  | https://www.php.net/license/3_01.txt                                 |
-  | If you did not receive a copy of the PHP license and are unable to   |
-  | obtain it through the world-wide-web, please send a note to          |
-  | license@php.net so we can mail you a copy immediately.               |
+  | This source file is subject to the Modified BSD License that is      |
+  | bundled with this package in the file LICENSE, and is available      |
+  | through the World Wide Web at .        |
+  |                                                                      |
+  | SPDX-License-Identifier: BSD-3-Clause                                |
   +----------------------------------------------------------------------+
   | Authors: Andrey Hristov                              |
   |          Ulf Wendel                                      |
diff --git a/ext/mysqlnd/mysqlnd_loaddata.c b/ext/mysqlnd/mysqlnd_loaddata.c
index a1e04de27008..caa5205a08e1 100644
--- a/ext/mysqlnd/mysqlnd_loaddata.c
+++ b/ext/mysqlnd/mysqlnd_loaddata.c
@@ -1,14 +1,12 @@
 /*
   +----------------------------------------------------------------------+
-  | Copyright (c) The PHP Group                                          |
+  | Copyright © The PHP Group and Contributors.                          |
   +----------------------------------------------------------------------+
-  | This source file is subject to version 3.01 of the PHP license,      |
-  | that is bundled with this package in the file LICENSE, and is        |
-  | available through the world-wide-web at the following url:           |
-  | https://www.php.net/license/3_01.txt                                 |
-  | If you did not receive a copy of the PHP license and are unable to   |
-  | obtain it through the world-wide-web, please send a note to          |
-  | license@php.net so we can mail you a copy immediately.               |
+  | This source file is subject to the Modified BSD License that is      |
+  | bundled with this package in the file LICENSE, and is available      |
+  | through the World Wide Web at .        |
+  |                                                                      |
+  | SPDX-License-Identifier: BSD-3-Clause                                |
   +----------------------------------------------------------------------+
   | Authors: Andrey Hristov                              |
   |          Ulf Wendel                                      |
diff --git a/ext/mysqlnd/mysqlnd_plugin.c b/ext/mysqlnd/mysqlnd_plugin.c
index 4bd9894b8c4b..4209676daf10 100644
--- a/ext/mysqlnd/mysqlnd_plugin.c
+++ b/ext/mysqlnd/mysqlnd_plugin.c
@@ -1,14 +1,12 @@
 /*
   +----------------------------------------------------------------------+
-  | Copyright (c) The PHP Group                                          |
+  | Copyright © The PHP Group and Contributors.                          |
   +----------------------------------------------------------------------+
-  | This source file is subject to version 3.01 of the PHP license,      |
-  | that is bundled with this package in the file LICENSE, and is        |
-  | available through the world-wide-web at the following url:           |
-  | https://www.php.net/license/3_01.txt                                 |
-  | If you did not receive a copy of the PHP license and are unable to   |
-  | obtain it through the world-wide-web, please send a note to          |
-  | license@php.net so we can mail you a copy immediately.               |
+  | This source file is subject to the Modified BSD License that is      |
+  | bundled with this package in the file LICENSE, and is available      |
+  | through the World Wide Web at .        |
+  |                                                                      |
+  | SPDX-License-Identifier: BSD-3-Clause                                |
   +----------------------------------------------------------------------+
   | Authors: Andrey Hristov                              |
   |          Ulf Wendel                                      |
@@ -47,7 +45,7 @@ static struct st_mysqlnd_typeii_plugin_example mysqlnd_example_plugin =
 		"example",
 		10001L,
 		"1.00.01",
-		"PHP License",
+		"Modified BSD License (BSD-3-Clause)",
 		"Andrey Hristov ",
 		{
 			NULL, /* will be filled later */
diff --git a/ext/mysqlnd/mysqlnd_plugin.h b/ext/mysqlnd/mysqlnd_plugin.h
index 82b2142fc9fc..04dfcb79cc40 100644
--- a/ext/mysqlnd/mysqlnd_plugin.h
+++ b/ext/mysqlnd/mysqlnd_plugin.h
@@ -1,14 +1,12 @@
 /*
   +----------------------------------------------------------------------+
-  | Copyright (c) The PHP Group                                          |
+  | Copyright © The PHP Group and Contributors.                          |
   +----------------------------------------------------------------------+
-  | This source file is subject to version 3.01 of the PHP license,      |
-  | that is bundled with this package in the file LICENSE, and is        |
-  | available through the world-wide-web at the following url:           |
-  | https://www.php.net/license/3_01.txt                                 |
-  | If you did not receive a copy of the PHP license and are unable to   |
-  | obtain it through the world-wide-web, please send a note to          |
-  | license@php.net so we can mail you a copy immediately.               |
+  | This source file is subject to the Modified BSD License that is      |
+  | bundled with this package in the file LICENSE, and is available      |
+  | through the World Wide Web at .        |
+  |                                                                      |
+  | SPDX-License-Identifier: BSD-3-Clause                                |
   +----------------------------------------------------------------------+
   | Authors: Andrey Hristov                              |
   |          Ulf Wendel                                      |
diff --git a/ext/mysqlnd/mysqlnd_priv.h b/ext/mysqlnd/mysqlnd_priv.h
index 1dbd1093dcac..daad00f0d3e6 100644
--- a/ext/mysqlnd/mysqlnd_priv.h
+++ b/ext/mysqlnd/mysqlnd_priv.h
@@ -1,14 +1,12 @@
 /*
   +----------------------------------------------------------------------+
-  | Copyright (c) The PHP Group                                          |
+  | Copyright © The PHP Group and Contributors.                          |
   +----------------------------------------------------------------------+
-  | This source file is subject to version 3.01 of the PHP license,      |
-  | that is bundled with this package in the file LICENSE, and is        |
-  | available through the world-wide-web at the following url:           |
-  | https://www.php.net/license/3_01.txt                                 |
-  | If you did not receive a copy of the PHP license and are unable to   |
-  | obtain it through the world-wide-web, please send a note to          |
-  | license@php.net so we can mail you a copy immediately.               |
+  | This source file is subject to the Modified BSD License that is      |
+  | bundled with this package in the file LICENSE, and is available      |
+  | through the World Wide Web at .        |
+  |                                                                      |
+  | SPDX-License-Identifier: BSD-3-Clause                                |
   +----------------------------------------------------------------------+
   | Authors: Andrey Hristov                              |
   |          Ulf Wendel                                      |
diff --git a/ext/mysqlnd/mysqlnd_protocol_frame_codec.c b/ext/mysqlnd/mysqlnd_protocol_frame_codec.c
index 570fba24d663..70a81befdd71 100644
--- a/ext/mysqlnd/mysqlnd_protocol_frame_codec.c
+++ b/ext/mysqlnd/mysqlnd_protocol_frame_codec.c
@@ -1,14 +1,12 @@
 /*
   +----------------------------------------------------------------------+
-  | Copyright (c) The PHP Group                                          |
+  | Copyright © The PHP Group and Contributors.                          |
   +----------------------------------------------------------------------+
-  | This source file is subject to version 3.01 of the PHP license,      |
-  | that is bundled with this package in the file LICENSE, and is        |
-  | available through the world-wide-web at the following url:           |
-  | https://www.php.net/license/3_01.txt                                 |
-  | If you did not receive a copy of the PHP license and are unable to   |
-  | obtain it through the world-wide-web, please send a note to          |
-  | license@php.net so we can mail you a copy immediately.               |
+  | This source file is subject to the Modified BSD License that is      |
+  | bundled with this package in the file LICENSE, and is available      |
+  | through the World Wide Web at .        |
+  |                                                                      |
+  | SPDX-License-Identifier: BSD-3-Clause                                |
   +----------------------------------------------------------------------+
   | Authors: Andrey Hristov                              |
   |          Ulf Wendel                                      |
diff --git a/ext/mysqlnd/mysqlnd_protocol_frame_codec.h b/ext/mysqlnd/mysqlnd_protocol_frame_codec.h
index 63aedddb12ea..1ed6f233365b 100644
--- a/ext/mysqlnd/mysqlnd_protocol_frame_codec.h
+++ b/ext/mysqlnd/mysqlnd_protocol_frame_codec.h
@@ -1,14 +1,12 @@
 /*
   +----------------------------------------------------------------------+
-  | Copyright (c) The PHP Group                                          |
+  | Copyright © The PHP Group and Contributors.                          |
   +----------------------------------------------------------------------+
-  | This source file is subject to version 3.01 of the PHP license,      |
-  | that is bundled with this package in the file LICENSE, and is        |
-  | available through the world-wide-web at the following url:           |
-  | https://www.php.net/license/3_01.txt                                 |
-  | If you did not receive a copy of the PHP license and are unable to   |
-  | obtain it through the world-wide-web, please send a note to          |
-  | license@php.net so we can mail you a copy immediately.               |
+  | This source file is subject to the Modified BSD License that is      |
+  | bundled with this package in the file LICENSE, and is available      |
+  | through the World Wide Web at .        |
+  |                                                                      |
+  | SPDX-License-Identifier: BSD-3-Clause                                |
   +----------------------------------------------------------------------+
   | Authors: Andrey Hristov                              |
   |          Ulf Wendel                                      |
diff --git a/ext/mysqlnd/mysqlnd_ps.c b/ext/mysqlnd/mysqlnd_ps.c
index 76a2eb640d1d..b9b112161570 100644
--- a/ext/mysqlnd/mysqlnd_ps.c
+++ b/ext/mysqlnd/mysqlnd_ps.c
@@ -1,14 +1,12 @@
 /*
   +----------------------------------------------------------------------+
-  | Copyright (c) The PHP Group                                          |
+  | Copyright © The PHP Group and Contributors.                          |
   +----------------------------------------------------------------------+
-  | This source file is subject to version 3.01 of the PHP license,      |
-  | that is bundled with this package in the file LICENSE, and is        |
-  | available through the world-wide-web at the following url:           |
-  | https://www.php.net/license/3_01.txt                                 |
-  | If you did not receive a copy of the PHP license and are unable to   |
-  | obtain it through the world-wide-web, please send a note to          |
-  | license@php.net so we can mail you a copy immediately.               |
+  | This source file is subject to the Modified BSD License that is      |
+  | bundled with this package in the file LICENSE, and is available      |
+  | through the World Wide Web at .        |
+  |                                                                      |
+  | SPDX-License-Identifier: BSD-3-Clause                                |
   +----------------------------------------------------------------------+
   | Authors: Andrey Hristov                              |
   |          Ulf Wendel                                      |
diff --git a/ext/mysqlnd/mysqlnd_ps.h b/ext/mysqlnd/mysqlnd_ps.h
index 107e7b6748b9..32af2d423e52 100644
--- a/ext/mysqlnd/mysqlnd_ps.h
+++ b/ext/mysqlnd/mysqlnd_ps.h
@@ -1,14 +1,12 @@
 /*
   +----------------------------------------------------------------------+
-  | Copyright (c) The PHP Group                                          |
+  | Copyright © The PHP Group and Contributors.                          |
   +----------------------------------------------------------------------+
-  | This source file is subject to version 3.01 of the PHP license,      |
-  | that is bundled with this package in the file LICENSE, and is        |
-  | available through the world-wide-web at the following url:           |
-  | https://www.php.net/license/3_01.txt                                 |
-  | If you did not receive a copy of the PHP license and are unable to   |
-  | obtain it through the world-wide-web, please send a note to          |
-  | license@php.net so we can mail you a copy immediately.               |
+  | This source file is subject to the Modified BSD License that is      |
+  | bundled with this package in the file LICENSE, and is available      |
+  | through the World Wide Web at .        |
+  |                                                                      |
+  | SPDX-License-Identifier: BSD-3-Clause                                |
   +----------------------------------------------------------------------+
   | Authors: Andrey Hristov                              |
   |          Ulf Wendel                                      |
diff --git a/ext/mysqlnd/mysqlnd_ps_codec.c b/ext/mysqlnd/mysqlnd_ps_codec.c
index c60e3d327a8d..934e3637d6aa 100644
--- a/ext/mysqlnd/mysqlnd_ps_codec.c
+++ b/ext/mysqlnd/mysqlnd_ps_codec.c
@@ -1,14 +1,12 @@
 /*
   +----------------------------------------------------------------------+
-  | Copyright (c) The PHP Group                                          |
+  | Copyright © The PHP Group and Contributors.                          |
   +----------------------------------------------------------------------+
-  | This source file is subject to version 3.01 of the PHP license,      |
-  | that is bundled with this package in the file LICENSE, and is        |
-  | available through the world-wide-web at the following url:           |
-  | https://www.php.net/license/3_01.txt                                 |
-  | If you did not receive a copy of the PHP license and are unable to   |
-  | obtain it through the world-wide-web, please send a note to          |
-  | license@php.net so we can mail you a copy immediately.               |
+  | This source file is subject to the Modified BSD License that is      |
+  | bundled with this package in the file LICENSE, and is available      |
+  | through the World Wide Web at .        |
+  |                                                                      |
+  | SPDX-License-Identifier: BSD-3-Clause                                |
   +----------------------------------------------------------------------+
   | Authors: Andrey Hristov                              |
   |          Ulf Wendel                                      |
diff --git a/ext/mysqlnd/mysqlnd_read_buffer.c b/ext/mysqlnd/mysqlnd_read_buffer.c
index 90963c99fa81..e662733e0a36 100644
--- a/ext/mysqlnd/mysqlnd_read_buffer.c
+++ b/ext/mysqlnd/mysqlnd_read_buffer.c
@@ -1,14 +1,12 @@
 /*
   +----------------------------------------------------------------------+
-  | Copyright (c) The PHP Group                                          |
+  | Copyright © The PHP Group and Contributors.                          |
   +----------------------------------------------------------------------+
-  | This source file is subject to version 3.01 of the PHP license,      |
-  | that is bundled with this package in the file LICENSE, and is        |
-  | available through the world-wide-web at the following url:           |
-  | https://www.php.net/license/3_01.txt                                 |
-  | If you did not receive a copy of the PHP license and are unable to   |
-  | obtain it through the world-wide-web, please send a note to          |
-  | license@php.net so we can mail you a copy immediately.               |
+  | This source file is subject to the Modified BSD License that is      |
+  | bundled with this package in the file LICENSE, and is available      |
+  | through the World Wide Web at .        |
+  |                                                                      |
+  | SPDX-License-Identifier: BSD-3-Clause                                |
   +----------------------------------------------------------------------+
   | Authors: Andrey Hristov                              |
   |          Ulf Wendel                                      |
diff --git a/ext/mysqlnd/mysqlnd_read_buffer.h b/ext/mysqlnd/mysqlnd_read_buffer.h
index 7014f4369690..b3d4c9638303 100644
--- a/ext/mysqlnd/mysqlnd_read_buffer.h
+++ b/ext/mysqlnd/mysqlnd_read_buffer.h
@@ -1,14 +1,12 @@
 /*
   +----------------------------------------------------------------------+
-  | Copyright (c) The PHP Group                                          |
+  | Copyright © The PHP Group and Contributors.                          |
   +----------------------------------------------------------------------+
-  | This source file is subject to version 3.01 of the PHP license,      |
-  | that is bundled with this package in the file LICENSE, and is        |
-  | available through the world-wide-web at the following url:           |
-  | https://www.php.net/license/3_01.txt                                 |
-  | If you did not receive a copy of the PHP license and are unable to   |
-  | obtain it through the world-wide-web, please send a note to          |
-  | license@php.net so we can mail you a copy immediately.               |
+  | This source file is subject to the Modified BSD License that is      |
+  | bundled with this package in the file LICENSE, and is available      |
+  | through the World Wide Web at .        |
+  |                                                                      |
+  | SPDX-License-Identifier: BSD-3-Clause                                |
   +----------------------------------------------------------------------+
   | Authors: Andrey Hristov                              |
   |          Ulf Wendel                                      |
diff --git a/ext/mysqlnd/mysqlnd_result.c b/ext/mysqlnd/mysqlnd_result.c
index ae8dc77b4cd9..b4d0bdbd8d2c 100644
--- a/ext/mysqlnd/mysqlnd_result.c
+++ b/ext/mysqlnd/mysqlnd_result.c
@@ -1,14 +1,12 @@
 /*
   +----------------------------------------------------------------------+
-  | Copyright (c) The PHP Group                                          |
+  | Copyright © The PHP Group and Contributors.                          |
   +----------------------------------------------------------------------+
-  | This source file is subject to version 3.01 of the PHP license,      |
-  | that is bundled with this package in the file LICENSE, and is        |
-  | available through the world-wide-web at the following url:           |
-  | https://www.php.net/license/3_01.txt                                 |
-  | If you did not receive a copy of the PHP license and are unable to   |
-  | obtain it through the world-wide-web, please send a note to          |
-  | license@php.net so we can mail you a copy immediately.               |
+  | This source file is subject to the Modified BSD License that is      |
+  | bundled with this package in the file LICENSE, and is available      |
+  | through the World Wide Web at .        |
+  |                                                                      |
+  | SPDX-License-Identifier: BSD-3-Clause                                |
   +----------------------------------------------------------------------+
   | Authors: Andrey Hristov                              |
   |          Ulf Wendel                                      |
@@ -722,9 +720,6 @@ MYSQLND_METHOD(mysqlnd_res, store_result_fetch_data)(MYSQLND_CONN_DATA * const c
 
 	if (ret == FAIL) {
 		COPY_CLIENT_ERROR(&set->error_info, row_packet.error_info);
-	} else {
-		/* libmysql's documentation says it should be so for SELECT statements */
-		UPSERT_STATUS_SET_AFFECTED_ROWS(conn->upsert_status, set->row_count);
 	}
 	DBG_INF_FMT("ret=%s row_count=%u warnings=%u server_status=%u",
 				ret == PASS? "PASS":"FAIL",
@@ -1004,18 +999,11 @@ MYSQLND_METHOD(mysqlnd_res, fetch_into)(MYSQLND_RES * result, const unsigned int
 			}
 		}
 		if (flags & MYSQLND_FETCH_ASSOC) {
-			/* zend_hash_quick_update needs length + trailing zero */
-			/* QQ: Error handling ? */
-			/*
-			  zend_hash_quick_update does not check, as add_assoc_zval_ex do, whether
-			  the index is a numeric and convert it to it. This however means constant
-			  hashing of the column name, which is not needed as it can be precomputed.
-			*/
 			Z_TRY_ADDREF_P(data);
-			if (meta->fields[i].is_numeric == FALSE) {
-				zend_hash_update(row_ht, meta->fields[i].sname, data);
+			if (field->is_numeric == FALSE) {
+				zend_hash_update(row_ht, field->sname, data);
 			} else {
-				zend_hash_index_update(row_ht, meta->fields[i].num_key, data);
+				zend_hash_index_update(row_ht, field->num_key, data);
 			}
 		}
 
@@ -1038,10 +1026,9 @@ MYSQLND_METHOD(mysqlnd_res, fetch_row_c)(MYSQLND_RES * result)
 	mysqlnd_result_free_prev_data(result);
 	if (result->m.fetch_row(result, &row_data, 0, &fetched_anything) == PASS && fetched_anything) {
 		unsigned field_count = result->field_count;
-		MYSQLND_FIELD *field = result->meta->fields;
 
 		ret = mnd_emalloc(field_count * sizeof(char *));
-		for (unsigned i = 0; i < field_count; i++, field++) {
+		for (unsigned i = 0; i < field_count; i++) {
 			zval *data = &row_data[i];
 			if (Z_TYPE_P(data) != IS_NULL) {
 				convert_to_string(data);
diff --git a/ext/mysqlnd/mysqlnd_result.h b/ext/mysqlnd/mysqlnd_result.h
index fe414f0cd65c..db90b4d963cc 100644
--- a/ext/mysqlnd/mysqlnd_result.h
+++ b/ext/mysqlnd/mysqlnd_result.h
@@ -1,14 +1,12 @@
 /*
   +----------------------------------------------------------------------+
-  | Copyright (c) The PHP Group                                          |
+  | Copyright © The PHP Group and Contributors.                          |
   +----------------------------------------------------------------------+
-  | This source file is subject to version 3.01 of the PHP license,      |
-  | that is bundled with this package in the file LICENSE, and is        |
-  | available through the world-wide-web at the following url:           |
-  | https://www.php.net/license/3_01.txt                                 |
-  | If you did not receive a copy of the PHP license and are unable to   |
-  | obtain it through the world-wide-web, please send a note to          |
-  | license@php.net so we can mail you a copy immediately.               |
+  | This source file is subject to the Modified BSD License that is      |
+  | bundled with this package in the file LICENSE, and is available      |
+  | through the World Wide Web at .        |
+  |                                                                      |
+  | SPDX-License-Identifier: BSD-3-Clause                                |
   +----------------------------------------------------------------------+
   | Authors: Andrey Hristov                              |
   |          Ulf Wendel                                      |
diff --git a/ext/mysqlnd/mysqlnd_result_meta.c b/ext/mysqlnd/mysqlnd_result_meta.c
index 92896ccb408e..6a772973c395 100644
--- a/ext/mysqlnd/mysqlnd_result_meta.c
+++ b/ext/mysqlnd/mysqlnd_result_meta.c
@@ -1,14 +1,12 @@
 /*
   +----------------------------------------------------------------------+
-  | Copyright (c) The PHP Group                                          |
+  | Copyright © The PHP Group and Contributors.                          |
   +----------------------------------------------------------------------+
-  | This source file is subject to version 3.01 of the PHP license,      |
-  | that is bundled with this package in the file LICENSE, and is        |
-  | available through the world-wide-web at the following url:           |
-  | https://www.php.net/license/3_01.txt                                 |
-  | If you did not receive a copy of the PHP license and are unable to   |
-  | obtain it through the world-wide-web, please send a note to          |
-  | license@php.net so we can mail you a copy immediately.               |
+  | This source file is subject to the Modified BSD License that is      |
+  | bundled with this package in the file LICENSE, and is available      |
+  | through the World Wide Web at .        |
+  |                                                                      |
+  | SPDX-License-Identifier: BSD-3-Clause                                |
   +----------------------------------------------------------------------+
   | Authors: Andrey Hristov                              |
   |          Ulf Wendel                                      |
diff --git a/ext/mysqlnd/mysqlnd_result_meta.h b/ext/mysqlnd/mysqlnd_result_meta.h
index e9726abae02a..d3c84776958a 100644
--- a/ext/mysqlnd/mysqlnd_result_meta.h
+++ b/ext/mysqlnd/mysqlnd_result_meta.h
@@ -1,14 +1,12 @@
 /*
   +----------------------------------------------------------------------+
-  | Copyright (c) The PHP Group                                          |
+  | Copyright © The PHP Group and Contributors.                          |
   +----------------------------------------------------------------------+
-  | This source file is subject to version 3.01 of the PHP license,      |
-  | that is bundled with this package in the file LICENSE, and is        |
-  | available through the world-wide-web at the following url:           |
-  | https://www.php.net/license/3_01.txt                                 |
-  | If you did not receive a copy of the PHP license and are unable to   |
-  | obtain it through the world-wide-web, please send a note to          |
-  | license@php.net so we can mail you a copy immediately.               |
+  | This source file is subject to the Modified BSD License that is      |
+  | bundled with this package in the file LICENSE, and is available      |
+  | through the World Wide Web at .        |
+  |                                                                      |
+  | SPDX-License-Identifier: BSD-3-Clause                                |
   +----------------------------------------------------------------------+
   | Authors: Andrey Hristov                              |
   |          Johannes Schlüter                         |
diff --git a/ext/mysqlnd/mysqlnd_reverse_api.c b/ext/mysqlnd/mysqlnd_reverse_api.c
index 982aac065eb0..539c8adaaa60 100644
--- a/ext/mysqlnd/mysqlnd_reverse_api.c
+++ b/ext/mysqlnd/mysqlnd_reverse_api.c
@@ -1,14 +1,12 @@
 /*
   +----------------------------------------------------------------------+
-  | Copyright (c) The PHP Group                                          |
+  | Copyright © The PHP Group and Contributors.                          |
   +----------------------------------------------------------------------+
-  | This source file is subject to version 3.01 of the PHP license,      |
-  | that is bundled with this package in the file LICENSE, and is        |
-  | available through the world-wide-web at the following url:           |
-  | https://www.php.net/license/3_01.txt                                 |
-  | If you did not receive a copy of the PHP license and are unable to   |
-  | obtain it through the world-wide-web, please send a note to          |
-  | license@php.net so we can mail you a copy immediately.               |
+  | This source file is subject to the Modified BSD License that is      |
+  | bundled with this package in the file LICENSE, and is available      |
+  | through the World Wide Web at .        |
+  |                                                                      |
+  | SPDX-License-Identifier: BSD-3-Clause                                |
   +----------------------------------------------------------------------+
   | Authors: Andrey Hristov                              |
   |          Johannes Schlüter                         |
diff --git a/ext/mysqlnd/mysqlnd_reverse_api.h b/ext/mysqlnd/mysqlnd_reverse_api.h
index ee56666d5eaf..843fa728aacc 100644
--- a/ext/mysqlnd/mysqlnd_reverse_api.h
+++ b/ext/mysqlnd/mysqlnd_reverse_api.h
@@ -1,14 +1,12 @@
 /*
   +----------------------------------------------------------------------+
-  | Copyright (c) The PHP Group                                          |
+  | Copyright © The PHP Group and Contributors.                          |
   +----------------------------------------------------------------------+
-  | This source file is subject to version 3.01 of the PHP license,      |
-  | that is bundled with this package in the file LICENSE, and is        |
-  | available through the world-wide-web at the following url:           |
-  | https://www.php.net/license/3_01.txt                                 |
-  | If you did not receive a copy of the PHP license and are unable to   |
-  | obtain it through the world-wide-web, please send a note to          |
-  | license@php.net so we can mail you a copy immediately.               |
+  | This source file is subject to the Modified BSD License that is      |
+  | bundled with this package in the file LICENSE, and is available      |
+  | through the World Wide Web at .        |
+  |                                                                      |
+  | SPDX-License-Identifier: BSD-3-Clause                                |
   +----------------------------------------------------------------------+
   | Authors: Andrey Hristov                              |
   |          Ulf Wendel                                      |
diff --git a/ext/mysqlnd/mysqlnd_statistics.c b/ext/mysqlnd/mysqlnd_statistics.c
index 0d94303ea366..33a47843c9c8 100644
--- a/ext/mysqlnd/mysqlnd_statistics.c
+++ b/ext/mysqlnd/mysqlnd_statistics.c
@@ -1,14 +1,12 @@
 /*
   +----------------------------------------------------------------------+
-  | Copyright (c) The PHP Group                                          |
+  | Copyright © The PHP Group and Contributors.                          |
   +----------------------------------------------------------------------+
-  | This source file is subject to version 3.01 of the PHP license,      |
-  | that is bundled with this package in the file LICENSE, and is        |
-  | available through the world-wide-web at the following url:           |
-  | https://www.php.net/license/3_01.txt                                 |
-  | If you did not receive a copy of the PHP license and are unable to   |
-  | obtain it through the world-wide-web, please send a note to          |
-  | license@php.net so we can mail you a copy immediately.               |
+  | This source file is subject to the Modified BSD License that is      |
+  | bundled with this package in the file LICENSE, and is available      |
+  | through the World Wide Web at .        |
+  |                                                                      |
+  | SPDX-License-Identifier: BSD-3-Clause                                |
   +----------------------------------------------------------------------+
   | Authors: Andrey Hristov                              |
   |          Ulf Wendel                                      |
diff --git a/ext/mysqlnd/mysqlnd_statistics.h b/ext/mysqlnd/mysqlnd_statistics.h
index 02cd64450cb6..a576f67ffdb1 100644
--- a/ext/mysqlnd/mysqlnd_statistics.h
+++ b/ext/mysqlnd/mysqlnd_statistics.h
@@ -1,14 +1,12 @@
 /*
   +----------------------------------------------------------------------+
-  | Copyright (c) The PHP Group                                          |
+  | Copyright © The PHP Group and Contributors.                          |
   +----------------------------------------------------------------------+
-  | This source file is subject to version 3.01 of the PHP license,      |
-  | that is bundled with this package in the file LICENSE, and is        |
-  | available through the world-wide-web at the following url:           |
-  | https://www.php.net/license/3_01.txt                                 |
-  | If you did not receive a copy of the PHP license and are unable to   |
-  | obtain it through the world-wide-web, please send a note to          |
-  | license@php.net so we can mail you a copy immediately.               |
+  | This source file is subject to the Modified BSD License that is      |
+  | bundled with this package in the file LICENSE, and is available      |
+  | through the World Wide Web at .        |
+  |                                                                      |
+  | SPDX-License-Identifier: BSD-3-Clause                                |
   +----------------------------------------------------------------------+
   | Authors: Andrey Hristov                              |
   |          Ulf Wendel                                      |
diff --git a/ext/mysqlnd/mysqlnd_structs.h b/ext/mysqlnd/mysqlnd_structs.h
index 02c31358da48..80d0abfcae6f 100644
--- a/ext/mysqlnd/mysqlnd_structs.h
+++ b/ext/mysqlnd/mysqlnd_structs.h
@@ -1,14 +1,12 @@
 /*
   +----------------------------------------------------------------------+
-  | Copyright (c) The PHP Group                                          |
+  | Copyright © The PHP Group and Contributors.                          |
   +----------------------------------------------------------------------+
-  | This source file is subject to version 3.01 of the PHP license,      |
-  | that is bundled with this package in the file LICENSE, and is        |
-  | available through the world-wide-web at the following url:           |
-  | https://www.php.net/license/3_01.txt                                 |
-  | If you did not receive a copy of the PHP license and are unable to   |
-  | obtain it through the world-wide-web, please send a note to          |
-  | license@php.net so we can mail you a copy immediately.               |
+  | This source file is subject to the Modified BSD License that is      |
+  | bundled with this package in the file LICENSE, and is available      |
+  | through the World Wide Web at .        |
+  |                                                                      |
+  | SPDX-License-Identifier: BSD-3-Clause                                |
   +----------------------------------------------------------------------+
   | Authors: Andrey Hristov                              |
   |          Ulf Wendel                                      |
diff --git a/ext/mysqlnd/mysqlnd_vio.c b/ext/mysqlnd/mysqlnd_vio.c
index 3a3f7b207214..b6ea490e67b6 100644
--- a/ext/mysqlnd/mysqlnd_vio.c
+++ b/ext/mysqlnd/mysqlnd_vio.c
@@ -1,14 +1,12 @@
 /*
   +----------------------------------------------------------------------+
-  | Copyright (c) The PHP Group                                          |
+  | Copyright © The PHP Group and Contributors.                          |
   +----------------------------------------------------------------------+
-  | This source file is subject to version 3.01 of the PHP license,      |
-  | that is bundled with this package in the file LICENSE, and is        |
-  | available through the world-wide-web at the following url:           |
-  | https://www.php.net/license/3_01.txt                                 |
-  | If you did not receive a copy of the PHP license and are unable to   |
-  | obtain it through the world-wide-web, please send a note to          |
-  | license@php.net so we can mail you a copy immediately.               |
+  | This source file is subject to the Modified BSD License that is      |
+  | bundled with this package in the file LICENSE, and is available      |
+  | through the World Wide Web at .        |
+  |                                                                      |
+  | SPDX-License-Identifier: BSD-3-Clause                                |
   +----------------------------------------------------------------------+
   | Authors: Andrey Hristov                              |
   |          Ulf Wendel                                      |
diff --git a/ext/mysqlnd/mysqlnd_vio.h b/ext/mysqlnd/mysqlnd_vio.h
index a96fdb182b17..28f033bd749d 100644
--- a/ext/mysqlnd/mysqlnd_vio.h
+++ b/ext/mysqlnd/mysqlnd_vio.h
@@ -1,14 +1,12 @@
 /*
   +----------------------------------------------------------------------+
-  | Copyright (c) The PHP Group                                          |
+  | Copyright © The PHP Group and Contributors.                          |
   +----------------------------------------------------------------------+
-  | This source file is subject to version 3.01 of the PHP license,      |
-  | that is bundled with this package in the file LICENSE, and is        |
-  | available through the world-wide-web at the following url:           |
-  | https://www.php.net/license/3_01.txt                                 |
-  | If you did not receive a copy of the PHP license and are unable to   |
-  | obtain it through the world-wide-web, please send a note to          |
-  | license@php.net so we can mail you a copy immediately.               |
+  | This source file is subject to the Modified BSD License that is      |
+  | bundled with this package in the file LICENSE, and is available      |
+  | through the World Wide Web at .        |
+  |                                                                      |
+  | SPDX-License-Identifier: BSD-3-Clause                                |
   +----------------------------------------------------------------------+
   | Authors: Andrey Hristov                              |
   |          Ulf Wendel                                      |
diff --git a/ext/mysqlnd/mysqlnd_wireprotocol.c b/ext/mysqlnd/mysqlnd_wireprotocol.c
index 36fd53233737..b957240a4088 100644
--- a/ext/mysqlnd/mysqlnd_wireprotocol.c
+++ b/ext/mysqlnd/mysqlnd_wireprotocol.c
@@ -1,14 +1,12 @@
 /*
   +----------------------------------------------------------------------+
-  | Copyright (c) The PHP Group                                          |
+  | Copyright © The PHP Group and Contributors.                          |
   +----------------------------------------------------------------------+
-  | This source file is subject to version 3.01 of the PHP license,      |
-  | that is bundled with this package in the file LICENSE, and is        |
-  | available through the world-wide-web at the following url:           |
-  | https://www.php.net/license/3_01.txt                                 |
-  | If you did not receive a copy of the PHP license and are unable to   |
-  | obtain it through the world-wide-web, please send a note to          |
-  | license@php.net so we can mail you a copy immediately.               |
+  | This source file is subject to the Modified BSD License that is      |
+  | bundled with this package in the file LICENSE, and is available      |
+  | through the World Wide Web at .        |
+  |                                                                      |
+  | SPDX-License-Identifier: BSD-3-Clause                                |
   +----------------------------------------------------------------------+
   | Authors: Andrey Hristov                              |
   |          Ulf Wendel                                      |
@@ -461,7 +459,7 @@ php_mysqlnd_greet_read(MYSQLND_CONN_DATA * conn, void * _packet)
 			packet->auth_protocol = estrdup("");
 		} else {
 			/* Check if NUL present */
-			char *null_terminator = memchr(p, '\0', remaining_size);
+			const char *null_terminator = memchr(p, '\0', remaining_size);
 			size_t auth_protocol_len;
 			if (null_terminator) {
 				/* If present, do basically estrdup */
diff --git a/ext/mysqlnd/mysqlnd_wireprotocol.h b/ext/mysqlnd/mysqlnd_wireprotocol.h
index f24eb70f4a79..e5d38bc6737e 100644
--- a/ext/mysqlnd/mysqlnd_wireprotocol.h
+++ b/ext/mysqlnd/mysqlnd_wireprotocol.h
@@ -1,14 +1,12 @@
 /*
   +----------------------------------------------------------------------+
-  | Copyright (c) The PHP Group                                          |
+  | Copyright © The PHP Group and Contributors.                          |
   +----------------------------------------------------------------------+
-  | This source file is subject to version 3.01 of the PHP license,      |
-  | that is bundled with this package in the file LICENSE, and is        |
-  | available through the world-wide-web at the following url:           |
-  | https://www.php.net/license/3_01.txt                                 |
-  | If you did not receive a copy of the PHP license and are unable to   |
-  | obtain it through the world-wide-web, please send a note to          |
-  | license@php.net so we can mail you a copy immediately.               |
+  | This source file is subject to the Modified BSD License that is      |
+  | bundled with this package in the file LICENSE, and is available      |
+  | through the World Wide Web at .        |
+  |                                                                      |
+  | SPDX-License-Identifier: BSD-3-Clause                                |
   +----------------------------------------------------------------------+
   | Authors: Andrey Hristov                              |
   |          Ulf Wendel                                      |
diff --git a/ext/mysqlnd/php_mysqlnd.c b/ext/mysqlnd/php_mysqlnd.c
index c21697828a9a..f8b2d72ebab9 100644
--- a/ext/mysqlnd/php_mysqlnd.c
+++ b/ext/mysqlnd/php_mysqlnd.c
@@ -1,14 +1,12 @@
 /*
   +----------------------------------------------------------------------+
-  | Copyright (c) The PHP Group                                          |
+  | Copyright © The PHP Group and Contributors.                          |
   +----------------------------------------------------------------------+
-  | This source file is subject to version 3.01 of the PHP license,      |
-  | that is bundled with this package in the file LICENSE, and is        |
-  | available through the world-wide-web at the following url:           |
-  | https://www.php.net/license/3_01.txt                                 |
-  | If you did not receive a copy of the PHP license and are unable to   |
-  | obtain it through the world-wide-web, please send a note to          |
-  | license@php.net so we can mail you a copy immediately.               |
+  | This source file is subject to the Modified BSD License that is      |
+  | bundled with this package in the file LICENSE, and is available      |
+  | through the World Wide Web at .        |
+  |                                                                      |
+  | SPDX-License-Identifier: BSD-3-Clause                                |
   +----------------------------------------------------------------------+
   | Authors: Andrey Hristov                              |
   |          Ulf Wendel                                      |
diff --git a/ext/mysqlnd/php_mysqlnd.h b/ext/mysqlnd/php_mysqlnd.h
index e7a981a5de3e..4da59ed965e8 100644
--- a/ext/mysqlnd/php_mysqlnd.h
+++ b/ext/mysqlnd/php_mysqlnd.h
@@ -1,14 +1,12 @@
 /*
   +----------------------------------------------------------------------+
-  | Copyright (c) The PHP Group                                          |
+  | Copyright © The PHP Group and Contributors.                          |
   +----------------------------------------------------------------------+
-  | This source file is subject to version 3.01 of the PHP license,      |
-  | that is bundled with this package in the file LICENSE, and is        |
-  | available through the world-wide-web at the following url:           |
-  | https://www.php.net/license/3_01.txt                                 |
-  | If you did not receive a copy of the PHP license and are unable to   |
-  | obtain it through the world-wide-web, please send a note to          |
-  | license@php.net so we can mail you a copy immediately.               |
+  | This source file is subject to the Modified BSD License that is      |
+  | bundled with this package in the file LICENSE, and is available      |
+  | through the World Wide Web at .        |
+  |                                                                      |
+  | SPDX-License-Identifier: BSD-3-Clause                                |
   +----------------------------------------------------------------------+
   | Authors: Andrey Hristov                              |
   |          Ulf Wendel                                      |
diff --git a/ext/odbc/odbc_utils.c b/ext/odbc/odbc_utils.c
index bc6674b9b5e5..8468fa9a06c1 100644
--- a/ext/odbc/odbc_utils.c
+++ b/ext/odbc/odbc_utils.c
@@ -1,14 +1,12 @@
 /*
    +----------------------------------------------------------------------+
-   | Copyright (c) The PHP Group                                          |
+   | Copyright © The PHP Group and Contributors.                          |
    +----------------------------------------------------------------------+
-   | This source file is subject to version 3.01 of the PHP license,      |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | https://www.php.net/license/3_01.txt                                 |
-   | If you did not receive a copy of the PHP license and are unable to   |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@php.net so we can mail you a copy immediately.               |
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Author: Calvin Buckley                            |
    +----------------------------------------------------------------------+
@@ -59,7 +57,7 @@ PHP_FUNCTION(odbc_connection_string_quote)
 		Z_PARAM_STR(str)
 	ZEND_PARSE_PARAMETERS_END();
 
-	size_t new_size = php_odbc_connstr_estimate_quote_length(ZSTR_VAL(str));
+	size_t new_size = php_odbc_connstr_get_quoted_length(ZSTR_VAL(str));
 	zend_string *new_string = zend_string_alloc(new_size, 0);
 	php_odbc_connstr_quote(ZSTR_VAL(new_string), ZSTR_VAL(str), new_size);
 	/* reset length */
diff --git a/ext/odbc/php_odbc.c b/ext/odbc/php_odbc.c
index 7eec40aa656f..a6218cab7276 100644
--- a/ext/odbc/php_odbc.c
+++ b/ext/odbc/php_odbc.c
@@ -1,14 +1,12 @@
 /*
    +----------------------------------------------------------------------+
-   | Copyright (c) The PHP Group                                          |
+   | Copyright © The PHP Group and Contributors.                          |
    +----------------------------------------------------------------------+
-   | This source file is subject to version 3.01 of the PHP license,      |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | https://www.php.net/license/3_01.txt                                 |
-   | If you did not receive a copy of the PHP license and are unable to   |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@php.net so we can mail you a copy immediately.               |
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Authors: Stig Sæther Bakken                             |
    |          Andreas Karajannis               |
@@ -62,7 +60,6 @@
 void odbc_do_connect(INTERNAL_FUNCTION_PARAMETERS, int persistent);
 static void safe_odbc_disconnect(void *handle);
 static void close_results_with_connection(odbc_connection *conn);
-static inline odbc_result *odbc_result_from_obj(zend_object *obj);
 
 static int le_pconn;
 
@@ -71,6 +68,7 @@ static zend_object_handlers odbc_connection_object_handlers, odbc_result_object_
 
 #define Z_ODBC_LINK_P(zv) odbc_link_from_obj(Z_OBJ_P(zv))
 #define Z_ODBC_CONNECTION_P(zv) Z_ODBC_LINK_P(zv)->connection
+#define odbc_result_from_obj(obj) ZEND_CONTAINER_OF(obj, odbc_result, std)
 #define Z_ODBC_RESULT_P(zv) odbc_result_from_obj(Z_OBJ_P(zv))
 
 static void odbc_insert_new_result(odbc_connection *connection, zval *result)
@@ -87,10 +85,7 @@ static void odbc_insert_new_result(odbc_connection *connection, zval *result)
 	Z_ADDREF_P(result);
 }
 
-static inline odbc_link *odbc_link_from_obj(zend_object *obj)
-{
-	return (odbc_link *)((char *)(obj) - XtOffsetOf(odbc_link, std));
-}
+#define odbc_link_from_obj(obj) ZEND_CONTAINER_OF(obj, odbc_link, std)
 
 static int _close_pconn_with_res(zval *zv, void *p)
 {
@@ -204,11 +199,6 @@ static void odbc_connection_free_obj(zend_object *obj)
 	zend_object_std_dtor(&link->std);
 }
 
-static inline odbc_result *odbc_result_from_obj(zend_object *obj)
-{
-	return (odbc_result *)((char *)(obj) - XtOffsetOf(odbc_result, std));
-}
-
 static zend_object *odbc_result_create_object(zend_class_entry *class_type)
 {
 	odbc_result *intern = zend_object_alloc(sizeof(odbc_result), class_type);
@@ -509,7 +499,7 @@ PHP_MINIT_FUNCTION(odbc)
 	odbc_connection_ce->default_object_handlers = &odbc_connection_object_handlers;
 
 	memcpy(&odbc_connection_object_handlers, &std_object_handlers, sizeof(zend_object_handlers));
-	odbc_connection_object_handlers.offset = XtOffsetOf(odbc_link, std);
+	odbc_connection_object_handlers.offset = offsetof(odbc_link, std);
 	odbc_connection_object_handlers.free_obj = odbc_connection_free_obj;
 	odbc_connection_object_handlers.get_constructor = odbc_connection_get_constructor;
 	odbc_connection_object_handlers.clone_obj = NULL;
@@ -521,7 +511,7 @@ PHP_MINIT_FUNCTION(odbc)
 	odbc_result_ce->default_object_handlers = &odbc_result_object_handlers;
 
 	memcpy(&odbc_result_object_handlers, &std_object_handlers, sizeof(zend_object_handlers));
-	odbc_result_object_handlers.offset = XtOffsetOf(odbc_result, std);
+	odbc_result_object_handlers.offset = offsetof(odbc_result, std);
 	odbc_result_object_handlers.free_obj = odbc_result_free_obj;
 	odbc_result_object_handlers.get_constructor = odbc_result_get_constructor;
 	odbc_result_object_handlers.clone_obj = NULL;
@@ -1342,12 +1332,11 @@ static void php_odbc_fetch(INTERNAL_FUNCTION_PARAMETERS, bool return_array, php_
 	result = Z_ODBC_RESULT_P(pv_res);
 	CHECK_ODBC_RESULT(result);
 
-	/* TODO deprecate $row argument values less than 1 after PHP 8.4
-	 * for functions other than odbc_fetch_row (see GH-13910)
-	 */
-	if (!result_type && !pv_row_is_null && pv_row < 1) {
-		php_error_docref(NULL, E_WARNING, "Argument #3 ($row) must be greater than or equal to 1");
-		RETURN_FALSE;
+	if (!pv_row_is_null && pv_row < 1) {
+		/* row arg no differs between callers */
+		zend_argument_value_error(pv_res_arr == return_value ? 2 : 3,
+				"must be greater than or equal to 1");
+		RETURN_THROWS();
 	}
 
 	if (result->numcols == 0) {
@@ -1667,7 +1656,6 @@ PHP_FUNCTION(odbc_result)
 			}
 			ZSTR_VAL(field_str)[ZSTR_LEN(field_str)] = '\0';
 			RETURN_NEW_STR(field_str);
-			break;
 
 		default:
 			if (result->values[field_ind].vallen == SQL_NULL_DATA) {
@@ -1955,9 +1943,9 @@ bool odbc_sqlconnect(zval *zv, char *db, char *uid, char *pwd, int cur_opt, bool
 				if (use_uid_arg) {
 					should_quote_uid = !php_odbc_connstr_is_quoted(uid) && php_odbc_connstr_should_quote(uid);
 					if (should_quote_uid) {
-						size_t estimated_length = php_odbc_connstr_estimate_quote_length(uid);
-						uid_quoted = emalloc(estimated_length);
-						php_odbc_connstr_quote(uid_quoted, uid, estimated_length);
+						size_t quoted_length = php_odbc_connstr_get_quoted_length(uid);
+						uid_quoted = emalloc(quoted_length);
+						php_odbc_connstr_quote(uid_quoted, uid, quoted_length);
 					} else {
 						uid_quoted = uid;
 					}
@@ -1970,9 +1958,9 @@ bool odbc_sqlconnect(zval *zv, char *db, char *uid, char *pwd, int cur_opt, bool
 				if (use_pwd_arg) {
 					should_quote_pwd = !php_odbc_connstr_is_quoted(pwd) && php_odbc_connstr_should_quote(pwd);
 					if (should_quote_pwd) {
-						size_t estimated_length = php_odbc_connstr_estimate_quote_length(pwd);
-						pwd_quoted = emalloc(estimated_length);
-						php_odbc_connstr_quote(pwd_quoted, pwd, estimated_length);
+						size_t quoted_length = php_odbc_connstr_get_quoted_length(pwd);
+						pwd_quoted = emalloc(quoted_length);
+						php_odbc_connstr_quote(pwd_quoted, pwd, quoted_length);
 					} else {
 						pwd_quoted = pwd;
 					}
diff --git a/ext/odbc/php_odbc.h b/ext/odbc/php_odbc.h
index 6f6264a482d7..d2815b90d108 100644
--- a/ext/odbc/php_odbc.h
+++ b/ext/odbc/php_odbc.h
@@ -1,14 +1,12 @@
 /*
    +----------------------------------------------------------------------+
-   | Copyright (c) The PHP Group                                          |
+   | Copyright © The PHP Group and Contributors.                          |
    +----------------------------------------------------------------------+
-   | This source file is subject to version 3.01 of the PHP license,      |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | https://www.php.net/license/3_01.txt                                 |
-   | If you did not receive a copy of the PHP license and are unable to   |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@php.net so we can mail you a copy immediately.               |
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Authors: Stig Sæther Bakken                             |
    |          Andreas Karajannis               |
diff --git a/ext/odbc/php_odbc_includes.h b/ext/odbc/php_odbc_includes.h
index 058684c2ed03..1c53e35bf43a 100644
--- a/ext/odbc/php_odbc_includes.h
+++ b/ext/odbc/php_odbc_includes.h
@@ -1,14 +1,12 @@
 /*
    +----------------------------------------------------------------------+
-   | Copyright (c) The PHP Group                                          |
+   | Copyright © The PHP Group and Contributors.                          |
    +----------------------------------------------------------------------+
-   | This source file is subject to version 3.01 of the PHP license,      |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | https://www.php.net/license/3_01.txt                                 |
-   | If you did not receive a copy of the PHP license and are unable to   |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@php.net so we can mail you a copy immediately.               |
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Authors: Stig Sæther Bakken                             |
    |          Andreas Karajannis               |
diff --git a/ext/odbc/tests/odbc_fetch_array_001.phpt b/ext/odbc/tests/odbc_fetch_array_001.phpt
index bf13ed25e4d6..e7d4ccf328b6 100644
--- a/ext/odbc/tests/odbc_fetch_array_001.phpt
+++ b/ext/odbc/tests/odbc_fetch_array_001.phpt
@@ -17,7 +17,7 @@ odbc_exec($conn, 'INSERT INTO fetch_array VALUES (1), (2)');
 $res = odbc_exec($conn, 'SELECT * FROM fetch_array');
 
 var_dump(odbc_fetch_array($res));
-var_dump(odbc_fetch_array($res, 0));
+var_dump(odbc_fetch_array($res, null));
 var_dump(odbc_fetch_array($res, 2));
 var_dump(odbc_fetch_array($res, 4));
 
diff --git a/ext/odbc/tests/odbc_fetch_into_001.phpt b/ext/odbc/tests/odbc_fetch_into_001.phpt
index 19f7f79268c5..e420475f02cc 100644
--- a/ext/odbc/tests/odbc_fetch_into_001.phpt
+++ b/ext/odbc/tests/odbc_fetch_into_001.phpt
@@ -20,7 +20,7 @@ $arr = [];
 var_dump(odbc_fetch_into($res, $arr));
 var_dump($arr);
 $arr = [];
-var_dump(odbc_fetch_into($res, $arr, 0));
+var_dump(odbc_fetch_into($res, $arr, null));
 var_dump($arr);
 $arr = [];
 var_dump(odbc_fetch_into($res, $arr, 2));
diff --git a/ext/odbc/tests/odbc_fetch_object_001.phpt b/ext/odbc/tests/odbc_fetch_object_001.phpt
index 62a8fc3b2c7e..eb553409639f 100644
--- a/ext/odbc/tests/odbc_fetch_object_001.phpt
+++ b/ext/odbc/tests/odbc_fetch_object_001.phpt
@@ -17,7 +17,7 @@ odbc_exec($conn, 'INSERT INTO fetch_object VALUES (1), (2)');
 $res = odbc_exec($conn, 'SELECT * FROM fetch_object');
 
 var_dump(odbc_fetch_object($res));
-var_dump(odbc_fetch_object($res, 0));
+var_dump(odbc_fetch_object($res, null));
 var_dump(odbc_fetch_object($res, 2));
 var_dump(odbc_fetch_object($res, 4));
 
diff --git a/ext/odbc/tests/odbc_fetch_row_001.phpt b/ext/odbc/tests/odbc_fetch_row_001.phpt
index 576bb15414ce..fbadc8272590 100644
--- a/ext/odbc/tests/odbc_fetch_row_001.phpt
+++ b/ext/odbc/tests/odbc_fetch_row_001.phpt
@@ -17,7 +17,11 @@ odbc_exec($conn, 'INSERT INTO fetch_row VALUES (1), (2)');
 
 $res = odbc_exec($conn, 'SELECT * FROM fetch_row');
 
-var_dump(odbc_fetch_row($res, 0));
+try {
+    var_dump(odbc_fetch_row($res, 0));
+} catch (\ValueError $e) {
+    echo $e->getMessage() . \PHP_EOL;
+}
 
 var_dump(odbc_fetch_row($res, null));
 var_dump(odbc_result($res, 'test'));
@@ -39,9 +43,8 @@ require 'config.inc';
 $conn = odbc_connect($dsn, $user, $pass);
 odbc_exec($conn, 'DROP TABLE fetch_row');
 ?>
---EXPECTF--
-Warning: odbc_fetch_row(): Argument #3 ($row) must be greater than or equal to 1 in %s on line %d
-bool(false)
+--EXPECT--
+odbc_fetch_row(): Argument #2 ($row) must be greater than or equal to 1
 bool(true)
 string(1) "1"
 bool(true)
diff --git a/ext/opcache/ZendAccelerator.c b/ext/opcache/ZendAccelerator.c
index f4134212bc4e..3d005b3835a7 100644
--- a/ext/opcache/ZendAccelerator.c
+++ b/ext/opcache/ZendAccelerator.c
@@ -2,15 +2,13 @@
    +----------------------------------------------------------------------+
    | Zend OPcache                                                         |
    +----------------------------------------------------------------------+
-   | Copyright (c) The PHP Group                                          |
+   | Copyright © The PHP Group and Contributors.                          |
    +----------------------------------------------------------------------+
-   | This source file is subject to version 3.01 of the PHP license,      |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | https://www.php.net/license/3_01.txt                                 |
-   | If you did not receive a copy of the PHP license and are unable to   |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@php.net so we can mail you a copy immediately.               |
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Authors: Andi Gutmans                                  |
    |          Zeev Suraski                                  |
@@ -312,7 +310,7 @@ static inline void accel_restart_leave(void)
 #endif
 }
 
-static inline int accel_restart_is_active(void)
+static inline bool accel_restart_is_active(void)
 {
 	if (ZCSG(restart_in_progress)) {
 #ifndef ZEND_WIN32
@@ -325,19 +323,19 @@ static inline int accel_restart_is_active(void)
 
 		if (fcntl(lock_file, F_GETLK, &restart_check) == -1) {
 			zend_accel_error(ACCEL_LOG_DEBUG, "RestartC:  %s (%d)", strerror(errno), errno);
-			return FAILURE;
+			return true;
 		}
 		if (restart_check.l_type == F_UNLCK) {
 			ZCSG(restart_in_progress) = false;
-			return 0;
+			return false;
 		} else {
-			return 1;
+			return true;
 		}
 #else
 		return LOCKVAL(restart_in) != 0;
 #endif
 	}
-	return 0;
+	return false;
 }
 
 /* Creates a read lock for SHM access */
@@ -591,13 +589,12 @@ static zend_string* ZEND_FASTCALL accel_new_interned_string_for_php(zend_string
 static zend_always_inline zend_string *accel_find_interned_string_ex(zend_ulong h, const char *str, size_t size)
 {
 	zend_string_table_pos_t pos;
-	zend_string *s;
 
 	/* check for existing interned string */
 	pos = *STRTAB_HASH_TO_SLOT(&ZCSG(interned_strings), h);
 	if (EXPECTED(pos != STRTAB_INVALID_POS)) {
 		do {
-			s = STRTAB_POS_TO_STR(&ZCSG(interned_strings), pos);
+			zend_string *s = STRTAB_POS_TO_STR(&ZCSG(interned_strings), pos);
 			if (EXPECTED(ZSTR_H(s) == h) && zend_string_equals_cstr(s, str, size)) {
 				return s;
 			}
@@ -720,14 +717,13 @@ static void accel_copy_permanent_strings(zend_new_interned_string_func_t new_int
 				Z_FUNC(q->val)->common.function_name = new_interned_string(Z_FUNC(q->val)->common.function_name);
 			}
 			if (Z_FUNC(q->val)->common.scope == ce) {
-				uint32_t i;
 				uint32_t num_args = Z_FUNC(q->val)->common.num_args + 1;
 				zend_arg_info *arg_info = Z_FUNC(q->val)->common.arg_info - 1;
 
 				if (Z_FUNC(q->val)->common.fn_flags & ZEND_ACC_VARIADIC) {
 					num_args++;
 				}
-				for (i = 0 ; i < num_args; i++) {
+				for (uint32_t i = 0 ; i < num_args; i++) {
 					if (i > 0) {
 						arg_info[i].name = new_interned_string(arg_info[i].name);
 						if (arg_info[i].default_value) {
@@ -860,7 +856,6 @@ static void accel_use_shm_interned_strings(void)
 #ifndef ZEND_WIN32
 static inline void kill_all_lockers(struct flock *mem_usage_check)
 {
-	int tries;
 	/* so that other process won't try to force while we are busy cleaning up */
 	ZCSG(force_restart_time) = 0;
 	while (mem_usage_check->l_pid > 0) {
@@ -868,7 +863,7 @@ static inline void kill_all_lockers(struct flock *mem_usage_check)
 		int signal = SIGTERM;
 		errno = 0;
 		bool success = false;
-		tries = 10;
+		int tries = 10;
 
 		while (tries--) {
 			zend_accel_error(ACCEL_LOG_WARNING, "Attempting to kill locker %d", mem_usage_check->l_pid);
@@ -964,7 +959,7 @@ static inline bool accel_is_inactive(void)
 	return false;
 }
 
-static int zend_get_stream_timestamp(const char *filename, zend_stat_t *statbuf)
+static zend_result zend_get_stream_timestamp(const char *filename, zend_stat_t *statbuf)
 {
 	php_stream_wrapper *wrapper;
 	php_stream_statbuf stream_statbuf;
@@ -1056,7 +1051,7 @@ accel_time_t zend_get_file_handle_timestamp(zend_file_handle *file_handle, size_
 	    !EG(current_execute_data) &&
 	    file_handle->primary_script) {
 
-		zend_stat_t *tmpbuf = sapi_module.get_stat();
+		const zend_stat_t *tmpbuf = sapi_module.get_stat();
 
 		if (tmpbuf) {
 			if (size) {
@@ -1137,11 +1132,11 @@ accel_time_t zend_get_file_handle_timestamp(zend_file_handle *file_handle, size_
 	return statbuf.st_mtime;
 }
 
-static inline int do_validate_timestamps(zend_persistent_script *persistent_script, zend_file_handle *file_handle)
+static inline zend_result do_validate_timestamps(const zend_persistent_script *persistent_script, zend_file_handle *file_handle)
 {
 	zend_file_handle ps_handle;
 	zend_string *full_path_ptr = NULL;
-	int ret;
+	zend_result ret;
 
 	/** check that the persistent script is indeed the same file we cached
 	 * (if part of the path is a symlink than it possible that the user will change it)
@@ -1225,8 +1220,6 @@ zend_string *accel_make_persistent_key(zend_string *str)
 {
 	const char *path = ZSTR_VAL(str);
 	size_t path_length = ZSTR_LEN(str);
-	char *key;
-	int key_length;
 
 	ZEND_ASSERT(GC_REFCOUNT(ZCG(key)) == 1);
 	ZSTR_LEN(ZCG(key)) = 0;
@@ -1243,9 +1236,8 @@ zend_string *accel_make_persistent_key(zend_string *str)
 		/* pass */
 	} else {
 		const char *include_path = NULL, *cwd = NULL;
-		int include_path_len = 0, cwd_len = 0;
-		zend_string *parent_script = NULL;
-		size_t parent_script_len = 0;
+		size_t include_path_len = 0, cwd_len = 0;
+		const zend_string *parent_script = NULL;
 
 		if (EXPECTED(ZCG(cwd_key_len))) {
 			cwd = ZCG(cwd_key);
@@ -1280,7 +1272,7 @@ zend_string *accel_make_persistent_key(zend_string *str)
 					}
 					if (str) {
 						char buf[32];
-						char *res = zend_print_long_to_buf(buf + sizeof(buf) - 1, STRTAB_STR_TO_POS(&ZCSG(interned_strings), str));
+						const char *res = zend_print_long_to_buf(buf + sizeof(buf) - 1, STRTAB_STR_TO_POS(&ZCSG(interned_strings), str));
 
 						cwd_len = ZCG(cwd_key_len) = buf + sizeof(buf) - 1 - res;
 						cwd = ZCG(cwd_key);
@@ -1324,7 +1316,7 @@ zend_string *accel_make_persistent_key(zend_string *str)
 					}
 					if (str) {
 						char buf[32];
-						char *res = zend_print_long_to_buf(buf + sizeof(buf) - 1, STRTAB_STR_TO_POS(&ZCSG(interned_strings), str));
+						const char *res = zend_print_long_to_buf(buf + sizeof(buf) - 1, STRTAB_STR_TO_POS(&ZCSG(interned_strings), str));
 
 						include_path_len = ZCG(include_path_key_len) = buf + sizeof(buf) - 1 - res;
 						include_path = ZCG(include_path_key);
@@ -1348,10 +1340,10 @@ zend_string *accel_make_persistent_key(zend_string *str)
 		 * since in itself, it may include colons (which we use to separate
 		 * different components of the key)
 		 */
-		key = ZSTR_VAL(ZCG(key));
+		char *key = ZSTR_VAL(ZCG(key));
 		memcpy(key, path, path_length);
 		key[path_length] = ':';
-		key_length = path_length + 1;
+		size_t key_length = path_length + 1;
 		memcpy(key + key_length, cwd, cwd_len);
 		key_length += cwd_len;
 
@@ -1369,7 +1361,7 @@ zend_string *accel_make_persistent_key(zend_string *str)
 		if (EXPECTED(EG(current_execute_data)) &&
 		    EXPECTED((parent_script = zend_get_executed_filename_ex()) != NULL)) {
 
-			parent_script_len = ZSTR_LEN(parent_script);
+			size_t parent_script_len = ZSTR_LEN(parent_script);
 			while (parent_script_len > 0) {
 				--parent_script_len;
 				if (IS_SLASH(ZSTR_VAL(parent_script)[parent_script_len])) {
@@ -1523,7 +1515,7 @@ static void zend_accel_add_key(zend_string *key, zend_accel_hash_entry *bucket)
 	}
 }
 
-static zend_always_inline bool is_phar_file(zend_string *filename)
+static zend_always_inline bool is_phar_file(const zend_string *filename)
 {
 	return filename && ZSTR_LEN(filename) >= sizeof(".phar") &&
 		!memcmp(ZSTR_VAL(filename) + ZSTR_LEN(filename) - (sizeof(".phar")-1), ".phar", sizeof(".phar")-1) &&
@@ -1974,8 +1966,8 @@ static zend_op_array *file_cache_compile_file(zend_file_handle *file_handle, int
 
 	if (persistent_script) {
 		if (ZCG(accel_directives).record_warnings) {
-			persistent_script->num_warnings = EG(num_errors);
-			persistent_script->warnings = EG(errors);
+			persistent_script->num_warnings = EG(errors).size;
+			persistent_script->warnings = EG(errors).errors;
 		}
 
 		from_memory = false;
@@ -1993,7 +1985,7 @@ static zend_op_array *file_cache_compile_file(zend_file_handle *file_handle, int
 	return op_array;
 }
 
-static int check_persistent_script_access(zend_persistent_script *persistent_script)
+static bool check_persistent_script_access(const zend_persistent_script *persistent_script)
 {
 	char *phar_path, *ptr;
 	if ((ZSTR_LEN(persistent_script->script.filename)num_warnings = EG(num_errors);
-				persistent_script->warnings = EG(errors);
+				persistent_script->num_warnings = EG(errors).size;
+				persistent_script->warnings = EG(errors).errors;
 			}
 
 			/* See GH-17246: we disable GC so that user code cannot be executed during the optimizer run. */
@@ -2294,7 +2286,7 @@ zend_op_array *persistent_compile_file(zend_file_handle *file_handle, int type)
 	return zend_accel_load_script(persistent_script, from_shared_memory);
 }
 
-static zend_always_inline zend_inheritance_cache_entry* zend_accel_inheritance_cache_find(zend_inheritance_cache_entry *entry, zend_class_entry *ce, zend_class_entry *parent, zend_class_entry **traits_and_interfaces, bool *needs_autoload_ptr)
+static zend_always_inline zend_inheritance_cache_entry* zend_accel_inheritance_cache_find(zend_inheritance_cache_entry *entry, const zend_class_entry *ce, const zend_class_entry *parent, zend_class_entry **traits_and_interfaces, bool *needs_autoload_ptr)
 {
 	uint32_t i;
 
@@ -2316,10 +2308,10 @@ static zend_always_inline zend_inheritance_cache_entry* zend_accel_inheritance_c
 			}
 			if (found && entry->dependencies) {
 				for (i = 0; i < entry->dependencies_count; i++) {
-					zend_class_entry *ce = zend_lookup_class_ex(entry->dependencies[i].name, NULL, ZEND_FETCH_CLASS_NO_AUTOLOAD);
+					const zend_class_entry *dependency_ce = zend_lookup_class_ex(entry->dependencies[i].name, NULL, ZEND_FETCH_CLASS_NO_AUTOLOAD);
 
-					if (ce != entry->dependencies[i].ce) {
-						if (!ce) {
+					if (dependency_ce != entry->dependencies[i].ce) {
+						if (!dependency_ce) {
 							needs_autoload = true;
 						} else {
 							found = false;
@@ -2341,7 +2333,6 @@ static zend_always_inline zend_inheritance_cache_entry* zend_accel_inheritance_c
 
 static zend_class_entry* zend_accel_inheritance_cache_get(zend_class_entry *ce, zend_class_entry *parent, zend_class_entry **traits_and_interfaces)
 {
-	uint32_t i;
 	bool needs_autoload;
 	zend_inheritance_cache_entry *entry = ce->inheritance_cache;
 
@@ -2360,10 +2351,10 @@ static zend_class_entry* zend_accel_inheritance_cache_get(zend_class_entry *ce,
 				return ce;
 			}
 
-			for (i = 0; i < entry->dependencies_count; i++) {
-				zend_class_entry *ce = zend_lookup_class_ex(entry->dependencies[i].name, NULL, 0);
+			for (uint32_t i = 0; i < entry->dependencies_count; i++) {
+				const zend_class_entry *dependency_ce = zend_lookup_class_ex(entry->dependencies[i].name, NULL, 0);
 
-				if (ce == NULL) {
+				if (dependency_ce == NULL) {
 					return NULL;
 				}
 			}
@@ -2428,7 +2419,7 @@ static zend_class_entry* zend_accel_inheritance_cache_add(zend_class_entry *ce,
 	}
 	ZCG(current_persistent_script) = &dummy;
 	zend_persist_class_entry_calc(ce);
-	zend_persist_warnings_calc(EG(num_errors), EG(errors));
+	zend_persist_warnings_calc(EG(errors).size, EG(errors).errors);
 	size = dummy.size;
 
 	zend_shared_alloc_clear_xlat_table();
@@ -2498,8 +2489,8 @@ static zend_class_entry* zend_accel_inheritance_cache_add(zend_class_entry *ce,
 	JIT_G(on) = jit_on_old;
 #endif
 
-	entry->num_warnings = EG(num_errors);
-	entry->warnings = zend_persist_warnings(EG(num_errors), EG(errors));
+	entry->num_warnings = EG(errors).size;
+	entry->warnings = zend_persist_warnings(EG(errors).size, EG(errors).errors);
 	entry->next = proto->inheritance_cache;
 	proto->inheritance_cache = entry;
 
@@ -2592,7 +2583,7 @@ static zend_string* persistent_zend_resolve_path(zend_string *filename)
 				/* lookup by "not-real" path */
 				key = accel_make_persistent_key(filename);
 				if (key) {
-					zend_accel_hash_entry *bucket = zend_accel_hash_find_entry(&ZCSG(hash), key);
+					const zend_accel_hash_entry *bucket = zend_accel_hash_find_entry(&ZCSG(hash), key);
 					if (bucket != NULL) {
 						zend_persistent_script *persistent_script = (zend_persistent_script *)bucket->data;
 						if (!persistent_script->corrupted) {
@@ -3323,7 +3314,6 @@ static zend_result accel_post_startup(void)
 				accel_startup_ok = false;
 				zend_accel_error_noreturn(ACCEL_LOG_FATAL, "Failure to initialize shared memory structures - cannot reattach to exiting shared memory.");
 				return SUCCESS;
-				break;
 #if ENABLE_FILE_CACHE_FALLBACK
 			case ALLOC_FALLBACK:
 				zend_shared_alloc_lock();
@@ -3331,7 +3321,6 @@ static zend_result accel_post_startup(void)
 				fallback_process = true;
 				zend_shared_alloc_unlock();
 				goto file_cache_fallback;
-				break;
 #endif
 		}
 
@@ -3649,7 +3638,7 @@ static void preload_shutdown(void)
 
 	if (EG(function_table)) {
 		ZEND_HASH_MAP_REVERSE_FOREACH_VAL(EG(function_table), zv) {
-			zend_function *func = Z_PTR_P(zv);
+			const zend_function *func = Z_PTR_P(zv);
 			if (func->type == ZEND_INTERNAL_FUNCTION) {
 				break;
 			}
@@ -3658,7 +3647,7 @@ static void preload_shutdown(void)
 
 	if (EG(class_table)) {
 		ZEND_HASH_MAP_REVERSE_FOREACH_VAL(EG(class_table), zv) {
-			zend_class_entry *ce = Z_PTR_P(zv);
+			const zend_class_entry *ce = Z_PTR_P(zv);
 			if (ce->type == ZEND_INTERNAL_CLASS && Z_TYPE_P(zv) != IS_ALIAS_PTR) {
 				break;
 			}
@@ -3685,7 +3674,7 @@ static void preload_restart(void)
 	}
 }
 
-static size_t preload_try_strip_filename(zend_string *filename) {
+static size_t preload_try_strip_filename(const zend_string *filename) {
 	/*FIXME: better way to handle eval()'d code? see COMPILED_STRING_DESCRIPTION_FORMAT */
 	if (ZSTR_LEN(filename) > sizeof(" eval()'d code")
 		&& *(ZSTR_VAL(filename) + ZSTR_LEN(filename) - sizeof(" eval()'d code")) == ':') {
@@ -3806,17 +3795,17 @@ static void preload_sort_classes(void *base, size_t count, size_t siz, compare_f
 	Bucket *b2;
 	Bucket *end = b1 + count;
 	Bucket tmp;
-	zend_class_entry *ce, *p;
+	const zend_class_entry *ce, *p;
 
 	while (b1 < end) {
 try_again:
-		ce = (zend_class_entry*)Z_PTR(b1->val);
+		ce = Z_PTR(b1->val);
 		if (ce->parent && (ce->ce_flags & ZEND_ACC_LINKED)) {
 			p = ce->parent;
 			if (p->type == ZEND_USER_CLASS) {
 				b2 = b1 + 1;
 				while (b2 < end) {
-					if (p ==  Z_PTR(b2->val)) {
+					if (p == Z_PTR(b2->val)) {
 						tmp = *b1;
 						*b1 = *b2;
 						*b2 = tmp;
@@ -3833,7 +3822,7 @@ static void preload_sort_classes(void *base, size_t count, size_t siz, compare_f
 				if (p->type == ZEND_USER_CLASS) {
 					b2 = b1 + 1;
 					while (b2 < end) {
-						if (p ==  Z_PTR(b2->val)) {
+						if (p == Z_PTR(b2->val)) {
 							tmp = *b1;
 							*b1 = *b2;
 							*b2 = tmp;
@@ -3859,7 +3848,7 @@ static zend_result preload_resolve_deps(preload_error *error, const zend_class_e
 
 	if (ce->parent_name) {
 		zend_string *key = zend_string_tolower(ce->parent_name);
-		zend_class_entry *parent = zend_hash_find_ptr(EG(class_table), key);
+		const zend_class_entry *parent = zend_hash_find_ptr(EG(class_table), key);
 		zend_string_release(key);
 		if (!parent) {
 			error->kind = "Unknown parent ";
@@ -3870,7 +3859,7 @@ static zend_result preload_resolve_deps(preload_error *error, const zend_class_e
 
 	if (ce->num_interfaces) {
 		for (uint32_t i = 0; i < ce->num_interfaces; i++) {
-			zend_class_entry *interface =
+			const zend_class_entry *interface =
 				zend_hash_find_ptr(EG(class_table), ce->interface_names[i].lc_name);
 			if (!interface) {
 				error->kind = "Unknown interface ";
@@ -3882,7 +3871,7 @@ static zend_result preload_resolve_deps(preload_error *error, const zend_class_e
 
 	if (ce->num_traits) {
 		for (uint32_t i = 0; i < ce->num_traits; i++) {
-			zend_class_entry *trait =
+			const zend_class_entry *trait =
 				zend_hash_find_ptr(EG(class_table), ce->trait_names[i].lc_name);
 			if (!trait) {
 				error->kind = "Unknown trait ";
@@ -3925,10 +3914,9 @@ static bool preload_try_resolve_constants(zend_class_entry *ce)
 			ce->ce_flags &= ~ZEND_ACC_HAS_AST_CONSTANTS;
 		}
 		if (ce->default_properties_count) {
-			uint32_t i;
 			bool resolved = true;
 
-			for (i = 0; i < ce->default_properties_count; i++) {
+			for (uint32_t i = 0; i < ce->default_properties_count; i++) {
 				zend_property_info *prop = ce->properties_info_table[i];
 				if (!prop) {
 					continue;
@@ -3988,7 +3976,7 @@ static void preload_error_cb(int type, zend_string *error_filename, const uint32
 static void preload_remove_declares(zend_op_array *op_array)
 {
 	zend_op *opline = op_array->opcodes;
-	zend_op *end = opline + op_array->last;
+	const zend_op *end = opline + op_array->last;
 	uint32_t skip_dynamic_func_count = 0;
 	zend_string *key;
 	zend_op_array *func;
@@ -4133,9 +4121,9 @@ static void preload_link(void)
 				/* Remember the last error. */
 				zend_error_cb = orig_error_cb;
 				EG(record_errors) = false;
-				ZEND_ASSERT(EG(num_errors) > 0);
-				zend_hash_update_ptr(&errors, key, EG(errors)[EG(num_errors)-1]);
-				EG(num_errors)--;
+				ZEND_ASSERT(EG(errors).size > 0);
+				zend_hash_update_ptr(&errors, key, EG(errors).errors[EG(errors).size-1]);
+				EG(errors).size--;
 			} zend_end_try();
 			CG(in_compilation) = false;
 			CG(compiled_filename) = NULL;
@@ -4279,7 +4267,7 @@ static void preload_remove_empty_includes(void)
 			if (script->empty) {
 				bool empty = true;
 				zend_op *opline = script->script.main_op_array.opcodes;
-				zend_op *end = opline + script->script.main_op_array.last;
+				const zend_op *end = opline + script->script.main_op_array.last;
 
 				while (opline < end) {
 					if (opline->opcode == ZEND_INCLUDE_OR_EVAL &&
@@ -4320,7 +4308,7 @@ static void preload_remove_empty_includes(void)
 	/* remove empty includes */
 	ZEND_HASH_MAP_FOREACH_PTR(preload_scripts, script) {
 		zend_op *opline = script->script.main_op_array.opcodes;
-		zend_op *end = opline + script->script.main_op_array.last;
+		const zend_op *end = opline + script->script.main_op_array.last;
 
 		while (opline < end) {
 			if (opline->opcode == ZEND_INCLUDE_OR_EVAL &&
@@ -4331,7 +4319,7 @@ static void preload_remove_empty_includes(void)
 				zend_string *resolved_path = preload_resolve_path(Z_STR_P(RT_CONSTANT(opline, opline->op1)));
 
 				if (resolved_path) {
-					zend_persistent_script *incl = zend_hash_find_ptr(preload_scripts, resolved_path);
+					const zend_persistent_script *incl = zend_hash_find_ptr(preload_scripts, resolved_path);
 					if (incl && incl->empty && opline->result_type == IS_UNUSED) {
 						MAKE_NOP(opline);
 					} else {
@@ -4349,9 +4337,8 @@ static void preload_remove_empty_includes(void)
 	} ZEND_HASH_FOREACH_END();
 }
 
-static void preload_register_trait_methods(zend_class_entry *ce) {
+static void preload_register_trait_methods(const zend_class_entry *ce) {
 	zend_op_array *op_array;
-	zend_property_info *info;
 
 	ZEND_HASH_MAP_FOREACH_PTR(&ce->function_table, op_array) {
 		if (!(op_array->fn_flags & ZEND_ACC_TRAIT_CLONE)) {
@@ -4361,7 +4348,7 @@ static void preload_register_trait_methods(zend_class_entry *ce) {
 	} ZEND_HASH_FOREACH_END();
 
 	if (ce->num_hooked_props > 0) {
-		ZEND_HASH_MAP_FOREACH_PTR(&ce->properties_info, info) {
+		ZEND_HASH_MAP_FOREACH_PTR(&ce->properties_info, zend_property_info *info) {
 			if (info->hooks) {
 				for (uint32_t i = 0; i < ZEND_PROPERTY_HOOK_COUNT; i++) {
 					if (info->hooks[i]) {
@@ -4383,7 +4370,7 @@ static void preload_fix_trait_op_array(zend_op_array *op_array)
 		return;
 	}
 
-	zend_op_array *orig_op_array = zend_shared_alloc_get_xlat_entry(op_array->refcount);
+	const zend_op_array *orig_op_array = zend_shared_alloc_get_xlat_entry(op_array->refcount);
 	ZEND_ASSERT(orig_op_array && "Must be in xlat table");
 
 	zend_string *function_name = op_array->function_name;
@@ -4401,7 +4388,7 @@ static void preload_fix_trait_op_array(zend_op_array *op_array)
 	op_array->static_variables = ht;
 }
 
-static void preload_fix_trait_methods(zend_class_entry *ce)
+static void preload_fix_trait_methods(const zend_class_entry *ce)
 {
 	zend_op_array *op_array;
 
@@ -4426,7 +4413,7 @@ static void preload_fix_trait_methods(zend_class_entry *ce)
 
 static void preload_optimize(zend_persistent_script *script)
 {
-	zend_class_entry *ce;
+	const zend_class_entry *ce;
 	zend_persistent_script *tmp_script;
 
 	zend_shared_alloc_init_xlat_table();
@@ -4523,10 +4510,10 @@ static zend_persistent_script* preload_script_in_shared_memory(zend_persistent_s
 static void preload_load(size_t orig_map_ptr_static_last)
 {
 	/* Load into process tables */
-	zend_script *script = &ZCSG(preload_script)->script;
+	const zend_script *script = &ZCSG(preload_script)->script;
 	if (zend_hash_num_elements(&script->function_table)) {
 		Bucket *p = script->function_table.arData;
-		Bucket *end = p + script->function_table.nNumUsed;
+		const Bucket *end = p + script->function_table.nNumUsed;
 
 		zend_hash_extend(CG(function_table),
 			CG(function_table)->nNumUsed + script->function_table.nNumUsed, 0);
@@ -4537,7 +4524,7 @@ static void preload_load(size_t orig_map_ptr_static_last)
 
 	if (zend_hash_num_elements(&script->class_table)) {
 		Bucket *p = script->class_table.arData;
-		Bucket *end = p + script->class_table.nNumUsed;
+		const Bucket *end = p + script->class_table.nNumUsed;
 
 		zend_hash_extend(CG(class_table),
 			CG(class_table)->nNumUsed + script->class_table.nNumUsed, 0);
@@ -4585,7 +4572,7 @@ static void preload_load(size_t orig_map_ptr_static_last)
 }
 
 #if HAVE_JIT
-static void zend_accel_clear_call_graph_ptrs(zend_op_array *op_array)
+static void zend_accel_clear_call_graph_ptrs(const zend_op_array *op_array)
 {
 	ZEND_ASSERT(ZEND_USER_CODE(op_array->type));
 	zend_func_info *info = ZEND_FUNC_INFO(op_array);
@@ -4595,9 +4582,9 @@ static void zend_accel_clear_call_graph_ptrs(zend_op_array *op_array)
 	}
 }
 
-static void accel_reset_arena_info(zend_persistent_script *script)
+static void accel_reset_arena_info(const zend_persistent_script *script)
 {
-	zend_op_array *op_array;
+	const zend_op_array *op_array;
 	zend_class_entry *ce;
 
 	zend_accel_clear_call_graph_ptrs(&script->script.main_op_array);
@@ -5174,9 +5161,9 @@ static void accel_activate(void) {
 static zend_extension opcache_extension_entry = {
 	ACCELERATOR_PRODUCT_NAME,               /* name */
 	PHP_VERSION,							/* version */
-	"Zend Technologies",					/* author */
-	"http://www.zend.com/",					/* URL */
-	"Copyright (c)",						/* copyright */
+	"Zend by Perforce",					/* author */
+	"https://www.zend.com/",					/* URL */
+	"Copyright ©",						/* copyright */
 	accel_startup,					   		/* startup */
 	NULL,									/* shutdown */
 	accel_activate,							/* per-script activation */
diff --git a/ext/opcache/ZendAccelerator.h b/ext/opcache/ZendAccelerator.h
index 524a6f5e1213..91642e288d31 100644
--- a/ext/opcache/ZendAccelerator.h
+++ b/ext/opcache/ZendAccelerator.h
@@ -2,15 +2,13 @@
    +----------------------------------------------------------------------+
    | Zend OPcache                                                         |
    +----------------------------------------------------------------------+
-   | Copyright (c) The PHP Group                                          |
+   | Copyright © The PHP Group and Contributors.                          |
    +----------------------------------------------------------------------+
-   | This source file is subject to version 3.01 of the PHP license,      |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | https://www.php.net/license/3_01.txt                                 |
-   | If you did not receive a copy of the PHP license and are unable to   |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@php.net so we can mail you a copy immediately.               |
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Authors: Andi Gutmans                                  |
    |          Zeev Suraski                                  |
diff --git a/ext/opcache/jit/ir/.gitignore b/ext/opcache/jit/ir/.gitignore
index 7a37a4fd0593..367a68671bc0 100644
--- a/ext/opcache/jit/ir/.gitignore
+++ b/ext/opcache/jit/ir/.gitignore
@@ -20,3 +20,6 @@ tests/**/*.log
 
 win32/vcpkg
 win32/build_*
+
+fuzz/build/
+fuzz/corpus/
diff --git a/ext/opcache/jit/ir/ir.c b/ext/opcache/jit/ir/ir.c
index f6058c5abe52..f6a0cb60af98 100644
--- a/ext/opcache/jit/ir/ir.c
+++ b/ext/opcache/jit/ir/ir.c
@@ -161,6 +161,8 @@ void ir_print_const(const ir_ctx *ctx, const ir_insn *insn, FILE *f, bool quoted
 		case IR_CHAR:
 			if (insn->val.c == '\\') {
 				fprintf(f, "'\\\\'");
+			} else if (insn->val.c == '\'') {
+				fprintf(f, "'\\\''");
 			} else if (insn->val.c >= ' ') {
 				fprintf(f, "'%c'", insn->val.c);
 			} else if (insn->val.c == '\t') {
@@ -283,6 +285,7 @@ void ir_print_const(const ir_ctx *ctx, const ir_insn *insn, FILE *f, bool quoted
 #define ir_op_kind_src     IR_OPND_CONTROL
 #define ir_op_kind_reg     IR_OPND_CONTROL_DEP
 #define ir_op_kind_ret     IR_OPND_CONTROL_REF
+#define ir_op_kind_grd     IR_OPND_CONTROL_GUARD
 #define ir_op_kind_str     IR_OPND_STR
 #define ir_op_kind_num     IR_OPND_NUM
 #define ir_op_kind_fld     IR_OPND_STR
@@ -1443,24 +1446,6 @@ bool ir_use_list_add(ir_ctx *ctx, ir_ref to, ir_ref ref)
 	}
 }
 
-static int ir_ref_cmp(const void *p1, const void *p2)
-{
-	return *(ir_ref*)p1 - *(ir_ref*)p2;
-}
-
-void ir_use_list_sort(ir_ctx *ctx, ir_ref ref)
-{
-	ir_use_list *use_list;
-	uint32_t n;
-
-	IR_ASSERT(ref > 0);
-	use_list = &ctx->use_lists[ref];
-	n = use_list->count;
-	if (n > 1) {
-		qsort(ctx->use_edges + use_list->refs, n, sizeof(ir_ref), ir_ref_cmp);
-	}
-}
-
 void ir_replace(ir_ctx *ctx, ir_ref ref, ir_ref new_ref)
 {
 	int i, j, n, *p, use;
@@ -1861,7 +1846,7 @@ int ir_mem_unprotect(void *ptr, size_t size)
 
 int ir_mem_flush(void *ptr, size_t size)
 {
-	return 1;
+	return FlushInstructionCache(GetCurrentProcess(), ptr, size) == TRUE ? 1 : 0;
 }
 #else
 
@@ -2186,7 +2171,10 @@ IR_ALWAYS_INLINE ir_ref ir_find_aliasing_load_i(const ir_ctx *ctx, ir_ref ref, i
 			if (!(proto->flags & (IR_CONST_FUNC|IR_PURE_FUNC))) {
 				break;
 			}
-		} else if (insn->op == IR_MERGE || insn->op == IR_LOOP_BEGIN || insn->op == IR_VSTORE) {
+		} else if (insn->op == IR_MERGE
+				|| insn->op == IR_LOOP_BEGIN
+				|| insn->op == IR_VSTORE
+				|| (insn->op == IR_BEGIN && insn->op2)) {
 			return IR_UNUSED;
 		}
 		ref = insn->op1;
@@ -2251,7 +2239,10 @@ IR_ALWAYS_INLINE ir_ref ir_find_aliasing_vload_i(const ir_ctx *ctx, ir_ref ref,
 			if (!(proto->flags & (IR_CONST_FUNC|IR_PURE_FUNC))) {
 				break;
 			}
-		} else if (insn->op == IR_MERGE || insn->op == IR_LOOP_BEGIN || insn->op == IR_STORE) {
+		} else if (insn->op == IR_MERGE
+				|| insn->op == IR_LOOP_BEGIN
+				|| insn->op == IR_STORE
+				|| (insn->op == IR_BEGIN && insn->op2)) {
 			break;
 		}
 		ref = insn->op1;
@@ -2344,7 +2335,15 @@ IR_ALWAYS_INLINE ir_ref ir_find_aliasing_store_i(ir_ctx *ctx, ir_ref ref, ir_ref
 			}
 		} else if (insn->op == IR_GUARD || insn->op == IR_GUARD_NOT) {
 			guarded = 1;
-		} else if (insn->op >= IR_START || insn->op == IR_CALL) {
+		} else if (insn->op >= IR_START) {
+			if (insn->op == IR_BEGIN && insn->op1 && !insn->op2) {
+				/* skip END */
+				ref = insn->op1;
+				insn = &ctx->ir_base[ref];
+			} else {
+				break;
+			}
+		} else if (insn->op == IR_CALL) {
 			break;
 		}
 		next = ref;
@@ -2425,7 +2424,15 @@ IR_ALWAYS_INLINE ir_ref ir_find_aliasing_vstore_i(ir_ctx *ctx, ir_ref ref, ir_re
 			}
 		} else if (insn->op == IR_GUARD || insn->op == IR_GUARD_NOT) {
 			guarded = 1;
-		} else if (insn->op >= IR_START || insn->op == IR_CALL || insn->op == IR_LOAD || insn->op == IR_STORE) {
+		} else if (insn->op >= IR_START) {
+			if (insn->op == IR_BEGIN && insn->op1 && !insn->op2) {
+				/* skip END */
+				ref = insn->op1;
+				insn = &ctx->ir_base[ref];
+			} else {
+				break;
+			}
+		} else if (insn->op == IR_CALL || insn->op == IR_LOAD || insn->op == IR_STORE) {
 			break;
 		}
 		next = ref;
@@ -2440,6 +2447,37 @@ ir_ref ir_find_aliasing_vstore(ir_ctx *ctx, ir_ref ref, ir_ref var, ir_ref val)
 }
 
 /* IR Construction API */
+static ir_ref ir_last_guard(ir_ctx *ctx)
+{
+	ir_ref ref;
+	ir_insn *insn;
+
+	IR_ASSERT(ctx->control);
+	ref = ctx->control;
+	while (1) {
+		insn = &ctx->ir_base[ref];
+		if (IR_IS_BB_START(insn->op) || insn->op == IR_GUARD || insn->op == IR_GUARD_NOT) {
+			if (insn->op == IR_START) ref = IR_UNUSED;
+			break;
+		}
+		ref = insn->op1;
+	}
+	return ref;
+}
+
+ir_ref _ir_DIV(ir_ctx *ctx, ir_type type, ir_ref op1, ir_ref op2)
+{
+	ir_ref guard = (IR_IS_TYPE_FP(type) || (IR_IS_CONST_REF(op2) && ctx->ir_base[op2].val.u64 != 0)) ?
+		IR_UNUSED : ir_last_guard(ctx);
+	return ir_fold3(ctx, IR_OPT(IR_DIV, type), op1, op2, guard);
+}
+
+ir_ref _ir_MOD(ir_ctx *ctx, ir_type type, ir_ref op1, ir_ref op2)
+{
+	ir_ref guard = (IR_IS_CONST_REF(op2) && ctx->ir_base[op2].val.u64 != 0) ?
+		IR_UNUSED : ir_last_guard(ctx);
+	return ir_fold3(ctx, IR_OPT(IR_MOD, type), op1, op2, guard);
+}
 
 ir_ref _ir_PARAM(ir_ctx *ctx, ir_type type, const char* name, ir_ref num)
 {
diff --git a/ext/opcache/jit/ir/ir.h b/ext/opcache/jit/ir/ir.h
index b0a96b511bd0..01db4ecf6b15 100644
--- a/ext/opcache/jit/ir/ir.h
+++ b/ext/opcache/jit/ir/ir.h
@@ -210,6 +210,7 @@ typedef enum _ir_type {
  * arg - argument reference CALL/TAILCALL/CARG->CARG
  * src - reference to a previous control region (IF, IF_TRUE, IF_FALSE, MERGE, LOOP_BEGIN, LOOP_END, RETURN)
  * reg - data-control dependency on region (PHI, VAR, PARAM)
+ * grd - optional data-control dependency guard (DIV, MOD)
  * ret - reference to a previous RETURN instruction (RETURN)
  * str - string: variable/argument name (VAR, PARAM, CALL, TAILCALL)
  * num - number: argument number (PARAM)
@@ -265,8 +266,8 @@ typedef enum _ir_type {
 	_(ADD,          d2C,  def, def, ___) /* addition                    */ \
 	_(SUB,          d2,   def, def, ___) /* subtraction (must be ADD+1) */ \
 	_(MUL,          d2C,  def, def, ___) /* multiplication              */ \
-	_(DIV,          d2,   def, def, ___) /* division                    */ \
-	_(MOD,          d2,   def, def, ___) /* modulo                      */ \
+	_(DIV,          d3,   def, def, grd) /* division                    */ \
+	_(MOD,          d3,   def, def, grd) /* modulo                      */ \
 	_(NEG,          d1,   def, ___, ___) /* change sign                 */ \
 	_(ABS,          d1,   def, ___, ___) /* absolute value              */ \
 	/* (LDEXP, MIN, MAX, FPMATH)                                        */ \
@@ -383,6 +384,14 @@ typedef enum _ir_type {
 	_(RETURN,       T2X1, src, def, ret) /* function return             */ \
 	_(UNREACHABLE,  T1X2, src, ___, ret) /* unreachable (tailcall, etc) */ \
 	\
+	/* inline assembler                                                 */ \
+	_(ASM,          xN,   src, def, def) /* GCC inline assembler        */ \
+	                                     /* op2 - asm template string   */ \
+	                                     /* op3 - asm constraint string */ \
+	                                     /* opN - asm input argument    */ \
+	_(ASM_OUT,      x1,   src, ___, ___) /* ASM data output projection  */ \
+	_(ASM_GOTO,     E1,   src, ___, ___) /* ASM goto (bb end after ASM) */ \
+	\
 	/* deoptimization helper                                            */ \
 	_(EXITCALL,     x2,   src, def, ___) /* save CPU regs and call op2  */ \
 
diff --git a/ext/opcache/jit/ir/ir_aarch64.dasc b/ext/opcache/jit/ir/ir_aarch64.dasc
index 5a6718b77c1c..fc4bb84f1e05 100644
--- a/ext/opcache/jit/ir/ir_aarch64.dasc
+++ b/ext/opcache/jit/ir/ir_aarch64.dasc
@@ -402,6 +402,7 @@ int ir_get_target_constraints(ir_ctx *ctx, ir_ref ref, ir_target_constraints *co
 	int flags = IR_USE_MUST_BE_IN_REG | IR_OP1_MUST_BE_IN_REG | IR_OP2_MUST_BE_IN_REG | IR_OP3_MUST_BE_IN_REG;
 	const ir_proto_t *proto;
 	const ir_call_conv_dsc *cc;
+	ir_ref next;
 
 	constraints->def_reg = IR_REG_NONE;
 	constraints->hints_count = 0;
@@ -562,11 +563,13 @@ int ir_get_target_constraints(ir_ctx *ctx, ir_ref ref, ir_target_constraints *co
 				constraints->tmp_regs[0] = IR_TMP_REG(1, IR_ADDR, IR_LOAD_SUB_REF, IR_DEF_SUB_REF);
 				n = 1;
 			}
-			if (IR_IS_CONST_REF(insn->op2) && insn->op1 != insn->op2) {
-				insn = &ctx->ir_base[insn->op2];
-				if (IR_IS_SYM_CONST(insn->op) || !aarch64_may_encode_imm12(insn->val.u64)) {
-					constraints->tmp_regs[n] = IR_TMP_REG(2, insn->type, IR_LOAD_SUB_REF, IR_DEF_SUB_REF);
-					n++;
+			if (IR_IS_CONST_REF(insn->op2)) {
+				if (insn->op1 != insn->op2) {
+					insn = &ctx->ir_base[insn->op2];
+					if (IR_IS_SYM_CONST(insn->op) || !aarch64_may_encode_imm12(insn->val.u64)) {
+						constraints->tmp_regs[n] = IR_TMP_REG(2, insn->type, IR_LOAD_SUB_REF, IR_DEF_SUB_REF);
+						n++;
+					}
 				}
 			} else if (ir_rule(ctx, insn->op2) == IR_STATIC_ALLOCA) {
 				constraints->tmp_regs[n] = IR_TMP_REG(2, IR_ADDR, IR_LOAD_SUB_REF, IR_DEF_SUB_REF);
@@ -720,7 +723,7 @@ get_arg_hints:
 			break;
 		case IR_PARAM:
 			constraints->def_reg = ir_get_param_reg(ctx, ref);
-			flags = 0;
+			flags = (constraints->def_reg != IR_REG_NONE) ? IR_USE_SHOULD_BE_IN_REG : 0;
 			break;
 		case IR_PI:
 		case IR_PHI:
@@ -751,6 +754,10 @@ get_arg_hints:
 			break;
 		case IR_SNAPSHOT:
 			flags = 0;
+			next = ir_next_control(ctx, ref);
+			if (ctx->ir_base[next].op == IR_GUARD || ctx->ir_base[next].op == IR_GUARD_NOT) {
+				flags = IR_EXTEND_INPUTS_TO_NEXT;
+			}
 			break;
 		case IR_VA_START:
 			flags = IR_OP2_MUST_BE_IN_REG;
@@ -1199,10 +1206,6 @@ binop_fp:
 			if (!IR_IS_CONST_REF(insn->op2) && (ctx->use_lists[insn->op2].count == 1 || all_usages_are_fusable(ctx, insn->op2))) {
 				op2_insn = &ctx->ir_base[insn->op2];
 				if (op2_insn->op >= IR_EQ && op2_insn->op <= IR_UNORDERED) {
-					// TODO: register allocator may clobber operands of CMP before they are used in the GUARD_CMP
-//???				 && (insn->op2 == ref - 1 ||
-//???				     (insn->op2 == ctx->prev_ref[ref] - 1
-//???				   && ctx->ir_base[ctx->prev_ref[ref]].op == IR_SNAPSHOT))) {
 					if (IR_IS_TYPE_INT(ctx->ir_base[op2_insn->op1].type)) {
 						ctx->rules[insn->op2] = IR_FUSED | IR_CMP_INT;
 						return IR_GUARD_CMP_INT;
@@ -1265,6 +1268,12 @@ binop_fp:
 			return IR_FUSED | IR_ARGVAL;
 		case IR_NOP:
 			return IR_SKIPPED | IR_NOP;
+		case IR_ASM:
+		case IR_ASM_OUT:
+		case IR_ASM_GOTO:
+			fprintf(stderr, "ERROR: IR_ASM is not implemented yet\n");
+			exit(1);
+			return IR_SKIPPED | IR_NOP;
 		default:
 			break;
 	}
@@ -4996,7 +5005,8 @@ static void ir_emit_switch(ir_ctx *ctx, uint32_t b, ir_ref def, ir_insn *insn)
 						void *addr = ir_jmp_addr(ctx, insn, &ctx->ir_base[insn->op2]);
 
 						|	.addr &addr
-						if (ctx->ir_base[bb->start].op != IR_CASE_DEFAULT) {
+						if (ctx->ir_base[bb->start].op1 == def
+						 && ctx->ir_base[bb->start].op != IR_CASE_DEFAULT) {
 							bb->flags |= IR_BB_EMPTY;
 						}
 						continue;
diff --git a/ext/opcache/jit/ir/ir_builder.h b/ext/opcache/jit/ir/ir_builder.h
index 03add7590655..9492945b1362 100644
--- a/ext/opcache/jit/ir/ir_builder.h
+++ b/ext/opcache/jit/ir/ir_builder.h
@@ -118,31 +118,31 @@ extern "C" {
 #define ir_MUL_D(_op1, _op2)              ir_BINARY_OP_D(IR_MUL, (_op1), (_op2))
 #define ir_MUL_F(_op1, _op2)              ir_BINARY_OP_F(IR_MUL, (_op1), (_op2))
 
-#define ir_DIV(_type, _op1, _op2)         ir_BINARY_OP(IR_DIV, (_type), (_op1), (_op2))
-#define ir_DIV_U8(_op1, _op2)             ir_BINARY_OP_U8(IR_DIV, (_op1), (_op2))
-#define ir_DIV_U16(_op1, _op2)            ir_BINARY_OP_U16(IR_DIV, (_op1), (_op2))
-#define ir_DIV_U32(_op1, _op2)            ir_BINARY_OP_U32(IR_DIV, (_op1), (_op2))
-#define ir_DIV_U64(_op1, _op2)            ir_BINARY_OP_U64(IR_DIV, (_op1), (_op2))
-#define ir_DIV_A(_op1, _op2)              ir_BINARY_OP_A(IR_DIV, (_op1), (_op2))
-#define ir_DIV_C(_op1, _op2)              ir_BINARY_OP_C(IR_DIV, (_op1), (_op2))
-#define ir_DIV_I8(_op1, _op2)             ir_BINARY_OP_I8(IR_DIV, (_op1), (_op2))
-#define ir_DIV_I16(_op1, _op2)            ir_BINARY_OP_I16(IR_DIV, (_op1), (_op2))
-#define ir_DIV_I32(_op1, _op2)            ir_BINARY_OP_I32(IR_DIV, (_op1), (_op2))
-#define ir_DIV_I64(_op1, _op2)            ir_BINARY_OP_I64(IR_DIV, (_op1), (_op2))
+#define ir_DIV(_type, _op1, _op2)         _ir_DIV(_ir_CTX, (_type), (_op1), (_op2))
+#define ir_DIV_U8(_op1, _op2)             ir_DIV(IR_U8, (_op1), (_op2))
+#define ir_DIV_U16(_op1, _op2)            ir_DIV(IR_U16, (_op1), (_op2))
+#define ir_DIV_U32(_op1, _op2)            ir_DIV(IR_U32, (_op1), (_op2))
+#define ir_DIV_U64(_op1, _op2)            ir_DIV(IR_U64, (_op1), (_op2))
+#define ir_DIV_A(_op1, _op2)              ir_DIV(IR_ADDR, (_op1), (_op2))
+#define ir_DIV_C(_op1, _op2)              ir_DIV(IR_CHAR, (_op1), (_op2))
+#define ir_DIV_I8(_op1, _op2)             ir_DIV(IR_I8, (_op1), (_op2))
+#define ir_DIV_I16(_op1, _op2)            ir_DIV(IR_I16, (_op1), (_op2))
+#define ir_DIV_I32(_op1, _op2)            ir_DIV(IR_I32, (_op1), (_op2))
+#define ir_DIV_I64(_op1, _op2)            ir_DIV(IR_I64, (_op1), (_op2))
 #define ir_DIV_D(_op1, _op2)              ir_BINARY_OP_D(IR_DIV, (_op1), (_op2))
 #define ir_DIV_F(_op1, _op2)              ir_BINARY_OP_F(IR_DIV, (_op1), (_op2))
 
-#define ir_MOD(_type, _op1, _op2)         ir_BINARY_OP(IR_MOD, (_type), (_op1), (_op2))
-#define ir_MOD_U8(_op1, _op2)             ir_BINARY_OP_U8(IR_MOD, (_op1), (_op2))
-#define ir_MOD_U16(_op1, _op2)            ir_BINARY_OP_U16(IR_MOD, (_op1), (_op2))
-#define ir_MOD_U32(_op1, _op2)            ir_BINARY_OP_U32(IR_MOD, (_op1), (_op2))
-#define ir_MOD_U64(_op1, _op2)            ir_BINARY_OP_U64(IR_MOD, (_op1), (_op2))
-#define ir_MOD_A(_op1, _op2)              ir_BINARY_OP_A(IR_MOD, (_op1), (_op2))
-#define ir_MOD_C(_op1, _op2)              ir_BINARY_OP_C(IR_MOD, (_op1), (_op2))
-#define ir_MOD_I8(_op1, _op2)             ir_BINARY_OP_I8(IR_MOD, (_op1), (_op2))
-#define ir_MOD_I16(_op1, _op2)            ir_BINARY_OP_I16(IR_MOD, (_op1), (_op2))
-#define ir_MOD_I32(_op1, _op2)            ir_BINARY_OP_I32(IR_MOD, (_op1), (_op2))
-#define ir_MOD_I64(_op1, _op2)            ir_BINARY_OP_I64(IR_MOD, (_op1), (_op2))
+#define ir_MOD(_type, _op1, _op2)         _ir_MOD(_ir_CTX, (_type), (_op1), (_op2))
+#define ir_MOD_U8(_op1, _op2)             ir_MOD(IR_U8, (_op1), (_op2))
+#define ir_MOD_U16(_op1, _op2)            ir_MOD(IR_U16, (_op1), (_op2))
+#define ir_MOD_U32(_op1, _op2)            ir_MOD(IR_U32, (_op1), (_op2))
+#define ir_MOD_U64(_op1, _op2)            ir_MOD(IR_U64, (_op1), (_op2))
+#define ir_MOD_A(_op1, _op2)              ir_MOD(IR_ADDR, (_op1), (_op2))
+#define ir_MOD_C(_op1, _op2)              ir_MOD(IR_CHAR, (_op1), (_op2))
+#define ir_MOD_I8(_op1, _op2)             ir_MOD(IR_I8, (_op1), (_op2))
+#define ir_MOD_I16(_op1, _op2)            ir_MOD(IR_I16, (_op1), (_op2))
+#define ir_MOD_I32(_op1, _op2)            ir_MOD(IR_I32, (_op1), (_op2))
+#define ir_MOD_I64(_op1, _op2)            ir_MOD(IR_I64, (_op1), (_op2))
 
 #define ir_NEG(_type, _op1)               ir_UNARY_OP(IR_NEG, (_type), (_op1))
 #define ir_NEG_C(_op1)                    ir_UNARY_OP_C(IR_NEG, (_op1))
@@ -633,6 +633,8 @@ extern "C" {
 #define ir_MERGE_WITH_EMPTY_TRUE(_if)     do {ir_ref end = ir_END(); ir_IF_TRUE(_if); ir_MERGE_2(end, ir_END());} while (0)
 #define ir_MERGE_WITH_EMPTY_FALSE(_if)    do {ir_ref end = ir_END(); ir_IF_FALSE(_if); ir_MERGE_2(end, ir_END());} while (0)
 
+ir_ref _ir_DIV(ir_ctx *ctx, ir_type type, ir_ref op1, ir_ref op2);
+ir_ref _ir_MOD(ir_ctx *ctx, ir_type type, ir_ref op1, ir_ref op2);
 ir_ref _ir_ADD_OFFSET(ir_ctx *ctx, ir_ref addr, uintptr_t offset);
 ir_ref _ir_PHI_2(ir_ctx *ctx, ir_type type, ir_ref src1, ir_ref src2);
 ir_ref _ir_PHI_N(ir_ctx *ctx, ir_type type, ir_ref n, ir_ref *inputs);
@@ -654,7 +656,7 @@ void   _ir_TAILCALL_3(ir_ctx *ctx, ir_type type, ir_ref func, ir_ref arg1, ir_re
 void   _ir_TAILCALL_4(ir_ctx *ctx, ir_type type, ir_ref func, ir_ref arg1, ir_ref arg2, ir_ref arg3, ir_ref arg4);
 void   _ir_TAILCALL_5(ir_ctx *ctx, ir_type type, ir_ref func, ir_ref arg1, ir_ref arg2, ir_ref arg3, ir_ref arg4, ir_ref arg5);
 void   _ir_TAILCALL_6(ir_ctx *ctx, ir_type type, ir_ref func, ir_ref arg1, ir_ref arg2, ir_ref arg3, ir_ref arg4, ir_ref arg5, ir_ref arg6);
-ir_ref _ir_TAILCALL_N(ir_ctx *ctx, ir_type type, ir_ref func, uint32_t count, ir_ref *args);
+void   _ir_TAILCALL_N(ir_ctx *ctx, ir_type type, ir_ref func, uint32_t count, ir_ref *args);
 ir_ref _ir_ALLOCA(ir_ctx *ctx, ir_ref size);
 void   _ir_AFREE(ir_ctx *ctx, ir_ref size);
 ir_ref _ir_VLOAD(ir_ctx *ctx, ir_type type, ir_ref var);
diff --git a/ext/opcache/jit/ir/ir_cfg.c b/ext/opcache/jit/ir/ir_cfg.c
index 40041004c561..92042ea8cbb5 100644
--- a/ext/opcache/jit/ir/ir_cfg.c
+++ b/ext/opcache/jit/ir/ir_cfg.c
@@ -1502,6 +1502,23 @@ static bool ir_is_merged_loop_back_edge(ir_ctx *ctx, uint32_t hdr, uint32_t b)
 }
 #endif
 
+static bool ir_should_align_loop(ir_ctx *ctx, ir_chain *chains, uint32_t b, ir_block *bb)
+{
+	uint32_t n = bb->predecessors_count;
+	uint32_t *p = ctx->cfg_edges + bb->predecessors;
+
+	for (; n > 0; p++, n--) {
+		uint32_t pred = *p;
+		if (chains[pred].head) {
+			if (ir_chain_head(chains, pred) == b) return 1;
+		} else {
+			if (ir_should_align_loop(ctx, chains, b, &ctx->cfg_blocks[pred])) return 1;
+		}
+	}
+
+	return 0;
+}
+
 static int ir_schedule_blocks_bottom_up(ir_ctx *ctx)
 {
 	uint32_t max_edges_count = ctx->cfg_edges_count / 2;
@@ -1862,7 +1879,7 @@ static int ir_schedule_blocks_bottom_up(ir_ctx *ctx)
 		if (chains[b].head == b) {
 			bb = &ctx->cfg_blocks[b];
 			if (bb->loop_depth) {
-				if ((bb->flags & IR_BB_LOOP_HEADER) || ir_chain_head(chains, bb->loop_header) == b) {
+				if (ir_should_align_loop(ctx, chains, b, bb)) {
 					bb->flags |= IR_BB_ALIGN_LOOP;
 				}
 			}
diff --git a/ext/opcache/jit/ir/ir_check.c b/ext/opcache/jit/ir/ir_check.c
index ee951291b1b0..e1be7f6544df 100644
--- a/ext/opcache/jit/ir/ir_check.c
+++ b/ext/opcache/jit/ir/ir_check.c
@@ -148,6 +148,12 @@ bool ir_check(const ir_ctx *ctx)
 	bool ok = 1;
 	ir_check_ctx check_ctx;
 
+	if (ctx->insns_count < 1 || ctx->ir_base[1].op != IR_START) {
+		fprintf(stderr, "ir_base[1].op invalid opcode (%d)\n",
+			(ctx->insns_count < 1) ? IR_NOP : ctx->ir_base[0].op);
+		ok = 0;
+	}
+
 	check_ctx.arena = NULL;
 	check_ctx.use_set = NULL;
 	check_ctx.input_set = NULL;
@@ -297,6 +303,14 @@ bool ir_check(const ir_ctx *ctx)
 								ok = 0;
 							}
 							break;
+						case IR_OPND_CONTROL_GUARD:
+							if (!(ir_op_flags[use_insn->op] & IR_OP_FLAG_BB_START)
+							 && use_insn->op != IR_GUARD
+							 && use_insn->op != IR_GUARD_NOT) {
+								fprintf(stderr, "ir_base[%d].ops[%d] reference (%d) must be BB_START or GUARD\n", i, j, use);
+								ok = 0;
+							}
+							break;
 						default:
 							fprintf(stderr, "ir_base[%d].ops[%d] reference (%d) of unsupported kind\n", i, j, use);
 							ok = 0;
@@ -306,6 +320,8 @@ bool ir_check(const ir_ctx *ctx)
 				/* pass (function returns void) */
 			} else if (insn->op == IR_BEGIN && j == 1) {
 				/* pass (start of unreachable basic block) */
+			} else if (IR_OPND_KIND(flags, j) == IR_OPND_CONTROL_GUARD) {
+				/* reference to control guard is optional */
 			} else if (IR_OPND_KIND(flags, j) != IR_OPND_CONTROL_REF
 					&& (insn->op != IR_SNAPSHOT || j == 1)) {
 				fprintf(stderr, "ir_base[%d].ops[%d] missing reference (%d)\n", i, j, use);
@@ -413,6 +429,7 @@ bool ir_check(const ir_ctx *ctx)
 						}
 						break;
 					case IR_IGOTO:
+					case IR_ASM_GOTO:
 						break;
 					default:
 						/* skip data references */
@@ -464,6 +481,10 @@ bool ir_check(const ir_ctx *ctx)
 //	if (!ok) {
 //		ir_dump_codegen(ctx, stderr);
 //	}
+
+#ifndef IR_CHECK_NO_ABORT
 	IR_ASSERT(ok);
+#endif
+
 	return ok;
 }
diff --git a/ext/opcache/jit/ir/ir_dump.c b/ext/opcache/jit/ir/ir_dump.c
index 037003f021a7..3b34294d1c76 100644
--- a/ext/opcache/jit/ir/ir_dump.c
+++ b/ext/opcache/jit/ir/ir_dump.c
@@ -142,6 +142,7 @@ void ir_dump_dot(const ir_ctx *ctx, const char *name, const char *comments, FILE
 						break;
 					case IR_OPND_CONTROL_DEP:
 					case IR_OPND_CONTROL_REF:
+					case IR_OPND_CONTROL_GUARD:
 						fprintf(f, "\tn%d -> n%d [style=dashed,dir=back,weight=%d];\n", ref, i, REF_WEIGHT);
 						break;
 					case IR_OPND_LABEL_REF:
@@ -650,6 +651,7 @@ void ir_dump_codegen(const ir_ctx *ctx, FILE *f)
 						case IR_OPND_CONTROL:
 						case IR_OPND_CONTROL_DEP:
 						case IR_OPND_CONTROL_REF:
+						case IR_OPND_CONTROL_GUARD:
 							fprintf(f, "%sl_%d", first ? "(" : ", ", ref);
 							first = 0;
 							break;
@@ -680,6 +682,8 @@ void ir_dump_codegen(const ir_ctx *ctx, FILE *f)
 				} else if (opnd_kind == IR_OPND_NUM) {
 					fprintf(f, "%s%d", first ? "(" : ", ", ref);
 					first = 0;
+				} else if (opnd_kind == IR_OPND_CONTROL_GUARD) {
+					/* skip */
 				} else if (j != n &&
 						(IR_IS_REF_OPND_KIND(opnd_kind) || (opnd_kind == IR_OPND_UNUSED && p[n-j]))) {
 					fprintf(f, "%snull", first ? "(" : ", ");
diff --git a/ext/opcache/jit/ir/ir_fold.h b/ext/opcache/jit/ir/ir_fold.h
index 136bbb0e08e1..cbe049be932c 100644
--- a/ext/opcache/jit/ir/ir_fold.h
+++ b/ext/opcache/jit/ir/ir_fold.h
@@ -1679,44 +1679,6 @@ IR_FOLD(EQ(SEXT, C_I16))
 IR_FOLD(EQ(SEXT, C_I32))
 IR_FOLD(EQ(SEXT, C_I64))
 IR_FOLD(EQ(SEXT, C_ADDR))
-{
-	if (ctx->use_lists && ctx->use_lists[op1_insn->op1].count != 1) {
-		/* pass */
-	} else if (op2_insn->val.u64 == 0 && ctx->ir_base[op1_insn->op1].type == IR_BOOL) {
-		opt = IR_OPT(IR_NOT, IR_BOOL);
-		op1 = op1_insn->op1;
-		op2 = IR_UNUSED;
-		IR_FOLD_RESTART;
-	} else {
-		ir_type type = ctx->ir_base[op1_insn->op1].type;
-
-		if (op1_insn->op == IR_ZEXT
-		 && (op2_insn->val.u64 >> (ir_type_size[type] * 8)) != 0) {
-			IR_FOLD_NEXT;
-		}
-		if (IR_IS_TYPE_SIGNED(type)) {
-			switch (ir_type_size[type]) {
-				case 1:  val.i64 = op2_insn->val.i8;  break;
-				case 2:  val.i64 = op2_insn->val.i16; break;
-				case 4:  val.i64 = op2_insn->val.i32; break;
-				default: val.u64 = op2_insn->val.u64; break;
-			 }
-	    } else {
-			switch (ir_type_size[type]) {
-				case 1:  val.u64 = op2_insn->val.u8;  break;
-				case 2:  val.u64 = op2_insn->val.u16; break;
-				case 4:  val.u64 = op2_insn->val.u32; break;
-				default: val.u64 = op2_insn->val.u64; break;
-			 }
-		}
-		op1 = op1_insn->op1;
-		op2 = ir_const(ctx, val, type);
-		IR_FOLD_RESTART;
-	}
-
-	IR_FOLD_NEXT;
-}
-
 IR_FOLD(NE(ZEXT, C_U16))
 IR_FOLD(NE(ZEXT, C_U32))
 IR_FOLD(NE(ZEXT, C_U64))
@@ -1731,16 +1693,93 @@ IR_FOLD(NE(SEXT, C_I16))
 IR_FOLD(NE(SEXT, C_I32))
 IR_FOLD(NE(SEXT, C_I64))
 IR_FOLD(NE(SEXT, C_ADDR))
-{
-	if (ctx->use_lists && ctx->use_lists[op1_insn->op1].count != 1) {
+IR_FOLD(ULT(ZEXT, C_U16))
+IR_FOLD(ULT(ZEXT, C_U32))
+IR_FOLD(ULT(ZEXT, C_U64))
+IR_FOLD(ULT(ZEXT, C_I16))
+IR_FOLD(ULT(ZEXT, C_I32))
+IR_FOLD(ULT(ZEXT, C_I64))
+IR_FOLD(ULT(ZEXT, C_ADDR))
+IR_FOLD(UGE(ZEXT, C_U16))
+IR_FOLD(UGE(ZEXT, C_U32))
+IR_FOLD(UGE(ZEXT, C_U64))
+IR_FOLD(UGE(ZEXT, C_I16))
+IR_FOLD(UGE(ZEXT, C_I32))
+IR_FOLD(UGE(ZEXT, C_I64))
+IR_FOLD(UGE(ZEXT, C_ADDR))
+IR_FOLD(ULE(ZEXT, C_U16))
+IR_FOLD(ULE(ZEXT, C_U32))
+IR_FOLD(ULE(ZEXT, C_U64))
+IR_FOLD(ULE(ZEXT, C_I16))
+IR_FOLD(ULE(ZEXT, C_I32))
+IR_FOLD(ULE(ZEXT, C_I64))
+IR_FOLD(ULE(ZEXT, C_ADDR))
+IR_FOLD(UGT(ZEXT, C_U16))
+IR_FOLD(UGT(ZEXT, C_U32))
+IR_FOLD(UGT(ZEXT, C_U64))
+IR_FOLD(UGT(ZEXT, C_I16))
+IR_FOLD(UGT(ZEXT, C_I32))
+IR_FOLD(UGT(ZEXT, C_I64))
+IR_FOLD(UGT(ZEXT, C_ADDR))
+IR_FOLD(LT(SEXT, C_U16))
+IR_FOLD(LT(SEXT, C_U32))
+IR_FOLD(LT(SEXT, C_U64))
+IR_FOLD(LT(SEXT, C_I16))
+IR_FOLD(LT(SEXT, C_I32))
+IR_FOLD(LT(SEXT, C_I64))
+IR_FOLD(LT(SEXT, C_ADDR))
+IR_FOLD(GE(SEXT, C_U16))
+IR_FOLD(GE(SEXT, C_U32))
+IR_FOLD(GE(SEXT, C_U64))
+IR_FOLD(GE(SEXT, C_I16))
+IR_FOLD(GE(SEXT, C_I32))
+IR_FOLD(GE(SEXT, C_I64))
+IR_FOLD(GE(SEXT, C_ADDR))
+IR_FOLD(LE(SEXT, C_U16))
+IR_FOLD(LE(SEXT, C_U32))
+IR_FOLD(LE(SEXT, C_U64))
+IR_FOLD(LE(SEXT, C_I16))
+IR_FOLD(LE(SEXT, C_I32))
+IR_FOLD(LE(SEXT, C_I64))
+IR_FOLD(LE(SEXT, C_ADDR))
+IR_FOLD(GT(SEXT, C_U16))
+IR_FOLD(GT(SEXT, C_U32))
+IR_FOLD(GT(SEXT, C_U64))
+IR_FOLD(GT(SEXT, C_I16))
+IR_FOLD(GT(SEXT, C_I32))
+IR_FOLD(GT(SEXT, C_I64))
+IR_FOLD(GT(SEXT, C_ADDR))
+{
+	if (ctx->use_lists && ctx->use_lists[op1].count != 1) {
 		/* pass */
-	} else if (op2_insn->val.u64 == 0 && ctx->ir_base[op1_insn->op1].type == IR_BOOL) {
-		IR_FOLD_COPY(op1_insn->op1);
 	} else {
 		ir_type type = ctx->ir_base[op1_insn->op1].type;
 
-		if (op1_insn->op == IR_ZEXT
-		 && (op2_insn->val.u64 >> (ir_type_size[type] * 8)) != 0) {
+		if (type == IR_BOOL && op2_insn->val.u64 == 0) {
+			if ((opt & IR_OPT_OP_MASK) == IR_EQ) {
+				opt = IR_OPT(IR_NOT, IR_BOOL);
+				op1 = op1_insn->op1;
+				op2 = IR_UNUSED;
+				IR_FOLD_RESTART;
+			} else if ((opt & IR_OPT_OP_MASK) == IR_NE) {
+				IR_FOLD_COPY(op1_insn->op1);
+			}
+		}
+		if ((op2_insn->val.u64 >> (ir_type_size[type] * 8)) != 0
+		 && (op1_insn->op != IR_SEXT || (op2_insn->val.i64 >> (ir_type_size[type] * 8)) != -1)) {
+			if ((opt & IR_OPT_OP_MASK) == IR_EQ
+			 || (opt & IR_OPT_OP_MASK) == IR_UGT
+			 || (opt & IR_OPT_OP_MASK) == IR_UGE) {
+				IR_FOLD_COPY(IR_FALSE);
+			} else if ((opt & IR_OPT_OP_MASK) == IR_NE
+			 || (opt & IR_OPT_OP_MASK) == IR_ULT
+			 || (opt & IR_OPT_OP_MASK) == IR_ULE) {
+				IR_FOLD_COPY(IR_TRUE);
+			} else if ((opt & IR_OPT_OP_MASK) == IR_GT || (opt & IR_OPT_OP_MASK) == IR_GE) {
+				IR_FOLD_COPY(op2_insn->val.i64 >= 0 ? IR_FALSE : IR_TRUE);
+			} else if ((opt & IR_OPT_OP_MASK) == IR_LT || (opt & IR_OPT_OP_MASK) == IR_LE) {
+				IR_FOLD_COPY(op2_insn->val.i64 >= 0 ? IR_TRUE : IR_FALSE);
+			}
 			IR_FOLD_NEXT;
 		}
 		if (IR_IS_TYPE_SIGNED(type)) {
@@ -1765,6 +1804,43 @@ IR_FOLD(NE(SEXT, C_ADDR))
 	IR_FOLD_NEXT;
 }
 
+IR_FOLD(EQ(ZEXT, ZEXT))
+IR_FOLD(NE(ZEXT, ZEXT))
+IR_FOLD(ULT(ZEXT, ZEXT))
+IR_FOLD(UGE(ZEXT, ZEXT))
+IR_FOLD(ULE(ZEXT, ZEXT))
+IR_FOLD(UGT(ZEXT, ZEXT))
+IR_FOLD(EQ(SEXT, SEXT))
+IR_FOLD(NE(SEXT, SEXT))
+IR_FOLD(LT(SEXT, SEXT))
+IR_FOLD(GE(SEXT, SEXT))
+IR_FOLD(LE(SEXT, SEXT))
+IR_FOLD(GT(SEXT, SEXT))
+{
+	if (ctx->ir_base[op1_insn->op1].type == ctx->ir_base[op2_insn->op1].type
+	 && (!ctx->use_lists || (ctx->use_lists[op1].count == 1 && ctx->use_lists[op2].count == 1))) {
+		op1 = op1_insn->op1;
+		op2 = op2_insn->op1;
+		IR_FOLD_RESTART;
+	}
+	IR_FOLD_NEXT;
+}
+
+IR_FOLD(LT(ZEXT, ZEXT))
+IR_FOLD(GE(ZEXT, ZEXT))
+IR_FOLD(LE(ZEXT, ZEXT))
+IR_FOLD(GT(ZEXT, ZEXT))
+{
+	if (ctx->ir_base[op1_insn->op1].type == ctx->ir_base[op2_insn->op1].type
+	 && (!ctx->use_lists || (ctx->use_lists[op1].count == 1 && ctx->use_lists[op2].count == 1))) {
+		op1 = op1_insn->op1;
+		op2 = op2_insn->op1;
+		opt += 4; /* LT -> ULT, ... */
+		IR_FOLD_RESTART;
+	}
+	IR_FOLD_NEXT;
+}
+
 IR_FOLD(NOT(EQ))
 IR_FOLD(NOT(NE))
 IR_FOLD(NOT(LT))
diff --git a/ext/opcache/jit/ir/ir_gcm.c b/ext/opcache/jit/ir/ir_gcm.c
index 7edb012f6172..b194eeb81770 100644
--- a/ext/opcache/jit/ir/ir_gcm.c
+++ b/ext/opcache/jit/ir/ir_gcm.c
@@ -148,7 +148,7 @@ static uint32_t ir_gcm_select_best_block(ir_ctx *ctx, ir_ref ref, uint32_t lca)
 }
 
 #if IR_GCM_SPLIT
-/* Partially Dead Code Elimination through splitting the node and sunking the clones
+/* Partially Dead Code Elimination through splitting the node and sinking the clones
  *
  * This code is based on the Benedikt Meurer's idea first implemented in V8.
  * See: https://codereview.chromium.org/899433005
@@ -309,6 +309,7 @@ static bool ir_split_partially_dead_node(ir_ctx *ctx, ir_ref ref, uint32_t b)
 	struct {
 		ir_ref   ref;
 		uint32_t block;
+		uint32_t lca;
 		uint32_t use_count;
 		uint32_t use;
 	} *clones = ir_mem_malloc(sizeof(*clones) * use_list->count);
@@ -344,8 +345,11 @@ static bool ir_split_partially_dead_node(ir_ctx *ctx, ir_ref ref, uint32_t b)
 						clone = clones_count++;
 						ir_hashtab_add(&hash, j, clone);
 						clones[clone].block = j;
+						clones[clone].lca = i;
 						clones[clone].use_count = 0;
 						clones[clone].use = (uint32_t)-1;
+					} else {
+						clones[clone].lca = ir_gcm_find_lca(ctx, clones[clone].lca, i);
 					}
 					uses[uses_count].ref = use;
 					uses[uses_count].block = i;
@@ -367,8 +371,11 @@ static bool ir_split_partially_dead_node(ir_ctx *ctx, ir_ref ref, uint32_t b)
 				clone = clones_count++;
 				ir_hashtab_add(&hash, j, clone);
 				clones[clone].block = j;
+				clones[clone].lca = i;
 				clones[clone].use_count = 0;
 				clones[clone].use = -1;
+			} else {
+				clones[clone].lca = ir_gcm_find_lca(ctx, clones[clone].lca, i);
 			}
 			uses[uses_count].ref = use;
 			uses[uses_count].block = i;
@@ -378,6 +385,42 @@ static bool ir_split_partially_dead_node(ir_ctx *ctx, ir_ref ref, uint32_t b)
 		}
 	}
 
+	/* Select best blocks to insert clones */
+	for (i = 0; i < clones_count; i++) {
+		uint32_t b0 = clones[i].block;
+		uint32_t lca = clones[i].lca;
+
+		if (b0 != lca) {
+			ir_block *bb = &ctx->cfg_blocks[lca];
+			uint32_t loop_depth = bb->loop_depth;
+
+			if (loop_depth) {
+				uint32_t b;
+				uint32_t best;
+
+				best = b = lca;
+				do {
+					b = bb->dom_parent;
+					bb = &ctx->cfg_blocks[b];
+					if (bb->loop_depth < loop_depth) {
+						if (!bb->loop_depth) {
+							best = b;
+							break;
+						}
+						loop_depth = bb->loop_depth;
+						best = b;
+					}
+				} while (b != b0);
+				lca = best;
+			}
+			clones[i].block = lca;
+		}
+	}
+
+	// TODO: instead of inserting clone into the block where the expressin is partially available,
+	//       we should insert PHI and the actual clones into the block sources where it's not available
+	//       (similar to SSAPRE)
+
 #ifdef IR_DEBUG
 	if (ctx->flags & IR_DEBUG_GCM_SPLIT) {
 		for (i = 0; i < clones_count; i++) {
@@ -408,8 +451,6 @@ static bool ir_split_partially_dead_node(ir_ctx *ctx, ir_ref ref, uint32_t b)
 	}
 
 	/* Reconstruct IR: Update DEF->USE lists, CFG mapping and etc */
-	ctx->use_lists = ir_mem_realloc(ctx->use_lists, ctx->insns_count * sizeof(ir_use_list));
-	ctx->cfg_map = ir_mem_realloc(ctx->cfg_map, ctx->insns_count * sizeof(uint32_t));
 	n = ctx->use_lists[ref].refs;
 	for (i = 0; i < clones_count; i++) {
 		clone = clones[i].ref;
@@ -428,6 +469,7 @@ static bool ir_split_partially_dead_node(ir_ctx *ctx, ir_ref ref, uint32_t b)
 
 		uint32_t u = clones[i].use;
 		while (u != (uint32_t)-1) {
+			uint32_t src = uses[u].block;
 			use = uses[u].ref;
 			ctx->use_edges[n++] = use;
 			u = uses[u].next;
@@ -437,9 +479,11 @@ static bool ir_split_partially_dead_node(ir_ctx *ctx, ir_ref ref, uint32_t b)
 				ir_ref k, l = insn->inputs_count;
 
 				if (insn->op == IR_PHI) {
-					for (k = 1; k <= l; k++) {
-						if (ir_insn_op(insn, k) == ref) {
-							j = ctx->cfg_map[ir_insn_op(&ctx->ir_base[insn->op1], k - 1)];
+					ir_insn *merge = &ctx->ir_base[insn->op1];
+					for (k = 2; k <= l; k++) {
+						j = ctx->cfg_map[ir_insn_op(merge, k - 1)];
+						if (j == src) {
+							IR_ASSERT(ir_insn_op(insn, k) == ref);
 							if (j != clones[i].block) {
 								uint32_t dom_depth = ctx->cfg_blocks[clones[i].block].dom_depth;
 								while (ctx->cfg_blocks[j].dom_depth > dom_depth) {
@@ -1169,11 +1213,11 @@ int ir_schedule(ir_ctx *ctx)
 					ir_ref use = *p;
 					ir_insn *use_insn = &ctx->ir_base[use];
 					if (!_xlat[use] && ctx->cfg_map[use]) {
-						IR_ASSERT(ctx->cfg_map[use] == b);
 						if (use_insn->op == IR_PARAM
 						 || use_insn->op == IR_VAR
 						 || use_insn->op == IR_PI
 						 || use_insn->op == IR_PHI) {
+							IR_ASSERT(ctx->cfg_map[use] == b);
 							if (_prev[use] != phis) {
 								/* remove "use" */
 								_prev[_next[use]] = _prev[use];
diff --git a/ext/opcache/jit/ir/ir_private.h b/ext/opcache/jit/ir/ir_private.h
index 96b81a0fcd72..3e1051ca3379 100644
--- a/ext/opcache/jit/ir/ir_private.h
+++ b/ext/opcache/jit/ir/ir_private.h
@@ -949,10 +949,11 @@ IR_ALWAYS_INLINE bool ir_ref_is_true(const ir_ctx *ctx, ir_ref ref)
 #define IR_OPND_LABEL_REF         0x3
 #define IR_OPND_CONTROL_DEP       0x4
 #define IR_OPND_CONTROL_REF       0x5
-#define IR_OPND_STR               0x6
-#define IR_OPND_NUM               0x7
-#define IR_OPND_PROB              0x8
-#define IR_OPND_PROTO             0x9
+#define IR_OPND_CONTROL_GUARD     0x6
+#define IR_OPND_STR               0x7
+#define IR_OPND_NUM               0x8
+#define IR_OPND_PROB              0x9
+#define IR_OPND_PROTO             0xa
 
 #define IR_OP_FLAGS(op_flags, op1_flags, op2_flags, op3_flags) \
 	((op_flags) | ((op1_flags) << 20) | ((op2_flags) << 24) | ((op3_flags) << 28))
@@ -966,7 +967,7 @@ IR_ALWAYS_INLINE bool ir_ref_is_true(const ir_ctx *ctx, ir_ref ref)
 	(((flags) >> (16 + (4 * (((i) > 3) ? 3 : (i))))) & 0xf)
 
 #define IR_IS_REF_OPND_KIND(kind) \
-	((kind) >= IR_OPND_DATA && (kind) <= IR_OPND_CONTROL_REF)
+	((kind) >= IR_OPND_DATA && (kind) <= IR_OPND_CONTROL_GUARD)
 
 IR_ALWAYS_INLINE ir_ref ir_operands_count(const ir_ctx *ctx, const ir_insn *insn)
 {
@@ -1047,7 +1048,6 @@ void ir_use_list_remove_one(ir_ctx *ctx, ir_ref def, ir_ref use);
 void ir_use_list_replace_all(ir_ctx *ctx, ir_ref def, ir_ref use, ir_ref new_use);
 void ir_use_list_replace_one(ir_ctx *ctx, ir_ref def, ir_ref use, ir_ref new_use);
 bool ir_use_list_add(ir_ctx *ctx, ir_ref def, ir_ref use);
-void ir_use_list_sort(ir_ctx *ctx, ir_ref def);
 
 IR_ALWAYS_INLINE ir_ref ir_next_control(const ir_ctx *ctx, ir_ref ref)
 {
@@ -1100,6 +1100,7 @@ void ir_iter_add_uses(ir_ctx *ctx, ir_ref ref, ir_bitqueue *worklist);
 void ir_iter_replace(ir_ctx *ctx, ir_ref ref, ir_ref new_ref, ir_bitqueue *worklist);
 void ir_iter_update_op(ir_ctx *ctx, ir_ref ref, uint32_t idx, ir_ref new_val, ir_bitqueue *worklist);
 void ir_iter_opt(ir_ctx *ctx, ir_bitqueue *worklist);
+void ir_iter_cleanup(ir_ctx *ctx);
 
 /*** IR Basic Blocks info ***/
 #define IR_IS_BB_START(op) \
@@ -1223,6 +1224,7 @@ typedef struct _ir_use_pos       ir_use_pos;
 #define IR_USE_SHOULD_BE_IN_REG          (1<<1)
 #define IR_DEF_REUSES_OP1_REG            (1<<2)
 #define IR_DEF_CONFLICTS_WITH_INPUT_REGS (1<<3)
+#define IR_EXTEND_INPUTS_TO_NEXT         (1<<4) /* used for SNAPSHOT followed by GUARD */
 
 #define IR_FUSED_USE                     (1<<6)
 #define IR_PHI_USE                       (1<<7)
diff --git a/ext/opcache/jit/ir/ir_ra.c b/ext/opcache/jit/ir/ir_ra.c
index 4a893410d499..f22e06083786 100644
--- a/ext/opcache/jit/ir/ir_ra.c
+++ b/ext/opcache/jit/ir/ir_ra.c
@@ -799,6 +799,34 @@ int ir_compute_live_ranges(ir_ctx *ctx)
 					ir_add_use(ctx, ival, 0, IR_DEF_LIVE_POS_FROM_REF(ref), IR_REG_NONE, IR_USE_SHOULD_BE_IN_REG, 0);
 					continue;
 				}
+			} else if (def_flags & IR_EXTEND_INPUTS_TO_NEXT) {
+				ir_ref next = ir_next_control(ctx, ref);
+				ir_live_pos use_pos;
+
+				IR_ASSERT(insn->op == IR_SNAPSHOT);
+				j = 2;
+				p = insn->ops + 2;
+				for (; j <= insn->inputs_count; j++, p++) {
+					ir_ref input = *p;
+					uint32_t v;
+
+					if (input > 0) {
+						v = ctx->vregs[input];
+						IR_ASSERT(v);
+						use_pos = IR_USE_LIVE_POS_FROM_REF(next);
+						if (!ir_bitset_in(live, v)) {
+							/* live.add(opd) */
+							ir_bitset_incl(live, v);
+							/* intervals[opd].addRange(b.from, op.id) */
+							ival = ir_add_live_range(ctx, v, IR_START_LIVE_POS_FROM_REF(bb->start), use_pos);
+						} else {
+							ival = ctx->live_intervals[v];
+						}
+						use_pos = IR_USE_LIVE_POS_FROM_REF(ref);
+						ir_add_use(ctx, ival, j, use_pos, IR_REG_NONE, 0, IR_UNUSED);
+					}
+				}
+				continue;
 			}
 
 			IR_ASSERT(insn->op != IR_PHI && (!ctx->rules || !(ctx->rules[ref] & (IR_FUSED|IR_SKIPPED))));
@@ -1418,6 +1446,34 @@ int ir_compute_live_ranges(ir_ctx *ctx)
 					ir_add_use(ctx, ival, 0, IR_DEF_LIVE_POS_FROM_REF(ref), IR_REG_NONE, IR_USE_SHOULD_BE_IN_REG, 0);
 					continue;
 				}
+			} else if (def_flags & IR_EXTEND_INPUTS_TO_NEXT) {
+				ir_ref next = ir_next_control(ctx, ref);
+				ir_live_pos use_pos;
+
+				IR_ASSERT(insn->op == IR_SNAPSHOT);
+				j = 2;
+				p = insn->ops + 2;
+				for (; j <= insn->inputs_count; j++, p++) {
+					ir_ref input = *p;
+					uint32_t v;
+
+					if (input > 0) {
+						v = ctx->vregs[input];
+						IR_ASSERT(v);
+						use_pos = IR_USE_LIVE_POS_FROM_REF(next);
+						if (!IS_LIVE_IN_BLOCK(v, b)) {
+							/* live.add(opd) */
+							SET_LIVE_IN_BLOCK(v, b);
+							/* intervals[opd].addRange(b.from, op.id) */
+							ival = ir_add_live_range(ctx, v, IR_START_LIVE_POS_FROM_REF(bb->start), use_pos);
+						} else {
+							ival = ctx->live_intervals[v];
+						}
+						use_pos = IR_USE_LIVE_POS_FROM_REF(ref);
+						ir_add_use(ctx, ival, j, use_pos, IR_REG_NONE, 0, IR_UNUSED);
+					}
+				}
+				continue;
 			}
 
 			IR_ASSERT(insn->op != IR_PHI && (!ctx->rules || !(ctx->rules[ref] & (IR_FUSED|IR_SKIPPED))));
@@ -3004,6 +3060,7 @@ static ir_reg ir_allocate_blocked_reg(ir_ctx *ctx, ir_live_interval *ival, ir_li
 {
 	ir_live_pos nextUsePos[IR_REG_NUM];
 	ir_live_pos blockPos[IR_REG_NUM];
+	int score, best_score, scores[IR_REG_NUM];
 	int i, reg;
 	ir_live_pos pos, next_use_pos;
 	ir_live_interval *other, *prev;
@@ -3032,6 +3089,7 @@ static ir_reg ir_allocate_blocked_reg(ir_ctx *ctx, ir_live_interval *ival, ir_li
 		for (i = IR_REG_FP_FIRST; i <= IR_REG_FP_LAST; i++) {
 			nextUsePos[i] = 0x7fffffff;
 			blockPos[i] = 0x7fffffff;
+			scores[i] = 0;
 		}
 	} else {
 		available = IR_REGSET_GP;
@@ -3050,6 +3108,7 @@ static ir_reg ir_allocate_blocked_reg(ir_ctx *ctx, ir_live_interval *ival, ir_li
 		for (i = IR_REG_GP_FIRST; i <= IR_REG_GP_LAST; i++) {
 			nextUsePos[i] = 0x7fffffff;
 			blockPos[i] = 0x7fffffff;
+			scores[i] = 0;
 		}
 	}
 
@@ -3080,6 +3139,8 @@ static ir_reg ir_allocate_blocked_reg(ir_ctx *ctx, ir_live_interval *ival, ir_li
 					IR_USE_MUST_BE_IN_REG | IR_USE_SHOULD_BE_IN_REG);
 				if (pos < nextUsePos[reg]) {
 					nextUsePos[reg] = pos;
+						/* Prefer splitting interval that was already splitted before */
+					scores[reg] = (other->flags & IR_LIVE_INTERVAL_SPLIT_CHILD) ? 1 : 0;
 				}
 			}
 		}
@@ -3100,6 +3161,7 @@ static ir_reg ir_allocate_blocked_reg(ir_ctx *ctx, ir_live_interval *ival, ir_li
 				IR_REGSET_FOREACH(regset, reg) {
 					if (overlap < nextUsePos[reg]) {
 						nextUsePos[reg] = overlap;
+						scores[reg] = 0;
 					}
 					if (overlap < blockPos[reg]) {
 						blockPos[reg] = overlap;
@@ -3113,6 +3175,7 @@ static ir_reg ir_allocate_blocked_reg(ir_ctx *ctx, ir_live_interval *ival, ir_li
 				if (other->flags & (IR_LIVE_INTERVAL_FIXED|IR_LIVE_INTERVAL_TEMP)) {
 					if (overlap < nextUsePos[reg]) {
 						nextUsePos[reg] = overlap;
+						scores[reg] = 0;
 					}
 					if (overlap < blockPos[reg]) {
 						blockPos[reg] = overlap;
@@ -3122,6 +3185,8 @@ static ir_reg ir_allocate_blocked_reg(ir_ctx *ctx, ir_live_interval *ival, ir_li
 						IR_USE_MUST_BE_IN_REG | IR_USE_SHOULD_BE_IN_REG);
 					if (pos < nextUsePos[reg]) {
 						nextUsePos[reg] = pos;
+						/* Prefer splitting interval that was already splitted before */
+						scores[reg] = (other->flags & IR_LIVE_INTERVAL_SPLIT_CHILD) ? 1 : 0;
 					}
 				}
 			}
@@ -3141,12 +3206,17 @@ static ir_reg ir_allocate_blocked_reg(ir_ctx *ctx, ir_live_interval *ival, ir_li
 
 	/* reg = register with highest nextUsePos */
 	pos = nextUsePos[reg];
+	best_score = (scores[reg] << 28) + nextUsePos[reg];
 	tmp_regset = available;
 	IR_REGSET_EXCL(tmp_regset, reg);
 	IR_REGSET_FOREACH(tmp_regset, i) {
 		if (nextUsePos[i] > pos) {
 			pos = nextUsePos[i];
+		}
+		score = (scores[i] << 28) + nextUsePos[i];
+		if (score > best_score) {
 			reg = i;
+			best_score = score;
 		}
 	} IR_REGSET_FOREACH_END();
 
@@ -3190,6 +3260,7 @@ static ir_reg ir_allocate_blocked_reg(ir_ctx *ctx, ir_live_interval *ival, ir_li
 			return IR_REG_NONE;
 		}
 		if (split_pos >= blockPos[reg]) {
+try_next_available_register:
 			IR_REGSET_EXCL(available, reg);
 			if (IR_REGSET_IS_EMPTY(available)) {
 				fprintf(stderr, "LSRA Internal Error: Unsolvable conflict. Allocation is not possible\n");
@@ -3222,31 +3293,33 @@ static ir_reg ir_allocate_blocked_reg(ir_ctx *ctx, ir_live_interval *ival, ir_li
 				IR_LOG_LSRA_CONFLICT("      ---- Conflict with active", other, overlap);
 
 				split_pos = ir_last_use_pos_before(other, ival->range.start, IR_USE_MUST_BE_IN_REG | IR_USE_SHOULD_BE_IN_REG);
-				if (split_pos == 0) {
-					split_pos = ival->range.start;
-				}
-				split_pos = ir_find_optimal_split_position(ctx, other, split_pos, ival->range.start, 1);
-				if (split_pos > other->range.start) {
-					child = ir_split_interval_at(ctx, other, split_pos);
-					if (prev) {
-						prev->list_next = other->list_next;
+				if (split_pos) {
+					split_pos = ir_find_optimal_split_position(ctx, other, split_pos, ival->range.start, 1);
+					if (split_pos > other->range.start) {
+						child = ir_split_interval_at(ctx, other, split_pos);
+						if (prev) {
+							prev->list_next = other->list_next;
+						} else {
+							*active = other->list_next;
+						}
+						IR_LOG_LSRA("      ---- Finish", other, "");
 					} else {
-						*active = other->list_next;
+						goto try_next_available_register;
 					}
-					IR_LOG_LSRA("      ---- Finish", other, "");
 				} else {
 					child = other;
-					other->reg = IR_REG_NONE;
-					if (prev) {
-						prev->list_next = other->list_next;
-					} else {
-						*active = other->list_next;
-					}
-					IR_LOG_LSRA("      ---- Spill and Finish", other, " (it must not be in reg)");
 				}
 
 				split_pos = ir_first_use_pos_after(child, ival->range.start, IR_USE_MUST_BE_IN_REG | IR_USE_SHOULD_BE_IN_REG) - 1; // TODO: ???
 				if (split_pos > child->range.start && split_pos < child->end) {
+					if (child == other) {
+						other->reg = IR_REG_NONE;
+						if (prev) {
+							prev->list_next = other->list_next;
+						} else {
+							*active = other->list_next;
+						}
+					}
 					ir_live_pos opt_split_pos = ir_find_optimal_split_position(ctx, child, ival->range.start, split_pos, 1);
 					if (opt_split_pos > child->range.start) {
 						split_pos = opt_split_pos;
@@ -3259,6 +3332,8 @@ static ir_reg ir_allocate_blocked_reg(ir_ctx *ctx, ir_live_interval *ival, ir_li
 					// TODO: this may cause endless loop
 					ir_add_to_unhandled(unhandled, child);
 					IR_LOG_LSRA("      ---- Queue", child, "");
+				} else {
+					goto try_next_available_register;
 				}
 			}
 			break;
diff --git a/ext/opcache/jit/ir/ir_save.c b/ext/opcache/jit/ir/ir_save.c
index 3f1d943c6870..8b3f3b5c6b5d 100644
--- a/ext/opcache/jit/ir/ir_save.c
+++ b/ext/opcache/jit/ir/ir_save.c
@@ -283,7 +283,7 @@ void ir_save(const ir_ctx *ctx, uint32_t save_flags, FILE *f)
 		n = ir_operands_count(ctx, insn);
 		if ((insn->op == IR_MERGE || insn->op == IR_LOOP_BEGIN) && n != 2) {
 			fprintf(f, "/%d", n);
-		} else if ((insn->op == IR_CALL || insn->op == IR_TAILCALL) && n != 2) {
+		} else if ((insn->op == IR_CALL || insn->op == IR_TAILCALL || insn->op == IR_ASM) && n != 2) {
 			fprintf(f, "/%d", n - 2);
 		} else if (insn->op == IR_PHI && n != 3) {
 			fprintf(f, "/%d", n - 1);
@@ -321,6 +321,7 @@ void ir_save(const ir_ctx *ctx, uint32_t save_flags, FILE *f)
 					case IR_OPND_CONTROL:
 					case IR_OPND_CONTROL_DEP:
 					case IR_OPND_CONTROL_REF:
+					case IR_OPND_CONTROL_GUARD:
 						fprintf(f, "%sl_%d", first ? "(" : ", ", ref);
 						first = 0;
 						break;
@@ -352,6 +353,8 @@ void ir_save(const ir_ctx *ctx, uint32_t save_flags, FILE *f)
 			} else if (opnd_kind == IR_OPND_NUM) {
 				fprintf(f, "%s%d", first ? "(" : ", ", ref);
 				first = 0;
+			} else if (opnd_kind == IR_OPND_CONTROL_GUARD) {
+				/* skip */
 			} else if (j != n &&
 					(IR_IS_REF_OPND_KIND(opnd_kind) || (opnd_kind == IR_OPND_UNUSED && p[n-j]))) {
 				fprintf(f, "%snull", first ? "(" : ", ");
diff --git a/ext/opcache/jit/ir/ir_sccp.c b/ext/opcache/jit/ir/ir_sccp.c
index 6478ec697562..f2b8616e2afa 100644
--- a/ext/opcache/jit/ir/ir_sccp.c
+++ b/ext/opcache/jit/ir/ir_sccp.c
@@ -603,12 +603,16 @@ static IR_NEVER_INLINE void ir_sccp_analyze(const ir_ctx *ctx, ir_sccp_val *_val
 				bool may_benefit = 0;
 				bool has_top = 0;
 
-				if (_values[i].op != IR_TOP) {
+				if (_values[i].op != IR_TOP || insn->op == IR_COPY) {
 					may_benefit = 1;
 				}
 
 				IR_ASSERT(!IR_OP_HAS_VAR_INPUTS(flags));
 				n = IR_INPUT_EDGES_COUNT(flags);
+				if (insn->op == IR_DIV || insn->op == IR_MOD) {
+					/* skip data-control guard edge */
+					n--;
+				}
 				for (p = insn->ops + 1; n > 0; p++, n--) {
 					ir_ref input = *p;
 					if (input > 0) {
@@ -987,6 +991,7 @@ static void ir_sccp_remove_if(ir_ctx *ctx, const ir_sccp_val *_values, ir_ref re
 		insn->optx = IR_OPTX(IR_END, IR_VOID, 1);
 		next_insn = &ctx->ir_base[dst];
 		next_insn->op = IR_BEGIN;
+		next_insn->op2 = IR_UNUSED;
 	}
 }
 
@@ -1418,7 +1423,7 @@ static ir_ref ir_iter_find_cse(const ir_ctx *ctx, ir_ref ref, uint32_t opt, ir_r
 		if (!IR_IS_CONST_REF(op2) && (!use_list || use_list->count > ctx->use_lists[op2].count)) {
 			use_list = &ctx->use_lists[op2];
 		}
-		if (!IR_IS_CONST_REF(op3) && (!use_list || use_list->count > ctx->use_lists[op3].count)) {
+		if (op3 > 0 && (!use_list || use_list->count > ctx->use_lists[op3].count)) {
 			use_list = &ctx->use_lists[op3];
 		}
 		if (use_list) {
@@ -1906,6 +1911,46 @@ static ir_ref ir_promote_i2i(ir_ctx *ctx, ir_type type, ir_ref ref, ir_ref use,
 					insn->op3 = ir_promote_i2i(ctx, type, insn->op3, ref, worklist);
 				}
 				insn->type = type;
+				if (IR_IS_TYPE_SIGNED(type)) {
+					ir_insn *cond = &ctx->ir_base[insn->op1];
+					if (cond->op == IR_LT || cond->op == IR_LE || cond->op == IR_GT || cond->op == IR_GE) {
+						if (cond->op1 == insn->op2 && cond->op2 == insn->op3) {
+							insn->op = (cond->op == IR_LT || cond->op == IR_LE) ? IR_MIN : IR_MAX;
+							ir_use_list_remove_one(ctx, insn->op1, ref);
+							ir_bitqueue_add(worklist, insn->op1);
+							insn->op1 = insn->op2;
+							insn->op2 = insn->op3;
+							insn->op3 = IR_UNUSED;
+						} else if (cond->op1 == insn->op3 && cond->op2 == insn->op1) {
+							insn->op = (cond->op == IR_LT || cond->op == IR_LE) ? IR_MAX : IR_MIN;
+							ir_use_list_remove_one(ctx, insn->op1, ref);
+							ir_bitqueue_add(worklist, insn->op1);
+							insn->op1 = insn->op2;
+							insn->op2 = insn->op3;
+							insn->op3 = IR_UNUSED;
+						}
+					}
+				} else {
+					IR_ASSERT(IR_IS_TYPE_UNSIGNED(type));
+					ir_insn *cond = &ctx->ir_base[insn->op1];
+					if (cond->op == IR_ULT || cond->op == IR_ULE || cond->op == IR_UGT || cond->op == IR_UGE) {
+						if (cond->op1 == insn->op2 && cond->op2 == insn->op3) {
+							insn->op = (cond->op == IR_ULT || cond->op == IR_ULE) ? IR_MIN : IR_MAX;
+							ir_use_list_remove_one(ctx, insn->op1, ref);
+							ir_bitqueue_add(worklist, insn->op1);
+							insn->op1 = insn->op2;
+							insn->op2 = insn->op3;
+							insn->op3 = IR_UNUSED;
+						} else if (cond->op1 == insn->op3 && cond->op2 == insn->op1) {
+							insn->op = (cond->op == IR_ULT || cond->op == IR_ULE) ? IR_MAX : IR_MIN;
+							ir_use_list_remove_one(ctx, insn->op1, ref);
+							ir_bitqueue_add(worklist, insn->op1);
+							insn->op1 = insn->op2;
+							insn->op2 = insn->op3;
+							insn->op3 = IR_UNUSED;
+						}
+					}
+				}
 				return ref;
 			case IR_PHI:
 				for (p = insn->ops + 2, n = insn->inputs_count - 1; n > 0; p++, n--) {
@@ -1994,7 +2039,7 @@ static uint32_t _ir_estimated_control(const ir_ctx *ctx, ir_ref val, ir_ref loop
 	const ir_ref *p;
 	ir_ref n, input, result, ctrl;
 
-	if (IR_IS_CONST_REF(val)) {
+	if (val <= 0) { /* constant or IR_UNUSED */
 		return 1; /* IR_START */
 	}
 
@@ -2128,14 +2173,14 @@ static bool ir_try_promote_induction_var_ext(ir_ctx *ctx, ir_ref ext_ref, ir_ref
 				const ir_insn *use_insn = &ctx->ir_base[use];
 
 				if (use_insn->op >= IR_EQ && use_insn->op <= IR_UGT) {
-					if (use_insn->op1 == phi_ref) {
+					if (use_insn->op1 == op_ref) {
 						if (IR_IS_TYPE_SIGNED(type) != IR_IS_TYPE_SIGNED(ctx->ir_base[use_insn->op2].type)) {
 							return 0;
 						}
 						if (ir_is_cheaper_ext(ctx, use_insn->op2, ctx->ir_base[phi_ref].op1, ext_ref, op)) {
 							continue;
 					    }
-					} else if (use_insn->op2 == phi_ref) {
+					} else if (use_insn->op2 == op_ref) {
 						if (IR_IS_TYPE_SIGNED(type) != IR_IS_TYPE_SIGNED(ctx->ir_base[use_insn->op1].type)) {
 							return 0;
 						}
@@ -2520,6 +2565,52 @@ static bool ir_is_zero(const ir_ctx *ctx, ir_ref ref)
 		&& ctx->ir_base[ref].val.u32 == 0;
 }
 
+static bool ir_fix_min_max_const(ir_ctx *ctx, ir_insn *cond, ir_ref ref)
+{
+	if (cond->op == IR_ULE) {
+		/* (x <= 3 ? 4 : x) => (x < 4 ? 4 : x) =>  max(x, 4) */
+		/* (x <= 3 ? x : 4) => (x < 4 ? x : 4) =>  min(x, 4) */
+		if (!IR_IS_SYM_CONST(ctx->ir_base[cond->op2].op)
+		 && !IR_IS_SYM_CONST(ctx->ir_base[ref].op)
+		 && ctx->ir_base[cond->op2].val.u64 == ctx->ir_base[ref].val.u64 - 1
+		 && ctx->ir_base[cond->op2].type == ctx->ir_base[ref].type) {
+			cond->op2 = ref;
+			return 1;
+		}
+	} else if (cond->op == IR_UGE) {
+		/* (x >= 3 ? 2 : x) => (x > 2 ? 2 : x) =>  min(x, 2) */
+		/* (x >= 3 ? x : 2) => (x > 2 ? x : 2) =>  max(x, 2) */
+		if (!IR_IS_SYM_CONST(ctx->ir_base[cond->op2].op)
+		 && !IR_IS_SYM_CONST(ctx->ir_base[ref].op)
+		 && ctx->ir_base[cond->op2].val.u64 == ctx->ir_base[ref].val.u64 + 1
+		 && ctx->ir_base[cond->op2].type == ctx->ir_base[ref].type) {
+			cond->op2 = ref;
+			return 1;
+		}
+	} else if (cond->op == IR_LE) {
+		/* (x <= 3 ? 4 : x) => (x < 4 ? 4 : x) =>  max(x, 4) */
+		/* (x <= 3 ? x : 4) => (x < 4 ? x : 4) =>  min(x, 4) */
+		if (!IR_IS_SYM_CONST(ctx->ir_base[cond->op2].op)
+		 && !IR_IS_SYM_CONST(ctx->ir_base[ref].op)
+		 && ctx->ir_base[cond->op2].val.u64 == ctx->ir_base[ref].val.u64 - 1
+		 && ctx->ir_base[cond->op2].type == ctx->ir_base[ref].type) {
+			cond->op2 = ref;
+			return 1;
+		}
+	} else if (cond->op == IR_GE) {
+		/* (x >= 3 ? 2 : x) => (x > 2 ? 2 : x) =>  min(x, 2) */
+		/* (x >= 3 ? x : 2) => (x > 2 ? x : 2) =>  max(x, 2) */
+		if (!IR_IS_SYM_CONST(ctx->ir_base[cond->op2].op)
+		 && !IR_IS_SYM_CONST(ctx->ir_base[ref].op)
+		 && ctx->ir_base[cond->op2].val.i64 == ctx->ir_base[ref].val.i64 + 1
+		 && ctx->ir_base[cond->op2].type == ctx->ir_base[ref].type) {
+			cond->op2 = ref;
+			return 1;
+		}
+	}
+	return 0;
+}
+
 static bool ir_optimize_phi(ir_ctx *ctx, ir_ref merge_ref, ir_insn *merge, ir_ref ref, ir_insn *insn, ir_bitqueue *worklist)
 {
 	IR_ASSERT(insn->inputs_count == 3);
@@ -2559,8 +2650,18 @@ static bool ir_optimize_phi(ir_ctx *ctx, ir_ref merge_ref, ir_insn *merge, ir_re
 				}
 
 				if (is_cmp
-				 && ((insn->op2 == cond->op1 && insn->op3 == cond->op2)
-				   || (insn->op2 == cond->op2 && insn->op3 == cond->op1))) {
+				 && ((insn->op2 == cond->op1
+				   && (insn->op3 == cond->op2
+				    || (IR_IS_CONST_REF(cond->op2)
+				     && (IR_IS_CONST_REF(insn->op3)
+					 && IR_IS_TYPE_INT(insn->type)
+				     && ir_fix_min_max_const(ctx, cond, insn->op3)))))
+				  || (insn->op3 == cond->op1
+				   && (insn->op2 == cond->op2
+				    || (IR_IS_CONST_REF(cond->op2)
+				     && (IR_IS_CONST_REF(insn->op2)
+					 && IR_IS_TYPE_INT(insn->type)
+				     && ir_fix_min_max_const(ctx, cond, insn->op2))))))) {
 					/* MAX/MIN
 					 *
 					 *    prev                     prev
@@ -2611,14 +2712,14 @@ static bool ir_optimize_phi(ir_ctx *ctx, ir_ref merge_ref, ir_insn *merge, ir_re
 
 					next->op1 = root->op1;
 					ir_use_list_replace_one(ctx, root->op1, root_ref, next_ref);
-					if (!IR_IS_CONST_REF(insn->op1)) {
-						ir_use_list_remove_one(ctx, insn->op1, cond_ref);
-					}
-					if (!IR_IS_CONST_REF(insn->op2)) {
-						ir_use_list_remove_one(ctx, insn->op2, cond_ref);
-					}
 
 					if (ctx->use_lists[cond_ref].count == 1) {
+						if (!IR_IS_CONST_REF(insn->op1)) {
+							ir_use_list_remove_one(ctx, insn->op1, cond_ref);
+						}
+						if (!IR_IS_CONST_REF(insn->op2)) {
+							ir_use_list_remove_one(ctx, insn->op2, cond_ref);
+						}
 						MAKE_NOP(cond);   CLEAR_USES(cond_ref);
 					} else {
 						ir_use_list_remove_one(ctx, cond_ref, root_ref);
@@ -2704,11 +2805,11 @@ static bool ir_optimize_phi(ir_ctx *ctx, ir_ref merge_ref, ir_insn *merge, ir_re
 					next->op1 = root->op1;
 					ir_use_list_replace_one(ctx, root->op1, root_ref, next_ref);
 					ir_use_list_remove_one(ctx, insn->op1, neg_ref);
-					if (!IR_IS_CONST_REF(insn->op1)) {
-						ir_use_list_remove_one(ctx, insn->op1, cond_ref);
-					}
 
 					if (ctx->use_lists[cond_ref].count == 1) {
+						if (!IR_IS_CONST_REF(insn->op1)) {
+							ir_use_list_remove_one(ctx, insn->op1, cond_ref);
+						}
 						MAKE_NOP(cond);   CLEAR_USES(cond_ref);
 					} else {
 						ir_use_list_remove_one(ctx, cond_ref, root_ref);
@@ -2726,7 +2827,16 @@ static bool ir_optimize_phi(ir_ctx *ctx, ir_ref merge_ref, ir_insn *merge, ir_re
 					}
 
 					return 1;
-				} else if (cond->op != IR_OVERFLOW && insn->op2 <= cond_ref && insn->op3 <= cond_ref) {
+				} else if (insn->op2 <= root_ref && insn->op3 <= root_ref
+					&& cond->op != IR_OVERFLOW
+					// TODO: temporary disable IF-conversion for RLOAD.
+					// We don't track anti-dependencies in GCM and Local Scheduling.
+					// As result COND may be scheduled below the following RSTORE.
+					// See: https://github.com/dstogov/ir/issues/132
+					&& cond->op != IR_RLOAD
+					&& !((cond->op >= IR_EQ && cond->op <= IR_UNORDERED)
+					  && ((!IR_IS_CONST_REF(cond->op1) && ctx->ir_base[cond->op1].op == IR_RLOAD)
+					   || (!IR_IS_CONST_REF(cond->op2) && ctx->ir_base[cond->op2].op == IR_RLOAD)))) {
 					/* COND
 					 *
 					 *    prev                     prev
@@ -2968,9 +3078,11 @@ static bool ir_try_split_if(ir_ctx *ctx, ir_ref ref, ir_insn *insn, ir_bitqueue
 
 						if_false->optx = IR_OPTX(IR_BEGIN, IR_VOID, 1);
 						if_false->op1 = end1_ref;
+						if_false->op2 = IR_UNUSED;
 
 						if_true->optx = IR_OPTX(IR_BEGIN, IR_VOID, 1);
 						if_true->op1 = end2_ref;
+						if_true->op2 = IR_UNUSED;
 
 						ir_bitqueue_add(worklist, if_false_ref);
 						ir_bitqueue_add(worklist, if_true_ref);
@@ -3008,6 +3120,7 @@ static bool ir_try_split_if(ir_ctx *ctx, ir_ref ref, ir_insn *insn, ir_bitqueue
 
 						if_true->optx = IR_BEGIN;
 						if_true->op1 = IR_UNUSED;
+						if_true->op2 = IR_UNUSED;
 
 						ctx->flags2 &= ~IR_CFG_REACHABLE;
 
@@ -3157,9 +3270,11 @@ static bool ir_try_split_if_cmp(ir_ctx *ctx, ir_ref ref, ir_insn *insn, ir_bitqu
 
 							if_false->optx = IR_OPTX(IR_BEGIN, IR_VOID, 1);
 							if_false->op1 = end1_ref;
+							if_false->op2 = IR_UNUSED;
 
 							if_true->optx = IR_OPTX(IR_BEGIN, IR_VOID, 1);
 							if_true->op1 = end2_ref;
+							if_true->op2 = IR_UNUSED;
 
 							ir_bitqueue_add(worklist, if_false_ref);
 							ir_bitqueue_add(worklist, if_true_ref);
@@ -3201,6 +3316,7 @@ static bool ir_try_split_if_cmp(ir_ctx *ctx, ir_ref ref, ir_insn *insn, ir_bitqu
 
 							if_true->optx = IR_BEGIN;
 							if_true->op1 = IR_UNUSED;
+							if_true->op2 = IR_UNUSED;
 
 							ctx->flags2 &= ~IR_CFG_REACHABLE;
 
@@ -3421,6 +3537,13 @@ static ir_ref ir_iter_optimize_condition(ir_ctx *ctx, ir_ref control, ir_ref con
 		}
 	}
 
+	if (condition_insn->op == IR_SHL && IR_IS_CONST_REF(condition_insn->op1)) {
+		ir_insn *val_insn = &ctx->ir_base[condition_insn->op1];
+		if (!IR_IS_SYM_CONST(val_insn->op) && val_insn->val.u64 == 1) {
+			return IR_TRUE;
+		}
+	}
+
 	while ((condition_insn->op == IR_BITCAST
 	  || condition_insn->op == IR_ZEXT
 	  || condition_insn->op == IR_SEXT)
@@ -3487,7 +3610,9 @@ static void ir_iter_optimize_if(ir_ctx *ctx, ir_ref ref, ir_insn *insn, ir_bitqu
 		if_true = &ctx->ir_base[if_true_ref];
 		if_false = &ctx->ir_base[if_false_ref];
 		if_true->op = IR_BEGIN;
+		if_true->op2 = IR_UNUSED;
 		if_false->op = IR_BEGIN;
+		if_false->op2 = IR_UNUSED;
 		if (ir_ref_is_true(ctx, condition)) {
 			if_false->op1 = IR_UNUSED;
 			ir_use_list_remove_one(ctx, ref, if_false_ref);
@@ -3750,6 +3875,47 @@ void ir_iter_opt(ir_ctx *ctx, ir_bitqueue *worklist)
 	}
 }
 
+void ir_iter_cleanup(ir_ctx *ctx)
+{
+	ir_bitqueue iter_worklist;
+	ir_bitqueue cfg_worklist;
+	ir_ref i, n;
+	ir_insn *insn;
+
+	ir_bitqueue_init(&cfg_worklist, ctx->insns_count);
+	ir_bitqueue_init(&iter_worklist, ctx->insns_count);
+
+	/* Remove unused nodes */
+	for (i = IR_UNUSED + 1, insn = ctx->ir_base + i; i < ctx->insns_count;) {
+		if (IR_IS_FOLDABLE_OP(insn->op)) {
+			if (insn->op != IR_NOP && ctx->use_lists[i].count == 0) {
+				ir_iter_remove_insn(ctx, i, &iter_worklist);
+			}
+		} else if (insn->op == IR_IF || insn->op == IR_MERGE) {
+			ir_bitqueue_add(&cfg_worklist, i);
+		}
+		n = insn->inputs_count;
+		n = ir_insn_inputs_to_len(n);
+		i += n;
+		insn += n;
+	}
+
+	while ((i = ir_bitqueue_pop(&iter_worklist)) >= 0) {
+		insn = &ctx->ir_base[i];
+		if (IR_IS_FOLDABLE_OP(insn->op)) {
+			if (ctx->use_lists[i].count == 0) {
+				ir_iter_remove_insn(ctx, i, &iter_worklist);
+			}
+		}
+	}
+
+	/* Cleanup Control Flow */
+	ir_iter_opt(ctx, &cfg_worklist);
+
+	ir_bitqueue_free(&iter_worklist);
+	ir_bitqueue_free(&cfg_worklist);
+}
+
 int ir_sccp(ir_ctx *ctx)
 {
 	ir_bitqueue sccp_worklist, iter_worklist;
diff --git a/ext/opcache/jit/ir/ir_x86.dasc b/ext/opcache/jit/ir/ir_x86.dasc
index 049c341cc8fe..ca42001a8816 100644
--- a/ext/opcache/jit/ir/ir_x86.dasc
+++ b/ext/opcache/jit/ir/ir_x86.dasc
@@ -1273,6 +1273,7 @@ int ir_get_target_constraints(ir_ctx *ctx, ir_ref ref, ir_target_constraints *co
 	int flags = IR_USE_MUST_BE_IN_REG | IR_OP1_MUST_BE_IN_REG | IR_OP2_MUST_BE_IN_REG | IR_OP3_MUST_BE_IN_REG;
 	const ir_proto_t *proto;
 	const ir_call_conv_dsc *cc;
+	ir_ref next;
 
 	constraints->def_reg = IR_REG_NONE;
 	constraints->hints_count = 0;
@@ -1345,9 +1346,11 @@ int ir_get_target_constraints(ir_ctx *ctx, ir_ref ref, ir_target_constraints *co
 			flags = IR_DEF_REUSES_OP1_REG | IR_USE_MUST_BE_IN_REG | IR_OP1_SHOULD_BE_IN_REG | IR_OP2_MUST_BE_IN_REG;
 op2_const:
 			insn = &ctx->ir_base[ref];
-			if (IR_IS_CONST_REF(insn->op2) && insn->op1 != insn->op2) {
-				constraints->tmp_regs[n] = IR_TMP_REG(2, insn->type, IR_LOAD_SUB_REF, IR_DEF_SUB_REF);
-				n++;
+			if (IR_IS_CONST_REF(insn->op2)) {
+				if (insn->op1 != insn->op2) {
+					constraints->tmp_regs[n] = IR_TMP_REG(2, insn->type, IR_LOAD_SUB_REF, IR_DEF_SUB_REF);
+					n++;
+				}
 			} else if (ir_rule(ctx, insn->op2) == IR_STATIC_ALLOCA) {
 				constraints->tmp_regs[n] = IR_TMP_REG(2, IR_ADDR, IR_LOAD_SUB_REF, IR_DEF_SUB_REF);
 				n = 1;
@@ -1666,7 +1669,7 @@ get_arg_hints:
 			break;
 		case IR_PARAM:
 			constraints->def_reg = ir_get_param_reg(ctx, ref);
-			flags = 0;
+			flags = (constraints->def_reg != IR_REG_NONE) ? IR_USE_SHOULD_BE_IN_REG : 0;
 			break;
 		case IR_PI:
 		case IR_PHI:
@@ -1712,6 +1715,10 @@ get_arg_hints:
 			break;
 		case IR_SNAPSHOT:
 			flags = 0;
+			next = ir_next_control(ctx, ref);
+			if (ctx->ir_base[next].op == IR_GUARD || ctx->ir_base[next].op == IR_GUARD_NOT) {
+				flags = IR_EXTEND_INPUTS_TO_NEXT;
+			}
 			break;
 		case IR_VA_START:
 			flags = IR_OP2_MUST_BE_IN_REG;
@@ -3078,10 +3085,6 @@ store_int:
 			if (!IR_IS_CONST_REF(insn->op2) && (ctx->use_lists[insn->op2].count == 1 || all_usages_are_fusable(ctx, insn->op2))) {
 				op2_insn = &ctx->ir_base[insn->op2];
 				if (op2_insn->op >= IR_EQ && op2_insn->op <= IR_UNORDERED) {
-					// TODO: register allocator may clobber operands of CMP before they are used in the GUARD_CMP
-//???				 && (insn->op2 == ref - 1 ||
-//???				     (insn->op2 == ctx->prev_ref[ref] - 1
-//???				   && ctx->ir_base[ctx->prev_ref[ref]].op == IR_SNAPSHOT))) {
 					if (IR_IS_TYPE_INT(ctx->ir_base[op2_insn->op1].type)) {
 						if (IR_IS_CONST_REF(op2_insn->op2)
 						 && !IR_IS_SYM_CONST(ctx->ir_base[op2_insn->op2].op)
@@ -3262,6 +3265,12 @@ store_int:
 			return IR_FUSED | IR_ARGVAL;
 		case IR_NOP:
 			return IR_SKIPPED | IR_NOP;
+		case IR_ASM:
+		case IR_ASM_OUT:
+		case IR_ASM_GOTO:
+			fprintf(stderr, "ERROR: IR_ASM is not implemented yet\n");
+			exit(1);
+			return IR_SKIPPED | IR_NOP;
 		default:
 			break;
 	}
@@ -9429,7 +9438,8 @@ static void ir_emit_switch(ir_ctx *ctx, uint32_t b, ir_ref def, ir_insn *insn)
 						void *addr = ir_jmp_addr(ctx, insn, &ctx->ir_base[insn->op2]);
 
 						|	.aword &addr
-						if (ctx->ir_base[bb->start].op != IR_CASE_DEFAULT) {
+						if (ctx->ir_base[bb->start].op1 == def
+						 && ctx->ir_base[bb->start].op != IR_CASE_DEFAULT) {
 							bb->flags |= IR_BB_EMPTY;
 						}
 						continue;
diff --git a/ext/opcache/jit/tls/zend_jit_tls.h b/ext/opcache/jit/tls/zend_jit_tls.h
index 5f9042926725..7faa76fa6a31 100644
--- a/ext/opcache/jit/tls/zend_jit_tls.h
+++ b/ext/opcache/jit/tls/zend_jit_tls.h
@@ -1,19 +1,17 @@
 /*
- *  +----------------------------------------------------------------------+
- *  | Zend JIT                                                             |
- *  +----------------------------------------------------------------------+
- *  | Copyright (c) The PHP Group                                          |
- *  +----------------------------------------------------------------------+
- *  | This source file is subject to version 3.01 of the PHP license,      |
- *  | that is bundled with this package in the file LICENSE, and is        |
- *  | available through the world-wide-web at the following url:           |
- *  | https://www.php.net/license/3_01.txt                                 |
- *  | If you did not receive a copy of the PHP license and are unable to   |
- *  | obtain it through the world-wide-web, please send a note to          |
- *  | license@php.net so we can mail you a copy immediately.               |
- *  +----------------------------------------------------------------------+
- *  | Authors: Arnaud Le Blanc                        |
- *  +----------------------------------------------------------------------+
+   +----------------------------------------------------------------------+
+   | Zend JIT                                                             |
+   +----------------------------------------------------------------------+
+   | Copyright © The PHP Group and Contributors.                          |
+   +----------------------------------------------------------------------+
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
+   +----------------------------------------------------------------------+
+   | Authors: Arnaud Le Blanc                        |
+   +----------------------------------------------------------------------+
  */
 
 #ifndef ZEND_JIT_TLS_H
diff --git a/ext/opcache/jit/tls/zend_jit_tls_aarch64.c b/ext/opcache/jit/tls/zend_jit_tls_aarch64.c
index 24f0f88454b6..3258a3123ebb 100644
--- a/ext/opcache/jit/tls/zend_jit_tls_aarch64.c
+++ b/ext/opcache/jit/tls/zend_jit_tls_aarch64.c
@@ -1,19 +1,17 @@
 /*
- *  +----------------------------------------------------------------------+
- *  | Zend JIT                                                             |
- *  +----------------------------------------------------------------------+
- *  | Copyright (c) The PHP Group                                          |
- *  +----------------------------------------------------------------------+
- *  | This source file is subject to version 3.01 of the PHP license,      |
- *  | that is bundled with this package in the file LICENSE, and is        |
- *  | available through the world-wide-web at the following url:           |
- *  | https://www.php.net/license/3_01.txt                                 |
- *  | If you did not receive a copy of the PHP license and are unable to   |
- *  | obtain it through the world-wide-web, please send a note to          |
- *  | license@php.net so we can mail you a copy immediately.               |
- *  +----------------------------------------------------------------------+
- *  | Authors: Arnaud Le Blanc                        |
- *  +----------------------------------------------------------------------+
+   +----------------------------------------------------------------------+
+   | Zend JIT                                                             |
+   +----------------------------------------------------------------------+
+   | Copyright © The PHP Group and Contributors.                          |
+   +----------------------------------------------------------------------+
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
+   +----------------------------------------------------------------------+
+   | Authors: Arnaud Le Blanc                        |
+   +----------------------------------------------------------------------+
  */
 
 #include "Zend/zend_portability.h"
diff --git a/ext/opcache/jit/tls/zend_jit_tls_darwin.c b/ext/opcache/jit/tls/zend_jit_tls_darwin.c
index ee8a572e04a0..8857ef5e738c 100644
--- a/ext/opcache/jit/tls/zend_jit_tls_darwin.c
+++ b/ext/opcache/jit/tls/zend_jit_tls_darwin.c
@@ -1,19 +1,17 @@
 /*
- *  +----------------------------------------------------------------------+
- *  | Zend JIT                                                             |
- *  +----------------------------------------------------------------------+
- *  | Copyright (c) The PHP Group                                          |
- *  +----------------------------------------------------------------------+
- *  | This source file is subject to version 3.01 of the PHP license,      |
- *  | that is bundled with this package in the file LICENSE, and is        |
- *  | available through the world-wide-web at the following url:           |
- *  | https://www.php.net/license/3_01.txt                                 |
- *  | If you did not receive a copy of the PHP license and are unable to   |
- *  | obtain it through the world-wide-web, please send a note to          |
- *  | license@php.net so we can mail you a copy immediately.               |
- *  +----------------------------------------------------------------------+
- *  | Authors: Dmitry Stogov                               |
- *  +----------------------------------------------------------------------+
+   +----------------------------------------------------------------------+
+   | Zend JIT                                                             |
+   +----------------------------------------------------------------------+
+   | Copyright © The PHP Group and Contributors.                          |
+   +----------------------------------------------------------------------+
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
+   +----------------------------------------------------------------------+
+   | Authors: Dmitry Stogov                               |
+   +----------------------------------------------------------------------+
  */
 
 #include "Zend/zend_portability.h"
diff --git a/ext/opcache/jit/tls/zend_jit_tls_win.c b/ext/opcache/jit/tls/zend_jit_tls_win.c
index 23f0c1e79baa..5646f3dcba0b 100644
--- a/ext/opcache/jit/tls/zend_jit_tls_win.c
+++ b/ext/opcache/jit/tls/zend_jit_tls_win.c
@@ -1,19 +1,17 @@
 /*
- *  +----------------------------------------------------------------------+
- *  | Zend JIT                                                             |
- *  +----------------------------------------------------------------------+
- *  | Copyright (c) The PHP Group                                          |
- *  +----------------------------------------------------------------------+
- *  | This source file is subject to version 3.01 of the PHP license,      |
- *  | that is bundled with this package in the file LICENSE, and is        |
- *  | available through the world-wide-web at the following url:           |
- *  | https://www.php.net/license/3_01.txt                                 |
- *  | If you did not receive a copy of the PHP license and are unable to   |
- *  | obtain it through the world-wide-web, please send a note to          |
- *  | license@php.net so we can mail you a copy immediately.               |
- *  +----------------------------------------------------------------------+
- *  | Authors: Dmitry Stogov                               |
- *  +----------------------------------------------------------------------+
+   +----------------------------------------------------------------------+
+   | Zend JIT                                                             |
+   +----------------------------------------------------------------------+
+   | Copyright © The PHP Group and Contributors.                          |
+   +----------------------------------------------------------------------+
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
+   +----------------------------------------------------------------------+
+   | Authors: Dmitry Stogov                               |
+   +----------------------------------------------------------------------+
  */
 
 #include "Zend/zend_portability.h"
diff --git a/ext/opcache/jit/tls/zend_jit_tls_x86.c b/ext/opcache/jit/tls/zend_jit_tls_x86.c
index 4e06bbd1eacd..362dffb47785 100644
--- a/ext/opcache/jit/tls/zend_jit_tls_x86.c
+++ b/ext/opcache/jit/tls/zend_jit_tls_x86.c
@@ -1,19 +1,17 @@
 /*
- *  +----------------------------------------------------------------------+
- *  | Zend JIT                                                             |
- *  +----------------------------------------------------------------------+
- *  | Copyright (c) The PHP Group                                          |
- *  +----------------------------------------------------------------------+
- *  | This source file is subject to version 3.01 of the PHP license,      |
- *  | that is bundled with this package in the file LICENSE, and is        |
- *  | available through the world-wide-web at the following url:           |
- *  | https://www.php.net/license/3_01.txt                                 |
- *  | If you did not receive a copy of the PHP license and are unable to   |
- *  | obtain it through the world-wide-web, please send a note to          |
- *  | license@php.net so we can mail you a copy immediately.               |
- *  +----------------------------------------------------------------------+
- *  | Authors: Arnaud Le Blanc                        |
- *  +----------------------------------------------------------------------+
+   +----------------------------------------------------------------------+
+   | Zend JIT                                                             |
+   +----------------------------------------------------------------------+
+   | Copyright © The PHP Group and Contributors.                          |
+   +----------------------------------------------------------------------+
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
+   +----------------------------------------------------------------------+
+   | Authors: Arnaud Le Blanc                        |
+   +----------------------------------------------------------------------+
  */
 
 #include "zend_portability.h"
diff --git a/ext/opcache/jit/tls/zend_jit_tls_x86_64.c b/ext/opcache/jit/tls/zend_jit_tls_x86_64.c
index 11ffe495fcbb..1b2730c4be92 100644
--- a/ext/opcache/jit/tls/zend_jit_tls_x86_64.c
+++ b/ext/opcache/jit/tls/zend_jit_tls_x86_64.c
@@ -1,19 +1,17 @@
 /*
- *  +----------------------------------------------------------------------+
- *  | Zend JIT                                                             |
- *  +----------------------------------------------------------------------+
- *  | Copyright (c) The PHP Group                                          |
- *  +----------------------------------------------------------------------+
- *  | This source file is subject to version 3.01 of the PHP license,      |
- *  | that is bundled with this package in the file LICENSE, and is        |
- *  | available through the world-wide-web at the following url:           |
- *  | https://www.php.net/license/3_01.txt                                 |
- *  | If you did not receive a copy of the PHP license and are unable to   |
- *  | obtain it through the world-wide-web, please send a note to          |
- *  | license@php.net so we can mail you a copy immediately.               |
- *  +----------------------------------------------------------------------+
- *  | Authors: Arnaud Le Blanc                        |
- *  +----------------------------------------------------------------------+
+   +----------------------------------------------------------------------+
+   | Zend JIT                                                             |
+   +----------------------------------------------------------------------+
+   | Copyright © The PHP Group and Contributors.                          |
+   +----------------------------------------------------------------------+
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
+   +----------------------------------------------------------------------+
+   | Authors: Arnaud Le Blanc                        |
+   +----------------------------------------------------------------------+
  */
 
 #include "zend_portability.h"
diff --git a/ext/opcache/jit/zend_jit.c b/ext/opcache/jit/zend_jit.c
index 3ffb669e8474..fbbfab6b243c 100644
--- a/ext/opcache/jit/zend_jit.c
+++ b/ext/opcache/jit/zend_jit.c
@@ -2,15 +2,13 @@
    +----------------------------------------------------------------------+
    | Zend JIT                                                             |
    +----------------------------------------------------------------------+
-   | Copyright (c) The PHP Group                                          |
+   | Copyright © The PHP Group and Contributors.                          |
    +----------------------------------------------------------------------+
-   | This source file is subject to version 3.01 of the PHP license,      |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | https://www.php.net/license/3_01.txt                                 |
-   | If you did not receive a copy of the PHP license and are unable to   |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@php.net so we can mail you a copy immediately.               |
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Authors: Dmitry Stogov                               |
    +----------------------------------------------------------------------+
@@ -78,6 +76,7 @@ int zend_jit_profile_counter_rid = -1;
 int16_t zend_jit_hot_counters[ZEND_HOT_COUNTERS_COUNT];
 
 const zend_op *zend_jit_halt_op = NULL;
+const zend_op *zend_jit_interrupt_op = NULL;
 #ifdef HAVE_PTHREAD_JIT_WRITE_PROTECT_NP
 static int zend_write_protect = 1;
 #endif
@@ -115,7 +114,7 @@ static zend_string *zend_jit_func_name(const zend_op_array *op_array);
 static bool zend_jit_needs_arg_dtor(const zend_function *func, uint32_t arg_num, zend_call_info *call_info);
 static bool zend_jit_supported_binary_op(uint8_t op, uint32_t op1_info, uint32_t op2_info);
 
-static bool dominates(const zend_basic_block *blocks, int a, int b) {
+static bool dominates(const zend_basic_block *blocks, uint32_t a, uint32_t b) {
 	while (blocks[b].level > blocks[a].level) {
 		b = blocks[b].idom;
 	}
@@ -138,9 +137,9 @@ static bool zend_ssa_is_last_use(const zend_op_array *op_array, const zend_ssa *
 
 	if (ssa->cfg.blocks[ssa->cfg.map[use]].loop_header > 0
 	 || (ssa->cfg.blocks[ssa->cfg.map[use]].flags & ZEND_BB_LOOP_HEADER)) {
-		int b = ssa->cfg.map[use];
+		uint32_t b = ssa->cfg.map[use];
 		int prev_use = ssa->vars[var].use_chain;
-		int def_block;
+		uint32_t def_block;
 
 		if (ssa->vars[var].definition >= 0) {
 			def_block =ssa->cfg.map[ssa->vars[var].definition];
@@ -880,13 +879,13 @@ static zend_string *zend_jit_func_name(const zend_op_array *op_array)
 	if (op_array->function_name) {
 		smart_str_appends(&buf, JIT_PREFIX);
 		if (op_array->scope) {
-			smart_str_appendl(&buf, ZSTR_VAL(op_array->scope->name), ZSTR_LEN(op_array->scope->name));
+			smart_str_append(&buf, op_array->scope->name);
 			smart_str_appends(&buf, "::");
 		}
-		smart_str_appendl(&buf, ZSTR_VAL(op_array->function_name), ZSTR_LEN(op_array->function_name));
+		smart_str_append(&buf, op_array->function_name);
 		if (op_array->fn_flags & ZEND_ACC_CLOSURE) {
 			smart_str_appends(&buf, ":");
-			smart_str_appendl(&buf, ZSTR_VAL(op_array->filename), ZSTR_LEN(op_array->filename));
+			smart_str_append(&buf, op_array->filename);
 			smart_str_appends(&buf, ":");
 			smart_str_append_long(&buf, op_array->line_start);
 		}
@@ -894,7 +893,7 @@ static zend_string *zend_jit_func_name(const zend_op_array *op_array)
 		return buf.s;
 	} else if (op_array->filename) {
 		smart_str_appends(&buf, JIT_PREFIX);
-		smart_str_appendl(&buf, ZSTR_VAL(op_array->filename), ZSTR_LEN(op_array->filename));
+		smart_str_append(&buf, op_array->filename);
 		smart_str_0(&buf);
 		return buf.s;
 	} else {
@@ -1173,7 +1172,7 @@ static void zend_jit_allocate_registers(zend_jit_ctx *ctx, const zend_op_array *
 		for (i = 0; i < ssa->vars_count; i++) {
 			if (ssa->vars[i].definition_phi && !ssa->vars[i].no_val) {
 				zend_ssa_phi *phi = ssa->vars[i].definition_phi;
-				int k, src;
+				int src;
 
 				if (phi->pi >= 0) {
 					src = phi->sources[0];
@@ -1188,6 +1187,7 @@ static void zend_jit_allocate_registers(zend_jit_ctx *ctx, const zend_op_array *
 					}
 				} else {
 					int need_move = 0;
+					uint32_t k;
 
 					for (k = 0; k < ssa->cfg.blocks[phi->block].predecessors_count; k++) {
 						src = phi->sources[k];
@@ -1342,7 +1342,7 @@ static void zend_jit_allocate_registers(zend_jit_ctx *ctx, const zend_op_array *
 static int zend_jit_compute_post_order(zend_cfg *cfg, int start, int *post_order)
 {
 	int count = 0;
-	int b, n, *p;
+	int b, *p;
 	zend_basic_block *bb;
 	zend_worklist worklist;
 	ALLOCA_FLAG(use_heap)
@@ -1354,7 +1354,7 @@ static int zend_jit_compute_post_order(zend_cfg *cfg, int start, int *post_order
 next:
 		b = zend_worklist_peek(&worklist);
 		bb = &cfg->blocks[b];
-		n = bb->successors_count;
+		uint32_t n = bb->successors_count;
 		if (n > 0) {
 			p = bb->successors;
 			do {
@@ -1410,7 +1410,7 @@ static bool zend_jit_supported_binary_op(uint8_t op, uint32_t op1_info, uint32_t
 			return (op1_info & MAY_BE_LONG) && (op2_info & MAY_BE_LONG);
 		case ZEND_CONCAT:
 			return (op1_info & MAY_BE_STRING) && (op2_info & MAY_BE_STRING);
-		EMPTY_SWITCH_DEFAULT_CASE()
+		default: ZEND_UNREACHABLE();
 	}
 }
 
@@ -2890,7 +2890,7 @@ static int zend_jit(const zend_op_array *op_array, zend_ssa *ssa, const zend_op
 					if (i == end
 					 && (opline->result_type & (IS_SMART_BRANCH_JMPZ|IS_SMART_BRANCH_JMPNZ)) != 0) {
 						/* smart branch split across basic blocks */
-						if (!zend_jit_set_cond(&ctx, opline + 2, opline->result.var)) {
+						if (!zend_jit_set_cond(&ctx, opline, opline + 2, opline->result.var)) {
 							goto jit_failure;
 						}
 					}
@@ -3777,6 +3777,7 @@ int zend_jit_check_support(void)
 void zend_jit_startup(void *buf, size_t size, bool reattached)
 {
 	zend_jit_halt_op = zend_get_halt_op();
+	zend_jit_interrupt_op = zend_get_interrupt_op();
 	zend_jit_profile_counter_rid = zend_get_op_array_extension_handle(ACCELERATOR_PRODUCT_NAME);
 
 #ifdef HAVE_PTHREAD_JIT_WRITE_PROTECT_NP
diff --git a/ext/opcache/jit/zend_jit.h b/ext/opcache/jit/zend_jit.h
index 9b8e054d2292..2671ddd23e2d 100644
--- a/ext/opcache/jit/zend_jit.h
+++ b/ext/opcache/jit/zend_jit.h
@@ -2,15 +2,13 @@
    +----------------------------------------------------------------------+
    | Zend JIT                                                             |
    +----------------------------------------------------------------------+
-   | Copyright (c) The PHP Group                                          |
+   | Copyright © The PHP Group and Contributors.                          |
    +----------------------------------------------------------------------+
-   | This source file is subject to version 3.01 of the PHP license,      |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | https://www.php.net/license/3_01.txt                                 |
-   | If you did not receive a copy of the PHP license and are unable to   |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@php.net so we can mail you a copy immediately.               |
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Authors: Dmitry Stogov                               |
    +----------------------------------------------------------------------+
diff --git a/ext/opcache/jit/zend_jit_helpers.c b/ext/opcache/jit/zend_jit_helpers.c
index 59bb9401d9a9..64a48068f378 100644
--- a/ext/opcache/jit/zend_jit_helpers.c
+++ b/ext/opcache/jit/zend_jit_helpers.c
@@ -2,15 +2,13 @@
    +----------------------------------------------------------------------+
    | Zend JIT                                                             |
    +----------------------------------------------------------------------+
-   | Copyright (c) The PHP Group                                          |
+   | Copyright © The PHP Group and Contributors.                          |
    +----------------------------------------------------------------------+
-   | This source file is subject to version 3.01 of the PHP license,      |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | https://www.php.net/license/3_01.txt                                 |
-   | If you did not receive a copy of the PHP license and are unable to   |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@php.net so we can mail you a copy immediately.               |
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Authors: Dmitry Stogov                               |
    +----------------------------------------------------------------------+
@@ -2285,7 +2283,7 @@ static zend_never_inline bool zend_handle_fetch_obj_flags(
 				}
 			}
 			break;
-		EMPTY_SWITCH_DEFAULT_CASE()
+		default: ZEND_UNREACHABLE();
 	}
 	return 1;
 }
diff --git a/ext/opcache/jit/zend_jit_internal.h b/ext/opcache/jit/zend_jit_internal.h
index 22bab1ddd7ff..7b5f93f70db7 100644
--- a/ext/opcache/jit/zend_jit_internal.h
+++ b/ext/opcache/jit/zend_jit_internal.h
@@ -2,15 +2,13 @@
    +----------------------------------------------------------------------+
    | Zend JIT                                                             |
    +----------------------------------------------------------------------+
-   | Copyright (c) The PHP Group                                          |
+   | Copyright © The PHP Group and Contributors.                          |
    +----------------------------------------------------------------------+
-   | This source file is subject to version 3.01 of the PHP license,      |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | https://www.php.net/license/3_01.txt                                 |
-   | If you did not receive a copy of the PHP license and are unable to   |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@php.net so we can mail you a copy immediately.               |
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Authors: Dmitry Stogov                               |
    |          Xinchen Hui                               |
@@ -177,6 +175,7 @@ typedef struct _zend_jit_op_array_hot_extension {
 	zend_jit_hash((op_array)->opcodes)
 
 extern const zend_op *zend_jit_halt_op;
+extern const zend_op *zend_jit_interrupt_op;
 
 #ifdef HAVE_GCC_GLOBAL_REGS
 # define EXECUTE_DATA_D                       void
diff --git a/ext/opcache/jit/zend_jit_ir.c b/ext/opcache/jit/zend_jit_ir.c
index 0d368ef11ce0..224f6f7237eb 100644
--- a/ext/opcache/jit/zend_jit_ir.c
+++ b/ext/opcache/jit/zend_jit_ir.c
@@ -1,21 +1,20 @@
 /*
- *  +----------------------------------------------------------------------+
- *  | Zend JIT                                                             |
- *  +----------------------------------------------------------------------+
- *  | Copyright (c) The PHP Group                                          |
- *  +----------------------------------------------------------------------+
- *  | This source file is subject to version 3.01 of the PHP license,      |
- *  | that is bundled with this package in the file LICENSE, and is        |
- *  | available through the world-wide-web at the following url:           |
- *  | https://www.php.net/license/3_01.txt                                 |
- *  | If you did not receive a copy of the PHP license and are unable to   |
- *  | obtain it through the world-wide-web, please send a note to          |
- *  | license@php.net so we can mail you a copy immediately.               |
- *  +----------------------------------------------------------------------+
- *  | Authors: Dmitry Stogov                               |
- *  +----------------------------------------------------------------------+
- */
+   +----------------------------------------------------------------------+
+   | Zend JIT                                                             |
+   +----------------------------------------------------------------------+
+   | Copyright © The PHP Group and Contributors.                          |
+   +----------------------------------------------------------------------+
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
+   +----------------------------------------------------------------------+
+   | Authors: Dmitry Stogov                               |
+   +----------------------------------------------------------------------+
+*/
 
+#include "Zend/zend_cpuinfo.h"
 #include "Zend/zend_types.h"
 #include "Zend/zend_type_info.h"
 #include "jit/ir/ir.h"
@@ -874,6 +873,7 @@ void *zend_jit_snapshot_handler(ir_ctx *ctx, ir_ref snapshot_ref, ir_insn *snaps
 							addr = (void*)zend_jit_trace_get_exit_addr(exit_point);
 							exit_flags &= ~ZEND_JIT_EXIT_FIXED;
 						}
+						t->stack_map[t->exit_info[exit_point].stack_offset + var].reg = ZREG_NONE;
 						t->stack_map[t->exit_info[exit_point].stack_offset + var].flags = ZREG_TYPE_ONLY;
 					}
 				} else if (!(exit_flags & ZEND_JIT_EXIT_FIXED)) {
@@ -1478,8 +1478,7 @@ static void zend_jit_gen_phi(zend_jit_ctx *jit, zend_ssa_phi *phi)
 {
 	int dst_var = phi->ssa_var;
 	zend_basic_block *bb = &jit->ssa->cfg.blocks[phi->block];
-	int n = bb->predecessors_count;
-	int i;
+	uint32_t n = bb->predecessors_count;
 	ir_type type = (jit->ssa->var_info[phi->ssa_var].type & MAY_BE_LONG) ? IR_LONG : IR_DOUBLE;
 	ir_ref merge = jit->bb_start_ref[phi->block];
 	ir_ref ref;
@@ -1496,7 +1495,7 @@ static void zend_jit_gen_phi(zend_jit_ctx *jit, zend_ssa_phi *phi)
 	ref = ir_emit_N(&jit->ctx, IR_OPT(IR_PHI, type), n + 1);
 	ir_set_op(&jit->ctx, ref, 1, merge);
 
-	for (i = 0; i < n; i++) {
+	for (uint32_t i = 0; i < n; i++) {
 		int src_var = phi->sources[i];
 
 		ZEND_ASSERT(jit->ra[src_var].ref);
@@ -3315,6 +3314,27 @@ static PRUNTIME_FUNCTION zend_jit_unwind_callback(DWORD64 pc, PVOID context)
 
 static void zend_jit_setup_unwinder(void)
 {
+#if ZEND_VM_KIND == ZEND_VM_KIND_TAILCALL
+	/* TAILCALL VM: fixed_save_regset=0, no registers pushed in prologue.
+	 * fixed_stack_frame_size=40, fixed_call_stack_size=48 (16+IR_SHADOW_ARGS).
+	 * Prologue is: sub rsp, 0x58 (88 bytes = 40+48). */
+	static const unsigned char uw_data[] = {
+		0x01, // Version=1, Flags=0
+		0x04, // Size of prolog (sub rsp,imm8 = 4 bytes: 48 83 ec 58)
+		0x01, // Count of unwind codes
+		0x00, // Frame Register=none
+		0x04, 0xa2, // offset 4: UWOP_ALLOC_SMALL info=10, alloc=(10+1)*8=88
+		0x00, 0x00, // padding
+	};
+	/* Exit call variant: base 88 + 304 (shadow+GP+FP+padding) = 392 (0x188) */
+	static const unsigned char uw_data_exitcall[] = {
+		0x01, // Version=1, Flags=0
+		0x07, // Size of prolog (sub rsp,imm32 = 7 bytes: 48 81 ec 88 01 00 00)
+		0x02, // Count of unwind codes
+		0x00, // Frame Register=none
+		0x07, 0x01, 0x31, 0x00, // offset 7: UWOP_ALLOC_LARGE info=0, size/8=49, alloc=392
+	};
+#else
 	/* Hardcoded SEH unwind data for JIT-ed PHP functions with "fixed stack frame" */
 	static const unsigned char uw_data[] = {
 		0x01, // UBYTE: 3 Version , UBYTE: 5 Flags
@@ -3349,6 +3369,7 @@ static void zend_jit_setup_unwinder(void)
 		0x02, 0x50, // 1: pushq %rbp
 		0x01, 0x30, // 0: pushq %rbx
 	};
+#endif
 
 	zend_jit_uw_func = (PRUNTIME_FUNCTION)*dasm_ptr;
 	*dasm_ptr = (char*)*dasm_ptr + ZEND_MM_ALIGNED_SIZE_EX(sizeof(RUNTIME_FUNCTION) * 4 +
@@ -3396,7 +3417,7 @@ static void zend_jit_setup(bool reattached)
 	if (zend_cpu_supports_avx()) {
 		allowed_opt_flags |= ZEND_JIT_CPU_AVX;
 	}
-# if defined(PHP_HAVE_BUILTIN_CPU_SUPPORTS) && defined(__GNUC__) && (ZEND_GCC_VERSION >= 11000)
+# ifdef HAVE_ZEND_CPU_SUPPORTS_CLDEMOTE
 	if (zend_cpu_supports_cldemote()) {
 		default_mflags |= IR_X86_CLDEMOTE;
 	}
@@ -3497,7 +3518,7 @@ static void zend_jit_case_start(zend_jit_ctx *jit, int switch_b, int case_b, ir_
 
 static void _zend_jit_add_predecessor_ref(zend_jit_ctx *jit, int b, int pred, ir_ref ref)
 {
-	int i, *p;
+	int *p;
 	zend_basic_block *bb;
 	ir_ref *r, header;
 
@@ -3505,7 +3526,7 @@ static void _zend_jit_add_predecessor_ref(zend_jit_ctx *jit, int b, int pred, ir
 	bb = &jit->ssa->cfg.blocks[b];
 	p = &jit->ssa->cfg.predecessors[bb->predecessor_offset];
 	r = &jit->bb_edges[jit->bb_predecessors[b]];
-	for (i = 0; i < bb->predecessors_count; i++, p++, r++) {
+	for (uint32_t i = 0; i < bb->predecessors_count; i++, p++, r++) {
 		if (*p == pred) {
 			ZEND_ASSERT(*r == IR_UNUSED || *r == ref);
 			header = jit->bb_start_ref[b];
@@ -3720,14 +3741,14 @@ static void zend_jit_case_start(zend_jit_ctx *jit, int switch_b, int case_b, ir_
 static int zend_jit_bb_start(zend_jit_ctx *jit, int b)
 {
 	zend_basic_block *bb;
-	int i, n, *p, pred;
+	int *p, pred;
 	ir_ref ref, bb_start;
 
 	ZEND_ASSERT(JIT_G(trigger) != ZEND_JIT_ON_HOT_TRACE);
 	ZEND_ASSERT(b < jit->ssa->cfg.blocks_count);
 	bb = &jit->ssa->cfg.blocks[b];
 	ZEND_ASSERT((bb->flags & ZEND_BB_REACHABLE) != 0);
-	n = bb->predecessors_count;
+	uint32_t n = bb->predecessors_count;
 
 	if (n == 0) {
 		/* pass */
@@ -3797,6 +3818,7 @@ static int zend_jit_bb_start(zend_jit_ctx *jit, int b)
 			entry_path = ir_END();
 		}
 		pred_refs = (ir_ref *)do_alloca(sizeof(ir_ref) * n, use_heap);
+		uint32_t i;
 		for (i = 0, p = jit->ssa->cfg.predecessors + bb->predecessor_offset; i < n; p++, i++) {
 			pred = *p;
 			if (jit->bb_start_ref[pred]) {
@@ -3966,11 +3988,12 @@ static int zend_jit_cond_jmp(zend_jit_ctx *jit, const zend_op *next_opline, int
 	return 1;
 }
 
-static int zend_jit_set_cond(zend_jit_ctx *jit, const zend_op *next_opline, uint32_t var)
+static int zend_jit_set_cond(zend_jit_ctx *jit, const zend_op *opline, const zend_op *next_opline, uint32_t var)
 {
 	ir_ref ref;
 
-	ref = ir_ADD_U32(ir_ZEXT_U32(jit_CMP_IP(jit, IR_EQ, next_opline)), ir_CONST_U32(IS_FALSE));
+	ir_op op = (opline->result_type & IS_SMART_BRANCH_JMPZ) ? IR_EQ : IR_NE;
+	ref = ir_ADD_U32(ir_ZEXT_U32(jit_CMP_IP(jit, op, next_opline)), ir_CONST_U32(IS_FALSE));
 
 	// EX_VAR(var) = ...
 	ir_STORE(ir_ADD_OFFSET(jit_FP(jit), var + offsetof(zval, u1.type_info)), ref);
@@ -4685,7 +4708,7 @@ static struct jit_observer_fcall_is_unobserved_data jit_observer_fcall_is_unobse
 		ir_ref observer_handler_user = ir_ADD_OFFSET(run_time_cache, zend_observer_fcall_op_array_extension * sizeof(void *));
 
 		ir_MERGE_WITH(if_internal_func_end);
-		*observer_handler = ir_PHI_2(IR_ADDR, observer_handler_internal, observer_handler_user);
+		*observer_handler = ir_PHI_2(IR_ADDR, observer_handler_user, observer_handler_internal);
 	}
 
 	// JIT: if (*observer_handler == ZEND_OBSERVER_NONE_OBSERVED) {
@@ -7977,14 +8000,12 @@ static int zend_jit_escape_if_undef(zend_jit_ctx *jit, int var, uint32_t flags,
 	zend_jit_op_array_trace_extension *jit_extension =
 		(zend_jit_op_array_trace_extension*)ZEND_FUNC_INFO(op_array);
 	size_t offset = jit_extension->offset;
-	ir_ref ref = ir_CONST_ADDR(ZEND_OP_TRACE_INFO((opline - 1), offset)->orig_handler);
+	ir_ref ref = ir_CONST_FC_FUNC(ZEND_OP_TRACE_INFO((opline - 1), offset)->orig_handler);
 	if (GCC_GLOBAL_REGS || ZEND_VM_KIND == ZEND_VM_KIND_TAILCALL) {
 		ir_TAILCALL(IR_OPCODE_HANDLER_RET, ref);
 	} else {
-#if defined(IR_TARGET_X86)
-		ref = ir_CAST_FC_FUNC(ref);
-#endif
-		ir_TAILCALL_2(IR_ADDR, ref, jit_FP(jit), jit_IP(jit));
+		ir_ref opline_ref = ir_CALL_2(IR_OPCODE_HANDLER_RET, ref, jit_FP(jit), jit_IP(jit));
+		zend_jit_vm_enter(jit, opline_ref);
 	}
 
 	ir_IF_TRUE(if_def);
@@ -10421,28 +10442,19 @@ static int zend_jit_do_fcall(zend_jit_ctx *jit, const zend_op *opline, const zen
 		if (ZEND_OBSERVER_ENABLED && (!func || (func->common.fn_flags & (ZEND_ACC_CALL_VIA_TRAMPOLINE | ZEND_ACC_GENERATOR)) == 0)) {
 			ir_ref observer_handler;
 			ir_ref rx = jit_FP(jit);
+			const zend_op *observer_opline = NULL;
 			struct jit_observer_fcall_is_unobserved_data unobserved_data = jit_observer_fcall_is_unobserved_start(jit, func, &observer_handler, rx, func_ref);
 			if (trace && (trace->op != ZEND_JIT_TRACE_END || trace->stop < ZEND_JIT_TRACE_STOP_INTERPRETER)) {
 				ZEND_ASSERT(trace[1].op == ZEND_JIT_TRACE_VM || trace[1].op == ZEND_JIT_TRACE_END);
-				jit_SET_EX_OPLINE(jit, trace[1].opline);
+				observer_opline = trace[1].opline;
+				jit_SET_EX_OPLINE(jit, observer_opline);
 			} else {
 				// EX(opline) = opline
 				ir_STORE(jit_EX(opline), jit_IP(jit));
 			}
 			jit_observer_fcall_begin(jit, rx, observer_handler);
 
-			if (trace) {
-				int32_t exit_point = zend_jit_trace_get_exit_point(opline, ZEND_JIT_EXIT_TO_VM);
-
-				exit_addr = zend_jit_trace_get_exit_addr(exit_point);
-				if (!exit_addr) {
-					return 0;
-				}
-			} else {
-				exit_addr = NULL;
-			}
-
-			zend_jit_check_timeout(jit, NULL /* we're inside the called function */, exit_addr);
+			zend_jit_check_timeout(jit, observer_opline, NULL);
 
 			jit_observer_fcall_is_unobserved_end(jit, &unobserved_data);
 		}
@@ -16080,7 +16092,7 @@ static int zend_jit_fetch_static_prop(zend_jit_ctx *jit, const zend_op *opline,
 		case ZEND_FETCH_STATIC_PROP_UNSET:
 			fetch_type = BP_VAR_UNSET;
 			break;
-		EMPTY_SWITCH_DEFAULT_CASE();
+		default: ZEND_UNREACHABLE();
 	}
 
 	// JIT: result = CACHED_PTR(cache_slot + sizeof(void *));
@@ -16699,7 +16711,7 @@ static int zend_jit_switch(zend_jit_ctx *jit, const zend_op *opline, const zend_
 
 static int zend_jit_start(zend_jit_ctx *jit, const zend_op_array *op_array, zend_ssa *ssa)
 {
-	int i, count;
+	uint32_t i, count;
 	zend_basic_block *bb;
 
 	zend_jit_init_ctx(jit, (ZEND_VM_KIND == ZEND_VM_KIND_CALL || ZEND_VM_KIND == ZEND_VM_KIND_TAILCALL) ? 0 : (IR_START_BR_TARGET|IR_ENTRY_BR_TARGET));
@@ -17692,7 +17704,9 @@ static bool zend_jit_may_be_in_reg(const zend_op_array *op_array, zend_ssa *ssa,
 	}
 
 	if (JIT_G(trigger) != ZEND_JIT_ON_HOT_TRACE) {
-		int def_block, use_block, b, use, j;
+		uint32_t def_block, use_block;
+		int b, use;
+		uint32_t j;
 		zend_basic_block *bb;
 		zend_ssa_phi *p;
 		bool ret = true;
diff --git a/ext/opcache/jit/zend_jit_trace.c b/ext/opcache/jit/zend_jit_trace.c
index 2fcfaf96ab2d..024a5d0e194d 100644
--- a/ext/opcache/jit/zend_jit_trace.c
+++ b/ext/opcache/jit/zend_jit_trace.c
@@ -2,15 +2,13 @@
    +----------------------------------------------------------------------+
    | Zend JIT                                                             |
    +----------------------------------------------------------------------+
-   | Copyright (c) The PHP Group                                          |
+   | Copyright © The PHP Group and Contributors.                          |
    +----------------------------------------------------------------------+
-   | This source file is subject to version 3.01 of the PHP license,      |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | https://www.php.net/license/3_01.txt                                 |
-   | If you did not receive a copy of the PHP license and are unable to   |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@php.net so we can mail you a copy immediately.               |
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Authors: Dmitry Stogov                               |
    +----------------------------------------------------------------------+
@@ -258,14 +256,14 @@ static zend_string *zend_jit_trace_name(const zend_op_array *op_array, uint32_t
 	smart_str_appendc(&buf, '$');
 	if (op_array->function_name) {
 		if (op_array->scope) {
-			smart_str_appendl(&buf, ZSTR_VAL(op_array->scope->name), ZSTR_LEN(op_array->scope->name));
+			smart_str_append(&buf, op_array->scope->name);
 			smart_str_appends(&buf, "::");
-			smart_str_appendl(&buf, ZSTR_VAL(op_array->function_name), ZSTR_LEN(op_array->function_name));
+			smart_str_append(&buf, op_array->function_name);
 		} else {
-			smart_str_appendl(&buf, ZSTR_VAL(op_array->function_name), ZSTR_LEN(op_array->function_name));
+			smart_str_append(&buf, op_array->function_name);
 		}
 	} else if (op_array->filename) {
-		smart_str_appendl(&buf, ZSTR_VAL(op_array->filename), ZSTR_LEN(op_array->filename));
+		smart_str_append(&buf, op_array->filename);
 	}
 	smart_str_appendc(&buf, '$');
 	smart_str_append_long(&buf, (zend_long)lineno);
@@ -2361,6 +2359,9 @@ static zend_ssa *zend_jit_trace_build_tssa(zend_jit_trace_rec *trace_buffer, uin
 				if (ssa_ops[idx].op2_use >= 0 && ssa_ops[idx].op2_def >= 0) {
 					ssa_var_info[ssa_ops[idx].op2_def] = ssa_var_info[ssa_ops[idx].op2_use];
 				}
+				if (ssa_ops[idx].result_use >= 0 && ssa_ops[idx].result_def >= 0) {
+					ssa_var_info[ssa_ops[idx].result_def] = ssa_var_info[ssa_ops[idx].result_use];
+				}
 			} else {
 				if (zend_update_type_info(op_array, tssa, script, (zend_op*)opline, ssa_ops + idx, ssa_opcodes, optimization_level) == FAILURE) {
 					// TODO:
@@ -3953,7 +3954,7 @@ static int zend_jit_find_ssa_var(const zend_op_array *op_array,
                                  uint32_t             opline_num,
                                  uint32_t             var_num)
 {
-	int ssa_var, j, b = ssa->cfg.map[opline_num];
+	int ssa_var, b = ssa->cfg.map[opline_num];
 	const zend_basic_block *bb = ssa->cfg.blocks + b;
 	const zend_ssa_phi *phi;
 	const zend_ssa_op *ssa_op;
@@ -3997,7 +3998,7 @@ static int zend_jit_find_ssa_var(const zend_op_array *op_array,
 
 	ZEND_WORKLIST_ALLOCA(&worklist, ssa->cfg.blocks_count, use_heap);
 
-	for (j = 0; j < bb->predecessors_count; j++) {
+	for (uint32_t j = 0; j < bb->predecessors_count; j++) {
 		b = ssa->cfg.predecessors[bb->predecessor_offset + j];
 		zend_worklist_push(&worklist, b);
 	}
@@ -4038,7 +4039,7 @@ static int zend_jit_find_ssa_var(const zend_op_array *op_array,
 		if (ssa_var >= 0) {
 			goto found;
 		}
-		for (j = 0; j < bb->predecessors_count; j++) {
+		for (uint32_t j = 0; j < bb->predecessors_count; j++) {
 			b = ssa->cfg.predecessors[bb->predecessor_offset + j];
 			zend_worklist_push(&worklist, b);
 		}
@@ -5218,7 +5219,7 @@ static zend_vm_opcode_handler_t zend_jit_trace(zend_jit_trace_rec *trace_buffer,
 							 && ssa->vars[ssa_op->op2_def].use_chain < 0
 							 && !ssa->vars[ssa_op->op2_def].phi_use_chain) {
 								if (!zend_jit_store_type(&ctx, var_num, type)) {
-									return 0;
+									goto jit_failure;
 								}
 								SET_STACK_TYPE(stack, var_num, type, 1);
 							}
@@ -5271,7 +5272,7 @@ static zend_vm_opcode_handler_t zend_jit_trace(zend_jit_trace_rec *trace_buffer,
 							 && ssa->vars[ssa_op->op1_def].use_chain < 0
 							 && !ssa->vars[ssa_op->op1_def].phi_use_chain) {
 								if (!zend_jit_store_type(&ctx, var_num, type)) {
-									return 0;
+									goto jit_failure;
 								}
 								SET_STACK_TYPE(stack, var_num, type, 1);
 							}
@@ -5368,7 +5369,7 @@ static zend_vm_opcode_handler_t zend_jit_trace(zend_jit_trace_rec *trace_buffer,
 							 && ssa->vars[ssa_op->op1_def].use_chain < 0
 							 && !ssa->vars[ssa_op->op1_def].phi_use_chain) {
 								if (!zend_jit_store_type(&ctx, var_num, type)) {
-									return 0;
+									goto jit_failure;
 								}
 								SET_STACK_TYPE(stack, var_num, type, 1);
 							}
@@ -6627,7 +6628,7 @@ static zend_vm_opcode_handler_t zend_jit_trace(zend_jit_trace_rec *trace_buffer,
 											var_num = EX_VAR_TO_NUM(var_num);
 
 											if (!zend_jit_store_type(&ctx, var_num, type)) {
-												return 0;
+												goto jit_failure;
 											}
 											SET_STACK_TYPE(stack, var_num, type, 1);
 										}
@@ -7266,7 +7267,7 @@ static zend_vm_opcode_handler_t zend_jit_trace(zend_jit_trace_rec *trace_buffer,
 				 && type != STACK_MEM_TYPE(stack, i)
 				 && zend_jit_trace_must_store_type(op_array, op_array_ssa, opline - op_array->opcodes, i, type)) {
 					if (!zend_jit_store_type(jit, i, type)) {
-						return 0;
+						goto jit_failure;
 					}
 					SET_STACK_TYPE(stack, i, type, 1);
 				}
@@ -7387,11 +7388,11 @@ static zend_vm_opcode_handler_t zend_jit_trace(zend_jit_trace_rec *trace_buffer,
 		zend_string_release(name);
 	}
 
+jit_cleanup:;
 	} zend_catch {
 		do_bailout = 1;
 	}  zend_end_try();
 
-jit_cleanup:
 	/* Clean up used op_arrays */
 	while (num_op_arrays > 0) {
 		op_array = op_arrays[--num_op_arrays];
@@ -8570,7 +8571,7 @@ int ZEND_FASTCALL zend_jit_trace_hot_side(zend_execute_data *execute_data, uint3
 			do {
 				ex = ex->prev_execute_data;
 				n++;
-			} while (ex && zend_jit_traces[root].op_array != &ex->func->op_array);
+			} while (ex && (!ex->func || zend_jit_traces[root].op_array != &ex->func->op_array));
 			if (ex && n <= ZEND_JIT_TRACE_MAX_RET_DEPTH) {
 				ret_depth = n;
 			}
diff --git a/ext/opcache/jit/zend_jit_vm_helpers.c b/ext/opcache/jit/zend_jit_vm_helpers.c
index bed5ab59992e..271d923598d9 100644
--- a/ext/opcache/jit/zend_jit_vm_helpers.c
+++ b/ext/opcache/jit/zend_jit_vm_helpers.c
@@ -2,15 +2,13 @@
    +----------------------------------------------------------------------+
    | Zend JIT                                                             |
    +----------------------------------------------------------------------+
-   | Copyright (c) The PHP Group                                          |
+   | Copyright © The PHP Group and Contributors.                          |
    +----------------------------------------------------------------------+
-   | This source file is subject to version 3.01 of the PHP license,      |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | https://www.php.net/license/3_01.txt                                 |
-   | If you did not receive a copy of the PHP license and are unable to   |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@php.net so we can mail you a copy immediately.               |
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Authors: Dmitry Stogov                               |
    |          Xinchen Hui                               |
@@ -1072,6 +1070,11 @@ zend_jit_trace_stop ZEND_FASTCALL zend_jit_trace_execute(zend_execute_data  *ex,
 		if (UNEXPECTED(opline == zend_jit_halt_op)) {
 #else
 		opline = handler(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+# if ZEND_VM_KIND == ZEND_VM_KIND_TAILCALL
+		while (UNEXPECTED(opline == zend_jit_interrupt_op)) {
+			opline = zend_vm_handle_interrupt(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+		}
+# endif
 		if (UNEXPECTED(((uintptr_t)opline & ~ZEND_VM_ENTER_BIT) == 0)) {
 #endif
 			if (prev_opline->opcode == ZEND_YIELD || prev_opline->opcode == ZEND_YIELD_FROM) {
@@ -1097,6 +1100,8 @@ zend_jit_trace_stop ZEND_FASTCALL zend_jit_trace_execute(zend_execute_data  *ex,
 			if (UNEXPECTED(!jit_extension)
 			 || UNEXPECTED(!(jit_extension->func_info.flags & ZEND_FUNC_JIT_ON_HOT_TRACE))) {
 				if (execute_data->prev_execute_data != prev_execute_data) {
+					stop = ZEND_JIT_TRACE_STOP_RETURN;
+				} else {
 					stop = ZEND_JIT_TRACE_STOP_INTERPRETER;
 				}
 				break;
diff --git a/ext/opcache/shared_alloc_mmap.c b/ext/opcache/shared_alloc_mmap.c
index cf5dbb29ebfd..a805912d0d75 100644
--- a/ext/opcache/shared_alloc_mmap.c
+++ b/ext/opcache/shared_alloc_mmap.c
@@ -2,15 +2,13 @@
    +----------------------------------------------------------------------+
    | Zend OPcache                                                         |
    +----------------------------------------------------------------------+
-   | Copyright (c) The PHP Group                                          |
+   | Copyright © The PHP Group and Contributors.                          |
    +----------------------------------------------------------------------+
-   | This source file is subject to version 3.01 of the PHP license,      |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | https://www.php.net/license/3_01.txt                                 |
-   | If you did not receive a copy of the PHP license and are unable to   |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@php.net so we can mail you a copy immediately.               |
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Authors: Andi Gutmans                                  |
    |          Zeev Suraski                                  |
diff --git a/ext/opcache/shared_alloc_posix.c b/ext/opcache/shared_alloc_posix.c
index 3f1e097fe97c..36ed7950044f 100644
--- a/ext/opcache/shared_alloc_posix.c
+++ b/ext/opcache/shared_alloc_posix.c
@@ -2,15 +2,13 @@
    +----------------------------------------------------------------------+
    | Zend OPcache                                                         |
    +----------------------------------------------------------------------+
-   | Copyright (c) The PHP Group                                          |
+   | Copyright © The PHP Group and Contributors.                          |
    +----------------------------------------------------------------------+
-   | This source file is subject to version 3.01 of the PHP license,      |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | https://www.php.net/license/3_01.txt                                 |
-   | If you did not receive a copy of the PHP license and are unable to   |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@php.net so we can mail you a copy immediately.               |
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Authors: Andi Gutmans                                  |
    |          Zeev Suraski                                  |
diff --git a/ext/opcache/shared_alloc_shm.c b/ext/opcache/shared_alloc_shm.c
index b9f8ca4524a0..e98ac615f860 100644
--- a/ext/opcache/shared_alloc_shm.c
+++ b/ext/opcache/shared_alloc_shm.c
@@ -2,15 +2,13 @@
    +----------------------------------------------------------------------+
    | Zend OPcache                                                         |
    +----------------------------------------------------------------------+
-   | Copyright (c) The PHP Group                                          |
+   | Copyright © The PHP Group and Contributors.                          |
    +----------------------------------------------------------------------+
-   | This source file is subject to version 3.01 of the PHP license,      |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | https://www.php.net/license/3_01.txt                                 |
-   | If you did not receive a copy of the PHP license and are unable to   |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@php.net so we can mail you a copy immediately.               |
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Authors: Andi Gutmans                                  |
    |          Zeev Suraski                                  |
diff --git a/ext/opcache/shared_alloc_win32.c b/ext/opcache/shared_alloc_win32.c
index c51c459ed553..84bd32e9cbad 100644
--- a/ext/opcache/shared_alloc_win32.c
+++ b/ext/opcache/shared_alloc_win32.c
@@ -2,15 +2,13 @@
    +----------------------------------------------------------------------+
    | Zend OPcache                                                         |
    +----------------------------------------------------------------------+
-   | Copyright (c) The PHP Group                                          |
+   | Copyright © The PHP Group and Contributors.                          |
    +----------------------------------------------------------------------+
-   | This source file is subject to version 3.01 of the PHP license,      |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | https://www.php.net/license/3_01.txt                                 |
-   | If you did not receive a copy of the PHP license and are unable to   |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@php.net so we can mail you a copy immediately.               |
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Authors: Andi Gutmans                                  |
    |          Zeev Suraski                                  |
diff --git a/ext/opcache/tests/gh20469.phpt b/ext/opcache/tests/gh20469.phpt
new file mode 100644
index 000000000000..1cd826c177ef
--- /dev/null
+++ b/ext/opcache/tests/gh20469.phpt
@@ -0,0 +1,134 @@
+--TEST--
+GH-20469: Inheritance cache with reentrant autoloading must not crash
+--EXTENSIONS--
+opcache
+--CONFLICTS--
+server
+--FILE--
+ ParentBeingLinked -> CovariantReturnWithTrait
+ * -> RequiresRootReturnTrait -> ChildOfParentBeingLinked.
+ */
+file_put_contents($dir . '/test1.php', <<<'PHP'
+
+--CLEAN--
+isDir()) {
+            rmdir($file->getPathname());
+        } else {
+            unlink($file->getPathname());
+        }
+    }
+    rmdir($dir);
+}
+?>
+--EXPECT--
+3
+3
diff --git a/ext/opcache/tests/gh20469_child_variance_resolves_parent.phpt b/ext/opcache/tests/gh20469_child_variance_resolves_parent.phpt
new file mode 100644
index 000000000000..4a66c3b0513d
--- /dev/null
+++ b/ext/opcache/tests/gh20469_child_variance_resolves_parent.phpt
@@ -0,0 +1,181 @@
+--TEST--
+GH-20469: Child delayed variance can resolve parent before direct delayed resolution
+--DESCRIPTION--
+This variant ensures the cacheability check after load_delayed_classes() is
+needed. Loading the delayed child resolves the parent class's variance
+obligations reentrantly, so the parent no longer has ZEND_ACC_UNRESOLVED_VARIANCE
+when control returns from load_delayed_classes(). The parent was still used while
+nearly linked, and must not be inserted into the inheritance cache.
+--EXTENSIONS--
+opcache
+--CONFLICTS--
+server
+--FILE--
+ CovariantReturnWithTrait -> RequiresRootReturnTrait
+ * -> ChildOfParentBeingLinked -> ParentBeingLinked.
+ *
+ * ChildOfParentBeingLinked also has delayed variance, so resolving the child's
+ * dependency on ParentBeingLinked can resolve ParentBeingLinked before it
+ * reaches its direct resolve_delayed_variance_obligations() call.
+ */
+file_put_contents($dir . '/test1.php', <<<'PHP'
+test());
+PHP);
+
+file_put_contents($dir . '/test3.php', <<<'PHP'
+test());
+PHP);
+
+file_put_contents($dir . '/classes/RootForTraitReturn.php', <<<'PHP'
+
+--CLEAN--
+isDir()) {
+            rmdir($file->getPathname());
+        } else {
+            unlink($file->getPathname());
+        }
+    }
+    rmdir($dir);
+}
+?>
+--EXPECT--
+3
+3NULL
+3NULL
diff --git a/ext/opcache/tests/gh20469_inheritance_cache_cleanup.phpt b/ext/opcache/tests/gh20469_inheritance_cache_cleanup.phpt
new file mode 100644
index 000000000000..aabbc398cbc3
--- /dev/null
+++ b/ext/opcache/tests/gh20469_inheritance_cache_cleanup.phpt
@@ -0,0 +1,22 @@
+--TEST--
+GH-20469: Skipped inheritance cache cleanup must ignore non-cacheable classes
+--DESCRIPTION--
+Autoloading the parent makes the child use the runtime class-linking path, but
+the child does not enter inheritance-cache construction. Under ASAN, the
+uninitialized inheritance_cache field is filled with non-zero bytes. Skipped
+cache insertion must not treat that value as a temporary dependency table.
+--EXTENSIONS--
+opcache
+--FILE--
+
+--EXPECT--
+ok
diff --git a/ext/opcache/tests/gh20469_inherited_method.phpt b/ext/opcache/tests/gh20469_inherited_method.phpt
new file mode 100644
index 000000000000..f3c038bdc330
--- /dev/null
+++ b/ext/opcache/tests/gh20469_inherited_method.phpt
@@ -0,0 +1,138 @@
+--TEST--
+GH-20469: Inheritance cache with reentrant autoloading must preserve inherited methods
+--EXTENSIONS--
+opcache
+--CONFLICTS--
+server
+--FILE--
+ ParentBeingLinked -> CovariantReturnWithTrait
+ * -> RequiresRootReturnTrait -> ChildOfParentBeingLinked.
+ */
+file_put_contents($dir . '/test1.php', <<<'PHP'
+test());
+PHP);
+
+file_put_contents($dir . '/classes/RootForTraitReturn.php', <<<'PHP'
+
+--CLEAN--
+isDir()) {
+            rmdir($file->getPathname());
+        } else {
+            unlink($file->getPathname());
+        }
+    }
+    rmdir($dir);
+}
+?>
+--EXPECT--
+3
+3NULL
diff --git a/ext/opcache/tests/gh22071.phpt b/ext/opcache/tests/gh22071.phpt
new file mode 100644
index 000000000000..148ca461be21
--- /dev/null
+++ b/ext/opcache/tests/gh22071.phpt
@@ -0,0 +1,20 @@
+--TEST--
+GH-22071: Assertion failure jit_CONST_FUNC_PROTO on abstract static method call
+--CREDITS--
+YuanchengJiang
+--EXTENSIONS--
+opcache
+--INI--
+opcache.enable=1
+opcache.enable_cli=1
+opcache.jit=1205
+opcache.jit_buffer_size=16M
+--FILE--
+
+--EXPECT--
+ok
diff --git a/ext/opcache/tests/jit/gh21158.phpt b/ext/opcache/tests/jit/gh21158.phpt
new file mode 100644
index 000000000000..89afd058c665
--- /dev/null
+++ b/ext/opcache/tests/jit/gh21158.phpt
@@ -0,0 +1,49 @@
+--TEST--
+GH-21158: Assertion jit->ra[var].flags & (1<<0) failed in zend_jit_use_reg
+--CREDITS--
+YuanchengJiang
+--EXTENSIONS--
+opcache
+--INI--
+opcache.jit=1254
+--FILE--
+= 0 && $col - 1 >= 0 && $board[$row - 1][$col - 1] == 1) $live_neighbors++;
+    if ($row >= 1 && $col + 1 < COL && $board[$row - 1][$col + 1] == 1) $live_neighbors++;
+    return $live_neighbors;
+}
+$board = [
+    [1,1,0,0,1,1,1,1,1,0],
+    [0,1,0,1,1,0,0,1,0,0],
+    [0,1,0,0,1,0,0,0,1,0],
+    [0,0,1,1,1,1,1,0,0,0],
+    [1,1,1,1,1,1,0,1,1,0],
+    [0,1,0,0,1,1,1,0,1,0],
+    [0,1,1,0,1,1,1,1,0,0],
+    [1,1,0,0,0,0,1,1,1,0],
+    [1,0,0,1,1,0,1,1,0,1],
+    [0,0,1,1,1,0,1,1,0,1],
+];
+for ($i = 0; $i < ROW; $i++) {
+    for ($j = 0; $j < COL; $j++) {
+        echo count_live_neighbors($board, $i, $j), ",";
+    }
+    echo "\n";
+}
+?>
+--EXPECT--
+1,0,0,1,1,1,1,1,0,0,
+2,1,2,2,1,2,3,2,1,1,
+2,0,2,2,1,1,1,1,1,0,
+1,1,2,2,1,2,0,1,0,1,
+1,2,2,3,3,2,2,2,0,0,
+2,2,2,3,3,2,2,2,1,1,
+2,1,1,2,2,3,2,2,0,1,
+2,1,1,2,1,3,3,2,1,0,
+1,1,2,1,0,2,2,2,2,1,
+0,2,2,2,1,3,2,1,3,0,
diff --git a/ext/opcache/tests/jit/gh21368_call_vm.phpt b/ext/opcache/tests/jit/gh21368_call_vm.phpt
new file mode 100644
index 000000000000..cc64e62a610e
--- /dev/null
+++ b/ext/opcache/tests/jit/gh21368_call_vm.phpt
@@ -0,0 +1,36 @@
+--TEST--
+GH-21368 (JIT escape_if_undef SEGV on CALL VM with aggressive trace counters)
+--INI--
+opcache.enable=1
+opcache.enable_cli=1
+opcache.jit_buffer_size=64M
+opcache.jit=tracing
+opcache.protect_memory=1
+opcache.jit_hot_loop=1
+opcache.jit_hot_func=1
+opcache.jit_hot_return=1
+opcache.jit_hot_side_exit=1
+--FILE--
+x; }
+}
+
+$o1 = new C;
+$o2 = new C;
+$o2->x = false;
+$o3 = new C;
+unset($o3->x);
+$a = [$o1, $o2, $o3];
+
+for ($i = 0; $i < 8; $i++) {
+    $m = $a[$i % 3];
+    $m->getX();
+    $m->getX();
+}
+?>
+OK
+--EXPECT--
+OK
diff --git a/ext/opcache/tests/jit/gh21593.phpt b/ext/opcache/tests/jit/gh21593.phpt
new file mode 100644
index 000000000000..d37500195737
--- /dev/null
+++ b/ext/opcache/tests/jit/gh21593.phpt
@@ -0,0 +1,49 @@
+--TEST--
+GH-21593: Function JIT JMPNZ smart branch
+--CREDITS--
+paulmhh
+--EXTENSIONS--
+opcache
+--INI--
+opcache.enable=1
+opcache.enable_cli=1
+opcache.jit=function
+--FILE--
+a)) {
+        echo "1\n";
+    }
+}
+
+function test2($a) {
+    if (!isset($a?->a)) {
+        echo "2\n";
+    }
+}
+
+function test3($a) {
+    if (empty($a?->a)) {
+        echo "3\n";
+    }
+}
+
+function test4($a) {
+    if (!empty($a?->a)) {
+        echo "4\n";
+    }
+}
+
+$a = new stdClass;
+$a->a = 'a';
+
+test1($a);
+test2($a);
+test3($a);
+test4($a);
+
+?>
+--EXPECT--
+1
+4
diff --git a/ext/opcache/tests/jit/gh21746.inc b/ext/opcache/tests/jit/gh21746.inc
new file mode 100644
index 000000000000..b118625484d0
--- /dev/null
+++ b/ext/opcache/tests/jit/gh21746.inc
@@ -0,0 +1,16 @@
+ '';
+ $e = fn() => '';
+ $f = fn() => '';
+ $g = fn() => '';
+ return ''
+  .LR::p(null, '', null, [], '')
+  .LR::hbbch([null], $d)
+  .LR::hbbch([null], $e)
+  .LR::hbbch([null], $f)
+  .LR::hbbch([null], $g);
+};
diff --git a/ext/opcache/tests/jit/gh21746.phpt b/ext/opcache/tests/jit/gh21746.phpt
new file mode 100644
index 000000000000..29b3be778be7
--- /dev/null
+++ b/ext/opcache/tests/jit/gh21746.phpt
@@ -0,0 +1,112 @@
+--TEST--
+GH-21746: Segfault with tracing JIT on 2nd call of eval'd closure
+--CREDITS--
+theodorejb
+--EXTENSIONS--
+opcache
+--INI--
+opcache.jit=tracing
+--FILE--
+ $_) { if ($i === 0) break; }
+        return $result;
+    }
+    public static function hbbch(array $positional, ?\Closure $cb): string {
+        if ($cb && is_array($positional[0] ?? null)) foreach ($positional[0] as $v) $cb($v);
+        return '';
+    }
+}
+
+$renderFile = __DIR__ . '/gh21746.inc';
+
+// prevent JITing $renderFile
+ini_set('opcache.file_update_protection', 100);
+touch($renderFile);
+
+$renderer = require $renderFile;
+
+for ($r = 0; $r < 70; $r++) {
+    echo "Render $r...";
+    $renderer();
+    echo "OK\n";
+}
+
+?>
+==DONE==
+--EXPECT--
+Render 0...OK
+Render 1...OK
+Render 2...OK
+Render 3...OK
+Render 4...OK
+Render 5...OK
+Render 6...OK
+Render 7...OK
+Render 8...OK
+Render 9...OK
+Render 10...OK
+Render 11...OK
+Render 12...OK
+Render 13...OK
+Render 14...OK
+Render 15...OK
+Render 16...OK
+Render 17...OK
+Render 18...OK
+Render 19...OK
+Render 20...OK
+Render 21...OK
+Render 22...OK
+Render 23...OK
+Render 24...OK
+Render 25...OK
+Render 26...OK
+Render 27...OK
+Render 28...OK
+Render 29...OK
+Render 30...OK
+Render 31...OK
+Render 32...OK
+Render 33...OK
+Render 34...OK
+Render 35...OK
+Render 36...OK
+Render 37...OK
+Render 38...OK
+Render 39...OK
+Render 40...OK
+Render 41...OK
+Render 42...OK
+Render 43...OK
+Render 44...OK
+Render 45...OK
+Render 46...OK
+Render 47...OK
+Render 48...OK
+Render 49...OK
+Render 50...OK
+Render 51...OK
+Render 52...OK
+Render 53...OK
+Render 54...OK
+Render 55...OK
+Render 56...OK
+Render 57...OK
+Render 58...OK
+Render 59...OK
+Render 60...OK
+Render 61...OK
+Render 62...OK
+Render 63...OK
+Render 64...OK
+Render 65...OK
+Render 66...OK
+Render 67...OK
+Render 68...OK
+Render 69...OK
+==DONE==
diff --git a/ext/opcache/tests/jit/gh22004.phpt b/ext/opcache/tests/jit/gh22004.phpt
new file mode 100644
index 000000000000..bb60868a269f
--- /dev/null
+++ b/ext/opcache/tests/jit/gh22004.phpt
@@ -0,0 +1,63 @@
+--TEST--
+GH-22004: ZEND_FE_FETCH_R with key operand
+--CREDITS--
+YuanchengJiang
+--FILE--
+ $line) {
+        }
+    }
+}
+$iter = 20;
+doRandom($iter);
+
+?>
+==DONE==
+--EXPECTF--
+Warning: Undefined variable $nLines in %s on line %d
+
+Warning: Undefined variable $nLines in %s on line %d
+
+Warning: Undefined variable $nLines in %s on line %d
+
+Warning: Undefined variable $nLines in %s on line %d
+
+Warning: Undefined variable $nLines in %s on line %d
+
+Warning: Undefined variable $nLines in %s on line %d
+
+Warning: Undefined variable $nLines in %s on line %d
+
+Warning: Undefined variable $nLines in %s on line %d
+
+Warning: Undefined variable $nLines in %s on line %d
+
+Warning: Undefined variable $nLines in %s on line %d
+
+Warning: Undefined variable $nLines in %s on line %d
+
+Warning: Undefined variable $nLines in %s on line %d
+
+Warning: Undefined variable $nLines in %s on line %d
+
+Warning: Undefined variable $nLines in %s on line %d
+
+Warning: Undefined variable $nLines in %s on line %d
+
+Warning: Undefined variable $nLines in %s on line %d
+
+Warning: Undefined variable $nLines in %s on line %d
+
+Warning: Undefined variable $nLines in %s on line %d
+
+Warning: Undefined variable $nLines in %s on line %d
+
+Warning: Undefined variable $nLines in %s on line %d
+==DONE==
diff --git a/ext/opcache/tests/jit/gh22158.phpt b/ext/opcache/tests/jit/gh22158.phpt
new file mode 100644
index 000000000000..ce7f9bc55938
--- /dev/null
+++ b/ext/opcache/tests/jit/gh22158.phpt
@@ -0,0 +1,33 @@
+--TEST--
+GH-22158 (Tracing JIT dispatches observer begin handler through the wrong run_time_cache slot on megamorphic calls)
+--EXTENSIONS--
+opcache
+zend_test
+--INI--
+opcache.enable=1
+opcache.enable_cli=1
+opcache.jit=tracing
+opcache.jit_buffer_size=32M
+opcache.jit_max_polymorphic_calls=0
+zend_test.observer.enabled=1
+zend_test.observer.observe_all=1
+zend_test.observer.show_output=0
+zend_test.observer.reserve_op_array_handle=1
+--FILE--
+f();
+}
+echo $t, "\n";
+?>
+--EXPECT--
+600000
diff --git a/ext/opcache/tests/opt/gh21972.phpt b/ext/opcache/tests/opt/gh21972.phpt
new file mode 100644
index 000000000000..f34f9b45ccf2
--- /dev/null
+++ b/ext/opcache/tests/opt/gh21972.phpt
@@ -0,0 +1,39 @@
+--TEST--
+GH-21972: Typed by-value return must not leak reference wrapper
+--INI--
+opcache.enable=1
+opcache.enable_cli=1
+opcache.optimization_level=-1
+--EXTENSIONS--
+opcache
+--FILE--
+
+--EXPECT--
+string(6) "string"
+string(5) "false"
+string(5) "false"
diff --git a/ext/opcache/zend_accelerator_api.c b/ext/opcache/zend_accelerator_api.c
index 27267e8791ab..907b6b96e705 100644
--- a/ext/opcache/zend_accelerator_api.c
+++ b/ext/opcache/zend_accelerator_api.c
@@ -2,15 +2,13 @@
    +----------------------------------------------------------------------+
    | Zend OPcache                                                         |
    +----------------------------------------------------------------------+
-   | Copyright (c) The PHP Group                                          |
+   | Copyright © The PHP Group and Contributors.                          |
    +----------------------------------------------------------------------+
-   | This source file is subject to version 3.01 of the PHP license,      |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | https://www.php.net/license/3_01.txt                                 |
-   | If you did not receive a copy of the PHP license and are unable to   |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@php.net so we can mail you a copy immediately.               |
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
 */
 
diff --git a/ext/opcache/zend_accelerator_api.h b/ext/opcache/zend_accelerator_api.h
index 4ea42f29d174..002a69eee9f3 100644
--- a/ext/opcache/zend_accelerator_api.h
+++ b/ext/opcache/zend_accelerator_api.h
@@ -2,15 +2,13 @@
    +----------------------------------------------------------------------+
    | Zend OPcache                                                         |
    +----------------------------------------------------------------------+
-   | Copyright (c) The PHP Group                                          |
+   | Copyright © The PHP Group and Contributors.                          |
    +----------------------------------------------------------------------+
-   | This source file is subject to version 3.01 of the PHP license,      |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | https://www.php.net/license/3_01.txt                                 |
-   | If you did not receive a copy of the PHP license and are unable to   |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@php.net so we can mail you a copy immediately.               |
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
 */
 
diff --git a/ext/opcache/zend_accelerator_blacklist.c b/ext/opcache/zend_accelerator_blacklist.c
index 631f8b34608f..ed03a82e9f3f 100644
--- a/ext/opcache/zend_accelerator_blacklist.c
+++ b/ext/opcache/zend_accelerator_blacklist.c
@@ -2,15 +2,13 @@
    +----------------------------------------------------------------------+
    | Zend OPcache                                                         |
    +----------------------------------------------------------------------+
-   | Copyright (c) The PHP Group                                          |
+   | Copyright © The PHP Group and Contributors.                          |
    +----------------------------------------------------------------------+
-   | This source file is subject to version 3.01 of the PHP license,      |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | https://www.php.net/license/3_01.txt                                 |
-   | If you did not receive a copy of the PHP license and are unable to   |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@php.net so we can mail you a copy immediately.               |
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Authors: Andi Gutmans                                  |
    |          Zeev Suraski                                  |
@@ -227,7 +225,7 @@ static inline void zend_accel_blacklist_allocate(zend_blacklist *blacklist)
 {
 	if (blacklist->pos == blacklist->size) {
 		blacklist->size += ZEND_BLACKLIST_BLOCK_SIZE;
-		blacklist->entries = (zend_blacklist_entry *) realloc(blacklist->entries, sizeof(zend_blacklist_entry)*blacklist->size);
+		blacklist->entries = (zend_blacklist_entry *) perealloc(blacklist->entries, sizeof(zend_blacklist_entry)*blacklist->size, true);
 	}
 }
 
diff --git a/ext/opcache/zend_accelerator_blacklist.h b/ext/opcache/zend_accelerator_blacklist.h
index da6e04e31b7c..4a337dd9814b 100644
--- a/ext/opcache/zend_accelerator_blacklist.h
+++ b/ext/opcache/zend_accelerator_blacklist.h
@@ -2,15 +2,13 @@
    +----------------------------------------------------------------------+
    | Zend OPcache                                                         |
    +----------------------------------------------------------------------+
-   | Copyright (c) The PHP Group                                          |
+   | Copyright © The PHP Group and Contributors.                          |
    +----------------------------------------------------------------------+
-   | This source file is subject to version 3.01 of the PHP license,      |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | https://www.php.net/license/3_01.txt                                 |
-   | If you did not receive a copy of the PHP license and are unable to   |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@php.net so we can mail you a copy immediately.               |
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Authors: Andi Gutmans                                  |
    |          Zeev Suraski                                  |
diff --git a/ext/opcache/zend_accelerator_debug.c b/ext/opcache/zend_accelerator_debug.c
index b2a3105dc627..418ef805d633 100644
--- a/ext/opcache/zend_accelerator_debug.c
+++ b/ext/opcache/zend_accelerator_debug.c
@@ -2,15 +2,13 @@
    +----------------------------------------------------------------------+
    | Zend OPcache                                                         |
    +----------------------------------------------------------------------+
-   | Copyright (c) The PHP Group                                          |
+   | Copyright © The PHP Group and Contributors.                          |
    +----------------------------------------------------------------------+
-   | This source file is subject to version 3.01 of the PHP license,      |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | https://www.php.net/license/3_01.txt                                 |
-   | If you did not receive a copy of the PHP license and are unable to   |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@php.net so we can mail you a copy immediately.               |
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Authors: Andi Gutmans                                  |
    |          Zeev Suraski                                  |
diff --git a/ext/opcache/zend_accelerator_debug.h b/ext/opcache/zend_accelerator_debug.h
index 4a19da57b5e6..d71a48893871 100644
--- a/ext/opcache/zend_accelerator_debug.h
+++ b/ext/opcache/zend_accelerator_debug.h
@@ -2,15 +2,13 @@
    +----------------------------------------------------------------------+
    | Zend OPcache                                                         |
    +----------------------------------------------------------------------+
-   | Copyright (c) The PHP Group                                          |
+   | Copyright © The PHP Group and Contributors.                          |
    +----------------------------------------------------------------------+
-   | This source file is subject to version 3.01 of the PHP license,      |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | https://www.php.net/license/3_01.txt                                 |
-   | If you did not receive a copy of the PHP license and are unable to   |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@php.net so we can mail you a copy immediately.               |
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Authors: Andi Gutmans                                  |
    |          Zeev Suraski                                  |
diff --git a/ext/opcache/zend_accelerator_hash.c b/ext/opcache/zend_accelerator_hash.c
index 5198c0b3b78c..e35528f7f414 100644
--- a/ext/opcache/zend_accelerator_hash.c
+++ b/ext/opcache/zend_accelerator_hash.c
@@ -2,15 +2,13 @@
    +----------------------------------------------------------------------+
    | Zend OPcache                                                         |
    +----------------------------------------------------------------------+
-   | Copyright (c) The PHP Group                                          |
+   | Copyright © The PHP Group and Contributors.                          |
    +----------------------------------------------------------------------+
-   | This source file is subject to version 3.01 of the PHP license,      |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | https://www.php.net/license/3_01.txt                                 |
-   | If you did not receive a copy of the PHP license and are unable to   |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@php.net so we can mail you a copy immediately.               |
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Authors: Andi Gutmans                                  |
    |          Zeev Suraski                                  |
diff --git a/ext/opcache/zend_accelerator_hash.h b/ext/opcache/zend_accelerator_hash.h
index 2f9197385386..6091361a68c8 100644
--- a/ext/opcache/zend_accelerator_hash.h
+++ b/ext/opcache/zend_accelerator_hash.h
@@ -2,15 +2,13 @@
    +----------------------------------------------------------------------+
    | Zend OPcache                                                         |
    +----------------------------------------------------------------------+
-   | Copyright (c) The PHP Group                                          |
+   | Copyright © The PHP Group and Contributors.                          |
    +----------------------------------------------------------------------+
-   | This source file is subject to version 3.01 of the PHP license,      |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | https://www.php.net/license/3_01.txt                                 |
-   | If you did not receive a copy of the PHP license and are unable to   |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@php.net so we can mail you a copy immediately.               |
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Authors: Andi Gutmans                                  |
    |          Zeev Suraski                                  |
diff --git a/ext/opcache/zend_accelerator_module.c b/ext/opcache/zend_accelerator_module.c
index 1eaa183f9df5..465b15cd9576 100644
--- a/ext/opcache/zend_accelerator_module.c
+++ b/ext/opcache/zend_accelerator_module.c
@@ -2,15 +2,13 @@
    +----------------------------------------------------------------------+
    | Zend OPcache                                                         |
    +----------------------------------------------------------------------+
-   | Copyright (c) The PHP Group                                          |
+   | Copyright © The PHP Group and Contributors.                          |
    +----------------------------------------------------------------------+
-   | This source file is subject to version 3.01 of the PHP license,      |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | https://www.php.net/license/3_01.txt                                 |
-   | If you did not receive a copy of the PHP license and are unable to   |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@php.net so we can mail you a copy immediately.               |
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Authors: Andi Gutmans                                  |
    |          Zeev Suraski                                  |
diff --git a/ext/opcache/zend_accelerator_module.h b/ext/opcache/zend_accelerator_module.h
index 6eff0624bbbf..cd46e07d1d27 100644
--- a/ext/opcache/zend_accelerator_module.h
+++ b/ext/opcache/zend_accelerator_module.h
@@ -2,15 +2,13 @@
    +----------------------------------------------------------------------+
    | Zend OPcache                                                         |
    +----------------------------------------------------------------------+
-   | Copyright (c) The PHP Group                                          |
+   | Copyright © The PHP Group and Contributors.                          |
    +----------------------------------------------------------------------+
-   | This source file is subject to version 3.01 of the PHP license,      |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | https://www.php.net/license/3_01.txt                                 |
-   | If you did not receive a copy of the PHP license and are unable to   |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@php.net so we can mail you a copy immediately.               |
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Authors: Andi Gutmans                                  |
    |          Zeev Suraski                                  |
diff --git a/ext/opcache/zend_accelerator_util_funcs.c b/ext/opcache/zend_accelerator_util_funcs.c
index 1f4c8094ac89..90496e456593 100644
--- a/ext/opcache/zend_accelerator_util_funcs.c
+++ b/ext/opcache/zend_accelerator_util_funcs.c
@@ -2,15 +2,13 @@
    +----------------------------------------------------------------------+
    | Zend OPcache                                                         |
    +----------------------------------------------------------------------+
-   | Copyright (c) The PHP Group                                          |
+   | Copyright © The PHP Group and Contributors.                          |
    +----------------------------------------------------------------------+
-   | This source file is subject to version 3.01 of the PHP license,      |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | https://www.php.net/license/3_01.txt                                 |
-   | If you did not receive a copy of the PHP license and are unable to   |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@php.net so we can mail you a copy immediately.               |
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Authors: Andi Gutmans                                  |
    |          Zeev Suraski                                  |
diff --git a/ext/opcache/zend_accelerator_util_funcs.h b/ext/opcache/zend_accelerator_util_funcs.h
index fa248edeef55..a95b2095ebbd 100644
--- a/ext/opcache/zend_accelerator_util_funcs.h
+++ b/ext/opcache/zend_accelerator_util_funcs.h
@@ -2,15 +2,13 @@
    +----------------------------------------------------------------------+
    | Zend OPcache                                                         |
    +----------------------------------------------------------------------+
-   | Copyright (c) The PHP Group                                          |
+   | Copyright © The PHP Group and Contributors.                          |
    +----------------------------------------------------------------------+
-   | This source file is subject to version 3.01 of the PHP license,      |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | https://www.php.net/license/3_01.txt                                 |
-   | If you did not receive a copy of the PHP license and are unable to   |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@php.net so we can mail you a copy immediately.               |
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Authors: Andi Gutmans                                  |
    |          Zeev Suraski                                  |
diff --git a/ext/opcache/zend_file_cache.c b/ext/opcache/zend_file_cache.c
index 3114e5b92712..af59b9b2c34a 100644
--- a/ext/opcache/zend_file_cache.c
+++ b/ext/opcache/zend_file_cache.c
@@ -2,15 +2,13 @@
    +----------------------------------------------------------------------+
    | Zend OPcache                                                         |
    +----------------------------------------------------------------------+
-   | Copyright (c) The PHP Group                                          |
+   | Copyright © The PHP Group and Contributors.                          |
    +----------------------------------------------------------------------+
-   | This source file is subject to version 3.01 of the PHP license,      |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | https://www.php.net/license/3_01.txt                                 |
-   | If you did not receive a copy of the PHP license and are unable to   |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@php.net so we can mail you a copy immediately.               |
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Authors: Dmitry Stogov                               |
    +----------------------------------------------------------------------+
@@ -659,6 +657,7 @@ static void zend_file_cache_serialize_op_array(zend_op_array            *op_arra
 					SERIALIZE_STR(p->name);
 				}
 				zend_file_cache_serialize_type(&p->type, script, info, buf);
+				SERIALIZE_STR(p->doc_comment);
 				p++;
 			}
 		}
@@ -1562,6 +1561,7 @@ static void zend_file_cache_unserialize_op_array(zend_op_array           *op_arr
 					UNSERIALIZE_STR(p->name);
 				}
 				zend_file_cache_unserialize_type(&p->type, (op_array->fn_flags & ZEND_ACC_CLOSURE) ? NULL : op_array->scope, script, buf);
+				UNSERIALIZE_STR(p->doc_comment);
 				p++;
 			}
 		}
diff --git a/ext/opcache/zend_file_cache.h b/ext/opcache/zend_file_cache.h
index 452f6b2c4c24..37868285b0da 100644
--- a/ext/opcache/zend_file_cache.h
+++ b/ext/opcache/zend_file_cache.h
@@ -2,15 +2,13 @@
    +----------------------------------------------------------------------+
    | Zend OPcache                                                         |
    +----------------------------------------------------------------------+
-   | Copyright (c) The PHP Group                                          |
+   | Copyright © The PHP Group and Contributors.                          |
    +----------------------------------------------------------------------+
-   | This source file is subject to version 3.01 of the PHP license,      |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | https://www.php.net/license/3_01.txt                                 |
-   | If you did not receive a copy of the PHP license and are unable to   |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@php.net so we can mail you a copy immediately.               |
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Authors: Dmitry Stogov                               |
    +----------------------------------------------------------------------+
diff --git a/ext/opcache/zend_persist.c b/ext/opcache/zend_persist.c
index 9bc2496837ce..c06452e6acf2 100644
--- a/ext/opcache/zend_persist.c
+++ b/ext/opcache/zend_persist.c
@@ -2,15 +2,13 @@
    +----------------------------------------------------------------------+
    | Zend OPcache                                                         |
    +----------------------------------------------------------------------+
-   | Copyright (c) The PHP Group                                          |
+   | Copyright © The PHP Group and Contributors.                          |
    +----------------------------------------------------------------------+
-   | This source file is subject to version 3.01 of the PHP license,      |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | https://www.php.net/license/3_01.txt                                 |
-   | If you did not receive a copy of the PHP license and are unable to   |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@php.net so we can mail you a copy immediately.               |
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Authors: Andi Gutmans                                  |
    |          Zeev Suraski                                  |
@@ -544,9 +542,8 @@ static void zend_persist_op_array_ex(zend_op_array *op_array, zend_persistent_sc
 		zend_op *new_opcodes = zend_shared_memdup_put(op_array->opcodes, sizeof(zend_op) * op_array->last);
 		zend_op *opline = new_opcodes;
 		zend_op *end = new_opcodes + op_array->last;
-		int offset = 0;
 
-		for (; opline < end ; opline++, offset++) {
+		for (; opline < end ; opline++) {
 #if ZEND_USE_ABS_CONST_ADDR
 			if (opline->op1_type == IS_CONST) {
 				opline->op1.zv = (zval*)((char*)opline->op1.zv + ((char*)op_array->literals - (char*)orig_literals));
@@ -652,6 +649,9 @@ static void zend_persist_op_array_ex(zend_op_array *op_array, zend_persistent_sc
 				zend_accel_store_interned_string(arg_info[i].name);
 			}
 			zend_persist_type(&arg_info[i].type);
+			if (arg_info[i].doc_comment) {
+				zend_accel_store_interned_string(arg_info[i].doc_comment);
+			}
 		}
 		if (op_array->fn_flags & ZEND_ACC_HAS_RETURN_TYPE) {
 			arg_info++;
diff --git a/ext/opcache/zend_persist.h b/ext/opcache/zend_persist.h
index c8220217630e..453ae0811c17 100644
--- a/ext/opcache/zend_persist.h
+++ b/ext/opcache/zend_persist.h
@@ -2,15 +2,13 @@
    +----------------------------------------------------------------------+
    | Zend OPcache                                                         |
    +----------------------------------------------------------------------+
-   | Copyright (c) The PHP Group                                          |
+   | Copyright © The PHP Group and Contributors.                          |
    +----------------------------------------------------------------------+
-   | This source file is subject to version 3.01 of the PHP license,      |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | https://www.php.net/license/3_01.txt                                 |
-   | If you did not receive a copy of the PHP license and are unable to   |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@php.net so we can mail you a copy immediately.               |
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Authors: Andi Gutmans                                  |
    |          Zeev Suraski                                  |
diff --git a/ext/opcache/zend_persist_calc.c b/ext/opcache/zend_persist_calc.c
index 0b0ff51d0d4d..9ff37079193b 100644
--- a/ext/opcache/zend_persist_calc.c
+++ b/ext/opcache/zend_persist_calc.c
@@ -2,15 +2,13 @@
    +----------------------------------------------------------------------+
    | Zend OPcache                                                         |
    +----------------------------------------------------------------------+
-   | Copyright (c) The PHP Group                                          |
+   | Copyright © The PHP Group and Contributors.                          |
    +----------------------------------------------------------------------+
-   | This source file is subject to version 3.01 of the PHP license,      |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | https://www.php.net/license/3_01.txt                                 |
-   | If you did not receive a copy of the PHP license and are unable to   |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@php.net so we can mail you a copy immediately.               |
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Authors: Andi Gutmans                                  |
    |          Zeev Suraski                                  |
@@ -306,6 +304,9 @@ static void zend_persist_op_array_calc_ex(zend_op_array *op_array)
 				ADD_INTERNED_STRING(arg_info[i].name);
 			}
 			zend_persist_type_calc(&arg_info[i].type);
+			if (arg_info[i].doc_comment) {
+				ADD_INTERNED_STRING(arg_info[i].doc_comment);
+			}
 		}
 	}
 
diff --git a/ext/opcache/zend_shared_alloc.c b/ext/opcache/zend_shared_alloc.c
index 80ef36b8749d..b264f98a02b7 100644
--- a/ext/opcache/zend_shared_alloc.c
+++ b/ext/opcache/zend_shared_alloc.c
@@ -2,15 +2,13 @@
    +----------------------------------------------------------------------+
    | Zend OPcache                                                         |
    +----------------------------------------------------------------------+
-   | Copyright (c) The PHP Group                                          |
+   | Copyright © The PHP Group and Contributors.                          |
    +----------------------------------------------------------------------+
-   | This source file is subject to version 3.01 of the PHP license,      |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | https://www.php.net/license/3_01.txt                                 |
-   | If you did not receive a copy of the PHP license and are unable to   |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@php.net so we can mail you a copy immediately.               |
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Authors: Andi Gutmans                                  |
    |          Zeev Suraski                                  |
diff --git a/ext/opcache/zend_shared_alloc.h b/ext/opcache/zend_shared_alloc.h
index 108349b13f81..cf0bb10d8932 100644
--- a/ext/opcache/zend_shared_alloc.h
+++ b/ext/opcache/zend_shared_alloc.h
@@ -2,15 +2,13 @@
    +----------------------------------------------------------------------+
    | Zend OPcache                                                         |
    +----------------------------------------------------------------------+
-   | Copyright (c) The PHP Group                                          |
+   | Copyright © The PHP Group and Contributors.                          |
    +----------------------------------------------------------------------+
-   | This source file is subject to version 3.01 of the PHP license,      |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | https://www.php.net/license/3_01.txt                                 |
-   | If you did not receive a copy of the PHP license and are unable to   |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@php.net so we can mail you a copy immediately.               |
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Authors: Andi Gutmans                                  |
    |          Zeev Suraski                                  |
@@ -166,7 +164,11 @@ typedef union _align_test {
 	zend_long  lng;
 } align_test;
 
-#if ZEND_GCC_VERSION >= 2000
+#if defined(__STDC_VERSION__) && __STDC_VERSION__ >= 202311L
+# define PLATFORM_ALIGNMENT (alignof(align_test) < 8 ? 8 : alignof(align_test))
+#elif defined(__STDC_VERSION__) && __STDC_VERSION__ >= 201112L
+# define PLATFORM_ALIGNMENT (_Alignof(align_test) < 8 ? 8 : _Alignof(align_test))
+#elif ZEND_GCC_VERSION >= 2000 || defined(__clang__)
 # define PLATFORM_ALIGNMENT (__alignof__(align_test) < 8 ? 8 : __alignof__(align_test))
 #else
 # define PLATFORM_ALIGNMENT (sizeof(align_test))
diff --git a/ext/openssl/config.w32 b/ext/openssl/config.w32
index 6fd0e928422c..4b7f4b8b8565 100644
--- a/ext/openssl/config.w32
+++ b/ext/openssl/config.w32
@@ -16,9 +16,7 @@ if (PHP_OPENSSL != "no") {
 			AC_DEFINE("LOAD_OPENSSL_LEGACY_PROVIDER", 1, "Define to 1 to load the OpenSSL legacy algorithm provider in addition to the default provider.");
 		}
 		if (PHP_OPENSSL_ARGON2 != "no") {
-			if (PHP_ZTS != "no") {
-				WARNING("OpenSSL argon2 hashing not supported in ZTS mode for now");
-			} else if (!GREP_HEADER("openssl/thread.h", "OSSL_set_max_threads", PHP_PHP_BUILD + "\\include")) {
+			if (!GREP_HEADER("openssl/thread.h", "OSSL_set_max_threads", PHP_PHP_BUILD + "\\include")) {
 				WARNING("OpenSSL argon2 hashing requires OpenSSL >= 3.2");
 			} else {
 				AC_DEFINE("HAVE_OPENSSL_ARGON2", 1, "Define to 1 to enable OpenSSL argon2 password hashing.");
diff --git a/ext/openssl/openssl.c b/ext/openssl/openssl.c
index 1ec9ec85729a..2db966c1661e 100644
--- a/ext/openssl/openssl.c
+++ b/ext/openssl/openssl.c
@@ -1,14 +1,12 @@
 /*
    +----------------------------------------------------------------------+
-   | Copyright (c) The PHP Group                                          |
+   | Copyright © The PHP Group and Contributors.                          |
    +----------------------------------------------------------------------+
-   | This source file is subject to version 3.01 of the PHP license,      |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | https://www.php.net/license/3_01.txt                                 |
-   | If you did not receive a copy of the PHP license and are unable to   |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@php.net so we can mail you a copy immediately.               |
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Authors: Stig Venaas                                 |
    |          Wez Furlong                           |
@@ -58,6 +56,10 @@ ZEND_DECLARE_MODULE_GLOBALS(openssl)
 
 #include "openssl_arginfo.h"
 
+/* OpenSSLException class */
+
+zend_class_entry *php_openssl_exception_ce;
+
 /* OpenSSLCertificate class */
 
 zend_class_entry *php_openssl_certificate_ce;
@@ -167,6 +169,376 @@ static void php_openssl_pkey_free_obj(zend_object *object)
 	zend_object_std_dtor(&key_object->std);
 }
 
+/* Openssl\Psk class */
+
+zend_class_entry *php_openssl_psk_ce;
+
+static zend_object_handlers php_openssl_psk_object_handlers;
+
+bool php_openssl_is_psk_ce(zval *val)
+{
+	return Z_TYPE_P(val) == IS_OBJECT && Z_OBJCE_P(val) == php_openssl_psk_ce;
+}
+
+zend_string *php_openssl_psk_get_psk(zval *psk_zv)
+{
+	zval rv;
+	zval *prop = zend_read_property(php_openssl_psk_ce, Z_OBJ_P(psk_zv), ZEND_STRL("psk"), 0, &rv);
+	if (UNEXPECTED(Z_TYPE_P(prop) != IS_STRING)) {
+		return NULL;
+	}
+	return Z_STR_P(prop);
+}
+
+zend_string *php_openssl_psk_get_identity(zval *psk_zv)
+{
+	zval rv;
+	zval *prop = zend_read_property(php_openssl_psk_ce, Z_OBJ_P(psk_zv),
+			ZEND_STRL("identity"), 0, &rv);
+	if (Z_TYPE_P(prop) == IS_NULL) {
+		return NULL;
+	}
+	if (UNEXPECTED(Z_TYPE_P(prop) != IS_STRING)) {
+		return NULL;
+	}
+	return Z_STR_P(prop);
+}
+
+PHP_METHOD(Openssl_Psk, __construct)
+{
+	zend_string *psk;
+	zend_string *identity = NULL;
+
+	ZEND_PARSE_PARAMETERS_START(1, 2)
+		Z_PARAM_STR(psk)
+		Z_PARAM_OPTIONAL
+		Z_PARAM_STR_OR_NULL(identity)
+	ZEND_PARSE_PARAMETERS_END();
+
+	if (ZSTR_LEN(psk) == 0) {
+		zend_argument_must_not_be_empty_error(1);
+		RETURN_THROWS();
+	}
+	if (ZSTR_LEN(psk) > PHP_OPENSSL_PSK_MAX_PSK_LEN) {
+		zend_argument_value_error(1, "must not exceed %d bytes", PHP_OPENSSL_PSK_MAX_PSK_LEN);
+		RETURN_THROWS();
+	}
+	if (identity != NULL && ZSTR_LEN(identity) > PHP_OPENSSL_PSK_MAX_IDENTITY_LEN) {
+		zend_argument_value_error(2, "must not exceed %d bytes", PHP_OPENSSL_PSK_MAX_IDENTITY_LEN);
+		RETURN_THROWS();
+	}
+
+	zend_update_property_str(php_openssl_psk_ce, Z_OBJ_P(ZEND_THIS), ZEND_STRL("psk"), psk);
+
+	if (identity != NULL) {
+		zend_update_property_str(php_openssl_psk_ce, Z_OBJ_P(ZEND_THIS),
+				ZEND_STRL("identity"), identity);
+	} else {
+		zend_update_property_null(php_openssl_psk_ce, Z_OBJ_P(ZEND_THIS), ZEND_STRL("identity"));
+	}
+}
+
+/* Openssl\Session class */
+
+zend_class_entry *php_openssl_session_ce;
+
+static zend_object_handlers php_openssl_session_object_handlers;
+
+bool php_openssl_is_session_ce(zval *val)
+{
+	return Z_TYPE_P(val) == IS_OBJECT && Z_OBJCE_P(val) == php_openssl_session_ce;
+}
+
+SSL_SESSION *php_openssl_session_from_zval(zval *zv)
+{
+	if (!php_openssl_is_session_ce(zv)) {
+		return NULL;
+	}
+	return Z_OPENSSL_SESSION_P(zv)->session;
+}
+
+void php_openssl_session_object_init(zval *zv, SSL_SESSION *session)
+{
+	object_init_ex(zv, php_openssl_session_ce);
+	php_openssl_session_object *obj = Z_OPENSSL_SESSION_P(zv);
+	obj->session = session;
+
+	unsigned int id_len = 0;
+	const unsigned char *id = SSL_SESSION_get_id(session, &id_len);
+	zend_update_property_stringl(php_openssl_session_ce, Z_OBJ_P(zv),
+			ZEND_STRL("id"), (char *)id, id_len);
+}
+
+static zend_object *php_openssl_session_create_object(zend_class_entry *class_type)
+{
+	php_openssl_session_object *intern = zend_object_alloc(sizeof(php_openssl_session_object), class_type);
+
+	zend_object_std_init(&intern->std, class_type);
+	object_properties_init(&intern->std, class_type);
+
+	return &intern->std;
+}
+
+static zend_function *php_openssl_session_get_constructor(zend_object *object)
+{
+	zend_throw_error(NULL,
+		"Cannot directly construct OpenSSLSession, use OpenSSLSession::import() or TLS session callbacks");
+	return NULL;
+}
+
+static void php_openssl_session_free_obj(zend_object *object)
+{
+	php_openssl_session_object *session_object = php_openssl_session_from_obj(object);
+
+	if (session_object->session) {
+		SSL_SESSION_free(session_object->session);
+		session_object->session = NULL;
+	}
+	zend_object_std_dtor(&session_object->std);
+}
+
+#define PHP_OPENSSL_SESSION_CHECK() \
+	php_openssl_session_object *obj = Z_OPENSSL_SESSION_P(ZEND_THIS); \
+	if (!obj->session) { \
+		zend_throw_exception(php_openssl_exception_ce, "Session is not valid", 0); \
+		RETURN_THROWS(); \
+	}
+
+PHP_METHOD(Openssl_Session, export)
+{
+	zend_long format = ENCODING_PEM;
+
+	ZEND_PARSE_PARAMETERS_START(0, 1)
+		Z_PARAM_OPTIONAL
+		Z_PARAM_LONG(format)
+	ZEND_PARSE_PARAMETERS_END();
+
+	PHP_OPENSSL_SESSION_CHECK();
+
+	if (format == ENCODING_DER) {
+		int len = i2d_SSL_SESSION(obj->session, NULL);
+		if (len <= 0) {
+			zend_throw_exception(php_openssl_exception_ce, "Failed to export session", 0);
+			RETURN_THROWS();
+		}
+
+		zend_string *result = zend_string_alloc(len, 0);
+		unsigned char *p = (unsigned char *)ZSTR_VAL(result);
+		i2d_SSL_SESSION(obj->session, &p);
+		ZSTR_VAL(result)[len] = '\0';
+
+		RETURN_NEW_STR(result);
+	}
+
+	if (format == ENCODING_PEM) {
+		BIO *bio = BIO_new(BIO_s_mem());
+		if (!bio) {
+			zend_throw_exception(php_openssl_exception_ce, "Failed to create BIO", 0);
+			RETURN_THROWS();
+		}
+
+		if (!PEM_write_bio_SSL_SESSION(bio, obj->session)) {
+			BIO_free(bio);
+			zend_throw_exception(php_openssl_exception_ce, "Failed to export session as PEM", 0);
+			RETURN_THROWS();
+		}
+
+		char *data;
+		long len = BIO_get_mem_data(bio, &data);
+		zend_string *result = zend_string_init(data, len, 0);
+		BIO_free(bio);
+
+		RETURN_NEW_STR(result);
+	}
+
+	zend_argument_value_error(1, "must be OPENSSL_ENCODING_DER or OPENSSL_ENCODING_PEM");
+	RETURN_THROWS();
+}
+
+PHP_METHOD(Openssl_Session, import)
+{
+	zend_string *data;
+	zend_long format = ENCODING_PEM;
+
+	ZEND_PARSE_PARAMETERS_START(1, 2)
+		Z_PARAM_STR(data)
+		Z_PARAM_OPTIONAL
+		Z_PARAM_LONG(format)
+	ZEND_PARSE_PARAMETERS_END();
+
+	SSL_SESSION *session = NULL;
+
+	if (format == ENCODING_DER) {
+		const unsigned char *p = (const unsigned char *)ZSTR_VAL(data);
+		session = d2i_SSL_SESSION(NULL, &p, ZSTR_LEN(data));
+	} else if (format == ENCODING_PEM) {
+		BIO *bio = BIO_new_mem_buf(ZSTR_VAL(data), ZSTR_LEN(data));
+		if (bio) {
+			session = PEM_read_bio_SSL_SESSION(bio, NULL, NULL, NULL);
+			BIO_free(bio);
+		}
+	} else {
+		zend_argument_value_error(2, "must be OPENSSL_ENCODING_DER or OPENSSL_ENCODING_PEM");
+		RETURN_THROWS();
+	}
+
+	if (!session) {
+		zend_throw_exception(php_openssl_exception_ce, "Failed to import session data", 0);
+		RETURN_THROWS();
+	}
+
+	php_openssl_session_object_init(return_value, session);
+}
+
+PHP_METHOD(Openssl_Session, isResumable)
+{
+	ZEND_PARSE_PARAMETERS_NONE();
+	PHP_OPENSSL_SESSION_CHECK();
+
+	RETURN_BOOL(SSL_SESSION_is_resumable(obj->session));
+}
+
+PHP_METHOD(Openssl_Session, getTimeout)
+{
+	ZEND_PARSE_PARAMETERS_NONE();
+	PHP_OPENSSL_SESSION_CHECK();
+	RETURN_LONG((zend_long)SSL_SESSION_get_timeout(obj->session));
+}
+
+PHP_METHOD(Openssl_Session, getCreatedAt)
+{
+	ZEND_PARSE_PARAMETERS_NONE();
+	PHP_OPENSSL_SESSION_CHECK();
+#if PHP_OPENSSL_API_VERSION >= 0x30300
+	RETURN_LONG((zend_long)SSL_SESSION_get_time_ex(obj->session));
+#else
+	RETURN_LONG((zend_long)SSL_SESSION_get_time(obj->session));
+#endif
+}
+
+PHP_METHOD(Openssl_Session, getProtocol)
+{
+	ZEND_PARSE_PARAMETERS_NONE();
+	PHP_OPENSSL_SESSION_CHECK();
+
+	int version = SSL_SESSION_get_protocol_version(obj->session);
+
+	switch (version) {
+		case TLS1_3_VERSION:
+			RETURN_STRING("TLSv1.3");
+		case TLS1_2_VERSION:
+			RETURN_STRING("TLSv1.2");
+		case TLS1_1_VERSION:
+			RETURN_STRING("TLSv1.1");
+		case TLS1_VERSION:
+			RETURN_STRING("TLSv1.0");
+		default:
+			RETURN_NULL();
+	}
+}
+
+PHP_METHOD(Openssl_Session, getCipher)
+{
+	ZEND_PARSE_PARAMETERS_NONE();
+	PHP_OPENSSL_SESSION_CHECK();
+
+	const SSL_CIPHER *cipher = SSL_SESSION_get0_cipher(obj->session);
+	if (!cipher) {
+		RETURN_NULL();
+	}
+
+	RETURN_STRING(SSL_CIPHER_get_name(cipher));
+}
+
+PHP_METHOD(Openssl_Session, hasTicket)
+{
+	ZEND_PARSE_PARAMETERS_NONE();
+	PHP_OPENSSL_SESSION_CHECK();
+
+	RETURN_BOOL(SSL_SESSION_has_ticket(obj->session));
+}
+
+PHP_METHOD(Openssl_Session, getTicketLifetimeHint)
+{
+	ZEND_PARSE_PARAMETERS_NONE();
+	PHP_OPENSSL_SESSION_CHECK();
+
+	if (!SSL_SESSION_has_ticket(obj->session)) {
+		RETURN_NULL();
+	}
+
+	RETURN_LONG((zend_long)SSL_SESSION_get_ticket_lifetime_hint(obj->session));
+}
+PHP_METHOD(Openssl_Session, __serialize)
+{
+	ZEND_PARSE_PARAMETERS_NONE();
+
+	PHP_OPENSSL_SESSION_CHECK();
+
+	BIO *bio = BIO_new(BIO_s_mem());
+	if (!bio) {
+		zend_throw_exception(php_openssl_exception_ce, "Failed to serialize session", 0);
+		RETURN_THROWS();
+	}
+
+	if (!PEM_write_bio_SSL_SESSION(bio, obj->session)) {
+		BIO_free(bio);
+		zend_throw_exception(php_openssl_exception_ce, "Failed to serialize session", 0);
+		RETURN_THROWS();
+	}
+
+	char *data;
+	long len = BIO_get_mem_data(bio, &data);
+	zend_string *pem = zend_string_init(data, len, 0);
+	BIO_free(bio);
+
+	array_init(return_value);
+	add_assoc_str(return_value, "pem", pem);
+}
+
+PHP_METHOD(Openssl_Session, __unserialize)
+{
+	HashTable *data;
+
+	ZEND_PARSE_PARAMETERS_START(1, 1)
+		Z_PARAM_ARRAY_HT(data)
+	ZEND_PARSE_PARAMETERS_END();
+
+	php_openssl_session_object *obj = Z_OPENSSL_SESSION_P(ZEND_THIS);
+	if (obj->session != NULL) {
+		zend_throw_error(NULL, "Cannot call Openssl\\Session::__unserialize() on an already-initialized session");
+		RETURN_THROWS();
+	}
+
+	zval *pem_zv = zend_hash_str_find(data, ZEND_STRL("pem"));
+	if (!pem_zv || Z_TYPE_P(pem_zv) != IS_STRING) {
+		zend_throw_exception(php_openssl_exception_ce, "Invalid serialization data", 0);
+		RETURN_THROWS();
+	}
+
+	BIO *bio = BIO_new_mem_buf(Z_STRVAL_P(pem_zv), Z_STRLEN_P(pem_zv));
+	if (!bio) {
+		zend_throw_exception(php_openssl_exception_ce, "Failed to unserialize session", 0);
+		RETURN_THROWS();
+	}
+
+	SSL_SESSION *session = PEM_read_bio_SSL_SESSION(bio, NULL, NULL, NULL);
+	BIO_free(bio);
+
+	if (!session) {
+		zend_throw_exception(php_openssl_exception_ce, "Failed to unserialize session", 0);
+		RETURN_THROWS();
+	}
+
+	obj->session = session;
+
+	/* Populate id property */
+	unsigned int id_len = 0;
+	const unsigned char *id = SSL_SESSION_get_id(session, &id_len);
+	zend_update_property_stringl(php_openssl_session_ce, Z_OBJ_P(ZEND_THIS),
+		ZEND_STRL("id"), (char *)id, id_len);
+}
+
 #if defined(HAVE_OPENSSL_ARGON2)
 static const zend_module_dep openssl_deps[] = {
 	ZEND_MOD_REQUIRED("standard")
@@ -218,9 +590,9 @@ void php_openssl_store_errors(void)
 	errors = OPENSSL_G(errors);
 
 	do {
-		errors->top = (errors->top + 1) % ERR_NUM_ERRORS;
+		errors->top = (errors->top + 1) % PHP_OPENSSL_ERR_BUFFER_SIZE;
 		if (errors->top == errors->bottom) {
-			errors->bottom = (errors->bottom + 1) % ERR_NUM_ERRORS;
+			errors->bottom = (errors->bottom + 1) % PHP_OPENSSL_ERR_BUFFER_SIZE;
 		}
 		errors->buffer[errors->top] = error_code;
 	} while ((error_code = ERR_get_error()));
@@ -383,12 +755,14 @@ PHP_INI_END()
 /* {{{ PHP_MINIT_FUNCTION */
 PHP_MINIT_FUNCTION(openssl)
 {
+	php_openssl_exception_ce = register_class_Openssl_OpensslException(zend_ce_exception);
+
 	php_openssl_certificate_ce = register_class_OpenSSLCertificate();
 	php_openssl_certificate_ce->create_object = php_openssl_certificate_create_object;
 	php_openssl_certificate_ce->default_object_handlers = &php_openssl_certificate_object_handlers;
 
 	memcpy(&php_openssl_certificate_object_handlers, &std_object_handlers, sizeof(zend_object_handlers));
-	php_openssl_certificate_object_handlers.offset = XtOffsetOf(php_openssl_certificate_object, std);
+	php_openssl_certificate_object_handlers.offset = offsetof(php_openssl_certificate_object, std);
 	php_openssl_certificate_object_handlers.free_obj = php_openssl_certificate_free_obj;
 	php_openssl_certificate_object_handlers.get_constructor = php_openssl_certificate_get_constructor;
 	php_openssl_certificate_object_handlers.clone_obj = NULL;
@@ -399,7 +773,7 @@ PHP_MINIT_FUNCTION(openssl)
 	php_openssl_request_ce->default_object_handlers = &php_openssl_request_object_handlers;
 
 	memcpy(&php_openssl_request_object_handlers, &std_object_handlers, sizeof(zend_object_handlers));
-	php_openssl_request_object_handlers.offset = XtOffsetOf(php_openssl_request_object, std);
+	php_openssl_request_object_handlers.offset = offsetof(php_openssl_request_object, std);
 	php_openssl_request_object_handlers.free_obj = php_openssl_request_free_obj;
 	php_openssl_request_object_handlers.get_constructor = php_openssl_request_get_constructor;
 	php_openssl_request_object_handlers.clone_obj = NULL;
@@ -410,12 +784,28 @@ PHP_MINIT_FUNCTION(openssl)
 	php_openssl_pkey_ce->default_object_handlers = &php_openssl_pkey_object_handlers;
 
 	memcpy(&php_openssl_pkey_object_handlers, &std_object_handlers, sizeof(zend_object_handlers));
-	php_openssl_pkey_object_handlers.offset = XtOffsetOf(php_openssl_pkey_object, std);
+	php_openssl_pkey_object_handlers.offset = offsetof(php_openssl_pkey_object, std);
 	php_openssl_pkey_object_handlers.free_obj = php_openssl_pkey_free_obj;
 	php_openssl_pkey_object_handlers.get_constructor = php_openssl_pkey_get_constructor;
 	php_openssl_pkey_object_handlers.clone_obj = NULL;
 	php_openssl_pkey_object_handlers.compare = zend_objects_not_comparable;
 
+	php_openssl_psk_ce = register_class_Openssl_Psk();
+	php_openssl_psk_ce->default_object_handlers = &php_openssl_psk_object_handlers;
+
+	memcpy(&php_openssl_psk_object_handlers, &std_object_handlers, sizeof(zend_object_handlers));
+
+	php_openssl_session_ce = register_class_Openssl_Session();
+	php_openssl_session_ce->create_object = php_openssl_session_create_object;
+	php_openssl_session_ce->default_object_handlers = &php_openssl_session_object_handlers;
+
+	memcpy(&php_openssl_session_object_handlers, &std_object_handlers, sizeof(zend_object_handlers));
+	php_openssl_session_object_handlers.offset = offsetof(php_openssl_session_object, std);
+	php_openssl_session_object_handlers.free_obj = php_openssl_session_free_obj;
+	php_openssl_session_object_handlers.get_constructor = php_openssl_session_get_constructor;
+	php_openssl_session_object_handlers.clone_obj = NULL;
+	php_openssl_session_object_handlers.compare = zend_objects_not_comparable;
+
 	register_openssl_symbols(module_number);
 
 	php_openssl_backend_init();
@@ -562,14 +952,11 @@ PHP_FUNCTION(openssl_x509_export_to_file)
 
 	bio_out = BIO_new_file(file_path, PHP_OPENSSL_BIO_MODE_W(PKCS7_BINARY));
 	if (bio_out) {
-		if (!notext && !X509_print(bio_out, cert)) {
-			php_openssl_store_errors();
-		}
-		if (!PEM_write_bio_X509(bio_out, cert)) {
+		if ((notext || X509_print(bio_out, cert)) && PEM_write_bio_X509(bio_out, cert)) {
+			RETVAL_TRUE;
+		} else {
 			php_openssl_store_errors();
 		}
-
-		RETVAL_TRUE;
 	} else {
 		php_openssl_store_errors();
 		php_error_docref(NULL, E_WARNING, "Error opening file %s", file_path);
@@ -864,8 +1251,7 @@ PHP_FUNCTION(openssl_x509_export)
 	}
 	if (!notext && !X509_print(bio_out, cert)) {
 		php_openssl_store_errors();
-	}
-	if (PEM_write_bio_X509(bio_out, cert)) {
+	} else if (PEM_write_bio_X509(bio_out, cert)) {
 		BUF_MEM *bio_buf;
 
 		BIO_get_mem_ptr(bio_out, &bio_buf);
@@ -1102,7 +1488,7 @@ PHP_FUNCTION(openssl_x509_parse)
 	for (i = 0; i < X509_PURPOSE_get_count(); i++) {
 		int id, purpset;
 		char * pname;
-		X509_PURPOSE * purp;
+		const X509_PURPOSE * purp;
 		zval subsub;
 
 		array_init(&subsub);
@@ -1156,7 +1542,7 @@ PHP_FUNCTION(openssl_x509_parse)
 				goto err_subitem;
 			}
 		}
-		else if (X509V3_EXT_print(bio_out, extension, 0, 0)) {
+		else if (X509V3_EXT_print(bio_out, extension, 0, 0) > 0) {
 			BIO_get_mem_ptr(bio_out, &bio_buf);
 			add_assoc_stringl(&subitem, extname, bio_buf->data, bio_buf->length);
 		} else {
@@ -1177,6 +1563,7 @@ PHP_FUNCTION(openssl_x509_parse)
 
 err_subitem:
 	zval_ptr_dtor(&subitem);
+	zval_ptr_dtor(&critext);
 err:
 	zend_array_destroy(Z_ARR_P(return_value));
 	if (cert_str) {
@@ -1452,7 +1839,7 @@ PHP_FUNCTION(openssl_pkcs12_export)
 
 	if (p12 != NULL) {
 		bio_out = BIO_new(BIO_s_mem());
-		if (i2d_PKCS12_bio(bio_out, p12)) {
+		if (bio_out && i2d_PKCS12_bio(bio_out, p12)) {
 			BUF_MEM *bio_buf;
 
 			BIO_get_mem_ptr(bio_out, &bio_buf);
@@ -1517,7 +1904,7 @@ PHP_FUNCTION(openssl_pkcs12_read)
 
 		if (cert) {
 			bio_out = BIO_new(BIO_s_mem());
-			if (PEM_write_bio_X509(bio_out, cert)) {
+			if (bio_out && PEM_write_bio_X509(bio_out, cert)) {
 				BUF_MEM *bio_buf;
 				BIO_get_mem_ptr(bio_out, &bio_buf);
 				ZVAL_STRINGL(&zcert, bio_buf->data, bio_buf->length);
@@ -1530,6 +1917,10 @@ PHP_FUNCTION(openssl_pkcs12_read)
 
 		if (pkey) {
 			bio_out = BIO_new(BIO_s_mem());
+			if (!bio_out) {
+				goto cleanup;
+			}
+
 			if (PEM_write_bio_PrivateKey(bio_out, pkey, NULL, NULL, 0, 0, NULL)) {
 				BUF_MEM *bio_buf;
 				BIO_get_mem_ptr(bio_out, &bio_buf);
@@ -1544,13 +1935,16 @@ PHP_FUNCTION(openssl_pkcs12_read)
 		cert_num = sk_X509_num(ca);
 		if (ca && cert_num) {
 			array_init(&zextracerts);
+			bio_out = BIO_new(BIO_s_mem());
+			if (!bio_out) {
+				goto cleanup;
+			}
 
 			for (i = 0; i < cert_num; i++) {
 				zval zextracert;
 				X509* aCA = sk_X509_pop(ca);
 				if (!aCA) break;
 
-				bio_out = BIO_new(BIO_s_mem());
 				if (PEM_write_bio_X509(bio_out, aCA)) {
 					BUF_MEM *bio_buf;
 					BIO_get_mem_ptr(bio_out, &bio_buf);
@@ -1558,9 +1952,10 @@ PHP_FUNCTION(openssl_pkcs12_read)
 					add_index_zval(&zextracerts, i, &zextracert);
 				}
 
+				(void)BIO_reset(bio_out);
 				X509_free(aCA);
-				BIO_free(bio_out);
 			}
+			BIO_free(bio_out);
 
 			sk_X509_free(ca);
 			add_assoc_zval(zout, "extracerts", &zextracerts);
@@ -1619,9 +2014,9 @@ PHP_FUNCTION(openssl_csr_export_to_file)
 	bio_out = BIO_new_file(file_path, PHP_OPENSSL_BIO_MODE_W(PKCS7_BINARY));
 	if (bio_out != NULL) {
 		if (!notext && !X509_REQ_print(bio_out, csr)) {
+			/* TODO: warn? */
 			php_openssl_store_errors();
-		}
-		if (!PEM_write_bio_X509_REQ(bio_out, csr)) {
+		} else if (!PEM_write_bio_X509_REQ(bio_out, csr)) {
 			php_error_docref(NULL, E_WARNING, "Error writing PEM to file %s", file_path);
 			php_openssl_store_errors();
 		} else {
@@ -1670,9 +2065,7 @@ PHP_FUNCTION(openssl_csr_export)
 	bio_out = BIO_new(BIO_s_mem());
 	if (!notext && !X509_REQ_print(bio_out, csr)) {
 		php_openssl_store_errors();
-	}
-
-	if (PEM_write_bio_X509_REQ(bio_out, csr)) {
+	} else if (PEM_write_bio_X509_REQ(bio_out, csr)) {
 		BUF_MEM *bio_buf;
 
 		BIO_get_mem_ptr(bio_out, &bio_buf);
@@ -1812,10 +2205,17 @@ PHP_FUNCTION(openssl_csr_sign)
 			goto cleanup;
 		}
 	} else {
-		PHP_OPENSSL_ASN1_INTEGER_set(X509_get_serialNumber(new_cert), serial);
+		if (!PHP_OPENSSL_ASN1_INTEGER_set(X509_get_serialNumber(new_cert), serial)) {
+			php_openssl_store_errors();
+			php_error_docref(NULL, E_WARNING, "Error setting serial number");
+			goto cleanup;
+		}
 	}
 
-	X509_set_subject_name(new_cert, X509_REQ_get_subject_name(csr));
+	if (!X509_set_subject_name(new_cert, X509_REQ_get_subject_name(csr))) {
+		php_openssl_store_errors();
+		goto cleanup;
+	}
 
 	if (cert == NULL) {
 		cert = new_cert;
@@ -1824,8 +2224,11 @@ PHP_FUNCTION(openssl_csr_sign)
 		php_openssl_store_errors();
 		goto cleanup;
 	}
-	X509_gmtime_adj(X509_getm_notBefore(new_cert), 0);
-	X509_gmtime_adj(X509_getm_notAfter(new_cert), 60*60*24*num_days);
+	if (!X509_gmtime_adj(X509_getm_notBefore(new_cert), 0)
+		|| !X509_gmtime_adj(X509_getm_notAfter(new_cert), 60*60*24*num_days)) {
+		php_openssl_store_errors();
+		goto cleanup;
+	}
 	i = X509_set_pubkey(new_cert, key);
 	if (!i) {
 		php_openssl_store_errors();
@@ -2215,6 +2618,10 @@ PHP_FUNCTION(openssl_pkey_export)
 
 	if (PHP_SSL_REQ_PARSE(&req, args) == SUCCESS) {
 		bio_out = BIO_new(BIO_s_mem());
+		if (!bio_out) {
+			php_openssl_store_errors();
+			goto cleanup;
+		}
 
 		if (passphrase && req.priv_key_encrypt) {
 			if (req.priv_key_encrypt_cipher) {
@@ -2243,6 +2650,7 @@ PHP_FUNCTION(openssl_pkey_export)
 			php_openssl_store_errors();
 		}
 	}
+cleanup:
 	EVP_PKEY_free(key);
 	BIO_free(bio_out);
 	PHP_SSL_REQ_DISPOSE(&req);
@@ -2318,7 +2726,7 @@ PHP_FUNCTION(openssl_pkey_get_details)
 	EVP_PKEY *pkey = Z_OPENSSL_PKEY_P(key)->pkey;
 
 	BIO *out = BIO_new(BIO_s_mem());
-	if (!PEM_write_bio_PUBKEY(out, pkey)) {
+	if (!out || !PEM_write_bio_PUBKEY(out, pkey)) {
 		BIO_free(out);
 		php_openssl_store_errors();
 		RETURN_FALSE;
@@ -2459,12 +2867,14 @@ PHP_FUNCTION(openssl_pbkdf2)
 
 	if (PKCS5_PBKDF2_HMAC(password, (int)password_len, (unsigned char *)salt, (int)salt_len, (int)iterations, digest, (int)key_length, (unsigned char*)ZSTR_VAL(out_buffer)) == 1) {
 		ZSTR_VAL(out_buffer)[key_length] = 0;
-		RETURN_NEW_STR(out_buffer);
+		RETVAL_NEW_STR(out_buffer);
 	} else {
 		php_openssl_store_errors();
 		zend_string_release_ex(out_buffer, 0);
-		RETURN_FALSE;
+		RETVAL_FALSE;
 	}
+
+	php_openssl_release_evp_md(digest);
 }
 /* }}} */
 
@@ -2712,16 +3122,21 @@ PHP_FUNCTION(openssl_pkcs7_encrypt)
 	/* tack on extra headers */
 	if (zheaders) {
 		ZEND_HASH_FOREACH_STR_KEY_VAL(Z_ARRVAL_P(zheaders), strindex, zcertval) {
+			int ret;
 			zend_string *str = zval_try_get_string(zcertval);
 			if (UNEXPECTED(!str)) {
 				goto clean_exit;
 			}
 			if (strindex) {
-				BIO_printf(outfile, "%s: %s\n", ZSTR_VAL(strindex), ZSTR_VAL(str));
+				ret = BIO_printf(outfile, "%s: %s\n", ZSTR_VAL(strindex), ZSTR_VAL(str));
 			} else {
-				BIO_printf(outfile, "%s\n", ZSTR_VAL(str));
+				ret = BIO_printf(outfile, "%s\n", ZSTR_VAL(str));
 			}
 			zend_string_release(str);
+			if (ret < 0) {
+				php_openssl_store_errors();
+				goto clean_exit;
+			}
 		} ZEND_HASH_FOREACH_END();
 	}
 
@@ -2806,33 +3221,41 @@ PHP_FUNCTION(openssl_pkcs7_read)
 	}
 
 	if (certs != NULL) {
+		bio_out = BIO_new(BIO_s_mem());
+		if (!bio_out) {
+			goto clean_exit;
+		}
 		for (i = 0; i < sk_X509_num(certs); i++) {
 			X509* ca = sk_X509_value(certs, i);
 
-			bio_out = BIO_new(BIO_s_mem());
-			if (bio_out && PEM_write_bio_X509(bio_out, ca)) {
+			if (PEM_write_bio_X509(bio_out, ca)) {
 				BUF_MEM *bio_buf;
 				BIO_get_mem_ptr(bio_out, &bio_buf);
 				ZVAL_STRINGL(&zcert, bio_buf->data, bio_buf->length);
 				add_index_zval(zout, i, &zcert);
 			}
-			BIO_free(bio_out);
+			(void)BIO_reset(bio_out);
 		}
+		BIO_free(bio_out);
 	}
 
 	if (crls != NULL) {
+		bio_out = BIO_new(BIO_s_mem());
+		if (!bio_out) {
+			goto clean_exit;
+		}
 		for (i = 0; i < sk_X509_CRL_num(crls); i++) {
 			X509_CRL* crl = sk_X509_CRL_value(crls, i);
 
-			bio_out = BIO_new(BIO_s_mem());
-			if (bio_out && PEM_write_bio_X509_CRL(bio_out, crl)) {
+			if (PEM_write_bio_X509_CRL(bio_out, crl)) {
 				BUF_MEM *bio_buf;
 				BIO_get_mem_ptr(bio_out, &bio_buf);
 				ZVAL_STRINGL(&zcert, bio_buf->data, bio_buf->length);
 				add_index_zval(zout, i, &zcert);
 			}
-			BIO_free(bio_out);
+			(void)BIO_reset(bio_out);
 		}
+		BIO_free(bio_out);
 	}
 
 	RETVAL_TRUE;
@@ -2941,6 +3364,7 @@ PHP_FUNCTION(openssl_pkcs7_sign)
 			zend_string_release(str);
 			if (ret < 0) {
 				php_openssl_store_errors();
+				goto clean_exit;
 			}
 		} ZEND_HASH_FOREACH_END();
 	}
@@ -3341,16 +3765,21 @@ PHP_FUNCTION(openssl_cms_encrypt)
 	/* tack on extra headers */
 	if (zheaders && encoding == ENCODING_SMIME) {
 		ZEND_HASH_FOREACH_STR_KEY_VAL(Z_ARRVAL_P(zheaders), strindex, zcertval) {
+			int ret;
 			zend_string *str = zval_try_get_string(zcertval);
 			if (UNEXPECTED(!str)) {
 				goto clean_exit;
 			}
 			if (strindex) {
-				BIO_printf(outfile, "%s: %s\n", ZSTR_VAL(strindex), ZSTR_VAL(str));
+				ret = BIO_printf(outfile, "%s: %s\n", ZSTR_VAL(strindex), ZSTR_VAL(str));
 			} else {
-				BIO_printf(outfile, "%s\n", ZSTR_VAL(str));
+				ret = BIO_printf(outfile, "%s\n", ZSTR_VAL(str));
 			}
 			zend_string_release(str);
+			if (ret < 0) {
+				php_openssl_store_errors();
+				goto clean_exit;
+			}
 		} ZEND_HASH_FOREACH_END();
 	}
 
@@ -3467,33 +3896,43 @@ PHP_FUNCTION(openssl_cms_read)
 	}
 
 	if (certs != NULL) {
+		bio_out = BIO_new(BIO_s_mem());
+		if (!bio_out) {
+			goto clean_exit;
+		}
+
 		for (i = 0; i < sk_X509_num(certs); i++) {
 			X509* ca = sk_X509_value(certs, i);
 
-			bio_out = BIO_new(BIO_s_mem());
-			if (bio_out && PEM_write_bio_X509(bio_out, ca)) {
+			if (PEM_write_bio_X509(bio_out, ca)) {
 				BUF_MEM *bio_buf;
 				BIO_get_mem_ptr(bio_out, &bio_buf);
 				ZVAL_STRINGL(&zcert, bio_buf->data, bio_buf->length);
 				add_index_zval(zout, i, &zcert);
 			}
-			BIO_free(bio_out);
+			(void)BIO_reset(bio_out);
 		}
+		BIO_free(bio_out);
 	}
 
 	if (crls != NULL) {
+		bio_out = BIO_new(BIO_s_mem());
+		if (!bio_out) {
+			goto clean_exit;
+		}
+
 		for (i = 0; i < sk_X509_CRL_num(crls); i++) {
 			X509_CRL* crl = sk_X509_CRL_value(crls, i);
 
-			bio_out = BIO_new(BIO_s_mem());
-			if (bio_out && PEM_write_bio_X509_CRL(bio_out, crl)) {
+			if (PEM_write_bio_X509_CRL(bio_out, crl)) {
 				BUF_MEM *bio_buf;
 				BIO_get_mem_ptr(bio_out, &bio_buf);
 				ZVAL_STRINGL(&zcert, bio_buf->data, bio_buf->length);
 				add_index_zval(zout, i, &zcert);
 			}
-			BIO_free(bio_out);
+			(void)BIO_reset(bio_out);
 		}
+		BIO_free(bio_out);
 	}
 
 	RETVAL_TRUE;
@@ -3631,6 +4070,7 @@ PHP_FUNCTION(openssl_cms_sign)
 			zend_string_release(str);
 			if (ret < 0) {
 				php_openssl_store_errors();
+				goto clean_exit;
 			}
 		} ZEND_HASH_FOREACH_END();
 	}
@@ -4030,7 +4470,7 @@ PHP_FUNCTION(openssl_error_string)
 		RETURN_FALSE;
 	}
 
-	OPENSSL_G(errors)->bottom = (OPENSSL_G(errors)->bottom + 1) % ERR_NUM_ERRORS;
+	OPENSSL_G(errors)->bottom = (OPENSSL_G(errors)->bottom + 1) % PHP_OPENSSL_ERR_BUFFER_SIZE;
 	val = OPENSSL_G(errors)->buffer[OPENSSL_G(errors)->bottom];
 
 	if (val) {
@@ -4369,18 +4809,20 @@ PHP_FUNCTION(openssl_open)
 	cipher = php_openssl_get_evp_cipher_by_name(method);
 	if (!cipher) {
 		php_error_docref(NULL, E_WARNING, "Unknown cipher algorithm");
-		RETURN_FALSE;
+		RETVAL_FALSE;
+		goto out_pkey;
 	}
 
 	cipher_iv_len = EVP_CIPHER_iv_length(cipher);
 	if (cipher_iv_len > 0) {
 		if (!iv) {
 			zend_argument_value_error(6, "cannot be null for the chosen cipher algorithm");
-			RETURN_THROWS();
+			goto out_pkey;
 		}
 		if ((size_t)cipher_iv_len != iv_len) {
 			php_error_docref(NULL, E_WARNING, "IV length is invalid");
-			RETURN_FALSE;
+			RETVAL_FALSE;
+			goto out_pkey;
 		}
 		iv_buf = (unsigned char *)iv;
 	} else {
@@ -4402,8 +4844,9 @@ PHP_FUNCTION(openssl_open)
 	}
 
 	efree(buf);
-	EVP_PKEY_free(pkey);
 	EVP_CIPHER_CTX_free(ctx);
+out_pkey:
+	EVP_PKEY_free(pkey);
 }
 /* }}} */
 
@@ -4483,7 +4926,8 @@ PHP_FUNCTION(openssl_digest)
 	sigbuf = zend_string_alloc(siglen, 0);
 
 	md_ctx = EVP_MD_CTX_create();
-	if (EVP_DigestInit(md_ctx, mdtype) &&
+	if (md_ctx &&
+			EVP_DigestInit(md_ctx, mdtype) &&
 			EVP_DigestUpdate(md_ctx, (unsigned char *)data, data_len) &&
 			EVP_DigestFinal (md_ctx, (unsigned char *)ZSTR_VAL(sigbuf), &siglen)) {
 		if (raw_output) {
@@ -4519,7 +4963,7 @@ PHP_FUNCTION(openssl_encrypt)
 	zend_string *ret;
 	zval *tag = NULL;
 
-	if (zend_parse_parameters(ZEND_NUM_ARGS(), "sss|lszsl", &data, &data_len, &method, &method_len,
+	if (zend_parse_parameters(ZEND_NUM_ARGS(), "sss|lszs!l", &data, &data_len, &method, &method_len,
 					&password, &password_len, &options, &iv, &iv_len, &tag, &aad, &aad_len, &tag_len) == FAILURE) {
 		RETURN_THROWS();
 	}
@@ -4541,7 +4985,7 @@ PHP_FUNCTION(openssl_decrypt)
 	size_t data_len, method_len, password_len, iv_len = 0, tag_len = 0, aad_len = 0;
 	zend_string *ret;
 
-	if (zend_parse_parameters(ZEND_NUM_ARGS(), "sss|lss!s", &data, &data_len, &method, &method_len,
+	if (zend_parse_parameters(ZEND_NUM_ARGS(), "sss|lss!s!", &data, &data_len, &method, &method_len,
 					&password, &password_len, &options, &iv, &iv_len, &tag, &tag_len, &aad, &aad_len) == FAILURE) {
 		RETURN_THROWS();
 	}
diff --git a/ext/openssl/openssl.stub.php b/ext/openssl/openssl.stub.php
index 94902a4acf0d..6080ac323903 100644
--- a/ext/openssl/openssl.stub.php
+++ b/ext/openssl/openssl.stub.php
@@ -2,6 +2,67 @@
 
 /** @generate-class-entries */
 
+namespace Openssl {
+
+    class OpensslException extends Exception
+    {
+    }
+
+    /**
+     * @strict-properties
+     */
+    final class Psk
+    {
+        /**
+         * @cvalue PHP_OPENSSL_PSK_MAX_PSK_LEN
+         */
+        public const int MAX_PSK_LEN = UNKNOWN;
+
+        /**
+         * @cvalue PHP_OPENSSL_PSK_MAX_IDENTITY_LEN
+         */
+        public const int MAX_IDENTITY_LEN = UNKNOWN;
+
+        public readonly string $psk;
+        public readonly ?string $identity;
+
+        public function __construct(string $psk, ?string $identity = null) {}
+    }
+
+    /**
+     * @strict-properties
+     */
+    final class Session
+    {
+        public readonly string $id;
+
+        public function export(int $format = OPENSSL_ENCODING_PEM): string {}
+
+        public static function import(string $data, int $format = OPENSSL_ENCODING_PEM): Session {}
+
+        public function isResumable(): bool {}
+
+        public function getTimeout(): int {}
+
+        public function getCreatedAt(): int {}
+
+        public function getProtocol(): ?string {}
+
+        public function getCipher(): ?string {}
+
+        public function hasTicket(): bool {}
+
+        public function getTicketLifetimeHint(): ?int {}
+
+        public function __serialize(): array {}
+
+        public function __unserialize(array $data): void {}
+    }
+
+}
+
+namespace {
+
 /**
  * @var string
  * @cvalue OPENSSL_VERSION_TEXT
@@ -409,7 +470,6 @@
  */
 const OPENSSL_ENCODING_PEM = UNKNOWN;
 
-
 /**
  * @strict-properties
  * @not-serializable
@@ -662,9 +722,9 @@ function openssl_digest(string $data, string $digest_algo, bool $binary = false)
 /**
  * @param string $tag
  */
-function openssl_encrypt(#[\SensitiveParameter] string $data, string $cipher_algo, #[\SensitiveParameter] string $passphrase, int $options = 0, string $iv = "", &$tag = null, string $aad = "", int $tag_length = 16): string|false {}
+function openssl_encrypt(#[\SensitiveParameter] string $data, string $cipher_algo, #[\SensitiveParameter] string $passphrase, int $options = 0, string $iv = "", &$tag = null, ?string $aad = "", int $tag_length = 16): string|false {}
 
-function openssl_decrypt(string $data, string $cipher_algo, #[\SensitiveParameter] string $passphrase, int $options = 0, string $iv = "", ?string $tag = null, string $aad = ""): string|false {}
+function openssl_decrypt(string $data, string $cipher_algo, #[\SensitiveParameter] string $passphrase, int $options = 0, string $iv = "", ?string $tag = null, ?string $aad = ""): string|false {}
 
 function openssl_cipher_iv_length(string $cipher_algo): int|false {}
 
@@ -699,3 +759,5 @@ function openssl_get_cert_locations(): array {}
 function openssl_password_hash(string $algo, #[\SensitiveParameter] string $password, array $options = []): string {}
 function openssl_password_verify(string $algo, #[\SensitiveParameter] string $password, string $hash): bool {}
 #endif
+
+}
diff --git a/ext/openssl/openssl_arginfo.h b/ext/openssl/openssl_arginfo.h
index bae435e90241..caf47a256e78 100644
--- a/ext/openssl/openssl_arginfo.h
+++ b/ext/openssl/openssl_arginfo.h
@@ -1,5 +1,5 @@
 /* This is a generated file, edit openssl.stub.php instead.
- * Stub hash: 8233a8abc8ab7145d905d0fa51478edfe1e55a06 */
+ * Stub hash: 4d38e81a2f73bb6dd4bbe7a3e0b8ba86600654e2 */
 
 ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_openssl_x509_export_to_file, 0, 2, _IS_BOOL, 0)
 	ZEND_ARG_OBJ_TYPE_MASK(0, certificate, OpenSSLCertificate, MAY_BE_STRING, NULL)
@@ -337,7 +337,7 @@ ZEND_BEGIN_ARG_WITH_RETURN_TYPE_MASK_EX(arginfo_openssl_encrypt, 0, 3, MAY_BE_ST
 	ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, options, IS_LONG, 0, "0")
 	ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, iv, IS_STRING, 0, "\"\"")
 	ZEND_ARG_INFO_WITH_DEFAULT_VALUE(1, tag, "null")
-	ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, aad, IS_STRING, 0, "\"\"")
+	ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, aad, IS_STRING, 1, "\"\"")
 	ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, tag_length, IS_LONG, 0, "16")
 ZEND_END_ARG_INFO()
 
@@ -348,7 +348,7 @@ ZEND_BEGIN_ARG_WITH_RETURN_TYPE_MASK_EX(arginfo_openssl_decrypt, 0, 3, MAY_BE_ST
 	ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, options, IS_LONG, 0, "0")
 	ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, iv, IS_STRING, 0, "\"\"")
 	ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, tag, IS_STRING, 1, "null")
-	ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, aad, IS_STRING, 0, "\"\"")
+	ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, aad, IS_STRING, 1, "\"\"")
 ZEND_END_ARG_INFO()
 
 ZEND_BEGIN_ARG_WITH_RETURN_TYPE_MASK_EX(arginfo_openssl_cipher_iv_length, 0, 1, MAY_BE_LONG|MAY_BE_FALSE)
@@ -406,6 +406,44 @@ ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_openssl_password_verify, 0, 3, _
 ZEND_END_ARG_INFO()
 #endif
 
+ZEND_BEGIN_ARG_INFO_EX(arginfo_class_Openssl_Psk___construct, 0, 0, 1)
+	ZEND_ARG_TYPE_INFO(0, psk, IS_STRING, 0)
+	ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, identity, IS_STRING, 1, "null")
+ZEND_END_ARG_INFO()
+
+ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_class_Openssl_Session_export, 0, 0, IS_STRING, 0)
+	ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, format, IS_LONG, 0, "OPENSSL_ENCODING_PEM")
+ZEND_END_ARG_INFO()
+
+ZEND_BEGIN_ARG_WITH_RETURN_OBJ_INFO_EX(arginfo_class_Openssl_Session_import, 0, 1, Openssl\\Session, 0)
+	ZEND_ARG_TYPE_INFO(0, data, IS_STRING, 0)
+	ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, format, IS_LONG, 0, "OPENSSL_ENCODING_PEM")
+ZEND_END_ARG_INFO()
+
+ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_class_Openssl_Session_isResumable, 0, 0, _IS_BOOL, 0)
+ZEND_END_ARG_INFO()
+
+ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_class_Openssl_Session_getTimeout, 0, 0, IS_LONG, 0)
+ZEND_END_ARG_INFO()
+
+#define arginfo_class_Openssl_Session_getCreatedAt arginfo_class_Openssl_Session_getTimeout
+
+ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_class_Openssl_Session_getProtocol, 0, 0, IS_STRING, 1)
+ZEND_END_ARG_INFO()
+
+#define arginfo_class_Openssl_Session_getCipher arginfo_class_Openssl_Session_getProtocol
+
+#define arginfo_class_Openssl_Session_hasTicket arginfo_class_Openssl_Session_isResumable
+
+ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_class_Openssl_Session_getTicketLifetimeHint, 0, 0, IS_LONG, 1)
+ZEND_END_ARG_INFO()
+
+#define arginfo_class_Openssl_Session___serialize arginfo_openssl_get_cert_locations
+
+ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_class_Openssl_Session___unserialize, 0, 1, IS_VOID, 0)
+	ZEND_ARG_TYPE_INFO(0, data, IS_ARRAY, 0)
+ZEND_END_ARG_INFO()
+
 ZEND_FUNCTION(openssl_x509_export_to_file);
 ZEND_FUNCTION(openssl_x509_export);
 ZEND_FUNCTION(openssl_x509_fingerprint);
@@ -473,6 +511,18 @@ ZEND_FUNCTION(openssl_get_cert_locations);
 ZEND_FUNCTION(openssl_password_hash);
 ZEND_FUNCTION(openssl_password_verify);
 #endif
+ZEND_METHOD(Openssl_Psk, __construct);
+ZEND_METHOD(Openssl_Session, export);
+ZEND_METHOD(Openssl_Session, import);
+ZEND_METHOD(Openssl_Session, isResumable);
+ZEND_METHOD(Openssl_Session, getTimeout);
+ZEND_METHOD(Openssl_Session, getCreatedAt);
+ZEND_METHOD(Openssl_Session, getProtocol);
+ZEND_METHOD(Openssl_Session, getCipher);
+ZEND_METHOD(Openssl_Session, hasTicket);
+ZEND_METHOD(Openssl_Session, getTicketLifetimeHint);
+ZEND_METHOD(Openssl_Session, __serialize);
+ZEND_METHOD(Openssl_Session, __unserialize);
 
 static const zend_function_entry ext_functions[] = {
 	ZEND_FE(openssl_x509_export_to_file, arginfo_openssl_x509_export_to_file)
@@ -548,6 +598,26 @@ static const zend_function_entry ext_functions[] = {
 	ZEND_FE_END
 };
 
+static const zend_function_entry class_Openssl_Psk_methods[] = {
+	ZEND_ME(Openssl_Psk, __construct, arginfo_class_Openssl_Psk___construct, ZEND_ACC_PUBLIC)
+	ZEND_FE_END
+};
+
+static const zend_function_entry class_Openssl_Session_methods[] = {
+	ZEND_ME(Openssl_Session, export, arginfo_class_Openssl_Session_export, ZEND_ACC_PUBLIC)
+	ZEND_ME(Openssl_Session, import, arginfo_class_Openssl_Session_import, ZEND_ACC_PUBLIC|ZEND_ACC_STATIC)
+	ZEND_ME(Openssl_Session, isResumable, arginfo_class_Openssl_Session_isResumable, ZEND_ACC_PUBLIC)
+	ZEND_ME(Openssl_Session, getTimeout, arginfo_class_Openssl_Session_getTimeout, ZEND_ACC_PUBLIC)
+	ZEND_ME(Openssl_Session, getCreatedAt, arginfo_class_Openssl_Session_getCreatedAt, ZEND_ACC_PUBLIC)
+	ZEND_ME(Openssl_Session, getProtocol, arginfo_class_Openssl_Session_getProtocol, ZEND_ACC_PUBLIC)
+	ZEND_ME(Openssl_Session, getCipher, arginfo_class_Openssl_Session_getCipher, ZEND_ACC_PUBLIC)
+	ZEND_ME(Openssl_Session, hasTicket, arginfo_class_Openssl_Session_hasTicket, ZEND_ACC_PUBLIC)
+	ZEND_ME(Openssl_Session, getTicketLifetimeHint, arginfo_class_Openssl_Session_getTicketLifetimeHint, ZEND_ACC_PUBLIC)
+	ZEND_ME(Openssl_Session, __serialize, arginfo_class_Openssl_Session___serialize, ZEND_ACC_PUBLIC)
+	ZEND_ME(Openssl_Session, __unserialize, arginfo_class_Openssl_Session___unserialize, ZEND_ACC_PUBLIC)
+	ZEND_FE_END
+};
+
 static void register_openssl_symbols(int module_number)
 {
 	REGISTER_STRING_CONSTANT("OPENSSL_VERSION_TEXT", OPENSSL_VERSION_TEXT, CONST_PERSISTENT);
@@ -751,6 +821,66 @@ static void register_openssl_symbols(int module_number)
 #endif
 }
 
+static zend_class_entry *register_class_Openssl_OpensslException(zend_class_entry *class_entry_Openssl_Exception)
+{
+	zend_class_entry ce, *class_entry;
+
+	INIT_NS_CLASS_ENTRY(ce, "Openssl", "OpensslException", NULL);
+	class_entry = zend_register_internal_class_with_flags(&ce, class_entry_Openssl_Exception, 0);
+
+	return class_entry;
+}
+
+static zend_class_entry *register_class_Openssl_Psk(void)
+{
+	zend_class_entry ce, *class_entry;
+
+	INIT_NS_CLASS_ENTRY(ce, "Openssl", "Psk", class_Openssl_Psk_methods);
+	class_entry = zend_register_internal_class_with_flags(&ce, NULL, ZEND_ACC_FINAL|ZEND_ACC_NO_DYNAMIC_PROPERTIES);
+
+	zval const_MAX_PSK_LEN_value;
+	ZVAL_LONG(&const_MAX_PSK_LEN_value, PHP_OPENSSL_PSK_MAX_PSK_LEN);
+	zend_string *const_MAX_PSK_LEN_name = zend_string_init_interned("MAX_PSK_LEN", sizeof("MAX_PSK_LEN") - 1, true);
+	zend_declare_typed_class_constant(class_entry, const_MAX_PSK_LEN_name, &const_MAX_PSK_LEN_value, ZEND_ACC_PUBLIC, NULL, (zend_type) ZEND_TYPE_INIT_MASK(MAY_BE_LONG));
+	zend_string_release_ex(const_MAX_PSK_LEN_name, true);
+
+	zval const_MAX_IDENTITY_LEN_value;
+	ZVAL_LONG(&const_MAX_IDENTITY_LEN_value, PHP_OPENSSL_PSK_MAX_IDENTITY_LEN);
+	zend_string *const_MAX_IDENTITY_LEN_name = zend_string_init_interned("MAX_IDENTITY_LEN", sizeof("MAX_IDENTITY_LEN") - 1, true);
+	zend_declare_typed_class_constant(class_entry, const_MAX_IDENTITY_LEN_name, &const_MAX_IDENTITY_LEN_value, ZEND_ACC_PUBLIC, NULL, (zend_type) ZEND_TYPE_INIT_MASK(MAY_BE_LONG));
+	zend_string_release_ex(const_MAX_IDENTITY_LEN_name, true);
+
+	zval property_psk_default_value;
+	ZVAL_UNDEF(&property_psk_default_value);
+	zend_string *property_psk_name = zend_string_init("psk", sizeof("psk") - 1, true);
+	zend_declare_typed_property(class_entry, property_psk_name, &property_psk_default_value, ZEND_ACC_PUBLIC|ZEND_ACC_READONLY, NULL, (zend_type) ZEND_TYPE_INIT_MASK(MAY_BE_STRING));
+	zend_string_release_ex(property_psk_name, true);
+
+	zval property_identity_default_value;
+	ZVAL_UNDEF(&property_identity_default_value);
+	zend_string *property_identity_name = zend_string_init("identity", sizeof("identity") - 1, true);
+	zend_declare_typed_property(class_entry, property_identity_name, &property_identity_default_value, ZEND_ACC_PUBLIC|ZEND_ACC_READONLY, NULL, (zend_type) ZEND_TYPE_INIT_MASK(MAY_BE_STRING|MAY_BE_NULL));
+	zend_string_release_ex(property_identity_name, true);
+
+	return class_entry;
+}
+
+static zend_class_entry *register_class_Openssl_Session(void)
+{
+	zend_class_entry ce, *class_entry;
+
+	INIT_NS_CLASS_ENTRY(ce, "Openssl", "Session", class_Openssl_Session_methods);
+	class_entry = zend_register_internal_class_with_flags(&ce, NULL, ZEND_ACC_FINAL|ZEND_ACC_NO_DYNAMIC_PROPERTIES);
+
+	zval property_id_default_value;
+	ZVAL_UNDEF(&property_id_default_value);
+	zend_string *property_id_name = zend_string_init("id", sizeof("id") - 1, true);
+	zend_declare_typed_property(class_entry, property_id_name, &property_id_default_value, ZEND_ACC_PUBLIC|ZEND_ACC_READONLY, NULL, (zend_type) ZEND_TYPE_INIT_MASK(MAY_BE_STRING));
+	zend_string_release_ex(property_id_name, true);
+
+	return class_entry;
+}
+
 static zend_class_entry *register_class_OpenSSLCertificate(void)
 {
 	zend_class_entry ce, *class_entry;
diff --git a/ext/openssl/openssl_backend_common.c b/ext/openssl/openssl_backend_common.c
index 6f257af49819..42491bf21041 100644
--- a/ext/openssl/openssl_backend_common.c
+++ b/ext/openssl/openssl_backend_common.c
@@ -1,14 +1,12 @@
 /*
    +----------------------------------------------------------------------+
-   | Copyright (c) The PHP Group                                          |
+   | Copyright © The PHP Group and Contributors.                          |
    +----------------------------------------------------------------------+
-   | This source file is subject to version 3.01 of the PHP license,      |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | https://www.php.net/license/3_01.txt                                 |
-   | If you did not receive a copy of the PHP license and are unable to   |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@php.net so we can mail you a copy immediately.               |
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Authors: Jakub Zelenka                                |
    +----------------------------------------------------------------------+
@@ -110,7 +108,7 @@ void php_openssl_add_assoc_name_entry(zval * val, char * key, X509_NAME * name,
 
 void php_openssl_add_assoc_asn1_string(zval * val, char * key, ASN1_STRING * str)
 {
-	add_assoc_stringl(val, key, (char *)str->data, str->length);
+	add_assoc_stringl(val, key, (const char *)ASN1_STRING_get0_data(str), ASN1_STRING_length(str));
 }
 
 time_t php_openssl_asn1_time_to_time_t(ASN1_UTCTIME * timestr)
@@ -142,12 +140,12 @@ time_t php_openssl_asn1_time_to_time_t(ASN1_UTCTIME * timestr)
 	}
 
 	if (timestr_len < 13) {
-		php_error_docref(NULL, E_WARNING, "Unable to parse time string %s correctly", timestr->data);
+		php_error_docref(NULL, E_WARNING, "Unable to parse time string %s correctly", ASN1_STRING_get0_data(timestr));
 		return (time_t)-1;
 	}
 
 	if (ASN1_STRING_type(timestr) == V_ASN1_GENERALIZEDTIME && timestr_len < 15) {
-		php_error_docref(NULL, E_WARNING, "Unable to parse time string %s correctly", timestr->data);
+		php_error_docref(NULL, E_WARNING, "Unable to parse time string %s correctly", ASN1_STRING_get0_data(timestr));
 		return (time_t)-1;
 	}
 
@@ -504,10 +502,8 @@ void php_openssl_set_cert_locations(zval *return_value)
 	add_assoc_string(return_value, "default_cert_dir_env", (char *) X509_get_default_cert_dir_env());
 	add_assoc_string(return_value, "default_private_dir", (char *) X509_get_default_private_dir());
 	add_assoc_string(return_value, "default_default_cert_area", (char *) X509_get_default_cert_area());
-	add_assoc_string(return_value, "ini_cafile",
-		zend_ini_string("openssl.cafile", sizeof("openssl.cafile")-1, 0));
-	add_assoc_string(return_value, "ini_capath",
-		zend_ini_string("openssl.capath", sizeof("openssl.capath")-1, 0));
+	add_assoc_str(return_value, "ini_cafile", zend_string_copy(zend_ini_str_literal("openssl.cafile")));
+	add_assoc_str(return_value, "ini_capath", zend_string_copy(zend_ini_str_literal("openssl.capath")));
 }
 
 X509 *php_openssl_x509_from_str(
@@ -630,8 +626,8 @@ int openssl_x509v3_subjectAltName(BIO *bio, X509_EXTENSION *extension)
 	}
 
 	extension_data = X509_EXTENSION_get_data(extension);
-	p = extension_data->data;
-	length = extension_data->length;
+	p = ASN1_STRING_get0_data(extension_data);
+	length = ASN1_STRING_length(extension_data);
 	if (method->it) {
 		names = (GENERAL_NAMES*) (ASN1_item_d2i(NULL, &p, length,
 			ASN1_ITEM_ptr(method->it)));
@@ -748,6 +744,7 @@ int php_openssl_check_cert(X509_STORE *ctx, X509 *x, STACK_OF(X509) *untrustedch
 		return 0;
 	}
 	if (!X509_STORE_CTX_init(csc, ctx, x, untrustedchain)) {
+		X509_STORE_CTX_free(csc);
 		php_openssl_store_errors();
 		php_error_docref(NULL, E_WARNING, "Certificate store initialization failed");
 		return 0;
@@ -1089,13 +1086,15 @@ zend_result php_openssl_csr_make(struct php_x509_request * req, X509_REQ * csr,
 				}
 			}
 		}
+
+		if (!X509_REQ_set_pubkey(csr, req->priv_key)) {
+			php_openssl_store_errors();
+		}
 	} else {
 		php_openssl_store_errors();
+		return FAILURE;
 	}
 
-	if (!X509_REQ_set_pubkey(csr, req->priv_key)) {
-		php_openssl_store_errors();
-	}
 	return SUCCESS;
 }
 
@@ -1519,7 +1518,7 @@ EVP_PKEY *php_openssl_generate_private_key(struct php_x509_request * req)
 		case EVP_PKEY_ED448:
 			break;
 #endif
-		EMPTY_SWITCH_DEFAULT_CASE()
+		default: ZEND_UNREACHABLE();
 		}
 
 		if (EVP_PKEY_paramgen(ctx, ¶ms) <= 0) {
@@ -1651,10 +1650,14 @@ void php_openssl_load_cipher_mode(struct php_openssl_cipher_mode *mode, const EV
 {
 	int cipher_mode = EVP_CIPHER_mode(cipher_type);
 	memset(mode, 0, sizeof(struct php_openssl_cipher_mode));
+
 	switch (cipher_mode) {
 		case EVP_CIPH_GCM_MODE:
 		case EVP_CIPH_CCM_MODE:
-		/* We check for EVP_CIPH_OCB_MODE, because LibreSSL does not support it. */
+		/* We check for EVP_CIPH_SIV_MODE and EVP_CIPH_SIV_MODE, because older OpenSSL and LibreSSL do not support them. */
+#ifdef EVP_CIPH_SIV_MODE
+		case EVP_CIPH_SIV_MODE:
+#endif
 #ifdef EVP_CIPH_OCB_MODE
 		case EVP_CIPH_OCB_MODE:
 			/* For OCB mode, explicitly set the tag length even when decrypting,
@@ -1664,6 +1667,9 @@ void php_openssl_load_cipher_mode(struct php_openssl_cipher_mode *mode, const EV
 			php_openssl_set_aead_flags(mode);
 			mode->set_tag_length_when_encrypting = cipher_mode == EVP_CIPH_CCM_MODE;
 			mode->is_single_run_aead = cipher_mode == EVP_CIPH_CCM_MODE;
+#ifdef EVP_CIPH_SIV_MODE
+			mode->aad_supports_vector = cipher_mode == EVP_CIPH_SIV_MODE;
+#endif
 			break;
 #ifdef NID_chacha20_poly1305
 		default:
@@ -1804,6 +1810,13 @@ zend_result php_openssl_cipher_update(const EVP_CIPHER *cipher_type,
 		const char *aad, size_t aad_len, int enc)
 {
 	int i = 0;
+	size_t outlen = data_len + EVP_CIPHER_block_size(cipher_type);
+
+	/* For AEAD modes that do not support vector AAD, treat NULL AAD as zero-length AAD */
+	if (!mode->aad_supports_vector && aad == NULL) {
+		aad_len = 0;
+		aad = "";
+	}
 
 	if (mode->is_single_run_aead && !EVP_CipherUpdate(cipher_ctx, NULL, &i, NULL, (int)data_len)) {
 		php_openssl_store_errors();
@@ -1811,13 +1824,27 @@ zend_result php_openssl_cipher_update(const EVP_CIPHER *cipher_type,
 		return FAILURE;
 	}
 
-	if (mode->is_aead && !EVP_CipherUpdate(cipher_ctx, NULL, &i, (const unsigned char *) aad, (int) aad_len)) {
+	/* Only pass AAD to OpenSSL if caller provided it.
+	   This makes NULL mean zero AAD items, while "" with len 0 means one empty AAD item. */
+	if (mode->is_aead && aad != NULL && !EVP_CipherUpdate(cipher_ctx, NULL, &i, (const unsigned char *)aad, (int)aad_len)) {
 		php_openssl_store_errors();
 		php_error_docref(NULL, E_WARNING, "Setting of additional application data failed");
 		return FAILURE;
 	}
 
-	*poutbuf = zend_string_alloc((int)data_len + EVP_CIPHER_block_size(cipher_type), 0);
+#ifdef EVP_CIPH_WRAP_MODE
+	if ((EVP_CIPHER_mode(cipher_type)) == EVP_CIPH_WRAP_MODE) {
+		/*
+		 * RFC 5649 wrap-with-padding rounds the input up to the block size
+		 * and prepends an integrity block, we reserve one extra block.
+		 * See EVP_EncryptUpdate(3): wrap mode may write up to
+		 * inl + cipher_block_size bytes.
+		 */
+		outlen += EVP_CIPHER_block_size(cipher_type);
+	}
+#endif
+
+	*poutbuf = zend_string_alloc(outlen, false);
 
 	if (!EVP_CipherUpdate(cipher_ctx, (unsigned char*)ZSTR_VAL(*poutbuf),
 					&i, (const unsigned char *)data, (int)data_len)) {
diff --git a/ext/openssl/openssl_backend_v1.c b/ext/openssl/openssl_backend_v1.c
index 81c327dbfe34..0c1ac6b955f6 100644
--- a/ext/openssl/openssl_backend_v1.c
+++ b/ext/openssl/openssl_backend_v1.c
@@ -1,14 +1,12 @@
 /*
    +----------------------------------------------------------------------+
-   | Copyright (c) The PHP Group                                          |
+   | Copyright © The PHP Group and Contributors.                          |
    +----------------------------------------------------------------------+
-   | This source file is subject to version 3.01 of the PHP license,      |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | https://www.php.net/license/3_01.txt                                 |
-   | If you did not receive a copy of the PHP license and are unable to   |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@php.net so we can mail you a copy immediately.               |
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Authors: Jakub Zelenka                                |
    +----------------------------------------------------------------------+
@@ -140,7 +138,14 @@ static bool php_openssl_pkey_init_dsa_data(DSA *dsa, zval *data, bool *is_privat
 	OPENSSL_PKEY_SET_BN(data, p);
 	OPENSSL_PKEY_SET_BN(data, q);
 	OPENSSL_PKEY_SET_BN(data, g);
-	if (!p || !q || !g || !DSA_set0_pqg(dsa, p, q, g)) {
+	if (!p || !q || !g) {
+		BN_free(p);
+		BN_free(q);
+		BN_free(g);
+		return false;
+	}
+
+	if (!DSA_set0_pqg(dsa, p, q, g)) {
 		return false;
 	}
 
@@ -201,7 +206,12 @@ static bool php_openssl_pkey_init_dh_data(DH *dh, zval *data, bool *is_private)
 	OPENSSL_PKEY_SET_BN(data, p);
 	OPENSSL_PKEY_SET_BN(data, q);
 	OPENSSL_PKEY_SET_BN(data, g);
-	if (!p || !g || !DH_set0_pqg(dh, p, q, g)) {
+	if (!p || !q) {
+		BN_free(p);
+		return false;
+	}
+
+	if (!DH_set0_pqg(dh, p, q, g)) {
 		return false;
 	}
 
@@ -214,6 +224,10 @@ static bool php_openssl_pkey_init_dh_data(DH *dh, zval *data, bool *is_private)
 	if (priv_key) {
 		pub_key = php_openssl_dh_pub_from_priv(priv_key, g, p);
 		if (pub_key == NULL) {
+			BN_free(p);
+			BN_free(q);
+			BN_free(g);
+			BN_free(priv_key);
 			return false;
 		}
 		return DH_set0_key(dh, pub_key, priv_key);
@@ -261,6 +275,9 @@ static bool php_openssl_pkey_init_ec_data(EC_KEY *eckey, zval *data, bool *is_pr
 	EC_POINT *point_q = NULL;
 	EC_GROUP *group = NULL;
 	BN_CTX *bctx = BN_CTX_new();
+	if (!bctx) {
+		goto clean_exit;
+	}
 
 	*is_private = false;
 
@@ -632,7 +649,6 @@ const EVP_MD *php_openssl_get_evp_md_from_algo(zend_long algo)
 #endif
 		default:
 			return NULL;
-			break;
 	}
 	return mdtype;
 }
@@ -653,40 +669,31 @@ const EVP_CIPHER *php_openssl_get_evp_cipher_from_algo(zend_long algo)
 #ifndef OPENSSL_NO_RC2
 		case PHP_OPENSSL_CIPHER_RC2_40:
 			return EVP_rc2_40_cbc();
-			break;
 		case PHP_OPENSSL_CIPHER_RC2_64:
 			return EVP_rc2_64_cbc();
-			break;
 		case PHP_OPENSSL_CIPHER_RC2_128:
 			return EVP_rc2_cbc();
-			break;
 #endif
 
 #ifndef OPENSSL_NO_DES
 		case PHP_OPENSSL_CIPHER_DES:
 			return EVP_des_cbc();
-			break;
 		case PHP_OPENSSL_CIPHER_3DES:
 			return EVP_des_ede3_cbc();
-			break;
 #endif
 
 #ifndef OPENSSL_NO_AES
 		case PHP_OPENSSL_CIPHER_AES_128_CBC:
 			return EVP_aes_128_cbc();
-			break;
 		case PHP_OPENSSL_CIPHER_AES_192_CBC:
 			return EVP_aes_192_cbc();
-			break;
 		case PHP_OPENSSL_CIPHER_AES_256_CBC:
 			return EVP_aes_256_cbc();
-			break;
 #endif
 
 
 		default:
 			return NULL;
-			break;
 	}
 }
 
diff --git a/ext/openssl/openssl_backend_v3.c b/ext/openssl/openssl_backend_v3.c
index 6e3e883080f3..339ff53f7b62 100644
--- a/ext/openssl/openssl_backend_v3.c
+++ b/ext/openssl/openssl_backend_v3.c
@@ -1,14 +1,12 @@
 /*
    +----------------------------------------------------------------------+
-   | Copyright (c) The PHP Group                                          |
+   | Copyright © The PHP Group and Contributors.                          |
    +----------------------------------------------------------------------+
-   | This source file is subject to version 3.01 of the PHP license,      |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | https://www.php.net/license/3_01.txt                                 |
-   | If you did not receive a copy of the PHP license and are unable to   |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@php.net so we can mail you a copy immediately.               |
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Authors: Jakub Zelenka                                |
    +----------------------------------------------------------------------+
@@ -454,6 +452,9 @@ EVP_PKEY *php_openssl_pkey_init_ec(zval *data, bool *is_private) {
 		}
 		EVP_PKEY_CTX_free(ctx);
 		ctx = EVP_PKEY_CTX_new(param_key, NULL);
+		if (!ctx) {
+			goto cleanup;
+		}
 	}
 
 	if (EVP_PKEY_check(ctx) || EVP_PKEY_public_check_quick(ctx)) {
diff --git a/ext/openssl/openssl_pwhash.c b/ext/openssl/openssl_pwhash.c
index dc125e3b516d..0b439a731d1c 100644
--- a/ext/openssl/openssl_pwhash.c
+++ b/ext/openssl/openssl_pwhash.c
@@ -1,14 +1,12 @@
 /*
    +----------------------------------------------------------------------+
-   | Copyright (c) The PHP Group                                          |
+   | Copyright © The PHP Group and Contributors.                          |
    +----------------------------------------------------------------------+
-   | This source file is subject to version 3.01 of the PHP license,      |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | https://www.php.net/license/3_01.txt                                 |
-   | If you did not receive a copy of the PHP license and are unable to   |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@php.net so we can mail you a copy immediately.               |
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Authors: Remi Collet                                   |
    +----------------------------------------------------------------------+
@@ -51,6 +49,7 @@ ZEND_EXTERN_MODULE_GLOBALS(openssl)
 static inline zend_result get_options(zend_array *options, uint32_t *memlimit, uint32_t *iterlimit, uint32_t *threads)
 {
 	zval *opt;
+	zend_long sthreads;
 
 	*iterlimit = PHP_OPENSSL_PWHASH_ITERLIMIT;
 	*memlimit  = PHP_OPENSSL_PWHASH_MEMLIMIT;
@@ -76,8 +75,7 @@ static inline zend_result get_options(zend_array *options, uint32_t *memlimit, u
 		}
 		*iterlimit = siterlimit;
 	}
-	if ((opt = zend_hash_str_find(options, "threads", strlen("threads"))) && (zval_get_long(opt) != 1)) {
-		zend_long sthreads = zval_get_long(opt);
+	if ((opt = zend_hash_str_find(options, "threads", strlen("threads"))) && ((sthreads = zval_get_long(opt)) != 1)) {
 		if ((sthreads < PHP_OPENSSL_THREADS_MIN) || (sthreads > PHP_OPENSSL_THREADS_MAX)) {
 			zend_value_error("Invalid number of threads");
 			return FAILURE;
diff --git a/ext/openssl/php_openssl.h b/ext/openssl/php_openssl.h
index 92ccd9a546f9..20a04bbcd1a0 100644
--- a/ext/openssl/php_openssl.h
+++ b/ext/openssl/php_openssl.h
@@ -1,14 +1,12 @@
 /*
    +----------------------------------------------------------------------+
-   | Copyright (c) The PHP Group                                          |
+   | Copyright © The PHP Group and Contributors.                          |
    +----------------------------------------------------------------------+
-   | This source file is subject to version 3.01 of the PHP license,      |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | https://www.php.net/license/3_01.txt                                 |
-   | If you did not receive a copy of the PHP license and are unable to   |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@php.net so we can mail you a copy immediately.               |
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Authors: Stig Venaas                                 |
    |          Wez Furlong 
+
+typedef struct _php_openssl_session_object {
+	SSL_SESSION *session;
+	zend_object std;
+} php_openssl_session_object;
+
+static inline php_openssl_session_object *php_openssl_session_from_obj(zend_object *obj) {
+	return (php_openssl_session_object *)((char *)(obj) - offsetof(php_openssl_session_object, std));
+}
+
+#define Z_OPENSSL_SESSION_P(zv) php_openssl_session_from_obj(Z_OBJ_P(zv))
+
+/* Extern declarations for xp_ssl.c */
+extern zend_class_entry *php_openssl_session_ce;
+
+void php_openssl_session_object_init(zval *zv, SSL_SESSION *session);
+bool php_openssl_is_session_ce(zval *val);
+SSL_SESSION *php_openssl_session_from_zval(zval *zv);
+
 #if defined(HAVE_OPENSSL_ARGON2)
 
 /**
diff --git a/ext/openssl/php_openssl_backend.h b/ext/openssl/php_openssl_backend.h
index 00da5e74fc1b..2d37e594ea57 100644
--- a/ext/openssl/php_openssl_backend.h
+++ b/ext/openssl/php_openssl_backend.h
@@ -1,14 +1,12 @@
 /*
    +----------------------------------------------------------------------+
-   | Copyright (c) The PHP Group                                          |
+   | Copyright © The PHP Group and Contributors.                          |
    +----------------------------------------------------------------------+
-   | This source file is subject to version 3.01 of the PHP license,      |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | https://www.php.net/license/3_01.txt                                 |
-   | If you did not receive a copy of the PHP license and are unable to   |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@php.net so we can mail you a copy immediately.               |
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Authors: Jakub Zelenka                                |
    +----------------------------------------------------------------------+
@@ -348,6 +346,7 @@ struct php_openssl_cipher_mode {
 	bool is_single_run_aead;
 	bool set_tag_length_always;
 	bool set_tag_length_when_encrypting;
+	bool aad_supports_vector;
 	int aead_get_tag_flag;
 	int aead_set_tag_flag;
 	int aead_ivlen_flag;
diff --git a/ext/openssl/tests/ServerClientTestCase.inc b/ext/openssl/tests/ServerClientTestCase.inc
index 8eedbfdebee8..c5db41d48417 100644
--- a/ext/openssl/tests/ServerClientTestCase.inc
+++ b/ext/openssl/tests/ServerClientTestCase.inc
@@ -100,7 +100,8 @@ class ServerClientTestCase
             $ini = php_ini_loaded_file();
             $cmd = sprintf(
                 '%s %s "%s" %s',
-                PHP_BINARY, $ini ? "-n -c $ini" : "",
+                // XXX: TEST_PHP_EXTRA_ARGS for run-test values won't work here?
+                PHP_BINARY, $ini ? "-n -c $ini -d error_include_args=0" : "",
                 __FILE__,
                 WORKER_ARGV_VALUE
             );
@@ -179,6 +180,9 @@ class ServerClientTestCase
                 if (empty($addr)) {
                     throw new \Exception("Failed server start");
                 }
+				if (strpos($addr, 'SERVER_EXCEPTION') !== false) {
+					echo $addr;
+				}
                 if ($code === false) {
                     $clientCode = preg_replace('/{{\s*ADDR\s*}}/', $addr, $clientCode);
                 } else {
diff --git a/ext/openssl/tests/bug74796.phpt b/ext/openssl/tests/bug74796.phpt
index b3f594d5e60f..8ec5590c064f 100644
--- a/ext/openssl/tests/bug74796.phpt
+++ b/ext/openssl/tests/bug74796.phpt
@@ -12,13 +12,24 @@ if (substr(PHP_OS, 0, 3) == 'WIN') {
 --FILE--
 saveCaCert($caFile);
+$certificateGenerator->saveNewCertAsFileWithKey('cs.php.net', $csFile);
+$certificateGenerator->saveNewCertAsFileWithKey('uk.php.net', $ukFile);
+$certificateGenerator->saveNewCertAsFileWithKey('us.php.net', $usFile);
+
 $serverCode = <<<'CODE'
     $serverFlags = STREAM_SERVER_BIND | STREAM_SERVER_LISTEN;
     $ctx = stream_context_create(['ssl' => [
         'SNI_server_certs' => [
-            "cs.php.net" => __DIR__ . "/sni_server_cs.pem",
-            "uk.php.net" => __DIR__ . "/sni_server_uk.pem",
-            "us.php.net" => __DIR__ . "/sni_server_us.pem"
+            "cs.php.net" => '%s',
+            "uk.php.net" => '%s',
+            "us.php.net" => '%s',
         ]
     ]]);
 
@@ -33,6 +44,7 @@ $serverCode = <<<'CODE'
 
     phpt_wait();
 CODE;
+$serverCode = sprintf($serverCode, $csFile, $ukFile, $usFile);
 
 $proxyCode = <<<'CODE'
     function parse_sni_from_client_hello($data) {
@@ -134,7 +146,7 @@ CODE;
 $clientCode = <<<'CODE'
     $clientCtx = stream_context_create([
         'ssl' => [
-            'cafile' => __DIR__ . '/sni_server_ca.pem',
+            'cafile' => '%s',
             'verify_peer' => true,
             'verify_peer_name' => true,
         ],
@@ -155,16 +167,21 @@ $clientCode = <<<'CODE'
 
     phpt_notify('server');
 CODE;
+$clientCode = sprintf($clientCode, $caFile);
 
 include 'ServerClientTestCase.inc';
 ServerClientTestCase::getInstance()->run($clientCode, [
-    'server' => $serverCode,
-    'proxy' => $proxyCode,
+        'server' => $serverCode,
+        'proxy' => $proxyCode,
 ]);
 ?>
 --CLEAN--
 
 --EXPECT--
 string(19) "Hello from server 0"
diff --git a/ext/openssl/tests/bug80770.phpt b/ext/openssl/tests/bug80770.phpt
index 9100aaa5aa18..21860dc78eb7 100644
--- a/ext/openssl/tests/bug80770.phpt
+++ b/ext/openssl/tests/bug80770.phpt
@@ -11,14 +11,25 @@ if (OPENSSL_VERSION_NUMBER < 0x10101000) die("skip OpenSSL v1.1.1 required");
 saveCaCert($caCertFile);
+$certificateGenerator->saveNewCertAsFileWithKey('cs.php.net', $csFile);
+$certificateGenerator->saveNewCertAsFileWithKey('uk.php.net', $ukFile);
+$certificateGenerator->saveNewCertAsFileWithKey('us.php.net', $usFile);
+$certificateGenerator->saveNewCertAsFileWithKey('Bug80770 Test Client', $clientCertFile);
 
 $serverCode = <<<'CODE'
     $flags = STREAM_SERVER_BIND|STREAM_SERVER_LISTEN;
     $ctx = stream_context_create(['ssl' => [
         'SNI_server_certs' => [
-            "cs.php.net" => __DIR__ . "/sni_server_cs.pem",
-            "uk.php.net" => __DIR__ . "/sni_server_uk.pem",
-            "us.php.net" => __DIR__ . "/sni_server_us.pem"
+            "cs.php.net" => '%s',
+            "uk.php.net" => '%s',
+            "us.php.net" => '%s',
         ],
         'verify_peer' => true,
         'cafile' => '%s',
@@ -28,7 +39,6 @@ $serverCode = <<<'CODE'
     ]]);
     $server = stream_socket_server('tcp://127.0.0.1:0', $errno, $errstr, $flags, $ctx);
     phpt_notify_server_start($server);
-
     $client = stream_socket_accept($server, 30);
     if ($client) {
         $success = stream_socket_enable_crypto($client, true, STREAM_CRYPTO_METHOD_TLS_SERVER);
@@ -43,7 +53,7 @@ $serverCode = <<<'CODE'
         phpt_notify(message: "ACCEPT_FAILED");
     }
 CODE;
-$serverCode = sprintf($serverCode, $caCertFile);
+$serverCode = sprintf($serverCode, $csFile, $ukFile, $usFile, $caCertFile);
 
 $clientCode = <<<'CODE'
     $flags = STREAM_CLIENT_CONNECT;
@@ -58,19 +68,11 @@ $clientCode = <<<'CODE'
     if ($client) {
         stream_socket_enable_crypto($client, true, STREAM_CRYPTO_METHOD_TLS_CLIENT);
     }
-
     $result = phpt_wait();
     echo trim($result);
 CODE;
 $clientCode = sprintf($clientCode, $clientCertFile);
 
-include 'CertificateGenerator.inc';
-
-// Generate CA and client certificate signed by that CA
-$certificateGenerator = new CertificateGenerator();
-$certificateGenerator->saveCaCert($caCertFile);
-$certificateGenerator->saveNewCertAsFileWithKey('Bug80770 Test Client', $clientCertFile);
-
 include 'ServerClientTestCase.inc';
 ServerClientTestCase::getInstance()->run($clientCode, $serverCode);
 ?>
@@ -78,6 +80,9 @@ ServerClientTestCase::getInstance()->run($clientCode, $serverCode);
 
 --EXPECTF--
 CLIENT_CERT_CAPTURED
diff --git a/ext/openssl/tests/cipher_tests.inc b/ext/openssl/tests/cipher_tests.inc
index f543a42c9f45..9d17e847bfa2 100644
--- a/ext/openssl/tests/cipher_tests.inc
+++ b/ext/openssl/tests/cipher_tests.inc
@@ -160,6 +160,59 @@ $php_openssl_cipher_tests = array(
             'ct'  => '1792A4E31E0755FB03E31B22116E6C2DDF9EFD6E33D536F1A0124B0A55BAE884ED93481529C76B6A',
         ),
     ),
+    'aes-128-siv' => array(
+        array(
+            'key' => 'fffefdfcfbfaf9f8f7f6f5f4f3f2f1f0' .
+                     '0f0e0d0c0b0a09080706050403020100',
+            'iv'  => '',
+            'aad' => '',
+            'tag' => 'baba5b99dfc42fa9810fb2eb71ac2e9c',
+            'pt'  => 'b1677d933fa706f7ef349f9dd569c028' .
+                     '279a5e2219728e77cfe916d5db979942' .
+                     '5d8fb93b0e26dbc85ed14c050dc9f054' .
+                     'd9153c2be1e9b99ae7a109aba1e5a7f1' .
+                     'f2131786da90fe998d3571c144d066c3',
+            'ct'  => '91416054151e844965ad20a2057e2baa' .
+                     '0e785269b152ba9d4dc834777e0d5376' .
+                     'db611856ae0d5d826f446c8eef47acb4' .
+                     '83dccb37da9481648a4907fd3d65335b' .
+                     'd9585361c0c1834ac2b975f3238ea7c6',
+       ),
+       array(
+            'key' => 'fffefdfcfbfaf9f8f7f6f5f4f3f2f1f0' .
+                     '0f0e0d0c0b0a09080706050403020100',
+            'iv'  => '',
+            'aad' => null,
+            'tag' => '606ac96568128a278b02e3e04de97b7e',
+            'pt'  => 'ea597a2f9fb0b5c4d5a6f215047b58a3' .
+                     '3d2c885bf67cbb09239239f5aecafd6f' .
+                     'd2401391154b024b05cd938b40fdc749' .
+                     'ebccb3f48a3156c0bad69cfc5035360d' .
+                     '21ad626dc866cc539f2d0e34b6824fc3',
+            'ct'  => '9c75fa0345b35e2d6cbcc91ed3fc7feb' .
+                     '84fea50c35766db0c847fb627385107b' .
+                     '4f257548d8b80ccd04261fa651fb89cc' .
+                     'e6815ecf0c8c4586ce68544ddce4c3af' .
+                     '01e9587282256569194b1dca788fd987',
+       ),
+       array(
+            'key' => 'fffefdfcfbfaf9f8f7f6f5f4f3f2f1f0' .
+                     '0f0e0d0c0b0a09080706050403020100',
+            'iv'  => '',
+            'aad' => 'c0ef488e684e6fc95e0bd1da59861259',
+            'tag' => 'a24cd6dcc0791bd7719a7f4fcb16de81',
+            'pt'  => 'b1677d933fa706f7ef349f9dd569c028' .
+                     '279a5e2219728e77cfe916d5db979942' .
+                     '5d8fb93b0e26dbc85ed14c050dc9f054' .
+                     'd9153c2be1e9b99ae7a109aba1e5a7f1' .
+                     'f2131786da90fe998d3571c144d066c3',
+            'ct'  => 'ea597a2f9fb0b5c4d5a6f215047b58a3' .
+                     '3d2c885bf67cbb09239239f5aecafd6f' .
+                     'd2401391154b024b05cd938b40fdc749' .
+                     'ebccb3f48a3156c0bad69cfc5035360d' .
+                     '21ad626dc866cc539f2d0e34b6824fc3',
+       ),
+    ),
     'chacha20-poly1305' => array(
         array(
             'key' => '808182838485868788898a8b8c8d8e8f' .
diff --git a/ext/openssl/tests/gh21031.phpt b/ext/openssl/tests/gh21031.phpt
new file mode 100644
index 000000000000..25bdb385a791
--- /dev/null
+++ b/ext/openssl/tests/gh21031.phpt
@@ -0,0 +1,55 @@
+--TEST--
+GH-21031 (Fix NULL deref when enabling TLS fails and the peer name needs to be reset)
+--EXTENSIONS--
+openssl
+--SKIPIF--
+
+--FILE--
+ [
+        'SNI_server_certs' => [
+            "cs.php.net" => __DIR__ . "/sni_server_cs_expired.pem",
+        ]
+    ]]);
+
+    $server = stream_socket_server('tls://127.0.0.1:0', $errno, $errstr, $serverFlags, $ctx);
+    phpt_notify_server_start($server);
+
+    $conn = stream_socket_accept($server, 10);
+    if ($conn) {
+        fclose($conn);
+    }
+
+    phpt_wait();
+CODE;
+
+$clientCode = <<<'CODE'
+    $clientCtx = stream_context_create([
+        'ssl' => [
+            'cafile' => __DIR__ . '/sni_server_ca.pem',
+            'verify_peer' => true,
+            'verify_peer_name' => true,
+        ],
+        "http" => [
+            "proxy" => "tcp://{{ ADDR }}"
+        ],
+    ]);
+
+    var_dump(@file_get_contents("https://cs.php.net/", false, $clientCtx));
+
+    phpt_notify();
+CODE;
+
+include 'ServerClientTestCase.inc';
+ServerClientTestCase::getInstance()->run($clientCode, $serverCode);
+?>
+--EXPECT--
+bool(false)
diff --git a/ext/openssl/tests/gh22081.phpt b/ext/openssl/tests/gh22081.phpt
new file mode 100644
index 000000000000..17f74be7584c
--- /dev/null
+++ b/ext/openssl/tests/gh22081.phpt
@@ -0,0 +1,76 @@
+--TEST--
+GH-22081: server reneg limit not reallocated across non-blocking retries
+--EXTENSIONS--
+openssl
+--SKIPIF--
+
+--FILE--
+ [
+        'local_cert' => '%s',
+    ]]);
+
+    /* Plain TCP listener so the TLS handshake is driven manually below. */
+    $server = stream_socket_server('tcp://127.0.0.1:0', $errno, $errstr, $flags, $ctx);
+    phpt_notify_server_start($server);
+
+    /* Complete each handshake in non-blocking mode so that php_openssl_enable_crypto() is
+     * re-entered across multiple WANT_READ/WANT_WRITE rounds per connection. */
+    for ($i = 0; $i < 5; $i++) {
+        $conn = @stream_socket_accept($server, 30);
+        if (!$conn) {
+            continue;
+        }
+        stream_set_blocking($conn, false);
+        do {
+            $r = stream_socket_enable_crypto($conn, true, STREAM_CRYPTO_METHOD_TLS_SERVER);
+        } while ($r === 0);
+
+        if ($r === true) {
+            fwrite($conn, "ok $i\n");
+        }
+        fclose($conn);
+    }
+CODE;
+$serverCode = sprintf($serverCode, $certFile);
+
+$clientCode = <<<'CODE'
+    $flags = STREAM_CLIENT_CONNECT;
+    $ctx = stream_context_create(['ssl' => [
+        'verify_peer' => false,
+        'verify_peer_name' => false,
+    ]]);
+
+    for ($i = 0; $i < 5; $i++) {
+        $client = stream_socket_client("tls://{{ ADDR }}", $errno, $errstr, 30, $flags, $ctx);
+        if ($client) {
+            echo trim(fgets($client)) . "\n";
+            fclose($client);
+        }
+    }
+CODE;
+
+include 'CertificateGenerator.inc';
+$certificateGenerator = new CertificateGenerator();
+$certificateGenerator->saveNewCertAsFileWithKey('gh22081-server-reneg-nonblocking', $certFile);
+
+include 'ServerClientTestCase.inc';
+ServerClientTestCase::getInstance()->run($clientCode, $serverCode);
+?>
+--CLEAN--
+
+--EXPECT--
+ok 0
+ok 1
+ok 2
+ok 3
+ok 4
+
diff --git a/ext/openssl/tests/gh22186.phpt b/ext/openssl/tests/gh22186.phpt
new file mode 100644
index 000000000000..8f28e6c45b58
--- /dev/null
+++ b/ext/openssl/tests/gh22186.phpt
@@ -0,0 +1,32 @@
+--TEST--
+GH-22186 (Heap buffer overflow in openssl_encrypt with AES-WRAP-PAD)
+--EXTENSIONS--
+openssl
+--SKIPIF--
+
+--FILE--
+
+--EXPECT--
+done
diff --git a/ext/openssl/tests/gh9310.phpt b/ext/openssl/tests/gh9310.phpt
index 07a7d442cec8..874ed4c781d3 100644
--- a/ext/openssl/tests/gh9310.phpt
+++ b/ext/openssl/tests/gh9310.phpt
@@ -23,7 +23,21 @@ $certificateGenerator->saveNewCertAndKey('gh9310', $certFile, $pkFile);
 
 copy($certFile, $baseDirCertFile);
 copy($pkFile, $baseDirPkFile);
-copy(__DIR__ . '/sni_server_uk_cert.pem', $baseDir . '/sni_server_uk_cert.pem');
+
+$sniCaFile = __DIR__ . '/gh9310_sni_ca.pem.tmp';
+$sniCsFile = __DIR__ . '/gh9310_sni_cs.pem.tmp';
+$sniUkCertFile = __DIR__ . '/gh9310_sni_uk_cert.pem.tmp';
+$sniUkKeyFile = __DIR__ . '/gh9310_sni_uk_key.pem.tmp';
+$sniUsCertFile = __DIR__ . '/gh9310_sni_us_cert.pem.tmp';
+$sniUsKeyFile = __DIR__ . '/gh9310_sni_us_key.pem.tmp';
+$baseDirSniUkCertFile = $baseDir . '/sni_uk_cert.pem';
+
+$certificateGenerator->saveCaCert($sniCaFile);
+$certificateGenerator->saveNewCertAsFileWithKey('cs.php.net', $sniCsFile);
+$certificateGenerator->saveNewCertAndKey('uk.php.net', $sniUkCertFile, $sniUkKeyFile);
+$certificateGenerator->saveNewCertAndKey('us.php.net', $sniUsCertFile, $sniUsKeyFile);
+
+copy($sniUkCertFile, $baseDirSniUkCertFile);
 
 
 $serverCodeTemplate = <<<'CODE'
@@ -60,7 +74,7 @@ $sniServerCodeV1 = <<<'CODE'
     $flags = STREAM_SERVER_BIND|STREAM_SERVER_LISTEN;
     $ctx = stream_context_create(['ssl' => [
         'SNI_server_certs' => [
-            "cs.php.net" => __DIR__ . "/sni_server_cs.pem",
+            "cs.php.net" => '%s',
         ]
     ]]);
 
@@ -69,6 +83,7 @@ $sniServerCodeV1 = <<<'CODE'
 
     stream_socket_accept($server);
 CODE;
+$sniServerCodeV1 = sprintf($sniServerCodeV1, $sniCsFile);
 
 $sniServerCodeV2 = <<<'CODE'
     ini_set('log_errors', 'On');
@@ -77,8 +92,8 @@ $sniServerCodeV2 = <<<'CODE'
     $ctx = stream_context_create(['ssl' => [
         'SNI_server_certs' => [
             "uk.php.net" => [
-                'local_cert' => __DIR__ . '/gh9310/sni_server_uk_cert.pem',
-                'local_pk' => __DIR__ . '/sni_server_uk_key.pem',
+                'local_cert' => '%s',
+                'local_pk' => '%s',
             ]
         ]
     ]]);
@@ -88,6 +103,7 @@ $sniServerCodeV2 = <<<'CODE'
 
     stream_socket_accept($server);
 CODE;
+$sniServerCodeV2 = sprintf($sniServerCodeV2, $baseDirSniUkCertFile, $sniUkKeyFile);
 
 $sniServerCodeV3 = <<<'CODE'
     ini_set('log_errors', 'On');
@@ -96,8 +112,8 @@ $sniServerCodeV3 = <<<'CODE'
     $ctx = stream_context_create(['ssl' => [
         'SNI_server_certs' => [
             "us.php.net" => [
-                'local_cert' => __DIR__ . '/sni_server_us_cert.pem',
-                'local_pk' => __DIR__ . '/sni_server_us_key.pem',
+                'local_cert' => '%s',
+                'local_pk' => '%s',
             ]
         ]
     ]]);
@@ -107,14 +123,15 @@ $sniServerCodeV3 = <<<'CODE'
 
     stream_socket_accept($server);
 CODE;
+$sniServerCodeV3 = sprintf($sniServerCodeV3, $sniUsCertFile, $sniUsKeyFile);
 
 $sniClientCodeTemplate = <<<'CODE'
     $flags = STREAM_CLIENT_CONNECT;
     $ctxArr = [
-        'cafile' => __DIR__ . '/sni_server_ca.pem',
+        'cafile' => '%s',
+        'peer_name' => '%s',
     ];
 
-    $ctxArr['peer_name'] = '%s';
     $ctx = stream_context_create(['ssl' => $ctxArr]);
     @stream_socket_client("tls://{{ ADDR }}", $errno, $errstr, 1, $flags, $ctx);
 CODE;
@@ -131,13 +148,13 @@ ServerClientTestCase::getInstance()->run($clientCode, $serverCode);
 $serverCode = sprintf($serverCodeTemplate, $baseDirCertFile, $pkFile);
 ServerClientTestCase::getInstance()->run($clientCode, $serverCode);
 
-$sniClientCode = sprintf($sniClientCodeTemplate, 'cs.php.net');
+$sniClientCode = sprintf($sniClientCodeTemplate, $sniCaFile, 'cs.php.net');
 ServerClientTestCase::getInstance()->run($sniClientCode, $sniServerCodeV1);
 
-$sniClientCode = sprintf($sniClientCodeTemplate, 'uk.php.net');
+$sniClientCode = sprintf($sniClientCodeTemplate, $sniCaFile, 'uk.php.net');
 ServerClientTestCase::getInstance()->run($sniClientCode, $sniServerCodeV2);
 
-$sniClientCode = sprintf($sniClientCodeTemplate, 'us.php.net');
+$sniClientCode = sprintf($sniClientCodeTemplate, $sniCaFile, 'us.php.net');
 ServerClientTestCase::getInstance()->run($sniClientCode, $sniServerCodeV3);
 
 ?>
@@ -149,7 +166,13 @@ $baseDir = __DIR__ . '/gh9310';
 @unlink(__DIR__ . '/gh9310.key');
 @unlink($baseDir . '/cert.crt');
 @unlink($baseDir . '/private.key');
-@unlink($baseDir . '/sni_server_uk_cert.pem');
+@unlink($baseDir . '/sni_uk_cert.pem');
+@unlink(__DIR__ . '/gh9310_sni_ca.pem.tmp');
+@unlink(__DIR__ . '/gh9310_sni_cs.pem.tmp');
+@unlink(__DIR__ . '/gh9310_sni_uk_cert.pem.tmp');
+@unlink(__DIR__ . '/gh9310_sni_uk_key.pem.tmp');
+@unlink(__DIR__ . '/gh9310_sni_us_cert.pem.tmp');
+@unlink(__DIR__ . '/gh9310_sni_us_key.pem.tmp');
 @rmdir($baseDir);
 ?>
 --EXPECTF--
@@ -169,15 +192,15 @@ PHP Warning:  stream_socket_accept(): open_basedir restriction in effect. File(%
 PHP Warning:  stream_socket_accept(): Unable to get real path of private key file `%sgh9310.key' in %s
 PHP Warning:  stream_socket_accept(): Failed to enable crypto in %s
 PHP Warning:  stream_socket_accept(): Accept failed: %s
-PHP Warning:  stream_socket_accept(): open_basedir restriction in effect. File(%ssni_server_cs.pem) is not within the allowed path(s): (%sgh9310) in %s
-PHP Warning:  stream_socket_accept(): Failed setting local cert chain file `%ssni_server_cs.pem'; file not found in %s
+PHP Warning:  stream_socket_accept(): open_basedir restriction in effect. File(%sgh9310_sni_cs.pem.tmp) is not within the allowed path(s): (%sgh9310) in %s
+PHP Warning:  stream_socket_accept(): Failed setting local cert chain file `%sgh9310_sni_cs.pem.tmp'; file not found in %s
 PHP Warning:  stream_socket_accept(): Failed to enable crypto in %s
 PHP Warning:  stream_socket_accept(): Accept failed: %s
-PHP Warning:  stream_socket_accept(): open_basedir restriction in effect. File(%ssni_server_uk_key.pem) is not within the allowed path(s): (%sgh9310) in %s
-PHP Warning:  stream_socket_accept(): Failed setting local private key file `%ssni_server_uk_key.pem';  could not open file in %s
+PHP Warning:  stream_socket_accept(): open_basedir restriction in effect. File(%sgh9310_sni_uk_key.pem.tmp) is not within the allowed path(s): (%sgh9310) in %s
+PHP Warning:  stream_socket_accept(): Failed setting local private key file `%sgh9310_sni_uk_key.pem.tmp';  could not open file in %s
 PHP Warning:  stream_socket_accept(): Failed to enable crypto in %s
 PHP Warning:  stream_socket_accept(): Accept failed: %s
-PHP Warning:  stream_socket_accept(): open_basedir restriction in effect. File(%ssni_server_us_cert.pem) is not within the allowed path(s): (%sgh9310) in %s
-PHP Warning:  stream_socket_accept(): Failed setting local cert chain file `%ssni_server_us_cert.pem'; could not open file in %s
+PHP Warning:  stream_socket_accept(): open_basedir restriction in effect. File(%sgh9310_sni_us_cert.pem.tmp) is not within the allowed path(s): (%sgh9310) in %s
+PHP Warning:  stream_socket_accept(): Failed setting local cert chain file `%sgh9310_sni_us_cert.pem.tmp'; could not open file in %s
 PHP Warning:  stream_socket_accept(): Failed to enable crypto in %s
 PHP Warning:  stream_socket_accept(): Accept failed: %s
diff --git a/ext/openssl/tests/openssl_decrypt_siv.phpt b/ext/openssl/tests/openssl_decrypt_siv.phpt
new file mode 100644
index 000000000000..6fc299546e20
--- /dev/null
+++ b/ext/openssl/tests/openssl_decrypt_siv.phpt
@@ -0,0 +1,43 @@
+--TEST--
+openssl_decrypt() with SIV cipher algorithm tests
+--EXTENSIONS--
+openssl
+--SKIPIF--
+
+--FILE--
+ $test) {
+    echo "TEST $idx\n";
+    $pt = openssl_decrypt($test['ct'], $method, $test['key'], OPENSSL_RAW_DATA,
+        $test['iv'], $test['tag'], $test['aad']);
+    var_dump($test['pt'] === $pt);
+}
+
+// failed because no AAD
+echo "TEST AAD\n";
+var_dump(openssl_decrypt($test['ct'], $method, $test['key'], OPENSSL_RAW_DATA,
+    $test['iv'], $test['tag']));
+// failed because wrong tag
+echo "TEST WRONGTAG\n";
+var_dump(openssl_decrypt($test['ct'], $method, $test['key'], OPENSSL_RAW_DATA,
+    $test['iv'], str_repeat('x', 16), $test['aad']));
+
+?>
+--EXPECTF--
+TEST 0
+bool(true)
+TEST 1
+bool(true)
+TEST 2
+bool(true)
+TEST AAD
+bool(false)
+TEST WRONGTAG
+bool(false)
diff --git a/ext/openssl/tests/openssl_encrypt_siv.phpt b/ext/openssl/tests/openssl_encrypt_siv.phpt
new file mode 100644
index 000000000000..43a5c5b34b5a
--- /dev/null
+++ b/ext/openssl/tests/openssl_encrypt_siv.phpt
@@ -0,0 +1,51 @@
+--TEST--
+openssl_encrypt() with SIV cipher algorithm tests
+--EXTENSIONS--
+openssl
+--SKIPIF--
+
+--FILE--
+ $test) {
+    echo "TEST $idx\n";
+    $ct = openssl_encrypt($test['pt'], $method, $test['key'], OPENSSL_RAW_DATA,
+        $test['iv'], $tag, $test['aad'], strlen($test['tag']));
+    var_dump($test['ct'] === $ct);
+    var_dump($test['tag'] === $tag);
+}
+
+// Empty tag should not be equivalent to null tag
+echo "TEST AAD\n";
+var_dump(openssl_encrypt('data', $method, 'password', 0, '', $tag, '') !== openssl_encrypt('data', $method, 'password', 0, '', $tag, null));
+
+// Failing to retrieve tag (max is 16 bytes)
+var_dump(openssl_encrypt('data', $method, 'password', 0, str_repeat('x', 32), $tag, '', 20));
+
+// Failing when no tag supplied
+var_dump(openssl_encrypt('data', $method, 'password', 0, str_repeat('x', 32)));
+?>
+--EXPECTF--
+TEST 0
+bool(true)
+bool(true)
+TEST 1
+bool(true)
+bool(true)
+TEST 2
+bool(true)
+bool(true)
+TEST AAD
+bool(true)
+
+Warning: openssl_encrypt(): Retrieving verification tag failed in %s on line %d
+bool(false)
+
+Warning: openssl_encrypt(): A tag should be provided when using AEAD mode in %s on line %d
+bool(false)
diff --git a/ext/openssl/tests/openssl_password.phpt b/ext/openssl/tests/openssl_password.phpt
index 0dbc1ae42a3f..ca0d20f9bcc3 100644
--- a/ext/openssl/tests/openssl_password.phpt
+++ b/ext/openssl/tests/openssl_password.phpt
@@ -5,7 +5,10 @@ openssl
 --SKIPIF--
 
 --FILE--
diff --git a/ext/openssl/tests/openssl_pbkdf2_basic.phpt b/ext/openssl/tests/openssl_pbkdf2_basic.phpt
index fd253ac78bb2..ba79f9415ba8 100644
--- a/ext/openssl/tests/openssl_pbkdf2_basic.phpt
+++ b/ext/openssl/tests/openssl_pbkdf2_basic.phpt
@@ -19,6 +19,8 @@ var_dump(bin2hex(openssl_pbkdf2('password', 'salt', 20, 16777216)));
 var_dump(bin2hex(openssl_pbkdf2('passwordPASSWORDpassword', 'saltSALTsaltSALTsaltSALTsaltSALTsalt', 25, 4096)));
 var_dump(bin2hex(openssl_pbkdf2("pass\0word", "sa\0lt", 16, 4096)));
 
+var_dump(bin2hex(openssl_pbkdf2("password", "salt", 16, 4096, "sha-256")));
+
 ?>
 --EXPECT--
 string(40) "0c60c80f961f0e71f3a9b524af6012062fe037a6"
@@ -26,3 +28,4 @@ string(40) "ea6c014dc72d6f8ccd1ed92ace1d41f0d8de8957"
 string(40) "4b007901b765489abead49d926f721d065a429c1"
 string(50) "3d2eec4fe41c849b80c8d83662c0e44a8b291a964cf2f07038"
 string(32) "56fa6aa75548099dcc37d7f03425e0c3"
+string(32) "c5e478d59288c841aa530db6845c4c8d"
diff --git a/ext/openssl/tests/openssl_x509_checkpurpose_basic.phpt b/ext/openssl/tests/openssl_x509_checkpurpose_basic.phpt
index 7c06881c9be7..99c1150b0e85 100644
--- a/ext/openssl/tests/openssl_x509_checkpurpose_basic.phpt
+++ b/ext/openssl/tests/openssl_x509_checkpurpose_basic.phpt
@@ -14,7 +14,7 @@ $cert = "file://" . __DIR__ . "/cert.crt";
 $bert = "file://" . __DIR__ . "/bug41033.pem";
 $sert = "file://" . __DIR__ . "/san-cert.pem";
 $cpca = __DIR__ . "/san-cert.pem";
-$utfl = __DIR__ . "/sni_server_uk.pem";
+$utfl = __DIR__ . "/sni_server.pem";
 $rcrt = openssl_x509_read($cert);
 
 /*  int openssl_x509_checkpurpose ( mixed $x509cert , int $purpose);   */
diff --git a/ext/openssl/tests/openssl_x509_export_to_file_leak.phpt b/ext/openssl/tests/openssl_x509_export_to_file_leak.phpt
index 5775c2597c3e..59a942d6a67e 100644
--- a/ext/openssl/tests/openssl_x509_export_to_file_leak.phpt
+++ b/ext/openssl/tests/openssl_x509_export_to_file_leak.phpt
@@ -5,7 +5,7 @@ openssl
 --FILE--
 
diff --git a/ext/openssl/tests/session_resumption_cache_disabled.phpt b/ext/openssl/tests/session_resumption_cache_disabled.phpt
new file mode 100644
index 000000000000..9e0e8a82f399
--- /dev/null
+++ b/ext/openssl/tests/session_resumption_cache_disabled.phpt
@@ -0,0 +1,86 @@
+--TEST--
+TLS session resumption - server with cache disabled
+--EXTENSIONS--
+openssl
+--SKIPIF--
+
+--FILE--
+ [
+        'local_cert' => '%s',
+        'session_cache' => false,  /* Disable session caching */
+    ]]);
+
+    $server = stream_socket_server('tls://127.0.0.1:0', $errno, $errstr, $flags, $ctx);
+    phpt_notify_server_start($server);
+
+    /* Accept two connections */
+    for ($i = 0; $i < 2; $i++) {
+        $client = @stream_socket_accept($server, 30);
+        if ($client) {
+            fwrite($client, "No cache connection " . ($i + 1) . "\n");
+            fclose($client);
+        }
+    }
+CODE;
+$serverCode = sprintf($serverCode, $certFile);
+
+$clientCode = <<<'CODE'
+    $globalSession = null;
+
+    $flags = STREAM_CLIENT_CONNECT;
+    $ctx = stream_context_create(['ssl' => [
+        'verify_peer' => false,
+        'verify_peer_name' => false,
+        'session_new_cb' => function($stream, $session) use (&$globalSession) {
+            $globalSession = $session;
+        }
+    ]]);
+
+    /* First connection */
+    $client1 = stream_socket_client("tls://{{ ADDR }}", $errno, $errstr, 30, $flags, $ctx);
+    if ($client1) {
+        echo trim(fgets($client1)) . "\n";
+        $meta1 = stream_get_meta_data($client1);
+        echo "First connection resumed: " . ($meta1['crypto']['session_reused'] ? "yes" : "no") . "\n";
+        fclose($client1);
+    }
+
+    /* Second connection - server won't use cached session */
+    $ctx2 = stream_context_create(['ssl' => [
+        'verify_peer' => false,
+        'verify_peer_name' => false,
+        'session_data' => $globalSession,
+    ]]);
+
+    $client2 = stream_socket_client("tls://{{ ADDR }}", $errno, $errstr, 30, $flags, $ctx2);
+    if ($client2) {
+        echo trim(fgets($client2)) . "\n";
+        $meta2 = stream_get_meta_data($client2);
+        echo "Second connection resumed: " . ($meta2['crypto']['session_reused'] ? "yes" : "no") . "\n";
+        fclose($client2);
+    }
+CODE;
+
+include 'CertificateGenerator.inc';
+$certificateGenerator = new CertificateGenerator();
+$certificateGenerator->saveNewCertAsFileWithKey('session_disabled_test', $certFile);
+
+include 'ServerClientTestCase.inc';
+ServerClientTestCase::getInstance()->run($clientCode, $serverCode);
+?>
+--CLEAN--
+
+--EXPECT--
+No cache connection 1
+First connection resumed: no
+No cache connection 2
+Second connection resumed: no
diff --git a/ext/openssl/tests/session_resumption_client_basic.phpt b/ext/openssl/tests/session_resumption_client_basic.phpt
new file mode 100644
index 000000000000..ee1d126a6d9f
--- /dev/null
+++ b/ext/openssl/tests/session_resumption_client_basic.phpt
@@ -0,0 +1,89 @@
+--TEST--
+TLS session resumption - client basic resumption
+--EXTENSIONS--
+openssl
+--SKIPIF--
+
+--FILE--
+ [
+        'local_cert' => '%s',
+        'session_cache' => true,
+        'session_id_context' => 'test-basic',
+    ]]);
+
+    $server = stream_socket_server('tls://127.0.0.1:0', $errno, $errstr, $flags, $ctx);
+    phpt_notify_server_start($server);
+
+    /* Accept two connections */
+    for ($i = 0; $i < 2; $i++) {
+        $client = @stream_socket_accept($server, 30);
+        if ($client) {
+            fwrite($client, "Hello from server\n");
+            fclose($client);
+        }
+    }
+CODE;
+$serverCode = sprintf($serverCode, $certFile);
+
+$clientCode = <<<'CODE'
+    $sessionData = '';
+
+    $flags = STREAM_CLIENT_CONNECT;
+    $ctx = stream_context_create(['ssl' => [
+        'verify_peer' => false,
+        'verify_peer_name' => false,
+        'session_new_cb' => function($stream, $session) use (&$sessionData) {
+            $sessionData = $session;
+        }
+    ]]);
+
+    /* First connection - full handshake */
+    $client1 = stream_socket_client("tls://{{ ADDR }}", $errno, $errstr, 30, $flags, $ctx);
+    if ($client1) {
+        echo trim(fgets($client1)) . "\n";
+        $meta1 = stream_get_meta_data($client1);
+        echo "First connection resumed: " . ($meta1['crypto']['session_reused'] ? "yes" : "no") . "\n";
+        echo "Session data received: " . (!empty($sessionData) ? "yes" : "no") . "\n";
+        fclose($client1);
+    }
+
+    /* Second connection - resumed session */
+    $ctx2 = stream_context_create(['ssl' => [
+        'verify_peer' => false,
+        'verify_peer_name' => false,
+        'session_data' => $sessionData,
+    ]]);
+
+    $client2 = stream_socket_client("tls://{{ ADDR }}", $errno, $errstr, 30, $flags, $ctx2);
+    if ($client2) {
+        echo trim(fgets($client2)) . "\n";
+        $meta2 = stream_get_meta_data($client2);
+        echo "Second connection resumed: " . ($meta2['crypto']['session_reused'] ? "yes" : "no") . "\n";
+        fclose($client2);
+    }
+CODE;
+
+include 'CertificateGenerator.inc';
+$certificateGenerator = new CertificateGenerator();
+$certificateGenerator->saveNewCertAsFileWithKey('session_resumption_test', $certFile);
+
+include 'ServerClientTestCase.inc';
+ServerClientTestCase::getInstance()->run($clientCode, $serverCode);
+?>
+--CLEAN--
+
+--EXPECT--
+Hello from server
+First connection resumed: no
+Session data received: yes
+Hello from server
+Second connection resumed: yes
diff --git a/ext/openssl/tests/session_resumption_get_cb_no_ticket.phpt b/ext/openssl/tests/session_resumption_get_cb_no_ticket.phpt
new file mode 100644
index 000000000000..f87f831a7859
--- /dev/null
+++ b/ext/openssl/tests/session_resumption_get_cb_no_ticket.phpt
@@ -0,0 +1,79 @@
+--TEST--
+TLS session resumption - warning when trying to enable tickets with session_get_cb
+--EXTENSIONS--
+openssl
+--SKIPIF--
+
+--FILE--
+ [
+        'local_cert' => '%s',
+        'session_id_context' => 'test-app',
+        'no_ticket' => false,  // Explicitly trying to enable tickets
+        'session_new_cb' => function($stream, $sessionData) {
+            // Store session
+        },
+        'session_get_cb' => function($stream, $sessionId) {
+            return null;
+        }
+    ]]);
+
+    try {
+        $server = @stream_socket_server('tls://127.0.0.1:0', $errno, $errstr, $flags, $ctx);
+        phpt_notify_server_start($server);
+
+        $client = @stream_socket_accept($server, 30);
+        if ($client === false) {
+            phpt_notify(message: "SERVER_FAILED_UNEXPECTEDLY");
+        } else {
+            phpt_notify(message: "SERVER_CREATED_UNEXPECTEDLY");
+            fclose($server);
+        }
+    } catch (\Throwable $e) {
+        phpt_notify(message: "SERVER_EXCEPTION: " . $e->getMessage());
+    }
+CODE;
+$serverCode = sprintf($serverCode, $certFile);
+
+$clientCode = <<<'CODE'
+    $flags = STREAM_CLIENT_CONNECT;
+
+    /* Try to use corrupted session data */
+    $ctx = stream_context_create(['ssl' => [
+        'verify_peer' => false,
+        'verify_peer_name' => false,
+        'session_data' => 'this_is_invalid_session_data',
+    ]]);
+
+    $client = @stream_socket_client("tls://{{ ADDR }}", $errno, $errstr, 30, $flags, $ctx);
+
+    if ($client === false) {
+        echo "Connection failed as expected\n";
+    }
+
+    $result = phpt_wait();
+    echo trim($result) . "\n";
+CODE;
+
+include 'CertificateGenerator.inc';
+$certificateGenerator = new CertificateGenerator();
+$certificateGenerator->saveNewCertAsFileWithKey('session_no_ticket_test', $certFile);
+
+include 'ServerClientTestCase.inc';
+ServerClientTestCase::getInstance()->run($clientCode, $serverCode);
+?>
+--CLEAN--
+
+--EXPECT--
+SERVER_EXCEPTION: Session tickets cannot be enabled when session_get_cb is setConnection failed as expected
+
diff --git a/ext/openssl/tests/session_resumption_get_cb_num_tickets_positive.phpt b/ext/openssl/tests/session_resumption_get_cb_num_tickets_positive.phpt
new file mode 100644
index 000000000000..5563b0c22cf8
--- /dev/null
+++ b/ext/openssl/tests/session_resumption_get_cb_num_tickets_positive.phpt
@@ -0,0 +1,82 @@
+--TEST--
+TLS session resumption - num_tickets controls ticket generation (TLS 1.3)
+--EXTENSIONS--
+openssl
+--SKIPIF--
+
+--FILE--
+ [
+        'local_cert' => '%s',
+        'crypto_method' => STREAM_CRYPTO_METHOD_TLSv1_3_SERVER,
+        'num_tickets' => 3,  // Issue 3 tickets per connection
+    ]]);
+
+    $server = stream_socket_server('tlsv1.3://127.0.0.1:0', $errno, $errstr, $flags, $ctx);
+    phpt_notify_server_start($server);
+
+    // Accept one connection
+    $client = @stream_socket_accept($server, 30);
+    if ($client) {
+        fwrite($client, "Ticket test\n");
+        // Keep connection open briefly to allow tickets to be sent
+        usleep(100000); // 100ms
+        fclose($client);
+    }
+    
+    phpt_notify(message: "SERVER_DONE");
+CODE;
+$serverCode = sprintf($serverCode, $certFile);
+
+$clientCode = <<<'CODE'
+    $ticketCount = 0;
+
+    $flags = STREAM_CLIENT_CONNECT;
+    $ctx = stream_context_create(['ssl' => [
+        'verify_peer' => false,
+        'verify_peer_name' => false,
+        'crypto_method' => STREAM_CRYPTO_METHOD_TLSv1_3_CLIENT,
+        'session_new_cb' => function($stream, $session) use (&$ticketCount) {
+            $ticketCount++;
+        }
+    ]]);
+
+    $client = stream_socket_client("tls://{{ ADDR }}", $errno, $errstr, 30, $flags, $ctx);
+    if ($client) {
+        $response = fgets($client);
+        echo trim($response) . "\n";
+        
+        // Keep connection open briefly to receive all tickets
+        usleep(150000); // 150ms
+        fclose($client);
+    }
+
+    echo "Tickets received: $ticketCount\n";
+    
+    $result = phpt_wait();
+    echo trim($result) . "\n";
+CODE;
+
+include 'CertificateGenerator.inc';
+$certificateGenerator = new CertificateGenerator();
+$certificateGenerator->saveNewCertAsFileWithKey('session_num_tickets_test', $certFile);
+
+include 'ServerClientTestCase.inc';
+ServerClientTestCase::getInstance()->run($clientCode, $serverCode);
+?>
+--CLEAN--
+
+--EXPECTF--
+Ticket test
+Tickets received: 3
+SERVER_DONE
diff --git a/ext/openssl/tests/session_resumption_get_cb_num_tickets_zero.phpt b/ext/openssl/tests/session_resumption_get_cb_num_tickets_zero.phpt
new file mode 100644
index 000000000000..13654cd451e9
--- /dev/null
+++ b/ext/openssl/tests/session_resumption_get_cb_num_tickets_zero.phpt
@@ -0,0 +1,112 @@
+--TEST--
+TLS session resumption - num_tickets = 0 disables tickets, forces session IDs
+--EXTENSIONS--
+openssl
+--SKIPIF--
+
+--FILE--
+ [
+        'local_cert' => '%s',
+        'session_id_context' => 'test-no-tickets',
+        'num_tickets' => 0,  // Disable ticket issuance
+        'session_new_cb' => function($stream, $session) use (&$sessionStore, &$newCbCalled) {
+            $key = bin2hex($session->id);
+            $sessionStore[$key] = $session;
+            $newCbCalled++;
+        },
+        'session_get_cb' => function($stream, $sessionId) use (&$sessionStore) {
+            $key = bin2hex($sessionId);
+            return $sessionStore[$key] ?? null;
+        },
+    ]]);
+
+    $server = stream_socket_server('tls://127.0.0.1:0', $errno, $errstr, $flags, $ctx);
+    phpt_notify_server_start($server);
+
+    // Accept two connections
+    for ($i = 0; $i < 2; $i++) {
+        $client = @stream_socket_accept($server, 30);
+        if ($client) {
+            fwrite($client, "Response " . ($i + 1) . "\n");
+            usleep(50000); // Allow session storage
+            fclose($client);
+        }
+    }
+
+    phpt_notify(message: "NEW_CB_CALLS:$newCbCalled");
+CODE;
+$serverCode = sprintf($serverCode, $certFile);
+
+$clientCode = <<<'CODE'
+    $sessionData = null;
+    $clientTickets = 0;
+
+    $flags = STREAM_CLIENT_CONNECT;
+    $ctx = stream_context_create(['ssl' => [
+        'verify_peer' => false,
+        'verify_peer_name' => false,
+        'session_new_cb' => function($stream, $session) use (&$sessionData, &$clientTickets) {
+            $sessionData = $session;
+            $clientTickets++;
+        }
+    ]]);
+
+    // First connection
+    $client1 = stream_socket_client("tls://{{ ADDR }}", $errno, $errstr, 30, $flags, $ctx);
+    if ($client1) {
+        $meta1 = stream_get_meta_data($client1);
+        echo "Client first connection resumed: " . ($meta1['crypto']['session_reused'] ? "yes" : "no") . "\n";
+        echo trim(fgets($client1)) . "\n";
+        usleep(100000); // Wait for session storage
+        fclose($client1);
+    }
+
+    echo "Client received tickets on first connection: $clientTickets\n";
+
+    // Second connection with resumption
+    $ctx2 = stream_context_create(['ssl' => [
+        'verify_peer' => false,
+        'verify_peer_name' => false,
+        'session_data' => $sessionData,
+    ]]);
+
+    $client2 = stream_socket_client("tls://{{ ADDR }}", $errno, $errstr, 30, $flags, $ctx2);
+    if ($client2) {
+        $meta2 = stream_get_meta_data($client2);
+        echo "Client second connection resumed: " . ($meta2['crypto']['session_reused'] ? "yes" : "no") . "\n";
+        echo trim(fgets($client2)) . "\n";
+        fclose($client2);
+    }
+
+    $result = phpt_wait();
+    echo "Server: " . trim($result) . "\n";
+CODE;
+
+include 'CertificateGenerator.inc';
+$certificateGenerator = new CertificateGenerator();
+$certificateGenerator->saveNewCertAsFileWithKey('session_no_tickets_zero_test', $certFile);
+
+include 'ServerClientTestCase.inc';
+ServerClientTestCase::getInstance()->run($clientCode, $serverCode);
+?>
+--CLEAN--
+
+--EXPECT--
+Client first connection resumed: no
+Response 1
+Client received tickets on first connection: 0
+Client second connection resumed: no
+Response 2
+Server: NEW_CB_CALLS:0
diff --git a/ext/openssl/tests/session_resumption_import_export_session.phpt b/ext/openssl/tests/session_resumption_import_export_session.phpt
new file mode 100644
index 000000000000..0d9a3274b113
--- /dev/null
+++ b/ext/openssl/tests/session_resumption_import_export_session.phpt
@@ -0,0 +1,98 @@
+--TEST--
+TLS session resumption - import and export session
+--EXTENSIONS--
+openssl
+--SKIPIF--
+
+--FILE--
+ [
+        'local_cert' => '%s',
+        'session_cache' => true,
+        'session_id_context' => 'test-basic',
+    ]]);
+
+    $server = stream_socket_server('tls://127.0.0.1:0', $errno, $errstr, $flags, $ctx);
+    phpt_notify_server_start($server);
+
+    /* Accept single connections */
+    $client = @stream_socket_accept($server, 30);
+    if ($client) {
+        fwrite($client, "Hello from server\n");
+        fclose($client);
+    }
+CODE;
+$serverCode = sprintf($serverCode, $certFile);
+
+$clientCode = <<<'CODE'
+    $sessionData = '';
+
+    $flags = STREAM_CLIENT_CONNECT;
+    $ctx = stream_context_create(['ssl' => [
+        'verify_peer' => false,
+        'verify_peer_name' => false,
+        'session_new_cb' => function($stream, $session) use (&$sessionData) {
+            if (empty($sessionData)) {
+                // default should be pem
+                $pemSessionData = $session->export();
+                var_dump($pemSessionData);
+                $session = Openssl\Session::import($pemSessionData);
+                $pemSessionData = $session->export(OPENSSL_ENCODING_PEM);
+                var_dump($pemSessionData);
+                $session = Openssl\Session::import($pemSessionData, OPENSSL_ENCODING_PEM);
+                $derSessionData = $session->export(OPENSSL_ENCODING_DER);
+                var_dump(strlen($derSessionData) > 0);
+                var_dump(strpos($derSessionData, 'BEGIN SSL SESSION PARAMETERS') === false);
+                $session = Openssl\Session::import($derSessionData, OPENSSL_ENCODING_DER);
+                var_dump($session);
+            }
+            $sessionData = $session;
+        }
+    ]]);
+
+    /* First connection - full handshake */
+    $client1 = stream_socket_client("tls://{{ ADDR }}", $errno, $errstr, 30, $flags, $ctx);
+    if ($client1) {
+        echo trim(fgets($client1)) . "\n";
+        $meta1 = stream_get_meta_data($client1);
+        echo "First connection resumed: " . ($meta1['crypto']['session_reused'] ? "yes" : "no") . "\n";
+        echo "Session data received: " . (!empty($sessionData) ? "yes" : "no") . "\n";
+        fclose($client1);
+    }
+CODE;
+
+include 'CertificateGenerator.inc';
+$certificateGenerator = new CertificateGenerator();
+$certificateGenerator->saveNewCertAsFileWithKey('session_resumption_test', $certFile);
+
+include 'ServerClientTestCase.inc';
+ServerClientTestCase::getInstance()->run($clientCode, $serverCode);
+?>
+--CLEAN--
+
+--EXPECTF--
+string(%d) "-----BEGIN SSL SESSION PARAMETERS-----
+%a
+-----END SSL SESSION PARAMETERS-----
+"
+string(%d) "-----BEGIN SSL SESSION PARAMETERS-----
+%a
+-----END SSL SESSION PARAMETERS-----
+"
+bool(true)
+bool(true)
+object(Openssl\Session)#%d (1) {
+  ["id"]=>
+  string(32) "%a"
+}
+Hello from server
+First connection resumed: no
+Session data received: yes
diff --git a/ext/openssl/tests/session_resumption_invalid_callback.phpt b/ext/openssl/tests/session_resumption_invalid_callback.phpt
new file mode 100644
index 000000000000..b6cfc90a0554
--- /dev/null
+++ b/ext/openssl/tests/session_resumption_invalid_callback.phpt
@@ -0,0 +1,60 @@
+--TEST--
+TLS session resumption - invalid callback throws TypeError
+--EXTENSIONS--
+openssl
+--SKIPIF--
+
+--FILE--
+ [
+        'local_cert' => '%s',
+    ]]);
+
+    $server = stream_socket_server('tls://127.0.0.1:0', $errno, $errstr, $flags, $ctx);
+    phpt_notify_server_start($server);
+
+    $client = @stream_socket_accept($server, 30);
+    if ($client) {
+        fclose($client);
+    }
+CODE;
+$serverCode = sprintf($serverCode, $certFile);
+
+$clientCode = <<<'CODE'
+    $flags = STREAM_CLIENT_CONNECT;
+
+    /* Try to use invalid callback */
+    $ctx = stream_context_create(['ssl' => [
+        'verify_peer' => false,
+        'verify_peer_name' => false,
+        'session_new_cb' => 'not_a_valid_function',
+    ]]);
+
+    try {
+        $client = @stream_socket_client("tls://{{ ADDR }}", $errno, $errstr, 30, $flags, $ctx);
+        echo "Should not reach here\n";
+    } catch (TypeError $e) {
+        echo "TypeError caught: " . (strpos($e->getMessage(), 'session_new_cb must be a valid callback') !== false ? "YES" : "NO");
+        echo "\n";
+    }
+CODE;
+
+include 'CertificateGenerator.inc';
+$certificateGenerator = new CertificateGenerator();
+$certificateGenerator->saveNewCertAsFileWithKey('session_invalid_cb_test', $certFile);
+
+include 'ServerClientTestCase.inc';
+ServerClientTestCase::getInstance()->run($clientCode, $serverCode);
+?>
+--CLEAN--
+
+--EXPECTF--
+TypeError caught: YES
diff --git a/ext/openssl/tests/session_resumption_invalid_data.phpt b/ext/openssl/tests/session_resumption_invalid_data.phpt
new file mode 100644
index 000000000000..7e50b9235a2b
--- /dev/null
+++ b/ext/openssl/tests/session_resumption_invalid_data.phpt
@@ -0,0 +1,66 @@
+--TEST--
+TLS session resumption - invalid session data is fatal
+--EXTENSIONS--
+openssl
+--SKIPIF--
+
+--FILE--
+ [
+        'local_cert' => '%s',
+    ]]);
+
+    $server = stream_socket_server('tls://127.0.0.1:0', $errno, $errstr, $flags, $ctx);
+    phpt_notify_server_start($server);
+
+    $client = @stream_socket_accept($server, 30);
+    if ($client) {
+        fclose($client);
+    }
+CODE;
+$serverCode = sprintf($serverCode, $certFile);
+
+$clientCode = <<<'CODE'
+    $flags = STREAM_CLIENT_CONNECT;
+
+    /* Try to use corrupted session data */
+    $ctx = stream_context_create(['ssl' => [
+        'verify_peer' => false,
+        'verify_peer_name' => false,
+        'session_data' => 'this_is_invalid_session_data',
+    ]]);
+
+    try {
+        $client = stream_socket_client("tls://{{ ADDR }}", $errno, $errstr, 30, $flags, $ctx);
+    
+        if ($client === false) {
+            echo "Connection failed unexpectedlyd\n";
+        }
+    } catch (\Throwable $e) {
+        echo "Type error thrown: " . $e->getMessage() . "\n";
+    }
+CODE;
+
+include 'CertificateGenerator.inc';
+$certificateGenerator = new CertificateGenerator();
+$certificateGenerator->saveNewCertAsFileWithKey('session_invalid_test', $certFile);
+
+include 'ServerClientTestCase.inc';
+ServerClientTestCase::getInstance()->run($clientCode, $serverCode);
+?>
+--CLEAN--
+
+--EXPECTF--
+
+Warning: stream_socket_client(): Failed to enable crypto in %s on line %d
+
+Warning: stream_socket_client(): Unable to connect to %s in %s on line %d
+Type error thrown: session_data must be an OpenSSLSession instance
diff --git a/ext/openssl/tests/session_resumption_invalid_session_import.phpt b/ext/openssl/tests/session_resumption_invalid_session_import.phpt
new file mode 100644
index 000000000000..a9c5b65f2051
--- /dev/null
+++ b/ext/openssl/tests/session_resumption_invalid_session_import.phpt
@@ -0,0 +1,23 @@
+--TEST--
+TLS session resumption - invalid session import
+--EXTENSIONS--
+openssl
+--SKIPIF--
+
+--FILE--
+getMessage() . "\n";
+}
+?>
+--CLEAN--
+
+--EXPECT--
+Failed to import session data
diff --git a/ext/openssl/tests/session_resumption_new_cb_no_context.phpt b/ext/openssl/tests/session_resumption_new_cb_no_context.phpt
new file mode 100644
index 000000000000..ee2852c54ad7
--- /dev/null
+++ b/ext/openssl/tests/session_resumption_new_cb_no_context.phpt
@@ -0,0 +1,78 @@
+--TEST--
+TLS session resumption - warning when session_new_cb without session_id_context and verify_peer enabled
+--EXTENSIONS--
+openssl
+--SKIPIF--
+
+--FILE--
+ [
+        'local_cert' => '%s',
+        'verify_peer' => true,
+        'cafile' => '%s',
+        'session_new_cb' => function($stream, $session) {
+            echo "not called new_cb\n";
+        },
+        'session_get_cb' => function($stream, $sessionId) {
+            echo "not called new_cb\n";
+            return null;
+        }
+        /* Missing: 'session_id_context' => 'myapp' */
+    ]]);
+
+    try {
+        $server = @stream_socket_server('tls://127.0.0.1:0', $errno, $errstr, $flags, $ctx);
+        phpt_notify_server_start($server);
+
+        $client = @stream_socket_accept($server, 30);
+        if ($client === false) {
+            phpt_notify(message: "SERVER_FAILED_UNEXPECTEDLY");
+        } else {
+            phpt_notify(message: "SERVER_CREATED_UNEXPECTEDLY");
+            fclose($server);
+        }
+    } catch (\Throwable $e) {
+        phpt_notify(message: "SERVER_EXCEPTION: " . $e->getMessage());
+    }
+CODE;
+$serverCode = sprintf($serverCode, $certFile, $caCertFile);
+
+$clientCode = <<<'CODE'
+    $flags = STREAM_CLIENT_CONNECT;
+
+    /* Try to use corrupted session data */
+    $ctx = stream_context_create(['ssl' => [
+        'verify_peer' => false,
+        'verify_peer_name' => false
+    ]]);
+
+    $client = @stream_socket_client("tls://{{ ADDR }}", $errno, $errstr, 30, $flags, $ctx);
+
+    $result = phpt_wait();
+    echo trim($result) . "\n";
+CODE;
+
+include 'CertificateGenerator.inc';
+$certificateGenerator = new CertificateGenerator();
+$certificateGenerator->saveCaCert($caCertFile);
+$certificateGenerator->saveNewCertAsFileWithKey('session_verify_test', $certFile);
+
+include 'ServerClientTestCase.inc';
+ServerClientTestCase::getInstance()->run($clientCode, $serverCode);
+?>
+--CLEAN--
+
+--EXPECT--
+SERVER_EXCEPTION: session_id_context must be set if session_new_cb is set
diff --git a/ext/openssl/tests/session_resumption_persistent_reject.phpt b/ext/openssl/tests/session_resumption_persistent_reject.phpt
new file mode 100644
index 000000000000..835e9bb51648
--- /dev/null
+++ b/ext/openssl/tests/session_resumption_persistent_reject.phpt
@@ -0,0 +1,66 @@
+--TEST--
+TLS session resumption - callbacks rejected on persistent streams
+--EXTENSIONS--
+openssl
+--SKIPIF--
+
+--FILE--
+ [
+        'local_cert' => '%s',
+    ]]);
+
+    $server = stream_socket_server('tls://127.0.0.1:0', $errno, $errstr, $flags, $ctx);
+    phpt_notify_server_start($server);
+
+    $client = @stream_socket_accept($server, 30);
+    if ($client) {
+        fclose($client);
+    }
+CODE;
+$serverCode = sprintf($serverCode, $certFile);
+
+$clientCode = <<<'CODE'
+    $flags = STREAM_CLIENT_CONNECT | STREAM_CLIENT_PERSISTENT;
+
+    /* Try to use callback with persistent stream */
+    $ctx = stream_context_create(['ssl' => [
+        'verify_peer' => false,
+        'verify_peer_name' => false,
+        'session_new_cb' => function($stream, $session) {
+            echo "This should never be called\n";
+        }
+    ]]);
+
+    $client = stream_socket_client("tls://{{ ADDR }}", $errno, $errstr, 30, $flags, $ctx);
+
+    if ($client === false) {
+        echo "Connection failed as expected with persistent stream\n";
+    }
+CODE;
+
+include 'CertificateGenerator.inc';
+$certificateGenerator = new CertificateGenerator();
+$certificateGenerator->saveNewCertAsFileWithKey('session_persistent_test', $certFile);
+
+include 'ServerClientTestCase.inc';
+ServerClientTestCase::getInstance()->run($clientCode, $serverCode);
+?>
+--CLEAN--
+
+--EXPECTF--
+
+Warning: stream_socket_client(): session_new_cb is not supported for persistent streams in %s on line %d
+
+Warning: stream_socket_client(): Failed to enable crypto in %s on line %d
+
+Warning: stream_socket_client(): Unable to connect to %s in %s on line %d
+Connection failed as expected with persistent stream
diff --git a/ext/openssl/tests/session_resumption_require_new_cb.phpt b/ext/openssl/tests/session_resumption_require_new_cb.phpt
new file mode 100644
index 000000000000..a08408e2d90b
--- /dev/null
+++ b/ext/openssl/tests/session_resumption_require_new_cb.phpt
@@ -0,0 +1,73 @@
+--TEST--
+TLS session resumption - server requires session_new_cb with session_get_cb
+--EXTENSIONS--
+openssl
+--SKIPIF--
+
+--FILE--
+ [
+        'local_cert' => '%s',
+        'session_get_cb' => function($stream, $sessionId) {
+            return null;
+        }
+    ]]);
+
+    try {
+        $server = @stream_socket_server('tls://127.0.0.1:0', $errno, $errstr, $flags, $ctx);
+        phpt_notify_server_start($server);
+
+        $client = @stream_socket_accept($server, 30);
+        if ($client === false) {
+            phpt_notify(message: "SERVER_FAILED_UNEXPECTEDLY");
+        } else {
+            phpt_notify(message: "SERVER_CREATED_UNEXPECTEDLY");
+            fclose($server);
+        }
+    } catch (\Throwable $e) {
+        phpt_notify(message: "SERVER_EXCEPTION: " . $e->getMessage());
+    }
+CODE;
+$serverCode = sprintf($serverCode, $certFile);
+
+$clientCode = <<<'CODE'
+    $flags = STREAM_CLIENT_CONNECT;
+
+    /* Try to use corrupted session data */
+    $ctx = stream_context_create(['ssl' => [
+        'verify_peer' => false,
+        'verify_peer_name' => false,
+        'session_data' => 'this_is_invalid_session_data',
+    ]]);
+
+    $client = @stream_socket_client("tls://{{ ADDR }}", $errno, $errstr, 30, $flags, $ctx);
+
+    if ($client === false) {
+        echo "Connection failed as expected\n";
+    }
+
+    $result = phpt_wait();
+    echo trim($result) . "\n";
+CODE;
+
+include 'CertificateGenerator.inc';
+$certificateGenerator = new CertificateGenerator();
+$certificateGenerator->saveNewCertAsFileWithKey('session_require_cb_test', $certFile);
+
+include 'ServerClientTestCase.inc';
+ServerClientTestCase::getInstance()->run($clientCode, $serverCode);
+?>
+--CLEAN--
+
+--EXPECT--
+SERVER_EXCEPTION: session_new_cb is required when session_get_cb is providedConnection failed as expected
diff --git a/ext/openssl/tests/session_resumption_serialize_session.phpt b/ext/openssl/tests/session_resumption_serialize_session.phpt
new file mode 100644
index 000000000000..f2f3c98e5e5b
--- /dev/null
+++ b/ext/openssl/tests/session_resumption_serialize_session.phpt
@@ -0,0 +1,84 @@
+--TEST--
+TLS session resumption - serialize session
+--EXTENSIONS--
+openssl
+--SKIPIF--
+
+--FILE--
+ [
+        'local_cert' => '%s',
+        'session_cache' => true,
+        'session_id_context' => 'test-basic',
+    ]]);
+
+    $server = stream_socket_server('tls://127.0.0.1:0', $errno, $errstr, $flags, $ctx);
+    phpt_notify_server_start($server);
+
+    /* Accept single connections */
+    $client = @stream_socket_accept($server, 30);
+    if ($client) {
+        fwrite($client, "Hello from server\n");
+        fclose($client);
+    }
+CODE;
+$serverCode = sprintf($serverCode, $certFile);
+
+$clientCode = <<<'CODE'
+    $sessionData = '';
+
+    $flags = STREAM_CLIENT_CONNECT;
+    $ctx = stream_context_create(['ssl' => [
+        'verify_peer' => false,
+        'verify_peer_name' => false,
+        'session_new_cb' => function($stream, $session) use (&$sessionData) {
+            if (empty($sessionData)) {
+                $serializedSessionData = serialize($session);
+                var_dump($serializedSessionData);
+                $session = unserialize($serializedSessionData);
+                var_dump($session);
+            }
+            $sessionData = $session;
+        }
+    ]]);
+
+    /* First connection - full handshake */
+    $client1 = stream_socket_client("tls://{{ ADDR }}", $errno, $errstr, 30, $flags, $ctx);
+    if ($client1) {
+        echo trim(fgets($client1)) . "\n";
+        $meta1 = stream_get_meta_data($client1);
+        echo "First connection resumed: " . ($meta1['crypto']['session_reused'] ? "yes" : "no") . "\n";
+        echo "Session data received: " . (!empty($sessionData) ? "yes" : "no") . "\n";
+        fclose($client1);
+    }
+CODE;
+
+include 'CertificateGenerator.inc';
+$certificateGenerator = new CertificateGenerator();
+$certificateGenerator->saveNewCertAsFileWithKey('session_resumption_test', $certFile);
+
+include 'ServerClientTestCase.inc';
+ServerClientTestCase::getInstance()->run($clientCode, $serverCode);
+?>
+--CLEAN--
+
+--EXPECTF--
+string(%d) "O:15:"Openssl\Session":1:{s:3:"pem";s:%d:"-----BEGIN SSL SESSION PARAMETERS-----
+%a
+-----END SSL SESSION PARAMETERS-----
+";}"
+object(Openssl\Session)#9 (1) {
+  ["id"]=>
+%a
+}
+Hello from server
+First connection resumed: no
+Session data received: yes
diff --git a/ext/openssl/tests/session_resumption_server_external_with_context_id.phpt b/ext/openssl/tests/session_resumption_server_external_with_context_id.phpt
new file mode 100644
index 000000000000..02c6a7dcfdc7
--- /dev/null
+++ b/ext/openssl/tests/session_resumption_server_external_with_context_id.phpt
@@ -0,0 +1,116 @@
+--TEST--
+TLS session resumption - server external cache callbacks with context id
+--EXTENSIONS--
+openssl
+--SKIPIF--
+
+--FILE--
+ [
+        'local_cert' => '%s',
+        'session_id_context' => 'test-server',
+        'session_new_cb' => function($stream, $session) use (&$sessionStore, &$newCbCalled) {
+            $key = bin2hex($session->id);
+            $sessionStore[$key] = $session;
+            $newCbCalled = true;
+        },
+        'session_get_cb' => function($stream, $sessionId) use (&$sessionStore, &$getCbCalled) {
+            $key = bin2hex($sessionId);
+            $getCbCalled = true;
+            return $sessionStore[$key] ?? null;
+        },
+    ]]);
+
+    $server = stream_socket_server('tls://127.0.0.1:0', $errno, $errstr, $flags, $ctx);
+    phpt_notify_server_start($server);
+
+    /* Accept two connections */
+    for ($i = 0; $i < 2; $i++) {
+        $client = @stream_socket_accept($server, 30);
+        if ($client) {
+            fwrite($client, "Response " . ($i + 1) . "\n");
+            fclose($client);
+        }
+    }
+
+    /* Report results */
+    $result = [];
+    if ($newCbCalled) $result[] = "NEW_CB_CALLED";
+    if ($getCbCalled) $result[] = "GET_CB_CALLED";
+    $result[] = "SESSIONS:" . count($sessionStore);
+
+    phpt_notify(message: implode(",", $result));
+CODE;
+$serverCode = sprintf($serverCode, $certFile);
+
+$clientCode = <<<'CODE'
+    $sessionData = null;
+
+    $flags = STREAM_CLIENT_CONNECT;
+    $ctx = stream_context_create(['ssl' => [
+        'verify_peer' => false,
+        'verify_peer_name' => false,
+        'session_new_cb' => function($stream, $session) use (&$sessionData) {
+            $sessionData = $session;
+        }
+    ]]);
+
+    /* First connection */
+    $client1 = stream_socket_client("tls://{{ ADDR }}", $errno, $errstr, 30, $flags, $ctx);
+    if ($client1) {
+        $meta1 = stream_get_meta_data($client1);
+        echo "Client first connection resumed: " . ($meta1['crypto']['session_reused'] ? "yes" : "no") . "\n";
+        echo trim(fgets($client1)) . "\n";
+        fclose($client1);
+    }
+
+    echo "Session captured: " . ($sessionData !== null ? "YES" : "NO") . "\n";
+
+    /* Second connection with session resumption */
+    $ctx2 = stream_context_create(['ssl' => [
+        'verify_peer' => false,
+        'verify_peer_name' => false,
+        'session_data' => $sessionData,
+    ]]);
+
+    $client2 = stream_socket_client("tls://{{ ADDR }}", $errno, $errstr, 30, $flags, $ctx2);
+    if ($client2) {
+        $meta2 = stream_get_meta_data($client2);
+        echo "Client second connection resumed: " . ($meta2['crypto']['session_reused'] ? "yes" : "no") . "\n";
+        echo trim(fgets($client2)) . "\n";
+        fclose($client2);
+    }
+
+    /* Get server callback results */
+    $result = phpt_wait();
+    echo "Server: " . trim($result) . "\n";
+CODE;
+
+include 'CertificateGenerator.inc';
+$certificateGenerator = new CertificateGenerator();
+$certificateGenerator->saveNewCertAsFileWithKey('session_external_proper_test', $certFile);
+
+include 'ServerClientTestCase.inc';
+ServerClientTestCase::getInstance()->run($clientCode, $serverCode);
+?>
+--CLEAN--
+
+--EXPECTF--
+Client first connection resumed: no
+Response 1
+Session captured: YES
+Client second connection resumed: yes
+Response 2
+Server: NEW_CB_CALLED,GET_CB_CALLED,SESSIONS:3
diff --git a/ext/openssl/tests/session_resumption_server_external_with_context_id_tls12.phpt b/ext/openssl/tests/session_resumption_server_external_with_context_id_tls12.phpt
new file mode 100644
index 000000000000..bdc3d2ce1bf6
--- /dev/null
+++ b/ext/openssl/tests/session_resumption_server_external_with_context_id_tls12.phpt
@@ -0,0 +1,116 @@
+--TEST--
+TLS session resumption - server external cache callbacks with context id for TLS 1.2
+--EXTENSIONS--
+openssl
+--SKIPIF--
+
+--FILE--
+ [
+        'local_cert' => '%s',
+        'session_id_context' => 'test-server',  // Proper configuration
+        'session_new_cb' => function($stream, $session) use (&$sessionStore, &$newCbCalled) {
+            $key = bin2hex($session->id);
+            $sessionStore[$key] = $session;
+            $newCbCalled = true;
+        },
+        'session_get_cb' => function($stream, $sessionId) use (&$sessionStore, &$getCbCalled) {
+            $key = bin2hex($sessionId);
+            $getCbCalled = true;
+            return $sessionStore[$key] ?? null;
+        },
+    ]]);
+
+    $server = stream_socket_server('tlsv1.2://127.0.0.1:0', $errno, $errstr, $flags, $ctx);
+    phpt_notify_server_start($server);
+
+    /* Accept two connections */
+    for ($i = 0; $i < 2; $i++) {
+        $client = @stream_socket_accept($server, 30);
+        if ($client) {
+            fwrite($client, "Response " . ($i + 1) . "\n");
+            fclose($client);
+        }
+    }
+
+    /* Report results */
+    $result = [];
+    if ($newCbCalled) $result[] = "NEW_CB_CALLED";
+    if ($getCbCalled) $result[] = "GET_CB_CALLED";
+    $result[] = "SESSIONS:" . count($sessionStore);
+
+    phpt_notify(message: implode(",", $result));
+CODE;
+$serverCode = sprintf($serverCode, $certFile);
+
+$clientCode = <<<'CODE'
+    $sessionData = null;
+
+    $flags = STREAM_CLIENT_CONNECT;
+    $ctx = stream_context_create(['ssl' => [
+        'verify_peer' => false,
+        'verify_peer_name' => false,
+        'session_new_cb' => function($stream, $session) use (&$sessionData) {
+            $sessionData = $session;
+        }
+    ]]);
+
+    /* First connection */
+    $client1 = stream_socket_client("tls://{{ ADDR }}", $errno, $errstr, 30, $flags, $ctx);
+    if ($client1) {
+        $meta1 = stream_get_meta_data($client1);
+        echo "Client first connection resumed: " . ($meta1['crypto']['session_reused'] ? "yes" : "no") . "\n";
+        echo trim(fgets($client1)) . "\n";
+        fclose($client1);
+    }
+
+    echo "Session captured: " . ($sessionData !== null ? "YES" : "NO") . "\n";
+
+    /* Second connection with session resumption */
+    $ctx2 = stream_context_create(['ssl' => [
+        'verify_peer' => false,
+        'verify_peer_name' => false,
+        'session_data' => $sessionData,
+    ]]);
+
+    $client2 = stream_socket_client("tls://{{ ADDR }}", $errno, $errstr, 30, $flags, $ctx2);
+    if ($client2) {
+        $meta2 = stream_get_meta_data($client2);
+        echo "Client second connection resumed: " . ($meta2['crypto']['session_reused'] ? "yes" : "no") . "\n";
+        echo trim(fgets($client2)) . "\n";
+        fclose($client2);
+    }
+
+    /* Get server callback results */
+    $result = phpt_wait();
+    echo "Server: " . trim($result) . "\n";
+CODE;
+
+include 'CertificateGenerator.inc';
+$certificateGenerator = new CertificateGenerator();
+$certificateGenerator->saveNewCertAsFileWithKey('session_external_proper_test', $certFile);
+
+include 'ServerClientTestCase.inc';
+ServerClientTestCase::getInstance()->run($clientCode, $serverCode);
+?>
+--CLEAN--
+
+--EXPECTF--
+Client first connection resumed: no
+Response 1
+Session captured: YES
+Client second connection resumed: yes
+Response 2
+Server: NEW_CB_CALLED,GET_CB_CALLED,SESSIONS:1
diff --git a/ext/openssl/tests/session_resumption_server_external_with_no_verify.phpt b/ext/openssl/tests/session_resumption_server_external_with_no_verify.phpt
new file mode 100644
index 000000000000..28bb97faff28
--- /dev/null
+++ b/ext/openssl/tests/session_resumption_server_external_with_no_verify.phpt
@@ -0,0 +1,121 @@
+--TEST--
+TLS session resumption - server external cache callbacks with no verify
+--EXTENSIONS--
+openssl
+--SKIPIF--
+
+--FILE--
+ [
+        'local_cert' => '%s',
+        'verify_peer' => false,
+        'no_ticket' => true,
+        'session_cache' => true,
+        'session_new_cb' => function($stream, $session) use (&$sessionStore, &$newCbCalled) {
+            $key = bin2hex($session->id);
+            $sessionStore[$key] = $session;
+            $newCbCalled = true;
+        },
+        'session_get_cb' => function($stream, $sessionId) use (&$sessionStore, &$getCbCalled) {
+            $key = bin2hex($sessionId);
+            $getCbCalled = true;
+            return $sessionStore[$key] ?? null;
+        },
+        'session_remove_cb' => function($stream, $sessionId) use (&$sessionStore, &$removeCbCalled) {
+            $key = bin2hex($sessionId);
+            unset($sessionStore[$key]);
+            $removeCbCalled = true;
+        }
+    ]]);
+
+    $server = stream_socket_server('tls://127.0.0.1:0', $errno, $errstr, $flags, $ctx);
+    phpt_notify_server_start($server);
+
+    /* Accept two connections */
+    for ($i = 0; $i < 2; $i++) {
+        $client = @stream_socket_accept($server, 30);
+        if ($client) {
+            fwrite($client, "Response " . ($i + 1) . "\n");
+            fclose($client);
+        }
+    }
+
+    /* Notify client about callback invocations */
+    $result = [];
+    if ($newCbCalled) $result[] = "NEW_CB_CALLED";
+    if ($getCbCalled) $result[] = "GET_CB_CALLED";
+    if ($removeCbCalled) $result[] = "REMOVE_CB_CALLED";
+
+    phpt_notify(message: implode(",", $result));
+CODE;
+$serverCode = sprintf($serverCode, $certFile);
+
+$clientCode = <<<'CODE'
+    $sessionData = null;
+
+    $flags = STREAM_CLIENT_CONNECT;
+    $ctx = stream_context_create(['ssl' => [
+        'verify_peer' => false,
+        'verify_peer_name' => false,
+        'session_new_cb' => function($stream, $session) use (&$sessionData) {
+            $sessionData = $session;
+        }
+    ]]);
+
+    /* First connection */
+    $client1 = stream_socket_client("tls://{{ ADDR }}", $errno, $errstr, 30, $flags, $ctx);
+    if ($client1) {
+        $meta1 = stream_get_meta_data($client1);
+        echo "Client first connection resumed: " . ($meta1['crypto']['session_reused'] ? "yes" : "no") . "\n";
+        echo trim(fgets($client1)) . "\n";
+        fclose($client1);
+    }
+
+    /* Second connection with session resumption */
+    $ctx2 = stream_context_create(['ssl' => [
+        'verify_peer' => false,
+        'verify_peer_name' => false,
+        'session_data' => $sessionData,
+    ]]);
+
+    $client2 = stream_socket_client("tls://{{ ADDR }}", $errno, $errstr, 30, $flags, $ctx2);
+    if ($client2) {
+        $meta2 = stream_get_meta_data($client2);
+        echo "Client second connection resumed: " . ($meta2['crypto']['session_reused'] ? "yes" : "no") . "\n";
+        echo trim(fgets($client2)) . "\n";
+        fclose($client2);
+    }
+
+    /* Get server callback results */
+    $result = phpt_wait();
+    echo "Server callbacks: " . trim($result) . "\n";
+CODE;
+
+include 'CertificateGenerator.inc';
+$certificateGenerator = new CertificateGenerator();
+$certificateGenerator->saveNewCertAsFileWithKey('session_server_test', $certFile);
+
+include 'ServerClientTestCase.inc';
+ServerClientTestCase::getInstance()->run($clientCode, $serverCode);
+?>
+--CLEAN--
+
+--EXPECTF--
+Client first connection resumed: no
+Response 1
+Client second connection resumed: yes
+Response 2
+Server callbacks: NEW_CB_CALLED,GET_CB_CALLED
diff --git a/ext/openssl/tests/session_resumption_server_internal.phpt b/ext/openssl/tests/session_resumption_server_internal.phpt
new file mode 100644
index 000000000000..d7c2633601e8
--- /dev/null
+++ b/ext/openssl/tests/session_resumption_server_internal.phpt
@@ -0,0 +1,99 @@
+--TEST--
+TLS session resumption - server internal cache
+--EXTENSIONS--
+openssl
+--SKIPIF--
+
+--FILE--
+ [
+        'local_cert' => '%s',
+        'session_id_context' => 'test-server',
+        'session_cache' => true,
+        'session_cache_size' => 1024,
+        'session_timeout' => 300,
+    ]]);
+
+    $server = stream_socket_server('tls://127.0.0.1:0', $errno, $errstr, $flags, $ctx);
+    phpt_notify_server_start($server);
+
+    /* Accept two connections */
+    for ($i = 0; $i < 2; $i++) {
+        $client = @stream_socket_accept($server, 30);
+        if ($client) {
+            fwrite($client, "Connection " . ($i + 1) . "\n");
+            fclose($client);
+        }
+    }
+
+    phpt_notify(message: "SERVER_DONE");
+CODE;
+$serverCode = sprintf($serverCode, $certFile);
+
+$clientCode = <<<'CODE'
+    $sessionData = null;
+
+    $flags = STREAM_CLIENT_CONNECT;
+    $ctx = stream_context_create(['ssl' => [
+        'verify_peer' => false,
+        'verify_peer_name' => false,
+        'session_new_cb' => function($stream, $session) use (&$sessionData) {
+            $sessionData = $session;
+        }
+    ]]);
+
+    /* First connection */
+    $client1 = stream_socket_client("tls://{{ ADDR }}", $errno, $errstr, 30, $flags, $ctx);
+    if ($client1) {
+        $meta1 = stream_get_meta_data($client1);
+        echo "Client first connection resumed: " . ($meta1['crypto']['session_reused'] ? "yes" : "no") . "\n";
+        echo trim(fgets($client1)) . "\n";
+        fclose($client1);
+    }
+
+    echo "Session data received: " . ($sessionData !== null ? "YES" : "NO") . "\n";
+
+    /* Second connection with session resumption */
+    $ctx2 = stream_context_create(['ssl' => [
+        'verify_peer' => false,
+        'verify_peer_name' => false,
+        'session_data' => $sessionData,
+    ]]);
+
+    $client2 = stream_socket_client("tls://{{ ADDR }}", $errno, $errstr, 30, $flags, $ctx2);
+    if ($client2) {
+        $meta2 = stream_get_meta_data($client2);
+        echo "Client second connection resumed: " . ($meta2['crypto']['session_reused'] ? "yes" : "no") . "\n";
+        echo trim(fgets($client2)) . "\n";
+        fclose($client2);
+    }
+
+    /* Wait for server */
+    $result = phpt_wait();
+    echo trim($result) . "\n";
+CODE;
+
+include 'CertificateGenerator.inc';
+$certificateGenerator = new CertificateGenerator();
+$certificateGenerator->saveNewCertAsFileWithKey('session_internal_cache_test', $certFile);
+
+include 'ServerClientTestCase.inc';
+ServerClientTestCase::getInstance()->run($clientCode, $serverCode);
+?>
+--CLEAN--
+
+--EXPECTF--
+Client first connection resumed: no
+Connection 1
+Session data received: YES
+Client second connection resumed: yes
+Connection 2
+SERVER_DONE
diff --git a/ext/openssl/tests/session_unserialize_repeat.phpt b/ext/openssl/tests/session_unserialize_repeat.phpt
new file mode 100644
index 000000000000..b1e33c2d03bd
--- /dev/null
+++ b/ext/openssl/tests/session_unserialize_repeat.phpt
@@ -0,0 +1,84 @@
+--TEST--
+Openssl\Session::__unserialize throws on a repeat call
+--EXTENSIONS--
+openssl
+--SKIPIF--
+
+--FILE--
+ [
+        'local_cert' => '%s',
+    ]]);
+
+    $server = stream_socket_server('tls://127.0.0.1:0', $errno, $errstr,
+        STREAM_SERVER_BIND | STREAM_SERVER_LISTEN, $serverCtx);
+    phpt_notify_server_start($server);
+
+    $client = @stream_socket_accept($server, 10);
+    if ($client) {
+        fwrite($client, "ok\n");
+        fclose($client);
+    }
+CODE;
+$serverCode = sprintf($serverCode, $certFile);
+
+$clientCode = <<<'CODE'
+    $captured = null;
+    $ctx = stream_context_create(['ssl' => [
+        'verify_peer' => false,
+        'verify_peer_name' => false,
+        'session_new_cb' => function ($s, $session) use (&$captured) {
+            $captured = $session;
+            return true;
+        },
+        'crypto_method' => STREAM_CRYPTO_METHOD_TLSv1_2_CLIENT,
+    ]]);
+
+    $c = stream_socket_client("tls://{{ ADDR }}", $errno, $errstr, 10,
+        STREAM_CLIENT_CONNECT, $ctx);
+    if (!$c) {
+        echo "connect failed: $errstr\n";
+        return;
+    }
+    fread($c, 8);
+    fclose($c);
+
+    if (!$captured instanceof Openssl\Session) {
+        echo "no session captured\n";
+        return;
+    }
+
+    $payload = $captured->__serialize();
+    $sess = unserialize(serialize($captured));
+    echo "first: " . (is_object($sess) ? get_class($sess) : "fail") . "\n";
+
+    try {
+        $sess->__unserialize($payload);
+        echo "second: no throw\n";
+    } catch (Error $e) {
+        echo "second: " . $e->getMessage() . "\n";
+    }
+
+    echo "alive\n";
+CODE;
+
+include 'CertificateGenerator.inc';
+$certificateGenerator = new CertificateGenerator();
+$certificateGenerator->saveNewCertAsFileWithKey('session-unserialize-repeat', $certFile);
+
+include 'ServerClientTestCase.inc';
+ServerClientTestCase::getInstance()->run($clientCode, $serverCode);
+?>
+--CLEAN--
+
+--EXPECTF--
+first: Openssl\Session
+second: Cannot call Openssl\Session::__unserialize() on an already-initialized session
+alive
diff --git a/ext/openssl/tests/sni_server_uk.pem b/ext/openssl/tests/sni_server.pem
similarity index 100%
rename from ext/openssl/tests/sni_server_uk.pem
rename to ext/openssl/tests/sni_server.pem
diff --git a/ext/openssl/tests/sni_server.phpt b/ext/openssl/tests/sni_server.phpt
index 7f9a4e82872b..db0b0190dab3 100644
--- a/ext/openssl/tests/sni_server.phpt
+++ b/ext/openssl/tests/sni_server.phpt
@@ -8,13 +8,25 @@ if (!function_exists("proc_open")) die("skip no proc_open");
 ?>
 --FILE--
 saveCaCert($caFile);
+$certificateGenerator->saveNewCertAsFileWithKey('cs.php.net', $csFile);
+$certificateGenerator->saveNewCertAsFileWithKey('uk.php.net', $ukFile);
+$certificateGenerator->saveNewCertAsFileWithKey('us.php.net', $usFile);
+
 $serverCode = <<<'CODE'
     $flags = STREAM_SERVER_BIND|STREAM_SERVER_LISTEN;
     $ctx = stream_context_create(['ssl' => [
         'SNI_server_certs' => [
-            "cs.php.net" => __DIR__ . "/sni_server_cs.pem",
-            "uk.php.net" => __DIR__ . "/sni_server_uk.pem",
-            "us.php.net" => __DIR__ . "/sni_server_us.pem"
+            "cs.php.net" => '%s',
+            "uk.php.net" => '%s',
+            "us.php.net" => '%s',
         ]
     ]]);
 
@@ -25,11 +37,12 @@ $serverCode = <<<'CODE'
         @stream_socket_accept($server, 3);
     }
 CODE;
+$serverCode = sprintf($serverCode, $csFile, $ukFile, $usFile);
 
 $clientCode = <<<'CODE'
     $flags = STREAM_CLIENT_CONNECT;
     $ctxArr = [
-        'cafile' => __DIR__ . '/sni_server_ca.pem',
+        'cafile' => '%s',
         'capture_peer_cert' => true
     ];
 
@@ -51,10 +64,18 @@ $clientCode = <<<'CODE'
     $cert = stream_context_get_options($ctx)['ssl']['peer_certificate'];
     var_dump(openssl_x509_parse($cert)['subject']['CN']);
 CODE;
+$clientCode = sprintf($clientCode, $caFile);
 
 include 'ServerClientTestCase.inc';
 ServerClientTestCase::getInstance()->run($clientCode, $serverCode);
 ?>
+--CLEAN--
+
 --EXPECTF--
 string(%d) "cs.php.net"
 string(%d) "uk.php.net"
diff --git a/ext/openssl/tests/sni_server_cs_cert.pem b/ext/openssl/tests/sni_server_cs_cert.pem
deleted file mode 100644
index b77c7b83e2ad..000000000000
--- a/ext/openssl/tests/sni_server_cs_cert.pem
+++ /dev/null
@@ -1,30 +0,0 @@
------BEGIN CERTIFICATE-----
-MIIFIjCCAwqgAwIBAgICEAIwDQYJKoZIhvcNAQELBQAwVTELMAkGA1UEBhMCR0Ix
-EDAOBgNVBAgMB0VuZ2xhbmQxEDAOBgNVBAoMB1BIUC5uZXQxEDAOBgNVBAsMB29w
-ZW5zc2wxEDAOBgNVBAMMB3BocC5uZXQwHhcNMTgwMTE0MTgzNjEyWhcNMjYwNDAy
-MTgzNjEyWjBGMQswCQYDVQQGEwJHQjEQMA4GA1UECAwHRW5nbGFuZDEQMA4GA1UE
-CgwHUEhQLm5ldDETMBEGA1UEAwwKY3MucGhwLm5ldDCCASIwDQYJKoZIhvcNAQEB
-BQADggEPADCCAQoCggEBAL8uTYc5LcxHbB02xger6mADZrOa59c1xZkyaxpVgsKC
-LDZk32ob2ZKwtXAl02e32zwfF0G6QLc9mUlOznMAVvQfKJGFD6Pc4v6bcHK4LELD
-dIa3A/DAUVHHHr8IpnuXy74PBPUSf+vMvctwZ0XFVmDtrACvY7k34nTYxE1NwW9O
-aF7/A0g/+qJ10LuLlw4LEN3EV3pXfVAdMWs5kF8soiKl3P3KUwJ2hFWM59vGo+zZ
-VG8zauddVFzF2OOMfRHF1qT1We4XjXCTc2OQwjc5rVyq7fcojKVkHD1xM7BElcQD
-Kom/bkxTpb1V9eyyD8QRuuej40w/SdYepAWzAlMc7O8CAwEAAaOCAQkwggEFMAkG
-A1UdEwQCMAAwEQYJYIZIAYb4QgEBBAQDAgZAMDMGCWCGSAGG+EIBDQQmFiRPcGVu
-U1NMIEdlbmVyYXRlZCBTZXJ2ZXIgQ2VydGlmaWNhdGUwHQYDVR0OBBYEFHPfd8dK
-Lz1R0Ck4WV1B9AWXd5DSMGwGA1UdIwRlMGOAFOPK44Eacedv7HbR2Igcbew+4kUa
-oUekRTBDMQswCQYDVQQGEwJHQjEQMA4GA1UECAwHRW5nbGFuZDEQMA4GA1UECgwH
-UEhQLm5ldDEQMA4GA1UEAwwHcGhwLm5ldIICEAAwDgYDVR0PAQH/BAQDAgWgMBMG
-A1UdJQQMMAoGCCsGAQUFBwMBMA0GCSqGSIb3DQEBCwUAA4ICAQB6WSIHEyDXLZxH
-hZjqSNQOA7Wc9Z2FCAiD29xYkGTL8WuPVGGP1mu4B92ytj+PMWwqSReDa7eTGLE7
-O7ozw9l+c+gNmHFNikSsGjlV2E8CToQOFMny+jAQYMSXf8UbTp9xDfgG02t/71hv
-SLWqdeHMLcR0xi0nBQH0vDOkwUbuWYqFa3jejHieGhykHM6CkIk6lqnyOEO+ooIF
-ZsLprrg1ss/mXCPI6niP0hze55ERKdxI7Rk8sZ4pVkf2SUWqZrUS0aJ+Ymmwi6Xd
-2V7izq5N30PkJS8MtqII4FAjRBIkwPh0sy8PmW/DzkYU+lYQnDfYLKDFKcj8xJK/
-o8oZUBsQltrSj0KlM9QuqxCTCBCy1nXZ9WHOhq+jdLiTc1Oi60uEHcUMrLK8aYc4
-HqIvZS6C2iwMI0d1OP3VxmAbMQ9yqRi+FbLYavJ3H40jrU9SYqdxa0BrTaz8MJNE
-6AEwgQDPChczSghvHME+Fs4mtGCY3TesbNZKVahQRjaFIhMZIZ4RP4CRc0bJOBG+
-8Me4+KHNsD2ki5b03wAN6C1P2QrMzI+gH9fXLZYp761ciDAsX6YIzrhHHYLxYpJH
-BkQKKs8dCQWE5IzgVrdlvC3Z1/l9om66wHqqx7nKnPfYs/Sfnwe9MpCD6xJrXiTm
-WS7NM6fbQpO9APNr7o0ZOjbbWFzlNw==
------END CERTIFICATE-----
diff --git a/ext/openssl/tests/sni_server_cs.pem b/ext/openssl/tests/sni_server_cs_expired.pem
similarity index 100%
rename from ext/openssl/tests/sni_server_cs.pem
rename to ext/openssl/tests/sni_server_cs_expired.pem
diff --git a/ext/openssl/tests/sni_server_cs_key.pem b/ext/openssl/tests/sni_server_cs_key.pem
deleted file mode 100644
index bf1e9f25193b..000000000000
--- a/ext/openssl/tests/sni_server_cs_key.pem
+++ /dev/null
@@ -1,27 +0,0 @@
------BEGIN RSA PRIVATE KEY-----
-MIIEpQIBAAKCAQEAvy5NhzktzEdsHTbGB6vqYANms5rn1zXFmTJrGlWCwoIsNmTf
-ahvZkrC1cCXTZ7fbPB8XQbpAtz2ZSU7OcwBW9B8okYUPo9zi/ptwcrgsQsN0hrcD
-8MBRUccevwime5fLvg8E9RJ/68y9y3BnRcVWYO2sAK9juTfidNjETU3Bb05oXv8D
-SD/6onXQu4uXDgsQ3cRXeld9UB0xazmQXyyiIqXc/cpTAnaEVYzn28aj7NlUbzNq
-511UXMXY44x9EcXWpPVZ7heNcJNzY5DCNzmtXKrt9yiMpWQcPXEzsESVxAMqib9u
-TFOlvVX17LIPxBG656PjTD9J1h6kBbMCUxzs7wIDAQABAoIBAQC85lBeY0X4ST3v
-I7bJz7kWQ2YP4uhfAdeLhoDDFWjNLffniwYhfwEc6xNri0R2f/jUT9gX7qORKwEx
-qPdeNCC2t67LElGg1FlJv2Z9Q7MgCKYzkdQH5s6y4e9kTHTLO/JpiceZKz1QTQ3f
-XOH9032E6nIAf0wmr6xHTgOwajrN8VI5BuPEMVmEwIw3AtYeqVuPCNKyGR4HUVkC
-2bAydnGngbRJRnNzmKcWJancxpHDGBSFqPyuXMFC7Jgo3ZmyCbGp99vuXVk/sW9x
-5aj94M9nRE0guk05ivH2/JZao2uLYkIgjFWlhNxKdWgWRk8DEuN4djC8mKS9YH1q
-crYRToMhAoGBAOspUTtKP54mpZmyhxuDqj02JaJRzNTskPHsiF1UhtXuw7uT+ryV
-ekUFLNXoFmn9mbx1WVaUvGH4qjilvQOxz7u++lz0ApqJEfyM3jc/cC40Y5zcuGSu
-Etbg+SyDoytlgMCIydJyrS7NNALSo5p5oG6XY2f8yd/DCAmo8LzypaHRAoGBANAf
-R1SlBMc/bOsi6GrJxcBVSCFMiKYiO5woL5aUKa9yM+UQuQ/6xbQ7Q+sOlt0FH3xo
-AJ2L60qTdjyXVtjOdtXs5ZC4l+C6AfnCx6yLr+fNc4SOYXEfqS4LZylgwKd9KyVB
-asspIW9Idbgebmi6vPyt9LDkIp0h1VuFGjkvQJK/AoGBAI4pbS0dprXyARyYW6sb
-fpgAmuG099IkrT9DUfCx/81myTclr2fAKal+BmvOIXaz0/OlMXvw8K19iVIzh7+r
-B70lJ+93p/dKM/BsLI5TsHqOO0YB/QsIXOVAHgJ2FfdPJnW+e9vYba+kZ/Po6PSi
-4ITaykJ8BIJcQgis89QWEGFxAoGBAJhQO+jzuDKF9ZWEf6ofrw0anOZZ16wWY5/e
-PS2rk3JmVxpuibHrKqPDt+ogTELHDAsFJmYmz3VNxHuFmrajK49Wh4/JuMVr/CQo
-6+8YcA1qa/94IFIlBLDBAafjujsZvOjQHnM+z8xcsGKmStF00Pjv6qNG4xoyd646
-FD4DmfOLAoGAWXehpopZKXE9gRAni881ucK6WqxPPBoofbozi09D0MmfarIVaSkv
-jNVVHBfLWd7IEXTjiipPBeUqq6Jc3pscN1Vp4rrl8jTmVTdazEv0LuzpdUFqmNo2
-M+xw17uz9D9Q32/aW1Lar0PdIaL/wGEDEyzEBFwrGppcENLilPz8gzU=
------END RSA PRIVATE KEY-----
diff --git a/ext/openssl/tests/sni_server_key_cert.phpt b/ext/openssl/tests/sni_server_key_cert.phpt
index 49ed6aa5328c..878f97c1e359 100644
--- a/ext/openssl/tests/sni_server_key_cert.phpt
+++ b/ext/openssl/tests/sni_server_key_cert.phpt
@@ -8,21 +8,36 @@ if (!function_exists("proc_open")) die("skip no proc_open");
 ?>
 --FILE--
 saveCaCert($caFile);
+$certificateGenerator->saveNewCertAndKey('cs.php.net', $csCertFile, $csKeyFile);
+$certificateGenerator->saveNewCertAndKey('uk.php.net', $ukCertFile, $ukKeyFile);
+$certificateGenerator->saveNewCertAndKey('us.php.net', $usCertFile, $usKeyFile);
+
 $serverCode = <<<'CODE'
     $flags = STREAM_SERVER_BIND|STREAM_SERVER_LISTEN;
     $ctx = stream_context_create(['ssl' => [
         'SNI_server_certs' => [
             "cs.php.net" => [
-                'local_cert' => __DIR__ . "/sni_server_cs_cert.pem",
-                'local_pk' => __DIR__ . "/sni_server_cs_key.pem"
+                'local_cert' => '%s',
+                'local_pk' => '%s',
             ],
             "uk.php.net" => [
-                'local_cert' => __DIR__ . "/sni_server_uk_cert.pem",
-                'local_pk' => __DIR__ . "/sni_server_uk_key.pem"
+                'local_cert' => '%s',
+                'local_pk' => '%s',
             ],
             "us.php.net" => [
-                'local_cert' => __DIR__ . "/sni_server_us_cert.pem",
-                'local_pk' => __DIR__ . "/sni_server_us_key.pem"
+                'local_cert' => '%s',
+                'local_pk' => '%s',
             ],
         ]
     ]]);
@@ -34,11 +49,16 @@ $serverCode = <<<'CODE'
         @stream_socket_accept($server, 3);
     }
 CODE;
+$serverCode = sprintf($serverCode,
+        $csCertFile, $csKeyFile,
+        $ukCertFile, $ukKeyFile,
+        $usCertFile, $usKeyFile
+);
 
 $clientCode = <<<'CODE'
     $flags = STREAM_CLIENT_CONNECT;
     $ctxArr = [
-        'cafile' => __DIR__ . '/sni_server_ca.pem',
+        'cafile' => '%s',
         'capture_peer_cert' => true
     ];
 
@@ -60,10 +80,21 @@ $clientCode = <<<'CODE'
     $cert = stream_context_get_options($ctx)['ssl']['peer_certificate'];
     var_dump(openssl_x509_parse($cert)['subject']['CN']);
 CODE;
+$clientCode = sprintf($clientCode, $caFile);
 
 include 'ServerClientTestCase.inc';
 ServerClientTestCase::getInstance()->run($clientCode, $serverCode);
 ?>
+--CLEAN--
+
 --EXPECTF--
 string(%d) "cs.php.net"
 string(%d) "uk.php.net"
diff --git a/ext/openssl/tests/sni_server_uk_cert.pem b/ext/openssl/tests/sni_server_uk_cert.pem
deleted file mode 100644
index 57663855e590..000000000000
--- a/ext/openssl/tests/sni_server_uk_cert.pem
+++ /dev/null
@@ -1,30 +0,0 @@
------BEGIN CERTIFICATE-----
-MIIFIjCCAwqgAwIBAgICEAMwDQYJKoZIhvcNAQELBQAwVTELMAkGA1UEBhMCR0Ix
-EDAOBgNVBAgMB0VuZ2xhbmQxEDAOBgNVBAoMB1BIUC5uZXQxEDAOBgNVBAsMB29w
-ZW5zc2wxEDAOBgNVBAMMB3BocC5uZXQwHhcNMTgwMTE0MTgzNjMyWhcNMjYwNDAy
-MTgzNjMyWjBGMQswCQYDVQQGEwJHQjEQMA4GA1UECAwHRW5nbGFuZDEQMA4GA1UE
-CgwHUEhQLm5ldDETMBEGA1UEAwwKdWsucGhwLm5ldDCCASIwDQYJKoZIhvcNAQEB
-BQADggEPADCCAQoCggEBAKzKRXj0jVBzRwolFn7Ej0MR2kE6Q36IBCEiDLhquSYR
-Lh1spR0XudSVmRot/Wvz2PawApX4P6qj57scBQ6KL4ULKvSndCZ7F1tdQjEqogYp
-n/L8oBhP1dgyDonsewG/PucxC+3Aqzcl3w5Pg7qE+zad42khP7t9TjFAMxc+PxC+
-2as5ZCDJBwfxksCyCQfFWx7eB7p39vGy63k3Izv+UKTZEhbSdT721kb91oXkecpE
-EFhihfVYMGMEtC7u2JLSxdkRhWYSMqVCvI2syYsLAUUNH2kgqQF00j2Iddhg3oMA
-IiqhpC/n2slHVhp56WE1TsrGC/JgqIvQK9AT4LRxFb8CAwEAAaOCAQkwggEFMAkG
-A1UdEwQCMAAwEQYJYIZIAYb4QgEBBAQDAgZAMDMGCWCGSAGG+EIBDQQmFiRPcGVu
-U1NMIEdlbmVyYXRlZCBTZXJ2ZXIgQ2VydGlmaWNhdGUwHQYDVR0OBBYEFJK58uJe
-Lv8WDOR8TTLUcSxO1zCyMGwGA1UdIwRlMGOAFOPK44Eacedv7HbR2Igcbew+4kUa
-oUekRTBDMQswCQYDVQQGEwJHQjEQMA4GA1UECAwHRW5nbGFuZDEQMA4GA1UECgwH
-UEhQLm5ldDEQMA4GA1UEAwwHcGhwLm5ldIICEAAwDgYDVR0PAQH/BAQDAgWgMBMG
-A1UdJQQMMAoGCCsGAQUFBwMBMA0GCSqGSIb3DQEBCwUAA4ICAQDHayU795hFnQNj
-fuYV21sEmkSjgtp6X4rV9JfoCp8U2gieL4mizoCPx9Q8HYaAf98hPYTofGUaCSd+
-Xlzd8lhLt9GCU+BsCxGtJocrjOQDhyhkioN8iirQRTtJpRVC6a4RCBGpenOD7Z7C
-Z32uGXohzFuigP/J8/SXBdHrlpNSa03iEkkisPR46mbGj06lFVOFHJDNKA3CnQwM
-3VfqvZt0ksZi/gAOol8dtrAd3k5JBfJ2BtqsPbycEGAhsGrTK/MeqiFcO8QZiXpN
-qf0wZzOMFZJ4HqTiHs4TMMQaDK8c4qfR0l1OE224ijcB5NlqMjGAZabMfHgNZcl7
-fYPX+POsOMaqubv98uoC0PCK8NCTyfB4V/el72EEoVfwKYOxm3eYXBEE2ZNyIci6
-YKYhNa9e2k+cFueYMztV06HTGgkcHcSJATP+3ISTRx3tj1BPmc4O4WAMEMx1E0gg
-PaVrBVAylGzt8kaMaOQMBImpsALSfutq6+KtQiu0OTGS3yVUGamV4AyRjuwF1/ZA
-kZbjmNEGsf9d2rzS89ckds24QUx0zrfJ56p7lRvyVK/pML7iadv8dUH3fKDDDerD
-oocLjOjNxFGN9Woz+kfidA8Siu0zsfQ6CLPlaQrVAVQH4iMuCZraqMc3TqAiUKRj
-iHKp6FFrRZmY8W8HEKHv98uGofn+3g==
------END CERTIFICATE-----
diff --git a/ext/openssl/tests/sni_server_uk_key.pem b/ext/openssl/tests/sni_server_uk_key.pem
deleted file mode 100644
index 3baa6efd776e..000000000000
--- a/ext/openssl/tests/sni_server_uk_key.pem
+++ /dev/null
@@ -1,27 +0,0 @@
------BEGIN RSA PRIVATE KEY-----
-MIIEowIBAAKCAQEArMpFePSNUHNHCiUWfsSPQxHaQTpDfogEISIMuGq5JhEuHWyl
-HRe51JWZGi39a/PY9rAClfg/qqPnuxwFDoovhQsq9Kd0JnsXW11CMSqiBimf8vyg
-GE/V2DIOiex7Ab8+5zEL7cCrNyXfDk+DuoT7Np3jaSE/u31OMUAzFz4/EL7Zqzlk
-IMkHB/GSwLIJB8VbHt4Hunf28bLreTcjO/5QpNkSFtJ1PvbWRv3WheR5ykQQWGKF
-9VgwYwS0Lu7YktLF2RGFZhIypUK8jazJiwsBRQ0faSCpAXTSPYh12GDegwAiKqGk
-L+fayUdWGnnpYTVOysYL8mCoi9Ar0BPgtHEVvwIDAQABAoIBAGpg7XyWMxpAno/k
-XYEWSo0kRJa75CnWW5R6fhJbwjlpglajONQ8czAqGeRARDFeI0lc+3qRJ8FKv7Q2
-f/Z/pNnoEj4liiDWz350X/gdIztgDRVv6rCNFj7QMps/eEuPDo8PZySs5bxCGJ2a
-3qLKlE7/za4/xhkMAEPaHppEvFb15dpomqP2Fjqei9afp8tD+xJv9BGtkFIy9acw
-94AWQi974kgW7ZzfEf8RqHM0ExKiESCc26knbcBu0tQ892YHggMccUMk/UrVgR5d
-vuGOBurlYGLBstSDSKCCe6la4N/FX3FiC3WhVNescnuTZPXcX3zebh7roGjgrTdd
-6UJYBIECgYEA09XYihdwW66G9Y09OatzlzBh1Rvzjv2Vl5NmWHHb6vh38H4PcOof
-S1pT0JvRzpt8uEs4i+Eda5PyQyp4iGtD+DQ07Dxh2jiixsE3PRFRG2wg2QCgDHnS
-6vgV1VOqA/A4on4nhxLZXxhX4YvHaJYlm1bZ+amG+j5XiI/NtHJm9k8CgYEA0NB9
-bAoaZnc06+T8rMaO45boX5SvYsCZbtY3VRl75SrbMal0IKfnXHELVHuei12LmlMs
-LuFgG8jGO3+ncxUqMytoGvrmk/cM9tCNbDKVHtFbqz0qt9lkDAwLsBougKnVsNDW
-Aae/tz/wYXJct86unfLh0xtvkx5Iz1we4cS1fZECgYA8YR+vfK7R8xUUuIVTAsOX
-vHqmO6lYgH87DRCG9S0x9FB7g/LyxEjXOY/aTg+nTDpobUhY1nmESE8tRdXFTI27
-GWZcT3m0sZ/z9u6/wUfVAST7tWnpJHAx+TR/8bDsHnSGHF836O98Y3vpFeZosSNW
-+5J1zxRiD5LzocmIPXOLkQKBgEgHApxXx898YwbTj8zRGMysay89DFpV8RboUWHL
-To83/y/cMbBp+kZKwAu+MGwGMndjJSRunUY4NRik6c+qh0nrORfFX+++Efy4529g
-60scEDC7Apc0J2x4Yze1cED1VD6PaqJbiKffKD2UwyKr6lOVSgwVtKDcm2Tbc9OQ
-lMHhAoGBAIPwYVxzWM6I6pr8x2TucpBZZReLytz7uzybMNvbKCrwlETbNNXubnfp
-nPuPKzpeRI0y26pIIAbijzFW0MXq+kIu3H7we8TaImsJ1AaQCTYeoLWBVcr6RISk
-3d4i7iT35aWCuhPVve0FNIv/u3jrqX2H2C2MXMiLOsw1GFxPvpi4
------END RSA PRIVATE KEY-----
diff --git a/ext/openssl/tests/sni_server_us.pem b/ext/openssl/tests/sni_server_us.pem
deleted file mode 100644
index 170a8a96e75d..000000000000
--- a/ext/openssl/tests/sni_server_us.pem
+++ /dev/null
@@ -1,57 +0,0 @@
------BEGIN RSA PRIVATE KEY-----
-MIIEpQIBAAKCAQEA1QkC3tiNYDY+ZxMmPbagYUbMpzuXo9mVBvYh86bYZaeB7bts
-QCBK+6VD4D2LjR3RszpzmOzhJXjm8j0t+GeRS3OMIM75/BKAnixXicRSIb8zdIPz
-JP992vvMq8p46/XftAfBhAMOaCqcD85zpyX4PhfC9733nOyN4yqx58O4UhVTKih6
-W9/ldp3uwSYAW+HyoINnHls/bFO8vv60K5VIhkxK30LHnC5PvByGfuHOgrscEThs
-jW0ESqO0+9l88KhGdmLgzvbBlGxNziCMfn0LcFH6p2ITc3foD4LSzGEFtJ92OZi3
-buCOfbFsN7vWHTsEi89fRcCnWGtMwLUx0TCluQIDAQABAoIBAQCnsUQ1Lrl6trhA
-Yu6DPbLZX+XQ7jPbonaQ2Ea5iOhmfIjmHdaEU+cyV1EqvseO+Z4MO0KraiuAV79T
-h50cIEpa3kW7vbFCHz5nQ/hUVdlg/yT93rASu5rSOctOnz64Xv8Ms948kDtS+9eF
-Cbo4JMdX+VRbt4mmWP8HhqAsFACPexEoWxJcIxwFcI24GTGzySjemNjQzbmcVhzM
-a4k6n8DolCL1cRS54C5Aaf5g4+IFDgyydcgZXp1lnX3MnqivSNkejnPnY55NcmrH
-X3ZWPlAi9GHOJE33uy8bGWnip7Tn4iTt6tJvjz/yP82TGACDg1B8XsKrqsuQLsoU
-cNBVGcQBAoGBAPteCgNmuNOpo4SRA1UVRw1WgnE8YtnNA6vYyVcTLSpqabq33UaD
-03L9CQsbHtj88U+E8OH24Iqj3U9x7QJfH8DVmWuBrlwez80JsKGnLdViHydjKcAz
-H2Cbv+SiWeaWXkFCkN4Jf7k3q0Ew4SG2LOq5PVUy/NB4bilbJD2ExKpZAoGBANj2
-Hpwo35IQ4XfSSsGaCdn+8ajMcNUMMGZ6YkZqmVO4kogqobyrPL/2KE9ol/hlacw6
-U/6Digox5/wqruYfqyM8lqGOq2/0Xf7c4XfiOTS9Na4JN3OGzlyqPvcn2zdqhYFY
-iHPu2RqpA+LhCHW9Zs8C1Bp/KAEPdRP6OabqVaphAoGACLrHVj7nBFLL3vq6RuYq
-RYhPl2cld7LrAbjRpTiBRQvVCCsCgERrv36SJdSXSanfJ4fSZcaRHb97HBs0w/RR
-wfypC1bBm2lmhhRkEfkgWlzCADgtZwNff5dpHqOUw7FNLK8HIO7rhJ8uT2FHMEiH
-Xs94FdFjfknwaXdE1u4ZdmECgYEAgxfbkQHFbO2UPqErGGXp0/WOsS6ucpyF1jXW
-kbOxZ3vb1jjkNyrEbzzeSHTrdmRYk9UekWeLjfNvt9dWjKfP8V+XqJCbF+9wqCFw
-fs6LQEmfWMQq5DwtDqKznwVPGOHdPzVuZZaJSemb9oeAZBwINccAv+3bDyD23hZQ
-pYFsN6ECgYEA33QYDNG/spki4D8rlxyxZ+1MdB/efnrGBhO8FsJpG5+AtmYhWgD9
-sl29+3aiRkmDznoy36z+hoeZePILEAKMcbHyXOymixOHPuaZJ95hbvq6sqd6WMAe
-w5tHnxlfEuu11zatolk6WiAmTmG3sZpN5Tqloq0Ye4dvlhVKNV3Bn3E=
------END RSA PRIVATE KEY-----
------BEGIN CERTIFICATE-----
-MIIFIjCCAwqgAwIBAgICEAQwDQYJKoZIhvcNAQELBQAwVTELMAkGA1UEBhMCR0Ix
-EDAOBgNVBAgMB0VuZ2xhbmQxEDAOBgNVBAoMB1BIUC5uZXQxEDAOBgNVBAsMB29w
-ZW5zc2wxEDAOBgNVBAMMB3BocC5uZXQwHhcNMTgwMTE0MTgzNjQ0WhcNMjYwNDAy
-MTgzNjQ0WjBGMQswCQYDVQQGEwJHQjEQMA4GA1UECAwHRW5nbGFuZDEQMA4GA1UE
-CgwHUEhQLm5ldDETMBEGA1UEAwwKdXMucGhwLm5ldDCCASIwDQYJKoZIhvcNAQEB
-BQADggEPADCCAQoCggEBANUJAt7YjWA2PmcTJj22oGFGzKc7l6PZlQb2IfOm2GWn
-ge27bEAgSvulQ+A9i40d0bM6c5js4SV45vI9LfhnkUtzjCDO+fwSgJ4sV4nEUiG/
-M3SD8yT/fdr7zKvKeOv137QHwYQDDmgqnA/Oc6cl+D4Xwve995zsjeMqsefDuFIV
-Uyooelvf5Xad7sEmAFvh8qCDZx5bP2xTvL7+tCuVSIZMSt9Cx5wuT7wchn7hzoK7
-HBE4bI1tBEqjtPvZfPCoRnZi4M72wZRsTc4gjH59C3BR+qdiE3N36A+C0sxhBbSf
-djmYt27gjn2xbDe71h07BIvPX0XAp1hrTMC1MdEwpbkCAwEAAaOCAQkwggEFMAkG
-A1UdEwQCMAAwEQYJYIZIAYb4QgEBBAQDAgZAMDMGCWCGSAGG+EIBDQQmFiRPcGVu
-U1NMIEdlbmVyYXRlZCBTZXJ2ZXIgQ2VydGlmaWNhdGUwHQYDVR0OBBYEFOXnUeNs
-grKQb+EvG36DXjjDDmsFMGwGA1UdIwRlMGOAFOPK44Eacedv7HbR2Igcbew+4kUa
-oUekRTBDMQswCQYDVQQGEwJHQjEQMA4GA1UECAwHRW5nbGFuZDEQMA4GA1UECgwH
-UEhQLm5ldDEQMA4GA1UEAwwHcGhwLm5ldIICEAAwDgYDVR0PAQH/BAQDAgWgMBMG
-A1UdJQQMMAoGCCsGAQUFBwMBMA0GCSqGSIb3DQEBCwUAA4ICAQBDLwuLbx75ACSU
-5cF2L/D17JEnhlna62MgKNdpNLJSpaofK2Lk2BqsmnQf5JdkrXWMUN/DsmXZc9pq
-25XmprfABUP9Cx18KPVqLQ43Z9o+R9xI1Ospt5mrpxGp6l2BHSs/4G69nuPFpcIJ
-iabnLYdUk2Z+64lPe4EMBrZH+pj4xn3JA59BACJYNYn0nLaw45DIAyzyLJ0vVSwc
-0JtjsztXQov4UqdWXxLRFfe2nEGoK8ZkTJ8ELcCYu6sNSBjw9Ech78uXN1BQOBTK
-lhAgN3FKqOp3hqf0umqf35gDvmWwLB/eptUYZ96gBYT0tbPA0P+YsW+iZmamxXma
-Odgg8iRcPxKl9bVPt57NLaDy/RQhOxTGXQs1Q2jp7UhzqoZDClwVSDxd6DEppAFA
-OZAY+Rsrm7VoCwVQ/1KbcJHmJ/79tArvaWJk3KHLGMpdZq4KwrC3hM8/QxYtyX/6
-cfnXvShBYCdfTGgNlj3t/mNAgp1ZB3s9ClGqRBR/P0Db+ryv5DuxYM6nzEB3Od0y
-kT5tHbXDQY+1HCExjOMi7Al0cmC2r3+oxDA4UjGv+npgcfeoxQhXmm/SQRiPdKlb
-vT0D594sLoB23jqA9bMehpxEyI7eGjfFUmXwMeu0tJhipvpJI3ogJoM+SCFTyLkc
-12cPiz/sR/ALhvhUJXTeUH8wxPjzbA==
------END CERTIFICATE-----
diff --git a/ext/openssl/tests/sni_server_us_cert.pem b/ext/openssl/tests/sni_server_us_cert.pem
deleted file mode 100644
index 4452e3c6cfbf..000000000000
--- a/ext/openssl/tests/sni_server_us_cert.pem
+++ /dev/null
@@ -1,30 +0,0 @@
------BEGIN CERTIFICATE-----
-MIIFIjCCAwqgAwIBAgICEAQwDQYJKoZIhvcNAQELBQAwVTELMAkGA1UEBhMCR0Ix
-EDAOBgNVBAgMB0VuZ2xhbmQxEDAOBgNVBAoMB1BIUC5uZXQxEDAOBgNVBAsMB29w
-ZW5zc2wxEDAOBgNVBAMMB3BocC5uZXQwHhcNMTgwMTE0MTgzNjQ0WhcNMjYwNDAy
-MTgzNjQ0WjBGMQswCQYDVQQGEwJHQjEQMA4GA1UECAwHRW5nbGFuZDEQMA4GA1UE
-CgwHUEhQLm5ldDETMBEGA1UEAwwKdXMucGhwLm5ldDCCASIwDQYJKoZIhvcNAQEB
-BQADggEPADCCAQoCggEBANUJAt7YjWA2PmcTJj22oGFGzKc7l6PZlQb2IfOm2GWn
-ge27bEAgSvulQ+A9i40d0bM6c5js4SV45vI9LfhnkUtzjCDO+fwSgJ4sV4nEUiG/
-M3SD8yT/fdr7zKvKeOv137QHwYQDDmgqnA/Oc6cl+D4Xwve995zsjeMqsefDuFIV
-Uyooelvf5Xad7sEmAFvh8qCDZx5bP2xTvL7+tCuVSIZMSt9Cx5wuT7wchn7hzoK7
-HBE4bI1tBEqjtPvZfPCoRnZi4M72wZRsTc4gjH59C3BR+qdiE3N36A+C0sxhBbSf
-djmYt27gjn2xbDe71h07BIvPX0XAp1hrTMC1MdEwpbkCAwEAAaOCAQkwggEFMAkG
-A1UdEwQCMAAwEQYJYIZIAYb4QgEBBAQDAgZAMDMGCWCGSAGG+EIBDQQmFiRPcGVu
-U1NMIEdlbmVyYXRlZCBTZXJ2ZXIgQ2VydGlmaWNhdGUwHQYDVR0OBBYEFOXnUeNs
-grKQb+EvG36DXjjDDmsFMGwGA1UdIwRlMGOAFOPK44Eacedv7HbR2Igcbew+4kUa
-oUekRTBDMQswCQYDVQQGEwJHQjEQMA4GA1UECAwHRW5nbGFuZDEQMA4GA1UECgwH
-UEhQLm5ldDEQMA4GA1UEAwwHcGhwLm5ldIICEAAwDgYDVR0PAQH/BAQDAgWgMBMG
-A1UdJQQMMAoGCCsGAQUFBwMBMA0GCSqGSIb3DQEBCwUAA4ICAQBDLwuLbx75ACSU
-5cF2L/D17JEnhlna62MgKNdpNLJSpaofK2Lk2BqsmnQf5JdkrXWMUN/DsmXZc9pq
-25XmprfABUP9Cx18KPVqLQ43Z9o+R9xI1Ospt5mrpxGp6l2BHSs/4G69nuPFpcIJ
-iabnLYdUk2Z+64lPe4EMBrZH+pj4xn3JA59BACJYNYn0nLaw45DIAyzyLJ0vVSwc
-0JtjsztXQov4UqdWXxLRFfe2nEGoK8ZkTJ8ELcCYu6sNSBjw9Ech78uXN1BQOBTK
-lhAgN3FKqOp3hqf0umqf35gDvmWwLB/eptUYZ96gBYT0tbPA0P+YsW+iZmamxXma
-Odgg8iRcPxKl9bVPt57NLaDy/RQhOxTGXQs1Q2jp7UhzqoZDClwVSDxd6DEppAFA
-OZAY+Rsrm7VoCwVQ/1KbcJHmJ/79tArvaWJk3KHLGMpdZq4KwrC3hM8/QxYtyX/6
-cfnXvShBYCdfTGgNlj3t/mNAgp1ZB3s9ClGqRBR/P0Db+ryv5DuxYM6nzEB3Od0y
-kT5tHbXDQY+1HCExjOMi7Al0cmC2r3+oxDA4UjGv+npgcfeoxQhXmm/SQRiPdKlb
-vT0D594sLoB23jqA9bMehpxEyI7eGjfFUmXwMeu0tJhipvpJI3ogJoM+SCFTyLkc
-12cPiz/sR/ALhvhUJXTeUH8wxPjzbA==
------END CERTIFICATE-----
diff --git a/ext/openssl/tests/sni_server_us_key.pem b/ext/openssl/tests/sni_server_us_key.pem
deleted file mode 100644
index 8b0d73d7d63e..000000000000
--- a/ext/openssl/tests/sni_server_us_key.pem
+++ /dev/null
@@ -1,27 +0,0 @@
------BEGIN RSA PRIVATE KEY-----
-MIIEpQIBAAKCAQEA1QkC3tiNYDY+ZxMmPbagYUbMpzuXo9mVBvYh86bYZaeB7bts
-QCBK+6VD4D2LjR3RszpzmOzhJXjm8j0t+GeRS3OMIM75/BKAnixXicRSIb8zdIPz
-JP992vvMq8p46/XftAfBhAMOaCqcD85zpyX4PhfC9733nOyN4yqx58O4UhVTKih6
-W9/ldp3uwSYAW+HyoINnHls/bFO8vv60K5VIhkxK30LHnC5PvByGfuHOgrscEThs
-jW0ESqO0+9l88KhGdmLgzvbBlGxNziCMfn0LcFH6p2ITc3foD4LSzGEFtJ92OZi3
-buCOfbFsN7vWHTsEi89fRcCnWGtMwLUx0TCluQIDAQABAoIBAQCnsUQ1Lrl6trhA
-Yu6DPbLZX+XQ7jPbonaQ2Ea5iOhmfIjmHdaEU+cyV1EqvseO+Z4MO0KraiuAV79T
-h50cIEpa3kW7vbFCHz5nQ/hUVdlg/yT93rASu5rSOctOnz64Xv8Ms948kDtS+9eF
-Cbo4JMdX+VRbt4mmWP8HhqAsFACPexEoWxJcIxwFcI24GTGzySjemNjQzbmcVhzM
-a4k6n8DolCL1cRS54C5Aaf5g4+IFDgyydcgZXp1lnX3MnqivSNkejnPnY55NcmrH
-X3ZWPlAi9GHOJE33uy8bGWnip7Tn4iTt6tJvjz/yP82TGACDg1B8XsKrqsuQLsoU
-cNBVGcQBAoGBAPteCgNmuNOpo4SRA1UVRw1WgnE8YtnNA6vYyVcTLSpqabq33UaD
-03L9CQsbHtj88U+E8OH24Iqj3U9x7QJfH8DVmWuBrlwez80JsKGnLdViHydjKcAz
-H2Cbv+SiWeaWXkFCkN4Jf7k3q0Ew4SG2LOq5PVUy/NB4bilbJD2ExKpZAoGBANj2
-Hpwo35IQ4XfSSsGaCdn+8ajMcNUMMGZ6YkZqmVO4kogqobyrPL/2KE9ol/hlacw6
-U/6Digox5/wqruYfqyM8lqGOq2/0Xf7c4XfiOTS9Na4JN3OGzlyqPvcn2zdqhYFY
-iHPu2RqpA+LhCHW9Zs8C1Bp/KAEPdRP6OabqVaphAoGACLrHVj7nBFLL3vq6RuYq
-RYhPl2cld7LrAbjRpTiBRQvVCCsCgERrv36SJdSXSanfJ4fSZcaRHb97HBs0w/RR
-wfypC1bBm2lmhhRkEfkgWlzCADgtZwNff5dpHqOUw7FNLK8HIO7rhJ8uT2FHMEiH
-Xs94FdFjfknwaXdE1u4ZdmECgYEAgxfbkQHFbO2UPqErGGXp0/WOsS6ucpyF1jXW
-kbOxZ3vb1jjkNyrEbzzeSHTrdmRYk9UekWeLjfNvt9dWjKfP8V+XqJCbF+9wqCFw
-fs6LQEmfWMQq5DwtDqKznwVPGOHdPzVuZZaJSemb9oeAZBwINccAv+3bDyD23hZQ
-pYFsN6ECgYEA33QYDNG/spki4D8rlxyxZ+1MdB/efnrGBhO8FsJpG5+AtmYhWgD9
-sl29+3aiRkmDznoy36z+hoeZePILEAKMcbHyXOymixOHPuaZJ95hbvq6sqd6WMAe
-w5tHnxlfEuu11zatolk6WiAmTmG3sZpN5Tqloq0Ye4dvlhVKNV3Bn3E=
------END RSA PRIVATE KEY-----
diff --git a/ext/openssl/tests/stream_socket_get_crypto_status_basic.phpt b/ext/openssl/tests/stream_socket_get_crypto_status_basic.phpt
new file mode 100644
index 000000000000..b659eee79e78
--- /dev/null
+++ b/ext/openssl/tests/stream_socket_get_crypto_status_basic.phpt
@@ -0,0 +1,22 @@
+--TEST--
+stream_socket_get_crypto_status(): constants and behavior on a non-crypto stream
+--EXTENSIONS--
+openssl
+--FILE--
+
+--EXPECT--
+int(0)
+int(1)
+int(2)
+bool(true)
diff --git a/ext/openssl/tests/stream_socket_get_crypto_status_handshake.phpt b/ext/openssl/tests/stream_socket_get_crypto_status_handshake.phpt
new file mode 100644
index 000000000000..2a1c554a79d0
--- /dev/null
+++ b/ext/openssl/tests/stream_socket_get_crypto_status_handshake.phpt
@@ -0,0 +1,97 @@
+--TEST--
+stream_socket_get_crypto_status(): reports WANT_READ/WANT_WRITE during a non-blocking handshake
+--EXTENSIONS--
+openssl
+--SKIPIF--
+
+--FILE--
+ ['local_cert' => '%s']]);
+    $flags = STREAM_SERVER_BIND|STREAM_SERVER_LISTEN;
+    $server = stream_socket_server("tls://127.0.0.1:0", $errno, $errstr, $flags, $ctx);
+    phpt_notify_server_start($server);
+
+    $conn = stream_socket_accept($server, 30);
+    if ($conn) {
+        fwrite($conn, "ok\n");
+        phpt_wait();
+        fclose($conn);
+    }
+CODE;
+$serverCode = sprintf($serverCode, $certFile);
+
+/* Client connects over plain TCP, then completes the TLS handshake in non-blocking mode, using
+ *  the reported crypto status to select the right direction to wait on. */
+$clientCode = <<<'CODE'
+    $ctx = stream_context_create(['ssl' => [
+        'verify_peer' => false,
+        'verify_peer_name' => false,
+        'peer_name' => '%s',
+    ]]);
+
+    $client = stream_socket_client("tcp://{{ ADDR }}", $errno, $errstr, 30, STREAM_CLIENT_CONNECT, $ctx);
+    stream_set_blocking($client, false);
+
+    $sawWant = false;
+    $pendingAlwaysWant = true;
+
+    do {
+        $r = stream_socket_enable_crypto($client, true, STREAM_CRYPTO_METHOD_TLS_CLIENT);
+        if ($r === 0) {
+            $status = stream_socket_get_crypto_status($client);
+            if ($status === STREAM_CRYPTO_STATUS_WANT_READ
+                    || $status === STREAM_CRYPTO_STATUS_WANT_WRITE) {
+                $sawWant = true;
+            } else {
+                /* must never be NONE while the handshake is still pending */
+                $pendingAlwaysWant = false;
+            }
+
+            /* Wait on the direction the engine actually asked for. */
+            $read = $write = $except = null;
+            if ($status === STREAM_CRYPTO_STATUS_WANT_WRITE) {
+                $write = [$client];
+            } else {
+                $read = [$client];
+            }
+            stream_select($read, $write, $except, 1);
+        }
+    } while ($r === 0);
+
+    var_dump($r);
+    var_dump($sawWant);
+    var_dump($pendingAlwaysWant);
+    /* After a completed handshake the status is reset to NONE. */
+    var_dump(stream_socket_get_crypto_status($client) === STREAM_CRYPTO_STATUS_NONE);
+
+    stream_set_blocking($client, true);
+    echo trim(fgets($client)), "\n";
+    phpt_notify();
+    fclose($client);
+CODE;
+$clientCode = sprintf($clientCode, $peerName);
+
+include 'CertificateGenerator.inc';
+$certificateGenerator = new CertificateGenerator();
+$certificateGenerator->saveNewCertAsFileWithKey($peerName, $certFile);
+
+include 'ServerClientTestCase.inc';
+ServerClientTestCase::getInstance()->run($clientCode, $serverCode);
+?>
+--CLEAN--
+
+--EXPECT--
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+ok
diff --git a/ext/openssl/tests/stream_socket_get_crypto_status_read.phpt b/ext/openssl/tests/stream_socket_get_crypto_status_read.phpt
new file mode 100644
index 000000000000..308950a8ef03
--- /dev/null
+++ b/ext/openssl/tests/stream_socket_get_crypto_status_read.phpt
@@ -0,0 +1,95 @@
+--TEST--
+stream_socket_get_crypto_status(): reports WANT_READ on a non-blocking read with no application data
+--EXTENSIONS--
+openssl
+--SKIPIF--
+
+--FILE--
+ ['local_cert' => '%s']]);
+    $flags = STREAM_SERVER_BIND|STREAM_SERVER_LISTEN;
+    $server = stream_socket_server("tls://127.0.0.1:0", $errno, $errstr, $flags, $ctx);
+    phpt_notify_server_start($server);
+
+    $conn = stream_socket_accept($server, 30);
+
+    /* Do not send anything until the client has performed its first read, so that the read is
+     * guaranteed to find no application data. */
+    phpt_wait();
+    fwrite($conn, "hello\n");
+
+    phpt_wait();
+    fclose($conn);
+CODE;
+$serverCode = sprintf($serverCode, $certFile);
+
+$clientCode = <<<'CODE'
+    $ctx = stream_context_create(['ssl' => [
+        'verify_peer' => false,
+        'verify_peer_name' => false,
+        'peer_name' => '%s',
+    ]]);
+
+    $client = stream_socket_client("tls://{{ ADDR }}", $errno, $errstr, 30, STREAM_CLIENT_CONNECT, $ctx);
+    stream_set_blocking($client, false);
+
+    /* No application data has been sent yet - a non-blocking read returns nothing and the crypto
+     * status reflects that the OpenSSL wants to read. */
+    $data = fread($client, 100);
+    var_dump($data === '' || $data === false);
+    var_dump(stream_socket_get_crypto_status($client) === STREAM_CRYPTO_STATUS_WANT_READ);
+
+    /* Now let the server send. */
+    phpt_notify();
+
+    $buf = '';
+    $read = [$client];
+    $write = $except = null;
+    while (stream_select($read, $write, $except, 5)) {
+        $chunk = fread($client, 100);
+        if ($chunk === '' || $chunk === false) {
+            /* A non-application record (e.g. a TLS 1.3 session ticket) may arrive first. */
+            if (feof($client)) {
+                break;
+            }
+        } else {
+            $buf .= $chunk;
+            if (strlen($buf) >= 6) {
+                break;
+            }
+        }
+        $read = [$client];
+        $write = $except = null;
+    }
+
+    echo trim($buf), "\n";
+    /* A successful read clears the pending status back to NONE. */
+    var_dump(stream_socket_get_crypto_status($client) === STREAM_CRYPTO_STATUS_NONE);
+
+    phpt_notify();
+    fclose($client);
+CODE;
+$clientCode = sprintf($clientCode, $peerName);
+
+include 'CertificateGenerator.inc';
+$certificateGenerator = new CertificateGenerator();
+$certificateGenerator->saveNewCertAsFileWithKey($peerName, $certFile);
+
+include 'ServerClientTestCase.inc';
+ServerClientTestCase::getInstance()->run($clientCode, $serverCode);
+?>
+--CLEAN--
+
+--EXPECT--
+bool(true)
+bool(true)
+hello
+bool(true)
diff --git a/ext/openssl/tests/tls_psk_callback_not_callable.phpt b/ext/openssl/tests/tls_psk_callback_not_callable.phpt
new file mode 100644
index 000000000000..29382e2a13ab
--- /dev/null
+++ b/ext/openssl/tests/tls_psk_callback_not_callable.phpt
@@ -0,0 +1,46 @@
+--TEST--
+TLS PSK callback option must be a valid callable
+--EXTENSIONS--
+openssl
+--SKIPIF--
+
+--FILE--
+ [
+        'crypto_method' => STREAM_CRYPTO_METHOD_TLSv1_2_SERVER,
+        'ciphers' => 'PSK',
+        'psk_server_cb' => function ($stream, string $identity): ?Openssl\Psk {
+            return new Openssl\Psk("k", "id");
+        },
+    ]]);
+    $server = stream_socket_server('tls://127.0.0.1:0', $errno, $errstr,
+        STREAM_SERVER_BIND | STREAM_SERVER_LISTEN, $serverCtx);
+    phpt_notify_server_start($server);
+    @stream_socket_accept($server, 3);
+CODE;
+
+$clientCode = <<<'CODE'
+    $clientCtx = stream_context_create(['ssl' => [
+        'crypto_method' => STREAM_CRYPTO_METHOD_TLSv1_2_CLIENT,
+        'ciphers' => 'PSK',
+        'verify_peer' => false,
+        'psk_client_cb' => 'php_openssl_no_such_function',
+    ]]);
+    try {
+        @stream_socket_client('tls://{{ ADDR }}', $errno, $errstr,
+            5, STREAM_CLIENT_CONNECT, $clientCtx);
+        echo "no exception\n";
+    } catch (TypeError $e) {
+        echo "caught: ", $e->getMessage(), "\n";
+    }
+CODE;
+
+include __DIR__ . '/ServerClientTestCase.inc';
+ServerClientTestCase::getInstance()->run($clientCode, $serverCode);
+?>
+--EXPECTF--
+caught: psk_client_cb must be a valid callback, %s
+
diff --git a/ext/openssl/tests/tls_psk_callback_wrong_type.phpt b/ext/openssl/tests/tls_psk_callback_wrong_type.phpt
new file mode 100644
index 000000000000..78d950f19974
--- /dev/null
+++ b/ext/openssl/tests/tls_psk_callback_wrong_type.phpt
@@ -0,0 +1,48 @@
+--TEST--
+TLS PSK client callback returning wrong type raises TypeError
+--EXTENSIONS--
+openssl
+--SKIPIF--
+
+--FILE--
+ [
+        'crypto_method' => STREAM_CRYPTO_METHOD_TLSv1_2_SERVER,
+        'ciphers' => 'PSK',
+        'psk_server_cb' => function ($stream, string $identity): ?Openssl\Psk {
+            return new Openssl\Psk("k", "id");
+        },
+    ]]);
+    $server = stream_socket_server('tls://127.0.0.1:0', $errno, $errstr,
+        STREAM_SERVER_BIND | STREAM_SERVER_LISTEN, $serverCtx);
+    phpt_notify_server_start($server);
+    @stream_socket_accept($server, 3);
+CODE;
+
+$clientCode = <<<'CODE'
+    $clientCtx = stream_context_create(['ssl' => [
+        'crypto_method' => STREAM_CRYPTO_METHOD_TLSv1_2_CLIENT,
+        'ciphers' => 'PSK',
+        'verify_peer' => false,
+        'psk_client_cb' => function ($stream) {
+            /* Returning a string instead of Openssl\Psk|null. */
+            return "not a Psk object";
+        },
+    ]]);
+    try {
+        @stream_socket_client('tls://{{ ADDR }}', $errno, $errstr,
+            5, STREAM_CLIENT_CONNECT, $clientCtx);
+        echo "no exception\n";
+    } catch (TypeError $e) {
+        echo "caught: ", $e->getMessage(), "\n";
+    }
+CODE;
+
+include __DIR__ . '/ServerClientTestCase.inc';
+ServerClientTestCase::getInstance()->run($clientCode, $serverCode);
+?>
+--EXPECT--
+caught: PSK callback must return Openssl\Psk or null
diff --git a/ext/openssl/tests/tls_psk_client_callback_null.phpt b/ext/openssl/tests/tls_psk_client_callback_null.phpt
new file mode 100644
index 000000000000..92d970908c8e
--- /dev/null
+++ b/ext/openssl/tests/tls_psk_client_callback_null.phpt
@@ -0,0 +1,45 @@
+--TEST--
+TLS 1.2 PSK: client callback returning null aborts handshake (no shared cipher)
+--EXTENSIONS--
+openssl
+--SKIPIF--
+
+--FILE--
+ [
+        'crypto_method' => STREAM_CRYPTO_METHOD_TLSv1_2_SERVER,
+        'ciphers' => 'PSK',
+        'psk_server_cb' => function ($stream, string $identity): ?Openssl\Psk {
+            return new Openssl\Psk("doesnotmatter", null);
+        },
+    ]]);
+    $server = stream_socket_server('tls://127.0.0.1:0', $errno, $errstr,
+        STREAM_SERVER_BIND | STREAM_SERVER_LISTEN, $serverCtx);
+    phpt_notify_server_start($server);
+    @stream_socket_accept($server, 3);
+CODE;
+
+$clientCode = <<<'CODE'
+    $clientCtx = stream_context_create(['ssl' => [
+        'crypto_method' => STREAM_CRYPTO_METHOD_TLSv1_2_CLIENT,
+        'ciphers' => 'PSK',
+        'verify_peer' => false,
+        'psk_client_cb' => function ($stream): ?Openssl\Psk {
+            /* Reject: no PSK to use, no other ciphers offered. */
+            return null;
+        },
+    ]]);
+    $client = @stream_socket_client('tls://{{ ADDR }}', $errno, $errstr,
+        5, STREAM_CLIENT_CONNECT, $clientCtx);
+    var_dump($client);
+CODE;
+
+include __DIR__ . '/ServerClientTestCase.inc';
+ServerClientTestCase::getInstance()->run($clientCode, $serverCode);
+?>
+--EXPECT--
+bool(false)
+
diff --git a/ext/openssl/tests/tls_psk_client_callback_throws.phpt b/ext/openssl/tests/tls_psk_client_callback_throws.phpt
new file mode 100644
index 000000000000..13b2d71476c2
--- /dev/null
+++ b/ext/openssl/tests/tls_psk_client_callback_throws.phpt
@@ -0,0 +1,48 @@
+--TEST--
+TLS PSK client callback throwing exception propagates to stream_socket_client caller
+--EXTENSIONS--
+openssl
+--SKIPIF--
+
+--FILE--
+ [
+        'crypto_method' => STREAM_CRYPTO_METHOD_TLSv1_2_SERVER,
+        'ciphers' => 'PSK',
+        'psk_server_cb' => function ($stream, string $identity): ?Openssl\Psk {
+            return new Openssl\Psk("k", "id");
+        },
+    ]]);
+    $server = stream_socket_server('tls://127.0.0.1:0', $errno, $errstr,
+        STREAM_SERVER_BIND | STREAM_SERVER_LISTEN, $serverCtx);
+    phpt_notify_server_start($server);
+    @stream_socket_accept($server, 3);
+CODE;
+
+$clientCode = <<<'CODE'
+    $clientCtx = stream_context_create(['ssl' => [
+        'crypto_method' => STREAM_CRYPTO_METHOD_TLSv1_2_CLIENT,
+        'ciphers' => 'PSK',
+        'verify_peer' => false,
+        'psk_client_cb' => function ($stream): ?Openssl\Psk {
+            throw new RuntimeException('callback boom');
+        },
+    ]]);
+    try {
+        @stream_socket_client('tls://{{ ADDR }}', $errno, $errstr,
+            5, STREAM_CLIENT_CONNECT, $clientCtx);
+        echo "no exception\n";
+    } catch (RuntimeException $e) {
+        echo "caught: ", $e->getMessage(), "\n";
+    }
+CODE;
+
+include __DIR__ . '/ServerClientTestCase.inc';
+ServerClientTestCase::getInstance()->run($clientCode, $serverCode);
+?>
+--EXPECT--
+caught: callback boom
+
diff --git a/ext/openssl/tests/tls_psk_client_no_identity.phpt b/ext/openssl/tests/tls_psk_client_no_identity.phpt
new file mode 100644
index 000000000000..bfc8d078ceff
--- /dev/null
+++ b/ext/openssl/tests/tls_psk_client_no_identity.phpt
@@ -0,0 +1,49 @@
+--TEST--
+TLS PSK client callback must return Openssl\Psk with a non-null identity
+--EXTENSIONS--
+openssl
+--SKIPIF--
+
+--FILE--
+ [
+        'crypto_method' => STREAM_CRYPTO_METHOD_TLSv1_2_SERVER,
+        'ciphers' => 'PSK',
+        'psk_server_cb' => function ($stream, string $identity): ?Openssl\Psk {
+            return new Openssl\Psk("k", "id");
+        },
+    ]]);
+    $server = stream_socket_server('tls://127.0.0.1:0', $errno, $errstr,
+        STREAM_SERVER_BIND | STREAM_SERVER_LISTEN, $serverCtx);
+    phpt_notify_server_start($server);
+    @stream_socket_accept($server, 3);
+CODE;
+
+$clientCode = <<<'CODE'
+    $clientCtx = stream_context_create(['ssl' => [
+        'crypto_method' => STREAM_CRYPTO_METHOD_TLSv1_2_CLIENT,
+        'ciphers' => 'PSK',
+        'verify_peer' => false,
+        'psk_client_cb' => function ($stream): ?Openssl\Psk {
+            /* No identity supplied. */
+            return new Openssl\Psk(str_repeat("\x42", 16));
+        },
+    ]]);
+    try {
+        @stream_socket_client('tls://{{ ADDR }}', $errno, $errstr,
+            5, STREAM_CLIENT_CONNECT, $clientCtx);
+        echo "no exception\n";
+    } catch (ValueError $e) {
+        echo "caught: ", $e->getMessage(), "\n";
+    }
+CODE;
+
+include __DIR__ . '/ServerClientTestCase.inc';
+ServerClientTestCase::getInstance()->run($clientCode, $serverCode);
+?>
+--EXPECT--
+caught: Client PSK callback must return Openssl\Psk with a non-null identity
+
diff --git a/ext/openssl/tests/tls_psk_mismatch.phpt b/ext/openssl/tests/tls_psk_mismatch.phpt
new file mode 100644
index 000000000000..8fa90d115c5a
--- /dev/null
+++ b/ext/openssl/tests/tls_psk_mismatch.phpt
@@ -0,0 +1,44 @@
+--TEST--
+TLS 1.2 PSK: mismatching key material aborts handshake
+--EXTENSIONS--
+openssl
+--SKIPIF--
+
+--FILE--
+ [
+        'crypto_method' => STREAM_CRYPTO_METHOD_TLSv1_2_SERVER,
+        'ciphers' => 'PSK',
+        'psk_server_cb' => function ($stream, string $identity): ?Openssl\Psk {
+            return new Openssl\Psk(str_repeat("\x11", 16), $identity);
+        },
+    ]]);
+    $server = stream_socket_server('tls://127.0.0.1:0', $errno, $errstr,
+        STREAM_SERVER_BIND | STREAM_SERVER_LISTEN, $serverCtx);
+    phpt_notify_server_start($server);
+    @stream_socket_accept($server, 3);
+CODE;
+
+$clientCode = <<<'CODE'
+    $clientCtx = stream_context_create(['ssl' => [
+        'crypto_method' => STREAM_CRYPTO_METHOD_TLSv1_2_CLIENT,
+        'ciphers' => 'PSK',
+        'verify_peer' => false,
+        'psk_client_cb' => function ($stream): ?Openssl\Psk {
+            return new Openssl\Psk(str_repeat("\x22", 16), 'id');
+        },
+    ]]);
+    $client = @stream_socket_client('tls://{{ ADDR }}', $errno, $errstr,
+        5, STREAM_CLIENT_CONNECT, $clientCtx);
+    var_dump($client);
+CODE;
+
+include __DIR__ . '/ServerClientTestCase.inc';
+ServerClientTestCase::getInstance()->run($clientCode, $serverCode);
+?>
+--EXPECT--
+bool(false)
+
diff --git a/ext/openssl/tests/tls_psk_tls12_basic.phpt b/ext/openssl/tests/tls_psk_tls12_basic.phpt
new file mode 100644
index 000000000000..2f2a558c4b40
--- /dev/null
+++ b/ext/openssl/tests/tls_psk_tls12_basic.phpt
@@ -0,0 +1,62 @@
+--TEST--
+TLS 1.2 PSK basic client/server round-trip
+--EXTENSIONS--
+openssl
+--SKIPIF--
+= 1.1.1 required");
+?>
+--FILE--
+ [
+        'crypto_method' => STREAM_CRYPTO_METHOD_TLSv1_2_SERVER,
+        'ciphers' => 'PSK',
+        'psk_server_cb' => function ($stream, string $identity): ?Openssl\Psk {
+            if ($identity === 'client_id') {
+                return new Openssl\Psk("\x00\x11\x22\x33\x44\x55\x66\x77\x88\x99\xaa\xbb\xcc\xdd\xee\xff");
+            }
+            return null;
+        },
+    ]]);
+    $server = stream_socket_server('tls://127.0.0.1:0', $errno, $errstr,
+        STREAM_SERVER_BIND | STREAM_SERVER_LISTEN, $serverCtx);
+    phpt_notify_server_start($server);
+    $client = stream_socket_accept($server, 30);
+    fwrite($client, "hello-from-server");
+    fread($client, 1024);
+    fclose($client);
+CODE;
+
+$clientCode = <<<'CODE'
+    $clientCtx = stream_context_create(['ssl' => [
+        'crypto_method' => STREAM_CRYPTO_METHOD_TLSv1_2_CLIENT,
+        'ciphers' => 'PSK',
+        'verify_peer' => false,
+        'verify_peer_name' => false,
+        'psk_client_cb' => function ($stream): ?Openssl\Psk {
+            return new Openssl\Psk(
+                "\x00\x11\x22\x33\x44\x55\x66\x77\x88\x99\xaa\xbb\xcc\xdd\xee\xff",
+                'client_id'
+            );
+        },
+    ]]);
+    $client = stream_socket_client('tls://{{ ADDR }}', $errno, $errstr,
+        30, STREAM_CLIENT_CONNECT, $clientCtx);
+    var_dump($client !== false);
+    var_dump(fread($client, 1024));
+    fwrite($client, "hello-from-client");
+    /* Verify PSK was used (no peer cert) */
+    $params = stream_context_get_params($client);
+    var_dump(isset($params['options']['ssl']['peer_certificate']));
+    fclose($client);
+CODE;
+
+include __DIR__ . '/ServerClientTestCase.inc';
+ServerClientTestCase::getInstance()->run($clientCode, $serverCode);
+?>
+--EXPECT--
+bool(true)
+string(17) "hello-from-server"
+bool(false)
diff --git a/ext/openssl/tests/tls_psk_tls13_basic.phpt b/ext/openssl/tests/tls_psk_tls13_basic.phpt
new file mode 100644
index 000000000000..a7642624252a
--- /dev/null
+++ b/ext/openssl/tests/tls_psk_tls13_basic.phpt
@@ -0,0 +1,55 @@
+--TEST--
+TLS 1.3 PSK basic client/server round-trip
+--EXTENSIONS--
+openssl
+--SKIPIF--
+
+--FILE--
+ [
+        'crypto_method' => STREAM_CRYPTO_METHOD_TLSv1_3_SERVER,
+        'psk_server_cb' => function ($stream, string $identity): ?Openssl\Psk {
+            if ($identity === 'tls13-client') {
+                return new Openssl\Psk(str_repeat("\x42", 32));
+            }
+            return null;
+        },
+    ]]);
+    $server = stream_socket_server('tls://127.0.0.1:0', $errno, $errstr,
+        STREAM_SERVER_BIND | STREAM_SERVER_LISTEN, $serverCtx);
+    phpt_notify_server_start($server);
+    $client = stream_socket_accept($server, 30);
+    fwrite($client, "tls13-psk-ok");
+    fclose($client);
+CODE;
+
+$clientCode = <<<'CODE'
+    $clientCtx = stream_context_create(['ssl' => [
+        'crypto_method' => STREAM_CRYPTO_METHOD_TLSv1_3_CLIENT,
+        'verify_peer' => false,
+        'verify_peer_name' => false,
+        'psk_client_cb' => function ($stream): ?Openssl\Psk {
+            return new Openssl\Psk(str_repeat("\x42", 32), 'tls13-client');
+        },
+    ]]);
+    $client = stream_socket_client('tls://{{ ADDR }}', $errno, $errstr,
+        30, STREAM_CLIENT_CONNECT, $clientCtx);
+    var_dump($client !== false);
+    var_dump(fread($client, 1024));
+    /* TLS 1.3 PSK: no peer cert */
+    $params = stream_context_get_params($client);
+    var_dump(isset($params['options']['ssl']['peer_certificate']));
+    fclose($client);
+CODE;
+
+include __DIR__ . '/ServerClientTestCase.inc';
+ServerClientTestCase::getInstance()->run($clientCode, $serverCode);
+?>
+--EXPECT--
+bool(true)
+string(12) "tls13-psk-ok"
+bool(false)
diff --git a/ext/openssl/tests/tls_psk_tls13_unknown_identity.phpt b/ext/openssl/tests/tls_psk_tls13_unknown_identity.phpt
new file mode 100644
index 000000000000..830c02449dc9
--- /dev/null
+++ b/ext/openssl/tests/tls_psk_tls13_unknown_identity.phpt
@@ -0,0 +1,44 @@
+--TEST--
+TLS 1.3 PSK: server rejects unknown identity (no cert fallback)
+--EXTENSIONS--
+openssl
+--SKIPIF--
+
+--FILE--
+ [
+        'crypto_method' => STREAM_CRYPTO_METHOD_TLSv1_3_SERVER,
+        'psk_server_cb' => function ($stream, string $identity): ?Openssl\Psk {
+            return null;
+        },
+    ]]);
+    $server = stream_socket_server('tls://127.0.0.1:0', $errno, $errstr,
+        STREAM_SERVER_BIND | STREAM_SERVER_LISTEN, $serverCtx);
+    phpt_notify_server_start($server);
+    @stream_socket_accept($server, 3);
+CODE;
+
+$clientCode = <<<'CODE'
+    $clientCtx = stream_context_create(['ssl' => [
+        'crypto_method' => STREAM_CRYPTO_METHOD_TLSv1_3_CLIENT,
+        'verify_peer' => false,
+        'verify_peer_name' => false,
+        'psk_client_cb' => function ($stream): ?Openssl\Psk {
+            return new Openssl\Psk(str_repeat("\x42", 32), 'unknown-id');
+        },
+    ]]);
+    $client = @stream_socket_client('tls://{{ ADDR }}', $errno, $errstr,
+        5, STREAM_CLIENT_CONNECT, $clientCtx);
+    var_dump($client);
+CODE;
+
+include __DIR__ . '/ServerClientTestCase.inc';
+ServerClientTestCase::getInstance()->run($clientCode, $serverCode);
+?>
+--EXPECT--
+bool(false)
+
diff --git a/ext/openssl/xp_ssl.c b/ext/openssl/xp_ssl.c
index bd174f30095c..a154aa4572f7 100644
--- a/ext/openssl/xp_ssl.c
+++ b/ext/openssl/xp_ssl.c
@@ -1,14 +1,12 @@
 /*
   +----------------------------------------------------------------------+
-  | Copyright (c) The PHP Group                                          |
+  | Copyright © The PHP Group and Contributors.                          |
   +----------------------------------------------------------------------+
-  | This source file is subject to version 3.01 of the PHP license,      |
-  | that is bundled with this package in the file LICENSE, and is        |
-  | available through the world-wide-web at the following url:           |
-  | https://www.php.net/license/3_01.txt                                 |
-  | If you did not receive a copy of the PHP license and are unable to   |
-  | obtain it through the world-wide-web, please send a note to          |
-  | license@php.net so we can mail you a copy immediately.               |
+  | This source file is subject to the Modified BSD License that is      |
+  | bundled with this package in the file LICENSE, and is available      |
+  | through the World Wide Web at .        |
+  |                                                                      |
+  | SPDX-License-Identifier: BSD-3-Clause                                |
   +----------------------------------------------------------------------+
   | Authors: Wez Furlong                           |
   |          Daniel Lowrey                             |
@@ -128,10 +126,6 @@
 #define GET_VER_OPT_LONG(_name, _num) \
 	if (GET_VER_OPT(_name)) _num = zval_get_long(val)
 
-/* Used for peer verification in windows */
-#define PHP_X509_NAME_ENTRY_TO_UTF8(ne, i, out) \
-	ASN1_STRING_to_UTF8(&out, X509_NAME_ENTRY_get_data(X509_NAME_get_entry(ne, i)))
-
 #ifdef HAVE_IPV6
 /* Used for IPv6 Address peer verification */
 #define EXPAND_IPV6_ADDRESS(_str, _bytes) \
@@ -182,6 +176,25 @@ typedef struct _php_openssl_alpn_ctx_t {
 } php_openssl_alpn_ctx;
 #endif
 
+/* TLS 1.3 PSK ciphersuite IDs */
+static const unsigned char php_openssl_tls13_aes128gcmsha256_id[] = { 0x13, 0x01 };
+static const unsigned char php_openssl_tls13_aes256gcmsha384_id[] = { 0x13, 0x02 };
+
+/* Holds PSK callbacks */
+typedef struct _php_openssl_psk_callbacks_t {
+	int refcount;
+	zend_fcall_info_cache client_cb;
+	zend_fcall_info_cache server_cb;
+} php_openssl_psk_callbacks_t;
+
+/* Holds session callback */
+typedef struct _php_openssl_session_callbacks_t {
+	int refcount;
+	zend_fcall_info_cache new_cb;
+	zend_fcall_info_cache get_cb;
+	zend_fcall_info_cache remove_cb;
+} php_openssl_session_callbacks_t;
+
 /* This implementation is very closely tied to the that of the native
  * sockets implemented in the core.
  * Don't try this technique in other extensions!
@@ -194,6 +207,7 @@ typedef struct _php_openssl_netstream_data_t {
 	int enable_on_connect;
 	int is_client;
 	int ssl_active;
+	int last_status;
 	php_stream_xport_crypt_method_t method;
 	php_openssl_handshake_bucket_t *reneg;
 	php_openssl_sni_cert_t *sni_certs;
@@ -201,6 +215,12 @@ typedef struct _php_openssl_netstream_data_t {
 #ifdef HAVE_TLS_ALPN
 	php_openssl_alpn_ctx alpn_ctx;
 #endif
+	php_openssl_session_callbacks_t *session_callbacks;
+	php_openssl_psk_callbacks_t *psk_callbacks;
+	/* Identity buffer for TLS 1.3 client PSK whose lifetime outlives the
+	 * psk_use_session_cb call but OpenSSL doesn't free it, so we own it. */
+	unsigned char *psk_identity_buf;
+	size_t psk_identity_len;
 	char *url_name;
 	unsigned state_set:1;
 	unsigned _spare:31;
@@ -252,6 +272,10 @@ static int php_openssl_handle_ssl_error(php_stream *stream, int nr_bytes, bool i
 			 * packets: retry in next iteration */
 			errno = EAGAIN;
 			retry = is_init ? true : sslsock->s.is_blocked;
+			if (!retry) {
+				sslsock->last_status = err == SSL_ERROR_WANT_READ ? 
+						STREAM_CRYPTO_STATUS_WANT_READ : STREAM_CRYPTO_STATUS_WANT_WRITE;
+			}
 			break;
 		case SSL_ERROR_SYSCALL:
 			if (ERR_peek_error() == 0) {
@@ -415,7 +439,7 @@ static bool php_openssl_x509_fingerprint_match(X509 *peer, zval *val)
 
 static bool php_openssl_matches_wildcard_name(const char *subjectname, const char *certname) /* {{{ */
 {
-	char *wildcard = NULL;
+	const char *wildcard = NULL;
 	ptrdiff_t prefix_len;
 	size_t suffix_len, subject_len;
 
@@ -474,7 +498,10 @@ static bool php_openssl_matches_san_list(X509 *peer, const char *subject_name) /
 		GENERAL_NAME *san = sk_GENERAL_NAME_value(alt_names, i);
 
 		if (san->type == GEN_DNS) {
-			ASN1_STRING_to_UTF8(&cert_name, san->d.dNSName);
+			if (ASN1_STRING_to_UTF8(&cert_name, san->d.dNSName) < 0) {
+				/* TODO: warn ? */
+				continue;
+			}
 			if ((size_t)ASN1_STRING_length(san->d.dNSName) != strlen((const char*)cert_name)) {
 				OPENSSL_free(cert_name);
 				/* prevent null-byte poisoning*/
@@ -495,12 +522,12 @@ static bool php_openssl_matches_san_list(X509 *peer, const char *subject_name) /
 			}
 			OPENSSL_free(cert_name);
 		} else if (san->type == GEN_IPADD) {
-			if (san->d.iPAddress->length == 4) {
+			if (ASN1_STRING_length(san->d.iPAddress) == 4) {
 				snprintf(ipbuffer, sizeof(ipbuffer), "%d.%d.%d.%d",
-					san->d.iPAddress->data[0],
-					san->d.iPAddress->data[1],
-					san->d.iPAddress->data[2],
-					san->d.iPAddress->data[3]
+					ASN1_STRING_get0_data(san->d.iPAddress)[0],
+					ASN1_STRING_get0_data(san->d.iPAddress)[1],
+					ASN1_STRING_get0_data(san->d.iPAddress)[2],
+					ASN1_STRING_get0_data(san->d.iPAddress)[3]
 				);
 				if (strcasecmp(subject_name, (const char*)ipbuffer) == 0) {
 					sk_GENERAL_NAME_pop_free(alt_names, GENERAL_NAME_free);
@@ -509,9 +536,9 @@ static bool php_openssl_matches_san_list(X509 *peer, const char *subject_name) /
 				}
 			}
 #ifdef HAVE_IPV6_SAN
-			else if (san->d.ip->length == 16 && subject_name_is_ipv6) {
+			else if (ASN1_STRING_length(san->d.ip) == 16 && subject_name_is_ipv6) {
 				ipbuffer[0] = 0;
-				EXPAND_IPV6_ADDRESS(ipbuffer, san->d.iPAddress->data);
+				EXPAND_IPV6_ADDRESS(ipbuffer, ASN1_STRING_get0_data(san->d.iPAddress));
 				if (strcasecmp((const char*)subject_name_ipv6_expanded, (const char*)ipbuffer) == 0) {
 					sk_GENERAL_NAME_pop_free(alt_names, GENERAL_NAME_free);
 
@@ -857,8 +884,9 @@ static long php_openssl_load_stream_cafile(X509_STORE *cert_store, const char *c
 		buffer_active = 0;
 		if (cert && X509_STORE_add_cert(cert_store, cert)) {
 			++certs_added;
-			X509_free(cert);
 		}
+		/* TODO: notify user when adding certificate failed? */
+		X509_free(cert);
 		goto cert_start;
 	}
 
@@ -880,16 +908,16 @@ static long php_openssl_load_stream_cafile(X509_STORE *cert_store, const char *c
 static zend_result php_openssl_enable_peer_verification(SSL_CTX *ctx, php_stream *stream) /* {{{ */
 {
 	zval *val = NULL;
-	char *cafile = NULL;
-	char *capath = NULL;
+	const char *cafile = NULL;
+	const char *capath = NULL;
 	php_openssl_netstream_data_t *sslsock = (php_openssl_netstream_data_t*)stream->abstract;
 
 	GET_VER_OPT_STRING("cafile", cafile);
 	GET_VER_OPT_STRING("capath", capath);
 
 	if (cafile == NULL) {
-		cafile = zend_ini_string("openssl.cafile", sizeof("openssl.cafile")-1, 0);
-		cafile = strlen(cafile) ? cafile : NULL;
+		const zend_string *cafile_str = zend_ini_str_literal("openssl.cafile");
+		cafile = ZSTR_LEN(cafile_str) ? ZSTR_VAL(cafile_str) : NULL;
 	} else if (!sslsock->is_client) {
 		/* Servers need to load and assign CA names from the cafile */
 		STACK_OF(X509_NAME) *cert_names = SSL_load_client_CA_file(cafile);
@@ -902,8 +930,8 @@ static zend_result php_openssl_enable_peer_verification(SSL_CTX *ctx, php_stream
 	}
 
 	if (capath == NULL) {
-		capath = zend_ini_string("openssl.capath", sizeof("openssl.capath")-1, 0);
-		capath = strlen(capath) ? capath : NULL;
+		const zend_string *capath_str = zend_ini_str_literal("openssl.capath");
+		capath = ZSTR_LEN(capath_str) ? ZSTR_VAL(capath_str) : NULL;
 	}
 
 	if (cafile || capath) {
@@ -1303,6 +1331,10 @@ static SSL_CTX *php_openssl_create_sni_server_ctx(char *cert_path, char *key_pat
 	/* The hello method is not inherited by SSL structs when assigning a new context
 	 * inside the SNI callback, so the just use SSLv23 */
 	SSL_CTX *ctx = SSL_CTX_new(SSLv23_server_method());
+	if (!ctx) {
+		php_error_docref(NULL, E_WARNING, "Failed to create the SSL context");
+		return NULL;
+	}
 
 	if (SSL_CTX_use_certificate_chain_file(ctx, cert_path) != 1) {
 		php_error_docref(NULL, E_WARNING,
@@ -1508,7 +1540,7 @@ static unsigned char *php_openssl_alpn_protos_parse(unsigned short *outlen, cons
 		return NULL;
 	}
 
-	out = emalloc(strlen(in) + 1);
+	out = emalloc(len + 1);
 
 	for (i = 0; i <= len; ++i) {
 		if (i == len || in[i] == ',') {
@@ -1545,288 +1577,1165 @@ static int php_openssl_server_alpn_callback(SSL *ssl_handle,
 
 #endif
 
-static zend_result php_openssl_setup_crypto(php_stream *stream,
-		php_openssl_netstream_data_t *sslsock,
-		php_stream_xport_crypto_param *cparam) /* {{{ */
+static int php_openssl_get_ctx_stream_data_index(void)
 {
-	const SSL_METHOD *method;
-	int ssl_ctx_options;
-	int method_flags;
-	zend_long min_version = 0;
-	zend_long max_version = 0;
-	char *cipherlist = NULL;
-	char *alpn_protocols = NULL;
-	zval *val;
-	bool verify_peer = false;
+	static int ctx_data_index = -1;
+	if (ctx_data_index < 0) {
+		ctx_data_index = SSL_CTX_get_ex_new_index(0, NULL, NULL, NULL, NULL);
+	}
+	return ctx_data_index;
+}
 
-	if (sslsock->ssl_handle) {
-		if (sslsock->s.is_blocked) {
-			php_error_docref(NULL, E_WARNING, "SSL/TLS already set-up for this stream");
-			return FAILURE;
-		} else {
-			return SUCCESS;
+/**
+ * Build a SSL_SESSION suitable for use as an external PSK in TLS 1.3.
+ */
+static SSL_SESSION *php_openssl_psk_build_session(SSL *ssl,
+		const unsigned char *psk, size_t psk_len, const EVP_MD *md)
+{
+	const SSL_CIPHER *cipher;
+
+	cipher = SSL_CIPHER_find(ssl, php_openssl_tls13_aes128gcmsha256_id);
+	if (cipher == NULL) {
+		return NULL;
+	}
+
+	if (md != NULL && SSL_CIPHER_get_handshake_digest(cipher) != md) {
+		/* Fallback to SHA384 if SHA256 doesn't match */
+		cipher = SSL_CIPHER_find(ssl, php_openssl_tls13_aes256gcmsha384_id);
+		if (cipher == NULL || SSL_CIPHER_get_handshake_digest(cipher) != md) {
+			return NULL;
 		}
 	}
 
-	ERR_clear_error();
+	SSL_SESSION *sess = SSL_SESSION_new();
+	if (sess == NULL) {
+		return NULL;
+	}
 
-	/* We need to do slightly different things based on client/server method
-	 * so let's remember which method was selected */
-	sslsock->is_client = cparam->inputs.method & STREAM_CRYPTO_IS_CLIENT;
-	method_flags = cparam->inputs.method & ~STREAM_CRYPTO_IS_CLIENT;
+	if (!SSL_SESSION_set1_master_key(sess, psk, psk_len)
+			|| !SSL_SESSION_set_cipher(sess, cipher)
+			|| !SSL_SESSION_set_protocol_version(sess, TLS1_3_VERSION)) {
+		SSL_SESSION_free(sess);
+		return NULL;
+	}
 
-	method = sslsock->is_client ? SSLv23_client_method() : SSLv23_server_method();
-	sslsock->ctx = SSL_CTX_new(method);
+	return sess;
+}
 
-	if (sslsock->ctx == NULL) {
-		php_error_docref(NULL, E_WARNING, "SSL context creation failure");
-		return FAILURE;
-	}
 
-	GET_VER_OPT_LONG("min_proto_version", min_version);
-	GET_VER_OPT_LONG("max_proto_version", max_version);
-	method_flags = php_openssl_get_proto_version_flags(method_flags, min_version, max_version);
-	ssl_ctx_options = SSL_OP_ALL;
+/**
+ * Invoke a user PHP callback (psk_client_cb or psk_server_cb).
+ */
+static zend_result php_openssl_call_psk_cb(php_stream *stream, zend_fcall_info_cache *fcc,
+		const unsigned char *identity, size_t identity_len,
+		zval *result)
+{
+	zval args[2];
+	zval retval;
+	int argc;
 
-	if (GET_VER_OPT("no_ticket") && zend_is_true(val)) {
-		ssl_ctx_options |= SSL_OP_NO_TICKET;
+	ZVAL_RES(&args[0], stream->res);
+
+	if (identity != NULL) {
+		ZVAL_STRINGL(&args[1], (const char *)identity, identity_len);
+		argc = 2;
+	} else {
+		argc = 1;
 	}
 
-	ssl_ctx_options &= ~SSL_OP_DONT_INSERT_EMPTY_FRAGMENTS;
+	ZVAL_UNDEF(&retval);
 
-#ifdef SSL_OP_IGNORE_UNEXPECTED_EOF
-	/* Only for OpenSSL 3+ to keep OpenSSL 1.1.1 behavior */
-	ssl_ctx_options |= SSL_OP_IGNORE_UNEXPECTED_EOF;
-#endif
+	zend_call_known_fcc(fcc, &retval, argc, args, NULL);
 
-	if (!GET_VER_OPT("disable_compression") || zend_is_true(val)) {
-		ssl_ctx_options |= SSL_OP_NO_COMPRESSION;
+	if (identity != NULL) {
+		zval_ptr_dtor(&args[1]);
 	}
 
-	if (GET_VER_OPT("verify_peer") && !zend_is_true(val)) {
-		php_openssl_disable_peer_verification(sslsock->ctx, stream);
-	} else {
-		verify_peer = true;
-		if (FAILURE == php_openssl_enable_peer_verification(sslsock->ctx, stream)) {
-			return FAILURE;
-		}
+	if (Z_ISUNDEF(retval)) {
+		ZVAL_UNDEF(result);
+		return FAILURE;
 	}
 
-	/* callback for the passphrase (for localcert) */
-	if (GET_VER_OPT("passphrase")) {
-		SSL_CTX_set_default_passwd_cb_userdata(sslsock->ctx, stream);
-		SSL_CTX_set_default_passwd_cb(sslsock->ctx, php_openssl_passwd_callback);
+	if (Z_TYPE(retval) == IS_NULL) {
+		ZVAL_NULL(result);
+		return SUCCESS;
 	}
 
-	GET_VER_OPT_STRING("ciphers", cipherlist);
-#ifndef USE_OPENSSL_SYSTEM_CIPHERS
-	if (!cipherlist) {
-		cipherlist = OPENSSL_DEFAULT_STREAM_CIPHERS;
+	if (!php_openssl_is_psk_ce(&retval)) {
+		zval_ptr_dtor(&retval);
+		zend_type_error("PSK callback must return Openssl\\Psk or null");
+		ZVAL_UNDEF(result);
+		return FAILURE;
 	}
-#endif
-	if (cipherlist) {
-		if (SSL_CTX_set_cipher_list(sslsock->ctx, cipherlist) != 1) {
-			return FAILURE;
-		}
+
+	ZVAL_COPY_VALUE(result, &retval);
+	return SUCCESS;
+}
+
+#ifndef OPENSSL_NO_PSK
+/* TLS 1.2 (and below) PSK callbacks. */
+
+static unsigned int php_openssl_psk_client_cb(SSL *ssl, const char *hint,
+		char *identity_out, unsigned int max_identity_len,
+		unsigned char *psk_out, unsigned int max_psk_len)
+{
+	(void)hint; /* identity hint deliberately not exposed as it is useless */
+	(void)max_identity_len;
+	(void)max_psk_len;
+
+	php_stream *stream = (php_stream *)SSL_get_ex_data(ssl,
+			php_openssl_get_ssl_stream_data_index());
+	if (stream == NULL) {
+		return 0;
 	}
 
-	if (GET_VER_OPT("security_level")) {
-		zend_long lval = zval_get_long(val);
-		if (lval < 0 || lval > 5) {
-			php_error_docref(NULL, E_WARNING, "Security level must be between 0 and 5");
-		}
-#ifdef HAVE_SEC_LEVEL
-		SSL_CTX_set_security_level(sslsock->ctx, lval);
-#endif
+	php_openssl_netstream_data_t *sslsock =
+			(php_openssl_netstream_data_t *)stream->abstract;
+	if (sslsock == NULL || sslsock->psk_callbacks == NULL
+			|| !ZEND_FCC_INITIALIZED(sslsock->psk_callbacks->client_cb)) {
+		return 0;
 	}
 
-	GET_VER_OPT_STRING("alpn_protocols", alpn_protocols);
-	if (alpn_protocols) {
-#ifdef HAVE_TLS_ALPN
-		{
-			unsigned short alpn_len;
-			unsigned char *alpn = php_openssl_alpn_protos_parse(&alpn_len, alpn_protocols);
+	zval result;
+	if (php_openssl_call_psk_cb(stream, &sslsock->psk_callbacks->client_cb,
+			NULL, 0, &result) != SUCCESS) {
+		return 0;
+	}
 
-			if (alpn == NULL) {
-				php_error_docref(NULL, E_WARNING, "Failed parsing comma-separated TLS ALPN protocol string");
-				SSL_CTX_free(sslsock->ctx);
-				sslsock->ctx = NULL;
-				return FAILURE;
-			}
-			if (sslsock->is_client) {
-				SSL_CTX_set_alpn_protos(sslsock->ctx, alpn, alpn_len);
-			} else {
-				sslsock->alpn_ctx.data = (unsigned char *) pestrndup((const char*)alpn, alpn_len, php_stream_is_persistent(stream));
-				sslsock->alpn_ctx.len = alpn_len;
-				SSL_CTX_set_alpn_select_cb(sslsock->ctx, php_openssl_server_alpn_callback, sslsock);
-			}
+	if (Z_TYPE(result) == IS_NULL) {
+		return 0;
+	}
 
-			efree(alpn);
-		}
-#else
-		php_error_docref(NULL, E_WARNING,
-			"alpn_protocols support is not compiled into the OpenSSL library against which PHP is linked");
-#endif
+	zend_string *psk_str = php_openssl_psk_get_psk(&result);
+	zend_string *identity_str = php_openssl_psk_get_identity(&result);
+
+	if (psk_str == NULL) {
+		zval_ptr_dtor(&result);
+		return 0;
 	}
 
-	if (FAILURE == php_openssl_set_local_cert(sslsock->ctx, stream)) {
-		return FAILURE;
+	if (identity_str == NULL) {
+		zval_ptr_dtor(&result);
+		zend_value_error("Client PSK callback must return Openssl\\Psk with a non-null identity");
+		return 0;
 	}
 
-	SSL_CTX_set_options(sslsock->ctx, ssl_ctx_options);
+	memcpy(identity_out, ZSTR_VAL(identity_str), ZSTR_LEN(identity_str));
+	identity_out[ZSTR_LEN(identity_str)] = '\0';
+	memcpy(psk_out, ZSTR_VAL(psk_str), ZSTR_LEN(psk_str));
 
-	SSL_CTX_set_min_proto_version(sslsock->ctx, php_openssl_get_min_proto_version(method_flags));
-	SSL_CTX_set_max_proto_version(sslsock->ctx, php_openssl_get_max_proto_version(method_flags));
+	unsigned int psk_len = (unsigned int)ZSTR_LEN(psk_str);
+	zval_ptr_dtor(&result);
+	return psk_len;
+}
 
-	if (sslsock->is_client == 0 &&
-		PHP_STREAM_CONTEXT(stream) &&
-		FAILURE == php_openssl_set_server_specific_opts(stream, sslsock->ctx)
-	) {
-		return FAILURE;
-	}
+static unsigned int php_openssl_psk_server_cb(SSL *ssl, const char *identity,
+		unsigned char *psk_out, unsigned int max_psk_len)
+{
+	(void)max_psk_len;
 
-	sslsock->ssl_handle = SSL_new(sslsock->ctx);
+	php_stream *stream = (php_stream *)SSL_get_ex_data(ssl,
+			php_openssl_get_ssl_stream_data_index());
+	if (stream == NULL) {
+		return 0;
+	}
 
-	if (sslsock->ssl_handle == NULL) {
-		php_error_docref(NULL, E_WARNING, "SSL handle creation failure");
-		SSL_CTX_free(sslsock->ctx);
-		sslsock->ctx = NULL;
-#ifdef HAVE_TLS_ALPN
-		if (sslsock->alpn_ctx.data) {
-			pefree(sslsock->alpn_ctx.data, php_stream_is_persistent(stream));
-			sslsock->alpn_ctx.data = NULL;
-		}
-#endif
-		return FAILURE;
-	} else {
-		SSL_set_ex_data(sslsock->ssl_handle, php_openssl_get_ssl_stream_data_index(), stream);
+	php_openssl_netstream_data_t *sslsock =
+			(php_openssl_netstream_data_t *)stream->abstract;
+	if (sslsock == NULL || sslsock->psk_callbacks == NULL
+			|| !ZEND_FCC_INITIALIZED(sslsock->psk_callbacks->server_cb)) {
+		return 0;
 	}
 
-	if (!SSL_set_fd(sslsock->ssl_handle, sslsock->s.socket)) {
-		php_openssl_handle_ssl_error(stream, 0, true);
+	if (SSL_version(ssl) >= TLS1_3_VERSION) {
+		return 0;
 	}
 
-#ifdef HAVE_TLS_SNI
-	/* Enable server-side SNI */
-	if (!sslsock->is_client && php_openssl_enable_server_sni(stream, sslsock, verify_peer) == FAILURE) {
-		return FAILURE;
+	if (identity == NULL) {
+		return 0;
 	}
-#endif
 
-	/* Enable server-side handshake renegotiation rate-limiting */
-	if (!sslsock->is_client) {
-		php_openssl_init_server_reneg_limit(stream, sslsock);
+	size_t identity_len = strlen(identity);
+
+	zval result;
+	if (php_openssl_call_psk_cb(stream, &sslsock->psk_callbacks->server_cb,
+			(const unsigned char *)identity, identity_len, &result) != SUCCESS) {
+		return 0;
 	}
 
-#ifdef SSL_MODE_RELEASE_BUFFERS
-	SSL_set_mode(sslsock->ssl_handle, SSL_MODE_RELEASE_BUFFERS);
-#endif
+	if (Z_TYPE(result) == IS_NULL) {
+		return 0;
+	}
 
-	if (cparam->inputs.session) {
-		if (cparam->inputs.session->ops != &php_openssl_socket_ops) {
-			php_error_docref(NULL, E_WARNING, "Supplied session stream must be an SSL enabled stream");
-		} else if (((php_openssl_netstream_data_t*)cparam->inputs.session->abstract)->ssl_handle == NULL) {
-			php_error_docref(NULL, E_WARNING, "Supplied SSL session stream is not initialized");
-		} else {
-			SSL_copy_session_id(sslsock->ssl_handle, ((php_openssl_netstream_data_t*)cparam->inputs.session->abstract)->ssl_handle);
-		}
+	zend_string *psk_str = php_openssl_psk_get_psk(&result);
+	if (psk_str == NULL) {
+		zval_ptr_dtor(&result);
+		return 0;
 	}
 
-	return SUCCESS;
+	memcpy(psk_out, ZSTR_VAL(psk_str), ZSTR_LEN(psk_str));
+	unsigned int psk_len = (unsigned int)ZSTR_LEN(psk_str);
+
+	zval_ptr_dtor(&result);
+	return psk_len;
 }
-/* }}} */
+#endif /* OPENSSL_NO_PSK */
 
-static int php_openssl_capture_peer_certs(php_stream *stream,
-		php_openssl_netstream_data_t *sslsock, X509 *peer_cert) /* {{{ */
+/* TLS 1.3 PSK callbacks */
+
+static int php_openssl_psk_use_session_cb(SSL *ssl, const EVP_MD *md,
+		const unsigned char **id, size_t *idlen, SSL_SESSION **sess)
 {
-	zval *val, zcert;
-	php_openssl_certificate_object *cert_object;
-	int cert_captured = 0;
+	*id = NULL;
+	*idlen = 0;
+	*sess = NULL;
 
-	if (NULL != (val = php_stream_context_get_option(PHP_STREAM_CONTEXT(stream),
-			"ssl", "capture_peer_cert")) &&
-		zend_is_true(val)
-	) {
-		object_init_ex(&zcert, php_openssl_certificate_ce);
-		cert_object = Z_OPENSSL_CERTIFICATE_P(&zcert);
-		cert_object->x509 = peer_cert;
+	php_stream *stream = (php_stream *)SSL_get_ex_data(ssl,
+			php_openssl_get_ssl_stream_data_index());
+	if (stream == NULL) {
+		return 1;
+	}
 
-		php_stream_context_set_option(PHP_STREAM_CONTEXT(stream), "ssl", "peer_certificate", &zcert);
-		zval_ptr_dtor(&zcert);
-		cert_captured = 1;
+	php_openssl_netstream_data_t *sslsock =
+			(php_openssl_netstream_data_t *)stream->abstract;
+	if (sslsock == NULL || sslsock->psk_callbacks == NULL
+			|| !ZEND_FCC_INITIALIZED(sslsock->psk_callbacks->client_cb)) {
+		return 1;
 	}
 
-	if (NULL != (val = php_stream_context_get_option(PHP_STREAM_CONTEXT(stream),
-			"ssl", "capture_peer_cert_chain")) &&
-		zend_is_true(val)
-	) {
-		zval arr;
-		STACK_OF(X509) *chain;
+	zval result;
+	if (php_openssl_call_psk_cb(stream, &sslsock->psk_callbacks->client_cb,
+			NULL, 0, &result) != SUCCESS) {
+		return 0;
+	}
 
-		chain = SSL_get_peer_cert_chain(sslsock->ssl_handle);
+	if (Z_TYPE(result) == IS_NULL) {
+		return 1; /* user rejected, continue without PSK */
+	}
 
-		if (chain && sk_X509_num(chain) > 0) {
-			int i;
-			array_init(&arr);
+	zend_string *psk_str = php_openssl_psk_get_psk(&result);
+	zend_string *identity_str = php_openssl_psk_get_identity(&result);
 
-			for (i = 0; i < sk_X509_num(chain); i++) {
-				X509 *mycert = X509_dup(sk_X509_value(chain, i));
+	if (psk_str == NULL) {
+		zval_ptr_dtor(&result);
+		return 0;
+	}
 
-				object_init_ex(&zcert, php_openssl_certificate_ce);
-				cert_object = Z_OPENSSL_CERTIFICATE_P(&zcert);
-				cert_object->x509 = mycert;
-				add_next_index_zval(&arr, &zcert);
-			}
+	if (identity_str == NULL) {
+		zval_ptr_dtor(&result);
+		zend_value_error("Client PSK callback must return Openssl\\Psk with a non-null identity");
+		return 0;
+	}
 
-		} else {
-			ZVAL_NULL(&arr);
+	SSL_SESSION *session = php_openssl_psk_build_session(ssl,
+			(const unsigned char *)ZSTR_VAL(psk_str), ZSTR_LEN(psk_str), md);
+	if (session == NULL) {
+		zval_ptr_dtor(&result);
+		if (md != NULL) {
+			/* Could not satisfy the server's chosen digest */
+			return 1;
 		}
+		return 0;
+	}
 
-		php_stream_context_set_option(PHP_STREAM_CONTEXT(stream), "ssl", "peer_certificate_chain", &arr);
-		zval_ptr_dtor(&arr);
+	/* Identity buffer must outlive this callback. */
+	if (sslsock->psk_identity_buf == NULL) {
+		sslsock->psk_identity_buf = emalloc(PHP_OPENSSL_PSK_MAX_IDENTITY_LEN);
 	}
+	memcpy(sslsock->psk_identity_buf, ZSTR_VAL(identity_str), ZSTR_LEN(identity_str));
+	sslsock->psk_identity_len = ZSTR_LEN(identity_str);
 
-	return cert_captured;
-}
-/* }}} */
+	*id = sslsock->psk_identity_buf;
+	*idlen = sslsock->psk_identity_len;
+	*sess = session;
 
-static zend_result php_openssl_set_blocking(php_openssl_netstream_data_t *sslsock, int block)
-{
-	zend_result result = php_set_sock_blocking(sslsock->s.socket, block);
-	if (EXPECTED(SUCCESS == result)) {
-		sslsock->s.is_blocked = block;
-	}
-	return result;
+	zval_ptr_dtor(&result);
+	return 1;
 }
 
-static int php_openssl_enable_crypto(php_stream *stream,
-		php_openssl_netstream_data_t *sslsock,
-		php_stream_xport_crypto_param *cparam) /* {{{ */
+static int php_openssl_psk_find_session_cb(SSL *ssl, const unsigned char *identity,
+		size_t identity_len, SSL_SESSION **sess)
 {
-	int n;
-	int retry = 1;
-	int cert_captured = 0;
-	X509 *peer_cert;
+	*sess = NULL;
 
-	if (cparam->inputs.activate && !sslsock->ssl_active) {
-		struct timeval start_time, *timeout;
-		bool blocked = sslsock->s.is_blocked, has_timeout = false;
+	php_stream *stream = (php_stream *)SSL_get_ex_data(ssl,
+			php_openssl_get_ssl_stream_data_index());
+	if (stream == NULL) {
+		return 1;
+	}
+
+	php_openssl_netstream_data_t *sslsock = (php_openssl_netstream_data_t *)stream->abstract;
+	if (sslsock == NULL || sslsock->psk_callbacks == NULL
+			|| !ZEND_FCC_INITIALIZED(sslsock->psk_callbacks->server_cb)) {
+		return 1;
+	}
+
+	zval result;
+	if (php_openssl_call_psk_cb(stream, &sslsock->psk_callbacks->server_cb,
+			identity, identity_len, &result) != SUCCESS) {
+		return 0;
+	}
+
+	if (Z_TYPE(result) == IS_NULL) {
+		return 1; /* identity unknown - let handshake fall through */
+	}
+
+	zend_string *psk_str = php_openssl_psk_get_psk(&result);
+	if (psk_str == NULL) {
+		zval_ptr_dtor(&result);
+		return 0;
+	}
+
+	SSL_SESSION *session = php_openssl_psk_build_session(ssl,
+			(const unsigned char *)ZSTR_VAL(psk_str), ZSTR_LEN(psk_str), NULL);
+
+	zval_ptr_dtor(&result);
+
+	if (session == NULL) {
+		return 0;
+	}
+
+	*sess = session;
+	return 1;
+}
+
+/* PSK setup */
+
+static zend_result php_openssl_validate_and_allocate_psk_callback(
+		php_openssl_netstream_data_t *sslsock, const zval *callable,
+		bool is_client, bool is_persistent)
+{
+	const char *callback_name = is_client ? "psk_client_cb" : "psk_server_cb";
+	if (is_persistent) {
+		php_error_docref(NULL, E_WARNING,
+				"%s is not supported for persistent streams", callback_name);
+		return FAILURE;
+	}
+
+	char *is_callable_error = NULL;
+	zend_fcall_info_cache fcc = {0};
+	if (!zend_is_callable_ex(callable, NULL, 0, NULL, &fcc, &is_callable_error)) {
+		if (is_callable_error) {
+			zend_type_error("%s must be a valid callback, %s",
+					callback_name, is_callable_error);
+			efree(is_callable_error);
+		} else {
+			zend_type_error("%s must be a valid callback", callback_name);
+		}
+		return FAILURE;
+	}
+
+	if (!sslsock->psk_callbacks) {
+		sslsock->psk_callbacks = (php_openssl_psk_callbacks_t *)pecalloc(
+				1, sizeof(php_openssl_psk_callbacks_t), is_persistent);
+		sslsock->psk_callbacks->refcount = 1;
+	}
+	zend_fcc_addref(&fcc);
+	if (is_client) {
+		sslsock->psk_callbacks->client_cb = fcc;
+	} else {
+		sslsock->psk_callbacks->server_cb = fcc;
+	}
+
+	return SUCCESS;
+}
+
+static zend_result php_openssl_setup_client_psk(php_stream *stream,
+		php_openssl_netstream_data_t *sslsock)
+{
+	zval *val;
+
+	if (!GET_VER_OPT("psk_client_cb")) {
+		return SUCCESS;
+	}
+
+	if (FAILURE == php_openssl_validate_and_allocate_psk_callback(
+			sslsock, val, true, php_stream_is_persistent(stream))) {
+		return FAILURE;
+	}
+
+#ifndef OPENSSL_NO_PSK
+	SSL_CTX_set_psk_client_callback(sslsock->ctx, php_openssl_psk_client_cb);
+#endif
+	SSL_CTX_set_psk_use_session_callback(sslsock->ctx, php_openssl_psk_use_session_cb);
+
+	return SUCCESS;
+}
+
+static zend_result php_openssl_setup_server_psk(php_stream *stream,
+		php_openssl_netstream_data_t *sslsock)
+{
+	zval *val;
+
+	if (!GET_VER_OPT("psk_server_cb")) {
+		return SUCCESS;
+	}
+
+	if (FAILURE == php_openssl_validate_and_allocate_psk_callback(
+			sslsock, val, false, php_stream_is_persistent(stream))) {
+		return FAILURE;
+	}
+
+#ifndef OPENSSL_NO_PSK
+	SSL_CTX_set_psk_server_callback(sslsock->ctx, php_openssl_psk_server_cb);
+#endif
+	SSL_CTX_set_psk_find_session_callback(sslsock->ctx, php_openssl_psk_find_session_cb);
+
+	if (!GET_VER_OPT("session_id_context")) {
+		static const unsigned char default_psk_sid_ctx[] = "PHP_PSK";
+		SSL_CTX_set_session_id_context(sslsock->ctx, default_psk_sid_ctx,
+				sizeof(default_psk_sid_ctx) - 1);
+	}
+
+	return SUCCESS;
+}
+
+/**
+ * OpenSSL new session callback - called when a new session is established
+ */
+static int php_openssl_session_new_cb(SSL *ssl, SSL_SESSION *session)
+{
+	php_stream *stream = (php_stream *)SSL_get_ex_data(ssl, php_openssl_get_ssl_stream_data_index());
+	if (!stream) {
+		return 0;
+	}
+
+	php_openssl_netstream_data_t *sslsock = (php_openssl_netstream_data_t *)stream->abstract;
+	if (!sslsock || !sslsock->session_callbacks) {
+		return 0;
+	}
+
+	/* Increment reference - we're giving ownership to the PHP object */
+	SSL_SESSION_up_ref(session);
+
+	zval args[2];
+
+	ZVAL_RES(&args[0], stream->res);
+	php_openssl_session_object_init(&args[1], session);
+
+	zend_call_known_fcc(&sslsock->session_callbacks->new_cb, NULL, 2, args, NULL);
+
+	zval_ptr_dtor(&args[1]);
+
+	return 0;
+}
+
+/**
+ * OpenSSL get session callback - called when server needs to retrieve a session
+ */
+static SSL_SESSION *php_openssl_session_get_cb(SSL *ssl, const unsigned char *session_id,
+		int session_id_len, int *copy)
+{
+	php_stream *stream = (php_stream *)SSL_get_ex_data(ssl, php_openssl_get_ssl_stream_data_index());
+	if (!stream) {
+		*copy = 0;
+		return NULL;
+	}
+
+	php_openssl_netstream_data_t *sslsock = (php_openssl_netstream_data_t *)stream->abstract;
+	if (!sslsock || !sslsock->session_callbacks) {
+		*copy = 0;
+		return NULL;
+	}
+
+	zval args[2];
+	zval retval;
+
+	ZVAL_RES(&args[0], stream->res);
+	ZVAL_STRINGL(&args[1], (char *)session_id, session_id_len);
+
+	SSL_SESSION *session = NULL;
+
+	zend_call_known_fcc(&sslsock->session_callbacks->get_cb, &retval, 2, args, NULL);
+	zval_ptr_dtor(&args[1]);
+
+	if (php_openssl_is_session_ce(&retval)) {
+		/* Get session from object and increment ref since OpenSSL will own it */
+		php_openssl_session_object *obj = Z_OPENSSL_SESSION_P(&retval);
+		if (obj->session) {
+			SSL_SESSION_up_ref(obj->session);
+			session = obj->session;
+		}
+	} else if (Z_TYPE(retval) != IS_NULL) {
+		zend_type_error("session_get_cb return type must be null or OpenSSLSession");
+	}
+
+	zval_ptr_dtor(&retval);
+
+	*copy = 0;
+	return session;
+}
+
+/**
+ * OpenSSL remove session callback - called when a session is evicted from cache
+ */
+static void php_openssl_session_remove_cb(SSL_CTX *ctx, SSL_SESSION *session)
+{
+	php_stream *stream = (php_stream *)SSL_CTX_get_ex_data(ctx, php_openssl_get_ctx_stream_data_index());
+	if (!stream) {
+		return;
+	}
+
+	php_openssl_netstream_data_t *sslsock = (php_openssl_netstream_data_t *)stream->abstract;
+	if (!sslsock || !sslsock->session_callbacks) {
+		return;
+	}
+
+	unsigned int session_id_len = 0;
+	const unsigned char *session_id = SSL_SESSION_get_id(session, &session_id_len);
+
+	zval args[2];
+
+	ZVAL_RES(&args[0], stream->res);
+	ZVAL_STRINGL(&args[1], (char *)session_id, session_id_len);
+
+	zend_call_known_fcc(&sslsock->session_callbacks->remove_cb, NULL, 2, args, NULL);
+	zval_ptr_dtor(&args[1]);
+}
+
+
+enum php_openssl_session_callback_type {
+	PHP_OPENSSL_NEW_CB,
+	PHP_OPENSSL_GET_CB,
+	PHP_OPENSSL_REMOVE_CB,
+};
+/**
+ * Validate callable and allocate callback structure if needed.
+ */
+static zend_result php_openssl_validate_and_allocate_session_callback(
+		php_openssl_netstream_data_t *sslsock, const zval *callable,
+		enum php_openssl_session_callback_type cb_type, bool is_persistent)
+{
+	char *is_callable_error = NULL;
+	const char *callback_name;
+
+	switch (cb_type) {
+		case PHP_OPENSSL_NEW_CB:
+			callback_name = "session_new_cb";
+			break;
+		case PHP_OPENSSL_GET_CB:
+			callback_name = "session_get_cb";
+			break;
+		case PHP_OPENSSL_REMOVE_CB:
+			callback_name = "session_remove_cb";
+			break;
+	}
+
+	/* Callbacks not supported for persistent streams */
+	if (is_persistent) {
+		php_error_docref(NULL, E_WARNING,
+				"%s is not supported for persistent streams", callback_name);
+		return FAILURE;
+	}
+
+	/* Validate callable */
+	zend_fcall_info_cache fcc;
+	if (!zend_is_callable_ex(callable, NULL, 0, NULL, &fcc, &is_callable_error)) {
+		if (is_callable_error) {
+			zend_type_error("%s must be a valid callback, %s", callback_name, is_callable_error);
+			efree(is_callable_error);
+		} else {
+			zend_type_error("%s must be a valid callback", callback_name);
+		}
+		return FAILURE;
+	}
+
+	/* Allocate callback structure if not already allocated */
+	if (!sslsock->session_callbacks) {
+		sslsock->session_callbacks = (php_openssl_session_callbacks_t *)pecalloc(
+				1, sizeof(php_openssl_session_callbacks_t), is_persistent);
+		sslsock->session_callbacks->refcount = 1;
+	}
+
+	zend_fcc_addref(&fcc);
+	switch (cb_type) {
+		case PHP_OPENSSL_NEW_CB:
+			sslsock->session_callbacks->new_cb = fcc;
+			break;
+		case PHP_OPENSSL_GET_CB:
+			sslsock->session_callbacks->get_cb = fcc;
+			break;
+		case PHP_OPENSSL_REMOVE_CB:
+			sslsock->session_callbacks->remove_cb = fcc;
+			break;
+	}
+
+	return SUCCESS;
+}
+
+/**
+ * Configure session resumption options for client connections
+ */
+static zend_result php_openssl_setup_client_session(php_stream *stream,
+		php_openssl_netstream_data_t *sslsock)
+{
+	zval *val;
+	bool enable_client_cache = false;
+	bool is_persistent = php_stream_is_persistent(stream);
+
+	if (GET_VER_OPT("session_data")) {
+		if (php_openssl_is_session_ce(val)) {
+			enable_client_cache = true;
+		} else if (Z_TYPE_P(val) != IS_NULL) {
+			zend_type_error("session_data must be an OpenSSLSession instance");
+			return FAILURE;
+		}
+	}
+
+	if (GET_VER_OPT("session_new_cb")) {
+		if (FAILURE == php_openssl_validate_and_allocate_session_callback(
+				sslsock, val, PHP_OPENSSL_NEW_CB, is_persistent)) {
+			return FAILURE;
+		}
+
+		SSL_CTX_sess_set_new_cb(sslsock->ctx, php_openssl_session_new_cb);
+		enable_client_cache = true;
+	}
+
+	if (enable_client_cache) {
+		SSL_CTX_set_session_cache_mode(sslsock->ctx,
+				SSL_SESS_CACHE_CLIENT | SSL_SESS_CACHE_NO_INTERNAL);
+	}
+
+	return SUCCESS;
+}
+
+static bool php_openssl_is_session_cache_enabled(php_stream *stream, bool internal_only)
+{
+	zval *val;
+
+	if (GET_VER_OPT("session_cache")) {
+		return zend_is_true(val);
+	}
+
+	if (internal_only) {
+		return false;
+	}
+
+	return GET_VER_OPT("session_get_cb");
+}
+
+/**
+ * Configure session resumption options for server connections
+ */
+static zend_result php_openssl_setup_server_session(php_stream *stream,
+		php_openssl_netstream_data_t *sslsock)
+{
+	zval *val;
+	bool has_get_cb = false;
+	bool has_new_cb = false;
+	bool has_remove_cb = false;
+	bool has_session_id_context = false;
+	bool is_persistent = php_stream_is_persistent(stream);
+
+	/* Check for session_get_cb first (determines cache mode) */
+	if (GET_VER_OPT("session_get_cb")) {
+		if (FAILURE == php_openssl_validate_and_allocate_session_callback(
+				sslsock, val, PHP_OPENSSL_GET_CB, is_persistent)) {
+			return FAILURE;
+		}
+		has_get_cb = true;
+	}
+
+	if (GET_VER_OPT("session_id_context")) {
+		if (Z_TYPE_P(val) != IS_STRING || Z_STRLEN_P(val) == 0) {
+			zend_type_error("session_id_context must be a non empty string");
+			return FAILURE;
+		}
+		SSL_CTX_set_session_id_context(sslsock->ctx, (const unsigned char *) Z_STRVAL_P(val),
+				Z_STRLEN_P(val));
+		has_session_id_context = true;
+	}
+
+	/* Check for session_new_cb */
+	if (GET_VER_OPT("session_new_cb")) {
+		if (FAILURE == php_openssl_validate_and_allocate_session_callback(
+				sslsock, val, PHP_OPENSSL_NEW_CB, is_persistent)) {
+			return FAILURE;
+		}
+		has_new_cb = true;
+
+		if (!has_session_id_context &&
+				(SSL_CTX_get_verify_mode(sslsock->ctx) & SSL_VERIFY_PEER) != 0) {
+			zend_value_error("session_id_context must be set if session_new_cb is set");
+			return FAILURE;
+		}
+	}
+
+	/* Validate: if session_get_cb is provided, session_new_cb is required */
+	if (has_get_cb && !has_new_cb) {
+		zend_value_error("session_new_cb is required when session_get_cb is provided");
+		return FAILURE;
+	}
+
+	/* Check for session_remove_cb (optional) */
+	if (GET_VER_OPT("session_remove_cb")) {
+		if (FAILURE == php_openssl_validate_and_allocate_session_callback(
+				sslsock, val, PHP_OPENSSL_REMOVE_CB, is_persistent)) {
+			return FAILURE;
+		}
+
+		has_remove_cb = true;
+	}
+
+	/* Configure cache mode based on whether external callbacks are provided */
+	if (has_get_cb) {
+		/* External cache mode - disable internal cache */
+		SSL_CTX_set_session_cache_mode(sslsock->ctx,
+				SSL_SESS_CACHE_SERVER | SSL_SESS_CACHE_NO_INTERNAL);
+
+		/* Set callbacks */
+		SSL_CTX_sess_set_new_cb(sslsock->ctx, php_openssl_session_new_cb);
+		SSL_CTX_sess_set_get_cb(sslsock->ctx, php_openssl_session_get_cb);
+
+		if (has_remove_cb) {
+			SSL_CTX_sess_set_remove_cb(sslsock->ctx, php_openssl_session_remove_cb);
+		}
+
+		// Disable tickets (they won't work anyway) and warn if explicity enabled
+		SSL_CTX_set_options(sslsock->ctx, SSL_OP_NO_TICKET);
+		if (GET_VER_OPT("no_ticket") && !zend_is_true(val)) {
+			zend_value_error("Session tickets cannot be enabled when session_get_cb is set");
+		}
+	} else if (php_openssl_is_session_cache_enabled(stream, true)) {
+		if (!has_session_id_context &&
+				(SSL_CTX_get_verify_mode(sslsock->ctx) & SSL_VERIFY_PEER) != 0) {
+			zend_value_error("session_id_context must be set for internal session cache");
+		}
+
+		 /* Internal cache mode */
+		SSL_CTX_set_session_cache_mode(sslsock->ctx, SSL_SESS_CACHE_SERVER);
+
+		/* Handle session_cache_size */
+		if (GET_VER_OPT("session_cache_size")) {
+			zend_long cache_size = zval_get_long(val);
+			if (cache_size > 0) {
+				SSL_CTX_sess_set_cache_size(sslsock->ctx, cache_size);
+			} else {
+				zend_value_error("session_cache_size must be positive");
+			}
+		} else {
+			/* Default cache size from RFC */
+			SSL_CTX_sess_set_cache_size(sslsock->ctx, 20480);
+		}
+
+		/* Handle session_timeout */
+		if (GET_VER_OPT("session_timeout")) {
+			zend_long timeout = zval_get_long(val);
+			if (timeout > 0) {
+				SSL_CTX_set_timeout(sslsock->ctx, timeout);
+			} else {
+				zend_value_error("session_timeout must be positive");
+			}
+		} else {
+			/* Default timeout from RFC */
+			SSL_CTX_set_timeout(sslsock->ctx, 300);
+		}
+
+		/* Optional notification callback for internal cache */
+		if (has_new_cb) {
+			SSL_CTX_sess_set_new_cb(sslsock->ctx, php_openssl_session_new_cb);
+		}
+	} else {
+		/* Session caching disabled */
+		SSL_CTX_set_session_cache_mode(sslsock->ctx, SSL_SESS_CACHE_OFF);
+	}
+
+	return SUCCESS;
+}
+
+static zend_result php_openssl_apply_client_session_data(php_stream *stream,
+		php_openssl_netstream_data_t *sslsock)
+{
+	zval *val;
+
+	if (GET_VER_OPT("session_data")) {
+		SSL_SESSION *session = NULL;
+		bool needs_free = false;
+
+		if (php_openssl_is_session_ce(val)) {
+			session = php_openssl_session_from_zval(val);
+			if (!session) {
+				php_error_docref(NULL, E_WARNING,
+						"Invalid OpenSSLSession object, falling back to full handshake");
+				return FAILURE;
+			}
+			/* Object owns the session, we just borrow it */
+			needs_free = false;
+		} else if (Z_TYPE_P(val) != IS_NULL) {
+			zend_type_error("session_data must be an OpenSSLSession instance");
+			return FAILURE;
+		}
+
+		if (session) {
+			if (SSL_set_session(sslsock->ssl_handle, session) != 1) {
+				php_error_docref(NULL, E_WARNING,
+						"Failed to set session for resumption, falling back to full handshake");
+				if (needs_free) {
+					SSL_SESSION_free(session);
+				}
+				ERR_clear_error();
+				return FAILURE;
+			}
+
+			if (needs_free) {
+				SSL_SESSION_free(session);
+			}
+		}
+	}
+
+	return SUCCESS;
+}
+
+static zend_result php_openssl_create_server_ctx(php_stream *stream,
+		php_openssl_netstream_data_t *sslsock, int method_flags)
+{
+	zval *val;
+
+	const SSL_METHOD *method = sslsock->is_client ? SSLv23_client_method() : SSLv23_server_method();
+	sslsock->ctx = SSL_CTX_new(method);
+
+	if (sslsock->ctx == NULL) {
+		php_error_docref(NULL, E_WARNING, "SSL context creation failure");
+		return FAILURE;
+	}
+
+	SSL_CTX_set_ex_data(sslsock->ctx, php_openssl_get_ctx_stream_data_index(), stream);
+
+	zend_long min_version = 0;
+	zend_long max_version = 0;
+	GET_VER_OPT_LONG("min_proto_version", min_version);
+	GET_VER_OPT_LONG("max_proto_version", max_version);
+	method_flags = php_openssl_get_proto_version_flags(method_flags, min_version, max_version);
+	int ssl_ctx_options = SSL_OP_ALL;
+
+	if (GET_VER_OPT("no_ticket") && zend_is_true(val)) {
+		ssl_ctx_options |= SSL_OP_NO_TICKET;
+	}
+	if (GET_VER_OPT("num_tickets")) {
+		zend_long num_tickets = zval_get_long(val);
+		if (num_tickets >= 0) {
+			SSL_CTX_set_num_tickets(sslsock->ctx, num_tickets);
+		}
+	}
+
+	ssl_ctx_options &= ~SSL_OP_DONT_INSERT_EMPTY_FRAGMENTS;
+
+#ifdef SSL_OP_IGNORE_UNEXPECTED_EOF
+	/* Only for OpenSSL 3+ to keep OpenSSL 1.1.1 behavior */
+	ssl_ctx_options |= SSL_OP_IGNORE_UNEXPECTED_EOF;
+#endif
+
+	if (!GET_VER_OPT("disable_compression") || zend_is_true(val)) {
+		ssl_ctx_options |= SSL_OP_NO_COMPRESSION;
+	}
+
+	bool verify_peer = false;
+	if (GET_VER_OPT("verify_peer") && !zend_is_true(val)) {
+		php_openssl_disable_peer_verification(sslsock->ctx, stream);
+	} else {
+		verify_peer = true;
+		if (FAILURE == php_openssl_enable_peer_verification(sslsock->ctx, stream)) {
+			return FAILURE;
+		}
+	}
+
+	/* callback for the passphrase (for localcert) */
+	if (GET_VER_OPT("passphrase")) {
+		SSL_CTX_set_default_passwd_cb_userdata(sslsock->ctx, stream);
+		SSL_CTX_set_default_passwd_cb(sslsock->ctx, php_openssl_passwd_callback);
+	}
+
+	char *cipherlist = NULL;
+	GET_VER_OPT_STRING("ciphers", cipherlist);
+#ifndef USE_OPENSSL_SYSTEM_CIPHERS
+	if (!cipherlist) {
+		cipherlist = OPENSSL_DEFAULT_STREAM_CIPHERS;
+	}
+#endif
+	if (cipherlist) {
+		if (SSL_CTX_set_cipher_list(sslsock->ctx, cipherlist) != 1) {
+			return FAILURE;
+		}
+	}
+
+	if (GET_VER_OPT("security_level")) {
+		zend_long lval = zval_get_long(val);
+		if (lval < 0 || lval > 5) {
+			php_error_docref(NULL, E_WARNING, "Security level must be between 0 and 5");
+		}
+#ifdef HAVE_SEC_LEVEL
+		SSL_CTX_set_security_level(sslsock->ctx, lval);
+#endif
+	}
+
+	char *alpn_protocols = NULL;
+	GET_VER_OPT_STRING("alpn_protocols", alpn_protocols);
+	if (alpn_protocols) {
+#ifdef HAVE_TLS_ALPN
+		{
+			unsigned short alpn_len;
+			unsigned char *alpn = php_openssl_alpn_protos_parse(&alpn_len, alpn_protocols);
+
+			if (alpn == NULL) {
+				php_error_docref(NULL, E_WARNING, "Failed parsing comma-separated TLS ALPN protocol string");
+				SSL_CTX_free(sslsock->ctx);
+				sslsock->ctx = NULL;
+				return FAILURE;
+			}
+			if (sslsock->is_client) {
+				SSL_CTX_set_alpn_protos(sslsock->ctx, alpn, alpn_len);
+			} else {
+				sslsock->alpn_ctx.data = (unsigned char *) pestrndup((const char*)alpn, alpn_len, php_stream_is_persistent(stream));
+				sslsock->alpn_ctx.len = alpn_len;
+				SSL_CTX_set_alpn_select_cb(sslsock->ctx, php_openssl_server_alpn_callback, sslsock);
+			}
+
+			efree(alpn);
+		}
+#else
+		php_error_docref(NULL, E_WARNING,
+			"alpn_protocols support is not compiled into the OpenSSL library against which PHP is linked");
+#endif
+	}
+
+	if (FAILURE == php_openssl_set_local_cert(sslsock->ctx, stream)) {
+		return FAILURE;
+	}
+
+	SSL_CTX_set_options(sslsock->ctx, ssl_ctx_options);
+
+	SSL_CTX_set_min_proto_version(sslsock->ctx, php_openssl_get_min_proto_version(method_flags));
+	SSL_CTX_set_max_proto_version(sslsock->ctx, php_openssl_get_max_proto_version(method_flags));
+
+
+	if (sslsock->is_client) {
+		if (FAILURE == php_openssl_setup_client_session(stream, sslsock)) {
+			return FAILURE;
+		}
+		if (FAILURE == php_openssl_setup_client_psk(stream, sslsock)) {
+			return FAILURE;
+		}
+	} else if (PHP_STREAM_CONTEXT(stream)) {
+		if (FAILURE == php_openssl_setup_server_session(stream, sslsock)) {
+			return FAILURE;
+		}
+		if (FAILURE == php_openssl_setup_server_psk(stream, sslsock)) {
+			return FAILURE;
+		}
+		if (FAILURE == php_openssl_set_server_specific_opts(stream, sslsock->ctx)) {
+			return FAILURE;
+		}
+	}
 
 #ifdef HAVE_TLS_SNI
-		if (sslsock->is_client) {
-			php_openssl_enable_client_sni(stream, sslsock);
+	/* Enable server-side SNI */
+	if (!sslsock->is_client && php_openssl_enable_server_sni(stream, sslsock, verify_peer) == FAILURE) {
+		return FAILURE;
+	}
+#endif
+
+	return SUCCESS;
+}
+
+static zend_result php_openssl_setup_crypto(php_stream *stream,
+		php_openssl_netstream_data_t *sslsock,
+		php_stream_xport_crypto_param *cparam) /* {{{ */
+{
+	if (sslsock->ssl_handle) {
+		if (sslsock->s.is_blocked) {
+			php_error_docref(NULL, E_WARNING, "SSL/TLS already set-up for this stream");
+			return FAILURE;
+		} else {
+			return SUCCESS;
+		}
+	}
+
+	ERR_clear_error();
+
+	/* We need to do slightly different things based on client/server method
+	 * so let's remember which method was selected */
+	sslsock->is_client = cparam->inputs.method & STREAM_CRYPTO_IS_CLIENT;
+	int method_flags = cparam->inputs.method & ~STREAM_CRYPTO_IS_CLIENT;
+
+	/* Re-use SSL_CTX if session is set */
+	if (cparam->inputs.session) {
+		php_openssl_netstream_data_t *parent_sslsock;
+
+		if (cparam->inputs.session->ops != &php_openssl_socket_ops) {
+			php_error_docref(NULL, E_WARNING, "Supplied session stream must be an SSL enabled stream");
+		} else if ((parent_sslsock = cparam->inputs.session->abstract)->ctx == NULL) {
+			php_error_docref(NULL, E_WARNING, "Supplied SSL session stream is not set up");
+		} else if (sslsock->is_client && parent_sslsock->ssl_handle == NULL) {
+			php_error_docref(NULL, E_WARNING, "Supplied SSL session stream is not initialized");
+		} else {
+			SSL_CTX_up_ref(parent_sslsock->ctx);
+			sslsock->ctx = parent_sslsock->ctx;
+			if (parent_sslsock->session_callbacks) {
+				parent_sslsock->session_callbacks->refcount++;
+				sslsock->session_callbacks = parent_sslsock->session_callbacks;
+			}
+			if (parent_sslsock->psk_callbacks) {
+				parent_sslsock->psk_callbacks->refcount++;
+				sslsock->psk_callbacks = parent_sslsock->psk_callbacks;
+			}
+
+			sslsock->ssl_handle = SSL_new(sslsock->ctx);
+			if (!sslsock->ssl_handle) {
+				php_error_docref(NULL, E_WARNING, "SSL handle creation failure");
+				SSL_CTX_free(sslsock->ctx);
+				sslsock->ctx = NULL;
+				return FAILURE;
+			}
+
+			SSL_set_ex_data(sslsock->ssl_handle, php_openssl_get_ssl_stream_data_index(), stream);
+
+			if (!SSL_set_fd(sslsock->ssl_handle, sslsock->s.socket)) {
+				php_openssl_handle_ssl_error(stream, 0, true);
+			}
+
+			if (sslsock->is_client) {
+				if (SSL_copy_session_id(sslsock->ssl_handle, parent_sslsock->ssl_handle)) {
+					SSL_CTX_set_session_cache_mode(sslsock->ctx, SSL_SESS_CACHE_CLIENT);
+				} else {
+					php_error_docref(NULL, E_WARNING, "SSL session copying failed creation failure");
+				}
+			}
+
+			return SUCCESS;
+		}
+	}
+
+	if (php_openssl_create_server_ctx(stream, sslsock, method_flags) == FAILURE) {
+		return FAILURE;
+	}
+
+	sslsock->ssl_handle = SSL_new(sslsock->ctx);
+
+	if (sslsock->ssl_handle == NULL
+		|| !SSL_set_ex_data(sslsock->ssl_handle, php_openssl_get_ssl_stream_data_index(), stream)) {
+		php_error_docref(NULL, E_WARNING, "SSL handle creation failure");
+		SSL_CTX_free(sslsock->ctx);
+		sslsock->ctx = NULL;
+#ifdef HAVE_TLS_ALPN
+		if (sslsock->alpn_ctx.data) {
+			pefree(sslsock->alpn_ctx.data, php_stream_is_persistent(stream));
+			sslsock->alpn_ctx.data = NULL;
 		}
 #endif
+		return FAILURE;
+	}
+
+	if (!SSL_set_fd(sslsock->ssl_handle, sslsock->s.socket)) {
+		php_openssl_handle_ssl_error(stream, 0, true);
+	}
+
+	return SUCCESS;
+}
+/* }}} */
+
+static int php_openssl_capture_peer_certs(php_stream *stream,
+		php_openssl_netstream_data_t *sslsock, X509 *peer_cert) /* {{{ */
+{
+	zval *val, zcert;
+	php_openssl_certificate_object *cert_object;
+	int cert_captured = 0;
+
+	if (NULL != (val = php_stream_context_get_option(PHP_STREAM_CONTEXT(stream),
+			"ssl", "capture_peer_cert")) &&
+		zend_is_true(val)
+	) {
+		object_init_ex(&zcert, php_openssl_certificate_ce);
+		cert_object = Z_OPENSSL_CERTIFICATE_P(&zcert);
+		cert_object->x509 = peer_cert;
+
+		php_stream_context_set_option(PHP_STREAM_CONTEXT(stream), "ssl", "peer_certificate", &zcert);
+		zval_ptr_dtor(&zcert);
+		cert_captured = 1;
+	}
+
+	if (NULL != (val = php_stream_context_get_option(PHP_STREAM_CONTEXT(stream),
+			"ssl", "capture_peer_cert_chain")) &&
+		zend_is_true(val)
+	) {
+		zval arr;
+		STACK_OF(X509) *chain;
+
+		chain = SSL_get_peer_cert_chain(sslsock->ssl_handle);
+
+		if (chain && sk_X509_num(chain) > 0) {
+			int i;
+			array_init(&arr);
+
+			for (i = 0; i < sk_X509_num(chain); i++) {
+				X509 *mycert = X509_dup(sk_X509_value(chain, i));
+
+				object_init_ex(&zcert, php_openssl_certificate_ce);
+				cert_object = Z_OPENSSL_CERTIFICATE_P(&zcert);
+				cert_object->x509 = mycert;
+				add_next_index_zval(&arr, &zcert);
+			}
+
+		} else {
+			ZVAL_NULL(&arr);
+		}
+
+		php_stream_context_set_option(PHP_STREAM_CONTEXT(stream), "ssl", "peer_certificate_chain", &arr);
+		zval_ptr_dtor(&arr);
+	}
+
+	return cert_captured;
+}
+/* }}} */
+
+static zend_result php_openssl_set_blocking(php_openssl_netstream_data_t *sslsock, int block)
+{
+	zend_result result = php_set_sock_blocking(sslsock->s.socket, block);
+	if (EXPECTED(SUCCESS == result)) {
+		sslsock->s.is_blocked = block;
+	}
+	return result;
+}
+
+static int php_openssl_enable_crypto(php_stream *stream,
+		php_openssl_netstream_data_t *sslsock,
+		php_stream_xport_crypto_param *cparam) /* {{{ */
+{
+	int n;
+	int retry = 1;
+	int cert_captured = 0;
+	X509 *peer_cert;
+
+	sslsock->last_status = STREAM_CRYPTO_STATUS_NONE;
+
+	if (cparam->inputs.activate && !sslsock->ssl_active) {
+		struct timeval start_time, *timeout;
+		bool blocked = sslsock->s.is_blocked, has_timeout = false;
 
 		if (!sslsock->state_set) {
+#ifdef PHP_OPENSSL_TLS_DEBUG
+			BIO *b_out = BIO_new_fp(stdout, BIO_NOCLOSE | BIO_FP_TEXT);
+			SSL_set_msg_callback(sslsock->ssl_handle, SSL_trace);
+			SSL_set_msg_callback_arg(sslsock->ssl_handle, b_out);
+#endif
 			if (sslsock->is_client) {
+				/* Set session data for client */
+				if (php_openssl_apply_client_session_data(stream, sslsock) == FAILURE) {
+					return -1;
+				}
+#ifdef HAVE_TLS_SNI
+				php_openssl_enable_client_sni(stream, sslsock);
+#endif
 				SSL_set_connect_state(sslsock->ssl_handle);
 			} else {
+				php_openssl_init_server_reneg_limit(stream, sslsock);
 				SSL_set_accept_state(sslsock->ssl_handle);
 			}
 			sslsock->state_set = 1;
 		}
 
+		SSL_set_mode(sslsock->ssl_handle, SSL_MODE_RELEASE_BUFFERS);
+
 		if (SUCCESS == php_openssl_set_blocking(sslsock, 0)) {
 			/* The following mode are added only if we are able to change socket
 			 * to non blocking mode which is also used for read and write */
@@ -1998,6 +2907,7 @@ static ssize_t php_openssl_sockop_io(int read, php_stream *stream, char *buf, si
 
 			/* Now, do the IO operation. Don't block if we can't complete... */
 			ERR_clear_error();
+			sslsock->last_status = STREAM_CRYPTO_STATUS_NONE;
 			if (read) {
 				nr_bytes = SSL_read(sslsock->ssl_handle, buf, (int)count);
 
@@ -2072,6 +2982,10 @@ static ssize_t php_openssl_sockop_io(int read, php_stream *stream, char *buf, si
 						php_pollfd_for(sslsock->s.socket, (err == SSL_ERROR_WANT_READ) ?
 							(POLLIN|POLLPRI) : (POLLOUT|POLLPRI), has_timeout ? &left_time : NULL);
 					}
+				} else if (err == SSL_ERROR_WANT_READ) {
+					sslsock->last_status = STREAM_CRYPTO_STATUS_WANT_READ;
+				} else if (err == SSL_ERROR_WANT_WRITE) {
+					sslsock->last_status = STREAM_CRYPTO_STATUS_WANT_WRITE;
 				}
 			}
 
@@ -2200,6 +3114,34 @@ static int php_openssl_sockop_close(php_stream *stream, int close_handle) /* {{{
 		pefree(sslsock->reneg, php_stream_is_persistent(stream));
 	}
 
+	if (sslsock->session_callbacks && --sslsock->session_callbacks->refcount == 0) {
+		if (ZEND_FCC_INITIALIZED(sslsock->session_callbacks->new_cb)) {
+			zend_fcc_dtor(&sslsock->session_callbacks->new_cb);
+		}
+		if (ZEND_FCC_INITIALIZED(sslsock->session_callbacks->get_cb)) {
+			zend_fcc_dtor(&sslsock->session_callbacks->get_cb);
+		}
+		if (ZEND_FCC_INITIALIZED(sslsock->session_callbacks->remove_cb)) {
+			zend_fcc_dtor(&sslsock->session_callbacks->remove_cb);
+		}
+		pefree(sslsock->session_callbacks, php_stream_is_persistent(stream));
+	}
+
+	if (sslsock->psk_callbacks && --sslsock->psk_callbacks->refcount == 0) {
+		if (ZEND_FCC_INITIALIZED(sslsock->psk_callbacks->client_cb)) {
+			zend_fcc_dtor(&sslsock->psk_callbacks->client_cb);
+		}
+
+		if (ZEND_FCC_INITIALIZED(sslsock->psk_callbacks->server_cb)) {
+			zend_fcc_dtor(&sslsock->psk_callbacks->server_cb);
+		}
+		pefree(sslsock->psk_callbacks, php_stream_is_persistent(stream));
+	}
+
+	if (sslsock->psk_identity_buf) {
+		efree(sslsock->psk_identity_buf);
+	}
+
 	pefree(sslsock, php_stream_is_persistent(stream));
 
 	return 0;
@@ -2276,7 +3218,7 @@ static inline int php_openssl_tcp_sockop_accept(php_stream *stream, php_openssl_
 			clisockdata->method = sock->method;
 
 			if (php_stream_xport_crypto_setup(xparam->outputs.client, clisockdata->method,
-					NULL) < 0 || php_stream_xport_crypto_enable(
+					sock->ctx ? stream : NULL) < 0 || php_stream_xport_crypto_enable(
 					xparam->outputs.client, 1) < 0) {
 				php_error_docref(NULL, E_WARNING, "Failed to enable crypto");
 
@@ -2335,6 +3277,7 @@ static int php_openssl_sockop_set_option(php_stream *stream, int option, int val
 				add_assoc_string(&tmp, "cipher_name", (char *) SSL_CIPHER_get_name(cipher));
 				add_assoc_long(&tmp, "cipher_bits", SSL_CIPHER_get_bits(cipher, NULL));
 				add_assoc_string(&tmp, "cipher_version", SSL_CIPHER_get_version(cipher));
+				add_assoc_bool(&tmp, "session_reused", SSL_session_reused(sslsock->ssl_handle));
 
 #ifdef HAVE_TLS_ALPN
 				{
@@ -2511,11 +3454,12 @@ static int php_openssl_sockop_set_option(php_stream *stream, int option, int val
 				case STREAM_XPORT_CRYPTO_OP_SETUP:
 					cparam->outputs.returncode = php_openssl_setup_crypto(stream, sslsock, cparam);
 					return PHP_STREAM_OPTION_RETURN_OK;
-					break;
 				case STREAM_XPORT_CRYPTO_OP_ENABLE:
 					cparam->outputs.returncode = php_openssl_enable_crypto(stream, sslsock, cparam);
 					return PHP_STREAM_OPTION_RETURN_OK;
-					break;
+				case STREAM_XPORT_CRYPTO_OP_GET_STATUS:
+					cparam->outputs.returncode = sslsock->last_status;
+					return PHP_STREAM_OPTION_RETURN_OK;
 				default:
 					/* fall through */
 					break;
@@ -2537,7 +3481,14 @@ static int php_openssl_sockop_set_option(php_stream *stream, int option, int val
 						(xparam->op == STREAM_XPORT_OP_CONNECT_ASYNC &&
 						xparam->outputs.returncode == 1 && xparam->outputs.error_code == EINPROGRESS)))
 					{
-						if (php_stream_xport_crypto_setup(stream, sslsock->method, NULL) < 0 ||
+						zval *val;
+						php_stream *session_stream = NULL;
+
+						if (GET_VER_OPT("session_stream")) {
+							php_stream_from_zval_no_verify(session_stream, val);
+						}
+
+						if (php_stream_xport_crypto_setup(stream, sslsock->method, session_stream) < 0 ||
 								php_stream_xport_crypto_enable(stream, 1) < 0) {
 							php_error_docref(NULL, E_WARNING, "Failed to enable crypto");
 							xparam->outputs.returncode = -1;
@@ -2545,6 +3496,21 @@ static int php_openssl_sockop_set_option(php_stream *stream, int option, int val
 					}
 					return PHP_STREAM_OPTION_RETURN_OK;
 
+				case STREAM_XPORT_OP_LISTEN:
+					/* Do normal listen first */
+					xparam->outputs.returncode = php_stream_socket_ops.set_option(
+						stream, option, value, ptrparam);
+
+					if (xparam->outputs.returncode == 0 && sslsock->enable_on_connect) {
+						/* Check if we should create SSL_CTX early for session resumption */
+						if (php_openssl_is_session_cache_enabled(stream, false)) {
+							if (FAILURE == php_openssl_create_server_ctx(stream, sslsock, sslsock->method)) {
+								xparam->outputs.returncode = -1;
+							}
+						}
+					}
+					return PHP_STREAM_OPTION_RETURN_OK;
+
 				case STREAM_XPORT_OP_ACCEPT:
 					/* we need to copy the additional fields that the underlying tcp transport
 					 * doesn't know about */
diff --git a/ext/pcntl/config.m4 b/ext/pcntl/config.m4
index cfe6e80ca110..553419114fd2 100644
--- a/ext/pcntl/config.m4
+++ b/ext/pcntl/config.m4
@@ -68,9 +68,6 @@ int main(void) {
     [AC_DEFINE([HAVE_SCHED_GETCPU], [1],
       [Define to 1 if the 'sched_getcpu' function is properly supported.])])
 
-  AC_CHECK_TYPE([siginfo_t], [PCNTL_CFLAGS="-DHAVE_STRUCT_SIGINFO_T"],,
-    [#include ])
-
   PHP_NEW_EXTENSION([pcntl],
     [pcntl.c php_signal.c],
     [$ext_shared],
diff --git a/ext/pcntl/pcntl.c b/ext/pcntl/pcntl.c
index 0ef87fffa287..2ba732c4540e 100644
--- a/ext/pcntl/pcntl.c
+++ b/ext/pcntl/pcntl.c
@@ -1,14 +1,12 @@
 /*
    +----------------------------------------------------------------------+
-   | Copyright (c) The PHP Group                                          |
+   | Copyright © The PHP Group and Contributors.                          |
    +----------------------------------------------------------------------+
-   | This source file is subject to version 3.01 of the PHP license,      |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | https://www.php.net/license/3_01.txt                                 |
-   | If you did not receive a copy of the PHP license and are unable to   |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@php.net so we can mail you a copy immediately.               |
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Author: Jason Greene                            |
    +----------------------------------------------------------------------+
@@ -185,12 +183,8 @@ ZEND_GET_MODULE(pcntl)
 
 static void (*orig_interrupt_function)(zend_execute_data *execute_data);
 
-#ifdef HAVE_STRUCT_SIGINFO_T
 static void pcntl_signal_handler(int, siginfo_t*, void*);
 static void pcntl_siginfo_to_zval(int, siginfo_t*, zval*);
-#else
-static void pcntl_signal_handler(int);
-#endif
 static void pcntl_signal_dispatch(void);
 static void pcntl_signal_dispatch_tick_function(int dummy_int, void *dummy_pointer);
 static void pcntl_interrupt_function(zend_execute_data *execute_data);
@@ -240,7 +234,7 @@ PHP_RSHUTDOWN_FUNCTION(pcntl)
 	/* Reset all signals to their default disposition */
 	ZEND_HASH_FOREACH_NUM_KEY_VAL(&PCNTL_G(php_signal_table), signo, handle) {
 		if (Z_TYPE_P(handle) != IS_LONG || Z_LVAL_P(handle) != (zend_long)SIG_DFL) {
-			php_signal(signo, (Sigfunc *)(zend_long)SIG_DFL, 0);
+			php_signal(signo, (Sigfunc *)(zend_long)SIG_DFL, false);
 		}
 	} ZEND_HASH_FOREACH_END();
 
@@ -681,7 +675,11 @@ PHP_FUNCTION(pcntl_exec)
 	ZEND_PARSE_PARAMETERS_END();
 
 	if (args != NULL) {
-		// TODO Check array is a list?
+		if (!zend_array_is_list(Z_ARRVAL_P(args))) {
+			zend_argument_value_error(2, "must be a list array");
+			RETURN_THROWS();
+		}
+
 		/* Build argument list */
 		SEPARATE_ARRAY(args);
 		const HashTable *args_ht = Z_ARRVAL_P(args);
@@ -835,7 +833,7 @@ PHP_FUNCTION(pcntl_signal)
 			zend_argument_value_error(2, "must be either SIG_DFL or SIG_IGN when an integer value is given");
 			RETURN_THROWS();
 		}
-		if (php_signal(signo, (Sigfunc *) Z_LVAL_P(handle), (int) restart_syscalls) == (void *)SIG_ERR) {
+		if (php_signal(signo, (Sigfunc *) Z_LVAL_P(handle), restart_syscalls) == (void *)SIG_ERR) {
 			PCNTL_G(last_error) = errno;
 			php_error_docref(NULL, E_WARNING, "Error assigning signal");
 			RETURN_FALSE;
@@ -1007,8 +1005,7 @@ PHP_FUNCTION(pcntl_sigprocmask)
 /* }}} */
 #endif
 
-#ifdef HAVE_STRUCT_SIGINFO_T
-# ifdef HAVE_SIGWAITINFO
+#ifdef HAVE_SIGWAITINFO
 
 /* {{{ Synchronously wait for queued signals */
 PHP_FUNCTION(pcntl_sigwaitinfo)
@@ -1050,8 +1047,9 @@ PHP_FUNCTION(pcntl_sigwaitinfo)
 	RETURN_LONG(signal_no);
 }
 /* }}} */
-# endif
-# ifdef HAVE_SIGTIMEDWAIT
+#endif
+
+#ifdef HAVE_SIGTIMEDWAIT
 /* {{{ Wait for queued signals */
 PHP_FUNCTION(pcntl_sigtimedwait)
 {
@@ -1113,7 +1111,7 @@ PHP_FUNCTION(pcntl_sigtimedwait)
 	RETURN_LONG(signal_no);
 }
 /* }}} */
-# endif
+#endif
 
 static void pcntl_siginfo_to_zval(int signo, siginfo_t *siginfo, zval *user_siginfo) /* {{{ */
 {
@@ -1183,7 +1181,6 @@ static void pcntl_siginfo_to_zval(int signo, siginfo_t *siginfo, zval *user_sigi
 	}
 }
 /* }}} */
-#endif
 
 #ifdef HAVE_GETPRIORITY
 /* {{{ Get the priority of any process */
@@ -1325,11 +1322,7 @@ PHP_FUNCTION(pcntl_strerror)
 /* }}} */
 
 /* Our custom signal handler that calls the appropriate php_function */
-#ifdef HAVE_STRUCT_SIGINFO_T
 static void pcntl_signal_handler(int signo, siginfo_t *siginfo, void *context)
-#else
-static void pcntl_signal_handler(int signo)
-#endif
 {
 	struct php_pcntl_pending_signal *psig = PCNTL_G(spares);
 	if (!psig) {
@@ -1341,9 +1334,7 @@ static void pcntl_signal_handler(int signo)
 	psig->signo = signo;
 	psig->next = NULL;
 
-#ifdef HAVE_STRUCT_SIGINFO_T
 	psig->siginfo = *siginfo;
-#endif
 
 	/* the head check is important, as the tick handler cannot atomically clear both
 	 * the head and tail */
@@ -1395,19 +1386,14 @@ void pcntl_signal_dispatch(void)
 		if ((handle = zend_hash_index_find(&PCNTL_G(php_signal_table), queue->signo)) != NULL) {
 			if (Z_TYPE_P(handle) != IS_LONG) {
 				ZVAL_LONG(¶ms[0], queue->signo);
-#ifdef HAVE_STRUCT_SIGINFO_T
 				array_init(¶ms[1]);
 				pcntl_siginfo_to_zval(queue->signo, &queue->siginfo, ¶ms[1]);
-#else
-				ZVAL_NULL(¶ms[1]);
-#endif
 
 				/* Call php signal handler - Note that we do not report errors, and we ignore the return value */
 				call_user_function(NULL, NULL, handle, &retval, 2, params);
 				zval_ptr_dtor(&retval);
-#ifdef HAVE_STRUCT_SIGINFO_T
 				zval_ptr_dtor(¶ms[1]);
-#endif
+
 				if (EG(exception)) {
 					break;
 				}
@@ -1481,7 +1467,6 @@ PHP_FUNCTION(pcntl_unshare)
 			case EINVAL:
 				zend_argument_value_error(1, "must be a combination of CLONE_* flags, or at least one flag is unsupported by the kernel");
 				RETURN_THROWS();
-				break;
 #endif
 #ifdef ENOMEM
 			case ENOMEM:
diff --git a/ext/pcntl/pcntl.stub.php b/ext/pcntl/pcntl.stub.php
index 2da540fa71ec..4a4b8fe86931 100644
--- a/ext/pcntl/pcntl.stub.php
+++ b/ext/pcntl/pcntl.stub.php
@@ -1035,14 +1035,12 @@ function pcntl_signal_dispatch(): bool {}
     function pcntl_sigprocmask(int $mode, array $signals, &$old_signals = null): bool {}
 #endif
 
-#ifdef HAVE_STRUCT_SIGINFO_T
 #if (defined(HAVE_SIGWAITINFO) && defined(HAVE_SIGTIMEDWAIT))
     /** @param array $info */
     function pcntl_sigwaitinfo(array $signals, &$info = []): int|false {}
 
     /** @param array $info */
     function pcntl_sigtimedwait(array $signals, &$info = [], int $seconds = 0, int $nanoseconds = 0): int|false {}
-#endif
 #endif
 
     function pcntl_wifexited(int $status): bool {}
diff --git a/ext/pcntl/pcntl_arginfo.h b/ext/pcntl/pcntl_arginfo.h
index d9624a226057..2da7c8ad5db8 100644
--- a/ext/pcntl/pcntl_arginfo.h
+++ b/ext/pcntl/pcntl_arginfo.h
@@ -1,5 +1,5 @@
 /* This is a generated file, edit pcntl.stub.php instead.
- * Stub hash: dfa1e84a14e1926a50a42919e24ada58348fe4d9
+ * Stub hash: 04e7b30c6fb23cf6ce6bc26fe094fd5b4dbfe826
  * Has decl header: yes */
 
 ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_pcntl_fork, 0, 0, IS_LONG, 0)
@@ -49,7 +49,7 @@ ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_pcntl_sigprocmask, 0, 2, _IS_BOO
 ZEND_END_ARG_INFO()
 #endif
 
-#if defined(HAVE_STRUCT_SIGINFO_T) && (defined(HAVE_SIGWAITINFO) && defined(HAVE_SIGTIMEDWAIT))
+#if (defined(HAVE_SIGWAITINFO) && defined(HAVE_SIGTIMEDWAIT))
 ZEND_BEGIN_ARG_WITH_RETURN_TYPE_MASK_EX(arginfo_pcntl_sigwaitinfo, 0, 1, MAY_BE_LONG|MAY_BE_FALSE)
 	ZEND_ARG_TYPE_INFO(0, signals, IS_ARRAY, 0)
 	ZEND_ARG_INFO_WITH_DEFAULT_VALUE(1, info, "[]")
@@ -185,7 +185,7 @@ ZEND_FUNCTION(pcntl_signal_dispatch);
 #if defined(HAVE_SIGPROCMASK)
 ZEND_FUNCTION(pcntl_sigprocmask);
 #endif
-#if defined(HAVE_STRUCT_SIGINFO_T) && (defined(HAVE_SIGWAITINFO) && defined(HAVE_SIGTIMEDWAIT))
+#if (defined(HAVE_SIGWAITINFO) && defined(HAVE_SIGTIMEDWAIT))
 ZEND_FUNCTION(pcntl_sigwaitinfo);
 ZEND_FUNCTION(pcntl_sigtimedwait);
 #endif
@@ -246,7 +246,7 @@ static const zend_function_entry ext_functions[] = {
 #if defined(HAVE_SIGPROCMASK)
 	ZEND_FE(pcntl_sigprocmask, arginfo_pcntl_sigprocmask)
 #endif
-#if defined(HAVE_STRUCT_SIGINFO_T) && (defined(HAVE_SIGWAITINFO) && defined(HAVE_SIGTIMEDWAIT))
+#if (defined(HAVE_SIGWAITINFO) && defined(HAVE_SIGTIMEDWAIT))
 	ZEND_FE(pcntl_sigwaitinfo, arginfo_pcntl_sigwaitinfo)
 	ZEND_FE(pcntl_sigtimedwait, arginfo_pcntl_sigtimedwait)
 #endif
diff --git a/ext/pcntl/pcntl_decl.h b/ext/pcntl/pcntl_decl.h
index 1059485bc934..7f8e5172cedb 100644
--- a/ext/pcntl/pcntl_decl.h
+++ b/ext/pcntl/pcntl_decl.h
@@ -1,8 +1,8 @@
 /* This is a generated file, edit pcntl.stub.php instead.
- * Stub hash: dfa1e84a14e1926a50a42919e24ada58348fe4d9 */
+ * Stub hash: 04e7b30c6fb23cf6ce6bc26fe094fd5b4dbfe826 */
 
-#ifndef ZEND_PCNTL_DECL_dfa1e84a14e1926a50a42919e24ada58348fe4d9_H
-#define ZEND_PCNTL_DECL_dfa1e84a14e1926a50a42919e24ada58348fe4d9_H
+#ifndef ZEND_PCNTL_DECL_04e7b30c6fb23cf6ce6bc26fe094fd5b4dbfe826_H
+#define ZEND_PCNTL_DECL_04e7b30c6fb23cf6ce6bc26fe094fd5b4dbfe826_H
 
 typedef enum zend_enum_Pcntl_QosClass {
 	ZEND_ENUM_Pcntl_QosClass_UserInteractive = 1,
@@ -12,4 +12,4 @@ typedef enum zend_enum_Pcntl_QosClass {
 	ZEND_ENUM_Pcntl_QosClass_Background = 5,
 } zend_enum_Pcntl_QosClass;
 
-#endif /* ZEND_PCNTL_DECL_dfa1e84a14e1926a50a42919e24ada58348fe4d9_H */
+#endif /* ZEND_PCNTL_DECL_04e7b30c6fb23cf6ce6bc26fe094fd5b4dbfe826_H */
diff --git a/ext/pcntl/php_pcntl.h b/ext/pcntl/php_pcntl.h
index e02f93246e88..17b86bca47d6 100644
--- a/ext/pcntl/php_pcntl.h
+++ b/ext/pcntl/php_pcntl.h
@@ -1,14 +1,12 @@
 /*
    +----------------------------------------------------------------------+
-   | Copyright (c) The PHP Group                                          |
+   | Copyright © The PHP Group and Contributors.                          |
    +----------------------------------------------------------------------+
-   | This source file is subject to version 3.01 of the PHP license,      |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | https://www.php.net/license/3_01.txt                                 |
-   | If you did not receive a copy of the PHP license and are unable to   |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@php.net so we can mail you a copy immediately.               |
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Author: Jason Greene                            |
    +----------------------------------------------------------------------+
@@ -38,9 +36,7 @@ PHP_MINFO_FUNCTION(pcntl);
 struct php_pcntl_pending_signal {
 	struct php_pcntl_pending_signal *next;
 	zend_long signo;
-#ifdef HAVE_STRUCT_SIGINFO_T
 	siginfo_t siginfo;
-#endif
 };
 
 ZEND_BEGIN_MODULE_GLOBALS(pcntl)
diff --git a/ext/pcntl/php_signal.c b/ext/pcntl/php_signal.c
index 14c169310e60..b0357d86f02b 100644
--- a/ext/pcntl/php_signal.c
+++ b/ext/pcntl/php_signal.c
@@ -1,14 +1,12 @@
 /*
    +----------------------------------------------------------------------+
-   | Copyright (c) The PHP Group                                          |
+   | Copyright © The PHP Group and Contributors.                          |
    +----------------------------------------------------------------------+
-   | This source file is subject to version 3.01 of the PHP license,      |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | https://www.php.net/license/3_01.txt                                 |
-   | If you did not receive a copy of the PHP license and are unable to   |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@php.net so we can mail you a copy immediately.               |
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Author: Jason Greene                            |
    +----------------------------------------------------------------------+
@@ -21,24 +19,18 @@
 
 /* php_signal using sigaction is derived from Advanced Programming
  * in the Unix Environment by W. Richard Stevens p 298. */
-Sigfunc *php_signal4(int signo, Sigfunc *func, int restart, int mask_all)
+Sigfunc *php_signal4(int signo, Sigfunc *func, bool restart, bool mask_all)
 {
 	struct sigaction act,oact;
 
-#ifdef HAVE_STRUCT_SIGINFO_T
 	act.sa_sigaction = func;
-#else
-	act.sa_handler = func;
-#endif
 	if (mask_all) {
 		sigfillset(&act.sa_mask);
 	} else {
 		sigemptyset(&act.sa_mask);
 	}
 	act.sa_flags = SA_ONSTACK;
-#ifdef HAVE_STRUCT_SIGINFO_T
 	act.sa_flags |= SA_SIGINFO;
-#endif
 	if (!restart) {
 #ifdef SA_INTERRUPT
 		act.sa_flags |= SA_INTERRUPT; /* SunOS */
@@ -50,14 +42,10 @@ Sigfunc *php_signal4(int signo, Sigfunc *func, int restart, int mask_all)
 	}
 	zend_sigaction(signo, &act, &oact);
 
-#ifdef HAVE_STRUCT_SIGINFO_T
 	return oact.sa_sigaction;
-#else
-	return oact.sa_handler;
-#endif
 }
 
-Sigfunc *php_signal(int signo, Sigfunc *func, int restart)
+Sigfunc *php_signal(int signo, Sigfunc *func, bool restart)
 {
-	return php_signal4(signo, func, restart, 0);
+	return php_signal4(signo, func, restart, false);
 }
diff --git a/ext/pcntl/php_signal.h b/ext/pcntl/php_signal.h
index 256898e70acb..7b103793e544 100644
--- a/ext/pcntl/php_signal.h
+++ b/ext/pcntl/php_signal.h
@@ -1,14 +1,12 @@
 /*
    +----------------------------------------------------------------------+
-   | Copyright (c) The PHP Group                                          |
+   | Copyright © The PHP Group and Contributors.                          |
    +----------------------------------------------------------------------+
-   | This source file is subject to version 3.01 of the PHP license,      |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | https://www.php.net/license/3_01.txt                                 |
-   | If you did not receive a copy of the PHP license and are unable to   |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@php.net so we can mail you a copy immediately.               |
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Author: Jason Greene                            |
    +----------------------------------------------------------------------+
@@ -18,12 +16,9 @@
 #ifndef PHP_SIGNAL_H
 #define PHP_SIGNAL_H
 
-#ifdef HAVE_STRUCT_SIGINFO_T
 typedef void Sigfunc(int, siginfo_t*, void*);
-#else
-typedef void Sigfunc(int);
-#endif
-Sigfunc *php_signal(int signo, Sigfunc *func, int restart);
-Sigfunc *php_signal4(int signo, Sigfunc *func, int restart, int mask_all);
+
+Sigfunc *php_signal(int signo, Sigfunc *func, bool restart);
+Sigfunc *php_signal4(int signo, Sigfunc *func, bool restart, bool mask_all);
 
 #endif
diff --git a/ext/pcntl/tests/pcntl_exec_list_args.phpt b/ext/pcntl/tests/pcntl_exec_list_args.phpt
new file mode 100644
index 000000000000..5cd8c0fbe228
--- /dev/null
+++ b/ext/pcntl/tests/pcntl_exec_list_args.phpt
@@ -0,0 +1,14 @@
+--TEST--
+pcntl_exec(): Argument array must be a list
+--EXTENSIONS--
+pcntl
+--FILE--
+ '-n']);
+} catch (Throwable $e) {
+    echo $e::class, ': ', $e->getMessage(), "\n";
+}
+?>
+--EXPECT--
+ValueError: pcntl_exec(): Argument #2 ($args) must be a list array
diff --git a/ext/pcre/php_pcre.c b/ext/pcre/php_pcre.c
index 32ab6b0e5090..6a62d9717e7b 100644
--- a/ext/pcre/php_pcre.c
+++ b/ext/pcre/php_pcre.c
@@ -1,14 +1,12 @@
 /*
    +----------------------------------------------------------------------+
-   | Copyright (c) The PHP Group                                          |
+   | Copyright © The PHP Group and Contributors.                          |
    +----------------------------------------------------------------------+
-   | This source file is subject to version 3.01 of the PHP license,      |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | https://www.php.net/license/3_01.txt                                 |
-   | If you did not receive a copy of the PHP license and are unable to   |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@php.net so we can mail you a copy immediately.               |
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Author: Andrei Zmievski                              |
    +----------------------------------------------------------------------+
@@ -622,7 +620,7 @@ PHPAPI pcre_cache_entry* pcre_get_compiled_regex_cache_ex(zend_string *regex, bo
 
 	/* Parse through the leading whitespace, and display a warning if we
 	   get to the end without encountering a delimiter. */
-	while (isspace((int)*(unsigned char *)p)) p++;
+	while (isspace((unsigned char)*p)) p++;
 	if (p >= end_p) {
 		if (key != regex) {
 			zend_string_release_ex(key, 0);
@@ -635,7 +633,7 @@ PHPAPI pcre_cache_entry* pcre_get_compiled_regex_cache_ex(zend_string *regex, bo
 	/* Get the delimiter and display a warning if it is alphanumeric
 	   or a backslash. */
 	delimiter = *p++;
-	if (isalnum((int)*(unsigned char *)&delimiter) || delimiter == '\\' || delimiter == '\0') {
+	if (isalnum((unsigned char)delimiter) || delimiter == '\\' || delimiter == '\0') {
 		if (key != regex) {
 			zend_string_release_ex(key, 0);
 		}
@@ -750,21 +748,23 @@ PHPAPI pcre_cache_entry* pcre_get_compiled_regex_cache_ex(zend_string *regex, bo
 	}
 
 	if (key != regex) {
-		tables = (uint8_t *)zend_hash_find_ptr(&char_tables, BG(ctype_string));
-		if (!tables) {
-			zend_string *_k;
+		zv = zend_hash_str_lookup(&char_tables, ZSTR_VAL(BG(ctype_string)), ZSTR_LEN(BG(ctype_string)));
+		if (Z_ISNULL_P(zv)) {
 			tables = pcre2_maketables(gctx);
 			if (UNEXPECTED(!tables)) {
+				/* Remove the placeholder entry created by zend_hash_str_lookup(),
+				 * set ptr to NULL first so the destructor (pefree) is safe. */
+				ZVAL_PTR(zv, NULL);
+				zend_hash_str_del(&char_tables, ZSTR_VAL(BG(ctype_string)), ZSTR_LEN(BG(ctype_string)));
 				php_error_docref(NULL,E_WARNING, "Failed to generate locale character tables");
 				pcre_handle_exec_error(PCRE2_ERROR_NOMEMORY);
 				zend_string_release_ex(key, 0);
 				efree(pattern);
 				return NULL;
 			}
-			_k = zend_string_init(ZSTR_VAL(BG(ctype_string)), ZSTR_LEN(BG(ctype_string)), 1);
-			GC_MAKE_PERSISTENT_LOCAL(_k);
-			zend_hash_add_ptr(&char_tables, _k, (void *)tables);
-			zend_string_release(_k);
+			ZVAL_PTR(zv, (void *)tables);
+		} else {
+			tables = Z_PTR_P(zv);
 		}
 	}
 	pcre2_set_character_tables(cctx, tables);
@@ -826,19 +826,8 @@ PHPAPI pcre_cache_entry* pcre_get_compiled_regex_cache_ex(zend_string *regex, bo
 	new_entry.refcount = 0;
 	new_entry.subpats_table = NULL;
 
-	rc = pcre2_pattern_info(re, PCRE2_INFO_CAPTURECOUNT, &new_entry.capture_count);
-	if (rc < 0) {
-		if (key != regex) {
-			zend_string_release_ex(key, 0);
-		}
-		pcre2_code_free(new_entry.re);
-		php_error_docref(NULL, E_WARNING, "Internal pcre2_pattern_info() error %d", rc);
-		pcre_handle_exec_error(PCRE2_ERROR_INTERNAL);
-		return NULL;
-	}
-
-	rc = pcre2_pattern_info(re, PCRE2_INFO_NAMECOUNT, &new_entry.name_count);
-	if (rc < 0) {
+	if ((rc = pcre2_pattern_info(re, PCRE2_INFO_CAPTURECOUNT, &new_entry.capture_count)) < 0 ||
+	    (rc = pcre2_pattern_info(re, PCRE2_INFO_NAMECOUNT, &new_entry.name_count)) < 0) {
 		if (key != regex) {
 			zend_string_release_ex(key, 0);
 		}
@@ -1090,7 +1079,7 @@ static void populate_subpat_array(
 	/* Add MARK, if available */
 	if (mark) {
 		ZVAL_STRING(&val, (char *)mark);
-		zend_hash_str_add_new(subpats_ht, ZEND_STRL("MARK"), &val);
+		zend_hash_str_update(subpats_ht, ZEND_STRL("MARK"), &val);
 	}
 }
 
@@ -1570,6 +1559,7 @@ static zend_string *preg_do_repl_func(zend_fcall_info *fci, zend_fcall_info_cach
 	fci->retval = &retval;
 	fci->param_count = 1;
 	fci->params = &arg;
+	fci->consumed_args = zend_fci_consumed_arg(0);
 	zend_call_function(fci, fcc);
 	zval_ptr_dtor(&arg);
 	if (EXPECTED(Z_TYPE(retval) == IS_STRING)) {
@@ -2495,7 +2485,7 @@ PHP_FUNCTION(preg_replace_callback_array)
 			case IS_NULL:
 				RETVAL_NULL();
 				goto error;
-			EMPTY_SWITCH_DEFAULT_CASE()
+			default: ZEND_UNREACHABLE();
 		}
 
 		if (EG(exception)) {
diff --git a/ext/pcre/php_pcre.h b/ext/pcre/php_pcre.h
index e180d68a3d48..ebaa686a31c3 100644
--- a/ext/pcre/php_pcre.h
+++ b/ext/pcre/php_pcre.h
@@ -1,14 +1,12 @@
 /*
    +----------------------------------------------------------------------+
-   | Copyright (c) The PHP Group                                          |
+   | Copyright © The PHP Group and Contributors.                          |
    +----------------------------------------------------------------------+
-   | This source file is subject to version 3.01 of the PHP license,      |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | https://www.php.net/license/3_01.txt                                 |
-   | If you did not receive a copy of the PHP license and are unable to   |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@php.net so we can mail you a copy immediately.               |
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Author: Andrei Zmievski                              |
    +----------------------------------------------------------------------+
diff --git a/ext/pcre/tests/mark_named_collision.phpt b/ext/pcre/tests/mark_named_collision.phpt
new file mode 100644
index 000000000000..b644c4d44023
--- /dev/null
+++ b/ext/pcre/tests/mark_named_collision.phpt
@@ -0,0 +1,15 @@
+--TEST--
+preg_match: (*MARK:name) directive does not collide with named group called MARK
+--FILE--
+[abc])(*MARK:value)/', "abc", $m);
+echo "count: ", count($m), "\n";
+echo "MARK: ", $m['MARK'], "\n";
+echo "json: ", json_encode($m), "\n";
+echo "keys: ", implode(',', array_keys($m)), "\n";
+?>
+--EXPECT--
+count: 3
+MARK: value
+json: {"0":"a","MARK":"value","1":"a"}
+keys: 0,MARK,1
diff --git a/ext/pcre/tests/preg_replace_callback_matches_refcount.phpt b/ext/pcre/tests/preg_replace_callback_matches_refcount.phpt
new file mode 100644
index 000000000000..0ae802654c9a
--- /dev/null
+++ b/ext/pcre/tests/preg_replace_callback_matches_refcount.phpt
@@ -0,0 +1,37 @@
+--TEST--
+preg_replace_callback(): capture match array refcount stays low during callback
+--FILE--
+ static function ($matches) {
+    debug_zval_dump($matches);
+    return '';
+}], 'abc'));
+?>
+--EXPECTF--
+array(4) packed refcount(2){
+  [0]=>
+  string(3) "abc"%s
+  [1]=>
+  string(1) "a" interned
+  [2]=>
+  string(1) "b" interned
+  [3]=>
+  string(1) "c" interned
+}
+string(0) ""
+array(4) packed refcount(2){
+  [0]=>
+  string(3) "abc"%s
+  [1]=>
+  string(1) "a" interned
+  [2]=>
+  string(1) "b" interned
+  [3]=>
+  string(1) "c" interned
+}
+string(0) ""
diff --git a/ext/pdo/pdo.c b/ext/pdo/pdo.c
index 2966cd0be569..5b881b0f56da 100644
--- a/ext/pdo/pdo.c
+++ b/ext/pdo/pdo.c
@@ -1,14 +1,12 @@
 /*
   +----------------------------------------------------------------------+
-  | Copyright (c) The PHP Group                                          |
+  | Copyright © The PHP Group and Contributors.                          |
   +----------------------------------------------------------------------+
-  | This source file is subject to version 3.01 of the PHP license,      |
-  | that is bundled with this package in the file LICENSE, and is        |
-  | available through the world-wide-web at the following url:           |
-  | https://www.php.net/license/3_01.txt                                 |
-  | If you did not receive a copy of the PHP license and are unable to   |
-  | obtain it through the world-wide-web, please send a note to          |
-  | license@php.net so we can mail you a copy immediately.               |
+  | This source file is subject to the Modified BSD License that is      |
+  | bundled with this package in the file LICENSE, and is available      |
+  | through the World Wide Web at .        |
+  |                                                                      |
+  | SPDX-License-Identifier: BSD-3-Clause                                |
   +----------------------------------------------------------------------+
   | Author: Wez Furlong                                     |
   |         Marcus Boerger                                |
@@ -241,7 +239,7 @@ PDO_API int php_pdo_parse_data_source(const char *data_source, zend_ulong data_s
 			}
 		}
 
-		while (i < data_source_len && isspace(data_source[i])) {
+		while (i < data_source_len && isspace((unsigned char)data_source[i])) {
 			i++;
 		}
 
diff --git a/ext/pdo/pdo_dbh.c b/ext/pdo/pdo_dbh.c
index 34f19e364faa..6a47ec30c862 100644
--- a/ext/pdo/pdo_dbh.c
+++ b/ext/pdo/pdo_dbh.c
@@ -1,14 +1,12 @@
 /*
   +----------------------------------------------------------------------+
-  | Copyright (c) The PHP Group                                          |
+  | Copyright © The PHP Group and Contributors.                          |
   +----------------------------------------------------------------------+
-  | This source file is subject to version 3.01 of the PHP license,      |
-  | that is bundled with this package in the file LICENSE, and is        |
-  | available through the world-wide-web at the following url:           |
-  | https://www.php.net/license/3_01.txt                                 |
-  | If you did not receive a copy of the PHP license and are unable to   |
-  | obtain it through the world-wide-web, please send a note to          |
-  | license@php.net so we can mail you a copy immediately.               |
+  | This source file is subject to the Modified BSD License that is      |
+  | bundled with this package in the file LICENSE, and is available      |
+  | through the World Wide Web at .        |
+  |                                                                      |
+  | SPDX-License-Identifier: BSD-3-Clause                                |
   +----------------------------------------------------------------------+
   | Author: Wez Furlong                                     |
   |         Marcus Boerger                                |
@@ -1531,7 +1529,7 @@ void pdo_dbh_init(int module_number)
 	pdo_dbh_ce->default_object_handlers = &pdo_dbh_object_handlers;
 
 	memcpy(&pdo_dbh_object_handlers, &std_object_handlers, sizeof(zend_object_handlers));
-	pdo_dbh_object_handlers.offset = XtOffsetOf(pdo_dbh_object_t, std);
+	pdo_dbh_object_handlers.offset = offsetof(pdo_dbh_object_t, std);
 	pdo_dbh_object_handlers.free_obj = pdo_dbh_free_storage;
 	pdo_dbh_object_handlers.clone_obj = NULL;
 	pdo_dbh_object_handlers.get_method = dbh_method_get;
diff --git a/ext/pdo/pdo_sql_parser.h b/ext/pdo/pdo_sql_parser.h
index 0701d984ae64..9baca65e5f90 100644
--- a/ext/pdo/pdo_sql_parser.h
+++ b/ext/pdo/pdo_sql_parser.h
@@ -1,14 +1,12 @@
 /*
   +----------------------------------------------------------------------+
-  | Copyright (c) The PHP Group                                          |
+  | Copyright © The PHP Group and Contributors.                          |
   +----------------------------------------------------------------------+
-  | This source file is subject to version 3.01 of the PHP license,      |
-  | that is bundled with this package in the file LICENSE, and is        |
-  | available through the world-wide-web at the following url:           |
-  | https://www.php.net/license/3_01.txt                                 |
-  | If you did not receive a copy of the PHP license and are unable to   |
-  | obtain it through the world-wide-web, please send a note to          |
-  | license@php.net so we can mail you a copy immediately.               |
+  | This source file is subject to the Modified BSD License that is      |
+  | bundled with this package in the file LICENSE, and is available      |
+  | through the World Wide Web at .        |
+  |                                                                      |
+  | SPDX-License-Identifier: BSD-3-Clause                                |
   +----------------------------------------------------------------------+
   | Author: George Schlossnagle                       |
   +----------------------------------------------------------------------+
diff --git a/ext/pdo/pdo_sql_parser.re b/ext/pdo/pdo_sql_parser.re
index 1897f9f238bf..d77425531cc4 100644
--- a/ext/pdo/pdo_sql_parser.re
+++ b/ext/pdo/pdo_sql_parser.re
@@ -1,14 +1,12 @@
 /*
   +----------------------------------------------------------------------+
-  | Copyright (c) The PHP Group                                          |
+  | Copyright © The PHP Group and Contributors.                          |
   +----------------------------------------------------------------------+
-  | This source file is subject to version 3.01 of the PHP license,      |
-  | that is bundled with this package in the file LICENSE, and is        |
-  | available through the world-wide-web at the following url:           |
-  | https://www.php.net/license/3_01.txt                                 |
-  | If you did not receive a copy of the PHP license and are unable to   |
-  | obtain it through the world-wide-web, please send a note to          |
-  | license@php.net so we can mail you a copy immediately.               |
+  | This source file is subject to the Modified BSD License that is      |
+  | bundled with this package in the file LICENSE, and is available      |
+  | through the World Wide Web at .        |
+  |                                                                      |
+  | SPDX-License-Identifier: BSD-3-Clause                                |
   +----------------------------------------------------------------------+
   | Author: George Schlossnagle                       |
   +----------------------------------------------------------------------+
@@ -117,7 +115,7 @@ PDO_API int pdo_parse_params(pdo_stmt_t *stmt, zend_string *inquery, zend_string
 
 			if (t == PDO_PARSER_BIND) {
 				ptrdiff_t len = s.cur - s.tok;
-				if ((ZSTR_VAL(inquery) < (s.cur - len)) && isalnum(*(s.cur - len - 1))) {
+				if ((ZSTR_VAL(inquery) < (s.cur - len)) && isalnum((unsigned char)s.cur[-len - 1])) {
 					continue;
 				}
 				query_type |= PDO_PLACEHOLDER_NAMED;
diff --git a/ext/pdo/pdo_sqlstate.c b/ext/pdo/pdo_sqlstate.c
index a44b95a9181d..089c1bdd027f 100644
--- a/ext/pdo/pdo_sqlstate.c
+++ b/ext/pdo/pdo_sqlstate.c
@@ -1,14 +1,12 @@
 /*
   +----------------------------------------------------------------------+
-  | Copyright (c) The PHP Group                                          |
+  | Copyright © The PHP Group and Contributors.                          |
   +----------------------------------------------------------------------+
-  | This source file is subject to version 3.01 of the PHP license,      |
-  | that is bundled with this package in the file LICENSE, and is        |
-  | available through the world-wide-web at the following url:           |
-  | https://www.php.net/license/3_01.txt                                 |
-  | If you did not receive a copy of the PHP license and are unable to   |
-  | obtain it through the world-wide-web, please send a note to          |
-  | license@php.net so we can mail you a copy immediately.               |
+  | This source file is subject to the Modified BSD License that is      |
+  | bundled with this package in the file LICENSE, and is available      |
+  | through the World Wide Web at .        |
+  |                                                                      |
+  | SPDX-License-Identifier: BSD-3-Clause                                |
   +----------------------------------------------------------------------+
   | Author: Wez Furlong                                     |
   +----------------------------------------------------------------------+
diff --git a/ext/pdo/pdo_stmt.c b/ext/pdo/pdo_stmt.c
index 1e2c2d14f37d..09b9fd3550e6 100644
--- a/ext/pdo/pdo_stmt.c
+++ b/ext/pdo/pdo_stmt.c
@@ -1,14 +1,12 @@
 /*
   +----------------------------------------------------------------------+
-  | Copyright (c) The PHP Group                                          |
+  | Copyright © The PHP Group and Contributors.                          |
   +----------------------------------------------------------------------+
-  | This source file is subject to version 3.01 of the PHP license,      |
-  | that is bundled with this package in the file LICENSE, and is        |
-  | available through the world-wide-web at the following url:           |
-  | https://www.php.net/license/3_01.txt                                 |
-  | If you did not receive a copy of the PHP license and are unable to   |
-  | obtain it through the world-wide-web, please send a note to          |
-  | license@php.net so we can mail you a copy immediately.               |
+  | This source file is subject to the Modified BSD License that is      |
+  | bundled with this package in the file LICENSE, and is available      |
+  | through the World Wide Web at .        |
+  |                                                                      |
+  | SPDX-License-Identifier: BSD-3-Clause                                |
   +----------------------------------------------------------------------+
   | Author: Wez Furlong                                     |
   |         Marcus Boerger                                |
@@ -148,7 +146,7 @@ bool pdo_stmt_describe_columns(pdo_stmt_t *stmt) /* {{{ */
 					stmt->columns[col].name = zend_string_toupper(orig_name);
 					zend_string_release(orig_name);
 					break;
-				EMPTY_SWITCH_DEFAULT_CASE()
+				default: ZEND_UNREACHABLE();
 			}
 		}
 
@@ -823,7 +821,7 @@ static bool do_fetch(pdo_stmt_t *stmt, zval *return_value, enum pdo_fetch_type h
 			 * However, if we fetch a group key we will have over allocated. */
 			fetch_function_params = safe_emalloc(sizeof(zval), stmt->column_count, 0);
 			break;
-		EMPTY_SWITCH_DEFAULT_CASE();
+		default: ZEND_UNREACHABLE();
 	}
 
 	if (group_key) {
@@ -918,7 +916,7 @@ static bool do_fetch(pdo_stmt_t *stmt, zval *return_value, enum pdo_fetch_type h
 			case PDO_FETCH_FUNC:
 				ZVAL_COPY_VALUE(&fetch_function_params[fetch_function_param_num++], &val);
 				break;
-			EMPTY_SWITCH_DEFAULT_CASE();
+			default: ZEND_UNREACHABLE();
 		}
 	}
 
@@ -1181,7 +1179,7 @@ PHP_METHOD(PDOStatement, fetchAll)
 			zend_class_entry *fetch_class = NULL;
 			if (arg2) {
 				if (Z_TYPE_P(arg2) != IS_STRING) {
-					zend_argument_type_error(2, "must be of type string, %s given", zend_zval_value_name(arg2));
+					zend_wrong_parameter_type_error(2, Z_EXPECTED_STRING, arg2);
 					RETURN_THROWS();
 				}
 				fetch_class = zend_lookup_class(Z_STR_P(arg2));
@@ -1230,7 +1228,7 @@ PHP_METHOD(PDOStatement, fetchAll)
 			if (arg2) {
 				// Reuse convert_to_long(arg2); ?
 				if (Z_TYPE_P(arg2) != IS_LONG) {
-					zend_argument_type_error(2, "must be of type int, %s given", zend_zval_value_name(arg2));
+					zend_wrong_parameter_type_error(2, Z_EXPECTED_LONG, arg2);
 					RETURN_THROWS();
 				}
 				if (Z_LVAL_P(arg2) < 0) {
@@ -1700,7 +1698,7 @@ bool pdo_stmt_setup_fetch_mode(pdo_stmt_t *stmt, zend_long mode, uint32_t mode_a
 					return false;
 				}
 				if (Z_TYPE(args[0]) != IS_STRING) {
-					zend_argument_type_error(arg1_arg_num, "must be of type string, %s given", zend_zval_value_name(&args[0]));
+					zend_wrong_parameter_type_error(arg1_arg_num, Z_EXPECTED_STRING, &args[0]);
 					return false;
 				}
 				cep = zend_lookup_class(Z_STR(args[0]));
@@ -1712,8 +1710,7 @@ bool pdo_stmt_setup_fetch_mode(pdo_stmt_t *stmt, zend_long mode, uint32_t mode_a
 				/* TODO: Improve logic? */
 				if (variadic_num_args == 2) {
 					if (Z_TYPE(args[1]) != IS_NULL && Z_TYPE(args[1]) != IS_ARRAY) {
-						zend_argument_type_error(constructor_arg_num, "must be of type ?array, %s given",
-							zend_zval_value_name(&args[1]));
+						zend_wrong_parameter_type_error(constructor_arg_num, Z_EXPECTED_ARRAY_OR_NULL, &args[1]);
 						return false;
 					}
 					if (Z_TYPE(args[1]) == IS_ARRAY && zend_hash_num_elements(Z_ARRVAL(args[1]))) {
@@ -1738,7 +1735,7 @@ bool pdo_stmt_setup_fetch_mode(pdo_stmt_t *stmt, zend_long mode, uint32_t mode_a
 				return false;
 			}
 			if (Z_TYPE(args[0]) != IS_OBJECT) {
-				zend_argument_type_error(arg1_arg_num, "must be of type object, %s given", zend_zval_value_name(&args[0]));
+				zend_wrong_parameter_type_error(arg1_arg_num, Z_EXPECTED_OBJECT, &args[0]);
 				return false;
 			}
 
@@ -2422,7 +2419,7 @@ void pdo_stmt_init(void)
 	pdo_dbstmt_ce->default_object_handlers = &pdo_dbstmt_object_handlers;
 
 	memcpy(&pdo_dbstmt_object_handlers, &std_object_handlers, sizeof(zend_object_handlers));
-	pdo_dbstmt_object_handlers.offset = XtOffsetOf(pdo_stmt_t, std);
+	pdo_dbstmt_object_handlers.offset = offsetof(pdo_stmt_t, std);
 	pdo_dbstmt_object_handlers.free_obj = pdo_dbstmt_free_storage;
 	pdo_dbstmt_object_handlers.write_property = dbstmt_prop_write;
 	pdo_dbstmt_object_handlers.unset_property = dbstmt_prop_delete;
@@ -2436,7 +2433,7 @@ void pdo_stmt_init(void)
 	pdo_row_ce->default_object_handlers = &pdo_row_object_handlers;
 
 	memcpy(&pdo_row_object_handlers, &std_object_handlers, sizeof(zend_object_handlers));
-	pdo_row_object_handlers.offset = XtOffsetOf(pdo_row_t, std);
+	pdo_row_object_handlers.offset = offsetof(pdo_row_t, std);
 	pdo_row_object_handlers.free_obj = pdo_row_free_storage;
 	pdo_row_object_handlers.clone_obj = NULL;
 	pdo_row_object_handlers.get_property_ptr_ptr = pdo_row_get_property_ptr_ptr;
diff --git a/ext/pdo/php_pdo.h b/ext/pdo/php_pdo.h
index 59789a04c73f..39443bb35c89 100644
--- a/ext/pdo/php_pdo.h
+++ b/ext/pdo/php_pdo.h
@@ -1,14 +1,12 @@
 /*
   +----------------------------------------------------------------------+
-  | Copyright (c) The PHP Group                                          |
+  | Copyright © The PHP Group and Contributors.                          |
   +----------------------------------------------------------------------+
-  | This source file is subject to version 3.01 of the PHP license,      |
-  | that is bundled with this package in the file LICENSE, and is        |
-  | available through the world-wide-web at the following url:           |
-  | https://www.php.net/license/3_01.txt                                 |
-  | If you did not receive a copy of the PHP license and are unable to   |
-  | obtain it through the world-wide-web, please send a note to          |
-  | license@php.net so we can mail you a copy immediately.               |
+  | This source file is subject to the Modified BSD License that is      |
+  | bundled with this package in the file LICENSE, and is available      |
+  | through the World Wide Web at .        |
+  |                                                                      |
+  | SPDX-License-Identifier: BSD-3-Clause                                |
   +----------------------------------------------------------------------+
   | Author: Wez Furlong                                     |
   +----------------------------------------------------------------------+
diff --git a/ext/pdo/php_pdo_driver.h b/ext/pdo/php_pdo_driver.h
index 9c5986ff8bce..479a1b5436c9 100644
--- a/ext/pdo/php_pdo_driver.h
+++ b/ext/pdo/php_pdo_driver.h
@@ -1,14 +1,12 @@
 /*
   +----------------------------------------------------------------------+
-  | Copyright (c) The PHP Group                                          |
+  | Copyright © The PHP Group and Contributors.                          |
   +----------------------------------------------------------------------+
-  | This source file is subject to version 3.01 of the PHP license,      |
-  | that is bundled with this package in the file LICENSE, and is        |
-  | available through the world-wide-web at the following url:           |
-  | https://www.php.net/license/3_01.txt                                 |
-  | If you did not receive a copy of the PHP license and are unable to   |
-  | obtain it through the world-wide-web, please send a note to          |
-  | license@php.net so we can mail you a copy immediately.               |
+  | This source file is subject to the Modified BSD License that is      |
+  | bundled with this package in the file LICENSE, and is available      |
+  | through the World Wide Web at .        |
+  |                                                                      |
+  | SPDX-License-Identifier: BSD-3-Clause                                |
   +----------------------------------------------------------------------+
   | Author: Wez Furlong                                     |
   +----------------------------------------------------------------------+
@@ -520,12 +518,10 @@ struct _pdo_dbh_object_t {
 };
 
 static inline pdo_dbh_t *php_pdo_dbh_fetch_inner(zend_object *obj) {
-	return (pdo_dbh_t *)(((pdo_dbh_object_t *)((char*)(obj) - XtOffsetOf(pdo_dbh_object_t, std)))->inner);
+	return (pdo_dbh_t *)((ZEND_CONTAINER_OF(obj, pdo_dbh_object_t, std))->inner);
 }
 
-static inline pdo_dbh_object_t *php_pdo_dbh_fetch_object(zend_object *obj) {
-	return (pdo_dbh_object_t *)((char*)(obj) - XtOffsetOf(pdo_dbh_object_t, std));
-}
+#define php_pdo_dbh_fetch_object(obj) ZEND_CONTAINER_OF(obj, pdo_dbh_object_t, std)
 
 #define Z_PDO_DBH_P(zv) php_pdo_dbh_fetch_inner(Z_OBJ_P((zv)))
 #define Z_PDO_OBJECT_P(zv) php_pdo_dbh_fetch_object(Z_OBJ_P((zv)))
@@ -639,11 +635,7 @@ struct _pdo_stmt_t {
 	zend_object std;
 };
 
-
-
-static inline pdo_stmt_t *php_pdo_stmt_fetch_object(zend_object *obj) {
-	return (pdo_stmt_t *)((char*)(obj) - XtOffsetOf(pdo_stmt_t, std));
-}
+#define php_pdo_stmt_fetch_object(obj) ZEND_CONTAINER_OF(obj, pdo_stmt_t, std)
 
 #define Z_PDO_STMT_P(zv) php_pdo_stmt_fetch_object(Z_OBJ_P((zv)))
 
@@ -652,9 +644,7 @@ struct _pdo_row_t {
 	zend_object std;
 };
 
-static inline pdo_row_t *php_pdo_row_fetch_object(zend_object *obj) {
-	return (pdo_row_t *)((char*)(obj) - XtOffsetOf(pdo_row_t, std));
-}
+#define php_pdo_row_fetch_object(obj) ZEND_CONTAINER_OF(obj, pdo_row_t, std)
 
 struct _pdo_scanner_t {
 	const char *ptr, *cur, *tok, *end;
diff --git a/ext/pdo/php_pdo_error.h b/ext/pdo/php_pdo_error.h
index 50c751a0f490..79d1c482d609 100644
--- a/ext/pdo/php_pdo_error.h
+++ b/ext/pdo/php_pdo_error.h
@@ -1,14 +1,12 @@
 /*
   +----------------------------------------------------------------------+
-  | Copyright (c) The PHP Group                                          |
+  | Copyright © The PHP Group and Contributors.                          |
   +----------------------------------------------------------------------+
-  | This source file is subject to version 3.01 of the PHP license,      |
-  | that is bundled with this package in the file LICENSE, and is        |
-  | available through the world-wide-web at the following url:           |
-  | https://www.php.net/license/3_01.txt                                 |
-  | If you did not receive a copy of the PHP license and are unable to   |
-  | obtain it through the world-wide-web, please send a note to          |
-  | license@php.net so we can mail you a copy immediately.               |
+  | This source file is subject to the Modified BSD License that is      |
+  | bundled with this package in the file LICENSE, and is available      |
+  | through the World Wide Web at .        |
+  |                                                                      |
+  | SPDX-License-Identifier: BSD-3-Clause                                |
   +----------------------------------------------------------------------+
   | Author: Wez Furlong                                     |
   +----------------------------------------------------------------------+
diff --git a/ext/pdo/php_pdo_int.h b/ext/pdo/php_pdo_int.h
index e8befe9f819a..dde79af73aa0 100644
--- a/ext/pdo/php_pdo_int.h
+++ b/ext/pdo/php_pdo_int.h
@@ -1,14 +1,12 @@
 /*
   +----------------------------------------------------------------------+
-  | Copyright (c) The PHP Group                                          |
+  | Copyright © The PHP Group and Contributors.                          |
   +----------------------------------------------------------------------+
-  | This source file is subject to version 3.01 of the PHP license,      |
-  | that is bundled with this package in the file LICENSE, and is        |
-  | available through the world-wide-web at the following url:           |
-  | https://www.php.net/license/3_01.txt                                 |
-  | If you did not receive a copy of the PHP license and are unable to   |
-  | obtain it through the world-wide-web, please send a note to          |
-  | license@php.net so we can mail you a copy immediately.               |
+  | This source file is subject to the Modified BSD License that is      |
+  | bundled with this package in the file LICENSE, and is available      |
+  | through the World Wide Web at .        |
+  |                                                                      |
+  | SPDX-License-Identifier: BSD-3-Clause                                |
   +----------------------------------------------------------------------+
   | Author: Wez Furlong                                     |
   |         Marcus Boerger                                |
diff --git a/ext/pdo_dblib/dblib_driver.c b/ext/pdo_dblib/dblib_driver.c
index 68e251c2b6a9..389e3c805681 100644
--- a/ext/pdo_dblib/dblib_driver.c
+++ b/ext/pdo_dblib/dblib_driver.c
@@ -1,14 +1,12 @@
 /*
   +----------------------------------------------------------------------+
-  | Copyright (c) The PHP Group                                          |
+  | Copyright © The PHP Group and Contributors.                          |
   +----------------------------------------------------------------------+
-  | This source file is subject to version 3.01 of the PHP license,      |
-  | that is bundled with this package in the file LICENSE, and is        |
-  | available through the world-wide-web at the following url:           |
-  | https://www.php.net/license/3_01.txt                                 |
-  | If you did not receive a copy of the PHP license and are unable to   |
-  | obtain it through the world-wide-web, please send a note to          |
-  | license@php.net so we can mail you a copy immediately.               |
+  | This source file is subject to the Modified BSD License that is      |
+  | bundled with this package in the file LICENSE, and is available      |
+  | through the World Wide Web at .        |
+  |                                                                      |
+  | SPDX-License-Identifier: BSD-3-Clause                                |
   +----------------------------------------------------------------------+
   | Author: Wez Furlong                                     |
   |         Frank M. Kromann                         |
@@ -233,7 +231,7 @@ zend_string *dblib_handle_last_id(pdo_dbh_t *dbh, const zend_string *name)
 	pdo_dblib_db_handle *H = (pdo_dblib_db_handle *)dbh->driver_data;
 
 	RETCODE ret;
-	BYTE id[32];
+	BYTE id[40];
 	size_t len;
 
 	/*
@@ -266,7 +264,7 @@ zend_string *dblib_handle_last_id(pdo_dbh_t *dbh, const zend_string *name)
 		return NULL;
 	}
 
-	len = dbconvert(NULL, (dbcoltype(H->link, 1)) , (dbdata(H->link, 1)) , (dbdatlen(H->link, 1)), SQLCHAR, (BYTE *)id, (DBINT)-1);
+	len = dbconvert(NULL, (dbcoltype(H->link, 1)) , (dbdata(H->link, 1)) , (dbdatlen(H->link, 1)), SQLCHAR, (BYTE *)id, (DBINT)sizeof(id));
 	dbcancel(H->link);
 
 	return zend_string_init((const char *) id, len, 0);
@@ -422,6 +420,17 @@ static int dblib_get_attribute(pdo_dbh_t *dbh, zend_long attr, zval *return_valu
 	return 1;
 }
 
+static zend_result dblib_handle_check_liveness(pdo_dbh_t *dbh)
+{
+	pdo_dblib_db_handle *H = (pdo_dblib_db_handle *)dbh->driver_data;
+
+	if (dbdead(H->link)) {
+		return FAILURE;
+	}
+
+	return SUCCESS;
+}
+
 static const struct pdo_dbh_methods dblib_methods = {
 	dblib_handle_closer,
 	dblib_handle_preparer,
@@ -434,7 +443,7 @@ static const struct pdo_dbh_methods dblib_methods = {
 	dblib_handle_last_id, /* last insert id */
 	dblib_fetch_error, /* fetch error */
 	dblib_get_attribute, /* get attr */
-	NULL, /* check liveness */
+	dblib_handle_check_liveness, /* check_liveness */
 	NULL, /* get driver methods */
 	NULL, /* request shutdown */
 	NULL, /* in transaction, use PDO's internal tracking mechanism */
@@ -535,7 +544,6 @@ static int pdo_dblib_handle_factory(pdo_dbh_t *dbh, zval *driver_options)
 		}
 
 		if (i==nvers) {
-			printf("Invalid version '%s'\n", vars[5].optval);
 			pdo_raise_impl_error(dbh, NULL, "HY000", "PDO_DBLIB: Invalid version specified in connection string.");
 			goto cleanup; /* unknown version specified */
 		}
diff --git a/ext/pdo_dblib/dblib_stmt.c b/ext/pdo_dblib/dblib_stmt.c
index e6e91b60fa27..0b97b1dfb076 100644
--- a/ext/pdo_dblib/dblib_stmt.c
+++ b/ext/pdo_dblib/dblib_stmt.c
@@ -1,14 +1,12 @@
 /*
   +----------------------------------------------------------------------+
-  | Copyright (c) The PHP Group                                          |
+  | Copyright © The PHP Group and Contributors.                          |
   +----------------------------------------------------------------------+
-  | This source file is subject to version 3.01 of the PHP license,      |
-  | that is bundled with this package in the file LICENSE, and is        |
-  | available through the world-wide-web at the following url:           |
-  | https://www.php.net/license/3_01.txt                                 |
-  | If you did not receive a copy of the PHP license and are unable to   |
-  | obtain it through the world-wide-web, please send a note to          |
-  | license@php.net so we can mail you a copy immediately.               |
+  | This source file is subject to the Modified BSD License that is      |
+  | bundled with this package in the file LICENSE, and is available      |
+  | through the World Wide Web at .        |
+  |                                                                      |
+  | SPDX-License-Identifier: BSD-3-Clause                                |
   +----------------------------------------------------------------------+
   | Author: Wez Furlong                                     |
   |         Frank M. Kromann                         |
diff --git a/ext/pdo_dblib/pdo_dblib.c b/ext/pdo_dblib/pdo_dblib.c
index 9c59ddbc6184..47cf1497ef7d 100644
--- a/ext/pdo_dblib/pdo_dblib.c
+++ b/ext/pdo_dblib/pdo_dblib.c
@@ -1,14 +1,12 @@
 /*
   +----------------------------------------------------------------------+
-  | Copyright (c) The PHP Group                                          |
+  | Copyright © The PHP Group and Contributors.                          |
   +----------------------------------------------------------------------+
-  | This source file is subject to version 3.01 of the PHP license,      |
-  | that is bundled with this package in the file LICENSE, and is        |
-  | available through the world-wide-web at the following url:           |
-  | https://www.php.net/license/3_01.txt                                 |
-  | If you did not receive a copy of the PHP license and are unable to   |
-  | obtain it through the world-wide-web, please send a note to          |
-  | license@php.net so we can mail you a copy immediately.               |
+  | This source file is subject to the Modified BSD License that is      |
+  | bundled with this package in the file LICENSE, and is available      |
+  | through the World Wide Web at .        |
+  |                                                                      |
+  | SPDX-License-Identifier: BSD-3-Clause                                |
   +----------------------------------------------------------------------+
   | Author: Wez Furlong                                     |
   |         Frank M. Kromann                         |
diff --git a/ext/pdo_dblib/php_pdo_dblib.h b/ext/pdo_dblib/php_pdo_dblib.h
index 7cd13d6eb4bb..60e3d8c082a6 100644
--- a/ext/pdo_dblib/php_pdo_dblib.h
+++ b/ext/pdo_dblib/php_pdo_dblib.h
@@ -1,14 +1,12 @@
 /*
   +----------------------------------------------------------------------+
-  | Copyright (c) The PHP Group                                          |
+  | Copyright © The PHP Group and Contributors.                          |
   +----------------------------------------------------------------------+
-  | This source file is subject to version 3.01 of the PHP license,      |
-  | that is bundled with this package in the file LICENSE, and is        |
-  | available through the world-wide-web at the following url:           |
-  | https://www.php.net/license/3_01.txt                                 |
-  | If you did not receive a copy of the PHP license and are unable to   |
-  | obtain it through the world-wide-web, please send a note to          |
-  | license@php.net so we can mail you a copy immediately.               |
+  | This source file is subject to the Modified BSD License that is      |
+  | bundled with this package in the file LICENSE, and is available      |
+  | through the World Wide Web at .        |
+  |                                                                      |
+  | SPDX-License-Identifier: BSD-3-Clause                                |
   +----------------------------------------------------------------------+
   | Author: Wez Furlong                                     |
   |         Frank M. Kromann                         |
diff --git a/ext/pdo_dblib/php_pdo_dblib_int.h b/ext/pdo_dblib/php_pdo_dblib_int.h
index 2067d944c718..21ffa9c86243 100644
--- a/ext/pdo_dblib/php_pdo_dblib_int.h
+++ b/ext/pdo_dblib/php_pdo_dblib_int.h
@@ -1,14 +1,12 @@
 /*
   +----------------------------------------------------------------------+
-  | Copyright (c) The PHP Group                                          |
+  | Copyright © The PHP Group and Contributors.                          |
   +----------------------------------------------------------------------+
-  | This source file is subject to version 3.01 of the PHP license,      |
-  | that is bundled with this package in the file LICENSE, and is        |
-  | available through the world-wide-web at the following url:           |
-  | https://www.php.net/license/3_01.txt                                 |
-  | If you did not receive a copy of the PHP license and are unable to   |
-  | obtain it through the world-wide-web, please send a note to          |
-  | license@php.net so we can mail you a copy immediately.               |
+  | This source file is subject to the Modified BSD License that is      |
+  | bundled with this package in the file LICENSE, and is available      |
+  | through the World Wide Web at .        |
+  |                                                                      |
+  | SPDX-License-Identifier: BSD-3-Clause                                |
   +----------------------------------------------------------------------+
   | Author: Wez Furlong                                     |
   |         Frank M. Kromann                         |
diff --git a/ext/pdo_firebird/firebird_driver.c b/ext/pdo_firebird/firebird_driver.c
index 76384a187477..c20969aac2b0 100644
--- a/ext/pdo_firebird/firebird_driver.c
+++ b/ext/pdo_firebird/firebird_driver.c
@@ -1,14 +1,12 @@
 /*
   +----------------------------------------------------------------------+
-  | Copyright (c) The PHP Group                                          |
+  | Copyright © The PHP Group and Contributors.                          |
   +----------------------------------------------------------------------+
-  | This source file is subject to version 3.01 of the PHP license,      |
-  | that is bundled with this package in the file LICENSE, and is        |
-  | available through the world-wide-web at the following url:           |
-  | https://www.php.net/license/3_01.txt                                 |
-  | If you did not receive a copy of the PHP license and are unable to   |
-  | obtain it through the world-wide-web, please send a note to          |
-  | license@php.net so we can mail you a copy immediately.               |
+  | This source file is subject to the Modified BSD License that is      |
+  | bundled with this package in the file LICENSE, and is available      |
+  | through the World Wide Web at .        |
+  |                                                                      |
+  | SPDX-License-Identifier: BSD-3-Clause                                |
   +----------------------------------------------------------------------+
   | Author: Ard Biesheuvel                                |
   +----------------------------------------------------------------------+
@@ -295,7 +293,7 @@ static FbTokenType php_firebird_get_token(const char** begin, const char* end)
 	return ret;
 }
 
-static int php_firebird_preprocess(const zend_string* sql, char* sql_out, HashTable* named_params)
+static int php_firebird_preprocess(const zend_string* sql, char* sql_out, size_t* sql_out_len, HashTable* named_params)
 {
 	bool passAsIs = true, execBlock = false;
 	zend_long pindex = -1;
@@ -326,7 +324,7 @@ static int php_firebird_preprocess(const zend_string* sql, char* sql_out, HashTa
 	if (l > 252) {
 		return 0;
 	}
-	strncpy(ident, i, l);
+	memcpy(ident, i, l);
 	ident[l] = '\0';
 	if (!strcasecmp(ident, "EXECUTE"))
 	{
@@ -351,7 +349,7 @@ static int php_firebird_preprocess(const zend_string* sql, char* sql_out, HashTa
 		if (l > 252) {
 			return 0;
 		}
-		strncpy(ident2, i2, l);
+		memcpy(ident2, i2, l);
 		ident2[l] = '\0';
 		execBlock = !strcasecmp(ident2, "BLOCK");
 		passAsIs = false;
@@ -367,11 +365,15 @@ static int php_firebird_preprocess(const zend_string* sql, char* sql_out, HashTa
 
 	if (passAsIs)
 	{
-		strcpy(sql_out, ZSTR_VAL(sql));
+		memcpy(sql_out, ZSTR_VAL(sql), ZSTR_LEN(sql));
+		sql_out[ZSTR_LEN(sql)] = '\0';
+		*sql_out_len = ZSTR_LEN(sql);
 		return 1;
 	}
 
-	strncat(sql_out, start, p - start);
+	char *sql_out_p = sql_out;
+	memcpy(sql_out_p, start, p - start);
+	sql_out_p += p - start;
 
 	while (p < end)
 	{
@@ -379,10 +381,12 @@ static int php_firebird_preprocess(const zend_string* sql, char* sql_out, HashTa
 		tok = php_firebird_get_token(&p, end);
 		switch (tok)
 		{
-		case ttParamMark:
-			tok = php_firebird_get_token(&p, end);
+		case ttParamMark: {
+			const char* p_peek = p;
+			tok = php_firebird_get_token(&p_peek, end);
 			if (tok == ttIdent /*|| tok == ttString*/)
 			{
+				p = p_peek;
 				++pindex;
 				l = p - start;
 				/* check the length of the identifier */
@@ -391,7 +395,7 @@ static int php_firebird_preprocess(const zend_string* sql, char* sql_out, HashTa
 				if (l > 253) {
 					return 0;
 				}
-				strncpy(pname, start, l);
+				memcpy(pname, start, l);
 				pname[l] = '\0';
 
 				if (named_params) {
@@ -400,7 +404,7 @@ static int php_firebird_preprocess(const zend_string* sql, char* sql_out, HashTa
 					zend_hash_str_update(named_params, pname, l, &tmp);
 				}
 
-				strcat(sql_out, "?");
+				*sql_out_p++ = '?';
 			}
 			else
 			{
@@ -410,10 +414,11 @@ static int php_firebird_preprocess(const zend_string* sql, char* sql_out, HashTa
 					return 0;
 				}
 				++pindex;
-				strncat(sql_out, start, p - start);
+				memcpy(sql_out_p, start, p - start);
+				sql_out_p += p - start;
 			}
 			break;
-
+		}
 		case ttIdent:
 			if (execBlock)
 			{
@@ -425,11 +430,14 @@ static int php_firebird_preprocess(const zend_string* sql, char* sql_out, HashTa
 				if (l > 252) {
 					return 0;
 				}
-				strncpy(ident, start, l);
+				memcpy(ident, start, l);
 				ident[l] = '\0';
 				if (!strcasecmp(ident, "AS"))
 				{
-					strncat(sql_out, start, end - start);
+					memcpy(sql_out_p, start, end - start);
+					sql_out_p += end - start;
+					*sql_out_p = '\0';
+					*sql_out_len = sql_out_p - sql_out;
 					return 1;
 				}
 			}
@@ -440,7 +448,8 @@ static int php_firebird_preprocess(const zend_string* sql, char* sql_out, HashTa
 		case ttComment:
 		case ttString:
 		case ttOther:
-			strncat(sql_out, start, p - start);
+			memcpy(sql_out_p, start, p - start);
+			sql_out_p += p - start;
 			break;
 
 		case ttBrokenComment:
@@ -455,9 +464,10 @@ static int php_firebird_preprocess(const zend_string* sql, char* sql_out, HashTa
 		case ttNone:
 			/* Execute statement preprocess SQL error */
 			return 0;
-			break;
 		}
 	}
+	*sql_out_p = '\0';
+	*sql_out_len = sql_out_p - sql_out;
 	return 1;
 }
 
@@ -792,7 +802,7 @@ static zend_long firebird_handle_doer(pdo_dbh_t *dbh, const zend_string *sql) /*
 static zend_string* firebird_handle_quoter(pdo_dbh_t *dbh, const zend_string *unquoted, enum pdo_param_type paramtype)
 {
 	size_t qcount = 0;
-	char const *co, *l, *r;
+	char const *co, *l;
 	char *c;
 	size_t quotedlen;
 	zend_string *quoted_str;
@@ -801,9 +811,15 @@ static zend_string* firebird_handle_quoter(pdo_dbh_t *dbh, const zend_string *un
 		return ZSTR_INIT_LITERAL("''", 0);
 	}
 
+	const char * const end = ZSTR_VAL(unquoted) + ZSTR_LEN(unquoted);
+
 	/* Firebird only requires single quotes to be doubled if string lengths are used */
 	/* count the number of ' characters */
-	for (co = ZSTR_VAL(unquoted); (co = strchr(co,'\'')); qcount++, co++);
+	for (co = ZSTR_VAL(unquoted); co < end; co++) {
+		if (*co == '\'') {
+			qcount++;
+		}
+	}
 
 	if (UNEXPECTED(ZSTR_LEN(unquoted) + 2 > ZSTR_MAX_LEN - qcount)) {
 		return NULL;
@@ -815,15 +831,14 @@ static zend_string* firebird_handle_quoter(pdo_dbh_t *dbh, const zend_string *un
 	*c++ = '\'';
 
 	/* foreach (chunk that ends in a quote) */
-	for (l = ZSTR_VAL(unquoted); (r = strchr(l,'\'')); l = r+1) {
-		strncpy(c, l, r-l+1);
-		c += (r-l+1);
-		/* add the second quote */
-		*c++ = '\'';
+	for (l = ZSTR_VAL(unquoted); l < end; l++) {
+		*c++ = *l;
+		if (*l == '\'') {
+			/* add the second quote */
+			*c++ = '\'';
+		}
 	}
 
-	/* copy the remainder */
-	strncpy(c, l, quotedlen-(c-ZSTR_VAL(quoted_str))-1);
 	ZSTR_VAL(quoted_str)[quotedlen-1] = '\'';
 	ZSTR_VAL(quoted_str)[quotedlen]   = '\0';
 
@@ -1001,6 +1016,7 @@ static int php_firebird_alloc_prepare_stmt(pdo_dbh_t *dbh, const zend_string *sq
 {
 	pdo_firebird_db_handle *H = (pdo_firebird_db_handle *)dbh->driver_data;
 	char *new_sql;
+	size_t new_sql_len;
 
 	/* allocate the statement */
 	if (isc_dsql_allocate_statement(H->isc_status, &H->db, s)) {
@@ -1012,14 +1028,14 @@ static int php_firebird_alloc_prepare_stmt(pdo_dbh_t *dbh, const zend_string *sq
 	   we need to replace :foo by ?, and store the name we just replaced */
 	new_sql = emalloc(ZSTR_LEN(sql)+1);
 	new_sql[0] = '\0';
-	if (!php_firebird_preprocess(sql, new_sql, named_params)) {
+	if (!php_firebird_preprocess(sql, new_sql, &new_sql_len, named_params)) {
 		php_firebird_error_with_info(dbh, "07000", strlen("07000"), NULL, 0);
 		efree(new_sql);
 		return 0;
 	}
 
 	/* prepare the statement */
-	if (isc_dsql_prepare(H->isc_status, &H->tr, s, 0, new_sql, H->sql_dialect, out_sqlda)) {
+	if (isc_dsql_prepare(H->isc_status, &H->tr, s, new_sql_len, new_sql, H->sql_dialect, out_sqlda)) {
 		php_firebird_error(dbh);
 		efree(new_sql);
 		return 0;
diff --git a/ext/pdo_firebird/firebird_statement.c b/ext/pdo_firebird/firebird_statement.c
index d506aa69eed3..bdca5af974cf 100644
--- a/ext/pdo_firebird/firebird_statement.c
+++ b/ext/pdo_firebird/firebird_statement.c
@@ -1,14 +1,12 @@
 /*
   +----------------------------------------------------------------------+
-  | Copyright (c) The PHP Group                                          |
+  | Copyright © The PHP Group and Contributors.                          |
   +----------------------------------------------------------------------+
-  | This source file is subject to version 3.01 of the PHP license,      |
-  | that is bundled with this package in the file LICENSE, and is        |
-  | available through the world-wide-web at the following url:           |
-  | https://www.php.net/license/3_01.txt                                 |
-  | If you did not receive a copy of the PHP license and are unable to   |
-  | obtain it through the world-wide-web, please send a note to          |
-  | license@php.net so we can mail you a copy immediately.               |
+  | This source file is subject to the Modified BSD License that is      |
+  | bundled with this package in the file LICENSE, and is available      |
+  | through the World Wide Web at .        |
+  |                                                                      |
+  | SPDX-License-Identifier: BSD-3-Clause                                |
   +----------------------------------------------------------------------+
   | Author: Ard Biesheuvel                                |
   +----------------------------------------------------------------------+
@@ -492,7 +490,7 @@ static int pdo_firebird_stmt_get_col(
 					break;
 				case SQL_DOUBLE:
 					break;
-				EMPTY_SWITCH_DEFAULT_CASE()
+				default: ZEND_UNREACHABLE();
 			}
 
 			if ((var->sqltype & ~1) == SQL_DOUBLE) {
diff --git a/ext/pdo_firebird/pdo_firebird.c b/ext/pdo_firebird/pdo_firebird.c
index ece55926b0f4..74ba7f8994ca 100644
--- a/ext/pdo_firebird/pdo_firebird.c
+++ b/ext/pdo_firebird/pdo_firebird.c
@@ -1,14 +1,12 @@
 /*
   +----------------------------------------------------------------------+
-  | Copyright (c) The PHP Group                                          |
+  | Copyright © The PHP Group and Contributors.                          |
   +----------------------------------------------------------------------+
-  | This source file is subject to version 3.01 of the PHP license,      |
-  | that is bundled with this package in the file LICENSE, and is        |
-  | available through the world-wide-web at the following url:           |
-  | https://www.php.net/license/3_01.txt                                 |
-  | If you did not receive a copy of the PHP license and are unable to   |
-  | obtain it through the world-wide-web, please send a note to          |
-  | license@php.net so we can mail you a copy immediately.               |
+  | This source file is subject to the Modified BSD License that is      |
+  | bundled with this package in the file LICENSE, and is available      |
+  | through the World Wide Web at .        |
+  |                                                                      |
+  | SPDX-License-Identifier: BSD-3-Clause                                |
   +----------------------------------------------------------------------+
   | Author: Ard Biesheuvel                                |
   +----------------------------------------------------------------------+
diff --git a/ext/pdo_firebird/pdo_firebird_utils.cpp b/ext/pdo_firebird/pdo_firebird_utils.cpp
index 715963eec17c..cd54da8cd9c6 100644
--- a/ext/pdo_firebird/pdo_firebird_utils.cpp
+++ b/ext/pdo_firebird/pdo_firebird_utils.cpp
@@ -1,14 +1,12 @@
 /*
   +----------------------------------------------------------------------+
-  | Copyright (c) The PHP Group                                          |
+  | Copyright © The PHP Group and Contributors.                          |
   +----------------------------------------------------------------------+
-  | This source file is subject to version 3.01 of the PHP license,      |
-  | that is bundled with this package in the file LICENSE, and is        |
-  | available through the world-wide-web at the following url:           |
-  | https://www.php.net/license/3_01.txt                                 |
-  | If you did not receive a copy of the PHP license and are unable to   |
-  | obtain it through the world-wide-web, please send a note to          |
-  | license@php.net so we can mail you a copy immediately.               |
+  | This source file is subject to the Modified BSD License that is      |
+  | bundled with this package in the file LICENSE, and is available      |
+  | through the World Wide Web at .        |
+  |                                                                      |
+  | SPDX-License-Identifier: BSD-3-Clause                                |
   +----------------------------------------------------------------------+
   | Author: Simonov Denis                              |
   +----------------------------------------------------------------------+
diff --git a/ext/pdo_firebird/pdo_firebird_utils.h b/ext/pdo_firebird/pdo_firebird_utils.h
index 19b0d0ab4ba4..3a3ee4ab7c41 100644
--- a/ext/pdo_firebird/pdo_firebird_utils.h
+++ b/ext/pdo_firebird/pdo_firebird_utils.h
@@ -1,14 +1,12 @@
 /*
   +----------------------------------------------------------------------+
-  | Copyright (c) The PHP Group                                          |
+  | Copyright © The PHP Group and Contributors.                          |
   +----------------------------------------------------------------------+
-  | This source file is subject to version 3.01 of the PHP license,      |
-  | that is bundled with this package in the file LICENSE, and is        |
-  | available through the world-wide-web at the following url:           |
-  | https://www.php.net/license/3_01.txt                                 |
-  | If you did not receive a copy of the PHP license and are unable to   |
-  | obtain it through the world-wide-web, please send a note to          |
-  | license@php.net so we can mail you a copy immediately.               |
+  | This source file is subject to the Modified BSD License that is      |
+  | bundled with this package in the file LICENSE, and is available      |
+  | through the World Wide Web at .        |
+  |                                                                      |
+  | SPDX-License-Identifier: BSD-3-Clause                                |
   +----------------------------------------------------------------------+
   | Author: Simonov Denis                              |
   +----------------------------------------------------------------------+
diff --git a/ext/pdo_firebird/php_pdo_firebird.h b/ext/pdo_firebird/php_pdo_firebird.h
index 19ce061c959f..6d897dfd2933 100644
--- a/ext/pdo_firebird/php_pdo_firebird.h
+++ b/ext/pdo_firebird/php_pdo_firebird.h
@@ -1,14 +1,12 @@
 /*
   +----------------------------------------------------------------------+
-  | Copyright (c) The PHP Group                                          |
+  | Copyright © The PHP Group and Contributors.                          |
   +----------------------------------------------------------------------+
-  | This source file is subject to version 3.01 of the PHP license,      |
-  | that is bundled with this package in the file LICENSE, and is        |
-  | available through the world-wide-web at the following url:           |
-  | https://www.php.net/license/3_01.txt                                 |
-  | If you did not receive a copy of the PHP license and are unable to   |
-  | obtain it through the world-wide-web, please send a note to          |
-  | license@php.net so we can mail you a copy immediately.               |
+  | This source file is subject to the Modified BSD License that is      |
+  | bundled with this package in the file LICENSE, and is available      |
+  | through the World Wide Web at .        |
+  |                                                                      |
+  | SPDX-License-Identifier: BSD-3-Clause                                |
   +----------------------------------------------------------------------+
   | Author: Ard Biesheuvel                                |
   +----------------------------------------------------------------------+
diff --git a/ext/pdo_firebird/php_pdo_firebird_int.h b/ext/pdo_firebird/php_pdo_firebird_int.h
index a62c152ffab3..7e83b2687a72 100644
--- a/ext/pdo_firebird/php_pdo_firebird_int.h
+++ b/ext/pdo_firebird/php_pdo_firebird_int.h
@@ -1,14 +1,12 @@
 /*
   +----------------------------------------------------------------------+
-  | Copyright (c) The PHP Group                                          |
+  | Copyright © The PHP Group and Contributors.                          |
   +----------------------------------------------------------------------+
-  | This source file is subject to version 3.01 of the PHP license,      |
-  | that is bundled with this package in the file LICENSE, and is        |
-  | available through the world-wide-web at the following url:           |
-  | https://www.php.net/license/3_01.txt                                 |
-  | If you did not receive a copy of the PHP license and are unable to   |
-  | obtain it through the world-wide-web, please send a note to          |
-  | license@php.net so we can mail you a copy immediately.               |
+  | This source file is subject to the Modified BSD License that is      |
+  | bundled with this package in the file LICENSE, and is available      |
+  | through the World Wide Web at .        |
+  |                                                                      |
+  | SPDX-License-Identifier: BSD-3-Clause                                |
   +----------------------------------------------------------------------+
   | Author: Ard Biesheuvel                                |
   +----------------------------------------------------------------------+
diff --git a/ext/pdo_firebird/tests/autocommit.phpt b/ext/pdo_firebird/tests/autocommit.phpt
index 3f4f7e8f370f..daa91898a8e9 100644
--- a/ext/pdo_firebird/tests/autocommit.phpt
+++ b/ext/pdo_firebird/tests/autocommit.phpt
@@ -71,9 +71,9 @@ array(1) {
 ========== not in auto commit mode ==========
 auto commit mode OFF
 insert, expect error
-SQLSTATE[08003]: Connection does not exist: %s
+%r(SQLSTATE\[08003\]: Connection does not exist|SQLSTATE\[HY000\]: General error)%r: %s
 
 select, expect error
-SQLSTATE[08003]: Connection does not exist: %s
+%r(SQLSTATE\[08003\]: Connection does not exist|SQLSTATE\[HY000\]: General error)%r: %s
 
 done!
diff --git a/ext/pdo_firebird/tests/ghsa-w476-322c-wpvm.phpt b/ext/pdo_firebird/tests/ghsa-w476-322c-wpvm.phpt
new file mode 100644
index 000000000000..3046fbc011b7
--- /dev/null
+++ b/ext/pdo_firebird/tests/ghsa-w476-322c-wpvm.phpt
@@ -0,0 +1,46 @@
+--TEST--
+GHSA-w476-322c-wpvm: SQL injection in pdo_firebird via NUL bytes in quoted strings
+--EXTENSIONS--
+pdo_firebird
+--SKIPIF--
+
+--XLEAK--
+A bug in firebird causes a memory leak when calling `isc_attach_database()`.
+See https://github.com/FirebirdSQL/firebird/issues/7849
+--FILE--
+exec('CREATE TABLE ghsa_w476_322c_wpvm (name VARCHAR(255))');
+
+$param = $dbh->quote("\0");
+$param2 = $dbh->quote('or 1=1--');
+var_export($param);
+echo("\n");
+
+echo "prepare: ";
+$stmt = $dbh->prepare("SELECT * FROM ghsa_w476_322c_wpvm WHERE name = {$param} AND name = {$param2}");
+$stmt->execute();
+echo json_encode($stmt->fetchAll(PDO::FETCH_ASSOC)) . "\n";
+
+echo "query:   ";
+$stmt = $dbh->query("SELECT * FROM ghsa_w476_322c_wpvm WHERE name = {$param} AND name = {$param2}");
+echo json_encode($stmt->fetchAll(PDO::FETCH_ASSOC)) . "\n";
+
+echo "exec:    ";
+$affectedRows = $dbh->exec("UPDATE ghsa_w476_322c_wpvm SET name = 'updated' WHERE name = {$param} AND name = {$param2}");
+echo $affectedRows . "\n";
+?>
+--CLEAN--
+exec("DROP TABLE ghsa_w476_322c_wpvm");
+?>
+--EXPECT--
+'\'' . "\0" . '\''
+prepare: []
+query:   []
+exec:    0
diff --git a/ext/pdo_mysql/mysql_driver.c b/ext/pdo_mysql/mysql_driver.c
index 808f4acbfa37..54a8803971ca 100644
--- a/ext/pdo_mysql/mysql_driver.c
+++ b/ext/pdo_mysql/mysql_driver.c
@@ -1,14 +1,12 @@
 /*
   +----------------------------------------------------------------------+
-  | Copyright (c) The PHP Group                                          |
+  | Copyright © The PHP Group and Contributors.                          |
   +----------------------------------------------------------------------+
-  | This source file is subject to version 3.01 of the PHP license,      |
-  | that is bundled with this package in the file LICENSE, and is        |
-  | available through the world-wide-web at the following url:           |
-  | https://www.php.net/license/3_01.txt                                 |
-  | If you did not receive a copy of the PHP license and are unable to   |
-  | obtain it through the world-wide-web, please send a note to          |
-  | license@php.net so we can mail you a copy immediately.               |
+  | This source file is subject to the Modified BSD License that is      |
+  | bundled with this package in the file LICENSE, and is available      |
+  | through the World Wide Web at .        |
+  |                                                                      |
+  | SPDX-License-Identifier: BSD-3-Clause                                |
   +----------------------------------------------------------------------+
   | Author: George Schlossnagle                       |
   |         Wez Furlong                                     |
diff --git a/ext/pdo_mysql/mysql_sql_parser.re b/ext/pdo_mysql/mysql_sql_parser.re
index 01afbefaaa8d..9db54063889d 100644
--- a/ext/pdo_mysql/mysql_sql_parser.re
+++ b/ext/pdo_mysql/mysql_sql_parser.re
@@ -1,14 +1,12 @@
 /*
   +----------------------------------------------------------------------+
-  | Copyright (c) The PHP Group                                          |
+  | Copyright © The PHP Group and Contributors.                          |
   +----------------------------------------------------------------------+
-  | This source file is subject to version 3.01 of the PHP license,      |
-  | that is bundled with this package in the file LICENSE, and is        |
-  | available through the world-wide-web at the following url:           |
-  | https://www.php.net/license/3_01.txt                                 |
-  | If you did not receive a copy of the PHP license and are unable to   |
-  | obtain it through the world-wide-web, please send a note to          |
-  | license@php.net so we can mail you a copy immediately.               |
+  | This source file is subject to the Modified BSD License that is      |
+  | bundled with this package in the file LICENSE, and is available      |
+  | through the World Wide Web at .        |
+  |                                                                      |
+  | SPDX-License-Identifier: BSD-3-Clause                                |
   +----------------------------------------------------------------------+
   | Author: Matteo Beccati                             |
   +----------------------------------------------------------------------+
diff --git a/ext/pdo_mysql/mysql_statement.c b/ext/pdo_mysql/mysql_statement.c
index 8b2519ce90aa..f6b182fcb9ad 100644
--- a/ext/pdo_mysql/mysql_statement.c
+++ b/ext/pdo_mysql/mysql_statement.c
@@ -1,14 +1,12 @@
 /*
   +----------------------------------------------------------------------+
-  | Copyright (c) The PHP Group                                          |
+  | Copyright © The PHP Group and Contributors.                          |
   +----------------------------------------------------------------------+
-  | This source file is subject to version 3.01 of the PHP license,      |
-  | that is bundled with this package in the file LICENSE, and is        |
-  | available through the world-wide-web at the following url:           |
-  | https://www.php.net/license/3_01.txt                                 |
-  | If you did not receive a copy of the PHP license and are unable to   |
-  | obtain it through the world-wide-web, please send a note to          |
-  | license@php.net so we can mail you a copy immediately.               |
+  | This source file is subject to the Modified BSD License that is      |
+  | bundled with this package in the file LICENSE, and is available      |
+  | through the World Wide Web at .        |
+  |                                                                      |
+  | SPDX-License-Identifier: BSD-3-Clause                                |
   +----------------------------------------------------------------------+
   | Author: George Schlossnagle                       |
   |         Wez Furlong                                     |
diff --git a/ext/pdo_mysql/pdo_mysql.c b/ext/pdo_mysql/pdo_mysql.c
index b45dafbf5d98..fe5ebc7e6ed8 100644
--- a/ext/pdo_mysql/pdo_mysql.c
+++ b/ext/pdo_mysql/pdo_mysql.c
@@ -1,14 +1,12 @@
 /*
   +----------------------------------------------------------------------+
-  | Copyright (c) The PHP Group                                          |
+  | Copyright © The PHP Group and Contributors.                          |
   +----------------------------------------------------------------------+
-  | This source file is subject to version 3.01 of the PHP license,      |
-  | that is bundled with this package in the file LICENSE, and is        |
-  | available through the world-wide-web at the following url:           |
-  | https://www.php.net/license/3_01.txt                                 |
-  | If you did not receive a copy of the PHP license and are unable to   |
-  | obtain it through the world-wide-web, please send a note to          |
-  | license@php.net so we can mail you a copy immediately.               |
+  | This source file is subject to the Modified BSD License that is      |
+  | bundled with this package in the file LICENSE, and is available      |
+  | through the World Wide Web at .        |
+  |                                                                      |
+  | SPDX-License-Identifier: BSD-3-Clause                                |
   +----------------------------------------------------------------------+
   | Author: George Schlossnagle                       |
   |         Johannes Schlueter                       |
diff --git a/ext/pdo_mysql/php_pdo_mysql.h b/ext/pdo_mysql/php_pdo_mysql.h
index 650c51b497a2..55b2cded0f28 100644
--- a/ext/pdo_mysql/php_pdo_mysql.h
+++ b/ext/pdo_mysql/php_pdo_mysql.h
@@ -1,14 +1,12 @@
 /*
   +----------------------------------------------------------------------+
-  | Copyright (c) The PHP Group                                          |
+  | Copyright © The PHP Group and Contributors.                          |
   +----------------------------------------------------------------------+
-  | This source file is subject to version 3.01 of the PHP license,      |
-  | that is bundled with this package in the file LICENSE, and is        |
-  | available through the world-wide-web at the following url:           |
-  | https://www.php.net/license/3_01.txt                                 |
-  | If you did not receive a copy of the PHP license and are unable to   |
-  | obtain it through the world-wide-web, please send a note to          |
-  | license@php.net so we can mail you a copy immediately.               |
+  | This source file is subject to the Modified BSD License that is      |
+  | bundled with this package in the file LICENSE, and is available      |
+  | through the World Wide Web at .        |
+  |                                                                      |
+  | SPDX-License-Identifier: BSD-3-Clause                                |
   +----------------------------------------------------------------------+
   | Author: George Schlossnagle                       |
   +----------------------------------------------------------------------+
diff --git a/ext/pdo_mysql/php_pdo_mysql_int.h b/ext/pdo_mysql/php_pdo_mysql_int.h
index ec49d6c311c3..baba729aa53d 100644
--- a/ext/pdo_mysql/php_pdo_mysql_int.h
+++ b/ext/pdo_mysql/php_pdo_mysql_int.h
@@ -1,14 +1,12 @@
 /*
   +----------------------------------------------------------------------+
-  | Copyright (c) The PHP Group                                          |
+  | Copyright © The PHP Group and Contributors.                          |
   +----------------------------------------------------------------------+
-  | This source file is subject to version 3.01 of the PHP license,      |
-  | that is bundled with this package in the file LICENSE, and is        |
-  | available through the world-wide-web at the following url:           |
-  | https://www.php.net/license/3_01.txt                                 |
-  | If you did not receive a copy of the PHP license and are unable to   |
-  | obtain it through the world-wide-web, please send a note to          |
-  | license@php.net so we can mail you a copy immediately.               |
+  | This source file is subject to the Modified BSD License that is      |
+  | bundled with this package in the file LICENSE, and is available      |
+  | through the World Wide Web at .        |
+  |                                                                      |
+  | SPDX-License-Identifier: BSD-3-Clause                                |
   +----------------------------------------------------------------------+
   | Author: George Schlossnagle                       |
   |         Wez Furlong                                     |
diff --git a/ext/pdo_odbc/odbc_driver.c b/ext/pdo_odbc/odbc_driver.c
index 7401023c573c..3c8afe2d4215 100644
--- a/ext/pdo_odbc/odbc_driver.c
+++ b/ext/pdo_odbc/odbc_driver.c
@@ -1,14 +1,12 @@
 /*
   +----------------------------------------------------------------------+
-  | Copyright (c) The PHP Group                                          |
+  | Copyright © The PHP Group and Contributors.                          |
   +----------------------------------------------------------------------+
-  | This source file is subject to version 3.01 of the PHP license,      |
-  | that is bundled with this package in the file LICENSE, and is        |
-  | available through the world-wide-web at the following url:           |
-  | https://www.php.net/license/3_01.txt                                 |
-  | If you did not receive a copy of the PHP license and are unable to   |
-  | obtain it through the world-wide-web, please send a note to          |
-  | license@php.net so we can mail you a copy immediately.               |
+  | This source file is subject to the Modified BSD License that is      |
+  | bundled with this package in the file LICENSE, and is available      |
+  | through the World Wide Web at .        |
+  |                                                                      |
+  | SPDX-License-Identifier: BSD-3-Clause                                |
   +----------------------------------------------------------------------+
   | Author: Wez Furlong                                     |
   +----------------------------------------------------------------------+
@@ -550,9 +548,9 @@ static int pdo_odbc_handle_factory(pdo_dbh_t *dbh, zval *driver_options) /* {{{
 			if (use_uid_arg) {
 				should_quote_uid = !php_odbc_connstr_is_quoted(dbh->username) && php_odbc_connstr_should_quote(dbh->username);
 				if (should_quote_uid) {
-					size_t estimated_length = php_odbc_connstr_estimate_quote_length(dbh->username);
-					uid = emalloc(estimated_length);
-					php_odbc_connstr_quote(uid, dbh->username, estimated_length);
+					size_t quoted_length = php_odbc_connstr_get_quoted_length(dbh->username);
+					uid = emalloc(quoted_length);
+					php_odbc_connstr_quote(uid, dbh->username, quoted_length);
 				} else {
 					uid = dbh->username;
 				}
@@ -567,9 +565,9 @@ static int pdo_odbc_handle_factory(pdo_dbh_t *dbh, zval *driver_options) /* {{{
 			if (use_pwd_arg) {
 				should_quote_pwd = !php_odbc_connstr_is_quoted(dbh->password) && php_odbc_connstr_should_quote(dbh->password);
 				if (should_quote_pwd) {
-					size_t estimated_length = php_odbc_connstr_estimate_quote_length(dbh->password);
-					pwd = emalloc(estimated_length);
-					php_odbc_connstr_quote(pwd, dbh->password, estimated_length);
+					size_t quoted_length = php_odbc_connstr_get_quoted_length(dbh->password);
+					pwd = emalloc(quoted_length);
+					php_odbc_connstr_quote(pwd, dbh->password, quoted_length);
 				} else {
 					pwd = dbh->password;
 				}
diff --git a/ext/pdo_odbc/odbc_stmt.c b/ext/pdo_odbc/odbc_stmt.c
index 171fb7b7b1e9..2fe47cef6e68 100644
--- a/ext/pdo_odbc/odbc_stmt.c
+++ b/ext/pdo_odbc/odbc_stmt.c
@@ -1,14 +1,12 @@
 /*
   +----------------------------------------------------------------------+
-  | Copyright (c) The PHP Group                                          |
+  | Copyright © The PHP Group and Contributors.                          |
   +----------------------------------------------------------------------+
-  | This source file is subject to version 3.01 of the PHP license,      |
-  | that is bundled with this package in the file LICENSE, and is        |
-  | available through the world-wide-web at the following url:           |
-  | https://www.php.net/license/3_01.txt                                 |
-  | If you did not receive a copy of the PHP license and are unable to   |
-  | obtain it through the world-wide-web, please send a note to          |
-  | license@php.net so we can mail you a copy immediately.               |
+  | This source file is subject to the Modified BSD License that is      |
+  | bundled with this package in the file LICENSE, and is available      |
+  | through the World Wide Web at .        |
+  |                                                                      |
+  | SPDX-License-Identifier: BSD-3-Clause                                |
   +----------------------------------------------------------------------+
   | Author: Wez Furlong                                     |
   +----------------------------------------------------------------------+
@@ -704,8 +702,9 @@ static int odbc_stmt_get_col(pdo_stmt_t *stmt, int colno, zval *result, enum pdo
 			}
 			ssize_t to_fetch_byte = to_fetch_len + 1;
 			char *buf2 = emalloc(to_fetch_byte);
-			zend_string *str = zend_string_init(C->data, to_fetch_byte, 0);
-			size_t used = to_fetch_len;
+			ssize_t seed_len = to_fetch_len > (LONG_COLUMN_BUFFER_SIZE - 1) ? (LONG_COLUMN_BUFFER_SIZE - 1) : to_fetch_len;
+			zend_string *str = zend_string_init(C->data, seed_len + 1, 0);
+			size_t used = seed_len;
 
 			do {
 				C->fetched_len = 0;
@@ -728,7 +727,7 @@ static int odbc_stmt_get_col(pdo_stmt_t *stmt, int colno, zval *result, enum pdo
 					str = zend_string_realloc(str, used + to_fetch_byte, 0);
 					memcpy(ZSTR_VAL(str) + used, buf2, to_fetch_byte);
 					used = used + to_fetch_len;
-				} else if (rc==SQL_SUCCESS) {
+				} else if (rc == SQL_SUCCESS && C->fetched_len != 0) {
 					str = zend_string_realloc(str, used + C->fetched_len, 0);
 					memcpy(ZSTR_VAL(str) + used, buf2, C->fetched_len);
 					used = used + C->fetched_len;
diff --git a/ext/pdo_odbc/pdo_odbc.c b/ext/pdo_odbc/pdo_odbc.c
index 1181e314c4d0..47a19062947c 100644
--- a/ext/pdo_odbc/pdo_odbc.c
+++ b/ext/pdo_odbc/pdo_odbc.c
@@ -1,14 +1,12 @@
 /*
   +----------------------------------------------------------------------+
-  | Copyright (c) The PHP Group                                          |
+  | Copyright © The PHP Group and Contributors.                          |
   +----------------------------------------------------------------------+
-  | This source file is subject to version 3.01 of the PHP license,      |
-  | that is bundled with this package in the file LICENSE, and is        |
-  | available through the world-wide-web at the following url:           |
-  | https://www.php.net/license/3_01.txt                                 |
-  | If you did not receive a copy of the PHP license and are unable to   |
-  | obtain it through the world-wide-web, please send a note to          |
-  | license@php.net so we can mail you a copy immediately.               |
+  | This source file is subject to the Modified BSD License that is      |
+  | bundled with this package in the file LICENSE, and is available      |
+  | through the World Wide Web at .        |
+  |                                                                      |
+  | SPDX-License-Identifier: BSD-3-Clause                                |
   +----------------------------------------------------------------------+
   | Author: Wez Furlong                                     |
   +----------------------------------------------------------------------+
diff --git a/ext/pdo_odbc/php_pdo_odbc.h b/ext/pdo_odbc/php_pdo_odbc.h
index 3f0417029784..6c72b6f2ebe9 100644
--- a/ext/pdo_odbc/php_pdo_odbc.h
+++ b/ext/pdo_odbc/php_pdo_odbc.h
@@ -1,14 +1,12 @@
 /*
   +----------------------------------------------------------------------+
-  | Copyright (c) The PHP Group                                          |
+  | Copyright © The PHP Group and Contributors.                          |
   +----------------------------------------------------------------------+
-  | This source file is subject to version 3.01 of the PHP license,      |
-  | that is bundled with this package in the file LICENSE, and is        |
-  | available through the world-wide-web at the following url:           |
-  | https://www.php.net/license/3_01.txt                                 |
-  | If you did not receive a copy of the PHP license and are unable to   |
-  | obtain it through the world-wide-web, please send a note to          |
-  | license@php.net so we can mail you a copy immediately.               |
+  | This source file is subject to the Modified BSD License that is      |
+  | bundled with this package in the file LICENSE, and is available      |
+  | through the World Wide Web at .        |
+  |                                                                      |
+  | SPDX-License-Identifier: BSD-3-Clause                                |
   +----------------------------------------------------------------------+
   | Author: Wez Furlong                                     |
   +----------------------------------------------------------------------+
diff --git a/ext/pdo_odbc/php_pdo_odbc_int.h b/ext/pdo_odbc/php_pdo_odbc_int.h
index 473d70ff7076..18b45af21a02 100644
--- a/ext/pdo_odbc/php_pdo_odbc_int.h
+++ b/ext/pdo_odbc/php_pdo_odbc_int.h
@@ -1,14 +1,12 @@
 /*
   +----------------------------------------------------------------------+
-  | Copyright (c) The PHP Group                                          |
+  | Copyright © The PHP Group and Contributors.                          |
   +----------------------------------------------------------------------+
-  | This source file is subject to version 3.01 of the PHP license,      |
-  | that is bundled with this package in the file LICENSE, and is        |
-  | available through the world-wide-web at the following url:           |
-  | https://www.php.net/license/3_01.txt                                 |
-  | If you did not receive a copy of the PHP license and are unable to   |
-  | obtain it through the world-wide-web, please send a note to          |
-  | license@php.net so we can mail you a copy immediately.               |
+  | This source file is subject to the Modified BSD License that is      |
+  | bundled with this package in the file LICENSE, and is available      |
+  | through the World Wide Web at .        |
+  |                                                                      |
+  | SPDX-License-Identifier: BSD-3-Clause                                |
   +----------------------------------------------------------------------+
   | Author: Wez Furlong                                     |
   +----------------------------------------------------------------------+
diff --git a/ext/pdo_odbc/tests/gh22349.phpt b/ext/pdo_odbc/tests/gh22349.phpt
new file mode 100644
index 000000000000..58219dea0ac6
--- /dev/null
+++ b/ext/pdo_odbc/tests/gh22349.phpt
@@ -0,0 +1,45 @@
+--TEST--
+GH-22349 (Heap over-read fetching a long column past the internal buffer)
+--EXTENSIONS--
+pdo_odbc
+--SKIPIF--
+
+--FILE--
+setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_SILENT);
+
+$db->exec('DROP TABLE test_gh22349');
+if (false === $db->exec('CREATE TABLE test_gh22349 (data text)')
+    && false === $db->exec('CREATE TABLE test_gh22349 (data CLOB)')
+    && false === $db->exec('CREATE TABLE test_gh22349 (data longtext)')) {
+    die("BORK: no large text column type available here: " . implode(", ", $db->errorInfo()) . "\n");
+}
+
+$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
+
+// The driver fetches a long column into an internal buffer of roughly one
+// memory page and reassembles the remainder. Exercise values that span and
+// exceed that buffer so the seeded length must match the bytes present.
+foreach ([4096, 8192, 65536] as $len) {
+    $db->exec('DELETE FROM test_gh22349');
+    $text = str_repeat('A', $len);
+    $db->exec("INSERT INTO test_gh22349 VALUES ('$text')");
+    $got = $db->query('SELECT data FROM test_gh22349')->fetchColumn();
+    printf("%d: %s\n", $len, ($got === $text) ? 'ok' : ('MISMATCH len=' . strlen($got)));
+}
+?>
+--CLEAN--
+exec('DROP TABLE test_gh22349');
+?>
+--EXPECT--
+4096: ok
+8192: ok
+65536: ok
diff --git a/ext/pdo_pgsql/config.w32 b/ext/pdo_pgsql/config.w32
index 5fc25f215900..87ad0a661b53 100644
--- a/ext/pdo_pgsql/config.w32
+++ b/ext/pdo_pgsql/config.w32
@@ -7,6 +7,7 @@ if (PHP_PDO_PGSQL != "no") {
 			CHECK_HEADER("libpq-fe.h", "CFLAGS_PDO_PGSQL", PHP_PDO_PGSQL + "\\include;" + PHP_PHP_BUILD + "\\include\\pgsql;" + PHP_PHP_BUILD + "\\include\\libpq;")) {
 		EXTENSION("pdo_pgsql", "pdo_pgsql.c pgsql_driver.c pgsql_statement.c pgsql_sql_parser.c");
 
+		AC_DEFINE('HAVE_PG_RESULT_MEMORY_SIZE', 1, "Define to 1 if libpq has the 'PQresultMemorySize' function (PostgreSQL 12 or later).");
 		AC_DEFINE('HAVE_PDO_PGSQL', 1, "Define to 1 if the PHP extension 'pdo_pgsql' is available.");
 
 		ADD_EXTENSION_DEP('pdo_pgsql', 'pdo');
diff --git a/ext/pdo_pgsql/pdo_pgsql.c b/ext/pdo_pgsql/pdo_pgsql.c
index e6849aed1195..d552aa5e61dd 100644
--- a/ext/pdo_pgsql/pdo_pgsql.c
+++ b/ext/pdo_pgsql/pdo_pgsql.c
@@ -1,14 +1,12 @@
 /*
   +----------------------------------------------------------------------+
-  | Copyright (c) The PHP Group                                          |
+  | Copyright © The PHP Group and Contributors.                          |
   +----------------------------------------------------------------------+
-  | This source file is subject to version 3.01 of the PHP license,      |
-  | that is bundled with this package in the file LICENSE, and is        |
-  | available through the world-wide-web at the following url:           |
-  | https://www.php.net/license/3_01.txt                                 |
-  | If you did not receive a copy of the PHP license and are unable to   |
-  | obtain it through the world-wide-web, please send a note to          |
-  | license@php.net so we can mail you a copy immediately.               |
+  | This source file is subject to the Modified BSD License that is      |
+  | bundled with this package in the file LICENSE, and is available      |
+  | through the World Wide Web at .        |
+  |                                                                      |
+  | SPDX-License-Identifier: BSD-3-Clause                                |
   +----------------------------------------------------------------------+
   | Author: Edin Kadribasic                              |
   +----------------------------------------------------------------------+
diff --git a/ext/pdo_pgsql/pgsql_driver.c b/ext/pdo_pgsql/pgsql_driver.c
index be429075c51a..8f5e22640ccc 100644
--- a/ext/pdo_pgsql/pgsql_driver.c
+++ b/ext/pdo_pgsql/pgsql_driver.c
@@ -1,14 +1,12 @@
 /*
   +----------------------------------------------------------------------+
-  | Copyright (c) The PHP Group                                          |
+  | Copyright © The PHP Group and Contributors.                          |
   +----------------------------------------------------------------------+
-  | This source file is subject to version 3.01 of the PHP license,      |
-  | that is bundled with this package in the file LICENSE, and is        |
-  | available through the world-wide-web at the following url:           |
-  | https://www.php.net/license/3_01.txt                                 |
-  | If you did not receive a copy of the PHP license and are unable to   |
-  | obtain it through the world-wide-web, please send a note to          |
-  | license@php.net so we can mail you a copy immediately.               |
+  | This source file is subject to the Modified BSD License that is      |
+  | bundled with this package in the file LICENSE, and is available      |
+  | through the World Wide Web at .        |
+  |                                                                      |
+  | SPDX-License-Identifier: BSD-3-Clause                                |
   +----------------------------------------------------------------------+
   | Authors: Edin Kadribasic                             |
   |          Ilia Alshanestsky                         |
@@ -716,6 +714,9 @@ void pgsqlCopyFromArray_internal(INTERNAL_FUNCTION_PARAMETERS)
 		if (Z_TYPE_P(pg_rows) == IS_ARRAY) {
 			ZEND_HASH_FOREACH_VAL(Z_ARRVAL_P(pg_rows), tmp) {
 				if (!_pdo_pgsql_send_copy_data(H, tmp)) {
+					if (EG(exception)) {
+						RETURN_THROWS();
+					}
 					pdo_pgsql_error(dbh, PGRES_FATAL_ERROR, NULL);
 					PDO_HANDLE_DBH_ERR();
 					RETURN_FALSE;
@@ -738,6 +739,9 @@ void pgsqlCopyFromArray_internal(INTERNAL_FUNCTION_PARAMETERS)
 				tmp = iter->funcs->get_current_data(iter);
 				if (!_pdo_pgsql_send_copy_data(H, tmp)) {
 					zend_iterator_dtor(iter);
+					if (EG(exception)) {
+						RETURN_THROWS();
+					}
 					pdo_pgsql_error(dbh, PGRES_FATAL_ERROR, NULL);
 					PDO_HANDLE_DBH_ERR();
 					RETURN_FALSE;
diff --git a/ext/pdo_pgsql/pgsql_sql_parser.re b/ext/pdo_pgsql/pgsql_sql_parser.re
index caea615c4073..011fce56a1a0 100644
--- a/ext/pdo_pgsql/pgsql_sql_parser.re
+++ b/ext/pdo_pgsql/pgsql_sql_parser.re
@@ -1,14 +1,12 @@
 /*
   +----------------------------------------------------------------------+
-  | Copyright (c) The PHP Group                                          |
+  | Copyright © The PHP Group and Contributors.                          |
   +----------------------------------------------------------------------+
-  | This source file is subject to version 3.01 of the PHP license,      |
-  | that is bundled with this package in the file LICENSE, and is        |
-  | available through the world-wide-web at the following url:           |
-  | https://www.php.net/license/3_01.txt                                 |
-  | If you did not receive a copy of the PHP license and are unable to   |
-  | obtain it through the world-wide-web, please send a note to          |
-  | license@php.net so we can mail you a copy immediately.               |
+  | This source file is subject to the Modified BSD License that is      |
+  | bundled with this package in the file LICENSE, and is available      |
+  | through the World Wide Web at .        |
+  |                                                                      |
+  | SPDX-License-Identifier: BSD-3-Clause                                |
   +----------------------------------------------------------------------+
   | Author: Matteo Beccati                             |
   +----------------------------------------------------------------------+
diff --git a/ext/pdo_pgsql/pgsql_statement.c b/ext/pdo_pgsql/pgsql_statement.c
index 426a878d8eff..1620544556b6 100644
--- a/ext/pdo_pgsql/pgsql_statement.c
+++ b/ext/pdo_pgsql/pgsql_statement.c
@@ -1,14 +1,12 @@
 /*
   +----------------------------------------------------------------------+
-  | Copyright (c) The PHP Group                                          |
+  | Copyright © The PHP Group and Contributors.                          |
   +----------------------------------------------------------------------+
-  | This source file is subject to version 3.01 of the PHP license,      |
-  | that is bundled with this package in the file LICENSE, and is        |
-  | available through the world-wide-web at the following url:           |
-  | https://www.php.net/license/3_01.txt                                 |
-  | If you did not receive a copy of the PHP license and are unable to   |
-  | obtain it through the world-wide-web, please send a note to          |
-  | license@php.net so we can mail you a copy immediately.               |
+  | This source file is subject to the Modified BSD License that is      |
+  | bundled with this package in the file LICENSE, and is available      |
+  | through the World Wide Web at .        |
+  |                                                                      |
+  | SPDX-License-Identifier: BSD-3-Clause                                |
   +----------------------------------------------------------------------+
   | Authors: Edin Kadribasic                             |
   |          Ilia Alshanestsky                         |
@@ -573,6 +571,12 @@ static int pgsql_stmt_fetch(pdo_stmt_t *stmt,
 			}
 
 			S->result = PQgetResult(S->H->server);
+			if (!S->result) {
+				S->is_running_unbuffered = false;
+				stmt->row_count = 0;
+				S->current_row = 0;
+				return 0;
+			}
 			status = PQresultStatus(S->result);
 
 			if (status != PGRES_COMMAND_OK && status != PGRES_TUPLES_OK && status != PGRES_SINGLE_TUPLE) {
diff --git a/ext/pdo_pgsql/php_pdo_pgsql.h b/ext/pdo_pgsql/php_pdo_pgsql.h
index fa28214f71a7..345535108cb1 100644
--- a/ext/pdo_pgsql/php_pdo_pgsql.h
+++ b/ext/pdo_pgsql/php_pdo_pgsql.h
@@ -1,14 +1,12 @@
 /*
   +----------------------------------------------------------------------+
-  | Copyright (c) The PHP Group                                          |
+  | Copyright © The PHP Group and Contributors.                          |
   +----------------------------------------------------------------------+
-  | This source file is subject to version 3.01 of the PHP license,      |
-  | that is bundled with this package in the file LICENSE, and is        |
-  | available through the world-wide-web at the following url:           |
-  | https://www.php.net/license/3_01.txt                                 |
-  | If you did not receive a copy of the PHP license and are unable to   |
-  | obtain it through the world-wide-web, please send a note to          |
-  | license@php.net so we can mail you a copy immediately.               |
+  | This source file is subject to the Modified BSD License that is      |
+  | bundled with this package in the file LICENSE, and is available      |
+  | through the World Wide Web at .        |
+  |                                                                      |
+  | SPDX-License-Identifier: BSD-3-Clause                                |
   +----------------------------------------------------------------------+
   | Author: Edin Kadribasic                              |
   +----------------------------------------------------------------------+
diff --git a/ext/pdo_pgsql/php_pdo_pgsql_int.h b/ext/pdo_pgsql/php_pdo_pgsql_int.h
index 881b4e704650..47c9223540ad 100644
--- a/ext/pdo_pgsql/php_pdo_pgsql_int.h
+++ b/ext/pdo_pgsql/php_pdo_pgsql_int.h
@@ -1,14 +1,12 @@
 /*
   +----------------------------------------------------------------------+
-  | Copyright (c) The PHP Group                                          |
+  | Copyright © The PHP Group and Contributors.                          |
   +----------------------------------------------------------------------+
-  | This source file is subject to version 3.01 of the PHP license,      |
-  | that is bundled with this package in the file LICENSE, and is        |
-  | available through the world-wide-web at the following url:           |
-  | https://www.php.net/license/3_01.txt                                 |
-  | If you did not receive a copy of the PHP license and are unable to   |
-  | obtain it through the world-wide-web, please send a note to          |
-  | license@php.net so we can mail you a copy immediately.               |
+  | This source file is subject to the Modified BSD License that is      |
+  | bundled with this package in the file LICENSE, and is available      |
+  | through the World Wide Web at .        |
+  |                                                                      |
+  | SPDX-License-Identifier: BSD-3-Clause                                |
   +----------------------------------------------------------------------+
   | Authors: Edin Kadribasic                             |
   |          Ilia Alshanestsky                         |
diff --git a/ext/pdo_pgsql/tests/copy_from_array_non_stringable.phpt b/ext/pdo_pgsql/tests/copy_from_array_non_stringable.phpt
new file mode 100644
index 000000000000..65edb30d6671
--- /dev/null
+++ b/ext/pdo_pgsql/tests/copy_from_array_non_stringable.phpt
@@ -0,0 +1,49 @@
+--TEST--
+PDO PgSQL pgsqlCopyFromArray()/copyFromArray() with a non-stringable row throws without polluting errorInfo
+--EXTENSIONS--
+pdo_pgsql
+--SKIPIF--
+
+--FILE--
+setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_SILENT);
+
+$db->exec('CREATE TABLE test_copy_non_stringable (v text)');
+
+try {
+    $db->pgsqlCopyFromArray('test_copy_non_stringable', [new stdClass()]);
+} catch (\Error $e) {
+    echo $e->getMessage(), PHP_EOL;
+}
+
+var_dump($db->errorInfo()[0]);
+
+$pgsql = PDOTest::test_factory(__DIR__ . '/common.phpt', Pdo\Pgsql::class, true);
+$pgsql->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_SILENT);
+
+try {
+    $pgsql->copyFromArray('test_copy_non_stringable', [new stdClass()]);
+} catch (\Error $e) {
+    echo $e->getMessage(), PHP_EOL;
+}
+
+var_dump($pgsql->errorInfo()[0]);
+?>
+--CLEAN--
+query('DROP TABLE IF EXISTS test_copy_non_stringable CASCADE');
+?>
+--EXPECTF--
+Deprecated: Method PDO::pgsqlCopyFromArray() is deprecated since 8.5, use Pdo\Pgsql::copyFromArray() instead in %s on line %d
+Object of class stdClass could not be converted to string
+string(5) "00000"
+Object of class stdClass could not be converted to string
+string(5) "00000"
diff --git a/ext/pdo_pgsql/tests/gh21683.phpt b/ext/pdo_pgsql/tests/gh21683.phpt
new file mode 100644
index 000000000000..bd941511767a
--- /dev/null
+++ b/ext/pdo_pgsql/tests/gh21683.phpt
@@ -0,0 +1,48 @@
+--TEST--
+PDO PgSQL single-row mode (ATTR_PREFETCH=0) on empty result set
+--EXTENSIONS--
+pdo
+pdo_pgsql
+--SKIPIF--
+
+--FILE--
+setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
+$pdo->setAttribute(PDO::ATTR_PREFETCH, 0);
+
+$pdo->exec("CREATE TEMP TABLE empty_t (id int, val text)");
+
+echo "=== query / fetch ===\n";
+$stmt = $pdo->query("SELECT * FROM empty_t");
+var_dump($stmt->fetch());
+
+echo "=== prepare / fetchAll ===\n";
+$stmt = $pdo->prepare("SELECT * FROM empty_t");
+$stmt->execute();
+var_dump($stmt->fetchAll());
+
+echo "=== connection still works ===\n";
+$stmt = $pdo->query("SELECT 1 AS alive");
+var_dump($stmt->fetch(PDO::FETCH_ASSOC));
+
+echo "Done\n";
+?>
+--EXPECT--
+=== query / fetch ===
+bool(false)
+=== prepare / fetchAll ===
+array(0) {
+}
+=== connection still works ===
+array(1) {
+  ["alive"]=>
+  string(1) "1"
+}
+Done
diff --git a/ext/pdo_sqlite/pdo_sqlite.c b/ext/pdo_sqlite/pdo_sqlite.c
index 667948fea9f1..2da9329e2a04 100644
--- a/ext/pdo_sqlite/pdo_sqlite.c
+++ b/ext/pdo_sqlite/pdo_sqlite.c
@@ -1,14 +1,12 @@
 /*
   +----------------------------------------------------------------------+
-  | Copyright (c) The PHP Group                                          |
+  | Copyright © The PHP Group and Contributors.                          |
   +----------------------------------------------------------------------+
-  | This source file is subject to version 3.01 of the PHP license,      |
-  | that is bundled with this package in the file LICENSE, and is        |
-  | available through the world-wide-web at the following url:           |
-  | https://www.php.net/license/3_01.txt                                 |
-  | If you did not receive a copy of the PHP license and are unable to   |
-  | obtain it through the world-wide-web, please send a note to          |
-  | license@php.net so we can mail you a copy immediately.               |
+  | This source file is subject to the Modified BSD License that is      |
+  | bundled with this package in the file LICENSE, and is available      |
+  | through the World Wide Web at .        |
+  |                                                                      |
+  | SPDX-License-Identifier: BSD-3-Clause                                |
   +----------------------------------------------------------------------+
   | Author: Wez Furlong                                     |
   +----------------------------------------------------------------------+
@@ -205,7 +203,7 @@ static int php_pdosqlite3_stream_seek(php_stream *stream, zend_off_t offset, int
 	switch(whence) {
 		case SEEK_CUR:
 			if (offset < 0) {
-				if (sqlite3_stream->position < (size_t)(-offset)) {
+				if (sqlite3_stream->position < -(size_t)offset) {
 					sqlite3_stream->position = 0;
 					*newoffs = -1;
 					return -1;
@@ -243,7 +241,7 @@ static int php_pdosqlite3_stream_seek(php_stream *stream, zend_off_t offset, int
 				sqlite3_stream->position = sqlite3_stream->size;
 				*newoffs = -1;
 				return -1;
-			} else if (sqlite3_stream->size < (size_t)(-offset)) {
+			} else if (sqlite3_stream->size < -(size_t)offset) {
 				sqlite3_stream->position = 0;
 				*newoffs = -1;
 				return -1;
diff --git a/ext/pdo_sqlite/php_pdo_sqlite.h b/ext/pdo_sqlite/php_pdo_sqlite.h
index c29a81ebb240..a567e8c87ee6 100644
--- a/ext/pdo_sqlite/php_pdo_sqlite.h
+++ b/ext/pdo_sqlite/php_pdo_sqlite.h
@@ -1,14 +1,12 @@
 /*
   +----------------------------------------------------------------------+
-  | Copyright (c) The PHP Group                                          |
+  | Copyright © The PHP Group and Contributors.                          |
   +----------------------------------------------------------------------+
-  | This source file is subject to version 3.01 of the PHP license,      |
-  | that is bundled with this package in the file LICENSE, and is        |
-  | available through the world-wide-web at the following url:           |
-  | https://www.php.net/license/3_01.txt                                 |
-  | If you did not receive a copy of the PHP license and are unable to   |
-  | obtain it through the world-wide-web, please send a note to          |
-  | license@php.net so we can mail you a copy immediately.               |
+  | This source file is subject to the Modified BSD License that is      |
+  | bundled with this package in the file LICENSE, and is available      |
+  | through the World Wide Web at .        |
+  |                                                                      |
+  | SPDX-License-Identifier: BSD-3-Clause                                |
   +----------------------------------------------------------------------+
   | Author: Wez Furlong                                     |
   +----------------------------------------------------------------------+
diff --git a/ext/pdo_sqlite/php_pdo_sqlite_int.h b/ext/pdo_sqlite/php_pdo_sqlite_int.h
index 0cb09cfaa4fb..122f714040de 100644
--- a/ext/pdo_sqlite/php_pdo_sqlite_int.h
+++ b/ext/pdo_sqlite/php_pdo_sqlite_int.h
@@ -1,14 +1,12 @@
 /*
   +----------------------------------------------------------------------+
-  | Copyright (c) The PHP Group                                          |
+  | Copyright © The PHP Group and Contributors.                          |
   +----------------------------------------------------------------------+
-  | This source file is subject to version 3.01 of the PHP license,      |
-  | that is bundled with this package in the file LICENSE, and is        |
-  | available through the world-wide-web at the following url:           |
-  | https://www.php.net/license/3_01.txt                                 |
-  | If you did not receive a copy of the PHP license and are unable to   |
-  | obtain it through the world-wide-web, please send a note to          |
-  | license@php.net so we can mail you a copy immediately.               |
+  | This source file is subject to the Modified BSD License that is      |
+  | bundled with this package in the file LICENSE, and is available      |
+  | through the World Wide Web at .        |
+  |                                                                      |
+  | SPDX-License-Identifier: BSD-3-Clause                                |
   +----------------------------------------------------------------------+
   | Author: Wez Furlong                                     |
   +----------------------------------------------------------------------+
diff --git a/ext/pdo_sqlite/sqlite_driver.c b/ext/pdo_sqlite/sqlite_driver.c
index 5a30d27193ec..39efa02dd583 100644
--- a/ext/pdo_sqlite/sqlite_driver.c
+++ b/ext/pdo_sqlite/sqlite_driver.c
@@ -1,14 +1,12 @@
 /*
   +----------------------------------------------------------------------+
-  | Copyright (c) The PHP Group                                          |
+  | Copyright © The PHP Group and Contributors.                          |
   +----------------------------------------------------------------------+
-  | This source file is subject to version 3.01 of the PHP license,      |
-  | that is bundled with this package in the file LICENSE, and is        |
-  | available through the world-wide-web at the following url:           |
-  | https://www.php.net/license/3_01.txt                                 |
-  | If you did not receive a copy of the PHP license and are unable to   |
-  | obtain it through the world-wide-web, please send a note to          |
-  | license@php.net so we can mail you a copy immediately.               |
+  | This source file is subject to the Modified BSD License that is      |
+  | bundled with this package in the file LICENSE, and is available      |
+  | through the World Wide Web at .        |
+  |                                                                      |
+  | SPDX-License-Identifier: BSD-3-Clause                                |
   +----------------------------------------------------------------------+
   | Author: Wez Furlong                                     |
   +----------------------------------------------------------------------+
diff --git a/ext/pdo_sqlite/sqlite_sql_parser.re b/ext/pdo_sqlite/sqlite_sql_parser.re
index 5678e6025577..c836f6b2b499 100644
--- a/ext/pdo_sqlite/sqlite_sql_parser.re
+++ b/ext/pdo_sqlite/sqlite_sql_parser.re
@@ -1,14 +1,12 @@
 /*
   +----------------------------------------------------------------------+
-  | Copyright (c) The PHP Group                                          |
+  | Copyright © The PHP Group and Contributors.                          |
   +----------------------------------------------------------------------+
-  | This source file is subject to version 3.01 of the PHP license,      |
-  | that is bundled with this package in the file LICENSE, and is        |
-  | available through the world-wide-web at the following url:           |
-  | https://www.php.net/license/3_01.txt                                 |
-  | If you did not receive a copy of the PHP license and are unable to   |
-  | obtain it through the world-wide-web, please send a note to          |
-  | license@php.net so we can mail you a copy immediately.               |
+  | This source file is subject to the Modified BSD License that is      |
+  | bundled with this package in the file LICENSE, and is available      |
+  | through the World Wide Web at .        |
+  |                                                                      |
+  | SPDX-License-Identifier: BSD-3-Clause                                |
   +----------------------------------------------------------------------+
   | Author: Matteo Beccati                             |
   +----------------------------------------------------------------------+
diff --git a/ext/pdo_sqlite/sqlite_statement.c b/ext/pdo_sqlite/sqlite_statement.c
index ffb8c1ad4b3c..ca82b1b09322 100644
--- a/ext/pdo_sqlite/sqlite_statement.c
+++ b/ext/pdo_sqlite/sqlite_statement.c
@@ -1,14 +1,12 @@
 /*
   +----------------------------------------------------------------------+
-  | Copyright (c) The PHP Group                                          |
+  | Copyright © The PHP Group and Contributors.                          |
   +----------------------------------------------------------------------+
-  | This source file is subject to version 3.01 of the PHP license,      |
-  | that is bundled with this package in the file LICENSE, and is        |
-  | available through the world-wide-web at the following url:           |
-  | https://www.php.net/license/3_01.txt                                 |
-  | If you did not receive a copy of the PHP license and are unable to   |
-  | obtain it through the world-wide-web, please send a note to          |
-  | license@php.net so we can mail you a copy immediately.               |
+  | This source file is subject to the Modified BSD License that is      |
+  | bundled with this package in the file LICENSE, and is available      |
+  | through the World Wide Web at .        |
+  |                                                                      |
+  | SPDX-License-Identifier: BSD-3-Clause                                |
   +----------------------------------------------------------------------+
   | Author: Wez Furlong                                     |
   +----------------------------------------------------------------------+
diff --git a/ext/pdo_sqlite/tests/bug38334.phpt b/ext/pdo_sqlite/tests/bug38334.phpt
index b4e9a378d717..eefd997cc71a 100644
--- a/ext/pdo_sqlite/tests/bug38334.phpt
+++ b/ext/pdo_sqlite/tests/bug38334.phpt
@@ -7,11 +7,11 @@ pdo_sqlite
 
 $db = new PDO('sqlite::memory:');
 $db->exec('CREATE TABLE test_38334 (i INTEGER , f DOUBLE, s VARCHAR(255))');
-$db->exec('INSERT INTO test_38334 VALUES (42, 46.7, "test")');
+$db->exec("INSERT INTO test_38334 VALUES (42, 46.7, 'test')");
 var_dump($db->query('SELECT * FROM test_38334')->fetch(PDO::FETCH_ASSOC));
 
 // Check handling of integers larger than 32-bit.
-$db->exec('INSERT INTO test_38334 VALUES (10000000000, 0.0, "")');
+$db->exec("INSERT INTO test_38334 VALUES (10000000000, 0.0, '')");
 $i = $db->query('SELECT i FROM test_38334 WHERE f = 0.0')->fetchColumn(0);
 if (PHP_INT_SIZE >= 8) {
     var_dump($i === 10000000000);
@@ -20,8 +20,8 @@ if (PHP_INT_SIZE >= 8) {
 }
 
 // Check storing of strings into integer/float columns.
-$db->exec('INSERT INTO test_38334 VALUES ("test", "test", "x")');
-var_dump($db->query('SELECT * FROM test_38334 WHERE s = "x"')->fetch(PDO::FETCH_ASSOC));
+$db->exec("INSERT INTO test_38334 VALUES ('test', 'test', 'x')");
+var_dump($db->query("SELECT * FROM test_38334 WHERE s = 'x'")->fetch(PDO::FETCH_ASSOC));
 
 ?>
 --EXPECT--
diff --git a/ext/pdo_sqlite/tests/bug_42589.phpt b/ext/pdo_sqlite/tests/bug_42589.phpt
index 46ded8d027a6..39b87b106521 100644
--- a/ext/pdo_sqlite/tests/bug_42589.phpt
+++ b/ext/pdo_sqlite/tests/bug_42589.phpt
@@ -15,7 +15,7 @@ if(!in_array('ENABLE_COLUMN_METADATA', $options, true))
 $db = new PDO("sqlite::memory:");
 
 $db->exec('CREATE TABLE test_42589 (field1 VARCHAR(10))');
-$db->exec('INSERT INTO test_42589 VALUES("test")');
+$db->exec("INSERT INTO test_42589 VALUES('test')");
 
 $result = $db->query('SELECT * FROM test_42589 t1 LEFT JOIN test_42589 t2 ON t1.field1 = t2.field1');
 $meta1 = $result->getColumnMeta(0);
diff --git a/ext/pdo_sqlite/tests/gh20964.phpt b/ext/pdo_sqlite/tests/gh20964.phpt
new file mode 100644
index 000000000000..65070cb1838a
--- /dev/null
+++ b/ext/pdo_sqlite/tests/gh20964.phpt
@@ -0,0 +1,23 @@
+--TEST--
+GH-20964 (fseek() on PDO SQLite blob stream with PHP_INT_MIN causes undefined behavior)
+--EXTENSIONS--
+pdo_sqlite
+--FILE--
+exec('CREATE TABLE test (id INTEGER PRIMARY KEY, data BLOB)');
+$db->exec("INSERT INTO test (id, data) VALUES (1, 'hello')");
+
+$stream = $db->openBlob('test', 'data', 1);
+
+var_dump(fseek($stream, PHP_INT_MIN, SEEK_END));
+
+rewind($stream);
+var_dump(fseek($stream, PHP_INT_MIN, SEEK_CUR));
+
+fclose($stream);
+?>
+--EXPECT--
+int(-1)
+int(-1)
diff --git a/ext/pdo_sqlite/tests/pdo_sqlite_createaggregate.phpt b/ext/pdo_sqlite/tests/pdo_sqlite_createaggregate.phpt
index 1a620d6b9d5f..cba2c49556f7 100644
--- a/ext/pdo_sqlite/tests/pdo_sqlite_createaggregate.phpt
+++ b/ext/pdo_sqlite/tests/pdo_sqlite_createaggregate.phpt
@@ -9,7 +9,7 @@ $db = new PDO('sqlite::memory:');
 
 $db->query('CREATE TABLE test_pdo_sqlite_createaggregate (id INT AUTO INCREMENT, name TEXT)');
 
-$db->query('INSERT INTO test_pdo_sqlite_createaggregate VALUES (NULL, "PHP"), (NULL, "PHP6")');
+$db->query("INSERT INTO test_pdo_sqlite_createaggregate VALUES (NULL, 'PHP'), (NULL, 'PHP6')");
 
 $db->sqliteCreateAggregate('testing', function(&$a, $b) { $a .= $b; return $a; }, function(&$v) { return $v; });
 
diff --git a/ext/pdo_sqlite/tests/pdo_sqlite_createcollation.phpt b/ext/pdo_sqlite/tests/pdo_sqlite_createcollation.phpt
index 14a2c2e0d023..eb5ea6c97b7d 100644
--- a/ext/pdo_sqlite/tests/pdo_sqlite_createcollation.phpt
+++ b/ext/pdo_sqlite/tests/pdo_sqlite_createcollation.phpt
@@ -10,7 +10,7 @@ $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
 
 $db->query('CREATE TABLE test_pdo_sqlite_createcollation (id INT AUTO INCREMENT, name TEXT)');
 
-$db->query('INSERT INTO test_pdo_sqlite_createcollation VALUES (NULL, "1"), (NULL, "2"), (NULL, "10")');
+$db->query("INSERT INTO test_pdo_sqlite_createcollation VALUES (NULL, '1'), (NULL, '2'), (NULL, '10')");
 
 $db->sqliteCreateCollation('MYCOLLATE', function($a, $b) { return strnatcmp($a, $b); });
 
diff --git a/ext/pdo_sqlite/tests/pdo_sqlite_createfunction.phpt b/ext/pdo_sqlite/tests/pdo_sqlite_createfunction.phpt
index b2cb073cb58f..49daabf5a7a9 100644
--- a/ext/pdo_sqlite/tests/pdo_sqlite_createfunction.phpt
+++ b/ext/pdo_sqlite/tests/pdo_sqlite_createfunction.phpt
@@ -9,7 +9,7 @@ $db = new PDO('sqlite::memory:');
 
 $db->query('CREATE TABLE test_pdo_sqlite_createfunction (id INT AUTO INCREMENT, name TEXT)');
 
-$db->query('INSERT INTO test_pdo_sqlite_createfunction VALUES (NULL, "PHP"), (NULL, "PHP6")');
+$db->query("INSERT INTO test_pdo_sqlite_createfunction VALUES (NULL, 'PHP'), (NULL, 'PHP6')");
 
 
 $db->sqliteCreateFunction('testing', function($v) { return strtolower($v); });
diff --git a/ext/pdo_sqlite/tests/pdo_sqlite_createfunction_with_flags.phpt b/ext/pdo_sqlite/tests/pdo_sqlite_createfunction_with_flags.phpt
index 6f507789dbf2..fafa4f6bfa21 100644
--- a/ext/pdo_sqlite/tests/pdo_sqlite_createfunction_with_flags.phpt
+++ b/ext/pdo_sqlite/tests/pdo_sqlite_createfunction_with_flags.phpt
@@ -4,7 +4,7 @@ PDO_sqlite: Testing sqliteCreateFunction() with flags
 pdo_sqlite
 --SKIPIF--
 = 3.8.3');
 ?>
 --FILE--
 query('CREATE TABLE test_pdo_sqlite_createfunction_with_flags (id INT AUTO INCREMENT, name TEXT)');
 
-$db->query('INSERT INTO test_pdo_sqlite_createfunction_with_flags VALUES (NULL, "PHP"), (NULL, "PHP6")');
+$db->query("INSERT INTO test_pdo_sqlite_createfunction_with_flags VALUES (NULL, 'PHP'), (NULL, 'PHP6')");
 
 
 $db->sqliteCreateFunction('testing', function($v) { return strtolower($v); }, 1, Pdo\Sqlite::DETERMINISTIC);
diff --git a/ext/pdo_sqlite/tests/pdo_sqlite_dqs.phpt b/ext/pdo_sqlite/tests/pdo_sqlite_dqs.phpt
new file mode 100644
index 000000000000..8ae668428484
--- /dev/null
+++ b/ext/pdo_sqlite/tests/pdo_sqlite_dqs.phpt
@@ -0,0 +1,27 @@
+--TEST--
+PDO_sqlite: Testing DQS support
+--EXTENSIONS--
+pdo_sqlite
+--SKIPIF--
+exec('SELECT "test"');
+} catch (\PDOException) {
+    die('skip SQLite is lacking DQS');
+}
+?>
+--FILE--
+exec('CREATE TABLE test (s1 VARCHAR(255), s2 VARCHAR(255))');
+$db->exec('INSERT INTO test VALUES (\'test\', "test")');
+var_dump($db->query('SELECT * FROM test')->fetch(PDO::FETCH_ASSOC));
+?>
+--EXPECT--
+array(2) {
+  ["s1"]=>
+  string(4) "test"
+  ["s2"]=>
+  string(4) "test"
+}
diff --git a/ext/pdo_sqlite/tests/pdo_sqlite_lastinsertid.phpt b/ext/pdo_sqlite/tests/pdo_sqlite_lastinsertid.phpt
index 7e55ed60d5f1..0f1cba84dcce 100644
--- a/ext/pdo_sqlite/tests/pdo_sqlite_lastinsertid.phpt
+++ b/ext/pdo_sqlite/tests/pdo_sqlite_lastinsertid.phpt
@@ -7,7 +7,7 @@ pdo_sqlite
 
 $db = new PDO('sqlite::memory:');
 $db->query('CREATE TABLE test_pdo_sqlite_lastinsertid (id INT AUTO INCREMENT, name TEXT)');
-$db->query('INSERT INTO test_pdo_sqlite_lastinsertid VALUES (NULL, "PHP"), (NULL, "PHP6")');
+$db->query("INSERT INTO test_pdo_sqlite_lastinsertid VALUES (NULL, 'PHP'), (NULL, 'PHP6')");
 var_dump($db->query('SELECT * FROM test_pdo_sqlite_lastinsertid'));
 var_dump($db->errorInfo());
 var_dump($db->lastInsertId());
diff --git a/ext/pdo_sqlite/tests/pdo_sqlite_parser.phpt b/ext/pdo_sqlite/tests/pdo_sqlite_parser.phpt
index d5eda8d9b827..c1eed6f3adc8 100644
--- a/ext/pdo_sqlite/tests/pdo_sqlite_parser.phpt
+++ b/ext/pdo_sqlite/tests/pdo_sqlite_parser.phpt
@@ -31,9 +31,8 @@ foreach ($queries as $k => $query) {
 // One parameter
 $queries = [
     "SELECT * FROM {$table} WHERE '1' = ?",
-    "SELECT * FROM {$table} WHERE \"?\" IN (?, \"?\")",
+    "SELECT * FROM {$table} WHERE '?' IN (?, '?')",
     "SELECT * FROM {$table} WHERE `a``?` = ?",
-    "SELECT * FROM {$table} WHERE \"a`?\" = ?",
     "SELECT * FROM {$table} WHERE [a`?] = ?",
 ];
 
@@ -43,6 +42,22 @@ foreach ($queries as $k => $query) {
     var_dump($stmt->fetch(PDO::FETCH_NUM) === [0 => 1]);
 }
 
+// Check if DQS are enabled.
+$dqs = true;
+try {
+    $db->exec('SELECT "test"');
+} catch (\PDOException) {
+    $dqs = false;
+}
+
+if ($dqs) {
+    $stmt = $db->prepare("SELECT * FROM {$table} WHERE \"a`?\" = ?");
+    $stmt->execute([1]);
+    var_dump($stmt->fetch(PDO::FETCH_NUM) === [0 => 1]);
+} else {
+    var_dump(true);
+}
+
 ?>
 --CLEAN--
 query('CREATE TABLE test_pdo_sqlite_transaction (id INT AUTO INCREMENT, nam
 $db->commit();
 
 $db->beginTransaction();
-$db->query('INSERT INTO test_pdo_sqlite_transaction VALUES (NULL, "PHP"), (NULL, "PHP6")');
+$db->query("INSERT INTO test_pdo_sqlite_transaction VALUES (NULL, 'PHP'), (NULL, 'PHP6')");
 $db->rollback();
 
 $r = $db->query('SELECT COUNT(*) FROM test_pdo_sqlite_transaction');
diff --git a/ext/pdo_sqlite/tests/php_8.5_deprecations.phpt b/ext/pdo_sqlite/tests/php_8.5_deprecations.phpt
index e8e0b34141c7..f7aa61206f6f 100644
--- a/ext/pdo_sqlite/tests/php_8.5_deprecations.phpt
+++ b/ext/pdo_sqlite/tests/php_8.5_deprecations.phpt
@@ -2,6 +2,10 @@
 PDO_sqlite: PHP 8.5 deprecations
 --EXTENSIONS--
 pdo_sqlite
+--SKIPIF--
+= 3.8.3');
+?>
 --FILE--
 = 3.8.3');
+?>
 --FILE--
 createFunction('strtoupper', [new TrampolineTest(), 'strtoupper']));
 
-foreach ($db->query('SELECT strtoupper("test")') as $row) {
+foreach ($db->query("SELECT strtoupper('test')") as $row) {
     var_dump($row);
 }
 
-foreach ($db->query('SELECT strtoupper("test")') as $row) {
+foreach ($db->query("SELECT strtoupper('test')") as $row) {
     var_dump($row);
 }
 
@@ -33,14 +33,14 @@ foreach ($db->query('SELECT strtoupper("test")') as $row) {
 bool(true)
 Trampoline for strtoupper
 array(2) {
-  ["strtoupper("test")"]=>
+  ["strtoupper('test')"]=>
   string(4) "TEST"
   [0]=>
   string(4) "TEST"
 }
 Trampoline for strtoupper
 array(2) {
-  ["strtoupper("test")"]=>
+  ["strtoupper('test')"]=>
   string(4) "TEST"
   [0]=>
   string(4) "TEST"
diff --git a/ext/pdo_sqlite/tests/subclasses/pdo_sqlite_createaggregate.phpt b/ext/pdo_sqlite/tests/subclasses/pdo_sqlite_createaggregate.phpt
index 1f96da8e1fa3..af04daaec7fa 100644
--- a/ext/pdo_sqlite/tests/subclasses/pdo_sqlite_createaggregate.phpt
+++ b/ext/pdo_sqlite/tests/subclasses/pdo_sqlite_createaggregate.phpt
@@ -10,7 +10,7 @@ $db = new Pdo\Sqlite('sqlite::memory:');
 
 $db->query('CREATE TABLE test_pdo_sqlite_createaggregate (id INT AUTO INCREMENT, name TEXT)');
 
-$db->query('INSERT INTO test_pdo_sqlite_createaggregate VALUES (NULL, "PHP"), (NULL, "PHP6")');
+$db->query("INSERT INTO test_pdo_sqlite_createaggregate VALUES (NULL, 'PHP'), (NULL, 'PHP6')");
 
 $db->createAggregate('testing', function(&$a, $b) { $a .= $b; return $a; }, function(&$v) { return $v; });
 
diff --git a/ext/pdo_sqlite/tests/subclasses/pdo_sqlite_createcollation.phpt b/ext/pdo_sqlite/tests/subclasses/pdo_sqlite_createcollation.phpt
index d043dda7a526..4ba37ec6aa6e 100644
--- a/ext/pdo_sqlite/tests/subclasses/pdo_sqlite_createcollation.phpt
+++ b/ext/pdo_sqlite/tests/subclasses/pdo_sqlite_createcollation.phpt
@@ -11,7 +11,7 @@ $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
 
 $db->query('CREATE TABLE test_pdo_sqlite_createcollation (id INT AUTO INCREMENT, name TEXT)');
 
-$db->query('INSERT INTO test_pdo_sqlite_createcollation VALUES (NULL, "1"), (NULL, "2"), (NULL, "10")');
+$db->query("INSERT INTO test_pdo_sqlite_createcollation VALUES (NULL, '1'), (NULL, '2'), (NULL, '10')");
 
 $db->createCollation('MYCOLLATE', function($a, $b) { return strnatcmp($a, $b); });
 
diff --git a/ext/pdo_sqlite/tests/subclasses/pdo_sqlite_createcollation_trampoline.phpt b/ext/pdo_sqlite/tests/subclasses/pdo_sqlite_createcollation_trampoline.phpt
index 1635fd700771..7f2b309ebf4c 100644
--- a/ext/pdo_sqlite/tests/subclasses/pdo_sqlite_createcollation_trampoline.phpt
+++ b/ext/pdo_sqlite/tests/subclasses/pdo_sqlite_createcollation_trampoline.phpt
@@ -9,7 +9,7 @@ $db = new Pdo\Sqlite('sqlite::memory:');
 
 $db->query('CREATE TABLE test_pdo_sqlite_createcollation_trampoline (s VARCHAR(4))');
 
-$stmt = $db->query('INSERT INTO test_pdo_sqlite_createcollation_trampoline VALUES ("a1"), ("a10"), ("a2")');
+$stmt = $db->query("INSERT INTO test_pdo_sqlite_createcollation_trampoline VALUES ('a1'), ('a10'), ('a2')");
 
 class TrampolineTest {
     public function __call(string $name, array $arguments) {
diff --git a/ext/pdo_sqlite/tests/subclasses/pdo_sqlite_createfunction_with_flags.phpt b/ext/pdo_sqlite/tests/subclasses/pdo_sqlite_createfunction_with_flags.phpt
index c828817d2c3a..07359a69bc4c 100644
--- a/ext/pdo_sqlite/tests/subclasses/pdo_sqlite_createfunction_with_flags.phpt
+++ b/ext/pdo_sqlite/tests/subclasses/pdo_sqlite_createfunction_with_flags.phpt
@@ -4,14 +4,14 @@ PDO_sqlite: Testing createFunction() with flags
 pdo_sqlite
 --SKIPIF--
 = 3.8.3');
 ?>
 --FILE--
 query('CREATE TABLE test_pdo_sqlite_createfunction_with_flags (id INT AUTO INCREMENT, name TEXT)');
-$db->query('INSERT INTO test_pdo_sqlite_createfunction_with_flags VALUES (NULL, "PHP"), (NULL, "PHP6")');
+$db->query("INSERT INTO test_pdo_sqlite_createfunction_with_flags VALUES (NULL, 'PHP'), (NULL, 'PHP6')");
 
 $db->createFunction('testing', function($v) { return strtolower($v); }, 1, Pdo\Sqlite::DETERMINISTIC);
 
diff --git a/ext/pdo_sqlite/tests/subclasses/pdo_sqlite_getattr_busy.phpt b/ext/pdo_sqlite/tests/subclasses/pdo_sqlite_getattr_busy.phpt
index 230fb7390ae5..c1f82e96c07b 100644
--- a/ext/pdo_sqlite/tests/subclasses/pdo_sqlite_getattr_busy.phpt
+++ b/ext/pdo_sqlite/tests/subclasses/pdo_sqlite_getattr_busy.phpt
@@ -8,7 +8,7 @@ pdo_sqlite
 $db = new Pdo\Sqlite('sqlite::memory:');
 
 $db->query('CREATE TABLE test_busy (a string);');
-$db->query('INSERT INTO test_busy VALUES ("interleaved"), ("statements")');
+$db->query("INSERT INTO test_busy VALUES ('interleaved'), ('statements')");
 $st = $db->prepare('SELECT a FROM test_busy');
 var_dump($st->getAttribute(Pdo\Sqlite::ATTR_BUSY_STATEMENT));
 $st->execute();
diff --git a/ext/pdo_sqlite/tests/subclasses/pdo_sqlite_getsetattr_explain.phpt b/ext/pdo_sqlite/tests/subclasses/pdo_sqlite_getsetattr_explain.phpt
index 383457f3a79e..d2a6c2a5f52b 100644
--- a/ext/pdo_sqlite/tests/subclasses/pdo_sqlite_getsetattr_explain.phpt
+++ b/ext/pdo_sqlite/tests/subclasses/pdo_sqlite_getsetattr_explain.phpt
@@ -13,7 +13,7 @@ if (!defined('Pdo\Sqlite::EXPLAIN_MODE_EXPLAIN')) die('skip system sqlite does n
 $db = new Pdo\Sqlite('sqlite::memory:');
 
 $db->query('CREATE TABLE test_explain (a string);');
-$stmt = $db->prepare('INSERT INTO test_explain VALUES ("first insert"), ("second_insert")');
+$stmt = $db->prepare("INSERT INTO test_explain VALUES ('first insert'), ('second_insert')");
 $stmt->setAttribute(Pdo\Sqlite::ATTR_EXPLAIN_STATEMENT, Pdo\Sqlite::EXPLAIN_MODE_EXPLAIN);
 var_dump($stmt->getAttribute(Pdo\Sqlite::ATTR_EXPLAIN_STATEMENT) == Pdo\Sqlite::EXPLAIN_MODE_EXPLAIN);
 $r = $stmt->execute();
@@ -24,7 +24,7 @@ var_dump($stmt->getAttribute(Pdo\Sqlite::ATTR_EXPLAIN_STATEMENT) == Pdo\Sqlite::
 $r = $stmts->execute();
 var_dump($stmts->fetchAll(PDO::FETCH_ASSOC));
 
-$stmt = $db->prepare('INSERT INTO test_explain VALUES ("first insert"), ("second_insert")');
+$stmt = $db->prepare("INSERT INTO test_explain VALUES ('first insert'), ('second_insert')");
 $stmt->setAttribute(Pdo\Sqlite::ATTR_EXPLAIN_STATEMENT, Pdo\Sqlite::EXPLAIN_MODE_PREPARED);
 $stmt->execute();
 $stmts->setAttribute(Pdo\Sqlite::ATTR_EXPLAIN_STATEMENT, Pdo\Sqlite::EXPLAIN_MODE_PREPARED);
@@ -88,7 +88,7 @@ array(%d) {
     ["opcode"]=>
     string(13) "InitCoroutine"
     ["p1"]=>
-    int(3)
+    int(%d)
     ["p2"]=>
     int(%d)
     ["p3"]=>
@@ -109,7 +109,7 @@ array(%d) {
     ["p1"]=>
     int(0)
     ["p2"]=>
-    int(2)
+    int(%d)
     ["p3"]=>
     int(0)
     ["p4"]=>
@@ -126,7 +126,7 @@ array(%d) {
     ["opcode"]=>
     string(5) "Yield"
     ["p1"]=>
-    int(3)
+    int(%d)
     ["p2"]=>
     int(0)
     ["p3"]=>
@@ -147,7 +147,7 @@ array(%d) {
     ["p1"]=>
     int(0)
     ["p2"]=>
-    int(2)
+    int(%d)
     ["p3"]=>
     int(0)
     ["p4"]=>
@@ -164,7 +164,7 @@ array(%d) {
     ["opcode"]=>
     string(5) "Yield"
     ["p1"]=>
-    int(3)
+    int(%d)
     ["p2"]=>
     int(0)
     ["p3"]=>
@@ -183,7 +183,7 @@ array(%d) {
     ["opcode"]=>
     string(12) "EndCoroutine"
     ["p1"]=>
-    int(3)
+    int(%d)
     ["p2"]=>
     int(0)
     ["p3"]=>
@@ -221,7 +221,7 @@ array(%d) {
     ["opcode"]=>
     string(5) "Yield"
     ["p1"]=>
-    int(3)
+    int(%d)
     ["p2"]=>
     int(%d)
     ["p3"]=>
@@ -242,7 +242,7 @@ array(%d) {
     ["p1"]=>
     int(0)
     ["p2"]=>
-    int(1)
+    int(%d)
     ["p3"]=>
     int(0)
     ["p4"]=>
@@ -259,11 +259,11 @@ array(%d) {
     ["opcode"]=>
     string(10) "MakeRecord"
     ["p1"]=>
-    int(2)
+    int(%d)
     ["p2"]=>
     int(1)
     ["p3"]=>
-    int(4)
+    int(%d)
     ["p4"]=>
     string(1) "C"
     ["p5"]=>
@@ -280,9 +280,9 @@ array(%d) {
     ["p1"]=>
     int(0)
     ["p2"]=>
-    int(4)
+    int(%d)
     ["p3"]=>
-    int(1)
+    int(%d)
     ["p4"]=>
     string(12) "test_explain"
     ["p5"]=>
diff --git a/ext/pdo_sqlite/tests/subclasses/pdosqlite_001.phpt b/ext/pdo_sqlite/tests/subclasses/pdosqlite_001.phpt
index ea88a6316b64..40ec0a7799f0 100644
--- a/ext/pdo_sqlite/tests/subclasses/pdosqlite_001.phpt
+++ b/ext/pdo_sqlite/tests/subclasses/pdosqlite_001.phpt
@@ -2,6 +2,10 @@
 Pdo\Sqlite basic
 --EXTENSIONS--
 pdo_sqlite
+--SKIPIF--
+= 3.8.3');
+?>
 --FILE--
 query('CREATE TABLE pdosqlite_001 (id INT AUTO INCREMENT, name TEXT)');
 
-$db->query('INSERT INTO pdosqlite_001 VALUES (NULL, "PHP")');
-$db->query('INSERT INTO pdosqlite_001 VALUES (NULL, "PHP6")');
+$db->query("INSERT INTO pdosqlite_001 VALUES (NULL, 'PHP')");
+$db->query("INSERT INTO pdosqlite_001 VALUES (NULL, 'PHP6')");
 
 $db->createFunction('testing', function($v) { return strtolower($v); }, 1, Pdo\Sqlite::DETERMINISTIC);
 
diff --git a/ext/pdo_sqlite/tests/subclasses/pdosqlite_002.phpt b/ext/pdo_sqlite/tests/subclasses/pdosqlite_002.phpt
index 28534f4a2365..fddf2138f84e 100644
--- a/ext/pdo_sqlite/tests/subclasses/pdosqlite_002.phpt
+++ b/ext/pdo_sqlite/tests/subclasses/pdosqlite_002.phpt
@@ -2,6 +2,10 @@
 Pdo\Sqlite create through PDO::connect and function define.
 --EXTENSIONS--
 pdo_sqlite
+--SKIPIF--
+= 3.8.3');
+?>
 --FILE--
 query('CREATE TABLE pdosqlite_002 (id INT AUTO INCREMENT, name TEXT)');
-$db->query('INSERT INTO pdosqlite_002 VALUES (NULL, "PHP")');
-$db->query('INSERT INTO pdosqlite_002 VALUES (NULL, "PHP6")');
+$db->query("INSERT INTO pdosqlite_002 VALUES (NULL, 'PHP')");
+$db->query("INSERT INTO pdosqlite_002 VALUES (NULL, 'PHP6')");
 
 $db->createFunction('testing', function($v) { return strtolower($v); }, 1, Pdo\Sqlite::DETERMINISTIC);
 
diff --git a/ext/pgsql/config.w32 b/ext/pgsql/config.w32
index 14eb5a07a0e9..4c8d6f3bd715 100644
--- a/ext/pgsql/config.w32
+++ b/ext/pgsql/config.w32
@@ -6,6 +6,7 @@ if (PHP_PGSQL != "no") {
 	if (CHECK_LIB("libpq.lib", "pgsql", PHP_PGSQL) &&
 		CHECK_HEADER("libpq-fe.h", "CFLAGS_PGSQL", PHP_PGSQL + "\\include;" + PHP_PHP_BUILD + "\\include\\pgsql;" + PHP_PHP_BUILD + "\\include\\libpq;" + PHP_PGSQL)) {
 		EXTENSION("pgsql", "pgsql.c", PHP_PGSQL_SHARED, "/DZEND_ENABLE_STATIC_TSRMLS_CACHE=1");
+		AC_DEFINE('HAVE_PG_RESULT_MEMORY_SIZE', 1, "Define to 1 if libpq has the 'PQresultMemorySize' function (PostgreSQL 12 or later).");
 		AC_DEFINE('HAVE_PGSQL', 1, "Define to 1 if the PHP extension 'pgsql' is available.");
 		ADD_FLAG("CFLAGS_PGSQL", "/D PGSQL_EXPORTS");
 		ADD_EXTENSION_DEP('pgsql', 'pcre');
diff --git a/ext/pgsql/pgsql.c b/ext/pgsql/pgsql.c
index f50bc680c4b9..0ea766c12b42 100644
--- a/ext/pgsql/pgsql.c
+++ b/ext/pgsql/pgsql.c
@@ -1,14 +1,12 @@
 /*
    +----------------------------------------------------------------------+
-   | Copyright (c) The PHP Group                                          |
+   | Copyright © The PHP Group and Contributors.                          |
    +----------------------------------------------------------------------+
-   | This source file is subject to version 3.01 of the PHP license,      |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | https://www.php.net/license/3_01.txt                                 |
-   | If you did not receive a copy of the PHP license and are unable to   |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@php.net so we can mail you a copy immediately.               |
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Authors: Zeev Suraski                                  |
    |          Jouni Ahto                             |
@@ -153,9 +151,7 @@ static int le_plink;
 static zend_class_entry *pgsql_link_ce, *pgsql_result_ce, *pgsql_lob_ce;
 static zend_object_handlers pgsql_link_object_handlers, pgsql_result_object_handlers, pgsql_lob_object_handlers;
 
-static inline pgsql_link_handle *pgsql_link_from_obj(zend_object *obj) {
-	return (pgsql_link_handle *)((char *)(obj) - XtOffsetOf(pgsql_link_handle, std));
-}
+#define pgsql_link_from_obj(obj) ZEND_CONTAINER_OF(obj, pgsql_link_handle, std)
 
 #define Z_PGSQL_LINK_P(zv) pgsql_link_from_obj(Z_OBJ_P(zv))
 
@@ -209,9 +205,7 @@ static void pgsql_link_free_obj(zend_object *obj)
 	zend_object_std_dtor(&link->std);
 }
 
-static inline pgsql_result_handle *pgsql_result_from_obj(zend_object *obj) {
-	return (pgsql_result_handle *)((char *)(obj) - XtOffsetOf(pgsql_result_handle, std));
-}
+#define pgsql_result_from_obj(obj) ZEND_CONTAINER_OF(obj, pgsql_result_handle, std)
 
 #define Z_PGSQL_RESULT_P(zv) pgsql_result_from_obj(Z_OBJ_P(zv))
 
@@ -246,9 +240,7 @@ static void pgsql_result_free_obj(zend_object *obj)
 	zend_object_std_dtor(&pg_result->std);
 }
 
-static inline pgLofp *pgsql_lob_from_obj(zend_object *obj) {
-	return (pgLofp *)((char *)(obj) - XtOffsetOf(pgLofp, std));
-}
+#define pgsql_lob_from_obj(obj) ZEND_CONTAINER_OF(obj, pgLofp, std)
 
 #define Z_PGSQL_LOB_P(zv) pgsql_lob_from_obj(Z_OBJ_P(zv))
 
@@ -576,7 +568,7 @@ PHP_MINIT_FUNCTION(pgsql)
 	pgsql_link_ce->default_object_handlers = &pgsql_link_object_handlers;
 
 	memcpy(&pgsql_link_object_handlers, &std_object_handlers, sizeof(zend_object_handlers));
-	pgsql_link_object_handlers.offset = XtOffsetOf(pgsql_link_handle, std);
+	pgsql_link_object_handlers.offset = offsetof(pgsql_link_handle, std);
 	pgsql_link_object_handlers.free_obj = pgsql_link_free_obj;
 	pgsql_link_object_handlers.get_constructor = pgsql_link_get_constructor;
 	pgsql_link_object_handlers.clone_obj = NULL;
@@ -587,7 +579,7 @@ PHP_MINIT_FUNCTION(pgsql)
 	pgsql_result_ce->default_object_handlers = &pgsql_result_object_handlers;
 
 	memcpy(&pgsql_result_object_handlers, &std_object_handlers, sizeof(zend_object_handlers));
-	pgsql_result_object_handlers.offset = XtOffsetOf(pgsql_result_handle, std);
+	pgsql_result_object_handlers.offset = offsetof(pgsql_result_handle, std);
 	pgsql_result_object_handlers.free_obj = pgsql_result_free_obj;
 	pgsql_result_object_handlers.get_constructor = pgsql_result_get_constructor;
 	pgsql_result_object_handlers.clone_obj = NULL;
@@ -598,7 +590,7 @@ PHP_MINIT_FUNCTION(pgsql)
 	pgsql_lob_ce->default_object_handlers = &pgsql_lob_object_handlers;
 
 	memcpy(&pgsql_lob_object_handlers, &std_object_handlers, sizeof(zend_object_handlers));
-	pgsql_lob_object_handlers.offset = XtOffsetOf(pgLofp, std);
+	pgsql_lob_object_handlers.offset = offsetof(pgLofp, std);
 	pgsql_lob_object_handlers.free_obj = pgsql_lob_free_obj;
 	pgsql_lob_object_handlers.get_constructor = pgsql_lob_get_constructor;
 	pgsql_lob_object_handlers.clone_obj = NULL;
@@ -1013,7 +1005,7 @@ static void php_pgsql_get_link_info(INTERNAL_FUNCTION_PARAMETERS, int entry_type
 			break;
 		}
 #endif
-		EMPTY_SWITCH_DEFAULT_CASE()
+		default: ZEND_UNREACHABLE();
 	}
 	if (result) {
 		RETURN_STRING(result);
@@ -1212,7 +1204,6 @@ PHP_FUNCTION(pg_query)
 			PHP_PQ_ERROR("Query failed: %s", pgsql);
 			PQclear(pgsql_result);
 			RETURN_FALSE;
-			break;
 		case PGRES_COMMAND_OK: /* successful command that did not return rows */
 		default:
 			if (pgsql_result) {
@@ -1231,7 +1222,7 @@ PHP_FUNCTION(pg_query)
 
 /* The char pointer MUST refer to the char* of a zend_string struct */
 static void php_pgsql_zend_string_release_from_char_pointer(char *ptr) {
-	zend_string_release((zend_string*) (ptr - XtOffsetOf(zend_string, val)));
+	zend_string_release((zend_string*) (ptr - offsetof(zend_string, val)));
 }
 
 static void _php_pgsql_free_params(char **params, uint32_t num_params)
@@ -1351,7 +1342,6 @@ PHP_FUNCTION(pg_query_params)
 			PHP_PQ_ERROR("Query failed: %s", pgsql);
 			PQclear(pgsql_result);
 			RETURN_FALSE;
-			break;
 		case PGRES_COMMAND_OK: /* successful command that did not return rows */
 		default:
 			if (pgsql_result) {
@@ -1437,7 +1427,6 @@ PHP_FUNCTION(pg_prepare)
 			PHP_PQ_ERROR("Query failed: %s", pgsql);
 			PQclear(pgsql_result);
 			RETURN_FALSE;
-			break;
 		case PGRES_COMMAND_OK: /* successful command that did not return rows */
 		default:
 			if (pgsql_result) {
@@ -1536,7 +1525,6 @@ PHP_FUNCTION(pg_execute)
 			PHP_PQ_ERROR("Query failed: %s", pgsql);
 			PQclear(pgsql_result);
 			RETURN_FALSE;
-			break;
 		case PGRES_COMMAND_OK: /* successful command that did not return rows */
 		default:
 			if (pgsql_result) {
@@ -1582,7 +1570,7 @@ static void php_pgsql_get_result_info(INTERNAL_FUNCTION_PARAMETERS, int entry_ty
 		case PHP_PG_CMD_TUPLES:
 			RETVAL_LONG(atoi(PQcmdTuples(pgsql_result)));
 			break;
-		EMPTY_SWITCH_DEFAULT_CASE()
+		default: ZEND_UNREACHABLE();
 	}
 }
 
@@ -1648,7 +1636,6 @@ PHP_FUNCTION(pg_last_notice)
 				zend_hash_clean(notices);
 			}
 			RETURN_TRUE;
-			break;
 		default:
 			zend_argument_value_error(2, "must be one of PGSQL_NOTICE_LAST, PGSQL_NOTICE_ALL, or PGSQL_NOTICE_CLEAR");
 			RETURN_THROWS();
@@ -1814,19 +1801,15 @@ static void php_pgsql_get_field_info(INTERNAL_FUNCTION_PARAMETERS, int entry_typ
 	switch (entry_type) {
 		case PHP_PG_FIELD_NAME:
 			RETURN_STRING(PQfname(pgsql_result, (int)field));
-			break;
 		case PHP_PG_FIELD_SIZE:
 			RETURN_LONG(PQfsize(pgsql_result, (int)field));
-			break;
 		case PHP_PG_FIELD_TYPE:
 			RETURN_STR(get_field_name(pg_result->conn, PQftype(pgsql_result, (int)field)));
-			break;
 		case PHP_PG_FIELD_TYPE_OID:
 
 			oid = PQftype(pgsql_result, (int)field);
 			PGSQL_RETURN_OID(oid);
-			break;
-		EMPTY_SWITCH_DEFAULT_CASE()
+		default: ZEND_UNREACHABLE();
 	}
 }
 /* }}} */
@@ -2140,26 +2123,17 @@ PHP_FUNCTION(pg_fetch_object)
 		ce = zend_standard_class_def;
 	}
 
-	if (!ce->constructor && ctor_params && zend_hash_num_elements(ctor_params) > 0) {
-		zend_argument_value_error(3,
-			"must be empty when the specified class (%s) does not have a constructor",
-			ZSTR_VAL(ce->name)
-		);
+	if (UNEXPECTED(object_init_ex(return_value, ce) == FAILURE)) {
 		RETURN_THROWS();
 	}
 
 	zval dataset;
 	if (UNEXPECTED(!php_pgsql_fetch_hash(&dataset, result, row, row_is_null, PGSQL_ASSOC))) {
 		/* Either an exception is thrown, or we return false */
+		zval_ptr_dtor(return_value);
 		RETURN_FALSE;
 	}
 
-	// TODO: Check CE is an instantiable class earlier?
-	zend_result obj_initialized = object_init_ex(return_value, ce);
-	if (UNEXPECTED(obj_initialized == FAILURE)) {
-		zval_ptr_dtor(&dataset);
-		RETURN_THROWS();
-	}
 	if (!ce->default_properties_count && !ce->__set) {
 		Z_OBJ_P(return_value)->properties = Z_ARR(dataset);
 	} else {
@@ -2167,10 +2141,32 @@ PHP_FUNCTION(pg_fetch_object)
 		zval_ptr_dtor(&dataset);
 	}
 
-	// TODO: Need to grab constructor via object handler as this allows instantiating internal objects with overridden get_constructor
-	if (ce->constructor) {
-		zend_call_known_function(ce->constructor, Z_OBJ_P(return_value), Z_OBJCE_P(return_value),
+	zend_object *obj = Z_OBJ_P(return_value);
+	const zend_class_entry *old = EG(fake_scope);
+	EG(fake_scope) = ce;
+	zend_function *constructor = obj->handlers->get_constructor(obj);
+	EG(fake_scope) = old;
+
+	if (UNEXPECTED(EG(exception))) {
+		/* visibility error or override refused - VM dtors return_value */
+		return;
+	}
+
+	if (UNEXPECTED(!constructor && ctor_params && zend_hash_num_elements(ctor_params) > 0)) {
+		zend_argument_value_error(4,
+			"must be empty when the specified class (%s) does not have a constructor",
+			ZSTR_VAL(ce->name)
+		);
+		RETURN_THROWS();
+	}
+
+	if (constructor) {
+		zend_call_known_function(constructor, obj, ce,
 			/* retval */ NULL, /* argc */ 0, /* params */ NULL, ctor_params);
+		if (EG(exception)) {
+			zend_object_store_ctor_failed(obj);
+			RETURN_THROWS();
+		}
 	}
 }
 /* }}} */
@@ -2357,7 +2353,7 @@ static void php_pgsql_data_info(INTERNAL_FUNCTION_PARAMETERS, int entry_type, bo
 		case PHP_PG_DATA_ISNULL:
 			RETVAL_LONG(PQgetisnull(pgsql_result, pgsql_row, field_offset));
 			break;
-		EMPTY_SWITCH_DEFAULT_CASE()
+		default: ZEND_UNREACHABLE();
 	}
 }
 /* }}} */
@@ -3405,7 +3401,6 @@ PHP_FUNCTION(pg_copy_to)
 						case -2:
 							PHP_PQ_ERROR("getline failed: %s", pgsql);
 							RETURN_FALSE;
-							break;
 						default:
 							add_next_index_string(return_value, csv);
 							PQfreemem(csv);
@@ -3424,7 +3419,6 @@ PHP_FUNCTION(pg_copy_to)
 			PQclear(pgsql_result);
 			PHP_PQ_ERROR("Copy command failed: %s", pgsql);
 			RETURN_FALSE;
-			break;
 	}
 }
 /* }}} */
@@ -3440,7 +3434,7 @@ static zend_result pgsql_copy_from_query(PGconn *pgsql, PGresult *pgsql_result,
 	int result;
 	if (ZSTR_LEN(tmp) > 0 && ZSTR_VAL(tmp)[ZSTR_LEN(tmp) - 1] != '\n') {
 		char *zquery = emalloc(ZSTR_LEN(tmp) + 2);
-		memcpy(zquery, ZSTR_VAL(tmp), ZSTR_LEN(tmp) + 1);
+		memcpy(zquery, ZSTR_VAL(tmp), ZSTR_LEN(tmp));
 		zquery[ZSTR_LEN(tmp)] = '\n';
 		zquery[ZSTR_LEN(tmp) + 1] = '\0';
 		result = PQputCopyData(pgsql, zquery, ZSTR_LEN(tmp) + 1);
@@ -3555,12 +3549,10 @@ PHP_FUNCTION(pg_copy_from)
 				RETURN_FALSE;
 			}
 			RETURN_TRUE;
-			break;
 		default:
 			PQclear(pgsql_result);
 			PHP_PQ_ERROR("Copy command failed: %s", pgsql);
 			RETURN_FALSE;
-			break;
 	}
 }
 /* }}} */
@@ -3934,7 +3926,7 @@ static void php_pgsql_do_async(INTERNAL_FUNCTION_PARAMETERS, int entry_type)
 			PQfreeCancel(c);
 			break;
 		}
-		EMPTY_SWITCH_DEFAULT_CASE()
+		default: ZEND_UNREACHABLE();
 	}
 	if (PQsetnonblocking(pgsql, 0)) {
 		php_error_docref(NULL, E_NOTICE, "Cannot set connection to blocking mode");
@@ -4545,8 +4537,8 @@ PHP_FUNCTION(pg_flush)
 	}
 
 	switch (ret) {
-		case 0: RETURN_TRUE; break;
-		case 1: RETURN_LONG(0); break;
+		case 0: RETURN_TRUE;
+		case 1: RETURN_LONG(0);
 		default: RETURN_FALSE;
 	}
 }
@@ -5797,7 +5789,6 @@ PHP_FUNCTION(pg_insert)
 				PHP_PQ_ERROR("Query failed: %s", pg_link);
 				PQclear(pg_result);
 				RETURN_FALSE;
-				break;
 			case PGRES_COMMAND_OK: /* successful command that did not return rows */
 			default:
 				if (pg_result) {
diff --git a/ext/pgsql/php_pgsql.h b/ext/pgsql/php_pgsql.h
index 7a5770cb5936..a865a7ce73a4 100644
--- a/ext/pgsql/php_pgsql.h
+++ b/ext/pgsql/php_pgsql.h
@@ -1,14 +1,12 @@
 /*
    +----------------------------------------------------------------------+
-   | Copyright (c) The PHP Group                                          |
+   | Copyright © The PHP Group and Contributors.                          |
    +----------------------------------------------------------------------+
-   | This source file is subject to version 3.01 of the PHP license,      |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | https://www.php.net/license/3_01.txt                                 |
-   | If you did not receive a copy of the PHP license and are unable to   |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@php.net so we can mail you a copy immediately.               |
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Authors: Zeev Suraski                                  |
    |          Jouni Ahto                             |
diff --git a/ext/pgsql/tests/pg_fetch_object_ctor_paths.phpt b/ext/pgsql/tests/pg_fetch_object_ctor_paths.phpt
new file mode 100644
index 000000000000..bd3df73acba4
--- /dev/null
+++ b/ext/pgsql/tests/pg_fetch_object_ctor_paths.phpt
@@ -0,0 +1,69 @@
+--TEST--
+pg_fetch_object() constructor handling: ctor_params validation, throwing constructor, property visibility
+--EXTENSIONS--
+pgsql
+--SKIPIF--
+
+--FILE--
+num}, str={$this->str}\n";
+    }
+    public function __destruct() {
+        echo "SeesProps::__destruct called\n";
+    }
+}
+
+$table_name = "pg_fetch_object_ctor_paths";
+$db = pg_connect($conn_str);
+pg_query($db, "CREATE TABLE {$table_name} (num int, str text)");
+pg_query($db, "INSERT INTO {$table_name} VALUES(1, 'hello')");
+
+$sql = "SELECT * FROM {$table_name} WHERE num = 1";
+
+// 1) ctor_params on a class with no constructor must throw ValueError
+try {
+    pg_fetch_object(pg_query($db, $sql), null, 'NoCtor', [1, 2]);
+} catch (ValueError $e) {
+    echo $e->getMessage(), "\n";
+}
+
+// 2) Constructor that throws: __destruct must NOT run on the partially constructed object
+try {
+    pg_fetch_object(pg_query($db, $sql), null, 'ThrowingCtor');
+} catch (RuntimeException $e) {
+    echo "caught: ", $e->getMessage(), "\n";
+}
+
+// 3) Constructor sees row properties already merged onto $this
+$obj = pg_fetch_object(pg_query($db, $sql), null, 'SeesProps');
+unset($obj);
+
+echo "Ok\n";
+?>
+--CLEAN--
+
+--EXPECT--
+pg_fetch_object(): Argument #4 ($constructor_args) must be empty when the specified class (NoCtor) does not have a constructor
+caught: boom
+ctor sees: num=1, str=hello
+SeesProps::__destruct called
+Ok
diff --git a/ext/phar/dirstream.c b/ext/phar/dirstream.c
index f37599e7db11..f700cc3d84b3 100644
--- a/ext/phar/dirstream.c
+++ b/ext/phar/dirstream.c
@@ -2,15 +2,13 @@
   +----------------------------------------------------------------------+
   | phar:// stream wrapper support                                       |
   +----------------------------------------------------------------------+
-  | Copyright (c) The PHP Group                                          |
+  | Copyright © The PHP Group and Contributors.                          |
   +----------------------------------------------------------------------+
-  | This source file is subject to version 3.01 of the PHP license,      |
-  | that is bundled with this package in the file LICENSE, and is        |
-  | available through the world-wide-web at the following url:           |
-  | https://www.php.net/license/3_01.txt                                 |
-  | If you did not receive a copy of the PHP license and are unable to   |
-  | obtain it through the world-wide-web, please send a note to          |
-  | license@php.net so we can mail you a copy immediately.               |
+  | This source file is subject to the Modified BSD License that is      |
+  | bundled with this package in the file LICENSE, and is available      |
+  | through the World Wide Web at .        |
+  |                                                                      |
+  | SPDX-License-Identifier: BSD-3-Clause                                |
   +----------------------------------------------------------------------+
   | Authors: Gregory Beaver                              |
   |          Marcus Boerger                               |
@@ -21,8 +19,6 @@
 #include "phar_internal.h"
 #include "dirstream.h"
 
-void phar_dostat(phar_archive_data *phar, phar_entry_info *data, php_stream_statbuf *ssb, bool is_dir);
-
 static const php_stream_ops phar_dir_ops = {
 	phar_dir_write, /* write */
 	phar_dir_read,  /* read  */
@@ -153,7 +149,7 @@ static int phar_compare_dir_name(Bucket *f, Bucket *s)  /* {{{ */
 static php_stream *phar_make_dirstream(const char *dir, size_t dirlen, const HashTable *manifest) /* {{{ */
 {
 	HashTable *data;
-	char *entry;
+	const char *entry;
 
 	ALLOC_HASHTABLE(data);
 	zend_hash_init(data, 64, NULL, NULL, 0);
@@ -185,9 +181,7 @@ static php_stream *phar_make_dirstream(const char *dir, size_t dirlen, const Has
 				/* the entry has a path separator and is a subdirectory */
 				keylen = has_slash - ZSTR_VAL(str_key);
 			}
-			entry = safe_emalloc(keylen, 1, 1);
-			memcpy(entry, ZSTR_VAL(str_key), keylen);
-			entry[keylen] = '\0';
+			entry = ZSTR_VAL(str_key);
 		} else {
 			if (0 != memcmp(ZSTR_VAL(str_key), dir, dirlen)) {
 				/* entry in directory not found */
@@ -205,16 +199,12 @@ static php_stream *phar_make_dirstream(const char *dir, size_t dirlen, const Has
 			if (has_slash) {
 				/* is subdirectory */
 				save -= dirlen + 1;
-				entry = safe_emalloc(has_slash - save + dirlen, 1, 1);
-				memcpy(entry, save + dirlen + 1, has_slash - save - dirlen - 1);
 				keylen = has_slash - save - dirlen - 1;
-				entry[keylen] = '\0';
+				entry = save + dirlen + 1;
 			} else {
 				/* is file */
 				save -= dirlen + 1;
-				entry = safe_emalloc(keylen - dirlen, 1, 1);
-				memcpy(entry, save + dirlen + 1, keylen - dirlen - 1);
-				entry[keylen - dirlen - 1] = '\0';
+				entry = save + dirlen + 1;
 				keylen = keylen - dirlen - 1;
 			}
 		}
@@ -231,8 +221,6 @@ static php_stream *phar_make_dirstream(const char *dir, size_t dirlen, const Has
 			ZVAL_NULL(&dummy);
 			zend_hash_str_update(data, entry, keylen, &dummy);
 		}
-
-		efree(entry);
 	} ZEND_HASH_FOREACH_END();
 
 	if (FAILURE != zend_hash_has_more_elements(data)) {
@@ -249,50 +237,52 @@ static php_stream *phar_make_dirstream(const char *dir, size_t dirlen, const Has
  */
 php_stream *phar_wrapper_open_dir(php_stream_wrapper *wrapper, const char *path, const char *mode, int options, zend_string **opened_path, php_stream_context *context STREAMS_DC) /* {{{ */
 {
-	php_url *resource = NULL;
 	char *error;
-	phar_archive_data *phar;
 
-	if ((resource = phar_parse_url(wrapper, path, mode, options)) == NULL) {
-		php_stream_wrapper_log_error(wrapper, options, "phar url \"%s\" is unknown", path);
+	php_url *resource = phar_parse_url(wrapper, context, path, mode, options);
+	if (resource == NULL) {
+		php_stream_wrapper_log_warn(wrapper, context, options, InvalidUrl,
+			"phar url \"%s\" is unknown", path);
 		return NULL;
 	}
 
 	/* we must have at the very least phar://alias.phar/ */
 	if (!resource->scheme || !resource->host || !resource->path) {
 		if (resource->host && !resource->path) {
-			php_stream_wrapper_log_error(wrapper, options, "phar error: no directory in \"%s\", must have at least phar://%s/ for root directory (always use full path to a new phar)", path, ZSTR_VAL(resource->host));
+			php_stream_wrapper_log_warn(wrapper, context, options, InvalidPath,
+				"phar error: no directory in \"%s\", must have at least phar://%s/ for root directory (always use full path to a new phar)",
+				path, ZSTR_VAL(resource->host));
 			php_url_free(resource);
 			return NULL;
 		}
 		php_url_free(resource);
-		php_stream_wrapper_log_error(wrapper, options, "phar error: invalid url \"%s\", must have at least phar://%s/", path, path);
+		php_stream_wrapper_log_warn(wrapper, context, options, InvalidUrl,
+			"phar error: invalid url \"%s\", must have at least phar://%s/", path, path);
 		return NULL;
 	}
 
 	if (!zend_string_equals_literal_ci(resource->scheme, "phar")) {
 		php_url_free(resource);
-		php_stream_wrapper_log_error(wrapper, options, "phar error: not a phar url \"%s\"", path);
+		php_stream_wrapper_log_warn(wrapper, context, options, ProtocolUnsupported,
+			"phar error: not a phar url \"%s\"", path);
 		return NULL;
 	}
 
 	phar_request_initialize();
 
-	if (FAILURE == phar_get_archive(&phar, ZSTR_VAL(resource->host), ZSTR_LEN(resource->host), NULL, 0, &error)) {
+	const phar_archive_data *phar = phar_get_archive(ZSTR_VAL(resource->host), ZSTR_LEN(resource->host), NULL, 0, &error);
+	if (!phar) {
 		if (error) {
-			php_stream_wrapper_log_error(wrapper, options, "%s", error);
+			php_stream_wrapper_log_warn(wrapper, context, options, NotFound, "%s", error);
 			efree(error);
 		} else {
-			php_stream_wrapper_log_error(wrapper, options, "phar file \"%s\" is unknown", ZSTR_VAL(resource->host));
+			php_stream_wrapper_log_warn(wrapper, context, options, NotFound,
+				"phar file \"%s\" is unknown", ZSTR_VAL(resource->host));
 		}
 		php_url_free(resource);
 		return NULL;
 	}
 
-	if (error) {
-		efree(error);
-	}
-
 	if (zend_string_equals(resource->path, ZSTR_CHAR('/'))) {
 		/* root directory requested */
 		php_url_free(resource);
@@ -306,7 +296,7 @@ php_stream *phar_wrapper_open_dir(php_stream_wrapper *wrapper, const char *path,
 
 	const char *internal_file = ZSTR_VAL(resource->path) + 1; /* strip leading "/" */
 	size_t internal_file_len = ZSTR_LEN(resource->path) - 1;
-	phar_entry_info *entry = zend_hash_str_find_ptr(&phar->manifest, internal_file, internal_file_len);
+	const phar_entry_info *entry = zend_hash_str_find_ptr(&phar->manifest, internal_file, internal_file_len);
 	php_stream *ret;
 
 	if (NULL != entry && !entry->is_dir) {
@@ -345,66 +335,75 @@ php_stream *phar_wrapper_open_dir(php_stream_wrapper *wrapper, const char *path,
  */
 int phar_wrapper_mkdir(php_stream_wrapper *wrapper, const char *url_from, int mode, int options, php_stream_context *context) /* {{{ */
 {
-	phar_entry_info entry, *e;
-	phar_archive_data *phar = NULL;
-	char *error, *arch;
-	size_t arch_len;
+	phar_entry_info entry;
+	char *error;
 	php_url *resource = NULL;
 
 	/* pre-readonly check, we need to know if this is a data phar */
-	if (FAILURE == phar_split_fname(url_from, strlen(url_from), &arch, &arch_len, NULL, NULL, 2, 2)) {
-		php_stream_wrapper_log_error(wrapper, options, "phar error: cannot create directory \"%s\", no phar archive specified", url_from);
+	zend_string *arch = phar_split_fname(url_from, strlen(url_from), NULL, 2, 2);
+	if (!arch) {
+		php_stream_wrapper_log_warn(wrapper, context, options, NotFound,
+			"phar error: cannot create directory \"%s\", no phar archive specified", url_from);
 		return 0;
 	}
 
-	if (FAILURE == phar_get_archive(&phar, arch, arch_len, NULL, 0, NULL)) {
-		phar = NULL;
-	}
+	phar_archive_data *phar = phar_get_archive(ZSTR_VAL(arch), ZSTR_LEN(arch), NULL, 0, NULL);
 
-	efree(arch);
+	zend_string_release_ex(arch, false);
 
 	if (PHAR_G(readonly) && (!phar || !phar->is_data)) {
-		php_stream_wrapper_log_error(wrapper, options, "phar error: cannot create directory \"%s\", write operations disabled", url_from);
+		php_stream_wrapper_log_warn(wrapper, context, options, Readonly,
+			"phar error: cannot create directory \"%s\", write operations disabled", url_from);
 		return 0;
 	}
 
-	if ((resource = phar_parse_url(wrapper, url_from, "w", options)) == NULL) {
+	if ((resource = phar_parse_url(wrapper, context, url_from, "w", options)) == NULL) {
 		return 0;
 	}
 
 	/* we must have at the very least phar://alias.phar/internalfile.php */
 	if (!resource->scheme || !resource->host || !resource->path) {
 		php_url_free(resource);
-		php_stream_wrapper_log_error(wrapper, options, "phar error: invalid url \"%s\"", url_from);
+		php_stream_wrapper_log_warn(wrapper, context, options, InvalidUrl,
+			"phar error: invalid url \"%s\"", url_from);
 		return 0;
 	}
 
 	if (!zend_string_equals_literal_ci(resource->scheme, "phar")) {
 		php_url_free(resource);
-		php_stream_wrapper_log_error(wrapper, options, "phar error: not a phar stream url \"%s\"", url_from);
+		php_stream_wrapper_log_warn(wrapper, context, options, ProtocolUnsupported,
+			"phar error: not a phar stream url \"%s\"", url_from);
 		return 0;
 	}
 
-	if (FAILURE == phar_get_archive(&phar, ZSTR_VAL(resource->host), ZSTR_LEN(resource->host), NULL, 0, &error)) {
-		php_stream_wrapper_log_error(wrapper, options, "phar error: cannot create directory \"%s\" in phar \"%s\", error retrieving phar information: %s", ZSTR_VAL(resource->path) + 1, ZSTR_VAL(resource->host), error);
+	phar = phar_get_archive(ZSTR_VAL(resource->host), ZSTR_LEN(resource->host), NULL, 0, &error);
+	if (!phar) {
+		php_stream_wrapper_log_warn(wrapper, context, options, MkdirFailed,
+			"phar error: cannot create directory \"%s\" in phar \"%s\", error retrieving phar information: %s",
+			ZSTR_VAL(resource->path) + 1, ZSTR_VAL(resource->host), error);
 		efree(error);
 		php_url_free(resource);
 		return 0;
 	}
 
-	if ((e = phar_get_entry_info_dir(phar, ZSTR_VAL(resource->path) + 1, ZSTR_LEN(resource->path) - 1, 2, &error, true))) {
+	phar_entry_info *e = phar_get_entry_info_dir(phar, ZSTR_VAL(resource->path) + 1, ZSTR_LEN(resource->path) - 1, 2, &error, true);
+	if (e) {
 		/* directory exists, or is a subdirectory of an existing file */
 		if (e->is_temp_dir) {
 			zend_string_efree(e->filename);
 			efree(e);
 		}
-		php_stream_wrapper_log_error(wrapper, options, "phar error: cannot create directory \"%s\" in phar \"%s\", directory already exists", ZSTR_VAL(resource->path)+1, ZSTR_VAL(resource->host));
+		php_stream_wrapper_log_warn(wrapper, context, options, AlreadyExists,
+			"phar error: cannot create directory \"%s\" in phar \"%s\", directory already exists",
+			ZSTR_VAL(resource->path)+1, ZSTR_VAL(resource->host));
 		php_url_free(resource);
 		return 0;
 	}
 
 	if (error) {
-		php_stream_wrapper_log_error(wrapper, options, "phar error: cannot create directory \"%s\" in phar \"%s\", %s", ZSTR_VAL(resource->path)+1, ZSTR_VAL(resource->host), error);
+		php_stream_wrapper_log_warn(wrapper, context, options, MkdirFailed,
+			"phar error: cannot create directory \"%s\" in phar \"%s\", %s",
+			ZSTR_VAL(resource->path)+1, ZSTR_VAL(resource->host), error);
 		efree(error);
 		php_url_free(resource);
 		return 0;
@@ -412,13 +411,17 @@ int phar_wrapper_mkdir(php_stream_wrapper *wrapper, const char *url_from, int mo
 
 	if (phar_get_entry_info_dir(phar, ZSTR_VAL(resource->path) + 1, ZSTR_LEN(resource->path) - 1, 0, &error, true)) {
 		/* entry exists as a file */
-		php_stream_wrapper_log_error(wrapper, options, "phar error: cannot create directory \"%s\" in phar \"%s\", file already exists", ZSTR_VAL(resource->path)+1, ZSTR_VAL(resource->host));
+		php_stream_wrapper_log_warn(wrapper, context, options, AlreadyExists,
+			"phar error: cannot create directory \"%s\" in phar \"%s\", file already exists",
+			ZSTR_VAL(resource->path)+1, ZSTR_VAL(resource->host));
 		php_url_free(resource);
 		return 0;
 	}
 
 	if (error) {
-		php_stream_wrapper_log_error(wrapper, options, "phar error: cannot create directory \"%s\" in phar \"%s\", %s", ZSTR_VAL(resource->path)+1, ZSTR_VAL(resource->host), error);
+		php_stream_wrapper_log_warn(wrapper, context, options, MkdirFailed,
+			"phar error: cannot create directory \"%s\" in phar \"%s\", %s",
+			ZSTR_VAL(resource->path)+1, ZSTR_VAL(resource->host), error);
 		efree(error);
 		php_url_free(resource);
 		return 0;
@@ -447,7 +450,9 @@ int phar_wrapper_mkdir(php_stream_wrapper *wrapper, const char *url_from, int mo
 	entry.old_flags = PHAR_ENT_PERM_DEF_DIR;
 
 	if (NULL == zend_hash_add_mem(&phar->manifest, entry.filename, &entry, sizeof(phar_entry_info))) {
-		php_stream_wrapper_log_error(wrapper, options, "phar error: cannot create directory \"%s\" in phar \"%s\", adding to manifest failed", ZSTR_VAL(entry.filename), phar->fname);
+		php_stream_wrapper_log_warn(wrapper, context, options, MkdirFailed,
+			"phar error: cannot create directory \"%s\" in phar \"%s\", adding to manifest failed",
+			ZSTR_VAL(entry.filename), ZSTR_VAL(phar->fname));
 		zend_string_efree(entry.filename);
 		return 0;
 	}
@@ -455,7 +460,9 @@ int phar_wrapper_mkdir(php_stream_wrapper *wrapper, const char *url_from, int mo
 	phar_flush(phar, &error);
 
 	if (error) {
-		php_stream_wrapper_log_error(wrapper, options, "phar error: cannot create directory \"%s\" in phar \"%s\", %s", ZSTR_VAL(entry.filename), phar->fname, error);
+		php_stream_wrapper_log_warn(wrapper, context, options, MkdirFailed,
+			"phar error: cannot create directory \"%s\" in phar \"%s\", %s",
+			ZSTR_VAL(entry.filename), ZSTR_VAL(phar->fname), error);
 		zend_hash_del(&phar->manifest, entry.filename);
 		efree(error);
 		return 0;
@@ -471,48 +478,51 @@ int phar_wrapper_mkdir(php_stream_wrapper *wrapper, const char *url_from, int mo
  */
 int phar_wrapper_rmdir(php_stream_wrapper *wrapper, const char *url, int options, php_stream_context *context) /* {{{ */
 {
-	phar_entry_info *entry;
-	phar_archive_data *phar = NULL;
-	char *error, *arch;
-	size_t arch_len;
-	php_url *resource = NULL;
+	char *error;
 
 	/* pre-readonly check, we need to know if this is a data phar */
-	if (FAILURE == phar_split_fname(url, strlen(url), &arch, &arch_len, NULL, NULL, 2, 2)) {
-		php_stream_wrapper_log_error(wrapper, options, "phar error: cannot remove directory \"%s\", no phar archive specified, or phar archive does not exist", url);
+	zend_string *arch = phar_split_fname(url, strlen(url), NULL, 2, 2);
+	if (!arch) {
+		php_stream_wrapper_log_warn(wrapper, context, options, NotFound,
+			"phar error: cannot remove directory \"%s\", no phar archive specified, or phar archive does not exist", url);
 		return 0;
 	}
 
-	if (FAILURE == phar_get_archive(&phar, arch, arch_len, NULL, 0, NULL)) {
-		phar = NULL;
-	}
+	phar_archive_data *phar = phar_get_archive(ZSTR_VAL(arch), ZSTR_LEN(arch), NULL, 0, NULL);
 
-	efree(arch);
+	zend_string_release_ex(arch, false);
 
 	if (PHAR_G(readonly) && (!phar || !phar->is_data)) {
-		php_stream_wrapper_log_error(wrapper, options, "phar error: cannot rmdir directory \"%s\", write operations disabled", url);
+		php_stream_wrapper_log_warn(wrapper, context, options, Readonly,
+			"phar error: cannot rmdir directory \"%s\", write operations disabled", url);
 		return 0;
 	}
 
-	if ((resource = phar_parse_url(wrapper, url, "w", options)) == NULL) {
+	php_url *resource = phar_parse_url(wrapper, context, url, "w", options);
+	if (!resource) {
 		return 0;
 	}
 
 	/* we must have at the very least phar://alias.phar/internalfile.php */
 	if (!resource->scheme || !resource->host || !resource->path) {
 		php_url_free(resource);
-		php_stream_wrapper_log_error(wrapper, options, "phar error: invalid url \"%s\"", url);
+		php_stream_wrapper_log_warn(wrapper, context, options, InvalidUrl,
+			"phar error: invalid url \"%s\"", url);
 		return 0;
 	}
 
 	if (!zend_string_equals_literal_ci(resource->scheme, "phar")) {
 		php_url_free(resource);
-		php_stream_wrapper_log_error(wrapper, options, "phar error: not a phar stream url \"%s\"", url);
+		php_stream_wrapper_log_warn(wrapper, context, options, ProtocolUnsupported,
+			"phar error: not a phar stream url \"%s\"", url);
 		return 0;
 	}
 
-	if (FAILURE == phar_get_archive(&phar, ZSTR_VAL(resource->host), ZSTR_LEN(resource->host), NULL, 0, &error)) {
-		php_stream_wrapper_log_error(wrapper, options, "phar error: cannot remove directory \"%s\" in phar \"%s\", error retrieving phar information: %s", ZSTR_VAL(resource->path)+1, ZSTR_VAL(resource->host), error);
+	phar = phar_get_archive(ZSTR_VAL(resource->host), ZSTR_LEN(resource->host), NULL, 0, &error);
+	if (!phar) {
+		php_stream_wrapper_log_warn(wrapper, context, options, RmdirFailed,
+			"phar error: cannot remove directory \"%s\" in phar \"%s\", error retrieving phar information: %s",
+			ZSTR_VAL(resource->path)+1, ZSTR_VAL(resource->host), error);
 		efree(error);
 		php_url_free(resource);
 		return 0;
@@ -520,12 +530,17 @@ int phar_wrapper_rmdir(php_stream_wrapper *wrapper, const char *url, int options
 
 	size_t path_len = ZSTR_LEN(resource->path) - 1;
 
-	if (!(entry = phar_get_entry_info_dir(phar, ZSTR_VAL(resource->path) + 1, path_len, 2, &error, true))) {
+	phar_entry_info *entry = phar_get_entry_info_dir(phar, ZSTR_VAL(resource->path) + 1, path_len, 2, &error, true);
+	if (!entry) {
 		if (error) {
-			php_stream_wrapper_log_error(wrapper, options, "phar error: cannot remove directory \"%s\" in phar \"%s\", %s", ZSTR_VAL(resource->path)+1, ZSTR_VAL(resource->host), error);
+			php_stream_wrapper_log_warn(wrapper, context, options, RmdirFailed,
+				"phar error: cannot remove directory \"%s\" in phar \"%s\", %s",
+				ZSTR_VAL(resource->path)+1, ZSTR_VAL(resource->host), error);
 			efree(error);
 		} else {
-			php_stream_wrapper_log_error(wrapper, options, "phar error: cannot remove directory \"%s\" in phar \"%s\", directory does not exist", ZSTR_VAL(resource->path)+1, ZSTR_VAL(resource->host));
+			php_stream_wrapper_log_warn(wrapper, context, options, NotFound,
+				"phar error: cannot remove directory \"%s\" in phar \"%s\", directory does not exist",
+				ZSTR_VAL(resource->path)+1, ZSTR_VAL(resource->host));
 		}
 		php_url_free(resource);
 		return 0;
@@ -539,7 +554,8 @@ int phar_wrapper_rmdir(php_stream_wrapper *wrapper, const char *url, int options
 				zend_string_starts_with_cstr(str_key, ZSTR_VAL(resource->path)+1, path_len)
 				&& IS_SLASH(ZSTR_VAL(str_key)[path_len])
 			) {
-				php_stream_wrapper_log_error(wrapper, options, "phar error: Directory not empty");
+				php_stream_wrapper_log_warn(wrapper, context, options, RmdirFailed,
+					"phar error: Directory not empty");
 				if (entry->is_temp_dir) {
 					zend_string_efree(entry->filename);
 					efree(entry);
@@ -555,7 +571,8 @@ int phar_wrapper_rmdir(php_stream_wrapper *wrapper, const char *url, int options
 				zend_string_starts_with_cstr(str_key, ZSTR_VAL(resource->path)+1, path_len)
 				&& IS_SLASH(ZSTR_VAL(str_key)[path_len])
 			) {
-				php_stream_wrapper_log_error(wrapper, options, "phar error: Directory not empty");
+				php_stream_wrapper_log_warn(wrapper, context, options, RmdirFailed,
+					"phar error: Directory not empty");
 				if (entry->is_temp_dir) {
 					zend_string_efree(entry->filename);
 					efree(entry);
@@ -576,7 +593,9 @@ int phar_wrapper_rmdir(php_stream_wrapper *wrapper, const char *url, int options
 		phar_flush(phar, &error);
 
 		if (error) {
-			php_stream_wrapper_log_error(wrapper, options, "phar error: cannot remove directory \"%s\" in phar \"%s\", %s", ZSTR_VAL(entry->filename), phar->fname, error);
+			php_stream_wrapper_log_warn(wrapper, context, options, RmdirFailed,
+				"phar error: cannot remove directory \"%s\" in phar \"%s\", %s",
+				ZSTR_VAL(entry->filename), ZSTR_VAL(phar->fname), error);
 			php_url_free(resource);
 			efree(error);
 			return 0;
diff --git a/ext/phar/dirstream.h b/ext/phar/dirstream.h
index 4debfecde41a..179150229e3e 100644
--- a/ext/phar/dirstream.h
+++ b/ext/phar/dirstream.h
@@ -2,15 +2,13 @@
   +----------------------------------------------------------------------+
   | phar php single-file executable PHP extension                        |
   +----------------------------------------------------------------------+
-  | Copyright (c) The PHP Group                                          |
+  | Copyright © The PHP Group and Contributors.                          |
   +----------------------------------------------------------------------+
-  | This source file is subject to version 3.01 of the PHP license,      |
-  | that is bundled with this package in the file LICENSE, and is        |
-  | available through the world-wide-web at the following url:           |
-  | https://www.php.net/license/3_01.txt                                 |
-  | If you did not receive a copy of the PHP license and are unable to   |
-  | obtain it through the world-wide-web, please send a note to          |
-  | license@php.net so we can mail you a copy immediately.               |
+  | This source file is subject to the Modified BSD License that is      |
+  | bundled with this package in the file LICENSE, and is available      |
+  | through the World Wide Web at .        |
+  |                                                                      |
+  | SPDX-License-Identifier: BSD-3-Clause                                |
   +----------------------------------------------------------------------+
   | Authors: Gregory Beaver                              |
   |          Marcus Boerger                               |
@@ -24,7 +22,7 @@ int phar_wrapper_rmdir(php_stream_wrapper *wrapper, const char *url, int options
 #ifdef PHAR_DIRSTREAM
 #include "ext/standard/url.h"
 
-php_url* phar_parse_url(php_stream_wrapper *wrapper, const char *filename, const char *mode, int options);
+php_url* phar_parse_url(php_stream_wrapper *wrapper, php_stream_context *context, const char *filename, const char *mode, int options);
 
 /* directory handlers */
 static ssize_t phar_dir_write(php_stream *stream, const char *buf, size_t count);
diff --git a/ext/phar/func_interceptors.c b/ext/phar/func_interceptors.c
index 5d5242e59009..f6e69f20035c 100644
--- a/ext/phar/func_interceptors.c
+++ b/ext/phar/func_interceptors.c
@@ -2,15 +2,13 @@
   +----------------------------------------------------------------------+
   | phar php single-file executable PHP extension                        |
   +----------------------------------------------------------------------+
-  | Copyright (c) The PHP Group                                          |
+  | Copyright © The PHP Group and Contributors.                          |
   +----------------------------------------------------------------------+
-  | This source file is subject to version 3.01 of the PHP license,      |
-  | that is bundled with this package in the file LICENSE, and is        |
-  | available through the world-wide-web at the following url:           |
-  | https://www.php.net/license/3_01.txt                                 |
-  | If you did not receive a copy of the PHP license and are unable to   |
-  | obtain it through the world-wide-web, please send a note to          |
-  | license@php.net so we can mail you a copy immediately.               |
+  | This source file is subject to the Modified BSD License that is      |
+  | bundled with this package in the file LICENSE, and is available      |
+  | through the World Wide Web at .        |
+  |                                                                      |
+  | SPDX-License-Identifier: BSD-3-Clause                                |
   +----------------------------------------------------------------------+
   | Authors: Gregory Beaver                              |
   +----------------------------------------------------------------------+
@@ -40,8 +38,6 @@ PHP_FUNCTION(phar_opendir) /* {{{ */
 	}
 
 	if (!IS_ABSOLUTE_PATH(filename, filename_len) && !strstr(filename, "://")) {
-		char *arch, *entry;
-		size_t arch_len, entry_len;
 		zend_string *fname = zend_get_executed_filename_ex();
 
 		/* we are checking for existence of a file within the relative path.  Chances are good that this is
@@ -50,24 +46,23 @@ PHP_FUNCTION(phar_opendir) /* {{{ */
 			goto skip_phar;
 		}
 
-		if (SUCCESS == phar_split_fname(ZSTR_VAL(fname), ZSTR_LEN(fname), &arch, &arch_len, NULL, NULL, 2, 0)) {
+		zend_string *arch = phar_split_fname(ZSTR_VAL(fname), ZSTR_LEN(fname), NULL, 2, 0);
+		if (arch) {
 			php_stream_context *context = NULL;
 			php_stream *stream;
 			char *name;
 
-			entry = estrndup(filename, filename_len);
 			/* fopen within phar, if :// is not in the url, then prepend phar:/// */
-			entry_len = filename_len;
 			/* retrieving a file within the current directory, so use this if possible */
-			entry = phar_fix_filepath(entry, &entry_len, 1);
+			zend_string *entry = phar_fix_filepath(filename, filename_len, true);
 
-			if (entry[0] == '/') {
-				spprintf(&name, 4096, "phar://%s%s", arch, entry);
+			if (ZSTR_VAL(entry)[0] == '/') {
+				spprintf(&name, 4096, "phar://%s%s", ZSTR_VAL(arch), ZSTR_VAL(entry));
 			} else {
-				spprintf(&name, 4096, "phar://%s/%s", arch, entry);
+				spprintf(&name, 4096, "phar://%s/%s", ZSTR_VAL(arch), ZSTR_VAL(entry));
 			}
-			efree(entry);
-			efree(arch);
+			zend_string_release_ex(entry, false);
+			zend_string_release_ex(arch, false);
 			if (zcontext) {
 				context = php_stream_context_from_zval(zcontext, 0);
 			}
@@ -88,8 +83,6 @@ PHP_FUNCTION(phar_opendir) /* {{{ */
 
 static zend_string* phar_get_name_for_relative_paths(zend_string *filename, bool using_include_path)
 {
-	char *arch;
-	size_t arch_len;
 	zend_string *fname = zend_get_executed_filename_ex();
 
 	/* we are checking for existence of a file within the relative path.  Chances are good that this is
@@ -98,56 +91,56 @@ static zend_string* phar_get_name_for_relative_paths(zend_string *filename, bool
 		return NULL;
 	}
 
-	if (FAILURE == phar_split_fname(ZSTR_VAL(fname), ZSTR_LEN(fname), &arch, &arch_len, NULL, NULL, 2, 0)) {
+	zend_string *arch = phar_split_fname(ZSTR_VAL(fname), ZSTR_LEN(fname), NULL, 2, 0);
+	if (!arch) {
 		return NULL;
 	}
 
 	/* fopen within phar, if :// is not in the url, then prepend phar:/// */
 	/* retrieving a file defaults to within the current directory, so use this if possible */
-	phar_archive_data *phar;
-	if (FAILURE == phar_get_archive(&phar, arch, arch_len, NULL, 0, NULL)) {
-		efree(arch);
+	phar_archive_data *phar = phar_get_archive(ZSTR_VAL(arch), ZSTR_LEN(arch), NULL, 0, NULL);
+	if (!phar) {
+		zend_string_release_ex(arch, false);
 		return NULL;
 	}
 
 	zend_string *name = NULL;
 	if (using_include_path) {
-		if (!(name = phar_find_in_include_path(filename, NULL))) {
+		name = phar_find_in_include_path(filename);
+		if (!name) {
 			/* this file is not in the phar, use the original path */
-			efree(arch);
+			zend_string_release_ex(arch, false);
 			return NULL;
 		}
 	} else {
-		size_t entry_len = ZSTR_LEN(filename);
-		char *entry = phar_fix_filepath(estrndup(ZSTR_VAL(filename), ZSTR_LEN(filename)), &entry_len, 1);
-		if (entry[0] == '/') {
-			if (!zend_hash_str_exists(&(phar->manifest), entry + 1, entry_len - 1)) {
-				/* this file is not in the phar, use the original path */
-notfound:
-				efree(entry);
-				efree(arch);
-				return NULL;
-			}
+		zend_string *entry = phar_fix_filepath(ZSTR_VAL(filename), ZSTR_LEN(filename), true);
+		bool is_in_phar;
+		if (ZSTR_VAL(entry)[0] == '/') {
+			is_in_phar = zend_hash_str_exists(&(phar->manifest), ZSTR_VAL(entry) + 1, ZSTR_LEN(entry) - 1);
 		} else {
-			if (!zend_hash_str_exists(&(phar->manifest), entry, entry_len)) {
-				goto notfound;
-			}
+			is_in_phar = zend_hash_exists(&(phar->manifest), entry);
+		}
+		/* this file is not in the phar, use the original path */
+		if (!is_in_phar) {
+			zend_string_release_ex(entry, false);
+			zend_string_release_ex(arch, false);
+			return NULL;
 		}
 		/* auto-convert to phar:// */
-		if (entry[0] == '/') {
-			ZEND_ASSERT(strlen("phar://") + arch_len + entry_len < 4096);
+		if (ZSTR_VAL(entry)[0] == '/') {
+			ZEND_ASSERT(strlen("phar://") + ZSTR_LEN(arch) + ZSTR_LEN(entry) < 4096);
 			name = zend_string_concat3(
 				"phar://", strlen("phar://"),
-				arch, arch_len,
-				entry, entry_len
+				ZSTR_VAL(arch), ZSTR_LEN(arch),
+				ZSTR_VAL(entry), ZSTR_LEN(entry)
 			);
 		} else {
-			name = strpprintf(4096, "phar://%s/%s", arch, entry);
+			name = strpprintf(4096, "phar://%s/%s", ZSTR_VAL(arch), ZSTR_VAL(entry));
 		}
-		efree(entry);
+		zend_string_release_ex(entry, false);
 	}
 
-	efree(arch);
+	zend_string_release_ex(arch, false);
 	return name;
 }
 
@@ -330,10 +323,6 @@ static void phar_fancy_stat(zend_stat_t *stat_sb, int type, zval *return_value)
 	zval stat_dev, stat_ino, stat_mode, stat_nlink, stat_uid, stat_gid, stat_rdev,
 		 stat_size, stat_atime, stat_mtime, stat_ctime, stat_blksize, stat_blocks;
 	int rmask=S_IROTH, wmask=S_IWOTH, xmask=S_IXOTH; /* access rights defaults to other */
-	char *stat_sb_names[13] = {
-		"dev", "ino", "mode", "nlink", "uid", "gid", "rdev",
-		"size", "atime", "mtime", "ctime", "blksize", "blocks"
-	};
 
 	if (type >= FS_IS_W && type <= FS_IS_X) {
 		if(stat_sb->st_uid==getuid()) {
@@ -345,15 +334,12 @@ static void phar_fancy_stat(zend_stat_t *stat_sb, int type, zval *return_value)
 			wmask=S_IWGRP;
 			xmask=S_IXGRP;
 		} else {
-			int   groups, n, i;
-			gid_t *gids;
-
-			groups = getgroups(0, NULL);
-			if(groups > 0) {
-				gids=(gid_t *)safe_emalloc(groups, sizeof(gid_t), 0);
-				n=getgroups(groups, gids);
-				for(i=0;ist_gid==gids[i]) {
+			int groups = getgroups(0, NULL);
+			if (groups > 0) {
+				gid_t *gids = safe_emalloc(groups, sizeof(gid_t), 0);
+				int n = getgroups(groups, gids);
+				for(int i = 0; i < n; ++i){
+					if (stat_sb->st_gid==gids[i]) {
 						rmask=S_IRGRP;
 						wmask=S_IWGRP;
 						xmask=S_IXGRP;
@@ -453,19 +439,19 @@ static void phar_fancy_stat(zend_stat_t *stat_sb, int type, zval *return_value)
 		zend_hash_next_index_insert(Z_ARRVAL_P(return_value), &stat_blocks);
 
 		/* Store string indexes referencing the same zval*/
-		zend_hash_str_update(Z_ARRVAL_P(return_value), stat_sb_names[0], strlen(stat_sb_names[0]), &stat_dev);
-		zend_hash_str_update(Z_ARRVAL_P(return_value), stat_sb_names[1], strlen(stat_sb_names[1]), &stat_ino);
-		zend_hash_str_update(Z_ARRVAL_P(return_value), stat_sb_names[2], strlen(stat_sb_names[2]), &stat_mode);
-		zend_hash_str_update(Z_ARRVAL_P(return_value), stat_sb_names[3], strlen(stat_sb_names[3]), &stat_nlink);
-		zend_hash_str_update(Z_ARRVAL_P(return_value), stat_sb_names[4], strlen(stat_sb_names[4]), &stat_uid);
-		zend_hash_str_update(Z_ARRVAL_P(return_value), stat_sb_names[5], strlen(stat_sb_names[5]), &stat_gid);
-		zend_hash_str_update(Z_ARRVAL_P(return_value), stat_sb_names[6], strlen(stat_sb_names[6]), &stat_rdev);
-		zend_hash_str_update(Z_ARRVAL_P(return_value), stat_sb_names[7], strlen(stat_sb_names[7]), &stat_size);
-		zend_hash_str_update(Z_ARRVAL_P(return_value), stat_sb_names[8], strlen(stat_sb_names[8]), &stat_atime);
-		zend_hash_str_update(Z_ARRVAL_P(return_value), stat_sb_names[9], strlen(stat_sb_names[9]), &stat_mtime);
-		zend_hash_str_update(Z_ARRVAL_P(return_value), stat_sb_names[10], strlen(stat_sb_names[10]), &stat_ctime);
-		zend_hash_str_update(Z_ARRVAL_P(return_value), stat_sb_names[11], strlen(stat_sb_names[11]), &stat_blksize);
-		zend_hash_str_update(Z_ARRVAL_P(return_value), stat_sb_names[12], strlen(stat_sb_names[12]), &stat_blocks);
+		zend_hash_str_update(Z_ARRVAL_P(return_value), ZEND_STRL("dev"), &stat_dev);
+		zend_hash_str_update(Z_ARRVAL_P(return_value), ZEND_STRL("ino"), &stat_ino);
+		zend_hash_str_update(Z_ARRVAL_P(return_value), ZEND_STRL("mode"), &stat_mode);
+		zend_hash_str_update(Z_ARRVAL_P(return_value), ZEND_STRL("nlink"), &stat_nlink);
+		zend_hash_str_update(Z_ARRVAL_P(return_value), ZEND_STRL("uid"), &stat_uid);
+		zend_hash_str_update(Z_ARRVAL_P(return_value), ZEND_STRL("gid"), &stat_gid);
+		zend_hash_str_update(Z_ARRVAL_P(return_value), ZEND_STRL("rdev"), &stat_rdev);
+		zend_hash_str_update(Z_ARRVAL_P(return_value), ZEND_STRL("size"), &stat_size);
+		zend_hash_str_update(Z_ARRVAL_P(return_value), ZEND_STRL("atime"), &stat_atime);
+		zend_hash_str_update(Z_ARRVAL_P(return_value), ZEND_STRL("mtime"), &stat_mtime);
+		zend_hash_str_update(Z_ARRVAL_P(return_value), ZEND_STRL("ctime"), &stat_ctime);
+		zend_hash_str_update(Z_ARRVAL_P(return_value), ZEND_STRL("blksize"), &stat_blksize);
+		zend_hash_str_update(Z_ARRVAL_P(return_value), ZEND_STRL("blocks"), &stat_blocks);
 
 		return;
 	}
@@ -481,11 +467,8 @@ static void phar_file_stat(const char *filename, size_t filename_length, int typ
 	}
 
 	if (!IS_ABSOLUTE_PATH(filename, filename_length) && !strstr(filename, "://")) {
-		char *arch, *entry;
-		size_t arch_len, entry_len;
 		zend_string *fname;
 		zend_stat_t sb = {0};
-		phar_entry_info *data = NULL;
 		phar_archive_data *phar;
 
 		fname = zend_get_executed_filename_ex();
@@ -496,40 +479,38 @@ static void phar_file_stat(const char *filename, size_t filename_length, int typ
 			goto skip_phar;
 		}
 
-		if (PHAR_G(last_phar) && ZSTR_LEN(fname) - 7 >= PHAR_G(last_phar_name_len) && !memcmp(ZSTR_VAL(fname) + 7, PHAR_G(last_phar_name), PHAR_G(last_phar_name_len))) {
-			arch = estrndup(PHAR_G(last_phar_name), PHAR_G(last_phar_name_len));
-			arch_len = PHAR_G(last_phar_name_len);
-			entry = estrndup(filename, filename_length);
+		if (PHAR_G(last_phar) && ZSTR_LEN(fname) - 7 >= ZSTR_LEN(PHAR_G(last_phar_name)) && !memcmp(ZSTR_VAL(fname) + 7, ZSTR_VAL(PHAR_G(last_phar_name)), ZSTR_LEN(PHAR_G(last_phar_name)))) {
 			/* fopen within phar, if :// is not in the url, then prepend phar:/// */
-			entry_len = filename_length;
 			phar = PHAR_G(last_phar);
 			goto splitted;
 		}
-		if (SUCCESS == phar_split_fname(ZSTR_VAL(fname), ZSTR_LEN(fname), &arch, &arch_len, NULL, NULL, 2, 0)) {
-			entry = estrndup(filename, filename_length);
+
+		zend_string *arch = phar_split_fname(ZSTR_VAL(fname), ZSTR_LEN(fname), NULL, 2, 0);
+		if (arch) {
 			/* fopen within phar, if :// is not in the url, then prepend phar:/// */
-			entry_len = filename_length;
-			if (FAILURE == phar_get_archive(&phar, arch, arch_len, NULL, 0, NULL)) {
-				efree(arch);
-				efree(entry);
+			phar = phar_get_archive(ZSTR_VAL(arch), ZSTR_LEN(arch), NULL, 0, NULL);
+			zend_string_release_ex(arch, false);
+			if (!phar) {
 				goto skip_phar;
 			}
-splitted:
-			entry = phar_fix_filepath(entry, &entry_len, 1);
-			if (entry[0] == '/') {
-				if (NULL != (data = zend_hash_str_find_ptr(&(phar->manifest), entry + 1, entry_len - 1))) {
-					efree(entry);
+splitted:;
+			zend_string *entry = phar_fix_filepath(filename, filename_length, true);
+			const phar_entry_info *data = NULL;
+			if (ZSTR_VAL(entry)[0] == '/') {
+				data = zend_hash_str_find_ptr(&(phar->manifest), ZSTR_VAL(entry) + 1, ZSTR_LEN(entry) - 1);
+				if (data) {
+					zend_string_release_ex(entry, false);
 					goto stat_entry;
 				}
 				goto notfound;
 			}
-			if (NULL != (data = zend_hash_str_find_ptr(&(phar->manifest), entry, entry_len))) {
-				efree(entry);
+			data = zend_hash_find_ptr(&(phar->manifest), entry);
+			if (data) {
+				zend_string_release_ex(entry, false);
 				goto stat_entry;
 			}
-			if (zend_hash_str_exists(&(phar->virtual_dirs), entry, entry_len)) {
-				efree(entry);
-				efree(arch);
+			if (zend_hash_exists(&(phar->virtual_dirs), entry)) {
+				zend_string_release_ex(entry, false);
 				if (IS_EXISTS_CHECK(type)) {
 					RETURN_TRUE;
 				}
@@ -545,31 +526,28 @@ static void phar_file_stat(const char *filename, size_t filename_length, int typ
 				size_t save_len;
 
 notfound:
-				efree(entry);
+				zend_string_release_ex(entry, false);
 				save = PHAR_G(cwd);
 				save_len = PHAR_G(cwd_len);
 				/* this file is not in the current directory, use the original path */
-				entry = estrndup(filename, filename_length);
-				entry_len = filename_length;
 				PHAR_G(cwd) = "/";
 				PHAR_G(cwd_len) = 0;
 				/* clean path without cwd */
-				entry = phar_fix_filepath(entry, &entry_len, 1);
-				if (NULL != (data = zend_hash_str_find_ptr(&(phar->manifest), entry + 1, entry_len - 1))) {
+				entry = phar_fix_filepath(filename, filename_length, true);
+				data = zend_hash_str_find_ptr(&(phar->manifest), ZSTR_VAL(entry) + 1, ZSTR_LEN(entry) - 1);
+				if (data) {
 					PHAR_G(cwd) = save;
 					PHAR_G(cwd_len) = save_len;
-					efree(entry);
+					zend_string_release_ex(entry, false);
 					if (IS_EXISTS_CHECK(type)) {
-						efree(arch);
 						RETURN_TRUE;
 					}
 					goto stat_entry;
 				}
-				if (zend_hash_str_exists(&(phar->virtual_dirs), entry + 1, entry_len - 1)) {
+				if (zend_hash_str_exists(&(phar->virtual_dirs), ZSTR_VAL(entry) + 1, ZSTR_LEN(entry) - 1)) {
 					PHAR_G(cwd) = save;
 					PHAR_G(cwd_len) = save_len;
-					efree(entry);
-					efree(arch);
+					zend_string_release_ex(entry, false);
 					if (IS_EXISTS_CHECK(type)) {
 						RETURN_TRUE;
 					}
@@ -583,8 +561,7 @@ static void phar_file_stat(const char *filename, size_t filename_length, int typ
 				}
 				PHAR_G(cwd) = save;
 				PHAR_G(cwd_len) = save_len;
-				efree(entry);
-				efree(arch);
+				zend_string_release_ex(entry, false);
 				/* Error Occurred */
 				if (!IS_EXISTS_CHECK(type)) {
 					php_error_docref(NULL, E_WARNING, "%sstat failed for %s", IS_LINK_OPERATION(type) ? "L" : "", filename);
@@ -592,11 +569,10 @@ static void phar_file_stat(const char *filename, size_t filename_length, int typ
 				RETURN_FALSE;
 			}
 stat_entry:
-			efree(arch);
 			if (!data->is_dir) {
 				sb.st_size = data->uncompressed_filesize;
 				sb.st_mode = data->flags & PHAR_ENT_PERM_MASK;
-				if (data->link) {
+				if (data->symlink) {
 					sb.st_mode |= S_IFREG|S_IFLNK; /* regular file */
 				} else {
 					sb.st_mode |= S_IFREG; /* regular file */
@@ -609,7 +585,7 @@ static void phar_file_stat(const char *filename, size_t filename_length, int typ
 				sb.st_size = 0;
 				sb.st_mode = data->flags & PHAR_ENT_PERM_MASK;
 				sb.st_mode |= S_IFDIR; /* regular directory */
-				if (data->link) {
+				if (data->symlink) {
 					sb.st_mode |= S_IFLNK;
 				}
 				/* timestamp is just the timestamp when this was added to the phar */
@@ -737,8 +713,6 @@ PHP_FUNCTION(phar_is_file) /* {{{ */
 		goto skip_phar;
 	}
 	if (!IS_ABSOLUTE_PATH(filename, filename_len) && !strstr(filename, "://")) {
-		char *arch, *entry;
-		size_t arch_len, entry_len;
 		zend_string *fname = zend_get_executed_filename_ex();
 
 		/* we are checking for existence of a file within the relative path.  Chances are good that this is
@@ -747,35 +721,29 @@ PHP_FUNCTION(phar_is_file) /* {{{ */
 			goto skip_phar;
 		}
 
-		if (SUCCESS == phar_split_fname(ZSTR_VAL(fname), ZSTR_LEN(fname), &arch, &arch_len, NULL, NULL, 2, 0)) {
-			phar_archive_data *phar;
+		zend_string *arch = phar_split_fname(ZSTR_VAL(fname), ZSTR_LEN(fname), NULL, 2, 0);
+		if (arch) {
+			;
 
-			entry = filename;
 			/* fopen within phar, if :// is not in the url, then prepend phar:/// */
-			entry_len = filename_len;
 			/* retrieving a file within the current directory, so use this if possible */
-			if (SUCCESS == phar_get_archive(&phar, arch, arch_len, NULL, 0, NULL)) {
+			phar_archive_data *phar = phar_get_archive(ZSTR_VAL(arch), ZSTR_LEN(arch), NULL, 0, NULL);
+			zend_string_release_ex(arch, false);
+			if (phar) {
 				phar_entry_info *etemp;
 
-				entry = phar_fix_filepath(estrndup(entry, entry_len), &entry_len, 1);
-				if (entry[0] == '/') {
-					if (NULL != (etemp = zend_hash_str_find_ptr(&(phar->manifest), entry + 1, entry_len - 1))) {
-						/* this file is not in the current directory, use the original path */
-found_it:
-						efree(entry);
-						efree(arch);
-						RETURN_BOOL(!etemp->is_dir);
-					}
+				zend_string *entry = phar_fix_filepath(filename, filename_len, true);
+				if (ZSTR_VAL(entry)[0] == '/') {
+					etemp = zend_hash_str_find_ptr(&(phar->manifest), ZSTR_VAL(entry) + 1, ZSTR_LEN(entry) - 1);
 				} else {
-					if (NULL != (etemp = zend_hash_str_find_ptr(&(phar->manifest), entry, entry_len))) {
-						goto found_it;
-					}
+					etemp = zend_hash_find_ptr(&(phar->manifest), entry);
 				}
+				zend_string_release_ex(entry, false);
+				if (etemp) {
+					RETURN_BOOL(!etemp->is_dir);
+				}
+				/* this file is not in the current directory, use the original path */
 			}
-			if (entry != filename) {
-				efree(entry);
-			}
-			efree(arch);
 			RETURN_FALSE;
 		}
 	}
@@ -802,8 +770,6 @@ PHP_FUNCTION(phar_is_link) /* {{{ */
 		goto skip_phar;
 	}
 	if (!IS_ABSOLUTE_PATH(filename, filename_len) && !strstr(filename, "://")) {
-		char *arch, *entry;
-		size_t arch_len, entry_len;
 		zend_string *fname = zend_get_executed_filename_ex();
 
 		/* we are checking for existence of a file within the relative path.  Chances are good that this is
@@ -812,33 +778,26 @@ PHP_FUNCTION(phar_is_link) /* {{{ */
 			goto skip_phar;
 		}
 
-		if (SUCCESS == phar_split_fname(ZSTR_VAL(fname), ZSTR_LEN(fname), &arch, &arch_len, NULL, NULL, 2, 0)) {
-			phar_archive_data *phar;
-
-			entry = filename;
+		zend_string *arch = phar_split_fname(ZSTR_VAL(fname), ZSTR_LEN(fname), NULL, 2, 0);
+		if (arch) {
 			/* fopen within phar, if :// is not in the url, then prepend phar:/// */
-			entry_len = filename_len;
 			/* retrieving a file within the current directory, so use this if possible */
-			if (SUCCESS == phar_get_archive(&phar, arch, arch_len, NULL, 0, NULL)) {
+			phar_archive_data *phar = phar_get_archive(ZSTR_VAL(arch), ZSTR_LEN(arch), NULL, 0, NULL);
+			zend_string_release_ex(arch, false);
+			if (phar) {
 				phar_entry_info *etemp;
 
-				entry = phar_fix_filepath(estrndup(entry, entry_len), &entry_len, 1);
-				if (entry[0] == '/') {
-					if (NULL != (etemp = zend_hash_str_find_ptr(&(phar->manifest), entry + 1, entry_len - 1))) {
-						/* this file is not in the current directory, use the original path */
-found_it:
-						efree(entry);
-						efree(arch);
-						RETURN_BOOL(etemp->link);
-					}
+				zend_string *entry = phar_fix_filepath(filename, filename_len, true);
+				if (ZSTR_VAL(entry)[0] == '/') {
+					etemp = zend_hash_str_find_ptr(&(phar->manifest), ZSTR_VAL(entry) + 1, ZSTR_LEN(entry) - 1);
 				} else {
-					if (NULL != (etemp = zend_hash_str_find_ptr(&(phar->manifest), entry, entry_len))) {
-						goto found_it;
-					}
+					etemp = zend_hash_find_ptr(&(phar->manifest), entry);
+				}
+				zend_string_release_ex(entry, false);
+				if (etemp) {
+					RETURN_BOOL(etemp->symlink);
 				}
 			}
-			efree(entry);
-			efree(arch);
 			RETURN_FALSE;
 		}
 	}
@@ -877,7 +836,8 @@ void phar_release_functions(void)
 /* {{{ void phar_intercept_functions_init(void) */
 #define PHAR_INTERCEPT(func) \
 	PHAR_G(orig_##func) = NULL; \
-	if (NULL != (orig = zend_hash_str_find_ptr(CG(function_table), #func, sizeof(#func)-1))) { \
+	orig = zend_hash_str_find_ptr(CG(function_table), #func, sizeof(#func)-1); \
+	if (orig) { \
 		PHAR_G(orig_##func) = orig->internal_function.handler; \
 		orig->internal_function.handler = PHP_FN(phar_##func); \
 	}
@@ -926,6 +886,7 @@ void phar_intercept_functions_shutdown(void)
 	PHAR_RELEASE(fopen);
 	PHAR_RELEASE(file_get_contents);
 	PHAR_RELEASE(is_file);
+	PHAR_RELEASE(is_link);
 	PHAR_RELEASE(is_dir);
 	PHAR_RELEASE(opendir);
 	PHAR_RELEASE(file_exists);
diff --git a/ext/phar/func_interceptors.h b/ext/phar/func_interceptors.h
index 06906ee79e80..af68b0410d4c 100644
--- a/ext/phar/func_interceptors.h
+++ b/ext/phar/func_interceptors.h
@@ -2,15 +2,13 @@
   +----------------------------------------------------------------------+
   | phar php single-file executable PHP extension                        |
   +----------------------------------------------------------------------+
-  | Copyright (c) The PHP Group                                          |
+  | Copyright © The PHP Group and Contributors.                          |
   +----------------------------------------------------------------------+
-  | This source file is subject to version 3.01 of the PHP license,      |
-  | that is bundled with this package in the file LICENSE, and is        |
-  | available through the world-wide-web at the following url:           |
-  | https://www.php.net/license/3_01.txt                                 |
-  | If you did not receive a copy of the PHP license and are unable to   |
-  | obtain it through the world-wide-web, please send a note to          |
-  | license@php.net so we can mail you a copy immediately.               |
+  | This source file is subject to the Modified BSD License that is      |
+  | bundled with this package in the file LICENSE, and is available      |
+  | through the World Wide Web at .        |
+  |                                                                      |
+  | SPDX-License-Identifier: BSD-3-Clause                                |
   +----------------------------------------------------------------------+
   | Authors: Gregory Beaver                              |
   |          Marcus Boerger                               |
diff --git a/ext/phar/makestub.php b/ext/phar/makestub.php
index 34d270751bfb..e5cbe89ff4bd 100755
--- a/ext/phar/makestub.php
+++ b/ext/phar/makestub.php
@@ -35,15 +35,13 @@
   +----------------------------------------------------------------------+
   | phar php single-file executable PHP extension generated stub         |
   +----------------------------------------------------------------------+
-  | Copyright (c) The PHP Group                                          |
+  | Copyright © The PHP Group and Contributors.                          |
   +----------------------------------------------------------------------+
-  | This source file is subject to version 3.01 of the PHP license,      |
-  | that is bundled with this package in the file LICENSE, and is        |
-  | available through the world-wide-web at the following url:           |
-  | https://www.php.net/license/3_01.txt                                 |
-  | If you did not receive a copy of the PHP license and are unable to   |
-  | obtain it through the world-wide-web, please send a note to          |
-  | license@php.net so we can mail you a copy immediately.               |
+  | This source file is subject to the Modified BSD License that is      |
+  | bundled with this package in the file LICENSE, and is available      |
+  | through the World Wide Web at .        |
+  |                                                                      |
+  | SPDX-License-Identifier: BSD-3-Clause                                |
   +----------------------------------------------------------------------+
   | Authors: Gregory Beaver                              |
   +----------------------------------------------------------------------+
diff --git a/ext/phar/phar.1.in b/ext/phar/phar.1.in
index db22d40abc3f..8dffd2cf2dd0 100644
--- a/ext/phar/phar.1.in
+++ b/ext/phar/phar.1.in
@@ -511,17 +511,9 @@ contributors all around the world.
 .SH VERSION INFORMATION
 This manpage describes \fBphar\fP, version @PHP_VERSION@.
 .SH COPYRIGHT
-Copyright \(co The PHP Group
+Copyright \(co The PHP Group and Contributors
 .LP
-This source file is subject to version 3.01 of the PHP license,
-that is bundled with this package in the file LICENSE, and is
-available through the world-wide-web at the following url:
-.PD 0
-.P
-.B https://www.php.net/license/3_01.txt
-.PD 1
-.P
-If you did not receive a copy of the PHP license and are unable to
-obtain it through the world-wide-web, please send a note to
-.B license@php.net
-so we can mail you a copy immediately.
+This source file is subject to the Modified BSD License that is
+bundled with this package in the file LICENSE, and is available
+through the World Wide Web at
+.B https://www.php.net/license/
diff --git a/ext/phar/phar.c b/ext/phar/phar.c
index 619017038637..ee12c5b91feb 100644
--- a/ext/phar/phar.c
+++ b/ext/phar/phar.c
@@ -2,15 +2,13 @@
   +----------------------------------------------------------------------+
   | phar php single-file executable PHP extension                        |
   +----------------------------------------------------------------------+
-  | Copyright (c) The PHP Group                                          |
+  | Copyright © The PHP Group and Contributors.                          |
   +----------------------------------------------------------------------+
-  | This source file is subject to version 3.01 of the PHP license,      |
-  | that is bundled with this package in the file LICENSE, and is        |
-  | available through the world-wide-web at the following url:           |
-  | https://www.php.net/license/3_01.txt                                 |
-  | If you did not receive a copy of the PHP license and are unable to   |
-  | obtain it through the world-wide-web, please send a note to          |
-  | license@php.net so we can mail you a copy immediately.               |
+  | This source file is subject to the Modified BSD License that is      |
+  | bundled with this package in the file LICENSE, and is available      |
+  | through the World Wide Web at .        |
+  |                                                                      |
+  | SPDX-License-Identifier: BSD-3-Clause                                |
   +----------------------------------------------------------------------+
   | Authors: Gregory Beaver                              |
   |          Marcus Boerger                               |
@@ -93,7 +91,7 @@ HashTable cached_alias;
 static void phar_split_cache_list(void) /* {{{ */
 {
 	char *tmp;
-	char *key, *lasts, *end;
+	char *key, *lasts;
 	char ds[2];
 	phar_archive_data *phar;
 	uint32_t i = 0;
@@ -126,14 +124,14 @@ static void phar_split_cache_list(void) /* {{{ */
 			key;
 			key = php_strtok_r(NULL, ds, &lasts)) {
 		size_t len;
-		end = strchr(key, DEFAULT_DIR_SEPARATOR);
+		const char *end = strchr(key, DEFAULT_DIR_SEPARATOR);
 		if (end) {
 			len = end - key;
 		} else {
 			len = strlen(key);
 		}
 
-		if (SUCCESS == phar_open_from_filename(key, len, NULL, 0, 0, &phar, NULL)) {
+		if (SUCCESS == phar_open_from_filename(key, len, NULL, 0, &phar, NULL)) {
 			phar->phar_pos = i++;
 			php_stream_close(phar->fp);
 			phar->fp = NULL;
@@ -194,13 +192,13 @@ PHP_INI_END()
  */
 void phar_destroy_phar_data(phar_archive_data *phar) /* {{{ */
 {
-	if (phar->alias && phar->alias != phar->fname) {
+	if (phar->alias) {
 		pefree(phar->alias, phar->is_persistent);
 		phar->alias = NULL;
 	}
 
 	if (phar->fname) {
-		pefree(phar->fname, phar->is_persistent);
+		zend_string_release_ex(phar->fname, phar->is_persistent);
 		phar->fname = NULL;
 	}
 
@@ -251,14 +249,15 @@ bool phar_archive_delref(phar_archive_data *phar) /* {{{ */
 
 	if (--phar->refcount < 0) {
 		if (PHAR_G(request_done)
-		|| zend_hash_str_del(&(PHAR_G(phar_fname_map)), phar->fname, phar->fname_len) != SUCCESS) {
+		|| zend_hash_del(&(PHAR_G(phar_fname_map)), phar->fname) != SUCCESS) {
 			phar_destroy_phar_data(phar);
 		}
 		return true;
 	} else if (!phar->refcount) {
 		/* invalidate phar cache */
 		PHAR_G(last_phar) = NULL;
-		PHAR_G(last_phar_name) = PHAR_G(last_alias) = NULL;
+		PHAR_G(last_alias) = NULL;
+		PHAR_G(last_phar_name) = NULL;
 
 		/* This is a new phar that has perhaps had an alias/metadata set, but has never been flushed. */
 		bool remove_fname_cache = !zend_hash_num_elements(&phar->manifest);
@@ -280,7 +279,7 @@ bool phar_archive_delref(phar_archive_data *phar) /* {{{ */
 		}
 
 		if (remove_fname_cache) {
-			if (zend_hash_str_del(&(PHAR_G(phar_fname_map)), phar->fname, phar->fname_len) != SUCCESS) {
+			if (zend_hash_del(&(PHAR_G(phar_fname_map)), phar->fname) != SUCCESS) {
 				phar_destroy_phar_data(phar);
 			}
 			return true;
@@ -375,9 +374,9 @@ void destroy_phar_manifest_entry_int(phar_entry_info *entry) /* {{{ */
 
 	zend_string_release_ex(entry->filename, entry->is_persistent);
 
-	if (entry->link) {
-		pefree(entry->link, entry->is_persistent);
-		entry->link = 0;
+	if (entry->symlink) {
+		zend_string_release_ex(entry->symlink, entry->is_persistent);
+		entry->symlink = NULL;
 	}
 
 	if (entry->tmp) {
@@ -485,9 +484,15 @@ ZEND_ATTRIBUTE_NONNULL void phar_entry_remove(phar_entry_data *idata, char **err
 /**
  * Open an already loaded phar
  */
-static zend_result phar_open_parsed_phar(char *fname, size_t fname_len, char *alias, size_t alias_len, bool is_data, uint32_t options, phar_archive_data** pphar, char **error) /* {{{ */
-{
-	phar_archive_data *phar;
+static zend_result phar_open_parsed_phar(
+	char *fname,
+	size_t fname_len,
+	/* copyable & hash update */ zend_string *alias,
+	bool is_data,
+	uint32_t options,
+	phar_archive_data** pphar,
+	char **error
+) {
 #ifdef PHP_WIN32
 	char *save_fname;
 	ALLOCA_FLAG(fname_use_heap)
@@ -505,16 +510,22 @@ static zend_result phar_open_parsed_phar(char *fname, size_t fname_len, char *al
 		phar_unixify_path_separators(fname, fname_len);
 	}
 #endif
-	if (SUCCESS == phar_get_archive(&phar, fname, fname_len, alias, alias_len, error)
-		&& ((alias && fname_len == phar->fname_len
-		&& !strncmp(fname, phar->fname, fname_len)) || !alias)
-	) {
+	const char *alias_cstr = alias ? ZSTR_VAL(alias) : NULL;
+	size_t alias_len = alias ? ZSTR_LEN(alias) : 0;
+	phar_archive_data *phar = phar_get_archive(fname, fname_len, alias_cstr, alias_len, error);
+	/* logic is as follows:
+	   - If no alias was passed in, then it can match either and be valid
+	   - If an explicit alias was requested, ensure the filename passed in matches the phar's filename.
+	 */
+	bool process_phar = phar && (!alias || zend_string_equals_cstr(phar->fname, fname, fname_len));
 #ifdef PHP_WIN32
-		if (fname != save_fname) {
-			free_alloca(fname, fname_use_heap);
-			fname = save_fname;
-		}
+	if (fname != save_fname) {
+		free_alloca(fname, fname_use_heap);
+		fname = save_fname;
+	}
 #endif
+
+	if (process_phar) {
 		/* logic above is as follows:
 		   If an explicit alias was requested, ensure the filename passed in
 		   matches the phar's filename.
@@ -539,12 +550,6 @@ static zend_result phar_open_parsed_phar(char *fname, size_t fname_len, char *al
 
 		return SUCCESS;
 	} else {
-#ifdef PHP_WIN32
-		if (fname != save_fname) {
-			free_alloca(fname, fname_use_heap);
-			fname = save_fname;
-		}
-#endif
 		if (pphar) {
 			*pphar = NULL;
 		}
@@ -556,7 +561,6 @@ static zend_result phar_open_parsed_phar(char *fname, size_t fname_len, char *al
 		return FAILURE;
 	}
 }
-/* }}}*/
 
 /**
  * Attempt to serialize the data.
@@ -724,7 +728,7 @@ void phar_parse_metadata_lazy(const char *buffer, phar_metadata_tracker *tracker
  * This is used by phar_open_from_filename to process the manifest, but can be called
  * directly.
  */
-static zend_result phar_parse_pharfile(php_stream *fp, char *fname, size_t fname_len, char *alias, size_t alias_len, zend_long halt_offset, phar_archive_data** pphar, uint32_t compression, char **error) /* {{{ */
+static zend_result phar_parse_pharfile(php_stream *fp, const char *fname, size_t fname_len, const char *alias, size_t alias_len, zend_long halt_offset, phar_archive_data** pphar, uint32_t compression, char **error) /* {{{ */
 {
 	char b32[4], *buffer, *endbuffer, *savebuf;
 	phar_archive_data *mydata = NULL;
@@ -1112,11 +1116,13 @@ static zend_result phar_parse_pharfile(php_stream *fp, char *fname, size_t fname
 		zend_get_hash_value, NULL, mydata->is_persistent);
 	zend_hash_init(&mydata->virtual_dirs, manifest_count * 2,
 		zend_get_hash_value, NULL, mydata->is_persistent);
-	mydata->fname = pestrndup(fname, fname_len, mydata->is_persistent);
+	mydata->fname = zend_string_init(fname, fname_len, mydata->is_persistent);
+	if (mydata->is_persistent) {
+		GC_MAKE_PERSISTENT_LOCAL(mydata->fname);
+	}
 #ifdef PHP_WIN32
-	phar_unixify_path_separators(mydata->fname, fname_len);
+	phar_unixify_path_separators(ZSTR_VAL(mydata->fname), ZSTR_LEN(mydata->fname));
 #endif
-	mydata->fname_len = fname_len;
 	offset = halt_offset + manifest_len + 4;
 	memset(&entry, 0, sizeof(phar_entry_info));
 	entry.phar = mydata;
@@ -1231,22 +1237,22 @@ static zend_result phar_parse_pharfile(php_stream *fp, char *fname, size_t fname
 	snprintf(mydata->version, sizeof(mydata->version), "%u.%u.%u", manifest_ver >> 12, (manifest_ver >> 8) & 0xF, (manifest_ver >> 4) & 0xF);
 	mydata->halt_offset = halt_offset;
 	mydata->flags = manifest_flags;
-	endbuffer = strrchr(mydata->fname, '/');
+	endbuffer = strrchr(ZSTR_VAL(mydata->fname), '/');
 
 	if (endbuffer) {
-		mydata->ext = memchr(endbuffer, '.', (mydata->fname + fname_len) - endbuffer);
+		mydata->ext = memchr(endbuffer, '.', (ZSTR_VAL(mydata->fname) + ZSTR_LEN(mydata->fname)) - endbuffer);
 		if (mydata->ext == endbuffer) {
-			mydata->ext = memchr(endbuffer + 1, '.', (mydata->fname + fname_len) - endbuffer - 1);
+			mydata->ext = memchr(endbuffer + 1, '.', (ZSTR_VAL(mydata->fname) + ZSTR_LEN(mydata->fname)) - endbuffer - 1);
 		}
 		if (mydata->ext) {
-			mydata->ext_len = (mydata->fname + mydata->fname_len) - mydata->ext;
+			mydata->ext_len = (ZSTR_VAL(mydata->fname) + ZSTR_LEN(mydata->fname)) - mydata->ext;
 		}
 	}
 
 	mydata->alias = alias ?
 		pestrndup(alias, alias_len, mydata->is_persistent) :
-		pestrndup(mydata->fname, fname_len, mydata->is_persistent);
-	mydata->alias_len = alias ? alias_len : fname_len;
+		pestrndup(ZSTR_VAL(mydata->fname), ZSTR_LEN(mydata->fname), mydata->is_persistent);
+	mydata->alias_len = alias ? alias_len : ZSTR_LEN(mydata->fname);
 	mydata->sig_flags = sig_flags;
 	mydata->fp = fp;
 	mydata->sig_len = sig_len;
@@ -1264,8 +1270,9 @@ static zend_result phar_parse_pharfile(php_stream *fp, char *fname, size_t fname
 			MAPPHAR_FAIL("Cannot open archive \"%s\", invalid alias");
 		}
 
-		if (NULL != (fd_ptr = zend_hash_str_find_ptr(&(PHAR_G(phar_alias_map)), alias, alias_len))) {
-			if (SUCCESS != phar_free_alias(fd_ptr, alias, alias_len)) {
+		fd_ptr = zend_hash_str_find_ptr(&(PHAR_G(phar_alias_map)), alias, alias_len);
+		if (fd_ptr) {
+			if (SUCCESS != phar_free_alias(fd_ptr)) {
 				signature = NULL;
 				fp = NULL;
 				MAPPHAR_FAIL("Cannot open archive \"%s\", alias is already in use by existing archive");
@@ -1284,12 +1291,12 @@ static zend_result phar_parse_pharfile(php_stream *fp, char *fname, size_t fname
 	}
 
 	if (mydata->is_persistent) {
-		str = zend_string_init_interned(mydata->fname, fname_len, 1);
+		str = zend_string_init_interned(ZSTR_VAL(mydata->fname), ZSTR_LEN(mydata->fname), true);
+		zend_hash_add_ptr(&(PHAR_G(phar_fname_map)), str, mydata);
+		zend_string_release(str);
 	} else {
-		str = zend_string_init(mydata->fname, fname_len, 0);
+		zend_hash_add_ptr(&(PHAR_G(phar_fname_map)), mydata->fname, mydata);
 	}
-	zend_hash_add_ptr(&(PHAR_G(phar_fname_map)), str, mydata);
-	zend_string_release(str);
 	efree(savebuf);
 
 	if (pphar) {
@@ -1303,8 +1310,14 @@ static zend_result phar_parse_pharfile(php_stream *fp, char *fname, size_t fname
 /**
  * Create or open a phar for writing
  */
-ZEND_ATTRIBUTE_NONNULL_ARGS(1, 7, 8) zend_result phar_open_or_create_filename(char *fname, size_t fname_len, char *alias, size_t alias_len, bool is_data, uint32_t options, phar_archive_data** pphar, char **error) /* {{{ */
-{
+ZEND_ATTRIBUTE_NONNULL_ARGS(1, 5, 6) zend_result phar_open_or_create_filename(
+	zend_string *fname,
+	/* copyable & hash update */ zend_string *alias,
+	bool is_data,
+	uint32_t options,
+	phar_archive_data** pphar,
+	char **error
+) {
 	const char *ext_str, *z;
 	char *my_error;
 	size_t ext_len;
@@ -1315,31 +1328,31 @@ ZEND_ATTRIBUTE_NONNULL_ARGS(1, 7, 8) zend_result phar_open_or_create_filename(ch
 	*error = NULL;
 
 	/* first try to open an existing file */
-	if (phar_detect_phar_fname_ext(fname, fname_len, &ext_str, &ext_len, !is_data, 0, true) == SUCCESS) {
+	if (phar_detect_phar_fname_ext(ZSTR_VAL(fname), ZSTR_LEN(fname), &ext_str, &ext_len, !is_data, 0, true) == SUCCESS) {
 		goto check_file;
 	}
 
 	/* next try to create a new file */
-	if (FAILURE == phar_detect_phar_fname_ext(fname, fname_len, &ext_str, &ext_len, !is_data, 1, true)) {
+	if (FAILURE == phar_detect_phar_fname_ext(ZSTR_VAL(fname), ZSTR_LEN(fname), &ext_str, &ext_len, !is_data, 1, true)) {
 		if (ext_len == -2) {
-			spprintf(error, 0, "Cannot create a phar archive from a URL like \"%s\". Phar objects can only be created from local files", fname);
+			spprintf(error, 0, "Cannot create a phar archive from a URL like \"%s\". Phar objects can only be created from local files", ZSTR_VAL(fname));
 		} else {
-			spprintf(error, 0, "Cannot create phar '%s', file extension (or combination) not recognised or the directory does not exist", fname);
+			spprintf(error, 0, "Cannot create phar '%s', file extension (or combination) not recognised or the directory does not exist", ZSTR_VAL(fname));
 		}
 		return FAILURE;
 	}
 check_file:
-	if (phar_open_parsed_phar(fname, fname_len, alias, alias_len, is_data, options, test, &my_error) == SUCCESS) {
+	if (phar_open_parsed_phar(ZSTR_VAL(fname), ZSTR_LEN(fname), alias, is_data, options, test, &my_error) == SUCCESS) {
 		*pphar = *test;
 
 		if ((*test)->is_data && !(*test)->is_tar && !(*test)->is_zip) {
-			spprintf(error, 0, "Cannot open '%s' as a PharData object. Use Phar::__construct() for executable archives", fname);
+			spprintf(error, 0, "Cannot open '%s' as a PharData object. Use Phar::__construct() for executable archives", ZSTR_VAL(fname));
 			return FAILURE;
 		}
 
 		if (PHAR_G(readonly) && !(*test)->is_data && ((*test)->is_tar || (*test)->is_zip)) {
 			if (!zend_hash_str_exists(&((*test)->manifest), ZEND_STRL(".phar/stub.php"))) {
-				spprintf(error, 0, "'%s' is not a phar archive. Use PharData::__construct() for a standard zip or tar archive", fname);
+				spprintf(error, 0, "'%s' is not a phar archive. Use PharData::__construct() for a standard zip or tar archive", ZSTR_VAL(fname));
 				return FAILURE;
 			}
 		}
@@ -1355,40 +1368,45 @@ ZEND_ATTRIBUTE_NONNULL_ARGS(1, 7, 8) zend_result phar_open_or_create_filename(ch
 
 	if (ext_len > 3 && (z = memchr(ext_str, 'z', ext_len)) && ((ext_str + ext_len) - z >= 2) && !memcmp(z + 1, "ip", 2)) {
 		/* assume zip-based phar */
-		return phar_open_or_create_zip(fname, fname_len, alias, alias_len, is_data, options, pphar, error);
+		return phar_open_or_create_zip(fname, alias, is_data, options, pphar, error);
 	}
 
 	if (ext_len > 3 && (z = memchr(ext_str, 't', ext_len)) && ((ext_str + ext_len) - z >= 2) && !memcmp(z + 1, "ar", 2)) {
 		/* assume tar-based phar */
-		return phar_open_or_create_tar(fname, fname_len, alias, alias_len, is_data, options, pphar, error);
+		return phar_open_or_create_tar(fname, alias, is_data, options, pphar, error);
 	}
 
-	return phar_create_or_parse_filename(fname, fname_len, alias, alias_len, is_data, options, pphar, error);
+	return phar_create_or_parse_filename(fname, alias, is_data, options, pphar, error);
 }
-/* }}} */
 
-static zend_result phar_open_from_fp(php_stream* fp, char *fname, size_t fname_len, char *alias, size_t alias_len, uint32_t options, phar_archive_data** pphar, char **error);
+static zend_result phar_open_from_fp(php_stream* fp, const char *fname, size_t fname_len, /* copyable & hash update */ zend_string *alias, uint32_t options, phar_archive_data** pphar, char **error);
 
-ZEND_ATTRIBUTE_NONNULL_ARGS(1, 7, 8) zend_result phar_create_or_parse_filename(char *fname, size_t fname_len, char *alias, size_t alias_len, bool is_data, uint32_t options, phar_archive_data** pphar, char **error) /* {{{ */
-{
+ZEND_ATTRIBUTE_NONNULL_ARGS(1, 5, 6) zend_result phar_create_or_parse_filename(
+	zend_string *fname,
+	/* copyable & hash update */ zend_string *alias,
+	bool is_data,
+	uint32_t options,
+	phar_archive_data** pphar,
+	char **error
+) {
 	php_stream *fp;
 	zend_string *actual = NULL;
+	zend_string *save_fname = fname;
 	char *p;
 
-	if (php_check_open_basedir(fname)) {
+	if (php_check_open_basedir(ZSTR_VAL(fname))) {
 		return FAILURE;
 	}
 
 	/* first open readonly so it won't be created if not present */
-	fp = php_stream_open_wrapper(fname, "rb", IGNORE_URL|STREAM_MUST_SEEK|0, &actual);
+	fp = php_stream_open_wrapper(ZSTR_VAL(fname), "rb", IGNORE_URL|STREAM_MUST_SEEK|0, &actual);
 
 	if (actual) {
-		fname = ZSTR_VAL(actual);
-		fname_len = ZSTR_LEN(actual);
+		fname = actual;
 	}
 
 	if (fp) {
-		if (phar_open_from_fp(fp, fname, fname_len, alias, alias_len, options, pphar, error) == SUCCESS) {
+		if (phar_open_from_fp(fp, ZSTR_VAL(fname), ZSTR_LEN(fname), alias, options, pphar, error) == SUCCESS) {
 			if ((*pphar)->is_data || !PHAR_G(readonly)) {
 				(*pphar)->is_writeable = 1;
 			}
@@ -1407,35 +1425,37 @@ ZEND_ATTRIBUTE_NONNULL_ARGS(1, 7, 8) zend_result phar_create_or_parse_filename(c
 
 	if (actual) {
 		zend_string_release_ex(actual, 0);
+		fname = save_fname;
 	}
 
 	if (PHAR_G(readonly) && !is_data) {
 		if (options & REPORT_ERRORS) {
-			spprintf(error, 0, "creating archive \"%s\" disabled by the php.ini setting phar.readonly", fname);
+			spprintf(error, 0, "creating archive \"%s\" disabled by the php.ini setting phar.readonly", ZSTR_VAL(fname));
 		}
 		return FAILURE;
 	}
 
 	/* set up our manifest */
 	phar_archive_data *mydata = ecalloc(1, sizeof(phar_archive_data));
-	mydata->fname = expand_filepath(fname, NULL);
-	if (mydata->fname == NULL) {
+	/* TODO: prevent reallocation via a new expand_filepath() API? */
+	char *new_fname = expand_filepath(ZSTR_VAL(fname), NULL);
+	if (new_fname == NULL) {
 		efree(mydata);
 		return FAILURE;
 	}
-	fname_len = strlen(mydata->fname);
+	size_t new_fname_len = strlen(new_fname);
 #ifdef PHP_WIN32
-	phar_unixify_path_separators(mydata->fname, fname_len);
+	phar_unixify_path_separators(new_fname, new_fname_len);
 #endif
-	p = strrchr(mydata->fname, '/');
+	p = strrchr(new_fname, '/');
 
 	if (p) {
-		mydata->ext = memchr(p, '.', (mydata->fname + fname_len) - p);
+		mydata->ext = memchr(p, '.', (new_fname + new_fname_len) - p);
 		if (mydata->ext == p) {
-			mydata->ext = memchr(p + 1, '.', (mydata->fname + fname_len) - p - 1);
+			mydata->ext = memchr(p + 1, '.', (new_fname + new_fname_len) - p - 1);
 		}
 		if (mydata->ext) {
-			mydata->ext_len = (mydata->fname + fname_len) - mydata->ext;
+			mydata->ext_len = (new_fname + new_fname_len) - mydata->ext;
 		}
 	}
 
@@ -1445,29 +1465,28 @@ ZEND_ATTRIBUTE_NONNULL_ARGS(1, 7, 8) zend_result phar_create_or_parse_filename(c
 		zend_get_hash_value, NULL, 0);
 	zend_hash_init(&mydata->virtual_dirs, sizeof(char *),
 		zend_get_hash_value, NULL, mydata->is_persistent);
-	mydata->fname_len = fname_len;
+	mydata->fname = zend_string_init(new_fname, new_fname_len, false);
+	efree(new_fname);
 	snprintf(mydata->version, sizeof(mydata->version), "%s", PHP_PHAR_API_VERSION);
 	mydata->is_temporary_alias = alias ? 0 : 1;
 	mydata->fp = NULL;
 	mydata->is_writeable = 1;
 	mydata->is_brandnew = 1;
 	phar_request_initialize();
-	zend_hash_str_add_ptr(&(PHAR_G(phar_fname_map)), mydata->fname, fname_len, mydata);
+	zend_hash_add_ptr(&(PHAR_G(phar_fname_map)), mydata->fname, mydata);
 
 	if (is_data) {
 		alias = NULL;
-		alias_len = 0;
 		mydata->is_data = 1;
 		/* assume tar format, PharData can specify other */
 		mydata->is_tar = 1;
 	} else {
-		phar_archive_data *fd_ptr;
-
-		if (alias && NULL != (fd_ptr = zend_hash_str_find_ptr(&(PHAR_G(phar_alias_map)), alias, alias_len))) {
-			if (SUCCESS != phar_free_alias(fd_ptr, alias, alias_len)) {
-				spprintf(error, 4096, "phar error: phar \"%s\" cannot set alias \"%s\", already in use by another phar archive", mydata->fname, alias);
+		if (alias) {
+			const phar_archive_data *fd_ptr = zend_hash_find_ptr(&(PHAR_G(phar_alias_map)), alias);
+			if (fd_ptr && SUCCESS != phar_free_alias(fd_ptr)) {
+				spprintf(error, 4096, "phar error: phar \"%s\" cannot set alias \"%s\", already in use by another phar archive", ZSTR_VAL(mydata->fname), ZSTR_VAL(alias));
 
-				zend_hash_str_del(&(PHAR_G(phar_fname_map)), mydata->fname, fname_len);
+				zend_hash_del(&(PHAR_G(phar_fname_map)), mydata->fname);
 
 				*pphar = NULL;
 
@@ -1476,17 +1495,17 @@ ZEND_ATTRIBUTE_NONNULL_ARGS(1, 7, 8) zend_result phar_create_or_parse_filename(c
 		}
 
 		ZEND_ASSERT(!mydata->is_persistent);
-		mydata->alias = alias ? estrndup(alias, alias_len) : estrndup(mydata->fname, fname_len);
-		mydata->alias_len = alias ? alias_len : fname_len;
+		mydata->alias = alias ? estrndup(ZSTR_VAL(alias), ZSTR_LEN(alias)) : estrndup(ZSTR_VAL(mydata->fname), ZSTR_LEN(mydata->fname));
+		mydata->alias_len = alias ? ZSTR_LEN(alias) : ZSTR_LEN(mydata->fname);
 	}
 
-	if (alias_len && alias) {
-		if (NULL == zend_hash_str_add_ptr(&(PHAR_G(phar_alias_map)), alias, alias_len, mydata)) {
+	if (alias) {
+		if (NULL == zend_hash_add_ptr(&(PHAR_G(phar_alias_map)), alias, mydata)) {
 			if (options & REPORT_ERRORS) {
-				spprintf(error, 0, "archive \"%s\" cannot be associated with alias \"%s\", already in use", fname, alias);
+				spprintf(error, 0, "archive \"%s\" cannot be associated with alias \"%s\", already in use", ZSTR_VAL(fname), ZSTR_VAL(alias));
 			}
 
-			zend_hash_str_del(&(PHAR_G(phar_fname_map)), mydata->fname, fname_len);
+			zend_hash_del(&(PHAR_G(phar_fname_map)), mydata->fname);
 
 			*pphar = NULL;
 
@@ -1497,7 +1516,6 @@ ZEND_ATTRIBUTE_NONNULL_ARGS(1, 7, 8) zend_result phar_create_or_parse_filename(c
 	*pphar = mydata;
 	return SUCCESS;
 }
-/* }}}*/
 
 /**
  * Return an already opened filename.
@@ -1506,8 +1524,14 @@ ZEND_ATTRIBUTE_NONNULL_ARGS(1, 7, 8) zend_result phar_create_or_parse_filename(c
  * that the manifest is proper, then pass it to phar_parse_pharfile().  SUCCESS
  * or FAILURE is returned and pphar is set to a pointer to the phar's manifest
  */
-zend_result phar_open_from_filename(char *fname, size_t fname_len, char *alias, size_t alias_len, uint32_t options, phar_archive_data** pphar, char **error) /* {{{ */
-{
+zend_result phar_open_from_filename(
+	char *fname,
+	size_t fname_len,
+	/* copyable & hash update */ zend_string *alias,
+	uint32_t options,
+	phar_archive_data** pphar,
+	char **error
+) {
 	php_stream *fp;
 	zend_string *actual;
 	bool is_data = false;
@@ -1520,7 +1544,7 @@ zend_result phar_open_from_filename(char *fname, size_t fname_len, char *alias,
 		is_data = true;
 	}
 
-	if (phar_open_parsed_phar(fname, fname_len, alias, alias_len, is_data, options, pphar, error) == SUCCESS) {
+	if (phar_open_parsed_phar(fname, fname_len, alias, is_data, options, pphar, error) == SUCCESS) {
 		return SUCCESS;
 	} else if (error && *error) {
 		return FAILURE;
@@ -1548,7 +1572,7 @@ zend_result phar_open_from_filename(char *fname, size_t fname_len, char *alias,
 		fname_len = ZSTR_LEN(actual);
 	}
 
-	zend_result ret = phar_open_from_fp(fp, fname, fname_len, alias, alias_len, options, pphar, error);
+	zend_result ret = phar_open_from_fp(fp, fname, fname_len, alias, options, pphar, error);
 
 	if (actual) {
 		zend_string_release_ex(actual, 0);
@@ -1556,15 +1580,21 @@ zend_result phar_open_from_filename(char *fname, size_t fname_len, char *alias,
 
 	return ret;
 }
-/* }}}*/
 
 /**
  * Scan an open fp for the required __HALT_COMPILER(); ?> token and verify
  * that the manifest is proper, then pass it to phar_parse_pharfile().  SUCCESS
  * or FAILURE is returned and pphar is set to a pointer to the phar's manifest
  */
-static zend_result phar_open_from_fp(php_stream* fp, char *fname, size_t fname_len, char *alias, size_t alias_len, uint32_t options, phar_archive_data** pphar, char **error) /* {{{ */
-{
+static zend_result phar_open_from_fp(
+	php_stream* fp,
+	const char *fname,
+	size_t fname_len,
+	/* copyable & hash update */ zend_string *alias,
+	uint32_t options,
+	phar_archive_data** pphar,
+	char **error
+) {
 	static const char token[] = "__HALT_COMPILER();";
 	static const char zip_magic[] = "PK\x03\x04";
 	static const char gz_magic[] = "\x1f\x8b\x08";
@@ -1670,14 +1700,14 @@ static zend_result phar_open_from_fp(php_stream* fp, char *fname, size_t fname_l
 				continue;
 			} else if (!memcmp(pos, bz_magic, 3)) {
 				php_stream_filter *filter;
-				php_stream *temp;
 
 				if (!PHAR_G(has_bz2)) {
 					MAPPHAR_ALLOC_FAIL("unable to decompress bzipped phar archive \"%s\" to temporary file, enable bz2 extension in php.ini")
 				}
 
 				/* entire file is bzip-compressed, uncompress to temporary file */
-				if (!(temp = php_stream_fopen_tmpfile())) {
+				php_stream *temp = php_stream_fopen_tmpfile();
+				if (!temp) {
 					MAPPHAR_ALLOC_FAIL("unable to create temporary file for decompression of bzipped phar archive \"%s\"")
 				}
 
@@ -1715,20 +1745,22 @@ static zend_result phar_open_from_fp(php_stream* fp, char *fname, size_t fname_l
 
 			if (!memcmp(pos, zip_magic, 4)) {
 				php_stream_seek(fp, 0, SEEK_END);
-				return phar_parse_zipfile(fp, fname, fname_len, alias, alias_len, pphar, error);
+				return phar_parse_zipfile(fp, fname, fname_len, alias, pphar, error);
 			}
 
 			if (got >= 512) {
 				if (phar_is_tar(pos, fname)) {
 					php_stream_rewind(fp);
-					return phar_parse_tarfile(fp, fname, fname_len, alias, alias_len, pphar, compression, error);
+					return phar_parse_tarfile(fp, fname, fname_len, alias, pphar, compression, error);
 				}
 			}
 		}
 
 		if (got > 0 && (pos = php_memnistr(buffer, token, tokenlen, buffer + got + sizeof(token))) != NULL) {
 			halt_offset += (pos - buffer); /* no -tokenlen+tokenlen here */
-			return phar_parse_pharfile(fp, fname, fname_len, alias, alias_len, halt_offset, pphar, compression, error);
+			const char *alias_cstr = alias ? ZSTR_VAL(alias) : NULL;
+			size_t alias_len = alias ? ZSTR_LEN(alias) : 0;
+			return phar_parse_pharfile(fp, fname, fname_len, alias_cstr, alias_len, halt_offset, pphar, compression, error);
 		}
 
 		halt_offset += got;
@@ -1737,7 +1769,6 @@ static zend_result phar_open_from_fp(php_stream* fp, char *fname, size_t fname_l
 
 	MAPPHAR_ALLOC_FAIL("internal corruption of phar \"%s\" (__HALT_COMPILER(); not found)")
 }
-/* }}} */
 
 /*
  * given the location of the file extension and the start of the file path,
@@ -1751,10 +1782,10 @@ static zend_result phar_open_from_fp(php_stream* fp, char *fname, size_t fname_l
 static zend_result phar_analyze_path(const char *fname, const char *ext, size_t ext_len, int for_create) /* {{{ */
 {
 	php_stream_statbuf ssb;
-	char *realpath;
 	char *filename = estrndup(fname, (ext - fname) + ext_len);
 
-	if ((realpath = expand_filepath(filename, NULL))) {
+	char *realpath = expand_filepath(filename, NULL);
+	if (realpath) {
 #ifdef PHP_WIN32
 		phar_unixify_path_separators(realpath, strlen(realpath));
 #endif
@@ -1801,7 +1832,8 @@ static zend_result phar_analyze_path(const char *fname, const char *ext, size_t
 
 		if (SUCCESS != php_stream_stat_path((char *) filename, &ssb)) {
 			if (!slash) {
-				if (!(realpath = expand_filepath(filename, NULL))) {
+				realpath = expand_filepath(filename, NULL);
+				if (!realpath) {
 					efree(filename);
 					return FAILURE;
 				}
@@ -1944,7 +1976,8 @@ zend_result phar_detect_phar_fname_ext(const char *filename, size_t filename_len
 		phar_archive_data *pphar;
 
 		if (is_complete) {
-			if (NULL != (pphar = zend_hash_str_find_ptr(&(PHAR_G(phar_fname_map)), (char *) filename, filename_len))) {
+			pphar = zend_hash_str_find_ptr(&(PHAR_G(phar_fname_map)), filename, filename_len);
+			if (pphar) {
 				*ext_str = filename + (filename_len - pphar->ext_len);
 woohoo:
 				*ext_len = pphar->ext_len;
@@ -1964,7 +1997,8 @@ zend_result phar_detect_phar_fname_ext(const char *filename, size_t filename_len
 				return FAILURE;
 			}
 
-			if (PHAR_G(manifest_cached) && NULL != (pphar = zend_hash_str_find_ptr(&cached_phars, (char *) filename, filename_len))) {
+			pphar = PHAR_G(manifest_cached) ? zend_hash_str_find_ptr(&cached_phars, filename, filename_len) : NULL;
+			if (pphar) {
 				*ext_str = filename + (filename_len - pphar->ext_len);
 				goto woohoo;
 			}
@@ -2061,31 +2095,29 @@ static bool php_check_dots(const char *element, size_t n) /* {{{ */
 /**
  * Remove .. and . references within a phar filename
  */
-char *phar_fix_filepath(char *path, size_t *new_len, bool use_cwd) /* {{{ */
+zend_string* phar_fix_filepath(const char *path, size_t path_length, bool use_cwd) /* {{{ */
 {
-	char *newpath;
-	size_t newpath_len;
-	char *ptr;
-	char *tok;
-	size_t ptr_length, path_length = *new_len;
-
-	if (PHAR_G(cwd_len) && use_cwd && path_length > 2 && path[0] == '.' && path[1] == '/') {
-		newpath_len = PHAR_G(cwd_len);
-		newpath = emalloc(strlen(path) + newpath_len + 1);
-		memcpy(newpath, PHAR_G(cwd), newpath_len);
+	zend_string *new_path;
+	size_t new_path_len;
+	size_t ptr_length;
+
+	if (use_cwd && PHAR_G(cwd_len) && path_length > 2 && path[0] == '.' && path[1] == '/') {
+		new_path = zend_string_alloc(path_length + PHAR_G(cwd_len) + 1, false);
+		new_path_len = PHAR_G(cwd_len);
+		memcpy(ZSTR_VAL(new_path), PHAR_G(cwd), PHAR_G(cwd_len));
 	} else {
-		newpath = emalloc(strlen(path) + 2);
-		newpath[0] = '/';
-		newpath_len = 1;
+		new_path = zend_string_alloc(path_length + 2, false);
+		ZSTR_VAL(new_path)[0] = '/';
+		new_path_len = 1;
 	}
 
-	ptr = path;
+	const char *ptr = path;
 
 	if (*ptr == '/') {
 		++ptr;
 	}
 
-	tok = ptr;
+	const char *tok = ptr;
 
 	do {
 		ptr = memchr(ptr, '/', path_length - (ptr - path));
@@ -2095,46 +2127,42 @@ char *phar_fix_filepath(char *path, size_t *new_len, bool use_cwd) /* {{{ */
 		switch (path_length - (tok - path)) {
 			case 1:
 				if (*tok == '.') {
-					efree(path);
-					*new_len = 1;
-					efree(newpath);
-					return estrndup("/", 1);
+					zend_string_release_ex(new_path, false);
+					return ZSTR_CHAR('/');
 				}
 				break;
 			case 2:
 				if (tok[0] == '.' && tok[1] == '.') {
-					efree(path);
-					*new_len = 1;
-					efree(newpath);
-					return estrndup("/", 1);
+					zend_string_release_ex(new_path, false);
+					return ZSTR_CHAR('/');
 				}
 		}
-		efree(newpath);
-		return path;
+		zend_string_release_ex(new_path, false);
+		return zend_string_init(path, path_length, false);
 	}
 
 	while (ptr) {
 		ptr_length = ptr - tok;
 last_time:
 		if (IS_DIRECTORY_UP(tok, ptr_length)) {
-			while (newpath_len > 1 && !IS_BACKSLASH(newpath[newpath_len - 1])) {
-				newpath_len--;
+			while (new_path_len > 1 && !IS_BACKSLASH(ZSTR_VAL(new_path)[new_path_len - 1])) {
+				new_path_len--;
 			}
 
-			if (newpath[0] != '/') {
-				newpath[newpath_len] = '\0';
-			} else if (newpath_len > 1) {
-				--newpath_len;
+			if (ZSTR_VAL(new_path)[0] != '/') {
+				ZSTR_VAL(new_path)[new_path_len] = '\0';
+			} else if (new_path_len > 1) {
+				--new_path_len;
 			}
 		} else if (!IS_DIRECTORY_CURRENT(tok, ptr_length)) {
-			if (newpath_len > 1) {
-				newpath[newpath_len++] = '/';
-				memcpy(newpath + newpath_len, tok, ptr_length+1);
+			if (new_path_len > 1) {
+				ZSTR_VAL(new_path)[new_path_len++] = '/';
+				memcpy(ZSTR_VAL(new_path) + new_path_len, tok, ptr_length+1);
 			} else {
-				memcpy(newpath + newpath_len, tok, ptr_length+1);
+				memcpy(ZSTR_VAL(new_path) + new_path_len, tok, ptr_length+1);
 			}
 
-			newpath_len += ptr_length;
+			new_path_len += ptr_length;
 		}
 
 		if (ptr == path + path_length) {
@@ -2154,10 +2182,8 @@ char *phar_fix_filepath(char *path, size_t *new_len, bool use_cwd) /* {{{ */
 		}
 	}
 
-	efree(path);
-	*new_len = newpath_len;
-	newpath[newpath_len] = '\0';
-	return erealloc(newpath, newpath_len + 1);
+	ZSTR_VAL(new_path)[new_path_len] = '\0';
+	return zend_string_realloc(new_path, new_path_len, false);
 }
 /* }}} */
 
@@ -2173,7 +2199,7 @@ char *phar_fix_filepath(char *path, size_t *new_len, bool use_cwd) /* {{{ */
  *
  * This is used by phar_parse_url()
  */
-zend_result phar_split_fname(const char *filename, size_t filename_len, char **arch, size_t *arch_len, char **entry, size_t *entry_len, int executable, int for_create) /* {{{ */
+zend_string* phar_split_fname_ex(const char *filename, size_t filename_len, zend_string **entry, int executable, int for_create, const char **error) /* {{{ */
 {
 	const char *ext_str;
 #ifdef PHP_WIN32
@@ -2181,8 +2207,11 @@ zend_result phar_split_fname(const char *filename, size_t filename_len, char **a
 #endif
 	size_t ext_len;
 
+	if (error) {
+		*error = NULL;
+	}
 	if (zend_char_has_nul_byte(filename, filename_len)) {
-		return FAILURE;
+		return NULL;
 	}
 
 	if (!strncasecmp(filename, "phar://", 7)) {
@@ -2200,12 +2229,12 @@ zend_result phar_split_fname(const char *filename, size_t filename_len, char **a
 #endif
 	if (phar_detect_phar_fname_ext(filename, filename_len, &ext_str, &ext_len, executable, for_create, false) == FAILURE) {
 		if (ext_len != -1) {
-			if (!ext_str) {
+			if (!ext_str && error) {
 				/* no / detected, restore arch for error message */
 #ifdef PHP_WIN32
-				*arch = save;
+				*error = save;
 #else
-				*arch = (char*)filename;
+				*error = filename;
 #endif
 			}
 
@@ -2214,27 +2243,24 @@ zend_result phar_split_fname(const char *filename, size_t filename_len, char **a
 				efree((char *)filename);
 			}
 #endif
-			return FAILURE;
+			return NULL;
 		}
 
 		ext_len = 0;
 		/* no extension detected - instead we are dealing with an alias */
 	}
 
-	*arch_len = ext_str - filename + ext_len;
-	*arch = estrndup(filename, *arch_len);
+	size_t arch_len = ext_str - filename + ext_len;
+	zend_string *arch = zend_string_init(filename, arch_len, false);
 
 	if (entry) {
 		if (ext_str[ext_len]) {
-			*entry_len = filename_len - *arch_len;
-			*entry = estrndup(ext_str+ext_len, *entry_len);
-	#ifdef PHP_WIN32
-			phar_unixify_path_separators(*entry, *entry_len);
-	#endif
-			*entry = phar_fix_filepath(*entry, entry_len, 0);
+			size_t computed_entry_len = filename_len - arch_len;
+			/* We don't need to unixify the path on Windows,
+			 * as ext_str is derived from filename that was already unixify */
+			*entry = phar_fix_filepath(ext_str+ext_len, computed_entry_len, false);
 		} else {
-			*entry_len = 1;
-			*entry = estrndup("/", 1);
+			*entry = ZSTR_CHAR('/');
 		}
 	}
 
@@ -2244,15 +2270,19 @@ zend_result phar_split_fname(const char *filename, size_t filename_len, char **a
 	}
 #endif
 
-	return SUCCESS;
+	return arch;
 }
 /* }}} */
 
+zend_string* phar_split_fname(const char *filename, size_t filename_len, zend_string **entry, int executable, int for_create) {
+	return phar_split_fname_ex(filename, filename_len, entry, executable, for_create, NULL);
+}
+
 /**
  * Invoked when a user calls Phar::mapPhar() from within an executing .phar
  * to set up its manifest directly
  */
-ZEND_ATTRIBUTE_NONNULL_ARGS(3) zend_result phar_open_executed_filename(char *alias, size_t alias_len, char **error) /* {{{ */
+ZEND_ATTRIBUTE_NONNULL_ARGS(2) zend_result phar_open_executed_filename(/* copyable & hash update */ zend_string *alias, char **error) /* {{{ */
 {
 	*error = NULL;
 
@@ -2263,7 +2293,7 @@ ZEND_ATTRIBUTE_NONNULL_ARGS(3) zend_result phar_open_executed_filename(char *ali
 		return FAILURE;
 	}
 
-	if (phar_open_parsed_phar(ZSTR_VAL(fname), ZSTR_LEN(fname), alias, alias_len, false, REPORT_ERRORS, NULL, NULL) == SUCCESS) {
+	if (phar_open_parsed_phar(ZSTR_VAL(fname), ZSTR_LEN(fname), alias, false, REPORT_ERRORS, NULL, NULL) == SUCCESS) {
 		return SUCCESS;
 	}
 
@@ -2292,7 +2322,7 @@ ZEND_ATTRIBUTE_NONNULL_ARGS(3) zend_result phar_open_executed_filename(char *ali
 		fname = actual;
 	}
 
-	zend_result ret = phar_open_from_fp(fp, ZSTR_VAL(fname), ZSTR_LEN(fname), alias, alias_len, REPORT_ERRORS, NULL, error);
+	zend_result ret = phar_open_from_fp(fp, ZSTR_VAL(fname), ZSTR_LEN(fname), alias, REPORT_ERRORS, NULL, error);
 
 	if (actual) {
 		zend_string_release_ex(actual, 0);
@@ -2320,14 +2350,14 @@ ZEND_ATTRIBUTE_NONNULL zend_result phar_postprocess_file(phar_entry_data *idata,
 
 		if (!stream) {
 			spprintf(error, 0, "phar error: unable to open zip-based phar archive \"%s\" to verify local file header for file \"%s\"",
-				idata->phar->fname, ZSTR_VAL(entry->filename));
+				ZSTR_VAL(idata->phar->fname), ZSTR_VAL(entry->filename));
 			return FAILURE;
 		}
 		php_stream_seek(stream, entry->header_offset, SEEK_SET);
 
 		if (sizeof(local) != php_stream_read(stream, (char *) &local, sizeof(local))) {
 			spprintf(error, 0, "phar error: internal corruption of zip-based phar \"%s\" (cannot read local file header for file \"%s\")",
-				idata->phar->fname, ZSTR_VAL(entry->filename));
+				ZSTR_VAL(idata->phar->fname), ZSTR_VAL(entry->filename));
 			return FAILURE;
 		}
 
@@ -2341,7 +2371,7 @@ ZEND_ATTRIBUTE_NONNULL zend_result phar_postprocess_file(phar_entry_data *idata,
 			if (sizeof(desc) != php_stream_read(stream,
 							    (char *) &desc, sizeof(desc))) {
 				spprintf(error, 0, "phar error: internal corruption of zip-based phar \"%s\" (cannot read local data descriptor for file \"%s\")",
-					idata->phar->fname, ZSTR_VAL(entry->filename));
+					ZSTR_VAL(idata->phar->fname), ZSTR_VAL(entry->filename));
 				return FAILURE;
 			}
 			if (desc.signature[0] == 'P' && desc.signature[1] == 'K') {
@@ -2354,7 +2384,7 @@ ZEND_ATTRIBUTE_NONNULL zend_result phar_postprocess_file(phar_entry_data *idata,
 		/* verify local header */
 		if (ZSTR_LEN(entry->filename) != PHAR_ZIP_16(local.filename_len) || entry->crc32 != PHAR_ZIP_32(local.crc32) || entry->uncompressed_filesize != PHAR_ZIP_32(local.uncompsize) || entry->compressed_filesize != PHAR_ZIP_32(local.compsize)) {
 			spprintf(error, 0, "phar error: internal corruption of zip-based phar \"%s\" (local header of file \"%s\" does not match central directory)",
-				idata->phar->fname, ZSTR_VAL(entry->filename));
+				ZSTR_VAL(idata->phar->fname), ZSTR_VAL(entry->filename));
 			return FAILURE;
 		}
 
@@ -2383,7 +2413,7 @@ ZEND_ATTRIBUTE_NONNULL zend_result phar_postprocess_file(phar_entry_data *idata,
 		return SUCCESS;
 	} else {
 		spprintf(error, 0, "phar error: internal corruption of phar \"%s\" (crc32 mismatch on file \"%s\")",
-			idata->phar->fname, ZSTR_VAL(entry->filename));
+			ZSTR_VAL(idata->phar->fname), ZSTR_VAL(entry->filename));
 		return FAILURE;
 	}
 }
@@ -2495,7 +2525,7 @@ ZEND_ATTRIBUTE_NONNULL_ARGS(1, 4) int phar_flush_ex(phar_archive_data *phar, zen
 	php_stream *shared_cfp = NULL;
 
 	if (phar->is_persistent) {
-		spprintf(error, 0, "internal error: attempt to flush cached zip-based phar \"%s\"", phar->fname);
+		spprintf(error, 0, "internal error: attempt to flush cached zip-based phar \"%s\"", ZSTR_VAL(phar->fname));
 		return EOF;
 	}
 
@@ -2524,7 +2554,7 @@ ZEND_ATTRIBUTE_NONNULL_ARGS(1, 4) int phar_flush_ex(phar_archive_data *phar, zen
 		must_close_old_file = false;
 		php_stream_rewind(oldfile);
 	} else {
-		oldfile = php_stream_open_wrapper(phar->fname, "rb", 0, NULL);
+		oldfile = php_stream_open_wrapper(ZSTR_VAL(phar->fname), "rb", 0, NULL);
 		must_close_old_file = oldfile != NULL;
 	}
 	newfile = php_stream_fopen_tmpfile();
@@ -2544,7 +2574,7 @@ ZEND_ATTRIBUTE_NONNULL_ARGS(1, 4) int phar_flush_ex(phar_archive_data *phar, zen
 				php_stream_close(oldfile);
 			}
 			php_stream_close(newfile);
-			spprintf(error, 0, "illegal stub for phar \"%s\" (__HALT_COMPILER(); is missing)", phar->fname);
+			spprintf(error, 0, "illegal stub for phar \"%s\" (__HALT_COMPILER(); is missing)", ZSTR_VAL(phar->fname));
 			return EOF;
 		}
 
@@ -2560,7 +2590,7 @@ ZEND_ATTRIBUTE_NONNULL_ARGS(1, 4) int phar_flush_ex(phar_archive_data *phar, zen
 				php_stream_close(oldfile);
 			}
 			php_stream_close(newfile);
-			spprintf(error, 0, "unable to create stub from string in new phar \"%s\"", phar->fname);
+			spprintf(error, 0, "unable to create stub from string in new phar \"%s\"", ZSTR_VAL(phar->fname));
 			return EOF;
 		}
 		phar->halt_offset = len + end_sequence_len;
@@ -2582,9 +2612,9 @@ ZEND_ATTRIBUTE_NONNULL_ARGS(1, 4) int phar_flush_ex(phar_archive_data *phar, zen
 			}
 			php_stream_close(newfile);
 			if (new_stub) {
-				spprintf(error, 0, "unable to create stub in new phar \"%s\"", phar->fname);
+				spprintf(error, 0, "unable to create stub in new phar \"%s\"", ZSTR_VAL(phar->fname));
 			} else {
-				spprintf(error, 0, "unable to copy stub of old phar to new phar \"%s\"", phar->fname);
+				spprintf(error, 0, "unable to copy stub of old phar to new phar \"%s\"", ZSTR_VAL(phar->fname));
 			}
 			if (new_stub) {
 				zend_string_free(new_stub);
@@ -2606,7 +2636,7 @@ ZEND_ATTRIBUTE_NONNULL_ARGS(1, 4) int phar_flush_ex(phar_archive_data *phar, zen
 	/* compress as necessary, calculate crcs, serialize meta-data, manifest size, and file sizes */
 	main_metadata_str.s = NULL;
 	if (phar->metadata_tracker.str) {
-		smart_str_appendl(&main_metadata_str, ZSTR_VAL(phar->metadata_tracker.str), ZSTR_LEN(phar->metadata_tracker.str));
+		smart_str_append(&main_metadata_str, phar->metadata_tracker.str);
 	} else if (!Z_ISUNDEF(phar->metadata_tracker.val)) {
 		PHP_VAR_SERIALIZE_INIT(metadata_hash);
 		php_var_serialize(&main_metadata_str, &phar->metadata_tracker.val, &metadata_hash);
@@ -2682,7 +2712,7 @@ ZEND_ATTRIBUTE_NONNULL_ARGS(1, 4) int phar_flush_ex(phar_archive_data *phar, zen
 				php_stream_close(oldfile);
 			}
 			php_stream_close(newfile);
-			spprintf(error, 0, "unable to seek to start of file \"%s\" while creating new phar \"%s\"", ZSTR_VAL(entry->filename), phar->fname);
+			spprintf(error, 0, "unable to seek to start of file \"%s\" while creating new phar \"%s\"", ZSTR_VAL(entry->filename), ZSTR_VAL(phar->fname));
 			return EOF;
 		}
 		newcrc32 = php_crc32_bulk_init();
@@ -2703,7 +2733,7 @@ ZEND_ATTRIBUTE_NONNULL_ARGS(1, 4) int phar_flush_ex(phar_archive_data *phar, zen
 			spprintf(error, 0, "unable to %s compress file \"%s\" to new phar \"%s\"",
 				entry->flags & PHAR_ENT_COMPRESSED_GZ ? "gzip" : "bzip2",
 				ZSTR_VAL(entry->filename),
-				phar->fname);
+				ZSTR_VAL(phar->fname));
 			return EOF;
 		}
 
@@ -2734,7 +2764,7 @@ ZEND_ATTRIBUTE_NONNULL_ARGS(1, 4) int phar_flush_ex(phar_archive_data *phar, zen
 			}
 			php_stream_close(newfile);
 			spprintf(error, 0, "unable to seek to start of file \"%s\" while creating new phar \"%s\"",
-				ZSTR_VAL(entry->filename), phar->fname);
+				ZSTR_VAL(entry->filename), ZSTR_VAL(phar->fname));
 			goto cleanup;
 		}
 		php_stream_filter_append((&entry->cfp->writefilters), filter);
@@ -2745,7 +2775,7 @@ ZEND_ATTRIBUTE_NONNULL_ARGS(1, 4) int phar_flush_ex(phar_archive_data *phar, zen
 			}
 			php_stream_close(newfile);
 			spprintf(error, 0, "unable to copy compressed file contents of file \"%s\" while creating new phar \"%s\"",
-				ZSTR_VAL(entry->filename), phar->fname);
+				ZSTR_VAL(entry->filename), ZSTR_VAL(phar->fname));
 			goto cleanup;
 		}
 		php_stream_filter_flush(filter, 1);
@@ -2805,7 +2835,7 @@ ZEND_ATTRIBUTE_NONNULL_ARGS(1, 4) int phar_flush_ex(phar_archive_data *phar, zen
 		php_stream_close(newfile);
 		phar->alias_len = restore_alias_len;
 
-		spprintf(error, 0, "unable to write manifest header of new phar \"%s\"", phar->fname);
+		spprintf(error, 0, "unable to write manifest header of new phar \"%s\"", ZSTR_VAL(phar->fname));
 
 		goto cleanup;
 	}
@@ -2824,7 +2854,7 @@ ZEND_ATTRIBUTE_NONNULL_ARGS(1, 4) int phar_flush_ex(phar_archive_data *phar, zen
 		php_stream_close(newfile);
 		phar->alias_len = restore_alias_len;
 
-		spprintf(error, 0, "unable to write manifest meta-data of new phar \"%s\"", phar->fname);
+		spprintf(error, 0, "unable to write manifest meta-data of new phar \"%s\"", ZSTR_VAL(phar->fname));
 
 		goto cleanup;
 	}
@@ -2856,9 +2886,9 @@ ZEND_ATTRIBUTE_NONNULL_ARGS(1, 4) int phar_flush_ex(phar_archive_data *phar, zen
 			}
 			php_stream_close(newfile);
 			if (entry->is_dir) {
-				spprintf(error, 0, "unable to write filename of directory \"%s\" to manifest of new phar \"%s\"", ZSTR_VAL(entry->filename), phar->fname);
+				spprintf(error, 0, "unable to write filename of directory \"%s\" to manifest of new phar \"%s\"", ZSTR_VAL(entry->filename), ZSTR_VAL(phar->fname));
 			} else {
-				spprintf(error, 0, "unable to write filename of file \"%s\" to manifest of new phar \"%s\"", ZSTR_VAL(entry->filename), phar->fname);
+				spprintf(error, 0, "unable to write filename of file \"%s\" to manifest of new phar \"%s\"", ZSTR_VAL(entry->filename), ZSTR_VAL(phar->fname));
 			}
 			goto cleanup;
 		}
@@ -2890,7 +2920,7 @@ ZEND_ATTRIBUTE_NONNULL_ARGS(1, 4) int phar_flush_ex(phar_archive_data *phar, zen
 
 			php_stream_close(newfile);
 
-			spprintf(error, 0, "unable to write temporary manifest of file \"%s\" to manifest of new phar \"%s\"", ZSTR_VAL(entry->filename), phar->fname);
+			spprintf(error, 0, "unable to write temporary manifest of file \"%s\" to manifest of new phar \"%s\"", ZSTR_VAL(entry->filename), ZSTR_VAL(phar->fname));
 
 			goto cleanup;
 		}
@@ -2927,7 +2957,7 @@ ZEND_ATTRIBUTE_NONNULL_ARGS(1, 4) int phar_flush_ex(phar_archive_data *phar, zen
 					php_stream_close(oldfile);
 				}
 				php_stream_close(newfile);
-				spprintf(error, 0, "unable to seek to start of file \"%s\" while creating new phar \"%s\"", ZSTR_VAL(entry->filename), phar->fname);
+				spprintf(error, 0, "unable to seek to start of file \"%s\" while creating new phar \"%s\"", ZSTR_VAL(entry->filename), ZSTR_VAL(phar->fname));
 				goto cleanup;
 			}
 		}
@@ -2937,7 +2967,7 @@ ZEND_ATTRIBUTE_NONNULL_ARGS(1, 4) int phar_flush_ex(phar_archive_data *phar, zen
 				php_stream_close(oldfile);
 			}
 			php_stream_close(newfile);
-			spprintf(error, 0, "unable to seek to start of file \"%s\" while creating new phar \"%s\"", ZSTR_VAL(entry->filename), phar->fname);
+			spprintf(error, 0, "unable to seek to start of file \"%s\" while creating new phar \"%s\"", ZSTR_VAL(entry->filename), ZSTR_VAL(phar->fname));
 			goto cleanup;
 		}
 
@@ -2951,7 +2981,7 @@ ZEND_ATTRIBUTE_NONNULL_ARGS(1, 4) int phar_flush_ex(phar_archive_data *phar, zen
 
 			php_stream_close(newfile);
 
-			spprintf(error, 0, "unable to write contents of file \"%s\" to new phar \"%s\"", ZSTR_VAL(entry->filename), phar->fname);
+			spprintf(error, 0, "unable to write contents of file \"%s\" to new phar \"%s\"", ZSTR_VAL(entry->filename), ZSTR_VAL(phar->fname));
 
 			goto cleanup;
 		}
@@ -2994,17 +3024,12 @@ ZEND_ATTRIBUTE_NONNULL_ARGS(1, 4) int phar_flush_ex(phar_archive_data *phar, zen
 
 		switch(phar->sig_flags) {
 			default: {
-				char *digest = NULL;
-				size_t digest_len;
-
 				char *signature_error = NULL;
-				if (FAILURE == phar_create_signature(phar, newfile, &digest, &digest_len, &signature_error)) {
+				zend_string *signature = phar_create_signature(phar, newfile, &signature_error);
+				if (!signature) {
 					spprintf(error, 0, "phar error: unable to write signature: %s", signature_error);
 					efree(signature_error);
 
-					if (digest) {
-						efree(digest);
-					}
 					if (must_close_old_file) {
 						php_stream_close(oldfile);
 					}
@@ -3012,14 +3037,14 @@ ZEND_ATTRIBUTE_NONNULL_ARGS(1, 4) int phar_flush_ex(phar_archive_data *phar, zen
 					return EOF;
 				}
 
-				php_stream_write(newfile, digest, digest_len);
-				efree(digest);
+				php_stream_write(newfile, ZSTR_VAL(signature), ZSTR_LEN(signature));
 				if (phar->sig_flags == PHAR_SIG_OPENSSL ||
 					phar->sig_flags == PHAR_SIG_OPENSSL_SHA256 ||
 					phar->sig_flags == PHAR_SIG_OPENSSL_SHA512) {
-					phar_set_32(sig_buf, digest_len);
+					phar_set_32(sig_buf, ZSTR_LEN(signature));
 					php_stream_write(newfile, sig_buf, 4);
 				}
+				zend_string_release_ex(signature, false);
 				break;
 			}
 		}
@@ -3055,10 +3080,10 @@ ZEND_ATTRIBUTE_NONNULL_ARGS(1, 4) int phar_flush_ex(phar_archive_data *phar, zen
 		/* deferred flush */
 		phar->fp = newfile;
 	} else {
-		phar->fp = php_stream_open_wrapper(phar->fname, "w+b", IGNORE_URL|STREAM_MUST_SEEK|REPORT_ERRORS, NULL);
+		phar->fp = php_stream_open_wrapper(ZSTR_VAL(phar->fname), "w+b", IGNORE_URL|STREAM_MUST_SEEK|REPORT_ERRORS, NULL);
 		if (!phar->fp) {
 			phar->fp = newfile;
-			spprintf(error, 4096, "unable to open new phar \"%s\" for writing", phar->fname);
+			spprintf(error, 4096, "unable to open new phar \"%s\" for writing", ZSTR_VAL(phar->fname));
 			return EOF;
 		}
 
@@ -3072,7 +3097,7 @@ ZEND_ATTRIBUTE_NONNULL_ARGS(1, 4) int phar_flush_ex(phar_archive_data *phar, zen
 			zend_array_destroy(Z_ARR(filterparams));
 
 			if (!filter) {
-				spprintf(error, 4096, "unable to compress all contents of phar \"%s\" using zlib, PHP versions older than 5.2.6 have a buggy zlib", phar->fname);
+				spprintf(error, 4096, "unable to compress all contents of phar \"%s\" using zlib, PHP versions older than 5.2.6 have a buggy zlib", ZSTR_VAL(phar->fname));
 				return EOF;
 			}
 
@@ -3100,7 +3125,7 @@ ZEND_ATTRIBUTE_NONNULL_ARGS(1, 4) int phar_flush_ex(phar_archive_data *phar, zen
 	}
 
 	if (-1 == php_stream_seek(phar->fp, phar->halt_offset, SEEK_SET)) {
-		spprintf(error, 0, "unable to seek to __HALT_COMPILER(); in new phar \"%s\"", phar->fname);
+		spprintf(error, 0, "unable to seek to __HALT_COMPILER(); in new phar \"%s\"", ZSTR_VAL(phar->fname));
 		return EOF;
 	}
 
@@ -3143,7 +3168,7 @@ zend_op_array *(*phar_orig_compile_file)(zend_file_handle *file_handle, int type
 
 static zend_string *phar_resolve_path(zend_string *filename)
 {
-	zend_string *ret = phar_find_in_include_path(filename, NULL);
+	zend_string *ret = phar_find_in_include_path(filename);
 	if (!ret) {
 		ret = phar_save_resolve_path(filename);
 	}
@@ -3161,7 +3186,7 @@ static zend_op_array *phar_compile_file(zend_file_handle *file_handle, int type)
 		return phar_orig_compile_file(file_handle, type);
 	}
 	if (strstr(ZSTR_VAL(file_handle->filename), ".phar") && !strstr(ZSTR_VAL(file_handle->filename), "://")) {
-		if (SUCCESS == phar_open_from_filename(ZSTR_VAL(file_handle->filename), ZSTR_LEN(file_handle->filename), NULL, 0, 0, &phar, NULL)) {
+		if (SUCCESS == phar_open_from_filename(ZSTR_VAL(file_handle->filename), ZSTR_LEN(file_handle->filename), NULL, 0, &phar, NULL)) {
 			if (phar->is_zip || phar->is_tar) {
 				zend_file_handle f;
 
@@ -3346,7 +3371,8 @@ void phar_request_initialize(void) /* {{{ */
 	if (!PHAR_G(request_init))
 	{
 		PHAR_G(last_phar) = NULL;
-		PHAR_G(last_phar_name) = PHAR_G(last_alias) = NULL;
+		PHAR_G(last_alias) = NULL;
+		PHAR_G(last_phar_name) = NULL;
 		PHAR_G(has_bz2) = zend_hash_str_exists(&module_registry, "bz2", sizeof("bz2")-1);
 		PHAR_G(has_zlib) = zend_hash_str_exists(&module_registry, "zlib", sizeof("zlib")-1);
 		PHAR_G(request_init) = 1;
diff --git a/ext/phar/phar_internal.h b/ext/phar/phar_internal.h
index 62b5520ba50f..d75498f9c95a 100644
--- a/ext/phar/phar_internal.h
+++ b/ext/phar/phar_internal.h
@@ -2,15 +2,13 @@
   +----------------------------------------------------------------------+
   | phar php single-file executable PHP extension                        |
   +----------------------------------------------------------------------+
-  | Copyright (c) The PHP Group                                          |
+  | Copyright © The PHP Group and Contributors.                          |
   +----------------------------------------------------------------------+
-  | This source file is subject to version 3.01 of the PHP license,      |
-  | that is bundled with this package in the file LICENSE, and is        |
-  | available through the world-wide-web at the following url:           |
-  | https://www.php.net/license/3_01.txt                                 |
-  | If you did not receive a copy of the PHP license and are unable to   |
-  | obtain it through the world-wide-web, please send a note to          |
-  | license@php.net so we can mail you a copy immediately.               |
+  | This source file is subject to the Modified BSD License that is      |
+  | bundled with this package in the file LICENSE, and is available      |
+  | through the World Wide Web at .        |
+  |                                                                      |
+  | SPDX-License-Identifier: BSD-3-Clause                                |
   +----------------------------------------------------------------------+
   | Authors: Gregory Beaver                              |
   |          Marcus Boerger                               |
@@ -148,10 +146,9 @@ ZEND_BEGIN_MODULE_GLOBALS(phar)
 	char        *openssl_privatekey;
 	uint32_t    openssl_privatekey_len;
 	/* phar_get_archive cache */
-	char*       last_phar_name;
-	uint32_t    last_phar_name_len;
+	const zend_string *last_phar_name;
 	uint32_t    last_alias_len;
-	char*       last_alias;
+	const char* last_alias;
 	phar_archive_data* last_phar;
 	HashTable mime_types;
 ZEND_END_MODULE_GLOBALS(phar)
@@ -219,7 +216,7 @@ typedef struct _phar_entry_info {
 	unsigned int             fileinfo_lock_count;
 	char                     *tmp;
 	phar_archive_data        *phar;
-	char                     *link; /* symbolic link to another file */
+	zend_string              *symlink;
 	char                     tar_type;
 	/* position in the manifest */
 	uint32_t                     manifest_pos;
@@ -245,11 +242,10 @@ typedef struct _phar_entry_info {
 
 /* information about a phar file (the archive itself) */
 struct _phar_archive_data {
-	char                     *fname;
-	uint32_t                 fname_len;
-	/* for phar_detect_fname_ext, this stores the location of the file extension within fname */
+	zend_string             *fname;
+	/* The ext field stores the location of the file extension from the fname field, and thus should never be freed. */
 	uint32_t                 ext_len;
-	char                     *ext;
+	const char               *ext;
 	char                     *alias;
 	uint32_t                 alias_len;
 	char                     version[12];
@@ -382,25 +378,24 @@ static inline bool phar_validate_alias(const char *alias, size_t alias_len) /* {
 
 static inline void phar_set_inode(phar_entry_info *entry) /* {{{ */
 {
-	char tmp[MAXPATHLEN];
-	size_t tmp_len;
-	size_t len1, len2;
-
-	tmp_len = MIN(MAXPATHLEN, ZSTR_LEN(entry->filename) + entry->phar->fname_len);
-
-	len1 = MIN(entry->phar->fname_len, tmp_len);
 	if (entry->phar->fname) {
-		memcpy(tmp, entry->phar->fname, len1);
-	}
+		char tmp[MAXPATHLEN];
+		size_t tmp_len = MIN(MAXPATHLEN, ZSTR_LEN(entry->filename) + ZSTR_LEN(entry->phar->fname));
 
-	len2 = MIN(tmp_len - len1, ZSTR_LEN(entry->filename));
-	memcpy(tmp + len1, entry->filename, len2);
+		size_t len1 = MIN(ZSTR_LEN(entry->phar->fname), tmp_len);
+		memcpy(tmp, ZSTR_VAL(entry->phar->fname), len1);
 
-	entry->inode = (unsigned short) zend_hash_func(tmp, tmp_len);
+		size_t len2 = MIN(tmp_len - len1, ZSTR_LEN(entry->filename));
+		memcpy(tmp + len1, entry->filename, len2);
+
+		entry->inode = (unsigned short) zend_hash_func(tmp, tmp_len);
+	} else {
+		entry->inode = (unsigned short) zend_string_hash_val(entry->filename);
+	}
 }
 /* }}} */
 
-static inline bool phar_entry_can_remove(phar_entry_info *entry)
+static inline bool phar_entry_can_remove(const phar_entry_info *entry)
 {
 	return entry->fp_refcount == 0 && entry->fileinfo_lock_count == 0;
 }
@@ -411,14 +406,14 @@ void phar_object_init(void);
 void phar_destroy_phar_data(phar_archive_data *phar);
 
 ZEND_ATTRIBUTE_NONNULL zend_result phar_postprocess_file(phar_entry_data *idata, uint32_t crc32, char **error, int process_zip);
-zend_result phar_open_from_filename(char *fname, size_t fname_len, char *alias, size_t alias_len, uint32_t options, phar_archive_data** pphar, char **error);
-ZEND_ATTRIBUTE_NONNULL_ARGS(1, 7, 8) zend_result phar_open_or_create_filename(char *fname, size_t fname_len, char *alias, size_t alias_len, bool is_data, uint32_t options, phar_archive_data** pphar, char **error);
-ZEND_ATTRIBUTE_NONNULL_ARGS(1, 7, 8) zend_result phar_create_or_parse_filename(char *fname, size_t fname_len, char *alias, size_t alias_len, bool is_data, uint32_t options, phar_archive_data** pphar, char **error);
-ZEND_ATTRIBUTE_NONNULL_ARGS(3) zend_result phar_open_executed_filename(char *alias, size_t alias_len, char **error);
-zend_result phar_free_alias(phar_archive_data *phar, char *alias, size_t alias_len);
-zend_result phar_get_archive(phar_archive_data **archive, char *fname, size_t fname_len, char *alias, size_t alias_len, char **error);
-zend_result phar_verify_signature(php_stream *fp, size_t end_of_phar, uint32_t sig_type, char *sig, size_t sig_len, char *fname, char **signature, size_t *signature_len, char **error);
-ZEND_ATTRIBUTE_NONNULL zend_result phar_create_signature(phar_archive_data *phar, php_stream *fp, char **signature, size_t *signature_length, char **error);
+zend_result phar_open_from_filename(char *fname, size_t fname_len, /* copyable & hash update */ zend_string *alias, uint32_t options, phar_archive_data** pphar, char **error);
+ZEND_ATTRIBUTE_NONNULL_ARGS(1, 5, 6) zend_result phar_open_or_create_filename(zend_string *fname, /* copyable & hash update */ zend_string *alias, bool is_data, uint32_t options, phar_archive_data** pphar, char **error);
+ZEND_ATTRIBUTE_NONNULL_ARGS(1, 5, 6) zend_result phar_create_or_parse_filename(zend_string *fname, /* copyable & hash update */ zend_string *alias, bool is_data, uint32_t options, phar_archive_data** pphar, char **error);
+ZEND_ATTRIBUTE_NONNULL_ARGS(2) zend_result phar_open_executed_filename(/* copyable & hash update */ zend_string *alias, char **error);
+zend_result phar_free_alias(const phar_archive_data *phar);
+phar_archive_data* phar_get_archive(const char *fname, size_t fname_len, const char *alias, size_t alias_len, char **error);
+zend_result phar_verify_signature(php_stream *fp, size_t end_of_phar, uint32_t sig_type, const char *sig, size_t sig_len, const char *fname, char **signature, size_t *signature_len, char **error);
+ZEND_ATTRIBUTE_NONNULL zend_string* phar_create_signature(phar_archive_data *phar, php_stream *fp, char **error);
 
 /* utility functions */
 zend_string *phar_create_default_stub(const zend_string *php_index_str, const zend_string *web_index_str, char **error);
@@ -426,10 +421,10 @@ const char *phar_decompress_filter(const phar_entry_info *entry, bool return_unk
 const char *phar_compress_filter(const phar_entry_info *entry, bool return_unknown);
 
 /* void phar_remove_virtual_dirs(phar_archive_data *phar, char *filename, size_t filename_len); */
-void phar_add_virtual_dirs(phar_archive_data *phar, char *filename, size_t filename_len);
-zend_result phar_mount_entry(phar_archive_data *phar, char *filename, size_t filename_len, char *path, size_t path_len);
-zend_string *phar_find_in_include_path(zend_string *file, phar_archive_data **pphar);
-char *phar_fix_filepath(char *path, size_t *new_len, bool use_cwd);
+void phar_add_virtual_dirs(phar_archive_data *phar, const char *filename, size_t filename_len);
+zend_result phar_mount_entry(phar_archive_data *phar, const char *filename, size_t filename_len, char *path, size_t path_len);
+	zend_string *phar_find_in_include_path(const zend_string *file);
+zend_string* phar_fix_filepath(const char *path, size_t path_length, bool use_cwd);
 ZEND_ATTRIBUTE_NONNULL phar_entry_info * phar_open_jit(const phar_archive_data *phar, phar_entry_info *entry, char **error);
 void phar_parse_metadata_lazy(const char *buffer, phar_metadata_tracker *tracker, uint32_t zip_metadata_len, bool persistent);
 bool phar_metadata_tracker_has_data(const phar_metadata_tracker* tracker, bool persistent);
@@ -450,13 +445,13 @@ zend_result phar_copy_on_write(phar_archive_data **pphar);
 
 /* tar functions in tar.c */
 bool phar_is_tar(const char *buf, const char *fname);
-zend_result phar_parse_tarfile(php_stream* fp, char *fname, size_t fname_len, char *alias, size_t alias_len, phar_archive_data** pphar, uint32_t compression, char **error);
-ZEND_ATTRIBUTE_NONNULL_ARGS(1, 7, 8) zend_result phar_open_or_create_tar(char *fname, size_t fname_len, char *alias, size_t alias_len, bool is_data, uint32_t options, phar_archive_data** pphar, char **error);
+zend_result phar_parse_tarfile(php_stream* fp, const char *fname, size_t fname_len, /* copyable & hash update */ zend_string *alias, phar_archive_data** pphar, uint32_t compression, char **error);
+ZEND_ATTRIBUTE_NONNULL_ARGS(1, 5, 6) zend_result phar_open_or_create_tar(zend_string *fname, /* copyable & hash update */ zend_string *alias, bool is_data, uint32_t options, phar_archive_data** pphar, char **error);
 ZEND_ATTRIBUTE_NONNULL_ARGS(1, 4) int phar_tar_flush(phar_archive_data *phar, zend_string *user_stub, bool is_default_stub, char **error);
 
 /* zip functions in zip.c */
-zend_result phar_parse_zipfile(php_stream *fp, char *fname, size_t fname_len, char *alias, size_t alias_len, phar_archive_data** pphar, char **error);
-ZEND_ATTRIBUTE_NONNULL_ARGS(1, 7, 8) zend_result phar_open_or_create_zip(char *fname, size_t fname_len, char *alias, size_t alias_len, bool is_data, uint32_t options, phar_archive_data** pphar, char **error);
+zend_result phar_parse_zipfile(php_stream *fp, const char *fname, size_t fname_len, /* copyable & hash update */ zend_string *alias, phar_archive_data** pphar, char **error);
+ZEND_ATTRIBUTE_NONNULL_ARGS(1, 5, 6) zend_result phar_open_or_create_zip(zend_string *fname, /* copyable & hash update */ zend_string *alias, bool is_data, uint32_t options, phar_archive_data** pphar, char **error);
 ZEND_ATTRIBUTE_NONNULL_ARGS(1, 4) int phar_zip_flush(phar_archive_data *archive, zend_string *user_stub, bool is_default_stub, char **error);
 
 #ifdef PHAR_MAIN
@@ -471,12 +466,13 @@ void phar_entry_delref(phar_entry_data *idata);
 
 phar_entry_info *phar_get_entry_info(phar_archive_data *phar, char *path, size_t path_len, char **error, bool security);
 phar_entry_info *phar_get_entry_info_dir(phar_archive_data *phar, char *path, size_t path_len, char dir, char **error, bool security);
-ZEND_ATTRIBUTE_NONNULL phar_entry_data *phar_get_or_create_entry_data(char *fname, size_t fname_len, char *path, size_t path_len, const char *mode, char allow_dir, char **error, bool security, uint32_t timestamp);
-ZEND_ATTRIBUTE_NONNULL zend_result phar_get_entry_data(phar_entry_data **ret, char *fname, size_t fname_len, char *path, size_t path_len, const char *mode, char allow_dir, char **error, bool security);
+ZEND_ATTRIBUTE_NONNULL phar_entry_data *phar_get_or_create_entry_data(zend_string *fname, char *path, size_t path_len, const char *mode, char allow_dir, char **error, bool security, uint32_t timestamp);
+ZEND_ATTRIBUTE_NONNULL zend_result phar_get_entry_data(phar_entry_data **ret, const zend_string *fname, char *path, size_t path_len, const char *mode, char allow_dir, char **error, bool security);
 ZEND_ATTRIBUTE_NONNULL_ARGS(1, 4) int phar_flush_ex(phar_archive_data *archive, zend_string *user_stub, bool is_default_stub, char **error);
 ZEND_ATTRIBUTE_NONNULL int phar_flush(phar_archive_data *archive, char **error);
 zend_result phar_detect_phar_fname_ext(const char *filename, size_t filename_len, const char **ext_str, size_t *ext_len, int executable, int for_create, bool is_complete);
-zend_result phar_split_fname(const char *filename, size_t filename_len, char **arch, size_t *arch_len, char **entry, size_t *entry_len, int executable, int for_create);
+zend_string* phar_split_fname_ex(const char *filename, size_t filename_len, zend_string **entry, int executable, int for_create, const char **error);
+zend_string* phar_split_fname(const char *filename, size_t filename_len, zend_string **entry, int executable, int for_create);
 
 typedef enum {
 	pcr_use_query,
diff --git a/ext/phar/phar_object.c b/ext/phar/phar_object.c
index d4b084217b5b..46db925cfd50 100644
--- a/ext/phar/phar_object.c
+++ b/ext/phar/phar_object.c
@@ -2,15 +2,13 @@
   +----------------------------------------------------------------------+
   | phar php single-file executable PHP extension                        |
   +----------------------------------------------------------------------+
-  | Copyright (c) The PHP Group                                          |
+  | Copyright © The PHP Group and Contributors.                          |
   +----------------------------------------------------------------------+
-  | This source file is subject to version 3.01 of the PHP license,      |
-  | that is bundled with this package in the file LICENSE, and is        |
-  | available through the world-wide-web at the following url:           |
-  | https://www.php.net/license/3_01.txt                                 |
-  | If you did not receive a copy of the PHP license and are unable to   |
-  | obtain it through the world-wide-web, please send a note to          |
-  | license@php.net so we can mail you a copy immediately.               |
+  | This source file is subject to the Modified BSD License that is      |
+  | bundled with this package in the file LICENSE, and is available      |
+  | through the World Wide Web at .        |
+  |                                                                      |
+  | SPDX-License-Identifier: BSD-3-Clause                                |
   +----------------------------------------------------------------------+
   | Authors: Gregory Beaver                              |
   |          Marcus Boerger                               |
@@ -46,7 +44,6 @@ static zend_class_entry *phar_ce_entry;
 
 static int phar_file_type(const HashTable *mimes, const char *file, char **mime_type) /* {{{ */
 {
-	phar_mime_type *mime;
 	const char *ext = strrchr(file, '.');
 	if (!ext) {
 		*mime_type = "text/plain";
@@ -54,7 +51,9 @@ static int phar_file_type(const HashTable *mimes, const char *file, char **mime_
 		return PHAR_MIME_OTHER;
 	}
 	++ext;
-	if (NULL == (mime = zend_hash_str_find_ptr(mimes, ext, strlen(ext)))) {
+
+	phar_mime_type *mime = zend_hash_str_find_ptr(mimes, ext, strlen(ext));
+	if (!mime) {
 		*mime_type = "application/octet-stream";
 		return PHAR_MIME_OTHER;
 	}
@@ -66,7 +65,6 @@ static int phar_file_type(const HashTable *mimes, const char *file, char **mime_
 static void phar_mung_server_vars(char *fname, char *entry, size_t entry_len, const char *basename, size_t request_uri_len) /* {{{ */
 {
 	HashTable *_SERVER;
-	zval *stuff;
 	char *path_info;
 	size_t basename_len = strlen(basename);
 	size_t code;
@@ -80,23 +78,25 @@ static void phar_mung_server_vars(char *fname, char *entry, size_t entry_len, co
 	_SERVER = Z_ARRVAL(PG(http_globals)[TRACK_VARS_SERVER]);
 
 	/* PATH_INFO and PATH_TRANSLATED should always be munged */
-	if (NULL != (stuff = zend_hash_str_find(_SERVER, "PATH_INFO", sizeof("PATH_INFO")-1))) {
+	zval *stuff = zend_hash_str_find(_SERVER, ZEND_STRL("PATH_INFO"));
+	if (stuff) {
 		path_info = Z_STRVAL_P(stuff);
 		code = Z_STRLEN_P(stuff);
 		if (code > (size_t)entry_len && !memcmp(path_info, entry, entry_len)) {
 			ZVAL_STR(&temp, Z_STR_P(stuff));
 			ZVAL_STRINGL(stuff, path_info + entry_len, request_uri_len);
-			zend_hash_str_update(_SERVER, "PHAR_PATH_INFO", sizeof("PHAR_PATH_INFO")-1, &temp);
+			zend_hash_str_update(_SERVER, ZEND_STRL("PHAR_PATH_INFO"), &temp);
 		}
 	}
 
-	if (NULL != (stuff = zend_hash_str_find(_SERVER, "PATH_TRANSLATED", sizeof("PATH_TRANSLATED")-1))) {
+	stuff = zend_hash_str_find(_SERVER, ZEND_STRL("PATH_TRANSLATED"));
+	if (stuff) {
 		zend_string *str = strpprintf(4096, "phar://%s%s", fname, entry);
 
 		ZVAL_STR(&temp, Z_STR_P(stuff));
 		ZVAL_NEW_STR(stuff, str);
 
-		zend_hash_str_update(_SERVER, "PHAR_PATH_TRANSLATED", sizeof("PHAR_PATH_TRANSLATED")-1, &temp);
+		zend_hash_str_update(_SERVER, ZEND_STRL("PHAR_PATH_TRANSLATED"), &temp);
 	}
 
 	if (!PHAR_G(phar_SERVER_mung_list)) {
@@ -104,46 +104,50 @@ static void phar_mung_server_vars(char *fname, char *entry, size_t entry_len, co
 	}
 
 	if (PHAR_G(phar_SERVER_mung_list) & PHAR_MUNG_REQUEST_URI) {
-		if (NULL != (stuff = zend_hash_str_find(_SERVER, "REQUEST_URI", sizeof("REQUEST_URI")-1))) {
+		stuff = zend_hash_str_find(_SERVER, ZEND_STRL("REQUEST_URI"));
+		if (stuff) {
 			path_info = Z_STRVAL_P(stuff);
 			code = Z_STRLEN_P(stuff);
 			if (code > basename_len && !memcmp(path_info, basename, basename_len)) {
 				ZVAL_STR(&temp, Z_STR_P(stuff));
 				ZVAL_STRINGL(stuff, path_info + basename_len, code - basename_len);
-				zend_hash_str_update(_SERVER, "PHAR_REQUEST_URI", sizeof("PHAR_REQUEST_URI")-1, &temp);
+				zend_hash_str_update(_SERVER, ZEND_STRL("PHAR_REQUEST_URI"), &temp);
 			}
 		}
 	}
 
 	if (PHAR_G(phar_SERVER_mung_list) & PHAR_MUNG_PHP_SELF) {
-		if (NULL != (stuff = zend_hash_str_find(_SERVER, "PHP_SELF", sizeof("PHP_SELF")-1))) {
+		stuff = zend_hash_str_find(_SERVER, ZEND_STRL("PHP_SELF"));
+		if (stuff) {
 			path_info = Z_STRVAL_P(stuff);
 			code = Z_STRLEN_P(stuff);
 
 			if (code > basename_len && !memcmp(path_info, basename, basename_len)) {
 				ZVAL_STR(&temp, Z_STR_P(stuff));
 				ZVAL_STRINGL(stuff, path_info + basename_len, code - basename_len);
-				zend_hash_str_update(_SERVER, "PHAR_PHP_SELF", sizeof("PHAR_PHP_SELF")-1, &temp);
+				zend_hash_str_update(_SERVER, ZEND_STRL("PHAR_PHP_SELF"), &temp);
 			}
 		}
 	}
 
 	if (PHAR_G(phar_SERVER_mung_list) & PHAR_MUNG_SCRIPT_NAME) {
-		if (NULL != (stuff = zend_hash_str_find(_SERVER, "SCRIPT_NAME", sizeof("SCRIPT_NAME")-1))) {
+		stuff = zend_hash_str_find(_SERVER, ZEND_STRL("SCRIPT_NAME"));
+		if (stuff) {
 			ZVAL_STR(&temp, Z_STR_P(stuff));
 			ZVAL_STRINGL(stuff, entry, entry_len);
-			zend_hash_str_update(_SERVER, "PHAR_SCRIPT_NAME", sizeof("PHAR_SCRIPT_NAME")-1, &temp);
+			zend_hash_str_update(_SERVER, ZEND_STRL("PHAR_SCRIPT_NAME"), &temp);
 		}
 	}
 
 	if (PHAR_G(phar_SERVER_mung_list) & PHAR_MUNG_SCRIPT_FILENAME) {
-		if (NULL != (stuff = zend_hash_str_find(_SERVER, "SCRIPT_FILENAME", sizeof("SCRIPT_FILENAME")-1))) {
+		stuff = zend_hash_str_find(_SERVER, ZEND_STRL("SCRIPT_FILENAME"));
+		if (stuff) {
 			zend_string *str = strpprintf(4096, "phar://%s%s", fname, entry);
 
 			ZVAL_STR(&temp, Z_STR_P(stuff));
 			ZVAL_NEW_STR(stuff, str);
 
-			zend_hash_str_update(_SERVER, "PHAR_SCRIPT_FILENAME", sizeof("PHAR_SCRIPT_FILENAME")-1, &temp);
+			zend_hash_str_update(_SERVER, ZEND_STRL("PHAR_SCRIPT_FILENAME"), &temp);
 		}
 	}
 }
@@ -321,10 +325,9 @@ static void phar_do_403(void) /* {{{ */
 static void phar_do_404(phar_archive_data *phar, char *fname, size_t fname_len, zend_string *f404) /* {{{ */
 {
 	sapi_header_line ctr = {0};
-	phar_entry_info	*info;
 
 	if (phar && f404 && ZSTR_LEN(f404)) {
-		info = phar_get_entry_info(phar, ZSTR_VAL(f404), ZSTR_LEN(f404), NULL, true);
+		phar_entry_info	*info = phar_get_entry_info(phar, ZSTR_VAL(f404), ZSTR_LEN(f404), NULL, true);
 
 		if (info) {
 			/* Status doesn't matter, we're exiting anyway. */
@@ -346,9 +349,10 @@ static void phar_do_404(phar_archive_data *phar, char *fname, size_t fname_len,
 /* post-process REQUEST_URI and retrieve the actual request URI.  This is for
    cases like http://localhost/blah.phar/path/to/file.php/extra/stuff
    which calls "blah.phar" file "path/to/file.php" with PATH_INFO "/extra/stuff" */
-static void phar_postprocess_ru_web(char *fname, size_t fname_len, char *entry, size_t *entry_len, char **ru, size_t *ru_len) /* {{{ */
+static void phar_postprocess_ru_web(const char *fname, size_t fname_len, char *entry, size_t *entry_len, char **ru, size_t *ru_len) /* {{{ */
 {
-	char *e = entry + 1, *u1 = NULL, *u = NULL, *saveu = NULL;
+	char *e = entry + 1;
+	char *u1 = NULL, *u = NULL, *saveu = NULL;
 	size_t e_len = *entry_len - 1, u_len = 0;
 	phar_archive_data *pphar;
 
@@ -405,33 +409,27 @@ static void phar_postprocess_ru_web(char *fname, size_t fname_len, char *entry,
  */
 PHP_METHOD(Phar, running)
 {
-	zend_string *fname;
-	char *arch;
-	size_t arch_len;
 	bool retphar = true;
 
 	if (zend_parse_parameters(ZEND_NUM_ARGS(), "|b", &retphar) == FAILURE) {
 		RETURN_THROWS();
 	}
 
-	fname = zend_get_executed_filename_ex();
+	const zend_string *fname = zend_get_executed_filename_ex();
 	if (!fname) {
 		RETURN_EMPTY_STRING();
 	}
 
-	if (
-		zend_string_starts_with_literal_ci(fname, "phar://")
-		&& SUCCESS == phar_split_fname(ZSTR_VAL(fname), ZSTR_LEN(fname), &arch, &arch_len, NULL, NULL, 2, 0)
-	) {
-		if (retphar) {
-			RETVAL_STRINGL(ZSTR_VAL(fname), arch_len + 7);
-			efree(arch);
-			return;
-		} else {
-			// TODO: avoid reallocation ???
-			RETVAL_STRINGL(arch, arch_len);
-			efree(arch);
-			return;
+	if (zend_string_starts_with_literal_ci(fname, "phar://")) {
+		zend_string *arch = phar_split_fname(ZSTR_VAL(fname), ZSTR_LEN(fname), NULL, 2, 0);
+		if (arch) {
+			if (retphar) {
+				RETVAL_STRINGL(ZSTR_VAL(fname), ZSTR_LEN(arch) + 7);
+				zend_string_release_ex(arch, false);
+				return;
+			} else {
+				RETURN_STR(arch);
+			}
 		}
 	}
 
@@ -446,8 +444,8 @@ PHP_METHOD(Phar, running)
  */
 PHP_METHOD(Phar, mount)
 {
-	char *fname, *arch = NULL, *entry = NULL, *path, *actual;
-	size_t fname_len, arch_len, entry_len;
+	char *fname, *path, *actual;
+	size_t fname_len;
 	size_t path_len, actual_len;
 	phar_archive_data *pphar;
 #ifdef PHP_WIN32
@@ -478,41 +476,39 @@ PHP_METHOD(Phar, mount)
 	}
 #endif
 
-	if (fname_len > 7 && !memcmp(fname, "phar://", 7) && SUCCESS == phar_split_fname(fname, fname_len, &arch, &arch_len, NULL, NULL, 2, 0)) {
-		entry = NULL;
-
+	zend_string *entry = NULL;
+	zend_string *arch = NULL;
+	if (fname_len > 7 && !memcmp(fname, "phar://", 7) && (arch = phar_split_fname(fname, fname_len, NULL, 2, 0))) {
 		if (path_len > 7 && !memcmp(path, "phar://", 7)) {
 			zend_throw_exception_ex(phar_ce_PharException, 0, "Can only mount internal paths within a phar archive, use a relative path instead of \"%s\"", path);
-			efree(arch);
+			zend_string_release_ex(arch, false);
 			goto finish;
 		}
 carry_on2:
-		if (NULL == (pphar = zend_hash_str_find_ptr(&(PHAR_G(phar_fname_map)), arch, arch_len))) {
-			if (PHAR_G(manifest_cached) && NULL != (pphar = zend_hash_str_find_ptr(&cached_phars, arch, arch_len))) {
+		pphar = zend_hash_find_ptr(&(PHAR_G(phar_fname_map)), arch);
+		if (!pphar) {
+			if (PHAR_G(manifest_cached) && NULL != (pphar = zend_hash_find_ptr(&cached_phars, arch))) {
 				if (SUCCESS == phar_copy_on_write(&pphar)) {
 					goto carry_on;
 				}
 			}
 
-			zend_throw_exception_ex(phar_ce_PharException, 0, "%s is not a phar archive, cannot mount", arch);
-
-			if (arch) {
-				efree(arch);
-			}
+			zend_throw_exception_ex(phar_ce_PharException, 0, "%s is not a phar archive, cannot mount", ZSTR_VAL(arch));
+			zend_string_release_ex(arch, false);
 
 			goto finish;
 		}
 carry_on:
 		if (SUCCESS != phar_mount_entry(pphar, actual, actual_len, path, path_len)) {
-			zend_throw_exception_ex(phar_ce_PharException, 0, "Mounting of %s to %s within phar %s failed", path, actual, arch);
+			zend_throw_exception_ex(phar_ce_PharException, 0, "Mounting of %s to %s within phar %s failed", path, actual, ZSTR_VAL(arch));
 		}
 
-		if (entry && path == entry) {
-			efree(entry);
+		if (entry && path == ZSTR_VAL(entry)) {
+			zend_string_release_ex(entry, false);
 		}
 
 		if (arch) {
-			efree(arch);
+			zend_string_release_ex(arch, false);
 		}
 
 		goto finish;
@@ -524,9 +520,9 @@ PHP_METHOD(Phar, mount)
 		}
 
 		goto carry_on;
-	} else if (SUCCESS == phar_split_fname(path, path_len, &arch, &arch_len, &entry, &entry_len, 2, 0)) {
-		path = entry;
-		path_len = entry_len;
+	} else if ((arch = phar_split_fname(path, path_len, &entry, 2, 0))) {
+		path = ZSTR_VAL(entry);
+		path_len = ZSTR_LEN(entry);
 		goto carry_on2;
 	}
 
@@ -553,8 +549,8 @@ PHP_METHOD(Phar, webPhar)
 	zval *mimeoverride = NULL;
 	zend_fcall_info rewrite_fci = {0};
 	zend_fcall_info_cache rewrite_fcc;
-	char *alias = NULL, *error, *index_php = NULL, *ru = NULL;
-	size_t alias_len = 0, free_pathinfo = 0;
+	char *error, *index_php = NULL, *ru = NULL;
+	size_t free_pathinfo = 0;
 	zend_string *f404 = NULL;
 	size_t ru_len = 0;
 	char *fname, *path_info, *mime_type = NULL, *entry, *pt;
@@ -566,14 +562,15 @@ PHP_METHOD(Phar, webPhar)
 	phar_entry_info *info = NULL;
 	size_t sapi_mod_name_len = strlen(sapi_module.name);
 	phar_action_status status = PHAR_ACT_DO_EXIT;
+	zend_string *alias = NULL;
 
-	if (zend_parse_parameters(ZEND_NUM_ARGS(), "|s!s!S!af!", &alias, &alias_len, &index_php, &index_php_len, &f404, &mimeoverride, &rewrite_fci, &rewrite_fcc) == FAILURE) {
+	if (zend_parse_parameters(ZEND_NUM_ARGS(), "|S!s!S!af!", &alias, &index_php, &index_php_len, &f404, &mimeoverride, &rewrite_fci, &rewrite_fcc) == FAILURE) {
 		RETURN_THROWS();
 	}
 
 	phar_request_initialize();
 
-	if (phar_open_executed_filename(alias, alias_len, &error) != SUCCESS) {
+	if (phar_open_executed_filename(alias, &error) != SUCCESS) {
 		if (error) {
 			zend_throw_exception_ex(phar_ce_PharException, 0, "%s", error);
 			efree(error);
@@ -650,7 +647,12 @@ PHP_METHOD(Phar, webPhar)
 
 		} else {
 			char *testit = sapi_getenv("SCRIPT_NAME", sizeof("SCRIPT_NAME")-1);
-			if (!(pt = strstr(testit, basename))) {
+			if (!testit) {
+				goto finish;
+			}
+
+			pt = strstr(testit, basename);
+			if (!pt) {
 				efree(testit);
 				goto finish;
 			}
@@ -676,7 +678,8 @@ PHP_METHOD(Phar, webPhar)
 	} else {
 		path_info = SG(request_info).request_uri;
 
-		if (!(pt = strstr(path_info, basename))) {
+		pt = strstr(path_info, basename);
+		if (!pt) {
 			/* this can happen with rewrite rules - and we have no idea what to do then, so return */
 			goto finish;
 		}
@@ -751,8 +754,8 @@ PHP_METHOD(Phar, webPhar)
 			entry_len = sizeof("/index.php")-1;
 		}
 
-		if (FAILURE == phar_get_archive(&phar, fname, fname_len, NULL, 0, NULL) ||
-			(info = phar_get_entry_info(phar, entry, entry_len, NULL, false)) == NULL) {
+		phar = phar_get_archive(fname, fname_len, NULL, 0, NULL);
+		if (!phar || (info = phar_get_entry_info(phar, entry, entry_len, NULL, false)) == NULL) {
 			phar_do_404(phar, fname, fname_len, f404);
 		} else {
 			char *tmp = NULL, sa = '\0';
@@ -792,8 +795,8 @@ PHP_METHOD(Phar, webPhar)
 		goto cleanup_skip_entry;
 	}
 
-	if (FAILURE == phar_get_archive(&phar, fname, fname_len, NULL, 0, NULL) ||
-		(info = phar_get_entry_info(phar, entry, entry_len, NULL, false)) == NULL) {
+	phar = phar_get_archive(fname, fname_len, NULL, 0, NULL);
+	if (!phar || (info = phar_get_entry_info(phar, entry, entry_len, NULL, false)) == NULL) {
 		phar_do_404(phar, fname, fname_len, f404);
 		goto cleanup;
 	}
@@ -945,17 +948,17 @@ PHP_METHOD(Phar, createDefaultStub)
 /* {{{ Reads the currently executed file (a phar) and registers its manifest */
 PHP_METHOD(Phar, mapPhar)
 {
-	char *alias = NULL, *error;
-	size_t alias_len = 0;
+	zend_string *alias = NULL;
+	char *error;
 	zend_long dataoffset = 0;
 
-	if (zend_parse_parameters(ZEND_NUM_ARGS(), "|s!l", &alias, &alias_len, &dataoffset) == FAILURE) {
+	if (zend_parse_parameters(ZEND_NUM_ARGS(), "|S!l", &alias, &dataoffset) == FAILURE) {
 		RETURN_THROWS();
 	}
 
 	phar_request_initialize();
 
-	RETVAL_BOOL(phar_open_executed_filename(alias, alias_len, &error) == SUCCESS);
+	RETVAL_BOOL(phar_open_executed_filename(alias, &error) == SUCCESS);
 
 	if (error) {
 		zend_throw_exception_ex(phar_ce_PharException, 0, "%s", error);
@@ -966,16 +969,17 @@ PHP_METHOD(Phar, mapPhar)
 /* {{{ Loads any phar archive with an alias */
 PHP_METHOD(Phar, loadPhar)
 {
-	char *fname, *alias = NULL, *error;
-	size_t fname_len, alias_len = 0;
+	zend_string *fname;
+	zend_string *alias = NULL;
+	char *error;
 
-	if (zend_parse_parameters(ZEND_NUM_ARGS(), "p|s!", &fname, &fname_len, &alias, &alias_len) == FAILURE) {
+	if (zend_parse_parameters(ZEND_NUM_ARGS(), "P|S!", &fname, &alias) == FAILURE) {
 		RETURN_THROWS();
 	}
 
 	phar_request_initialize();
 
-	RETVAL_BOOL(phar_open_from_filename(fname, fname_len, alias, alias_len, REPORT_ERRORS, NULL, &error) == SUCCESS);
+	RETVAL_BOOL(phar_open_from_filename(ZSTR_VAL(fname), ZSTR_LEN(fname), alias, REPORT_ERRORS, NULL, &error) == SUCCESS);
 
 	if (error) {
 		zend_throw_exception_ex(phar_ce_PharException, 0, "%s", error);
@@ -1080,9 +1084,9 @@ static const spl_other_handler phar_spl_foreign_handler = {
  */
 PHP_METHOD(Phar, __construct)
 {
-	char *fname, *alias = NULL, *error, *arch = NULL, *entry = NULL, *save_fname;
-	size_t fname_len, alias_len = 0;
-	size_t arch_len, entry_len;
+	zend_string *fname;
+	zend_string *alias = NULL;
+	char *error;
 	bool is_data;
 	zend_long flags = SPL_FILE_DIR_SKIPDOTS|SPL_FILE_DIR_UNIXPATHS;
 	zend_long format = 0;
@@ -1095,11 +1099,11 @@ PHP_METHOD(Phar, __construct)
 	is_data = instanceof_function(Z_OBJCE_P(ZEND_THIS), phar_ce_data);
 
 	if (is_data) {
-		if (zend_parse_parameters(ZEND_NUM_ARGS(), "p|ls!l", &fname, &fname_len, &flags, &alias, &alias_len, &format) == FAILURE) {
+		if (zend_parse_parameters(ZEND_NUM_ARGS(), "P|lS!l", &fname, &flags, &alias, &format) == FAILURE) {
 			RETURN_THROWS();
 		}
 	} else {
-		if (zend_parse_parameters(ZEND_NUM_ARGS(), "p|ls!", &fname, &fname_len, &flags, &alias, &alias_len) == FAILURE) {
+		if (zend_parse_parameters(ZEND_NUM_ARGS(), "P|lS!", &fname, &flags, &alias) == FAILURE) {
 			RETURN_THROWS();
 		}
 	}
@@ -1109,33 +1113,25 @@ PHP_METHOD(Phar, __construct)
 		RETURN_THROWS();
 	}
 
-	save_fname = fname;
-	if (SUCCESS == phar_split_fname(fname, fname_len, &arch, &arch_len, &entry, &entry_len, !is_data, 2)) {
+	zend_string *entry = NULL;
+	/* phar_split_fname() will unixify the path */
+	zend_string *arch = phar_split_fname(ZSTR_VAL(fname), ZSTR_LEN(fname), &entry, !is_data, 2);
+	if (arch) {
 		/* use arch (the basename for the archive) for fname instead of fname */
 		/* this allows support for RecursiveDirectoryIterator of subdirectories */
-#ifdef PHP_WIN32
-		phar_unixify_path_separators(arch, arch_len);
-#endif
 		fname = arch;
-		fname_len = arch_len;
-#ifdef PHP_WIN32
-	} else {
-		arch = estrndup(fname, fname_len);
-		arch_len = fname_len;
-		fname = arch;
-		phar_unixify_path_separators(arch, arch_len);
-#endif
 	}
 
-	if (phar_open_or_create_filename(fname, fname_len, alias, alias_len, is_data, REPORT_ERRORS, &phar_data, &error) == FAILURE) {
+	zend_result phar_status = phar_open_or_create_filename(fname, alias, is_data, REPORT_ERRORS, &phar_data, &error);
 
-		if (fname == arch && fname != save_fname) {
-			efree(arch);
-			fname = save_fname;
-		}
+	if (arch) {
+		zend_string_release_ex(arch, false);
+	}
+
+	if (phar_status == FAILURE) {
 
 		if (entry) {
-			efree(entry);
+			zend_string_release_ex(entry, false);
 		}
 
 		if (error) {
@@ -1155,11 +1151,6 @@ PHP_METHOD(Phar, __construct)
 		phar_data->is_tar = false;
 	}
 
-	if (fname == arch) {
-		efree(arch);
-		fname = save_fname;
-	}
-
 	if ((is_data && !phar_data->is_data) || (!is_data && phar_data->is_data)) {
 		if (is_data) {
 			zend_throw_exception_ex(spl_ce_UnexpectedValueException, 0,
@@ -1168,7 +1159,7 @@ PHP_METHOD(Phar, __construct)
 			zend_throw_exception_ex(spl_ce_UnexpectedValueException, 0,
 				"Phar class can only be used for executable tar and zip archives");
 		}
-		efree(entry);
+		zend_string_release_ex(entry, false);
 		RETURN_THROWS();
 	}
 
@@ -1181,20 +1172,29 @@ PHP_METHOD(Phar, __construct)
 	phar_obj->archive = phar_data;
 	phar_obj->spl.oth_handler = &phar_spl_foreign_handler;
 
+	zend_string *file_name_for_recursive_director_iterator_constructor;
 	if (entry) {
-		fname_len = spprintf(&fname, 0, "phar://%s%s", phar_data->fname, entry);
-		efree(entry);
+		file_name_for_recursive_director_iterator_constructor = zend_string_concat3(
+			ZEND_STRL("phar://"),
+			ZSTR_VAL(phar_data->fname), ZSTR_LEN(phar_data->fname),
+			ZSTR_VAL(entry), ZSTR_LEN(entry)
+		);
+		zend_string_release_ex(entry, false);
 	} else {
-		fname_len = spprintf(&fname, 0, "phar://%s", phar_data->fname);
+		file_name_for_recursive_director_iterator_constructor = zend_string_concat2(
+			ZEND_STRL("phar://"),
+			ZSTR_VAL(phar_data->fname), ZSTR_LEN(phar_data->fname)
+		);
 	}
 
-	ZVAL_STRINGL(&arg1, fname, fname_len);
+	ZVAL_STR(&arg1, file_name_for_recursive_director_iterator_constructor);
 	ZVAL_LONG(&arg2, flags);
 
 	zend_call_known_instance_method_with_2_params(spl_ce_RecursiveDirectoryIterator->constructor,
 		Z_OBJ_P(ZEND_THIS), NULL, &arg1, &arg2);
 
-	zval_ptr_dtor(&arg1);
+	/* Freeing arg1 */
+	zend_string_release_ex(file_name_for_recursive_director_iterator_constructor, false);
 
 	if (!phar_data->is_persistent) {
 		phar_obj->archive->is_data = is_data;
@@ -1204,7 +1204,6 @@ PHP_METHOD(Phar, __construct)
 	}
 
 	phar_obj->spl.info_class = phar_ce_entry;
-	efree(fname);
 }
 /* }}} */
 
@@ -1254,64 +1253,62 @@ PHP_METHOD(Phar, getSupportedCompression)
 /* {{{ Completely remove a phar archive from memory and disk */
 PHP_METHOD(Phar, unlinkArchive)
 {
-	char *fname, *error, *arch;
-	size_t fname_len;
-	size_t arch_len;
+	char *error;
+	zend_string *fname;
 	phar_archive_data *phar;
 
-	if (zend_parse_parameters(ZEND_NUM_ARGS(), "p", &fname, &fname_len) == FAILURE) {
+	if (zend_parse_parameters(ZEND_NUM_ARGS(), "P", &fname) == FAILURE) {
 		RETURN_THROWS();
 	}
 
-	if (!fname_len) {
+	if (ZSTR_LEN(fname) == 0) {
 		zend_throw_exception_ex(phar_ce_PharException, 0, "Unknown phar archive \"\"");
 		RETURN_THROWS();
 	}
 
-	if (FAILURE == phar_open_from_filename(fname, fname_len, NULL, 0, REPORT_ERRORS, &phar, &error)) {
+	if (FAILURE == phar_open_from_filename(ZSTR_VAL(fname), ZSTR_LEN(fname), NULL, REPORT_ERRORS, &phar, &error)) {
 		if (error) {
-			zend_throw_exception_ex(phar_ce_PharException, 0, "Unknown phar archive \"%s\": %s", fname, error);
+			zend_throw_exception_ex(phar_ce_PharException, 0, "Unknown phar archive \"%s\": %s", ZSTR_VAL(fname), error);
 			efree(error);
 		} else {
-			zend_throw_exception_ex(phar_ce_PharException, 0, "Unknown phar archive \"%s\"", fname);
+			zend_throw_exception_ex(phar_ce_PharException, 0, "Unknown phar archive \"%s\"", ZSTR_VAL(fname));
 		}
 		RETURN_THROWS();
 	}
 
-	zend_string *zend_file_name = zend_get_executed_filename_ex();
-
-	if (
-		zend_file_name
-		&& zend_string_starts_with_literal_ci(zend_file_name, "phar://")
-		&& SUCCESS == phar_split_fname(ZSTR_VAL(zend_file_name), ZSTR_LEN(zend_file_name), &arch, &arch_len, NULL, NULL, 2, 0)
-	) {
-		if (arch_len == fname_len && !memcmp(arch, fname, arch_len)) {
-			zend_throw_exception_ex(phar_ce_PharException, 0, "phar archive \"%s\" cannot be unlinked from within itself", fname);
-			efree(arch);
-			RETURN_THROWS();
+	const zend_string *zend_file_name = zend_get_executed_filename_ex();
+	if (zend_file_name && zend_string_starts_with_literal_ci(zend_file_name, "phar://")) {
+		zend_string *arch = phar_split_fname(ZSTR_VAL(zend_file_name), ZSTR_LEN(zend_file_name), NULL, 2, 0);
+		if (arch) {
+			if (zend_string_equals(arch, fname)) {
+				zend_string_release_ex(arch, false);
+				zend_throw_exception_ex(phar_ce_PharException, 0, "phar archive \"%s\" cannot be unlinked from within itself", ZSTR_VAL(fname));
+				RETURN_THROWS();
+			}
+			zend_string_release_ex(arch, false);
 		}
-		efree(arch);
 	}
 
 	if (phar->is_persistent) {
-		zend_throw_exception_ex(phar_ce_PharException, 0, "phar archive \"%s\" is in phar.cache_list, cannot unlinkArchive()", fname);
+		zend_throw_exception_ex(phar_ce_PharException, 0, "phar archive \"%s\" is in phar.cache_list, cannot unlinkArchive()", ZSTR_VAL(fname));
 		RETURN_THROWS();
 	}
 
 	if (phar->refcount) {
-		zend_throw_exception_ex(phar_ce_PharException, 0, "phar archive \"%s\" has open file handles or objects.  fclose() all file handles, and unset() all objects prior to calling unlinkArchive()", fname);
+		zend_throw_exception_ex(phar_ce_PharException, 0, "phar archive \"%s\" has open file handles or objects.  fclose() all file handles, and unset() all objects prior to calling unlinkArchive()", ZSTR_VAL(fname));
 		RETURN_THROWS();
 	}
 
-	fname = estrndup(phar->fname, phar->fname_len);
+	fname = zend_string_copy(phar->fname);
 
 	/* invalidate phar cache */
 	PHAR_G(last_phar) = NULL;
-	PHAR_G(last_phar_name) = PHAR_G(last_alias) = NULL;
+	PHAR_G(last_alias) = NULL;
+	PHAR_G(last_phar_name) = NULL;
 
 	phar_archive_delref(phar);
-	unlink(fname);
-	efree(fname);
+	unlink(ZSTR_VAL(fname));
+	zend_string_release(fname);
 	RETURN_TRUE;
 }
 /* }}} */
@@ -1347,7 +1344,7 @@ static zend_always_inline void phar_call_method_with_unwrap(zend_object *obj, co
 }
 
 /* This is the same as phar_get_or_create_entry_data(), but allows overriding metadata via SplFileInfo. */
-static phar_entry_data *phar_build_entry_data(char *fname, size_t fname_len, char *path, size_t path_len, char **error, zval *file_info)
+static phar_entry_data *phar_build_entry_data(zend_string *fname, char *path, size_t path_len, char **error, zval *file_info)
 {
 	uint32_t timestamp;
 
@@ -1373,7 +1370,7 @@ static phar_entry_data *phar_build_entry_data(char *fname, size_t fname_len, cha
 		timestamp = time(NULL);
 	}
 
-	return phar_get_or_create_entry_data(fname, fname_len, path, path_len, "w+b", 0, error, true, timestamp);
+	return phar_get_or_create_entry_data(fname, path, path_len, "w+b", 0, error, true, timestamp);
 }
 
 static int phar_build(zend_object_iterator *iter, void *puser) /* {{{ */
@@ -1636,7 +1633,8 @@ static int phar_build(zend_object_iterator *iter, void *puser) /* {{{ */
 		return ZEND_HASH_APPLY_KEEP;
 	}
 
-	if (!(data = phar_build_entry_data(phar_obj->archive->fname, phar_obj->archive->fname_len, str_key, str_key_len, &error, value))) {
+	data = phar_build_entry_data(phar_obj->archive->fname, str_key, str_key_len, &error, value);
+	if (!data) {
 		zend_throw_exception_ex(spl_ce_BadMethodCallException, 0, "Entry %s cannot be created: %s", str_key, error);
 		efree(error);
 
@@ -1659,9 +1657,6 @@ static int phar_build(zend_object_iterator *iter, void *puser) /* {{{ */
 		return ZEND_HASH_APPLY_STOP;
 
 	} else {
-		if (error) {
-			efree(error);
-		}
 		/* convert to PHAR_UFP */
 		if (data->internal_file->fp_type == PHAR_MOD) {
 			php_stream_close(data->internal_file->fp);
@@ -1770,7 +1765,7 @@ PHP_METHOD(Phar, buildFromDirectory)
 		if (apply_reg) {
 			zval_ptr_dtor(®exiter);
 		}
-		zend_throw_exception_ex(phar_ce_PharException, 0, "phar \"%s\" unable to create temporary file", phar_obj->archive->fname);
+		zend_throw_exception_ex(phar_ce_PharException, 0, "phar \"%s\" unable to create temporary file", ZSTR_VAL(phar_obj->archive->fname));
 		RETURN_THROWS();
 	}
 
@@ -1780,7 +1775,7 @@ PHP_METHOD(Phar, buildFromDirectory)
 			zval_ptr_dtor(®exiter);
 		}
 		php_stream_close(pass.fp);
-		zend_throw_exception_ex(phar_ce_PharException, 0, "phar \"%s\" is persistent, unable to copy on write", phar_obj->archive->fname);
+		zend_throw_exception_ex(phar_ce_PharException, 0, "phar \"%s\" is persistent, unable to copy on write", ZSTR_VAL(phar_obj->archive->fname));
 		RETURN_THROWS();
 	}
 
@@ -1838,7 +1833,7 @@ PHP_METHOD(Phar, buildFromIterator)
 	}
 
 	if (phar_obj->archive->is_persistent && FAILURE == phar_copy_on_write(&(phar_obj->archive))) {
-		zend_throw_exception_ex(phar_ce_PharException, 0, "phar \"%s\" is persistent, unable to copy on write", phar_obj->archive->fname);
+		zend_throw_exception_ex(phar_ce_PharException, 0, "phar \"%s\" is persistent, unable to copy on write", ZSTR_VAL(phar_obj->archive->fname));
 		RETURN_THROWS();
 	}
 
@@ -1851,7 +1846,7 @@ PHP_METHOD(Phar, buildFromIterator)
 	pass.count = 0;
 	pass.fp = php_stream_fopen_tmpfile();
 	if (pass.fp == NULL) {
-		zend_throw_exception_ex(phar_ce_PharException, 0, "phar \"%s\": unable to create temporary file", phar_obj->archive->fname);
+		zend_throw_exception_ex(phar_ce_PharException, 0, "phar \"%s\": unable to create temporary file", ZSTR_VAL(phar_obj->archive->fname));
 		RETURN_THROWS();
 	}
 
@@ -1915,16 +1910,16 @@ static zend_result phar_copy_file_contents(phar_entry_info *entry, php_stream *f
 	char *error;
 	zend_off_t offset;
 
-	ZEND_ASSERT(!entry->link);
+	ZEND_ASSERT(!entry->symlink);
 
 	if (FAILURE == phar_open_entry_fp(entry, &error, true)) {
 		if (error) {
 			zend_throw_exception_ex(spl_ce_UnexpectedValueException, 0,
-				"Cannot convert phar archive \"%s\", unable to open entry \"%s\" contents: %s", entry->phar->fname, ZSTR_VAL(entry->filename), error);
+				"Cannot convert phar archive \"%s\", unable to open entry \"%s\" contents: %s", ZSTR_VAL(entry->phar->fname), ZSTR_VAL(entry->filename), error);
 			efree(error);
 		} else {
 			zend_throw_exception_ex(spl_ce_UnexpectedValueException, 0,
-				"Cannot convert phar archive \"%s\", unable to open entry \"%s\" contents", entry->phar->fname, ZSTR_VAL(entry->filename));
+				"Cannot convert phar archive \"%s\", unable to open entry \"%s\" contents", ZSTR_VAL(entry->phar->fname), ZSTR_VAL(entry->filename));
 		}
 		return FAILURE;
 	}
@@ -1934,7 +1929,7 @@ static zend_result phar_copy_file_contents(phar_entry_info *entry, php_stream *f
 	offset = php_stream_tell(fp);
 	if (SUCCESS != php_stream_copy_to_stream_ex(phar_get_efp(entry, false), fp, entry->uncompressed_filesize, NULL)) {
 		zend_throw_exception_ex(spl_ce_UnexpectedValueException, 0,
-			"Cannot convert phar archive \"%s\", unable to copy entry \"%s\" contents", entry->phar->fname, ZSTR_VAL(entry->filename));
+			"Cannot convert phar archive \"%s\", unable to copy entry \"%s\" contents", ZSTR_VAL(entry->phar->fname), ZSTR_VAL(entry->filename));
 		return FAILURE;
 	}
 
@@ -1947,17 +1942,15 @@ static zend_result phar_copy_file_contents(phar_entry_info *entry, php_stream *f
 
 static zend_object *phar_rename_archive(phar_archive_data **sphar, char *ext) /* {{{ */
 {
-	const char *oldname = NULL;
 	phar_archive_data *phar = *sphar;
-	char *oldpath = NULL;
 	char *basename = NULL, *basepath = NULL;
-	char *newname = NULL, *newpath = NULL;
+	char *newname = NULL;
 	zval ret, arg1;
 	zend_class_entry *ce;
 	char *error = NULL;
 	const char *pcr_error;
 	size_t ext_len = ext ? strlen(ext) : 0;
-	size_t new_len, oldname_len, phar_ext_len;
+	size_t phar_ext_len;
 	phar_archive_data *pphar = NULL;
 	php_stream_statbuf ssb;
 
@@ -2029,34 +2022,38 @@ static zend_object *phar_rename_archive(phar_archive_data **sphar, char *ext) /*
 	} else if (phar_path_check(&ext, &ext_len, &pcr_error) > pcr_is_ok) {
 
 		if (phar->is_data) {
-			zend_throw_exception_ex(spl_ce_BadMethodCallException, 0, "data phar converted from \"%s\" has invalid extension %s", phar->fname, ext);
+			zend_throw_exception_ex(spl_ce_BadMethodCallException, 0, "data phar converted from \"%s\" has invalid extension %s", ZSTR_VAL(phar->fname), ext);
 		} else {
-			zend_throw_exception_ex(spl_ce_BadMethodCallException, 0, "phar converted from \"%s\" has invalid extension %s", phar->fname, ext);
+			zend_throw_exception_ex(spl_ce_BadMethodCallException, 0, "phar converted from \"%s\" has invalid extension %s", ZSTR_VAL(phar->fname), ext);
 		}
 		return NULL;
 	}
 
 
-	oldpath = estrndup(phar->fname, phar->fname_len);
-	if ((oldname = zend_memrchr(phar->fname, '/', phar->fname_len))) {
-		++oldname;
+	zend_string *old_path = zend_string_copy(phar->fname);
+
+	const char *old_name = zend_memrchr(ZSTR_VAL(phar->fname), '/', ZSTR_LEN(phar->fname));
+	size_t old_name_len;
+	if (old_name) {
+		++old_name;
+		old_name_len = strlen(old_name);
 	} else {
-		oldname = phar->fname;
+		old_name = ZSTR_VAL(phar->fname);
+		old_name_len = ZSTR_LEN(phar->fname);
 	}
 
-	oldname_len = strlen(oldname);
 	/* Copy the old name to create base for the new name */
-	basename = estrndup(oldname, oldname_len);
+	basename = estrndup(old_name, old_name_len);
 
 	phar_ext_list_len = sizeof(phar_ext_list)/sizeof(phar_ext_list[0]);
 	/* Remove possible PHAR extensions */
 	/* phar_ext_list must be in order of longest extension to shortest */
 	for (i=0; i < phar_ext_list_len; i++) {
 		phar_ext_len = strlen(phar_ext_list[i]);
-		if (phar_ext_len && oldname_len > phar_ext_len) {
+		if (phar_ext_len && old_name_len > phar_ext_len) {
 			/* Check if the basename strings ends with the extension */
-			if (memcmp(phar_ext_list[i], basename + (oldname_len - phar_ext_len), phar_ext_len) == 0) {
-				ext_pos = basename + (oldname_len - phar_ext_len);
+			if (memcmp(phar_ext_list[i], basename + (old_name_len - phar_ext_len), phar_ext_len) == 0) {
+				ext_pos = basename + (old_name_len - phar_ext_len);
 				ext_pos[0] = '\0';
 				break;
 			}
@@ -2080,21 +2077,21 @@ static zend_object *phar_rename_archive(phar_archive_data **sphar, char *ext) /*
 	spprintf(&newname, 0, "%s.%s", basename, ext);
 	efree(basename);
 
-	basepath = estrndup(oldpath, (strlen(oldpath) - oldname_len));
-	new_len = spprintf(&newpath, 0, "%s%s", basepath, newname);
-	phar->fname_len = new_len;
+	basepath = estrndup(ZSTR_VAL(old_path), (ZSTR_LEN(old_path) - old_name_len));
+
+	zend_string *newpath = strpprintf(0, "%s%s", basepath, newname);
+	phar->ext = ZSTR_VAL(newpath) + ZSTR_LEN(newpath) - strlen(ext) - 1;
 	phar->fname = newpath;
-	phar->ext = newpath + phar->fname_len - strlen(ext) - 1;
 	efree(basepath);
 	efree(newname);
 
-	if (PHAR_G(manifest_cached) && NULL != (pphar = zend_hash_str_find_ptr(&cached_phars, newpath, phar->fname_len))) {
-		zend_throw_exception_ex(spl_ce_BadMethodCallException, 0, "Unable to add newly converted phar \"%s\" to the list of phars, new phar name is in phar.cache_list", phar->fname);
+	if (PHAR_G(manifest_cached) && NULL != (pphar = zend_hash_find_ptr(&cached_phars, newpath))) {
+		zend_throw_exception_ex(spl_ce_BadMethodCallException, 0, "Unable to add newly converted phar \"%s\" to the list of phars, new phar name is in phar.cache_list", ZSTR_VAL(phar->fname));
 		goto err_oldpath;
 	}
 
-	if (NULL != (pphar = zend_hash_str_find_ptr(&(PHAR_G(phar_fname_map)), newpath, phar->fname_len))) {
-		if (pphar->fname_len == phar->fname_len && !memcmp(pphar->fname, phar->fname, phar->fname_len)) {
+	if (NULL != (pphar = zend_hash_find_ptr(&(PHAR_G(phar_fname_map)), newpath))) {
+		if (zend_string_equals(pphar->fname, phar->fname)) {
 			if (!zend_hash_num_elements(&phar->manifest)) {
 				pphar->is_tar = phar->is_tar;
 				pphar->is_zip = phar->is_zip;
@@ -2109,22 +2106,22 @@ static zend_object *phar_rename_archive(phar_archive_data **sphar, char *ext) /*
 				phar = pphar;
 				/* NOTE: this phar is now reused, so the refcount must be increased. */
 				phar->refcount++;
-				newpath = oldpath;
+				newpath = old_path;
 				goto its_ok;
 			}
 		}
 
-		zend_throw_exception_ex(spl_ce_BadMethodCallException, 0, "Unable to add newly converted phar \"%s\" to the list of phars, a phar with that name already exists", phar->fname);
+		zend_throw_exception_ex(spl_ce_BadMethodCallException, 0, "Unable to add newly converted phar \"%s\" to the list of phars, a phar with that name already exists", ZSTR_VAL(phar->fname));
 		goto err_oldpath;
 	}
 its_ok:
-	if (SUCCESS == php_stream_stat_path(newpath, &ssb)) {
-		zend_throw_exception_ex(spl_ce_BadMethodCallException, 0, "phar \"%s\" exists and must be unlinked prior to conversion", newpath);
+	if (SUCCESS == php_stream_stat_path(ZSTR_VAL(newpath), &ssb)) {
+		zend_throw_exception_ex(spl_ce_BadMethodCallException, 0, "phar \"%s\" exists and must be unlinked prior to conversion", ZSTR_VAL(newpath));
 		goto err_reused_oldpath;
 	}
 	if (!phar->is_data) {
-		if (SUCCESS != phar_detect_phar_fname_ext(newpath, phar->fname_len, (const char **) &(phar->ext), &ext_len, 1, 1, true)) {
-			zend_throw_exception_ex(spl_ce_BadMethodCallException, 0, "phar \"%s\" has invalid extension %s", phar->fname, ext);
+		if (SUCCESS != phar_detect_phar_fname_ext(ZSTR_VAL(newpath), ZSTR_LEN(newpath), &(phar->ext), &ext_len, 1, 1, true)) {
+			zend_throw_exception_ex(spl_ce_BadMethodCallException, 0, "phar \"%s\" has invalid extension %s", ZSTR_VAL(phar->fname), ext);
 			goto err_reused_oldpath;
 		}
 		phar->ext_len = ext_len;
@@ -2137,17 +2134,17 @@ static zend_object *phar_rename_archive(phar_archive_data **sphar, char *ext) /*
 				phar->alias = NULL;
 				phar->alias_len = 0;
 			} else {
-				phar->alias = pestrndup(newpath, strlen(newpath), phar->is_persistent);
-				phar->alias_len = strlen(newpath);
+				phar->alias = pestrndup(ZSTR_VAL(newpath), ZSTR_LEN(newpath), phar->is_persistent);
+				phar->alias_len = ZSTR_LEN(newpath);
 				phar->is_temporary_alias = 1;
-				zend_hash_str_update_ptr(&(PHAR_G(phar_alias_map)), newpath, phar->fname_len, phar);
+				zend_hash_update_ptr(&(PHAR_G(phar_alias_map)), newpath, phar);
 			}
 		}
 
 	} else {
 
-		if (SUCCESS != phar_detect_phar_fname_ext(newpath, phar->fname_len, (const char **) &(phar->ext), &ext_len, 0, 1, true)) {
-			zend_throw_exception_ex(spl_ce_BadMethodCallException, 0, "data phar \"%s\" has invalid extension %s", phar->fname, ext);
+		if (SUCCESS != phar_detect_phar_fname_ext(ZSTR_VAL(newpath), ZSTR_LEN(newpath), &(phar->ext), &ext_len, 0, 1, true)) {
+			zend_throw_exception_ex(spl_ce_BadMethodCallException, 0, "data phar \"%s\" has invalid extension %s", ZSTR_VAL(phar->fname), ext);
 			goto err_reused_oldpath;
 		}
 		phar->ext_len = ext_len;
@@ -2159,22 +2156,22 @@ static zend_object *phar_rename_archive(phar_archive_data **sphar, char *ext) /*
 		}
 	}
 
-	if ((!pphar || phar == pphar) && NULL == zend_hash_str_update_ptr(&(PHAR_G(phar_fname_map)), newpath, phar->fname_len, phar)) {
-		zend_throw_exception_ex(spl_ce_BadMethodCallException, 0, "Unable to add newly converted phar \"%s\" to the list of phars", phar->fname);
+	if ((!pphar || phar == pphar) && NULL == zend_hash_update_ptr(&(PHAR_G(phar_fname_map)), newpath, phar)) {
+		zend_throw_exception_ex(spl_ce_BadMethodCallException, 0, "Unable to add newly converted phar \"%s\" to the list of phars", ZSTR_VAL(phar->fname));
 		goto err_oldpath;
 	}
 
 	phar_flush_ex(phar, NULL, true, &error);
 
 	if (error) {
-		zend_hash_str_del(&(PHAR_G(phar_fname_map)), newpath, phar->fname_len);
+		zend_hash_del(&(PHAR_G(phar_fname_map)), newpath);
 		*sphar = NULL;
 		zend_throw_exception_ex(spl_ce_BadMethodCallException, 0, "%s", error);
 		efree(error);
 		goto err_oldpath;
 	}
 
-	efree(oldpath);
+	zend_string_release(old_path);
 
 	if (phar->is_data) {
 		ce = phar_ce_data;
@@ -2182,9 +2179,8 @@ static zend_object *phar_rename_archive(phar_archive_data **sphar, char *ext) /*
 		ce = phar_ce_archive;
 	}
 
-	ZVAL_STRINGL(&arg1, phar->fname, phar->fname_len);
+	ZVAL_STR(&arg1, phar->fname);
 	zend_result result = object_init_with_constructor(&ret, ce, 1, &arg1, NULL);
-	zval_ptr_dtor_str(&arg1);
 	if (SUCCESS != result) {
 		return NULL;
 	}
@@ -2197,7 +2193,7 @@ static zend_object *phar_rename_archive(phar_archive_data **sphar, char *ext) /*
 	}
 	/* fallthrough */
 err_oldpath:
-	efree(oldpath);
+	zend_string_release(old_path);
 	return NULL;
 }
 /* }}} */
@@ -2210,7 +2206,8 @@ static zend_object *phar_convert_to_other(phar_archive_data *source, int convert
 
 	/* invalidate phar cache */
 	PHAR_G(last_phar) = NULL;
-	PHAR_G(last_phar_name) = PHAR_G(last_alias) = NULL;
+	PHAR_G(last_alias) = NULL;
+	PHAR_G(last_phar_name) = NULL;
 
 	php_stream *tmp_fp = php_stream_fopen_tmpfile();
 	if (tmp_fp == NULL) {
@@ -2244,7 +2241,6 @@ static zend_object *phar_convert_to_other(phar_archive_data *source, int convert
 
 	phar->fp = tmp_fp;
 	phar->fname = source->fname;
-	phar->fname_len = source->fname_len;
 	phar->is_temporary_alias = source->is_temporary_alias;
 	phar->alias = source->alias;
 
@@ -2255,8 +2251,8 @@ static zend_object *phar_convert_to_other(phar_archive_data *source, int convert
 
 		newentry = *entry;
 
-		if (newentry.link) {
-			newentry.link = estrdup(newentry.link);
+		if (newentry.symlink) {
+			zend_string_addref(newentry.symlink);
 			goto no_copy;
 		}
 
@@ -2314,7 +2310,7 @@ static zend_object *phar_convert_to_other(phar_archive_data *source, int convert
 			if (phar->fname != source->fname) {
 				/* Depending on when phar_rename_archive() errors, the new filename
 				 * may have already been assigned or it may still be the old one. */
-				efree(phar->fname);
+				zend_string_release(phar->fname);
 			}
 			efree(phar);
 		}
@@ -2576,7 +2572,7 @@ PHP_METHOD(Phar, isWritable)
 		RETURN_FALSE;
 	}
 
-	if (SUCCESS != php_stream_stat_path(phar_obj->archive->fname, &ssb)) {
+	if (SUCCESS != php_stream_stat_path(ZSTR_VAL(phar_obj->archive->fname), &ssb)) {
 		/* assume it works if the file doesn't exist yet */
 		RETURN_BOOL(phar_obj->archive->is_brandnew);
 	}
@@ -2605,7 +2601,7 @@ PHP_METHOD(Phar, delete)
 	}
 
 	if (phar_obj->archive->is_persistent && FAILURE == phar_copy_on_write(&(phar_obj->archive))) {
-		zend_throw_exception_ex(phar_ce_PharException, 0, "phar \"%s\" is persistent, unable to copy on write", phar_obj->archive->fname);
+		zend_throw_exception_ex(phar_ce_PharException, 0, "phar \"%s\" is persistent, unable to copy on write", ZSTR_VAL(phar_obj->archive->fname));
 		RETURN_THROWS();
 	}
 	if (NULL != (entry = zend_hash_find_ptr(&phar_obj->archive->manifest, file_name))) {
@@ -2640,7 +2636,7 @@ PHP_METHOD(Phar, getAlias)
 
 	PHAR_ARCHIVE_OBJECT();
 
-	if (phar_obj->archive->alias && phar_obj->archive->alias != phar_obj->archive->fname) {
+	if (phar_obj->archive->alias) {
 		RETURN_STRINGL(phar_obj->archive->alias, phar_obj->archive->alias_len);
 	}
 }
@@ -2653,7 +2649,7 @@ PHP_METHOD(Phar, getPath)
 
 	PHAR_ARCHIVE_OBJECT();
 
-	RETURN_STRINGL(phar_obj->archive->fname, phar_obj->archive->fname_len);
+	RETURN_STR_COPY(phar_obj->archive->fname);
 }
 /* }}} */
 
@@ -2682,7 +2678,8 @@ PHP_METHOD(Phar, setAlias)
 
 	/* invalidate phar cache */
 	PHAR_G(last_phar) = NULL;
-	PHAR_G(last_phar_name) = PHAR_G(last_alias) = NULL;
+	PHAR_G(last_alias) = NULL;
+	PHAR_G(last_phar_name) = NULL;
 
 	if (phar_obj->archive->is_data) {
 		if (phar_obj->archive->is_tar) {
@@ -2699,17 +2696,17 @@ PHP_METHOD(Phar, setAlias)
 		RETURN_TRUE;
 	}
 	if (NULL != (fd_ptr = zend_hash_find_ptr(&(PHAR_G(phar_alias_map)), new_alias))) {
-		if (SUCCESS != phar_free_alias(fd_ptr, ZSTR_VAL(new_alias), ZSTR_LEN(new_alias))) {
-			zend_throw_exception_ex(phar_ce_PharException, 0, "alias \"%s\" is already used for archive \"%s\" and cannot be used for other archives", ZSTR_VAL(new_alias), fd_ptr->fname);
+		if (SUCCESS != phar_free_alias(fd_ptr)) {
+			zend_throw_exception_ex(phar_ce_PharException, 0, "alias \"%s\" is already used for archive \"%s\" and cannot be used for other archives", ZSTR_VAL(new_alias), ZSTR_VAL(fd_ptr->fname));
 			RETURN_THROWS();
 		}
 	} else if (!phar_validate_alias(ZSTR_VAL(new_alias), ZSTR_LEN(new_alias))) {
 		zend_throw_exception_ex(spl_ce_UnexpectedValueException, 0,
-			"Invalid alias \"%s\" specified for phar \"%s\"", ZSTR_VAL(new_alias), phar_obj->archive->fname);
+			"Invalid alias \"%s\" specified for phar \"%s\"", ZSTR_VAL(new_alias), ZSTR_VAL(phar_obj->archive->fname));
 		RETURN_THROWS();
 	}
 	if (phar_obj->archive->is_persistent && FAILURE == phar_copy_on_write(&(phar_obj->archive))) {
-		zend_throw_exception_ex(phar_ce_PharException, 0, "phar \"%s\" is persistent, unable to copy on write", phar_obj->archive->fname);
+		zend_throw_exception_ex(phar_ce_PharException, 0, "phar \"%s\" is persistent, unable to copy on write", ZSTR_VAL(phar_obj->archive->fname));
 		RETURN_THROWS();
 	}
 	if (phar_obj->archive->alias_len && NULL != (fd_ptr = zend_hash_str_find_ptr(&(PHAR_G(phar_alias_map)), phar_obj->archive->alias, phar_obj->archive->alias_len))) {
@@ -2854,7 +2851,7 @@ PHP_METHOD(Phar, setStub)
 
 		if ((php_stream_from_zval_no_verify(stream, zstub)) != NULL) {
 			if (phar_obj->archive->is_persistent && FAILURE == phar_copy_on_write(&(phar_obj->archive))) {
-				zend_throw_exception_ex(phar_ce_PharException, 0, "phar \"%s\" is persistent, unable to copy on write", phar_obj->archive->fname);
+				zend_throw_exception_ex(phar_ce_PharException, 0, "phar \"%s\" is persistent, unable to copy on write", ZSTR_VAL(phar_obj->archive->fname));
 				RETURN_THROWS();
 			}
 
@@ -2866,7 +2863,7 @@ PHP_METHOD(Phar, setStub)
 			}
 
 			if (stub_file_content == NULL) {
-				zend_throw_exception_ex(phar_ce_PharException, 0, "unable to read resource to copy stub to new phar \"%s\"", phar_obj->archive->fname);
+				zend_throw_exception_ex(phar_ce_PharException, 0, "unable to read resource to copy stub to new phar \"%s\"", ZSTR_VAL(phar_obj->archive->fname));
 				RETURN_THROWS();
 			}
 
@@ -2884,7 +2881,7 @@ PHP_METHOD(Phar, setStub)
 		}
 	} else if (zend_parse_parameters(ZEND_NUM_ARGS(), "S", &stub) == SUCCESS) {
 		if (phar_obj->archive->is_persistent && FAILURE == phar_copy_on_write(&(phar_obj->archive))) {
-			zend_throw_exception_ex(phar_ce_PharException, 0, "phar \"%s\" is persistent, unable to copy on write", phar_obj->archive->fname);
+			zend_throw_exception_ex(phar_ce_PharException, 0, "phar \"%s\" is persistent, unable to copy on write", ZSTR_VAL(phar_obj->archive->fname));
 			RETURN_THROWS();
 		}
 		phar_flush_ex(phar_obj->archive, stub, /* is_default_stub */ false, &error);
@@ -2965,7 +2962,7 @@ PHP_METHOD(Phar, setDefaultStub)
 	}
 
 	if (phar_obj->archive->is_persistent && FAILURE == phar_copy_on_write(&(phar_obj->archive))) {
-		zend_throw_exception_ex(phar_ce_PharException, 0, "phar \"%s\" is persistent, unable to copy on write", phar_obj->archive->fname);
+		zend_throw_exception_ex(phar_ce_PharException, 0, "phar \"%s\" is persistent, unable to copy on write", ZSTR_VAL(phar_obj->archive->fname));
 		RETURN_THROWS();
 	}
 	phar_flush_ex(phar_obj->archive, stub, /* is_default_stub */ true, &error);
@@ -3016,7 +3013,7 @@ PHP_METHOD(Phar, setSignatureAlgorithm)
 		case PHAR_SIG_OPENSSL_SHA256:
 		case PHAR_SIG_OPENSSL_SHA512:
 			if (phar_obj->archive->is_persistent && FAILURE == phar_copy_on_write(&(phar_obj->archive))) {
-				zend_throw_exception_ex(phar_ce_PharException, 0, "phar \"%s\" is persistent, unable to copy on write", phar_obj->archive->fname);
+				zend_throw_exception_ex(phar_ce_PharException, 0, "phar \"%s\" is persistent, unable to copy on write", ZSTR_VAL(phar_obj->archive->fname));
 				RETURN_THROWS();
 			}
 			phar_obj->archive->sig_flags = (uint32_t)algo;
@@ -3326,7 +3323,7 @@ PHP_METHOD(Phar, compressFiles)
 	}
 
 	if (phar_obj->archive->is_persistent && FAILURE == phar_copy_on_write(&(phar_obj->archive))) {
-		zend_throw_exception_ex(phar_ce_PharException, 0, "phar \"%s\" is persistent, unable to copy on write", phar_obj->archive->fname);
+		zend_throw_exception_ex(phar_ce_PharException, 0, "phar \"%s\" is persistent, unable to copy on write", ZSTR_VAL(phar_obj->archive->fname));
 		RETURN_THROWS();
 	}
 	pharobj_set_compression(&phar_obj->archive->manifest, flags);
@@ -3365,7 +3362,7 @@ PHP_METHOD(Phar, decompressFiles)
 		RETURN_TRUE;
 	} else {
 		if (phar_obj->archive->is_persistent && FAILURE == phar_copy_on_write(&(phar_obj->archive))) {
-			zend_throw_exception_ex(phar_ce_PharException, 0, "phar \"%s\" is persistent, unable to copy on write", phar_obj->archive->fname);
+			zend_throw_exception_ex(phar_ce_PharException, 0, "phar \"%s\" is persistent, unable to copy on write", ZSTR_VAL(phar_obj->archive->fname));
 			RETURN_THROWS();
 		}
 		pharobj_set_compression(&phar_obj->archive->manifest, PHAR_ENT_COMPRESSED_NONE);
@@ -3388,7 +3385,7 @@ PHP_METHOD(Phar, copy)
 {
 	char *error;
 	const char *pcr_error;
-	phar_entry_info *oldentry, newentry = {0}, *temp;
+	phar_entry_info newentry = {0};
 	zend_string *new_file = NULL;
 	zend_string *old_file = NULL;
 
@@ -3407,26 +3404,28 @@ PHP_METHOD(Phar, copy)
 	if (zend_string_starts_with_literal(old_file, ".phar")) {
 		/* can't copy a meta file */
 		zend_throw_exception_ex(spl_ce_UnexpectedValueException, 0,
-			"file \"%s\" cannot be copied to file \"%s\", cannot copy Phar meta-file in %s", ZSTR_VAL(old_file), ZSTR_VAL(new_file), phar_obj->archive->fname);
+			"file \"%s\" cannot be copied to file \"%s\", cannot copy Phar meta-file in %s", ZSTR_VAL(old_file), ZSTR_VAL(new_file), ZSTR_VAL(phar_obj->archive->fname));
 		RETURN_THROWS();
 	}
 
 	if (zend_string_starts_with_literal(new_file, ".phar")) {
 		/* can't copy a meta file */
 		zend_throw_exception_ex(spl_ce_UnexpectedValueException, 0,
-			"file \"%s\" cannot be copied to file \"%s\", cannot copy to Phar meta-file in %s", ZSTR_VAL(old_file), ZSTR_VAL(new_file), phar_obj->archive->fname);
+			"file \"%s\" cannot be copied to file \"%s\", cannot copy to Phar meta-file in %s", ZSTR_VAL(old_file), ZSTR_VAL(new_file), ZSTR_VAL(phar_obj->archive->fname));
 		RETURN_THROWS();
 	}
 
-	if (NULL == (oldentry = zend_hash_find_ptr(&phar_obj->archive->manifest, old_file)) || oldentry->is_deleted) {
+	phar_entry_info *oldentry = zend_hash_find_ptr(&phar_obj->archive->manifest, old_file);
+	if (!oldentry || oldentry->is_deleted) {
 		zend_throw_exception_ex(spl_ce_UnexpectedValueException, 0,
-			"file \"%s\" cannot be copied to file \"%s\", file does not exist in %s", ZSTR_VAL(old_file), ZSTR_VAL(new_file), phar_obj->archive->fname);
+			"file \"%s\" cannot be copied to file \"%s\", file does not exist in %s", ZSTR_VAL(old_file), ZSTR_VAL(new_file), ZSTR_VAL(phar_obj->archive->fname));
 		RETURN_THROWS();
 	}
 
-	if (NULL != (temp = zend_hash_find_ptr(&phar_obj->archive->manifest, new_file)) && !temp->is_deleted) {
+	const phar_entry_info *temp = zend_hash_find_ptr(&phar_obj->archive->manifest, new_file);
+	if (temp && !temp->is_deleted) {
 		zend_throw_exception_ex(spl_ce_UnexpectedValueException, 0,
-			"file \"%s\" cannot be copied to file \"%s\", file must not already exist in phar %s", ZSTR_VAL(old_file), ZSTR_VAL(new_file), phar_obj->archive->fname);
+			"file \"%s\" cannot be copied to file \"%s\", file must not already exist in phar %s", ZSTR_VAL(old_file), ZSTR_VAL(new_file), ZSTR_VAL(phar_obj->archive->fname));
 		RETURN_THROWS();
 	}
 
@@ -3434,13 +3433,13 @@ PHP_METHOD(Phar, copy)
 	char *tmp_new_file = ZSTR_VAL(new_file);
 	if (phar_path_check(&tmp_new_file, &tmp_len, &pcr_error) > pcr_is_ok) {
 		zend_throw_exception_ex(spl_ce_UnexpectedValueException, 0,
-				"file \"%s\" contains invalid characters %s, cannot be copied from \"%s\" in phar %s", ZSTR_VAL(new_file), pcr_error, ZSTR_VAL(old_file), phar_obj->archive->fname);
+				"file \"%s\" contains invalid characters %s, cannot be copied from \"%s\" in phar %s", ZSTR_VAL(new_file), pcr_error, ZSTR_VAL(old_file), ZSTR_VAL(phar_obj->archive->fname));
 		RETURN_THROWS();
 	}
 
 	if (phar_obj->archive->is_persistent) {
 		if (FAILURE == phar_copy_on_write(&(phar_obj->archive))) {
-			zend_throw_exception_ex(phar_ce_PharException, 0, "phar \"%s\" is persistent, unable to copy on write", phar_obj->archive->fname);
+			zend_throw_exception_ex(phar_ce_PharException, 0, "phar \"%s\" is persistent, unable to copy on write", ZSTR_VAL(phar_obj->archive->fname));
 			RETURN_THROWS();
 		}
 		/* re-populate with copied-on-write entry */
@@ -3511,7 +3510,6 @@ PHP_METHOD(Phar, offsetExists)
 PHP_METHOD(Phar, offsetGet)
 {
 	char *error;
-	phar_entry_info *entry;
 	zend_string *file_name = NULL;
 
 	if (zend_parse_parameters(ZEND_NUM_ARGS(), "P", &file_name) == FAILURE) {
@@ -3521,16 +3519,22 @@ PHP_METHOD(Phar, offsetGet)
 	PHAR_ARCHIVE_OBJECT();
 
 	/* security is 0 here so that we can get a better error message than "entry doesn't exist" */
-	if (!(entry = phar_get_entry_info_dir(phar_obj->archive, ZSTR_VAL(file_name), ZSTR_LEN(file_name), 1, &error, false))) {
+	phar_entry_info *entry = phar_get_entry_info_dir(phar_obj->archive, ZSTR_VAL(file_name), ZSTR_LEN(file_name), 1, &error, false);
+	if (!entry) {
 		zend_throw_exception_ex(spl_ce_BadMethodCallException, 0, "Entry %s does not exist%s%s", ZSTR_VAL(file_name), error?", ":"", error?error:"");
 	} else {
+		if (entry->is_temp_dir) {
+			zend_string_efree(entry->filename);
+			efree(entry);
+		}
+
 		if (zend_string_equals_literal(file_name, ".phar/stub.php")) {
-			zend_throw_exception_ex(spl_ce_BadMethodCallException, 0, "Cannot get stub \".phar/stub.php\" directly in phar \"%s\", use getStub", phar_obj->archive->fname);
+			zend_throw_exception_ex(spl_ce_BadMethodCallException, 0, "Cannot get stub \".phar/stub.php\" directly in phar \"%s\", use getStub", ZSTR_VAL(phar_obj->archive->fname));
 			RETURN_THROWS();
 		}
 
 		if (zend_string_equals_literal(file_name, ".phar/alias.txt")) {
-			zend_throw_exception_ex(spl_ce_BadMethodCallException, 0, "Cannot get alias \".phar/alias.txt\" directly in phar \"%s\", use getAlias", phar_obj->archive->fname);
+			zend_throw_exception_ex(spl_ce_BadMethodCallException, 0, "Cannot get alias \".phar/alias.txt\" directly in phar \"%s\", use getAlias", ZSTR_VAL(phar_obj->archive->fname));
 			RETURN_THROWS();
 		}
 
@@ -3539,12 +3543,7 @@ PHP_METHOD(Phar, offsetGet)
 			RETURN_THROWS();
 		}
 
-		if (entry->is_temp_dir) {
-			zend_string_efree(entry->filename);
-			efree(entry);
-		}
-
-		zend_string *sfname = strpprintf(0, "phar://%s/%s", phar_obj->archive->fname, ZSTR_VAL(file_name));
+		zend_string *sfname = strpprintf(0, "phar://%s/%s", ZSTR_VAL(phar_obj->archive->fname), ZSTR_VAL(file_name));
 		zval zfname;
 		ZVAL_NEW_STR(&zfname, sfname);
 
@@ -3562,7 +3561,6 @@ PHP_METHOD(Phar, offsetGet)
 static void phar_add_file(phar_archive_data **pphar, zend_string *file_name, const zend_string *content, zval *zresource)
 {
 	char *error;
-	phar_entry_data *data;
 	php_stream *contents_file = NULL;
 	php_stream_statbuf ssb;
 #ifdef PHP_WIN32
@@ -3594,7 +3592,8 @@ static void phar_add_file(phar_archive_data **pphar, zend_string *file_name, con
 	}
 #endif
 
-	if (!(data = phar_get_or_create_entry_data((*pphar)->fname, (*pphar)->fname_len, filename, filename_len, "w+b", 0, &error, true, time(NULL)))) {
+	phar_entry_data *data = phar_get_or_create_entry_data((*pphar)->fname, filename, filename_len, "w+b", 0, &error, true, time(NULL));
+	if (!data) {
 		if (error) {
 			zend_throw_exception_ex(spl_ce_BadMethodCallException, 0, "Entry %s does not exist and cannot be created: %s", filename, error);
 			efree(error);
@@ -3603,10 +3602,6 @@ static void phar_add_file(phar_archive_data **pphar, zend_string *file_name, con
 		}
 		goto finish;
 	} else {
-		if (error) {
-			efree(error);
-		}
-
 		if (!data->internal_file->is_dir) {
 			size_t contents_len = 0;
 			if (content) {
@@ -3614,11 +3609,13 @@ static void phar_add_file(phar_archive_data **pphar, zend_string *file_name, con
 				size_t written_len = php_stream_write(data->fp, ZSTR_VAL(content), ZSTR_LEN(content));
 				if (written_len != contents_len) {
 					zend_throw_exception_ex(spl_ce_BadMethodCallException, 0, "Entry %s could not be written to", filename);
+					phar_entry_delref(data);
 					goto finish;
 				}
 			} else {
 				if (!(php_stream_from_zval_no_verify(contents_file, zresource))) {
 					zend_throw_exception_ex(spl_ce_BadMethodCallException, 0, "Entry %s could not be written to", filename);
+					phar_entry_delref(data);
 					goto finish;
 				}
 				php_stream_copy_to_stream_ex(contents_file, data->fp, PHP_STREAM_COPY_ALL, &contents_len);
@@ -3664,9 +3661,14 @@ finish: ;
 static void phar_mkdir(phar_archive_data **pphar, zend_string *dir_name)
 {
 	char *error;
-	phar_entry_data *data;
 
-	if (!(data = phar_get_or_create_entry_data((*pphar)->fname, (*pphar)->fname_len, ZSTR_VAL(dir_name), ZSTR_LEN(dir_name), "w+b", 2, &error, true, time(NULL)))) {
+	phar_entry_data *data = phar_get_or_create_entry_data(
+		(*pphar)->fname,
+		ZSTR_VAL(dir_name), ZSTR_LEN(dir_name),
+		"w+b", 2, &error, true,
+		time(NULL)
+	);
+	if (!data) {
 		if (error) {
 			zend_throw_exception_ex(spl_ce_BadMethodCallException, 0, "Directory %s does not exist and cannot be created: %s", ZSTR_VAL(dir_name), error);
 			efree(error);
@@ -3676,10 +3678,6 @@ static void phar_mkdir(phar_archive_data **pphar, zend_string *dir_name)
 
 		return;
 	} else {
-		if (error) {
-			efree(error);
-		}
-
 		/* check for copy on write */
 		if (data->phar != *pphar) {
 			*pphar = data->phar;
@@ -3715,12 +3713,12 @@ PHP_METHOD(Phar, offsetSet)
 	}
 
 	if (zend_string_equals_literal(file_name, ".phar/stub.php")) {
-		zend_throw_exception_ex(spl_ce_BadMethodCallException, 0, "Cannot set stub \".phar/stub.php\" directly in phar \"%s\", use setStub", phar_obj->archive->fname);
+		zend_throw_exception_ex(spl_ce_BadMethodCallException, 0, "Cannot set stub \".phar/stub.php\" directly in phar \"%s\", use setStub", ZSTR_VAL(phar_obj->archive->fname));
 		RETURN_THROWS();
 	}
 
 	if (zend_string_equals_literal(file_name, ".phar/alias.txt")) {
-		zend_throw_exception_ex(spl_ce_BadMethodCallException, 0, "Cannot set alias \".phar/alias.txt\" directly in phar \"%s\", use setAlias", phar_obj->archive->fname);
+		zend_throw_exception_ex(spl_ce_BadMethodCallException, 0, "Cannot set alias \".phar/alias.txt\" directly in phar \"%s\", use setAlias", ZSTR_VAL(phar_obj->archive->fname));
 		RETURN_THROWS();
 	}
 
@@ -3738,7 +3736,6 @@ PHP_METHOD(Phar, offsetUnset)
 {
 	char *error;
 	zend_string *file_name;
-	phar_entry_info *entry;
 
 	if (zend_parse_parameters(ZEND_NUM_ARGS(), "P", &file_name) == FAILURE) {
 		RETURN_THROWS();
@@ -3752,7 +3749,8 @@ PHP_METHOD(Phar, offsetUnset)
 	}
 
 	if (zend_hash_exists(&phar_obj->archive->manifest, file_name)) {
-		if (NULL != (entry = zend_hash_find_ptr(&phar_obj->archive->manifest, file_name))) {
+		phar_entry_info *entry = zend_hash_find_ptr(&phar_obj->archive->manifest, file_name);
+		if (entry) {
 			if (entry->is_deleted) {
 				/* entry is deleted, but has not been flushed to disk yet */
 				return;
@@ -3760,7 +3758,7 @@ PHP_METHOD(Phar, offsetUnset)
 
 			if (phar_obj->archive->is_persistent) {
 				if (FAILURE == phar_copy_on_write(&(phar_obj->archive))) {
-					zend_throw_exception_ex(phar_ce_PharException, 0, "phar \"%s\" is persistent, unable to copy on write", phar_obj->archive->fname);
+					zend_throw_exception_ex(phar_ce_PharException, 0, "phar \"%s\" is persistent, unable to copy on write", ZSTR_VAL(phar_obj->archive->fname));
 					RETURN_THROWS();
 				}
 				/* re-populate entry after copy on write */
@@ -3791,9 +3789,16 @@ PHP_METHOD(Phar, addEmptyDir)
 
 	PHAR_ARCHIVE_OBJECT();
 
-	if (zend_string_starts_with_literal(dir_name, ".phar")) {
-		zend_throw_exception_ex(spl_ce_BadMethodCallException, 0, "Cannot create a directory in magic \".phar\" directory");
-		RETURN_THROWS();
+	if (
+		zend_string_starts_with_literal(dir_name, ".phar")
+		|| zend_string_starts_with_literal(dir_name, "/.phar")
+	) {
+		size_t prefix_len = (ZSTR_VAL(dir_name)[0] == '/') + sizeof(".phar") - 1;
+		char next_char = ZSTR_VAL(dir_name)[prefix_len];
+		if (next_char == '/' || next_char == '\\' || next_char == '\0') {
+			zend_throw_exception_ex(spl_ce_BadMethodCallException, 0, "Cannot create a directory in magic \".phar\" directory");
+			RETURN_THROWS();
+		}
 	}
 
 	phar_mkdir(&phar_obj->archive, dir_name);
@@ -3805,7 +3810,6 @@ PHP_METHOD(Phar, addFile)
 {
 	zend_string *file_name;
 	zend_string *local_name = NULL;
-	php_stream *resource;
 	zval zresource;
 
 	if (zend_parse_parameters(ZEND_NUM_ARGS(), "P|S!", &file_name, &local_name) == FAILURE) {
@@ -3819,7 +3823,8 @@ PHP_METHOD(Phar, addFile)
 		RETURN_THROWS();
 	}
 
-	if (!(resource = php_stream_open_wrapper(ZSTR_VAL(file_name), "rb", 0, NULL))) {
+	php_stream *resource = php_stream_open_wrapper(ZSTR_VAL(file_name), "rb", 0, NULL);
+	if (!resource) {
 		zend_throw_exception_ex(spl_ce_RuntimeException, 0, "phar error: unable to open file \"%s\" to add to phar archive", ZSTR_VAL(file_name));
 		RETURN_THROWS();
 	}
@@ -3857,20 +3862,21 @@ PHP_METHOD(Phar, getStub)
 	zend_string *buf;
 	php_stream *fp;
 	php_stream_filter *filter = NULL;
-	phar_entry_info *stub;
 
 	ZEND_PARSE_PARAMETERS_NONE();
 
 	PHAR_ARCHIVE_OBJECT();
 
 	if (phar_obj->archive->is_tar || phar_obj->archive->is_zip) {
+		const phar_entry_info *stub = zend_hash_str_find_ptr(&(phar_obj->archive->manifest), ".phar/stub.php", sizeof(".phar/stub.php")-1);
 
-		if (NULL != (stub = zend_hash_str_find_ptr(&(phar_obj->archive->manifest), ".phar/stub.php", sizeof(".phar/stub.php")-1))) {
+		if (stub) {
 			if (phar_obj->archive->fp && !phar_obj->archive->is_brandnew && !(stub->flags & PHAR_ENT_COMPRESSION_MASK)) {
 				fp = phar_obj->archive->fp;
 			} else {
-				if (!(fp = php_stream_open_wrapper(phar_obj->archive->fname, "rb", 0, NULL))) {
-					zend_throw_exception_ex(spl_ce_UnexpectedValueException, 0, "phar error: unable to open phar \"%s\"", phar_obj->archive->fname);
+				fp = php_stream_open_wrapper(ZSTR_VAL(phar_obj->archive->fname), "rb", 0, NULL);
+				if (!fp) {
+					zend_throw_exception_ex(spl_ce_UnexpectedValueException, 0, "phar error: unable to open phar \"%s\"", ZSTR_VAL(phar_obj->archive->fname));
 					RETURN_THROWS();
 				}
 				if (stub->flags & PHAR_ENT_COMPRESSION_MASK) {
@@ -3882,7 +3888,7 @@ PHP_METHOD(Phar, getStub)
 						filter = NULL;
 					}
 					if (!filter) {
-						zend_throw_exception_ex(spl_ce_UnexpectedValueException, 0, "phar error: unable to read stub of phar \"%s\" (cannot create %s filter)", phar_obj->archive->fname, phar_decompress_filter(stub, true));
+						zend_throw_exception_ex(spl_ce_UnexpectedValueException, 0, "phar error: unable to read stub of phar \"%s\" (cannot create %s filter)", ZSTR_VAL(phar_obj->archive->fname), phar_decompress_filter(stub, true));
 						RETURN_THROWS();
 					}
 					php_stream_filter_append(&fp->readfilters, filter);
@@ -3907,7 +3913,7 @@ PHP_METHOD(Phar, getStub)
 	if (phar_obj->archive->fp && !phar_obj->archive->is_brandnew) {
 		fp = phar_obj->archive->fp;
 	} else {
-		fp = php_stream_open_wrapper(phar_obj->archive->fname, "rb", 0, NULL);
+		fp = php_stream_open_wrapper(ZSTR_VAL(phar_obj->archive->fname), "rb", 0, NULL);
 	}
 
 	if (!fp)  {
@@ -4025,7 +4031,7 @@ PHP_METHOD(Phar, setMetadata)
 	}
 
 	if (phar_obj->archive->is_persistent && FAILURE == phar_copy_on_write(&(phar_obj->archive))) {
-		zend_throw_exception_ex(phar_ce_PharException, 0, "phar \"%s\" is persistent, unable to copy on write", phar_obj->archive->fname);
+		zend_throw_exception_ex(phar_ce_PharException, 0, "phar \"%s\" is persistent, unable to copy on write", ZSTR_VAL(phar_obj->archive->fname));
 		RETURN_THROWS();
 	}
 
@@ -4305,11 +4311,11 @@ PHP_METHOD(Phar, extractTo)
 
 	PHAR_ARCHIVE_OBJECT();
 
-	fp = php_stream_open_wrapper(phar_obj->archive->fname, "rb", IGNORE_URL|STREAM_MUST_SEEK, NULL);
+	fp = php_stream_open_wrapper(ZSTR_VAL(phar_obj->archive->fname), "rb", IGNORE_URL|STREAM_MUST_SEEK, NULL);
 
 	if (!fp) {
 		zend_throw_exception_ex(spl_ce_InvalidArgumentException, 0,
-			"Invalid argument, %s cannot be found", phar_obj->archive->fname);
+			"Invalid argument, %s cannot be found", ZSTR_VAL(phar_obj->archive->fname));
 		RETURN_THROWS();
 	}
 
@@ -4354,13 +4360,13 @@ PHP_METHOD(Phar, extractTo)
 			switch (extract_helper(phar_obj->archive, Z_STR_P(zval_file), path_to, overwrite, &error)) {
 				case -1:
 					zend_throw_exception_ex(phar_ce_PharException, 0, "Extraction from phar \"%s\" failed: %s",
-						phar_obj->archive->fname, error);
+						ZSTR_VAL(phar_obj->archive->fname), error);
 					efree(error);
 					RETURN_THROWS();
 				case 0:
 					zend_throw_exception_ex(phar_ce_PharException, 0,
 						"phar error: attempted to extract non-existent file or directory \"%s\" from phar \"%s\"",
-						ZSTR_VAL(Z_STR_P(zval_file)), phar_obj->archive->fname);
+						ZSTR_VAL(Z_STR_P(zval_file)), ZSTR_VAL(phar_obj->archive->fname));
 					RETURN_THROWS();
 			}
 		} ZEND_HASH_FOREACH_END();
@@ -4370,12 +4376,12 @@ PHP_METHOD(Phar, extractTo)
 	ret = extract_helper(phar_obj->archive, filename, path_to, overwrite, &error);
 	if (-1 == ret) {
 		zend_throw_exception_ex(phar_ce_PharException, 0, "Extraction from phar \"%s\" failed: %s",
-			phar_obj->archive->fname, error);
+			ZSTR_VAL(phar_obj->archive->fname), error);
 		efree(error);
 	} else if (0 == ret && NULL != filename) {
 		zend_throw_exception_ex(phar_ce_PharException, 0,
 			"phar error: attempted to extract non-existent file or directory \"%s\" from phar \"%s\"",
-			ZSTR_VAL(filename), phar_obj->archive->fname);
+			ZSTR_VAL(filename), ZSTR_VAL(phar_obj->archive->fname));
 	} else {
 		RETURN_TRUE;
 	}
@@ -4386,11 +4392,9 @@ PHP_METHOD(Phar, extractTo)
 /* {{{ Construct a Phar entry object */
 PHP_METHOD(PharFileInfo, __construct)
 {
-	char *fname, *arch, *entry, *error;
+	char *fname, *error;
 	size_t fname_len;
-	size_t arch_len, entry_len;
 	phar_entry_object *entry_obj;
-	phar_entry_info *entry_info;
 	phar_archive_data *phar_data;
 	zval arg1;
 
@@ -4405,14 +4409,22 @@ PHP_METHOD(PharFileInfo, __construct)
 		RETURN_THROWS();
 	}
 
-	if (fname_len < 7 || memcmp(fname, "phar://", 7) || phar_split_fname(fname, fname_len, &arch, &arch_len, &entry, &entry_len, 2, 0) == FAILURE) {
+	if (fname_len < 7 || memcmp(fname, "phar://", 7)) {
+		zend_throw_exception_ex(spl_ce_RuntimeException, 0,
+			"'%s' is not a valid phar archive URL (must have at least phar://filename.phar)", fname);
+		RETURN_THROWS();
+	}
+
+	zend_string *entry = NULL;
+	zend_string *arch = phar_split_fname(fname, fname_len, &entry, 2, 0);
+	if (!arch) {
 		zend_throw_exception_ex(spl_ce_RuntimeException, 0,
 			"'%s' is not a valid phar archive URL (must have at least phar://filename.phar)", fname);
 		RETURN_THROWS();
 	}
 
-	if (phar_open_from_filename(arch, arch_len, NULL, 0, REPORT_ERRORS, &phar_data, &error) == FAILURE) {
-		efree(arch);
+	if (phar_open_from_filename(ZSTR_VAL(arch), ZSTR_LEN(arch), NULL, REPORT_ERRORS, &phar_data, &error) == FAILURE) {
+		zend_string_release_ex(arch, false);
 		efree(entry);
 		if (error) {
 			zend_throw_exception_ex(spl_ce_RuntimeException, 0,
@@ -4425,16 +4437,18 @@ PHP_METHOD(PharFileInfo, __construct)
 		RETURN_THROWS();
 	}
 
-	if ((entry_info = phar_get_entry_info_dir(phar_data, entry, entry_len, 1, &error, true)) == NULL) {
+	phar_entry_info *entry_info = phar_get_entry_info_dir(phar_data, ZSTR_VAL(entry), ZSTR_LEN(entry), 1, &error, true);
+	if (UNEXPECTED(!entry_info)) {
 		zend_throw_exception_ex(spl_ce_RuntimeException, 0,
-			"Cannot access phar file entry '%s' in archive '%s'%s%s", entry, arch, error ? ", " : "", error ? error : "");
-		efree(arch);
-		efree(entry);
+			"Cannot access phar file entry '%s' in archive '%s'%s%s",
+			ZSTR_VAL(entry), ZSTR_VAL(arch), error ? ", " : "", error ? error : "");
+		zend_string_release_ex(entry, false);
+		zend_string_release_ex(arch, false);
 		RETURN_THROWS();
 	}
 
-	efree(arch);
-	efree(entry);
+	zend_string_release_ex(entry, false);
+	zend_string_release_ex(arch, false);
 
 	entry_obj->entry = entry_info;
 	if (!entry_info->is_persistent && !entry_info->is_temp_dir) {
@@ -4596,7 +4610,7 @@ PHP_METHOD(PharFileInfo, chmod)
 	}
 
 	if (PHAR_G(readonly) && !entry_obj->entry->phar->is_data) {
-		zend_throw_exception_ex(phar_ce_PharException, 0, "Cannot modify permissions for file \"%s\" in phar \"%s\", write operations are prohibited", ZSTR_VAL(entry_obj->entry->filename), entry_obj->entry->phar->fname);
+		zend_throw_exception_ex(phar_ce_PharException, 0, "Cannot modify permissions for file \"%s\" in phar \"%s\", write operations are prohibited", ZSTR_VAL(entry_obj->entry->filename), ZSTR_VAL(entry_obj->entry->phar->fname));
 		RETURN_THROWS();
 	}
 
@@ -4604,7 +4618,7 @@ PHP_METHOD(PharFileInfo, chmod)
 		phar_archive_data *phar = entry_obj->entry->phar;
 
 		if (FAILURE == phar_copy_on_write(&phar)) {
-			zend_throw_exception_ex(phar_ce_PharException, 0, "phar \"%s\" is persistent, unable to copy on write", phar->fname);
+			zend_throw_exception_ex(phar_ce_PharException, 0, "phar \"%s\" is persistent, unable to copy on write", ZSTR_VAL(phar->fname));
 			RETURN_THROWS();
 		}
 		/* re-populate after copy-on-write */
@@ -4697,7 +4711,7 @@ PHP_METHOD(PharFileInfo, setMetadata)
 		phar_archive_data *phar = entry_obj->entry->phar;
 
 		if (FAILURE == phar_copy_on_write(&phar)) {
-			zend_throw_exception_ex(phar_ce_PharException, 0, "phar \"%s\" is persistent, unable to copy on write", phar->fname);
+			zend_throw_exception_ex(phar_ce_PharException, 0, "phar \"%s\" is persistent, unable to copy on write", ZSTR_VAL(phar->fname));
 			RETURN_THROWS();
 		}
 		/* re-populate after copy-on-write */
@@ -4745,7 +4759,7 @@ PHP_METHOD(PharFileInfo, delMetadata)
 			phar_archive_data *phar = entry_obj->entry->phar;
 
 			if (FAILURE == phar_copy_on_write(&phar)) {
-				zend_throw_exception_ex(phar_ce_PharException, 0, "phar \"%s\" is persistent, unable to copy on write", phar->fname);
+				zend_throw_exception_ex(phar_ce_PharException, 0, "phar \"%s\" is persistent, unable to copy on write", ZSTR_VAL(phar->fname));
 				RETURN_THROWS();
 			}
 			/* re-populate after copy-on-write */
@@ -4776,7 +4790,6 @@ PHP_METHOD(PharFileInfo, delMetadata)
 PHP_METHOD(PharFileInfo, getContent)
 {
 	char *error;
-	php_stream *fp;
 	phar_entry_info *link;
 	zend_string *str;
 
@@ -4786,7 +4799,7 @@ PHP_METHOD(PharFileInfo, getContent)
 
 	if (entry_obj->entry->is_dir) {
 		zend_throw_exception_ex(spl_ce_BadMethodCallException, 0,
-			"phar error: Cannot retrieve contents, \"%s\" in phar \"%s\" is a directory", ZSTR_VAL(entry_obj->entry->filename), entry_obj->entry->phar->fname);
+			"phar error: Cannot retrieve contents, \"%s\" in phar \"%s\" is a directory", ZSTR_VAL(entry_obj->entry->filename), ZSTR_VAL(entry_obj->entry->phar->fname));
 		RETURN_THROWS();
 	}
 
@@ -4798,14 +4811,15 @@ PHP_METHOD(PharFileInfo, getContent)
 
 	if (SUCCESS != phar_open_entry_fp(link, &error, false)) {
 		zend_throw_exception_ex(spl_ce_BadMethodCallException, 0,
-			"phar error: Cannot retrieve contents, \"%s\" in phar \"%s\": %s", ZSTR_VAL(entry_obj->entry->filename), entry_obj->entry->phar->fname, error);
+			"phar error: Cannot retrieve contents, \"%s\" in phar \"%s\": %s", ZSTR_VAL(entry_obj->entry->filename), ZSTR_VAL(entry_obj->entry->phar->fname), error);
 		efree(error);
 		RETURN_THROWS();
 	}
 
-	if (!(fp = phar_get_efp(link, false))) {
+	php_stream *fp = phar_get_efp(link, false);
+	if (!fp) {
 		zend_throw_exception_ex(spl_ce_BadMethodCallException, 0,
-			"phar error: Cannot retrieve contents of \"%s\" in phar \"%s\"", ZSTR_VAL(entry_obj->entry->filename), entry_obj->entry->phar->fname);
+			"phar error: Cannot retrieve contents of \"%s\" in phar \"%s\"", ZSTR_VAL(entry_obj->entry->filename), ZSTR_VAL(entry_obj->entry->phar->fname));
 		RETURN_THROWS();
 	}
 
@@ -4859,7 +4873,7 @@ PHP_METHOD(PharFileInfo, compress)
 		phar_archive_data *phar = entry_obj->entry->phar;
 
 		if (FAILURE == phar_copy_on_write(&phar)) {
-			zend_throw_exception_ex(phar_ce_PharException, 0, "phar \"%s\" is persistent, unable to copy on write", phar->fname);
+			zend_throw_exception_ex(phar_ce_PharException, 0, "phar \"%s\" is persistent, unable to copy on write", ZSTR_VAL(phar->fname));
 			RETURN_THROWS();
 		}
 		/* re-populate after copy-on-write */
@@ -4881,7 +4895,7 @@ PHP_METHOD(PharFileInfo, compress)
 				/* decompress this file indirectly */
 				if (SUCCESS != phar_open_entry_fp(entry_obj->entry, &error, true)) {
 					zend_throw_exception_ex(spl_ce_BadMethodCallException, 0,
-						"phar error: Cannot decompress bzip2-compressed file \"%s\" in phar \"%s\" in order to compress with gzip: %s", ZSTR_VAL(entry_obj->entry->filename), entry_obj->entry->phar->fname, error);
+						"phar error: Cannot decompress bzip2-compressed file \"%s\" in phar \"%s\" in order to compress with gzip: %s", ZSTR_VAL(entry_obj->entry->filename), ZSTR_VAL(entry_obj->entry->phar->fname), error);
 					efree(error);
 					RETURN_THROWS();
 				}
@@ -4912,7 +4926,7 @@ PHP_METHOD(PharFileInfo, compress)
 				/* decompress this file indirectly */
 				if (SUCCESS != phar_open_entry_fp(entry_obj->entry, &error, true)) {
 					zend_throw_exception_ex(spl_ce_BadMethodCallException, 0,
-						"phar error: Cannot decompress gzip-compressed file \"%s\" in phar \"%s\" in order to compress with bzip2: %s", ZSTR_VAL(entry_obj->entry->filename), entry_obj->entry->phar->fname, error);
+						"phar error: Cannot decompress gzip-compressed file \"%s\" in phar \"%s\" in order to compress with bzip2: %s", ZSTR_VAL(entry_obj->entry->filename), ZSTR_VAL(entry_obj->entry->phar->fname), error);
 					efree(error);
 					RETURN_THROWS();
 				}
@@ -4994,7 +5008,7 @@ PHP_METHOD(PharFileInfo, decompress)
 		phar_archive_data *phar = entry_obj->entry->phar;
 
 		if (FAILURE == phar_copy_on_write(&phar)) {
-			zend_throw_exception_ex(phar_ce_PharException, 0, "phar \"%s\" is persistent, unable to copy on write", phar->fname);
+			zend_throw_exception_ex(phar_ce_PharException, 0, "phar \"%s\" is persistent, unable to copy on write", ZSTR_VAL(phar->fname));
 			RETURN_THROWS();
 		}
 		/* re-populate after copy-on-write */
@@ -5015,7 +5029,7 @@ PHP_METHOD(PharFileInfo, decompress)
 	/* decompress this file indirectly */
 	if (SUCCESS != phar_open_entry_fp(entry_obj->entry, &error, true)) {
 		zend_throw_exception_ex(spl_ce_BadMethodCallException, 0,
-			"Phar error: Cannot decompress %s-compressed file \"%s\" in phar \"%s\": %s", compression_type, ZSTR_VAL(entry_obj->entry->filename), entry_obj->entry->phar->fname, error);
+			"Phar error: Cannot decompress %s-compressed file \"%s\" in phar \"%s\": %s", compression_type, ZSTR_VAL(entry_obj->entry->filename), ZSTR_VAL(entry_obj->entry->phar->fname), error);
 		efree(error);
 		RETURN_THROWS();
 	}
diff --git a/ext/phar/phar_path_check.re b/ext/phar/phar_path_check.re
index 689ffaa51244..39b18bfc0b44 100644
--- a/ext/phar/phar_path_check.re
+++ b/ext/phar/phar_path_check.re
@@ -2,15 +2,13 @@
   +----------------------------------------------------------------------+
   | phar php single-file executable PHP extension                        |
   +----------------------------------------------------------------------+
-  | Copyright (c) The PHP Group                                          |
+  | Copyright © The PHP Group and Contributors.                          |
   +----------------------------------------------------------------------+
-  | This source file is subject to version 3.01 of the PHP license,      |
-  | that is bundled with this package in the file LICENSE, and is        |
-  | available through the world-wide-web at the following url:           |
-  | https://www.php.net/license/3_01.txt                                 |
-  | If you did not receive a copy of the PHP license and are unable to   |
-  | obtain it through the world-wide-web, please send a note to          |
-  | license@php.net so we can mail you a copy immediately.               |
+  | This source file is subject to the Modified BSD License that is      |
+  | bundled with this package in the file LICENSE, and is available      |
+  | through the World Wide Web at .        |
+  |                                                                      |
+  | SPDX-License-Identifier: BSD-3-Clause                                |
   +----------------------------------------------------------------------+
   | Authors: Marcus Boerger                               |
   +----------------------------------------------------------------------+
diff --git a/ext/phar/pharzip.h b/ext/phar/pharzip.h
index 5c814747b692..5a827f7a7294 100644
--- a/ext/phar/pharzip.h
+++ b/ext/phar/pharzip.h
@@ -2,15 +2,13 @@
   +----------------------------------------------------------------------+
   | phar php single-file executable PHP extension                        |
   +----------------------------------------------------------------------+
-  | Copyright (c) The PHP Group                                          |
+  | Copyright © The PHP Group and Contributors.                          |
   +----------------------------------------------------------------------+
-  | This source file is subject to version 3.01 of the PHP license,      |
-  | that is bundled with this package in the file LICENSE, and is        |
-  | available through the world-wide-web at the following url:           |
-  | https://www.php.net/license/3_01.txt                                 |
-  | If you did not receive a copy of the PHP license and are unable to   |
-  | obtain it through the world-wide-web, please send a note to          |
-  | license@php.net so we can mail you a copy immediately.               |
+  | This source file is subject to the Modified BSD License that is      |
+  | bundled with this package in the file LICENSE, and is available      |
+  | through the World Wide Web at .        |
+  |                                                                      |
+  | SPDX-License-Identifier: BSD-3-Clause                                |
   +----------------------------------------------------------------------+
   | Authors: Gregory Beaver                              |
   |          Marcus Boerger                               |
diff --git a/ext/phar/php_phar.h b/ext/phar/php_phar.h
index 18e3485fc3a9..f086f9cfff2d 100644
--- a/ext/phar/php_phar.h
+++ b/ext/phar/php_phar.h
@@ -2,15 +2,13 @@
   +----------------------------------------------------------------------+
   | phar php single-file executable PHP extension                        |
   +----------------------------------------------------------------------+
-  | Copyright (c) The PHP Group                                          |
+  | Copyright © The PHP Group and Contributors.                          |
   +----------------------------------------------------------------------+
-  | This source file is subject to version 3.01 of the PHP license,      |
-  | that is bundled with this package in the file LICENSE, and is        |
-  | available through the world-wide-web at the following url:           |
-  | https://www.php.net/license/3_01.txt                                 |
-  | If you did not receive a copy of the PHP license and are unable to   |
-  | obtain it through the world-wide-web, please send a note to          |
-  | license@php.net so we can mail you a copy immediately.               |
+  | This source file is subject to the Modified BSD License that is      |
+  | bundled with this package in the file LICENSE, and is available      |
+  | through the World Wide Web at .        |
+  |                                                                      |
+  | SPDX-License-Identifier: BSD-3-Clause                                |
   +----------------------------------------------------------------------+
   | Authors: Gregory Beaver                              |
   |          Marcus Boerger                               |
diff --git a/ext/phar/stream.c b/ext/phar/stream.c
index 786b19551786..9474498e3892 100644
--- a/ext/phar/stream.c
+++ b/ext/phar/stream.c
@@ -2,15 +2,13 @@
   +----------------------------------------------------------------------+
   | phar:// stream wrapper support                                       |
   +----------------------------------------------------------------------+
-  | Copyright (c) The PHP Group                                          |
+  | Copyright © The PHP Group and Contributors.                          |
   +----------------------------------------------------------------------+
-  | This source file is subject to version 3.01 of the PHP license,      |
-  | that is bundled with this package in the file LICENSE, and is        |
-  | available through the world-wide-web at the following url:           |
-  | https://www.php.net/license/3_01.txt                                 |
-  | If you did not receive a copy of the PHP license and are unable to   |
-  | obtain it through the world-wide-web, please send a note to          |
-  | license@php.net so we can mail you a copy immediately.               |
+  | This source file is subject to the Modified BSD License that is      |
+  | bundled with this package in the file LICENSE, and is available      |
+  | through the World Wide Web at .        |
+  |                                                                      |
+  | SPDX-License-Identifier: BSD-3-Clause                                |
   +----------------------------------------------------------------------+
   | Authors: Gregory Beaver                              |
   |          Marcus Boerger                               |
@@ -57,38 +55,44 @@ const php_stream_wrapper php_stream_phar_wrapper = {
 /**
  * Open a phar file for streams API
  */
-php_url* phar_parse_url(php_stream_wrapper *wrapper, const char *filename, const char *mode, int options) /* {{{ */
+php_url* phar_parse_url(php_stream_wrapper *wrapper, php_stream_context *context,
+		const char *filename, const char *mode, int options)
 {
 	php_url *resource;
-	char *arch = NULL, *entry = NULL, *error;
-	size_t arch_len, entry_len;
+	char *error;
 
 	if (strncasecmp(filename, "phar://", 7)) {
 		return NULL;
 	}
 	if (mode[0] == 'a') {
 		if (!(options & PHP_STREAM_URL_STAT_QUIET)) {
-			php_stream_wrapper_log_error(wrapper, options, "phar error: open mode append not supported");
+			php_stream_wrapper_log_warn(wrapper, context, options, ModeNotSupported,
+				"phar error: open mode append not supported");
 		}
 		return NULL;
 	}
-	if (phar_split_fname(filename, strlen(filename), &arch, &arch_len, &entry, &entry_len, 2, (mode[0] == 'w' ? 2 : 0)) == FAILURE) {
+
+	zend_string *entry = NULL;
+	const char *arch_error = NULL;
+	zend_string *arch = phar_split_fname_ex(filename, strlen(filename), &entry, 2, (mode[0] == 'w' ? 2 : 0), &arch_error);
+	if (!arch) {
 		if (!(options & PHP_STREAM_URL_STAT_QUIET)) {
-			if (arch && !entry) {
-				php_stream_wrapper_log_error(wrapper, options, "phar error: no directory in \"%s\", must have at least phar://%s/ for root directory (always use full path to a new phar)", filename, arch);
+			if (arch_error && !entry) {
+				php_stream_wrapper_log_warn(wrapper, context, options, InvalidPath,
+					"phar error: no directory in \"%s\", must have at least phar://%s/ for root directory (always use full path to a new phar)",
+					filename, arch_error);
 				arch = NULL;
 			} else {
-				php_stream_wrapper_log_error(wrapper, options, "phar error: invalid url or non-existent phar \"%s\"", filename);
+				php_stream_wrapper_log_warn(wrapper, context, options, InvalidUrl,
+					"phar error: invalid url or non-existent phar \"%s\"", filename);
 			}
 		}
 		return NULL;
 	}
 	resource = ecalloc(1, sizeof(php_url));
 	resource->scheme = ZSTR_INIT_LITERAL("phar", 0);
-	resource->host = zend_string_init(arch, arch_len, 0);
-	efree(arch);
-	resource->path = zend_string_init(entry, entry_len, 0);
-	efree(entry);
+	resource->host = arch;
+	resource->path = entry;
 
 #ifdef MBO_0
 		if (resource) {
@@ -111,16 +115,17 @@ php_url* phar_parse_url(php_stream_wrapper *wrapper, const char *filename, const
 		}
 		if (PHAR_G(readonly) && (!pphar || !pphar->is_data)) {
 			if (!(options & PHP_STREAM_URL_STAT_QUIET)) {
-				php_stream_wrapper_log_error(wrapper, options, "phar error: write operations disabled by the php.ini setting phar.readonly");
+				php_stream_wrapper_log_warn(wrapper, context, options, Readonly,
+					"phar error: write operations disabled by the php.ini setting phar.readonly");
 			}
 			php_url_free(resource);
 			return NULL;
 		}
-		if (phar_open_or_create_filename(ZSTR_VAL(resource->host), ZSTR_LEN(resource->host), NULL, 0, 0, options, &phar, &error) == FAILURE)
+		if (phar_open_or_create_filename(resource->host, NULL, 0, options, &phar, &error) == FAILURE)
 		{
 			if (error) {
 				if (!(options & PHP_STREAM_URL_STAT_QUIET)) {
-					php_stream_wrapper_log_error(wrapper, options, "%s", error);
+					php_stream_wrapper_log_warn(wrapper, NULL, options, OpenFailed, "%s", error);
 				}
 				efree(error);
 			}
@@ -131,7 +136,7 @@ php_url* phar_parse_url(php_stream_wrapper *wrapper, const char *filename, const
 			if (error) {
 				spprintf(&error, 0, "Cannot open cached phar '%s' as writeable, copy on write failed", ZSTR_VAL(resource->host));
 				if (!(options & PHP_STREAM_URL_STAT_QUIET)) {
-					php_stream_wrapper_log_error(wrapper, options, "%s", error);
+					php_stream_wrapper_log_warn(wrapper, context, options, OpenFailed, "%s", error);
 				}
 				efree(error);
 			}
@@ -139,11 +144,11 @@ php_url* phar_parse_url(php_stream_wrapper *wrapper, const char *filename, const
 			return NULL;
 		}
 	} else {
-		if (phar_open_from_filename(ZSTR_VAL(resource->host), ZSTR_LEN(resource->host), NULL, 0, options, NULL, &error) == FAILURE)
+		if (phar_open_from_filename(ZSTR_VAL(resource->host), ZSTR_LEN(resource->host), NULL, options, NULL, &error) == FAILURE)
 		{
 			if (error) {
 				if (!(options & PHP_STREAM_URL_STAT_QUIET)) {
-					php_stream_wrapper_log_error(wrapper, options, "%s", error);
+					php_stream_wrapper_log_warn(wrapper, context, options, NotFound, "%s", error);
 				}
 				efree(error);
 			}
@@ -153,7 +158,6 @@ php_url* phar_parse_url(php_stream_wrapper *wrapper, const char *filename, const
 	}
 	return resource;
 }
-/* }}} */
 
 /**
  * used for fopen('phar://...') and company
@@ -165,24 +169,26 @@ static php_stream * phar_wrapper_open_url(php_stream_wrapper *wrapper, const cha
 	char *internal_file;
 	char *error;
 	HashTable *pharcontext;
-	php_url *resource = NULL;
 	php_stream *fpf;
 	zval *pzoption, *metadata;
 
-	if ((resource = phar_parse_url(wrapper, path, mode, options)) == NULL) {
+	php_url *resource = phar_parse_url(wrapper, context, path, mode, options);
+	if (!resource) {
 		return NULL;
 	}
 
 	/* we must have at the very least phar://alias.phar/internalfile.php */
 	if (!resource->scheme || !resource->host || !resource->path) {
 		php_url_free(resource);
-		php_stream_wrapper_log_error(wrapper, options, "phar error: invalid url \"%s\"", path);
+		php_stream_wrapper_log_warn(wrapper, context, options, InvalidUrl,
+			"phar error: invalid url \"%s\"", path);
 		return NULL;
 	}
 
 	if (!zend_string_equals_literal_ci(resource->scheme, "phar")) {
 		php_url_free(resource);
-		php_stream_wrapper_log_error(wrapper, options, "phar error: not a phar stream url \"%s\"", path);
+		php_stream_wrapper_log_warn(wrapper, context, options, ProtocolUnsupported,
+			"phar error: not a phar stream url \"%s\"", path);
 		return NULL;
 	}
 
@@ -191,26 +197,25 @@ static php_stream * phar_wrapper_open_url(php_stream_wrapper *wrapper, const cha
 	/* strip leading "/" */
 	internal_file = estrndup(ZSTR_VAL(resource->path) + 1, ZSTR_LEN(resource->path) - 1);
 	if (mode[0] == 'w' || (mode[0] == 'r' && mode[1] == '+')) {
-		if (NULL == (idata = phar_get_or_create_entry_data(ZSTR_VAL(resource->host), ZSTR_LEN(resource->host), internal_file, strlen(internal_file), mode, 0, &error, true, time(NULL)))) {
+		if (NULL == (idata = phar_get_or_create_entry_data(resource->host, internal_file, strlen(internal_file), mode, 0, &error, true, time(NULL)))) {
 			if (error) {
-				php_stream_wrapper_log_error(wrapper, options, "%s", error);
+				php_stream_wrapper_log_warn(wrapper, context, options, CreateFailed, "%s", error);
 				efree(error);
 			} else {
-				php_stream_wrapper_log_error(wrapper, options, "phar error: file \"%s\" could not be created in phar \"%s\"", internal_file, ZSTR_VAL(resource->host));
+				php_stream_wrapper_log_warn(wrapper, context, options, CreateFailed,
+					"phar error: file \"%s\" could not be created in phar \"%s\"", internal_file, ZSTR_VAL(resource->host));
 			}
 			efree(internal_file);
 			php_url_free(resource);
 			return NULL;
 		}
-		if (error) {
-			efree(error);
-		}
 		fpf = php_stream_alloc(&phar_ops, idata, NULL, mode);
 		php_url_free(resource);
 		efree(internal_file);
 
-		if (context && Z_TYPE(context->options) != IS_UNDEF && (pzoption = zend_hash_str_find_ind(HASH_OF(&context->options), "phar", sizeof("phar")-1)) != NULL) {
-			pharcontext = HASH_OF(pzoption);
+		if (context && Z_TYPE(context->options) != IS_UNDEF && (pzoption = zend_hash_str_find(Z_ARR(context->options), "phar", sizeof("phar")-1)) != NULL) {
+			ZEND_ASSERT(Z_TYPE_P(pzoption) == IS_ARRAY);
+			pharcontext = Z_ARR_P(pzoption);
 			if (idata->internal_file->uncompressed_filesize == 0
 				&& idata->internal_file->compressed_filesize == 0
 				&& (pzoption = zend_hash_str_find_ind(pharcontext, "compress", sizeof("compress")-1)) != NULL
@@ -229,25 +234,27 @@ static php_stream * phar_wrapper_open_url(php_stream_wrapper *wrapper, const cha
 			}
 		}
 		if (opened_path) {
-			*opened_path = zend_strpprintf_unchecked(MAXPATHLEN, "phar://%s/%S", idata->phar->fname, idata->internal_file->filename);
+			*opened_path = zend_strpprintf_unchecked(MAXPATHLEN, "phar://%S/%S", idata->phar->fname, idata->internal_file->filename);
 		}
 		return fpf;
 	} else {
 		if (!*internal_file && (options & STREAM_OPEN_FOR_INCLUDE)) {
 			/* retrieve the stub */
-			if (FAILURE == phar_get_archive(&phar, ZSTR_VAL(resource->host), ZSTR_LEN(resource->host), NULL, 0, NULL)) {
-				php_stream_wrapper_log_error(wrapper, options, "file %s is not a valid phar archive", ZSTR_VAL(resource->host));
+			phar = phar_get_archive(ZSTR_VAL(resource->host), ZSTR_LEN(resource->host), NULL, 0, NULL);
+			if (!phar) {
+				php_stream_wrapper_log_warn(wrapper, context, options, InvalidFormat,
+					"file %s is not a valid phar archive", ZSTR_VAL(resource->host));
 				efree(internal_file);
 				php_url_free(resource);
 				return NULL;
 			}
 			if (phar->is_tar || phar->is_zip) {
-				if ((FAILURE == phar_get_entry_data(&idata, ZSTR_VAL(resource->host), ZSTR_LEN(resource->host), ".phar/stub.php", sizeof(".phar/stub.php")-1, "r", 0, &error, false)) || !idata) {
+				if ((FAILURE == phar_get_entry_data(&idata, resource->host, ".phar/stub.php", sizeof(".phar/stub.php")-1, "r", 0, &error, false)) || !idata) {
 					goto idata_error;
 				}
 				efree(internal_file);
 				if (opened_path) {
-					*opened_path = strpprintf(MAXPATHLEN, "%s", phar->fname);
+					*opened_path = zend_string_copy(phar->fname);
 				}
 				php_url_free(resource);
 				goto phar_stub;
@@ -256,7 +263,8 @@ static php_stream * phar_wrapper_open_url(php_stream_wrapper *wrapper, const cha
 				if (stream == NULL) {
 					stream = phar_open_archive_fp(phar);
 					if (UNEXPECTED(!stream)) {
-						php_stream_wrapper_log_error(wrapper, options, "phar error: could not reopen phar \"%s\"", ZSTR_VAL(resource->host));
+						php_stream_wrapper_log_warn(wrapper, context, options, OpenFailed,
+							"phar error: could not reopen phar \"%s\"", ZSTR_VAL(resource->host));
 						efree(internal_file);
 						php_url_free(resource);
 						return NULL;
@@ -283,20 +291,21 @@ static php_stream * phar_wrapper_open_url(php_stream_wrapper *wrapper, const cha
 				++(entry->fp_refcount);
 				php_url_free(resource);
 				if (opened_path) {
-					*opened_path = strpprintf(MAXPATHLEN, "%s", phar->fname);
+					*opened_path = zend_string_copy(phar->fname);
 				}
 				efree(internal_file);
 				goto phar_stub;
 			}
 		}
 		/* read-only access is allowed to magic files in .phar directory */
-		if ((FAILURE == phar_get_entry_data(&idata, ZSTR_VAL(resource->host), ZSTR_LEN(resource->host), internal_file, strlen(internal_file), "r", 0, &error, false)) || !idata) {
+		if ((FAILURE == phar_get_entry_data(&idata, resource->host, internal_file, strlen(internal_file), "r", 0, &error, false)) || !idata) {
 idata_error:
 			if (error) {
-				php_stream_wrapper_log_error(wrapper, options, "%s", error);
+				php_stream_wrapper_log_warn(wrapper, context, options, NotFound, "%s", error);
 				efree(error);
 			} else {
-				php_stream_wrapper_log_error(wrapper, options, "phar error: \"%s\" is not a file in phar \"%s\"", internal_file, ZSTR_VAL(resource->host));
+				php_stream_wrapper_log_warn(wrapper, context, options, NotFound,
+					"phar error: \"%s\" is not a file in phar \"%s\"", internal_file, ZSTR_VAL(resource->host));
 			}
 			efree(internal_file);
 			php_url_free(resource);
@@ -305,7 +314,7 @@ static php_stream * phar_wrapper_open_url(php_stream_wrapper *wrapper, const cha
 	}
 	php_url_free(resource);
 #ifdef MBO_0
-		fprintf(stderr, "Pharname:   %s\n", idata->phar->fname);
+		fprintf(stderr, "Pharname:   %s\n", ZSTR_VAL(idata->phar->fname));
 		fprintf(stderr, "Filename:   %s\n", internal_file);
 		fprintf(stderr, "Entry:      %s\n", ZSTR_VAL(idata->internal_file->filename));
 		fprintf(stderr, "Size:       %u\n", idata->internal_file->uncompressed_filesize);
@@ -314,7 +323,7 @@ static php_stream * phar_wrapper_open_url(php_stream_wrapper *wrapper, const cha
 
 	/* check length, crc32 */
 	if (!idata->internal_file->is_crc_checked && phar_postprocess_file(idata, idata->internal_file->crc32, &error, 2) != SUCCESS) {
-		php_stream_wrapper_log_error(wrapper, options, "%s", error);
+		php_stream_wrapper_log_warn(wrapper, context, options, ArchivingFailed, "%s", error);
 		efree(error);
 		phar_entry_delref(idata);
 		efree(internal_file);
@@ -322,7 +331,7 @@ static php_stream * phar_wrapper_open_url(php_stream_wrapper *wrapper, const cha
 	}
 
 	if (!PHAR_G(cwd_init) && (options & STREAM_OPEN_FOR_INCLUDE)) {
-		char *entry = ZSTR_VAL(idata->internal_file->filename), *cwd;
+		const char *entry = ZSTR_VAL(idata->internal_file->filename), *cwd;
 
 		PHAR_G(cwd_init) = 1;
 		if ((idata->phar->is_tar || idata->phar->is_zip) && zend_string_equals_literal(idata->internal_file->filename, ".phar/stub.php")) {
@@ -338,7 +347,7 @@ static php_stream * phar_wrapper_open_url(php_stream_wrapper *wrapper, const cha
 		}
 	}
 	if (opened_path) {
-		*opened_path = zend_strpprintf_unchecked(MAXPATHLEN, "phar://%s/%S", idata->phar->fname, idata->internal_file->filename);
+		*opened_path = zend_strpprintf_unchecked(MAXPATHLEN, "phar://%S/%S", idata->phar->fname, idata->internal_file->filename);
 	}
 	efree(internal_file);
 phar_stub:
@@ -353,11 +362,11 @@ static php_stream * phar_wrapper_open_url(php_stream_wrapper *wrapper, const cha
 static int phar_stream_close(php_stream *stream, int close_handle) /* {{{ */
 {
 	/* for some reasons phar needs to be flushed even if there is no write going on */
-	phar_stream_flush(stream);
+	int ret = phar_stream_flush(stream);
 
 	phar_entry_delref((phar_entry_data *)stream->abstract);
 
-	return 0;
+	return ret;
 }
 /* }}} */
 
@@ -368,9 +377,9 @@ static ssize_t phar_stream_read(php_stream *stream, char *buf, size_t count) /*
 {
 	phar_entry_data *data = (phar_entry_data *)stream->abstract;
 	ssize_t got;
-	phar_entry_info *entry;
+	const phar_entry_info *entry;
 
-	if (data->internal_file->link) {
+	if (data->internal_file->symlink) {
 		entry = phar_get_link_source(data->internal_file);
 	} else {
 		entry = data->internal_file;
@@ -398,11 +407,11 @@ static ssize_t phar_stream_read(php_stream *stream, char *buf, size_t count) /*
 static int phar_stream_seek(php_stream *stream, zend_off_t offset, int whence, zend_off_t *newoffset) /* {{{ */
 {
 	phar_entry_data *data = (phar_entry_data *)stream->abstract;
-	phar_entry_info *entry;
+	const phar_entry_info *entry;
 	int res;
 	zend_ulong temp;
 
-	if (data->internal_file->link) {
+	if (data->internal_file->symlink) {
 		entry = phar_get_link_source(data->internal_file);
 	} else {
 		entry = data->internal_file;
@@ -445,7 +454,9 @@ static ssize_t phar_stream_write(php_stream *stream, const char *buf, size_t cou
 
 	php_stream_seek(data->fp, data->position + data->zero, SEEK_SET);
 	if (count != php_stream_write(data->fp, buf, count)) {
-		php_stream_wrapper_log_error(stream->wrapper, stream->flags, "phar error: Could not write %zu characters to \"%s\" in phar \"%s\"", count, ZSTR_VAL(data->internal_file->filename), data->phar->fname);
+		php_stream_warn(stream, WriteFailed,
+			"phar error: Could not write %zu characters to \"%s\" in phar \"%s\"",
+			count, ZSTR_VAL(data->internal_file->filename),  ZSTR_VAL(data->phar->fname));
 		return -1;
 	}
 	data->position = php_stream_tell(data->fp) - data->zero;
@@ -466,13 +477,13 @@ static int phar_stream_flush(php_stream *stream) /* {{{ */
 {
 	char *error;
 	int ret;
-	phar_entry_data *data = (phar_entry_data *) stream->abstract;
+	const phar_entry_data *data = stream->abstract;
 
 	if (data->internal_file->is_modified) {
 		data->internal_file->timestamp = time(0);
 		ret = phar_flush(data->phar, &error);
 		if (error) {
-			php_stream_wrapper_log_error(stream->wrapper, REPORT_ERRORS, "%s", error);
+			php_stream_warn(stream, FlushFailed, "%s", error);
 			efree(error);
 		}
 		return ret;
@@ -486,7 +497,7 @@ static int phar_stream_flush(php_stream *stream) /* {{{ */
 /**
  * stat an opened phar file handle stream, used by phar_stat()
  */
-void phar_dostat(phar_archive_data *phar, phar_entry_info *data, php_stream_statbuf *ssb, bool is_temp_dir)
+static void phar_dostat(const phar_archive_data *phar, const phar_entry_info *data, php_stream_statbuf *ssb, bool is_temp_dir)
 {
 	memset(ssb, 0, sizeof(php_stream_statbuf));
 
@@ -540,7 +551,7 @@ void phar_dostat(phar_archive_data *phar, phar_entry_info *data, php_stream_stat
  */
 static int phar_stream_stat(php_stream *stream, php_stream_statbuf *ssb) /* {{{ */
 {
-	phar_entry_data *data = (phar_entry_data *)stream->abstract;
+	const phar_entry_data *data = stream->abstract;
 
 	/* If ssb is NULL then someone is misbehaving */
 	if (!ssb) {
@@ -558,13 +569,11 @@ static int phar_stream_stat(php_stream *stream, php_stream_statbuf *ssb) /* {{{
 static int phar_wrapper_stat(php_stream_wrapper *wrapper, const char *url, int flags,
 				  php_stream_statbuf *ssb, php_stream_context *context) /* {{{ */
 {
-	php_url *resource = NULL;
 	char *internal_file;
-	phar_archive_data *phar;
-	phar_entry_info *entry;
 	size_t internal_file_len;
 
-	if ((resource = phar_parse_url(wrapper, url, "r", flags|PHP_STREAM_URL_STAT_QUIET)) == NULL) {
+	php_url *resource = phar_parse_url(wrapper, context, url, "r", flags|PHP_STREAM_URL_STAT_QUIET);
+	if (!resource) {
 		return FAILURE;
 	}
 
@@ -583,7 +592,8 @@ static int phar_wrapper_stat(php_stream_wrapper *wrapper, const char *url, int f
 
 	internal_file = ZSTR_VAL(resource->path) + 1; /* strip leading "/" */
 	/* find the phar in our trusty global hash indexed by alias (host of phar://blah.phar/file.whatever) */
-	if (FAILURE == phar_get_archive(&phar, ZSTR_VAL(resource->host), ZSTR_LEN(resource->host), NULL, 0, NULL)) {
+	phar_archive_data *phar = phar_get_archive(ZSTR_VAL(resource->host), ZSTR_LEN(resource->host), NULL, 0, NULL);
+	if (!phar) {
 		php_url_free(resource);
 		return FAILURE;
 	}
@@ -599,7 +609,8 @@ static int phar_wrapper_stat(php_stream_wrapper *wrapper, const char *url, int f
 	}
 	internal_file_len = strlen(internal_file);
 	/* search through the manifest of files, and if we have an exact match, it's a file */
-	if (NULL != (entry = zend_hash_str_find_ptr(&phar->manifest, internal_file, internal_file_len))) {
+	phar_entry_info *entry = zend_hash_str_find_ptr(&phar->manifest, internal_file, internal_file_len);
+	if (entry) {
 		phar_dostat(phar, entry, ssb, false);
 		php_url_free(resource);
 		return SUCCESS;
@@ -638,7 +649,9 @@ static int phar_wrapper_stat(php_stream_wrapper *wrapper, const char *url, int f
 					goto free_resource;
 				}
 				efree(test);
-				if (NULL == (entry = zend_hash_str_find_ptr(&phar->manifest, internal_file, internal_file_len))) {
+
+				entry = zend_hash_str_find_ptr(&phar->manifest, internal_file, internal_file_len);
+				if (!entry) {
 					goto free_resource;
 				}
 				phar_dostat(phar, entry, ssb, false);
@@ -658,60 +671,64 @@ static int phar_wrapper_stat(php_stream_wrapper *wrapper, const char *url, int f
  */
 static int phar_wrapper_unlink(php_stream_wrapper *wrapper, const char *url, int options, php_stream_context *context) /* {{{ */
 {
-	php_url *resource;
 	char *internal_file, *error;
 	size_t internal_file_len;
 	phar_entry_data *idata;
-	phar_archive_data *pphar;
 
-	if ((resource = phar_parse_url(wrapper, url, "rb", options)) == NULL) {
-		php_stream_wrapper_log_error(wrapper, options, "phar error: unlink failed");
+	php_url *resource = phar_parse_url(wrapper, context, url, "rb", options);
+	if (!resource) {
+		php_stream_wrapper_log_warn(wrapper, context, options, UnlinkFailed,
+			"phar error: unlink failed");
 		return 0;
 	}
 
 	/* we must have at the very least phar://alias.phar/internalfile.php */
 	if (!resource->scheme || !resource->host || !resource->path) {
 		php_url_free(resource);
-		php_stream_wrapper_log_error(wrapper, options, "phar error: invalid url \"%s\"", url);
+		php_stream_wrapper_log_warn(wrapper, context, options, InvalidUrl,
+			"phar error: invalid url \"%s\"", url);
 		return 0;
 	}
 
 	if (!zend_string_equals_literal_ci(resource->scheme, "phar")) {
 		php_url_free(resource);
-		php_stream_wrapper_log_error(wrapper, options, "phar error: not a phar stream url \"%s\"", url);
+		php_stream_wrapper_log_warn(wrapper, context, options, ProtocolUnsupported,
+			"phar error: not a phar stream url \"%s\"", url);
 		return 0;
 	}
 
 	phar_request_initialize();
 
-	pphar = zend_hash_find_ptr(&(PHAR_G(phar_fname_map)), resource->host);
+	const phar_archive_data *pphar = zend_hash_find_ptr(&(PHAR_G(phar_fname_map)), resource->host);
 	if (PHAR_G(readonly) && (!pphar || !pphar->is_data)) {
 		php_url_free(resource);
-		php_stream_wrapper_log_error(wrapper, options, "phar error: write operations disabled by the php.ini setting phar.readonly");
+		php_stream_wrapper_log_warn(wrapper, context, options, Readonly,
+			"phar error: write operations disabled by the php.ini setting phar.readonly");
 		return 0;
 	}
 
 	/* need to copy to strip leading "/", will get touched again */
 	internal_file = estrndup(ZSTR_VAL(resource->path) + 1, ZSTR_LEN(resource->path) - 1);
 	internal_file_len = ZSTR_LEN(resource->path) - 1;
-	if (FAILURE == phar_get_entry_data(&idata, ZSTR_VAL(resource->host), ZSTR_LEN(resource->host), internal_file, internal_file_len, "r", 0, &error, true)) {
+	if (FAILURE == phar_get_entry_data(&idata, resource->host, internal_file, internal_file_len, "r", 0, &error, true)) {
 		/* constraints of fp refcount were not met */
 		if (error) {
-			php_stream_wrapper_log_error(wrapper, options, "unlink of \"%s\" failed: %s", url, error);
+			php_stream_wrapper_log_warn(wrapper, context, options, UnlinkFailed,
+				"unlink of \"%s\" failed: %s", url, error);
 			efree(error);
 		} else {
-			php_stream_wrapper_log_error(wrapper, options, "unlink of \"%s\" failed, file does not exist", url);
+			php_stream_wrapper_log_warn(wrapper, context, options, NotFound,
+				"unlink of \"%s\" failed, file does not exist", url);
 		}
 		efree(internal_file);
 		php_url_free(resource);
 		return 0;
 	}
-	if (error) {
-		efree(error);
-	}
 	if (idata->internal_file->fp_refcount > 1) {
 		/* more than just our fp resource is open for this file */
-		php_stream_wrapper_log_error(wrapper, options, "phar error: \"%s\" in phar \"%s\", has open file pointers, cannot unlink", internal_file, ZSTR_VAL(resource->host));
+		php_stream_wrapper_log_warn(wrapper, context, options, UnlinkFailed,
+			"phar error: \"%s\" in phar \"%s\", has open file pointers, cannot unlink",
+			internal_file, ZSTR_VAL(resource->host));
 		efree(internal_file);
 		php_url_free(resource);
 		phar_entry_delref(idata);
@@ -721,7 +738,7 @@ static int phar_wrapper_unlink(php_stream_wrapper *wrapper, const char *url, int
 	efree(internal_file);
 	phar_entry_remove(idata, &error);
 	if (error) {
-		php_stream_wrapper_log_error(wrapper, options, "%s", error);
+		php_stream_wrapper_log_warn(wrapper, context, options, UnlinkFailed, "%s", error);
 		efree(error);
 	}
 	return 1;
@@ -730,53 +747,52 @@ static int phar_wrapper_unlink(php_stream_wrapper *wrapper, const char *url, int
 
 static int phar_wrapper_rename(php_stream_wrapper *wrapper, const char *url_from, const char *url_to, int options, php_stream_context *context) /* {{{ */
 {
-	php_url *resource_from, *resource_to;
 	char *error;
-	phar_archive_data *phar, *pfrom, *pto;
-	phar_entry_info *entry;
 	bool is_dir = false;
 	bool is_modified = false;
 
 	error = NULL;
 
-	if ((resource_from = phar_parse_url(wrapper, url_from, "wb", options|PHP_STREAM_URL_STAT_QUIET)) == NULL) {
-		php_error_docref(NULL, E_WARNING, "phar error: cannot rename \"%s\" to \"%s\": invalid or non-writable url \"%s\"", url_from, url_to, url_from);
+	php_url *resource_from = phar_parse_url(wrapper, context, url_from, "wb", options|PHP_STREAM_URL_STAT_QUIET);
+	if (!resource_from) {
+		php_stream_wrapper_warn(wrapper, context, options, InvalidUrl,
+			"phar error: cannot rename \"%s\" to \"%s\": invalid or non-writable url \"%s\"",
+			url_from, url_to, url_from);
 		return 0;
 	}
-	if (SUCCESS != phar_get_archive(&pfrom, ZSTR_VAL(resource_from->host), ZSTR_LEN(resource_from->host), NULL, 0, &error)) {
-		pfrom = NULL;
-		if (error) {
-			efree(error);
-		}
-	}
+
+	phar_archive_data *pfrom = phar_get_archive(ZSTR_VAL(resource_from->host), ZSTR_LEN(resource_from->host), NULL, 0, NULL);
 	if (PHAR_G(readonly) && (!pfrom || !pfrom->is_data)) {
 		php_url_free(resource_from);
-		php_error_docref(NULL, E_WARNING, "phar error: Write operations disabled by the php.ini setting phar.readonly");
+		php_stream_wrapper_warn(wrapper, context, options, Readonly,
+			"phar error: Write operations disabled by the php.ini setting phar.readonly");
 		return 0;
 	}
 
-	if ((resource_to = phar_parse_url(wrapper, url_to, "wb", options|PHP_STREAM_URL_STAT_QUIET)) == NULL) {
+	php_url *resource_to = phar_parse_url(wrapper, context, url_to, "wb", options|PHP_STREAM_URL_STAT_QUIET);
+	if (!resource_to) {
 		php_url_free(resource_from);
-		php_error_docref(NULL, E_WARNING, "phar error: cannot rename \"%s\" to \"%s\": invalid or non-writable url \"%s\"", url_from, url_to, url_to);
+		php_stream_wrapper_warn(wrapper, context, options, InvalidUrl,
+			"phar error: cannot rename \"%s\" to \"%s\": invalid or non-writable url \"%s\"",
+			url_from, url_to, url_to);
 		return 0;
 	}
-	if (SUCCESS != phar_get_archive(&pto, ZSTR_VAL(resource_to->host), ZSTR_LEN(resource_to->host), NULL, 0, &error)) {
-		if (error) {
-			efree(error);
-		}
-		pto = NULL;
-	}
+
+	phar_archive_data *pto = phar_get_archive(ZSTR_VAL(resource_to->host), ZSTR_LEN(resource_to->host), NULL, 0, NULL);
 	if (PHAR_G(readonly) && (!pto || !pto->is_data)) {
 		php_url_free(resource_from);
 		php_url_free(resource_to);
-		php_error_docref(NULL, E_WARNING, "phar error: Write operations disabled by the php.ini setting phar.readonly");
+		php_stream_wrapper_warn(wrapper, context, options, Readonly,
+			"phar error: Write operations disabled by the php.ini setting phar.readonly");
 		return 0;
 	}
 
 	if (!zend_string_equals(resource_from->host, resource_to->host)) {
 		php_url_free(resource_from);
 		php_url_free(resource_to);
-		php_error_docref(NULL, E_WARNING, "phar error: cannot rename \"%s\" to \"%s\", not within the same phar archive", url_from, url_to);
+		php_stream_wrapper_warn(wrapper, context, options, RenameFailed,
+			"phar error: cannot rename \"%s\" to \"%s\", not within the same phar archive",
+			url_from, url_to);
 		return 0;
 	}
 
@@ -784,35 +800,45 @@ static int phar_wrapper_rename(php_stream_wrapper *wrapper, const char *url_from
 	if (!resource_from->scheme || !resource_from->host || !resource_from->path) {
 		php_url_free(resource_from);
 		php_url_free(resource_to);
-		php_error_docref(NULL, E_WARNING, "phar error: cannot rename \"%s\" to \"%s\": invalid url \"%s\"", url_from, url_to, url_from);
+		php_stream_wrapper_warn(wrapper, context, options, InvalidUrl,
+			"phar error: cannot rename \"%s\" to \"%s\": invalid url \"%s\"",
+			url_from, url_to, url_from);
 		return 0;
 	}
 
 	if (!resource_to->scheme || !resource_to->host || !resource_to->path) {
 		php_url_free(resource_from);
 		php_url_free(resource_to);
-		php_error_docref(NULL, E_WARNING, "phar error: cannot rename \"%s\" to \"%s\": invalid url \"%s\"", url_from, url_to, url_to);
+		php_stream_wrapper_warn(wrapper, context, options, InvalidUrl,
+			"phar error: cannot rename \"%s\" to \"%s\": invalid url \"%s\"",
+			url_from, url_to, url_to);
 		return 0;
 	}
 
 	if (!zend_string_equals_literal_ci(resource_from->scheme, "phar")) {
 		php_url_free(resource_from);
 		php_url_free(resource_to);
-		php_error_docref(NULL, E_WARNING, "phar error: cannot rename \"%s\" to \"%s\": not a phar stream url \"%s\"", url_from, url_to, url_from);
+		php_stream_wrapper_warn(wrapper, context, options, ProtocolUnsupported,
+			"phar error: cannot rename \"%s\" to \"%s\": not a phar stream url \"%s\"",
+			url_from, url_to, url_from);
 		return 0;
 	}
 
 	if (!zend_string_equals_literal_ci(resource_to->scheme, "phar")) {
 		php_url_free(resource_from);
 		php_url_free(resource_to);
-		php_error_docref(NULL, E_WARNING, "phar error: cannot rename \"%s\" to \"%s\": not a phar stream url \"%s\"", url_from, url_to, url_to);
+		php_stream_wrapper_warn(wrapper, context, options, ProtocolUnsupported,
+			"phar error: cannot rename \"%s\" to \"%s\": not a phar stream url \"%s\"",
+			url_from, url_to, url_to);
 		return 0;
 	}
 
-	if (SUCCESS != phar_get_archive(&phar, ZSTR_VAL(resource_from->host), ZSTR_LEN(resource_from->host), NULL, 0, &error)) {
+	phar_archive_data *phar = phar_get_archive(ZSTR_VAL(resource_from->host), ZSTR_LEN(resource_from->host), NULL, 0, &error);
+	if (!phar) {
 		php_url_free(resource_from);
 		php_url_free(resource_to);
-		php_error_docref(NULL, E_WARNING, "phar error: cannot rename \"%s\" to \"%s\": %s", url_from, url_to, error);
+		php_stream_wrapper_warn(wrapper, context, options, RenameFailed,
+			"phar error: cannot rename \"%s\" to \"%s\": %s", url_from, url_to, error);
 		efree(error);
 		return 0;
 	}
@@ -820,18 +846,23 @@ static int phar_wrapper_rename(php_stream_wrapper *wrapper, const char *url_from
 	if (phar->is_persistent && FAILURE == phar_copy_on_write(&phar)) {
 		php_url_free(resource_from);
 		php_url_free(resource_to);
-		php_error_docref(NULL, E_WARNING, "phar error: cannot rename \"%s\" to \"%s\": could not make cached phar writeable", url_from, url_to);
+		php_stream_wrapper_warn(wrapper, context, options, RenameFailed,
+			"phar error: cannot rename \"%s\" to \"%s\": could not make cached phar writeable",
+			url_from, url_to);
 		return 0;
 	}
 
-	if (NULL != (entry = zend_hash_str_find_ptr(&(phar->manifest), ZSTR_VAL(resource_from->path)+1, ZSTR_LEN(resource_from->path)-1))) {
+	phar_entry_info *entry = zend_hash_str_find_ptr(&(phar->manifest), ZSTR_VAL(resource_from->path)+1, ZSTR_LEN(resource_from->path)-1);
+	if (entry) {
 		phar_entry_info new, *source;
 
 		/* perform rename magic */
 		if (entry->is_deleted) {
 			php_url_free(resource_from);
 			php_url_free(resource_to);
-			php_error_docref(NULL, E_WARNING, "phar error: cannot rename \"%s\" to \"%s\" from extracted phar archive, source has been deleted", url_from, url_to);
+			php_stream_wrapper_warn(wrapper, context, options, NotFound,
+				"phar error: cannot rename \"%s\" to \"%s\" from extracted phar archive, source has been deleted",
+				url_from, url_to);
 			return 0;
 		}
 		/* transfer all data over to the new entry */
@@ -840,7 +871,8 @@ static int phar_wrapper_rename(php_stream_wrapper *wrapper, const char *url_from
 		entry->is_deleted = 1;
 		entry->fp = NULL;
 		ZVAL_UNDEF(&entry->metadata_tracker.val);
-		entry->link = entry->tmp = NULL;
+		entry->symlink = NULL;
+		entry->tmp = NULL;
 		source = entry;
 
 		/* add to the manifest, and then store the pointer to the new guy in entry
@@ -851,7 +883,8 @@ static int phar_wrapper_rename(php_stream_wrapper *wrapper, const char *url_from
 		if (FAILURE == phar_copy_entry_fp(source, entry, &error)) {
 			php_url_free(resource_from);
 			php_url_free(resource_to);
-			php_error_docref(NULL, E_WARNING, "phar error: cannot rename \"%s\" to \"%s\": %s", url_from, url_to, error);
+			php_stream_wrapper_warn(wrapper, context, options, RenameFailed,
+				"phar error: cannot rename \"%s\" to \"%s\": %s", url_from, url_to, error);
 			efree(error);
 			zend_hash_del(&phar->manifest, entry->filename);
 			return 0;
@@ -865,7 +898,9 @@ static int phar_wrapper_rename(php_stream_wrapper *wrapper, const char *url_from
 			/* file does not exist */
 			php_url_free(resource_from);
 			php_url_free(resource_to);
-			php_error_docref(NULL, E_WARNING, "phar error: cannot rename \"%s\" to \"%s\" from extracted phar archive, source does not exist", url_from, url_to);
+			php_stream_wrapper_warn(wrapper, context, options, NotFound,
+				"phar error: cannot rename \"%s\" to \"%s\" from extracted phar archive, source does not exist",
+				url_from, url_to);
 			return 0;
 
 		}
@@ -944,7 +979,8 @@ static int phar_wrapper_rename(php_stream_wrapper *wrapper, const char *url_from
 		if (error) {
 			php_url_free(resource_from);
 			php_url_free(resource_to);
-			php_error_docref(NULL, E_WARNING, "phar error: cannot rename \"%s\" to \"%s\": %s", url_from, url_to, error);
+			php_stream_wrapper_warn(wrapper, context, options, RenameFailed,
+				"phar error: cannot rename \"%s\" to \"%s\": %s", url_from, url_to, error);
 			efree(error);
 			return 0;
 		}
diff --git a/ext/phar/stream.h b/ext/phar/stream.h
index 83b395b4cfca..ebac093402b1 100644
--- a/ext/phar/stream.h
+++ b/ext/phar/stream.h
@@ -2,15 +2,13 @@
   +----------------------------------------------------------------------+
   | phar php single-file executable PHP extension                        |
   +----------------------------------------------------------------------+
-  | Copyright (c) The PHP Group                                          |
+  | Copyright © The PHP Group and Contributors.                          |
   +----------------------------------------------------------------------+
-  | This source file is subject to version 3.01 of the PHP license,      |
-  | that is bundled with this package in the file LICENSE, and is        |
-  | available through the world-wide-web at the following url:           |
-  | https://www.php.net/license/3_01.txt                                 |
-  | If you did not receive a copy of the PHP license and are unable to   |
-  | obtain it through the world-wide-web, please send a note to          |
-  | license@php.net so we can mail you a copy immediately.               |
+  | This source file is subject to the Modified BSD License that is      |
+  | bundled with this package in the file LICENSE, and is available      |
+  | through the World Wide Web at .        |
+  |                                                                      |
+  | SPDX-License-Identifier: BSD-3-Clause                                |
   +----------------------------------------------------------------------+
   | Authors: Gregory Beaver                              |
   |          Marcus Boerger                               |
@@ -20,7 +18,7 @@
 BEGIN_EXTERN_C()
 #include "ext/standard/url.h"
 
-php_url* phar_parse_url(php_stream_wrapper *wrapper, const char *filename, const char *mode, int options);
+php_url* phar_parse_url(php_stream_wrapper *wrapper, php_stream_context *context, const char *filename, const char *mode, int options);
 ZEND_ATTRIBUTE_NONNULL void phar_entry_remove(phar_entry_data *idata, char **error);
 
 static php_stream* phar_wrapper_open_url(php_stream_wrapper *wrapper, const char *path, const char *mode, int options, zend_string **opened_path, php_stream_context *context STREAMS_DC);
diff --git a/ext/phar/stub.h b/ext/phar/stub.h
index 2c62e05900ac..79887a62d7b8 100644
--- a/ext/phar/stub.h
+++ b/ext/phar/stub.h
@@ -2,15 +2,13 @@
   +----------------------------------------------------------------------+
   | phar php single-file executable PHP extension generated stub         |
   +----------------------------------------------------------------------+
-  | Copyright (c) The PHP Group                                          |
+  | Copyright © The PHP Group and Contributors.                          |
   +----------------------------------------------------------------------+
-  | This source file is subject to version 3.01 of the PHP license,      |
-  | that is bundled with this package in the file LICENSE, and is        |
-  | available through the world-wide-web at the following url:           |
-  | https://www.php.net/license/3_01.txt                                 |
-  | If you did not receive a copy of the PHP license and are unable to   |
-  | obtain it through the world-wide-web, please send a note to          |
-  | license@php.net so we can mail you a copy immediately.               |
+  | This source file is subject to the Modified BSD License that is      |
+  | bundled with this package in the file LICENSE, and is available      |
+  | through the World Wide Web at .        |
+  |                                                                      |
+  | SPDX-License-Identifier: BSD-3-Clause                                |
   +----------------------------------------------------------------------+
   | Authors: Gregory Beaver                              |
   +----------------------------------------------------------------------+
diff --git a/ext/phar/tar.c b/ext/phar/tar.c
index 0c93de243adc..f85241ccc4e5 100644
--- a/ext/phar/tar.c
+++ b/ext/phar/tar.c
@@ -2,15 +2,13 @@
   +----------------------------------------------------------------------+
   | TAR archive support for Phar                                         |
   +----------------------------------------------------------------------+
-  | Copyright (c) The PHP Group                                          |
+  | Copyright © The PHP Group and Contributors.                          |
   +----------------------------------------------------------------------+
-  | This source file is subject to version 3.01 of the PHP license,      |
-  | that is bundled with this package in the file LICENSE, and is        |
-  | available through the world-wide-web at the following url:           |
-  | https://www.php.net/license/3_01.txt                                 |
-  | If you did not receive a copy of the PHP license and are unable to   |
-  | obtain it through the world-wide-web, please send a note to          |
-  | license@php.net so we can mail you a copy immediately.               |
+  | This source file is subject to the Modified BSD License that is      |
+  | bundled with this package in the file LICENSE, and is available      |
+  | through the World Wide Web at .        |
+  |                                                                      |
+  | SPDX-License-Identifier: BSD-3-Clause                                |
   +----------------------------------------------------------------------+
   | Authors: Dmitry Stogov                               |
   |          Gregory Beaver                              |
@@ -128,10 +126,16 @@ bool phar_is_tar(const char *buf, const char *fname) /* {{{ */
 }
 /* }}} */
 
-ZEND_ATTRIBUTE_NONNULL_ARGS(1, 7, 8) zend_result phar_open_or_create_tar(char *fname, size_t fname_len, char *alias, size_t alias_len, bool is_data, uint32_t options, phar_archive_data** pphar, char **error) /* {{{ */
-{
+ZEND_ATTRIBUTE_NONNULL_ARGS(1, 5, 6) zend_result phar_open_or_create_tar(
+	zend_string *fname,
+	/* copyable & hash update */ zend_string *alias,
+	bool is_data,
+	uint32_t options,
+	phar_archive_data** pphar,
+	char **error
+) {
 	phar_archive_data *phar;
-	zend_result ret = phar_create_or_parse_filename(fname, fname_len, alias, alias_len, is_data, options, &phar, error);
+	zend_result ret = phar_create_or_parse_filename(fname, alias, is_data, options, &phar, error);
 
 	if (FAILURE == ret) {
 		return FAILURE;
@@ -152,10 +156,9 @@ ZEND_ATTRIBUTE_NONNULL_ARGS(1, 7, 8) zend_result phar_open_or_create_tar(char *f
 	}
 
 	/* we've reached here - the phar exists and is a regular phar */
-	spprintf(error, 4096, "phar tar error: \"%s\" already exists as a regular phar and must be deleted from disk prior to creating as a tar-based phar", fname);
+	spprintf(error, 4096, "phar tar error: \"%s\" already exists as a regular phar and must be deleted from disk prior to creating as a tar-based phar", ZSTR_VAL(fname));
 	return FAILURE;
 }
-/* }}} */
 
 static zend_result phar_tar_process_metadata(phar_entry_info *entry, php_stream *fp) /* {{{ */
 {
@@ -199,8 +202,15 @@ static zend_result phar_tar_process_metadata(phar_entry_info *entry, php_stream
 }
 /* }}} */
 
-zend_result phar_parse_tarfile(php_stream* fp, char *fname, size_t fname_len, char *alias, size_t alias_len, phar_archive_data** pphar, uint32_t compression, char **error) /* {{{ */
-{
+zend_result phar_parse_tarfile(
+	php_stream* fp,
+	const char *fname,
+	size_t fname_len,
+	/* copyable & hash update */ zend_string *alias,
+	phar_archive_data** pphar,
+	uint32_t compression,
+	char **error
+) {
 	char buf[512], *actual_alias = NULL, *p;
 	phar_entry_info entry = {0};
 	size_t pos = 0, read, totalsize;
@@ -494,8 +504,8 @@ zend_result phar_parse_tarfile(php_stream* fp, char *fname, size_t fname_len, ch
 			entry.is_dir = 0;
 		}
 
-		entry.link = NULL;
-		/* link field is null-terminated unless it has 100 non-null chars.
+		entry.symlink = NULL;
+		/* linkname field is null-terminated unless it has 100 non-null chars.
 		 * Thus we cannot use strlen. */
 		linkname_len = zend_strnlen(hdr->linkname, 100);
 		if (entry.tar_type == TAR_LINK) {
@@ -508,9 +518,9 @@ zend_result phar_parse_tarfile(php_stream* fp, char *fname, size_t fname_len, ch
 				phar_destroy_phar_data(myphar);
 				return FAILURE;
 			}
-			entry.link = estrndup(hdr->linkname, linkname_len);
+			entry.symlink = zend_string_init(hdr->linkname, linkname_len, false);
 		} else if (entry.tar_type == TAR_SYMLINK) {
-			entry.link = estrndup(hdr->linkname, linkname_len);
+			entry.symlink = zend_string_init(hdr->linkname, linkname_len, false);
 		}
 		phar_set_inode(&entry);
 
@@ -628,27 +638,29 @@ zend_result phar_parse_tarfile(php_stream* fp, char *fname, size_t fname_len, ch
 		return FAILURE;
 	}
 
-	myphar->fname = pestrndup(fname, fname_len, myphar->is_persistent);
+	myphar->fname = zend_string_init(fname, fname_len, myphar->is_persistent);
+	if (myphar->is_persistent) {
+		GC_MAKE_PERSISTENT_LOCAL(myphar->fname);
+	}
 #ifdef PHP_WIN32
-	phar_unixify_path_separators(myphar->fname, fname_len);
+	phar_unixify_path_separators(ZSTR_VAL(myphar->fname), ZSTR_LEN(myphar->fname));
 #endif
-	myphar->fname_len = fname_len;
 	myphar->fp = fp;
-	p = strrchr(myphar->fname, '/');
+	p = strrchr(ZSTR_VAL(myphar->fname), '/');
 
 	if (p) {
-		myphar->ext = memchr(p, '.', (myphar->fname + fname_len) - p);
+		myphar->ext = memchr(p, '.', (ZSTR_VAL(myphar->fname) + ZSTR_LEN(myphar->fname)) - p);
 		if (myphar->ext == p) {
-			myphar->ext = memchr(p + 1, '.', (myphar->fname + fname_len) - p - 1);
+			myphar->ext = memchr(p + 1, '.', (ZSTR_VAL(myphar->fname) + ZSTR_LEN(myphar->fname)) - p - 1);
 		}
 		if (myphar->ext) {
-			myphar->ext_len = (myphar->fname + fname_len) - myphar->ext;
+			myphar->ext_len = (ZSTR_VAL(myphar->fname) + ZSTR_LEN(myphar->fname)) - myphar->ext;
 		}
 	}
 
 	phar_request_initialize();
 
-	if (NULL == (actual = zend_hash_str_add_ptr(&(PHAR_G(phar_fname_map)), myphar->fname, fname_len, myphar))) {
+	if (NULL == (actual = zend_hash_add_ptr(&(PHAR_G(phar_fname_map)), myphar->fname, myphar))) {
 		if (error) {
 			spprintf(error, 4096, "phar error: Unable to add tar-based phar \"%s\" to phar registry", fname);
 		}
@@ -660,40 +672,37 @@ zend_result phar_parse_tarfile(php_stream* fp, char *fname, size_t fname_len, ch
 	myphar = actual;
 
 	if (actual_alias) {
-		phar_archive_data *fd_ptr;
-
 		myphar->is_temporary_alias = 0;
-
-		if (NULL != (fd_ptr = zend_hash_str_find_ptr(&(PHAR_G(phar_alias_map)), actual_alias, myphar->alias_len))) {
-			if (SUCCESS != phar_free_alias(fd_ptr, actual_alias, myphar->alias_len)) {
+		phar_archive_data *fd_ptr = zend_hash_str_find_ptr(&(PHAR_G(phar_alias_map)), actual_alias, myphar->alias_len);
+		if (fd_ptr) {
+			if (SUCCESS != phar_free_alias(fd_ptr)) {
 				if (error) {
 					spprintf(error, 4096, "phar error: Unable to add tar-based phar \"%s\", alias is already in use", fname);
 				}
-				zend_hash_str_del(&(PHAR_G(phar_fname_map)), myphar->fname, fname_len);
+				zend_hash_del(&(PHAR_G(phar_fname_map)), myphar->fname);
 				return FAILURE;
 			}
 		}
 
 		zend_hash_str_add_ptr(&(PHAR_G(phar_alias_map)), actual_alias, myphar->alias_len, myphar);
 	} else {
-		phar_archive_data *fd_ptr;
-
-		if (alias_len) {
-			if (NULL != (fd_ptr = zend_hash_str_find_ptr(&(PHAR_G(phar_alias_map)), alias, alias_len))) {
-				if (SUCCESS != phar_free_alias(fd_ptr, alias, alias_len)) {
+		if (alias) {
+			phar_archive_data *fd_ptr = zend_hash_find_ptr(&(PHAR_G(phar_alias_map)), alias);
+			if (fd_ptr) {
+				if (SUCCESS != phar_free_alias(fd_ptr)) {
 					if (error) {
 						spprintf(error, 4096, "phar error: Unable to add tar-based phar \"%s\", alias is already in use", fname);
 					}
-					zend_hash_str_del(&(PHAR_G(phar_fname_map)), myphar->fname, fname_len);
+					zend_hash_del(&(PHAR_G(phar_fname_map)), myphar->fname);
 					return FAILURE;
 				}
 			}
-			zend_hash_str_add_ptr(&(PHAR_G(phar_alias_map)), alias, alias_len, myphar);
-			myphar->alias = pestrndup(alias, alias_len, myphar->is_persistent);
-			myphar->alias_len = alias_len;
+			zend_hash_add_ptr(&(PHAR_G(phar_alias_map)), alias, myphar);
+			myphar->alias = pestrndup(ZSTR_VAL(alias), ZSTR_LEN(alias), myphar->is_persistent);
+			myphar->alias_len = ZSTR_LEN(alias);
 		} else {
-			myphar->alias = pestrndup(myphar->fname, fname_len, myphar->is_persistent);
-			myphar->alias_len = fname_len;
+			myphar->alias = pestrndup(ZSTR_VAL(myphar->fname), ZSTR_LEN(myphar->fname), myphar->is_persistent);
+			myphar->alias_len = ZSTR_LEN(myphar->fname);
 		}
 
 		myphar->is_temporary_alias = 1;
@@ -705,7 +714,6 @@ zend_result phar_parse_tarfile(php_stream* fp, char *fname, size_t fname_len, ch
 
 	return SUCCESS;
 }
-/* }}} */
 
 struct _phar_pass_tar_info {
 	php_stream *old;
@@ -742,7 +750,7 @@ static int phar_tar_writeheaders_int(phar_entry_info *entry, void *argument) /*
 		char *boundary;
 		if (ZSTR_LEN(entry->filename) > 256) {
 			if (fp->error) {
-				spprintf(fp->error, 4096, "tar-based phar \"%s\" cannot be created, filename \"%s\" is too long for tar file format", entry->phar->fname, ZSTR_VAL(entry->filename));
+				spprintf(fp->error, 4096, "tar-based phar \"%s\" cannot be created, filename \"%s\" is too long for tar file format", ZSTR_VAL(entry->phar->fname), ZSTR_VAL(entry->filename));
 			}
 			return ZEND_HASH_APPLY_STOP;
 		}
@@ -752,7 +760,7 @@ static int phar_tar_writeheaders_int(phar_entry_info *entry, void *argument) /*
 		}
 		if (!*boundary || ((boundary - ZSTR_VAL(entry->filename)) > 155)) {
 			if (fp->error) {
-				spprintf(fp->error, 4096, "tar-based phar \"%s\" cannot be created, filename \"%s\" is too long for tar file format", entry->phar->fname, ZSTR_VAL(entry->filename));
+				spprintf(fp->error, 4096, "tar-based phar \"%s\" cannot be created, filename \"%s\" is too long for tar file format", ZSTR_VAL(entry->phar->fname), ZSTR_VAL(entry->filename));
 			}
 			return ZEND_HASH_APPLY_STOP;
 		}
@@ -766,14 +774,14 @@ static int phar_tar_writeheaders_int(phar_entry_info *entry, void *argument) /*
 
 	if (FAILURE == phar_tar_octal(header.size, entry->uncompressed_filesize, sizeof(header.size)-1)) {
 		if (fp->error) {
-			spprintf(fp->error, 4096, "tar-based phar \"%s\" cannot be created, filename \"%s\" is too large for tar file format", entry->phar->fname, ZSTR_VAL(entry->filename));
+			spprintf(fp->error, 4096, "tar-based phar \"%s\" cannot be created, filename \"%s\" is too large for tar file format", ZSTR_VAL(entry->phar->fname), ZSTR_VAL(entry->filename));
 		}
 		return ZEND_HASH_APPLY_STOP;
 	}
 
 	if (FAILURE == phar_tar_octal(header.mtime, entry->timestamp, sizeof(header.mtime)-1)) {
 		if (fp->error) {
-			spprintf(fp->error, 4096, "tar-based phar \"%s\" cannot be created, file modification time of file \"%s\" is too large for tar file format", entry->phar->fname, ZSTR_VAL(entry->filename));
+			spprintf(fp->error, 4096, "tar-based phar \"%s\" cannot be created, file modification time of file \"%s\" is too large for tar file format", ZSTR_VAL(entry->phar->fname), ZSTR_VAL(entry->filename));
 		}
 		return ZEND_HASH_APPLY_STOP;
 	}
@@ -781,10 +789,10 @@ static int phar_tar_writeheaders_int(phar_entry_info *entry, void *argument) /*
 	/* calc checksum */
 	header.typeflag = entry->tar_type;
 
-	if (entry->link) {
-		if (strlcpy(header.linkname, entry->link, sizeof(header.linkname)) >= sizeof(header.linkname)) {
+	if (entry->symlink) {
+		if (strlcpy(header.linkname, ZSTR_VAL(entry->symlink), sizeof(header.linkname)) >= sizeof(header.linkname)) {
 			if (fp->error) {
-				spprintf(fp->error, 4096, "tar-based phar \"%s\" cannot be created, link \"%s\" is too long for format", entry->phar->fname, entry->link);
+				spprintf(fp->error, 4096, "tar-based phar \"%s\" cannot be created, link \"%s\" is too long for format", ZSTR_VAL(entry->phar->fname), ZSTR_VAL(entry->symlink));
 			}
 			return ZEND_HASH_APPLY_STOP;
 		}
@@ -797,7 +805,7 @@ static int phar_tar_writeheaders_int(phar_entry_info *entry, void *argument) /*
 
 	if (FAILURE == phar_tar_octal(header.checksum, entry->crc32, sizeof(header.checksum)-1)) {
 		if (fp->error) {
-			spprintf(fp->error, 4096, "tar-based phar \"%s\" cannot be created, checksum of file \"%s\" is too large for tar file format", entry->phar->fname, ZSTR_VAL(entry->filename));
+			spprintf(fp->error, 4096, "tar-based phar \"%s\" cannot be created, checksum of file \"%s\" is too large for tar file format", ZSTR_VAL(entry->phar->fname), ZSTR_VAL(entry->filename));
 		}
 		return ZEND_HASH_APPLY_STOP;
 	}
@@ -805,9 +813,9 @@ static int phar_tar_writeheaders_int(phar_entry_info *entry, void *argument) /*
 	/* write header */
 	entry->header_offset = php_stream_tell(fp->new);
 
-	if (sizeof(header) != php_stream_write(fp->new, (char *) &header, sizeof(header))) {
+	if (sizeof(header) != php_stream_write(fp->new, (const char *) &header, sizeof(header))) {
 		if (fp->error) {
-			spprintf(fp->error, 4096, "tar-based phar \"%s\" cannot be created, header for  file \"%s\" could not be written", entry->phar->fname, ZSTR_VAL(entry->filename));
+			spprintf(fp->error, 4096, "tar-based phar \"%s\" cannot be created, header for  file \"%s\" could not be written", ZSTR_VAL(entry->phar->fname), ZSTR_VAL(entry->filename));
 		}
 		return ZEND_HASH_APPLY_STOP;
 	}
@@ -822,14 +830,14 @@ static int phar_tar_writeheaders_int(phar_entry_info *entry, void *argument) /*
 
 		if (-1 == phar_seek_efp(entry, 0, SEEK_SET, 0, false)) {
 			if (fp->error) {
-				spprintf(fp->error, 4096, "tar-based phar \"%s\" cannot be created, contents of file \"%s\" could not be written, seek failed", entry->phar->fname, ZSTR_VAL(entry->filename));
+				spprintf(fp->error, 4096, "tar-based phar \"%s\" cannot be created, contents of file \"%s\" could not be written, seek failed", ZSTR_VAL(entry->phar->fname), ZSTR_VAL(entry->filename));
 			}
 			return ZEND_HASH_APPLY_STOP;
 		}
 
 		if (SUCCESS != php_stream_copy_to_stream_ex(phar_get_efp(entry, false), fp->new, entry->uncompressed_filesize, NULL)) {
 			if (fp->error) {
-				spprintf(fp->error, 4096, "tar-based phar \"%s\" cannot be created, contents of file \"%s\" could not be written", entry->phar->fname, ZSTR_VAL(entry->filename));
+				spprintf(fp->error, 4096, "tar-based phar \"%s\" cannot be created, contents of file \"%s\" could not be written", ZSTR_VAL(entry->phar->fname), ZSTR_VAL(entry->filename));
 			}
 			return ZEND_HASH_APPLY_STOP;
 		}
@@ -909,9 +917,9 @@ ZEND_ATTRIBUTE_NONNULL static int phar_tar_setmetadata(const phar_metadata_track
 
 ZEND_ATTRIBUTE_NONNULL static int phar_tar_setupmetadata(zval *zv, void *argument) /* {{{ */
 {
-	struct _phar_pass_tar_info *i = (struct _phar_pass_tar_info *)argument;
+	const struct _phar_pass_tar_info *i = (struct _phar_pass_tar_info *)argument;
 	char **error = i->error;
-	phar_entry_info *entry = (phar_entry_info *)Z_PTR_P(zv), *metadata, newentry = {0};
+	phar_entry_info *entry = (phar_entry_info *)Z_PTR_P(zv), newentry = {0};
 
 	if (zend_string_starts_with_literal(entry->filename, ".phar/.metadata")) {
 		if (zend_string_equals_literal(entry->filename, ".phar/.metadata.bin")) {
@@ -939,7 +947,8 @@ ZEND_ATTRIBUTE_NONNULL static int phar_tar_setupmetadata(zval *zv, void *argumen
 		return ZEND_HASH_APPLY_KEEP;
 	}
 
-	if (NULL != (metadata = zend_hash_find_ptr(&entry->phar->manifest, lookfor))) {
+	phar_entry_info *metadata = zend_hash_find_ptr(&entry->phar->manifest, lookfor);
+	if (metadata) {
 		int ret;
 		ret = phar_tar_setmetadata(&entry->metadata_tracker, metadata, error);
 		zend_string_efree(lookfor);
@@ -951,7 +960,8 @@ ZEND_ATTRIBUTE_NONNULL static int phar_tar_setupmetadata(zval *zv, void *argumen
 	newentry.tar_type = TAR_FILE;
 	newentry.is_tar = 1;
 
-	if (NULL == (metadata = zend_hash_add_mem(&entry->phar->manifest, lookfor, &newentry, sizeof(phar_entry_info)))) {
+	metadata = zend_hash_add_mem(&entry->phar->manifest, lookfor, &newentry, sizeof(phar_entry_info));
+	if (!metadata) {
 		zend_string_efree(lookfor);
 		spprintf(error, 0, "phar tar error: unable to add magic metadata file to manifest for file \"%s\"", ZSTR_VAL(entry->filename));
 		return ZEND_HASH_APPLY_STOP;
@@ -969,9 +979,8 @@ ZEND_ATTRIBUTE_NONNULL_ARGS(1, 4) int phar_tar_flush(phar_archive_data *phar, ze
 	phar_entry_info entry = {0};
 	php_stream *oldfile, *newfile;
 	bool must_close_old_file = false;
-	size_t signature_length;
 	struct _phar_pass_tar_info pass;
-	char *buf, *signature, sigbuf[8];
+	char *buf, sigbuf[8];
 
 	entry.flags = PHAR_ENT_PERM_DEF_FILE;
 	entry.timestamp = time(NULL);
@@ -985,7 +994,7 @@ ZEND_ATTRIBUTE_NONNULL_ARGS(1, 4) int phar_tar_flush(phar_archive_data *phar, ze
 	entry.filename = NULL;
 
 	if (phar->is_persistent) {
-		spprintf(error, 0, "internal error: attempt to flush cached tar-based phar \"%s\"", phar->fname);
+		spprintf(error, 0, "internal error: attempt to flush cached tar-based phar \"%s\"", ZSTR_VAL(phar->fname));
 		return EOF;
 	}
 
@@ -1001,7 +1010,7 @@ ZEND_ATTRIBUTE_NONNULL_ARGS(1, 4) int phar_tar_flush(phar_archive_data *phar, ze
 			return EOF;
 		}
 		if (phar->alias_len != php_stream_write(entry.fp, phar->alias, phar->alias_len)) {
-			spprintf(error, 0, "unable to set alias in tar-based phar \"%s\"", phar->fname);
+			spprintf(error, 0, "unable to set alias in tar-based phar \"%s\"", ZSTR_VAL(phar->fname));
 			php_stream_close(entry.fp);
 			return EOF;
 		}
@@ -1021,7 +1030,7 @@ ZEND_ATTRIBUTE_NONNULL_ARGS(1, 4) int phar_tar_flush(phar_archive_data *phar, ze
 		char *pos = php_stristr(ZSTR_VAL(user_stub), halt_stub, ZSTR_LEN(user_stub), sizeof(halt_stub) - 1);
 
 		if (pos == NULL) {
-			spprintf(error, 0, "illegal stub for tar-based phar \"%s\"", phar->fname);
+			spprintf(error, 0, "illegal stub for tar-based phar \"%s\"", ZSTR_VAL(phar->fname));
 			return EOF;
 		}
 
@@ -1040,7 +1049,7 @@ ZEND_ATTRIBUTE_NONNULL_ARGS(1, 4) int phar_tar_flush(phar_archive_data *phar, ze
 			len != php_stream_write(entry.fp, ZSTR_VAL(user_stub), len)
 			|| end_sequence_len != php_stream_write(entry.fp, end_sequence, end_sequence_len)
 		) {
-			spprintf(error, 0, "unable to create stub from string in new tar-based phar \"%s\"", phar->fname);
+			spprintf(error, 0, "unable to create stub from string in new tar-based phar \"%s\"", ZSTR_VAL(phar->fname));
 			php_stream_close(entry.fp);
 			return EOF;
 		}
@@ -1057,7 +1066,7 @@ ZEND_ATTRIBUTE_NONNULL_ARGS(1, 4) int phar_tar_flush(phar_archive_data *phar, ze
 		if (sizeof(newstub)-1 != php_stream_write(entry.fp, newstub, sizeof(newstub)-1)) {
 			php_stream_close(entry.fp);
 			spprintf(error, 0, "unable to %s stub in%star-based phar \"%s\", failed",
-				user_stub ? "overwrite" : "create", user_stub ? " " : " new ", phar->fname);
+				user_stub ? "overwrite" : "create", user_stub ? " " : " new ", ZSTR_VAL(phar->fname));
 			return EOF;
 		}
 
@@ -1069,7 +1078,7 @@ ZEND_ATTRIBUTE_NONNULL_ARGS(1, 4) int phar_tar_flush(phar_archive_data *phar, ze
 				if (NULL == zend_hash_add_mem(&phar->manifest, entry.filename, &entry, sizeof(phar_entry_info))) {
 					php_stream_close(entry.fp);
 					zend_string_efree(entry.filename);
-					spprintf(error, 0, "unable to create stub in tar-based phar \"%s\"", phar->fname);
+					spprintf(error, 0, "unable to create stub in tar-based phar \"%s\"", ZSTR_VAL(phar->fname));
 					return EOF;
 				}
 			} else {
@@ -1086,7 +1095,7 @@ ZEND_ATTRIBUTE_NONNULL_ARGS(1, 4) int phar_tar_flush(phar_archive_data *phar, ze
 		must_close_old_file = false;
 		php_stream_rewind(oldfile);
 	} else {
-		oldfile = php_stream_open_wrapper(phar->fname, "rb", 0, NULL);
+		oldfile = php_stream_open_wrapper(ZSTR_VAL(phar->fname), "rb", 0, NULL);
 		must_close_old_file = oldfile != NULL;
 	}
 
@@ -1106,8 +1115,8 @@ ZEND_ATTRIBUTE_NONNULL_ARGS(1, 4) int phar_tar_flush(phar_archive_data *phar, ze
 	pass.free_ufp = true;
 
 	if (phar_metadata_tracker_has_data(&phar->metadata_tracker, phar->is_persistent)) {
-		phar_entry_info *mentry;
-		if (NULL != (mentry = zend_hash_str_find_ptr(&(phar->manifest), ".phar/.metadata.bin", sizeof(".phar/.metadata.bin")-1))) {
+		phar_entry_info *mentry = zend_hash_str_find_ptr(&(phar->manifest), ZEND_STRL(".phar/.metadata.bin"));
+		if (mentry) {
 			if (ZEND_HASH_APPLY_KEEP != phar_tar_setmetadata(&phar->metadata_tracker, mentry, error)) {
 				if (must_close_old_file) {
 					php_stream_close(oldfile);
@@ -1122,9 +1131,10 @@ ZEND_ATTRIBUTE_NONNULL_ARGS(1, 4) int phar_tar_flush(phar_archive_data *phar, ze
 			newentry.tar_type = TAR_FILE;
 			newentry.is_tar = 1;
 
-			if (NULL == (mentry = zend_hash_add_mem(&phar->manifest, newentry.filename, &newentry, sizeof(phar_entry_info)))) {
+			mentry = zend_hash_add_mem(&phar->manifest, newentry.filename, &newentry, sizeof(phar_entry_info));
+			if (!mentry) {
 				zend_string_efree(newentry.filename);
-				spprintf(error, 0, "phar tar error: unable to add magic metadata file to manifest for phar archive \"%s\"", phar->fname);
+				spprintf(error, 0, "phar tar error: unable to add magic metadata file to manifest for phar archive \"%s\"", ZSTR_VAL(phar->fname));
 				if (must_close_old_file) {
 					php_stream_close(oldfile);
 				}
@@ -1168,7 +1178,8 @@ ZEND_ATTRIBUTE_NONNULL_ARGS(1, 4) int phar_tar_flush(phar_archive_data *phar, ze
 	/* add signature for executable tars or tars explicitly set with setSignatureAlgorithm */
 	if (!phar->is_data || phar->sig_flags) {
 		char *signature_error = NULL;
-		if (FAILURE == phar_create_signature(phar, newfile, &signature, &signature_length, &signature_error)) {
+		zend_string *signature = phar_create_signature(phar, newfile, &signature_error);
+		if (!signature) {
 			spprintf(error, 0, "phar error: unable to write signature to tar-based phar: %s", signature_error);
 			efree(signature_error);
 
@@ -1184,7 +1195,7 @@ ZEND_ATTRIBUTE_NONNULL_ARGS(1, 4) int phar_tar_flush(phar_archive_data *phar, ze
 		if (entry.fp == NULL) {
 			*error = estrdup("phar error: unable to create temporary file");
 
-			efree(signature);
+			zend_string_release_ex(signature, false);
 			if (must_close_old_file) {
 				php_stream_close(oldfile);
 			}
@@ -1203,11 +1214,11 @@ ZEND_ATTRIBUTE_NONNULL_ARGS(1, 4) int phar_tar_flush(phar_archive_data *phar, ze
 # define PHAR_SET_32(destination, source) memcpy(destination, &source, 4)
 #endif
 		PHAR_SET_32(sigbuf, phar->sig_flags);
-		PHAR_SET_32(sigbuf + 4, signature_length);
+		PHAR_SET_32(sigbuf + 4, ZSTR_LEN(signature));
 
-		if (8 != php_stream_write(entry.fp, sigbuf, 8) || signature_length != php_stream_write(entry.fp, signature, signature_length)) {
-			efree(signature);
-			spprintf(error, 0, "phar error: unable to write signature to tar-based phar %s", phar->fname);
+		if (8 != php_stream_write(entry.fp, sigbuf, 8) || ZSTR_LEN(signature) != php_stream_write(entry.fp, ZSTR_VAL(signature), ZSTR_LEN(signature))) {
+			zend_string_release_ex(signature, false);
+			spprintf(error, 0, "phar error: unable to write signature to tar-based phar %s", ZSTR_VAL(phar->fname));
 
 			if (must_close_old_file) {
 				php_stream_close(oldfile);
@@ -1218,11 +1229,11 @@ ZEND_ATTRIBUTE_NONNULL_ARGS(1, 4) int phar_tar_flush(phar_archive_data *phar, ze
 
 		ALLOCA_FLAG(use_heap);
 		ZSTR_ALLOCA_INIT(entry.filename, ".phar/signature.bin", sizeof(".phar/signature.bin")-1, use_heap);
-		efree(signature);
-		entry.uncompressed_filesize = entry.compressed_filesize = signature_length + 8;
+		entry.uncompressed_filesize = entry.compressed_filesize = ZSTR_LEN(signature) + 8;
 		/* throw out return value and write the signature */
 		phar_tar_writeheaders_int(&entry, &pass);
 		ZSTR_ALLOCA_FREE(entry.filename, use_heap);
+		zend_string_release_ex(signature, false);
 
 		if (*error) {
 			if (must_close_old_file) {
@@ -1261,10 +1272,10 @@ ZEND_ATTRIBUTE_NONNULL_ARGS(1, 4) int phar_tar_flush(phar_archive_data *phar, ze
 		/* deferred flush */
 		phar->fp = newfile;
 	} else {
-		phar->fp = php_stream_open_wrapper(phar->fname, "w+b", IGNORE_URL|STREAM_MUST_SEEK|REPORT_ERRORS, NULL);
+		phar->fp = php_stream_open_wrapper(ZSTR_VAL(phar->fname), "w+b", IGNORE_URL|STREAM_MUST_SEEK|REPORT_ERRORS, NULL);
 		if (!phar->fp) {
 			phar->fp = newfile;
-			spprintf(error, 0, "unable to open new phar \"%s\" for writing", phar->fname);
+			spprintf(error, 0, "unable to open new phar \"%s\" for writing", ZSTR_VAL(phar->fname));
 			return EOF;
 		}
 
@@ -1286,7 +1297,7 @@ ZEND_ATTRIBUTE_NONNULL_ARGS(1, 4) int phar_tar_flush(phar_archive_data *phar, ze
 				/* copy contents uncompressed rather than lose them */
 				php_stream_copy_to_stream_ex(newfile, phar->fp, PHP_STREAM_COPY_ALL, NULL);
 				php_stream_close(newfile);
-				spprintf(error, 4096, "unable to compress all contents of phar \"%s\" using zlib, PHP versions older than 5.2.6 have a buggy zlib", phar->fname);
+				spprintf(error, 4096, "unable to compress all contents of phar \"%s\" using zlib, PHP versions older than 5.2.6 have a buggy zlib", ZSTR_VAL(phar->fname));
 				return EOF;
 			}
 
diff --git a/ext/phar/tar.h b/ext/phar/tar.h
index 55ce5501eeb1..80e4586e8db9 100644
--- a/ext/phar/tar.h
+++ b/ext/phar/tar.h
@@ -4,15 +4,13 @@
   +----------------------------------------------------------------------+
   | TAR archive support for Phar                                         |
   +----------------------------------------------------------------------+
-  | Copyright (c) The PHP Group                                          |
+  | Copyright © The PHP Group and Contributors.                          |
   +----------------------------------------------------------------------+
-  | This source file is subject to version 3.01 of the PHP license,      |
-  | that is bundled with this package in the file LICENSE, and is        |
-  | available through the world-wide-web at the following url:           |
-  | https://www.php.net/license/3_01.txt                                 |
-  | If you did not receive a copy of the PHP license and are unable to   |
-  | obtain it through the world-wide-web, please send a note to          |
-  | license@php.net so we can mail you a copy immediately.               |
+  | This source file is subject to the Modified BSD License that is      |
+  | bundled with this package in the file LICENSE, and is available      |
+  | through the World Wide Web at .        |
+  |                                                                      |
+  | SPDX-License-Identifier: BSD-3-Clause                                |
   +----------------------------------------------------------------------+
   | Authors: Dmitry Stogov                               |
   |          Gregory Beaver                              |
diff --git a/ext/phar/tests/gh21797.phpt b/ext/phar/tests/gh21797.phpt
new file mode 100644
index 000000000000..b24e30b7829a
--- /dev/null
+++ b/ext/phar/tests/gh21797.phpt
@@ -0,0 +1,30 @@
+--TEST--
+GH-21797: Phar::webPhar() NULL dereference when SCRIPT_NAME absent from SAPI environment
+--CGI--
+--EXTENSIONS--
+phar
+--INI--
+phar.readonly=0
+phar.require_hash=0
+variables_order=EGPC
+register_argc_argv=0
+cgi.fix_pathinfo=0
+--ENV--
+REQUEST_METHOD=GET
+PATH_INFO=/gh21797.phar
+--FILE--
+addFromString('index.php', '');
+$phar->setStub('');
+unset($phar);
+include $fname;
+?>
+--CLEAN--
+
+--EXPECT--
+no crash
diff --git a/ext/phar/tests/gh21798-add-file-delref.phpt b/ext/phar/tests/gh21798-add-file-delref.phpt
new file mode 100644
index 000000000000..fa893a1975e3
--- /dev/null
+++ b/ext/phar/tests/gh21798-add-file-delref.phpt
@@ -0,0 +1,29 @@
+--TEST--
+GH-21798: phar_add_file must call phar_entry_delref on write error paths
+--EXTENSIONS--
+phar
+--INI--
+phar.readonly=0
+phar.require_hash=0
+--FILE--
+addFromString('hello.txt', 'hello world');
+$phar->addFromString('empty.txt', '');
+unset($phar);
+
+$phar = new Phar($fname);
+echo $phar['hello.txt']->getContent() . "\n";
+echo ($phar->offsetExists('empty.txt') ? 'empty exists' : 'missing') . "\n";
+echo "no crash\n";
+?>
+--CLEAN--
+
+--EXPECT--
+hello world
+empty exists
+no crash
diff --git a/ext/phar/tests/gh21798-offsetget-temp-entry.phpt b/ext/phar/tests/gh21798-offsetget-temp-entry.phpt
new file mode 100644
index 000000000000..b5b11ad43634
--- /dev/null
+++ b/ext/phar/tests/gh21798-offsetget-temp-entry.phpt
@@ -0,0 +1,39 @@
+--TEST--
+GH-21798: Phar::offsetGet() must free is_temp_dir entry before rejecting .phar/* paths
+--EXTENSIONS--
+phar
+--INI--
+phar.readonly=0
+phar.require_hash=0
+--FILE--
+addFromString('index.php', '');
+unset($phar);
+
+$phar = new Phar($fname);
+try {
+    $phar->offsetGet('.phar/stub.php');
+} catch (BadMethodCallException $e) {
+    echo $e->getMessage() . "\n";
+}
+try {
+    $phar->offsetGet('.phar/alias.txt');
+} catch (BadMethodCallException $e) {
+    echo $e->getMessage() . "\n";
+}
+try {
+    $phar->offsetGet('.phar/internal');
+} catch (BadMethodCallException $e) {
+    echo $e->getMessage() . "\n";
+}
+echo "no crash\n";
+?>
+--CLEAN--
+
+--EXPECT--
+Entry .phar/stub.php does not exist
+Entry .phar/alias.txt does not exist
+Entry .phar/internal does not exist
+no crash
diff --git a/ext/phar/tests/gh21799-stream-close-flush.phpt b/ext/phar/tests/gh21799-stream-close-flush.phpt
new file mode 100644
index 000000000000..aaa6c17fac38
--- /dev/null
+++ b/ext/phar/tests/gh21799-stream-close-flush.phpt
@@ -0,0 +1,32 @@
+--TEST--
+GH-21799: phar_stream_close propagates phar_stream_flush return value
+--EXTENSIONS--
+phar
+--INI--
+phar.readonly=0
+phar.require_hash=0
+--FILE--
+addFromString('hello.txt', 'hello');
+unset($phar);
+
+$fp = fopen('phar://' . $fname . '/hello.txt', 'rb');
+$content = fread($fp, 1024);
+$result = fclose($fp);
+
+echo $content . "\n";
+var_dump($result);
+echo "no crash\n";
+?>
+--CLEAN--
+
+--EXPECT--
+hello
+bool(true)
+no crash
diff --git a/ext/phar/tests/invalid_string_phar_mungserver.phpt b/ext/phar/tests/invalid_string_phar_mungserver.phpt
index 46de113f6c08..8128987dacbc 100644
--- a/ext/phar/tests/invalid_string_phar_mungserver.phpt
+++ b/ext/phar/tests/invalid_string_phar_mungserver.phpt
@@ -1,5 +1,7 @@
 --TEST--
 Passing invalid string to Phar::mungServer()
+--EXTENSIONS--
+phar
 --FILE--
 addEmptyDir('.phar');
 } catch (Exception $e) {
 echo $e->getMessage(),"\n";
 }
+try {
+$a->addEmptyDir('/.phar');
+} catch (Exception $e) {
+echo $e->getMessage(),"\n";
+}
+$a->addEmptyDir('/.pharx');
+var_dump(is_dir($pname . '/.pharx'));
 ?>
 --CLEAN--
 addFromString('file.txt', 'hello');
+$phar->setStub('');
+include $fname;
+?>
+--CLEAN--
+
+--EXPECT--
+regular entry (not a symlink): bool(false)
+missing entry: bool(false)
+absolute phar:// path (bypasses intercept): bool(false)
diff --git a/ext/phar/tests/phar_extract2.phpt b/ext/phar/tests/phar_extract2.phpt
index f57d96ad5e92..b22c00977665 100644
--- a/ext/phar/tests/phar_extract2.phpt
+++ b/ext/phar/tests/phar_extract2.phpt
@@ -46,8 +46,6 @@ $dir = __DIR__ . '/extract2/';
 @rmdir($dir . 'one/level');
 @rmdir($dir . 'one');
 @rmdir($dir);
-$dir = __DIR__ . '/extract1/';
-@rmdir($dir);
 ?>
 --EXPECTF--
 %sextract2%cfile1.txt
diff --git a/ext/phar/tests/tar/gh21986.phpt b/ext/phar/tests/tar/gh21986.phpt
new file mode 100644
index 000000000000..13205d40a65d
--- /dev/null
+++ b/ext/phar/tests/tar/gh21986.phpt
@@ -0,0 +1,43 @@
+--TEST--
+GH-21986 (PharData::getContent() crash on circular symlink chain in tar)
+--EXTENSIONS--
+phar
+--FILE--
+getContent());
+?>
+--CLEAN--
+
+--EXPECT--
+string(0) ""
diff --git a/ext/phar/tests/test77022na49ia3c4t8cefa4Wbt b/ext/phar/tests/test77022na49ia3c4t8cefa4Wbt
new file mode 100644
index 000000000000..e69de29bb2d1
diff --git a/ext/phar/tests/zip/zip_extra_underflow.phpt b/ext/phar/tests/zip/zip_extra_underflow.phpt
new file mode 100644
index 000000000000..e37a3493b663
--- /dev/null
+++ b/ext/phar/tests/zip/zip_extra_underflow.phpt
@@ -0,0 +1,91 @@
+--TEST--
+Phar: ZIP extra field length must not underflow
+--EXTENSIONS--
+phar
+--FILE--
+getMTime(), "\n";
+} catch (Exception $e) {
+    echo $e->getMessage(), "\n";
+}
+?>
+--CLEAN--
+
+--EXPECTF--
+phar error: Unable to process extra field header for file in central directory in zip-based phar "%szip_extra_underflow.zip"
diff --git a/ext/phar/util.c b/ext/phar/util.c
index fdadc4d9b6bf..9906728a00f7 100644
--- a/ext/phar/util.c
+++ b/ext/phar/util.c
@@ -3,15 +3,13 @@
   | phar php single-file executable PHP extension                        |
   | utility functions                                                    |
   +----------------------------------------------------------------------+
-  | Copyright (c) The PHP Group                                          |
+  | Copyright © The PHP Group and Contributors.                          |
   +----------------------------------------------------------------------+
-  | This source file is subject to version 3.01 of the PHP license,      |
-  | that is bundled with this package in the file LICENSE, and is        |
-  | available through the world-wide-web at the following url:           |
-  | https://www.php.net/license/3_01.txt                                 |
-  | If you did not receive a copy of the PHP license and are unable to   |
-  | obtain it through the world-wide-web, please send a note to          |
-  | license@php.net so we can mail you a copy immediately.               |
+  | This source file is subject to the Modified BSD License that is      |
+  | bundled with this package in the file LICENSE, and is available      |
+  | through the World Wide Web at .        |
+  |                                                                      |
+  | SPDX-License-Identifier: BSD-3-Clause                                |
   +----------------------------------------------------------------------+
   | Authors: Gregory Beaver                              |
   |          Marcus Boerger                               |
@@ -36,54 +34,62 @@
 #include 
 #include 
 #else
-static zend_result phar_call_openssl_signverify(bool is_sign, php_stream *fp, zend_off_t end, char *key, size_t key_len, char **signature, size_t *signature_len, uint32_t sig_type);
+ZEND_ATTRIBUTE_NONNULL static bool phar_call_openssl_verify(php_stream *fp, zend_off_t end, zend_string *public_key, const char *signature, size_t signature_len, uint32_t sig_type);
+static zend_result phar_call_openssl_sign(php_stream *fp, zend_off_t end, const char *key, size_t key_len, char **signature, size_t *signature_len, uint32_t sig_type);
 #endif
 
 /* for links to relative location, prepend cwd of the entry */
-static char *phar_get_link_location(phar_entry_info *entry) /* {{{ */
+static zend_string *phar_get_link_location(phar_entry_info *entry) /* {{{ */
 {
-	char *p, *ret = NULL;
-	if (!entry->link) {
-		return NULL;
-	}
-	if (entry->link[0] == '/') {
-		return estrdup(entry->link + 1);
+	ZEND_ASSERT(entry->symlink);
+
+	if (ZSTR_VAL(entry->symlink)[0] == '/') {
+		return zend_string_init(ZSTR_VAL(entry->symlink) + 1, ZSTR_LEN(entry->symlink) - 1, false);
 	}
-	p = strrchr(ZSTR_VAL(entry->filename), '/');
+	const char *p = strrchr(ZSTR_VAL(entry->filename), '/');
 	if (p) {
 		/* Important: don't modify the original `p` data because it is a shared string. */
 		zend_string *new_name = zend_string_init(ZSTR_VAL(entry->filename), p - ZSTR_VAL(entry->filename), false);
-		spprintf(&ret, 0, "%s/%s", ZSTR_VAL(new_name), entry->link);
+		zend_string *location = zend_string_concat3(
+			ZSTR_VAL(new_name), ZSTR_LEN(new_name),
+			ZEND_STRL("/"),
+			ZSTR_VAL(entry->symlink), ZSTR_LEN(entry->symlink)
+		);
 		zend_string_release(entry->filename);
 		entry->filename = new_name;
-		return ret;
+		return location;
 	}
-	return entry->link;
+	return zend_string_copy(entry->symlink);
 }
 /* }}} */
 
 phar_entry_info *phar_get_link_source(phar_entry_info *entry) /* {{{ */
 {
 	phar_entry_info *link_entry;
-	char *link;
+	uint32_t depth = 0, max_depth;
 
-	if (!entry->link) {
+	if (!entry->symlink) {
 		return entry;
 	}
 
-	link = phar_get_link_location(entry);
-	if (NULL != (link_entry = zend_hash_str_find_ptr(&(entry->phar->manifest), entry->link, strlen(entry->link))) ||
-		NULL != (link_entry = zend_hash_str_find_ptr(&(entry->phar->manifest), link, strlen(link)))) {
-		if (link != entry->link) {
-			efree(link);
+	max_depth = zend_hash_num_elements(&(entry->phar->manifest));
+
+	while (entry->symlink) {
+		if (UNEXPECTED(++depth > max_depth)) {
+			return NULL;
 		}
-		return phar_get_link_source(link_entry);
-	} else {
-		if (link != entry->link) {
-			efree(link);
+		zend_string *link = phar_get_link_location(entry);
+
+		if (NULL != (link_entry = zend_hash_find_ptr(&(entry->phar->manifest), entry->symlink)) ||
+			NULL != (link_entry = zend_hash_find_ptr(&(entry->phar->manifest), link))) {
+			zend_string_release(link);
+			entry = link_entry;
+		} else {
+			zend_string_release(link);
+			return NULL;
 		}
-		return NULL;
 	}
+	return entry;
 }
 /* }}} */
 
@@ -98,7 +104,7 @@ static php_stream *phar_get_entrypufp(const phar_entry_info *entry)
 /* retrieve a phar_entry_info's current file pointer for reading contents */
 php_stream *phar_get_efp(phar_entry_info *entry, bool follow_links) /* {{{ */
 {
-	if (follow_links && entry->link) {
+	if (follow_links && entry->symlink) {
 		phar_entry_info *link_entry = phar_get_link_source(entry);
 
 		if (link_entry && link_entry != entry) {
@@ -190,7 +196,7 @@ int phar_seek_efp(phar_entry_info *entry, zend_off_t offset, int whence, zend_of
 /* }}} */
 
 /* mount an absolute path or uri to a path internal to the phar archive */
-zend_result phar_mount_entry(phar_archive_data *phar, char *filename, size_t filename_len, char *path, size_t path_len) /* {{{ */
+zend_result phar_mount_entry(phar_archive_data *phar, const char *filename, size_t filename_len, char *path, size_t path_len) /* {{{ */
 {
 	phar_entry_info entry = {0};
 	php_stream_statbuf ssb;
@@ -265,19 +271,13 @@ zend_result phar_mount_entry(phar_archive_data *phar, char *filename, size_t fil
 }
 /* }}} */
 
-zend_string *phar_find_in_include_path(zend_string *filename, phar_archive_data **pphar) /* {{{ */
+zend_string *phar_find_in_include_path(const zend_string *filename) /* {{{ */
 {
 	zend_string *ret;
-	char *path, *arch, *test;
-	size_t arch_len;
+	char *path;
+	zend_string *arch;
 	phar_archive_data *phar;
 
-	if (pphar) {
-		*pphar = NULL;
-	} else {
-		pphar = &phar;
-	}
-
 	if (!zend_is_executing() || !PHAR_G(cwd)) {
 		return NULL;
 	}
@@ -293,72 +293,57 @@ zend_string *phar_find_in_include_path(zend_string *filename, phar_archive_data
 	if (
 		PHAR_G(last_phar)
 		&& is_file_a_phar_wrapper
-		&& ZSTR_LEN(fname) - length_phar_protocol >= PHAR_G(last_phar_name_len)
-		&& !memcmp(ZSTR_VAL(fname) + length_phar_protocol, PHAR_G(last_phar_name), PHAR_G(last_phar_name_len))
+		&& ZSTR_LEN(fname) - length_phar_protocol >= ZSTR_LEN(PHAR_G(last_phar_name))
+		&& !memcmp(ZSTR_VAL(fname) + length_phar_protocol, ZSTR_VAL(PHAR_G(last_phar_name)), ZSTR_LEN(PHAR_G(last_phar_name)))
 	) {
-		arch = estrndup(PHAR_G(last_phar_name), PHAR_G(last_phar_name_len));
-		arch_len = PHAR_G(last_phar_name_len);
+		arch = zend_string_init(ZSTR_VAL(PHAR_G(last_phar_name)), ZSTR_LEN(PHAR_G(last_phar_name)), false);
 		phar = PHAR_G(last_phar);
 		goto splitted;
 	}
 
-	if (!is_file_a_phar_wrapper || SUCCESS != phar_split_fname(ZSTR_VAL(fname), ZSTR_LEN(fname), &arch, &arch_len, NULL, NULL, 1, 0)) {
+	if (!is_file_a_phar_wrapper) {
+		return NULL;
+	}
+	arch = phar_split_fname(ZSTR_VAL(fname), ZSTR_LEN(fname), NULL, 1, 0);
+	if (!arch) {
 		return NULL;
 	}
 
 	if (*ZSTR_VAL(filename) == '.') {
-		size_t try_len;
-
-		if (FAILURE == phar_get_archive(&phar, arch, arch_len, NULL, 0, NULL)) {
-			efree(arch);
+		phar = phar_get_archive(ZSTR_VAL(arch), ZSTR_LEN(arch), NULL, 0, NULL);
+		if (!phar) {
+			zend_string_release_ex(arch, false);
 			return NULL;
 		}
-splitted:
-		if (pphar) {
-			*pphar = phar;
-		}
-
-		try_len = ZSTR_LEN(filename);
-		test = phar_fix_filepath(estrndup(ZSTR_VAL(filename), ZSTR_LEN(filename)), &try_len, 1);
-
-		if (*test == '/') {
-			if (zend_hash_str_exists(&(phar->manifest), test + 1, try_len - 1)) {
-				ret = strpprintf(0, "phar://%s%s", arch, test);
-				efree(arch);
-				efree(test);
+splitted:;
+		zend_string *test = phar_fix_filepath(ZSTR_VAL(filename), ZSTR_LEN(filename), true);
+		if (ZSTR_VAL(test)[0] == '/') {
+			if (zend_hash_str_exists(&(phar->manifest), ZSTR_VAL(test) + 1, ZSTR_LEN(test) - 1)) {
+				ret = zend_string_concat3(
+					"phar://", strlen("phar://"),
+					ZSTR_VAL(arch), ZSTR_LEN(arch),
+					ZSTR_VAL(test), ZSTR_LEN(test)
+				);
+				zend_string_release_ex(test, false);
+				zend_string_release_ex(arch, false);
 				return ret;
 			}
 		} else {
-			if (zend_hash_str_exists(&(phar->manifest), test, try_len)) {
-				ret = strpprintf(0, "phar://%s/%s", arch, test);
-				efree(arch);
-				efree(test);
+			if (zend_hash_exists(&(phar->manifest), test)) {
+				ret = strpprintf(0, "phar://%s/%s", ZSTR_VAL(arch), ZSTR_VAL(test));
+				zend_string_release_ex(test, false);
+				zend_string_release_ex(arch, false);
 				return ret;
 			}
 		}
-		efree(test);
+		zend_string_release_ex(test, false);
 	}
 
-	spprintf(&path, MAXPATHLEN + 1 + strlen(PG(include_path)), "phar://%s/%s%c%s", arch, PHAR_G(cwd), DEFAULT_DIR_SEPARATOR, PG(include_path));
-	efree(arch);
+	spprintf(&path, MAXPATHLEN + 1 + strlen(PG(include_path)), "phar://%s/%s%c%s", ZSTR_VAL(arch), PHAR_G(cwd), DEFAULT_DIR_SEPARATOR, PG(include_path));
+	zend_string_release_ex(arch, false);
 	ret = php_resolve_path(ZSTR_VAL(filename), ZSTR_LEN(filename), path);
 	efree(path);
 
-	if (ret && zend_string_starts_with_literal_ci(ret, "phar://")) {
-		/* found phar:// */
-		if (SUCCESS != phar_split_fname(ZSTR_VAL(ret), ZSTR_LEN(ret), &arch, &arch_len, NULL, NULL, 1, 0)) {
-			return ret;
-		}
-
-		*pphar = zend_hash_str_find_ptr(&(PHAR_G(phar_fname_map)), arch, arch_len);
-
-		if (!*pphar && PHAR_G(manifest_cached)) {
-			*pphar = zend_hash_str_find_ptr(&cached_phars, arch, arch_len);
-		}
-
-		efree(arch);
-	}
-
 	return ret;
 }
 /* }}} */
@@ -385,9 +370,9 @@ static ZEND_ATTRIBUTE_NONNULL zend_result phar_create_writeable_entry(phar_archi
 	}
 
 	/* open a new temp file for writing */
-	if (entry->link) {
-		efree(entry->link);
-		entry->link = NULL;
+	if (entry->symlink) {
+		zend_string_release(entry->symlink);
+		entry->symlink = NULL;
 		entry->tar_type = (entry->is_tar ? TAR_FILE : '\0');
 	}
 
@@ -438,13 +423,13 @@ ZEND_ATTRIBUTE_NONNULL static zend_result phar_separate_entry_fp(phar_entry_info
 	}
 
 	if (SUCCESS != php_stream_copy_to_stream_ex(phar_get_efp(link, false), fp, link->uncompressed_filesize, NULL)) {
-		spprintf(error, 4096, "phar error: cannot separate entry file \"%s\" contents in phar archive \"%s\" for write access", ZSTR_VAL(entry->filename), entry->phar->fname);
+		spprintf(error, 4096, "phar error: cannot separate entry file \"%s\" contents in phar archive \"%s\" for write access", ZSTR_VAL(entry->filename), ZSTR_VAL(entry->phar->fname));
 		return FAILURE;
 	}
 
-	if (entry->link) {
-		efree(entry->link);
-		entry->link = NULL;
+	if (entry->symlink) {
+		zend_string_release(entry->symlink);
+		entry->symlink = NULL;
 		entry->tar_type = (entry->is_tar ? TAR_FILE : '\0');
 	}
 
@@ -464,9 +449,8 @@ ZEND_ATTRIBUTE_NONNULL static zend_result phar_separate_entry_fp(phar_entry_info
  * appended, truncated, or read.  For read, if the entry is marked unmodified, it is
  * assumed that the file pointer, if present, is opened for reading
  */
-ZEND_ATTRIBUTE_NONNULL zend_result phar_get_entry_data(phar_entry_data **ret, char *fname, size_t fname_len, char *path, size_t path_len, const char *mode, char allow_dir, char **error, bool security) /* {{{ */
+ZEND_ATTRIBUTE_NONNULL zend_result phar_get_entry_data(phar_entry_data **ret, const zend_string *fname, char *path, size_t path_len, const char *mode, char allow_dir, char **error, bool security) /* {{{ */
 {
-	phar_archive_data *phar;
 	phar_entry_info *entry;
 	bool for_write  = mode[0] != 'r' || mode[1] == '+';
 	bool for_append = mode[0] == 'a';
@@ -476,29 +460,32 @@ ZEND_ATTRIBUTE_NONNULL zend_result phar_get_entry_data(phar_entry_data **ret, ch
 	*ret = NULL;
 	*error = NULL;
 
-	if (FAILURE == phar_get_archive(&phar, fname, fname_len, NULL, 0, error)) {
+	phar_archive_data *phar = phar_get_archive(ZSTR_VAL(fname), ZSTR_LEN(fname), NULL, 0, error);
+	if (!phar) {
 		return FAILURE;
 	}
 
 	if (for_write && PHAR_G(readonly) && !phar->is_data) {
-		spprintf(error, 4096, "phar error: file \"%s\" in phar \"%s\" cannot be opened for writing, disabled by ini setting", path, fname);
+		spprintf(error, 4096, "phar error: file \"%s\" in phar \"%s\" cannot be opened for writing, disabled by ini setting", path, ZSTR_VAL(fname));
 		return FAILURE;
 	}
 
 	if (!path_len) {
-		spprintf(error, 4096, "phar error: file \"\" in phar \"%s\" must not be empty", fname);
+		spprintf(error, 4096, "phar error: file \"\" in phar \"%s\" must not be empty", ZSTR_VAL(fname));
 		return FAILURE;
 	}
 really_get_entry:
 	if (allow_dir) {
-		if ((entry = phar_get_entry_info_dir(phar, path, path_len, allow_dir, for_create && !PHAR_G(readonly) && !phar->is_data ? NULL : error, security)) == NULL) {
+		entry = phar_get_entry_info_dir(phar, path, path_len, allow_dir, for_create && !PHAR_G(readonly) && !phar->is_data ? NULL : error, security);
+		if (!entry) {
 			if (for_create && (!PHAR_G(readonly) || phar->is_data)) {
 				return SUCCESS;
 			}
 			return FAILURE;
 		}
 	} else {
-		if ((entry = phar_get_entry_info(phar, path, path_len, for_create && !PHAR_G(readonly) && !phar->is_data ? NULL : error, security)) == NULL) {
+		entry = phar_get_entry_info(phar, path, path_len, for_create && !PHAR_G(readonly) && !phar->is_data ? NULL : error, security);
+		if (!entry) {
 			if (for_create && (!PHAR_G(readonly) || phar->is_data)) {
 				return SUCCESS;
 			}
@@ -508,7 +495,7 @@ ZEND_ATTRIBUTE_NONNULL zend_result phar_get_entry_data(phar_entry_data **ret, ch
 
 	if (for_write && phar->is_persistent) {
 		if (FAILURE == phar_copy_on_write(&phar)) {
-			spprintf(error, 4096, "phar error: file \"%s\" in phar \"%s\" cannot be opened for writing, could not make cached phar writeable", path, fname);
+			spprintf(error, 4096, "phar error: file \"%s\" in phar \"%s\" cannot be opened for writing, could not make cached phar writeable", path, ZSTR_VAL(fname));
 			return FAILURE;
 		} else {
 			goto really_get_entry;
@@ -516,12 +503,12 @@ ZEND_ATTRIBUTE_NONNULL zend_result phar_get_entry_data(phar_entry_data **ret, ch
 	}
 
 	if (entry->is_modified && !for_write) {
-		spprintf(error, 4096, "phar error: file \"%s\" in phar \"%s\" cannot be opened for reading, writable file pointers are open", path, fname);
+		spprintf(error, 4096, "phar error: file \"%s\" in phar \"%s\" cannot be opened for reading, writable file pointers are open", path, ZSTR_VAL(fname));
 		return FAILURE;
 	}
 
 	if (entry->fp_refcount && for_write) {
-		spprintf(error, 4096, "phar error: file \"%s\" in phar \"%s\" cannot be opened for writing, readable file pointers are open", path, fname);
+		spprintf(error, 4096, "phar error: file \"%s\" in phar \"%s\" cannot be opened for writing, readable file pointers are open", path, ZSTR_VAL(fname));
 		return FAILURE;
 	}
 
@@ -557,9 +544,9 @@ ZEND_ATTRIBUTE_NONNULL zend_result phar_get_entry_data(phar_entry_data **ret, ch
 		}
 	} else {
 		if (for_write) {
-			if (entry->link) {
-				efree(entry->link);
-				entry->link = NULL;
+			if (entry->symlink) {
+				zend_string_release(entry->symlink);
+				entry->symlink = NULL;
 				entry->tar_type = (entry->is_tar ? TAR_FILE : '\0');
 			}
 
@@ -584,7 +571,7 @@ ZEND_ATTRIBUTE_NONNULL zend_result phar_get_entry_data(phar_entry_data **ret, ch
 	(*ret)->phar = phar;
 	(*ret)->internal_file = entry;
 	(*ret)->fp = phar_get_efp(entry, true);
-	if (entry->link) {
+	if (entry->symlink) {
 		phar_entry_info *link = phar_get_link_source(entry);
 		if(!link) {
 			efree(*ret);
@@ -607,10 +594,9 @@ ZEND_ATTRIBUTE_NONNULL zend_result phar_get_entry_data(phar_entry_data **ret, ch
 /**
  * Create a new dummy file slot within a writeable phar for a newly created file
  */
-ZEND_ATTRIBUTE_NONNULL phar_entry_data *phar_get_or_create_entry_data(char *fname, size_t fname_len, char *path, size_t path_len, const char *mode, char allow_dir, char **error, bool security, uint32_t timestamp) /* {{{ */
+ZEND_ATTRIBUTE_NONNULL phar_entry_data *phar_get_or_create_entry_data(zend_string *fname, char *path, size_t path_len, const char *mode, char allow_dir, char **error, bool security, uint32_t timestamp) /* {{{ */
 {
-	phar_archive_data *phar;
-	phar_entry_info *entry, etemp;
+	phar_entry_info etemp;
 	phar_entry_data *ret;
 	const char *pcr_error;
 	char is_dir;
@@ -621,11 +607,12 @@ ZEND_ATTRIBUTE_NONNULL phar_entry_data *phar_get_or_create_entry_data(char *fnam
 
 	is_dir = (path_len && path[path_len - 1] == '/') ? 1 : 0;
 
-	if (FAILURE == phar_get_archive(&phar, fname, fname_len, NULL, 0, error)) {
+	phar_archive_data *phar = phar_get_archive(ZSTR_VAL(fname), ZSTR_LEN(fname), NULL, 0, error);
+	if (!phar) {
 		return NULL;
 	}
 
-	if (FAILURE == phar_get_entry_data(&ret, fname, fname_len, path, path_len, mode, allow_dir, error, security)) {
+	if (FAILURE == phar_get_entry_data(&ret, fname, path, path_len, mode, allow_dir, error, security)) {
 		return NULL;
 	} else if (ret) {
 		return ret;
@@ -637,7 +624,7 @@ ZEND_ATTRIBUTE_NONNULL phar_entry_data *phar_get_or_create_entry_data(char *fnam
 	}
 
 	if (phar->is_persistent && FAILURE == phar_copy_on_write(&phar)) {
-		spprintf(error, 4096, "phar error: file \"%s\" in phar \"%s\" cannot be created, could not make cached phar writeable", path, fname);
+		spprintf(error, 4096, "phar error: file \"%s\" in phar \"%s\" cannot be created, could not make cached phar writeable", path, ZSTR_VAL(fname));
 		return NULL;
 	}
 
@@ -680,10 +667,11 @@ ZEND_ATTRIBUTE_NONNULL phar_entry_data *phar_get_or_create_entry_data(char *fnam
 		etemp.tar_type = etemp.is_dir ? TAR_DIR : TAR_FILE;
 	}
 
-	if (NULL == (entry = zend_hash_add_mem(&phar->manifest, etemp.filename, &etemp, sizeof(phar_entry_info)))) {
+	phar_entry_info *entry = zend_hash_add_mem(&phar->manifest, etemp.filename, &etemp, sizeof(phar_entry_info));
+	if (!entry) {
 		php_stream_close(etemp.fp);
 		spprintf(error, 0, "phar error: unable to add new entry \"%s\" to phar \"%s\"",
-			ZSTR_VAL(etemp.filename), phar->fname);
+			ZSTR_VAL(etemp.filename), ZSTR_VAL(phar->fname));
 		efree(ret);
 		zend_string_efree(etemp.filename);
 		return NULL;
@@ -718,11 +706,11 @@ php_stream *phar_open_archive_fp(phar_archive_data *phar) /* {{{ */
 		return stream;
 	}
 
-	if (php_check_open_basedir(phar->fname)) {
+	if (php_check_open_basedir(ZSTR_VAL(phar->fname))) {
 		return NULL;
 	}
 
-	stream = php_stream_open_wrapper(phar->fname, "rb", IGNORE_URL|STREAM_MUST_SEEK, NULL);
+	stream = php_stream_open_wrapper(ZSTR_VAL(phar->fname), "rb", IGNORE_URL|STREAM_MUST_SEEK, NULL);
 	phar_set_pharfp(phar, stream);
 
 	return stream;
@@ -738,9 +726,9 @@ ZEND_ATTRIBUTE_NONNULL zend_result phar_copy_entry_fp(phar_entry_info *source, p
 		return FAILURE;
 	}
 
-	if (dest->link) {
-		efree(dest->link);
-		dest->link = NULL;
+	if (dest->symlink) {
+		zend_string_release(dest->symlink);
+		dest->symlink = NULL;
 		dest->tar_type = (dest->is_tar ? TAR_FILE : '\0');
 	}
 
@@ -763,7 +751,7 @@ ZEND_ATTRIBUTE_NONNULL zend_result phar_copy_entry_fp(phar_entry_info *source, p
 		php_stream_close(dest->fp);
 		dest->fp_type = PHAR_FP;
 		spprintf(error, 4096, "phar error: unable to copy contents of file \"%s\" to \"%s\" in phar archive \"%s\"",
-			ZSTR_VAL(source->filename), ZSTR_VAL(dest->filename), source->phar->fname);
+			ZSTR_VAL(source->filename), ZSTR_VAL(dest->filename), ZSTR_VAL(source->phar->fname));
 		return FAILURE;
 	}
 
@@ -805,7 +793,7 @@ ZEND_ATTRIBUTE_NONNULL zend_result phar_open_entry_fp(phar_entry_info *entry, ch
 	php_stream *ufp;
 	phar_entry_data dummy;
 
-	if (follow_links && entry->link) {
+	if (follow_links && entry->symlink) {
 		phar_entry_info *link_entry = phar_get_link_source(entry);
 		if (link_entry && link_entry != entry) {
 			return phar_open_entry_fp(link_entry, error, true);
@@ -830,7 +818,7 @@ ZEND_ATTRIBUTE_NONNULL zend_result phar_open_entry_fp(phar_entry_info *entry, ch
 
 	if (!phar_get_pharfp(phar)) {
 		if (!phar_open_archive_fp(phar)) {
-			spprintf(error, 4096, "phar error: Cannot open phar archive \"%s\" for reading", phar->fname);
+			spprintf(error, 4096, "phar error: Cannot open phar archive \"%s\" for reading", ZSTR_VAL(phar->fname));
 			return FAILURE;
 		}
 	}
@@ -849,7 +837,7 @@ ZEND_ATTRIBUTE_NONNULL zend_result phar_open_entry_fp(phar_entry_info *entry, ch
 	if (!phar_get_entrypufp(entry)) {
 		phar_set_entrypufp(entry, php_stream_fopen_tmpfile());
 		if (!phar_get_entrypufp(entry)) {
-			spprintf(error, 4096, "phar error: Cannot open temporary file for decompressing phar archive \"%s\" file \"%s\"", phar->fname, ZSTR_VAL(entry->filename));
+			spprintf(error, 4096, "phar error: Cannot open temporary file for decompressing phar archive \"%s\" file \"%s\"", ZSTR_VAL(phar->fname), ZSTR_VAL(entry->filename));
 			return FAILURE;
 		}
 	}
@@ -872,7 +860,7 @@ ZEND_ATTRIBUTE_NONNULL zend_result phar_open_entry_fp(phar_entry_info *entry, ch
 	}
 
 	if (!filter) {
-		spprintf(error, 4096, "phar error: unable to read phar \"%s\" (cannot create %s filter while decompressing file \"%s\")", phar->fname, phar_decompress_filter(entry, true), ZSTR_VAL(entry->filename));
+		spprintf(error, 4096, "phar error: unable to read phar \"%s\" (cannot create %s filter while decompressing file \"%s\")", ZSTR_VAL(phar->fname), phar_decompress_filter(entry, true), ZSTR_VAL(entry->filename));
 		return FAILURE;
 	}
 
@@ -885,7 +873,7 @@ ZEND_ATTRIBUTE_NONNULL zend_result phar_open_entry_fp(phar_entry_info *entry, ch
 
 	if (entry->uncompressed_filesize) {
 		if (SUCCESS != php_stream_copy_to_stream_ex(phar_get_entrypfp(entry), ufp, entry->compressed_filesize, NULL)) {
-			spprintf(error, 4096, "phar error: internal corruption of phar \"%s\" (actual filesize mismatch on file \"%s\")", phar->fname, ZSTR_VAL(entry->filename));
+			spprintf(error, 4096, "phar error: internal corruption of phar \"%s\" (actual filesize mismatch on file \"%s\")", ZSTR_VAL(phar->fname), ZSTR_VAL(entry->filename));
 			php_stream_filter_remove(filter, 1);
 			return FAILURE;
 		}
@@ -896,7 +884,7 @@ ZEND_ATTRIBUTE_NONNULL zend_result phar_open_entry_fp(phar_entry_info *entry, ch
 	php_stream_filter_remove(filter, 1);
 
 	if (php_stream_tell(ufp) - loc != (zend_off_t) entry->uncompressed_filesize) {
-		spprintf(error, 4096, "phar error: internal corruption of phar \"%s\" (actual filesize mismatch on file \"%s\")", phar->fname, ZSTR_VAL(entry->filename));
+		spprintf(error, 4096, "phar error: internal corruption of phar \"%s\" (actual filesize mismatch on file \"%s\")", ZSTR_VAL(phar->fname), ZSTR_VAL(entry->filename));
 		return FAILURE;
 	}
 
@@ -924,27 +912,28 @@ ZEND_ATTRIBUTE_NONNULL phar_entry_info * phar_open_jit(const phar_archive_data *
 		return NULL;
 	}
 	if (-1 == phar_seek_efp(entry, 0, SEEK_SET, 0, true)) {
-		spprintf(error, 4096, "phar error: cannot seek to start of file \"%s\" in phar \"%s\"", ZSTR_VAL(entry->filename), phar->fname);
+		spprintf(error, 4096, "phar error: cannot seek to start of file \"%s\" in phar \"%s\"", ZSTR_VAL(entry->filename), ZSTR_VAL(phar->fname));
 		return NULL;
 	}
 	return entry;
 }
 /* }}} */
 
-zend_result phar_free_alias(phar_archive_data *phar, char *alias, size_t alias_len) /* {{{ */
+zend_result phar_free_alias(const phar_archive_data *phar) /* {{{ */
 {
 	if (phar->refcount || phar->is_persistent) {
 		return FAILURE;
 	}
 
 	/* this archive has no open references, so emit a notice and remove it */
-	if (zend_hash_str_del(&(PHAR_G(phar_fname_map)), phar->fname, phar->fname_len) != SUCCESS) {
+	if (zend_hash_del(&(PHAR_G(phar_fname_map)), phar->fname) != SUCCESS) {
 		return FAILURE;
 	}
 
 	/* invalidate phar cache */
 	PHAR_G(last_phar) = NULL;
-	PHAR_G(last_phar_name) = PHAR_G(last_alias) = NULL;
+	PHAR_G(last_alias) = NULL;
+	PHAR_G(last_phar_name) = NULL;
 
 	return SUCCESS;
 }
@@ -954,11 +943,9 @@ zend_result phar_free_alias(phar_archive_data *phar, char *alias, size_t alias_l
  * Looks up a phar archive in the filename map, connecting it to the alias
  * (if any) or returns null
  */
-zend_result phar_get_archive(phar_archive_data **archive, char *fname, size_t fname_len, char *alias, size_t alias_len, char **error) /* {{{ */
+phar_archive_data* phar_get_archive(const char *fname, size_t fname_len, const char *alias, size_t alias_len, char **error) /* {{{ */
 {
-	phar_archive_data *fd, *fd_ptr;
-	char *my_realpath, *save;
-	size_t save_len;
+	phar_archive_data *archive;
 
 	phar_request_initialize();
 
@@ -966,192 +953,162 @@ zend_result phar_get_archive(phar_archive_data **archive, char *fname, size_t fn
 		*error = NULL;
 	}
 
-	*archive = NULL;
-
-	if (PHAR_G(last_phar) && fname_len == PHAR_G(last_phar_name_len) && !memcmp(fname, PHAR_G(last_phar_name), fname_len)) {
-		*archive = PHAR_G(last_phar);
+	if (PHAR_G(last_phar) && zend_string_equals_cstr(PHAR_G(last_phar_name), fname, fname_len)) {
+		archive = PHAR_G(last_phar);
 		if (alias && alias_len) {
 
 			if (!PHAR_G(last_phar)->is_temporary_alias && (alias_len != PHAR_G(last_phar)->alias_len || memcmp(PHAR_G(last_phar)->alias, alias, alias_len))) {
 				if (error) {
-					spprintf(error, 0, "alias \"%s\" is already used for archive \"%s\" cannot be overloaded with \"%s\"", alias, PHAR_G(last_phar)->fname, fname);
+					spprintf(error, 0, "alias \"%s\" is already used for archive \"%s\" cannot be overloaded with \"%s\"", alias, ZSTR_VAL(PHAR_G(last_phar)->fname), fname);
 				}
-				*archive = NULL;
-				return FAILURE;
+				return NULL;
 			}
 
-			if (PHAR_G(last_phar)->alias_len && NULL != (fd_ptr = zend_hash_str_find_ptr(&(PHAR_G(phar_alias_map)), PHAR_G(last_phar)->alias, PHAR_G(last_phar)->alias_len))) {
+			if (PHAR_G(last_phar)->alias_len && zend_hash_str_exists(&(PHAR_G(phar_alias_map)), PHAR_G(last_phar)->alias, PHAR_G(last_phar)->alias_len)) {
 				zend_hash_str_del(&(PHAR_G(phar_alias_map)), PHAR_G(last_phar)->alias, PHAR_G(last_phar)->alias_len);
 			}
 
-			zend_hash_str_add_ptr(&(PHAR_G(phar_alias_map)), alias, alias_len, *archive);
+			zend_hash_str_add_ptr(&(PHAR_G(phar_alias_map)), alias, alias_len, archive);
 			PHAR_G(last_alias) = alias;
 			PHAR_G(last_alias_len) = alias_len;
 		}
 
-		return SUCCESS;
-	}
-
-	if (alias && alias_len && PHAR_G(last_phar) && alias_len == PHAR_G(last_alias_len) && !memcmp(alias, PHAR_G(last_alias), alias_len)) {
-		fd = PHAR_G(last_phar);
-		fd_ptr = fd;
-		goto alias_success;
+		return archive;
 	}
 
 	if (alias && alias_len) {
-		if (NULL != (fd_ptr = zend_hash_str_find_ptr(&(PHAR_G(phar_alias_map)), alias, alias_len))) {
-alias_success:
-			if (fname && (fname_len != fd_ptr->fname_len || strncmp(fname, fd_ptr->fname, fname_len))) {
+		/* If the alias stored in the last_phar cache matches, just use it directly */
+		if (PHAR_G(last_phar) && alias_len == PHAR_G(last_alias_len) && !memcmp(alias, PHAR_G(last_alias), alias_len)) {
+			archive = PHAR_G(last_phar);
+		} else {
+			archive = zend_hash_str_find_ptr(&(PHAR_G(phar_alias_map)), alias, alias_len);
+		}
+
+		/* If we didn't find the alias, check in the cached manifest to see if we can find it */
+		if (!archive && PHAR_G(manifest_cached)) {
+			archive = zend_hash_str_find_ptr(&cached_alias, alias, alias_len);
+		}
+
+		if (archive) {
+			if (!zend_string_equals_cstr(archive->fname, fname, fname_len)) {
 				if (error) {
-					spprintf(error, 0, "alias \"%s\" is already used for archive \"%s\" cannot be overloaded with \"%s\"", alias, fd_ptr->fname, fname);
+					spprintf(error, 0, "alias \"%s\" is already used for archive \"%s\" cannot be overloaded with \"%s\"", alias, ZSTR_VAL(archive->fname), fname);
 				}
-				if (SUCCESS == phar_free_alias(fd_ptr, alias, alias_len)) {
+				if (SUCCESS == phar_free_alias(archive)) {
 					if (error) {
 						efree(*error);
 						*error = NULL;
 					}
 				}
-				return FAILURE;
+				return NULL;
 			}
 
-			*archive = fd_ptr;
-			fd = fd_ptr;
-			PHAR_G(last_phar) = fd;
-			PHAR_G(last_phar_name) = fd->fname;
-			PHAR_G(last_phar_name_len) = fd->fname_len;
+			PHAR_G(last_phar) = archive;
+			PHAR_G(last_phar_name) = archive->fname;
 			PHAR_G(last_alias) = alias;
 			PHAR_G(last_alias_len) = alias_len;
 
-			return SUCCESS;
-		}
-
-		if (PHAR_G(manifest_cached) && NULL != (fd_ptr = zend_hash_str_find_ptr(&cached_alias, alias, alias_len))) {
-			goto alias_success;
+			return archive;
 		}
 	}
 
-	my_realpath = NULL;
-	save = fname;
-	save_len = fname_len;
-
 	if (fname && fname_len) {
-		if (NULL != (fd_ptr = zend_hash_str_find_ptr(&(PHAR_G(phar_fname_map)), fname, fname_len))) {
-			*archive = fd_ptr;
-			fd = fd_ptr;
-
+		archive = zend_hash_str_find_ptr(&(PHAR_G(phar_fname_map)), fname, fname_len);
+		if (archive) {
 			if (alias && alias_len) {
-				if (!fd->is_temporary_alias && (alias_len != fd->alias_len || memcmp(fd->alias, alias, alias_len))) {
+				if (!archive->is_temporary_alias && (alias_len != archive->alias_len || memcmp(archive->alias, alias, alias_len))) {
 					if (error) {
-						spprintf(error, 0, "alias \"%s\" is already used for archive \"%s\" cannot be overloaded with \"%s\"", alias, fd_ptr->fname, fname);
+						spprintf(error, 0, "alias \"%s\" is already used for archive \"%s\" cannot be overloaded with \"%s\"", alias, ZSTR_VAL(archive->fname), fname);
 					}
-					return FAILURE;
+					return NULL;
 				}
 
-				if (fd->alias_len && NULL != (fd_ptr = zend_hash_str_find_ptr(&(PHAR_G(phar_alias_map)), fd->alias, fd->alias_len))) {
-					zend_hash_str_del(&(PHAR_G(phar_alias_map)), fd->alias, fd->alias_len);
+				if (archive->alias_len && zend_hash_str_exists(&(PHAR_G(phar_alias_map)), archive->alias, archive->alias_len)) {
+					zend_hash_str_del(&(PHAR_G(phar_alias_map)), archive->alias, archive->alias_len);
 				}
 
-				zend_hash_str_add_ptr(&(PHAR_G(phar_alias_map)), alias, alias_len, fd);
+				zend_hash_str_add_ptr(&(PHAR_G(phar_alias_map)), alias, alias_len, archive);
 			}
 
-			PHAR_G(last_phar) = fd;
-			PHAR_G(last_phar_name) = fd->fname;
-			PHAR_G(last_phar_name_len) = fd->fname_len;
-			PHAR_G(last_alias) = fd->alias;
-			PHAR_G(last_alias_len) = fd->alias_len;
+			PHAR_G(last_phar) = archive;
+			PHAR_G(last_phar_name) = archive->fname;
+			PHAR_G(last_alias) = archive->alias;
+			PHAR_G(last_alias_len) = archive->alias_len;
 
-			return SUCCESS;
+			return archive;
 		}
 
-		if (PHAR_G(manifest_cached) && NULL != (fd_ptr = zend_hash_str_find_ptr(&cached_phars, fname, fname_len))) {
-			*archive = fd_ptr;
-			fd = fd_ptr;
-
+		if (PHAR_G(manifest_cached) && NULL != (archive = zend_hash_str_find_ptr(&cached_phars, fname, fname_len))) {
 			/* this could be problematic - alias should never be different from manifest alias
 			   for cached phars */
-			if (!fd->is_temporary_alias && alias && alias_len) {
-				if (alias_len != fd->alias_len || memcmp(fd->alias, alias, alias_len)) {
+			if (!archive->is_temporary_alias && alias && alias_len) {
+				if (alias_len != archive->alias_len || memcmp(archive->alias, alias, alias_len)) {
 					if (error) {
-						spprintf(error, 0, "alias \"%s\" is already used for archive \"%s\" cannot be overloaded with \"%s\"", alias, fd_ptr->fname, fname);
+						spprintf(error, 0, "alias \"%s\" is already used for archive \"%s\" cannot be overloaded with \"%s\"", alias, ZSTR_VAL(archive->fname), fname);
 					}
-					return FAILURE;
+					return NULL;
 				}
 			}
 
-			PHAR_G(last_phar) = fd;
-			PHAR_G(last_phar_name) = fd->fname;
-			PHAR_G(last_phar_name_len) = fd->fname_len;
-			PHAR_G(last_alias) = fd->alias;
-			PHAR_G(last_alias_len) = fd->alias_len;
+			PHAR_G(last_phar) = archive;
+			PHAR_G(last_phar_name) = archive->fname;
+			PHAR_G(last_alias) = archive->alias;
+			PHAR_G(last_alias_len) = archive->alias_len;
 
-			return SUCCESS;
+			return archive;
 		}
 
-		if (NULL != (fd_ptr = zend_hash_str_find_ptr(&(PHAR_G(phar_alias_map)), save, save_len))) {
-			fd = *archive = fd_ptr;
+		archive = zend_hash_str_find_ptr(&(PHAR_G(phar_alias_map)), fname, fname_len);
 
-			PHAR_G(last_phar) = fd;
-			PHAR_G(last_phar_name) = fd->fname;
-			PHAR_G(last_phar_name_len) = fd->fname_len;
-			PHAR_G(last_alias) = fd->alias;
-			PHAR_G(last_alias_len) = fd->alias_len;
-
-			return SUCCESS;
+		/* If we didn't find the fname in the alias map, check in the cached manifest to see if we can find it */
+		if (!archive && PHAR_G(manifest_cached)) {
+			archive = zend_hash_str_find_ptr(&cached_alias, fname, fname_len);
 		}
 
-		if (PHAR_G(manifest_cached) && NULL != (fd_ptr = zend_hash_str_find_ptr(&cached_alias, save, save_len))) {
-			fd = *archive = fd_ptr;
+		if (archive) {
+			PHAR_G(last_phar) = archive;
+			PHAR_G(last_phar_name) = archive->fname;
+			PHAR_G(last_alias) = archive->alias;
+			PHAR_G(last_alias_len) = archive->alias_len;
 
-			PHAR_G(last_phar) = fd;
-			PHAR_G(last_phar_name) = fd->fname;
-			PHAR_G(last_phar_name_len) = fd->fname_len;
-			PHAR_G(last_alias) = fd->alias;
-			PHAR_G(last_alias_len) = fd->alias_len;
-
-			return SUCCESS;
+			return archive;
 		}
 
 		/* not found, try converting \ to / */
-		my_realpath = expand_filepath(fname, my_realpath);
+		char *my_realpath = expand_filepath(fname, NULL);
 
-		if (my_realpath) {
-			fname_len = strlen(my_realpath);
-			fname = my_realpath;
-		} else {
-			return FAILURE;
+		if (UNEXPECTED(!my_realpath)) {
+			return NULL;
 		}
+
+		size_t my_realpath_len = strlen(my_realpath);
 #ifdef PHP_WIN32
-		phar_unixify_path_separators(fname, fname_len);
+		phar_unixify_path_separators(my_realpath, my_realpath_len);
 #endif
 
-		if (NULL != (fd_ptr = zend_hash_str_find_ptr(&(PHAR_G(phar_fname_map)), fname, fname_len))) {
-realpath_success:
-			*archive = fd_ptr;
-			fd = fd_ptr;
+		archive = zend_hash_str_find_ptr(&(PHAR_G(phar_fname_map)), my_realpath, my_realpath_len);
+
+		/* If we didn't find the path in the fname map, check in the cached manifest to see if we can find it */
+		if (!archive && PHAR_G(manifest_cached)) {
+			archive = zend_hash_str_find_ptr(&cached_phars, my_realpath, my_realpath_len);
+		}
+		efree(my_realpath);
 
+		if (archive) {
 			if (alias && alias_len) {
-				zend_hash_str_add_ptr(&(PHAR_G(phar_alias_map)), alias, alias_len, fd);
+				zend_hash_str_add_ptr(&(PHAR_G(phar_alias_map)), alias, alias_len, archive);
 			}
 
-			efree(my_realpath);
+			PHAR_G(last_phar) = archive;
+			PHAR_G(last_phar_name) = archive->fname;
+			PHAR_G(last_alias) = archive->alias;
+			PHAR_G(last_alias_len) = archive->alias_len;
 
-			PHAR_G(last_phar) = fd;
-			PHAR_G(last_phar_name) = fd->fname;
-			PHAR_G(last_phar_name_len) = fd->fname_len;
-			PHAR_G(last_alias) = fd->alias;
-			PHAR_G(last_alias_len) = fd->alias_len;
-
-			return SUCCESS;
+			return archive;
 		}
-
-		if (PHAR_G(manifest_cached) && NULL != (fd_ptr = zend_hash_str_find_ptr(&cached_phars, fname, fname_len))) {
-			goto realpath_success;
-		}
-
-		efree(my_realpath);
 	}
 
-	return FAILURE;
+	return NULL;
 }
 /* }}} */
 
@@ -1212,7 +1169,6 @@ phar_entry_info *phar_get_entry_info(phar_archive_data *phar, char *path, size_t
 phar_entry_info *phar_get_entry_info_dir(phar_archive_data *phar, char *path, size_t path_len, char dir, char **error, bool security) /* {{{ */
 {
 	const char *pcr_error;
-	phar_entry_info *entry;
 	bool is_dir;
 
 #ifdef PHP_WIN32
@@ -1257,7 +1213,8 @@ phar_entry_info *phar_get_entry_info_dir(phar_archive_data *phar, char *path, si
 		path_len--;
 	}
 
-	if (NULL != (entry = zend_hash_str_find_ptr(&phar->manifest, path, path_len))) {
+	phar_entry_info *entry = zend_hash_str_find_ptr(&phar->manifest, path, path_len);
+	if (entry) {
 		if (entry->is_deleted) {
 			/* entry is deleted, but has not been flushed to disk yet */
 			return NULL;
@@ -1301,7 +1258,8 @@ phar_entry_info *phar_get_entry_info_dir(phar_archive_data *phar, char *path, si
 				size_t test_len;
 				php_stream_statbuf ssb;
 
-				if (NULL == (entry = zend_hash_find_ptr(&phar->manifest, str_key))) {
+				entry = zend_hash_find_ptr(&phar->manifest, str_key);
+				if (!entry) {
 					if (error) {
 						spprintf(error, 4096, "phar internal error: mounted path \"%s\" could not be retrieved from manifest", ZSTR_VAL(str_key));
 					}
@@ -1350,7 +1308,8 @@ phar_entry_info *phar_get_entry_info_dir(phar_archive_data *phar, char *path, si
 
 				efree(test);
 
-				if (NULL == (entry = zend_hash_str_find_ptr(&phar->manifest, path, path_len))) {
+				entry = zend_hash_str_find_ptr(&phar->manifest, path, path_len);
+				if (!entry) {
 					if (error) {
 						spprintf(error, 4096, "phar error: path \"%s\" exists as file \"%s\" and could not be retrieved after being mounted", path, test);
 					}
@@ -1367,53 +1326,61 @@ phar_entry_info *phar_get_entry_info_dir(phar_archive_data *phar, char *path, si
 
 static const char hexChars[] = "0123456789ABCDEF";
 
-static int phar_hex_str(const char *digest, size_t digest_len, char **signature) /* {{{ */
+static size_t phar_hex_str(const char *digest, size_t digest_len, char **signature) /* {{{ */
 {
-	int pos = -1;
+	size_t pos = 0;
 	size_t len = 0;
 
 	*signature = (char*)safe_pemalloc(digest_len, 2, 1, PHAR_G(persist));
 
 	for (; len < digest_len; ++len) {
-		(*signature)[++pos] = hexChars[((const unsigned char *)digest)[len] >> 4];
-		(*signature)[++pos] = hexChars[((const unsigned char *)digest)[len] & 0x0F];
+		(*signature)[pos++] = hexChars[((const unsigned char *)digest)[len] >> 4];
+		(*signature)[pos++] = hexChars[((const unsigned char *)digest)[len] & 0x0F];
 	}
-	(*signature)[++pos] = '\0';
+	(*signature)[pos] = '\0';
 	return pos;
 }
 /* }}} */
 
 #ifndef PHAR_HAVE_OPENSSL
-static zend_result phar_call_openssl_signverify(bool is_sign, php_stream *fp, zend_off_t end, char *key, size_t key_len, char **signature, size_t *signature_len, uint32_t sig_type) /* {{{ */
-{
-	zval retval, zp[4];
-	zend_string *str;
-
-	zend_function *fn = NULL;
-	if (is_sign) {
-		fn = zend_hash_str_find_ptr(CG(function_table), ZEND_STRL("openssl_sign"));
-	} else {
-		fn = zend_hash_str_find_ptr(CG(function_table), ZEND_STRL("openssl_verify"));
-	}
+ZEND_ATTRIBUTE_NONNULL static bool phar_call_openssl_verify(
+	php_stream *fp,
+	zend_off_t end,
+	zend_string *public_key,
+	const char *signature,
+	size_t signature_len,
+	uint32_t sig_type
+) {
+	ZEND_ASSERT(signature_len != 0);
+	zend_function *fn = zend_hash_str_find_ptr(CG(function_table), ZEND_STRL("openssl_verify"));
 
 	/* OpenSSL is not available, even as a shared module */
-	if (fn == NULL) {
-		return FAILURE;
+	if (UNEXPECTED(fn == NULL)) {
+		return false;
 	}
 
-	if (*signature_len) {
-		ZVAL_STRINGL(&zp[1], *signature, *signature_len);
-	} else {
-		ZVAL_EMPTY_STRING(&zp[1]);
-	}
-	ZVAL_STRINGL(&zp[2], key, key_len);
+	/* Read and copy stream content */
 	php_stream_rewind(fp);
-	str = php_stream_copy_to_mem(fp, (size_t) end, 0);
-	if (str) {
-		ZVAL_STR(&zp[0], str);
-	} else {
-		ZVAL_EMPTY_STRING(&zp[0]);
-	}
+	zend_string *str = php_stream_copy_to_mem(fp, (size_t) end, false);
+	/* No content thus signing must fail */
+	if (UNEXPECTED(str == NULL || (size_t)end != ZSTR_LEN(str))) {
+		return false;
+	}
+
+	/* Set up parameters for call to openssl_verify()
+	 * openssl_verify(
+	 *	string $data,
+	 *	string $signature,
+	 *	OpenSSLAsymmetricKey|OpenSSLCertificate|array|string $public_key,
+	 *	string|int $algorithm = OPENSSL_ALGO_SHA1,
+	 *	int $padding = 0
+	 * ): int|false
+	 */
+	zval retval, zp[4];
+	ZVAL_STR(&zp[0], str);
+	ZVAL_STRINGL(&zp[1], signature, signature_len);
+	/* Note we do not own the lifetime of the public key, but it is fine as calling the function will increase the refcount) */
+	ZVAL_STR(&zp[2], public_key);
 	if (sig_type == PHAR_SIG_OPENSSL_SHA512) {
 		ZVAL_LONG(&zp[3], 9); /* value from openssl.c #define OPENSSL_ALGO_SHA512 9 */
 	} else if (sig_type == PHAR_SIG_OPENSSL_SHA256) {
@@ -1422,52 +1389,84 @@ static zend_result phar_call_openssl_signverify(bool is_sign, php_stream *fp, ze
 		/* don't rely on default value which may change in the future */
 		ZVAL_LONG(&zp[3], 1); /* value from openssl.c #define OPENSSL_ALGO_SHA1   1 */
 	}
+	zend_call_known_function(fn, NULL, NULL, &retval, /* param_count */ 4, zp, NULL);
+	/* Free string arguments that we own */
+	zval_ptr_dtor_str(&zp[0]);
+	zval_ptr_dtor_str(&zp[1]);
+
+	/* Returns 1 if the signature is correct, 0 if it is incorrect, and -1 or false on error. */
+	switch (Z_TYPE(retval)) {
+		case IS_LONG:
+			if (1 == Z_LVAL(retval)) {
+				return true;
+			}
+			ZEND_FALLTHROUGH;
+		default:
+			/* Unlikely, but the openssl_verify() function may be disabled and redefined in userland and return bollocks */
+			zval_ptr_dtor(&retval);
+			return false;
+	}
+}
+
+static zend_result phar_call_openssl_sign(php_stream *fp, zend_off_t end, const char *key, size_t key_len, char **signature, size_t *signature_len, uint32_t sig_type) /* {{{ */
+{
+	ZEND_ASSERT(end != 0);
+	ZEND_ASSERT(*signature_len == 0);
+	zval retval, zp[4];
 
-	if ((size_t)end != Z_STRLEN(zp[0])) {
-		zval_ptr_dtor_str(&zp[0]);
-		zval_ptr_dtor_str(&zp[1]);
-		zval_ptr_dtor_str(&zp[2]);
+	zend_function *fn = zend_hash_str_find_ptr(CG(function_table), ZEND_STRL("openssl_sign"));
+
+	/* OpenSSL is not available, even as a shared module */
+	if (fn == NULL) {
 		return FAILURE;
 	}
 
-	Z_ADDREF(zp[0]);
-	if (is_sign) {
-		ZVAL_NEW_REF(&zp[1], &zp[1]);
+	/* Read and copy stream content */
+	php_stream_rewind(fp);
+	zend_string *str = php_stream_copy_to_mem(fp, (size_t) end, false);
+	/* No content thus signing must fail */
+	if (!str || (size_t)end != ZSTR_LEN(str)) {
+		return FAILURE;
+	}
+
+	/* Set up parameters for call to openssl_sign()
+	 * openssl_sign(
+	 *	string $data,
+	 *	string &$signature,
+	 *	#[\SensitiveParameter] OpenSSLAsymmetricKey|OpenSSLCertificate|array|string $private_key,
+	 *	string|int $algorithm = OPENSSL_ALGO_SHA1,
+	 *	int $padding = 0
+	 * ): bool
+	 */
+	ZVAL_STR(&zp[0], str);
+	ZVAL_EMPTY_STRING(&zp[1]);
+	ZVAL_NEW_REF(&zp[1], &zp[1]);
+	ZVAL_STRINGL(&zp[2], key, key_len);
+	if (sig_type == PHAR_SIG_OPENSSL_SHA512) {
+		ZVAL_LONG(&zp[3], 9); /* value from openssl.c #define OPENSSL_ALGO_SHA512 9 */
+	} else if (sig_type == PHAR_SIG_OPENSSL_SHA256) {
+		ZVAL_LONG(&zp[3], 7); /* value from openssl.c #define OPENSSL_ALGO_SHA256 7 */
 	} else {
-		Z_ADDREF(zp[1]);
+		/* don't rely on default value which may change in the future */
+		ZVAL_LONG(&zp[3], 1); /* value from openssl.c #define OPENSSL_ALGO_SHA1   1 */
 	}
-	Z_ADDREF(zp[2]);
 
 	zend_call_known_function(fn, NULL, NULL, &retval, /* param_count */ 4, zp, NULL);
 
-	Z_DELREF(zp[0]);
-
-	if (is_sign) {
-		ZVAL_UNREF(&zp[1]);
-	} else {
-		Z_DELREF(zp[1]);
-	}
-	Z_DELREF(zp[2]);
+	ZVAL_UNREF(&zp[1]);
 
 	zval_ptr_dtor_str(&zp[0]);
 	zval_ptr_dtor_str(&zp[2]);
 
 	switch (Z_TYPE(retval)) {
-		case IS_LONG:
-			zval_ptr_dtor(&zp[1]);
-			if (1 == Z_LVAL(retval)) {
-				return SUCCESS;
-			}
-			return FAILURE;
 		case IS_TRUE:
 			*signature = estrndup(Z_STRVAL(zp[1]), Z_STRLEN(zp[1]));
 			*signature_len = Z_STRLEN(zp[1]);
 			zval_ptr_dtor(&zp[1]);
 			return SUCCESS;
 		default:
+			/* Unlikely, but the openssl_sign() function may be disabled and redefined in userland and return bollocks */
 			zval_ptr_dtor(&retval);
-			ZEND_FALLTHROUGH;
-		case IS_FALSE:
 			zval_ptr_dtor(&zp[1]);
 			return FAILURE;
 	}
@@ -1475,7 +1474,7 @@ static zend_result phar_call_openssl_signverify(bool is_sign, php_stream *fp, ze
 /* }}} */
 #endif /* #ifndef PHAR_HAVE_OPENSSL */
 
-zend_result phar_verify_signature(php_stream *fp, size_t end_of_phar, uint32_t sig_type, char *sig, size_t sig_len, char *fname, char **signature, size_t *signature_len, char **error) /* {{{ */
+zend_result phar_verify_signature(php_stream *fp, size_t end_of_phar, uint32_t sig_type, const char *sig, size_t sig_len, const char *fname, char **signature, size_t *signature_len, char **error) /* {{{ */
 {
 	size_t read_size, len;
 	zend_off_t read_len;
@@ -1500,8 +1499,6 @@ zend_result phar_verify_signature(php_stream *fp, size_t end_of_phar, uint32_t s
 			} else {
 				mdtype = EVP_sha1();
 			}
-#else
-			size_t tempsig;
 #endif
 			zend_string *pubkey = NULL;
 			char *pfile;
@@ -1519,21 +1516,24 @@ zend_result phar_verify_signature(php_stream *fp, size_t end_of_phar, uint32_t s
 			pfp = php_stream_open_wrapper(pfile, "rb", 0, NULL);
 			efree(pfile);
 
-			if (!pfp || !(pubkey = php_stream_copy_to_mem(pfp, PHP_STREAM_COPY_ALL, 0)) || !ZSTR_LEN(pubkey)) {
-				if (pfp) {
-					php_stream_close(pfp);
-				}
+			if (!pfp) {
 				if (error) {
 					*error = estrdup("openssl public key could not be read");
 				}
 				return FAILURE;
 			}
 
+			pubkey = php_stream_copy_to_mem(pfp, PHP_STREAM_COPY_ALL, 0);
 			php_stream_close(pfp);
-#ifndef PHAR_HAVE_OPENSSL
-			tempsig = sig_len;
+			if (!pubkey || !ZSTR_LEN(pubkey)) {
+				if (error) {
+					*error = estrdup("openssl public key could not be read");
+				}
+				return FAILURE;
+			}
 
-			if (FAILURE == phar_call_openssl_signverify(false, fp, end_of_phar, ZSTR_VAL(pubkey), ZSTR_LEN(pubkey), &sig, &tempsig, sig_type)) {
+#ifndef PHAR_HAVE_OPENSSL
+			if (!phar_call_openssl_verify(fp, end_of_phar, pubkey, sig, sig_len, sig_type)) {
 				zend_string_release_ex(pubkey, 0);
 
 				if (error) {
@@ -1543,9 +1543,7 @@ zend_result phar_verify_signature(php_stream *fp, size_t end_of_phar, uint32_t s
 				return FAILURE;
 			}
 
-			zend_string_release_ex(pubkey, 0);
-
-			sig_len = tempsig;
+			zend_string_release_ex(pubkey, false);
 #else
 			in = BIO_new_mem_buf(ZSTR_VAL(pubkey), ZSTR_LEN(pubkey));
 
@@ -1573,6 +1571,7 @@ zend_result phar_verify_signature(php_stream *fp, size_t end_of_phar, uint32_t s
 				if (md_ctx) {
 					EVP_MD_CTX_destroy(md_ctx);
 				}
+				EVP_PKEY_free(key);
 				if (error) {
 					*error = estrdup("openssl signature could not be verified");
 				}
@@ -1616,7 +1615,7 @@ zend_result phar_verify_signature(php_stream *fp, size_t end_of_phar, uint32_t s
 			EVP_MD_CTX_destroy(md_ctx);
 #endif
 
-			*signature_len = phar_hex_str((const char*)sig, sig_len, signature);
+			*signature_len = phar_hex_str(sig, sig_len, signature);
 		}
 		break;
 		case PHAR_SIG_SHA512: {
@@ -1789,8 +1788,9 @@ zend_result phar_verify_signature(php_stream *fp, size_t end_of_phar, uint32_t s
 }
 /* }}} */
 
-ZEND_ATTRIBUTE_NONNULL zend_result phar_create_signature(phar_archive_data *phar, php_stream *fp, char **signature, size_t *signature_length, char **error) /* {{{ */
+ZEND_ATTRIBUTE_NONNULL zend_string* phar_create_signature(phar_archive_data *phar, php_stream *fp, char **error) /* {{{ */
 {
+	zend_string *signature = NULL;
 	unsigned char buf[1024];
 	size_t sig_len;
 
@@ -1813,8 +1813,7 @@ ZEND_ATTRIBUTE_NONNULL zend_result phar_create_signature(phar_archive_data *phar
 			}
 
 			PHP_SHA512Final(digest, &context);
-			*signature = estrndup((char *) digest, 64);
-			*signature_length = 64;
+			signature = zend_string_init((const char*)digest, 64, false);
 			break;
 		}
 		default:
@@ -1831,8 +1830,7 @@ ZEND_ATTRIBUTE_NONNULL zend_result phar_create_signature(phar_archive_data *phar
 			}
 
 			PHP_SHA256Final(digest, &context);
-			*signature = estrndup((char *) digest, 32);
-			*signature_length = 32;
+			signature = zend_string_init((const char*)digest, 32, false);
 			break;
 		}
 		case PHAR_SIG_OPENSSL_SHA512:
@@ -1857,8 +1855,8 @@ ZEND_ATTRIBUTE_NONNULL zend_result phar_create_signature(phar_archive_data *phar
 			in = BIO_new_mem_buf(PHAR_G(openssl_privatekey), PHAR_G(openssl_privatekey_len));
 
 			if (in == NULL) {
-				spprintf(error, 0, "unable to write to phar \"%s\" with requested openssl signature", phar->fname);
-				return FAILURE;
+				spprintf(error, 0, "unable to write to phar \"%s\" with requested openssl signature", ZSTR_VAL(phar->fname));
+				return NULL;
 			}
 
 			key = PEM_read_bio_PrivateKey(in, NULL,NULL, "");
@@ -1866,14 +1864,14 @@ ZEND_ATTRIBUTE_NONNULL zend_result phar_create_signature(phar_archive_data *phar
 
 			if (!key) {
 				*error = estrdup("unable to process private key");
-				return FAILURE;
+				return NULL;
 			}
 
 			md_ctx = EVP_MD_CTX_create();
 			if (md_ctx == NULL) {
 				EVP_PKEY_free(key);
-				spprintf(error, 0, "unable to initialize openssl signature for phar \"%s\"", phar->fname);
-				return FAILURE;
+				spprintf(error, 0, "unable to initialize openssl signature for phar \"%s\"", ZSTR_VAL(phar->fname));
+				return NULL;
 			}
 
 			siglen = EVP_PKEY_size(key);
@@ -1883,8 +1881,8 @@ ZEND_ATTRIBUTE_NONNULL zend_result phar_create_signature(phar_archive_data *phar
 				EVP_PKEY_free(key);
 				EVP_MD_CTX_destroy(md_ctx);
 				efree(sigbuf);
-				spprintf(error, 0, "unable to initialize openssl signature for phar \"%s\"", phar->fname);
-				return FAILURE;
+				spprintf(error, 0, "unable to initialize openssl signature for phar \"%s\"", ZSTR_VAL(phar->fname));
+				return NULL;
 			}
 
 			while ((sig_len = php_stream_read(fp, (char*)buf, sizeof(buf))) > 0) {
@@ -1892,8 +1890,8 @@ ZEND_ATTRIBUTE_NONNULL zend_result phar_create_signature(phar_archive_data *phar
 					EVP_PKEY_free(key);
 					EVP_MD_CTX_destroy(md_ctx);
 					efree(sigbuf);
-					spprintf(error, 0, "unable to update the openssl signature for phar \"%s\"", phar->fname);
-					return FAILURE;
+					spprintf(error, 0, "unable to update the openssl signature for phar \"%s\"", ZSTR_VAL(phar->fname));
+					return NULL;
 				}
 			}
 
@@ -1901,26 +1899,28 @@ ZEND_ATTRIBUTE_NONNULL zend_result phar_create_signature(phar_archive_data *phar
 				EVP_PKEY_free(key);
 				EVP_MD_CTX_destroy(md_ctx);
 				efree(sigbuf);
-				spprintf(error, 0, "unable to write phar \"%s\" with requested openssl signature", phar->fname);
-				return FAILURE;
+				spprintf(error, 0, "unable to write phar \"%s\" with requested openssl signature", ZSTR_VAL(phar->fname));
+				return NULL;
 			}
 
 			sigbuf[siglen] = '\0';
 			EVP_PKEY_free(key);
 			EVP_MD_CTX_destroy(md_ctx);
+			signature = zend_string_init((const char*)sigbuf, siglen, false);
+			efree(sigbuf);
 #else
 			size_t siglen;
 			sigbuf = NULL;
 			siglen = 0;
 			php_stream_seek(fp, 0, SEEK_END);
 
-			if (FAILURE == phar_call_openssl_signverify(true, fp, php_stream_tell(fp), PHAR_G(openssl_privatekey), PHAR_G(openssl_privatekey_len), (char **)&sigbuf, &siglen, phar->sig_flags)) {
-				spprintf(error, 0, "unable to write phar \"%s\" with requested openssl signature", phar->fname);
-				return FAILURE;
+			if (FAILURE == phar_call_openssl_sign(fp, php_stream_tell(fp), PHAR_G(openssl_privatekey), PHAR_G(openssl_privatekey_len), (char **)&sigbuf, &siglen, phar->sig_flags)) {
+				spprintf(error, 0, "unable to write phar \"%s\" with requested openssl signature", ZSTR_VAL(phar->fname));
+				return NULL;
 			}
+			signature = zend_string_init((const char*)sigbuf, siglen, false);
+			efree(sigbuf);
 #endif
-			*signature = (char *) sigbuf;
-			*signature_length = siglen;
 		}
 		break;
 		case PHAR_SIG_SHA1: {
@@ -1934,8 +1934,7 @@ ZEND_ATTRIBUTE_NONNULL zend_result phar_create_signature(phar_archive_data *phar
 			}
 
 			PHP_SHA1Final(digest, &context);
-			*signature = estrndup((char *) digest, 20);
-			*signature_length = 20;
+			signature = zend_string_init((const char*)digest, 20, false);
 			break;
 		}
 		case PHAR_SIG_MD5: {
@@ -1949,19 +1948,18 @@ ZEND_ATTRIBUTE_NONNULL zend_result phar_create_signature(phar_archive_data *phar
 			}
 
 			PHP_MD5Final(digest, &context);
-			*signature = estrndup((char *) digest, 16);
-			*signature_length = 16;
+			signature = zend_string_init((const char*)digest, 16, false);
 			break;
 		}
 	}
 
-	phar->sig_len = phar_hex_str((const char *)*signature, *signature_length, &phar->signature);
-	return SUCCESS;
+	phar->sig_len = phar_hex_str(ZSTR_VAL(signature), ZSTR_LEN(signature), &phar->signature);
+	return signature;
 }
 /* }}} */
 
 // TODO: convert this to zend_string too
-void phar_add_virtual_dirs(phar_archive_data *phar, char *filename, size_t filename_len) /* {{{ */
+void phar_add_virtual_dirs(phar_archive_data *phar, const char *filename, size_t filename_len) /* {{{ */
 {
 	const char *s;
 	zend_string *str;
@@ -1992,8 +1990,8 @@ static int phar_update_cached_entry(zval *data, void *argument) /* {{{ */
 
 	entry->phar = (phar_archive_data *)argument;
 
-	if (entry->link) {
-		entry->link = estrdup(entry->link);
+	if (entry->symlink) {
+		zend_string_addref(entry->symlink);
 	}
 
 	if (entry->tmp) {
@@ -2017,19 +2015,15 @@ static void phar_manifest_copy_ctor(zval *zv) /* {{{ */
 }
 /* }}} */
 
-static void phar_copy_cached_phar(phar_archive_data **pphar) /* {{{ */
+static phar_archive_data* phar_copy_cached_phar(const phar_archive_data *persistent_phar) /* {{{ */
 {
-	phar_archive_data *phar;
 	HashTable newmanifest;
-	char *fname;
 	phar_archive_object *objphar;
 
-	phar = (phar_archive_data *) emalloc(sizeof(phar_archive_data));
-	*phar = **pphar;
+	phar_archive_data *phar = emalloc(sizeof(phar_archive_data));
+	*phar = *persistent_phar;
 	phar->is_persistent = 0;
-	fname = phar->fname;
-	phar->fname = estrndup(phar->fname, phar->fname_len);
-	phar->ext = phar->fname + (phar->ext - fname);
+	zend_string_addref(phar->fname);
 
 	if (phar->alias) {
 		phar->alias = estrndup(phar->alias, phar->alias_len);
@@ -2041,45 +2035,40 @@ static void phar_copy_cached_phar(phar_archive_data **pphar) /* {{{ */
 
 	phar_metadata_tracker_clone(&phar->metadata_tracker);
 
-	zend_hash_init(&newmanifest, sizeof(phar_entry_info),
-		zend_get_hash_value, destroy_phar_manifest_entry, 0);
-	zend_hash_copy(&newmanifest, &(*pphar)->manifest, phar_manifest_copy_ctor);
+	zend_hash_init(&newmanifest, sizeof(phar_entry_info), NULL, destroy_phar_manifest_entry, 0);
+	zend_hash_copy(&newmanifest, &persistent_phar->manifest, phar_manifest_copy_ctor);
 	zend_hash_apply_with_argument(&newmanifest, phar_update_cached_entry, (void *)phar);
 	phar->manifest = newmanifest;
-	zend_hash_init(&phar->mounted_dirs, sizeof(char *),
-		zend_get_hash_value, NULL, 0);
-	zend_hash_init(&phar->virtual_dirs, sizeof(char *),
-		zend_get_hash_value, NULL, 0);
-	zend_hash_copy(&phar->virtual_dirs, &(*pphar)->virtual_dirs, NULL);
-	*pphar = phar;
+	zend_hash_init(&phar->mounted_dirs, sizeof(char *), NULL, NULL, 0);
+	zend_hash_init(&phar->virtual_dirs, sizeof(char *), NULL, NULL, 0);
+	zend_hash_copy(&phar->virtual_dirs, &persistent_phar->virtual_dirs, NULL);
 
 	/* now, scan the list of persistent Phar objects referencing this phar and update the pointers */
 	ZEND_HASH_MAP_FOREACH_PTR(&PHAR_G(phar_persist_map), objphar) {
-		if (objphar->archive->fname_len == phar->fname_len && !memcmp(objphar->archive->fname, phar->fname, phar->fname_len)) {
+		if (zend_string_equals(objphar->archive->fname, phar->fname)) {
 			objphar->archive = phar;
 		}
 	} ZEND_HASH_FOREACH_END();
+	return phar;
 }
 /* }}} */
 
 zend_result phar_copy_on_write(phar_archive_data **pphar) /* {{{ */
 {
-	zval zv, *pzv;
-	phar_archive_data *newpphar;
+	phar_archive_data *newpphar = phar_copy_cached_phar(*pphar);
 
-	ZVAL_PTR(&zv, *pphar);
-	if (NULL == (pzv = zend_hash_str_add(&(PHAR_G(phar_fname_map)), (*pphar)->fname, (*pphar)->fname_len, &zv))) {
+	zval *pzv = zend_hash_add_ptr(&(PHAR_G(phar_fname_map)), newpphar->fname, newpphar);
+	if (!pzv) {
 		return FAILURE;
 	}
 
-	phar_copy_cached_phar((phar_archive_data **)&Z_PTR_P(pzv));
-	newpphar = Z_PTR_P(pzv);
 	/* invalidate phar cache */
 	PHAR_G(last_phar) = NULL;
-	PHAR_G(last_phar_name) = PHAR_G(last_alias) = NULL;
+	PHAR_G(last_alias) = NULL;
+	PHAR_G(last_phar_name) = NULL;
 
 	if (newpphar->alias_len && NULL == zend_hash_str_add_ptr(&(PHAR_G(phar_alias_map)), newpphar->alias, newpphar->alias_len, newpphar)) {
-		zend_hash_str_del(&(PHAR_G(phar_fname_map)), (*pphar)->fname, (*pphar)->fname_len);
+		zend_hash_del(&(PHAR_G(phar_fname_map)), newpphar->fname);
 		return FAILURE;
 	}
 
diff --git a/ext/phar/zip.c b/ext/phar/zip.c
index c342c8868d3e..5aa3f552b2ab 100644
--- a/ext/phar/zip.c
+++ b/ext/phar/zip.c
@@ -2,15 +2,13 @@
   +----------------------------------------------------------------------+
   | ZIP archive support for Phar                                         |
   +----------------------------------------------------------------------+
-  | Copyright (c) The PHP Group                                          |
+  | Copyright © The PHP Group and Contributors.                          |
   +----------------------------------------------------------------------+
-  | This source file is subject to version 3.01 of the PHP license,      |
-  | that is bundled with this package in the file LICENSE, and is        |
-  | available through the world-wide-web at the following url:           |
-  | https://www.php.net/license/3_01.txt                                 |
-  | If you did not receive a copy of the PHP license and are unable to   |
-  | obtain it through the world-wide-web, please send a note to          |
-  | license@php.net so we can mail you a copy immediately.               |
+  | This source file is subject to the Modified BSD License that is      |
+  | bundled with this package in the file LICENSE, and is available      |
+  | through the World Wide Web at .        |
+  |                                                                      |
+  | SPDX-License-Identifier: BSD-3-Clause                                |
   +----------------------------------------------------------------------+
   | Authors: Gregory Beaver                              |
   +----------------------------------------------------------------------+
@@ -41,19 +39,30 @@ static inline void phar_write_16(char buffer[2], uint32_t value)
 # define PHAR_SET_32(var, value) phar_write_32(var, (uint32_t) (value));
 # define PHAR_SET_16(var, value) phar_write_16(var, (uint16_t) (value));
 
-static zend_result phar_zip_process_extra(php_stream *fp, phar_entry_info *entry, uint16_t len) /* {{{ */
+static zend_result phar_zip_process_extra(php_stream *fp, phar_entry_info *entry, uint16_t extra_len) /* {{{ */
 {
 	union {
 		phar_zip_extra_field_header header;
 		phar_zip_unix3 unix3;
 		phar_zip_unix_time time;
 	} h;
+	size_t len = extra_len;
 	size_t read;
 
-	do {
+	while (len) {
+		size_t header_size;
+
+		if (len < sizeof(h.header)) {
+			return FAILURE;
+		}
 		if (sizeof(h.header) != php_stream_read(fp, (char *) &h.header, sizeof(h.header))) {
 			return FAILURE;
 		}
+		len -= sizeof(h.header);
+		header_size = PHAR_GET_16(h.header.size);
+		if (header_size > len) {
+			return FAILURE;
+		}
 
 		if (h.header.tag[0] == 'U' && h.header.tag[1] == 'T') {
 			/* Unix timestamp header found.
@@ -62,7 +71,6 @@ static zend_result phar_zip_process_extra(php_stream *fp, phar_entry_info *entry
 			 * We only store the modification time in the entry, so only read that.
 			 */
 			const size_t min_size = 5;
-			uint16_t header_size = PHAR_GET_16(h.header.size);
 			if (header_size >= min_size) {
 				read = php_stream_read(fp, &h.time.flags, min_size);
 				if (read != min_size) {
@@ -73,12 +81,11 @@ static zend_result phar_zip_process_extra(php_stream *fp, phar_entry_info *entry
 					entry->timestamp = PHAR_GET_32(h.time.time);
 				}
 
-				len -= header_size + 4;
-
 				/* Consume remaining bytes */
-				if (header_size != read) {
-					php_stream_seek(fp, header_size - read, SEEK_CUR);
+				if (header_size != read && -1 == php_stream_seek(fp, header_size - read, SEEK_CUR)) {
+					return FAILURE;
 				}
+				len -= header_size;
 				continue;
 			}
 			/* Fallthrough to next if to skip header */
@@ -86,23 +93,36 @@ static zend_result phar_zip_process_extra(php_stream *fp, phar_entry_info *entry
 
 		if (h.header.tag[0] != 'n' || h.header.tag[1] != 'u') {
 			/* skip to next header */
-			php_stream_seek(fp, PHAR_GET_16(h.header.size), SEEK_CUR);
-			len -= PHAR_GET_16(h.header.size) + 4;
+			if (header_size && -1 == php_stream_seek(fp, header_size, SEEK_CUR)) {
+				return FAILURE;
+			}
+			len -= header_size;
 			continue;
 		}
 
 		/* unix3 header found */
-		read = php_stream_read(fp, (char *) &(h.unix3.crc32), sizeof(h.unix3) - sizeof(h.header));
-		len -= read + 4;
+		size_t unix3_size = sizeof(h.unix3) - sizeof(h.header);
+		size_t field_size = header_size;
+		if (field_size == unix3_size - sizeof(h.unix3.crc32)) {
+			/* Some archives omit the CRC32 from the unix3 size field. */
+			field_size = unix3_size;
+		}
+		if (field_size < unix3_size || field_size > len) {
+			return FAILURE;
+		}
 
-		if (sizeof(h.unix3) - sizeof(h.header) != read) {
+		read = php_stream_read(fp, (char *) &(h.unix3.crc32), unix3_size);
+		if (unix3_size != read) {
 			return FAILURE;
 		}
 
-		if (PHAR_GET_16(h.unix3.size) > sizeof(h.unix3) - 4) {
+		if (field_size > unix3_size) {
 			/* skip symlink filename - we may add this support in later */
-			php_stream_seek(fp, PHAR_GET_16(h.unix3.size) - sizeof(h.unix3.size), SEEK_CUR);
+			if (-1 == php_stream_seek(fp, field_size - unix3_size, SEEK_CUR)) {
+				return FAILURE;
+			}
 		}
+		len -= field_size;
 
 		/* set permissions */
 		entry->flags &= PHAR_ENT_COMPRESSION_MASK;
@@ -113,7 +133,7 @@ static zend_result phar_zip_process_extra(php_stream *fp, phar_entry_info *entry
 			entry->flags |= PHAR_GET_16(h.unix3.perms) & PHAR_ENT_PERM_MASK;
 		}
 
-	} while (len);
+	}
 
 	return SUCCESS;
 }
@@ -226,8 +246,14 @@ static char *phar_find_eocd(const char *s, size_t n)
  * This is used by phar_open_from_fp to process a zip-based phar, but can be called
  * directly.
  */
-zend_result phar_parse_zipfile(php_stream *fp, char *fname, size_t fname_len, char *alias, size_t alias_len, phar_archive_data** pphar, char **error) /* {{{ */
-{
+zend_result phar_parse_zipfile(
+	php_stream *fp,
+	const char *fname,
+	size_t fname_len,
+	/* copyable & hash update */ zend_string *alias,
+	phar_archive_data** pphar,
+	char **error
+) {
 	phar_zip_dir_end locator;
 	char buf[sizeof(locator) + 65536];
 	zend_off_t size;
@@ -310,21 +336,23 @@ zend_result phar_parse_zipfile(php_stream *fp, char *fname, size_t fname_len, ch
 		ZVAL_UNDEF(&mydata->metadata_tracker.val);
 	}
 
-	mydata->fname = pestrndup(fname, fname_len, mydata->is_persistent);
+	mydata->fname = zend_string_init(fname, fname_len, mydata->is_persistent);
+	if (mydata->is_persistent) {
+		GC_MAKE_PERSISTENT_LOCAL(mydata->fname);
+	}
 #ifdef PHP_WIN32
-	phar_unixify_path_separators(mydata->fname, fname_len);
+	phar_unixify_path_separators(ZSTR_VAL(mydata->fname), ZSTR_LEN(mydata->fname));
 #endif
 	mydata->is_zip = 1;
-	mydata->fname_len = fname_len;
-	ext = strrchr(mydata->fname, '/');
+	ext = strrchr(ZSTR_VAL(mydata->fname), '/');
 
 	if (ext) {
-		mydata->ext = memchr(ext, '.', (mydata->fname + fname_len) - ext);
+		mydata->ext = memchr(ext, '.', (ZSTR_VAL(mydata->fname) + ZSTR_LEN(mydata->fname)) - ext);
 		if (mydata->ext == ext) {
-			mydata->ext = memchr(ext + 1, '.', (mydata->fname + fname_len) - ext - 1);
+			mydata->ext = memchr(ext + 1, '.', (ZSTR_VAL(mydata->fname) + ZSTR_LEN(mydata->fname)) - ext - 1);
 		}
 		if (mydata->ext) {
-			mydata->ext_len = (mydata->fname + fname_len) - mydata->ext;
+			mydata->ext_len = (ZSTR_VAL(mydata->fname) + ZSTR_LEN(mydata->fname)) - mydata->ext;
 		}
 	}
 
@@ -356,9 +384,9 @@ zend_result phar_parse_zipfile(php_stream *fp, char *fname, size_t fname_len, ch
 				efree(mydata->signature); \
 			} \
 			if (error) { \
-				spprintf(error, 4096, "phar error: %s in zip-based phar \"%s\"", errmsg, mydata->fname); \
+				spprintf(error, 4096, "phar error: %s in zip-based phar \"%s\"", errmsg, ZSTR_VAL(mydata->fname)); \
 			} \
-			pefree(mydata->fname, mydata->is_persistent); \
+			zend_string_release_ex(mydata->fname, mydata->is_persistent); \
 			if (mydata->alias) { \
 				pefree(mydata->alias, mydata->is_persistent); \
 			} \
@@ -725,29 +753,29 @@ zend_result phar_parse_zipfile(php_stream *fp, char *fname, size_t fname_len, ch
 
 	mydata->fp = fp;
 
-	zend_hash_str_add_ptr(&(PHAR_G(phar_fname_map)), mydata->fname, fname_len, mydata);
+	zend_hash_add_ptr(&(PHAR_G(phar_fname_map)), mydata->fname, mydata);
 
 	if (actual_alias) {
-		phar_archive_data *fd_ptr;
 
 		if (!phar_validate_alias(actual_alias, mydata->alias_len)) {
 			if (error) {
 				spprintf(error, 4096, "phar error: invalid alias \"%s\" in zip-based phar \"%s\"", actual_alias, fname);
 			}
 			efree(actual_alias);
-			zend_hash_str_del(&(PHAR_G(phar_fname_map)), mydata->fname, fname_len);
+			zend_hash_del(&(PHAR_G(phar_fname_map)), mydata->fname);
 			return FAILURE;
 		}
 
 		mydata->is_temporary_alias = 0;
 
-		if (NULL != (fd_ptr = zend_hash_str_find_ptr(&(PHAR_G(phar_alias_map)), actual_alias, mydata->alias_len))) {
-			if (SUCCESS != phar_free_alias(fd_ptr, actual_alias, mydata->alias_len)) {
+		phar_archive_data *fd_ptr = zend_hash_str_find_ptr(&(PHAR_G(phar_alias_map)), actual_alias, mydata->alias_len);
+		if (fd_ptr) {
+			if (SUCCESS != phar_free_alias(fd_ptr)) {
 				if (error) {
 					spprintf(error, 4096, "phar error: Unable to add zip-based phar \"%s\" with implicit alias, alias is already in use", fname);
 				}
 				efree(actual_alias);
-				zend_hash_str_del(&(PHAR_G(phar_fname_map)), mydata->fname, fname_len);
+				zend_hash_del(&(PHAR_G(phar_fname_map)), mydata->fname);
 				return FAILURE;
 			}
 		}
@@ -760,24 +788,23 @@ zend_result phar_parse_zipfile(php_stream *fp, char *fname, size_t fname_len, ch
 
 		zend_hash_str_add_ptr(&(PHAR_G(phar_alias_map)), mydata->alias, mydata->alias_len, mydata);
 	} else {
-		phar_archive_data *fd_ptr;
-
-		if (alias_len) {
-			if (NULL != (fd_ptr = zend_hash_str_find_ptr(&(PHAR_G(phar_alias_map)), alias, alias_len))) {
-				if (SUCCESS != phar_free_alias(fd_ptr, alias, alias_len)) {
+		if (alias) {
+			phar_archive_data *fd_ptr = zend_hash_find_ptr(&(PHAR_G(phar_alias_map)), alias);
+			if (fd_ptr) {
+				if (SUCCESS != phar_free_alias(fd_ptr)) {
 					if (error) {
 						spprintf(error, 4096, "phar error: Unable to add zip-based phar \"%s\" with explicit alias, alias is already in use", fname);
 					}
-					zend_hash_str_del(&(PHAR_G(phar_fname_map)), mydata->fname, fname_len);
+					zend_hash_del(&(PHAR_G(phar_fname_map)), mydata->fname);
 					return FAILURE;
 				}
 			}
 
-			zend_hash_str_add_ptr(&(PHAR_G(phar_alias_map)), alias, alias_len, mydata);
-			mydata->alias = pestrndup(alias, alias_len, mydata->is_persistent);
-			mydata->alias_len = alias_len;
+			zend_hash_add_ptr(&(PHAR_G(phar_alias_map)), alias, mydata);
+			mydata->alias = pestrndup(ZSTR_VAL(alias), ZSTR_LEN(alias), mydata->is_persistent);
+			mydata->alias_len = ZSTR_LEN(alias);
 		} else {
-			mydata->alias = pestrndup(mydata->fname, fname_len, mydata->is_persistent);
+			mydata->alias = pestrndup(ZSTR_VAL(mydata->fname), ZSTR_LEN(mydata->fname), mydata->is_persistent);
 			mydata->alias_len = fname_len;
 		}
 
@@ -795,10 +822,16 @@ zend_result phar_parse_zipfile(php_stream *fp, char *fname, size_t fname_len, ch
 /**
  * Create or open a zip-based phar for writing
  */
-ZEND_ATTRIBUTE_NONNULL_ARGS(1, 7, 8) zend_result phar_open_or_create_zip(char *fname, size_t fname_len, char *alias, size_t alias_len, bool is_data, uint32_t options, phar_archive_data** pphar, char **error) /* {{{ */
-{
+ZEND_ATTRIBUTE_NONNULL_ARGS(1, 5, 6) zend_result phar_open_or_create_zip(
+	zend_string *fname,
+	/* copyable & hash update */ zend_string *alias,
+	bool is_data,
+	uint32_t options,
+	phar_archive_data** pphar,
+	char **error
+) {
 	phar_archive_data *phar;
-	zend_result ret = phar_create_or_parse_filename(fname, fname_len, alias, alias_len, is_data, options, &phar, error);
+	zend_result ret = phar_create_or_parse_filename(fname, alias, is_data, options, &phar, error);
 
 	if (FAILURE == ret) {
 		return FAILURE;
@@ -819,11 +852,10 @@ ZEND_ATTRIBUTE_NONNULL_ARGS(1, 7, 8) zend_result phar_open_or_create_zip(char *f
 	}
 
 	/* we've reached here - the phar exists and is a regular phar */
-	spprintf(error, 4096, "phar zip error: phar \"%s\" already exists as a regular phar and must be deleted from disk prior to creating as a zip-based phar", fname);
+	spprintf(error, 4096, "phar zip error: phar \"%s\" already exists as a regular phar and must be deleted from disk prior to creating as a zip-based phar", ZSTR_VAL(fname));
 
 	return FAILURE;
 }
-/* }}} */
 
 struct _phar_zip_pass {
 	php_stream *filefp;
@@ -917,7 +949,7 @@ static int phar_zip_changed_apply_int(phar_entry_info *entry, void *arg) /* {{{
 		}
 
 		if (FAILURE == phar_open_entry_fp(entry, p->error, false)) {
-			spprintf(p->error, 0, "unable to open file contents of file \"%s\" in zip-based phar \"%s\"", ZSTR_VAL(entry->filename), entry->phar->fname);
+			spprintf(p->error, 0, "unable to open file contents of file \"%s\" in zip-based phar \"%s\"", ZSTR_VAL(entry->filename), ZSTR_VAL(entry->phar->fname));
 			return ZEND_HASH_APPLY_STOP;
 		}
 
@@ -928,7 +960,7 @@ static int phar_zip_changed_apply_int(phar_entry_info *entry, void *arg) /* {{{
 		}
 
 		if (-1 == phar_seek_efp(entry, 0, SEEK_SET, 0, false)) {
-			spprintf(p->error, 0, "unable to seek to start of file \"%s\" to zip-based phar \"%s\"", ZSTR_VAL(entry->filename), entry->phar->fname);
+			spprintf(p->error, 0, "unable to seek to start of file \"%s\" to zip-based phar \"%s\"", ZSTR_VAL(entry->filename), ZSTR_VAL(entry->phar->fname));
 			return ZEND_HASH_APPLY_STOP;
 		}
 
@@ -953,9 +985,9 @@ static int phar_zip_changed_apply_int(phar_entry_info *entry, void *arg) /* {{{
 
 		if (!filter) {
 			if (entry->flags & PHAR_ENT_COMPRESSED_GZ) {
-				spprintf(p->error, 0, "unable to gzip compress file \"%s\" to zip-based phar \"%s\"", ZSTR_VAL(entry->filename), entry->phar->fname);
+				spprintf(p->error, 0, "unable to gzip compress file \"%s\" to zip-based phar \"%s\"", ZSTR_VAL(entry->filename), ZSTR_VAL(entry->phar->fname));
 			} else {
-				spprintf(p->error, 0, "unable to bzip2 compress file \"%s\" to zip-based phar \"%s\"", ZSTR_VAL(entry->filename), entry->phar->fname);
+				spprintf(p->error, 0, "unable to bzip2 compress file \"%s\" to zip-based phar \"%s\"", ZSTR_VAL(entry->filename), ZSTR_VAL(entry->phar->fname));
 			}
 			return ZEND_HASH_APPLY_STOP;
 		}
@@ -967,7 +999,7 @@ static int phar_zip_changed_apply_int(phar_entry_info *entry, void *arg) /* {{{
 
 		if (!entry->cfp) {
 			php_stream_filter_free(filter);
-			spprintf(p->error, 0, "unable to create temporary file for file \"%s\" while creating zip-based phar \"%s\"", ZSTR_VAL(entry->filename), entry->phar->fname);
+			spprintf(p->error, 0, "unable to create temporary file for file \"%s\" while creating zip-based phar \"%s\"", ZSTR_VAL(entry->filename), ZSTR_VAL(entry->phar->fname));
 			return ZEND_HASH_APPLY_STOP;
 		}
 
@@ -975,7 +1007,7 @@ static int phar_zip_changed_apply_int(phar_entry_info *entry, void *arg) /* {{{
 
 		if (-1 == phar_seek_efp(entry, 0, SEEK_SET, 0, false)) {
 			php_stream_filter_free(filter);
-			spprintf(p->error, 0, "unable to seek to start of file \"%s\" to zip-based phar \"%s\"", ZSTR_VAL(entry->filename), entry->phar->fname);
+			spprintf(p->error, 0, "unable to seek to start of file \"%s\" to zip-based phar \"%s\"", ZSTR_VAL(entry->filename), ZSTR_VAL(entry->phar->fname));
 			return ZEND_HASH_APPLY_STOP;
 		}
 
@@ -983,7 +1015,7 @@ static int phar_zip_changed_apply_int(phar_entry_info *entry, void *arg) /* {{{
 
 		if (SUCCESS != php_stream_copy_to_stream_ex(efp, entry->cfp, entry->uncompressed_filesize, NULL)) {
 			php_stream_filter_remove(filter, 1);
-			spprintf(p->error, 0, "unable to copy compressed file contents of file \"%s\" while creating new phar \"%s\"", ZSTR_VAL(entry->filename), entry->phar->fname);
+			spprintf(p->error, 0, "unable to copy compressed file contents of file \"%s\" while creating new phar \"%s\"", ZSTR_VAL(entry->filename), ZSTR_VAL(entry->phar->fname));
 			return ZEND_HASH_APPLY_STOP;
 		}
 
@@ -1006,7 +1038,7 @@ static int phar_zip_changed_apply_int(phar_entry_info *entry, void *arg) /* {{{
 		PHAR_SET_32(local.compsize, entry->compressed_filesize);
 		if (p->old) {
 			if (-1 == php_stream_seek(p->old, entry->offset_abs, SEEK_SET)) {
-				spprintf(p->error, 0, "unable to seek to start of file \"%s\" while creating zip-based phar \"%s\"", ZSTR_VAL(entry->filename), entry->phar->fname);
+				spprintf(p->error, 0, "unable to seek to start of file \"%s\" while creating zip-based phar \"%s\"", ZSTR_VAL(entry->filename), ZSTR_VAL(entry->phar->fname));
 				return ZEND_HASH_APPLY_STOP;
 			}
 		}
@@ -1025,61 +1057,61 @@ static int phar_zip_changed_apply_int(phar_entry_info *entry, void *arg) /* {{{
 	offset = entry->header_offset + sizeof(local) + ZSTR_LEN(entry->filename) + (entry->is_dir ? 1 : 0) + sizeof(perms);
 
 	if (sizeof(local) != php_stream_write(p->filefp, (char *)&local, sizeof(local))) {
-		spprintf(p->error, 0, "unable to write local file header of file \"%s\" to zip-based phar \"%s\"", ZSTR_VAL(entry->filename), entry->phar->fname);
+		spprintf(p->error, 0, "unable to write local file header of file \"%s\" to zip-based phar \"%s\"", ZSTR_VAL(entry->filename), ZSTR_VAL(entry->phar->fname));
 		return ZEND_HASH_APPLY_STOP;
 	}
 
 	if (sizeof(central) != php_stream_write(p->centralfp, (char *)¢ral, sizeof(central))) {
-		spprintf(p->error, 0, "unable to write central directory entry for file \"%s\" while creating zip-based phar \"%s\"", ZSTR_VAL(entry->filename), entry->phar->fname);
+		spprintf(p->error, 0, "unable to write central directory entry for file \"%s\" while creating zip-based phar \"%s\"", ZSTR_VAL(entry->filename), ZSTR_VAL(entry->phar->fname));
 		return ZEND_HASH_APPLY_STOP;
 	}
 
 	if (entry->is_dir) {
 		if (ZSTR_LEN(entry->filename) != php_stream_write(p->filefp, ZSTR_VAL(entry->filename), ZSTR_LEN(entry->filename))) {
-			spprintf(p->error, 0, "unable to write filename to local directory entry for directory \"%s\" while creating zip-based phar \"%s\"", ZSTR_VAL(entry->filename), entry->phar->fname);
+			spprintf(p->error, 0, "unable to write filename to local directory entry for directory \"%s\" while creating zip-based phar \"%s\"", ZSTR_VAL(entry->filename), ZSTR_VAL(entry->phar->fname));
 			return ZEND_HASH_APPLY_STOP;
 		}
 
 		if (1 != php_stream_write(p->filefp, "/", 1)) {
-			spprintf(p->error, 0, "unable to write filename to local directory entry for directory \"%s\" while creating zip-based phar \"%s\"", ZSTR_VAL(entry->filename), entry->phar->fname);
+			spprintf(p->error, 0, "unable to write filename to local directory entry for directory \"%s\" while creating zip-based phar \"%s\"", ZSTR_VAL(entry->filename), ZSTR_VAL(entry->phar->fname));
 			return ZEND_HASH_APPLY_STOP;
 		}
 
 		if (ZSTR_LEN(entry->filename) != php_stream_write(p->centralfp, ZSTR_VAL(entry->filename), ZSTR_LEN(entry->filename))) {
-			spprintf(p->error, 0, "unable to write filename to central directory entry for directory \"%s\" while creating zip-based phar \"%s\"", ZSTR_VAL(entry->filename), entry->phar->fname);
+			spprintf(p->error, 0, "unable to write filename to central directory entry for directory \"%s\" while creating zip-based phar \"%s\"", ZSTR_VAL(entry->filename), ZSTR_VAL(entry->phar->fname));
 			return ZEND_HASH_APPLY_STOP;
 		}
 
 		if (1 != php_stream_write(p->centralfp, "/", 1)) {
-			spprintf(p->error, 0, "unable to write filename to central directory entry for directory \"%s\" while creating zip-based phar \"%s\"", ZSTR_VAL(entry->filename), entry->phar->fname);
+			spprintf(p->error, 0, "unable to write filename to central directory entry for directory \"%s\" while creating zip-based phar \"%s\"", ZSTR_VAL(entry->filename), ZSTR_VAL(entry->phar->fname));
 			return ZEND_HASH_APPLY_STOP;
 		}
 	} else {
 		if (ZSTR_LEN(entry->filename) != php_stream_write(p->filefp, ZSTR_VAL(entry->filename), ZSTR_LEN(entry->filename))) {
-			spprintf(p->error, 0, "unable to write filename to local directory entry for file \"%s\" while creating zip-based phar \"%s\"", ZSTR_VAL(entry->filename), entry->phar->fname);
+			spprintf(p->error, 0, "unable to write filename to local directory entry for file \"%s\" while creating zip-based phar \"%s\"", ZSTR_VAL(entry->filename), ZSTR_VAL(entry->phar->fname));
 			return ZEND_HASH_APPLY_STOP;
 		}
 
 		if (ZSTR_LEN(entry->filename) != php_stream_write(p->centralfp, ZSTR_VAL(entry->filename), ZSTR_LEN(entry->filename))) {
-			spprintf(p->error, 0, "unable to write filename to central directory entry for file \"%s\" while creating zip-based phar \"%s\"", ZSTR_VAL(entry->filename), entry->phar->fname);
+			spprintf(p->error, 0, "unable to write filename to central directory entry for file \"%s\" while creating zip-based phar \"%s\"", ZSTR_VAL(entry->filename), ZSTR_VAL(entry->phar->fname));
 			return ZEND_HASH_APPLY_STOP;
 		}
 	}
 
 	if (sizeof(perms) != php_stream_write(p->filefp, (char *)&perms, sizeof(perms))) {
-		spprintf(p->error, 0, "unable to write local extra permissions file header of file \"%s\" to zip-based phar \"%s\"", ZSTR_VAL(entry->filename), entry->phar->fname);
+		spprintf(p->error, 0, "unable to write local extra permissions file header of file \"%s\" to zip-based phar \"%s\"", ZSTR_VAL(entry->filename), ZSTR_VAL(entry->phar->fname));
 		return ZEND_HASH_APPLY_STOP;
 	}
 
 	if (sizeof(perms) != php_stream_write(p->centralfp, (char *)&perms, sizeof(perms))) {
-		spprintf(p->error, 0, "unable to write central extra permissions file header of file \"%s\" to zip-based phar \"%s\"", ZSTR_VAL(entry->filename), entry->phar->fname);
+		spprintf(p->error, 0, "unable to write central extra permissions file header of file \"%s\" to zip-based phar \"%s\"", ZSTR_VAL(entry->filename), ZSTR_VAL(entry->phar->fname));
 		return ZEND_HASH_APPLY_STOP;
 	}
 
 	if (!not_really_modified && entry->is_modified) {
 		if (entry->cfp) {
 			if (SUCCESS != php_stream_copy_to_stream_ex(entry->cfp, p->filefp, entry->compressed_filesize, NULL)) {
-				spprintf(p->error, 0, "unable to write compressed contents of file \"%s\" in zip-based phar \"%s\"", ZSTR_VAL(entry->filename), entry->phar->fname);
+				spprintf(p->error, 0, "unable to write compressed contents of file \"%s\" in zip-based phar \"%s\"", ZSTR_VAL(entry->filename), ZSTR_VAL(entry->phar->fname));
 				return ZEND_HASH_APPLY_STOP;
 			}
 
@@ -1093,7 +1125,7 @@ static int phar_zip_changed_apply_int(phar_entry_info *entry, void *arg) /* {{{
 			phar_seek_efp(entry, 0, SEEK_SET, 0, false);
 
 			if (SUCCESS != php_stream_copy_to_stream_ex(phar_get_efp(entry, false), p->filefp, entry->uncompressed_filesize, NULL)) {
-				spprintf(p->error, 0, "unable to write contents of file \"%s\" in zip-based phar \"%s\"", ZSTR_VAL(entry->filename), entry->phar->fname);
+				spprintf(p->error, 0, "unable to write contents of file \"%s\" in zip-based phar \"%s\"", ZSTR_VAL(entry->filename), ZSTR_VAL(entry->phar->fname));
 				return ZEND_HASH_APPLY_STOP;
 			}
 		}
@@ -1119,7 +1151,7 @@ static int phar_zip_changed_apply_int(phar_entry_info *entry, void *arg) /* {{{
 		}
 
 		if (!entry->is_dir && entry->compressed_filesize && SUCCESS != php_stream_copy_to_stream_ex(p->old, p->filefp, entry->compressed_filesize, NULL)) {
-			spprintf(p->error, 0, "unable to copy contents of file \"%s\" while creating zip-based phar \"%s\"", ZSTR_VAL(entry->filename), entry->phar->fname);
+			spprintf(p->error, 0, "unable to copy contents of file \"%s\" while creating zip-based phar \"%s\"", ZSTR_VAL(entry->filename), ZSTR_VAL(entry->phar->fname));
 			return ZEND_HASH_APPLY_STOP;
 		}
 	}
@@ -1130,7 +1162,7 @@ static int phar_zip_changed_apply_int(phar_entry_info *entry, void *arg) /* {{{
 
 	if (entry->metadata_tracker.str) {
 		if (ZSTR_LEN(entry->metadata_tracker.str) != php_stream_write(p->centralfp, ZSTR_VAL(entry->metadata_tracker.str), ZSTR_LEN(entry->metadata_tracker.str))) {
-			spprintf(p->error, 0, "unable to write metadata as file comment for file \"%s\" while creating zip-based phar \"%s\"", ZSTR_VAL(entry->filename), entry->phar->fname);
+			spprintf(p->error, 0, "unable to write metadata as file comment for file \"%s\" while creating zip-based phar \"%s\"", ZSTR_VAL(entry->filename), ZSTR_VAL(entry->phar->fname));
 			return ZEND_HASH_APPLY_STOP;
 		}
 	}
@@ -1149,8 +1181,7 @@ static zend_result phar_zip_applysignature(phar_archive_data *phar, struct _phar
 {
 	/* add signature for executable tars or tars explicitly set with setSignatureAlgorithm */
 	if (!phar->is_data || phar->sig_flags) {
-		size_t signature_length;
-		char *signature, sigbuf[8];
+		char sigbuf[8];
 		phar_entry_info entry = {0};
 		php_stream *newfile;
 		zend_off_t tell;
@@ -1172,11 +1203,10 @@ static zend_result phar_zip_applysignature(phar_archive_data *phar, struct _phar
 		}
 
 		char *signature_error = NULL;
-		if (FAILURE == phar_create_signature(phar, newfile, &signature, &signature_length, &signature_error)) {
-			if (signature_error) {
-				spprintf(pass->error, 0, "phar error: unable to write signature to zip-based phar: %s", signature_error);
-				efree(signature_error);
-			}
+		zend_string *signature = phar_create_signature(phar, newfile, &signature_error);
+		if (!signature) {
+			spprintf(pass->error, 0, "phar error: unable to write signature to zip-based phar: %s", signature_error);
+			efree(signature_error);
 
 			php_stream_close(newfile);
 			return FAILURE;
@@ -1186,19 +1216,19 @@ static zend_result phar_zip_applysignature(phar_archive_data *phar, struct _phar
 		entry.fp_type = PHAR_MOD;
 		entry.is_modified = 1;
 		if (entry.fp == NULL) {
-			efree(signature);
+			zend_string_release_ex(signature, false);
 			spprintf(pass->error, 0, "phar error: unable to create temporary file for signature");
 			php_stream_close(newfile);
 			return FAILURE;
 		}
 
 		PHAR_SET_32(sigbuf, phar->sig_flags);
-		PHAR_SET_32(sigbuf + 4, signature_length);
+		PHAR_SET_32(sigbuf + 4, ZSTR_LEN(signature));
 
-		if (Z_UL(8) != php_stream_write(entry.fp, sigbuf, 8) || signature_length != php_stream_write(entry.fp, signature, signature_length)) {
-			efree(signature);
+		if (Z_UL(8) != php_stream_write(entry.fp, sigbuf, 8) || ZSTR_LEN(signature) != php_stream_write(entry.fp, ZSTR_VAL(signature), ZSTR_LEN(signature))) {
+			zend_string_release_ex(signature, false);
 			if (pass->error) {
-				spprintf(pass->error, 0, "phar error: unable to write signature to zip-based phar %s", phar->fname);
+				spprintf(pass->error, 0, "phar error: unable to write signature to zip-based phar %s", ZSTR_VAL(phar->fname));
 			}
 
 			php_stream_close(newfile);
@@ -1207,13 +1237,13 @@ static zend_result phar_zip_applysignature(phar_archive_data *phar, struct _phar
 
 		ALLOCA_FLAG(use_heap);
 		ZSTR_ALLOCA_INIT(entry.filename, ".phar/signature.bin", sizeof(".phar/signature.bin")-1, use_heap);
-		efree(signature);
-		entry.uncompressed_filesize = entry.compressed_filesize = signature_length + 8;
+		entry.uncompressed_filesize = entry.compressed_filesize = ZSTR_LEN(signature) + 8;
 		entry.phar = phar;
 		/* throw out return value and write the signature */
 		phar_zip_changed_apply_int(&entry, (void *)pass);
 		ZSTR_ALLOCA_FREE(entry.filename, use_heap);
 		php_stream_close(newfile);
+		zend_string_release_ex(signature, false);
 
 		if (pass->error && *(pass->error)) {
 			/* error is set by writeheaders */
@@ -1243,7 +1273,7 @@ ZEND_ATTRIBUTE_NONNULL_ARGS(1, 4) int phar_zip_flush(phar_archive_data *phar, ze
 	entry.fp_type = PHAR_MOD;
 
 	if (phar->is_persistent) {
-		spprintf(error, 0, "internal error: attempt to flush cached zip-based phar \"%s\"", phar->fname);
+		spprintf(error, 0, "internal error: attempt to flush cached zip-based phar \"%s\"", ZSTR_VAL(phar->fname));
 		return EOF;
 	}
 
@@ -1260,7 +1290,7 @@ ZEND_ATTRIBUTE_NONNULL_ARGS(1, 4) int phar_zip_flush(phar_archive_data *phar, ze
 		}
 		if (phar->alias_len != php_stream_write(entry.fp, phar->alias, phar->alias_len)) {
 			php_stream_close(entry.fp);
-			spprintf(error, 0, "unable to set alias in zip-based phar \"%s\"", phar->fname);
+			spprintf(error, 0, "unable to set alias in zip-based phar \"%s\"", ZSTR_VAL(phar->fname));
 			return EOF;
 		}
 
@@ -1274,17 +1304,18 @@ ZEND_ATTRIBUTE_NONNULL_ARGS(1, 4) int phar_zip_flush(phar_archive_data *phar, ze
 
 	/* register alias */
 	if (phar->alias_len) {
-		if (FAILURE == phar_get_archive(&phar, phar->fname, phar->fname_len, phar->alias, phar->alias_len, error)) {
+		phar = phar_get_archive(ZSTR_VAL(phar->fname), ZSTR_LEN(phar->fname), phar->alias, phar->alias_len, error);
+		if (!phar) {
 			return EOF;
 		}
 	}
 
 	/* set stub */
 	if (user_stub && !is_default_stub) {
-		char *pos = php_stristr(ZSTR_VAL(user_stub), halt_stub, ZSTR_LEN(user_stub), strlen(halt_stub));
+		const char *pos = php_stristr(ZSTR_VAL(user_stub), halt_stub, ZSTR_LEN(user_stub), strlen(halt_stub));
 
 		if (pos == NULL) {
-			spprintf(error, 0, "illegal stub for zip-based phar \"%s\"", phar->fname);
+			spprintf(error, 0, "illegal stub for zip-based phar \"%s\"", ZSTR_VAL(phar->fname));
 			return EOF;
 		}
 
@@ -1303,7 +1334,7 @@ ZEND_ATTRIBUTE_NONNULL_ARGS(1, 4) int phar_zip_flush(phar_archive_data *phar, ze
 			len != php_stream_write(entry.fp, ZSTR_VAL(user_stub), len)
 			|| end_sequence_len != php_stream_write(entry.fp, end_sequence, end_sequence_len)
 		) {
-			spprintf(error, 0, "unable to create stub from string in new zip-based phar \"%s\"", phar->fname);
+			spprintf(error, 0, "unable to create stub from string in new zip-based phar \"%s\"", ZSTR_VAL(phar->fname));
 			php_stream_close(entry.fp);
 			return EOF;
 		}
@@ -1320,7 +1351,7 @@ ZEND_ATTRIBUTE_NONNULL_ARGS(1, 4) int phar_zip_flush(phar_archive_data *phar, ze
 		}
 		if (sizeof(newstub)-1 != php_stream_write(entry.fp, newstub, sizeof(newstub)-1)) {
 			php_stream_close(entry.fp);
-			spprintf(error, 0, "unable to %s stub in%szip-based phar \"%s\", failed", user_stub ? "overwrite" : "create", user_stub ? " " : " new ", phar->fname);
+			spprintf(error, 0, "unable to %s stub in%szip-based phar \"%s\", failed", user_stub ? "overwrite" : "create", user_stub ? " " : " new ", ZSTR_VAL(phar->fname));
 			return EOF;
 		}
 
@@ -1332,7 +1363,7 @@ ZEND_ATTRIBUTE_NONNULL_ARGS(1, 4) int phar_zip_flush(phar_archive_data *phar, ze
 				if (NULL == zend_hash_add_mem(&phar->manifest, entry.filename, &entry, sizeof(phar_entry_info))) {
 					php_stream_close(entry.fp);
 					zend_string_efree(entry.filename);
-					spprintf(error, 0, "unable to create stub in zip-based phar \"%s\"", phar->fname);
+					spprintf(error, 0, "unable to create stub in zip-based phar \"%s\"", ZSTR_VAL(phar->fname));
 					return EOF;
 				}
 			} else {
@@ -1349,7 +1380,7 @@ ZEND_ATTRIBUTE_NONNULL_ARGS(1, 4) int phar_zip_flush(phar_archive_data *phar, ze
 		must_close_old_file = false;
 		php_stream_rewind(oldfile);
 	} else {
-		oldfile = php_stream_open_wrapper(phar->fname, "rb", 0, NULL);
+		oldfile = php_stream_open_wrapper(ZSTR_VAL(phar->fname), "rb", 0, NULL);
 		must_close_old_file = oldfile != NULL;
 	}
 
@@ -1365,7 +1396,7 @@ ZEND_ATTRIBUTE_NONNULL_ARGS(1, 4) int phar_zip_flush(phar_archive_data *phar, ze
 		if (must_close_old_file) {
 			php_stream_close(oldfile);
 		}
-		spprintf(error, 4096, "phar zip flush of \"%s\" failed: unable to open temporary file", phar->fname);
+		spprintf(error, 4096, "phar zip flush of \"%s\" failed: unable to open temporary file", ZSTR_VAL(phar->fname));
 		return EOF;
 	}
 
@@ -1395,7 +1426,7 @@ ZEND_ATTRIBUTE_NONNULL_ARGS(1, 4) int phar_zip_flush(phar_archive_data *phar, ze
 	phar_metadata_tracker_try_ensure_has_serialized_data(&phar->metadata_tracker, phar->is_persistent);
 	if (pass_error
 	 || FAILURE == phar_zip_applysignature(phar, &pass)) {
-		spprintf(error, 4096, "phar zip flush of \"%s\" failed: %s", phar->fname, pass_error);
+		spprintf(error, 4096, "phar zip flush of \"%s\" failed: %s", ZSTR_VAL(phar->fname), pass_error);
 		efree(pass_error);
 nopasserror:
 		php_stream_close(pass.centralfp);
@@ -1418,7 +1449,7 @@ ZEND_ATTRIBUTE_NONNULL_ARGS(1, 4) int phar_zip_flush(phar_archive_data *phar, ze
 		size_t clen;
 		zend_result ret = php_stream_copy_to_stream_ex(pass.centralfp, pass.filefp, PHP_STREAM_COPY_ALL, &clen);
 		if (SUCCESS != ret || clen != cdir_size) {
-			spprintf(error, 4096, "phar zip flush of \"%s\" failed: unable to write central-directory", phar->fname);
+			spprintf(error, 4096, "phar zip flush of \"%s\" failed: unable to write central-directory", ZSTR_VAL(phar->fname));
 			goto nopasserror;
 		}
 	}
@@ -1431,17 +1462,17 @@ ZEND_ATTRIBUTE_NONNULL_ARGS(1, 4) int phar_zip_flush(phar_archive_data *phar, ze
 		PHAR_SET_16(eocd.comment_len, ZSTR_LEN(phar->metadata_tracker.str));
 
 		if (sizeof(eocd) != php_stream_write(pass.filefp, (char *)&eocd, sizeof(eocd))) {
-			spprintf(error, 4096, "phar zip flush of \"%s\" failed: unable to write end of central-directory", phar->fname);
+			spprintf(error, 4096, "phar zip flush of \"%s\" failed: unable to write end of central-directory", ZSTR_VAL(phar->fname));
 			goto nocentralerror;
 		}
 
 		if (ZSTR_LEN(phar->metadata_tracker.str) != php_stream_write(pass.filefp, ZSTR_VAL(phar->metadata_tracker.str), ZSTR_LEN(phar->metadata_tracker.str))) {
-			spprintf(error, 4096, "phar zip flush of \"%s\" failed: unable to write metadata to zip comment", phar->fname);
+			spprintf(error, 4096, "phar zip flush of \"%s\" failed: unable to write metadata to zip comment", ZSTR_VAL(phar->fname));
 			goto nocentralerror;
 		}
 	} else {
 		if (sizeof(eocd) != php_stream_write(pass.filefp, (char *)&eocd, sizeof(eocd))) {
-			spprintf(error, 4096, "phar zip flush of \"%s\" failed: unable to write end of central-directory", phar->fname);
+			spprintf(error, 4096, "phar zip flush of \"%s\" failed: unable to write end of central-directory", ZSTR_VAL(phar->fname));
 			goto nocentralerror;
 		}
 	}
@@ -1464,13 +1495,13 @@ ZEND_ATTRIBUTE_NONNULL_ARGS(1, 4) int phar_zip_flush(phar_archive_data *phar, ze
 		/* deferred flush */
 		phar->fp = pass.filefp;
 	} else {
-		phar->fp = php_stream_open_wrapper(phar->fname, "w+b", IGNORE_URL|STREAM_MUST_SEEK|REPORT_ERRORS, NULL);
+		phar->fp = php_stream_open_wrapper(ZSTR_VAL(phar->fname), "w+b", IGNORE_URL|STREAM_MUST_SEEK|REPORT_ERRORS, NULL);
 		if (!phar->fp) {
 			if (must_close_old_file) {
 				php_stream_close(oldfile);
 			}
 			phar->fp = pass.filefp;
-			spprintf(error, 4096, "unable to open new phar \"%s\" for writing", phar->fname);
+			spprintf(error, 4096, "unable to open new phar \"%s\" for writing", ZSTR_VAL(phar->fname));
 			return EOF;
 		}
 		php_stream_rewind(pass.filefp);
diff --git a/ext/posix/php_posix.h b/ext/posix/php_posix.h
index 79e6fe83ef9e..82208bb63088 100644
--- a/ext/posix/php_posix.h
+++ b/ext/posix/php_posix.h
@@ -1,14 +1,12 @@
 /*
    +----------------------------------------------------------------------+
-   | Copyright (c) The PHP Group                                          |
+   | Copyright © The PHP Group and Contributors.                          |
    +----------------------------------------------------------------------+
-   | This source file is subject to version 3.01 of the PHP license,      |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | https://www.php.net/license/3_01.txt                                 |
-   | If you did not receive a copy of the PHP license and are unable to   |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@php.net so we can mail you a copy immediately.               |
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Author: Kristian Koehntopp                        |
    +----------------------------------------------------------------------+
diff --git a/ext/posix/posix.c b/ext/posix/posix.c
index 76e14f6ecb0c..b44b73cc8dcf 100644
--- a/ext/posix/posix.c
+++ b/ext/posix/posix.c
@@ -1,14 +1,12 @@
 /*
    +----------------------------------------------------------------------+
-   | Copyright (c) The PHP Group                                          |
+   | Copyright © The PHP Group and Contributors.                          |
    +----------------------------------------------------------------------+
-   | This source file is subject to version 3.01 of the PHP license,      |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | https://www.php.net/license/3_01.txt                                 |
-   | If you did not receive a copy of the PHP license and are unable to   |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@php.net so we can mail you a copy immediately.               |
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Author: Kristian Koehntopp                        |
    +----------------------------------------------------------------------+
diff --git a/ext/random/csprng.c b/ext/random/csprng.c
index 73832d7d0685..4c474fb86796 100644
--- a/ext/random/csprng.c
+++ b/ext/random/csprng.c
@@ -1,14 +1,12 @@
 /*
    +----------------------------------------------------------------------+
-   | Copyright (c) The PHP Group                                          |
+   | Copyright © The PHP Group and Contributors.                          |
    +----------------------------------------------------------------------+
-   | This source file is subject to version 3.01 of the PHP license,      |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | https://www.php.net/license/3_01.txt                                 |
-   | If you did not receive a copy of the PHP license and are unable to   |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@php.net so we can mail you a copy immediately.               |
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Authors: Tim Düsterhus                             |
    |          Go Kudo                                  |
diff --git a/ext/random/engine_mt19937.c b/ext/random/engine_mt19937.c
index f2cb2fd7e9bc..a84fb9585c80 100644
--- a/ext/random/engine_mt19937.c
+++ b/ext/random/engine_mt19937.c
@@ -1,14 +1,12 @@
 /*
    +----------------------------------------------------------------------+
-   | Copyright (c) The PHP Group                                          |
+   | Copyright © The PHP Group and Contributors.                          |
    +----------------------------------------------------------------------+
-   | This source file is subject to version 3.01 of the PHP license,      |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | https://www.php.net/license/3_01.txt                                 |
-   | If you did not receive a copy of the PHP license and are unable to   |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@php.net so we can mail you a copy immediately.               |
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Authors: Rasmus Lerdorf                              |
    |          Zeev Suraski                                  |
@@ -391,11 +389,11 @@ PHP_METHOD(Random_Engine_Mt19937, __debugInfo)
 
 	if (engine->engine.algo->serialize) {
 		array_init(&t);
+		zend_hash_str_add(Z_ARR_P(return_value), "__states", strlen("__states"), &t);
 		if (!engine->engine.algo->serialize(engine->engine.state, Z_ARRVAL(t))) {
 			zend_throw_exception(NULL, "Engine serialize failed", 0);
 			RETURN_THROWS();
 		}
-		zend_hash_str_add(Z_ARR_P(return_value), "__states", strlen("__states"), &t);
 	}
 }
 /* }}} */
diff --git a/ext/random/engine_pcgoneseq128xslrr64.c b/ext/random/engine_pcgoneseq128xslrr64.c
index 9ff4f911920b..9472ce918fef 100644
--- a/ext/random/engine_pcgoneseq128xslrr64.c
+++ b/ext/random/engine_pcgoneseq128xslrr64.c
@@ -1,14 +1,12 @@
 /*
    +----------------------------------------------------------------------+
-   | Copyright (c) The PHP Group                                          |
+   | Copyright © The PHP Group and Contributors.                          |
    +----------------------------------------------------------------------+
-   | This source file is subject to version 3.01 of the PHP license,      |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | https://www.php.net/license/3_01.txt                                 |
-   | If you did not receive a copy of the PHP license and are unable to   |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@php.net so we can mail you a copy immediately.               |
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Author: Go Kudo                                   |
    |                                                                      |
diff --git a/ext/random/engine_secure.c b/ext/random/engine_secure.c
index 0a03a03bdf13..1fd0748e2b81 100644
--- a/ext/random/engine_secure.c
+++ b/ext/random/engine_secure.c
@@ -1,14 +1,12 @@
 /*
    +----------------------------------------------------------------------+
-   | Copyright (c) The PHP Group                                          |
+   | Copyright © The PHP Group and Contributors.                          |
    +----------------------------------------------------------------------+
-   | This source file is subject to version 3.01 of the PHP license,      |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | https://www.php.net/license/3_01.txt                                 |
-   | If you did not receive a copy of the PHP license and are unable to   |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@php.net so we can mail you a copy immediately.               |
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Authors: Sammy Kaye Powers                             |
    |          Go Kudo                                  |
diff --git a/ext/random/engine_user.c b/ext/random/engine_user.c
index 955ddebdb99a..f759613ea8cf 100644
--- a/ext/random/engine_user.c
+++ b/ext/random/engine_user.c
@@ -1,14 +1,12 @@
 /*
    +----------------------------------------------------------------------+
-   | Copyright (c) The PHP Group                                          |
+   | Copyright © The PHP Group and Contributors.                          |
    +----------------------------------------------------------------------+
-   | This source file is subject to version 3.01 of the PHP license,      |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | https://www.php.net/license/3_01.txt                                 |
-   | If you did not receive a copy of the PHP license and are unable to   |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@php.net so we can mail you a copy immediately.               |
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Author: Go Kudo                                   |
    +----------------------------------------------------------------------+
diff --git a/ext/random/engine_xoshiro256starstar.c b/ext/random/engine_xoshiro256starstar.c
index 1a054362f065..8dd0156dcb2d 100644
--- a/ext/random/engine_xoshiro256starstar.c
+++ b/ext/random/engine_xoshiro256starstar.c
@@ -1,14 +1,12 @@
 /*
    +----------------------------------------------------------------------+
-   | Copyright (c) The PHP Group                                          |
+   | Copyright © The PHP Group and Contributors.                          |
    +----------------------------------------------------------------------+
-   | This source file is subject to version 3.01 of the PHP license,      |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | https://www.php.net/license/3_01.txt                                 |
-   | If you did not receive a copy of the PHP license and are unable to   |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@php.net so we can mail you a copy immediately.               |
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Author: Go Kudo                                   |
    |                                                                      |
@@ -151,6 +149,10 @@ static bool unserialize(void *state, HashTable *data)
 		}
 	}
 
+	if (UNEXPECTED(s->state[0] == 0 && s->state[1] == 0 && s->state[2] == 0 && s->state[3] == 0)) {
+		return false;
+	}
+
 	return true;
 }
 
diff --git a/ext/random/gammasection.c b/ext/random/gammasection.c
index 732f8a2b0d9b..ef0352773a77 100644
--- a/ext/random/gammasection.c
+++ b/ext/random/gammasection.c
@@ -1,14 +1,12 @@
 /*
    +----------------------------------------------------------------------+
-   | Copyright (c) The PHP Group                                          |
+   | Copyright © The PHP Group and Contributors.                          |
    +----------------------------------------------------------------------+
-   | This source file is subject to version 3.01 of the PHP license,      |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | https://www.php.net/license/3_01.txt                                 |
-   | If you did not receive a copy of the PHP license and are unable to   |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@php.net so we can mail you a copy immediately.               |
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Authors: Tim Düsterhus                             |
    |                                                                      |
diff --git a/ext/random/php_random.h b/ext/random/php_random.h
index e4d6b4bdf3d9..f5db3403ec18 100644
--- a/ext/random/php_random.h
+++ b/ext/random/php_random.h
@@ -1,14 +1,12 @@
 /*
    +----------------------------------------------------------------------+
-   | Copyright (c) The PHP Group                                          |
+   | Copyright © The PHP Group and Contributors.                          |
    +----------------------------------------------------------------------+
-   | This source file is subject to version 3.01 of the PHP license,      |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | https://www.php.net/license/3_01.txt                                 |
-   | If you did not receive a copy of the PHP license and are unable to   |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@php.net so we can mail you a copy immediately.               |
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Authors: Rasmus Lerdorf                              |
    |          Zeev Suraski                                  |
@@ -38,16 +36,6 @@
 
 PHPAPI double php_combined_lcg(void);
 
-typedef struct _php_random_fallback_seed_state php_random_fallback_seed_state;
-
-PHPAPI uint64_t php_random_generate_fallback_seed(void);
-PHPAPI uint64_t php_random_generate_fallback_seed_ex(php_random_fallback_seed_state *state);
-
-static inline zend_long GENERATE_SEED(void)
-{
-	return (zend_long)php_random_generate_fallback_seed();
-}
-
 # define PHP_MT_RAND_MAX ((zend_long) (0x7FFFFFFF)) /* (1<<31) - 1 */
 
 enum php_random_mt19937_mode {
@@ -62,31 +50,31 @@ PHPAPI uint32_t php_mt_rand(void);
 PHPAPI zend_long php_mt_rand_range(zend_long min, zend_long max);
 PHPAPI zend_long php_mt_rand_common(zend_long min, zend_long max);
 
-typedef struct _php_random_status_state_mt19937 {
+typedef struct php_random_status_state_mt19937 {
 	uint32_t count;
 	enum php_random_mt19937_mode mode;
 	uint32_t state[624];
 } php_random_status_state_mt19937;
 
-typedef struct _php_random_status_state_pcgoneseq128xslrr64 {
+typedef struct php_random_status_state_pcgoneseq128xslrr64 {
 	php_random_uint128_t state;
 } php_random_status_state_pcgoneseq128xslrr64;
 
-typedef struct _php_random_status_state_xoshiro256starstar {
+typedef struct php_random_status_state_xoshiro256starstar {
 	uint64_t state[4];
 } php_random_status_state_xoshiro256starstar;
 
-typedef struct _php_random_status_state_user {
+typedef struct php_random_status_state_user {
 	zend_object *object;
 	zend_function *generate_method;
 } php_random_status_state_user;
 
-typedef struct _php_random_result {
+typedef struct php_random_result {
 	uint64_t result;
 	size_t size;
 } php_random_result;
 
-typedef struct _php_random_algo {
+typedef struct php_random_algo {
 	const size_t state_size;
 	php_random_result (*generate)(void *state);
 	zend_long (*range)(void *state, zend_long min, zend_long max);
@@ -94,12 +82,12 @@ typedef struct _php_random_algo {
 	bool (*unserialize)(void *state, HashTable *data);
 } php_random_algo;
 
-typedef struct _php_random_algo_with_state {
+typedef struct php_random_algo_with_state {
 	const php_random_algo *algo;
 	void *state;
 } php_random_algo_with_state;
 
-typedef struct _php_random_fallback_seed_state {
+typedef struct php_random_fallback_seed_state {
 	bool initialized;
 	unsigned char seed[20];
 } php_random_fallback_seed_state;
@@ -110,12 +98,12 @@ extern PHPAPI const php_random_algo php_random_algo_xoshiro256starstar;
 extern PHPAPI const php_random_algo php_random_algo_secure;
 extern PHPAPI const php_random_algo php_random_algo_user;
 
-typedef struct _php_random_engine {
+typedef struct php_random_engine {
 	php_random_algo_with_state engine;
 	zend_object std;
 } php_random_engine;
 
-typedef struct _php_random_randomizer {
+typedef struct php_random_randomizer {
 	php_random_algo_with_state engine;
 	bool is_userland_algo;
 	zend_object std;
@@ -137,18 +125,21 @@ extern PHPAPI zend_class_entry *random_ce_Random_Randomizer;
 
 extern PHPAPI zend_class_entry *random_ce_Random_IntervalBoundary;
 
-static inline php_random_engine *php_random_engine_from_obj(zend_object *object) {
-	return (php_random_engine *)((char *)(object) - XtOffsetOf(php_random_engine, std));
-}
-
-static inline php_random_randomizer *php_random_randomizer_from_obj(zend_object *object) {
-	return (php_random_randomizer *)((char *)(object) - XtOffsetOf(php_random_randomizer, std));
-}
+#define php_random_engine_from_obj(object) ZEND_CONTAINER_OF(object, php_random_engine, std)
+#define php_random_randomizer_from_obj(object) ZEND_CONTAINER_OF(object, php_random_randomizer, std)
 
 # define Z_RANDOM_ENGINE_P(zval) php_random_engine_from_obj(Z_OBJ_P(zval))
 
 # define Z_RANDOM_RANDOMIZER_P(zval) php_random_randomizer_from_obj(Z_OBJ_P(zval));
 
+PHPAPI uint64_t php_random_generate_fallback_seed(void);
+PHPAPI uint64_t php_random_generate_fallback_seed_ex(php_random_fallback_seed_state *state);
+
+static inline zend_long GENERATE_SEED(void)
+{
+	return (zend_long)php_random_generate_fallback_seed();
+}
+
 PHPAPI void *php_random_status_alloc(const php_random_algo *algo, const bool persistent);
 PHPAPI void *php_random_status_copy(const php_random_algo *algo, void *old_status, void *new_status);
 PHPAPI void php_random_status_free(void *status, const bool persistent);
diff --git a/ext/random/php_random_csprng.h b/ext/random/php_random_csprng.h
index 7fb0d7357f61..6028bbf62522 100644
--- a/ext/random/php_random_csprng.h
+++ b/ext/random/php_random_csprng.h
@@ -1,14 +1,12 @@
 /*
    +----------------------------------------------------------------------+
-   | Copyright (c) The PHP Group                                          |
+   | Copyright © The PHP Group and Contributors.                          |
    +----------------------------------------------------------------------+
-   | This source file is subject to version 3.01 of the PHP license,      |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | https://www.php.net/license/3_01.txt                                 |
-   | If you did not receive a copy of the PHP license and are unable to   |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@php.net so we can mail you a copy immediately.               |
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Authors: Tim Düsterhus                             |
    |          Go Kudo                                  |
diff --git a/ext/random/php_random_uint128.h b/ext/random/php_random_uint128.h
index 8c484ce5ba9f..25d2677da436 100644
--- a/ext/random/php_random_uint128.h
+++ b/ext/random/php_random_uint128.h
@@ -1,14 +1,12 @@
 /*
    +----------------------------------------------------------------------+
-   | Copyright (c) The PHP Group                                          |
+   | Copyright © The PHP Group and Contributors.                          |
    +----------------------------------------------------------------------+
-   | This source file is subject to version 3.01 of the PHP license,      |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | https://www.php.net/license/3_01.txt                                 |
-   | If you did not receive a copy of the PHP license and are unable to   |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@php.net so we can mail you a copy immediately.               |
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Authors: Tim Düsterhus                             |
    |          Go Kudo                                  |
@@ -23,7 +21,7 @@
 # include 
 
 # if !defined(__SIZEOF_INT128__) || defined(PHP_RANDOM_FORCE_EMULATE_128)
-typedef struct _php_random_uint128_t {
+typedef struct php_random_uint128_t {
 	uint64_t hi;
 	uint64_t lo;
 } php_random_uint128_t;
diff --git a/ext/random/php_random_zend_utils.h b/ext/random/php_random_zend_utils.h
index db37805904cb..56718e5c214b 100644
--- a/ext/random/php_random_zend_utils.h
+++ b/ext/random/php_random_zend_utils.h
@@ -1,14 +1,12 @@
 /*
    +----------------------------------------------------------------------+
-   | Copyright (c) The PHP Group                                          |
+   | Copyright © The PHP Group and Contributors.                          |
    +----------------------------------------------------------------------+
-   | This source file is subject to version 3.01 of the PHP license,      |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | https://www.php.net/license/3_01.txt                                 |
-   | If you did not receive a copy of the PHP license and are unable to   |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@php.net so we can mail you a copy immediately.               |
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Authors: Arnaud Le Blanc                        |
    |          Tim Düsterhus                             |
@@ -22,7 +20,7 @@
 # include "php_random.h"
 # include "zend.h"
 
-typedef struct _php_random_bytes_insecure_state_for_zend {
+typedef struct php_random_bytes_insecure_state_for_zend {
 	bool initialized;
 	php_random_status_state_xoshiro256starstar xoshiro256starstar_state;
 } php_random_bytes_insecure_state_for_zend;
diff --git a/ext/random/random.c b/ext/random/random.c
index f9feaadcbb15..bd6f9f8a9018 100644
--- a/ext/random/random.c
+++ b/ext/random/random.c
@@ -1,14 +1,12 @@
 /*
    +----------------------------------------------------------------------+
-   | Copyright (c) The PHP Group                                          |
+   | Copyright © The PHP Group and Contributors.                          |
    +----------------------------------------------------------------------+
-   | This source file is subject to version 3.01 of the PHP license,      |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | https://www.php.net/license/3_01.txt                                 |
-   | If you did not receive a copy of the PHP license and are unable to   |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@php.net so we can mail you a copy immediately.               |
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Authors: Sammy Kaye Powers                             |
    |          Go Kudo                                  |
@@ -275,7 +273,7 @@ PHPAPI void php_random_engine_common_free_object(zend_object *object)
 
 PHPAPI zend_object *php_random_engine_common_clone_object(zend_object *object)
 {
-	php_random_engine *old_engine = php_random_engine_from_obj(object);
+	const php_random_engine *old_engine = php_random_engine_from_obj(object);
 	php_random_engine *new_engine = php_random_engine_from_obj(old_engine->std.ce->create_object(old_engine->std.ce));
 
 	new_engine->engine.algo = old_engine->engine.algo;
@@ -747,7 +745,7 @@ PHP_MINIT_FUNCTION(random)
 	random_ce_Random_Engine_Mt19937->create_object = php_random_engine_mt19937_new;
 	random_ce_Random_Engine_Mt19937->default_object_handlers = &random_engine_mt19937_object_handlers;
 	memcpy(&random_engine_mt19937_object_handlers, zend_get_std_object_handlers(), sizeof(zend_object_handlers));
-	random_engine_mt19937_object_handlers.offset = XtOffsetOf(php_random_engine, std);
+	random_engine_mt19937_object_handlers.offset = offsetof(php_random_engine, std);
 	random_engine_mt19937_object_handlers.free_obj = php_random_engine_common_free_object;
 	random_engine_mt19937_object_handlers.clone_obj = php_random_engine_common_clone_object;
 
@@ -756,7 +754,7 @@ PHP_MINIT_FUNCTION(random)
 	random_ce_Random_Engine_PcgOneseq128XslRr64->create_object = php_random_engine_pcgoneseq128xslrr64_new;
 	random_ce_Random_Engine_PcgOneseq128XslRr64->default_object_handlers = &random_engine_pcgoneseq128xslrr64_object_handlers;
 	memcpy(&random_engine_pcgoneseq128xslrr64_object_handlers, zend_get_std_object_handlers(), sizeof(zend_object_handlers));
-	random_engine_pcgoneseq128xslrr64_object_handlers.offset = XtOffsetOf(php_random_engine, std);
+	random_engine_pcgoneseq128xslrr64_object_handlers.offset = offsetof(php_random_engine, std);
 	random_engine_pcgoneseq128xslrr64_object_handlers.free_obj = php_random_engine_common_free_object;
 	random_engine_pcgoneseq128xslrr64_object_handlers.clone_obj = php_random_engine_common_clone_object;
 
@@ -765,7 +763,7 @@ PHP_MINIT_FUNCTION(random)
 	random_ce_Random_Engine_Xoshiro256StarStar->create_object = php_random_engine_xoshiro256starstar_new;
 	random_ce_Random_Engine_Xoshiro256StarStar->default_object_handlers = &random_engine_xoshiro256starstar_object_handlers;
 	memcpy(&random_engine_xoshiro256starstar_object_handlers, zend_get_std_object_handlers(), sizeof(zend_object_handlers));
-	random_engine_xoshiro256starstar_object_handlers.offset = XtOffsetOf(php_random_engine, std);
+	random_engine_xoshiro256starstar_object_handlers.offset = offsetof(php_random_engine, std);
 	random_engine_xoshiro256starstar_object_handlers.free_obj = php_random_engine_common_free_object;
 	random_engine_xoshiro256starstar_object_handlers.clone_obj = php_random_engine_common_clone_object;
 
@@ -774,7 +772,7 @@ PHP_MINIT_FUNCTION(random)
 	random_ce_Random_Engine_Secure->create_object = php_random_engine_secure_new;
 	random_ce_Random_Engine_Secure->default_object_handlers = &random_engine_secure_object_handlers;
 	memcpy(&random_engine_secure_object_handlers, zend_get_std_object_handlers(), sizeof(zend_object_handlers));
-	random_engine_secure_object_handlers.offset = XtOffsetOf(php_random_engine, std);
+	random_engine_secure_object_handlers.offset = offsetof(php_random_engine, std);
 	random_engine_secure_object_handlers.free_obj = php_random_engine_common_free_object;
 	random_engine_secure_object_handlers.clone_obj = NULL;
 
@@ -783,7 +781,7 @@ PHP_MINIT_FUNCTION(random)
 	random_ce_Random_Randomizer->create_object = php_random_randomizer_new;
 	random_ce_Random_Randomizer->default_object_handlers = &random_randomizer_object_handlers;
 	memcpy(&random_randomizer_object_handlers, zend_get_std_object_handlers(), sizeof(zend_object_handlers));
-	random_randomizer_object_handlers.offset = XtOffsetOf(php_random_randomizer, std);
+	random_randomizer_object_handlers.offset = offsetof(php_random_randomizer, std);
 	random_randomizer_object_handlers.free_obj = randomizer_free_obj;
 	random_randomizer_object_handlers.clone_obj = NULL;
 
diff --git a/ext/random/randomizer.c b/ext/random/randomizer.c
index a576cd12955a..0738380ca253 100644
--- a/ext/random/randomizer.c
+++ b/ext/random/randomizer.c
@@ -1,14 +1,12 @@
 /*
    +----------------------------------------------------------------------+
-   | Copyright (c) The PHP Group                                          |
+   | Copyright © The PHP Group and Contributors.                          |
    +----------------------------------------------------------------------+
-   | This source file is subject to version 3.01 of the PHP license,      |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | https://www.php.net/license/3_01.txt                                 |
-   | If you did not receive a copy of the PHP license and are unable to   |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@php.net so we can mail you a copy immediately.               |
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Author: Go Kudo                                   |
    +----------------------------------------------------------------------+
diff --git a/ext/random/tests/02_engine/xoshiro256starstar_unserialize_zero_state.phpt b/ext/random/tests/02_engine/xoshiro256starstar_unserialize_zero_state.phpt
new file mode 100644
index 000000000000..6ebcd03e8570
--- /dev/null
+++ b/ext/random/tests/02_engine/xoshiro256starstar_unserialize_zero_state.phpt
@@ -0,0 +1,14 @@
+--TEST--
+GH-21731: Xoshiro256StarStar::__unserialize() must reject the all-zero state
+--FILE--
+getMessage(), PHP_EOL;
+}
+
+?>
+--EXPECT--
+Invalid serialization data for Random\Engine\Xoshiro256StarStar object
diff --git a/ext/random/zend_utils.c b/ext/random/zend_utils.c
index 64ba2c87ef70..19067f343afb 100644
--- a/ext/random/zend_utils.c
+++ b/ext/random/zend_utils.c
@@ -1,14 +1,12 @@
 /*
    +----------------------------------------------------------------------+
-   | Copyright (c) The PHP Group                                          |
+   | Copyright © The PHP Group and Contributors.                          |
    +----------------------------------------------------------------------+
-   | This source file is subject to version 3.01 of the PHP license,      |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | https://www.php.net/license/3_01.txt                                 |
-   | If you did not receive a copy of the PHP license and are unable to   |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@php.net so we can mail you a copy immediately.               |
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Authors: Arnaud Le Blanc                        |
    |          Tim Düsterhus                             |
diff --git a/ext/readline/php_readline.h b/ext/readline/php_readline.h
index f67238db663a..c1a337713069 100644
--- a/ext/readline/php_readline.h
+++ b/ext/readline/php_readline.h
@@ -1,14 +1,12 @@
 /*
    +----------------------------------------------------------------------+
-   | Copyright (c) The PHP Group                                          |
+   | Copyright © The PHP Group and Contributors.                          |
    +----------------------------------------------------------------------+
-   | This source file is subject to version 3.01 of the PHP license,      |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | https://www.php.net/license/3_01.txt                                 |
-   | If you did not receive a copy of the PHP license and are unable to   |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@php.net so we can mail you a copy immediately.               |
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Author: Thies C. Arntzen                           |
    +----------------------------------------------------------------------+
diff --git a/ext/readline/readline.c b/ext/readline/readline.c
index b9671ac1caa0..cbc0ebdd8713 100644
--- a/ext/readline/readline.c
+++ b/ext/readline/readline.c
@@ -1,14 +1,12 @@
 /*
    +----------------------------------------------------------------------+
-   | Copyright (c) The PHP Group                                          |
+   | Copyright © The PHP Group and Contributors.                          |
    +----------------------------------------------------------------------+
-   | This source file is subject to version 3.01 of the PHP license,      |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | https://www.php.net/license/3_01.txt                                 |
-   | If you did not receive a copy of the PHP license and are unable to   |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@php.net so we can mail you a copy immediately.               |
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Author: Thies C. Arntzen                           |
    +----------------------------------------------------------------------+
diff --git a/ext/readline/readline_cli.c b/ext/readline/readline_cli.c
index 312129991c70..3b2a08a15843 100644
--- a/ext/readline/readline_cli.c
+++ b/ext/readline/readline_cli.c
@@ -1,14 +1,12 @@
 /*
    +----------------------------------------------------------------------+
-   | Copyright (c) The PHP Group                                          |
+   | Copyright © The PHP Group and Contributors.                          |
    +----------------------------------------------------------------------+
-   | This source file is subject to version 3.01 of the PHP license,      |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | https://www.php.net/license/3_01.txt                                 |
-   | If you did not receive a copy of the PHP license and are unable to   |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@php.net so we can mail you a copy immediately.               |
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Author: Marcus Boerger                                |
    |         Johannes Schlueter                         |
@@ -529,7 +527,8 @@ static char *cli_completion_generator(const char *text, int index) /* {{{ */
 	} else if (text[0] == '#' && text[1] != '[') {
 		retval = cli_completion_generator_ini(text, textlen, &cli_completion_state);
 	} else {
-		char *lc_text, *class_name_end;
+		char *lc_text;
+		const char *class_name_end;
 		zend_string *class_name = NULL;
 		zend_class_entry *ce = NULL;
 
@@ -661,6 +660,7 @@ static int readline_shell_run(void) /* {{{ */
 				zend_string_release_ex(prompt, 0);
 				/* TODO: This might be wrong! */
 				prompt = cli_get_prompt("php", '>');
+				free(line);
 				continue;
 			}
 		}
diff --git a/ext/readline/readline_cli.h b/ext/readline/readline_cli.h
index 6db09ce991ce..31c21d8eedc1 100644
--- a/ext/readline/readline_cli.h
+++ b/ext/readline/readline_cli.h
@@ -1,14 +1,12 @@
 /*
    +----------------------------------------------------------------------+
-   | Copyright (c) The PHP Group                                          |
+   | Copyright © The PHP Group and Contributors.                          |
    +----------------------------------------------------------------------+
-   | This source file is subject to version 3.01 of the PHP license,      |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | https://www.php.net/license/3_01.txt                                 |
-   | If you did not receive a copy of the PHP license and are unable to   |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@php.net so we can mail you a copy immediately.               |
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Author: Marcus Boerger                                |
    |         Johannes Schlueter                         |
diff --git a/ext/readline/tests/readline_cli_ini_directive.phpt b/ext/readline/tests/readline_cli_ini_directive.phpt
new file mode 100644
index 000000000000..ebf4ac10a281
--- /dev/null
+++ b/ext/readline/tests/readline_cli_ini_directive.phpt
@@ -0,0 +1,21 @@
+--TEST--
+Interactive shell: setting an INI directive via #name=value
+--EXTENSIONS--
+readline
+--SKIPIF--
+
+--FILE--
+
+--EXPECTF--
+%AINI[5]%A
diff --git a/ext/reflection/php_reflection.c b/ext/reflection/php_reflection.c
index ee49d2d90f50..a208741b1590 100644
--- a/ext/reflection/php_reflection.c
+++ b/ext/reflection/php_reflection.c
@@ -1,14 +1,12 @@
 /*
    +----------------------------------------------------------------------+
-   | Copyright (c) The PHP Group                                          |
+   | Copyright © The PHP Group and Contributors.                          |
    +----------------------------------------------------------------------+
-   | This source file is subject to version 3.01 of the PHP license,      |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | https://www.php.net/license/3_01.txt                                 |
-   | If you did not receive a copy of the PHP license and are unable to   |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@php.net so we can mail you a copy immediately.               |
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Authors: Timm Friebe                               |
    |          George Schlossnagle                      |
@@ -176,9 +174,7 @@ typedef struct {
 	zend_object zo;
 } reflection_object;
 
-static inline reflection_object *reflection_object_from_obj(zend_object *obj) {
-	return (reflection_object*)((char*)(obj) - XtOffsetOf(reflection_object, zo));
-}
+#define reflection_object_from_obj(obj) ZEND_CONTAINER_OF(obj, reflection_object, zo)
 
 #define Z_REFLECTION_P(zv)  reflection_object_from_obj(Z_OBJ_P((zv)))
 /* }}} */
@@ -612,7 +608,7 @@ static void _const_string(smart_str *str, const char *name, zval *value, const c
 	if (Z_TYPE_P(value) == IS_ARRAY) {
 		smart_str_append(str, ZSTR_KNOWN(ZEND_STR_ARRAY_CAPITALIZED));
 	} else if (Z_TYPE_P(value) == IS_STRING) {
-		smart_str_appends(str, Z_STRVAL_P(value));
+		smart_str_append(str, Z_STR_P(value));
 	} else {
 		zend_string *tmp_value_str;
 		zend_string *value_str = zval_get_tmp_string(value, &tmp_value_str);
@@ -1516,7 +1512,7 @@ static void reflection_type_factory(zend_type type, zval *object, bool legacy_be
 		case NAMED_TYPE:
 			object_init_ex(object, reflection_named_type_ptr);
 			break;
-		EMPTY_SWITCH_DEFAULT_CASE();
+		default: ZEND_UNREACHABLE();
 	}
 
 	intern = Z_REFLECTION_P(object);
@@ -2481,9 +2477,20 @@ ZEND_METHOD(ReflectionParameter, __construct)
 	switch (Z_TYPE_P(reference)) {
 		case IS_STRING:
 			{
-				zend_string *lcname = zend_string_tolower(Z_STR_P(reference));
-				fptr = zend_hash_find_ptr(EG(function_table), lcname);
-				zend_string_release(lcname);
+				zend_string *fname = Z_STR_P(reference);
+				zend_string *lcname;
+				if (UNEXPECTED(ZSTR_VAL(fname)[0] == '\\')) {
+					/* Ignore leading "\" */
+					ALLOCA_FLAG(use_heap)
+					ZSTR_ALLOCA_ALLOC(lcname, ZSTR_LEN(fname) - 1, use_heap);
+					zend_str_tolower_copy(ZSTR_VAL(lcname), ZSTR_VAL(fname) + 1, ZSTR_LEN(fname) - 1);
+					fptr = zend_fetch_function(lcname);
+					ZSTR_ALLOCA_FREE(lcname, use_heap);
+				} else {
+					lcname = zend_string_tolower(fname);
+					fptr = zend_fetch_function(lcname);
+					zend_string_release(lcname);
+				}
 				if (!fptr) {
 					zend_throw_exception_ex(reflection_exception_ptr, 0,
 						"Function %s() does not exist", Z_STRVAL_P(reference));
@@ -2649,6 +2656,22 @@ ZEND_METHOD(ReflectionParameter, __toString)
 
 /* }}} */
 
+/* {{{ Returns the doc comment for this parameter */
+ZEND_METHOD(ReflectionParameter, getDocComment)
+{
+	reflection_object *intern;
+	parameter_reference *param;
+
+	ZEND_PARSE_PARAMETERS_NONE();
+
+	GET_REFLECTION_OBJECT_PTR(param);
+	if (param->arg_info->doc_comment) {
+		RETURN_STR_COPY(param->arg_info->doc_comment);
+	}
+	RETURN_FALSE;
+}
+/* }}} */
+
 /* {{{ Returns this parameter's name */
 ZEND_METHOD(ReflectionParameter, getName)
 {
@@ -4623,9 +4646,7 @@ ZEND_METHOD(ReflectionClass, getProperty)
 	str_name = ZSTR_VAL(name);
 	if ((tmp = strstr(ZSTR_VAL(name), "::")) != NULL) {
 		classname_len = tmp - ZSTR_VAL(name);
-		classname = zend_string_alloc(classname_len, 0);
-		zend_str_tolower_copy(ZSTR_VAL(classname), ZSTR_VAL(name), classname_len);
-		ZSTR_VAL(classname)[classname_len] = '\0';
+		classname = zend_string_init(ZSTR_VAL(name), classname_len, 0);
 		str_name_len = ZSTR_LEN(name) - (classname_len + 2);
 		str_name = tmp + 2;
 
@@ -4820,7 +4841,7 @@ ZEND_METHOD(ReflectionClass, getConstant)
 {
 	reflection_object *intern;
 	zend_class_entry *ce;
-	HashTable *constants_table;
+	const HashTable *constants_table;
 	zend_class_constant *c;
 	zend_string *name, *key;
 
@@ -6653,7 +6674,7 @@ static zend_always_inline uint32_t set_visibility_to_visibility(uint32_t set_vis
 			return ZEND_ACC_PROTECTED;
 		case ZEND_ACC_PRIVATE_SET:
 			return ZEND_ACC_PRIVATE;
-		EMPTY_SWITCH_DEFAULT_CASE();
+		default: ZEND_UNREACHABLE();
 	}
 }
 
@@ -6717,6 +6738,11 @@ ZEND_METHOD(ReflectionProperty, isReadable)
 					zval member;
 					ZVAL_STR(&member, ref->unmangled_name);
 					zend_call_known_instance_method_with_1_params(ce->__isset, obj, return_value, &member);
+
+					if (Z_TYPE_P(return_value) == IS_REFERENCE) {
+						zend_unwrap_reference(return_value);
+					}
+
 					*guard &= ~ZEND_GUARD_PROPERTY_ISSET;
 					OBJ_RELEASE(obj);
 					return;
@@ -8145,7 +8171,7 @@ ZEND_METHOD(ReflectionConstant, __toString)
 PHP_MINIT_FUNCTION(reflection) /* {{{ */
 {
 	memcpy(&reflection_object_handlers, &std_object_handlers, sizeof(zend_object_handlers));
-	reflection_object_handlers.offset = XtOffsetOf(reflection_object, zo);
+	reflection_object_handlers.offset = offsetof(reflection_object, zo);
 	reflection_object_handlers.free_obj = reflection_free_objects_storage;
 	reflection_object_handlers.clone_obj = NULL;
 	reflection_object_handlers.write_property = _reflection_write_property;
diff --git a/ext/reflection/php_reflection.h b/ext/reflection/php_reflection.h
index dc2240734298..ba03f1d9ac2d 100644
--- a/ext/reflection/php_reflection.h
+++ b/ext/reflection/php_reflection.h
@@ -1,14 +1,12 @@
 /*
    +----------------------------------------------------------------------+
-   | Copyright (c) The PHP Group                                          |
+   | Copyright © The PHP Group and Contributors.                          |
    +----------------------------------------------------------------------+
-   | This source file is subject to version 3.01 of the PHP license,      |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | https://www.php.net/license/3_01.txt                                 |
-   | If you did not receive a copy of the PHP license and are unable to   |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@php.net so we can mail you a copy immediately.               |
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Authors: George Schlossnagle                      |
    +----------------------------------------------------------------------+
diff --git a/ext/reflection/php_reflection.stub.php b/ext/reflection/php_reflection.stub.php
index b0273a3174f8..dd605100f8ba 100644
--- a/ext/reflection/php_reflection.stub.php
+++ b/ext/reflection/php_reflection.stub.php
@@ -652,6 +652,8 @@ public function __construct($function, int|string $param) {}
 
     public function __toString(): string {}
 
+    public function getDocComment(): string|false {}
+
     /** @tentative-return-type */
     public function getName(): string {}
 
diff --git a/ext/reflection/php_reflection_arginfo.h b/ext/reflection/php_reflection_arginfo.h
index 66605a22bbd6..65571f38d43c 100644
--- a/ext/reflection/php_reflection_arginfo.h
+++ b/ext/reflection/php_reflection_arginfo.h
@@ -1,5 +1,5 @@
 /* This is a generated file, edit php_reflection.stub.php instead.
- * Stub hash: 267472e2b726ca5e788eb5cc3e946bc9aa7c9c41
+ * Stub hash: c80946cc8c8215bb6527e09bb71b3a97a76a6a98
  * Has decl header: yes */
 
 ZEND_BEGIN_ARG_WITH_TENTATIVE_RETURN_TYPE_INFO_EX(arginfo_class_Reflection_getModifierNames, 0, 1, IS_ARRAY, 0)
@@ -526,6 +526,9 @@ ZEND_END_ARG_INFO()
 
 #define arginfo_class_ReflectionParameter___toString arginfo_class_ReflectionFunction___toString
 
+ZEND_BEGIN_ARG_WITH_RETURN_TYPE_MASK_EX(arginfo_class_ReflectionParameter_getDocComment, 0, 0, MAY_BE_STRING|MAY_BE_FALSE)
+ZEND_END_ARG_INFO()
+
 #define arginfo_class_ReflectionParameter_getName arginfo_class_ReflectionFunctionAbstract_getName
 
 #define arginfo_class_ReflectionParameter_isPassedByReference arginfo_class_ReflectionFunctionAbstract_inNamespace
@@ -721,13 +724,12 @@ ZEND_END_ARG_INFO()
 
 #define arginfo_class_ReflectionConstant_isDeprecated arginfo_class_ReflectionFunctionAbstract_hasTentativeReturnType
 
-ZEND_BEGIN_ARG_WITH_RETURN_TYPE_MASK_EX(arginfo_class_ReflectionConstant_getFileName, 0, 0, MAY_BE_STRING|MAY_BE_FALSE)
-ZEND_END_ARG_INFO()
+#define arginfo_class_ReflectionConstant_getFileName arginfo_class_ReflectionParameter_getDocComment
 
 ZEND_BEGIN_ARG_WITH_RETURN_OBJ_INFO_EX(arginfo_class_ReflectionConstant_getExtension, 0, 0, ReflectionExtension, 1)
 ZEND_END_ARG_INFO()
 
-#define arginfo_class_ReflectionConstant_getExtensionName arginfo_class_ReflectionConstant_getFileName
+#define arginfo_class_ReflectionConstant_getExtensionName arginfo_class_ReflectionParameter_getDocComment
 
 #define arginfo_class_ReflectionConstant___toString arginfo_class_ReflectionFunction___toString
 
@@ -921,6 +923,7 @@ ZEND_METHOD(ReflectionClassConstant, hasType);
 ZEND_METHOD(ReflectionClassConstant, getType);
 ZEND_METHOD(ReflectionParameter, __construct);
 ZEND_METHOD(ReflectionParameter, __toString);
+ZEND_METHOD(ReflectionParameter, getDocComment);
 ZEND_METHOD(ReflectionParameter, getName);
 ZEND_METHOD(ReflectionParameter, isPassedByReference);
 ZEND_METHOD(ReflectionParameter, canBePassedByValue);
@@ -1237,6 +1240,7 @@ static const zend_function_entry class_ReflectionParameter_methods[] = {
 	ZEND_RAW_FENTRY("__clone", zim_ReflectionClass___clone, arginfo_class_ReflectionParameter___clone, ZEND_ACC_PRIVATE, NULL, NULL)
 	ZEND_ME(ReflectionParameter, __construct, arginfo_class_ReflectionParameter___construct, ZEND_ACC_PUBLIC)
 	ZEND_ME(ReflectionParameter, __toString, arginfo_class_ReflectionParameter___toString, ZEND_ACC_PUBLIC)
+	ZEND_ME(ReflectionParameter, getDocComment, arginfo_class_ReflectionParameter_getDocComment, ZEND_ACC_PUBLIC)
 	ZEND_ME(ReflectionParameter, getName, arginfo_class_ReflectionParameter_getName, ZEND_ACC_PUBLIC)
 	ZEND_ME(ReflectionParameter, isPassedByReference, arginfo_class_ReflectionParameter_isPassedByReference, ZEND_ACC_PUBLIC)
 	ZEND_ME(ReflectionParameter, canBePassedByValue, arginfo_class_ReflectionParameter_canBePassedByValue, ZEND_ACC_PUBLIC)
diff --git a/ext/reflection/php_reflection_decl.h b/ext/reflection/php_reflection_decl.h
index a5e8affd0beb..a87e1635419b 100644
--- a/ext/reflection/php_reflection_decl.h
+++ b/ext/reflection/php_reflection_decl.h
@@ -1,12 +1,12 @@
 /* This is a generated file, edit php_reflection.stub.php instead.
- * Stub hash: 267472e2b726ca5e788eb5cc3e946bc9aa7c9c41 */
+ * Stub hash: c80946cc8c8215bb6527e09bb71b3a97a76a6a98 */
 
-#ifndef ZEND_PHP_REFLECTION_DECL_267472e2b726ca5e788eb5cc3e946bc9aa7c9c41_H
-#define ZEND_PHP_REFLECTION_DECL_267472e2b726ca5e788eb5cc3e946bc9aa7c9c41_H
+#ifndef ZEND_PHP_REFLECTION_DECL_c80946cc8c8215bb6527e09bb71b3a97a76a6a98_H
+#define ZEND_PHP_REFLECTION_DECL_c80946cc8c8215bb6527e09bb71b3a97a76a6a98_H
 
 typedef enum zend_enum_PropertyHookType {
 	ZEND_ENUM_PropertyHookType_Get = 1,
 	ZEND_ENUM_PropertyHookType_Set = 2,
 } zend_enum_PropertyHookType;
 
-#endif /* ZEND_PHP_REFLECTION_DECL_267472e2b726ca5e788eb5cc3e946bc9aa7c9c41_H */
+#endif /* ZEND_PHP_REFLECTION_DECL_c80946cc8c8215bb6527e09bb71b3a97a76a6a98_H */
diff --git a/ext/reflection/tests/ReflectionClass_getProperty_003.phpt b/ext/reflection/tests/ReflectionClass_getProperty_003.phpt
index c47f9e4fffd7..8be2f4bf85b6 100644
--- a/ext/reflection/tests/ReflectionClass_getProperty_003.phpt
+++ b/ext/reflection/tests/ReflectionClass_getProperty_003.phpt
@@ -244,4 +244,4 @@ Fully qualified property name X::$privC does not specify a base class of C
 --- (Reflecting on X::doesNotExist) ---
 Fully qualified property name X::$doesNotExist does not specify a base class of C
 --- (Reflecting on doesNotexist::doesNotExist) ---
-Class "doesnotexist" does not exist
+Class "doesNotexist" does not exist
diff --git a/ext/reflection/tests/ReflectionClass_getProperty_004.phpt b/ext/reflection/tests/ReflectionClass_getProperty_004.phpt
index 32e2d7876f6d..6a4f44ee5977 100644
--- a/ext/reflection/tests/ReflectionClass_getProperty_004.phpt
+++ b/ext/reflection/tests/ReflectionClass_getProperty_004.phpt
@@ -248,4 +248,4 @@ Fully qualified property name X::$privC does not specify a base class of C
 --- (Reflecting on X::doesNotExist) ---
 Fully qualified property name X::$doesNotExist does not specify a base class of C
 --- (Reflecting on doesNotexist::doesNotExist) ---
-Class "doesnotexist" does not exist
+Class "doesNotexist" does not exist
diff --git a/ext/reflection/tests/ReflectionExtension_getClassNames_basic.phpt b/ext/reflection/tests/ReflectionExtension_getClassNames_basic.phpt
index 47813255381e..c497855f7347 100644
--- a/ext/reflection/tests/ReflectionExtension_getClassNames_basic.phpt
+++ b/ext/reflection/tests/ReflectionExtension_getClassNames_basic.phpt
@@ -14,7 +14,30 @@ foreach ($classNames as $className) {
 --EXPECT--
 AssertionError
 Directory
+Io\IoException
+Io\Poll\Backend
+Io\Poll\BackendUnavailableException
+Io\Poll\Context
+Io\Poll\Event
+Io\Poll\FailedContextInitializationException
+Io\Poll\FailedHandleAddException
+Io\Poll\FailedPollOperationException
+Io\Poll\FailedPollWaitException
+Io\Poll\FailedWatcherModificationException
+Io\Poll\Handle
+Io\Poll\HandleAlreadyWatchedException
+Io\Poll\InactiveWatcherException
+Io\Poll\InvalidHandleException
+Io\Poll\PollException
+Io\Poll\Watcher
 RoundingMode
+SortDirection
 StreamBucket
+StreamError
+StreamErrorCode
+StreamErrorMode
+StreamErrorStore
+StreamException
+StreamPollHandle
 __PHP_Incomplete_Class
 php_user_filter
diff --git a/ext/reflection/tests/ReflectionParameter_getDocComment_basic.phpt b/ext/reflection/tests/ReflectionParameter_getDocComment_basic.phpt
new file mode 100644
index 000000000000..46e47bf60324
--- /dev/null
+++ b/ext/reflection/tests/ReflectionParameter_getDocComment_basic.phpt
@@ -0,0 +1,248 @@
+--TEST--
+Test ReflectionParameter::getDocComment() usage.
+--INI--
+opcache.save_comments=1
+--FILE--
+property = $value; }
+}
+}
+
+function global_function(
+    /**
+     * My Doc Comment for $a
+     *
+     */
+    $a, $b, $c,
+    /**
+     * My Doc Comment for $d
+     */
+    $d,
+    // Not a doc comment
+    /**Not a doc comment */
+    $e,
+    /**
+     * Doc comment for $f
+     */
+    $f,
+	$g /** Doc comment for $g after parameter */,
+	/** Doc comment for $h */
+	$h /** Doc comment for $h after parameter */,
+) {}
+
+$closure = function(
+    /**
+     * My Doc Comment for $a
+     *
+     */
+    $a, $b, $c,
+    /**
+     * My Doc Comment for $d
+     */
+    $d,
+    // Not a doc comment
+    /**Not a doc comment */
+    $e,
+    /**
+     * Doc comment for $f
+     */
+    $f,
+	$g /** Doc comment for $g after parameter */,
+	/** Doc comment for $h */
+	$h /** Doc comment for $h after parameter */,
+) {};
+
+$arrow_function = fn(
+    /**
+     * My Doc Comment for $a
+     *
+     */
+    $a, $b, $c,
+    /**
+     * My Doc Comment for $d
+     */
+    $d,
+    // Not a doc comment
+    /**Not a doc comment */
+    $e,
+    /**
+     * Doc comment for $f
+     */
+    $f,
+	$g /** Doc comment for $g after parameter */,
+	/** Doc comment for $h */
+	$h /** Doc comment for $h after parameter */,
+) => true;
+
+foreach([
+		'A::method'       => (new ReflectionClass('A'))->getMethod('method'),
+		'global_function' => new ReflectionFunction('global_function'),
+		'closure'         => new ReflectionFunction($closure),
+		'arrow_function'  => new ReflectionFunction($arrow_function),
+		'property hook'   => (new ReflectionClass('A'))->getProperty('property')->getHook(PropertyHookType::Set),
+	] as $function => $rc) {
+    $rps = $rc->getParameters();
+    foreach($rps as $rp) {
+        echo "\n---> Doc comment for $function parameter $" . $rp->getName() . ":\n";
+        var_dump($rp->getDocComment());
+    }
+}
+
+?>
+--EXPECTF--
+---> Doc comment for A::method parameter $a:
+string(%d) "/**
+     * My Doc Comment for $a
+     *
+     */"
+
+---> Doc comment for A::method parameter $b:
+bool(false)
+
+---> Doc comment for A::method parameter $c:
+bool(false)
+
+---> Doc comment for A::method parameter $d:
+string(%d) "/**
+     * My Doc Comment for $d
+     */"
+
+---> Doc comment for A::method parameter $e:
+bool(false)
+
+---> Doc comment for A::method parameter $f:
+string(%d) "/**
+     * Doc comment for $f
+     */"
+
+---> Doc comment for A::method parameter $g:
+string(%d) "/** Doc comment for $g after parameter */"
+
+---> Doc comment for A::method parameter $h:
+string(%d) "/** Doc comment for $h after parameter */"
+
+---> Doc comment for global_function parameter $a:
+string(%d) "/**
+     * My Doc Comment for $a
+     *
+     */"
+
+---> Doc comment for global_function parameter $b:
+bool(false)
+
+---> Doc comment for global_function parameter $c:
+bool(false)
+
+---> Doc comment for global_function parameter $d:
+string(%d) "/**
+     * My Doc Comment for $d
+     */"
+
+---> Doc comment for global_function parameter $e:
+bool(false)
+
+---> Doc comment for global_function parameter $f:
+string(%d) "/**
+     * Doc comment for $f
+     */"
+
+---> Doc comment for global_function parameter $g:
+string(%d) "/** Doc comment for $g after parameter */"
+
+---> Doc comment for global_function parameter $h:
+string(%d) "/** Doc comment for $h after parameter */"
+
+---> Doc comment for closure parameter $a:
+string(%d) "/**
+     * My Doc Comment for $a
+     *
+     */"
+
+---> Doc comment for closure parameter $b:
+bool(false)
+
+---> Doc comment for closure parameter $c:
+bool(false)
+
+---> Doc comment for closure parameter $d:
+string(%d) "/**
+     * My Doc Comment for $d
+     */"
+
+---> Doc comment for closure parameter $e:
+bool(false)
+
+---> Doc comment for closure parameter $f:
+string(%d) "/**
+     * Doc comment for $f
+     */"
+
+---> Doc comment for closure parameter $g:
+string(%d) "/** Doc comment for $g after parameter */"
+
+---> Doc comment for closure parameter $h:
+string(%d) "/** Doc comment for $h after parameter */"
+
+---> Doc comment for arrow_function parameter $a:
+string(%d) "/**
+     * My Doc Comment for $a
+     *
+     */"
+
+---> Doc comment for arrow_function parameter $b:
+bool(false)
+
+---> Doc comment for arrow_function parameter $c:
+bool(false)
+
+---> Doc comment for arrow_function parameter $d:
+string(%d) "/**
+     * My Doc Comment for $d
+     */"
+
+---> Doc comment for arrow_function parameter $e:
+bool(false)
+
+---> Doc comment for arrow_function parameter $f:
+string(%d) "/**
+     * Doc comment for $f
+     */"
+
+---> Doc comment for arrow_function parameter $g:
+string(%d) "/** Doc comment for $g after parameter */"
+
+---> Doc comment for arrow_function parameter $h:
+string(%d) "/** Doc comment for $h after parameter */"
+
+---> Doc comment for property hook parameter $value:
+string(%d) "/** Doc Comment for property hook parameter $value */"
+
diff --git a/ext/reflection/tests/ReflectionParameter_getDocComment_indented.phpt b/ext/reflection/tests/ReflectionParameter_getDocComment_indented.phpt
new file mode 100644
index 000000000000..ede7a00e0edd
--- /dev/null
+++ b/ext/reflection/tests/ReflectionParameter_getDocComment_indented.phpt
@@ -0,0 +1,84 @@
+--TEST--
+Test ReflectionParameter::getDocComment() usage when methods are indented.
+--INI--
+opcache.save_comments=1
+--FILE--
+property = $value; }
+     }
+}
+
+foreach([
+        'A::method'       => (new ReflectionClass('A'))->getMethod('method'),
+        'property hook'   => (new ReflectionClass('A'))->getProperty('property')->getHook(PropertyHookType::Set),
+    ] as $function => $rc) {
+    $rps = $rc->getParameters();
+    foreach($rps as $rp) {
+        echo "\n---> Doc comment for $function parameter $" . $rp->getName() . ":\n";
+        var_dump($rp->getDocComment());
+    }
+}
+
+?>
+--EXPECTF--
+---> Doc comment for A::method parameter $a:
+string(%d) "/**
+          * My Doc Comment for $a
+          *
+          */"
+
+---> Doc comment for A::method parameter $b:
+bool(false)
+
+---> Doc comment for A::method parameter $c:
+bool(false)
+
+---> Doc comment for A::method parameter $d:
+string(%d) "/**
+          * My Doc Comment for $d
+          */"
+
+---> Doc comment for A::method parameter $e:
+bool(false)
+
+---> Doc comment for A::method parameter $f:
+string(%d) "/**
+          * Doc comment for $f
+          */"
+
+---> Doc comment for A::method parameter $g:
+string(%d) "/** Doc comment for $g after parameter */"
+
+---> Doc comment for A::method parameter $h:
+string(%d) "/** Doc comment for $h after parameter */"
+
+---> Doc comment for property hook parameter $value:
+string(%d) "/** Doc Comment for property hook parameter $value */"
diff --git a/ext/reflection/tests/ReflectionParameter_getDocComment_property_hooks.phpt b/ext/reflection/tests/ReflectionParameter_getDocComment_property_hooks.phpt
new file mode 100644
index 000000000000..5689a2c46aca
--- /dev/null
+++ b/ext/reflection/tests/ReflectionParameter_getDocComment_property_hooks.phpt
@@ -0,0 +1,143 @@
+--TEST--
+Test ReflectionParameter::getDocComment() usage for property with hook.
+--INI--
+opcache.save_comments=1
+--FILE--
+getProperty('foo');
+echo "\n---> Doc comment for A::property $" . $rp->getName() . ":\n";
+var_dump($rp->getDocComment());
+
+$rh = $rp->getHook(PropertyHookType::Get);
+echo "\n---> Doc comment for A::property " . $rh->getName() . ":\n";
+var_dump($rh->getDocComment());
+
+$rh = $rp->getHook(PropertyHookType::Set);
+echo "\n---> Doc comment for A::property " . $rh->getName() . ":\n";
+var_dump($rh->getDocComment());
+
+$rp = $rh->getParameters()[0];
+echo "\n---> Doc comment for A::property \$foo::set parameter $" . $rp->getName() . ":\n";
+var_dump($rp->getDocComment());
+
+// ---------
+
+$rp = $rc->getConstructor()->getParameters()[1];
+echo "\n---> Doc comment for A::constructor parameter $" . $rp->getName() . ":\n";
+var_dump($rp->getDocComment());
+
+$rp = $rc->getProperty('bar');
+echo "\n---> Doc comment for A::property $" . $rp->getName() . ":\n";
+var_dump($rp->getDocComment());
+
+$rh = $rp->getHook(PropertyHookType::Get);
+echo "\n---> Doc comment for A::property " . $rh->getName() . ":\n";
+var_dump($rh->getDocComment());
+
+$rh = $rp->getHook(PropertyHookType::Set);
+echo "\n---> Doc comment for A::property " . $rh->getName() . ":\n";
+var_dump($rh->getDocComment());
+
+$rp = $rh->getParameters()[0];
+echo "\n---> Doc comment for A::property \$bar::set parameter $" . $rp->getName() . ":\n";
+var_dump($rp->getDocComment());
+
+// ---------
+
+$rp = $rc->getConstructor()->getParameters()[2];
+echo "\n---> Doc comment for A::constructor parameter $" . $rp->getName() . ":\n";
+var_dump($rp->getDocComment());
+
+$rp = $rc->getProperty('baz');
+echo "\n---> Doc comment for A::property $" . $rp->getName() . ":\n";
+var_dump($rp->getDocComment());
+
+$rh = $rp->getHook(PropertyHookType::Get);
+echo "\n---> Doc comment for A::property " . $rh->getName() . ":\n";
+var_dump($rh->getDocComment());
+
+$rh = $rp->getHook(PropertyHookType::Set);
+echo "\n---> Doc comment for A::property " . $rh->getName() . ":\n";
+var_dump($rh->getDocComment());
+
+$rp = $rh->getParameters()[0];
+echo "\n---> Doc comment for A::property \$baz::set parameter $" . $rp->getName() . ":\n";
+var_dump($rp->getDocComment());
+
+$rp = $rc->getConstructor()->getParameters()[0];
+echo "\n---> Doc comment for A::constructor parameter $" . $rp->getName() . ":\n";
+var_dump($rp->getDocComment());
+
+?>
+--EXPECTF--
+---> Doc comment for A::property $foo:
+string(11) "/** $foo */"
+
+---> Doc comment for A::property $foo::get:
+string(13) "/** getter */"
+
+---> Doc comment for A::property $foo::set:
+string(13) "/** setter */"
+
+---> Doc comment for A::property $foo::set parameter $value:
+string(13) "/** $value */"
+
+---> Doc comment for A::constructor parameter $bar:
+string(11) "/** $bar */"
+
+---> Doc comment for A::property $bar:
+string(11) "/** $bar */"
+
+---> Doc comment for A::property $bar::get:
+string(13) "/** getter */"
+
+---> Doc comment for A::property $bar::set:
+string(13) "/** setter */"
+
+---> Doc comment for A::property $bar::set parameter $value:
+string(13) "/** $value */"
+
+---> Doc comment for A::constructor parameter $baz:
+bool(false)
+
+---> Doc comment for A::property $baz:
+bool(false)
+
+---> Doc comment for A::property $baz::get:
+string(13) "/** getter */"
+
+---> Doc comment for A::property $baz::set:
+string(13) "/** setter */"
+
+---> Doc comment for A::property $baz::set parameter $value:
+string(13) "/** $value */"
+
+---> Doc comment for A::constructor parameter $foo:
+string(11) "/** $foo */"
diff --git a/ext/reflection/tests/ReflectionParameter_leading_backslash.phpt b/ext/reflection/tests/ReflectionParameter_leading_backslash.phpt
new file mode 100644
index 000000000000..b0a7827c2764
--- /dev/null
+++ b/ext/reflection/tests/ReflectionParameter_leading_backslash.phpt
@@ -0,0 +1,17 @@
+--TEST--
+ReflectionParameter::__construct(): a leading "\" in the function name is ignored
+--FILE--
+getName());
+
+$p = new ReflectionParameter("demo", 0);
+var_dump($p->getName());
+
+?>
+--EXPECT--
+string(3) "arg"
+string(3) "arg"
diff --git a/ext/reflection/tests/ReflectionZendExtension.phpt b/ext/reflection/tests/ReflectionZendExtension.phpt
index c9c8f18cf553..a9825ff78abc 100644
--- a/ext/reflection/tests/ReflectionZendExtension.phpt
+++ b/ext/reflection/tests/ReflectionZendExtension.phpt
@@ -14,8 +14,8 @@ var_dump($reflection->getURL());
 var_dump($reflection->getVersion() === PHP_VERSION);
 ?>
 --EXPECT--
-string(17) "Zend Technologies"
-string(13) "Copyright (c)"
+string(16) "Zend by Perforce"
+string(12) "Copyright ©"
 string(12) "Zend OPcache"
-string(20) "http://www.zend.com/"
+string(21) "https://www.zend.com/"
 bool(true)
diff --git a/ext/reflection/tests/gh22000.phpt b/ext/reflection/tests/gh22000.phpt
new file mode 100644
index 000000000000..aee4863e9b7d
--- /dev/null
+++ b/ext/reflection/tests/gh22000.phpt
@@ -0,0 +1,61 @@
+--TEST--
+GH-22000 - Ensure __isset returning a reference is supported by ReflectionProperty::isReadable()
+--FILE--
+b);
+        unset($this->c);
+    }
+
+    public function __isset($name) {
+        return $name === 'b';
+    }
+
+    public function __get($name) {}
+}
+
+class TestClass2 {
+    public int $d;
+    public int $e;
+    public int $f;
+
+    public function __construct() {
+        unset($this->e);
+        unset($this->f);
+    }
+
+    public function &__isset($name) {
+        return $name === 'f';
+    }
+
+    public function __get($name) {}
+}
+
+
+function test($class) {
+    $rc = new ReflectionClass($class);
+    foreach ($rc->getProperties() as $rp) {
+        echo $rp->getName() . ' from global:';
+        var_dump($rp->isReadable(null, new $class));
+    }
+}
+
+test('TestClass1');
+test('TestClass2');
+?>
+--EXPECTF--
+a from global:bool(true)
+b from global:bool(true)
+c from global:bool(false)
+d from global:bool(false)
+e from global:
+Notice: Only variable references should be returned by reference in %s on line %d
+bool(false)
+f from global:
+Notice: Only variable references should be returned by reference in %s on line %d
+bool(true)
diff --git a/ext/session/mod_files.c b/ext/session/mod_files.c
index 60c6bfc1bd4c..3a7f8aec4522 100644
--- a/ext/session/mod_files.c
+++ b/ext/session/mod_files.c
@@ -1,14 +1,12 @@
 /*
    +----------------------------------------------------------------------+
-   | Copyright (c) The PHP Group                                          |
+   | Copyright © The PHP Group and Contributors.                          |
    +----------------------------------------------------------------------+
-   | This source file is subject to version 3.01 of the PHP license,      |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | https://www.php.net/license/3_01.txt                                 |
-   | If you did not receive a copy of the PHP license and are unable to   |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@php.net so we can mail you a copy immediately.               |
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Author: Sascha Schumann                          |
    +----------------------------------------------------------------------+
@@ -276,7 +274,10 @@ static zend_result ps_files_write(ps_files *data, zend_string *key, zend_string
 	return SUCCESS;
 }
 
-static int ps_files_cleanup_dir(const zend_string *dirname, zend_long maxlifetime)
+/* Recursively remove expired session files. When dirdepth > 0 the
+ * cleanup descends into subdirectories up to that many levels before
+ * inspecting individual session files. */
+static int ps_files_cleanup_dir(const zend_string *dirname, zend_long maxlifetime, size_t remaining_depth)
 {
 	DIR *dir;
 	struct dirent *entry;
@@ -291,8 +292,6 @@ static int ps_files_cleanup_dir(const zend_string *dirname, zend_long maxlifetim
 		return -1;
 	}
 
-	time(&now);
-
 	if (ZSTR_LEN(dirname) >= MAXPATHLEN) {
 		php_error_docref(NULL, E_NOTICE, "ps_files_cleanup_dir: dirname(%s) is too long", ZSTR_VAL(dirname));
 		closedir(dir);
@@ -304,31 +303,52 @@ static int ps_files_cleanup_dir(const zend_string *dirname, zend_long maxlifetim
 	buf[ZSTR_LEN(dirname)] = PHP_DIR_SEPARATOR;
 
 	while ((entry = readdir(dir))) {
-		/* does the file start with our prefix? */
-		if (!strncmp(entry->d_name, FILE_PREFIX, sizeof(FILE_PREFIX) - 1)) {
-			size_t entry_len = strlen(entry->d_name);
-
-			/* does it fit into our buffer? */
-			if (entry_len + ZSTR_LEN(dirname) + 2 < MAXPATHLEN) {
-				/* create the full path.. */
-				memcpy(buf + ZSTR_LEN(dirname) + 1, entry->d_name, entry_len);
-
-				/* NUL terminate it and */
-				buf[ZSTR_LEN(dirname) + entry_len + 1] = '\0';
-
-				/* check whether its last access was more than maxlifetime ago */
-				if (VCWD_STAT(buf, &sbuf) == 0 &&
-						(now - sbuf.st_mtime) > maxlifetime) {
-					VCWD_UNLINK(buf);
-					nrdels++;
+		/* skip . and .. */
+		if (entry->d_name[0] == '.' &&
+				(entry->d_name[1] == '\0' ||
+				 (entry->d_name[1] == '.' && entry->d_name[2] == '\0'))) {
+			continue;
+		}
+		size_t entry_len = strlen(entry->d_name);
+		/* does it fit into our buffer? */
+		if (ZSTR_LEN(dirname) + 1 + entry_len >= MAXPATHLEN) {
+			continue;
+		}
+		/* create the full path and NUL-terminate it */
+		memcpy(buf + ZSTR_LEN(dirname) + 1, entry->d_name, entry_len);
+		buf[ZSTR_LEN(dirname) + 1 + entry_len] = '\0';
+
+		if (remaining_depth == 0) {
+			/* target depth: delete expired session files */
+			if (strncmp(entry->d_name, FILE_PREFIX, sizeof(FILE_PREFIX) - 1) != 0) {
+				continue;
+			}
+			if (VCWD_STAT(buf, &sbuf) != 0) {
+				continue;
+			}
+			time(&now);
+			if ((now - sbuf.st_mtime) > maxlifetime) {
+				VCWD_UNLINK(buf);
+				nrdels++;
+			}
+		} else {
+			/* intermediate depth: recurse into subdirectories */
+			if (VCWD_STAT(buf, &sbuf) != 0) {
+				continue;
+			}
+			if (S_ISDIR(sbuf.st_mode)) {
+				zend_string *subdir = zend_string_init(buf, ZSTR_LEN(dirname) + 1 + entry_len, 0);
+				int n = ps_files_cleanup_dir(subdir, maxlifetime, remaining_depth - 1);
+				zend_string_release(subdir);
+				if (n >= 0) {
+					nrdels += n;
 				}
 			}
 		}
 	}
 
 	closedir(dir);
-
-	return (nrdels);
+	return nrdels;
 }
 
 static zend_result ps_files_key_exists(ps_files *data, const zend_string *key)
@@ -624,15 +644,7 @@ PS_GC_FUNC(files)
 {
 	PS_FILES_DATA;
 
-	/* We don't perform any cleanup, if dirdepth is larger than 0.
-	   we return SUCCESS, since all cleanup should be handled by
-	   an external entity (i.e. find -ctime x | xargs rm) */
-
-	if (data->dirdepth == 0) {
-		*nrdels = ps_files_cleanup_dir(data->basedir, maxlifetime);
-	} else {
-		*nrdels = -1; // Cannot process multiple depth save dir
-	}
+	*nrdels = ps_files_cleanup_dir(data->basedir, maxlifetime, data->dirdepth);
 
 	return *nrdels;
 }
diff --git a/ext/session/mod_files.h b/ext/session/mod_files.h
index 31ed4afbffcc..9eae00fb9c7a 100644
--- a/ext/session/mod_files.h
+++ b/ext/session/mod_files.h
@@ -1,14 +1,12 @@
 /*
    +----------------------------------------------------------------------+
-   | Copyright (c) The PHP Group                                          |
+   | Copyright © The PHP Group and Contributors.                          |
    +----------------------------------------------------------------------+
-   | This source file is subject to version 3.01 of the PHP license,      |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | https://www.php.net/license/3_01.txt                                 |
-   | If you did not receive a copy of the PHP license and are unable to   |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@php.net so we can mail you a copy immediately.               |
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Author: Sascha Schumann                          |
    +----------------------------------------------------------------------+
diff --git a/ext/session/mod_mm.c b/ext/session/mod_mm.c
index 521e553d54f2..70000f5ca848 100644
--- a/ext/session/mod_mm.c
+++ b/ext/session/mod_mm.c
@@ -1,14 +1,12 @@
 /*
    +----------------------------------------------------------------------+
-   | Copyright (c) The PHP Group                                          |
+   | Copyright © The PHP Group and Contributors.                          |
    +----------------------------------------------------------------------+
-   | This source file is subject to version 3.01 of the PHP license,      |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | https://www.php.net/license/3_01.txt                                 |
-   | If you did not receive a copy of the PHP license and are unable to   |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@php.net so we can mail you a copy immediately.               |
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Author: Sascha Schumann                          |
    +----------------------------------------------------------------------+
@@ -483,7 +481,7 @@ PS_VALIDATE_SID_FUNC(mm)
 	PS_MM_DATA;
 
 	mm_lock(data->mm, MM_LOCK_RD);
-	zend_result ret = ps_mm_key_exists(data, key)
+	zend_result ret = ps_mm_key_exists(data, key);
 	mm_unlock(data->mm);
 	return ret;
 }
diff --git a/ext/session/mod_mm.h b/ext/session/mod_mm.h
index b35e0b632ee9..990eab09147c 100644
--- a/ext/session/mod_mm.h
+++ b/ext/session/mod_mm.h
@@ -1,14 +1,12 @@
 /*
    +----------------------------------------------------------------------+
-   | Copyright (c) The PHP Group                                          |
+   | Copyright © The PHP Group and Contributors.                          |
    +----------------------------------------------------------------------+
-   | This source file is subject to version 3.01 of the PHP license,      |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | https://www.php.net/license/3_01.txt                                 |
-   | If you did not receive a copy of the PHP license and are unable to   |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@php.net so we can mail you a copy immediately.               |
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Author: Sascha Schumann                          |
    +----------------------------------------------------------------------+
diff --git a/ext/session/mod_user.c b/ext/session/mod_user.c
index a83f1bd36f8b..c87e9654c4ea 100644
--- a/ext/session/mod_user.c
+++ b/ext/session/mod_user.c
@@ -1,14 +1,12 @@
 /*
    +----------------------------------------------------------------------+
-   | Copyright (c) The PHP Group                                          |
+   | Copyright © The PHP Group and Contributors.                          |
    +----------------------------------------------------------------------+
-   | This source file is subject to version 3.01 of the PHP license,      |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | https://www.php.net/license/3_01.txt                                 |
-   | If you did not receive a copy of the PHP license and are unable to   |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@php.net so we can mail you a copy immediately.               |
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Author: Sascha Schumann                          |
    +----------------------------------------------------------------------+
@@ -216,6 +214,7 @@ PS_GC_FUNC(user)
 		/* Anything else is some kind of error */
 		*nrdels = -1; // Error
 	}
+	zval_ptr_dtor(&retval);
 	return *nrdels;
 }
 
diff --git a/ext/session/mod_user.h b/ext/session/mod_user.h
index 58772b48ec82..9c36c315819a 100644
--- a/ext/session/mod_user.h
+++ b/ext/session/mod_user.h
@@ -1,14 +1,12 @@
 /*
    +----------------------------------------------------------------------+
-   | Copyright (c) The PHP Group                                          |
+   | Copyright © The PHP Group and Contributors.                          |
    +----------------------------------------------------------------------+
-   | This source file is subject to version 3.01 of the PHP license,      |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | https://www.php.net/license/3_01.txt                                 |
-   | If you did not receive a copy of the PHP license and are unable to   |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@php.net so we can mail you a copy immediately.               |
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Author: Sascha Schumann                          |
    +----------------------------------------------------------------------+
diff --git a/ext/session/mod_user_class.c b/ext/session/mod_user_class.c
index 9adc97e67418..a6bd69c91a07 100644
--- a/ext/session/mod_user_class.c
+++ b/ext/session/mod_user_class.c
@@ -1,14 +1,12 @@
 /*
    +----------------------------------------------------------------------+
-   | Copyright (c) The PHP Group                                          |
+   | Copyright © The PHP Group and Contributors.                          |
    +----------------------------------------------------------------------+
-   | This source file is subject to version 3.01 of the PHP license,      |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | https://www.php.net/license/3_01.txt                                 |
-   | If you did not receive a copy of the PHP license and are unable to   |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@php.net so we can mail you a copy immediately.               |
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Author: Arpad Ray                                     |
    +----------------------------------------------------------------------+
diff --git a/ext/session/php_session.h b/ext/session/php_session.h
index 09a737cf64f3..08c08b9a024a 100644
--- a/ext/session/php_session.h
+++ b/ext/session/php_session.h
@@ -1,14 +1,12 @@
 /*
    +----------------------------------------------------------------------+
-   | Copyright (c) The PHP Group                                          |
+   | Copyright © The PHP Group and Contributors.                          |
    +----------------------------------------------------------------------+
-   | This source file is subject to version 3.01 of the PHP license,      |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | https://www.php.net/license/3_01.txt                                 |
-   | If you did not receive a copy of the PHP license and are unable to   |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@php.net so we can mail you a copy immediately.               |
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Author: Sascha Schumann                          |
    +----------------------------------------------------------------------+
diff --git a/ext/session/session.c b/ext/session/session.c
index 6cdd1c91eae6..1fdfc5d1073f 100644
--- a/ext/session/session.c
+++ b/ext/session/session.c
@@ -1,14 +1,12 @@
 /*
    +----------------------------------------------------------------------+
-   | Copyright (c) The PHP Group                                          |
+   | Copyright © The PHP Group and Contributors.                          |
    +----------------------------------------------------------------------+
-   | This source file is subject to version 3.01 of the PHP license,      |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | https://www.php.net/license/3_01.txt                                 |
-   | If you did not receive a copy of the PHP license and are unable to   |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@php.net so we can mail you a copy immediately.               |
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Authors: Sascha Schumann                         |
    |          Andrei Zmievski                             |
@@ -448,9 +446,7 @@ static zend_result php_session_initialize(void)
 	} else if (PS(use_strict_mode) && PS(mod)->s_validate_sid &&
 		PS(mod)->s_validate_sid(&PS(mod_data), PS(id)) == FAILURE
 	) {
-		if (PS(id)) {
-			zend_string_release_ex(PS(id), false);
-		}
+		zend_string_release_ex(PS(id), false);
 		PS(id) = PS(mod)->s_create_sid(&PS(mod_data));
 		if (!PS(id)) {
 			PS(id) = php_session_create_id(NULL);
@@ -641,7 +637,7 @@ static PHP_INI_MH(OnUpdateSaveDir)
 
 	/* Only do the open_basedir check at runtime */
 	if (stage == PHP_INI_STAGE_RUNTIME || stage == PHP_INI_STAGE_HTACCESS) {
-		if (memchr(ZSTR_VAL(new_value), '\0', ZSTR_LEN(new_value)) != NULL) {
+		if (zend_str_has_nul_byte(new_value)) {
 			return FAILURE;
 		}
 
@@ -706,12 +702,20 @@ static PHP_INI_MH(OnUpdateCookieLifetime)
 #else
 	const zend_long maxcookie = ZEND_LONG_MAX / 2 - 1;
 #endif
-	zend_long v = (zend_long)atol(ZSTR_VAL(new_value));
-	if (v < 0) {
-		php_error_docref(NULL, E_WARNING, "CookieLifetime cannot be negative");
+	zend_long lval = 0;
+	int oflow = 0;
+	uint8_t type = is_numeric_string_ex(ZSTR_VAL(new_value), ZSTR_LEN(new_value), &lval, NULL, false, &oflow, NULL);
+	if (UNEXPECTED(type != IS_LONG)) {
+		if (oflow != 0) {
+			php_error_docref(NULL, E_WARNING, "session.cookie_lifetime must be between 0 and " ZEND_LONG_FMT, maxcookie);
+		} else {
+			php_error_docref(NULL, E_WARNING, "session.cookie_lifetime must be of type int");
+		}
+		return FAILURE;
+	}
+	if (lval < 0 || lval > maxcookie) {
+		php_error_docref(NULL, E_WARNING, "session.cookie_lifetime must be between 0 and " ZEND_LONG_FMT, maxcookie);
 		return FAILURE;
-	} else if (v > maxcookie) {
-		return SUCCESS;
 	}
 
 	return OnUpdateLongGEZero(entry, new_value, mh_arg1, mh_arg2, mh_arg3, stage);
@@ -730,6 +734,27 @@ static PHP_INI_MH(OnUpdateSessionStr)
 	SESSION_CHECK_ACTIVE_STATE;
 	SESSION_CHECK_OUTPUT_STATE;
 
+	if (new_value && zend_str_has_nul_byte(new_value)) {
+		if (stage != ZEND_INI_STAGE_DEACTIVATE) {
+			php_error_docref(NULL, E_WARNING, "\"%s\" must not contain null bytes", ZSTR_VAL(entry->name));
+		}
+		return FAILURE;
+	}
+
+	return OnUpdateStr(entry, new_value, mh_arg1, mh_arg2, mh_arg3, stage);
+}
+
+static PHP_INI_MH(OnUpdateSessionSameSite)
+{
+	SESSION_CHECK_ACTIVE_STATE;
+	SESSION_CHECK_OUTPUT_STATE;
+
+	if (new_value && ZSTR_LEN(new_value) > 0 && !php_is_valid_samesite_value(new_value)) {
+		php_error_docref(NULL, E_WARNING,
+			"session.cookie_samesite must be \"Strict\", \"Lax\", \"None\", or \"\"");
+		return FAILURE;
+	}
+
 	return OnUpdateStr(entry, new_value, mh_arg1, mh_arg2, mh_arg3, stage);
 }
 
@@ -903,11 +928,11 @@ PHP_INI_BEGIN()
 	STD_PHP_INI_ENTRY("session.cookie_domain",        "",          PHP_INI_ALL,    OnUpdateSessionStr,           cookie_domain,      php_ps_globals, ps_globals)
 	STD_PHP_INI_BOOLEAN("session.cookie_secure",      "0",         PHP_INI_ALL,    OnUpdateSessionBool,          cookie_secure,      php_ps_globals, ps_globals)
 	STD_PHP_INI_BOOLEAN("session.cookie_partitioned", "0",         PHP_INI_ALL,    OnUpdateSessionBool,          cookie_partitioned, php_ps_globals, ps_globals)
-	STD_PHP_INI_BOOLEAN("session.cookie_httponly",    "0",         PHP_INI_ALL,    OnUpdateSessionBool,          cookie_httponly,    php_ps_globals, ps_globals)
-	STD_PHP_INI_ENTRY("session.cookie_samesite",      "",          PHP_INI_ALL,    OnUpdateSessionStr,           cookie_samesite,    php_ps_globals, ps_globals)
+	STD_PHP_INI_BOOLEAN("session.cookie_httponly",    "1",         PHP_INI_ALL,    OnUpdateSessionBool,          cookie_httponly,    php_ps_globals, ps_globals)
+	STD_PHP_INI_ENTRY("session.cookie_samesite",      "Lax",       PHP_INI_ALL,    OnUpdateSessionSameSite,      cookie_samesite,    php_ps_globals, ps_globals)
 	STD_PHP_INI_BOOLEAN("session.use_cookies",        "1",         PHP_INI_ALL,    OnUpdateSessionBool,          use_cookies,        php_ps_globals, ps_globals)
 	STD_PHP_INI_BOOLEAN("session.use_only_cookies",   "1",         PHP_INI_ALL,    OnUpdateUseOnlyCookies,       use_only_cookies,   php_ps_globals, ps_globals)
-	STD_PHP_INI_BOOLEAN("session.use_strict_mode",    "0",         PHP_INI_ALL,    OnUpdateSessionBool,          use_strict_mode,    php_ps_globals, ps_globals)
+	STD_PHP_INI_BOOLEAN("session.use_strict_mode",    "1",         PHP_INI_ALL,    OnUpdateSessionBool,          use_strict_mode,    php_ps_globals, ps_globals)
 	STD_PHP_INI_ENTRY("session.referer_check",        "",          PHP_INI_ALL,    OnUpdateRefererCheck,         extern_referer_chk, php_ps_globals, ps_globals)
 	STD_PHP_INI_ENTRY("session.cache_limiter",        "nocache",   PHP_INI_ALL,    OnUpdateSessionStr,           cache_limiter,      php_ps_globals, ps_globals)
 	STD_PHP_INI_ENTRY("session.cache_expire",         "180",       PHP_INI_ALL,    OnUpdateSessionLong,          cache_expire,       php_ps_globals, ps_globals)
@@ -1652,10 +1677,9 @@ PHPAPI zend_result php_session_start(void)
 		case php_session_active:
 			php_session_session_already_started_error(E_NOTICE, "Ignoring session_start() because a session has already been started");
 			return FAILURE;
-			break;
 
 		case php_session_disabled: {
-			const char *value = zend_ini_string(ZEND_STRL("session.save_handler"), false);
+			const char *value = zend_ini_string_literal("session.save_handler");
 			if (!PS(mod) && value) {
 				PS(mod) = _php_find_ps_module(value);
 				if (!PS(mod)) {
@@ -1663,7 +1687,7 @@ PHPAPI zend_result php_session_start(void)
 					return FAILURE;
 				}
 			}
-			value = zend_ini_string(ZEND_STRL("session.serialize_handler"), false);
+			value = zend_ini_string_literal("session.serialize_handler");
 			if (!PS(serializer) && value) {
 				PS(serializer) = _php_find_ps_serializer(value);
 				if (!PS(serializer)) {
@@ -2769,14 +2793,14 @@ static zend_result php_rinit_session(bool auto_start)
 
 	PS(mod) = NULL;
 	{
-		const char *value = zend_ini_string(ZEND_STRL("session.save_handler"), false);
+		const char *value = zend_ini_string_literal("session.save_handler");
 		if (value) {
 			PS(mod) = _php_find_ps_module(value);
 		}
 	}
 
 	if (PS(serializer) == NULL) {
-		const char *value = zend_ini_string(ZEND_STRL("session.serialize_handler"), false);
+		const char *value = zend_ini_string_literal("session.serialize_handler");
 		if (value) {
 			PS(serializer) = _php_find_ps_serializer(value);
 		}
diff --git a/ext/session/tests/bug74892.phpt b/ext/session/tests/bug74892.phpt
index 916120cb4d44..7a2211210b45 100644
--- a/ext/session/tests/bug74892.phpt
+++ b/ext/session/tests/bug74892.phpt
@@ -4,6 +4,7 @@ Bug #74892 Url Rewriting (trans_sid) not working on urls that start with #
 session.use_cookies=0
 session.use_only_cookies=0
 session.use_trans_sid=1
+session.use_strict_mode=0
 --EXTENSIONS--
 session
 --SKIPIF--
diff --git a/ext/session/tests/bug80774.phpt b/ext/session/tests/bug80774.phpt
index 7dd86add02b0..ba5d39e1953a 100644
--- a/ext/session/tests/bug80774.phpt
+++ b/ext/session/tests/bug80774.phpt
@@ -2,6 +2,8 @@
 Bug #80774 (session_name() problem with backslash)
 --EXTENSIONS--
 session
+--INI--
+session.use_strict_mode=0
 --FILE--
 
 --EXPECTHEADERS--
-Set-Cookie: foo\bar=12345; path=/
+Set-Cookie: foo\bar=12345; path=/; HttpOnly; SameSite=Lax
 --EXPECT--
diff --git a/ext/session/tests/gh16290.phpt b/ext/session/tests/gh16290.phpt
index d341eb47471b..df57b129649d 100644
--- a/ext/session/tests/gh16290.phpt
+++ b/ext/session/tests/gh16290.phpt
@@ -6,8 +6,11 @@ session
 
 --FILE--
 
---EXPECT--
+--EXPECTF--
+Warning: session_set_cookie_params(): session.cookie_lifetime must be between 0 and %d in %s on line %d
 DONE
diff --git a/ext/session/tests/gh9200.phpt b/ext/session/tests/gh9200.phpt
index fd6e28ab8b90..7e458176d10f 100644
--- a/ext/session/tests/gh9200.phpt
+++ b/ext/session/tests/gh9200.phpt
@@ -2,6 +2,7 @@
 GH-9200: setcookie has an obsolete expires date format
 --INI--
 session.cookie_lifetime=3600
+session.use_strict_mode=0
 --EXTENSIONS--
 session
 --CGI--
@@ -12,7 +13,7 @@ session_id('bar');
 session_start();
 
 foreach (headers_list() as $header) {
-	if (preg_match('/^Set-Cookie: foo=bar; expires=(Mon|Tue|Wed|Thu|Fri|Sat|Sun), [0-9][0-9] (Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec) 2[0-9][0-9][0-9] [0-9][0-9]:[0-9][0-9]:[0-9][0-9] GMT; Max-Age=3600; path=\\/$/', $header)) {
+	if (preg_match('/^Set-Cookie: foo=bar; expires=(Mon|Tue|Wed|Thu|Fri|Sat|Sun), [0-9][0-9] (Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec) 2[0-9][0-9][0-9] [0-9][0-9]:[0-9][0-9]:[0-9][0-9] GMT; Max-Age=3600; path=\/; HttpOnly; SameSite=Lax$/', $header)) {
 		echo "Success", PHP_EOL;
 		exit;
 	}
diff --git a/ext/session/tests/mod_files/gc_dirdepth2.phpt b/ext/session/tests/mod_files/gc_dirdepth2.phpt
new file mode 100644
index 000000000000..d858c1f95db8
--- /dev/null
+++ b/ext/session/tests/mod_files/gc_dirdepth2.phpt
@@ -0,0 +1,46 @@
+--TEST--
+session GC cleans expired sessions with save_path dirdepth=2 (two subdir levels)
+--EXTENSIONS--
+session
+--SKIPIF--
+
+--INI--
+session.gc_probability=0
+session.gc_maxlifetime=10
+session.use_strict_mode=0
+--FILE--
+
+--CLEAN--
+
+--EXPECT--
+session_gc() return value: int(1)
+expired file removed: bool(true)
diff --git a/ext/session/tests/mod_files/gc_dirdepth_disabled.phpt b/ext/session/tests/mod_files/gc_dirdepth_disabled.phpt
new file mode 100644
index 000000000000..dc3d4720dd23
--- /dev/null
+++ b/ext/session/tests/mod_files/gc_dirdepth_disabled.phpt
@@ -0,0 +1,69 @@
+--TEST--
+session GC correctly cleans expired sessions when save_path dirdepth > 0
+--EXTENSIONS--
+session
+--SKIPIF--
+
+--INI--
+session.gc_probability=0
+session.gc_maxlifetime=1
+session.use_strict_mode=0
+--FILE--
+
+--CLEAN--
+
+--EXPECT--
+dirdepth=1 — session_gc() return value: int(1)
+dirdepth=1 — expired session file removed: bool(true)
+dirdepth=0 — session_gc() return value: int(1)
+dirdepth=0 — expired session file removed: bool(true)
diff --git a/ext/session/tests/mod_files/gc_dirdepth_multi_subdir_count.phpt b/ext/session/tests/mod_files/gc_dirdepth_multi_subdir_count.phpt
new file mode 100644
index 000000000000..c5e916c86fd2
--- /dev/null
+++ b/ext/session/tests/mod_files/gc_dirdepth_multi_subdir_count.phpt
@@ -0,0 +1,55 @@
+--TEST--
+session GC accumulates correct total count across multiple subdirs, including empty ones (dirdepth=1)
+--EXTENSIONS--
+session
+--SKIPIF--
+
+--INI--
+session.gc_probability=0
+session.gc_maxlifetime=10
+session.use_strict_mode=0
+--FILE--
+
+--CLEAN--
+
+--EXPECT--
+session_gc() return value: int(3)
+all expired files removed: bool(true)
diff --git a/ext/session/tests/mod_files/gc_dirdepth_selective.phpt b/ext/session/tests/mod_files/gc_dirdepth_selective.phpt
new file mode 100644
index 000000000000..1f0785d66fed
--- /dev/null
+++ b/ext/session/tests/mod_files/gc_dirdepth_selective.phpt
@@ -0,0 +1,58 @@
+--TEST--
+session GC deletes only expired sess_* files and leaves all other files untouched (dirdepth=1)
+--EXTENSIONS--
+session
+--SKIPIF--
+
+--INI--
+session.gc_probability=0
+session.gc_maxlifetime=10
+session.use_strict_mode=0
+--FILE--
+ gc_maxlifetime=10 → deleted
+
+file_put_contents($fresh, 'user|s:5:"alice";');
+touch($fresh, time() - 1);       // 1 s old < gc_maxlifetime=10 → kept
+
+file_put_contents($other, 'untouched');
+touch($other, time() - 100);     // old but no sess_ prefix → kept
+
+session_id('a0000000000000000000000000');  // first char 'a' → $base/a/
+session_start();
+$result = session_gc();   // int(1): exactly one deletion proves selectivity
+session_destroy();
+
+echo "session_gc() return value: ";
+var_dump($result);
+
+echo "expired sess_ file removed: ";
+var_dump(!file_exists($expired));
+
+echo "other file kept: ";
+var_dump(file_exists($other));
+?>
+--CLEAN--
+
+--EXPECT--
+session_gc() return value: int(1)
+expired sess_ file removed: bool(true)
+other file kept: bool(true)
diff --git a/ext/session/tests/session_cookie_lifetime_invalid.phpt b/ext/session/tests/session_cookie_lifetime_invalid.phpt
new file mode 100644
index 000000000000..8665a53447b9
--- /dev/null
+++ b/ext/session/tests/session_cookie_lifetime_invalid.phpt
@@ -0,0 +1,55 @@
+--TEST--
+session.cookie_lifetime rejects invalid values
+--EXTENSIONS--
+session
+--SKIPIF--
+
+--FILE--
+
+--EXPECTF--
+Warning: ini_set(): session.cookie_lifetime must be of type int in %s on line %d
+string(3) "100"
+
+Warning: ini_set(): session.cookie_lifetime must be of type int in %s on line %d
+string(3) "100"
+
+Warning: ini_set(): session.cookie_lifetime must be between 0 and %d in %s on line %d
+string(3) "100"
+
+Warning: ini_set(): session.cookie_lifetime must be between 0 and %d in %s on line %d
+string(3) "100"
+
+Warning: ini_set(): session.cookie_lifetime must be between 0 and %d in %s on line %d
+string(3) "100"
+string(3) "200"
diff --git a/ext/session/tests/session_get_cookie_params_basic.phpt b/ext/session/tests/session_get_cookie_params_basic.phpt
index 1c7cdf189fc9..8e7f8da4e3fb 100644
--- a/ext/session/tests/session_get_cookie_params_basic.phpt
+++ b/ext/session/tests/session_get_cookie_params_basic.phpt
@@ -22,7 +22,7 @@ echo "*** Testing session_get_cookie_params() : basic functionality ***\n";
 var_dump(session_get_cookie_params());
 var_dump(session_set_cookie_params(3600, "/path", "blah", FALSE, FALSE));
 var_dump(session_get_cookie_params());
-var_dump(session_set_cookie_params(1234567890, "/guff", "foo", TRUE, TRUE));
+var_dump(session_set_cookie_params(1000000000, "/guff", "foo", TRUE, TRUE));
 var_dump(session_get_cookie_params());
 var_dump(session_set_cookie_params([
   "lifetime" => 123,
@@ -30,7 +30,7 @@ var_dump(session_set_cookie_params([
   "domain" => "baz",
   "secure" => FALSE,
   "httponly" => FALSE,
-  "samesite" => "please"]));
+  "samesite" => "Strict"]));
 var_dump(session_get_cookie_params());
 var_dump(session_set_cookie_params([
   "secure" => TRUE,
@@ -40,7 +40,7 @@ var_dump(session_get_cookie_params());
 echo "Done";
 ob_end_flush();
 ?>
---EXPECTF--
+--EXPECT--
 *** Testing session_get_cookie_params() : basic functionality ***
 array(7) {
   ["lifetime"]=>
@@ -78,7 +78,7 @@ array(7) {
 bool(true)
 array(7) {
   ["lifetime"]=>
-  int(%d)
+  int(1000000000)
   ["path"]=>
   string(5) "/guff"
   ["domain"]=>
@@ -107,7 +107,7 @@ array(7) {
   ["httponly"]=>
   bool(false)
   ["samesite"]=>
-  string(6) "please"
+  string(6) "Strict"
 }
 bool(true)
 array(7) {
@@ -124,6 +124,6 @@ array(7) {
   ["httponly"]=>
   bool(false)
   ["samesite"]=>
-  string(6) "please"
+  string(6) "Strict"
 }
 Done
diff --git a/ext/session/tests/session_get_cookie_params_variation1.phpt b/ext/session/tests/session_get_cookie_params_variation1.phpt
index 7ce112c9b94d..0ab0f233530b 100644
--- a/ext/session/tests/session_get_cookie_params_variation1.phpt
+++ b/ext/session/tests/session_get_cookie_params_variation1.phpt
@@ -30,7 +30,7 @@ ini_set("session.cookie_secure", TRUE);
 var_dump(session_get_cookie_params());
 ini_set("session.cookie_httponly", TRUE);
 var_dump(session_get_cookie_params());
-ini_set("session.cookie_samesite", "foo");
+ini_set("session.cookie_samesite", "Lax");
 var_dump(session_get_cookie_params());
 ini_set("session.cookie_partitioned", TRUE);
 var_dump(session_get_cookie_params());
@@ -150,7 +150,7 @@ array(7) {
   ["httponly"]=>
   bool(true)
   ["samesite"]=>
-  string(3) "foo"
+  string(3) "Lax"
 }
 array(7) {
   ["lifetime"]=>
@@ -166,6 +166,6 @@ array(7) {
   ["httponly"]=>
   bool(true)
   ["samesite"]=>
-  string(3) "foo"
+  string(3) "Lax"
 }
 Done
diff --git a/ext/session/tests/session_regenerate_id_cookie.phpt b/ext/session/tests/session_regenerate_id_cookie.phpt
index 6516ad7061d1..32706047539a 100644
--- a/ext/session/tests/session_regenerate_id_cookie.phpt
+++ b/ext/session/tests/session_regenerate_id_cookie.phpt
@@ -67,14 +67,14 @@ string(%d) "X-Powered-By: PHP/%d.%d.%s
 Expires: %s
 Cache-Control: no-store, no-cache, must-revalidate
 Pragma: no-cache
-Set-Cookie: PHPSESSID=%s; path=/
+Set-Cookie: PHPSESSID=%s; path=/; HttpOnly; SameSite=Lax
 Content-type: text/html; charset=UTF-8
 
 bool(true)
-Set-Cookie: PHPSESSID=%s; path=/
+Set-Cookie: PHPSESSID=%s; path=/; HttpOnly; SameSite=Lax
 bool(true)
 bool(true)
-Set-Cookie: PHPSESSID=%s; path=/
+Set-Cookie: PHPSESSID=%s; path=/; HttpOnly; SameSite=Lax
 bool(true)
 bool(true)
 string(32) "%s"
diff --git a/ext/session/tests/session_set_cookie_params_basic.phpt b/ext/session/tests/session_set_cookie_params_basic.phpt
index 386280d17861..27cfd59b183e 100644
--- a/ext/session/tests/session_set_cookie_params_basic.phpt
+++ b/ext/session/tests/session_set_cookie_params_basic.phpt
@@ -15,7 +15,7 @@ var_dump(session_set_cookie_params(3600));
 var_dump(session_start());
 var_dump(session_set_cookie_params(1800));
 var_dump(session_destroy());
-var_dump(session_set_cookie_params(1234567890));
+var_dump(session_set_cookie_params(1000000000));
 
 echo "Done";
 ob_end_flush();
diff --git a/ext/session/tests/session_set_cookie_params_invalid_ini.phpt b/ext/session/tests/session_set_cookie_params_invalid_ini.phpt
new file mode 100644
index 000000000000..8ebef4a5209d
--- /dev/null
+++ b/ext/session/tests/session_set_cookie_params_invalid_ini.phpt
@@ -0,0 +1,22 @@
+--TEST--
+Test session.cookie_samesite with invalid INI value
+--INI--
+session.cookie_samesite=Invalid
+--EXTENSIONS--
+session
+--SKIPIF--
+
+--FILE--
+
+--EXPECTF--
+Warning: PHP Startup: session.cookie_samesite must be "Strict", "Lax", "None", or "" in Unknown on line 0
+string(3) "Lax"
+Done
diff --git a/ext/session/tests/session_set_cookie_params_variation1.phpt b/ext/session/tests/session_set_cookie_params_variation1.phpt
index ed0b8dc9755d..ce4b98457bea 100644
--- a/ext/session/tests/session_set_cookie_params_variation1.phpt
+++ b/ext/session/tests/session_set_cookie_params_variation1.phpt
@@ -24,7 +24,7 @@ var_dump(ini_get("session.cookie_lifetime"));
 var_dump(session_destroy());
 
 var_dump(ini_get("session.cookie_lifetime"));
-var_dump(session_set_cookie_params(1234567890));
+var_dump(session_set_cookie_params(1000000000));
 var_dump(ini_get("session.cookie_lifetime"));
 
 echo "Done";
@@ -44,5 +44,5 @@ string(4) "3600"
 bool(true)
 string(4) "3600"
 bool(true)
-string(10) "1234567890"
+string(10) "1000000000"
 Done
diff --git a/ext/session/tests/session_set_cookie_params_variation6.phpt b/ext/session/tests/session_set_cookie_params_variation6.phpt
index 61243f82751e..fbf958a0be07 100644
--- a/ext/session/tests/session_set_cookie_params_variation6.phpt
+++ b/ext/session/tests/session_set_cookie_params_variation6.phpt
@@ -1,7 +1,7 @@
 --TEST--
-Test session_set_cookie_params() function : variation
+Test session_set_cookie_params() samesite validation
 --INI--
-session.cookie_samesite=test
+session.cookie_samesite=Lax
 --EXTENSIONS--
 session
 --SKIPIF--
@@ -11,36 +11,56 @@ session
 
 ob_start();
 
-echo "*** Testing session_set_cookie_params() : variation ***\n";
-
+echo "-- Valid values --\n";
 var_dump(ini_get("session.cookie_samesite"));
-var_dump(session_set_cookie_params(["samesite" => "nothing"]));
+var_dump(session_set_cookie_params(["samesite" => "Strict"]));
 var_dump(ini_get("session.cookie_samesite"));
-var_dump(session_start());
+var_dump(session_set_cookie_params(["samesite" => "None"]));
 var_dump(ini_get("session.cookie_samesite"));
-var_dump(session_set_cookie_params(["samesite" => "test"]));
+var_dump(session_set_cookie_params(["samesite" => ""]));
 var_dump(ini_get("session.cookie_samesite"));
-var_dump(session_destroy());
+
+echo "-- Invalid value via session_set_cookie_params --\n";
+var_dump(session_set_cookie_params(["samesite" => "Invalid"]));
 var_dump(ini_get("session.cookie_samesite"));
-var_dump(session_set_cookie_params(["samesite" => "other"]));
+
+echo "-- Invalid value via ini_set --\n";
+var_dump(ini_set("session.cookie_samesite", "Invalid"));
 var_dump(ini_get("session.cookie_samesite"));
 
+echo "-- Cannot change while session is active --\n";
+var_dump(session_set_cookie_params(["samesite" => "Lax"]));
+var_dump(session_start());
+var_dump(session_set_cookie_params(["samesite" => "Strict"]));
+var_dump(session_destroy());
+
 echo "Done";
 ob_end_flush();
 ?>
 --EXPECTF--
-*** Testing session_set_cookie_params() : variation ***
-string(4) "test"
+-- Valid values --
+string(3) "Lax"
 bool(true)
-string(7) "nothing"
+string(6) "Strict"
 bool(true)
-string(7) "nothing"
+string(4) "None"
+bool(true)
+string(0) ""
+-- Invalid value via session_set_cookie_params --
 
-Warning: session_set_cookie_params(): Session cookie parameters cannot be changed when a session is active (started from %s on line %d) in %s on line %d
+Warning: session_set_cookie_params(): session.cookie_samesite must be "Strict", "Lax", "None", or "" in %s on line %d
+bool(false)
+string(0) ""
+-- Invalid value via ini_set --
+
+Warning: ini_set(): session.cookie_samesite must be "Strict", "Lax", "None", or "" in %s on line %d
 bool(false)
-string(7) "nothing"
+string(0) ""
+-- Cannot change while session is active --
 bool(true)
-string(7) "nothing"
 bool(true)
-string(5) "other"
+
+Warning: session_set_cookie_params(): Session cookie parameters cannot be changed when a session is active (started from %s on line %d) in %s on line %d
+bool(false)
+bool(true)
 Done
diff --git a/ext/session/tests/session_set_cookie_params_variation7.phpt b/ext/session/tests/session_set_cookie_params_variation7.phpt
index 430c6efc36e9..3780fc0222f1 100644
--- a/ext/session/tests/session_set_cookie_params_variation7.phpt
+++ b/ext/session/tests/session_set_cookie_params_variation7.phpt
@@ -33,7 +33,7 @@ try {
 
 var_dump(ini_get("session.cookie_secure"));
 var_dump(ini_get("session.cookie_samesite"));
-var_dump(session_set_cookie_params(["secure" => true, "samesite" => "please"]));
+var_dump(session_set_cookie_params(["secure" => true, "samesite" => "Strict"]));
 var_dump(ini_get("session.cookie_secure"));
 var_dump(ini_get("session.cookie_samesite"));
 
@@ -66,7 +66,7 @@ string(1) "0"
 string(0) ""
 bool(true)
 string(1) "1"
-string(6) "please"
+string(6) "Strict"
 string(1) "0"
 bool(true)
 string(2) "42"
diff --git a/ext/session/tests/session_set_cookie_params_variation8.phpt b/ext/session/tests/session_set_cookie_params_variation8.phpt
index 891133b5b01e..1497ded69d5f 100644
--- a/ext/session/tests/session_set_cookie_params_variation8.phpt
+++ b/ext/session/tests/session_set_cookie_params_variation8.phpt
@@ -25,7 +25,7 @@ bool(true)
 string(1) "0"
 string(1) "0"
 
-Warning: session_set_cookie_params(): CookieLifetime cannot be negative in %s on line %d
+Warning: session_set_cookie_params(): session.cookie_lifetime must be between 0 and %d in %s on line %d
 bool(false)
 string(1) "0"
 Done
diff --git a/ext/session/tests/session_start_partitioned_headers.phpt b/ext/session/tests/session_start_partitioned_headers.phpt
index 6fa3815aa85d..4a2c7dcf878f 100644
--- a/ext/session/tests/session_start_partitioned_headers.phpt
+++ b/ext/session/tests/session_start_partitioned_headers.phpt
@@ -2,6 +2,8 @@
 session_start() with partitioned cookies - header test
 --EXTENSIONS--
 session
+--INI--
+session.use_strict_mode=0
 --FILE--
  true, "partitioned" => true]);
 session_start();
 ?>
 --EXPECTHEADERS--
-Set-Cookie: PHPSESSID=12345; path=/; secure; Partitioned
+Set-Cookie: PHPSESSID=12345; path=/; secure; Partitioned; HttpOnly; SameSite=Lax
 --EXPECT--
diff --git a/ext/session/tests/session_str_settings_null_byte.phpt b/ext/session/tests/session_str_settings_null_byte.phpt
new file mode 100644
index 000000000000..693ec6971601
--- /dev/null
+++ b/ext/session/tests/session_str_settings_null_byte.phpt
@@ -0,0 +1,37 @@
+--TEST--
+session.cookie_path, session.cookie_domain, and session.cache_limiter must not contain null bytes
+--EXTENSIONS--
+session
+--SKIPIF--
+
+--FILE--
+
+--EXPECTF--
+Warning: ini_set(): "session.cookie_path" must not contain null bytes in %s on line %d
+bool(false)
+
+Warning: ini_set(): "session.cookie_domain" must not contain null bytes in %s on line %d
+bool(false)
+
+Warning: ini_set(): "session.cache_limiter" must not contain null bytes in %s on line %d
+bool(false)
+
+Warning: session_set_cookie_params(): "session.cookie_path" must not contain null bytes in %s on line %d
+bool(false)
+
+Warning: session_set_cookie_params(): "session.cookie_domain" must not contain null bytes in %s on line %d
+bool(false)
+Done
diff --git a/ext/session/tests/user_session_module/gh_gc_retval_leak.phpt b/ext/session/tests/user_session_module/gh_gc_retval_leak.phpt
new file mode 100644
index 000000000000..f04f36c2276b
--- /dev/null
+++ b/ext/session/tests/user_session_module/gh_gc_retval_leak.phpt
@@ -0,0 +1,33 @@
+--TEST--
+session_gc(): user handler returning non-bool/non-int does not leak memory
+--INI--
+session.gc_probability=0
+session.save_handler=files
+--EXTENSIONS--
+session
+--FILE--
+
+--EXPECTF--
+
+Deprecated: session_set_save_handler(): Providing individual callbacks instead of an object implementing SessionHandlerInterface is deprecated in %s on line %d
+bool(false)
diff --git a/ext/shmop/php_shmop.h b/ext/shmop/php_shmop.h
index 8d1d3cd8fd44..265753ea454a 100644
--- a/ext/shmop/php_shmop.h
+++ b/ext/shmop/php_shmop.h
@@ -1,14 +1,12 @@
 /*
    +----------------------------------------------------------------------+
-   | Copyright (c) The PHP Group                                          |
+   | Copyright © The PHP Group and Contributors.                          |
    +----------------------------------------------------------------------+
-   | This source file is subject to version 3.01 of the PHP license,      |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | https://www.php.net/license/3_01.txt                                 |
-   | If you did not receive a copy of the PHP license and are unable to   |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@php.net so we can mail you a copy immediately.               |
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Authors: Slava Poliakov                          |
    |          Ilia Alshanetsky                          |
diff --git a/ext/shmop/shmop.c b/ext/shmop/shmop.c
index 67f060f3c82c..c3ed217443f4 100644
--- a/ext/shmop/shmop.c
+++ b/ext/shmop/shmop.c
@@ -1,16 +1,12 @@
 /*
    +----------------------------------------------------------------------+
-   | PHP version 7                                                        |
+   | Copyright © The PHP Group and Contributors.                          |
    +----------------------------------------------------------------------+
-   | Copyright (c) The PHP Group                                          |
-   +----------------------------------------------------------------------+
-   | This source file is subject to version 3.01 of the PHP license,      |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | https://www.php.net/license/3_01.txt                                 |
-   | If you did not receive a copy of the PHP license and are unable to   |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@php.net so we can mail you a copy immediately.               |
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Authors: Slava Poliakov                          |
    |          Ilia Alshanetsky                          |
@@ -72,10 +68,7 @@ typedef struct php_shmop
 zend_class_entry *shmop_ce;
 static zend_object_handlers shmop_object_handlers;
 
-static inline php_shmop *shmop_from_obj(zend_object *obj)
-{
-	return (php_shmop *)((char *)(obj) - XtOffsetOf(php_shmop, std));
-}
+#define shmop_from_obj(obj) ZEND_CONTAINER_OF(obj, php_shmop, std)
 
 #define Z_SHMOP_P(zv) shmop_from_obj(Z_OBJ_P(zv))
 
@@ -112,7 +105,7 @@ PHP_MINIT_FUNCTION(shmop)
 	shmop_ce->default_object_handlers = &shmop_object_handlers;
 
 	memcpy(&shmop_object_handlers, &std_object_handlers, sizeof(zend_object_handlers));
-	shmop_object_handlers.offset = XtOffsetOf(php_shmop, std);
+	shmop_object_handlers.offset = offsetof(php_shmop, std);
 	shmop_object_handlers.free_obj = shmop_free_obj;
 	shmop_object_handlers.get_constructor = shmop_get_constructor;
 	shmop_object_handlers.clone_obj = NULL;
diff --git a/ext/simplexml/php_simplexml.h b/ext/simplexml/php_simplexml.h
index 5d16794fa644..f8d78937b9d9 100644
--- a/ext/simplexml/php_simplexml.h
+++ b/ext/simplexml/php_simplexml.h
@@ -1,14 +1,12 @@
 /*
   +----------------------------------------------------------------------+
-  | Copyright (c) The PHP Group                                          |
+  | Copyright © The PHP Group and Contributors.                          |
   +----------------------------------------------------------------------+
-  | This source file is subject to version 3.01 of the PHP license,      |
-  | that is bundled with this package in the file LICENSE, and is        |
-  | available through the world-wide-web at the following url:           |
-  | https://www.php.net/license/3_01.txt                                 |
-  | If you did not receive a copy of the PHP license and are unable to   |
-  | obtain it through the world-wide-web, please send a note to          |
-  | license@php.net so we can mail you a copy immediately.               |
+  | This source file is subject to the Modified BSD License that is      |
+  | bundled with this package in the file LICENSE, and is available      |
+  | through the World Wide Web at .        |
+  |                                                                      |
+  | SPDX-License-Identifier: BSD-3-Clause                                |
   +----------------------------------------------------------------------+
   | Author: Sterling Hughes                            |
   +----------------------------------------------------------------------+
diff --git a/ext/simplexml/php_simplexml_exports.h b/ext/simplexml/php_simplexml_exports.h
index 4ae02674d6da..fb940f2fbc77 100644
--- a/ext/simplexml/php_simplexml_exports.h
+++ b/ext/simplexml/php_simplexml_exports.h
@@ -1,14 +1,12 @@
 /*
   +----------------------------------------------------------------------+
-  | Copyright (c) The PHP Group                                          |
+  | Copyright © The PHP Group and Contributors.                          |
   +----------------------------------------------------------------------+
-  | This source file is subject to version 3.01 of the PHP license,      |
-  | that is bundled with this package in the file LICENSE, and is        |
-  | available through the world-wide-web at the following url:           |
-  | https://www.php.net/license/3_01.txt                                 |
-  | If you did not receive a copy of the PHP license and are unable to   |
-  | obtain it through the world-wide-web, please send a note to          |
-  | license@php.net so we can mail you a copy immediately.               |
+  | This source file is subject to the Modified BSD License that is      |
+  | bundled with this package in the file LICENSE, and is available      |
+  | through the World Wide Web at .        |
+  |                                                                      |
+  | SPDX-License-Identifier: BSD-3-Clause                                |
   +----------------------------------------------------------------------+
   | Author: Sterling Hughes                            |
   |         Marcus Boerger                                |
@@ -37,10 +35,7 @@
 
 PHP_SXE_API zend_object *sxe_object_new(zend_class_entry *ce);
 
-static inline php_sxe_object *php_sxe_fetch_object(zend_object *obj) /* {{{ */ {
-	return (php_sxe_object *)((char*)(obj) - XtOffsetOf(php_sxe_object, zo));
-}
-/* }}} */
+#define php_sxe_fetch_object(obj) ZEND_CONTAINER_OF(obj, php_sxe_object, zo)
 
 #define Z_SXEOBJ_P(zv) php_sxe_fetch_object(Z_OBJ_P((zv)))
 
diff --git a/ext/simplexml/simplexml.c b/ext/simplexml/simplexml.c
index 5c39b8e656f5..d86198c7639e 100644
--- a/ext/simplexml/simplexml.c
+++ b/ext/simplexml/simplexml.c
@@ -1,14 +1,12 @@
 /*
   +----------------------------------------------------------------------+
-  | Copyright (c) The PHP Group                                          |
+  | Copyright © The PHP Group and Contributors.                          |
   +----------------------------------------------------------------------+
-  | This source file is subject to version 3.01 of the PHP license,      |
-  | that is bundled with this package in the file LICENSE, and is        |
-  | available through the world-wide-web at the following url:           |
-  | https://www.php.net/license/3_01.txt                                 |
-  | If you did not receive a copy of the PHP license and are unable to   |
-  | obtain it through the world-wide-web, please send a note to          |
-  | license@php.net so we can mail you a copy immediately.               |
+  | This source file is subject to the Modified BSD License that is      |
+  | bundled with this package in the file LICENSE, and is available      |
+  | through the World Wide Web at .        |
+  |                                                                      |
+  | SPDX-License-Identifier: BSD-3-Clause                                |
   +----------------------------------------------------------------------+
   | Authors: Sterling Hughes                           |
   |          Marcus Boerger                               |
@@ -2633,7 +2631,7 @@ PHP_MINIT_FUNCTION(simplexml)
 	ce_SimpleXMLElement->get_iterator = php_sxe_get_iterator;
 
 	memcpy(&sxe_object_handlers, &std_object_handlers, sizeof(zend_object_handlers));
-	sxe_object_handlers.offset = XtOffsetOf(php_sxe_object, zo);
+	sxe_object_handlers.offset = offsetof(php_sxe_object, zo);
 	sxe_object_handlers.free_obj = sxe_object_free_storage;
 	sxe_object_handlers.clone_obj = sxe_object_clone;
 	sxe_object_handlers.read_property = sxe_property_read;
diff --git a/ext/simplexml/simplexml.stub.php b/ext/simplexml/simplexml.stub.php
index 935af16621e9..6faf873c885f 100644
--- a/ext/simplexml/simplexml.stub.php
+++ b/ext/simplexml/simplexml.stub.php
@@ -51,7 +51,7 @@ public function getName(): string {}
 
     public function __toString(): string {}
 
-    public function __debugInfo(): ?array {}
+    public function __debugInfo(): array {}
 
     /** @tentative-return-type */
     public function count(): int {}
diff --git a/ext/simplexml/simplexml_arginfo.h b/ext/simplexml/simplexml_arginfo.h
index 419c7874fbc5..5a62efbc7be5 100644
--- a/ext/simplexml/simplexml_arginfo.h
+++ b/ext/simplexml/simplexml_arginfo.h
@@ -1,5 +1,5 @@
 /* This is a generated file, edit simplexml.stub.php instead.
- * Stub hash: cee51320f0f09f14962fb72125ef8ff6073a642a */
+ * Stub hash: 83f1bd204b309a4558c1b09128fe29f972f54252 */
 
 ZEND_BEGIN_ARG_WITH_RETURN_OBJ_TYPE_MASK_EX(arginfo_simplexml_load_file, 0, 1, SimpleXMLElement, MAY_BE_FALSE)
 	ZEND_ARG_TYPE_INFO(0, filename, IS_STRING, 0)
@@ -79,7 +79,7 @@ ZEND_END_ARG_INFO()
 ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_class_SimpleXMLElement___toString, 0, 0, IS_STRING, 0)
 ZEND_END_ARG_INFO()
 
-ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_class_SimpleXMLElement___debugInfo, 0, 0, IS_ARRAY, 1)
+ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_class_SimpleXMLElement___debugInfo, 0, 0, IS_ARRAY, 0)
 ZEND_END_ARG_INFO()
 
 ZEND_BEGIN_ARG_WITH_TENTATIVE_RETURN_TYPE_INFO_EX(arginfo_class_SimpleXMLElement_count, 0, 0, IS_LONG, 0)
diff --git a/ext/snmp/config.w32 b/ext/snmp/config.w32
index 0e3887c0de68..bf63e89a9607 100644
--- a/ext/snmp/config.w32
+++ b/ext/snmp/config.w32
@@ -9,6 +9,7 @@ if (PHP_SNMP != "no") {
 			EXTENSION('snmp', 'snmp.c');
 			ADD_EXTENSION_DEP('snmp', 'spl');
 			AC_DEFINE('HAVE_SNMP', 1, "Define to 1 if the PHP extension 'snmp' is available.");
+			AC_DEFINE('HAVE_SHUTDOWN_SNMP_LOGGING', 1, "Define to 1 if SNMP library has the 'shutdown_snmp_logging' function.");
 		} else {
 			WARNING("snmp not enabled; libraries and headers not found");
 		}
diff --git a/ext/snmp/php_snmp.h b/ext/snmp/php_snmp.h
index ce9849588b19..d889eb37ab95 100644
--- a/ext/snmp/php_snmp.h
+++ b/ext/snmp/php_snmp.h
@@ -1,14 +1,12 @@
 /*
   +----------------------------------------------------------------------+
-  | Copyright (c) The PHP Group                                          |
+  | Copyright © The PHP Group and Contributors.                          |
   +----------------------------------------------------------------------+
-  | This source file is subject to version 3.01 of the PHP license,      |
-  | that is bundled with this package in the file LICENSE, and is        |
-  | available through the world-wide-web at the following url:           |
-  | https://www.php.net/license/3_01.txt                                 |
-  | If you did not receive a copy of the PHP license and are unable to   |
-  | obtain it through the world-wide-web, please send a note to          |
-  | license@php.net so we can mail you a copy immediately.               |
+  | This source file is subject to the Modified BSD License that is      |
+  | bundled with this package in the file LICENSE, and is available      |
+  | through the World Wide Web at .        |
+  |                                                                      |
+  | SPDX-License-Identifier: BSD-3-Clause                                |
   +----------------------------------------------------------------------+
   | Authors: Rasmus Lerdorf                              |
   |          Mike Jackson                             |
@@ -58,9 +56,7 @@ typedef struct _php_snmp_object {
 	zend_object zo;
 } php_snmp_object;
 
-static inline php_snmp_object *php_snmp_fetch_object(zend_object *obj) {
-	return (php_snmp_object *)((char*)(obj) - XtOffsetOf(php_snmp_object, zo));
-}
+#define php_snmp_fetch_object(obj) ZEND_CONTAINER_OF(obj, php_snmp_object, zo)
 
 #define Z_SNMP_P(zv) php_snmp_fetch_object(Z_OBJ_P((zv)))
 
diff --git a/ext/snmp/snmp.c b/ext/snmp/snmp.c
index 1daa51851fb6..84f7cad13f74 100644
--- a/ext/snmp/snmp.c
+++ b/ext/snmp/snmp.c
@@ -1,14 +1,12 @@
 /*
    +----------------------------------------------------------------------+
-   | Copyright (c) The PHP Group                                          |
+   | Copyright © The PHP Group and Contributors.                          |
    +----------------------------------------------------------------------+
-   | This source file is subject to version 3.01 of the PHP license,      |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | https://www.php.net/license/3_01.txt                                 |
-   | If you did not receive a copy of the PHP license and are unable to   |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@php.net so we can mail you a copy immediately.               |
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Authors: Rasmus Lerdorf                              |
    |          Mike Jackson                             |
@@ -626,7 +624,7 @@ static void php_snmp_internal(INTERNAL_FUNCTION_PARAMETERS, int st,
 
 static void php_snmp_zend_string_release_from_char_pointer(char *ptr) {
 	if (ptr) {
-		zend_string *pptr = (zend_string *)(ptr - XtOffsetOf(zend_string, val));
+		zend_string *pptr = (zend_string *)(ptr - offsetof(zend_string, val));
 		zend_string_release(pptr);
 	}
 }
@@ -655,7 +653,8 @@ static void php_free_objid_query(struct objid_query *objid_query, HashTable* oid
 */
 static bool php_snmp_parse_oid(
 	zval *object, int st, struct objid_query *objid_query, zend_string *oid_str, HashTable *oid_ht,
-	zend_string *type_str, HashTable *type_ht, zend_string *value_str, HashTable *value_ht
+	zend_string *type_str, HashTable *type_ht, zend_string *value_str, HashTable *value_ht,
+	uint32_t oid_arg_num, uint32_t type_arg_num, uint32_t value_arg_num
 ) {
 	char *pptr;
 	uint32_t idx_type = 0, idx_value = 0;
@@ -682,7 +681,7 @@ static bool php_snmp_parse_oid(
 			ZEND_ASSERT(type_str && value_str);
 
 			if (ZSTR_LEN(type_str) != 1) {
-				zend_value_error("Type must be a single character");
+				zend_argument_value_error(type_arg_num, "must be a single character");
 				efree(objid_query->vars);
 				return false;
 			}
@@ -693,7 +692,7 @@ static bool php_snmp_parse_oid(
 		objid_query->count++;
 	} else if (oid_ht) { /* we got objid array */
 		if (zend_hash_num_elements(oid_ht) == 0) {
-			zend_value_error("Array of object IDs must not be empty");
+			zend_argument_value_error(oid_arg_num, "must not be empty when passed as an array");
 			return false;
 		}
 		objid_query->vars = (snmpobjarg *)safe_emalloc(sizeof(snmpobjarg), zend_hash_num_elements(oid_ht), 0);
@@ -738,14 +737,14 @@ static bool php_snmp_parse_oid(
 						char ptype = *ZSTR_VAL(type);
 						zend_string_release(type);
 						if (len != 1) {
-							zend_value_error("Type must be a single character");
+							zend_argument_value_error(type_arg_num, "must be a single character");
 							php_free_objid_query(objid_query, oid_ht, value_ht, st);
 							return false;
 						}
 						objid_query->vars[objid_query->count].type = ptype;
 						idx_type++;
 					} else {
-						php_error_docref(NULL, E_WARNING, "'%s': no type set", ZSTR_VAL(tmp));
+						zend_argument_value_error(type_arg_num, "must contain a type for object ID '%s'", ZSTR_VAL(tmp));
 						php_free_objid_query(objid_query, oid_ht, value_ht, st);
 						return false;
 					}
@@ -780,7 +779,7 @@ static bool php_snmp_parse_oid(
 						objid_query->vars[objid_query->count].value = ZSTR_VAL(tmp);
 						idx_value++;
 					} else {
-						php_error_docref(NULL, E_WARNING, "'%s': no value set", ZSTR_VAL(tmp));
+						zend_argument_value_error(value_arg_num, "must contain a value for object ID '%s'", ZSTR_VAL(tmp));
 						php_free_objid_query(objid_query, oid_ht, value_ht, st);
 						return false;
 					}
@@ -827,7 +826,7 @@ static bool php_snmp_parse_oid(
 /* {{{ snmp_session_init
 	allocates memory for session and session->peername, caller should free it manually using snmp_session_free() and efree()
 */
-static bool snmp_session_init(php_snmp_session **session_p, int version, zend_string *hostname, zend_string *community, zend_long timeout, zend_long retries, int timeout_argument_offset)
+static bool snmp_session_init(php_snmp_session **session_p, int version, zend_string *hostname, zend_string *community, zend_long timeout, zend_long retries, uint32_t hostname_arg_num, uint32_t timeout_arg_num)
 {
 	php_snmp_session *session;
 	char *pptr, *host_ptr;
@@ -841,34 +840,24 @@ static bool snmp_session_init(php_snmp_session **session_p, int version, zend_st
 	ZEND_ASSERT(hostname != NULL);
 	ZEND_ASSERT(community != NULL);
 
-	if (zend_str_has_nul_byte(hostname)) {
-		zend_argument_value_error(2, "must not contain any null bytes");
-		return false;
-	}
-
 	if (ZSTR_LEN(hostname) >= MAX_NAME_LEN) {
-		zend_argument_value_error(2, "length must be lower than %d", MAX_NAME_LEN);
-		return false;
-	}
-
-	if (zend_str_has_nul_byte(community)) {
-		zend_argument_value_error(3, "must not contain any null bytes");
+		zend_argument_value_error(hostname_arg_num, "length must be lower than %d", MAX_NAME_LEN);
 		return false;
 	}
 
 	if (ZSTR_LEN(community) == 0) {
-		zend_argument_must_not_be_empty_error(3);
+		zend_argument_must_not_be_empty_error(hostname_arg_num + 1);
 		return false;
 	}
 
-	if (timeout_argument_offset != -1) {
+	if (timeout_arg_num != 0) {
 		if (timeout < -1 || timeout > LONG_MAX) {
-			zend_argument_value_error(timeout_argument_offset, "must be between -1 and %ld", LONG_MAX);
+			zend_argument_value_error(timeout_arg_num, "must be between -1 and %ld", LONG_MAX);
 			return false;
 		}
 
 		if (retries < -1 || retries > INT_MAX) {
-			zend_argument_value_error(timeout_argument_offset + 1, "must be between -1 and %d", INT_MAX);
+			zend_argument_value_error(timeout_arg_num + 1, "must be between -1 and %d", INT_MAX);
 			return false;
 		}
 	}
@@ -899,14 +888,14 @@ static bool snmp_session_init(php_snmp_session **session_p, int version, zend_st
 				char *pport = pptr + 2;
 				tmp_port = atoi(pport);
 				if (tmp_port < 0 || tmp_port > USHRT_MAX) {
-					zend_argument_value_error(2, "remote port must be between 0 and %u", USHRT_MAX);
+					zend_argument_value_error(hostname_arg_num, "remote port must be between 0 and %u", USHRT_MAX);
 					return false;
 				}
 				remote_port = (unsigned short)tmp_port;
 			}
 			*pptr = '\0';
 		} else {
-			php_error_docref(NULL, E_WARNING, "Malformed IPv6 address, closing square bracket missing");
+			zend_argument_value_error(hostname_arg_num, "has a malformed IPv6 address, closing square bracket missing");
 			return false;
 		}
 	} else { /* IPv4 address */
@@ -914,7 +903,7 @@ static bool snmp_session_init(php_snmp_session **session_p, int version, zend_st
 			char *pport = pptr + 1;
 			tmp_port = atoi(pport);
 			if (tmp_port < 0 || tmp_port > USHRT_MAX) {
-				zend_argument_value_error(2, "remote port must be between 0 and %u", USHRT_MAX);
+				zend_argument_value_error(hostname_arg_num, "remote port must be between 0 and %u", USHRT_MAX);
 				return false;
 			}
 			remote_port = (unsigned short)tmp_port;
@@ -956,6 +945,7 @@ static bool snmp_session_init(php_snmp_session **session_p, int version, zend_st
 
 	if (strlen(session->peername) == 0) {
 		php_error_docref(NULL, E_WARNING, "Unknown failure while resolving '%s'", ZSTR_VAL(hostname));
+		php_network_freeaddresses(psal);
 		return false;
 	}
 	/* XXX FIXME
@@ -1123,14 +1113,13 @@ static ZEND_ATTRIBUTE_NONNULL bool snmp_session_gen_sec_key(struct snmp_session
 /* }}} */
 
 /* {{{ Set context Engine Id in the snmpv3 session */
-static bool snmp_session_set_contextEngineID(struct snmp_session *s, zend_string * contextEngineID)
+static bool snmp_session_set_contextEngineID(struct snmp_session *s, zend_string *contextEngineID, uint32_t context_engine_id_arg_num)
 {
 	size_t	ebuf_len = 32, eout_len = 0;
 	uint8_t	*ebuf = (uint8_t *) emalloc(ebuf_len);
 
 	if (!snmp_hex_to_binary(&ebuf, &ebuf_len, &eout_len, 1, ZSTR_VAL(contextEngineID))) {
-		// TODO Promote to Error?
-		php_error_docref(NULL, E_WARNING, "Bad engine ID value '%s'", ZSTR_VAL(contextEngineID));
+		zend_argument_value_error(context_engine_id_arg_num, "must be a valid context engine ID");
 		efree(ebuf);
 		return false;
 	}
@@ -1145,11 +1134,14 @@ static bool snmp_session_set_contextEngineID(struct snmp_session *s, zend_string
 }
 /* }}} */
 
-/* {{{ Set all snmpv3-related security options */
+/* {{{ Set all snmpv3-related security options
+ * auth_protocol_arg_num and context_engine_id_arg_num are the userland
+ * argument numbers used for error reporting.
+ */
 static ZEND_ATTRIBUTE_NONNULL_ARGS(2) bool snmp_session_set_security(struct snmp_session *session, zend_string *sec_level,
 	zend_string *auth_protocol, zend_string *auth_passphrase, zend_string *priv_protocol,
 	zend_string *priv_passphrase, zend_string *contextName, zend_string *contextEngineID,
-	uint32_t auth_protocol_argnum)
+	uint32_t auth_protocol_arg_num, uint32_t context_engine_id_arg_num)
 {
 
 	/* Setting the security level. */
@@ -1161,7 +1153,7 @@ static ZEND_ATTRIBUTE_NONNULL_ARGS(2) bool snmp_session_set_security(struct snmp
 	if (session->securityLevel == SNMP_SEC_LEVEL_AUTHNOPRIV || session->securityLevel == SNMP_SEC_LEVEL_AUTHPRIV) {
 
 		if (!auth_protocol) {
-			zend_argument_value_error(auth_protocol_argnum, "cannot be null when security level is \"authNoPriv\" or \"authPriv\"");
+			zend_argument_value_error(auth_protocol_arg_num, "cannot be null when security level is \"authNoPriv\" or \"authPriv\"");
 			return false;
 		}
 
@@ -1172,7 +1164,7 @@ static ZEND_ATTRIBUTE_NONNULL_ARGS(2) bool snmp_session_set_security(struct snmp
 		}
 
 		if (!auth_passphrase) {
-			zend_argument_value_error(auth_protocol_argnum + 1, "cannot be null when security level is \"authNoPriv\" or \"authPriv\"");
+			zend_argument_value_error(auth_protocol_arg_num + 1, "cannot be null when security level is \"authNoPriv\" or \"authPriv\"");
 			return false;
 		}
 
@@ -1185,7 +1177,7 @@ static ZEND_ATTRIBUTE_NONNULL_ARGS(2) bool snmp_session_set_security(struct snmp
 		if (session->securityLevel == SNMP_SEC_LEVEL_AUTHPRIV) {
 
 			if (!priv_protocol) {
-				zend_argument_value_error(auth_protocol_argnum + 2, "cannot be null when security level is \"authPriv\"");
+				zend_argument_value_error(auth_protocol_arg_num + 2, "cannot be null when security level is \"authPriv\"");
 				return false;
 			}
 
@@ -1196,7 +1188,7 @@ static ZEND_ATTRIBUTE_NONNULL_ARGS(2) bool snmp_session_set_security(struct snmp
 			}
 
 			if (!priv_passphrase) {
-				zend_argument_value_error(auth_protocol_argnum + 3, "cannot be null when security level is \"authPriv\"");
+				zend_argument_value_error(auth_protocol_arg_num + 3, "cannot be null when security level is \"authPriv\"");
 				return false;
 			}
 
@@ -1215,7 +1207,7 @@ static ZEND_ATTRIBUTE_NONNULL_ARGS(2) bool snmp_session_set_security(struct snmp
 	}
 
 	/* Setting contextEngineIS if specified */
-	if (contextEngineID && ZSTR_LEN(contextEngineID) && !snmp_session_set_contextEngineID(session, contextEngineID)) {
+	if (contextEngineID && ZSTR_LEN(contextEngineID) && !snmp_session_set_contextEngineID(session, contextEngineID, context_engine_id_arg_num)) {
 		/* Warning message sent already, just bail out */
 		return false;
 	}
@@ -1235,14 +1227,17 @@ static void php_snmp(INTERNAL_FUNCTION_PARAMETERS, int st, int version)
 {
 	zend_string *oid_str, *type_str = NULL, *value_str = NULL;
 	HashTable *oid_ht, *type_ht = NULL, *value_ht = NULL;
-	zend_string *a1 = NULL, *a2 = NULL, *a3 = NULL, *a4 = NULL, *a5 = NULL, *a6 = NULL, *a7 = NULL;
+	zend_string *hostname = NULL, *community_or_security_name = NULL;
+	zend_string *security_level = NULL, *auth_protocol = NULL, *auth_passphrase = NULL;
+	zend_string *privacy_protocol = NULL, *privacy_passphrase = NULL;
 	bool use_orignames = 0, suffix_keys = 0;
 	zend_long timeout = SNMP_DEFAULT_TIMEOUT;
 	zend_long retries = SNMP_DEFAULT_RETRIES;
 	struct objid_query objid_query;
 	php_snmp_session *session;
 	int session_less_mode = (getThis() == NULL);
-	int timeout_argument_offset = -1;
+	uint32_t timeout_arg_num = 0;
+	uint32_t oid_arg_num = 1, type_arg_num = 0, value_arg_num = 0;
 	php_snmp_object *snmp_object;
 	php_snmp_object glob_snmp_object;
 
@@ -1255,13 +1250,13 @@ static void php_snmp(INTERNAL_FUNCTION_PARAMETERS, int st, int version)
 		if (version == SNMP_VERSION_3) {
 			if (st & SNMP_CMD_SET) {
 				ZEND_PARSE_PARAMETERS_START(10, 12)
-					Z_PARAM_STR(a1)
-					Z_PARAM_STR(a2)
-					Z_PARAM_STR(a3)
-					Z_PARAM_STR(a4)
-					Z_PARAM_STR(a5)
-					Z_PARAM_STR(a6)
-					Z_PARAM_STR(a7)
+					Z_PARAM_PATH_STR(hostname)
+					Z_PARAM_PATH_STR(community_or_security_name)
+					Z_PARAM_STR(security_level)
+					Z_PARAM_STR(auth_protocol)
+					Z_PARAM_STR(auth_passphrase)
+					Z_PARAM_STR(privacy_protocol)
+					Z_PARAM_STR(privacy_passphrase)
 					Z_PARAM_ARRAY_HT_OR_STR(oid_ht, oid_str)
 					Z_PARAM_ARRAY_HT_OR_STR(type_ht, type_str)
 					Z_PARAM_ARRAY_HT_OR_STR(value_ht, value_str)
@@ -1270,33 +1265,37 @@ static void php_snmp(INTERNAL_FUNCTION_PARAMETERS, int st, int version)
 					Z_PARAM_LONG(retries)
 				ZEND_PARSE_PARAMETERS_END();
 
-				timeout_argument_offset = 10;
+				timeout_arg_num = 10;
+				oid_arg_num = 8;
+				type_arg_num = 9;
+				value_arg_num = 10;
 			} else {
 				/* SNMP_CMD_GET
 				 * SNMP_CMD_GETNEXT
 				 * SNMP_CMD_WALK
 				 */
 				ZEND_PARSE_PARAMETERS_START(8, 10)
-					Z_PARAM_STR(a1)
-					Z_PARAM_STR(a2)
-					Z_PARAM_STR(a3)
-					Z_PARAM_STR(a4)
-					Z_PARAM_STR(a5)
-					Z_PARAM_STR(a6)
-					Z_PARAM_STR(a7)
+					Z_PARAM_PATH_STR(hostname)
+					Z_PARAM_PATH_STR(community_or_security_name)
+					Z_PARAM_STR(security_level)
+					Z_PARAM_STR(auth_protocol)
+					Z_PARAM_STR(auth_passphrase)
+					Z_PARAM_STR(privacy_protocol)
+					Z_PARAM_STR(privacy_passphrase)
 					Z_PARAM_ARRAY_HT_OR_STR(oid_ht, oid_str)
 					Z_PARAM_OPTIONAL
 					Z_PARAM_LONG(timeout)
 					Z_PARAM_LONG(retries)
 				ZEND_PARSE_PARAMETERS_END();
 
-				timeout_argument_offset = 9;
+				timeout_arg_num = 9;
+				oid_arg_num = 8;
 			}
 		} else {
 			if (st & SNMP_CMD_SET) {
 				ZEND_PARSE_PARAMETERS_START(5, 7)
-					Z_PARAM_STR(a1)
-					Z_PARAM_STR(a2)
+					Z_PARAM_PATH_STR(hostname)
+					Z_PARAM_PATH_STR(community_or_security_name)
 					Z_PARAM_ARRAY_HT_OR_STR(oid_ht, oid_str)
 					Z_PARAM_ARRAY_HT_OR_STR(type_ht, type_str)
 					Z_PARAM_ARRAY_HT_OR_STR(value_ht, value_str)
@@ -1305,22 +1304,26 @@ static void php_snmp(INTERNAL_FUNCTION_PARAMETERS, int st, int version)
 					Z_PARAM_LONG(retries)
 				ZEND_PARSE_PARAMETERS_END();
 
-				timeout_argument_offset = 6;
+				timeout_arg_num = 6;
+				oid_arg_num = 3;
+				type_arg_num = 4;
+				value_arg_num = 5;
 			} else {
 				/* SNMP_CMD_GET
 				 * SNMP_CMD_GETNEXT
 				 * SNMP_CMD_WALK
 				 */
 				ZEND_PARSE_PARAMETERS_START(3, 5)
-					Z_PARAM_STR(a1)
-					Z_PARAM_STR(a2)
+					Z_PARAM_PATH_STR(hostname)
+					Z_PARAM_PATH_STR(community_or_security_name)
 					Z_PARAM_ARRAY_HT_OR_STR(oid_ht, oid_str)
 					Z_PARAM_OPTIONAL
 					Z_PARAM_LONG(timeout)
 					Z_PARAM_LONG(retries)
 				ZEND_PARSE_PARAMETERS_END();
 
-				timeout_argument_offset = 4;
+				timeout_arg_num = 4;
+				oid_arg_num = 3;
 			}
 		}
 	} else {
@@ -1330,6 +1333,8 @@ static void php_snmp(INTERNAL_FUNCTION_PARAMETERS, int st, int version)
 				Z_PARAM_ARRAY_HT_OR_STR(type_ht, type_str)
 				Z_PARAM_ARRAY_HT_OR_STR(value_ht, value_str)
 			ZEND_PARSE_PARAMETERS_END();
+			type_arg_num = 2;
+			value_arg_num = 3;
 		} else if (st & SNMP_CMD_WALK) {
 			ZEND_PARSE_PARAMETERS_START(1, 4)
 				Z_PARAM_ARRAY_HT_OR_STR(oid_ht, oid_str)
@@ -1359,20 +1364,21 @@ static void php_snmp(INTERNAL_FUNCTION_PARAMETERS, int st, int version)
 		}
 	}
 
-	if (!php_snmp_parse_oid(getThis(), st, &objid_query, oid_str, oid_ht, type_str, type_ht, value_str, value_ht)) {
+	if (!php_snmp_parse_oid(getThis(), st, &objid_query, oid_str, oid_ht, type_str, type_ht, value_str, value_ht,
+			oid_arg_num, type_arg_num, value_arg_num)) {
 		RETURN_FALSE;
 	}
 
 	if (session_less_mode) {
-		if (!snmp_session_init(&session, version, a1, a2, timeout, retries, timeout_argument_offset)) {
+		if (!snmp_session_init(&session, version, hostname, community_or_security_name, timeout, retries, 1, timeout_arg_num)) {
 			php_free_objid_query(&objid_query, oid_ht, value_ht, st);
 			snmp_session_free(&session);
 			RETURN_FALSE;
 		}
-		if (version == SNMP_VERSION_3 && !snmp_session_set_security(session, a3, a4, a5, a6, a7, NULL, NULL, 4)) {
+		if (version == SNMP_VERSION_3 && !snmp_session_set_security(session, security_level, auth_protocol, auth_passphrase, privacy_protocol, privacy_passphrase, NULL, NULL, 4, 0)) {
 			php_free_objid_query(&objid_query, oid_ht, value_ht, st);
 			snmp_session_free(&session);
-			/* Warning message sent already, just bail out */
+			/* An error has already been emitted, just bail out. */
 			RETURN_FALSE;
 		}
 	} else {
@@ -1645,7 +1651,7 @@ PHP_METHOD(SNMP, __construct)
 
 	snmp_object = Z_SNMP_P(object);
 
-	if (zend_parse_parameters(ZEND_NUM_ARGS(), "lSS|ll", &version, &a1, &a2, &timeout, &retries) == FAILURE) {
+	if (zend_parse_parameters(ZEND_NUM_ARGS(), "lPP|ll", &version, &a1, &a2, &timeout, &retries) == FAILURE) {
 		RETURN_THROWS();
 	}
 
@@ -1664,7 +1670,7 @@ PHP_METHOD(SNMP, __construct)
 		snmp_session_free(&(snmp_object->session));
 	}
 
-	if (!snmp_session_init(&(snmp_object->session), version, a1, a2, timeout, retries, 4)) {
+	if (!snmp_session_init(&(snmp_object->session), version, a1, a2, timeout, retries, 2, 4)) {
 		return;
 	}
 	snmp_object->max_oids = 0;
@@ -1726,7 +1732,11 @@ PHP_METHOD(SNMP, setSecurity)
 {
 	php_snmp_object *snmp_object;
 	zval *object = ZEND_THIS;
-	zend_string *a1 = NULL, *a2 = NULL, *a3 = NULL, *a4 = NULL, *a5 = NULL, *a6 = NULL, *a7 = NULL;
+	zend_string *security_level = NULL, *auth_protocol = NULL, *auth_passphrase = NULL;
+	zend_string *privacy_protocol = NULL, *privacy_passphrase = NULL;
+	zend_string *context_name = NULL, *context_engine_id = NULL;
+	uint32_t auth_protocol_arg_num = 2;
+	uint32_t context_engine_id_arg_num = 7;
 
 	snmp_object = Z_SNMP_P(object);
 	if (!snmp_object->session) {
@@ -1734,12 +1744,12 @@ PHP_METHOD(SNMP, setSecurity)
 		RETURN_THROWS();
 	}
 
-	if (zend_parse_parameters(ZEND_NUM_ARGS(), "S|SSSSSS", &a1, &a2, &a3, &a4,&a5, &a6, &a7) == FAILURE) {
+	if (zend_parse_parameters(ZEND_NUM_ARGS(), "S|SSSSSS", &security_level, &auth_protocol, &auth_passphrase, &privacy_protocol, &privacy_passphrase, &context_name, &context_engine_id) == FAILURE) {
 		RETURN_THROWS();
 	}
 
-	if (!snmp_session_set_security(snmp_object->session, a1, a2, a3, a4, a5, a6, a7, 2)) {
-		/* Warning message sent already, just bail out */
+	if (!snmp_session_set_security(snmp_object->session, security_level, auth_protocol, auth_passphrase, privacy_protocol, privacy_passphrase, context_name, context_engine_id, auth_protocol_arg_num, context_engine_id_arg_num)) {
+		/* An error has already been emitted, just bail out. */
 		RETURN_FALSE;
 	}
 	RETURN_TRUE;
@@ -2135,7 +2145,7 @@ PHP_MINIT_FUNCTION(snmp)
 	php_snmp_ce = register_class_SNMP();
 	php_snmp_ce->create_object = php_snmp_object_new;
 	php_snmp_ce->default_object_handlers = &php_snmp_object_handlers;
-	php_snmp_object_handlers.offset = XtOffsetOf(php_snmp_object, zo);
+	php_snmp_object_handlers.offset = offsetof(php_snmp_object, zo);
 	php_snmp_object_handlers.clone_obj = NULL;
 	php_snmp_object_handlers.free_obj = php_snmp_object_free_storage;
 
diff --git a/ext/snmp/tests/gh16959.phpt b/ext/snmp/tests/gh16959.phpt
index cabe0eb84b6c..f76fa61e1f73 100644
--- a/ext/snmp/tests/gh16959.phpt
+++ b/ext/snmp/tests/gh16959.phpt
@@ -66,5 +66,5 @@ array(4) {
 }
 Object of class stdClass could not be converted to string
 Object of class stdClass could not be converted to string
-Type must be a single character
-Type must be a single character
+snmp2_set(): Argument #4 ($type) must be a single character
+snmp2_set(): Argument #4 ($type) must be a single character
diff --git a/ext/snmp/tests/ipv6.phpt b/ext/snmp/tests/ipv6.phpt
index c305fb15d4b8..93274fd7054f 100644
--- a/ext/snmp/tests/ipv6.phpt
+++ b/ext/snmp/tests/ipv6.phpt
@@ -22,10 +22,12 @@ snmp_set_quick_print(false);
 snmp_set_valueretrieval(SNMP_VALUE_PLAIN);
 
 var_dump(snmpget($hostname6_port, $community, '.1.3.6.1.2.1.1.1.0'));
-var_dump(snmpget('[dead:beef::', $community, '.1.3.6.1.2.1.1.1.0'));
+try {
+    var_dump(snmpget('[dead:beef::', $community, '.1.3.6.1.2.1.1.1.0'));
+} catch (\ValueError $e) {
+    echo $e->getMessage() . \PHP_EOL;
+}
 ?>
 --EXPECTF--
 string(%d) "%s"
-
-Warning: snmpget(): Malformed IPv6 address, closing square bracket missing in %s on line %d
-bool(false)
+snmpget(): Argument #1 ($hostname) has a malformed IPv6 address, closing square bracket missing
diff --git a/ext/snmp/tests/snmp-object-setSecurity_error.phpt b/ext/snmp/tests/snmp-object-setSecurity_error.phpt
index cf4f92883777..576ec8380804 100644
--- a/ext/snmp/tests/snmp-object-setSecurity_error.phpt
+++ b/ext/snmp/tests/snmp-object-setSecurity_error.phpt
@@ -53,7 +53,11 @@ try {
 
 var_dump($session->setSecurity('authPriv', 'MD5', $auth_pass, 'AES', ''));
 var_dump($session->setSecurity('authPriv', 'MD5', $auth_pass, 'AES', 'ty'));
-var_dump($session->setSecurity('authPriv', 'MD5', $auth_pass, 'AES', 'test12345', 'context', 'dsa'));
+try {
+    var_dump($session->setSecurity('authPriv', 'MD5', $auth_pass, 'AES', 'test12345', 'context', 'dsa'));
+} catch (\ValueError $e) {
+    echo $e->getMessage() . \PHP_EOL;
+}
 
 var_dump($session->close());
 
@@ -76,7 +80,5 @@ bool(false)
 
 Warning: SNMP::setSecurity(): Error generating a key for privacy pass phrase 'ty': Generic error (The supplied password length is too short.) in %s on line %d
 bool(false)
-
-Warning: SNMP::setSecurity(): Bad engine ID value 'dsa' in %s on line %d
-bool(false)
+SNMP::setSecurity(): Argument #7 ($contextEngineId) must be a valid context engine ID
 bool(true)
diff --git a/ext/snmp/tests/snmp2_get.phpt b/ext/snmp/tests/snmp2_get.phpt
index 30500eb5ca9b..e2cd1ef1b459 100644
--- a/ext/snmp/tests/snmp2_get.phpt
+++ b/ext/snmp/tests/snmp2_get.phpt
@@ -54,7 +54,7 @@ var_dump(snmp2_get($hostname, $community, array('.1.3.6.1.2.1.1.1.0', '.1.3.6.1.
 --EXPECTF--
 Checking error handling
 Empty OID array
-Array of object IDs must not be empty
+snmp2_get(): Argument #3 ($object_id) must not be empty when passed as an array
 Checking working
 Single OID
 string(%d) "%s"
diff --git a/ext/snmp/tests/snmp2_set.phpt b/ext/snmp/tests/snmp2_set.phpt
index 11b1d94419f5..da94fe21f498 100644
--- a/ext/snmp/tests/snmp2_set.phpt
+++ b/ext/snmp/tests/snmp2_set.phpt
@@ -128,14 +128,22 @@ var_dump((snmpget($hostname, $communityWrite, $oid1, $timeout, $retries) === $ol
 var_dump((snmpget($hostname, $communityWrite, $oid2, $timeout, $retries) === $oldvalue2));
 
 echo "Multiple OID, single type in array, multiple value\n";
-$z = snmp2_set($hostname, $communityWrite, array($oid1, $oid2), array('s'), array($newvalue1, $newvalue2), $timeout, $retries);
-var_dump($z);
+try {
+    $z = snmp2_set($hostname, $communityWrite, array($oid1, $oid2), array('s'), array($newvalue1, $newvalue2), $timeout, $retries);
+    var_dump($z);
+} catch (\ValueError $e) {
+    echo $e->getMessage() . \PHP_EOL;
+}
 var_dump((snmpget($hostname, $communityWrite, $oid1, $timeout, $retries) === $oldvalue1));
 var_dump((snmpget($hostname, $communityWrite, $oid2, $timeout, $retries) === $oldvalue2));
 
 echo "Multiple OID & type, single value in array\n";
-$z = snmp2_set($hostname, $communityWrite, array($oid1, $oid2), array('s', 's'), array($newvalue1), $timeout, $retries);
-var_dump($z);
+try {
+    $z = snmp2_set($hostname, $communityWrite, array($oid1, $oid2), array('s', 's'), array($newvalue1), $timeout, $retries);
+    var_dump($z);
+} catch (\ValueError $e) {
+    echo $e->getMessage() . \PHP_EOL;
+}
 var_dump((snmpget($hostname, $communityWrite, $oid1, $timeout, $retries) === $oldvalue1));
 var_dump((snmpget($hostname, $communityWrite, $oid2, $timeout, $retries) === $oldvalue2));
 
@@ -167,7 +175,7 @@ var_dump((snmpget($hostname, $communityWrite, $oid2, $timeout, $retries) === $ol
 --EXPECTF--
 Check error handing
 No type & no value (timeout & retries instead)
-Type must be a single character
+snmp2_set(): Argument #4 ($type) must be a single character
 No value (timeout instead), retries instead of timeout
 
 Warning: snmp2_set(): Could not add variable: OID='%s' type='q' value='%i': Bad variable type ("q") in %s on line %d
@@ -216,23 +224,19 @@ Value must be of type string when object ID is a string
 bool(true)
 bool(true)
 Multiple OID, 1st wrong type
-Type must be a single character
+snmp2_set(): Argument #4 ($type) must be a single character
 bool(true)
 bool(true)
 Multiple OID, 2nd wrong type
-Type must be a single character
+snmp2_set(): Argument #4 ($type) must be a single character
 bool(true)
 bool(true)
 Multiple OID, single type in array, multiple value
-
-Warning: snmp2_set(): '%s': no type set in %s on line %d
-bool(false)
+snmp2_set(): Argument #4 ($type) must contain a type for object ID 'SNMPv2-MIB::sysLocation.0'
 bool(true)
 bool(true)
 Multiple OID & type, single value in array
-
-Warning: snmp2_set(): '%s': no value set in %s on line %d
-bool(false)
+snmp2_set(): Argument #5 ($value) must contain a value for object ID 'SNMPv2-MIB::sysLocation.0'
 bool(true)
 bool(true)
 Multiple OID, 1st bogus, single type, multiple value
diff --git a/ext/snmp/tests/snmp_resolve_fail_leak.phpt b/ext/snmp/tests/snmp_resolve_fail_leak.phpt
new file mode 100644
index 000000000000..c8793b09e928
--- /dev/null
+++ b/ext/snmp/tests/snmp_resolve_fail_leak.phpt
@@ -0,0 +1,16 @@
+--TEST--
+snmp: resolved address list is freed when peername resolution drains empty
+--EXTENSIONS--
+snmp
+--FILE--
+
+--EXPECTF--
+Warning: snmpget(): Unknown failure while resolving '[127.0.0.1]' in %s on line %d
+bool(false)
diff --git a/ext/snmp/tests/snmpset.phpt b/ext/snmp/tests/snmpset.phpt
index ca935cecf5ec..a4f89e78da93 100644
--- a/ext/snmp/tests/snmpset.phpt
+++ b/ext/snmp/tests/snmpset.phpt
@@ -122,14 +122,22 @@ var_dump((snmpget($hostname, $communityWrite, $oid1, $timeout, $retries) === $ol
 var_dump((snmpget($hostname, $communityWrite, $oid2, $timeout, $retries) === $oldvalue2));
 
 echo "Multiple OID, single type in array, multiple value\n";
-$z = snmpset($hostname, $communityWrite, array($oid1, $oid2), array('s'), array($newvalue1, $newvalue2), $timeout, $retries);
-var_dump($z);
+try {
+    $z = snmpset($hostname, $communityWrite, array($oid1, $oid2), array('s'), array($newvalue1, $newvalue2), $timeout, $retries);
+    var_dump($z);
+} catch (\ValueError $e) {
+    echo $e->getMessage() . \PHP_EOL;
+}
 var_dump((snmpget($hostname, $communityWrite, $oid1, $timeout, $retries) === $oldvalue1));
 var_dump((snmpget($hostname, $communityWrite, $oid2, $timeout, $retries) === $oldvalue2));
 
 echo "Multiple OID & type, single value in array\n";
-$z = snmpset($hostname, $communityWrite, array($oid1, $oid2), array('s', 's'), array($newvalue1), $timeout, $retries);
-var_dump($z);
+try {
+    $z = snmpset($hostname, $communityWrite, array($oid1, $oid2), array('s', 's'), array($newvalue1), $timeout, $retries);
+    var_dump($z);
+} catch (\ValueError $e) {
+    echo $e->getMessage() . \PHP_EOL;
+}
 var_dump((snmpget($hostname, $communityWrite, $oid1, $timeout, $retries) === $oldvalue1));
 var_dump((snmpget($hostname, $communityWrite, $oid2, $timeout, $retries) === $oldvalue2));
 
@@ -161,7 +169,7 @@ var_dump((snmpget($hostname, $communityWrite, $oid2, $timeout, $retries) === $ol
 --EXPECTF--
 Check error handing
 No type & no value (timeout & retries instead)
-Type must be a single character
+snmpset(): Argument #4 ($type) must be a single character
 No value (timeout instead), retries instead of timeout
 
 Warning: snmpset(): Could not add variable: OID='%s' type='q' value='%i': Bad variable type ("q") in %s on line %d
@@ -207,23 +215,19 @@ Value must be of type string when object ID is a string
 bool(true)
 bool(true)
 Multiple OID, 1st wrong type
-Type must be a single character
+snmpset(): Argument #4 ($type) must be a single character
 bool(true)
 bool(true)
 Multiple OID, 2nd wrong type
-Type must be a single character
+snmpset(): Argument #4 ($type) must be a single character
 bool(true)
 bool(true)
 Multiple OID, single type in array, multiple value
-
-Warning: snmpset(): '%s': no type set in %s on line %d
-bool(false)
+snmpset(): Argument #4 ($type) must contain a type for object ID 'SNMPv2-MIB::sysLocation.0'
 bool(true)
 bool(true)
 Multiple OID & type, single value in array
-
-Warning: snmpset(): '%s': no value set in %s on line %d
-bool(false)
+snmpset(): Argument #5 ($value) must contain a value for object ID 'SNMPv2-MIB::sysLocation.0'
 bool(true)
 bool(true)
 Multiple OID, 1st bogus, single type, multiple value
diff --git a/ext/soap/php_encoding.c b/ext/soap/php_encoding.c
index 5e3675f875bd..151fa811b0fa 100644
--- a/ext/soap/php_encoding.c
+++ b/ext/soap/php_encoding.c
@@ -1,14 +1,12 @@
 /*
   +----------------------------------------------------------------------+
-  | Copyright (c) The PHP Group                                          |
+  | Copyright © The PHP Group and Contributors.                          |
   +----------------------------------------------------------------------+
-  | This source file is subject to version 3.01 of the PHP license,      |
-  | that is bundled with this package in the file LICENSE, and is        |
-  | available through the world-wide-web at the following url:           |
-  | https://www.php.net/license/3_01.txt                                 |
-  | If you did not receive a copy of the PHP license and are unable to   |
-  | obtain it through the world-wide-web, please send a note to          |
-  | license@php.net so we can mail you a copy immediately.               |
+  | This source file is subject to the Modified BSD License that is      |
+  | bundled with this package in the file LICENSE, and is available      |
+  | through the World Wide Web at .        |
+  |                                                                      |
+  | SPDX-License-Identifier: BSD-3-Clause                                |
   +----------------------------------------------------------------------+
   | Authors: Brad Lafountain                         |
   |          Shane Caraveo                            |
@@ -16,6 +14,7 @@
   +----------------------------------------------------------------------+
 */
 
+#include 
 #include 
 
 #include "php_soap.h"
@@ -278,7 +277,7 @@ static bool soap_check_zval_ref(zval *data, xmlNodePtr node) {
 		if (Z_TYPE_P(data) == IS_OBJECT) {
 			data = (zval*)Z_OBJ_P(data);
 		}
-		if ((node_ptr = zend_hash_index_find_ptr(SOAP_GLOBAL(ref_map), (zend_ulong)data)) != NULL) {
+		if ((node_ptr = zend_hash_index_find_ptr(SOAP_GLOBAL(ref_map), (zend_ulong)(uintptr_t)data)) != NULL) {
 			xmlAttrPtr attr = node_ptr->properties;
 			char *id;
 			smart_str prefix = {0};
@@ -324,7 +323,7 @@ static bool soap_check_zval_ref(zval *data, xmlNodePtr node) {
 			smart_str_free(&prefix);
 			return true;
 		} else {
-			zend_hash_index_update_ptr(SOAP_GLOBAL(ref_map), (zend_ulong)data, node);
+			zend_hash_index_update_ptr(SOAP_GLOBAL(ref_map), (zend_ulong)(uintptr_t)data, node);
 		}
 	}
 	return false;
@@ -335,7 +334,7 @@ static bool soap_check_xml_ref(zval *data, xmlNodePtr node)
 	zval *data_ptr;
 
 	if (SOAP_GLOBAL(ref_map)) {
-		if ((data_ptr = zend_hash_index_find(SOAP_GLOBAL(ref_map), (zend_ulong)node)) != NULL) {
+		if ((data_ptr = zend_hash_index_find(SOAP_GLOBAL(ref_map), (zend_ulong)(uintptr_t)node)) != NULL) {
 			if (!Z_REFCOUNTED_P(data) ||
 			    !Z_REFCOUNTED_P(data_ptr) ||
 			    Z_COUNTED_P(data) != Z_COUNTED_P(data_ptr)) {
@@ -351,7 +350,8 @@ static bool soap_check_xml_ref(zval *data, xmlNodePtr node)
 static void soap_add_xml_ref(zval *data, xmlNodePtr node)
 {
 	if (SOAP_GLOBAL(ref_map)) {
-		zend_hash_index_update(SOAP_GLOBAL(ref_map), (zend_ulong)node, data);
+		Z_TRY_ADDREF_P(data);
+		zend_hash_index_update(SOAP_GLOBAL(ref_map), (zend_ulong)(uintptr_t)node, data);
 	}
 }
 
@@ -2049,6 +2049,15 @@ static int calc_dimension_12(const char* str)
 	return i;
 }
 
+static void soap_array_position_add_digit(int *position, int digit)
+{
+	if (*position > (INT_MAX - digit) / 10) {
+		soap_error0(E_ERROR, "Encoding: array index out of range");
+	}
+
+	*position = (*position * 10) + digit;
+}
+
 static int* get_position_12(int dimension, const char* str)
 {
 	int *pos;
@@ -2069,7 +2078,7 @@ static int* get_position_12(int dimension, const char* str)
 				i++;
 				flag = 1;
 			}
-			pos[i] = (pos[i]*10)+(*str-'0');
+			soap_array_position_add_digit(&pos[i], *str - '0');
 		} else if (*str == '*') {
 			soap_error0(E_ERROR, "Encoding: '*' may only be first arraySize value in list");
 		} else {
@@ -2099,7 +2108,7 @@ static void get_position_ex(int dimension, const char* str, int** pos)
 	memset(*pos,0,sizeof(int)*dimension);
 	while (*str != ']' && *str != '\0' && i < dimension) {
 		if (*str >= '0' && *str <= '9') {
-			(*pos)[i] = ((*pos)[i]*10)+(*str-'0');
+			soap_array_position_add_digit(&(*pos)[i], *str - '0');
 		} else if (*str == ',') {
 			i++;
 		}
@@ -2686,16 +2695,20 @@ static zval *to_zval_array(zval *ret, encodeTypePtr type, xmlNodePtr data)
 			/* Increment position */
 			i = dimension;
 			while (i > 0) {
-			  i--;
-			  pos[i]++;
-				if (pos[i] >= dims[i]) {
-					if (i > 0) {
-						pos[i] = 0;
-					} else {
-						/* TODO: Array index overflow */
-					}
-				} else {
-				  break;
+				i--;
+				if (pos[i] == INT_MAX) {
+					efree(dims);
+					efree(pos);
+					zval_ptr_dtor(ret);
+					ZVAL_UNDEF(ret);
+					soap_error0(E_ERROR, "Encoding: array index out of range");
+				}
+				pos[i]++;
+				if (pos[i] < dims[i]) {
+					break;
+				}
+				if (i > 0) {
+					pos[i] = 0;
 				}
 			}
 		}
@@ -2785,7 +2798,7 @@ static zval *to_zval_map(zval *ret, encodeTypePtr type, xmlNodePtr data)
 			}
 
 			xmlValue = get_node(item->children, "value");
-			if (!xmlKey) {
+			if (!xmlValue) {
 				soap_error0(E_ERROR,  "Encoding: Can't decode apache map, missing value");
 			}
 
@@ -3522,7 +3535,7 @@ void encode_reset_ns(void)
 	} else {
 		SOAP_GLOBAL(ref_map) = emalloc(sizeof(HashTable));
 	}
-	zend_hash_init(SOAP_GLOBAL(ref_map), 0, NULL, NULL, 0);
+	zend_hash_init(SOAP_GLOBAL(ref_map), 0, NULL, ZVAL_PTR_DTOR, 0);
 }
 
 void encode_finish(void)
diff --git a/ext/soap/php_encoding.h b/ext/soap/php_encoding.h
index ef05c9ebe787..e01154e17456 100644
--- a/ext/soap/php_encoding.h
+++ b/ext/soap/php_encoding.h
@@ -1,14 +1,12 @@
 /*
   +----------------------------------------------------------------------+
-  | Copyright (c) The PHP Group                                          |
+  | Copyright © The PHP Group and Contributors.                          |
   +----------------------------------------------------------------------+
-  | This source file is subject to version 3.01 of the PHP license,      |
-  | that is bundled with this package in the file LICENSE, and is        |
-  | available through the world-wide-web at the following url:           |
-  | https://www.php.net/license/3_01.txt                                 |
-  | If you did not receive a copy of the PHP license and are unable to   |
-  | obtain it through the world-wide-web, please send a note to          |
-  | license@php.net so we can mail you a copy immediately.               |
+  | This source file is subject to the Modified BSD License that is      |
+  | bundled with this package in the file LICENSE, and is available      |
+  | through the World Wide Web at .        |
+  |                                                                      |
+  | SPDX-License-Identifier: BSD-3-Clause                                |
   +----------------------------------------------------------------------+
   | Authors: Brad Lafountain                         |
   |          Shane Caraveo                            |
diff --git a/ext/soap/php_http.c b/ext/soap/php_http.c
index bac21d26b358..e8433e7c4f67 100644
--- a/ext/soap/php_http.c
+++ b/ext/soap/php_http.c
@@ -1,14 +1,12 @@
 /*
   +----------------------------------------------------------------------+
-  | Copyright (c) The PHP Group                                          |
+  | Copyright © The PHP Group and Contributors.                          |
   +----------------------------------------------------------------------+
-  | This source file is subject to version 3.01 of the PHP license,      |
-  | that is bundled with this package in the file LICENSE, and is        |
-  | available through the world-wide-web at the following url:           |
-  | https://www.php.net/license/3_01.txt                                 |
-  | If you did not receive a copy of the PHP license and are unable to   |
-  | obtain it through the world-wide-web, please send a note to          |
-  | license@php.net so we can mail you a copy immediately.               |
+  | This source file is subject to the Modified BSD License that is      |
+  | bundled with this package in the file LICENSE, and is available      |
+  | through the World Wide Web at .        |
+  |                                                                      |
+  | SPDX-License-Identifier: BSD-3-Clause                                |
   +----------------------------------------------------------------------+
   | Authors: Brad Lafountain                         |
   |          Shane Caraveo                            |
@@ -254,12 +252,12 @@ static php_stream* http_connect(zval* this_ptr, php_uri *uri, int use_ssl, php_s
 		}
 
 		smart_str_append_const(&soap_headers, "CONNECT ");
-		smart_str_appends(&soap_headers, ZSTR_VAL(uri->host));
+		smart_str_append(&soap_headers, uri->host);
 		smart_str_appendc(&soap_headers, ':');
 		smart_str_append_unsigned(&soap_headers, uri->port);
 		smart_str_append_const(&soap_headers, " HTTP/1.1\r\n");
 		smart_str_append_const(&soap_headers, "Host: ");
-		smart_str_appends(&soap_headers, ZSTR_VAL(uri->host));
+		smart_str_append(&soap_headers, uri->host);
 		if (uri->port != 80) {
 			smart_str_appendc(&soap_headers, ':');
 			smart_str_append_unsigned(&soap_headers, uri->port);
@@ -574,24 +572,24 @@ int make_http_soap_request(
 
 		smart_str_append_const(&soap_headers, "POST ");
 		if (use_proxy && !use_ssl) {
-			smart_str_appends(&soap_headers, ZSTR_VAL(uri->scheme));
+			smart_str_append(&soap_headers, uri->scheme);
 			smart_str_append_const(&soap_headers, "://");
-			smart_str_appends(&soap_headers, ZSTR_VAL(uri->host));
+			smart_str_append(&soap_headers, uri->host);
 			smart_str_appendc(&soap_headers, ':');
 			smart_str_append_unsigned(&soap_headers, uri->port);
 		}
 		if (uri->path) {
-			smart_str_appends(&soap_headers, ZSTR_VAL(uri->path));
+			smart_str_append(&soap_headers, uri->path);
 		} else {
 			smart_str_appendc(&soap_headers, '/');
 		}
 		if (uri->query) {
 			smart_str_appendc(&soap_headers, '?');
-			smart_str_appends(&soap_headers, ZSTR_VAL(uri->query));
+			smart_str_append(&soap_headers, uri->query);
 		}
 		if (uri->fragment) {
 			smart_str_appendc(&soap_headers, '#');
-			smart_str_appends(&soap_headers, ZSTR_VAL(uri->fragment));
+			smart_str_append(&soap_headers, uri->fragment);
 		}
 		if (http_1_1) {
 			smart_str_append_const(&soap_headers, " HTTP/1.1\r\n");
@@ -599,7 +597,7 @@ int make_http_soap_request(
 			smart_str_append_const(&soap_headers, " HTTP/1.0\r\n");
 		}
 		smart_str_append_const(&soap_headers, "Host: ");
-		smart_str_appends(&soap_headers, ZSTR_VAL(uri->host));
+		smart_str_append(&soap_headers, uri->host);
 		if (uri->port != (use_ssl?443:80)) {
 			smart_str_appendc(&soap_headers, ':');
 			smart_str_append_unsigned(&soap_headers, uri->port);
@@ -615,7 +613,7 @@ int make_http_soap_request(
 		if (Z_TYPE_P(tmp) == IS_STRING) {
 			if (Z_STRLEN_P(tmp) > 0) {
 				smart_str_append_const(&soap_headers, "User-Agent: ");
-				smart_str_appendl(&soap_headers, Z_STRVAL_P(tmp), Z_STRLEN_P(tmp));
+				smart_str_append(&soap_headers, Z_STR_P(tmp));
 				smart_str_append_const(&soap_headers, "\r\n");
 			}
 		} else if (context &&
@@ -623,7 +621,7 @@ int make_http_soap_request(
 		           Z_TYPE_P(tmp) == IS_STRING) {
 			if (Z_STRLEN_P(tmp) > 0) {
 				smart_str_append_const(&soap_headers, "User-Agent: ");
-				smart_str_appendl(&soap_headers, Z_STRVAL_P(tmp), Z_STRLEN_P(tmp));
+				smart_str_append(&soap_headers, Z_STR_P(tmp));
 				smart_str_append_const(&soap_headers, "\r\n");
 			}
 		} else if (FG(user_agent)) {
@@ -643,7 +641,7 @@ int make_http_soap_request(
 				Z_STRLEN_P(tmp) > 0
 			) {
 				smart_str_append_const(&soap_headers, "Content-Type: ");
-				smart_str_appendl(&soap_headers, Z_STRVAL_P(tmp), Z_STRLEN_P(tmp));
+				smart_str_append(&soap_headers, Z_STR_P(tmp));
 			} else {
 				smart_str_append_const(&soap_headers, "Content-Type: application/soap+xml; charset=utf-8");
 			}
@@ -660,7 +658,7 @@ int make_http_soap_request(
 				Z_STRLEN_P(tmp) > 0
 			) {
 				smart_str_append_const(&soap_headers, "Content-Type: ");
-				smart_str_appendl(&soap_headers, Z_STRVAL_P(tmp), Z_STRLEN_P(tmp));
+				smart_str_append(&soap_headers, Z_STR_P(tmp));
 				smart_str_append_const(&soap_headers, "\r\n");
 			} else {
 				smart_str_append_const(&soap_headers, "Content-Type: text/xml; charset=utf-8\r\n");
@@ -780,30 +778,30 @@ int make_http_soap_request(
 				make_digest(response, hash);
 
 				smart_str_append_const(&soap_headers, "Authorization: Digest username=\"");
-				smart_str_appendl(&soap_headers, Z_STRVAL_P(login), Z_STRLEN_P(login));
+				smart_str_append(&soap_headers, Z_STR_P(login));
 				if ((tmp = zend_hash_str_find(Z_ARRVAL_P(digest), "realm", sizeof("realm")-1)) != NULL &&
 					Z_TYPE_P(tmp) == IS_STRING) {
 					smart_str_append_const(&soap_headers, "\", realm=\"");
-					smart_str_appendl(&soap_headers, Z_STRVAL_P(tmp), Z_STRLEN_P(tmp));
+					smart_str_append(&soap_headers, Z_STR_P(tmp));
 				}
 				if ((tmp = zend_hash_str_find(Z_ARRVAL_P(digest), "nonce", sizeof("nonce")-1)) != NULL &&
 					Z_TYPE_P(tmp) == IS_STRING) {
 					smart_str_append_const(&soap_headers, "\", nonce=\"");
-					smart_str_appendl(&soap_headers, Z_STRVAL_P(tmp), Z_STRLEN_P(tmp));
+					smart_str_append(&soap_headers, Z_STR_P(tmp));
 				}
 				smart_str_append_const(&soap_headers, "\", uri=\"");
 				if (uri->path) {
-					smart_str_appends(&soap_headers, ZSTR_VAL(uri->path));
+					smart_str_append(&soap_headers, uri->path);
 				} else {
 					smart_str_appendc(&soap_headers, '/');
 				}
 				if (uri->query) {
 					smart_str_appendc(&soap_headers, '?');
-					smart_str_appends(&soap_headers, ZSTR_VAL(uri->query));
+					smart_str_append(&soap_headers, uri->query);
 				}
 				if (uri->fragment) {
 					smart_str_appendc(&soap_headers, '#');
-					smart_str_appends(&soap_headers, ZSTR_VAL(uri->fragment));
+					smart_str_append(&soap_headers, uri->fragment);
 				}
 				if ((tmp = zend_hash_str_find(Z_ARRVAL_P(digest), "qop", sizeof("qop")-1)) != NULL &&
 					Z_TYPE_P(tmp) == IS_STRING) {
@@ -819,12 +817,12 @@ int make_http_soap_request(
 				if ((tmp = zend_hash_str_find(Z_ARRVAL_P(digest), "opaque", sizeof("opaque")-1)) != NULL &&
 					Z_TYPE_P(tmp) == IS_STRING) {
 					smart_str_append_const(&soap_headers, "\", opaque=\"");
-					smart_str_appendl(&soap_headers, Z_STRVAL_P(tmp), Z_STRLEN_P(tmp));
+					smart_str_append(&soap_headers, Z_STR_P(tmp));
 				}
 				if ((tmp = zend_hash_str_find(Z_ARRVAL_P(digest), "algorithm", sizeof("algorithm")-1)) != NULL &&
 					Z_TYPE_P(tmp) == IS_STRING) {
 					smart_str_append_const(&soap_headers, "\", algorithm=\"");
-					smart_str_appendl(&soap_headers, Z_STRVAL_P(tmp), Z_STRLEN_P(tmp));
+					smart_str_append(&soap_headers, Z_STR_P(tmp));
 				}
 				smart_str_append_const(&soap_headers, "\"\r\n");
 			} else {
@@ -899,7 +897,7 @@ int make_http_soap_request(
 			ZVAL_STRINGL(Z_CLIENT_LAST_REQUEST_HEADERS_P(this_ptr),
 				ZSTR_VAL(soap_headers.s), ZSTR_LEN(soap_headers.s));
 		}
-		smart_str_appendl(&soap_headers, request->val, request->len);
+		smart_str_append(&soap_headers, request);
 		smart_str_0(&soap_headers);
 
 		err = php_stream_write(stream, ZSTR_VAL(soap_headers.s), ZSTR_LEN(soap_headers.s));
@@ -1160,12 +1158,12 @@ int make_http_soap_request(
 				zend_string_release_ex(http_headers, 0);
 				zend_string_release_ex(http_body, 0);
 				if (new_uri->scheme == NULL && new_uri->path != NULL) {
-					new_uri->scheme = new_uri->scheme ? zend_string_copy(new_uri->scheme) : NULL;
-					new_uri->host = new_uri->host ? zend_string_copy(new_uri->host) : NULL;
-					new_uri->port = new_uri->port;
+					new_uri->scheme = uri->scheme ? zend_string_copy(uri->scheme) : NULL;
+					new_uri->host = uri->host ? zend_string_copy(uri->host) : NULL;
+					new_uri->port = uri->port;
 					if (new_uri->path && ZSTR_VAL(new_uri->path)[0] != '/') {
-						if (new_uri->path) {
-							char *t = ZSTR_VAL(new_uri->path);
+						if (uri->path) {
+							char *t = ZSTR_VAL(uri->path);
 							char *p = strrchr(t, '/');
 							if (p) {
 								zend_string *s = zend_string_concat2(t, (p - t) + 1, ZSTR_VAL(new_uri->path), ZSTR_LEN(new_uri->path));
diff --git a/ext/soap/php_http.h b/ext/soap/php_http.h
index 7716e86720bd..a01ea35f9849 100644
--- a/ext/soap/php_http.h
+++ b/ext/soap/php_http.h
@@ -1,14 +1,12 @@
 /*
   +----------------------------------------------------------------------+
-  | Copyright (c) The PHP Group                                          |
+  | Copyright © The PHP Group and Contributors.                          |
   +----------------------------------------------------------------------+
-  | This source file is subject to version 3.01 of the PHP license,      |
-  | that is bundled with this package in the file LICENSE, and is        |
-  | available through the world-wide-web at the following url:           |
-  | https://www.php.net/license/3_01.txt                                 |
-  | If you did not receive a copy of the PHP license and are unable to   |
-  | obtain it through the world-wide-web, please send a note to          |
-  | license@php.net so we can mail you a copy immediately.               |
+  | This source file is subject to the Modified BSD License that is      |
+  | bundled with this package in the file LICENSE, and is available      |
+  | through the World Wide Web at .        |
+  |                                                                      |
+  | SPDX-License-Identifier: BSD-3-Clause                                |
   +----------------------------------------------------------------------+
   | Authors: Brad Lafountain                         |
   |          Shane Caraveo                            |
diff --git a/ext/soap/php_packet_soap.c b/ext/soap/php_packet_soap.c
index 1019949093f0..b3aceb413890 100644
--- a/ext/soap/php_packet_soap.c
+++ b/ext/soap/php_packet_soap.c
@@ -1,14 +1,12 @@
 /*
   +----------------------------------------------------------------------+
-  | Copyright (c) The PHP Group                                          |
+  | Copyright © The PHP Group and Contributors.                          |
   +----------------------------------------------------------------------+
-  | This source file is subject to version 3.01 of the PHP license,      |
-  | that is bundled with this package in the file LICENSE, and is        |
-  | available through the world-wide-web at the following url:           |
-  | https://www.php.net/license/3_01.txt                                 |
-  | If you did not receive a copy of the PHP license and are unable to   |
-  | obtain it through the world-wide-web, please send a note to          |
-  | license@php.net so we can mail you a copy immediately.               |
+  | This source file is subject to the Modified BSD License that is      |
+  | bundled with this package in the file LICENSE, and is available      |
+  | through the World Wide Web at .        |
+  |                                                                      |
+  | SPDX-License-Identifier: BSD-3-Clause                                |
   +----------------------------------------------------------------------+
   | Authors: Brad Lafountain                         |
   |          Shane Caraveo                            |
@@ -18,6 +16,28 @@
 
 #include "php_soap.h"
 
+static void master_to_zval_with_doc_cleanup(zval *ret, encodePtr encode, xmlNodePtr data, xmlDocPtr doc)
+{
+	bool bailout = false;
+
+	ZVAL_UNDEF(ret);
+
+	/* SoapClient can turn decode errors into a bailout before parse_packet_soap() frees the response doc. */
+	zend_try {
+		master_to_zval(ret, encode, data);
+	} zend_catch {
+		bailout = true;
+	} zend_end_try();
+
+	if (bailout) {
+		if (!Z_ISUNDEF_P(ret)) {
+			zval_ptr_dtor(ret);
+		}
+		xmlFreeDoc(doc);
+		zend_bailout();
+	}
+}
+
 /* SOAP client calls this function to parse response from SOAP server */
 bool parse_packet_soap(zval *this_ptr, char *buffer, int buffer_size, sdlFunctionPtr fn, char *fn_name, zval *return_value, zval *soap_headers)
 {
@@ -31,7 +51,7 @@ bool parse_packet_soap(zval *this_ptr, char *buffer, int buffer_size, sdlFunctio
 
 	ZVAL_NULL(return_value);
 
-	/* Response for one-way opearation */
+	/* Response for one-way operation */
 	if (buffer_size == 0) {
 		return true;
 	}
@@ -192,7 +212,7 @@ bool parse_packet_soap(zval *this_ptr, char *buffer, int buffer_size, sdlFunctio
 			tmp = get_node(fault->children, "faultstring");
 			if (tmp != NULL && tmp->children != NULL) {
 				zval zv;
-				master_to_zval(&zv, get_conversion(IS_STRING), tmp);
+				master_to_zval_with_doc_cleanup(&zv, get_conversion(IS_STRING), tmp, response);
 				convert_to_string(&zv)
 				faultstring = Z_STR(zv);
 			}
@@ -200,14 +220,14 @@ bool parse_packet_soap(zval *this_ptr, char *buffer, int buffer_size, sdlFunctio
 			tmp = get_node(fault->children, "faultactor");
 			if (tmp != NULL && tmp->children != NULL) {
 				zval zv;
-				master_to_zval(&zv, get_conversion(IS_STRING), tmp);
+				master_to_zval_with_doc_cleanup(&zv, get_conversion(IS_STRING), tmp, response);
 				convert_to_string(&zv)
 				faultactor = Z_STR(zv);
 			}
 
 			tmp = get_node(fault->children, "detail");
 			if (tmp != NULL) {
-				master_to_zval(&details, NULL, tmp);
+				master_to_zval_with_doc_cleanup(&details, NULL, tmp, response);
 			}
 		} else {
 			tmp = get_node(fault->children, "Code");
@@ -223,7 +243,7 @@ bool parse_packet_soap(zval *this_ptr, char *buffer, int buffer_size, sdlFunctio
 				tmp = get_node(tmp->children,"Text");
 				if (tmp != NULL && tmp->children != NULL) {
 					zval zv;
-					master_to_zval(&zv, get_conversion(IS_STRING), tmp);
+					master_to_zval_with_doc_cleanup(&zv, get_conversion(IS_STRING), tmp, response);
 					convert_to_string(&zv)
 					faultstring = Z_STR(zv);
 
@@ -238,7 +258,7 @@ bool parse_packet_soap(zval *this_ptr, char *buffer, int buffer_size, sdlFunctio
 
 			tmp = get_node(fault->children,"Detail");
 			if (tmp != NULL) {
-				master_to_zval(&details, NULL, tmp);
+				master_to_zval_with_doc_cleanup(&details, NULL, tmp, response);
 			}
 		}
 		add_soap_fault(this_ptr, faultcode, faultstring ? ZSTR_VAL(faultstring) : NULL, faultactor ? ZSTR_VAL(faultactor) : NULL, &details, lang);
@@ -332,9 +352,9 @@ bool parse_packet_soap(zval *this_ptr, char *buffer, int buffer_size, sdlFunctio
 					} else {
 						/* Decoding value of parameter */
 						if (param != NULL) {
-							master_to_zval(&tmp, param->encode, val);
+							master_to_zval_with_doc_cleanup(&tmp, param->encode, val, response);
 						} else {
-							master_to_zval(&tmp, NULL, val);
+							master_to_zval_with_doc_cleanup(&tmp, NULL, val, response);
 						}
 					}
 					add_assoc_zval(return_value, param->paramName, &tmp);
@@ -355,7 +375,7 @@ bool parse_packet_soap(zval *this_ptr, char *buffer, int buffer_size, sdlFunctio
 						zval tmp;
 						zval *arr;
 
-						master_to_zval(&tmp, NULL, val);
+						master_to_zval_with_doc_cleanup(&tmp, NULL, val, response);
 						if (val->name) {
 							if ((arr = zend_hash_str_find(Z_ARRVAL_P(return_value), (char*)val->name, strlen((char*)val->name))) != NULL) {
 								add_next_index_zval(arr, &tmp);
@@ -420,7 +440,7 @@ bool parse_packet_soap(zval *this_ptr, char *buffer, int buffer_size, sdlFunctio
 					}
 					smart_str_free(&key);
 				}
-				master_to_zval(&val, enc, trav);
+				master_to_zval_with_doc_cleanup(&val, enc, trav, response);
 				add_assoc_zval(soap_headers, (char*)trav->name, &val);
 			}
 			trav = trav->next;
diff --git a/ext/soap/php_packet_soap.h b/ext/soap/php_packet_soap.h
index 5a9fc62418a6..569b23949659 100644
--- a/ext/soap/php_packet_soap.h
+++ b/ext/soap/php_packet_soap.h
@@ -1,14 +1,12 @@
 /*
   +----------------------------------------------------------------------+
-  | Copyright (c) The PHP Group                                          |
+  | Copyright © The PHP Group and Contributors.                          |
   +----------------------------------------------------------------------+
-  | This source file is subject to version 3.01 of the PHP license,      |
-  | that is bundled with this package in the file LICENSE, and is        |
-  | available through the world-wide-web at the following url:           |
-  | https://www.php.net/license/3_01.txt                                 |
-  | If you did not receive a copy of the PHP license and are unable to   |
-  | obtain it through the world-wide-web, please send a note to          |
-  | license@php.net so we can mail you a copy immediately.               |
+  | This source file is subject to the Modified BSD License that is      |
+  | bundled with this package in the file LICENSE, and is available      |
+  | through the World Wide Web at .        |
+  |                                                                      |
+  | SPDX-License-Identifier: BSD-3-Clause                                |
   +----------------------------------------------------------------------+
   | Authors: Brad Lafountain                         |
   |          Shane Caraveo                            |
diff --git a/ext/soap/php_schema.c b/ext/soap/php_schema.c
index dc6816034dea..d97a0eac05b5 100644
--- a/ext/soap/php_schema.c
+++ b/ext/soap/php_schema.c
@@ -1,14 +1,12 @@
 /*
   +----------------------------------------------------------------------+
-  | Copyright (c) The PHP Group                                          |
+  | Copyright © The PHP Group and Contributors.                          |
   +----------------------------------------------------------------------+
-  | This source file is subject to version 3.01 of the PHP license,      |
-  | that is bundled with this package in the file LICENSE, and is        |
-  | available through the world-wide-web at the following url:           |
-  | https://www.php.net/license/3_01.txt                                 |
-  | If you did not receive a copy of the PHP license and are unable to   |
-  | obtain it through the world-wide-web, please send a note to          |
-  | license@php.net so we can mail you a copy immediately.               |
+  | This source file is subject to the Modified BSD License that is      |
+  | bundled with this package in the file LICENSE, and is available      |
+  | through the World Wide Web at .        |
+  |                                                                      |
+  | SPDX-License-Identifier: BSD-3-Clause                                |
   +----------------------------------------------------------------------+
   | Authors: Brad Lafountain                         |
   |          Shane Caraveo                            |
@@ -55,6 +53,28 @@ static bool node_is_equal_xsd(xmlNodePtr node, const char *name)
 	return node_is_equal_ex_one_of(node, name, ns);
 }
 
+static int schema_parse_int(const xmlChar *value, const char *name, bool allow_negative)
+{
+	const char *str = (const char *) value;
+	zend_long lval = 0;
+	int oflow_info = 0;
+	uint8_t type = is_numeric_string_ex(str, strlen(str), &lval, NULL, true, &oflow_info, NULL);
+
+	if (type != IS_LONG) {
+		errno = 0;
+		lval = ZEND_STRTOL(str, NULL, 10);
+		if (oflow_info || (errno == ERANGE && lval != 0)) {
+			soap_error1(E_ERROR, "Parsing Schema: %s value is out of range", name);
+		}
+	}
+
+	if (ZEND_LONG_EXCEEDS_INT(lval) || (!allow_negative && lval < 0)) {
+		soap_error1(E_ERROR, "Parsing Schema: %s value is out of range", name);
+	}
+
+	return (int) lval;
+}
+
 static encodePtr create_encoder(sdlPtr sdl, sdlTypePtr cur_type, const xmlChar *ns, const xmlChar *type)
 {
 	smart_str nscat = {0};
@@ -856,7 +876,7 @@ static int schema_restriction_var_int(xmlNodePtr val, sdlRestrictionIntPtr *valp
 		soap_error0(E_ERROR, "Parsing Schema: missing restriction value");
 	}
 
-	(*valptr)->value = atoi((char*)value->children->content);
+	(*valptr)->value = schema_parse_int(value->children->content, (const char *) val->name, true);
 
 	return TRUE;
 }
@@ -1018,7 +1038,7 @@ void schema_min_max(xmlNodePtr node, sdlContentModelPtr model)
 	xmlAttrPtr attr = get_attribute(node->properties, "minOccurs");
 
 	if (attr) {
-		model->min_occurs = atoi((char*)attr->children->content);
+		model->min_occurs = schema_parse_int(attr->children->content, "minOccurs", false);
 	} else {
 		model->min_occurs = 1;
 	}
@@ -1028,7 +1048,7 @@ void schema_min_max(xmlNodePtr node, sdlContentModelPtr model)
 		if (!strncmp((char*)attr->children->content, "unbounded", sizeof("unbounded"))) {
 			model->max_occurs = -1;
 		} else {
-			model->max_occurs = atoi((char*)attr->children->content);
+			model->max_occurs = schema_parse_int(attr->children->content, "maxOccurs", false);
 		}
 	} else {
 		model->max_occurs = 1;
diff --git a/ext/soap/php_schema.h b/ext/soap/php_schema.h
index 68035000e1e5..b92c8a8fb4c4 100644
--- a/ext/soap/php_schema.h
+++ b/ext/soap/php_schema.h
@@ -1,14 +1,12 @@
 /*
   +----------------------------------------------------------------------+
-  | Copyright (c) The PHP Group                                          |
+  | Copyright © The PHP Group and Contributors.                          |
   +----------------------------------------------------------------------+
-  | This source file is subject to version 3.01 of the PHP license,      |
-  | that is bundled with this package in the file LICENSE, and is        |
-  | available through the world-wide-web at the following url:           |
-  | https://www.php.net/license/3_01.txt                                 |
-  | If you did not receive a copy of the PHP license and are unable to   |
-  | obtain it through the world-wide-web, please send a note to          |
-  | license@php.net so we can mail you a copy immediately.               |
+  | This source file is subject to the Modified BSD License that is      |
+  | bundled with this package in the file LICENSE, and is available      |
+  | through the World Wide Web at .        |
+  |                                                                      |
+  | SPDX-License-Identifier: BSD-3-Clause                                |
   +----------------------------------------------------------------------+
   | Authors: Brad Lafountain                         |
   |          Shane Caraveo                            |
diff --git a/ext/soap/php_sdl.c b/ext/soap/php_sdl.c
index ad37867dd460..07c5dbf4f12e 100644
--- a/ext/soap/php_sdl.c
+++ b/ext/soap/php_sdl.c
@@ -1,14 +1,12 @@
 /*
   +----------------------------------------------------------------------+
-  | Copyright (c) The PHP Group                                          |
+  | Copyright © The PHP Group and Contributors.                          |
   +----------------------------------------------------------------------+
-  | This source file is subject to version 3.01 of the PHP license,      |
-  | that is bundled with this package in the file LICENSE, and is        |
-  | available through the world-wide-web at the following url:           |
-  | https://www.php.net/license/3_01.txt                                 |
-  | If you did not receive a copy of the PHP license and are unable to   |
-  | obtain it through the world-wide-web, please send a note to          |
-  | license@php.net so we can mail you a copy immediately.               |
+  | This source file is subject to the Modified BSD License that is      |
+  | bundled with this package in the file LICENSE, and is available      |
+  | through the World Wide Web at .        |
+  |                                                                      |
+  | SPDX-License-Identifier: BSD-3-Clause                                |
   +----------------------------------------------------------------------+
   | Authors: Brad Lafountain                         |
   |          Shane Caraveo                            |
@@ -3240,7 +3238,7 @@ sdlPtr get_sdl(zval *this_ptr, char *uri, zend_long cache_wsdl)
 		tmp = Z_CLIENT_USER_AGENT_P(this_ptr);
 		if (Z_TYPE_P(tmp) == IS_STRING && Z_STRLEN_P(tmp) > 0) {
 			smart_str_appends(&headers, "User-Agent: ");
-			smart_str_appends(&headers, Z_STRVAL_P(tmp));
+			smart_str_append(&headers, Z_STR_P(tmp));
 			smart_str_appends(&headers, "\r\n");
 		}
 
@@ -3250,7 +3248,7 @@ sdlPtr get_sdl(zval *this_ptr, char *uri, zend_long cache_wsdl)
 			zval str_proxy;
 			smart_str proxy = {0};
 			smart_str_appends(&proxy,"tcp://");
-			smart_str_appends(&proxy,Z_STRVAL_P(proxy_host));
+			smart_str_append(&proxy, Z_STR_P(proxy_host));
 			smart_str_appends(&proxy,":");
 			smart_str_append_long(&proxy,Z_LVAL_P(proxy_port));
 			ZVAL_STR(&str_proxy, smart_str_extract(&proxy));
@@ -3362,7 +3360,7 @@ sdlPtr get_sdl(zval *this_ptr, char *uri, zend_long cache_wsdl)
 
 			zend_hash_str_update_mem(SOAP_GLOBAL(mem_cache), uri,
 											uri_len, &p, sizeof(sdl_cache_bucket));
-			/* remove non-persitent sdl structure */
+			/* remove non-persistent sdl structure */
 			delete_sdl_impl(sdl);
 			/* and replace it with persistent one */
 			sdl = psdl;
diff --git a/ext/soap/php_sdl.h b/ext/soap/php_sdl.h
index 3df4fbdca015..7c9d8ce7382b 100644
--- a/ext/soap/php_sdl.h
+++ b/ext/soap/php_sdl.h
@@ -1,14 +1,12 @@
 /*
   +----------------------------------------------------------------------+
-  | Copyright (c) The PHP Group                                          |
+  | Copyright © The PHP Group and Contributors.                          |
   +----------------------------------------------------------------------+
-  | This source file is subject to version 3.01 of the PHP license,      |
-  | that is bundled with this package in the file LICENSE, and is        |
-  | available through the world-wide-web at the following url:           |
-  | https://www.php.net/license/3_01.txt                                 |
-  | If you did not receive a copy of the PHP license and are unable to   |
-  | obtain it through the world-wide-web, please send a note to          |
-  | license@php.net so we can mail you a copy immediately.               |
+  | This source file is subject to the Modified BSD License that is      |
+  | bundled with this package in the file LICENSE, and is available      |
+  | through the World Wide Web at .        |
+  |                                                                      |
+  | SPDX-License-Identifier: BSD-3-Clause                                |
   +----------------------------------------------------------------------+
   | Authors: Brad Lafountain                         |
   |          Shane Caraveo                            |
@@ -166,7 +164,7 @@ struct _sdlContentModel {
 	union {
 		sdlTypePtr          element;      /* pointer to element */
 		sdlTypePtr          group;        /* pointer to group */
-		HashTable          *content;      /* array of sdlContentModel for sequnce,all,choice*/
+		HashTable          *content;      /* array of sdlContentModel for sequence,all,choice*/
 		char               *group_ref;    /* reference to group */
 	} u;
 };
diff --git a/ext/soap/php_soap.h b/ext/soap/php_soap.h
index aa3fb79e5709..58dbdfed6c05 100644
--- a/ext/soap/php_soap.h
+++ b/ext/soap/php_soap.h
@@ -1,14 +1,12 @@
 /*
   +----------------------------------------------------------------------+
-  | Copyright (c) The PHP Group                                          |
+  | Copyright © The PHP Group and Contributors.                          |
   +----------------------------------------------------------------------+
-  | This source file is subject to version 3.01 of the PHP license,      |
-  | that is bundled with this package in the file LICENSE, and is        |
-  | available through the world-wide-web at the following url:           |
-  | https://www.php.net/license/3_01.txt                                 |
-  | If you did not receive a copy of the PHP license and are unable to   |
-  | obtain it through the world-wide-web, please send a note to          |
-  | license@php.net so we can mail you a copy immediately.               |
+  | This source file is subject to the Modified BSD License that is      |
+  | bundled with this package in the file LICENSE, and is available      |
+  | through the World Wide Web at .        |
+  |                                                                      |
+  | SPDX-License-Identifier: BSD-3-Clause                                |
   +----------------------------------------------------------------------+
   | Authors: Brad Lafountain                         |
   |          Shane Caraveo                            |
@@ -226,45 +224,41 @@ static zend_always_inline zval *php_soap_deref(zval *zv) {
 #define Z_CLIENT_TRACE_P(zv) OBJ_PROP_NUM(Z_OBJ_P(zv), 4)
 #define Z_CLIENT_COMPRESSION_P(zv) OBJ_PROP_NUM(Z_OBJ_P(zv), 5)
 #define Z_CLIENT_SDL_P(zv) OBJ_PROP_NUM(Z_OBJ_P(zv), 6)
-#define Z_CLIENT_TYPEMAP_P(zv) OBJ_PROP_NUM(Z_OBJ_P(zv), 7)
-#define Z_CLIENT_HTTPSOCKET_P(zv) OBJ_PROP_NUM(Z_OBJ_P(zv), 8)
-#define Z_CLIENT_HTTPURL_P(zv) OBJ_PROP_NUM(Z_OBJ_P(zv), 9)
-#define Z_CLIENT_LOGIN_P(zv) OBJ_PROP_NUM(Z_OBJ_P(zv), 10)
-#define Z_CLIENT_PASSWORD_P(zv) OBJ_PROP_NUM(Z_OBJ_P(zv), 11)
-#define Z_CLIENT_USE_DIGEST_P(zv) OBJ_PROP_NUM(Z_OBJ_P(zv), 12)
-#define Z_CLIENT_DIGEST_P(zv) OBJ_PROP_NUM(Z_OBJ_P(zv), 13)
-#define Z_CLIENT_PROXY_HOST_P(zv) OBJ_PROP_NUM(Z_OBJ_P(zv), 14)
-#define Z_CLIENT_PROXY_PORT_P(zv) OBJ_PROP_NUM(Z_OBJ_P(zv), 15)
-#define Z_CLIENT_PROXY_LOGIN_P(zv) OBJ_PROP_NUM(Z_OBJ_P(zv), 16)
-#define Z_CLIENT_PROXY_PASSWORD_P(zv) OBJ_PROP_NUM(Z_OBJ_P(zv), 17)
-#define Z_CLIENT_EXCEPTIONS_P(zv) OBJ_PROP_NUM(Z_OBJ_P(zv), 18)
-#define Z_CLIENT_ENCODING_P(zv) OBJ_PROP_NUM(Z_OBJ_P(zv), 19)
-#define Z_CLIENT_CLASSMAP_P(zv) OBJ_PROP_NUM(Z_OBJ_P(zv), 20)
-#define Z_CLIENT_FEATURES_P(zv) OBJ_PROP_NUM(Z_OBJ_P(zv), 21)
-#define Z_CLIENT_CONNECTION_TIMEOUT_P(zv) OBJ_PROP_NUM(Z_OBJ_P(zv), 22)
-#define Z_CLIENT_STREAM_CONTEXT_P(zv) OBJ_PROP_NUM(Z_OBJ_P(zv), 23)
-#define Z_CLIENT_USER_AGENT_P(zv) OBJ_PROP_NUM(Z_OBJ_P(zv), 24)
-#define Z_CLIENT_KEEP_ALIVE_P(zv) OBJ_PROP_NUM(Z_OBJ_P(zv), 25)
-#define Z_CLIENT_SSL_METHOD_P(zv) OBJ_PROP_NUM(Z_OBJ_P(zv), 26)
-#define Z_CLIENT_SOAP_VERSION_P(zv) OBJ_PROP_NUM(Z_OBJ_P(zv), 27)
-#define Z_CLIENT_USE_PROXY_P(zv) OBJ_PROP_NUM(Z_OBJ_P(zv), 28)
-#define Z_CLIENT_COOKIES_P(zv) OBJ_PROP_NUM(Z_OBJ_P(zv), 29)
-#define Z_CLIENT_DEFAULT_HEADERS_P(zv) OBJ_PROP_NUM(Z_OBJ_P(zv), 30)
-#define Z_CLIENT_SOAP_FAULT_P(zv) OBJ_PROP_NUM(Z_OBJ_P(zv), 31)
-#define Z_CLIENT_LAST_REQUEST_P(zv) OBJ_PROP_NUM(Z_OBJ_P(zv), 32)
-#define Z_CLIENT_LAST_RESPONSE_P(zv) OBJ_PROP_NUM(Z_OBJ_P(zv), 33)
-#define Z_CLIENT_LAST_REQUEST_HEADERS_P(zv) OBJ_PROP_NUM(Z_OBJ_P(zv), 34)
-#define Z_CLIENT_LAST_RESPONSE_HEADERS_P(zv) OBJ_PROP_NUM(Z_OBJ_P(zv), 35)
+#define Z_CLIENT_HTTPSOCKET_P(zv) OBJ_PROP_NUM(Z_OBJ_P(zv), 7)
+#define Z_CLIENT_HTTPURL_P(zv) OBJ_PROP_NUM(Z_OBJ_P(zv), 8)
+#define Z_CLIENT_LOGIN_P(zv) OBJ_PROP_NUM(Z_OBJ_P(zv), 9)
+#define Z_CLIENT_PASSWORD_P(zv) OBJ_PROP_NUM(Z_OBJ_P(zv), 10)
+#define Z_CLIENT_USE_DIGEST_P(zv) OBJ_PROP_NUM(Z_OBJ_P(zv), 11)
+#define Z_CLIENT_DIGEST_P(zv) OBJ_PROP_NUM(Z_OBJ_P(zv), 12)
+#define Z_CLIENT_PROXY_HOST_P(zv) OBJ_PROP_NUM(Z_OBJ_P(zv), 13)
+#define Z_CLIENT_PROXY_PORT_P(zv) OBJ_PROP_NUM(Z_OBJ_P(zv), 14)
+#define Z_CLIENT_PROXY_LOGIN_P(zv) OBJ_PROP_NUM(Z_OBJ_P(zv), 15)
+#define Z_CLIENT_PROXY_PASSWORD_P(zv) OBJ_PROP_NUM(Z_OBJ_P(zv), 16)
+#define Z_CLIENT_EXCEPTIONS_P(zv) OBJ_PROP_NUM(Z_OBJ_P(zv), 17)
+#define Z_CLIENT_ENCODING_P(zv) OBJ_PROP_NUM(Z_OBJ_P(zv), 18)
+#define Z_CLIENT_CLASSMAP_P(zv) OBJ_PROP_NUM(Z_OBJ_P(zv), 19)
+#define Z_CLIENT_FEATURES_P(zv) OBJ_PROP_NUM(Z_OBJ_P(zv), 20)
+#define Z_CLIENT_CONNECTION_TIMEOUT_P(zv) OBJ_PROP_NUM(Z_OBJ_P(zv), 21)
+#define Z_CLIENT_STREAM_CONTEXT_P(zv) OBJ_PROP_NUM(Z_OBJ_P(zv), 22)
+#define Z_CLIENT_USER_AGENT_P(zv) OBJ_PROP_NUM(Z_OBJ_P(zv), 23)
+#define Z_CLIENT_KEEP_ALIVE_P(zv) OBJ_PROP_NUM(Z_OBJ_P(zv), 24)
+#define Z_CLIENT_SSL_METHOD_P(zv) OBJ_PROP_NUM(Z_OBJ_P(zv), 25)
+#define Z_CLIENT_SOAP_VERSION_P(zv) OBJ_PROP_NUM(Z_OBJ_P(zv), 26)
+#define Z_CLIENT_USE_PROXY_P(zv) OBJ_PROP_NUM(Z_OBJ_P(zv), 27)
+#define Z_CLIENT_COOKIES_P(zv) OBJ_PROP_NUM(Z_OBJ_P(zv), 28)
+#define Z_CLIENT_DEFAULT_HEADERS_P(zv) OBJ_PROP_NUM(Z_OBJ_P(zv), 29)
+#define Z_CLIENT_SOAP_FAULT_P(zv) OBJ_PROP_NUM(Z_OBJ_P(zv), 30)
+#define Z_CLIENT_LAST_REQUEST_P(zv) OBJ_PROP_NUM(Z_OBJ_P(zv), 31)
+#define Z_CLIENT_LAST_RESPONSE_P(zv) OBJ_PROP_NUM(Z_OBJ_P(zv), 32)
+#define Z_CLIENT_LAST_REQUEST_HEADERS_P(zv) OBJ_PROP_NUM(Z_OBJ_P(zv), 33)
+#define Z_CLIENT_LAST_RESPONSE_HEADERS_P(zv) OBJ_PROP_NUM(Z_OBJ_P(zv), 34)
 
 typedef struct soap_url_object {
 	php_uri *uri;
 	zend_object std;
 } soap_url_object;
 
-static inline soap_url_object *soap_url_object_fetch(zend_object *obj)
-{
-	return (soap_url_object *) ((char *) obj - XtOffsetOf(soap_url_object, std));
-}
+#define soap_url_object_fetch(obj) ZEND_CONTAINER_OF(obj, soap_url_object, std)
 
 #define Z_SOAP_URL_P(zv) soap_url_object_fetch(Z_OBJ_P(zv))
 
diff --git a/ext/soap/php_xml.c b/ext/soap/php_xml.c
index a2536b98f39b..d5daaef15983 100644
--- a/ext/soap/php_xml.c
+++ b/ext/soap/php_xml.c
@@ -1,14 +1,12 @@
 /*
   +----------------------------------------------------------------------+
-  | Copyright (c) The PHP Group                                          |
+  | Copyright © The PHP Group and Contributors.                          |
   +----------------------------------------------------------------------+
-  | This source file is subject to version 3.01 of the PHP license,      |
-  | that is bundled with this package in the file LICENSE, and is        |
-  | available through the world-wide-web at the following url:           |
-  | https://www.php.net/license/3_01.txt                                 |
-  | If you did not receive a copy of the PHP license and are unable to   |
-  | obtain it through the world-wide-web, please send a note to          |
-  | license@php.net so we can mail you a copy immediately.               |
+  | This source file is subject to the Modified BSD License that is      |
+  | bundled with this package in the file LICENSE, and is available      |
+  | through the World Wide Web at .        |
+  |                                                                      |
+  | SPDX-License-Identifier: BSD-3-Clause                                |
   +----------------------------------------------------------------------+
   | Authors: Brad Lafountain                         |
   |          Shane Caraveo                            |
diff --git a/ext/soap/php_xml.h b/ext/soap/php_xml.h
index c967ac09d738..4a6d76427dd1 100644
--- a/ext/soap/php_xml.h
+++ b/ext/soap/php_xml.h
@@ -1,14 +1,12 @@
 /*
   +----------------------------------------------------------------------+
-  | Copyright (c) The PHP Group                                          |
+  | Copyright © The PHP Group and Contributors.                          |
   +----------------------------------------------------------------------+
-  | This source file is subject to version 3.01 of the PHP license,      |
-  | that is bundled with this package in the file LICENSE, and is        |
-  | available through the world-wide-web at the following url:           |
-  | https://www.php.net/license/3_01.txt                                 |
-  | If you did not receive a copy of the PHP license and are unable to   |
-  | obtain it through the world-wide-web, please send a note to          |
-  | license@php.net so we can mail you a copy immediately.               |
+  | This source file is subject to the Modified BSD License that is      |
+  | bundled with this package in the file LICENSE, and is available      |
+  | through the World Wide Web at .        |
+  |                                                                      |
+  | SPDX-License-Identifier: BSD-3-Clause                                |
   +----------------------------------------------------------------------+
   | Authors: Brad Lafountain                         |
   |          Shane Caraveo                            |
diff --git a/ext/soap/soap.c b/ext/soap/soap.c
index ba145c5497fe..83584283740d 100644
--- a/ext/soap/soap.c
+++ b/ext/soap/soap.c
@@ -1,14 +1,12 @@
 /*
   +----------------------------------------------------------------------+
-  | Copyright (c) The PHP Group                                          |
+  | Copyright © The PHP Group and Contributors.                          |
   +----------------------------------------------------------------------+
-  | This source file is subject to version 3.01 of the PHP license,      |
-  | that is bundled with this package in the file LICENSE, and is        |
-  | available through the world-wide-web at the following url:           |
-  | https://www.php.net/license/3_01.txt                                 |
-  | If you did not receive a copy of the PHP license and are unable to   |
-  | obtain it through the world-wide-web, please send a note to          |
-  | license@php.net so we can mail you a copy immediately.               |
+  | This source file is subject to the Modified BSD License that is      |
+  | bundled with this package in the file LICENSE, and is available      |
+  | through the World Wide Web at .        |
+  |                                                                      |
+  | SPDX-License-Identifier: BSD-3-Clause                                |
   +----------------------------------------------------------------------+
   | Authors: Brad Lafountain                         |
   |          Shane Caraveo                            |
@@ -190,6 +188,7 @@ zend_class_entry* soap_var_class_entry;
 zend_class_entry *soap_url_class_entry;
 zend_class_entry *soap_sdl_class_entry;
 
+static zend_object_handlers soap_client_object_handlers;
 static zend_object_handlers soap_server_object_handlers;
 static zend_object_handlers soap_url_object_handlers;
 static zend_object_handlers soap_sdl_object_handlers;
@@ -201,8 +200,29 @@ typedef struct {
 	zend_object std;
 } soap_server_object;
 
-static inline soap_server_object *soap_server_object_fetch(zend_object *obj) {
-	return (soap_server_object *) ((char *) obj - XtOffsetOf(soap_server_object, std));
+typedef struct {
+	HashTable *typemap;
+	zend_object std;
+} soap_client_object;
+
+#define soap_client_object_fetch(obj) ZEND_CONTAINER_OF(obj, soap_client_object, std)
+#define soap_server_object_fetch(obj) ZEND_CONTAINER_OF(obj, soap_server_object, std)
+
+static zend_object *soap_client_object_create(zend_class_entry *ce)
+{
+	soap_client_object *obj = zend_object_alloc(sizeof(soap_client_object), ce);
+	zend_object_std_init(&obj->std, ce);
+	object_properties_init(&obj->std, ce);
+	return &obj->std;
+}
+
+static void soap_client_object_free(zend_object *obj) {
+	soap_client_object *client_obj = soap_client_object_fetch(obj);
+	if (client_obj->typemap) {
+		zend_hash_destroy(client_obj->typemap);
+		FREE_HASHTABLE(client_obj->typemap);
+	}
+	zend_object_std_dtor(obj);
 }
 
 static zend_object *soap_server_object_create(zend_class_entry *ce)
@@ -261,10 +281,7 @@ static zend_result soap_url_cast_object(zend_object *obj, zval *result, int type
 	return zend_std_cast_object_tostring(obj, result, type);
 }
 
-static inline soap_sdl_object *soap_sdl_object_fetch(zend_object *obj)
-{
-	return (soap_sdl_object *) ((char *) obj - XtOffsetOf(soap_sdl_object, std));
-}
+#define soap_sdl_object_fetch(obj) ZEND_CONTAINER_OF(obj, soap_sdl_object, std)
 
 #define Z_SOAP_SDL_P(zv) soap_sdl_object_fetch(Z_OBJ_P(zv))
 
@@ -360,7 +377,7 @@ static PHP_INI_MH(OnUpdateCacheDir)
 	if (stage == PHP_INI_STAGE_RUNTIME || stage == PHP_INI_STAGE_HTACCESS) {
 		char *p;
 
-		if (memchr(ZSTR_VAL(new_value), '\0', ZSTR_LEN(new_value)) != NULL) {
+		if (zend_str_has_nul_byte(new_value)) {
 			return FAILURE;
 		}
 
@@ -503,6 +520,13 @@ PHP_MINIT_FUNCTION(soap)
 
 	/* Register SoapClient class */
 	soap_class_entry = register_class_SoapClient();
+	soap_class_entry->create_object = soap_client_object_create;
+	soap_class_entry->default_object_handlers = &soap_client_object_handlers;
+
+	memcpy(&soap_client_object_handlers, &std_object_handlers, sizeof(zend_object_handlers));
+	soap_client_object_handlers.offset = offsetof(soap_client_object, std);
+	soap_client_object_handlers.free_obj = soap_client_object_free;
+	soap_client_object_handlers.clone_obj = NULL;
 
 	/* Register SoapVar class */
 	soap_var_class_entry = register_class_SoapVar();
@@ -513,7 +537,7 @@ PHP_MINIT_FUNCTION(soap)
 	soap_server_class_entry->default_object_handlers = &soap_server_object_handlers;
 
 	memcpy(&soap_server_object_handlers, &std_object_handlers, sizeof(zend_object_handlers));
-	soap_server_object_handlers.offset = XtOffsetOf(soap_server_object, std);
+	soap_server_object_handlers.offset = offsetof(soap_server_object, std);
 	soap_server_object_handlers.free_obj = soap_server_object_free;
 	soap_server_object_handlers.clone_obj = NULL;
 
@@ -530,7 +554,7 @@ PHP_MINIT_FUNCTION(soap)
 	soap_url_class_entry->default_object_handlers = &soap_url_object_handlers;
 
 	memcpy(&soap_url_object_handlers, &std_object_handlers, sizeof(zend_object_handlers));
-	soap_url_object_handlers.offset = XtOffsetOf(soap_url_object, std);
+	soap_url_object_handlers.offset = offsetof(soap_url_object, std);
 	soap_url_object_handlers.free_obj = soap_url_object_free;
 	soap_url_object_handlers.get_constructor = soap_url_object_get_constructor;
 	soap_url_object_handlers.clone_obj = NULL;
@@ -542,7 +566,7 @@ PHP_MINIT_FUNCTION(soap)
 	soap_sdl_class_entry->default_object_handlers = &soap_sdl_object_handlers;
 
 	memcpy(&soap_sdl_object_handlers, &std_object_handlers, sizeof(zend_object_handlers));
-	soap_sdl_object_handlers.offset = XtOffsetOf(soap_sdl_object, std);
+	soap_sdl_object_handlers.offset = offsetof(soap_sdl_object, std);
 	soap_sdl_object_handlers.free_obj = soap_sdl_object_free;
 	soap_sdl_object_handlers.get_constructor = soap_sdl_object_get_constructor;
 	soap_sdl_object_handlers.clone_obj = NULL;
@@ -1389,10 +1413,10 @@ PHP_METHOD(SoapServer, handle)
 						return;
 					}
 				}
-			}
 
-			if ((soap_action_z = zend_hash_str_find(Z_ARRVAL_P(server_vars), ZEND_STRL("HTTP_SOAPACTION"))) != NULL && Z_TYPE_P(soap_action_z) == IS_STRING) {
-				soap_action = Z_STRVAL_P(soap_action_z);
+			    if ((soap_action_z = zend_hash_str_find(Z_ARRVAL_P(server_vars), ZEND_STRL("HTTP_SOAPACTION"))) != NULL && Z_TYPE_P(soap_action_z) == IS_STRING && Z_STRLEN_P(soap_action_z) > 0) {
+				    soap_action = Z_STRVAL_P(soap_action_z);
+			    }
 			}
 
 			doc_request = soap_xmlParseFile("php://input");
@@ -1560,12 +1584,20 @@ PHP_METHOD(SoapServer, handle)
 				    instanceof_function(Z_OBJCE(h->retval), soap_fault_class_entry)) {
 					php_output_discard();
 					soap_server_fault_ex(function, &h->retval, h);
-					if (service->type == SOAP_CLASS && soap_obj) {zval_ptr_dtor(soap_obj);}
+					if (service->type == SOAP_CLASS && soap_obj) {
+						if (service->soap_class.persistence != SOAP_PERSISTENCE_SESSION) {
+							zval_ptr_dtor(soap_obj);
+						}
+					}
 					goto fail;
 				} else if (EG(exception)) {
 					php_output_discard();
 					_soap_server_exception(service, function, ZEND_THIS);
-					if (service->type == SOAP_CLASS && soap_obj) {zval_ptr_dtor(soap_obj);}
+					if (service->type == SOAP_CLASS && soap_obj) {
+						if (service->soap_class.persistence != SOAP_PERSISTENCE_SESSION) {
+							zval_ptr_dtor(soap_obj);
+						}
+					}
 					goto fail;
 				}
 			} else if (h->mustUnderstand) {
@@ -1661,7 +1693,7 @@ PHP_METHOD(SoapServer, handle)
 			sapi_add_header("Content-Type: text/xml; charset=utf-8", sizeof("Content-Type: text/xml; charset=utf-8")-1, 1);
 		}
 
-		if (INI_INT("zlib.output_compression")) {
+		if (zend_ini_long_literal("zlib.output_compression")) {
 			sapi_add_header("Connection: close", sizeof("Connection: close")-1, 1);
 		} else {
 			snprintf(cont_len, sizeof(cont_len), "Content-Length: %d", size);
@@ -1823,7 +1855,7 @@ static void soap_server_fault_ex(sdlFunctionPtr function, zval* fault, soapHeade
 	if (use_http_error_status) {
 		sapi_add_header("HTTP/1.1 500 Internal Server Error", sizeof("HTTP/1.1 500 Internal Server Error")-1, 1);
 	}
-	if (INI_INT("zlib.output_compression")) {
+	if (zend_ini_long_literal("zlib.output_compression")) {
 		sapi_add_header("Connection: close", sizeof("Connection: close")-1, 1);
 	} else {
 		snprintf(cont_len, sizeof(cont_len), "Content-Length: %d", size);
@@ -1917,7 +1949,7 @@ static zend_never_inline ZEND_COLD void soap_real_error_handler(int error_num, z
 			} else {
 				buffer = zend_string_copy(message);
 
-				/* Get output buffer and send as fault detials */
+				/* Get output buffer and send as fault details */
 				zval outbuflen;
 				if (php_output_get_length(&outbuflen) != FAILURE && Z_LVAL(outbuflen) != 0) {
 					php_output_get_contents(&outbuf);
@@ -1993,6 +2025,7 @@ PHP_FUNCTION(is_soap_fault)
 /* SoapClient functions */
 
 /* {{{ SoapClient constructor */
+/* FIXME: double construct call will break this class */
 PHP_METHOD(SoapClient, __construct)
 {
 
@@ -2216,10 +2249,7 @@ PHP_METHOD(SoapClient, __construct)
 	}
 
 	if (typemap_ht) {
-		HashTable *typemap = soap_create_typemap(sdl, typemap_ht);
-		if (typemap) {
-			ZVAL_ARR(Z_CLIENT_TYPEMAP_P(this_ptr), typemap);
-		}
+		soap_client_object_fetch(Z_OBJ_P(this_ptr))->typemap = soap_create_typemap(sdl, typemap_ht);
 	}
 	SOAP_CLIENT_END_CODE();
 }
@@ -2347,10 +2377,7 @@ static void do_soap_call(zend_execute_data *execute_data,
 		sdl = Z_SOAP_SDL_P(tmp)->sdl;
 	}
 
-	tmp = Z_CLIENT_TYPEMAP_P(this_ptr);
-	if (Z_TYPE_P(tmp) == IS_ARRAY) {
-		typemap = Z_ARR_P(tmp);
-	}
+	typemap = soap_client_object_fetch(Z_OBJ_P(this_ptr))->typemap;
 
 	clear_soap_fault(this_ptr);
 
@@ -2414,9 +2441,19 @@ static void do_soap_call(zend_execute_data *execute_data,
 				request = NULL;
 
 				if (ret && Z_TYPE(response) == IS_STRING) {
+					bool parse_bailout = false;
+
 					encode_reset_ns();
-					ret = parse_packet_soap(this_ptr, Z_STRVAL(response), Z_STRLEN(response), fn, NULL, return_value, output_headers);
+					zend_try {
+						ret = parse_packet_soap(this_ptr, Z_STRVAL(response), Z_STRLEN(response), fn, NULL, return_value, output_headers);
+					} zend_catch {
+						parse_bailout = true;
+					} zend_end_try();
 					encode_finish();
+					if (parse_bailout) {
+						zval_ptr_dtor(&response);
+						zend_bailout();
+					}
 				}
 
 				zval_ptr_dtor(&response);
@@ -2458,9 +2495,19 @@ static void do_soap_call(zend_execute_data *execute_data,
 				request = NULL;
 
 				if (ret && Z_TYPE(response) == IS_STRING) {
+					bool parse_bailout = false;
+
 					encode_reset_ns();
-					ret = parse_packet_soap(this_ptr, Z_STRVAL(response), Z_STRLEN(response), NULL, NULL, return_value, output_headers);
+					zend_try {
+						ret = parse_packet_soap(this_ptr, Z_STRVAL(response), Z_STRLEN(response), NULL, NULL, return_value, output_headers);
+					} zend_catch {
+						parse_bailout = true;
+					} zend_end_try();
 					encode_finish();
+					if (parse_bailout) {
+						zval_ptr_dtor(&response);
+						zend_bailout();
+					}
 				}
 
 				zval_ptr_dtor(&response);
@@ -2805,7 +2852,7 @@ PHP_METHOD(SoapClient, __doRequest)
 }
 /* }}} */
 
-/* {{{ Sets cookie thet will sent with SOAP request.
+/* {{{ Sets cookie that will sent with SOAP request.
    The call to this function will effect all following calls of SOAP methods.
    If value is not specified cookie is removed. */
 PHP_METHOD(SoapClient, __setCookie)
@@ -3132,6 +3179,10 @@ static sdlFunctionPtr find_function_using_soap_action(const sdl *sdl, const char
 		soap_action_length -= 2;
 	}
 
+	if (UNEXPECTED(soap_action_length == 0)) {
+		return NULL;
+	}
+
 	/* TODO: This may depend on a particular target namespace, in which case this won't find a match when multiple different
 	 *       target namespaces are used until #45282 is resolved. */
 	sdlFunctionPtr function;
@@ -3372,7 +3423,7 @@ static sdlFunctionPtr deserialize_function_call(sdlPtr sdl, xmlDocPtr request, c
 							smart_str_appends(&key, (char*)hdr_func->ns->href);
 							smart_str_appendc(&key, ':');
 						}
-						smart_str_appendl(&key, Z_STRVAL(h->function_name), Z_STRLEN(h->function_name));
+						smart_str_append(&key, Z_STR(h->function_name));
 						smart_str_0(&key);
 						if ((hdr = zend_hash_find_ptr(fnb->input.headers, key.s)) != NULL) {
 							h->hdr = hdr;
@@ -3609,14 +3660,14 @@ static xmlDocPtr serialize_response_call(sdlFunctionPtr function, const char *fu
 
 				tmp = Z_HEADER_NAMESPACE_P(hdr_ret);
 				if (Z_TYPE_P(tmp) == IS_STRING) {
-					smart_str_appendl(&key, Z_STRVAL_P(tmp), Z_STRLEN_P(tmp));
+					smart_str_append(&key, Z_STR_P(tmp));
 					smart_str_appendc(&key, ':');
 					hdr_ns = Z_STRVAL_P(tmp);
 				}
 
 				tmp = Z_HEADER_NAME_P(hdr_ret);
 				if (Z_TYPE_P(tmp) == IS_STRING) {
-					smart_str_appendl(&key, Z_STRVAL_P(tmp), Z_STRLEN_P(tmp));
+					smart_str_append(&key, Z_STR_P(tmp));
 					hdr_name = Z_STRVAL_P(tmp);
 				}
 				smart_str_0(&key);
@@ -3842,13 +3893,13 @@ static xmlDocPtr serialize_response_call(sdlFunctionPtr function, const char *fu
 
 						tmp = Z_HEADER_NAMESPACE_P(&h->retval);
 						if (Z_TYPE_P(tmp) == IS_STRING) {
-							smart_str_appendl(&key, Z_STRVAL_P(tmp), Z_STRLEN_P(tmp));
+							smart_str_append(&key, Z_STR_P(tmp));
 							smart_str_appendc(&key, ':');
 							hdr_ns = Z_STRVAL_P(tmp);
 						}
 						tmp = Z_HEADER_NAME_P(&h->retval);
 						if (Z_TYPE_P(tmp) == IS_STRING) {
-							smart_str_appendl(&key, Z_STRVAL_P(tmp), Z_STRLEN_P(tmp));
+							smart_str_append(&key, Z_STR_P(tmp));
 							hdr_name = Z_STRVAL_P(tmp);
 						}
 						smart_str_0(&key);
@@ -4084,9 +4135,9 @@ static xmlDocPtr serialize_function_call(zval *this_ptr, sdlFunctionPtr function
 					smart_str key = {0};
 					sdlSoapBindingFunctionHeaderPtr hdr;
 
-					smart_str_appendl(&key, Z_STRVAL_P(ns), Z_STRLEN_P(ns));
+					smart_str_append(&key, Z_STR_P(ns));
 					smart_str_appendc(&key, ':');
-					smart_str_appendl(&key, Z_STRVAL_P(name), Z_STRLEN_P(name));
+					smart_str_append(&key, Z_STR_P(name));
 					smart_str_0(&key);
 					if ((hdr = zend_hash_find_ptr(hdrs, key.s)) != NULL) {
 						hdr_use = hdr->use;
@@ -4419,7 +4470,7 @@ static void type_to_string(sdlTypePtr type, smart_str *buf, int level) /* {{{ */
 		smart_str_appendc(&spaces, ' ');
 	}
 	if (spaces.s) {
-		smart_str_appendl(buf, ZSTR_VAL(spaces.s), ZSTR_LEN(spaces.s));
+		smart_str_append(buf, spaces.s);
 	}
 	switch (type->kind) {
 		case XSD_TYPEKIND_SIMPLE:
@@ -4558,7 +4609,7 @@ static void type_to_string(sdlTypePtr type, smart_str *buf, int level) /* {{{ */
 					}
 					if (enc) {
 						if (spaces.s) {
-							smart_str_appendl(buf, ZSTR_VAL(spaces.s), ZSTR_LEN(spaces.s));
+							smart_str_append(buf, spaces.s);
 						}
 						smart_str_appendc(buf, ' ');
 						smart_str_appends(buf, type->encode->details.type_str);
@@ -4573,7 +4624,7 @@ static void type_to_string(sdlTypePtr type, smart_str *buf, int level) /* {{{ */
 
 					ZEND_HASH_FOREACH_PTR(type->attributes, attr) {
 						if (spaces.s) {
-							smart_str_appendl(buf, ZSTR_VAL(spaces.s), ZSTR_LEN(spaces.s));
+							smart_str_append(buf, spaces.s);
 						}
 						smart_str_appendc(buf, ' ');
 						if (attr->encode && attr->encode->details.type_str) {
@@ -4587,7 +4638,7 @@ static void type_to_string(sdlTypePtr type, smart_str *buf, int level) /* {{{ */
 					} ZEND_HASH_FOREACH_END();
 				}
 				if (spaces.s) {
-					smart_str_appendl(buf, ZSTR_VAL(spaces.s), ZSTR_LEN(spaces.s));
+					smart_str_append(buf, spaces.s);
 				}
 				smart_str_appendc(buf, '}');
 			}
diff --git a/ext/soap/soap.stub.php b/ext/soap/soap.stub.php
index 851b32042bd1..fdd4a46e109f 100644
--- a/ext/soap/soap.stub.php
+++ b/ext/soap/soap.stub.php
@@ -541,7 +541,6 @@ class SoapClient
         private bool $trace = false;
         private ?int $compression = null;
         private ?Soap\Sdl $sdl = null;
-        private ?array $typemap = null;
         /** @var resource|null */
         private $httpsocket = null;
         private ?Soap\Url $httpurl = null;
diff --git a/ext/soap/soap_arginfo.h b/ext/soap/soap_arginfo.h
index e3fdd48e58ff..2f7d56ca4221 100644
--- a/ext/soap/soap_arginfo.h
+++ b/ext/soap/soap_arginfo.h
@@ -1,5 +1,5 @@
 /* This is a generated file, edit soap.stub.php instead.
- * Stub hash: 24e266bf0933d5622f2a341db5b694ecb1740f13 */
+ * Stub hash: 14c74a5d6f547837f536920d5abb741e2b6e4373 */
 
 ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_use_soap_error_handler, 0, 0, _IS_BOOL, 0)
 	ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, enable, _IS_BOOL, 0, "true")
@@ -575,12 +575,6 @@ static zend_class_entry *register_class_SoapClient(void)
 	zend_declare_typed_property(class_entry, property_sdl_name, &property_sdl_default_value, ZEND_ACC_PRIVATE, NULL, (zend_type) ZEND_TYPE_INIT_CLASS(property_sdl_class_Soap_Sdl, 0, MAY_BE_NULL));
 	zend_string_release_ex(property_sdl_name, true);
 
-	zval property_typemap_default_value;
-	ZVAL_NULL(&property_typemap_default_value);
-	zend_string *property_typemap_name = zend_string_init("typemap", sizeof("typemap") - 1, true);
-	zend_declare_typed_property(class_entry, property_typemap_name, &property_typemap_default_value, ZEND_ACC_PRIVATE, NULL, (zend_type) ZEND_TYPE_INIT_MASK(MAY_BE_ARRAY|MAY_BE_NULL));
-	zend_string_release_ex(property_typemap_name, true);
-
 	zval property_httpsocket_default_value;
 	ZVAL_NULL(&property_httpsocket_default_value);
 	zend_string *property_httpsocket_name = zend_string_init("httpsocket", sizeof("httpsocket") - 1, true);
diff --git a/ext/soap/tests/GHSA-85c2-q967-79q5.phpt b/ext/soap/tests/GHSA-85c2-q967-79q5.phpt
new file mode 100644
index 000000000000..8bcac26ad187
--- /dev/null
+++ b/ext/soap/tests/GHSA-85c2-q967-79q5.phpt
@@ -0,0 +1,61 @@
+--TEST--
+GHSA-85c2-q967-79q5: Stale SOAP_GLOBAL(ref_map) pointer with Apache Map
+--CREDITS--
+brettgervasoni
+--EXTENSIONS--
+soap
+--FILE--
+
+
+
+    
+        
+            
+                
+                    foo
+                    bar
+                
+                
+                    foo
+                    baz
+                
+            
+            
+        
+    
+
+XML;
+
+$s = new SoapServer(null, ['uri' => 'urn:a']);
+$s->setClass(Handler::class);
+$s->handle($envelope);
+var_dump($result);
+
+?>
+--EXPECTF--
+
+
+array(2) {
+  [0]=>
+  array(1) {
+    ["foo"]=>
+    string(3) "baz"
+  }
+  [1]=>
+  object(stdClass)#%d (1) {
+    ["object"]=>
+    string(3) "bar"
+  }
+}
diff --git a/ext/soap/tests/GHSA-hmxp-6pc4-f3vv.phpt b/ext/soap/tests/GHSA-hmxp-6pc4-f3vv.phpt
new file mode 100644
index 000000000000..e46ab2e4607d
--- /dev/null
+++ b/ext/soap/tests/GHSA-hmxp-6pc4-f3vv.phpt
@@ -0,0 +1,39 @@
+--TEST--
+GHSA-hmxp-6pc4-f3vv: Null pointer dereference on missing Apache map value
+--CREDITS--
+Ilia Alshanetsky (iliaal)
+--EXTENSIONS--
+soap
+--FILE--
+
+
+
+    
+        
+            
+                hello
+            
+        
+    
+
+XML;
+
+$server = new SoapServer(null, [
+    'uri' => 'urn:test',
+    'typemap' => [['type_name' => 'anything']],
+]);
+$server->addFunction('test');
+function test($m) { return null; }
+$server->handle($request);
+
+?>
+--EXPECT--
+
+SOAP-ENV:ServerSOAP-ERROR: Encoding: Can't decode apache map, missing value
diff --git a/ext/soap/tests/GHSA-m33r-qmcv-p97q.phpt b/ext/soap/tests/GHSA-m33r-qmcv-p97q.phpt
new file mode 100644
index 000000000000..bcf441ccd18a
--- /dev/null
+++ b/ext/soap/tests/GHSA-m33r-qmcv-p97q.phpt
@@ -0,0 +1,58 @@
+--TEST--
+GHSA-m33r-qmcv-p97q: Use-after-free after header parsing failure with SOAP_PERSISTENCE_SESSION
+--CREDITS--
+Ilia Alshanetsky (iliaal)
+--EXTENSIONS--
+soap
+session
+--FILE--
+ 'urn:a']);
+$srv->setClass(Handler::class);
+$srv->setPersistence(SOAP_PERSISTENCE_SESSION);
+
+$srv->handle(<<
+
+    
+        
+    
+    
+        
+    
+
+XML);
+
+$srv->handle(<<
+
+    
+        
+    
+    
+        
+    
+
+XML);
+
+?>
+--EXPECT--
+
+SOAP-ENV:Serverdenied
+
+SOAP-ENV:Serverdenied
diff --git a/ext/soap/tests/bugs/gh21421.phpt b/ext/soap/tests/bugs/gh21421.phpt
new file mode 100644
index 000000000000..1b8bb3be716f
--- /dev/null
+++ b/ext/soap/tests/bugs/gh21421.phpt
@@ -0,0 +1,90 @@
+--TEST--
+GH-21421 (SoapClient typemap property breaks engine assumptions)
+--EXTENSIONS--
+soap
+--FILE--
+ 'http://schemas.nothing.com',
+'location' => 'test://',
+'typemap'  => array(array("type_ns"   => "http://schemas.nothing.com",
+"type_name" => "book",
+"from_xml"  => "book_from_xml"))
+);
+$client = new SoapClient(NULL, $options);
+var_dump($client);
+?>
+--EXPECTF--
+object(SoapClient)#%d (35) {
+  ["uri":"SoapClient":private]=>
+  string(26) "http://schemas.nothing.com"
+  ["style":"SoapClient":private]=>
+  NULL
+  ["use":"SoapClient":private]=>
+  NULL
+  ["location":"SoapClient":private]=>
+  string(7) "test://"
+  ["trace":"SoapClient":private]=>
+  bool(false)
+  ["compression":"SoapClient":private]=>
+  NULL
+  ["sdl":"SoapClient":private]=>
+  NULL
+  ["httpsocket":"SoapClient":private]=>
+  NULL
+  ["httpurl":"SoapClient":private]=>
+  NULL
+  ["_login":"SoapClient":private]=>
+  NULL
+  ["_password":"SoapClient":private]=>
+  NULL
+  ["_use_digest":"SoapClient":private]=>
+  bool(false)
+  ["_digest":"SoapClient":private]=>
+  NULL
+  ["_proxy_host":"SoapClient":private]=>
+  NULL
+  ["_proxy_port":"SoapClient":private]=>
+  NULL
+  ["_proxy_login":"SoapClient":private]=>
+  NULL
+  ["_proxy_password":"SoapClient":private]=>
+  NULL
+  ["_exceptions":"SoapClient":private]=>
+  bool(true)
+  ["_encoding":"SoapClient":private]=>
+  NULL
+  ["_classmap":"SoapClient":private]=>
+  NULL
+  ["_features":"SoapClient":private]=>
+  NULL
+  ["_connection_timeout":"SoapClient":private]=>
+  int(0)
+  ["_stream_context":"SoapClient":private]=>
+  resource(%d) of type (stream-context)
+  ["_user_agent":"SoapClient":private]=>
+  NULL
+  ["_keep_alive":"SoapClient":private]=>
+  bool(true)
+  ["_ssl_method":"SoapClient":private]=>
+  NULL
+  ["_soap_version":"SoapClient":private]=>
+  int(1)
+  ["_use_proxy":"SoapClient":private]=>
+  NULL
+  ["_cookies":"SoapClient":private]=>
+  array(0) {
+  }
+  ["__default_headers":"SoapClient":private]=>
+  NULL
+  ["__soap_fault":"SoapClient":private]=>
+  NULL
+  ["__last_request":"SoapClient":private]=>
+  NULL
+  ["__last_response":"SoapClient":private]=>
+  NULL
+  ["__last_request_headers":"SoapClient":private]=>
+  NULL
+  ["__last_response_headers":"SoapClient":private]=>
+  NULL
+}
diff --git a/ext/soap/tests/bugs/gh22167.phpt b/ext/soap/tests/bugs/gh22167.phpt
new file mode 100644
index 000000000000..f24bfb0eac32
--- /dev/null
+++ b/ext/soap/tests/bugs/gh22167.phpt
@@ -0,0 +1,128 @@
+--TEST--
+GH-22167 (Out-of-range XML Schema integer values in SOAP WSDL)
+--EXTENSIONS--
+soap
+--INI--
+soap.wsdl_cache_enabled=0
+--FILE--
+
+
+  
+    
+      $schema
+    
+  
+  
+  
+  
+    
+    
+      
+      
+        
+      
+    
+  
+  
+
+XML;
+}
+
+function occurrence_schema(string $attribute, string $value = "2147483648"): string {
+    return <<
+  
+    
+  
+
+XML;
+}
+
+function restriction_schema(string $facet, string $value = "2147483648"): string {
+    return <<
+  
+    
+  
+
+XML;
+}
+
+$cases = [
+    "minOccurs" => occurrence_schema("minOccurs"),
+    "maxOccurs" => occurrence_schema("maxOccurs"),
+    "negative minOccurs" => occurrence_schema("minOccurs", "-1"),
+    "negative maxOccurs" => occurrence_schema("maxOccurs", "-1"),
+    "minExclusive" => restriction_schema("minExclusive"),
+    "minInclusive" => restriction_schema("minInclusive"),
+    "maxExclusive" => restriction_schema("maxExclusive"),
+    "maxInclusive" => restriction_schema("maxInclusive"),
+    "totalDigits" => restriction_schema("totalDigits"),
+    "fractionDigits" => restriction_schema("fractionDigits"),
+    "length" => restriction_schema("length"),
+    "minLength" => restriction_schema("minLength"),
+    "maxLength" => restriction_schema("maxLength"),
+];
+
+$numeric_string_cases = [
+    "leading whitespace numeric-string" => " 2147483648",
+    "leading plus numeric-string" => "+2147483648",
+    "leading zero numeric-string" => "00000000002147483648",
+    "leading numeric-string with trailing data" => "2147483648abc",
+    "negative out-of-range numeric-string" => "-2147483649",
+    "decimal numeric-string" => "2147483648.0",
+    "exponent numeric-string" => "2147483648e0",
+];
+
+foreach ($numeric_string_cases as $name => $value) {
+    $cases[$name] = occurrence_schema("maxOccurs", $value);
+}
+
+$cases["fractional numeric-string within int range"] = occurrence_schema("maxOccurs", "3.141");
+
+foreach ($cases as $name => $schema) {
+    $file = tempnam(sys_get_temp_dir(), "wsdl");
+    file_put_contents($file, wsdl_with_schema($schema));
+
+    try {
+        new SoapClient($file, ["cache_wsdl" => WSDL_CACHE_NONE]);
+        echo "$name: parsed\n";
+    } catch (SoapFault $e) {
+        echo "$name: {$e->getMessage()}\n";
+    } finally {
+        unlink($file);
+    }
+}
+?>
+--EXPECT--
+minOccurs: SOAP-ERROR: Parsing Schema: minOccurs value is out of range
+maxOccurs: SOAP-ERROR: Parsing Schema: maxOccurs value is out of range
+negative minOccurs: SOAP-ERROR: Parsing Schema: minOccurs value is out of range
+negative maxOccurs: SOAP-ERROR: Parsing Schema: maxOccurs value is out of range
+minExclusive: SOAP-ERROR: Parsing Schema: minExclusive value is out of range
+minInclusive: SOAP-ERROR: Parsing Schema: minInclusive value is out of range
+maxExclusive: SOAP-ERROR: Parsing Schema: maxExclusive value is out of range
+maxInclusive: SOAP-ERROR: Parsing Schema: maxInclusive value is out of range
+totalDigits: SOAP-ERROR: Parsing Schema: totalDigits value is out of range
+fractionDigits: SOAP-ERROR: Parsing Schema: fractionDigits value is out of range
+length: SOAP-ERROR: Parsing Schema: length value is out of range
+minLength: SOAP-ERROR: Parsing Schema: minLength value is out of range
+maxLength: SOAP-ERROR: Parsing Schema: maxLength value is out of range
+leading whitespace numeric-string: SOAP-ERROR: Parsing Schema: maxOccurs value is out of range
+leading plus numeric-string: SOAP-ERROR: Parsing Schema: maxOccurs value is out of range
+leading zero numeric-string: SOAP-ERROR: Parsing Schema: maxOccurs value is out of range
+leading numeric-string with trailing data: SOAP-ERROR: Parsing Schema: maxOccurs value is out of range
+negative out-of-range numeric-string: SOAP-ERROR: Parsing Schema: maxOccurs value is out of range
+decimal numeric-string: SOAP-ERROR: Parsing Schema: maxOccurs value is out of range
+exponent numeric-string: SOAP-ERROR: Parsing Schema: maxOccurs value is out of range
+fractional numeric-string within int range: parsed
diff --git a/ext/soap/tests/bugs/gh22285.phpt b/ext/soap/tests/bugs/gh22285.phpt
new file mode 100644
index 000000000000..8c7e0933588e
--- /dev/null
+++ b/ext/soap/tests/bugs/gh22285.phpt
@@ -0,0 +1,45 @@
+--TEST--
+GH-22285 (SoapServer dispatches to the first function when the SOAPAction header is empty)
+--CREDITS--
+Jarkko Hyvärinen
+--EXTENSIONS--
+soap
+--INI--
+soap.wsdl_cache_enabled=0
+--SKIPIF--
+
+--POST--
+
+    
+        
+            World
+        
+    
+
+--FILE--
+ 'Hello ' . $params->name];
+    }
+    public function goodbye($params) {
+        return ['message' => 'Goodbye ' . $params->name];
+    }
+}
+
+$server = new SoapServer(__DIR__ . '/gh22285.wsdl', [
+    'cache_wsdl'   => WSDL_CACHE_NONE,
+    'encoding'     => 'UTF-8',
+    'soap_version' => SOAP_1_1,
+]);
+$server->setClass('TestWS');
+$_SERVER['HTTP_SOAPACTION'] = '""';
+$server->handle();
+?>
+--EXPECTF--
+
+Goodbye World
diff --git a/ext/soap/tests/bugs/gh22285.wsdl b/ext/soap/tests/bugs/gh22285.wsdl
new file mode 100644
index 000000000000..66b9e6749071
--- /dev/null
+++ b/ext/soap/tests/bugs/gh22285.wsdl
@@ -0,0 +1,96 @@
+
+
+
+    
+        
+            
+                
+                    
+                        
+                    
+                
+            
+            
+                
+                    
+                        
+                    
+                
+            
+            
+                
+                    
+                        
+                    
+                
+            
+            
+                
+                    
+                        
+                    
+                
+            
+        
+    
+
+    
+        
+    
+    
+        
+    
+    
+        
+    
+    
+        
+    
+
+    
+        
+            
+            
+        
+        
+            
+            
+        
+    
+
+    
+        
+        
+            
+            
+                
+            
+            
+                
+            
+        
+        
+            
+            
+                
+            
+            
+                
+            
+        
+    
+
+    
+        
+            
+        
+    
+
+
diff --git a/ext/soap/tests/bugs/relative_redirect.phpt b/ext/soap/tests/bugs/relative_redirect.phpt
new file mode 100644
index 000000000000..774e7cbd98d7
--- /dev/null
+++ b/ext/soap/tests/bugs/relative_redirect.phpt
@@ -0,0 +1,49 @@
+--TEST--
+SOAP client follows a redirect with a scheme-less (relative) Location
+--EXTENSIONS--
+soap
+--SKIPIF--
+
+--FILE--
+',
+        '',
+        'ok',
+        '';
+} else {
+    http_response_code(302);
+    header("Location: /redirected");
+}
+PHP;
+
+php_cli_server_start($code, null, $args);
+
+$client = new SoapClient(null, [
+    'location' => 'http://' . PHP_CLI_SERVER_ADDRESS . '/start',
+    'uri' => 'test-uri',
+]);
+
+try {
+    $client->__soapCall("foo", []);
+    echo "redirect followed\n";
+} catch (SoapFault $e) {
+    echo "SoapFault: " . $e->getMessage() . "\n";
+}
+?>
+--EXPECT--
+redirect followed
diff --git a/ext/soap/tests/bugs/relative_redirect_path.phpt b/ext/soap/tests/bugs/relative_redirect_path.phpt
new file mode 100644
index 000000000000..09d4c857cc92
--- /dev/null
+++ b/ext/soap/tests/bugs/relative_redirect_path.phpt
@@ -0,0 +1,49 @@
+--TEST--
+SOAP client follows a redirect with a relative Location resolved against the request path
+--EXTENSIONS--
+soap
+--SKIPIF--
+
+--FILE--
+',
+        '',
+        'ok',
+        '';
+} else {
+    http_response_code(302);
+    header("Location: redirected");
+}
+PHP;
+
+php_cli_server_start($code, null, $args);
+
+$client = new SoapClient(null, [
+    'location' => 'http://' . PHP_CLI_SERVER_ADDRESS . '/svc/start',
+    'uri' => 'test-uri',
+]);
+
+try {
+    $client->__soapCall("foo", []);
+    echo "redirect followed\n";
+} catch (SoapFault $e) {
+    echo "SoapFault: " . $e->getMessage() . "\n";
+}
+?>
+--EXPECT--
+redirect followed
diff --git a/ext/soap/tests/gh22218.phpt b/ext/soap/tests/gh22218.phpt
new file mode 100644
index 000000000000..5b0714037a0a
--- /dev/null
+++ b/ext/soap/tests/gh22218.phpt
@@ -0,0 +1,25 @@
+--TEST--
+GH-22218 (SoapServer::handle() segfault on non-array/unset $_SERVER)
+--EXTENSIONS--
+soap
+--CREDITS--
+Rex-Reynolds
+--SKIPIF--
+
+--POST--
+
+    
+        
+    
+
+--FILE--
+ 'http://test-uri']);
+$server->handle();
+?>
+--EXPECTF--
+%AFunction 'test' doesn't exist%A
diff --git a/ext/soap/tests/soap_array_index_overflow.phpt b/ext/soap/tests/soap_array_index_overflow.phpt
new file mode 100644
index 000000000000..ae481ee317ff
--- /dev/null
+++ b/ext/soap/tests/soap_array_index_overflow.phpt
@@ -0,0 +1,89 @@
+--TEST--
+SOAP array index overflow is rejected
+--EXTENSIONS--
+soap
+--FILE--
+response;
+    }
+}
+
+function soap_response(string $attributes, string $itemAttributes = ''): string {
+    return <<
+
+  
+    
+      
+        value
+      
+    
+  
+
+XML;
+}
+
+function test_overflow(string $name, string $response): void {
+    $client = new TestSoapClient(NULL, [
+        'location' => 'test://',
+        'uri' => 'http://example.org/',
+        'exceptions' => true,
+    ]);
+    $client->response = $response;
+
+    try {
+        $client->test();
+        echo "$name: no fault\n";
+    } catch (SoapFault $e) {
+        echo "$name: $e->faultstring\n";
+    }
+}
+
+function test_boundary_position(): void {
+    $client = new TestSoapClient(NULL, [
+        'location' => 'test://',
+        'uri' => 'http://example.org/',
+        'exceptions' => true,
+    ]);
+    $client->response = soap_response(
+        'SOAP-ENC:arrayType="xsd:string[1]" xsi:type="SOAP-ENC:Array"',
+        'SOAP-ENC:position="[2147483646]"'
+    );
+
+    var_dump($client->test());
+}
+
+test_overflow(
+    'arrayType',
+    soap_response('SOAP-ENC:arrayType="xsd:string[2147483648]" xsi:type="SOAP-ENC:Array"')
+);
+
+test_overflow(
+    'offset',
+    soap_response('SOAP-ENC:arrayType="xsd:string[1]" SOAP-ENC:offset="[2147483648]" xsi:type="SOAP-ENC:Array"')
+);
+
+test_overflow(
+    'position',
+    soap_response('SOAP-ENC:arrayType="xsd:string[1]" xsi:type="SOAP-ENC:Array"', 'SOAP-ENC:position="[2147483647]"')
+);
+
+test_boundary_position();
+?>
+--EXPECT--
+arrayType: SOAP-ERROR: Encoding: array index out of range
+offset: SOAP-ERROR: Encoding: array index out of range
+position: SOAP-ERROR: Encoding: array index out of range
+array(1) {
+  [2147483646]=>
+  string(5) "value"
+}
diff --git a/ext/sockets/conversions.c b/ext/sockets/conversions.c
index 1c735ef5e6d8..76a08559b809 100644
--- a/ext/sockets/conversions.c
+++ b/ext/sockets/conversions.c
@@ -1,3 +1,17 @@
+/*
+   +----------------------------------------------------------------------+
+   | Copyright © The PHP Group and Contributors.                          |
+   +----------------------------------------------------------------------+
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
+   +----------------------------------------------------------------------+
+   | Authors: Gustavo Lopes                           |
+   +----------------------------------------------------------------------+
+ */
+
 #ifdef __sun
 /* to enable 'new' ancillary data layout instead */
 # define _XPG4_2
@@ -1384,7 +1398,7 @@ static void from_zval_write_fd_array_aux(zval *elem, unsigned i, void **args, se
 			return;
 		}
 
-		iarr[i] = sock->bsd_socket;
+		iarr[i - 1] = sock->bsd_socket;
 		return;
 	}
 
diff --git a/ext/sockets/conversions.h b/ext/sockets/conversions.h
index 1f1fd29c5c05..1d3ce11463d8 100644
--- a/ext/sockets/conversions.h
+++ b/ext/sockets/conversions.h
@@ -1,3 +1,17 @@
+/*
+   +----------------------------------------------------------------------+
+   | Copyright © The PHP Group and Contributors.                          |
+   +----------------------------------------------------------------------+
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
+   +----------------------------------------------------------------------+
+   | Authors: Gustavo Lopes                           |
+   +----------------------------------------------------------------------+
+ */
+
 #ifndef PHP_SOCK_CONVERSIONS_H
 #define PHP_SOCK_CONVERSIONS_H 1
 
diff --git a/ext/sockets/multicast.c b/ext/sockets/multicast.c
index 522e6b346f66..88fcf21278d2 100644
--- a/ext/sockets/multicast.c
+++ b/ext/sockets/multicast.c
@@ -1,14 +1,12 @@
 /*
    +----------------------------------------------------------------------+
-   | Copyright (c) The PHP Group                                          |
+   | Copyright © The PHP Group and Contributors.                          |
    +----------------------------------------------------------------------+
-   | This source file is subject to version 3.01 of the PHP license,      |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | https://www.php.net/license/3_01.txt                                 |
-   | If you did not receive a copy of the PHP license and are unable to   |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@php.net so we can mail you a copy immediately.               |
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Authors: Gustavo Lopes                           |
    +----------------------------------------------------------------------+
diff --git a/ext/sockets/multicast.h b/ext/sockets/multicast.h
index f2232921c6b9..5a40147cdd6f 100644
--- a/ext/sockets/multicast.h
+++ b/ext/sockets/multicast.h
@@ -1,14 +1,12 @@
 /*
    +----------------------------------------------------------------------+
-   | Copyright (c) The PHP Group                                          |
+   | Copyright © The PHP Group and Contributors.                          |
    +----------------------------------------------------------------------+
-   | This source file is subject to version 3.01 of the PHP license,      |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | https://www.php.net/license/3_01.txt                                 |
-   | If you did not receive a copy of the PHP license and are unable to   |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@php.net so we can mail you a copy immediately.               |
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Authors: Gustavo Lopes                           |
    +----------------------------------------------------------------------+
diff --git a/ext/sockets/php_sockets.h b/ext/sockets/php_sockets.h
index 89c613ba4307..4d047885dbaa 100644
--- a/ext/sockets/php_sockets.h
+++ b/ext/sockets/php_sockets.h
@@ -1,14 +1,12 @@
 /*
    +----------------------------------------------------------------------+
-   | Copyright (c) The PHP Group                                          |
+   | Copyright © The PHP Group and Contributors.                          |
    +----------------------------------------------------------------------+
-   | This source file is subject to version 3.01 of the PHP license,      |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | https://www.php.net/license/3_01.txt                                 |
-   | If you did not receive a copy of the PHP license and are unable to   |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@php.net so we can mail you a copy immediately.               |
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Authors: Chris Vandomelen                     |
    |          Sterling Hughes                           |
@@ -77,9 +75,7 @@ typedef struct {
 
 extern PHP_SOCKETS_API zend_class_entry *socket_ce;
 
-static inline php_socket *socket_from_obj(zend_object *obj) {
-	return (php_socket *)((char *)(obj) - XtOffsetOf(php_socket, std));
-}
+#define socket_from_obj(obj) ZEND_CONTAINER_OF(obj, php_socket, std)
 
 #define Z_SOCKET_P(zv) socket_from_obj(Z_OBJ_P(zv))
 
diff --git a/ext/sockets/sendrecvmsg.c b/ext/sockets/sendrecvmsg.c
index cd7fd4839fb0..cc268bd68b0a 100644
--- a/ext/sockets/sendrecvmsg.c
+++ b/ext/sockets/sendrecvmsg.c
@@ -1,14 +1,12 @@
 /*
    +----------------------------------------------------------------------+
-   | Copyright (c) The PHP Group                                          |
+   | Copyright © The PHP Group and Contributors.                          |
    +----------------------------------------------------------------------+
-   | This source file is subject to version 3.01 of the PHP license,      |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | https://www.php.net/license/3_01.txt                                 |
-   | If you did not receive a copy of the PHP license and are unable to   |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@php.net so we can mail you a copy immediately.               |
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Authors: Gustavo Lopes                           |
    +----------------------------------------------------------------------+
diff --git a/ext/sockets/sendrecvmsg.h b/ext/sockets/sendrecvmsg.h
index fd68b178ce5c..f430affe6779 100644
--- a/ext/sockets/sendrecvmsg.h
+++ b/ext/sockets/sendrecvmsg.h
@@ -1,3 +1,17 @@
+/*
+   +----------------------------------------------------------------------+
+   | Copyright © The PHP Group and Contributors.                          |
+   +----------------------------------------------------------------------+
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
+   +----------------------------------------------------------------------+
+   | Authors: Gustavo Lopes                           |
+   +----------------------------------------------------------------------+
+ */
+
 #ifndef PHP_SENDRECVMSG_H
 #define PHP_SENDRECVMSG_H 1
 
diff --git a/ext/sockets/sockaddr_conv.c b/ext/sockets/sockaddr_conv.c
index 333ef2533a11..949639d475f2 100644
--- a/ext/sockets/sockaddr_conv.c
+++ b/ext/sockets/sockaddr_conv.c
@@ -1,3 +1,17 @@
+/*
+   +----------------------------------------------------------------------+
+   | Copyright © The PHP Group and Contributors.                          |
+   +----------------------------------------------------------------------+
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
+   +----------------------------------------------------------------------+
+   | Authors: Gustavo Lopes                           |
+   +----------------------------------------------------------------------+
+ */
+
 #include 
 #include 
 #include "php_sockets.h"
diff --git a/ext/sockets/sockaddr_conv.h b/ext/sockets/sockaddr_conv.h
index 93104e6470fb..ebca73862ef8 100644
--- a/ext/sockets/sockaddr_conv.h
+++ b/ext/sockets/sockaddr_conv.h
@@ -1,3 +1,17 @@
+/*
+   +----------------------------------------------------------------------+
+   | Copyright © The PHP Group and Contributors.                          |
+   +----------------------------------------------------------------------+
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
+   +----------------------------------------------------------------------+
+   | Authors: Gustavo Lopes                           |
+   +----------------------------------------------------------------------+
+ */
+
 #ifndef PHP_SOCKADR_CONV_H
 #define PHP_SOCKADR_CONV_H
 
diff --git a/ext/sockets/sockets.c b/ext/sockets/sockets.c
index 464bd87d5d30..7b9b903585b8 100644
--- a/ext/sockets/sockets.c
+++ b/ext/sockets/sockets.c
@@ -1,14 +1,12 @@
 /*
    +----------------------------------------------------------------------+
-   | Copyright (c) The PHP Group                                          |
+   | Copyright © The PHP Group and Contributors.                          |
    +----------------------------------------------------------------------+
-   | This source file is subject to version 3.01 of the PHP license,      |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | https://www.php.net/license/3_01.txt                                 |
-   | If you did not receive a copy of the PHP license and are unable to   |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@php.net so we can mail you a copy immediately.               |
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Authors: Chris Vandomelen                     |
    |          Sterling Hughes                           |
@@ -182,9 +180,7 @@ typedef struct {
 zend_class_entry *address_info_ce;
 static zend_object_handlers address_info_object_handlers;
 
-static inline php_addrinfo *address_info_from_obj(zend_object *obj) {
-	return (php_addrinfo *)((char *)(obj) - XtOffsetOf(php_addrinfo, std));
-}
+#define address_info_from_obj(obj) ZEND_CONTAINER_OF(obj, php_addrinfo, std)
 
 #define Z_ADDRESS_INFO_P(zv) address_info_from_obj(Z_OBJ_P(zv))
 
@@ -486,7 +482,7 @@ static PHP_MINIT_FUNCTION(sockets)
 	socket_ce->default_object_handlers = &socket_object_handlers;
 
 	memcpy(&socket_object_handlers, &std_object_handlers, sizeof(zend_object_handlers));
-	socket_object_handlers.offset = XtOffsetOf(php_socket, std);
+	socket_object_handlers.offset = offsetof(php_socket, std);
 	socket_object_handlers.free_obj = socket_free_obj;
 	socket_object_handlers.get_constructor = socket_get_constructor;
 	socket_object_handlers.clone_obj = NULL;
@@ -498,7 +494,7 @@ static PHP_MINIT_FUNCTION(sockets)
 	address_info_ce->default_object_handlers = &address_info_object_handlers;
 
 	memcpy(&address_info_object_handlers, &std_object_handlers, sizeof(zend_object_handlers));
-	address_info_object_handlers.offset = XtOffsetOf(php_addrinfo, std);
+	address_info_object_handlers.offset = offsetof(php_addrinfo, std);
 	address_info_object_handlers.free_obj = address_info_free_obj;
 	address_info_object_handlers.get_constructor = address_info_get_constructor;
 	address_info_object_handlers.clone_obj = NULL;
@@ -854,18 +850,17 @@ PHP_FUNCTION(socket_listen)
 PHP_FUNCTION(socket_close)
 {
 	zval *arg1;
-	php_socket *php_socket;
 
 	ZEND_PARSE_PARAMETERS_START(1, 1)
 		Z_PARAM_OBJECT_OF_CLASS(arg1, socket_ce)
 	ZEND_PARSE_PARAMETERS_END();
 
-	php_socket = Z_SOCKET_P(arg1);
-	ENSURE_SOCKET_VALID(php_socket);
+	php_socket *socket = Z_SOCKET_P(arg1);
+	ENSURE_SOCKET_VALID(socket);
 
-	if (!Z_ISUNDEF(php_socket->zstream)) {
+	if (!Z_ISUNDEF(socket->zstream)) {
 		php_stream *stream = NULL;
-		php_stream_from_zval_no_verify(stream, &php_socket->zstream);
+		php_stream_from_zval_no_verify(stream, &socket->zstream);
 		if (stream != NULL) {
 			/* close & destroy stream, incl. removing it from the rsrc list;
 			 * resource stored in php_sock->zstream will become invalid */
@@ -874,13 +869,13 @@ PHP_FUNCTION(socket_close)
 					(stream->is_persistent?PHP_STREAM_FREE_CLOSE_PERSISTENT:0));
 		}
 	} else {
-		if (!IS_INVALID_SOCKET(php_socket)) {
-			close(php_socket->bsd_socket);
+		if (!IS_INVALID_SOCKET(socket)) {
+			close(socket->bsd_socket);
 		}
 	}
 
-	ZVAL_UNDEF(&php_socket->zstream);
-	php_socket->bsd_socket = -1;
+	ZVAL_UNDEF(&socket->zstream);
+	socket->bsd_socket = -1;
 }
 /* }}} */
 
@@ -1033,7 +1028,6 @@ PHP_FUNCTION(socket_getsockname)
 				ZEND_TRY_ASSIGN_REF_LONG(objint, htons(sin6->sin6_port));
 			}
 			RETURN_TRUE;
-			break;
 #endif
 		case AF_INET:
 			sin = (struct sockaddr_in *) sa;
@@ -1044,14 +1038,12 @@ PHP_FUNCTION(socket_getsockname)
 				ZEND_TRY_ASSIGN_REF_LONG(objint, htons(sin->sin_port));
 			}
 			RETURN_TRUE;
-			break;
 
 		case AF_UNIX:
 			s_un = (struct sockaddr_un *) sa;
 
 			ZEND_TRY_ASSIGN_REF_STRING(addr, s_un->sun_path);
 			RETURN_TRUE;
-			break;
 #ifdef AF_PACKET
 		case AF_PACKET:
 			sll = (struct sockaddr_ll *) sa;
@@ -1067,7 +1059,6 @@ PHP_FUNCTION(socket_getsockname)
 				ZEND_TRY_ASSIGN_REF_LONG(objint, sll->sll_ifindex);
 			}
 			RETURN_TRUE;
-			break;
 #endif
 
 		default:
@@ -1123,7 +1114,6 @@ PHP_FUNCTION(socket_getpeername)
 			}
 
 			RETURN_TRUE;
-			break;
 #endif
 		case AF_INET:
 			sin = (struct sockaddr_in *) sa;
@@ -1135,14 +1125,12 @@ PHP_FUNCTION(socket_getpeername)
 			}
 
 			RETURN_TRUE;
-			break;
 
 		case AF_UNIX:
 			s_un = (struct sockaddr_un *) sa;
 
 			ZEND_TRY_ASSIGN_REF_STRING(arg2, s_un->sun_path);
 			RETURN_TRUE;
-			break;
 
 		default:
 			zend_argument_value_error(1, "must be one of AF_UNIX, AF_INET, or AF_INET6");
@@ -1281,7 +1269,7 @@ PHP_FUNCTION(socket_connect)
 			s_un.sun_family = AF_UNIX;
 			memcpy(&s_un.sun_path, ZSTR_VAL(addr), ZSTR_LEN(addr));
 			retval = connect(php_sock->bsd_socket, (struct sockaddr *) &s_un,
-				(socklen_t)(XtOffsetOf(struct sockaddr_un, sun_path) + ZSTR_LEN(addr)));
+				(socklen_t)(offsetof(struct sockaddr_un, sun_path) + ZSTR_LEN(addr)));
 			break;
 		}
 
@@ -1658,6 +1646,7 @@ PHP_FUNCTION(socket_recvfrom)
 			*/
 #endif
 		default:
+			zend_string_efree(recv_buf);
 			zend_argument_value_error(1, "must be one of AF_UNIX, AF_INET, or AF_INET6");
 			RETURN_THROWS();
 	}
diff --git a/ext/sockets/tests/socket_cmsg_rights.phpt b/ext/sockets/tests/socket_cmsg_rights.phpt
index 1794eaf767ac..8bfbcd57157f 100644
--- a/ext/sockets/tests/socket_cmsg_rights.phpt
+++ b/ext/sockets/tests/socket_cmsg_rights.phpt
@@ -58,7 +58,7 @@ if ($data["control"]) {
     if ($control["level"] == SOL_SOCKET &&
         $control["type"]  == SCM_RIGHTS) {
         foreach ($control["data"] as $resource) {
-            if (!is_resource($resource)) {
+            if (!is_resource($resource) && !($resource instanceof Socket)) {
                 echo "FAIL RES\n";
                 var_dump($data);
                 exit;
diff --git a/ext/sockets/tests/socket_sendmsg_scm_rights_object.phpt b/ext/sockets/tests/socket_sendmsg_scm_rights_object.phpt
new file mode 100644
index 000000000000..907ea70ac169
--- /dev/null
+++ b/ext/sockets/tests/socket_sendmsg_scm_rights_object.phpt
@@ -0,0 +1,77 @@
+--TEST--
+socket_sendmsg(): SCM_RIGHTS transfers Socket objects with the correct fds
+--EXTENSIONS--
+sockets
+--SKIPIF--
+
+--FILE--
+ ['x'],
+    'control' => [[
+        'level' => SOL_SOCKET,
+        'type' => SCM_RIGHTS,
+        'data' => [$payload1, $payload2],
+    ]],
+], 0);
+
+$data = [
+    'name' => [],
+    'buffer_size' => 64,
+    'controllen' => socket_cmsg_space(SOL_SOCKET, SCM_RIGHTS, 2),
+];
+socket_recvmsg($recv, $data, 0);
+
+$got = $data['control'][0]['data'];
+var_dump(count($got));
+var_dump($got[0] instanceof Socket);
+var_dump($got[1] instanceof Socket);
+socket_getsockname($got[0], $addr0);
+socket_getsockname($got[1], $addr1);
+var_dump($addr0 === $ppath1);
+var_dump($addr1 === $ppath2);
+?>
+--CLEAN--
+
+--EXPECT--
+int(2)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
diff --git a/ext/sockets/windows_common.h b/ext/sockets/windows_common.h
index 0b8cdfe2e5d9..9c7e711ffe5b 100644
--- a/ext/sockets/windows_common.h
+++ b/ext/sockets/windows_common.h
@@ -1,14 +1,12 @@
 /*
    +----------------------------------------------------------------------+
-   | Copyright (c) The PHP Group                                          |
+   | Copyright © The PHP Group and Contributors.                          |
    +----------------------------------------------------------------------+
-   | This source file is subject to version 3.01 of the PHP license,      |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | https://www.php.net/license/3_01.txt                                 |
-   | If you did not receive a copy of the PHP license and are unable to   |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@php.net so we can mail you a copy immediately.               |
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
  */
 #ifndef WINDOWS_COMMON_H
diff --git a/ext/sodium/libsodium.c b/ext/sodium/libsodium.c
index 62f44486a051..bd246abb53a5 100644
--- a/ext/sodium/libsodium.c
+++ b/ext/sodium/libsodium.c
@@ -1,14 +1,12 @@
 /*
    +----------------------------------------------------------------------+
-   | Copyright (c) The PHP Group                                          |
+   | Copyright © The PHP Group and Contributors.                          |
    +----------------------------------------------------------------------+
-   | This source file is subject to version 3.01 of the PHP license,      |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | https://www.php.net/license/3_01.txt                                 |
-   | If you did not receive a copy of the PHP license and are unable to   |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@php.net so we can mail you a copy immediately.               |
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Authors: Frank Denis                               |
    +----------------------------------------------------------------------+
@@ -1471,6 +1469,7 @@ PHP_FUNCTION(sodium_crypto_pwhash)
 	}
 	if (memlimit < crypto_pwhash_MEMLIMIT_MIN) {
 		zend_argument_error(sodium_exception_ce, 5, "must be greater than or equal to %d", crypto_pwhash_MEMLIMIT_MIN);
+		RETURN_THROWS();
 	}
 	hash = zend_string_alloc((size_t) hash_len, 0);
 	ret = -1;
@@ -1530,9 +1529,11 @@ PHP_FUNCTION(sodium_crypto_pwhash_str)
 	}
 	if (opslimit < crypto_pwhash_OPSLIMIT_MIN) {
 		zend_argument_error(sodium_exception_ce, 2, "must be greater than or equal to %d", crypto_pwhash_OPSLIMIT_MIN);
+		RETURN_THROWS();
 	}
 	if (memlimit < crypto_pwhash_MEMLIMIT_MIN) {
 		zend_argument_error(sodium_exception_ce, 3, "must be greater than or equal to %d", crypto_pwhash_MEMLIMIT_MIN);
+		RETURN_THROWS();
 	}
 	hash_str = zend_string_alloc(crypto_pwhash_STRBYTES - 1, 0);
 	if (crypto_pwhash_str
@@ -1638,9 +1639,11 @@ PHP_FUNCTION(sodium_crypto_pwhash_scryptsalsa208sha256)
 	}
 	if (opslimit < crypto_pwhash_scryptsalsa208sha256_OPSLIMIT_INTERACTIVE) {
 		zend_argument_error(sodium_exception_ce, 4, "must be greater than or equal to %d", crypto_pwhash_scryptsalsa208sha256_OPSLIMIT_INTERACTIVE);
+		RETURN_THROWS();
 	}
 	if (memlimit < crypto_pwhash_scryptsalsa208sha256_MEMLIMIT_INTERACTIVE) {
 		zend_argument_error(sodium_exception_ce, 5, "must be greater than or equal to %d", crypto_pwhash_scryptsalsa208sha256_MEMLIMIT_INTERACTIVE);
+		RETURN_THROWS();
 	}
 	hash = zend_string_alloc((size_t) hash_len, 0);
 	if (crypto_pwhash_scryptsalsa208sha256
@@ -1683,9 +1686,11 @@ PHP_FUNCTION(sodium_crypto_pwhash_scryptsalsa208sha256_str)
 	}
 	if (opslimit < crypto_pwhash_scryptsalsa208sha256_OPSLIMIT_INTERACTIVE) {
 		zend_argument_error(sodium_exception_ce, 2, "must be greater than or equal to %d", crypto_pwhash_scryptsalsa208sha256_OPSLIMIT_INTERACTIVE);
+		RETURN_THROWS();
 	}
 	if (memlimit < crypto_pwhash_scryptsalsa208sha256_MEMLIMIT_INTERACTIVE) {
 		zend_argument_error(sodium_exception_ce, 3, "must be greater than or equal to %d", crypto_pwhash_scryptsalsa208sha256_MEMLIMIT_INTERACTIVE);
+		RETURN_THROWS();
 	}
 	hash_str = zend_string_alloc
 		(crypto_pwhash_scryptsalsa208sha256_STRBYTES - 1, 0);
diff --git a/ext/sodium/php_libsodium.h b/ext/sodium/php_libsodium.h
index 673541fe784c..8132472d684f 100644
--- a/ext/sodium/php_libsodium.h
+++ b/ext/sodium/php_libsodium.h
@@ -1,14 +1,12 @@
 /*
    +----------------------------------------------------------------------+
-   | Copyright (c) The PHP Group                                          |
+   | Copyright © The PHP Group and Contributors.                          |
    +----------------------------------------------------------------------+
-   | This source file is subject to version 3.01 of the PHP license,      |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | https://www.php.net/license/3_01.txt                                 |
-   | If you did not receive a copy of the PHP license and are unable to   |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@php.net so we can mail you a copy immediately.               |
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Authors: Frank Denis                               |
    +----------------------------------------------------------------------+
diff --git a/ext/sodium/sodium_pwhash.c b/ext/sodium/sodium_pwhash.c
index 32e4f72634c3..ba48b0158cac 100644
--- a/ext/sodium/sodium_pwhash.c
+++ b/ext/sodium/sodium_pwhash.c
@@ -1,14 +1,12 @@
 /*
    +----------------------------------------------------------------------+
-   | Copyright (c) The PHP Group                                          |
+   | Copyright © The PHP Group and Contributors.                          |
    +----------------------------------------------------------------------+
-   | This source file is subject to version 3.01 of the PHP license,      |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | https://www.php.net/license/3_01.txt                                 |
-   | If you did not receive a copy of the PHP license and are unable to   |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@php.net so we can mail you a copy immediately.               |
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Authors: Sara Golemon                               |
    +----------------------------------------------------------------------+
diff --git a/ext/sodium/tests/pwhash_memlimit_below_min.phpt b/ext/sodium/tests/pwhash_memlimit_below_min.phpt
new file mode 100644
index 000000000000..63bf4443939b
--- /dev/null
+++ b/ext/sodium/tests/pwhash_memlimit_below_min.phpt
@@ -0,0 +1,27 @@
+--TEST--
+sodium_crypto_pwhash(): a below-minimum memlimit reports a precise argument error
+--EXTENSIONS--
+sodium
+--SKIPIF--
+
+--FILE--
+getMessage(), "\n";
+}
+
+try {
+    sodium_crypto_pwhash_str("password", SODIUM_CRYPTO_PWHASH_OPSLIMIT_INTERACTIVE, 1);
+} catch (SodiumException $e) {
+    echo $e->getMessage(), "\n";
+}
+?>
+--EXPECTF--
+sodium_crypto_pwhash(): Argument #5 ($memlimit) must be greater than or equal to %d
+sodium_crypto_pwhash_str(): Argument #3 ($memlimit) must be greater than or equal to %d
diff --git a/ext/spl/php_spl.c b/ext/spl/php_spl.c
index e705a1e303a2..0610e79196f9 100644
--- a/ext/spl/php_spl.c
+++ b/ext/spl/php_spl.c
@@ -1,14 +1,12 @@
 /*
    +----------------------------------------------------------------------+
-   | Copyright (c) The PHP Group                                          |
+   | Copyright © The PHP Group and Contributors.                          |
    +----------------------------------------------------------------------+
-   | This source file is subject to version 3.01 of the PHP license,      |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | https://www.php.net/license/3_01.txt                                 |
-   | If you did not receive a copy of the PHP license and are unable to   |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@php.net so we can mail you a copy immediately.               |
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Authors: Marcus Boerger                               |
    +----------------------------------------------------------------------+
@@ -60,11 +58,48 @@ static zend_class_entry * spl_find_ce_by_name(zend_string *name, bool autoload)
 	return ce;
 }
 
+static void spl_add_class_name(HashTable *list, zend_string *name)
+{
+	zval t;
+	ZVAL_STR_COPY(&t, name);
+	zend_hash_add(list, name, &t);
+}
+
+static void spl_add_interfaces(HashTable *list, const zend_class_entry *pce)
+{
+	if (pce->num_interfaces) {
+		ZEND_ASSERT(pce->ce_flags & ZEND_ACC_LINKED);
+		for (uint32_t num_interfaces = 0; num_interfaces < pce->num_interfaces; num_interfaces++) {
+			spl_add_class_name(list, pce->interfaces[num_interfaces]->name);
+		}
+	}
+}
+
+static void spl_add_traits(HashTable *list, const zend_class_entry *pce)
+{
+	for (uint32_t num_traits = 0; num_traits < pce->num_traits; num_traits++) {
+		spl_add_class_name(list, pce->trait_names[num_traits].name);
+	}
+}
+
+static void spl_add_classes(HashTable *list, const zend_class_entry *pce, bool only_classes, bool only_interfaces)
+{
+	ZEND_ASSERT(pce);
+	ZEND_ASSERT(!(only_classes && only_interfaces) && "Cannot have both only classes and only interfaces be enabled");
+	if (
+		(only_classes && (pce->ce_flags & ZEND_ACC_INTERFACE) == ZEND_ACC_INTERFACE)
+		|| (only_interfaces && (pce->ce_flags & ZEND_ACC_INTERFACE) == 0)
+	) {
+		return;
+	}
+	spl_add_class_name(list, pce->name);
+}
+
 /* {{{ Return an array containing the names of all parent classes */
 PHP_FUNCTION(class_parents)
 {
 	zval *obj;
-	zend_class_entry *parent_class, *ce;
+	zend_class_entry *ce;
 	bool autoload = true;
 
 	/* We do not use Z_PARAM_OBJ_OR_STR here to be able to exclude int, float, and bool which are bogus class names */
@@ -73,7 +108,7 @@ PHP_FUNCTION(class_parents)
 	}
 
 	if (Z_TYPE_P(obj) != IS_OBJECT && Z_TYPE_P(obj) != IS_STRING) {
-		zend_argument_type_error(1, "must be of type object|string, %s given", zend_zval_value_name(obj));
+		zend_wrong_parameter_type_error(1, Z_EXPECTED_OBJECT_OR_STRING, obj);
 		RETURN_THROWS();
 	}
 
@@ -86,9 +121,9 @@ PHP_FUNCTION(class_parents)
 	}
 
 	array_init(return_value);
-	parent_class = ce->parent;
+	const zend_class_entry *parent_class = ce->parent;
 	while (parent_class) {
-		spl_add_class_name(return_value, parent_class, 0, 0);
+		spl_add_class_name(Z_ARR_P(return_value), parent_class->name);
 		parent_class = parent_class->parent;
 	}
 }
@@ -99,14 +134,14 @@ PHP_FUNCTION(class_implements)
 {
 	zval *obj;
 	bool autoload = true;
-	zend_class_entry *ce;
+	const zend_class_entry *ce;
 
 	/* We do not use Z_PARAM_OBJ_OR_STR here to be able to exclude int, float, and bool which are bogus class names */
 	if (zend_parse_parameters(ZEND_NUM_ARGS(), "z|b", &obj, &autoload) == FAILURE) {
 		RETURN_THROWS();
 	}
 	if (Z_TYPE_P(obj) != IS_OBJECT && Z_TYPE_P(obj) != IS_STRING) {
-		zend_argument_type_error(1, "must be of type object|string, %s given", zend_zval_value_name(obj));
+		zend_wrong_parameter_type_error(1, Z_EXPECTED_OBJECT_OR_STRING, obj);
 		RETURN_THROWS();
 	}
 
@@ -119,7 +154,7 @@ PHP_FUNCTION(class_implements)
 	}
 
 	array_init(return_value);
-	spl_add_interfaces(return_value, ce, 1, ZEND_ACC_INTERFACE);
+	spl_add_interfaces(Z_ARR_P(return_value), ce);
 }
 /* }}} */
 
@@ -128,14 +163,14 @@ PHP_FUNCTION(class_uses)
 {
 	zval *obj;
 	bool autoload = true;
-	zend_class_entry *ce;
+	const zend_class_entry *ce;
 
 	/* We do not use Z_PARAM_OBJ_OR_STR here to be able to exclude int, float, and bool which are bogus class names */
 	if (zend_parse_parameters(ZEND_NUM_ARGS(), "z|b", &obj, &autoload) == FAILURE) {
 		RETURN_THROWS();
 	}
 	if (Z_TYPE_P(obj) != IS_OBJECT && Z_TYPE_P(obj) != IS_STRING) {
-		zend_argument_type_error(1, "must be of type object|string, %s given", zend_zval_value_name(obj));
+		zend_wrong_parameter_type_error(1, Z_EXPECTED_OBJECT_OR_STRING, obj);
 		RETURN_THROWS();
 	}
 
@@ -148,69 +183,69 @@ PHP_FUNCTION(class_uses)
 	}
 
 	array_init(return_value);
-	spl_add_traits(return_value, ce, 1, ZEND_ACC_TRAIT);
+	spl_add_traits(Z_ARR_P(return_value), ce);
 }
 /* }}} */
 
-#define SPL_ADD_CLASS(class_name, z_list, sub, allow, ce_flags) \
-	spl_add_classes(spl_ce_ ## class_name, z_list, sub, allow, ce_flags)
-
-#define SPL_LIST_CLASSES(z_list, sub, allow, ce_flags) \
-	SPL_ADD_CLASS(AppendIterator, z_list, sub, allow, ce_flags); \
-	SPL_ADD_CLASS(ArrayIterator, z_list, sub, allow, ce_flags); \
-	SPL_ADD_CLASS(ArrayObject, z_list, sub, allow, ce_flags); \
-	SPL_ADD_CLASS(BadFunctionCallException, z_list, sub, allow, ce_flags); \
-	SPL_ADD_CLASS(BadMethodCallException, z_list, sub, allow, ce_flags); \
-	SPL_ADD_CLASS(CachingIterator, z_list, sub, allow, ce_flags); \
-	SPL_ADD_CLASS(CallbackFilterIterator, z_list, sub, allow, ce_flags); \
-	SPL_ADD_CLASS(DirectoryIterator, z_list, sub, allow, ce_flags); \
-	SPL_ADD_CLASS(DomainException, z_list, sub, allow, ce_flags); \
-	SPL_ADD_CLASS(EmptyIterator, z_list, sub, allow, ce_flags); \
-	SPL_ADD_CLASS(FilesystemIterator, z_list, sub, allow, ce_flags); \
-	SPL_ADD_CLASS(FilterIterator, z_list, sub, allow, ce_flags); \
-	SPL_ADD_CLASS(GlobIterator, z_list, sub, allow, ce_flags); \
-	SPL_ADD_CLASS(InfiniteIterator, z_list, sub, allow, ce_flags); \
-	SPL_ADD_CLASS(InvalidArgumentException, z_list, sub, allow, ce_flags); \
-	SPL_ADD_CLASS(IteratorIterator, z_list, sub, allow, ce_flags); \
-	SPL_ADD_CLASS(LengthException, z_list, sub, allow, ce_flags); \
-	SPL_ADD_CLASS(LimitIterator, z_list, sub, allow, ce_flags); \
-	SPL_ADD_CLASS(LogicException, z_list, sub, allow, ce_flags); \
-	SPL_ADD_CLASS(MultipleIterator, z_list, sub, allow, ce_flags); \
-	SPL_ADD_CLASS(NoRewindIterator, z_list, sub, allow, ce_flags); \
-	SPL_ADD_CLASS(OuterIterator, z_list, sub, allow, ce_flags); \
-	SPL_ADD_CLASS(OutOfBoundsException, z_list, sub, allow, ce_flags); \
-	SPL_ADD_CLASS(OutOfRangeException, z_list, sub, allow, ce_flags); \
-	SPL_ADD_CLASS(OverflowException, z_list, sub, allow, ce_flags); \
-	SPL_ADD_CLASS(ParentIterator, z_list, sub, allow, ce_flags); \
-	SPL_ADD_CLASS(RangeException, z_list, sub, allow, ce_flags); \
-	SPL_ADD_CLASS(RecursiveArrayIterator, z_list, sub, allow, ce_flags); \
-	SPL_ADD_CLASS(RecursiveCachingIterator, z_list, sub, allow, ce_flags); \
-	SPL_ADD_CLASS(RecursiveCallbackFilterIterator, z_list, sub, allow, ce_flags); \
-	SPL_ADD_CLASS(RecursiveDirectoryIterator, z_list, sub, allow, ce_flags); \
-	SPL_ADD_CLASS(RecursiveFilterIterator, z_list, sub, allow, ce_flags); \
-	SPL_ADD_CLASS(RecursiveIterator, z_list, sub, allow, ce_flags); \
-	SPL_ADD_CLASS(RecursiveIteratorIterator, z_list, sub, allow, ce_flags); \
-	SPL_ADD_CLASS(RecursiveRegexIterator, z_list, sub, allow, ce_flags); \
-	SPL_ADD_CLASS(RecursiveTreeIterator, z_list, sub, allow, ce_flags); \
-	SPL_ADD_CLASS(RegexIterator, z_list, sub, allow, ce_flags); \
-	SPL_ADD_CLASS(RuntimeException, z_list, sub, allow, ce_flags); \
-	SPL_ADD_CLASS(SeekableIterator, z_list, sub, allow, ce_flags); \
-	SPL_ADD_CLASS(SplDoublyLinkedList, z_list, sub, allow, ce_flags); \
-	SPL_ADD_CLASS(SplFileInfo, z_list, sub, allow, ce_flags); \
-	SPL_ADD_CLASS(SplFileObject, z_list, sub, allow, ce_flags); \
-	SPL_ADD_CLASS(SplFixedArray, z_list, sub, allow, ce_flags); \
-	SPL_ADD_CLASS(SplHeap, z_list, sub, allow, ce_flags); \
-	SPL_ADD_CLASS(SplMinHeap, z_list, sub, allow, ce_flags); \
-	SPL_ADD_CLASS(SplMaxHeap, z_list, sub, allow, ce_flags); \
-	SPL_ADD_CLASS(SplObjectStorage, z_list, sub, allow, ce_flags); \
-	SPL_ADD_CLASS(SplObserver, z_list, sub, allow, ce_flags); \
-	SPL_ADD_CLASS(SplPriorityQueue, z_list, sub, allow, ce_flags); \
-	SPL_ADD_CLASS(SplQueue, z_list, sub, allow, ce_flags); \
-	SPL_ADD_CLASS(SplStack, z_list, sub, allow, ce_flags); \
-	SPL_ADD_CLASS(SplSubject, z_list, sub, allow, ce_flags); \
-	SPL_ADD_CLASS(SplTempFileObject, z_list, sub, allow, ce_flags); \
-	SPL_ADD_CLASS(UnderflowException, z_list, sub, allow, ce_flags); \
-	SPL_ADD_CLASS(UnexpectedValueException, z_list, sub, allow, ce_flags); \
+#define SPL_ADD_CLASS(class_name, z_list, only_classes, only_interfaces) \
+	spl_add_classes(Z_ARR_P(z_list), spl_ce_ ## class_name, only_classes, only_interfaces)
+
+#define SPL_LIST_CLASSES(z_list, only_classes, only_interfaces) \
+	SPL_ADD_CLASS(AppendIterator, z_list, only_classes, only_interfaces); \
+	SPL_ADD_CLASS(ArrayIterator, z_list, only_classes, only_interfaces); \
+	SPL_ADD_CLASS(ArrayObject, z_list, only_classes, only_interfaces); \
+	SPL_ADD_CLASS(BadFunctionCallException, z_list, only_classes, only_interfaces); \
+	SPL_ADD_CLASS(BadMethodCallException, z_list, only_classes, only_interfaces); \
+	SPL_ADD_CLASS(CachingIterator, z_list, only_classes, only_interfaces); \
+	SPL_ADD_CLASS(CallbackFilterIterator, z_list, only_classes, only_interfaces); \
+	SPL_ADD_CLASS(DirectoryIterator, z_list, only_classes, only_interfaces); \
+	SPL_ADD_CLASS(DomainException, z_list, only_classes, only_interfaces); \
+	SPL_ADD_CLASS(EmptyIterator, z_list, only_classes, only_interfaces); \
+	SPL_ADD_CLASS(FilesystemIterator, z_list, only_classes, only_interfaces); \
+	SPL_ADD_CLASS(FilterIterator, z_list, only_classes, only_interfaces); \
+	SPL_ADD_CLASS(GlobIterator, z_list, only_classes, only_interfaces); \
+	SPL_ADD_CLASS(InfiniteIterator, z_list, only_classes, only_interfaces); \
+	SPL_ADD_CLASS(InvalidArgumentException, z_list, only_classes, only_interfaces); \
+	SPL_ADD_CLASS(IteratorIterator, z_list, only_classes, only_interfaces); \
+	SPL_ADD_CLASS(LengthException, z_list, only_classes, only_interfaces); \
+	SPL_ADD_CLASS(LimitIterator, z_list, only_classes, only_interfaces); \
+	SPL_ADD_CLASS(LogicException, z_list, only_classes, only_interfaces); \
+	SPL_ADD_CLASS(MultipleIterator, z_list, only_classes, only_interfaces); \
+	SPL_ADD_CLASS(NoRewindIterator, z_list, only_classes, only_interfaces); \
+	SPL_ADD_CLASS(OuterIterator, z_list, only_classes, only_interfaces); \
+	SPL_ADD_CLASS(OutOfBoundsException, z_list, only_classes, only_interfaces); \
+	SPL_ADD_CLASS(OutOfRangeException, z_list, only_classes, only_interfaces); \
+	SPL_ADD_CLASS(OverflowException, z_list, only_classes, only_interfaces); \
+	SPL_ADD_CLASS(ParentIterator, z_list, only_classes, only_interfaces); \
+	SPL_ADD_CLASS(RangeException, z_list, only_classes, only_interfaces); \
+	SPL_ADD_CLASS(RecursiveArrayIterator, z_list, only_classes, only_interfaces); \
+	SPL_ADD_CLASS(RecursiveCachingIterator, z_list, only_classes, only_interfaces); \
+	SPL_ADD_CLASS(RecursiveCallbackFilterIterator, z_list, only_classes, only_interfaces); \
+	SPL_ADD_CLASS(RecursiveDirectoryIterator, z_list, only_classes, only_interfaces); \
+	SPL_ADD_CLASS(RecursiveFilterIterator, z_list, only_classes, only_interfaces); \
+	SPL_ADD_CLASS(RecursiveIterator, z_list, only_classes, only_interfaces); \
+	SPL_ADD_CLASS(RecursiveIteratorIterator, z_list, only_classes, only_interfaces); \
+	SPL_ADD_CLASS(RecursiveRegexIterator, z_list, only_classes, only_interfaces); \
+	SPL_ADD_CLASS(RecursiveTreeIterator, z_list, only_classes, only_interfaces); \
+	SPL_ADD_CLASS(RegexIterator, z_list, only_classes, only_interfaces); \
+	SPL_ADD_CLASS(RuntimeException, z_list, only_classes, only_interfaces); \
+	SPL_ADD_CLASS(SeekableIterator, z_list, only_classes, only_interfaces); \
+	SPL_ADD_CLASS(SplDoublyLinkedList, z_list, only_classes, only_interfaces); \
+	SPL_ADD_CLASS(SplFileInfo, z_list, only_classes, only_interfaces); \
+	SPL_ADD_CLASS(SplFileObject, z_list, only_classes, only_interfaces); \
+	SPL_ADD_CLASS(SplFixedArray, z_list, only_classes, only_interfaces); \
+	SPL_ADD_CLASS(SplHeap, z_list, only_classes, only_interfaces); \
+	SPL_ADD_CLASS(SplMinHeap, z_list, only_classes, only_interfaces); \
+	SPL_ADD_CLASS(SplMaxHeap, z_list, only_classes, only_interfaces); \
+	SPL_ADD_CLASS(SplObjectStorage, z_list, only_classes, only_interfaces); \
+	SPL_ADD_CLASS(SplObserver, z_list, only_classes, only_interfaces); \
+	SPL_ADD_CLASS(SplPriorityQueue, z_list, only_classes, only_interfaces); \
+	SPL_ADD_CLASS(SplQueue, z_list, only_classes, only_interfaces); \
+	SPL_ADD_CLASS(SplStack, z_list, only_classes, only_interfaces); \
+	SPL_ADD_CLASS(SplSubject, z_list, only_classes, only_interfaces); \
+	SPL_ADD_CLASS(SplTempFileObject, z_list, only_classes, only_interfaces); \
+	SPL_ADD_CLASS(UnderflowException, z_list, only_classes, only_interfaces); \
+	SPL_ADD_CLASS(UnexpectedValueException, z_list, only_classes, only_interfaces); \
 
 /* {{{ Return an array containing the names of all classes and interfaces defined in SPL */
 PHP_FUNCTION(spl_classes)
@@ -219,7 +254,7 @@ PHP_FUNCTION(spl_classes)
 
 	array_init(return_value);
 
-	SPL_LIST_CLASSES(return_value, 0, 0, 0)
+	SPL_LIST_CLASSES(return_value, false, false)
 }
 /* }}} */
 
@@ -486,7 +521,7 @@ PHP_MINFO_FUNCTION(spl)
 	php_info_print_table_row(2, "SPL support", "enabled");
 
 	array_init(&list);
-	SPL_LIST_CLASSES(&list, 0, 1, ZEND_ACC_INTERFACE)
+	SPL_LIST_CLASSES(&list, false, true)
 	strg = estrdup("");
 	ZEND_HASH_MAP_FOREACH_VAL(Z_ARRVAL_P(&list), zv) {
 		spl_build_class_list_string(zv, &strg);
@@ -496,7 +531,7 @@ PHP_MINFO_FUNCTION(spl)
 	efree(strg);
 
 	array_init(&list);
-	SPL_LIST_CLASSES(&list, 0, -1, ZEND_ACC_INTERFACE)
+	SPL_LIST_CLASSES(&list, true, false)
 	strg = estrdup("");
 	ZEND_HASH_MAP_FOREACH_VAL(Z_ARRVAL_P(&list), zv) {
 		spl_build_class_list_string(zv, &strg);
@@ -528,6 +563,7 @@ PHP_MINIT_FUNCTION(spl)
 PHP_RINIT_FUNCTION(spl) /* {{{ */
 {
 	spl_autoload_extensions = NULL;
+	spl_object_storage_reset_get_hash_depth();
 	return SUCCESS;
 } /* }}} */
 
diff --git a/ext/spl/php_spl.h b/ext/spl/php_spl.h
index c2f7ebf9eee1..b1d4f4416a79 100644
--- a/ext/spl/php_spl.h
+++ b/ext/spl/php_spl.h
@@ -1,14 +1,12 @@
 /*
    +----------------------------------------------------------------------+
-   | Copyright (c) The PHP Group                                          |
+   | Copyright © The PHP Group and Contributors.                          |
    +----------------------------------------------------------------------+
-   | This source file is subject to version 3.01 of the PHP license,      |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | https://www.php.net/license/3_01.txt                                 |
-   | If you did not receive a copy of the PHP license and are unable to   |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@php.net so we can mail you a copy immediately.               |
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Authors: Marcus Boerger                               |
    +----------------------------------------------------------------------+
diff --git a/ext/spl/spl_array.c b/ext/spl/spl_array.c
index 3d6870a7ee95..39d27bc40105 100644
--- a/ext/spl/spl_array.c
+++ b/ext/spl/spl_array.c
@@ -1,14 +1,12 @@
 /*
    +----------------------------------------------------------------------+
-   | Copyright (c) The PHP Group                                          |
+   | Copyright © The PHP Group and Contributors.                          |
    +----------------------------------------------------------------------+
-   | This source file is subject to version 3.01 of the PHP license,      |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | https://www.php.net/license/3_01.txt                                 |
-   | If you did not receive a copy of the PHP license and are unable to   |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@php.net so we can mail you a copy immediately.               |
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Authors: Marcus Boerger                               |
    +----------------------------------------------------------------------+
@@ -44,8 +42,6 @@ typedef struct _spl_array_object {
 	uint32_t          ht_iter;
 	int               ar_flags;
 	unsigned char	  nApplyCount;
-	bool			  is_child;
-	Bucket			  *bucket;
 	zend_function     *fptr_offset_get;
 	zend_function     *fptr_offset_set;
 	zend_function     *fptr_offset_has;
@@ -55,10 +51,7 @@ typedef struct _spl_array_object {
 	zend_object       std;
 } spl_array_object;
 
-static inline spl_array_object *spl_array_from_obj(zend_object *obj) /* {{{ */ {
-	return (spl_array_object*)((char*)(obj) - XtOffsetOf(spl_array_object, std));
-}
-/* }}} */
+#define spl_array_from_obj(obj) ZEND_CONTAINER_OF(obj, spl_array_object, std)
 
 #define Z_SPLARRAY_P(zv)  spl_array_from_obj(Z_OBJ_P((zv)))
 
@@ -157,7 +150,7 @@ static void spl_array_object_free_storage(zend_object *object)
 static zend_object *spl_array_object_new_ex(zend_class_entry *class_type, zend_object *orig, int clone_orig)
 {
 	spl_array_object *intern;
-	zend_class_entry *parent = class_type;
+	const zend_class_entry *parent = class_type;
 	int inherited = 0;
 
 	intern = zend_object_alloc(sizeof(spl_array_object), parent);
@@ -166,8 +159,6 @@ static zend_object *spl_array_object_new_ex(zend_class_entry *class_type, zend_o
 	object_properties_init(&intern->std, class_type);
 
 	intern->ar_flags = 0;
-	intern->is_child = false;
-	intern->bucket = NULL;
 	intern->ce_get_iterator = spl_ce_ArrayIterator;
 	if (orig) {
 		spl_array_object *other = spl_array_from_obj(orig);
@@ -465,22 +456,6 @@ static zval *spl_array_read_dimension(zend_object *object, zval *offset, int typ
 	return spl_array_read_dimension_ex(1, object, offset, type, rv);
 } /* }}} */
 
-/*
- * The assertion(HT_ASSERT_RC1(ht)) failed because the refcount was increased manually when intern->is_child is true.
- * We have to set the refcount to 1 to make assertion success and restore the refcount to the original value after
- * modifying the array when intern->is_child is true.
- */
-static uint32_t spl_array_set_refcount(bool is_child, HashTable *ht, uint32_t refcount) /* {{{ */
-{
-	uint32_t old_refcount = 0;
-	if (is_child) {
-		old_refcount = GC_REFCOUNT(ht);
-		GC_SET_REFCOUNT(ht, refcount);
-	}
-
-	return old_refcount;
-} /* }}} */
-
 static void spl_array_write_dimension_ex(int check_inherited, zend_object *object, zval *offset, zval *value) /* {{{ */
 {
 	spl_array_object *intern = spl_array_from_obj(object);
@@ -504,19 +479,12 @@ static void spl_array_write_dimension_ex(int check_inherited, zend_object *objec
 	}
 
 	Z_TRY_ADDREF_P(value);
-
-	uint32_t refcount = 0;
 	if (!offset || Z_TYPE_P(offset) == IS_NULL) {
 		ht = spl_array_get_hash_table(intern);
 		if (UNEXPECTED(ht == intern->sentinel_array)) {
 			return;
 		}
-		refcount = spl_array_set_refcount(intern->is_child, ht, 1);
 		zend_hash_next_index_insert(ht, value);
-
-		if (refcount) {
-			spl_array_set_refcount(intern->is_child, ht, refcount);
-		}
 		return;
 	}
 
@@ -531,17 +499,13 @@ static void spl_array_write_dimension_ex(int check_inherited, zend_object *objec
 		spl_hash_key_release(&key);
 		return;
 	}
-	refcount = spl_array_set_refcount(intern->is_child, ht, 1);
+
 	if (key.key) {
 		zend_hash_update_ind(ht, key.key, value);
 		spl_hash_key_release(&key);
 	} else {
 		zend_hash_index_update(ht, key.h, value);
 	}
-
-	if (refcount) {
-		spl_array_set_refcount(intern->is_child, ht, refcount);
-	}
 } /* }}} */
 
 static void spl_array_write_dimension(zend_object *object, zval *offset, zval *value) /* {{{ */
@@ -571,8 +535,6 @@ static void spl_array_unset_dimension_ex(int check_inherited, zend_object *objec
 	}
 
 	ht = spl_array_get_hash_table(intern);
-	uint32_t refcount = spl_array_set_refcount(intern->is_child, ht, 1);
-
 	if (key.key) {
 		zval *data = zend_hash_find(ht, key.key);
 		if (data) {
@@ -597,10 +559,6 @@ static void spl_array_unset_dimension_ex(int check_inherited, zend_object *objec
 	} else {
 		zend_hash_index_del(ht, key.h);
 	}
-
-	if (refcount) {
-		spl_array_set_refcount(intern->is_child, ht, refcount);
-	}
 } /* }}} */
 
 static void spl_array_unset_dimension(zend_object *object, zval *offset) /* {{{ */
@@ -963,6 +921,10 @@ static zend_result spl_array_skip_protected(spl_array_object *intern, HashTable
 static void spl_array_set_array(zval *object, spl_array_object *intern, zval *array, zend_long ar_flags, bool just_array) {
 	/* Handled by ZPP prior to this, or for __unserialize() before passing to here */
 	ZEND_ASSERT(Z_TYPE_P(array) == IS_ARRAY || Z_TYPE_P(array) == IS_OBJECT);
+	if (intern->nApplyCount > 0) {
+		zend_throw_error(NULL, "Modification of ArrayObject during sorting is prohibited");
+		return;
+	}
 	zval garbage;
 	ZVAL_UNDEF(&garbage);
 	if (Z_TYPE_P(array) == IS_ARRAY) {
@@ -972,15 +934,6 @@ static void spl_array_set_array(zval *object, spl_array_object *intern, zval *ar
 		} else {
 			//??? TODO: try to avoid array duplication
 			ZVAL_ARR(&intern->array, zend_array_dup(Z_ARR_P(array)));
-
-			if (intern->is_child) {
-				Z_TRY_DELREF(intern->bucket->val);
-				/*
-				 * replace bucket->val with copied array, so the changes between
-				 * parent and child object can affect each other.
-				 */
-				ZVAL_COPY(&intern->bucket->val, &intern->array);
-			}
 		}
 	} else {
 		php_error_docref(NULL, E_DEPRECATED,
@@ -1530,9 +1483,9 @@ PHP_METHOD(ArrayObject, __unserialize)
 			RETURN_THROWS();
 		}
 
-		if (!instanceof_function(ce, zend_ce_iterator)) {
+		if (!instanceof_function(ce, spl_ce_ArrayIterator)) {
 			zend_throw_exception_ex(spl_ce_UnexpectedValueException, 0,
-				"Cannot deserialize ArrayObject with iterator class '%s'; this class does not implement the Iterator interface",
+				"Cannot deserialize ArrayObject with iterator class '%s'; this class is not derived from ArrayIterator",
 				ZSTR_VAL(Z_STR_P(iterator_class_zv)));
 			RETURN_THROWS();
 		}
@@ -1850,15 +1803,6 @@ PHP_METHOD(RecursiveArrayIterator, hasChildren)
 static void spl_instantiate_child_arg(zend_class_entry *pce, zval *retval, zval *arg1, zval *arg2) /* {{{ */
 {
 	object_init_ex(retval, pce);
-	spl_array_object *new_intern = Z_SPLARRAY_P(retval);
-	/*
-	 * set new_intern->is_child is true to indicate that the object was created by
-	 * RecursiveArrayIterator::getChildren() method.
-	 */
-	new_intern->is_child = true;
-
-	/* find the bucket of parent object. */
-	new_intern->bucket = (Bucket *)((char *)(arg1) - XtOffsetOf(Bucket, val));;
 	zend_call_known_instance_method_with_2_params(pce->constructor, Z_OBJ_P(retval), NULL, arg1, arg2);
 }
 /* }}} */
@@ -1904,7 +1848,7 @@ PHP_MINIT_FUNCTION(spl_array)
 
 	memcpy(&spl_handler_ArrayObject, &std_object_handlers, sizeof(zend_object_handlers));
 
-	spl_handler_ArrayObject.offset = XtOffsetOf(spl_array_object, std);
+	spl_handler_ArrayObject.offset = offsetof(spl_array_object, std);
 
 	spl_handler_ArrayObject.clone_obj = spl_array_object_clone;
 	spl_handler_ArrayObject.read_dimension = spl_array_read_dimension;
diff --git a/ext/spl/spl_array.h b/ext/spl/spl_array.h
index 86de7a955c5b..f99bb3f6fe88 100644
--- a/ext/spl/spl_array.h
+++ b/ext/spl/spl_array.h
@@ -1,14 +1,12 @@
 /*
    +----------------------------------------------------------------------+
-   | Copyright (c) The PHP Group                                          |
+   | Copyright © The PHP Group and Contributors.                          |
    +----------------------------------------------------------------------+
-   | This source file is subject to version 3.01 of the PHP license,      |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | https://www.php.net/license/3_01.txt                                 |
-   | If you did not receive a copy of the PHP license and are unable to   |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@php.net so we can mail you a copy immediately.               |
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Authors: Marcus Boerger                               |
    +----------------------------------------------------------------------+
diff --git a/ext/spl/spl_directory.c b/ext/spl/spl_directory.c
index 86e4b11334c8..f662bb8a1dbd 100644
--- a/ext/spl/spl_directory.c
+++ b/ext/spl/spl_directory.c
@@ -1,14 +1,12 @@
 /*
    +----------------------------------------------------------------------+
-   | Copyright (c) The PHP Group                                          |
+   | Copyright © The PHP Group and Contributors.                          |
    +----------------------------------------------------------------------+
-   | This source file is subject to version 3.01 of the PHP license,      |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | https://www.php.net/license/3_01.txt                                 |
-   | If you did not receive a copy of the PHP license and are unable to   |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@php.net so we can mail you a copy immediately.               |
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Author: Marcus Boerger                                |
    +----------------------------------------------------------------------+
@@ -50,11 +48,7 @@ PHPAPI zend_class_entry *spl_ce_GlobIterator;
 PHPAPI zend_class_entry *spl_ce_SplFileObject;
 PHPAPI zend_class_entry *spl_ce_SplTempFileObject;
 
-/* Object helper */
-static inline spl_filesystem_object *spl_filesystem_from_obj(zend_object *obj) /* {{{ */ {
-	return (spl_filesystem_object*)((char*)(obj) - XtOffsetOf(spl_filesystem_object, std));
-}
-/* }}} */
+#define spl_filesystem_from_obj(obj) ZEND_CONTAINER_OF(obj, spl_filesystem_object, std)
 
 /* define an overloaded iterator structure */
 typedef struct {
@@ -190,8 +184,8 @@ static zend_object *spl_filesystem_object_new(zend_class_entry *class_type)
 	intern = emalloc(sizeof(spl_filesystem_object) + zend_object_properties_size(class_type));
 	/* Avoid initializing the entirety of spl_filesystem_object.u.dir.entry. */
 	memset(intern, 0,
-		MAX(XtOffsetOf(spl_filesystem_object, u.dir.entry),
-			XtOffsetOf(spl_filesystem_object, u.file.escape) + sizeof(int)));
+		MAX(offsetof(spl_filesystem_object, u.dir.entry),
+			offsetof(spl_filesystem_object, u.file.escape) + sizeof(int)));
 	/* intern->type = SPL_FS_INFO; done by set 0 */
 	intern->file_class = spl_ce_SplFileObject;
 	intern->info_class = spl_ce_SplFileInfo;
@@ -1470,11 +1464,11 @@ PHP_METHOD(RecursiveDirectoryIterator, getChildren)
 	if (subdir) {
 		size_t name_len = strlen(intern->u.dir.entry.d_name);
 		if (intern->u.dir.sub_path && ZSTR_LEN(intern->u.dir.sub_path)) {
-			zend_string *sub_path = zend_string_alloc(ZSTR_LEN(intern->u.dir.sub_path) + 1 + name_len, 0);
-			memcpy(ZSTR_VAL(sub_path), ZSTR_VAL(intern->u.dir.sub_path), ZSTR_LEN(intern->u.dir.sub_path));
-			ZSTR_VAL(sub_path)[ZSTR_LEN(intern->u.dir.sub_path)] = slash;
-			memcpy(ZSTR_VAL(sub_path) + ZSTR_LEN(intern->u.dir.sub_path) + 1, intern->u.dir.entry.d_name, name_len);
-			ZSTR_VAL(sub_path)[ZSTR_LEN(intern->u.dir.sub_path) + 1 + name_len] = 0;
+			zend_string *sub_path = zend_string_concat3(
+				ZSTR_VAL(intern->u.dir.sub_path), ZSTR_LEN(intern->u.dir.sub_path),
+				&slash, 1,
+				intern->u.dir.entry.d_name, name_len
+			);
 			subdir->u.dir.sub_path = sub_path;
 		} else {
 			subdir->u.dir.sub_path = zend_string_init(intern->u.dir.entry.d_name, name_len, 0);
@@ -1813,21 +1807,24 @@ static zend_result spl_filesystem_file_read_ex(spl_filesystem_object *intern, bo
 	}
 
 	if (!buf) {
-		intern->u.file.current_line = ZSTR_EMPTY_ALLOC();
-	} else {
-		if (!csv && SPL_HAS_FLAG(intern->flags, SPL_FILE_OBJECT_DROP_NEW_LINE)) {
-			if (line_len > 0 && buf[line_len - 1] == '\n') {
+		if (!silent) {
+			spl_filesystem_file_cannot_read(intern);
+		}
+		return FAILURE;
+	}
+
+	if (!csv && SPL_HAS_FLAG(intern->flags, SPL_FILE_OBJECT_DROP_NEW_LINE)) {
+		if (line_len > 0 && buf[line_len - 1] == '\n') {
+			line_len--;
+			if (line_len > 0 && buf[line_len - 1] == '\r') {
 				line_len--;
-				if (line_len > 0 && buf[line_len - 1] == '\r') {
-					line_len--;
-				}
-				buf[line_len] = '\0';
 			}
+			buf[line_len] = '\0';
 		}
-
-		intern->u.file.current_line = zend_string_init(buf, line_len, /* persistent */ false);
-		efree(buf);
 	}
+
+	intern->u.file.current_line = zend_string_init(buf, line_len, /* persistent */ false);
+	efree(buf);
 	intern->u.file.current_line_num += line_add;
 
 	return SUCCESS;
@@ -2093,10 +2090,21 @@ PHP_METHOD(SplFileObject, fgets)
 
 	CHECK_SPL_FILE_OBJECT_IS_INITIALIZED(intern);
 
-	if (spl_filesystem_file_read_ex(intern, /* silent */ false, /* line_add */ 1, /* csv */ false) == FAILURE) {
-		RETURN_THROWS();
+	if (intern->u.file.current_line) {
+		RETVAL_STR_COPY(intern->u.file.current_line);
+		spl_filesystem_file_free_line(intern);
+		intern->u.file.current_line_num++;
+	} else {
+		if (spl_filesystem_file_read_ex(intern, /* silent */ true, /* line_add */ 1, /* csv */ false) == FAILURE) {
+			if (php_stream_eof(intern->u.file.stream)) {
+				RETURN_EMPTY_STRING();
+			}
+			spl_filesystem_file_cannot_read(intern);
+			RETURN_THROWS();
+		}
+		RETVAL_STR_COPY(intern->u.file.current_line);
+		spl_filesystem_file_free_line(intern);
 	}
-	RETURN_STR_COPY(intern->u.file.current_line);
 } /* }}} */
 
 /* {{{ Return current line from file */
@@ -2142,6 +2150,12 @@ PHP_METHOD(SplFileObject, next)
 
 	ZEND_PARSE_PARAMETERS_NONE();
 
+	if (!intern->u.file.current_line && Z_ISUNDEF(intern->u.file.current_zval)) {
+		if (spl_filesystem_file_read_line(ZEND_THIS, intern, true) == FAILURE) {
+			return;
+		}
+	}
+
 	spl_filesystem_file_free_line(intern);
 	if (SPL_HAS_FLAG(intern->flags, SPL_FILE_OBJECT_READ_AHEAD)) {
 		spl_filesystem_file_read_line(ZEND_THIS, intern, true);
@@ -2629,7 +2643,7 @@ PHP_METHOD(SplFileObject, seek)
 
 	for (i = 0; i < line_pos; i++) {
 		if (spl_filesystem_file_read_line(ZEND_THIS, intern, true) == FAILURE) {
-			return;
+			break;
 		}
 	}
 	if (line_pos > 0 && !SPL_HAS_FLAG(intern->flags, SPL_FILE_OBJECT_READ_AHEAD)) {
@@ -2648,9 +2662,8 @@ PHP_METHOD(SplFileObject, __toString)
 
 	if (!intern->u.file.current_line) {
 		ZEND_ASSERT(Z_ISUNDEF(intern->u.file.current_zval));
-		zend_result result = spl_filesystem_file_read_line(ZEND_THIS, intern, false);
-		if (UNEXPECTED(result != SUCCESS)) {
-			RETURN_THROWS();
+		if (spl_filesystem_file_read_line(ZEND_THIS, intern, true) == FAILURE) {
+			RETURN_EMPTY_STRING();
 		}
 	}
 
@@ -2665,7 +2678,7 @@ PHP_MINIT_FUNCTION(spl_directory)
 	spl_ce_SplFileInfo->default_object_handlers = &spl_filesystem_object_handlers;
 
 	memcpy(&spl_filesystem_object_handlers, &std_object_handlers, sizeof(zend_object_handlers));
-	spl_filesystem_object_handlers.offset = XtOffsetOf(spl_filesystem_object, std);
+	spl_filesystem_object_handlers.offset = offsetof(spl_filesystem_object, std);
 	spl_filesystem_object_handlers.clone_obj = spl_filesystem_object_clone;
 	spl_filesystem_object_handlers.dtor_obj = spl_filesystem_object_destroy_object;
 	spl_filesystem_object_handlers.free_obj = spl_filesystem_object_free_storage;
diff --git a/ext/spl/spl_directory.h b/ext/spl/spl_directory.h
index a2d1d8d85475..6d940e8aa8ef 100644
--- a/ext/spl/spl_directory.h
+++ b/ext/spl/spl_directory.h
@@ -1,14 +1,12 @@
 /*
    +----------------------------------------------------------------------+
-   | Copyright (c) The PHP Group                                          |
+   | Copyright © The PHP Group and Contributors.                          |
    +----------------------------------------------------------------------+
-   | This source file is subject to version 3.01 of the PHP license,      |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | https://www.php.net/license/3_01.txt                                 |
-   | If you did not receive a copy of the PHP license and are unable to   |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@php.net so we can mail you a copy immediately.               |
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Authors: Marcus Boerger                               |
    +----------------------------------------------------------------------+
diff --git a/ext/spl/spl_dllist.c b/ext/spl/spl_dllist.c
index 5eceff88dfab..77e8b0d4e7da 100644
--- a/ext/spl/spl_dllist.c
+++ b/ext/spl/spl_dllist.c
@@ -1,14 +1,12 @@
 /*
    +----------------------------------------------------------------------+
-   | Copyright (c) The PHP Group                                          |
+   | Copyright © The PHP Group and Contributors.                          |
    +----------------------------------------------------------------------+
-   | This source file is subject to version 3.01 of the PHP license,      |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | https://www.php.net/license/3_01.txt                                 |
-   | If you did not receive a copy of the PHP license and are unable to   |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@php.net so we can mail you a copy immediately.               |
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Authors: Etienne Kneuss                              |
    +----------------------------------------------------------------------+
@@ -87,10 +85,7 @@ struct _spl_dllist_it {
 	int                    flags;
 };
 
-static inline spl_dllist_object *spl_dllist_from_obj(zend_object *obj) /* {{{ */ {
-	return (spl_dllist_object*)((char*)(obj) - XtOffsetOf(spl_dllist_object, std));
-}
-/* }}} */
+#define spl_dllist_from_obj(obj) ZEND_CONTAINER_OF(obj, spl_dllist_object, std)
 
 #define Z_SPLDLLIST_P(zv)  spl_dllist_from_obj(Z_OBJ_P((zv)))
 
@@ -304,7 +299,7 @@ static void spl_dllist_object_free_storage(zend_object *object) /* {{{ */
 static zend_object *spl_dllist_object_new_ex(zend_class_entry *class_type, zend_object *orig, int clone_orig) /* {{{ */
 {
 	spl_dllist_object *intern;
-	zend_class_entry  *parent = class_type;
+	const zend_class_entry *parent = class_type;
 	int                inherited = 0;
 
 	intern = zend_object_alloc(sizeof(spl_dllist_object), parent);
@@ -316,7 +311,7 @@ static zend_object *spl_dllist_object_new_ex(zend_class_entry *class_type, zend_
 	intern->traverse_position = 0;
 
 	if (orig) {
-		spl_dllist_object *other = spl_dllist_from_obj(orig);
+		const spl_dllist_object *other = spl_dllist_from_obj(orig);
 
 		if (clone_orig) {
 			intern->llist = spl_ptr_llist_init();
@@ -800,6 +795,7 @@ static void spl_dllist_it_helper_move_forward(spl_ptr_llist_element **traverse_p
 
 		if (flags & SPL_DLLIST_IT_LIFO) {
 			*traverse_pointer_ptr = old->prev;
+			SPL_LLIST_CHECK_ADDREF(*traverse_pointer_ptr);
 			(*traverse_position_ptr)--;
 
 			if (flags & SPL_DLLIST_IT_DELETE) {
@@ -810,6 +806,7 @@ static void spl_dllist_it_helper_move_forward(spl_ptr_llist_element **traverse_p
 			}
 		} else {
 			*traverse_pointer_ptr = old->next;
+			SPL_LLIST_CHECK_ADDREF(*traverse_pointer_ptr);
 
 			if (flags & SPL_DLLIST_IT_DELETE) {
 				zval prev;
@@ -822,7 +819,6 @@ static void spl_dllist_it_helper_move_forward(spl_ptr_llist_element **traverse_p
 		}
 
 		SPL_LLIST_DELREF(old);
-		SPL_LLIST_CHECK_ADDREF(*traverse_pointer_ptr);
 	}
 }
 /* }}} */
@@ -1209,7 +1205,7 @@ PHP_MINIT_FUNCTION(spl_dllist) /* {{{ */
 
 	memcpy(&spl_handler_SplDoublyLinkedList, &std_object_handlers, sizeof(zend_object_handlers));
 
-	spl_handler_SplDoublyLinkedList.offset = XtOffsetOf(spl_dllist_object, std);
+	spl_handler_SplDoublyLinkedList.offset = offsetof(spl_dllist_object, std);
 	spl_handler_SplDoublyLinkedList.clone_obj = spl_dllist_object_clone;
 	spl_handler_SplDoublyLinkedList.count_elements = spl_dllist_object_count_elements;
 	spl_handler_SplDoublyLinkedList.get_gc = spl_dllist_object_get_gc;
diff --git a/ext/spl/spl_dllist.h b/ext/spl/spl_dllist.h
index 1ade7c44a3f0..fb2204b2aca9 100644
--- a/ext/spl/spl_dllist.h
+++ b/ext/spl/spl_dllist.h
@@ -1,14 +1,12 @@
 /*
    +----------------------------------------------------------------------+
-   | Copyright (c) The PHP Group                                          |
+   | Copyright © The PHP Group and Contributors.                          |
    +----------------------------------------------------------------------+
-   | This source file is subject to version 3.01 of the PHP license,      |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | https://www.php.net/license/3_01.txt                                 |
-   | If you did not receive a copy of the PHP license and are unable to   |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@php.net so we can mail you a copy immediately.               |
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Authors: Etienne Kneuss                              |
    +----------------------------------------------------------------------+
diff --git a/ext/spl/spl_exceptions.c b/ext/spl/spl_exceptions.c
index 79449f35d840..8ceba1f7a6a5 100644
--- a/ext/spl/spl_exceptions.c
+++ b/ext/spl/spl_exceptions.c
@@ -1,14 +1,12 @@
 /*
    +----------------------------------------------------------------------+
-   | Copyright (c) The PHP Group                                          |
+   | Copyright © The PHP Group and Contributors.                          |
    +----------------------------------------------------------------------+
-   | This source file is subject to version 3.01 of the PHP license,      |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | https://www.php.net/license/3_01.txt                                 |
-   | If you did not receive a copy of the PHP license and are unable to   |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@php.net so we can mail you a copy immediately.               |
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Authors: Marcus Boerger                               |
    +----------------------------------------------------------------------+
diff --git a/ext/spl/spl_exceptions.h b/ext/spl/spl_exceptions.h
index 8c390f7646ec..be1de4f51d1b 100644
--- a/ext/spl/spl_exceptions.h
+++ b/ext/spl/spl_exceptions.h
@@ -1,14 +1,12 @@
 /*
    +----------------------------------------------------------------------+
-   | Copyright (c) The PHP Group                                          |
+   | Copyright © The PHP Group and Contributors.                          |
    +----------------------------------------------------------------------+
-   | This source file is subject to version 3.01 of the PHP license,      |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | https://www.php.net/license/3_01.txt                                 |
-   | If you did not receive a copy of the PHP license and are unable to   |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@php.net so we can mail you a copy immediately.               |
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Authors: Marcus Boerger                               |
    +----------------------------------------------------------------------+
diff --git a/ext/spl/spl_fixedarray.c b/ext/spl/spl_fixedarray.c
index 6f976923341b..d2eae52e3c0c 100644
--- a/ext/spl/spl_fixedarray.c
+++ b/ext/spl/spl_fixedarray.c
@@ -1,14 +1,12 @@
 /*
   +----------------------------------------------------------------------+
-  | Copyright (c) The PHP Group                                          |
+  | Copyright © The PHP Group and Contributors.                          |
   +----------------------------------------------------------------------+
-  | This source file is subject to version 3.01 of the PHP license,      |
-  | that is bundled with this package in the file LICENSE, and is        |
-  | available through the world-wide-web at the following url:           |
-  | https://www.php.net/license/3_01.txt                                 |
-  | If you did not receive a copy of the PHP license and are unable to   |
-  | obtain it through the world-wide-web, please send a note to          |
-  | license@php.net so we can mail you a copy immediately.               |
+  | This source file is subject to the Modified BSD License that is      |
+  | bundled with this package in the file LICENSE, and is available      |
+  | through the World Wide Web at .        |
+  |                                                                      |
+  | SPDX-License-Identifier: BSD-3-Clause                                |
   +----------------------------------------------------------------------+
   | Author: Antony Dovgal                           |
   |         Etienne Kneuss                               |
@@ -55,10 +53,7 @@ typedef struct _spl_fixedarray_it {
 	zend_long            current;
 } spl_fixedarray_it;
 
-static spl_fixedarray_object *spl_fixed_array_from_obj(zend_object *obj)
-{
-	return (spl_fixedarray_object*)((char*)(obj) - XtOffsetOf(spl_fixedarray_object, std));
-}
+#define spl_fixed_array_from_obj(obj) ZEND_CONTAINER_OF(obj, spl_fixedarray_object, std)
 
 #define Z_SPLFIXEDARRAY_P(zv)  spl_fixed_array_from_obj(Z_OBJ_P((zv)))
 
@@ -172,18 +167,18 @@ static void spl_fixedarray_resize(spl_fixedarray *array, zend_long size)
 		return;
 	}
 
-	/* first initialization */
-	if (array->size == 0) {
-		spl_fixedarray_init(array, size);
-		return;
-	}
-
 	if (UNEXPECTED(array->cached_resize >= 0)) {
 		/* We're already resizing, so just remember the desired size.
 		 * The resize will happen later. */
 		array->cached_resize = size;
 		return;
 	}
+	/* first initialization */
+	if (array->size == 0) {
+		spl_fixedarray_init(array, size);
+		return;
+	}
+
 	array->cached_resize = size;
 
 	/* clearing the array */
@@ -954,7 +949,7 @@ PHP_MINIT_FUNCTION(spl_fixedarray)
 
 	memcpy(&spl_handler_SplFixedArray, &std_object_handlers, sizeof(zend_object_handlers));
 
-	spl_handler_SplFixedArray.offset          = XtOffsetOf(spl_fixedarray_object, std);
+	spl_handler_SplFixedArray.offset          = offsetof(spl_fixedarray_object, std);
 	spl_handler_SplFixedArray.clone_obj       = spl_fixedarray_object_clone;
 	spl_handler_SplFixedArray.read_dimension  = spl_fixedarray_object_read_dimension;
 	spl_handler_SplFixedArray.write_dimension = spl_fixedarray_object_write_dimension;
diff --git a/ext/spl/spl_fixedarray.h b/ext/spl/spl_fixedarray.h
index a6cb838b9fc9..e0661a95d872 100644
--- a/ext/spl/spl_fixedarray.h
+++ b/ext/spl/spl_fixedarray.h
@@ -1,14 +1,12 @@
 /*
   +----------------------------------------------------------------------+
-  | Copyright (c) The PHP Group                                          |
+  | Copyright © The PHP Group and Contributors.                          |
   +----------------------------------------------------------------------+
-  | This source file is subject to version 3.01 of the PHP license,      |
-  | that is bundled with this package in the file LICENSE, and is        |
-  | available through the world-wide-web at the following url:           |
-  | https://www.php.net/license/3_01.txt                                 |
-  | If you did not receive a copy of the PHP license and are unable to   |
-  | obtain it through the world-wide-web, please send a note to          |
-  | license@php.net so we can mail you a copy immediately.               |
+  | This source file is subject to the Modified BSD License that is      |
+  | bundled with this package in the file LICENSE, and is available      |
+  | through the World Wide Web at .        |
+  |                                                                      |
+  | SPDX-License-Identifier: BSD-3-Clause                                |
   +----------------------------------------------------------------------+
   | Author: Antony Dovgal                           |
   |         Etienne Kneuss                               |
diff --git a/ext/spl/spl_functions.c b/ext/spl/spl_functions.c
index e7ecbc33f92e..2e04baa26dee 100644
--- a/ext/spl/spl_functions.c
+++ b/ext/spl/spl_functions.c
@@ -1,14 +1,12 @@
 /*
    +----------------------------------------------------------------------+
-   | Copyright (c) The PHP Group                                          |
+   | Copyright © The PHP Group and Contributors.                          |
    +----------------------------------------------------------------------+
-   | This source file is subject to version 3.01 of the PHP license,      |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | https://www.php.net/license/3_01.txt                                 |
-   | If you did not receive a copy of the PHP license and are unable to   |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@php.net so we can mail you a copy immediately.               |
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Authors: Marcus Boerger                               |
    +----------------------------------------------------------------------+
@@ -20,63 +18,6 @@
 
 #include "php.h"
 
-/* {{{ spl_add_class_name */
-void spl_add_class_name(zval *list, zend_class_entry *pce, int allow, int ce_flags)
-{
-	if (!allow || (allow > 0 && (pce->ce_flags & ce_flags)) || (allow < 0 && !(pce->ce_flags & ce_flags))) {
-		zval *tmp;
-
-		if ((tmp = zend_hash_find(Z_ARRVAL_P(list), pce->name)) == NULL) {
-			zval t;
-			ZVAL_STR_COPY(&t, pce->name);
-			zend_hash_add(Z_ARRVAL_P(list), pce->name, &t);
-		}
-	}
-}
-/* }}} */
-
-/* {{{ spl_add_interfaces */
-void spl_add_interfaces(zval *list, zend_class_entry * pce, int allow, int ce_flags)
-{
-	if (pce->num_interfaces) {
-		ZEND_ASSERT(pce->ce_flags & ZEND_ACC_LINKED);
-		for (uint32_t num_interfaces = 0; num_interfaces < pce->num_interfaces; num_interfaces++) {
-			spl_add_class_name(list, pce->interfaces[num_interfaces], allow, ce_flags);
-		}
-	}
-}
-/* }}} */
-
-/* {{{ spl_add_traits */
-void spl_add_traits(zval *list, zend_class_entry * pce, int allow, int ce_flags)
-{
-	zend_class_entry *trait;
-
-	for (uint32_t num_traits = 0; num_traits < pce->num_traits; num_traits++) {
-		trait = zend_fetch_class_by_name(pce->trait_names[num_traits].name,
-			pce->trait_names[num_traits].lc_name, ZEND_FETCH_CLASS_TRAIT);
-		ZEND_ASSERT(trait);
-		spl_add_class_name(list, trait, allow, ce_flags);
-	}
-}
-/* }}} */
-
-
-/* {{{ spl_add_classes */
-void spl_add_classes(zend_class_entry *pce, zval *list, bool sub, int allow, int ce_flags)
-{
-	ZEND_ASSERT(pce);
-	spl_add_class_name(list, pce, allow, ce_flags);
-	if (sub) {
-		spl_add_interfaces(list, pce, allow, ce_flags);
-		while (pce->parent) {
-			pce = pce->parent;
-			spl_add_classes(pce, list, sub, allow, ce_flags);
-		}
-	}
-}
-/* }}} */
-
 void spl_set_private_debug_info_property(
 	const zend_class_entry *ce,
 	const char *property,
diff --git a/ext/spl/spl_functions.h b/ext/spl/spl_functions.h
index eb81a8b8f818..1d5010030564 100644
--- a/ext/spl/spl_functions.h
+++ b/ext/spl/spl_functions.h
@@ -1,14 +1,12 @@
 /*
    +----------------------------------------------------------------------+
-   | Copyright (c) The PHP Group                                          |
+   | Copyright © The PHP Group and Contributors.                          |
    +----------------------------------------------------------------------+
-   | This source file is subject to version 3.01 of the PHP license,      |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | https://www.php.net/license/3_01.txt                                 |
-   | If you did not receive a copy of the PHP license and are unable to   |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@php.net so we can mail you a copy immediately.               |
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Authors: Marcus Boerger                               |
    +----------------------------------------------------------------------+
@@ -19,16 +17,6 @@
 
 #include "php.h"
 
-/* sub: whether to allow subclasses/interfaces
-   allow = 0: allow all classes and interfaces
-   allow > 0: allow all that match and mask ce_flags
-   allow < 0: disallow all that match and mask ce_flags
- */
-void spl_add_class_name(zval * list, zend_class_entry * pce, int allow, int ce_flags);
-void spl_add_interfaces(zval * list, zend_class_entry * pce, int allow, int ce_flags);
-void spl_add_traits(zval * list, zend_class_entry * pce, int allow, int ce_flags);
-void spl_add_classes(zend_class_entry *pce, zval *list, bool sub, int allow, int ce_flags);
-
 void spl_set_private_debug_info_property(const zend_class_entry *ce, const char *property, size_t property_len, HashTable *debug_info, zval *value);
 
 #endif /* PHP_FUNCTIONS_H */
diff --git a/ext/spl/spl_heap.c b/ext/spl/spl_heap.c
index afe3489e8984..1073836aa53b 100644
--- a/ext/spl/spl_heap.c
+++ b/ext/spl/spl_heap.c
@@ -1,14 +1,12 @@
 /*
    +----------------------------------------------------------------------+
-   | Copyright (c) The PHP Group                                          |
+   | Copyright © The PHP Group and Contributors.                          |
    +----------------------------------------------------------------------+
-   | This source file is subject to version 3.01 of the PHP license,      |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | https://www.php.net/license/3_01.txt                                 |
-   | If you did not receive a copy of the PHP license and are unable to   |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@php.net so we can mail you a copy immediately.               |
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Authors: Etienne Kneuss                              |
    +----------------------------------------------------------------------+
@@ -72,10 +70,7 @@ typedef struct _spl_pqueue_elem {
 	zval priority;
 } spl_pqueue_elem;
 
-static inline spl_heap_object *spl_heap_from_obj(zend_object *obj) /* {{{ */ {
-	return (spl_heap_object*)((char*)(obj) - XtOffsetOf(spl_heap_object, std));
-}
-/* }}} */
+#define spl_heap_from_obj(obj) ZEND_CONTAINER_OF(obj, spl_heap_object, std)
 
 #define Z_SPLHEAP_P(zv)  spl_heap_from_obj(Z_OBJ_P((zv)))
 
@@ -412,7 +407,7 @@ static void spl_heap_object_free_storage(zend_object *object) /* {{{ */
 static zend_object *spl_heap_object_new_ex(zend_class_entry *class_type, zend_object *orig, int clone_orig) /* {{{ */
 {
 	spl_heap_object   *intern;
-	zend_class_entry  *parent = class_type;
+	const zend_class_entry  *parent = class_type;
 	int                inherited = 0;
 
 	intern = zend_object_alloc(sizeof(spl_heap_object), parent);
@@ -1334,7 +1329,7 @@ PHP_MINIT_FUNCTION(spl_heap) /* {{{ */
 
 	memcpy(&spl_handler_SplHeap, &std_object_handlers, sizeof(zend_object_handlers));
 
-	spl_handler_SplHeap.offset         = XtOffsetOf(spl_heap_object, std);
+	spl_handler_SplHeap.offset         = offsetof(spl_heap_object, std);
 	spl_handler_SplHeap.clone_obj      = spl_heap_object_clone;
 	spl_handler_SplHeap.count_elements = spl_heap_object_count_elements;
 	spl_handler_SplHeap.get_gc         = spl_heap_object_get_gc;
@@ -1355,7 +1350,7 @@ PHP_MINIT_FUNCTION(spl_heap) /* {{{ */
 
 	memcpy(&spl_handler_SplPriorityQueue, &std_object_handlers, sizeof(zend_object_handlers));
 
-	spl_handler_SplPriorityQueue.offset         = XtOffsetOf(spl_heap_object, std);
+	spl_handler_SplPriorityQueue.offset         = offsetof(spl_heap_object, std);
 	spl_handler_SplPriorityQueue.clone_obj      = spl_heap_object_clone;
 	spl_handler_SplPriorityQueue.count_elements = spl_heap_object_count_elements;
 	spl_handler_SplPriorityQueue.get_gc         = spl_pqueue_object_get_gc;
diff --git a/ext/spl/spl_heap.h b/ext/spl/spl_heap.h
index ccc0dd706bfe..153af1171544 100644
--- a/ext/spl/spl_heap.h
+++ b/ext/spl/spl_heap.h
@@ -1,14 +1,12 @@
 /*
    +----------------------------------------------------------------------+
-   | Copyright (c) The PHP Group                                          |
+   | Copyright © The PHP Group and Contributors.                          |
    +----------------------------------------------------------------------+
-   | This source file is subject to version 3.01 of the PHP license,      |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | https://www.php.net/license/3_01.txt                                 |
-   | If you did not receive a copy of the PHP license and are unable to   |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@php.net so we can mail you a copy immediately.               |
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Authors: Etienne Kneuss                              |
    +----------------------------------------------------------------------+
diff --git a/ext/spl/spl_iterators.c b/ext/spl/spl_iterators.c
index a73e69519db5..86652ae4f5cc 100644
--- a/ext/spl/spl_iterators.c
+++ b/ext/spl/spl_iterators.c
@@ -1,14 +1,12 @@
 /*
    +----------------------------------------------------------------------+
-   | Copyright (c) The PHP Group                                          |
+   | Copyright © The PHP Group and Contributors.                          |
    +----------------------------------------------------------------------+
-   | This source file is subject to version 3.01 of the PHP license,      |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | https://www.php.net/license/3_01.txt                                 |
-   | If you did not receive a copy of the PHP license and are unable to   |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@php.net so we can mail you a copy immediately.               |
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Authors: Marcus Boerger                               |
    +----------------------------------------------------------------------+
@@ -138,16 +136,11 @@ typedef struct _spl_dual_it_object {
 static zend_object_handlers spl_handlers_rec_it_it;
 static zend_object_handlers spl_handlers_dual_it;
 
-static inline spl_recursive_it_object *spl_recursive_it_from_obj(zend_object *obj) /* {{{ */ {
-	return (spl_recursive_it_object*)((char*)(obj) - XtOffsetOf(spl_recursive_it_object, std));
-}
-/* }}} */
+#define spl_recursive_it_from_obj(obj) ZEND_CONTAINER_OF(obj, spl_recursive_it_object, std)
 
 #define Z_SPLRECURSIVE_IT_P(zv)  spl_recursive_it_from_obj(Z_OBJ_P((zv)))
 
-static inline spl_dual_it_object *spl_dual_it_from_obj(zend_object *obj) /* {{{ */ {
-	return (spl_dual_it_object*)((char*)(obj) - XtOffsetOf(spl_dual_it_object, std));
-} /* }}} */
+#define spl_dual_it_from_obj(obj) ZEND_CONTAINER_OF(obj, spl_dual_it_object, std)
 
 #define Z_SPLDUAL_IT_P(zv)  spl_dual_it_from_obj(Z_OBJ_P((zv)))
 
@@ -1341,15 +1334,6 @@ static spl_dual_it_object* spl_dual_it_construct(INTERNAL_FUNCTION_PARAMETERS, z
 			}
 			break;
 		}
-		case DIT_AppendIterator:
-			if (zend_parse_parameters_none() == FAILURE) {
-				return NULL;
-			}
-			intern->dit_type = DIT_AppendIterator;
-			object_init_ex(&intern->u.append.zarrayit, spl_ce_ArrayIterator);
-			zend_call_method_with_0_params(Z_OBJ(intern->u.append.zarrayit), spl_ce_ArrayIterator, &spl_ce_ArrayIterator->constructor, "__construct", NULL);
-			intern->u.append.iterator = spl_ce_ArrayIterator->get_iterator(spl_ce_ArrayIterator, &intern->u.append.zarrayit, 0);
-			return intern;
 		case DIT_RegexIterator:
 		case DIT_RecursiveRegexIterator: {
 			zend_string *regex;
@@ -2814,7 +2798,21 @@ static void spl_append_it_next(spl_dual_it_object *intern) /* {{{ */
 /* {{{ Create an AppendIterator */
 PHP_METHOD(AppendIterator, __construct)
 {
-	spl_dual_it_construct(INTERNAL_FUNCTION_PARAM_PASSTHRU, spl_ce_AppendIterator, zend_ce_iterator, DIT_AppendIterator);
+	ZEND_PARSE_PARAMETERS_NONE();
+
+	spl_dual_it_object *intern = Z_SPLDUAL_IT_P(ZEND_THIS);
+
+	/* TODO: This should be converted to a normal Error as this is triggered when calling the constructor twice */
+	if (intern->dit_type != DIT_Unknown) {
+		zend_throw_exception_ex(spl_ce_BadMethodCallException, 0, "%s::getIterator() must be called exactly once per instance", ZSTR_VAL(spl_ce_AppendIterator->name));
+		RETURN_THROWS();
+	}
+
+	intern->dit_type = DIT_AppendIterator;
+	object_init_ex(&intern->u.append.zarrayit, spl_ce_ArrayIterator);
+	zend_call_method_with_0_params(Z_OBJ(intern->u.append.zarrayit), spl_ce_ArrayIterator, &spl_ce_ArrayIterator->constructor, "__construct", NULL);
+	intern->u.append.iterator = spl_ce_ArrayIterator->get_iterator(spl_ce_ArrayIterator, &intern->u.append.zarrayit, 0);
+
 } /* }}} */
 
 /* {{{ Append an iterator */
@@ -3131,14 +3129,14 @@ PHP_MINIT_FUNCTION(spl_iterators)
 	spl_ce_RecursiveIteratorIterator->get_iterator = spl_recursive_it_get_iterator;
 
 	memcpy(&spl_handlers_rec_it_it, &std_object_handlers, sizeof(zend_object_handlers));
-	spl_handlers_rec_it_it.offset = XtOffsetOf(spl_recursive_it_object, std);
+	spl_handlers_rec_it_it.offset = offsetof(spl_recursive_it_object, std);
 	spl_handlers_rec_it_it.get_method = spl_recursive_it_get_method;
 	spl_handlers_rec_it_it.clone_obj = NULL;
 	spl_handlers_rec_it_it.free_obj = spl_RecursiveIteratorIterator_free_storage;
 	spl_handlers_rec_it_it.get_gc = spl_RecursiveIteratorIterator_get_gc;
 
 	memcpy(&spl_handlers_dual_it, &std_object_handlers, sizeof(zend_object_handlers));
-	spl_handlers_dual_it.offset = XtOffsetOf(spl_dual_it_object, std);
+	spl_handlers_dual_it.offset = offsetof(spl_dual_it_object, std);
 	spl_handlers_dual_it.get_method = spl_dual_it_get_method;
 	spl_handlers_dual_it.clone_obj = NULL;
 	spl_handlers_dual_it.free_obj = spl_dual_it_free_storage;
diff --git a/ext/spl/spl_iterators.h b/ext/spl/spl_iterators.h
index e77e34fb20c8..5b60705e9b23 100644
--- a/ext/spl/spl_iterators.h
+++ b/ext/spl/spl_iterators.h
@@ -1,14 +1,12 @@
 /*
    +----------------------------------------------------------------------+
-   | Copyright (c) The PHP Group                                          |
+   | Copyright © The PHP Group and Contributors.                          |
    +----------------------------------------------------------------------+
-   | This source file is subject to version 3.01 of the PHP license,      |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | https://www.php.net/license/3_01.txt                                 |
-   | If you did not receive a copy of the PHP license and are unable to   |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@php.net so we can mail you a copy immediately.               |
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Authors: Marcus Boerger                               |
    +----------------------------------------------------------------------+
diff --git a/ext/spl/spl_observer.c b/ext/spl/spl_observer.c
index 801c091fbb42..613bf5384dcb 100644
--- a/ext/spl/spl_observer.c
+++ b/ext/spl/spl_observer.c
@@ -1,14 +1,12 @@
 /*
    +----------------------------------------------------------------------+
-   | Copyright (c) The PHP Group                                          |
+   | Copyright © The PHP Group and Contributors.                          |
    +----------------------------------------------------------------------+
-   | This source file is subject to version 3.01 of the PHP license,      |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | https://www.php.net/license/3_01.txt                                 |
-   | If you did not receive a copy of the PHP license and are unable to   |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@php.net so we can mail you a copy immediately.               |
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Authors: Marcus Boerger                               |
    |          Etienne Kneuss                              |
@@ -47,6 +45,13 @@ static zend_object_handlers spl_handler_MultipleIterator;
 #define SOS_OVERRIDDEN_WRITE_DIMENSION 2
 #define SOS_OVERRIDDEN_UNSET_DIMENSION 4
 
+ZEND_TLS uint32_t spl_object_storage_get_hash_depth;
+
+void spl_object_storage_reset_get_hash_depth(void)
+{
+	spl_object_storage_get_hash_depth = 0;
+}
+
 typedef struct _spl_SplObjectStorage { /* {{{ */
 	HashTable         storage;
 	zend_long         index;
@@ -64,13 +69,20 @@ typedef struct _spl_SplObjectStorageElement {
 	zval inf;
 } spl_SplObjectStorageElement; /* }}} */
 
-static inline spl_SplObjectStorage *spl_object_storage_from_obj(zend_object *obj) /* {{{ */ {
-	return (spl_SplObjectStorage*)((char*)(obj) - XtOffsetOf(spl_SplObjectStorage, std));
-}
-/* }}} */
+#define spl_object_storage_from_obj(obj) ZEND_CONTAINER_OF(obj, spl_SplObjectStorage, std)
 
 #define Z_SPLOBJSTORAGE_P(zv)  spl_object_storage_from_obj(Z_OBJ_P((zv)))
 
+static zend_always_inline bool spl_object_storage_is_mutating_within_get_hash_call(void)
+{
+	if (UNEXPECTED(spl_object_storage_get_hash_depth)) {
+		zend_throw_error(NULL, "Modification of SplObjectStorage during getHash() is prohibited");
+		return true;
+	}
+
+	return false;
+}
+
 static void spl_SplObjectStorage_free_storage(zend_object *object) /* {{{ */
 {
 	spl_SplObjectStorage *intern = spl_object_storage_from_obj(object);
@@ -85,7 +97,10 @@ static zend_result spl_object_storage_get_hash(zend_hash_key *key, spl_SplObject
 		zval param;
 		zval rv;
 		ZVAL_OBJ(¶m, obj);
+		ZVAL_UNDEF(&rv);
+		spl_object_storage_get_hash_depth++;
 		zend_call_method_with_1_params(&intern->std, intern->std.ce, &intern->fptr_get_hash, "getHash", &rv, ¶m);
+		spl_object_storage_get_hash_depth--;
 		if (UNEXPECTED(Z_ISUNDEF(rv))) {
 			/* An exception has occurred */
 			return FAILURE;
@@ -178,6 +193,10 @@ static spl_SplObjectStorageElement *spl_object_storage_attach_handle(spl_SplObje
 
 static spl_SplObjectStorageElement *spl_object_storage_attach(spl_SplObjectStorage *intern, zend_object *obj, zval *inf) /* {{{ */
 {
+	if (UNEXPECTED(spl_object_storage_is_mutating_within_get_hash_call())) {
+		return NULL;
+	}
+
 	if (EXPECTED(!(intern->flags & SOS_OVERRIDDEN_WRITE_DIMENSION))) {
 		return spl_object_storage_attach_handle(intern, obj, inf);
 	}
@@ -223,6 +242,10 @@ static spl_SplObjectStorageElement *spl_object_storage_attach(spl_SplObjectStora
 
 static zend_result spl_object_storage_detach(spl_SplObjectStorage *intern, zend_object *obj) /* {{{ */
 {
+	if (UNEXPECTED(spl_object_storage_is_mutating_within_get_hash_call())) {
+		return FAILURE;
+	}
+
 	if (EXPECTED(!(intern->flags & SOS_OVERRIDDEN_UNSET_DIMENSION))) {
 		return zend_hash_index_del(&intern->storage, obj->handle);
 	}
@@ -241,14 +264,32 @@ static zend_result spl_object_storage_detach(spl_SplObjectStorage *intern, zend_
 	return ret;
 } /* }}}*/
 
-static void spl_object_storage_addall(spl_SplObjectStorage *intern, spl_SplObjectStorage *other) { /* {{{ */
+/* TODO: make this an official Zend API? */
+#define SPL_SAFE_HASH_FOREACH_PTR(_ht, _ptr) do { \
+		const HashTable *__ht = (_ht); \
+		zval *_z = __ht->arPacked; \
+		for (uint32_t _idx = 0; _idx < __ht->nNumUsed; _idx++, _z = ZEND_HASH_ELEMENT(__ht, _idx)) { \
+			if (UNEXPECTED(Z_ISUNDEF_P(_z))) continue; \
+			_ptr = Z_PTR_P(_z);
+
+static zend_result spl_object_storage_addall(spl_SplObjectStorage *intern, spl_SplObjectStorage *other) { /* {{{ */
 	spl_SplObjectStorageElement *element;
 
-	ZEND_HASH_FOREACH_PTR(&other->storage, element) {
-		spl_object_storage_attach(intern, element->obj, &element->inf);
+	SPL_SAFE_HASH_FOREACH_PTR(&other->storage, element) {
+		zval zv;
+		zend_object *obj = element->obj;
+		GC_ADDREF(obj);
+		ZVAL_COPY(&zv, &element->inf);
+		spl_SplObjectStorageElement *attached = spl_object_storage_attach(intern, obj, &zv);
+		zval_ptr_dtor(&zv);
+		OBJ_RELEASE(obj);
+		if (UNEXPECTED(!attached)) {
+			return FAILURE;
+		}
 	} ZEND_HASH_FOREACH_END();
 
 	intern->index = 0;
+	return SUCCESS;
 } /* }}} */
 
 #define SPL_OBJECT_STORAGE_CLASS_HAS_OVERRIDE(class_type, zstr_method) \
@@ -257,7 +298,7 @@ static void spl_object_storage_addall(spl_SplObjectStorage *intern, spl_SplObjec
 static zend_object *spl_object_storage_new_ex(zend_class_entry *class_type, zend_object *orig) /* {{{ */
 {
 	spl_SplObjectStorage *intern;
-	zend_class_entry *parent = class_type;
+	const zend_class_entry *parent = class_type;
 
 	intern = zend_object_alloc(sizeof(spl_SplObjectStorage), parent);
 	intern->pos = 0;
@@ -434,6 +475,9 @@ PHP_METHOD(SplObjectStorage, attach)
 		Z_PARAM_ZVAL(inf)
 	ZEND_PARSE_PARAMETERS_END();
 	spl_object_storage_attach(intern, obj, inf);
+	if (UNEXPECTED(EG(exception))) {
+		RETURN_THROWS();
+	}
 } /* }}} */
 
 // todo: make spl_object_storage_has_dimension return bool as well
@@ -482,6 +526,10 @@ static zval *spl_object_storage_read_dimension(zend_object *object, zval *offset
 static void spl_object_storage_write_dimension(zend_object *object, zval *offset, zval *inf)
 {
 	spl_SplObjectStorage *intern = spl_object_storage_from_obj(object);
+	if (UNEXPECTED(spl_object_storage_is_mutating_within_get_hash_call())) {
+		return;
+	}
+
 	if (UNEXPECTED(offset == NULL || Z_TYPE_P(offset) != IS_OBJECT || (intern->flags & SOS_OVERRIDDEN_WRITE_DIMENSION))) {
 		zend_std_write_dimension(object, offset, inf);
 		return;
@@ -492,6 +540,10 @@ static void spl_object_storage_write_dimension(zend_object *object, zval *offset
 static void spl_multiple_iterator_write_dimension(zend_object *object, zval *offset, zval *inf)
 {
 	spl_SplObjectStorage *intern = spl_object_storage_from_obj(object);
+	if (UNEXPECTED(spl_object_storage_is_mutating_within_get_hash_call())) {
+		return;
+	}
+
 	if (UNEXPECTED(offset == NULL || Z_TYPE_P(offset) != IS_OBJECT || (intern->flags & SOS_OVERRIDDEN_WRITE_DIMENSION))) {
 		zend_std_write_dimension(object, offset, inf);
 		return;
@@ -506,6 +558,10 @@ static void spl_multiple_iterator_write_dimension(zend_object *object, zval *off
 static void spl_object_storage_unset_dimension(zend_object *object, zval *offset)
 {
 	spl_SplObjectStorage *intern = spl_object_storage_from_obj(object);
+	if (UNEXPECTED(spl_object_storage_is_mutating_within_get_hash_call())) {
+		return;
+	}
+
 	if (UNEXPECTED(Z_TYPE_P(offset) != IS_OBJECT || (intern->flags & SOS_OVERRIDDEN_UNSET_DIMENSION))) {
 		zend_std_unset_dimension(object, offset);
 		return;
@@ -523,6 +579,9 @@ PHP_METHOD(SplObjectStorage, detach)
 		Z_PARAM_OBJ(obj)
 	ZEND_PARSE_PARAMETERS_END();
 	spl_object_storage_detach(intern, obj);
+	if (UNEXPECTED(EG(exception))) {
+		RETURN_THROWS();
+	}
 
 	zend_hash_internal_pointer_reset_ex(&intern->storage, &intern->pos);
 	intern->index = 0;
@@ -554,6 +613,7 @@ PHP_METHOD(SplObjectStorage, offsetGet)
 	ZEND_PARSE_PARAMETERS_END();
 
 	if (spl_object_storage_get_hash(&key, intern, obj) == FAILURE) {
+		/* This may be the old NULL fallback, or an exception thrown by getHash(). */
 		RETURN_NULL();
 	}
 
@@ -580,7 +640,9 @@ PHP_METHOD(SplObjectStorage, addAll)
 
 	other = Z_SPLOBJSTORAGE_P(obj);
 
-	spl_object_storage_addall(intern, other);
+	if (UNEXPECTED(spl_object_storage_addall(intern, other) == FAILURE)) {
+		RETURN_THROWS();
+	}
 
 	RETURN_LONG(zend_hash_num_elements(&intern->storage));
 } /* }}} */
@@ -602,6 +664,9 @@ PHP_METHOD(SplObjectStorage, removeAll)
 	zend_hash_internal_pointer_reset(&other->storage);
 	while ((element = zend_hash_get_current_data_ptr(&other->storage)) != NULL) {
 		if (spl_object_storage_detach(intern, element->obj) == FAILURE) {
+			if (UNEXPECTED(EG(exception))) {
+				RETURN_THROWS();
+			}
 			zend_hash_move_forward(&other->storage);
 		}
 	}
@@ -626,10 +691,24 @@ PHP_METHOD(SplObjectStorage, removeAllExcept)
 
 	other = Z_SPLOBJSTORAGE_P(obj);
 
-	ZEND_HASH_FOREACH_PTR(&intern->storage, element) {
-		if (!spl_object_storage_contains(other, element->obj)) {
-			spl_object_storage_detach(intern, element->obj);
+	SPL_SAFE_HASH_FOREACH_PTR(&intern->storage, element) {
+		zend_object *elem_obj = element->obj;
+		GC_ADDREF(elem_obj);
+		bool contains = spl_object_storage_contains(other, elem_obj);
+		if (UNEXPECTED(EG(exception))) {
+			OBJ_RELEASE(elem_obj);
+			RETURN_THROWS();
+		}
+		if (!contains) {
+			if (spl_object_storage_detach(intern, elem_obj) == FAILURE) {
+				OBJ_RELEASE(elem_obj);
+				if (UNEXPECTED(EG(exception))) {
+					RETURN_THROWS();
+				}
+				continue;
+			}
 		}
+		OBJ_RELEASE(elem_obj);
 	} ZEND_HASH_FOREACH_END();
 
 	zend_hash_internal_pointer_reset_ex(&intern->storage, &intern->pos);
@@ -648,7 +727,13 @@ PHP_METHOD(SplObjectStorage, contains)
 	ZEND_PARSE_PARAMETERS_START(1, 1)
 		Z_PARAM_OBJ(obj)
 	ZEND_PARSE_PARAMETERS_END();
-	RETURN_BOOL(spl_object_storage_contains(intern, obj));
+
+	bool contains = spl_object_storage_contains(intern, obj);
+	if (UNEXPECTED(EG(exception))) {
+		RETURN_THROWS();
+	}
+
+	RETURN_BOOL(contains);
 } /* }}} */
 
 /* {{{ Determine number of objects in storage */
@@ -738,6 +823,9 @@ PHP_METHOD(SplObjectStorage, setInfo)
 	if (zend_parse_parameters(ZEND_NUM_ARGS(), "z", &inf) == FAILURE) {
 		RETURN_THROWS();
 	}
+	if (UNEXPECTED(spl_object_storage_is_mutating_within_get_hash_call())) {
+		RETURN_THROWS();
+	}
 
 	if ((element = zend_hash_get_current_data_ptr_ex(&intern->storage, &intern->pos)) == NULL) {
 		RETURN_NULL();
@@ -932,6 +1020,10 @@ PHP_METHOD(SplObjectStorage, unserialize)
 
 		if (spl_object_storage_get_hash(&key, intern, Z_OBJ_P(entry)) == FAILURE) {
 			zval_ptr_dtor(&inf);
+			if (EG(exception)) {
+				PHP_VAR_UNSERIALIZE_DESTROY(var_hash);
+				RETURN_THROWS();
+			}
 			goto outexcept;
 		}
 		pelement = spl_object_storage_get(intern, &key);
@@ -945,6 +1037,14 @@ PHP_METHOD(SplObjectStorage, unserialize)
 			var_push_dtor(&var_hash, &obj);
 		}
 		element = spl_object_storage_attach(intern, Z_OBJ_P(entry), Z_ISUNDEF(inf)?NULL:&inf);
+		if (UNEXPECTED(!element)) {
+			zval_ptr_dtor(&inf);
+			if (EG(exception)) {
+				PHP_VAR_UNSERIALIZE_DESTROY(var_hash);
+				RETURN_THROWS();
+			}
+			goto outexcept;
+		}
 		var_replace(&var_hash, &inf, &element->inf);
 		zval_ptr_dtor(&inf);
 	}
@@ -1040,7 +1140,9 @@ PHP_METHOD(SplObjectStorage, __unserialize)
 			}
 
 			ZVAL_DEREF(val);
-			spl_object_storage_attach(intern, Z_OBJ_P(key), val);
+			if (UNEXPECTED(!spl_object_storage_attach(intern, Z_OBJ_P(key), val))) {
+				RETURN_THROWS();
+			}
 			key = NULL;
 		} else {
 			key = val;
@@ -1136,8 +1238,14 @@ PHP_METHOD(MultipleIterator, attachIterator)
 		}
 
 		spl_object_storage_attach(intern, iterator, &zinfo);
+		if (UNEXPECTED(EG(exception))) {
+			RETURN_THROWS();
+		}
 	} else {
 		spl_object_storage_attach(intern, iterator, NULL);
+		if (UNEXPECTED(EG(exception))) {
+			RETURN_THROWS();
+		}
 	}
 }
 /* }}} */
@@ -1152,6 +1260,9 @@ PHP_METHOD(MultipleIterator, detachIterator)
 		RETURN_THROWS();
 	}
 	spl_object_storage_detach(intern, Z_OBJ_P(iterator));
+	if (UNEXPECTED(EG(exception))) {
+		RETURN_THROWS();
+	}
 
 	zend_hash_internal_pointer_reset_ex(&intern->storage, &intern->pos);
 	intern->index = 0;
@@ -1191,7 +1302,9 @@ PHP_METHOD(MultipleIterator, rewind)
 	zend_hash_internal_pointer_reset_ex(&intern->storage, &intern->pos);
 	while ((element = zend_hash_get_current_data_ptr_ex(&intern->storage, &intern->pos)) != NULL && !EG(exception)) {
 		zend_object *it = element->obj;
+		GC_ADDREF(it);
 		zend_call_known_instance_method_with_0_params(it->ce->iterator_funcs_ptr->zf_rewind, it, NULL);
+		OBJ_RELEASE(it);
 		zend_hash_move_forward_ex(&intern->storage, &intern->pos);
 	}
 }
@@ -1210,7 +1323,9 @@ PHP_METHOD(MultipleIterator, next)
 	zend_hash_internal_pointer_reset_ex(&intern->storage, &intern->pos);
 	while ((element = zend_hash_get_current_data_ptr_ex(&intern->storage, &intern->pos)) != NULL && !EG(exception)) {
 		zend_object *it = element->obj;
+		GC_ADDREF(it);
 		zend_call_known_instance_method_with_0_params(it->ce->iterator_funcs_ptr->zf_next, it, NULL);
+		OBJ_RELEASE(it);
 		zend_hash_move_forward_ex(&intern->storage, &intern->pos);
 	}
 }
@@ -1237,7 +1352,9 @@ PHP_METHOD(MultipleIterator, valid)
 	zend_hash_internal_pointer_reset_ex(&intern->storage, &intern->pos);
 	while ((element = zend_hash_get_current_data_ptr_ex(&intern->storage, &intern->pos)) != NULL && !EG(exception)) {
 		zend_object *it = element->obj;
+		GC_ADDREF(it);
 		zend_call_known_instance_method_with_0_params(it->ce->iterator_funcs_ptr->zf_valid, it, &retval);
+		OBJ_RELEASE(it);
 
 		if (!Z_ISUNDEF(retval)) {
 			valid = (Z_TYPE(retval) == IS_TRUE);
@@ -1275,6 +1392,9 @@ static void spl_multiple_iterator_get_all(spl_SplObjectStorage *intern, int get_
 	zend_hash_internal_pointer_reset_ex(&intern->storage, &intern->pos);
 	while ((element = zend_hash_get_current_data_ptr_ex(&intern->storage, &intern->pos)) != NULL && !EG(exception)) {
 		zend_object *it = element->obj;
+		zval inf;
+		GC_ADDREF(it);
+		ZVAL_COPY(&inf, &element->inf);
 		zend_call_known_instance_method_with_0_params(it->ce->iterator_funcs_ptr->zf_valid, it, &retval);
 
 		if (!Z_ISUNDEF(retval)) {
@@ -1291,10 +1411,14 @@ static void spl_multiple_iterator_get_all(spl_SplObjectStorage *intern, int get_
 				zend_call_known_instance_method_with_0_params(it->ce->iterator_funcs_ptr->zf_key, it, &retval);
 			}
 			if (Z_ISUNDEF(retval)) {
+				OBJ_RELEASE(it);
+				zval_ptr_dtor(&inf);
 				zend_throw_exception(spl_ce_RuntimeException, "Failed to call sub iterator method", 0);
 				return;
 			}
 		} else if (intern->flags & MIT_NEED_ALL) {
+			OBJ_RELEASE(it);
+			zval_ptr_dtor(&inf);
 			if (SPL_MULTIPLE_ITERATOR_GET_ALL_CURRENT == get_type) {
 				zend_throw_exception(spl_ce_RuntimeException, "Called current() with non valid sub iterator", 0);
 			} else {
@@ -1306,15 +1430,17 @@ static void spl_multiple_iterator_get_all(spl_SplObjectStorage *intern, int get_
 		}
 
 		if (intern->flags & MIT_KEYS_ASSOC) {
-			switch (Z_TYPE(element->inf)) {
+			switch (Z_TYPE(inf)) {
 				case IS_LONG:
-					add_index_zval(return_value, Z_LVAL(element->inf), &retval);
+					add_index_zval(return_value, Z_LVAL(inf), &retval);
 					break;
 				case IS_STRING:
-					zend_symtable_update(Z_ARRVAL_P(return_value), Z_STR(element->inf), &retval);
+					zend_symtable_update(Z_ARRVAL_P(return_value), Z_STR(inf), &retval);
 					break;
 				default:
 					zval_ptr_dtor(&retval);
+					OBJ_RELEASE(it);
+					zval_ptr_dtor(&inf);
 					zend_throw_exception(spl_ce_InvalidArgumentException, "Sub-Iterator is associated with NULL", 0);
 					return;
 			}
@@ -1322,6 +1448,8 @@ static void spl_multiple_iterator_get_all(spl_SplObjectStorage *intern, int get_
 			add_next_index_zval(return_value, &retval);
 		}
 
+		OBJ_RELEASE(it);
+		zval_ptr_dtor(&inf);
 		zend_hash_move_forward_ex(&intern->storage, &intern->pos);
 	}
 }
@@ -1363,7 +1491,7 @@ PHP_MINIT_FUNCTION(spl_observer)
 
 	memcpy(&spl_handler_SplObjectStorage, &std_object_handlers, sizeof(zend_object_handlers));
 
-	spl_handler_SplObjectStorage.offset          = XtOffsetOf(spl_SplObjectStorage, std);
+	spl_handler_SplObjectStorage.offset          = offsetof(spl_SplObjectStorage, std);
 	spl_handler_SplObjectStorage.compare         = spl_object_storage_compare_objects;
 	spl_handler_SplObjectStorage.clone_obj       = spl_object_storage_clone;
 	spl_handler_SplObjectStorage.get_gc          = spl_object_storage_get_gc;
diff --git a/ext/spl/spl_observer.h b/ext/spl/spl_observer.h
index b7c22b2dfca0..bbb3ed656ccb 100644
--- a/ext/spl/spl_observer.h
+++ b/ext/spl/spl_observer.h
@@ -1,14 +1,12 @@
 /*
    +----------------------------------------------------------------------+
-   | Copyright (c) The PHP Group                                          |
+   | Copyright © The PHP Group and Contributors.                          |
    +----------------------------------------------------------------------+
-   | This source file is subject to version 3.01 of the PHP license,      |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | https://www.php.net/license/3_01.txt                                 |
-   | If you did not receive a copy of the PHP license and are unable to   |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@php.net so we can mail you a copy immediately.               |
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Authors: Marcus Boerger                               |
    +----------------------------------------------------------------------+
@@ -33,4 +31,6 @@ extern PHPAPI zend_class_entry *spl_ce_MultipleIterator;
 
 PHP_MINIT_FUNCTION(spl_observer);
 
+void spl_object_storage_reset_get_hash_depth(void);
+
 #endif /* SPL_OBSERVER_H */
diff --git a/ext/spl/tests/ArrayObject/gh10519.phpt b/ext/spl/tests/ArrayObject/gh10519.phpt
index 5ef7fb3144f9..fbb66c166802 100644
--- a/ext/spl/tests/ArrayObject/gh10519.phpt
+++ b/ext/spl/tests/ArrayObject/gh10519.phpt
@@ -1,5 +1,7 @@
 --TEST--
 Bug GH-10519 (Array Data Address Reference Issue)
+--XFAIL--
+The fix for this was bad
 --FILE--
 uasort(function($a, $b) use ($ao, $other, &$i) {
+    if ($i++ == 0) {
+        try {
+            $ao->__construct($other);
+        } catch (Error $e) {
+            echo $e->getMessage(), "\n";
+        }
+    }
+    return $a <=> $b;
+});
+var_dump($ao);
+
+?>
+--EXPECT--
+Modification of ArrayObject during sorting is prohibited
+object(ArrayObject)#1 (1) {
+  ["storage":"ArrayObject":private]=>
+  array(3) {
+    [0]=>
+    int(1)
+    [1]=>
+    int(2)
+    [2]=>
+    int(3)
+  }
+}
diff --git a/ext/spl/tests/GH-22047.phpt b/ext/spl/tests/GH-22047.phpt
new file mode 100644
index 000000000000..b01fbfd633c0
--- /dev/null
+++ b/ext/spl/tests/GH-22047.phpt
@@ -0,0 +1,21 @@
+--TEST--
+GH-22047: ArrayObject invalid iterator class in serialized payload
+--CREDITS--
+Igor Sak-Sakovskiy (Positive Technologies)
+--FILE--
+ $v) {
+        echo "should not reach here\n";
+    }
+} catch (UnexpectedValueException $e) {
+    echo $e->getMessage(), "\n";
+}
+
+?>
+--EXPECTF--
+Cannot deserialize ArrayObject with iterator class 'GlobIterator'; this class is not derived from ArrayIterator
diff --git a/ext/spl/tests/SplFileObject/SplFileObject_key_error001.phpt b/ext/spl/tests/SplFileObject/SplFileObject_key_error001.phpt
index 0c21d0b905e9..7d0e3ae8d969 100644
--- a/ext/spl/tests/SplFileObject/SplFileObject_key_error001.phpt
+++ b/ext/spl/tests/SplFileObject/SplFileObject_key_error001.phpt
@@ -18,5 +18,5 @@ var_dump($s->key());
 var_dump($s->valid());
 ?>
 --EXPECT--
-int(14)
+int(12)
 bool(false)
diff --git a/ext/spl/tests/SplFileObject/SplFileObject_key_error002.phpt b/ext/spl/tests/SplFileObject/SplFileObject_key_error002.phpt
index 8fc9b7fef0a5..0834dbc0524f 100644
--- a/ext/spl/tests/SplFileObject/SplFileObject_key_error002.phpt
+++ b/ext/spl/tests/SplFileObject/SplFileObject_key_error002.phpt
@@ -18,5 +18,5 @@ var_dump($s->key());
 var_dump($s->valid());
 ?>
 --EXPECT--
-int(13)
+int(12)
 bool(false)
diff --git a/ext/spl/tests/SplFileObject/bug81477.phpt b/ext/spl/tests/SplFileObject/bug81477.phpt
index f7730a791aa0..421c74dc4d68 100644
--- a/ext/spl/tests/SplFileObject/bug81477.phpt
+++ b/ext/spl/tests/SplFileObject/bug81477.phpt
@@ -21,7 +21,6 @@ string(8) "baz,bat
 "
 string(10) "more,data
 "
-string(0) ""
 --CLEAN--
 rewind();
 var_dump($file->fgetcsv());
 ?>
 --EXPECT--
-array(1) {
-  [0]=>
-  NULL
-}
+bool(false)
 bool(false)
diff --git a/ext/spl/tests/SplFileObject/gh21742.phpt b/ext/spl/tests/SplFileObject/gh21742.phpt
new file mode 100644
index 000000000000..7ea60b53915a
--- /dev/null
+++ b/ext/spl/tests/SplFileObject/gh21742.phpt
@@ -0,0 +1,35 @@
+--TEST--
+GH-21742 (SplFileObject::fgets() throws at EOF in while (!$spl->eof()) loop)
+--FILE--
+eof()) {
+    echo $spl->fgets();
+}
+echo "clean exit\n";
+
+$empty = tempnam(sys_get_temp_dir(), 'spl');
+file_put_contents($empty, '');
+$spl2 = new SplFileObject($empty, 'r');
+$iter = 0;
+while (!$spl2->eof()) {
+    $iter++;
+    $spl2->fgets();
+    if ($iter > 3) break;
+}
+echo "empty-file iters=$iter\n";
+
+unlink($file);
+unlink($empty);
+?>
+--EXPECT--
+Line 0
+Line 1
+Line 2
+Line 3
+Line 4
+clean exit
+empty-file iters=1
diff --git a/ext/spl/tests/SplFileObject/gh8561.phpt b/ext/spl/tests/SplFileObject/gh8561.phpt
new file mode 100644
index 000000000000..adf36afb8b29
--- /dev/null
+++ b/ext/spl/tests/SplFileObject/gh8561.phpt
@@ -0,0 +1,30 @@
+--TEST--
+GH-8561 (SplFileObject: key() and current() unsynchronized after fgets())
+--FILE--
+fwrite("line {$i}" . PHP_EOL);
+}
+
+// Case 1: rewind + fgets, then key/current
+$file->rewind();
+$file->fgets();
+echo "After rewind+fgets: key=" . $file->key() . " current=" . trim($file->current()) . "\n";
+
+// Case 2: multiple fgets
+$file->rewind();
+$file->fgets();
+$file->fgets();
+echo "After rewind+fgets+fgets: key=" . $file->key() . " current=" . trim($file->current()) . "\n";
+
+// Case 3: current then fgets
+$file->rewind();
+$file->current();
+$file->fgets();
+echo "After current+fgets: key=" . $file->key() . " current=" . trim($file->current()) . "\n";
+?>
+--EXPECT--
+After rewind+fgets: key=1 current=line 1
+After rewind+fgets+fgets: key=2 current=line 2
+After current+fgets: key=1 current=line 1
diff --git a/ext/spl/tests/SplFileObject/gh8563.phpt b/ext/spl/tests/SplFileObject/gh8563.phpt
new file mode 100644
index 000000000000..03891750f8bf
--- /dev/null
+++ b/ext/spl/tests/SplFileObject/gh8563.phpt
@@ -0,0 +1,29 @@
+--TEST--
+GH-8563 (Different results for seek() on SplFileObject and SplTempFileObject)
+--FILE--
+fwrite("line {$i}" . PHP_EOL);
+    $file_02->fwrite("line {$i}" . PHP_EOL);
+}
+
+$file_01->rewind();
+$file_02->rewind();
+
+$file_01->seek(10);
+$file_02->seek(10);
+
+echo 'SplFileObject: ' . $file_01->key() . "\n";
+echo 'SplTempFileObject: ' . $file_02->key() . "\n";
+?>
+--CLEAN--
+
+--EXPECT--
+SplFileObject: 5
+SplTempFileObject: 5
diff --git a/ext/spl/tests/SplFileObject/gh8564.phpt b/ext/spl/tests/SplFileObject/gh8564.phpt
new file mode 100644
index 000000000000..ff16893c4c6b
--- /dev/null
+++ b/ext/spl/tests/SplFileObject/gh8564.phpt
@@ -0,0 +1,20 @@
+--TEST--
+GH-8564 (SplFileObject: next() moves to nonexistent indexes)
+--FILE--
+fwrite("line {$i}" . PHP_EOL);
+}
+
+$file->rewind();
+for ($i = 0; $i < 10; $file->next(), $i++);
+echo "next() 10x: key=" . $file->key() . " valid=" . var_export($file->valid(), true) . "\n";
+
+$file->rewind();
+$file->seek(10);
+echo "seek(10): key=" . $file->key() . " valid=" . var_export($file->valid(), true) . "\n";
+?>
+--EXPECT--
+next() 10x: key=5 valid=false
+seek(10): key=5 valid=false
diff --git a/ext/spl/tests/SplFixedArray_setSize_destruct_grow_during_clear.phpt b/ext/spl/tests/SplFixedArray_setSize_destruct_grow_during_clear.phpt
new file mode 100644
index 000000000000..f0982364afa8
--- /dev/null
+++ b/ext/spl/tests/SplFixedArray_setSize_destruct_grow_during_clear.phpt
@@ -0,0 +1,28 @@
+--TEST--
+SplFixedArray::setSize: grow re-entrantly during clear (setSize(0))
+--FILE--
+arr !== null) {
+            $this->arr->setSize(5);
+        }
+    }
+}
+
+$arr = new SplFixedArray(2);
+$r = new Reentrant();
+$r->arr = $arr;
+$arr[0] = $r;
+unset($r);
+$arr[1] = "tail";
+
+$arr->setSize(0);
+echo "size: ", $arr->getSize(), "\n";
+$arr[0] = "ok";
+var_dump($arr[0]);
+?>
+--EXPECT--
+size: 5
+string(2) "ok"
diff --git a/ext/spl/tests/SplObjectStorage/concurrent_deletion.phpt b/ext/spl/tests/SplObjectStorage/concurrent_deletion.phpt
new file mode 100644
index 000000000000..9da6270b6d7d
--- /dev/null
+++ b/ext/spl/tests/SplObjectStorage/concurrent_deletion.phpt
@@ -0,0 +1,62 @@
+--TEST--
+SplObjectStorage: Mutation during getHash is prohibited
+--CREDITS--
+cnitlrt
+--FILE--
+mutate) {
+            $victim[new stdClass()] = null;
+        }
+        return spl_object_hash($obj);
+    }
+}
+
+function populate(SplObjectStorage $victim, SplObjectStorage $other): void {
+    for ($i = 0; $i < 1024; $i++) {
+        $o = new stdClass();
+        $victim[$o] = null;
+        $other[$o] = null;
+    }
+}
+
+$victim = new SplObjectStorage();
+$other = new EvilStorage();
+
+populate($victim, $other);
+$other->mutate = true;
+
+try {
+    $victim->removeAllExcept($other);
+} catch (Error $e) {
+    echo $e->getMessage(), "\n";
+}
+
+var_dump(count($victim), count($other));
+
+unset($victim, $other);
+$victim = new SplObjectStorage();
+$other = new EvilStorage();
+
+populate($victim, $other);
+$other->mutate = true;
+
+try {
+    $other->addAll($victim);
+} catch (Error $e) {
+    echo $e->getMessage(), "\n";
+}
+
+var_dump(count($victim), count($other));
+?>
+--EXPECT--
+Modification of SplObjectStorage during getHash() is prohibited
+int(1024)
+int(1024)
+Modification of SplObjectStorage during getHash() is prohibited
+int(1024)
+int(1024)
diff --git a/ext/spl/tests/SplObjectStorage/concurrent_deletion_addall.phpt b/ext/spl/tests/SplObjectStorage/concurrent_deletion_addall.phpt
new file mode 100644
index 000000000000..aadbe2acba27
--- /dev/null
+++ b/ext/spl/tests/SplObjectStorage/concurrent_deletion_addall.phpt
@@ -0,0 +1,32 @@
+--TEST--
+SplObjectStorage: Mutation during getHash is prohibited during addAll
+--CREDITS--
+cnitlrt
+--FILE--
+addAll($storage);
+} catch (Error $e) {
+    echo $e->getMessage(), "\n";
+}
+
+var_dump(count($evil), count($storage));
+
+?>
+--EXPECT--
+Modification of SplObjectStorage during getHash() is prohibited
+int(0)
+int(1)
diff --git a/ext/spl/tests/SplObjectStorage/concurrent_deletion_removeexcept.phpt b/ext/spl/tests/SplObjectStorage/concurrent_deletion_removeexcept.phpt
new file mode 100644
index 000000000000..2602bc9e1f03
--- /dev/null
+++ b/ext/spl/tests/SplObjectStorage/concurrent_deletion_removeexcept.phpt
@@ -0,0 +1,32 @@
+--TEST--
+SplObjectStorage: Mutation during getHash is prohibited during removeAllExcept
+--CREDITS--
+cnitlrt
+--FILE--
+removeAllExcept($evil);
+} catch (Error $e) {
+    echo $e->getMessage(), "\n";
+}
+
+var_dump(count($evil), count($storage));
+
+?>
+--EXPECT--
+Modification of SplObjectStorage during getHash() is prohibited
+int(0)
+int(1)
diff --git a/ext/spl/tests/SplObjectStorage/gh21831.phpt b/ext/spl/tests/SplObjectStorage/gh21831.phpt
new file mode 100644
index 000000000000..581012d86a4f
--- /dev/null
+++ b/ext/spl/tests/SplObjectStorage/gh21831.phpt
@@ -0,0 +1,36 @@
+--TEST--
+GH-21831: SplObjectStorage::getHash() cannot mutate storage during removeAllExcept()
+--FILE--
+other) {
+            $this->other->offsetUnset($obj);
+            $this->other = null;
+        }
+
+        return 'x';
+    }
+}
+
+$storage = new SplObjectStorage();
+$storage[new stdClass()] = null;
+
+$filter = new FilterStorage();
+$filter->other = $storage;
+
+try {
+    $storage->removeAllExcept($filter);
+} catch (Error $e) {
+    echo $e->getMessage(), "\n";
+}
+
+var_dump(count($storage));
+
+?>
+--EXPECT--
+Modification of SplObjectStorage during getHash() is prohibited
+int(1)
diff --git a/ext/spl/tests/autoloading/gh22118.phpt b/ext/spl/tests/autoloading/gh22118.phpt
new file mode 100644
index 000000000000..635d876c2740
--- /dev/null
+++ b/ext/spl/tests/autoloading/gh22118.phpt
@@ -0,0 +1,58 @@
+--TEST--
+GH-22118: spl_autoload_unregister() unregisters equivalent first-class method callables
+--FILE--
+load(...));
+		var_dump(spl_autoload_unregister($this->load(...)));
+		spl_autoload_call('MissingDirect');
+
+		spl_autoload_register($this->missing(...));
+		var_dump(spl_autoload_unregister($this->missing(...)));
+		spl_autoload_call('MissingTrampoline');
+
+		spl_autoload_register($this->load(...));
+		var_dump(spl_autoload_unregister([$this, 'load']));
+		spl_autoload_call('MissingArray');
+
+		spl_autoload_register($this(...));
+		var_dump(spl_autoload_unregister($this));
+		spl_autoload_call('MissingInvokable');
+	}
+}
+
+spl_autoload_register(autoload_string(...));
+var_dump(spl_autoload_unregister('autoload_string'));
+spl_autoload_call('MissingString');
+
+(new AutoloadTest())->run();
+?>
+--EXPECT--
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
diff --git a/ext/spl/tests/bug42654.phpt b/ext/spl/tests/bug42654.phpt
index eb72863e0875..20aad74b7342 100644
--- a/ext/spl/tests/bug42654.phpt
+++ b/ext/spl/tests/bug42654.phpt
@@ -110,11 +110,11 @@ object(RecursiveArrayIterator)#%d (1) {
     [2]=>
     array(2) {
       [2]=>
-      string(5) "alter"
+      string(4) "val2"
       [3]=>
       array(1) {
         [3]=>
-        string(5) "alter"
+        string(4) "val3"
       }
     }
     [4]=>
@@ -129,11 +129,11 @@ object(RecursiveArrayIterator)#%d (1) {
     [2]=>
     array(2) {
       [2]=>
-      string(5) "alter"
+      string(4) "val2"
       [3]=>
       array(1) {
         [3]=>
-        string(5) "alter"
+        string(4) "val3"
       }
     }
     [4]=>
@@ -146,11 +146,11 @@ array(3) {
   [2]=>
   array(2) {
     [2]=>
-    string(5) "alter"
+    string(4) "val2"
     [3]=>
     array(1) {
       [3]=>
-      string(5) "alter"
+      string(4) "val3"
     }
   }
   [4]=>
diff --git a/ext/spl/tests/bug42654_2.phpt b/ext/spl/tests/bug42654_2.phpt
deleted file mode 100644
index bd290247dbdc..000000000000
--- a/ext/spl/tests/bug42654_2.phpt
+++ /dev/null
@@ -1,33 +0,0 @@
---TEST--
-Bug #42654 (RecursiveIteratorIterator modifies only part of leaves)
---FILE--
- 'val1', array('key2' => 'val2'), 'key3' => 'val3');
-
-$iterator = new RecursiveIteratorIterator(new RecursiveArrayIterator($data));
-foreach($iterator as $foo) {
-    $key = $iterator->key();
-    switch($key) {
-        case 'key1': // first level
-        case 'key2': // recursive level
-            echo "update $key".PHP_EOL;
-            $iterator->offsetSet($key, 'alter');
-    }
-}
-$copy = $iterator->getArrayCopy();
-var_dump($copy);
-?>
---EXPECT--
-update key1
-update key2
-array(3) {
-  ["key1"]=>
-  string(5) "alter"
-  [0]=>
-  array(1) {
-    ["key2"]=>
-    string(5) "alter"
-  }
-  ["key3"]=>
-  string(4) "val3"
-}
diff --git a/ext/spl/tests/gh13685.phpt b/ext/spl/tests/gh13685.phpt
index 0f679d0e93fc..2bdddec4584e 100644
--- a/ext/spl/tests/gh13685.phpt
+++ b/ext/spl/tests/gh13685.phpt
@@ -44,9 +44,9 @@ try {
 string(14) ""A", "B", "C"
 "
 string(13) ""D", "E", "F""
-Cannot read from file php://temp
+string(0) ""
 --- Use csv control ---
 string(14) ""A", "B", "C"
 "
 string(13) ""D", "E", "F""
-Cannot read from file php://temp
+string(0) ""
diff --git a/ext/spl/tests/gh21499.phpt b/ext/spl/tests/gh21499.phpt
new file mode 100644
index 000000000000..719da0094a6d
--- /dev/null
+++ b/ext/spl/tests/gh21499.phpt
@@ -0,0 +1,17 @@
+--TEST--
+GH-21499 (RecursiveArrayIterator getChildren UAF after parent free)
+--FILE--
+getChildren();
+unset($it);
+$child->__construct([2, 3]);
+var_dump($child->getArrayCopy());
+?>
+--EXPECT--
+array(2) {
+  [0]=>
+  int(2)
+  [1]=>
+  int(3)
+}
diff --git a/ext/spl/tests/gh21927.phpt b/ext/spl/tests/gh21927.phpt
new file mode 100644
index 000000000000..a60ea5ca1025
--- /dev/null
+++ b/ext/spl/tests/gh21927.phpt
@@ -0,0 +1,151 @@
+--TEST--
+GH-21927: Use-after-free of self-freeing MultipleIterator children
+--FILE--
+parent->detachIterator($this);
+        echo "rewind: still alive\n";
+    }
+    public function next(): void {}
+    public function current(): mixed { return 0; }
+    public function key(): mixed { return 0; }
+    public function valid(): bool { return false; }
+}
+
+class DetachOnNext implements Iterator {
+    public function __construct(private MultipleIterator $parent) {}
+    public function rewind(): void {}
+    public function next(): void {
+        $this->parent->detachIterator($this);
+        echo "next: still alive\n";
+    }
+    public function current(): mixed { return 0; }
+    public function key(): mixed { return 0; }
+    public function valid(): bool { return true; }
+}
+
+class DetachOnValid implements Iterator {
+    public function __construct(private MultipleIterator $parent) {}
+    public function rewind(): void {}
+    public function next(): void {}
+    public function current(): mixed { return 0; }
+    public function key(): mixed { return 0; }
+    public function valid(): bool {
+        $this->parent->detachIterator($this);
+        echo "valid: still alive\n";
+        return true;
+    }
+}
+
+class DetachOnCurrent implements Iterator {
+    public function __construct(private MultipleIterator $parent) {}
+    public function rewind(): void {}
+    public function next(): void {}
+    public function current(): mixed {
+        $this->parent->detachIterator($this);
+        echo "current: still alive\n";
+        return 'C';
+    }
+    public function key(): mixed { return 'k'; }
+    public function valid(): bool { return true; }
+}
+
+class DetachOnKey implements Iterator {
+    public function __construct(private MultipleIterator $parent) {}
+    public function rewind(): void {}
+    public function next(): void {}
+    public function current(): mixed { return 'C'; }
+    public function key(): mixed {
+        $this->parent->detachIterator($this);
+        echo "key: still alive\n";
+        return 'K';
+    }
+    public function valid(): bool { return true; }
+}
+
+echo "-- detach inside rewind --\n";
+$mi = new MultipleIterator();
+$mi->attachIterator(new DetachOnRewind($mi));
+$mi->rewind();
+var_dump($mi->countIterators());
+
+echo "-- detach inside next --\n";
+$mi = new MultipleIterator();
+$mi->attachIterator(new DetachOnNext($mi));
+$mi->rewind();
+$mi->next();
+var_dump($mi->countIterators());
+
+echo "-- detach inside valid --\n";
+$mi = new MultipleIterator();
+$mi->attachIterator(new DetachOnValid($mi));
+var_dump($mi->valid());
+var_dump($mi->countIterators());
+
+echo "-- detach inside current (numeric keys) --\n";
+$mi = new MultipleIterator();
+$mi->attachIterator(new DetachOnCurrent($mi));
+var_dump($mi->current());
+var_dump($mi->countIterators());
+
+echo "-- detach inside key (numeric keys) --\n";
+$mi = new MultipleIterator();
+$mi->attachIterator(new DetachOnKey($mi));
+var_dump($mi->key());
+var_dump($mi->countIterators());
+
+echo "-- detach inside current (assoc keys, refcounted inf) --\n";
+$mi = new MultipleIterator(MultipleIterator::MIT_NEED_ALL | MultipleIterator::MIT_KEYS_ASSOC);
+$mi->attachIterator(new DetachOnCurrent($mi), 'cur_info_string');
+var_dump($mi->current());
+var_dump($mi->countIterators());
+
+echo "-- detach inside key (assoc keys, refcounted inf) --\n";
+$mi = new MultipleIterator(MultipleIterator::MIT_NEED_ALL | MultipleIterator::MIT_KEYS_ASSOC);
+$mi->attachIterator(new DetachOnKey($mi), 'key_info_string');
+var_dump($mi->key());
+var_dump($mi->countIterators());
+
+?>
+--EXPECT--
+-- detach inside rewind --
+rewind: still alive
+int(0)
+-- detach inside next --
+next: still alive
+int(0)
+-- detach inside valid --
+valid: still alive
+bool(true)
+int(0)
+-- detach inside current (numeric keys) --
+current: still alive
+array(1) {
+  [0]=>
+  string(1) "C"
+}
+int(0)
+-- detach inside key (numeric keys) --
+key: still alive
+array(1) {
+  [0]=>
+  string(1) "K"
+}
+int(0)
+-- detach inside current (assoc keys, refcounted inf) --
+current: still alive
+array(1) {
+  ["cur_info_string"]=>
+  string(1) "C"
+}
+int(0)
+-- detach inside key (assoc keys, refcounted inf) --
+key: still alive
+array(1) {
+  ["key_info_string"]=>
+  string(1) "K"
+}
+int(0)
diff --git a/ext/spl/tests/gh22062.phpt b/ext/spl/tests/gh22062.phpt
new file mode 100644
index 000000000000..ea67a9983a3d
--- /dev/null
+++ b/ext/spl/tests/gh22062.phpt
@@ -0,0 +1,29 @@
+--TEST--
+GH-22062 (SplDoublyLinkedList iterator UAF via destructor releasing next node)
+--FILE--
+setIteratorMode(
+    SplDoublyLinkedList::IT_MODE_FIFO |
+    SplDoublyLinkedList::IT_MODE_DELETE
+);
+
+$list->push(new class($list) {
+    public function __construct(private SplDoublyLinkedList $list) {}
+    public function __destruct() {
+        if ($this->list->count() > 0) {
+            $this->list->offsetUnset(0);
+        }
+    }
+});
+
+$list->push(new stdClass());
+
+foreach ($list as $item) {
+    unset($item);
+}
+
+var_dump($list->count());
+?>
+--EXPECT--
+int(0)
diff --git a/ext/spl/tests/gh8562.phpt b/ext/spl/tests/gh8562.phpt
new file mode 100644
index 000000000000..40b2554f5794
--- /dev/null
+++ b/ext/spl/tests/gh8562.phpt
@@ -0,0 +1,27 @@
+--TEST--
+GH-8562 (SplFileObject::current() returns wrong result after call to next())
+--FILE--
+fwrite("line {$i}" . PHP_EOL);
+}
+
+$file->rewind();
+$file->next();
+echo "After rewind+next: key=" . $file->key() . " current=" . trim($file->current()) . "\n";
+
+$file->rewind();
+$file->next();
+$file->next();
+echo "After rewind+next+next: key=" . $file->key() . " current=" . trim($file->current()) . "\n";
+
+$file->rewind();
+$file->current();
+$file->next();
+echo "After current+next: key=" . $file->key() . " current=" . trim($file->current()) . "\n";
+?>
+--EXPECT--
+After rewind+next: key=1 current=line 1
+After rewind+next+next: key=2 current=line 2
+After current+next: key=1 current=line 1
diff --git a/ext/spl/tests/iterator_031.phpt b/ext/spl/tests/iterator_031.phpt
index 610e056f5380..c2b5885dd23e 100644
--- a/ext/spl/tests/iterator_031.phpt
+++ b/ext/spl/tests/iterator_031.phpt
@@ -3,6 +3,13 @@ SPL: AppendIterator::append() rewinds when necessary
 --FILE--
 __construct();
+} catch (\Throwable $e) {
+	echo $e::class, ': ', $e->getMessage(), "\n";
+}
+
 class MyArrayIterator extends ArrayIterator
 {
     function rewind(): void
@@ -14,8 +21,7 @@ class MyArrayIterator extends ArrayIterator
 
 $it = new MyArrayIterator(array(1,2));
 
-foreach($it as $k=>$v)
-{
+foreach($it as $k=>$v) {
     echo "$k=>$v\n";
 }
 
@@ -44,31 +50,24 @@ class MyAppendIterator extends AppendIterator
         parent::append($what);
     }
 
-    function parent__construct()
-    {
+    function parent__construct() {
         parent::__construct();
     }
 }
 
 $ap = new MyAppendIterator;
 
-try
-{
+try {
     $ap->append($it);
-}
-catch(\Error $e)
-{
+} catch(\Error $e) {
     echo $e->getMessage() . "\n";
 }
 
 $ap->parent__construct();
 
-try
-{
+try {
     $ap->parent__construct($it);
-}
-catch(BadMethodCallException $e)
-{
+} catch(BadMethodCallException $e) {
     echo $e->getMessage() . "\n";
 }
 
@@ -76,13 +75,13 @@ $ap->append($it);
 $ap->append($it);
 $ap->append($it);
 
-foreach($ap as $k=>$v)
-{
+foreach($ap as $k=>$v) {
     echo "$k=>$v\n";
 }
 
 ?>
 --EXPECT--
+BadMethodCallException: AppendIterator::getIterator() must be called exactly once per instance
 MyArrayIterator::rewind
 0=>1
 1=>2
diff --git a/ext/spl/tests/phpinfo_out.phpt b/ext/spl/tests/phpinfo_out.phpt
new file mode 100644
index 000000000000..8be1a2dead41
--- /dev/null
+++ b/ext/spl/tests/phpinfo_out.phpt
@@ -0,0 +1,16 @@
+--TEST--
+phpinfo() SPL extension information
+--FILE--
+
+--EXPECT--
+SPL
+
+SPL support => enabled
+Interfaces => OuterIterator, RecursiveIterator, SeekableIterator, SplObserver, SplSubject
+Classes => AppendIterator, ArrayIterator, ArrayObject, BadFunctionCallException, BadMethodCallException, CachingIterator, CallbackFilterIterator, DirectoryIterator, DomainException, EmptyIterator, FilesystemIterator, FilterIterator, GlobIterator, InfiniteIterator, InvalidArgumentException, IteratorIterator, LengthException, LimitIterator, LogicException, MultipleIterator, NoRewindIterator, OutOfBoundsException, OutOfRangeException, OverflowException, ParentIterator, RangeException, RecursiveArrayIterator, RecursiveCachingIterator, RecursiveCallbackFilterIterator, RecursiveDirectoryIterator, RecursiveFilterIterator, RecursiveIteratorIterator, RecursiveRegexIterator, RecursiveTreeIterator, RegexIterator, RuntimeException, SplDoublyLinkedList, SplFileInfo, SplFileObject, SplFixedArray, SplHeap, SplMinHeap, SplMaxHeap, SplObjectStorage, SplPriorityQueue, SplQueue, SplStack, SplTempFileObject, UnderflowException, UnexpectedValueException
diff --git a/ext/spl/tests/spl_object_storage_gethash_bailout.phpt b/ext/spl/tests/spl_object_storage_gethash_bailout.phpt
new file mode 100644
index 000000000000..a6327bd62095
--- /dev/null
+++ b/ext/spl/tests/spl_object_storage_gethash_bailout.phpt
@@ -0,0 +1,44 @@
+--TEST--
+SplObjectStorage getHash() depth counter is reset after a bailout in a user getHash()
+--SKIPIF--
+
+--INI--
+allow_url_fopen=1
+--FILE--
+offsetSet(new stdClass());
+    echo "poison";
+} else {
+    $s = new SplObjectStorage();
+    $s->offsetSet(new stdClass());
+    echo "check-ok count=", count($s);
+}
+PHP;
+
+php_cli_server_start($code, 'router.php');
+
+$base = 'http://' . PHP_CLI_SERVER_ADDRESS;
+// Request 1 bails out (OOM) inside the overridden getHash() mid-offsetSet.
+@file_get_contents($base . '/poison');
+// A later request on the same worker must not be poisoned by a stuck counter.
+echo @file_get_contents($base . '/check'), "\n";
+echo @file_get_contents($base . '/check'), "\n";
+?>
+--EXPECT--
+check-ok count=1
+check-ok count=1
diff --git a/ext/spl/tests/unserialize_errors.phpt b/ext/spl/tests/unserialize_errors.phpt
index 1138b5c8cd54..64356923ae29 100644
--- a/ext/spl/tests/unserialize_errors.phpt
+++ b/ext/spl/tests/unserialize_errors.phpt
@@ -144,7 +144,7 @@ Incomplete or ill-typed serialization data
 Passed variable is not an array or object
 Incomplete or ill-typed serialization data
 Cannot deserialize ArrayObject with iterator class 'NonExistent'; no such class exists
-Cannot deserialize ArrayObject with iterator class 'Existent'; this class does not implement the Iterator interface
+Cannot deserialize ArrayObject with iterator class 'Existent'; this class is not derived from ArrayIterator
 ArrayIterator:
 Incomplete or ill-typed serialization data
 Incomplete or ill-typed serialization data
diff --git a/ext/sqlite3/php_sqlite3.h b/ext/sqlite3/php_sqlite3.h
index 79f8cf436030..8a9cf3af1598 100644
--- a/ext/sqlite3/php_sqlite3.h
+++ b/ext/sqlite3/php_sqlite3.h
@@ -1,14 +1,12 @@
 /*
    +----------------------------------------------------------------------+
-   | Copyright (c) The PHP Group                                          |
+   | Copyright © The PHP Group and Contributors.                          |
    +----------------------------------------------------------------------+
-   | This source file is subject to version 3.01 of the PHP license,      |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | https://www.php.net/license/3_01.txt                                 |
-   | If you did not receive a copy of the PHP license and are unable to   |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@php.net so we can mail you a copy immediately.               |
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Authors: Scott MacVicar                            |
    +----------------------------------------------------------------------+
diff --git a/ext/sqlite3/php_sqlite3_structs.h b/ext/sqlite3/php_sqlite3_structs.h
index 5d9f69cc5770..e8488028240e 100644
--- a/ext/sqlite3/php_sqlite3_structs.h
+++ b/ext/sqlite3/php_sqlite3_structs.h
@@ -1,14 +1,12 @@
 /*
    +----------------------------------------------------------------------+
-   | Copyright (c) The PHP Group                                          |
+   | Copyright © The PHP Group and Contributors.                          |
    +----------------------------------------------------------------------+
-   | This source file is subject to version 3.01 of the PHP license,      |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | https://www.php.net/license/3_01.txt                                 |
-   | If you did not receive a copy of the PHP license and are unable to   |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@php.net so we can mail you a copy immediately.               |
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Authors: Scott MacVicar                            |
    +----------------------------------------------------------------------+
@@ -74,9 +72,7 @@ typedef struct _php_sqlite3_db_object  {
 	zend_object zo;
 } php_sqlite3_db_object;
 
-static inline php_sqlite3_db_object *php_sqlite3_db_from_obj(zend_object *obj) {
-	return (php_sqlite3_db_object*)((char*)(obj) - XtOffsetOf(php_sqlite3_db_object, zo));
-}
+#define php_sqlite3_db_from_obj(obj) ZEND_CONTAINER_OF(obj, php_sqlite3_db_object, zo)
 
 #define Z_SQLITE3_DB_P(zv)  php_sqlite3_db_from_obj(Z_OBJ_P((zv)))
 
@@ -103,9 +99,7 @@ struct _php_sqlite3_result_object  {
 	zend_object zo;
 };
 
-static inline php_sqlite3_result *php_sqlite3_result_from_obj(zend_object *obj) {
-	return (php_sqlite3_result*)((char*)(obj) - XtOffsetOf(php_sqlite3_result, zo));
-}
+#define php_sqlite3_result_from_obj(obj) ZEND_CONTAINER_OF(obj, php_sqlite3_result, zo)
 
 #define Z_SQLITE3_RESULT_P(zv)  php_sqlite3_result_from_obj(Z_OBJ_P((zv)))
 
@@ -121,9 +115,7 @@ struct _php_sqlite3_stmt_object  {
 	zend_object zo;
 };
 
-static inline php_sqlite3_stmt *php_sqlite3_stmt_from_obj(zend_object *obj) {
-	return (php_sqlite3_stmt*)((char*)(obj) - XtOffsetOf(php_sqlite3_stmt, zo));
-}
+#define php_sqlite3_stmt_from_obj(obj) ZEND_CONTAINER_OF(obj, php_sqlite3_stmt, zo)
 
 #define Z_SQLITE3_STMT_P(zv)  php_sqlite3_stmt_from_obj(Z_OBJ_P((zv)))
 
diff --git a/ext/sqlite3/sqlite3.c b/ext/sqlite3/sqlite3.c
index 659de2291d86..67ff850cadd0 100644
--- a/ext/sqlite3/sqlite3.c
+++ b/ext/sqlite3/sqlite3.c
@@ -1,14 +1,12 @@
 /*
    +----------------------------------------------------------------------+
-   | Copyright (c) The PHP Group                                          |
+   | Copyright © The PHP Group and Contributors.                          |
    +----------------------------------------------------------------------+
-   | This source file is subject to version 3.01 of the PHP license,      |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | https://www.php.net/license/3_01.txt                                 |
-   | If you did not receive a copy of the PHP license and are unable to   |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@php.net so we can mail you a copy immediately.               |
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Authors: Scott MacVicar                            |
    +----------------------------------------------------------------------+
@@ -38,7 +36,7 @@ ZEND_DECLARE_MODULE_GLOBALS(sqlite3)
 static PHP_GINIT_FUNCTION(sqlite3);
 static int php_sqlite3_authorizer(void *autharg, int action, const char *arg1, const char *arg2, const char *arg3, const char *arg4);
 static void sqlite3_param_dtor(zval *data);
-static int php_sqlite3_compare_stmt_free(php_sqlite3_stmt **stmt_obj_ptr, sqlite3_stmt *statement);
+static int php_sqlite3_compare_stmt_free(php_sqlite3_stmt **stmt_obj_ptr, php_sqlite3_stmt *statement);
 static zend_always_inline void php_sqlite3_fetch_one(int n_cols, php_sqlite3_result *result_obj, zend_long mode, zval *result);
 
 #define SQLITE3_CHECK_INITIALIZED(db_obj, member, class_name) \
@@ -480,6 +478,9 @@ PHP_METHOD(SQLite3, escapeString)
 		if (ret) {
 			RETVAL_STRING(ret);
 			sqlite3_free(ret);
+		} else {
+			zend_throw_exception_ex(php_sqlite3_exception_ce, 0, "Unable to escape string");
+			RETURN_THROWS();
 		}
 	} else {
 		RETURN_EMPTY_STRING();
@@ -603,7 +604,7 @@ PHP_METHOD(SQLite3, query)
 }
 /* }}} */
 
-static void sqlite_value_to_zval(sqlite3_stmt *stmt, int column, zval *data) /* {{{ */
+static void sqlite_value_to_zval(php_sqlite3_db_object *db_obj, sqlite3_stmt *stmt, int column, zval *data) /* {{{ */
 {
 	sqlite3_int64 val;
 
@@ -612,7 +613,13 @@ static void sqlite_value_to_zval(sqlite3_stmt *stmt, int column, zval *data) /*
 			val = sqlite3_column_int64(stmt, column);
 #if LONG_MAX <= 2147483647
 			if (val > ZEND_LONG_MAX || val < ZEND_LONG_MIN) {
-				ZVAL_STRINGL(data, (char *)sqlite3_column_text(stmt, column), sqlite3_column_bytes(stmt, column));
+				const char *text = (const char *) sqlite3_column_text(stmt, column);
+				if (UNEXPECTED(text == NULL)) {
+					php_sqlite3_error(db_obj, SQLITE_NOMEM, "Failed to retrieve column value due to out of memory");
+					ZVAL_NULL(data);
+				} else {
+					ZVAL_STRINGL(data, text, sqlite3_column_bytes(stmt, column));
+				}
 			} else {
 #endif
 				ZVAL_LONG(data, (zend_long) val);
@@ -629,13 +636,33 @@ static void sqlite_value_to_zval(sqlite3_stmt *stmt, int column, zval *data) /*
 			ZVAL_NULL(data);
 			break;
 
-		case SQLITE3_TEXT:
-			ZVAL_STRINGL(data, (const char *) sqlite3_column_text(stmt, column), sqlite3_column_bytes(stmt, column));
+		case SQLITE3_TEXT: {
+			const char *text = (const char *) sqlite3_column_text(stmt, column);
+			if (UNEXPECTED(text == NULL)) {
+				php_sqlite3_error(db_obj, SQLITE_NOMEM, "Failed to retrieve column value due to out of memory");
+				ZVAL_NULL(data);
+			} else {
+				ZVAL_STRINGL(data, text, sqlite3_column_bytes(stmt, column));
+			}
 			break;
+		}
 
 		case SQLITE_BLOB:
-		default:
-			ZVAL_STRINGL(data, (char*)sqlite3_column_blob(stmt, column), sqlite3_column_bytes(stmt, column));
+		default: {
+			const char *blob = (const char *) sqlite3_column_blob(stmt, column);
+			if (UNEXPECTED(blob == NULL)) {
+				if (sqlite3_errcode(sqlite3_db_handle(stmt)) == SQLITE_NOMEM) {
+					php_sqlite3_error(db_obj, SQLITE_NOMEM, "Failed to retrieve column value due to out of memory");
+					ZVAL_NULL(data);
+				} else {
+					/* Zero-length BLOB */
+					ZVAL_EMPTY_STRING(data);
+				}
+			} else {
+				ZVAL_STRINGL(data, blob, sqlite3_column_bytes(stmt, column));
+			}
+			break;
+		}
 	}
 }
 /* }}} */
@@ -685,14 +712,14 @@ PHP_METHOD(SQLite3, querySingle)
 		case SQLITE_ROW: /* Valid Row */
 		{
 			if (!entire_row) {
-				sqlite_value_to_zval(stmt, 0, return_value);
+				sqlite_value_to_zval(db_obj, stmt, 0, return_value);
 			} else {
 				int i = 0, count = sqlite3_data_count(stmt);
 
 				array_init_size(return_value, count);
 				for (i = 0; i < count; i++) {
 					zval data;
-					sqlite_value_to_zval(stmt, i, &data);
+					sqlite_value_to_zval(db_obj, stmt, i, &data);
 					add_assoc_zval(return_value, (char*)sqlite3_column_name(stmt, i), &data);
 				}
 			}
@@ -1131,7 +1158,7 @@ static int php_sqlite3_stream_seek(php_stream *stream, zend_off_t offset, int wh
 	switch(whence) {
 		case SEEK_CUR:
 			if (offset < 0) {
-				if (sqlite3_stream->position < (size_t)(-offset)) {
+				if (sqlite3_stream->position < -(size_t)offset) {
 					sqlite3_stream->position = 0;
 					*newoffs = -1;
 					return -1;
@@ -1172,7 +1199,7 @@ static int php_sqlite3_stream_seek(php_stream *stream, zend_off_t offset, int wh
 				sqlite3_stream->position = sqlite3_stream->size;
 				*newoffs = -1;
 				return -1;
-			} else if (sqlite3_stream->size < (size_t)(-offset)) {
+			} else if (sqlite3_stream->size < -(size_t)offset) {
 				sqlite3_stream->position = 0;
 				*newoffs = -1;
 				return -1;
@@ -2016,7 +2043,6 @@ PHP_METHOD(SQLite3Result, fetchArray)
 
 		case SQLITE_DONE:
 			RETURN_FALSE;
-			break;
 
 		default:
 			php_sqlite3_error(result_obj->db_obj, sqlite3_errcode(sqlite3_db_handle(result_obj->stmt_obj->stmt)), "Unable to execute statement: %s", sqlite3_errmsg(sqlite3_db_handle(result_obj->stmt_obj->stmt)));
@@ -2121,7 +2147,7 @@ PHP_METHOD(SQLite3Result, finalize)
 
 	/* We need to finalize an internal statement */
 	if (!result_obj->is_prepared_statement) {
-		zend_llist_del_element(&(result_obj->db_obj->free_list), &result_obj->stmt_obj,
+		zend_llist_del_element(&(result_obj->db_obj->free_list), result_obj->stmt_obj,
 			(int (*)(void *, void *)) php_sqlite3_compare_stmt_free);
 	} else {
 		sqlite3_reset(result_obj->stmt_obj->stmt);
@@ -2236,9 +2262,9 @@ static void php_sqlite3_free_list_dtor(void **item)
 }
 /* }}} */
 
-static int php_sqlite3_compare_stmt_free(php_sqlite3_stmt **stmt_obj_ptr, sqlite3_stmt *statement ) /* {{{ */
+static int php_sqlite3_compare_stmt_free(php_sqlite3_stmt **stmt_obj_ptr, php_sqlite3_stmt *statement ) /* {{{ */
 {
-	return ((*stmt_obj_ptr)->initialised && statement == (*stmt_obj_ptr)->stmt);
+	return ((*stmt_obj_ptr)->initialised && statement == *stmt_obj_ptr);
 }
 /* }}} */
 
@@ -2352,7 +2378,7 @@ static void php_sqlite3_stmt_object_free_storage(zend_object *object) /* {{{ */
 	}
 
 	if (intern->initialised) {
-		zend_llist_del_element(&(intern->db_obj->free_list), intern->stmt,
+		zend_llist_del_element(&(intern->db_obj->free_list), intern,
 			(int (*)(void *, void *)) php_sqlite3_compare_stmt_free);
 	}
 
@@ -2447,7 +2473,7 @@ static zend_always_inline void php_sqlite3_fetch_one(int n_cols, php_sqlite3_res
 {
 	for (int i = 0; i < n_cols; i ++) {
 		zval data;
-		sqlite_value_to_zval(result_obj->stmt_obj->stmt, i, &data);
+		sqlite_value_to_zval(result_obj->db_obj, result_obj->stmt_obj->stmt, i, &data);
 
 		if (mode & PHP_SQLITE3_NUM) {
 			add_index_zval(result, i, &data);
@@ -2483,7 +2509,7 @@ PHP_MINIT_FUNCTION(sqlite3)
 	memcpy(&sqlite3_result_object_handlers, &std_object_handlers, sizeof(zend_object_handlers));
 
 	/* Register SQLite 3 Class */
-	sqlite3_object_handlers.offset = XtOffsetOf(php_sqlite3_db_object, zo);
+	sqlite3_object_handlers.offset = offsetof(php_sqlite3_db_object, zo);
 	sqlite3_object_handlers.clone_obj = NULL;
 	sqlite3_object_handlers.free_obj = php_sqlite3_object_free_storage;
 	sqlite3_object_handlers.get_gc = php_sqlite3_get_gc;
@@ -2492,7 +2518,7 @@ PHP_MINIT_FUNCTION(sqlite3)
 	php_sqlite3_sc_entry->default_object_handlers = &sqlite3_object_handlers;
 
 	/* Register SQLite 3 Prepared Statement Class */
-	sqlite3_stmt_object_handlers.offset = XtOffsetOf(php_sqlite3_stmt, zo);
+	sqlite3_stmt_object_handlers.offset = offsetof(php_sqlite3_stmt, zo);
 	sqlite3_stmt_object_handlers.clone_obj = NULL;
 	sqlite3_stmt_object_handlers.free_obj = php_sqlite3_stmt_object_free_storage;
 	php_sqlite3_stmt_entry = register_class_SQLite3Stmt();
@@ -2500,7 +2526,7 @@ PHP_MINIT_FUNCTION(sqlite3)
 	php_sqlite3_stmt_entry->default_object_handlers = &sqlite3_stmt_object_handlers;
 
 	/* Register SQLite 3 Result Class */
-	sqlite3_result_object_handlers.offset = XtOffsetOf(php_sqlite3_result, zo);
+	sqlite3_result_object_handlers.offset = offsetof(php_sqlite3_result, zo);
 	sqlite3_result_object_handlers.clone_obj = NULL;
 	sqlite3_result_object_handlers.free_obj = php_sqlite3_result_object_free_storage;
 	php_sqlite3_result_entry = register_class_SQLite3Result();
diff --git a/ext/sqlite3/tests/bug72668.phpt b/ext/sqlite3/tests/bug72668.phpt
index 40ede8883cc2..7f33338eb5e6 100644
--- a/ext/sqlite3/tests/bug72668.phpt
+++ b/ext/sqlite3/tests/bug72668.phpt
@@ -12,20 +12,20 @@ $db = new SQLite3(':memory:');
 $db->createFunction('my_udf_md5', 'my_udf_md5');
 
 try {
-    $result = $db->query('SELECT my_udf_md5("test")');
+    $result = $db->query("SELECT my_udf_md5('test')");
     var_dump($result);
 }
 catch(\Exception $e) {
     echo "Exception: ".$e->getMessage();
 }
 try {
-    $result = $db->querySingle('SELECT my_udf_md5("test")');
+    $result = $db->querySingle("SELECT my_udf_md5('test')");
     var_dump($result);
 }
 catch(\Exception $e) {
     echo "Exception: ".$e->getMessage();
 }
-$statement = $db->prepare('SELECT my_udf_md5("test")');
+$statement = $db->prepare("SELECT my_udf_md5('test')");
 try {
     $result = $statement->execute();
     var_dump($result);
diff --git a/ext/sqlite3/tests/gh20964.phpt b/ext/sqlite3/tests/gh20964.phpt
new file mode 100644
index 000000000000..852940ba983e
--- /dev/null
+++ b/ext/sqlite3/tests/gh20964.phpt
@@ -0,0 +1,24 @@
+--TEST--
+GH-20964 (fseek() on SQLite3 blob stream with PHP_INT_MIN causes undefined behavior)
+--EXTENSIONS--
+sqlite3
+--FILE--
+exec('CREATE TABLE test (id INTEGER PRIMARY KEY, data BLOB)');
+$db->exec("INSERT INTO test (id, data) VALUES (1, 'hello')");
+
+$stream = $db->openBlob('test', 'data', 1);
+
+var_dump(fseek($stream, PHP_INT_MIN, SEEK_END));
+
+rewind($stream);
+var_dump(fseek($stream, PHP_INT_MIN, SEEK_CUR));
+
+fclose($stream);
+$db->close();
+?>
+--EXPECT--
+int(-1)
+int(-1)
diff --git a/ext/sqlite3/tests/sqlite3_29_createfunction.phpt b/ext/sqlite3/tests/sqlite3_29_createfunction.phpt
index ef28b3b62def..1a511ee13996 100644
--- a/ext/sqlite3/tests/sqlite3_29_createfunction.phpt
+++ b/ext/sqlite3/tests/sqlite3_29_createfunction.phpt
@@ -9,14 +9,14 @@ require_once(__DIR__ . '/new_db.inc');
 
 $func = 'strtoupper';
 var_dump($db->createfunction($func, $func));
-var_dump($db->querySingle('SELECT strtoupper("test")'));
+var_dump($db->querySingle("SELECT strtoupper('test')"));
 
 $func2 = 'strtolower';
 var_dump($db->createfunction($func2, $func2));
-var_dump($db->querySingle('SELECT strtolower("TEST")'));
+var_dump($db->querySingle("SELECT strtolower('TEST')"));
 
 var_dump($db->createfunction($func, $func2));
-var_dump($db->querySingle('SELECT strtoupper("tEst")'));
+var_dump($db->querySingle("SELECT strtoupper('tEst')"));
 
 
 ?>
diff --git a/ext/sqlite3/tests/sqlite3_35_stmt_readonly.phpt b/ext/sqlite3/tests/sqlite3_35_stmt_readonly.phpt
index 49f029d5854f..e07d5b73e999 100644
--- a/ext/sqlite3/tests/sqlite3_35_stmt_readonly.phpt
+++ b/ext/sqlite3/tests/sqlite3_35_stmt_readonly.phpt
@@ -2,13 +2,6 @@
 SQLite3_stmt::readOnly check
 --EXTENSIONS--
 sqlite3
---SKIPIF--
-
 --FILE--
 = 3.8.3');
 ?>
 --FILE--
 createfunction($func, $func, 1, SQLITE3_DETERMINISTIC));
-var_dump($db->querySingle('SELECT strtoupper("test")'));
+var_dump($db->querySingle("SELECT strtoupper('test')"));
 
 $func2 = 'strtolower';
 var_dump($db->createfunction($func2, $func2, 1, SQLITE3_DETERMINISTIC));
-var_dump($db->querySingle('SELECT strtolower("TEST")'));
+var_dump($db->querySingle("SELECT strtolower('TEST')"));
 
 var_dump($db->createfunction($func, $func2, 1, SQLITE3_DETERMINISTIC));
-var_dump($db->querySingle('SELECT strtoupper("tEst")'));
+var_dump($db->querySingle("SELECT strtoupper('tEst')"));
 
 
 ?>
diff --git a/ext/sqlite3/tests/sqlite3_dqs.phpt b/ext/sqlite3/tests/sqlite3_dqs.phpt
new file mode 100644
index 000000000000..1efa8ad475fe
--- /dev/null
+++ b/ext/sqlite3/tests/sqlite3_dqs.phpt
@@ -0,0 +1,28 @@
+--TEST--
+SQLite3 DQS
+--EXTENSIONS--
+sqlite3
+--SKIPIF--
+enableExceptions(true);
+    $db->exec('SELECT "test"');
+} catch (\SQLite3Exception) {
+    die('skip SQLite is lacking DQS');
+}
+?>
+--FILE--
+exec('CREATE TABLE test (s1 VARCHAR(255), s2 VARCHAR(255))');
+$db->exec('INSERT INTO test VALUES (\'test\', "test")');
+var_dump($db->prepare('SELECT * FROM test')->execute()->fetchArray(SQLITE3_ASSOC));
+?>
+--EXPECT--
+array(2) {
+  ["s1"]=>
+  string(4) "test"
+  ["s2"]=>
+  string(4) "test"
+}
diff --git a/ext/sqlite3/tests/sqlite3_explain.phpt b/ext/sqlite3/tests/sqlite3_explain.phpt
index 40648588733c..1f9d4fc940e4 100644
--- a/ext/sqlite3/tests/sqlite3_explain.phpt
+++ b/ext/sqlite3/tests/sqlite3_explain.phpt
@@ -14,7 +14,7 @@ if ($version <= 3043000) die("skip for sqlite3 < 3.43.0");
 require_once(__DIR__ . '/new_db.inc');
 
 $db->exec('CREATE TABLE test_explain (a string);');
-$stmt = $db->prepare('INSERT INTO test_explain VALUES ("first insert"), ("second_insert")');
+$stmt = $db->prepare("INSERT INTO test_explain VALUES ('first insert'), ('second_insert')");
 $stmt->setExplain(Sqlite3Stmt::EXPLAIN_MODE_EXPLAIN);
 var_dump($stmt->explain() == Sqlite3Stmt::EXPLAIN_MODE_EXPLAIN);
 $r = $stmt->execute();
@@ -28,7 +28,7 @@ $result = [];
 while (($arr = $r->fetchArray(SQLITE3_ASSOC)) !== false) $result[] = $arr;
 var_dump($result);
 
-$stmt = $db->prepare('INSERT INTO test_explain VALUES ("first insert"), ("second_insert")');
+$stmt = $db->prepare("INSERT INTO test_explain VALUES ('first insert'), ('second_insert')");
 $stmt->setExplain(Sqlite3Stmt::EXPLAIN_MODE_PREPARED);
 $stmt->execute();
 $stmts = $db->prepare('SELECT * FROM test_explain');
@@ -81,7 +81,7 @@ array(%d) {
     ["opcode"]=>
     string(%d) "%s"
     ["p1"]=>
-    int(3)
+    int(%d)
     ["p2"]=>
     int(%d)
     ["p3"]=>
@@ -102,7 +102,7 @@ array(%d) {
     ["p1"]=>
     int(0)
     ["p2"]=>
-    int(2)
+    int(%d)
     ["p3"]=>
     int(0)
     ["p4"]=>
@@ -119,7 +119,7 @@ array(%d) {
     ["opcode"]=>
     string(5) "Yield"
     ["p1"]=>
-    int(3)
+    int(%d)
     ["p2"]=>
     int(0)
     ["p3"]=>
@@ -140,7 +140,7 @@ array(%d) {
     ["p1"]=>
     int(0)
     ["p2"]=>
-    int(2)
+    int(%d)
     ["p3"]=>
     int(0)
     ["p4"]=>
@@ -157,7 +157,7 @@ array(%d) {
     ["opcode"]=>
     string(5) "Yield"
     ["p1"]=>
-    int(3)
+    int(%d)
     ["p2"]=>
     int(0)
     ["p3"]=>
@@ -176,7 +176,7 @@ array(%d) {
     ["opcode"]=>
     string(12) "EndCoroutine"
     ["p1"]=>
-    int(3)
+    int(%d)
     ["p2"]=>
     int(0)
     ["p3"]=>
@@ -214,7 +214,7 @@ array(%d) {
     ["opcode"]=>
     string(5) "Yield"
     ["p1"]=>
-    int(3)
+    int(%d)
     ["p2"]=>
     int(%d)
     ["p3"]=>
@@ -235,7 +235,7 @@ array(%d) {
     ["p1"]=>
     int(0)
     ["p2"]=>
-    int(1)
+    int(%d)
     ["p3"]=>
     int(0)
     ["p4"]=>
@@ -252,11 +252,11 @@ array(%d) {
     ["opcode"]=>
     string(10) "MakeRecord"
     ["p1"]=>
-    int(2)
+    int(%d)
     ["p2"]=>
     int(1)
     ["p3"]=>
-    int(4)
+    int(%d)
     ["p4"]=>
     string(1) "C"
     ["p5"]=>
@@ -273,9 +273,9 @@ array(%d) {
     ["p1"]=>
     int(0)
     ["p2"]=>
-    int(4)
+    int(%d)
     ["p3"]=>
-    int(1)
+    int(%d)
     ["p4"]=>
     string(12) "test_explain"
     ["p5"]=>
diff --git a/ext/sqlite3/tests/sqlite3_rename_column.phpt b/ext/sqlite3/tests/sqlite3_rename_column.phpt
index 6b4e23bc7186..a3a4caef3ce6 100644
--- a/ext/sqlite3/tests/sqlite3_rename_column.phpt
+++ b/ext/sqlite3/tests/sqlite3_rename_column.phpt
@@ -14,7 +14,7 @@ if (SQLite3::version()['versionNumber'] < 3025000) {
 $db = new SQLite3(':memory:');
 
 $db->exec('CREATE TABLE tbl (orig text)');
-$db->exec('insert into tbl values ("one"), ("two")');
+$db->exec("insert into tbl values ('one'), ('two')");
 
 $res1 = $db->prepare('select * from tbl')->execute();
 $res2 = $db->prepare('select * from tbl')->execute();
diff --git a/ext/sqlite3/tests/sqlite3_stmt_busy.phpt b/ext/sqlite3/tests/sqlite3_stmt_busy.phpt
index 8110d374afe6..eb278561b575 100644
--- a/ext/sqlite3/tests/sqlite3_stmt_busy.phpt
+++ b/ext/sqlite3/tests/sqlite3_stmt_busy.phpt
@@ -2,17 +2,12 @@
 SQLite3_stmt::busy
 --EXTENSIONS--
 sqlite3
---SKIPIF--
-
 --FILE--
 exec('CREATE TABLE test_busy (a string);');
-$db->exec('INSERT INTO test_busy VALUES ("interleaved"), ("statements")');
+$db->exec("INSERT INTO test_busy VALUES ('interleaved'), ('statements')");
 $st = $db->prepare('SELECT a FROM test_busy');
 var_dump($st->busy());
 $r = $st->execute();
diff --git a/ext/sqlite3/tests/sqlite3_trampoline_createfunction.phpt b/ext/sqlite3/tests/sqlite3_trampoline_createfunction.phpt
index 81245f5b4bef..52d5b726415e 100644
--- a/ext/sqlite3/tests/sqlite3_trampoline_createfunction.phpt
+++ b/ext/sqlite3/tests/sqlite3_trampoline_createfunction.phpt
@@ -16,8 +16,8 @@ class TrampolineTest {
 $o = new TrampolineTest();
 $callback = [$o, 'strtoupper'];
 var_dump($db->createfunction('strtoupper', $callback));
-var_dump($db->querySingle('SELECT strtoupper("test")'));
-var_dump($db->querySingle('SELECT strtoupper("test")'));
+var_dump($db->querySingle("SELECT strtoupper('test')"));
+var_dump($db->querySingle("SELECT strtoupper('test')"));
 
 ?>
 --EXPECT--
diff --git a/ext/standard/array.c b/ext/standard/array.c
index 640d832dd1d2..3b17ca3f7942 100644
--- a/ext/standard/array.c
+++ b/ext/standard/array.c
@@ -1,14 +1,12 @@
 /*
    +----------------------------------------------------------------------+
-   | Copyright (c) The PHP Group                                          |
+   | Copyright © The PHP Group and Contributors.                          |
    +----------------------------------------------------------------------+
-   | This source file is subject to version 3.01 of the PHP license,      |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | https://www.php.net/license/3_01.txt                                 |
-   | If you did not receive a copy of the PHP license and are unable to   |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@php.net so we can mail you a copy immediately.               |
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Authors: Andi Gutmans                                  |
    |          Zeev Suraski                                  |
@@ -60,6 +58,7 @@
 /* }}} */
 
 ZEND_DECLARE_MODULE_GLOBALS(array)
+PHPAPI zend_class_entry *sort_direction_ce;
 
 /* {{{ php_array_init_globals */
 static void php_array_init_globals(zend_array_globals *array_globals)
@@ -620,7 +619,6 @@ PHP_FUNCTION(count)
 				cnt = php_count_recursive(Z_ARRVAL_P(array));
 			}
 			RETURN_LONG(cnt);
-			break;
 		case IS_OBJECT: {
 			zval retval;
 			/* first, we check if the handler is defined */
@@ -1113,7 +1111,7 @@ PHP_FUNCTION(min)
 	/* mixed min ( array $values ) */
 	if (argc == 1) {
 		if (Z_TYPE(args[0]) != IS_ARRAY) {
-			zend_argument_type_error(1, "must be of type array, %s given", zend_zval_value_name(&args[0]));
+			zend_wrong_parameter_type_error(1, Z_EXPECTED_ARRAY, &args[0]);
 			RETURN_THROWS();
 		} else {
 			zval *result = zend_hash_minmax(Z_ARRVAL(args[0]), php_data_compare, 0);
@@ -1241,7 +1239,7 @@ PHP_FUNCTION(max)
 	/* mixed max ( array $values ) */
 	if (argc == 1) {
 		if (Z_TYPE(args[0]) != IS_ARRAY) {
-			zend_argument_type_error(1, "must be of type array, %s given", zend_zval_value_name(&args[0]));
+			zend_wrong_parameter_type_error(1, Z_EXPECTED_ARRAY, &args[0]);
 			RETURN_THROWS();
 		} else {
 			zval *result = zend_hash_minmax(Z_ARRVAL(args[0]), php_data_compare, 1);
@@ -2818,7 +2816,7 @@ static uint8_t php_range_process_input(const zval *input, uint32_t arg_num, zend
 			*dval = 0.0;
 			return IS_STRING;
 		}
-		EMPTY_SWITCH_DEFAULT_CASE();
+		default: ZEND_UNREACHABLE();
 	}
 }
 
@@ -4115,7 +4113,7 @@ static zend_always_inline void php_array_replace_wrapper(INTERNAL_FUNCTION_PARAM
 		zval *arg = args + i;
 
 		if (Z_TYPE_P(arg) != IS_ARRAY) {
-			zend_argument_type_error(i + 1, "must be of type array, %s given", zend_zval_value_name(arg));
+			zend_wrong_parameter_type_error(i + 1, Z_EXPECTED_ARRAY, arg);
 			RETURN_THROWS();
 		}
 	}
@@ -4494,7 +4492,7 @@ PHP_FUNCTION(array_count_values)
 			if ((tmp = zend_hash_index_find(Z_ARRVAL_P(return_value), Z_LVAL_P(entry))) == NULL) {
 				zval data;
 				ZVAL_LONG(&data, 1);
-				zend_hash_index_update(Z_ARRVAL_P(return_value), Z_LVAL_P(entry), &data);
+				zend_hash_index_add_new(Z_ARRVAL_P(return_value), Z_LVAL_P(entry), &data);
 			} else {
 				Z_LVAL_P(tmp)++;
 			}
@@ -4502,7 +4500,7 @@ PHP_FUNCTION(array_count_values)
 			if ((tmp = zend_symtable_find(Z_ARRVAL_P(return_value), Z_STR_P(entry))) == NULL) {
 				zval data;
 				ZVAL_LONG(&data, 1);
-				zend_symtable_update(Z_ARRVAL_P(return_value), Z_STR_P(entry), &data);
+				zend_symtable_add_new(Z_ARRVAL_P(return_value), Z_STR_P(entry), &data);
 			} else {
 				Z_LVAL_P(tmp)++;
 			}
@@ -4799,7 +4797,7 @@ PHP_FUNCTION(array_change_key_case)
 	zend_string *string_key;
 	zend_string *new_key;
 	zend_ulong num_key;
-	zend_long change_to_upper=0;
+	zend_long change_to_upper = PHP_CASE_LOWER;
 
 	ZEND_PARSE_PARAMETERS_START(1, 2)
 		Z_PARAM_ARRAY(array)
@@ -4807,13 +4805,18 @@ PHP_FUNCTION(array_change_key_case)
 		Z_PARAM_LONG(change_to_upper)
 	ZEND_PARSE_PARAMETERS_END();
 
+	if (change_to_upper != PHP_CASE_LOWER && change_to_upper != PHP_CASE_UPPER) {
+		zend_argument_value_error(2, "must be either CASE_LOWER or CASE_UPPER");
+		RETURN_THROWS();
+	}
+
 	array_init_size(return_value, zend_hash_num_elements(Z_ARRVAL_P(array)));
 
 	ZEND_HASH_FOREACH_KEY_VAL(Z_ARRVAL_P(array), num_key, string_key, entry) {
 		if (!string_key) {
 			entry = zend_hash_index_update(Z_ARRVAL_P(return_value), num_key, entry);
 		} else {
-			if (change_to_upper) {
+			if (change_to_upper == PHP_CASE_UPPER) {
 				new_key = zend_string_toupper(string_key);
 			} else {
 				new_key = zend_string_tolower(string_key);
@@ -5741,7 +5744,7 @@ PHP_FUNCTION(array_diff)
 {
 	zval *args;
 	uint32_t argc, i;
-	uint32_t num;
+	uint64_t num;
 	HashTable exclude;
 	zval *value;
 	zend_string *str, *tmp_str, *key;
@@ -5831,6 +5834,11 @@ PHP_FUNCTION(array_diff)
 		return;
 	}
 
+	if (UNEXPECTED(num >= HT_MAX_SIZE)) {
+		zend_throw_error(NULL, "The total number of elements must be lower than %u", HT_MAX_SIZE);
+		RETURN_THROWS();
+	}
+
 	ZVAL_NULL(&dummy);
 	/* create exclude map */
 	zend_hash_init(&exclude, num, NULL, NULL, 0);
@@ -6306,11 +6314,50 @@ PHP_FUNCTION(array_rand)
 }
 /* }}} */
 
+/* Apply a single array_sum/array_product step to return_value. */
+static zend_always_inline void php_array_binop_apply(
+		zval *return_value, zval *entry, const char *op_name, binary_op_type op)
+{
+	/* For objects we try to cast them to a numeric type */
+	if (Z_TYPE_P(entry) == IS_OBJECT) {
+		zval dst;
+		zend_result status = Z_OBJ_HT_P(entry)->cast_object(Z_OBJ_P(entry), &dst, _IS_NUMBER);
+
+		/* Do not type error for BC */
+		if (status == FAILURE || (Z_TYPE(dst) != IS_LONG && Z_TYPE(dst) != IS_DOUBLE)) {
+			php_error_docref(NULL, E_WARNING, "%s is not supported on type %s",
+				op_name, zend_zval_type_name(entry));
+			return;
+		}
+		op(return_value, return_value, &dst);
+		return;
+	}
+
+	zend_result status = op(return_value, return_value, entry);
+	if (status == FAILURE) {
+		ZEND_ASSERT(EG(exception));
+		zend_clear_exception();
+		/* BC resources: previously resources were cast to int */
+		if (Z_TYPE_P(entry) == IS_RESOURCE) {
+			zval tmp;
+			ZVAL_LONG(&tmp, Z_RES_HANDLE_P(entry));
+			op(return_value, return_value, &tmp);
+		}
+		/* BC non numeric strings: previously were cast to 0 */
+		else if (Z_TYPE_P(entry) == IS_STRING) {
+			zval tmp;
+			ZVAL_LONG(&tmp, 0);
+			op(return_value, return_value, &tmp);
+		}
+		php_error_docref(NULL, E_WARNING, "%s is not supported on type %s",
+			op_name, zend_zval_type_name(entry));
+	}
+}
+
 /* Wrapper for array_sum and array_product */
-static void php_array_binop(INTERNAL_FUNCTION_PARAMETERS, const char *op_name, binary_op_type op, zend_long initial)
+static zend_always_inline void php_array_binop(INTERNAL_FUNCTION_PARAMETERS, const char *op_name, binary_op_type op, zend_long initial)
 {
 	HashTable *input;
-	zval *entry;
 
 	ZEND_PARSE_PARAMETERS_START(1, 1)
 		Z_PARAM_ARRAY_HT(input)
@@ -6321,42 +6368,39 @@ static void php_array_binop(INTERNAL_FUNCTION_PARAMETERS, const char *op_name, b
 	}
 
 	ZVAL_LONG(return_value, initial);
-	ZEND_HASH_FOREACH_VAL(input, entry) {
-		/* For objects we try to cast them to a numeric type */
-		if (Z_TYPE_P(entry) == IS_OBJECT) {
-			zval dst;
-			zend_result status = Z_OBJ_HT_P(entry)->cast_object(Z_OBJ_P(entry), &dst, _IS_NUMBER);
-
-			/* Do not type error for BC */
-			if (status == FAILURE || (Z_TYPE(dst) != IS_LONG && Z_TYPE(dst) != IS_DOUBLE)) {
-				php_error_docref(NULL, E_WARNING, "%s is not supported on type %s",
-					op_name, zend_zval_type_name(entry));
-				continue;
-			}
-			op(return_value, return_value, &dst);
-			continue;
-		}
 
-		zend_result status = op(return_value, return_value, entry);
-		if (status == FAILURE) {
-			ZEND_ASSERT(EG(exception));
-			zend_clear_exception();
-			/* BC resources: previously resources were cast to int */
-			if (Z_TYPE_P(entry) == IS_RESOURCE) {
-				zval tmp;
-				ZVAL_LONG(&tmp, Z_RES_HANDLE_P(entry));
-				op(return_value, return_value, &tmp);
+	if (op == add_function) {
+		zval *entry;
+		ZEND_HASH_FOREACH_VAL(input, entry) {
+			if (EXPECTED(Z_TYPE_P(entry) == IS_LONG) && EXPECTED(Z_TYPE_P(return_value) == IS_LONG)) {
+				fast_long_add_function(return_value, return_value, entry);
+				continue;
 			}
-			/* BC non numeric strings: previously were cast to 0 */
-			else if (Z_TYPE_P(entry) == IS_STRING) {
-				zval tmp;
-				ZVAL_LONG(&tmp, 0);
-				op(return_value, return_value, &tmp);
+			php_array_binop_apply(return_value, entry, op_name, op);
+		} ZEND_HASH_FOREACH_END();
+	} else if (op == mul_function) {
+		zval *entry;
+		ZEND_HASH_FOREACH_VAL(input, entry) {
+			if (EXPECTED(Z_TYPE_P(entry) == IS_LONG) && EXPECTED(Z_TYPE_P(return_value) == IS_LONG)) {
+				zend_long lval;
+				double dval;
+				int overflow;
+				ZEND_SIGNED_MULTIPLY_LONG(Z_LVAL_P(return_value), Z_LVAL_P(entry), lval, dval, overflow);
+				if (UNEXPECTED(overflow)) {
+					ZVAL_DOUBLE(return_value, dval);
+				} else {
+					Z_LVAL_P(return_value) = lval;
+				}
+				continue;
 			}
-			php_error_docref(NULL, E_WARNING, "%s is not supported on type %s",
-				op_name, zend_zval_type_name(entry));
-		}
-	} ZEND_HASH_FOREACH_END();
+			php_array_binop_apply(return_value, entry, op_name, op);
+		} ZEND_HASH_FOREACH_END();
+	} else {
+		zval *entry;
+		ZEND_HASH_FOREACH_VAL(input, entry) {
+			php_array_binop_apply(return_value, entry, op_name, op);
+		} ZEND_HASH_FOREACH_END();
+	}
 }
 
 /* {{{ Returns the sum of the array entries */
@@ -6409,6 +6453,7 @@ PHP_FUNCTION(array_reduce)
 	fci.retval = return_value;
 	fci.param_count = 2;
 	fci.params = args;
+	fci.consumed_args = zend_fci_consumed_arg(0);
 
 	ZEND_HASH_FOREACH_VAL(htbl, operand) {
 		ZVAL_COPY_VALUE(&args[0], return_value);
@@ -6676,7 +6721,7 @@ PHP_FUNCTION(array_map)
 
 	if (n_arrays == 1) {
 		if (Z_TYPE(arrays[0]) != IS_ARRAY) {
-			zend_argument_type_error(2, "must be of type array, %s given", zend_zval_value_name(&arrays[0]));
+			zend_wrong_parameter_type_error(2, Z_EXPECTED_ARRAY, &arrays[0]);
 			RETURN_THROWS();
 		}
 		const HashTable *input = Z_ARRVAL(arrays[0]);
diff --git a/ext/standard/assert.c b/ext/standard/assert.c
index 501ea5508dd3..a976aeda1494 100644
--- a/ext/standard/assert.c
+++ b/ext/standard/assert.c
@@ -1,14 +1,12 @@
 /*
    +----------------------------------------------------------------------+
-   | Copyright (c) The PHP Group                                          |
+   | Copyright © The PHP Group and Contributors.                          |
    +----------------------------------------------------------------------+
-   | This source file is subject to version 3.01 of the PHP license,      |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | https://www.php.net/license/3_01.txt                                 |
-   | If you did not receive a copy of the PHP license and are unable to   |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@php.net so we can mail you a copy immediately.               |
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Author: Thies C. Arntzen                           |
    +----------------------------------------------------------------------+
diff --git a/ext/standard/base64.c b/ext/standard/base64.c
index 8d4feee84975..5c3f876ef2b9 100644
--- a/ext/standard/base64.c
+++ b/ext/standard/base64.c
@@ -1,14 +1,12 @@
 /*
    +----------------------------------------------------------------------+
-   | Copyright (c) The PHP Group                                          |
+   | Copyright © The PHP Group and Contributors.                          |
    +----------------------------------------------------------------------+
-   | This source file is subject to version 3.01 of the PHP license,      |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | https://www.php.net/license/3_01.txt                                 |
-   | If you did not receive a copy of the PHP license and are unable to   |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@php.net so we can mail you a copy immediately.               |
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Author: Jim Winstead                                   |
    |         Xinchen Hui                                |
@@ -536,7 +534,7 @@ zend_string *php_base64_encode_avx512_vbmi(const unsigned char *str, size_t leng
 		/* Step 2: splitting 24-bit words into 32-bit lanes */
 		str = _mm512_permutexvar_epi8(shuffle_splitting, str);
 
-		/* Step 3: moving 6-bit word to sperate bytes */
+		/* Step 3: moving 6-bit word to separate bytes */
 		str = _mm512_multishift_epi64_epi8(multi_shifts, str);
 
 		/* Step 4: conversion to ASCII */
@@ -643,7 +641,7 @@ zend_string *php_base64_encode_avx512(const unsigned char *str, size_t length, z
 		/* [D1 D2 D0 D1|C1 C2 C0 C1|B1 B2 B0 B1|A1 A2 A0 A1] x 4 */
 		str = _mm512_shuffle_epi8(str, _mm512_set4_epi32(0x0a0b090a, 0x07080607, 0x04050304, 0x01020001));
 
-		/* Step 3: moving 6-bit word to sperate bytes */
+		/* Step 3: moving 6-bit word to separate bytes */
 		/* in:  [bbbbcccc|ccdddddd|aaaaaabb|bbbbcccc] */
 		/* t0:  [0000cccc|cc000000|aaaaaa00|00000000] */
 		const __m512i t0 = _mm512_and_si512(str, _mm512_set1_epi32(0x0fc0fc00));
diff --git a/ext/standard/base64.h b/ext/standard/base64.h
index 19ff0b60d252..a866541b727b 100644
--- a/ext/standard/base64.h
+++ b/ext/standard/base64.h
@@ -1,14 +1,12 @@
 /*
    +----------------------------------------------------------------------+
-   | Copyright (c) The PHP Group                                          |
+   | Copyright © The PHP Group and Contributors.                          |
    +----------------------------------------------------------------------+
-   | This source file is subject to version 3.01 of the PHP license,      |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | https://www.php.net/license/3_01.txt                                 |
-   | If you did not receive a copy of the PHP license and are unable to   |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@php.net so we can mail you a copy immediately.               |
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Author: Jim Winstead                                   |
    |         Xinchen Hui                                |
diff --git a/ext/standard/basic_functions.c b/ext/standard/basic_functions.c
index fbbeeb0b433f..f8b1cb5c4fdb 100644
--- a/ext/standard/basic_functions.c
+++ b/ext/standard/basic_functions.c
@@ -1,14 +1,12 @@
 /*
    +----------------------------------------------------------------------+
-   | Copyright (c) The PHP Group                                          |
+   | Copyright © The PHP Group and Contributors.                          |
    +----------------------------------------------------------------------+
-   | This source file is subject to version 3.01 of the PHP license,      |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | https://www.php.net/license/3_01.txt                                 |
-   | If you did not receive a copy of the PHP license and are unable to   |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@php.net so we can mail you a copy immediately.               |
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Authors: Andi Gutmans                                  |
    |          Zeev Suraski                                  |
@@ -297,12 +295,14 @@ PHP_MINIT_FUNCTION(basic) /* {{{ */
 	assertion_error_ce = register_class_AssertionError(zend_ce_error);
 
 	rounding_mode_ce = register_class_RoundingMode();
+	sort_direction_ce = register_class_SortDirection();
 
 	BASIC_MINIT_SUBMODULE(var)
 	BASIC_MINIT_SUBMODULE(file)
 	BASIC_MINIT_SUBMODULE(browscap)
 	BASIC_MINIT_SUBMODULE(standard_filters)
 	BASIC_MINIT_SUBMODULE(user_filters)
+	BASIC_MINIT_SUBMODULE(poll)
 	BASIC_MINIT_SUBMODULE(password)
 	BASIC_MINIT_SUBMODULE(image)
 
@@ -336,6 +336,7 @@ PHP_MINIT_FUNCTION(basic) /* {{{ */
 #endif
 	BASIC_MINIT_SUBMODULE(exec)
 
+	BASIC_MINIT_SUBMODULE(stream_errors)
 	BASIC_MINIT_SUBMODULE(user_streams)
 
 	php_register_url_stream_wrapper("php", &php_stream_php_wrapper);
@@ -599,6 +600,20 @@ PHP_FUNCTION(ip2long)
 	if (addr_len == 0 || inet_pton(AF_INET, addr, &ip) != 1) {
 		RETURN_FALSE;
 	}
+#ifdef _AIX
+	/*
+	AIX accepts IP strings with extraneous 0 (192.168.042.42 will be treated as
+	192.168.42.42), while Linux doesn't.
+	For consistency, we convert back the IP to a string and check if it is equal to
+	the original string. If not, the IP should be considered invalid.
+	*/
+	char str[INET_ADDRSTRLEN];
+	const char* result = inet_ntop(AF_INET, &ip, str, sizeof(str));
+	ZEND_ASSERT(result != NULL);
+	if (strcmp(addr, result) != 0) {
+		RETURN_FALSE;
+	}
+#endif
 	RETURN_LONG(ntohl(ip.s_addr));
 }
 /* }}} */
@@ -697,7 +712,7 @@ PHP_FUNCTION(getenv)
 
 	ZEND_PARSE_PARAMETERS_START(0, 2)
 		Z_PARAM_OPTIONAL
-		Z_PARAM_STRING_OR_NULL(str, str_len)
+		Z_PARAM_PATH_OR_NULL(str, str_len)
 		Z_PARAM_BOOL(local_only)
 	ZEND_PARSE_PARAMETERS_END();
 
@@ -740,7 +755,7 @@ PHP_FUNCTION(putenv)
 #endif
 
 	ZEND_PARSE_PARAMETERS_START(1, 1)
-		Z_PARAM_STRING(setting, setting_len)
+		Z_PARAM_PATH(setting, setting_len)
 	ZEND_PARSE_PARAMETERS_END();
 
 	if (setting_len == 0 || setting[0] == '=') {
@@ -1282,9 +1297,9 @@ static void add_config_entries(HashTable *hash, zval *return_value) /* {{{ */
 	zend_string *key;
 	zval *zv;
 
-	ZEND_HASH_FOREACH_KEY_VAL(hash, h, key, zv)
+	ZEND_HASH_FOREACH_KEY_VAL(hash, h, key, zv) {
 		add_config_entry(h, key, zv, return_value);
-	ZEND_HASH_FOREACH_END();
+	} ZEND_HASH_FOREACH_END();
 }
 /* }}} */
 
@@ -1717,11 +1732,11 @@ PHPAPI bool append_user_shutdown_function(php_shutdown_function_entry *shutdown_
 
 ZEND_API void php_get_highlight_struct(zend_syntax_highlighter_ini *syntax_highlighter_ini) /* {{{ */
 {
-	syntax_highlighter_ini->highlight_comment = INI_STR("highlight.comment");
-	syntax_highlighter_ini->highlight_default = INI_STR("highlight.default");
-	syntax_highlighter_ini->highlight_html    = INI_STR("highlight.html");
-	syntax_highlighter_ini->highlight_keyword = INI_STR("highlight.keyword");
-	syntax_highlighter_ini->highlight_string  = INI_STR("highlight.string");
+	syntax_highlighter_ini->highlight_comment = zend_ini_string_literal("highlight.comment");
+	syntax_highlighter_ini->highlight_default = zend_ini_string_literal("highlight.default");
+	syntax_highlighter_ini->highlight_html    = zend_ini_string_literal("highlight.html");
+	syntax_highlighter_ini->highlight_keyword = zend_ini_string_literal("highlight.keyword");
+	syntax_highlighter_ini->highlight_string  = zend_ini_string_literal("highlight.string");
 }
 /* }}} */
 
@@ -1942,6 +1957,12 @@ PHP_FUNCTION(ini_get_all)
 					add_assoc_null(&option, "local_value");
 				}
 
+				if (ini_entry->def->value) {
+					add_assoc_stringl(&option, "builtin_default_value", ini_entry->def->value, ini_entry->def->value_length);
+				} else {
+					add_assoc_null(&option, "builtin_default_value");
+				}
+
 				add_assoc_long(&option, "access", ini_entry->modifiable);
 
 				zend_symtable_update(Z_ARRVAL_P(return_value), ini_entry->name, &option);
@@ -2029,17 +2050,16 @@ PHP_FUNCTION(ini_restore)
 PHP_FUNCTION(set_include_path)
 {
 	zend_string *new_value;
-	char *old_value;
 	zend_string *key;
 
 	ZEND_PARSE_PARAMETERS_START(1, 1)
 		Z_PARAM_PATH_STR(new_value)
 	ZEND_PARSE_PARAMETERS_END();
 
-	old_value = zend_ini_string("include_path", sizeof("include_path") - 1, 0);
+	zend_string *old_value = zend_ini_str_literal("include_path");
 	/* copy to return here, because alter might free it! */
 	if (old_value) {
-		RETVAL_STRING(old_value);
+		RETVAL_STR_COPY(old_value);
 	} else {
 		RETVAL_FALSE;
 	}
@@ -2059,7 +2079,7 @@ PHP_FUNCTION(get_include_path)
 {
 	ZEND_PARSE_PARAMETERS_NONE();
 
-	zend_string *str = zend_ini_str("include_path", sizeof("include_path") - 1, 0);
+	zend_string *str = zend_ini_str_literal("include_path");
 
 	if (str == NULL) {
 		RETURN_FALSE;
diff --git a/ext/standard/basic_functions.h b/ext/standard/basic_functions.h
index 004279b9d1ae..4d5a4c02aec0 100644
--- a/ext/standard/basic_functions.h
+++ b/ext/standard/basic_functions.h
@@ -1,14 +1,12 @@
 /*
    +----------------------------------------------------------------------+
-   | Copyright (c) The PHP Group                                          |
+   | Copyright © The PHP Group and Contributors.                          |
    +----------------------------------------------------------------------+
-   | This source file is subject to version 3.01 of the PHP license,      |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | https://www.php.net/license/3_01.txt                                 |
-   | If you did not receive a copy of the PHP license and are unable to   |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@php.net so we can mail you a copy immediately.               |
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Authors: Andi Gutmans                                  |
    |          Zeev Suraski                                  |
@@ -44,6 +42,7 @@ PHP_MINFO_FUNCTION(basic);
 
 ZEND_API void php_get_highlight_struct(zend_syntax_highlighter_ini *syntax_highlighter_ini);
 
+PHP_MINIT_FUNCTION(poll);
 PHP_MINIT_FUNCTION(user_filters);
 PHP_RSHUTDOWN_FUNCTION(user_filters);
 PHP_RSHUTDOWN_FUNCTION(browscap);
diff --git a/ext/standard/basic_functions.stub.php b/ext/standard/basic_functions.stub.php
index 6d0c565fc2d4..7fc31e7d80ca 100644
--- a/ext/standard/basic_functions.stub.php
+++ b/ext/standard/basic_functions.stub.php
@@ -90,6 +90,11 @@
  */
 const SORT_FLAG_CASE = UNKNOWN;
 
+enum SortDirection {
+    case Ascending;
+    case Descending;
+}
+
 /**
  * @var int
  * @cvalue PHP_CASE_LOWER
@@ -1636,7 +1641,10 @@ function in_array(mixed $needle, array $haystack, bool $strict = false): bool {}
  */
 function array_search(mixed $needle, array $haystack, bool $strict = false): int|string|false {}
 
-/** @prefer-ref $array */
+/**
+ * @prefer-ref $array
+ * @forbid-dynamic-calls
+ */
 function extract(array &$array, int $flags = EXTR_OVERWRITE, string $prefix = ""): int {}
 
 /**
@@ -1644,6 +1652,7 @@ function extract(array &$array, int $flags = EXTR_OVERWRITE, string $prefix = ""
  * @param array|string $var_names
  * @return array
  * @refcount 1
+ * @forbid-dynamic-calls
  */
 function compact($var_name, ...$var_names): array {}
 
@@ -1874,7 +1883,7 @@ function array_product(array $array): int|float {}
 
 function array_reduce(array $array, callable $callback, mixed $initial = null): mixed {}
 
-function array_filter(array $array, ?callable $callback = null, int $mode = ARRAY_FILTER_USE_KEY): array {}
+function array_filter(array $array, ?callable $callback = null, int $mode = ARRAY_FILTER_USE_VALUE): array {}
 
 function array_find(array $array, callable $callback): mixed {}
 
@@ -3376,7 +3385,10 @@ function soundex(string $string): string {}
 
 /* streamsfuncs.c */
 
-function stream_select(?array &$read, ?array &$write, ?array &$except, ?int $seconds, ?int $microseconds = null): int|false {}
+/**
+ * @param resource|null $context
+ */
+function stream_select(?array &$read, ?array &$write, ?array &$except, ?int $seconds, ?int $microseconds = null, $context = null): int|false {}
 
 /**
  * @return resource
@@ -3472,6 +3484,11 @@ function stream_socket_sendto($socket, string $data, int $flags = 0, string $add
  */
 function stream_socket_enable_crypto($stream, bool $enable, ?int $crypto_method = null, $session_stream = null): int|bool {}
 
+/**
+ * @param resource $stream
+ */
+function stream_socket_get_crypto_status($stream): int {}
+
 #ifdef HAVE_SHUTDOWN
 /** @param resource $stream */
 function stream_socket_shutdown($stream, int $mode): bool {}
@@ -3479,17 +3496,19 @@ function stream_socket_shutdown($stream, int $mode): bool {}
 
 #ifdef HAVE_SOCKETPAIR
 /**
+ * @param resource|null $context
  * @return array|false
  * @refcount 1
  */
-function stream_socket_pair(int $domain, int $type, int $protocol): array|false {}
+function stream_socket_pair(int $domain, int $type, int $protocol, $context = null): array|false {}
 #endif
 
 /**
  * @param resource $from
  * @param resource $to
+ * @param resource|null $context
  */
-function stream_copy_to_stream($from, $to, ?int $length = null, int $offset = 0): int|false {}
+function stream_copy_to_stream($from, $to, ?int $length = null, int $offset = 0, $context = null): int|false {}
 
 /**
  * @param resource $stream
@@ -3549,14 +3568,24 @@ function stream_resolve_include_path(string $filename): string|false {}
  */
 function stream_get_wrappers(): array {}
 
+/**
+ * @return array
+ */
+function stream_last_errors(): array {}
+
+function stream_clear_errors(): void {}
+
 /**
  * @return array
  * @refcount 1
  */
 function stream_get_transports(): array {}
 
-/** @param resource|string $stream */
-function stream_is_local($stream): bool {}
+/**
+ * @param resource|string $stream
+ * @param resource|null $context
+ */
+function stream_is_local($stream, $context = null): bool {}
 
 /** @param resource $stream */
 function stream_isatty($stream): bool {}
diff --git a/ext/standard/basic_functions_arginfo.h b/ext/standard/basic_functions_arginfo.h
index d0109fa27c96..c5266c5a877c 100644
--- a/ext/standard/basic_functions_arginfo.h
+++ b/ext/standard/basic_functions_arginfo.h
@@ -1,5 +1,5 @@
 /* This is a generated file, edit basic_functions.stub.php instead.
- * Stub hash: f5583557f058e4862750d1262296d7f59cb0eed0
+ * Stub hash: 3b1649a3abb3cfb5cb39d93f30a97765fe862d67
  * Has decl header: yes */
 
 ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_set_time_limit, 0, 1, _IS_BOOL, 0)
@@ -346,7 +346,7 @@ ZEND_END_ARG_INFO()
 ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_array_filter, 0, 1, IS_ARRAY, 0)
 	ZEND_ARG_TYPE_INFO(0, array, IS_ARRAY, 0)
 	ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, callback, IS_CALLABLE, 1, "null")
-	ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, mode, IS_LONG, 0, "ARRAY_FILTER_USE_KEY")
+	ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, mode, IS_LONG, 0, "ARRAY_FILTER_USE_VALUE")
 ZEND_END_ARG_INFO()
 
 ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_array_find, 0, 2, IS_MIXED, 0)
@@ -1823,6 +1823,7 @@ ZEND_BEGIN_ARG_WITH_RETURN_TYPE_MASK_EX(arginfo_stream_select, 0, 4, MAY_BE_LONG
 	ZEND_ARG_TYPE_INFO(1, except, IS_ARRAY, 1)
 	ZEND_ARG_TYPE_INFO(0, seconds, IS_LONG, 1)
 	ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, microseconds, IS_LONG, 1, "null")
+	ZEND_ARG_INFO_WITH_DEFAULT_VALUE(0, context, "null")
 ZEND_END_ARG_INFO()
 
 ZEND_BEGIN_ARG_INFO_EX(arginfo_stream_context_create, 0, 0, 0)
@@ -1925,6 +1926,8 @@ ZEND_BEGIN_ARG_WITH_RETURN_TYPE_MASK_EX(arginfo_stream_socket_enable_crypto, 0,
 	ZEND_ARG_INFO_WITH_DEFAULT_VALUE(0, session_stream, "null")
 ZEND_END_ARG_INFO()
 
+#define arginfo_stream_socket_get_crypto_status arginfo_fpassthru
+
 #if defined(HAVE_SHUTDOWN)
 ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_stream_socket_shutdown, 0, 2, _IS_BOOL, 0)
 	ZEND_ARG_INFO(0, stream)
@@ -1937,6 +1940,7 @@ ZEND_BEGIN_ARG_WITH_RETURN_TYPE_MASK_EX(arginfo_stream_socket_pair, 0, 3, MAY_BE
 	ZEND_ARG_TYPE_INFO(0, domain, IS_LONG, 0)
 	ZEND_ARG_TYPE_INFO(0, type, IS_LONG, 0)
 	ZEND_ARG_TYPE_INFO(0, protocol, IS_LONG, 0)
+	ZEND_ARG_INFO_WITH_DEFAULT_VALUE(0, context, "null")
 ZEND_END_ARG_INFO()
 #endif
 
@@ -1945,6 +1949,7 @@ ZEND_BEGIN_ARG_WITH_RETURN_TYPE_MASK_EX(arginfo_stream_copy_to_stream, 0, 2, MAY
 	ZEND_ARG_INFO(0, to)
 	ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, length, IS_LONG, 1, "null")
 	ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, offset, IS_LONG, 0, "0")
+	ZEND_ARG_INFO_WITH_DEFAULT_VALUE(0, context, "null")
 ZEND_END_ARG_INFO()
 
 ZEND_BEGIN_ARG_WITH_RETURN_TYPE_MASK_EX(arginfo_stream_get_contents, 0, 1, MAY_BE_STRING|MAY_BE_FALSE)
@@ -1987,9 +1992,16 @@ ZEND_END_ARG_INFO()
 
 #define arginfo_stream_get_wrappers arginfo_ob_list_handlers
 
+#define arginfo_stream_last_errors arginfo_ob_list_handlers
+
+#define arginfo_stream_clear_errors arginfo_flush
+
 #define arginfo_stream_get_transports arginfo_ob_list_handlers
 
-#define arginfo_stream_is_local arginfo_rewind
+ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_stream_is_local, 0, 1, _IS_BOOL, 0)
+	ZEND_ARG_INFO(0, stream)
+	ZEND_ARG_INFO_WITH_DEFAULT_VALUE(0, context, "null")
+ZEND_END_ARG_INFO()
 
 #define arginfo_stream_isatty arginfo_rewind
 
@@ -2813,6 +2825,7 @@ ZEND_FUNCTION(stream_socket_get_name);
 ZEND_FUNCTION(stream_socket_recvfrom);
 ZEND_FUNCTION(stream_socket_sendto);
 ZEND_FUNCTION(stream_socket_enable_crypto);
+ZEND_FUNCTION(stream_socket_get_crypto_status);
 #if defined(HAVE_SHUTDOWN)
 ZEND_FUNCTION(stream_socket_shutdown);
 #endif
@@ -2829,6 +2842,8 @@ ZEND_FUNCTION(stream_get_meta_data);
 ZEND_FUNCTION(stream_get_line);
 ZEND_FUNCTION(stream_resolve_include_path);
 ZEND_FUNCTION(stream_get_wrappers);
+ZEND_FUNCTION(stream_last_errors);
+ZEND_FUNCTION(stream_clear_errors);
 ZEND_FUNCTION(stream_get_transports);
 ZEND_FUNCTION(stream_is_local);
 ZEND_FUNCTION(stream_isatty);
@@ -2944,8 +2959,16 @@ static const zend_function_entry ext_functions[] = {
 	ZEND_FE(array_walk_recursive, arginfo_array_walk_recursive)
 	ZEND_RAW_FENTRY("in_array", zif_in_array, arginfo_in_array, ZEND_ACC_COMPILE_TIME_EVAL, frameless_function_infos_in_array, NULL)
 	ZEND_RAW_FENTRY("array_search", zif_array_search, arginfo_array_search, ZEND_ACC_COMPILE_TIME_EVAL, NULL, NULL)
-	ZEND_FE(extract, arginfo_extract)
-	ZEND_FE(compact, arginfo_compact)
+#if (PHP_VERSION_ID >= 80600)
+	ZEND_RAW_FENTRY("extract", zif_extract, arginfo_extract, ZEND_FENTRY_FLAGS(0, ZEND_ACC2_FORBID_DYN_CALLS), NULL, NULL)
+#elif (PHP_VERSION_ID >= 80400)
+	ZEND_RAW_FENTRY("extract", zif_extract, arginfo_extract, 0, NULL, NULL)
+#endif
+#if (PHP_VERSION_ID >= 80600)
+	ZEND_RAW_FENTRY("compact", zif_compact, arginfo_compact, ZEND_FENTRY_FLAGS(0, ZEND_ACC2_FORBID_DYN_CALLS), NULL, NULL)
+#elif (PHP_VERSION_ID >= 80400)
+	ZEND_RAW_FENTRY("compact", zif_compact, arginfo_compact, 0, NULL, NULL)
+#endif
 	ZEND_FE(array_fill, arginfo_array_fill)
 	ZEND_FE(array_fill_keys, arginfo_array_fill_keys)
 	ZEND_FE(range, arginfo_range)
@@ -3418,6 +3441,7 @@ static const zend_function_entry ext_functions[] = {
 	ZEND_FE(stream_socket_recvfrom, arginfo_stream_socket_recvfrom)
 	ZEND_FE(stream_socket_sendto, arginfo_stream_socket_sendto)
 	ZEND_FE(stream_socket_enable_crypto, arginfo_stream_socket_enable_crypto)
+	ZEND_FE(stream_socket_get_crypto_status, arginfo_stream_socket_get_crypto_status)
 #if defined(HAVE_SHUTDOWN)
 	ZEND_FE(stream_socket_shutdown, arginfo_stream_socket_shutdown)
 #endif
@@ -3437,6 +3461,8 @@ static const zend_function_entry ext_functions[] = {
 	ZEND_FE(stream_get_line, arginfo_stream_get_line)
 	ZEND_FE(stream_resolve_include_path, arginfo_stream_resolve_include_path)
 	ZEND_FE(stream_get_wrappers, arginfo_stream_get_wrappers)
+	ZEND_FE(stream_last_errors, arginfo_stream_last_errors)
+	ZEND_FE(stream_clear_errors, arginfo_stream_clear_errors)
 	ZEND_FE(stream_get_transports, arginfo_stream_get_transports)
 	ZEND_FE(stream_is_local, arginfo_stream_is_local)
 	ZEND_FE(stream_isatty, arginfo_stream_isatty)
@@ -3980,6 +4006,17 @@ static void register_basic_functions_symbols(int module_number)
 	attribute_Deprecated_const_ASSERT_EXCEPTION_0->args[1].name = ZSTR_KNOWN(ZEND_STR_MESSAGE);
 }
 
+static zend_class_entry *register_class_SortDirection(void)
+{
+	zend_class_entry *class_entry = zend_register_internal_enum("SortDirection", IS_UNDEF, NULL);
+
+	zend_enum_add_case_cstr(class_entry, "Ascending", NULL);
+
+	zend_enum_add_case_cstr(class_entry, "Descending", NULL);
+
+	return class_entry;
+}
+
 static zend_class_entry *register_class___PHP_Incomplete_Class(void)
 {
 	zend_class_entry ce, *class_entry;
diff --git a/ext/standard/basic_functions_decl.h b/ext/standard/basic_functions_decl.h
index 139b47f2444d..630a4b7e656b 100644
--- a/ext/standard/basic_functions_decl.h
+++ b/ext/standard/basic_functions_decl.h
@@ -1,8 +1,13 @@
 /* This is a generated file, edit basic_functions.stub.php instead.
- * Stub hash: f5583557f058e4862750d1262296d7f59cb0eed0 */
+ * Stub hash: 3b1649a3abb3cfb5cb39d93f30a97765fe862d67 */
 
-#ifndef ZEND_BASIC_FUNCTIONS_DECL_f5583557f058e4862750d1262296d7f59cb0eed0_H
-#define ZEND_BASIC_FUNCTIONS_DECL_f5583557f058e4862750d1262296d7f59cb0eed0_H
+#ifndef ZEND_BASIC_FUNCTIONS_DECL_3b1649a3abb3cfb5cb39d93f30a97765fe862d67_H
+#define ZEND_BASIC_FUNCTIONS_DECL_3b1649a3abb3cfb5cb39d93f30a97765fe862d67_H
+
+typedef enum zend_enum_SortDirection {
+	ZEND_ENUM_SortDirection_Ascending = 1,
+	ZEND_ENUM_SortDirection_Descending = 2,
+} zend_enum_SortDirection;
 
 typedef enum zend_enum_RoundingMode {
 	ZEND_ENUM_RoundingMode_HalfAwayFromZero = 1,
@@ -15,4 +20,4 @@ typedef enum zend_enum_RoundingMode {
 	ZEND_ENUM_RoundingMode_PositiveInfinity = 8,
 } zend_enum_RoundingMode;
 
-#endif /* ZEND_BASIC_FUNCTIONS_DECL_f5583557f058e4862750d1262296d7f59cb0eed0_H */
+#endif /* ZEND_BASIC_FUNCTIONS_DECL_3b1649a3abb3cfb5cb39d93f30a97765fe862d67_H */
diff --git a/ext/standard/browscap.c b/ext/standard/browscap.c
index 5009c7793688..7534615a946b 100644
--- a/ext/standard/browscap.c
+++ b/ext/standard/browscap.c
@@ -1,14 +1,12 @@
 /*
    +----------------------------------------------------------------------+
-   | Copyright (c) The PHP Group                                          |
+   | Copyright © The PHP Group and Contributors.                          |
    +----------------------------------------------------------------------+
-   | This source file is subject to version 3.01 of the PHP license,      |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | https://www.php.net/license/3_01.txt                                 |
-   | If you did not receive a copy of the PHP license and are unable to   |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@php.net so we can mail you a copy immediately.               |
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Author: Zeev Suraski                                   |
    +----------------------------------------------------------------------+
@@ -337,7 +335,7 @@ static void php_browscap_parser_cb(zval *arg1, zval *arg2, zval *arg3, int callb
 					) {
 						zend_error(E_CORE_ERROR, "Invalid browscap ini file: "
 							"'Parent' value cannot be same as the section name: %s "
-							"(in file %s)", ZSTR_VAL(ctx->current_section_name), INI_STR("browscap"));
+							"(in file %s)", ZSTR_VAL(ctx->current_section_name), zend_ini_string_literal("browscap"));
 						return;
 					}
 
@@ -399,7 +397,7 @@ static void php_browscap_parser_cb(zval *arg1, zval *arg2, zval *arg3, int callb
 }
 /* }}} */
 
-static zend_result browscap_read_file(char *filename, browser_data *browdata, bool persistent) /* {{{ */
+static zend_result browscap_read_file(const char *filename, browser_data *browdata, bool persistent) /* {{{ */
 {
 	zend_file_handle fh;
 	browscap_parser_ctx ctx = {0};
@@ -499,7 +497,7 @@ PHP_INI_MH(OnChangeBrowscap)
 
 PHP_MINIT_FUNCTION(browscap) /* {{{ */
 {
-	char *browscap = INI_STR("browscap");
+	const char *browscap = zend_ini_string_literal("browscap");
 
 #ifdef ZTS
 	ts_allocate_id(&browscap_globals_id, sizeof(browser_data), (ts_allocate_ctor) browscap_globals_ctor, NULL);
diff --git a/ext/standard/config.m4 b/ext/standard/config.m4
index ef6b3c5a0101..67c36b93ba34 100644
--- a/ext/standard/config.m4
+++ b/ext/standard/config.m4
@@ -328,7 +328,7 @@ dnl
 
 PHP_CHECK_FUNC(res_search, resolv, socket)
 
-AC_CHECK_FUNCS([posix_spawn_file_actions_addchdir_np elf_aux_info])
+AC_CHECK_FUNCS([posix_spawn_file_actions_addchdir posix_spawn_file_actions_addchdir_np elf_aux_info])
 
 dnl
 dnl Obsolete check for strptime() declaration. The strptime, where available,
@@ -418,6 +418,7 @@ PHP_NEW_EXTENSION([standard], m4_normalize([
     image.c
     incomplete_class.c
     info.c
+    io_poll.c
     iptc.c
     levenshtein.c
     libavifinfo/avifinfo.c
diff --git a/ext/standard/config.w32 b/ext/standard/config.w32
index 589929027f65..50031ac3b8ad 100644
--- a/ext/standard/config.w32
+++ b/ext/standard/config.w32
@@ -28,14 +28,15 @@ EXTENSION("standard", "array.c base64.c basic_functions.c browscap.c \
 	crypt_sha512.c  php_crypt_r.c " + (TARGET_ARCH != 'arm64'? " crc32_x86.c" : "") + " \
 	datetime.c dir.c dl.c dns.c dns_win32.c exec.c \
 	file.c filestat.c formatted_print.c fsock.c head.c html.c image.c \
-	info.c iptc.c link.c mail.c math.c md5.c metaphone.c microtime.c \
+	info.c io_poll.c iptc.c link.c mail.c math.c md5.c metaphone.c microtime.c \
 	net.c pack.c pageinfo.c quot_print.c soundex.c \
 	string.c scanf.c syslog.c type.c uniqid.c url.c var.c \
 	versioning.c assert.c strnatcmp.c levenshtein.c incomplete_class.c \
 	url_scanner_ex.c ftp_fopen_wrapper.c http_fopen_wrapper.c \
 	php_fopen_wrapper.c credits.c css.c var_unserializer.c ftok.c sha1.c \
 	user_filters.c uuencode.c filters.c proc_open.c password.c \
-	streamsfuncs.c http.c flock_compat.c hrtime.c", false /* never shared */,
+	streamsfuncs.c http.c flock_compat.c hrtime.c",
+	false /* never shared */,
 	'/DZEND_ENABLE_STATIC_TSRMLS_CACHE=1');
 ADD_SOURCES("ext/standard/libavifinfo", "avifinfo.c", "standard");
 PHP_STANDARD = "yes";
diff --git a/ext/standard/crc32.c b/ext/standard/crc32.c
index e99c3ca9f5a0..fdf9df37c337 100644
--- a/ext/standard/crc32.c
+++ b/ext/standard/crc32.c
@@ -1,14 +1,12 @@
 /*
    +----------------------------------------------------------------------+
-   | Copyright (c) The PHP Group                                          |
+   | Copyright © The PHP Group and Contributors.                          |
    +----------------------------------------------------------------------+
-   | This source file is subject to version 3.01 of the PHP license,      |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | https://www.php.net/license/3_01.txt                                 |
-   | If you did not receive a copy of the PHP license and are unable to   |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@php.net so we can mail you a copy immediately.               |
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Author: Rasmus Lerdorf                               |
    +----------------------------------------------------------------------+
diff --git a/ext/standard/crc32.h b/ext/standard/crc32.h
index 261acdeb1fec..97f2bc01a282 100644
--- a/ext/standard/crc32.h
+++ b/ext/standard/crc32.h
@@ -1,14 +1,12 @@
 /*
    +----------------------------------------------------------------------+
-   | Copyright (c) The PHP Group                                          |
+   | Copyright © The PHP Group and Contributors.                          |
    +----------------------------------------------------------------------+
-   | This source file is subject to version 3.01 of the PHP license,      |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | https://www.php.net/license/3_01.txt                                 |
-   | If you did not receive a copy of the PHP license and are unable to   |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@php.net so we can mail you a copy immediately.               |
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Author: Rasmus Lerdorf                               |
    +----------------------------------------------------------------------+
diff --git a/ext/standard/crc32_x86.c b/ext/standard/crc32_x86.c
index 0b655fd6a483..5a6debc6f410 100644
--- a/ext/standard/crc32_x86.c
+++ b/ext/standard/crc32_x86.c
@@ -1,14 +1,12 @@
 /*
   +----------------------------------------------------------------------+
-  | Copyright (c) The PHP Group                                          |
+  | Copyright © The PHP Group and Contributors.                          |
   +----------------------------------------------------------------------+
-  | This source file is subject to version 3.01 of the PHP license,      |
-  | that is bundled with this package in the file LICENSE, and is        |
-  | available through the world-wide-web at the following url:           |
-  | https://www.php.net/license/3_01.txt                                 |
-  | If you did not receive a copy of the PHP license and are unable to   |
-  | obtain it through the world-wide-web, please send a note to          |
-  | license@php.net so we can mail you a copy immediately.               |
+  | This source file is subject to the Modified BSD License that is      |
+  | bundled with this package in the file LICENSE, and is available      |
+  | through the World Wide Web at .        |
+  |                                                                      |
+  | SPDX-License-Identifier: BSD-3-Clause                                |
   +----------------------------------------------------------------------+
   | Author: Frank Du                                 |
   +----------------------------------------------------------------------+
diff --git a/ext/standard/crc32_x86.h b/ext/standard/crc32_x86.h
index 91b5ba80e691..c46775f1af22 100644
--- a/ext/standard/crc32_x86.h
+++ b/ext/standard/crc32_x86.h
@@ -1,14 +1,12 @@
 /*
   +----------------------------------------------------------------------+
-  | Copyright (c) The PHP Group                                          |
+  | Copyright © The PHP Group and Contributors.                          |
   +----------------------------------------------------------------------+
-  | This source file is subject to version 3.01 of the PHP license,      |
-  | that is bundled with this package in the file LICENSE, and is        |
-  | available through the world-wide-web at the following url:           |
-  | https://www.php.net/license/3_01.txt                                 |
-  | If you did not receive a copy of the PHP license and are unable to   |
-  | obtain it through the world-wide-web, please send a note to          |
-  | license@php.net so we can mail you a copy immediately.               |
+  | This source file is subject to the Modified BSD License that is      |
+  | bundled with this package in the file LICENSE, and is available      |
+  | through the World Wide Web at .        |
+  |                                                                      |
+  | SPDX-License-Identifier: BSD-3-Clause                                |
   +----------------------------------------------------------------------+
   | Author: Frank Du                                 |
   +----------------------------------------------------------------------+
diff --git a/ext/standard/credits.c b/ext/standard/credits.c
index 4e8722db4d66..2b38cbf3b4e9 100644
--- a/ext/standard/credits.c
+++ b/ext/standard/credits.c
@@ -1,14 +1,12 @@
 /*
    +----------------------------------------------------------------------+
-   | Copyright (c) The PHP Group                                          |
+   | Copyright © The PHP Group and Contributors.                          |
    +----------------------------------------------------------------------+
-   | This source file is subject to version 3.01 of the PHP license,      |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | https://www.php.net/license/3_01.txt                                 |
-   | If you did not receive a copy of the PHP license and are unable to   |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@php.net so we can mail you a copy immediately.               |
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Authors: Rasmus Lerdorf                              |
    |          Zeev Suraski                                  |
diff --git a/ext/standard/credits.h b/ext/standard/credits.h
index a0c5d1e7d90c..2a346dd06ddd 100644
--- a/ext/standard/credits.h
+++ b/ext/standard/credits.h
@@ -1,14 +1,12 @@
 /*
    +----------------------------------------------------------------------+
-   | Copyright (c) The PHP Group                                          |
+   | Copyright © The PHP Group and Contributors.                          |
    +----------------------------------------------------------------------+
-   | This source file is subject to version 3.01 of the PHP license,      |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | https://www.php.net/license/3_01.txt                                 |
-   | If you did not receive a copy of the PHP license and are unable to   |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@php.net so we can mail you a copy immediately.               |
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Authors: Rasmus Lerdorf                              |
    |          Zeev Suraski                                  |
diff --git a/ext/standard/credits_ext.h b/ext/standard/credits_ext.h
index 509135a27e3e..b22a3f090c43 100644
--- a/ext/standard/credits_ext.h
+++ b/ext/standard/credits_ext.h
@@ -19,7 +19,7 @@ CREDIT_LINE("cURL", "Sterling Hughes");
 CREDIT_LINE("Date/Time Support", "Derick Rethans");
 CREDIT_LINE("DB-LIB (MS SQL, Sybase)", "Wez Furlong, Frank M. Kromann, Adam Baratz");
 CREDIT_LINE("DBA", "Sascha Schumann, Marcus Boerger");
-CREDIT_LINE("DOM", "Christian Stocker, Rob Richards, Marcus Boerger, Niels Dossche");
+CREDIT_LINE("DOM", "Christian Stocker, Rob Richards, Marcus Boerger, Nora Dossche");
 CREDIT_LINE("enchant", "Pierre-Alain Joye, Ilia Alshanetsky");
 CREDIT_LINE("EXIF", "Rasmus Lerdorf, Marcus Boerger");
 CREDIT_LINE("FFI", "Dmitry Stogov");
@@ -69,7 +69,7 @@ CREDIT_LINE("System V Semaphores", "Tom May");
 CREDIT_LINE("System V Shared Memory", "Christian Cartus");
 CREDIT_LINE("tidy", "John Coggeshall, Ilia Alshanetsky");
 CREDIT_LINE("tokenizer", "Andrei Zmievski, Johannes Schlueter");
-CREDIT_LINE("uri", "Máté Kocsis, Tim Düsterhus, Ignace Nyamagana Butera, Arnaud Le Blanc, Dennis Snell, Niels Dossche, Nicolas Grekas");
+CREDIT_LINE("uri", "Máté Kocsis, Tim Düsterhus, Ignace Nyamagana Butera, Arnaud Le Blanc, Dennis Snell, Nora Dossche, Nicolas Grekas");
 CREDIT_LINE("XML", "Stig Bakken, Thies C. Arntzen, Sterling Hughes");
 CREDIT_LINE("XMLReader", "Rob Richards");
 CREDIT_LINE("XMLWriter", "Rob Richards, Pierre-Alain Joye");
diff --git a/ext/standard/crypt.c b/ext/standard/crypt.c
index 54687f6cdf30..d8a9905cfc13 100644
--- a/ext/standard/crypt.c
+++ b/ext/standard/crypt.c
@@ -1,14 +1,12 @@
 /*
    +----------------------------------------------------------------------+
-   | Copyright (c) The PHP Group                                          |
+   | Copyright © The PHP Group and Contributors.                          |
    +----------------------------------------------------------------------+
-   | This source file is subject to version 3.01 of the PHP license,      |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | https://www.php.net/license/3_01.txt                                 |
-   | If you did not receive a copy of the PHP license and are unable to   |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@php.net so we can mail you a copy immediately.               |
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Authors: Stig Bakken                                    |
    |          Zeev Suraski                                  |
diff --git a/ext/standard/css.c b/ext/standard/css.c
index 41efc028ff72..87387c9a3826 100644
--- a/ext/standard/css.c
+++ b/ext/standard/css.c
@@ -1,14 +1,12 @@
 /*
    +----------------------------------------------------------------------+
-   | Copyright (c) The PHP Group                                          |
+   | Copyright © The PHP Group and Contributors.                          |
    +----------------------------------------------------------------------+
-   | This source file is subject to version 3.01 of the PHP license,      |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | https://www.php.net/license/3_01.txt                                 |
-   | If you did not receive a copy of the PHP license and are unable to   |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@php.net so we can mail you a copy immediately.               |
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Authors: Colin Viebrock                           |
    +----------------------------------------------------------------------+
diff --git a/ext/standard/css.h b/ext/standard/css.h
index 6771541f5fc5..59dbef62204c 100644
--- a/ext/standard/css.h
+++ b/ext/standard/css.h
@@ -1,14 +1,12 @@
 /*
    +----------------------------------------------------------------------+
-   | Copyright (c) The PHP Group                                          |
+   | Copyright © The PHP Group and Contributors.                          |
    +----------------------------------------------------------------------+
-   | This source file is subject to version 3.01 of the PHP license,      |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | https://www.php.net/license/3_01.txt                                 |
-   | If you did not receive a copy of the PHP license and are unable to   |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@php.net so we can mail you a copy immediately.               |
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Authors: Colin Viebrock                           |
    +----------------------------------------------------------------------+
diff --git a/ext/standard/datetime.c b/ext/standard/datetime.c
index 93f47f0f858b..b60182ee7f33 100644
--- a/ext/standard/datetime.c
+++ b/ext/standard/datetime.c
@@ -1,14 +1,12 @@
 /*
    +----------------------------------------------------------------------+
-   | Copyright (c) The PHP Group                                          |
+   | Copyright © The PHP Group and Contributors.                          |
    +----------------------------------------------------------------------+
-   | This source file is subject to version 3.01 of the PHP license,      |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | https://www.php.net/license/3_01.txt                                 |
-   | If you did not receive a copy of the PHP license and are unable to   |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@php.net so we can mail you a copy immediately.               |
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Authors: Andi Gutmans                                  |
    |          Zeev Suraski                                  |
diff --git a/ext/standard/dir.c b/ext/standard/dir.c
index 730ef6154907..f313d5f539d1 100644
--- a/ext/standard/dir.c
+++ b/ext/standard/dir.c
@@ -1,14 +1,12 @@
 /*
    +----------------------------------------------------------------------+
-   | Copyright (c) The PHP Group                                          |
+   | Copyright © The PHP Group and Contributors.                          |
    +----------------------------------------------------------------------+
-   | This source file is subject to version 3.01 of the PHP license,      |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | https://www.php.net/license/3_01.txt                                 |
-   | If you did not receive a copy of the PHP license and are unable to   |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@php.net so we can mail you a copy immediately.               |
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Author: Thies C. Arntzen                           |
    +----------------------------------------------------------------------+
@@ -588,9 +586,13 @@ PHP_FUNCTION(scandir)
 		n = php_stream_scandir(dirn, &namelist, context, (void *) php_stream_dirent_alphasort);
 	} else if (flags == PHP_SCANDIR_SORT_NONE) {
 		n = php_stream_scandir(dirn, &namelist, context, NULL);
-	} else {
+	} else if (flags == PHP_SCANDIR_SORT_DESCENDING) {
 		n = php_stream_scandir(dirn, &namelist, context, (void *) php_stream_dirent_alphasortr);
-	}
+	} else {
+		zend_argument_value_error(2, "must be one of the SCANDIR_SORT_ASCENDING, SCANDIR_SORT_DESCENDING, or SCANDIR_SORT_NONE constants");
+		RETURN_THROWS();
+    }
+
 	if (n < 0) {
 		php_error_docref(NULL, E_WARNING, "(errno %d): %s", errno, strerror(errno));
 		RETURN_FALSE;
diff --git a/ext/standard/dl.c b/ext/standard/dl.c
index 31adbceac8c2..ca8ba57a16e9 100644
--- a/ext/standard/dl.c
+++ b/ext/standard/dl.c
@@ -1,14 +1,12 @@
 /*
    +----------------------------------------------------------------------+
-   | Copyright (c) The PHP Group                                          |
+   | Copyright © The PHP Group and Contributors.                          |
    +----------------------------------------------------------------------+
-   | This source file is subject to version 3.01 of the PHP license,      |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | https://www.php.net/license/3_01.txt                                 |
-   | If you did not receive a copy of the PHP license and are unable to   |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@php.net so we can mail you a copy immediately.               |
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Authors: Brian Schaffner                             |
    |          Shane Caraveo                            |
@@ -45,7 +43,7 @@ PHPAPI PHP_FUNCTION(dl)
 	size_t filename_len;
 
 	ZEND_PARSE_PARAMETERS_START(1, 1)
-		Z_PARAM_STRING(filename, filename_len)
+		Z_PARAM_PATH(filename, filename_len)
 	ZEND_PARSE_PARAMETERS_END();
 
 	if (!PG(enable_dl)) {
@@ -93,7 +91,7 @@ PHPAPI void *php_load_shlib(const char *path, char **errp)
 			size_t i = strlen(err);
 			(*errp)=estrdup(err);
 			php_win32_error_msg_free(err);
-			while (i > 0 && isspace((*errp)[i-1])) { (*errp)[i-1] = '\0'; i--; }
+			while (i > 0 && isspace((unsigned char)(*errp)[i-1])) { (*errp)[i-1] = '\0'; i--; }
 		} else {
 			(*errp) = estrdup("");
 		}
@@ -114,11 +112,11 @@ PHPAPI int php_load_extension(const char *filename, int type, int start_now)
 	zend_module_entry *module_entry;
 	zend_module_entry *(*get_module)(void);
 	int error_type, slash_suffix = 0;
-	char *extension_dir;
+	const char *extension_dir;
 	char *err1, *err2;
 
 	if (type == MODULE_PERSISTENT) {
-		extension_dir = INI_STR("extension_dir");
+		extension_dir = zend_ini_string_literal("extension_dir");
 	} else {
 		extension_dir = PG(extension_dir);
 	}
diff --git a/ext/standard/dl.h b/ext/standard/dl.h
index 58de973bf4b5..9354caa2ca8d 100644
--- a/ext/standard/dl.h
+++ b/ext/standard/dl.h
@@ -1,14 +1,12 @@
 /*
    +----------------------------------------------------------------------+
-   | Copyright (c) The PHP Group                                          |
+   | Copyright © The PHP Group and Contributors.                          |
    +----------------------------------------------------------------------+
-   | This source file is subject to version 3.01 of the PHP license,      |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | https://www.php.net/license/3_01.txt                                 |
-   | If you did not receive a copy of the PHP license and are unable to   |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@php.net so we can mail you a copy immediately.               |
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Authors: Brian Schaffner                             |
    |          Shane Caraveo                            |
diff --git a/ext/standard/dns.c b/ext/standard/dns.c
index a574d8dd9aeb..b3fcc1d236af 100644
--- a/ext/standard/dns.c
+++ b/ext/standard/dns.c
@@ -1,14 +1,12 @@
 /*
    +----------------------------------------------------------------------+
-   | Copyright (c) The PHP Group                                          |
+   | Copyright © The PHP Group and Contributors.                          |
    +----------------------------------------------------------------------+
-   | This source file is subject to version 3.01 of the PHP license,      |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | https://www.php.net/license/3_01.txt                                 |
-   | If you did not receive a copy of the PHP license and are unable to   |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@php.net so we can mail you a copy immediately.               |
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Authors: The typical suspects                                        |
    |          Pollita                                    |
diff --git a/ext/standard/dns_win32.c b/ext/standard/dns_win32.c
index 8caf5813395c..c9ff67e47b1e 100644
--- a/ext/standard/dns_win32.c
+++ b/ext/standard/dns_win32.c
@@ -1,14 +1,12 @@
 /*
    +----------------------------------------------------------------------+
-   | Copyright (c) The PHP Group                                          |
+   | Copyright © The PHP Group and Contributors.                          |
    +----------------------------------------------------------------------+
-   | This source file is subject to version 3.01 of the PHP license,      |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | https://www.php.net/license/3_01.txt                                 |
-   | If you did not receive a copy of the PHP license and are unable to   |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@php.net so we can mail you a copy immediately.               |
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Authors: Pierre A. Joye                              |
    +----------------------------------------------------------------------+
diff --git a/ext/standard/exec.c b/ext/standard/exec.c
index 7bacc976eac5..5c9e5c6076a8 100644
--- a/ext/standard/exec.c
+++ b/ext/standard/exec.c
@@ -1,14 +1,12 @@
 /*
    +----------------------------------------------------------------------+
-   | Copyright (c) The PHP Group                                          |
+   | Copyright © The PHP Group and Contributors.                          |
    +----------------------------------------------------------------------+
-   | This source file is subject to version 3.01 of the PHP license,      |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | https://www.php.net/license/3_01.txt                                 |
-   | If you did not receive a copy of the PHP license and are unable to   |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@php.net so we can mail you a copy immediately.               |
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Author: Rasmus Lerdorf                               |
    |         Ilia Alshanetsky                              |
@@ -81,7 +79,7 @@ PHP_MINIT_FUNCTION(exec)
 
 static size_t strip_trailing_whitespace(char *buf, size_t bufl) {
 	size_t l = bufl;
-	while (l-- > 0 && isspace(((unsigned char *)buf)[l]));
+	while (l-- > 0 && isspace((unsigned char)buf[l]));
 	if (l != (bufl - 1)) {
 		bufl = l + 1;
 		buf[bufl] = '\0';
diff --git a/ext/standard/exec.h b/ext/standard/exec.h
index 1ad755363e3d..879334285020 100644
--- a/ext/standard/exec.h
+++ b/ext/standard/exec.h
@@ -1,14 +1,12 @@
 /*
    +----------------------------------------------------------------------+
-   | Copyright (c) The PHP Group                                          |
+   | Copyright © The PHP Group and Contributors.                          |
    +----------------------------------------------------------------------+
-   | This source file is subject to version 3.01 of the PHP license,      |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | https://www.php.net/license/3_01.txt                                 |
-   | If you did not receive a copy of the PHP license and are unable to   |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@php.net so we can mail you a copy immediately.               |
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Author: Rasmus Lerdorf                         |
    +----------------------------------------------------------------------+
diff --git a/ext/standard/file.c b/ext/standard/file.c
index a7b73f1fe56e..db0fc45385dd 100644
--- a/ext/standard/file.c
+++ b/ext/standard/file.c
@@ -1,14 +1,12 @@
 /*
    +----------------------------------------------------------------------+
-   | Copyright (c) The PHP Group                                          |
+   | Copyright © The PHP Group and Contributors.                          |
    +----------------------------------------------------------------------+
-   | This source file is subject to version 3.01 of the PHP license,      |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | https://www.php.net/license/3_01.txt                                 |
-   | If you did not receive a copy of the PHP license and are unable to   |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@php.net so we can mail you a copy immediately.               |
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Authors: Rasmus Lerdorf                              |
    |          Stig Bakken                                    |
@@ -223,7 +221,9 @@ PHP_FUNCTION(flock)
 		Z_PARAM_ZVAL(wouldblock)
 	ZEND_PARSE_PARAMETERS_END();
 
+	php_stream_error_operation_begin();
 	php_flock_common(stream, operation, 2, wouldblock, return_value);
+	php_stream_error_operation_end_for_stream(stream);
 }
 /* }}} */
 
@@ -259,6 +259,8 @@ PHP_FUNCTION(get_meta_tags)
 		RETURN_FALSE;
 	}
 
+	php_stream_error_operation_begin();
+
 	array_init(return_value);
 
 	tok_last = TOK_EOF;
@@ -370,6 +372,8 @@ PHP_FUNCTION(get_meta_tags)
 	if (value) efree(value);
 	if (name) efree(name);
 	php_stream_close(md.stream);
+
+	php_stream_error_operation_end_for_stream(md.stream);
 }
 /* }}} */
 
@@ -404,12 +408,13 @@ PHP_FUNCTION(file_get_contents)
 		RETURN_THROWS();
 	}
 
+	php_stream_error_operation_begin();
 	context = php_stream_context_from_zval(zcontext, 0);
-
 	stream = php_stream_open_wrapper_ex(filename, "rb",
 				(use_include_path ? USE_PATH : 0) | REPORT_ERRORS,
 				NULL, context);
 	if (!stream) {
+		php_stream_error_operation_end(context);
 		RETURN_FALSE;
 	}
 
@@ -420,8 +425,9 @@ PHP_FUNCTION(file_get_contents)
 	}
 
 	if (offset != 0 && php_stream_seek(stream, offset, ((offset > 0) ? SEEK_SET : SEEK_END)) < 0) {
-		php_error_docref(NULL, E_WARNING, "Failed to seek to position " ZEND_LONG_FMT " in the stream", offset);
 		php_stream_close(stream);
+		php_stream_error_operation_end(context);
+		php_error_docref(NULL, E_WARNING, "Failed to seek to position " ZEND_LONG_FMT " in the stream", offset);
 		RETURN_FALSE;
 	}
 
@@ -432,6 +438,7 @@ PHP_FUNCTION(file_get_contents)
 	}
 
 	php_stream_close(stream);
+	php_stream_error_operation_end(context);
 }
 /* }}} */
 
@@ -461,6 +468,7 @@ PHP_FUNCTION(file_put_contents)
 		php_stream_from_zval(srcstream, data);
 	}
 
+	php_stream_error_operation_begin();
 	context = php_stream_context_from_zval(zcontext, flags & PHP_FILE_NO_DEFAULT_CONTEXT);
 
 	if (flags & PHP_FILE_APPEND) {
@@ -479,11 +487,13 @@ PHP_FUNCTION(file_put_contents)
 
 	stream = php_stream_open_wrapper_ex(filename, mode, ((flags & PHP_FILE_USE_INCLUDE_PATH) ? USE_PATH : 0) | REPORT_ERRORS, NULL, context);
 	if (stream == NULL) {
+		php_stream_error_operation_end(context);
 		RETURN_FALSE;
 	}
 
 	if ((flags & LOCK_EX) && (!php_stream_supports_lock(stream) || php_stream_lock(stream, LOCK_EX))) {
 		php_stream_close(stream);
+		php_stream_error_operation_end(context);
 		php_error_docref(NULL, E_WARNING, "Exclusive locks are not supported for this stream");
 		RETURN_FALSE;
 	}
@@ -566,6 +576,7 @@ PHP_FUNCTION(file_put_contents)
 			break;
 	}
 	php_stream_close(stream);
+	php_stream_error_operation_end(context);
 
 	if (numbytes < 0) {
 		RETURN_FALSE;
@@ -611,10 +622,12 @@ PHP_FUNCTION(file)
 	include_new_line = !(flags & PHP_FILE_IGNORE_NEW_LINES);
 	skip_blank_lines = flags & PHP_FILE_SKIP_EMPTY_LINES;
 
+	php_stream_error_operation_begin();
 	context = php_stream_context_from_zval(zcontext, flags & PHP_FILE_NO_DEFAULT_CONTEXT);
 
 	stream = php_stream_open_wrapper_ex(filename, "rb", (use_include_path ? USE_PATH : 0) | REPORT_ERRORS, NULL, context);
 	if (!stream) {
+		php_stream_error_operation_end(context);
 		RETURN_FALSE;
 	}
 
@@ -668,6 +681,7 @@ PHP_FUNCTION(file)
 	}
 
 	php_stream_close(stream);
+	php_stream_error_operation_end(context);
 }
 /* }}} */
 
@@ -707,7 +721,9 @@ PHP_FUNCTION(tmpfile)
 
 	ZEND_PARSE_PARAMETERS_NONE();
 
+	php_stream_error_operation_begin();
 	stream = php_stream_fopen_tmpfile();
+	php_stream_error_operation_end_for_stream(stream);
 
 	if (stream) {
 		php_stream_to_zval(stream, return_value);
@@ -735,9 +751,11 @@ PHP_FUNCTION(fopen)
 		Z_PARAM_RESOURCE_OR_NULL(zcontext)
 	ZEND_PARSE_PARAMETERS_END();
 
+	php_stream_error_operation_begin();
 	context = php_stream_context_from_zval(zcontext, 0);
 
 	stream = php_stream_open_wrapper_ex(filename, mode, (use_include_path ? USE_PATH : 0) | REPORT_ERRORS, NULL, context);
+	php_stream_error_operation_end(context);
 
 	if (stream == NULL) {
 		RETURN_FALSE;
@@ -761,9 +779,11 @@ PHPAPI PHP_FUNCTION(fclose)
 		RETURN_FALSE;
 	}
 
+	php_stream_error_operation_begin();
 	php_stream_free(stream,
 		PHP_STREAM_FREE_KEEP_RSRC |
 		(stream->is_persistent ? PHP_STREAM_FREE_CLOSE_PERSISTENT : PHP_STREAM_FREE_CLOSE));
+	php_stream_error_operation_end_for_stream(stream);
 
 	RETURN_TRUE;
 }
@@ -811,6 +831,7 @@ PHP_FUNCTION(popen)
 		RETURN_FALSE;
 	}
 
+	php_stream_error_operation_begin();
 	stream = php_stream_fopen_from_pipe(fp, mode);
 
 	if (stream == NULL)	{
@@ -819,6 +840,7 @@ PHP_FUNCTION(popen)
 	} else {
 		php_stream_to_zval(stream, return_value);
 	}
+	php_stream_error_operation_end_for_stream(stream);
 
 	efree(posix_mode);
 }
@@ -833,9 +855,11 @@ PHP_FUNCTION(pclose)
 		PHP_Z_PARAM_STREAM(stream)
 	ZEND_PARSE_PARAMETERS_END();
 
+	php_stream_error_operation_begin();
 	FG(pclose_wait) = 1;
 	zend_list_close(stream->res);
 	FG(pclose_wait) = 0;
+	php_stream_error_operation_end_for_stream(stream);
 	RETURN_LONG(FG(pclose_ret));
 }
 /* }}} */
@@ -849,11 +873,13 @@ PHPAPI PHP_FUNCTION(feof)
 		PHP_Z_PARAM_STREAM(stream)
 	ZEND_PARSE_PARAMETERS_END();
 
+	php_stream_error_operation_begin();
 	if (php_stream_eof(stream)) {
-		RETURN_TRUE;
+		RETVAL_TRUE;
 	} else {
-		RETURN_FALSE;
+		RETVAL_FALSE;
 	}
+	php_stream_error_operation_end_for_stream(stream);
 }
 /* }}} */
 
@@ -873,9 +899,11 @@ PHPAPI PHP_FUNCTION(fgets)
 		Z_PARAM_LONG_OR_NULL(len, len_is_null)
 	ZEND_PARSE_PARAMETERS_END();
 
+	php_stream_error_operation_begin();
 	if (len_is_null) {
 		/* ask streams to give us a buffer of an appropriate size */
 		buf = php_stream_get_line(stream, NULL, 0, &line_len);
+		php_stream_error_operation_end_for_stream(stream);
 		if (buf == NULL) {
 			RETURN_FALSE;
 		}
@@ -889,7 +917,9 @@ PHPAPI PHP_FUNCTION(fgets)
 		}
 
 		str = zend_string_alloc(len, 0);
-		if (php_stream_get_line(stream, ZSTR_VAL(str), len, &line_len) == NULL) {
+		buf = php_stream_get_line(stream, ZSTR_VAL(str), len, &line_len);
+		php_stream_error_operation_end_for_stream(stream);
+		if (buf == NULL) {
 			zend_string_efree(str);
 			RETURN_FALSE;
 		}
@@ -914,7 +944,9 @@ PHPAPI PHP_FUNCTION(fgetc)
 		PHP_Z_PARAM_STREAM(stream)
 	ZEND_PARSE_PARAMETERS_END();
 
+	php_stream_error_operation_begin();
 	int result = php_stream_getc(stream);
+	php_stream_error_operation_end_for_stream(stream);
 
 	if (result == EOF) {
 		RETVAL_FALSE;
@@ -933,7 +965,6 @@ PHP_FUNCTION(fscanf)
 	zval *file_handle;
 	char *buf, *format;
 	size_t len;
-	void *what;
 
 	ZEND_PARSE_PARAMETERS_START(2, -1)
 		Z_PARAM_RESOURCE(file_handle)
@@ -941,16 +972,18 @@ PHP_FUNCTION(fscanf)
 		Z_PARAM_VARIADIC('*', args, argc)
 	ZEND_PARSE_PARAMETERS_END();
 
-	what = zend_fetch_resource2(Z_RES_P(file_handle), "File-Handle", php_file_le_stream(), php_file_le_pstream());
+	php_stream *stream = zend_fetch_resource2(Z_RES_P(file_handle), "File-Handle", php_file_le_stream(), php_file_le_pstream());
 
-	/* we can't do a ZEND_VERIFY_RESOURCE(what), otherwise we end up
+	/* we can't do a ZEND_VERIFY_RESOURCE(stream), otherwise we end up
 	 * with a leak if we have an invalid filehandle. This needs changing
 	 * if the code behind ZEND_VERIFY_RESOURCE changed. - cc */
-	if (!what) {
+	if (!stream) {
 		RETURN_THROWS();
 	}
 
-	buf = php_stream_get_line((php_stream *) what, NULL, 0, &len);
+	php_stream_error_operation_begin();
+	buf = php_stream_get_line(stream, NULL, 0, &len);
+	php_stream_error_operation_end_for_stream(stream);
 	if (buf == NULL) {
 		RETURN_FALSE;
 	}
@@ -996,7 +1029,9 @@ PHPAPI PHP_FUNCTION(fwrite)
 		RETURN_LONG(0);
 	}
 
+	php_stream_error_operation_begin();
 	ret = php_stream_write(stream, input, num_bytes);
+	php_stream_error_operation_end_for_stream(stream);
 	if (ret < 0) {
 		RETURN_FALSE;
 	}
@@ -1015,8 +1050,9 @@ PHPAPI PHP_FUNCTION(fflush)
 		PHP_Z_PARAM_STREAM(stream)
 	ZEND_PARSE_PARAMETERS_END();
 
+	php_stream_error_operation_begin();
 	ret = php_stream_flush(stream);
-
+	php_stream_error_operation_end_for_stream(stream);
 	RETURN_BOOL(!ret);
 }
 /* }}} */
@@ -1024,13 +1060,17 @@ PHPAPI PHP_FUNCTION(fflush)
 /* {{{ Rewind the position of a file pointer */
 PHPAPI PHP_FUNCTION(rewind)
 {
+	int ret;
 	php_stream *stream;
 
 	ZEND_PARSE_PARAMETERS_START(1, 1)
 		PHP_Z_PARAM_STREAM(stream)
 	ZEND_PARSE_PARAMETERS_END();
 
-	RETURN_BOOL(-1 != php_stream_rewind(stream));
+	php_stream_error_operation_begin();
+	ret = php_stream_rewind(stream);
+	php_stream_error_operation_end_for_stream(stream);
+	RETURN_BOOL(-1 != ret);
 }
 /* }}} */
 
@@ -1044,7 +1084,9 @@ PHPAPI PHP_FUNCTION(ftell)
 		PHP_Z_PARAM_STREAM(stream)
 	ZEND_PARSE_PARAMETERS_END();
 
+	php_stream_error_operation_begin();
 	ret = php_stream_tell(stream);
+	php_stream_error_operation_end_for_stream(stream);
 	if (ret == -1)	{
 		RETURN_FALSE;
 	}
@@ -1065,7 +1107,9 @@ PHPAPI PHP_FUNCTION(fseek)
 		Z_PARAM_LONG(whence)
 	ZEND_PARSE_PARAMETERS_END();
 
-	RETURN_LONG(php_stream_seek(stream, offset, (int) whence));
+	php_stream_error_operation_begin();
+	RETVAL_LONG(php_stream_seek(stream, offset, (int) whence));
+	php_stream_error_operation_end_for_stream(stream);
 }
 /* }}} */
 
@@ -1089,7 +1133,9 @@ PHP_FUNCTION(mkdir)
 
 	context = php_stream_context_from_zval(zcontext, 0);
 
-	RETURN_BOOL(php_stream_mkdir(dir, (int)mode, (recursive ? PHP_STREAM_MKDIR_RECURSIVE : 0) | REPORT_ERRORS, context));
+	php_stream_error_operation_begin();
+	RETVAL_BOOL(php_stream_mkdir(dir, (int)mode, (recursive ? PHP_STREAM_MKDIR_RECURSIVE : 0) | REPORT_ERRORS, context));
+	php_stream_error_operation_end(context);
 }
 /* }}} */
 
@@ -1109,7 +1155,9 @@ PHP_FUNCTION(rmdir)
 
 	context = php_stream_context_from_zval(zcontext, 0);
 
-	RETURN_BOOL(php_stream_rmdir(dir, REPORT_ERRORS, context));
+	php_stream_error_operation_begin();
+	RETVAL_BOOL(php_stream_rmdir(dir, REPORT_ERRORS, context));
+	php_stream_error_operation_end(context);
 }
 /* }}} */
 
@@ -1133,14 +1181,17 @@ PHP_FUNCTION(readfile)
 
 	context = php_stream_context_from_zval(zcontext, 0);
 
+	php_stream_error_operation_begin();
 	stream = php_stream_open_wrapper_ex(filename, "rb", (use_include_path ? USE_PATH : 0) | REPORT_ERRORS, NULL, context);
 	if (stream) {
 		size = php_stream_passthru(stream);
 		php_stream_close(stream);
-		RETURN_LONG(size);
+		RETVAL_LONG(size);
+	} else {
+		RETVAL_FALSE;
 	}
+	php_stream_error_operation_end(context);
 
-	RETURN_FALSE;
 }
 /* }}} */
 
@@ -1182,7 +1233,9 @@ PHPAPI PHP_FUNCTION(fpassthru)
 		PHP_Z_PARAM_STREAM(stream)
 	ZEND_PARSE_PARAMETERS_END();
 
+	php_stream_error_operation_begin();
 	size = php_stream_passthru(stream);
+	php_stream_error_operation_end_for_stream(stream);
 	RETURN_LONG(size);
 }
 /* }}} */
@@ -1203,26 +1256,31 @@ PHP_FUNCTION(rename)
 		Z_PARAM_RESOURCE_OR_NULL(zcontext)
 	ZEND_PARSE_PARAMETERS_END();
 
+	php_stream_error_operation_begin();
+	context = php_stream_context_from_zval(zcontext, 0);
+
 	wrapper = php_stream_locate_url_wrapper(old_name, NULL, 0);
 
 	if (!wrapper || !wrapper->wops) {
+		php_stream_error_operation_end(context);
 		php_error_docref(NULL, E_WARNING, "Unable to locate stream wrapper");
 		RETURN_FALSE;
 	}
 
 	if (!wrapper->wops->rename) {
+		php_stream_error_operation_end(context);
 		php_error_docref(NULL, E_WARNING, "%s wrapper does not support renaming", wrapper->wops->label ? wrapper->wops->label : "Source");
 		RETURN_FALSE;
 	}
 
 	if (wrapper != php_stream_locate_url_wrapper(new_name, NULL, 0)) {
+		php_stream_error_operation_end(context);
 		php_error_docref(NULL, E_WARNING, "Cannot rename a file across wrapper types");
 		RETURN_FALSE;
 	}
 
-	context = php_stream_context_from_zval(zcontext, 0);
-
-	RETURN_BOOL(wrapper->wops->rename(wrapper, old_name, new_name, 0, context));
+	RETVAL_BOOL(wrapper->wops->rename(wrapper, old_name, new_name, REPORT_ERRORS, context));
+	php_stream_error_operation_end(context);
 }
 /* }}} */
 
@@ -1241,20 +1299,24 @@ PHP_FUNCTION(unlink)
 		Z_PARAM_RESOURCE_OR_NULL(zcontext)
 	ZEND_PARSE_PARAMETERS_END();
 
+	php_stream_error_operation_begin();
 	context = php_stream_context_from_zval(zcontext, 0);
 
 	wrapper = php_stream_locate_url_wrapper(filename, NULL, 0);
 
 	if (!wrapper || !wrapper->wops) {
+		php_stream_error_operation_end(context);
 		php_error_docref(NULL, E_WARNING, "Unable to locate stream wrapper");
 		RETURN_FALSE;
 	}
 
 	if (!wrapper->wops->unlink) {
+		php_stream_error_operation_end(context);
 		php_error_docref(NULL, E_WARNING, "%s does not allow unlinking", wrapper->wops->label ? wrapper->wops->label : "Wrapper");
 		RETURN_FALSE;
 	}
-	RETURN_BOOL(wrapper->wops->unlink(wrapper, filename, REPORT_ERRORS, context));
+	RETVAL_BOOL(wrapper->wops->unlink(wrapper, filename, REPORT_ERRORS, context));
+	php_stream_error_operation_end(context);
 }
 /* }}} */
 
@@ -1266,12 +1328,15 @@ PHP_FUNCTION(fsync)
 		PHP_Z_PARAM_STREAM(stream)
 	ZEND_PARSE_PARAMETERS_END();
 
+	php_stream_error_operation_begin();
 	if (!php_stream_sync_supported(stream)) {
+		php_stream_error_operation_end_for_stream(stream);
 		php_error_docref(NULL, E_WARNING, "Can't fsync this stream!");
 		RETURN_FALSE;
 	}
 
-	RETURN_BOOL(php_stream_sync(stream, /* data_only */ 0) == 0);
+	RETVAL_BOOL(php_stream_sync(stream, /* data_only */ 0) == 0);
+	php_stream_error_operation_end_for_stream(stream);
 }
 
 PHP_FUNCTION(fdatasync)
@@ -1282,12 +1347,15 @@ PHP_FUNCTION(fdatasync)
 		PHP_Z_PARAM_STREAM(stream)
 	ZEND_PARSE_PARAMETERS_END();
 
+	php_stream_error_operation_begin();
 	if (!php_stream_sync_supported(stream)) {
+		php_stream_error_operation_end_for_stream(stream);
 		php_error_docref(NULL, E_WARNING, "Can't fsync this stream!");
 		RETURN_FALSE;
 	}
 
-	RETURN_BOOL(php_stream_sync(stream, /* data_only */ 1) == 0);
+	RETVAL_BOOL(php_stream_sync(stream, /* data_only */ 1) == 0);
+	php_stream_error_operation_end_for_stream(stream);
 }
 
 /* {{{ Truncate file to 'size' length */
@@ -1306,12 +1374,16 @@ PHP_FUNCTION(ftruncate)
 		RETURN_THROWS();
 	}
 
+	php_stream_error_operation_begin();
+
 	if (!php_stream_truncate_supported(stream)) {
+		php_stream_error_operation_end_for_stream(stream);
 		php_error_docref(NULL, E_WARNING, "Can't truncate this stream!");
 		RETURN_FALSE;
 	}
 
-	RETURN_BOOL(0 == php_stream_truncate_set_size(stream, size));
+	RETVAL_BOOL(0 == php_stream_truncate_set_size(stream, size));
+	php_stream_error_operation_end_for_stream(stream);
 }
 /* }}} */
 PHPAPI void php_fstat(php_stream *stream, zval *return_value)
@@ -1395,7 +1467,9 @@ PHP_FUNCTION(fstat)
 		PHP_Z_PARAM_STREAM(stream)
 	ZEND_PARSE_PARAMETERS_END();
 
+	php_stream_error_operation_begin();
 	php_fstat(stream, return_value);
+	php_stream_error_operation_end_for_stream(stream);
 }
 /* }}} */
 
@@ -1414,13 +1488,16 @@ PHP_FUNCTION(copy)
 		Z_PARAM_RESOURCE_OR_NULL(zcontext)
 	ZEND_PARSE_PARAMETERS_END();
 
+	php_stream_error_operation_begin();
+	context = php_stream_context_from_zval(zcontext, 0);
+
 	if (php_stream_locate_url_wrapper(source, NULL, 0) == &php_plain_files_wrapper && php_check_open_basedir(source)) {
+		php_stream_error_operation_end(context);
 		RETURN_FALSE;
 	}
 
-	context = php_stream_context_from_zval(zcontext, 0);
-
-	RETURN_BOOL(php_copy_file_ctx(source, target, 0, context) == SUCCESS);
+	RETVAL_BOOL(php_copy_file_ctx(source, target, 0, context) == SUCCESS);
+	php_stream_error_operation_end(context);
 }
 /* }}} */
 
@@ -1450,7 +1527,6 @@ PHPAPI zend_result php_copy_file_ctx(const char *src, const char *dest, int src_
 		case -1:
 			/* non-statable stream */
 			goto safe_to_copy;
-			break;
 		case 0:
 			break;
 		default: /* failed to stat file, does not exist? */
@@ -1465,7 +1541,6 @@ PHPAPI zend_result php_copy_file_ctx(const char *src, const char *dest, int src_
 		case -1:
 			/* non-statable stream */
 			goto safe_to_copy;
-			break;
 		case 0:
 			break;
 		default: /* failed to stat file, does not exist? */
@@ -1547,7 +1622,9 @@ PHPAPI PHP_FUNCTION(fread)
 		RETURN_THROWS();
 	}
 
+	php_stream_error_operation_begin();
 	str = php_stream_read_to_str(stream, len);
+	php_stream_error_operation_end_for_stream(stream);
 	if (!str) {
 		RETURN_FALSE;
 	}
@@ -1666,7 +1743,9 @@ PHP_FUNCTION(fputcsv)
 		RETURN_THROWS();
 	}
 
+	php_stream_error_operation_begin();
 	ret = php_fputcsv(stream, fields, delimiter, enclosure, escape_char, eol_str);
+	php_stream_error_operation_end_for_stream(stream);
 	if (ret < 0) {
 		RETURN_FALSE;
 	}
@@ -1799,19 +1878,23 @@ PHP_FUNCTION(fgetcsv)
 		RETURN_THROWS();
 	}
 
+	php_stream_error_operation_begin();
 	if (len < 0) {
 		if ((buf = php_stream_get_line(stream, NULL, 0, &buf_len)) == NULL) {
+			php_stream_error_operation_end_for_stream(stream);
 			RETURN_FALSE;
 		}
 	} else {
 		buf = emalloc(len + 1);
 		if (php_stream_get_line(stream, buf, len + 1, &buf_len) == NULL) {
 			efree(buf);
+			php_stream_error_operation_end_for_stream(stream);
 			RETURN_FALSE;
 		}
 	}
 
 	HashTable *values = php_fgetcsv(stream, delimiter, enclosure, escape_char, buf_len, buf);
+	php_stream_error_operation_end_for_stream(stream);
 	if (values == NULL) {
 		values = php_bc_fgetcsv_empty_line();
 	}
@@ -1864,7 +1947,7 @@ PHPAPI HashTable *php_fgetcsv(php_stream *stream, char delimiter, char enclosure
 		inc_len = (bptr < limit ? (*bptr == '\0' ? 1 : php_mblen(bptr, limit - bptr)): 0);
 		if (inc_len == 1) {
 			char *tmp = bptr;
-			while ((*tmp != delimiter) && isspace((int)*(unsigned char *)tmp)) {
+			while ((*tmp != delimiter) && isspace((unsigned char)*tmp)) {
 				tmp++;
 			}
 			if (*tmp == enclosure && tmp < limit) {
@@ -2148,18 +2231,14 @@ php_meta_tags_token php_next_meta_token(php_meta_tags_data *md)
 		switch (ch) {
 			case '<':
 				return TOK_OPENTAG;
-				break;
 
 			case '>':
 				return TOK_CLOSETAG;
-				break;
 
 			case '=':
 				return TOK_EQUAL;
-				break;
 			case '/':
 				return TOK_SLASH;
-				break;
 
 			case '\'':
 			case '"':
@@ -2186,7 +2265,6 @@ php_meta_tags_token php_next_meta_token(php_meta_tags_data *md)
 				}
 
 				return TOK_STRING;
-				break;
 
 			case '\n':
 			case '\r':
@@ -2195,7 +2273,6 @@ php_meta_tags_token php_next_meta_token(php_meta_tags_data *md)
 
 			case ' ':
 				return TOK_SPACE;
-				break;
 
 			default:
 				if (isalnum(ch)) {
diff --git a/ext/standard/file.h b/ext/standard/file.h
index f8faebd02829..ac218169599c 100644
--- a/ext/standard/file.h
+++ b/ext/standard/file.h
@@ -1,14 +1,12 @@
 /*
    +----------------------------------------------------------------------+
-   | Copyright (c) The PHP Group                                          |
+   | Copyright © The PHP Group and Contributors.                          |
    +----------------------------------------------------------------------+
-   | This source file is subject to version 3.01 of the PHP license,      |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | https://www.php.net/license/3_01.txt                                 |
-   | If you did not receive a copy of the PHP license and are unable to   |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@php.net so we can mail you a copy immediately.               |
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Author: Rasmus Lerdorf                         |
    +----------------------------------------------------------------------+
@@ -34,6 +32,7 @@ PHPAPI PHP_FUNCTION(ftell);
 PHPAPI PHP_FUNCTION(fseek);
 PHPAPI PHP_FUNCTION(fpassthru);
 
+PHP_MINIT_FUNCTION(stream_errors);
 PHP_MINIT_FUNCTION(user_streams);
 
 PHPAPI zend_result php_copy_file(const char *src, const char *dest);
@@ -100,7 +99,8 @@ typedef struct {
 	php_stream_context *default_context;
 	HashTable *stream_wrappers;			/* per-request copy of url_stream_wrappers_hash */
 	HashTable *stream_filters;			/* per-request copy of stream_filters_hash */
-	HashTable *wrapper_errors;			/* key: wrapper address; value: linked list of char* */
+	HashTable *wrapper_logged_errors;	/* key: wrapper address; value: linked list of error entries */
+	php_stream_error_state stream_error_state;
 	int pclose_wait;
 #ifdef HAVE_GETHOSTBYNAME_R
 	struct hostent tmp_host_info;
diff --git a/ext/standard/file.stub.php b/ext/standard/file.stub.php
index 5e12c43f397c..d7b1fef17cdc 100644
--- a/ext/standard/file.stub.php
+++ b/ext/standard/file.stub.php
@@ -256,6 +256,23 @@
  */
 const STREAM_CRYPTO_PROTO_TLSv1_3 = UNKNOWN;
 
+/**
+ * @var int
+ * @cvalue STREAM_CRYPTO_STATUS_NONE
+ */
+const STREAM_CRYPTO_STATUS_NONE = UNKNOWN;
+/**
+ * @var int
+ * @cvalue STREAM_CRYPTO_STATUS_WANT_READ
+ */
+const STREAM_CRYPTO_STATUS_WANT_READ = UNKNOWN;
+/**
+ * @var int
+ * @cvalue STREAM_CRYPTO_STATUS_WANT_WRITE
+ */
+const STREAM_CRYPTO_STATUS_WANT_WRITE = UNKNOWN;
+
+
 /**
  * @var int
  * @cvalue STREAM_SHUT_RD
diff --git a/ext/standard/file_arginfo.h b/ext/standard/file_arginfo.h
index b3888925ee9a..24e3722cd86e 100644
--- a/ext/standard/file_arginfo.h
+++ b/ext/standard/file_arginfo.h
@@ -1,5 +1,5 @@
 /* This is a generated file, edit file.stub.php instead.
- * Stub hash: c394e14cd32587ce9ad0503e21c6c4cf5b301697 */
+ * Stub hash: 0c62c6fb217a87010a9e2e63d4b104cde0138655 */
 
 static void register_file_symbols(int module_number)
 {
@@ -52,6 +52,9 @@ static void register_file_symbols(int module_number)
 	REGISTER_LONG_CONSTANT("STREAM_CRYPTO_PROTO_TLSv1_1", STREAM_CRYPTO_METHOD_TLSv1_1_SERVER, CONST_PERSISTENT);
 	REGISTER_LONG_CONSTANT("STREAM_CRYPTO_PROTO_TLSv1_2", STREAM_CRYPTO_METHOD_TLSv1_2_SERVER, CONST_PERSISTENT);
 	REGISTER_LONG_CONSTANT("STREAM_CRYPTO_PROTO_TLSv1_3", STREAM_CRYPTO_METHOD_TLSv1_3_SERVER, CONST_PERSISTENT);
+	REGISTER_LONG_CONSTANT("STREAM_CRYPTO_STATUS_NONE", STREAM_CRYPTO_STATUS_NONE, CONST_PERSISTENT);
+	REGISTER_LONG_CONSTANT("STREAM_CRYPTO_STATUS_WANT_READ", STREAM_CRYPTO_STATUS_WANT_READ, CONST_PERSISTENT);
+	REGISTER_LONG_CONSTANT("STREAM_CRYPTO_STATUS_WANT_WRITE", STREAM_CRYPTO_STATUS_WANT_WRITE, CONST_PERSISTENT);
 	REGISTER_LONG_CONSTANT("STREAM_SHUT_RD", STREAM_SHUT_RD, CONST_PERSISTENT);
 	REGISTER_LONG_CONSTANT("STREAM_SHUT_WR", STREAM_SHUT_WR, CONST_PERSISTENT);
 	REGISTER_LONG_CONSTANT("STREAM_SHUT_RDWR", STREAM_SHUT_RDWR, CONST_PERSISTENT);
diff --git a/ext/standard/filestat.c b/ext/standard/filestat.c
index 85c2517ed91a..e41f6d1abb61 100644
--- a/ext/standard/filestat.c
+++ b/ext/standard/filestat.c
@@ -1,14 +1,12 @@
 /*
    +----------------------------------------------------------------------+
-   | Copyright (c) The PHP Group                                          |
+   | Copyright © The PHP Group and Contributors.                          |
    +----------------------------------------------------------------------+
-   | This source file is subject to version 3.01 of the PHP license,      |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | https://www.php.net/license/3_01.txt                                 |
-   | If you did not receive a copy of the PHP license and are unable to   |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@php.net so we can mail you a copy immediately.               |
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Author:  Jim Winstead                                  |
    +----------------------------------------------------------------------+
@@ -774,22 +772,18 @@ PHPAPI void php_stat(zend_string *filename, int type, zval *return_value)
 #ifdef F_OK
 				case FS_EXISTS:
 					RETURN_BOOL(VCWD_ACCESS(file_path_to_check, F_OK) == 0);
-					break;
 #endif
 #ifdef W_OK
 				case FS_IS_W:
 					RETURN_BOOL(VCWD_ACCESS(file_path_to_check, W_OK) == 0);
-					break;
 #endif
 #ifdef R_OK
 				case FS_IS_R:
 					RETURN_BOOL(VCWD_ACCESS(file_path_to_check, R_OK) == 0);
-					break;
 #endif
 #ifdef X_OK
 				case FS_IS_X:
 					RETURN_BOOL(VCWD_ACCESS(file_path_to_check, X_OK) == 0);
-					break;
 #endif
 			}
 		}
diff --git a/ext/standard/filters.c b/ext/standard/filters.c
index 0faa0eda6863..c0741b46074e 100644
--- a/ext/standard/filters.c
+++ b/ext/standard/filters.c
@@ -1,14 +1,12 @@
 /*
    +----------------------------------------------------------------------+
-   | Copyright (c) The PHP Group                                          |
+   | Copyright © The PHP Group and Contributors.                          |
    +----------------------------------------------------------------------+
-   | This source file is subject to version 3.01 of the PHP license,      |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | https://www.php.net/license/3_01.txt                                 |
-   | If you did not receive a copy of the PHP license and are unable to   |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@php.net so we can mail you a copy immediately.               |
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Authors:                                                             |
    | Wez Furlong (wez@thebrainroom.com)                                   |
@@ -59,12 +57,14 @@ static php_stream_filter_status_t strfilter_rot13_filter(
 static const php_stream_filter_ops strfilter_rot13_ops = {
 	strfilter_rot13_filter,
 	NULL,
+	NULL,
 	"string.rot13"
 };
 
-static php_stream_filter *strfilter_rot13_create(const char *filtername, zval *filterparams, uint8_t persistent)
+static php_stream_filter *strfilter_rot13_create(const char *filtername, zval *filterparams, bool persistent)
 {
-	return php_stream_filter_alloc(&strfilter_rot13_ops, NULL, persistent);
+	return php_stream_filter_alloc(&strfilter_rot13_ops, NULL, persistent,
+			PSFS_SEEKABLE_ALWAYS, PSFS_SEEKABLE_ALWAYS);
 }
 
 static const php_stream_filter_factory strfilter_rot13_factory = {
@@ -135,23 +135,27 @@ static php_stream_filter_status_t strfilter_tolower_filter(
 static const php_stream_filter_ops strfilter_toupper_ops = {
 	strfilter_toupper_filter,
 	NULL,
+	NULL,
 	"string.toupper"
 };
 
 static const php_stream_filter_ops strfilter_tolower_ops = {
 	strfilter_tolower_filter,
 	NULL,
+	NULL,
 	"string.tolower"
 };
 
-static php_stream_filter *strfilter_toupper_create(const char *filtername, zval *filterparams, uint8_t persistent)
+static php_stream_filter *strfilter_toupper_create(const char *filtername, zval *filterparams, bool persistent)
 {
-	return php_stream_filter_alloc(&strfilter_toupper_ops, NULL, persistent);
+	return php_stream_filter_alloc(&strfilter_toupper_ops, NULL, persistent,
+			PSFS_SEEKABLE_ALWAYS, PSFS_SEEKABLE_ALWAYS);
 }
 
-static php_stream_filter *strfilter_tolower_create(const char *filtername, zval *filterparams, uint8_t persistent)
+static php_stream_filter *strfilter_tolower_create(const char *filtername, zval *filterparams, bool persistent)
 {
-	return php_stream_filter_alloc(&strfilter_tolower_ops, NULL, persistent);
+	return php_stream_filter_alloc(&strfilter_tolower_ops, NULL, persistent,
+			PSFS_SEEKABLE_ALWAYS, PSFS_SEEKABLE_ALWAYS);
 }
 
 static const php_stream_filter_factory strfilter_toupper_factory = {
@@ -181,14 +185,17 @@ typedef struct _php_conv php_conv;
 
 typedef php_conv_err_t (*php_conv_convert_func)(php_conv *, const char **, size_t *, char **, size_t *);
 typedef void (*php_conv_dtor_func)(php_conv *);
+typedef php_conv_err_t (*php_conv_reset_func)(php_conv *);
 
 struct _php_conv {
 	php_conv_convert_func convert_op;
 	php_conv_dtor_func dtor;
+	php_conv_reset_func reset_op;
 };
 
 #define php_conv_convert(a, b, c, d, e) ((php_conv *)(a))->convert_op((php_conv *)(a), (b), (c), (d), (e))
 #define php_conv_dtor(a) ((php_conv *)a)->dtor((a))
+#define php_conv_reset(a) (((php_conv *)(a))->reset_op ? ((php_conv *)(a))->reset_op((php_conv *)(a)) : PHP_CONV_ERR_SUCCESS)
 
 /* {{{ php_conv_base64_encode */
 typedef struct _php_conv_base64_encode {
@@ -206,6 +213,7 @@ typedef struct _php_conv_base64_encode {
 
 static php_conv_err_t php_conv_base64_encode_convert(php_conv_base64_encode *inst, const char **in_p, size_t *in_left, char **out_p, size_t *out_left);
 static void php_conv_base64_encode_dtor(php_conv_base64_encode *inst);
+static php_conv_err_t php_conv_base64_encode_reset(php_conv_base64_encode *inst);
 
 static const unsigned char b64_tbl_enc[256] = {
 	'A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P',
@@ -226,10 +234,19 @@ static const unsigned char b64_tbl_enc[256] = {
 	'w','x','y','z','0','1','2','3','4','5','6','7','8','9','+','/'
 };
 
+static php_conv_err_t php_conv_base64_encode_reset(php_conv_base64_encode *inst)
+{
+	/* Reset only mutable state, preserve configuration (lbchars, line_len, etc.) */
+	inst->erem_len = 0;
+	inst->line_ccnt = inst->line_len;
+	return PHP_CONV_ERR_SUCCESS;
+}
+
 static php_conv_err_t php_conv_base64_encode_ctor(php_conv_base64_encode *inst, unsigned int line_len, const char *lbchars, size_t lbchars_len, int lbchars_dup, bool persistent)
 {
 	inst->_super.convert_op = (php_conv_convert_func) php_conv_base64_encode_convert;
 	inst->_super.dtor = (php_conv_dtor_func) php_conv_base64_encode_dtor;
+	inst->_super.reset_op = (php_conv_reset_func) php_conv_base64_encode_reset;
 	inst->erem_len = 0;
 	inst->line_ccnt = line_len;
 	inst->line_len = line_len;
@@ -449,6 +466,7 @@ typedef struct _php_conv_base64_decode {
 
 static php_conv_err_t php_conv_base64_decode_convert(php_conv_base64_decode *inst, const char **in_p, size_t *in_left, char **out_p, size_t *out_left);
 static void php_conv_base64_decode_dtor(php_conv_base64_decode *inst);
+static php_conv_err_t php_conv_base64_decode_reset(php_conv_base64_decode *inst);
 
 static unsigned int b64_tbl_dec[256] = {
 	64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
@@ -469,10 +487,21 @@ static unsigned int b64_tbl_dec[256] = {
 	64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64
 };
 
+static php_conv_err_t php_conv_base64_decode_reset(php_conv_base64_decode *inst)
+{
+	/* Reset only mutable state */
+	inst->urem = 0;
+	inst->urem_nbits = 0;
+	inst->ustat = 0;
+	inst->eos = 0;
+	return PHP_CONV_ERR_SUCCESS;
+}
+
 static void php_conv_base64_decode_ctor(php_conv_base64_decode *inst)
 {
 	inst->_super.convert_op = (php_conv_convert_func) php_conv_base64_decode_convert;
 	inst->_super.dtor = (php_conv_dtor_func) php_conv_base64_decode_dtor;
+	inst->_super.reset_op = (php_conv_reset_func) php_conv_base64_decode_reset;
 
 	inst->urem = 0;
 	inst->urem_nbits = 0;
@@ -618,6 +647,7 @@ typedef struct _php_conv_qprint_encode {
 
 static void php_conv_qprint_encode_dtor(php_conv_qprint_encode *inst);
 static php_conv_err_t php_conv_qprint_encode_convert(php_conv_qprint_encode *inst, const char **in_pp, size_t *in_left_p, char **out_pp, size_t *out_left_p);
+static php_conv_err_t php_conv_qprint_encode_reset(php_conv_qprint_encode *inst);
 
 static void php_conv_qprint_encode_dtor(php_conv_qprint_encode *inst)
 {
@@ -627,6 +657,15 @@ static void php_conv_qprint_encode_dtor(php_conv_qprint_encode *inst)
 	}
 }
 
+static php_conv_err_t php_conv_qprint_encode_reset(php_conv_qprint_encode *inst)
+{
+	/* Reset only mutable state, preserve configuration */
+	inst->line_ccnt = inst->line_len;
+	inst->lb_ptr = 0;
+	inst->lb_cnt = 0;
+	return PHP_CONV_ERR_SUCCESS;
+}
+
 #define NEXT_CHAR(ps, icnt, lb_ptr, lb_cnt, lbchars) \
 	((lb_ptr) < (lb_cnt) ? (lbchars)[(lb_ptr)] : *(ps))
 
@@ -832,6 +871,7 @@ static php_conv_err_t php_conv_qprint_encode_ctor(php_conv_qprint_encode *inst,
 	}
 	inst->_super.convert_op = (php_conv_convert_func) php_conv_qprint_encode_convert;
 	inst->_super.dtor = (php_conv_dtor_func) php_conv_qprint_encode_dtor;
+	inst->_super.reset_op = (php_conv_reset_func) php_conv_qprint_encode_reset;
 	inst->line_ccnt = line_len;
 	inst->line_len = line_len;
 	if (lbchars != NULL) {
@@ -862,6 +902,10 @@ typedef struct _php_conv_qprint_decode {
 	unsigned int lb_cnt;
 } php_conv_qprint_decode;
 
+static void php_conv_qprint_decode_dtor(php_conv_qprint_decode *inst);
+static php_conv_err_t php_conv_qprint_decode_convert(php_conv_qprint_decode *inst, const char **in_pp, size_t *in_left_p, char **out_pp, size_t *out_left_p);
+static php_conv_err_t php_conv_qprint_decode_reset(php_conv_qprint_decode *inst);
+
 static void php_conv_qprint_decode_dtor(php_conv_qprint_decode *inst)
 {
 	assert(inst != NULL);
@@ -870,6 +914,16 @@ static void php_conv_qprint_decode_dtor(php_conv_qprint_decode *inst)
 	}
 }
 
+static php_conv_err_t php_conv_qprint_decode_reset(php_conv_qprint_decode *inst)
+{
+	/* Reset only mutable state, preserve configuration */
+	inst->scan_stat = 0;
+	inst->next_char = 0;
+	inst->lb_ptr = 0;
+	inst->lb_cnt = 0;
+	return PHP_CONV_ERR_SUCCESS;
+}
+
 static php_conv_err_t php_conv_qprint_decode_convert(php_conv_qprint_decode *inst, const char **in_pp, size_t *in_left_p, char **out_pp, size_t *out_left_p)
 {
 	php_conv_err_t err = PHP_CONV_ERR_SUCCESS;
@@ -949,7 +1003,7 @@ static php_conv_err_t php_conv_qprint_decode_convert(php_conv_qprint_decode *ins
 					goto out;
 				}
 
-				if (!isxdigit((int) *ps)) {
+				if (!isxdigit(*ps)) {
 					err = PHP_CONV_ERR_INVALID_SEQ;
 					goto out;
 				}
@@ -1040,10 +1094,12 @@ static php_conv_err_t php_conv_qprint_decode_convert(php_conv_qprint_decode *ins
 
 	return err;
 }
+
 static php_conv_err_t php_conv_qprint_decode_ctor(php_conv_qprint_decode *inst, const char *lbchars, size_t lbchars_len, int lbchars_dup, bool persistent)
 {
 	inst->_super.convert_op = (php_conv_convert_func) php_conv_qprint_decode_convert;
 	inst->_super.dtor = (php_conv_dtor_func) php_conv_qprint_decode_dtor;
+	inst->_super.reset_op = (php_conv_reset_func) php_conv_qprint_decode_reset;
 	inst->scan_stat = 0;
 	inst->next_char = 0;
 	inst->lb_ptr = inst->lb_cnt = 0;
@@ -1519,7 +1575,7 @@ static php_stream_filter_status_t strfilter_convert_filter(
 		php_stream_bucket_delref(bucket);
 	}
 
-	if (flags != PSFS_FLAG_NORMAL) {
+	if (flags & PSFS_FLAG_FLUSH_CLOSE) {
 		if (strfilter_convert_append_bucket(inst, stream, thisfilter,
 				buckets_out, NULL, 0, &consumed,
 				php_stream_is_persistent(stream)) != SUCCESS) {
@@ -1540,6 +1596,29 @@ static php_stream_filter_status_t strfilter_convert_filter(
 	return PSFS_ERR_FATAL;
 }
 
+static zend_result strfilter_convert_seek(
+	php_stream *stream,
+	php_stream_filter *thisfilter,
+	zend_off_t offset,
+	int whence
+	)
+{
+	php_convert_filter *inst = (php_convert_filter *)Z_PTR(thisfilter->abstract);
+	
+	/* Reset stub buffer */
+	inst->stub_len = 0;
+	
+	/* Reset the converter state - preserves all configuration/options */
+	if (inst->cd != NULL) {
+		php_conv_err_t err = php_conv_reset(inst->cd);
+		if (err != PHP_CONV_ERR_SUCCESS) {
+			return FAILURE;
+		}
+	}
+	
+	return SUCCESS;
+}
+
 static void strfilter_convert_dtor(php_stream_filter *thisfilter)
 {
 	assert(Z_PTR(thisfilter->abstract) != NULL);
@@ -1550,14 +1629,15 @@ static void strfilter_convert_dtor(php_stream_filter *thisfilter)
 
 static const php_stream_filter_ops strfilter_convert_ops = {
 	strfilter_convert_filter,
+	strfilter_convert_seek,
 	strfilter_convert_dtor,
 	"convert.*"
 };
 
-static php_stream_filter *strfilter_convert_create(const char *filtername, zval *filterparams, uint8_t persistent)
+static php_stream_filter *strfilter_convert_create(const char *filtername, zval *filterparams, bool persistent)
 {
 	php_convert_filter *inst;
-
+	php_stream_filter_seekable_t write_seekable;
 	const char *dot;
 	int conv_mode = 0;
 
@@ -1571,6 +1651,10 @@ static php_stream_filter *strfilter_convert_create(const char *filtername, zval
 	}
 	++dot;
 
+	if (php_stream_filter_parse_write_seek_mode(filterparams, &write_seekable) == FAILURE) {
+		return NULL;
+	}
+
 	inst = pemalloc(sizeof(php_convert_filter), persistent);
 
 	if (strcasecmp(dot, "base64-encode") == 0) {
@@ -1590,7 +1674,7 @@ static php_stream_filter *strfilter_convert_create(const char *filtername, zval
 		return NULL;
 	}
 
-	return php_stream_filter_alloc(&strfilter_convert_ops, inst, persistent);
+	return php_stream_filter_alloc(&strfilter_convert_ops, inst, persistent, PSFS_SEEKABLE_START, write_seekable);
 }
 
 static const php_stream_filter_factory strfilter_convert_factory = {
@@ -1637,6 +1721,22 @@ static php_stream_filter_status_t consumed_filter_filter(
 	return PSFS_PASS_ON;
 }
 
+static zend_result consumed_filter_seek(
+	php_stream *stream,
+	php_stream_filter *thisfilter,
+	zend_off_t offset,
+	int whence
+	)
+{
+	php_consumed_filter_data *data = (php_consumed_filter_data *)Z_PTR(thisfilter->abstract);
+	
+	/* Reset consumed state */
+	data->consumed = 0;
+	data->offset = ~0;
+	
+	return SUCCESS;
+}
+
 static void consumed_filter_dtor(php_stream_filter *thisfilter)
 {
 	if (thisfilter && Z_PTR(thisfilter->abstract)) {
@@ -1647,11 +1747,12 @@ static void consumed_filter_dtor(php_stream_filter *thisfilter)
 
 static const php_stream_filter_ops consumed_filter_ops = {
 	consumed_filter_filter,
+	consumed_filter_seek,
 	consumed_filter_dtor,
 	"consumed"
 };
 
-static php_stream_filter *consumed_filter_create(const char *filtername, zval *filterparams, uint8_t persistent)
+static php_stream_filter *consumed_filter_create(const char *filtername, zval *filterparams, bool persistent)
 {
 	const php_stream_filter_ops *fops = NULL;
 	php_consumed_filter_data *data;
@@ -1667,7 +1768,7 @@ static php_stream_filter *consumed_filter_create(const char *filtername, zval *f
 	data->offset = ~0;
 	fops = &consumed_filter_ops;
 
-	return php_stream_filter_alloc(fops, data, persistent);
+	return php_stream_filter_alloc(fops, data, persistent, PSFS_SEEKABLE_START, PSFS_SEEKABLE_ALWAYS);
 }
 
 static const php_stream_filter_factory consumed_filter_factory = {
@@ -1851,6 +1952,22 @@ static php_stream_filter_status_t php_chunked_filter(
 	return PSFS_PASS_ON;
 }
 
+static zend_result php_chunked_seek(
+	php_stream *stream,
+	php_stream_filter *thisfilter,
+	zend_off_t offset,
+	int whence
+	)
+{
+	php_chunked_filter_data *data = (php_chunked_filter_data *)Z_PTR(thisfilter->abstract);
+	
+	/* Reset chunked decoder state */
+	data->state = CHUNK_SIZE_START;
+	data->chunk_size = 0;
+	
+	return SUCCESS;
+}
+
 static void php_chunked_dtor(php_stream_filter *thisfilter)
 {
 	if (thisfilter && Z_PTR(thisfilter->abstract)) {
@@ -1861,11 +1978,12 @@ static void php_chunked_dtor(php_stream_filter *thisfilter)
 
 static const php_stream_filter_ops chunked_filter_ops = {
 	php_chunked_filter,
+	php_chunked_seek,
 	php_chunked_dtor,
 	"dechunk"
 };
 
-static php_stream_filter *chunked_filter_create(const char *filtername, zval *filterparams, uint8_t persistent)
+static php_stream_filter *chunked_filter_create(const char *filtername, zval *filterparams, bool persistent)
 {
 	const php_stream_filter_ops *fops = NULL;
 	php_chunked_filter_data *data;
@@ -1881,7 +1999,7 @@ static php_stream_filter *chunked_filter_create(const char *filtername, zval *fi
 	data->persistent = persistent;
 	fops = &chunked_filter_ops;
 
-	return php_stream_filter_alloc(fops, data, persistent);
+	return php_stream_filter_alloc(fops, data, persistent, PSFS_SEEKABLE_START, PSFS_SEEKABLE_ALWAYS);
 }
 
 static const php_stream_filter_factory chunked_filter_factory = {
diff --git a/ext/standard/flock_compat.c b/ext/standard/flock_compat.c
index b7e1df7cbc98..6967c4358901 100644
--- a/ext/standard/flock_compat.c
+++ b/ext/standard/flock_compat.c
@@ -1,14 +1,12 @@
 /*
    +----------------------------------------------------------------------+
-   | Copyright (c) The PHP Group                                          |
+   | Copyright © The PHP Group and Contributors.                          |
    +----------------------------------------------------------------------+
-   | This source file is subject to version 3.01 of the PHP license,      |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | https://www.php.net/license/3_01.txt                                 |
-   | If you did not receive a copy of the PHP license and are unable to   |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@php.net so we can mail you a copy immediately.               |
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Author: Sascha Schumann                          |
    +----------------------------------------------------------------------+
diff --git a/ext/standard/flock_compat.h b/ext/standard/flock_compat.h
index af0739bf1528..cfb6d82ba085 100644
--- a/ext/standard/flock_compat.h
+++ b/ext/standard/flock_compat.h
@@ -1,14 +1,12 @@
 /*
    +----------------------------------------------------------------------+
-   | Copyright (c) The PHP Group                                          |
+   | Copyright © The PHP Group and Contributors.                          |
    +----------------------------------------------------------------------+
-   | This source file is subject to version 3.01 of the PHP license,      |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | https://www.php.net/license/3_01.txt                                 |
-   | If you did not receive a copy of the PHP license and are unable to   |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@php.net so we can mail you a copy immediately.               |
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Author: Sascha Schumann                          |
    +----------------------------------------------------------------------+
diff --git a/ext/standard/formatted_print.c b/ext/standard/formatted_print.c
index b0fbfcc89099..f35d196fb971 100644
--- a/ext/standard/formatted_print.c
+++ b/ext/standard/formatted_print.c
@@ -1,16 +1,14 @@
 /*
    +----------------------------------------------------------------------+
-   | Copyright (c) The PHP Group                                          |
+   | Copyright © The PHP Group and Contributors.                          |
    +----------------------------------------------------------------------+
-   | This source file is subject to version 3.01 of the PHP license,      |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | https://www.php.net/license/3_01.txt                                 |
-   | If you did not receive a copy of the PHP license and are unable to   |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@php.net so we can mail you a copy immediately.               |
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
-   | Author: Stig S�ther Bakken                              |
+   | Author: Stig Sæther Bakken                              |
    +----------------------------------------------------------------------+
  */
 
@@ -376,7 +374,7 @@ php_sprintf_getnumber(char **buffer, size_t *len)
 
 int php_sprintf_get_argnum(char **format, size_t *format_len) {
 	char *temppos = *format;
-	while (isdigit((int) *temppos)) temppos++;
+	while (isdigit((unsigned char)*temppos)) temppos++;
 	if (*temppos != '$') {
 		return ARG_NUM_NEXT;
 	}
@@ -468,7 +466,7 @@ php_formatted_print(char *format, size_t format_len, zval *args, int argc, int n
 
 			PRINTF_DEBUG(("sprintf: first looking at '%c', inpos=%zu\n",
 						  *format, format - format_orig));
-			if (isalpha((int)*format)) {
+			if (isalpha((unsigned char)*format)) {
 				width = precision = 0;
 				argnum = ARG_NUM_NEXT;
 			} else {
@@ -537,7 +535,7 @@ php_formatted_print(char *format, size_t format_len, zval *args, int argc, int n
 					}
 					width = Z_LVAL_P(tmp);
 					adjusting |= ADJ_WIDTH;
-				} else if (isdigit((int)*format)) {
+				} else if (isdigit((unsigned char)*format)) {
 					PRINTF_DEBUG(("sprintf: getting width\n"));
 					if ((width = php_sprintf_getnumber(&format, &format_len)) < 0) {
 						zend_value_error("Width must be between 0 and %d", INT_MAX);
@@ -582,7 +580,7 @@ php_formatted_print(char *format, size_t format_len, zval *args, int argc, int n
 						precision = Z_LVAL_P(tmp);
 						adjusting |= ADJ_PRECISION;
 						expprec = 1;
-					} else if (isdigit((int)*format)) {
+					} else if (isdigit((unsigned char)*format)) {
 						if ((precision = php_sprintf_getnumber(&format, &format_len)) < 0) {
 							zend_value_error("Precision must be between 0 and %d", INT_MAX);
 							goto fail;
diff --git a/ext/standard/fsock.c b/ext/standard/fsock.c
index 2b9e00a57554..0b27a13e624c 100644
--- a/ext/standard/fsock.c
+++ b/ext/standard/fsock.c
@@ -1,14 +1,12 @@
 /*
    +----------------------------------------------------------------------+
-   | Copyright (c) The PHP Group                                          |
+   | Copyright © The PHP Group and Contributors.                          |
    +----------------------------------------------------------------------+
-   | This source file is subject to version 3.01 of the PHP license,      |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | https://www.php.net/license/3_01.txt                                 |
-   | If you did not receive a copy of the PHP license and are unable to   |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@php.net so we can mail you a copy immediately.               |
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Authors: Paul Panotzki - Bunyip Information Systems                  |
    |          Jim Winstead                                  |
diff --git a/ext/standard/fsock.h b/ext/standard/fsock.h
index 3789a01b7ea0..849d5052238c 100644
--- a/ext/standard/fsock.h
+++ b/ext/standard/fsock.h
@@ -1,14 +1,12 @@
 /*
    +----------------------------------------------------------------------+
-   | Copyright (c) The PHP Group                                          |
+   | Copyright © The PHP Group and Contributors.                          |
    +----------------------------------------------------------------------+
-   | This source file is subject to version 3.01 of the PHP license,      |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | https://www.php.net/license/3_01.txt                                 |
-   | If you did not receive a copy of the PHP license and are unable to   |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@php.net so we can mail you a copy immediately.               |
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Authors: Paul Panotzki - Bunyip Information Systems                  |
    |          Jim Winstead                                  |
diff --git a/ext/standard/ftok.c b/ext/standard/ftok.c
index 98715b2ee8a0..7f8702adbf84 100644
--- a/ext/standard/ftok.c
+++ b/ext/standard/ftok.c
@@ -1,14 +1,12 @@
 /*
    +----------------------------------------------------------------------+
-   | Copyright (c) The PHP Group                                          |
+   | Copyright © The PHP Group and Contributors.                          |
    +----------------------------------------------------------------------+
-   | This source file is subject to version 3.01 of the PHP license,      |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | https://www.php.net/license/3_01.txt                                 |
-   | If you did not receive a copy of the PHP license and are unable to   |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@php.net so we can mail you a copy immediately.               |
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Author: Andrew Sitnikov                         |
    +----------------------------------------------------------------------+
diff --git a/ext/standard/ftp_fopen_wrapper.c b/ext/standard/ftp_fopen_wrapper.c
index 92200e64f238..f99ae5e4b4e1 100644
--- a/ext/standard/ftp_fopen_wrapper.c
+++ b/ext/standard/ftp_fopen_wrapper.c
@@ -1,14 +1,12 @@
 /*
    +----------------------------------------------------------------------+
-   | Copyright (c) The PHP Group                                          |
+   | Copyright © The PHP Group and Contributors.                          |
    +----------------------------------------------------------------------+
-   | This source file is subject to version 3.01 of the PHP license,      |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | https://www.php.net/license/3_01.txt                                 |
-   | If you did not receive a copy of the PHP license and are unable to   |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@php.net so we can mail you a copy immediately.               |
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Authors: Rasmus Lerdorf                              |
    |          Jim Winstead                                  |
@@ -79,8 +77,8 @@ static inline int get_ftp_result(php_stream *stream, char *buffer, size_t buffer
 {
 	buffer[0] = '\0'; /* in case read fails to read anything */
 	while (php_stream_gets(stream, buffer, buffer_size-1) &&
-		   !(isdigit((int) buffer[0]) && isdigit((int) buffer[1]) &&
-			 isdigit((int) buffer[2]) && buffer[3] == ' '));
+		   !(isdigit((unsigned char)buffer[0]) && isdigit((unsigned char)buffer[1]) &&
+			 isdigit((unsigned char)buffer[2]) && buffer[3] == ' '));
 	return strtol(buffer, NULL, 10);
 }
 /* }}} */
@@ -108,7 +106,9 @@ static int php_stream_ftp_stream_close(php_stream_wrapper *wrapper, php_stream *
 			/* For write modes close data stream first to signal EOF to server */
 			result = GET_FTP_RESULT(controlstream);
 			if (result != 226 && result != 250) {
-				php_error_docref(NULL, E_WARNING, "FTP server error %d:%s", result, tmp_line);
+				php_stream_wrapper_warn(wrapper, PHP_STREAM_CONTEXT(stream), REPORT_ERRORS,
+					ProtocolError,
+					"FTP server error %d:%s", result, tmp_line);
 				ret = EOF;
 			}
 		}
@@ -186,7 +186,8 @@ static php_stream *php_ftp_fopen_connect(php_stream_wrapper *wrapper, const char
 			/* get the response */
 			result = GET_FTP_RESULT(stream);
 			if (result != 334) {
-				php_stream_wrapper_log_error(wrapper, options, "Server doesn't support FTPS.");
+				php_stream_wrapper_log_warn(wrapper, context, options, SslNotSupported,
+					"Server doesn't support FTPS.");
 				goto connect_errexit;
 			} else {
 				/* we must reuse the old SSL session id */
@@ -205,7 +206,8 @@ static php_stream *php_ftp_fopen_connect(php_stream_wrapper *wrapper, const char
 		if (php_stream_xport_crypto_setup(stream,
 				STREAM_CRYPTO_METHOD_SSLv23_CLIENT, NULL) < 0
 				|| php_stream_xport_crypto_enable(stream, 1) < 0) {
-			php_stream_wrapper_log_error(wrapper, options, "Unable to activate SSL mode");
+			php_stream_wrapper_log_warn(wrapper, context, options, SslNotSupported,
+				"Unable to activate SSL mode");
 			php_stream_close(stream);
 			stream = NULL;
 			goto connect_errexit;
@@ -235,8 +237,8 @@ static php_stream *php_ftp_fopen_connect(php_stream_wrapper *wrapper, const char
 #define PHP_FTP_CNTRL_CHK(val, val_len, err_msg) {	\
 	unsigned char *s = (unsigned char *) val, *e = (unsigned char *) s + val_len;	\
 	while (s < e) {	\
-		if (iscntrl(*s)) {	\
-			php_stream_wrapper_log_error(wrapper, options, err_msg, val);	\
+		if (iscntrl((unsigned char)*s)) {	\
+			php_stream_wrapper_log_warn(wrapper, context, options, AuthFailed, err_msg, val);	\
 			goto connect_errexit;	\
 		}	\
 		s++;	\
@@ -344,14 +346,14 @@ static unsigned short php_fopen_do_pasv(php_stream *stream, char *ip, size_t ip_
 		/* parse pasv command (129, 80, 95, 25, 13, 221) */
 		tpath = tmp_line;
 		/* skip over the "227 Some message " part */
-		for (tpath += 4; *tpath && !isdigit((int) *tpath); tpath++);
+		for (tpath += 4; *tpath && !isdigit((unsigned char)*tpath); tpath++);
 		if (!*tpath) {
 			return 0;
 		}
 		/* skip over the host ip, to get the port */
 		hoststart = tpath;
 		for (i = 0; i < 4; i++) {
-			for (; isdigit((int) *tpath); tpath++);
+			for (; isdigit((unsigned char)*tpath); tpath++);
 			if (*tpath != ',') {
 				return 0;
 			}
@@ -433,7 +435,8 @@ php_stream * php_stream_url_wrap_ftp(php_stream_wrapper *wrapper, const char *pa
 	}
 	if (strpbrk(mode, "wa+")) {
 		if (read_write) {
-			php_stream_wrapper_log_error(wrapper, options, "FTP does not support simultaneous read/write connections");
+			php_stream_wrapper_log_warn(wrapper, context, options, ModeNotSupported,
+				"FTP does not support simultaneous read/write connections");
 			return NULL;
 		}
 		if (strchr(mode, 'a')) {
@@ -444,7 +447,8 @@ php_stream * php_stream_url_wrap_ftp(php_stream_wrapper *wrapper, const char *pa
 	}
 	if (!read_write) {
 		/* No mode specified? */
-		php_stream_wrapper_log_error(wrapper, options, "Unknown file open mode");
+		php_stream_wrapper_log_warn(wrapper, context, options, InvalidMode,
+			"Unknown file open mode");
 		return NULL;
 	}
 
@@ -455,7 +459,8 @@ php_stream * php_stream_url_wrap_ftp(php_stream_wrapper *wrapper, const char *pa
 			return php_stream_url_wrap_http(wrapper, path, mode, options, opened_path, context STREAMS_CC);
 		} else {
 			/* ftp proxy is read-only */
-			php_stream_wrapper_log_error(wrapper, options, "FTP proxy may only be used in read mode");
+			php_stream_wrapper_log_warn(wrapper, context, options, ModeNotSupported,
+				"FTP proxy may only be used in read mode");
 			return NULL;
 		}
 	}
@@ -507,7 +512,8 @@ php_stream * php_stream_url_wrap_ftp(php_stream_wrapper *wrapper, const char *pa
 					goto errexit;
 				}
 			} else {
-				php_stream_wrapper_log_error(wrapper, options, "Remote file already exists and overwrite context option not specified");
+				php_stream_wrapper_log_warn(wrapper, context, options, AlreadyExists,
+					"Remote file already exists and overwrite context option not specified");
 				errno = EEXIST;
 				goto errexit;
 			}
@@ -531,7 +537,8 @@ php_stream * php_stream_url_wrap_ftp(php_stream_wrapper *wrapper, const char *pa
 			php_stream_printf(stream, "REST " ZEND_LONG_FMT "\r\n", Z_LVAL_P(tmpzval));
 			result = GET_FTP_RESULT(stream);
 			if (result < 300 || result > 399) {
-				php_stream_wrapper_log_error(wrapper, options, "Unable to resume from offset " ZEND_LONG_FMT, Z_LVAL_P(tmpzval));
+				php_stream_wrapper_log_warn(wrapper, context, options, ResumptionFailed,
+					"Unable to resume from offset " ZEND_LONG_FMT, Z_LVAL_P(tmpzval));
 				goto errexit;
 			}
 		}
@@ -576,7 +583,8 @@ php_stream * php_stream_url_wrap_ftp(php_stream_wrapper *wrapper, const char *pa
 			STREAM_CRYPTO_METHOD_SSLv23_CLIENT, NULL) < 0 ||
 			php_stream_xport_crypto_enable(datastream, 1) < 0)) {
 
-		php_stream_wrapper_log_error(wrapper, options, "Unable to activate SSL mode");
+		php_stream_wrapper_log_warn(wrapper, context, options, SslNotSupported,
+			"Unable to activate SSL mode");
 		php_stream_close(datastream);
 		datastream = NULL;
 		tmp_line[0]='\0';
@@ -598,10 +606,12 @@ php_stream * php_stream_url_wrap_ftp(php_stream_wrapper *wrapper, const char *pa
 		php_stream_close(stream);
 	}
 	if (tmp_line[0] != '\0')
-		php_stream_wrapper_log_error(wrapper, options, "FTP server reports %s", tmp_line);
+		php_stream_wrapper_log_warn(wrapper, context, options, ProtocolError,
+			"FTP server reports %s", tmp_line);
 
 	if (error_message) {
-		php_stream_wrapper_log_error(wrapper, options, "Failed to set up data channel: %s", ZSTR_VAL(error_message));
+		php_stream_wrapper_log_warn(wrapper, context, options, NetworkSendFailed,
+			"Failed to set up data channel: %s", ZSTR_VAL(error_message));
 		zend_string_release(error_message);
 	}
 	return NULL;
@@ -746,7 +756,8 @@ static php_stream * php_stream_ftp_opendir(php_stream_wrapper *wrapper, const ch
 			STREAM_CRYPTO_METHOD_SSLv23_CLIENT, NULL) < 0 ||
 			php_stream_xport_crypto_enable(datastream, 1) < 0)) {
 
-		php_stream_wrapper_log_error(wrapper, options, "Unable to activate SSL mode");
+		php_stream_wrapper_log_warn(wrapper, context, options, SslNotSupported,
+			"Unable to activate SSL mode");
 		php_stream_close(datastream);
 		datastream = NULL;
 		goto opendir_errexit;
@@ -770,7 +781,8 @@ static php_stream * php_stream_ftp_opendir(php_stream_wrapper *wrapper, const ch
 		php_stream_close(stream);
 	}
 	if (tmp_line[0] != '\0') {
-		php_stream_wrapper_log_error(wrapper, options, "FTP server reports %s", tmp_line);
+		php_stream_wrapper_log_warn(wrapper, context, options, ProtocolError,
+			"FTP server reports %s", tmp_line);
 	}
 	return NULL;
 }
@@ -832,7 +844,7 @@ static int php_stream_ftp_url_stat(php_stream_wrapper *wrapper, const char *url,
 		struct tm tm, tmbuf, *gmt;
 		time_t stamp;
 
-		while ((size_t)(p - tmp_line) < sizeof(tmp_line) && !isdigit(*p)) {
+		while ((size_t)(p - tmp_line) < sizeof(tmp_line) && !isdigit((unsigned char)*p)) {
 			p++;
 		}
 
@@ -909,14 +921,16 @@ static int php_stream_ftp_unlink(php_stream_wrapper *wrapper, const char *url, i
 	stream = php_ftp_fopen_connect(wrapper, url, "r", 0, NULL, context, NULL, &resource, NULL, NULL);
 	if (!stream) {
 		if (options & REPORT_ERRORS) {
-			php_error_docref(NULL, E_WARNING, "Unable to connect to %s", url);
+			php_stream_wrapper_warn(wrapper, context, options, AuthFailed,
+				"Unable to connect to %s", url);
 		}
 		goto unlink_errexit;
 	}
 
 	if (resource->path == NULL) {
 		if (options & REPORT_ERRORS) {
-			php_error_docref(NULL, E_WARNING, "Invalid path provided in %s", url);
+			php_stream_wrapper_warn(wrapper, context, options, InvalidPath,
+				"Invalid path provided in %s", url);
 		}
 		goto unlink_errexit;
 	}
@@ -927,7 +941,8 @@ static int php_stream_ftp_unlink(php_stream_wrapper *wrapper, const char *url, i
 	result = GET_FTP_RESULT(stream);
 	if (result < 200 || result > 299) {
 		if (options & REPORT_ERRORS) {
-			php_error_docref(NULL, E_WARNING, "Error Deleting file: %s", tmp_line);
+			php_stream_wrapper_warn(wrapper, context, options, UnlinkFailed,
+				"Error Deleting file: %s", tmp_line);
 		}
 		goto unlink_errexit;
 	}
@@ -991,7 +1006,8 @@ static int php_stream_ftp_rename(php_stream_wrapper *wrapper, const char *url_fr
 	stream = php_ftp_fopen_connect(wrapper, url_from, "r", 0, NULL, context, NULL, NULL, NULL, NULL);
 	if (!stream) {
 		if (options & REPORT_ERRORS) {
-			php_error_docref(NULL, E_WARNING, "Unable to connect to %s", ZSTR_VAL(resource_from->host));
+			php_stream_wrapper_warn(wrapper, context, options, AuthFailed,
+				"Unable to connect to %s", ZSTR_VAL(resource_from->host));
 		}
 		goto rename_errexit;
 	}
@@ -1002,7 +1018,8 @@ static int php_stream_ftp_rename(php_stream_wrapper *wrapper, const char *url_fr
 	result = GET_FTP_RESULT(stream);
 	if (result < 300 || result > 399) {
 		if (options & REPORT_ERRORS) {
-			php_error_docref(NULL, E_WARNING, "Error Renaming file: %s", tmp_line);
+			php_stream_wrapper_warn(wrapper, context, options, RenameFailed,
+				"Error Renaming file: %s", tmp_line);
 		}
 		goto rename_errexit;
 	}
@@ -1013,7 +1030,8 @@ static int php_stream_ftp_rename(php_stream_wrapper *wrapper, const char *url_fr
 	result = GET_FTP_RESULT(stream);
 	if (result < 200 || result > 299) {
 		if (options & REPORT_ERRORS) {
-			php_error_docref(NULL, E_WARNING, "Error Renaming file: %s", tmp_line);
+			php_stream_wrapper_warn(wrapper, context, options, RenameFailed,
+				"Error Renaming file: %s", tmp_line);
 		}
 		goto rename_errexit;
 	}
@@ -1046,14 +1064,16 @@ static int php_stream_ftp_mkdir(php_stream_wrapper *wrapper, const char *url, in
 	stream = php_ftp_fopen_connect(wrapper, url, "r", 0, NULL, context, NULL, &resource, NULL, NULL);
 	if (!stream) {
 		if (options & REPORT_ERRORS) {
-			php_error_docref(NULL, E_WARNING, "Unable to connect to %s", url);
+			php_stream_wrapper_warn(wrapper, context, options, AuthFailed,
+				"Unable to connect to %s", url);
 		}
 		goto mkdir_errexit;
 	}
 
 	if (resource->path == NULL) {
 		if (options & REPORT_ERRORS) {
-			php_error_docref(NULL, E_WARNING, "Invalid path provided in %s", url);
+			php_stream_wrapper_warn(wrapper, context, options, InvalidPath,
+				"Invalid path provided in %s", url);
 		}
 		goto mkdir_errexit;
 	}
@@ -1094,7 +1114,8 @@ static int php_stream_ftp_mkdir(php_stream_wrapper *wrapper, const char *url, in
 					result = GET_FTP_RESULT(stream);
 					if (result < 200 || result > 299) {
 						if (options & REPORT_ERRORS) {
-							php_error_docref(NULL, E_WARNING, "%s", tmp_line);
+							php_stream_wrapper_warn(wrapper, context, options, MkdirFailed,
+								"%s", tmp_line);
 						}
 						break;
 					}
@@ -1138,14 +1159,16 @@ static int php_stream_ftp_rmdir(php_stream_wrapper *wrapper, const char *url, in
 	stream = php_ftp_fopen_connect(wrapper, url, "r", 0, NULL, context, NULL, &resource, NULL, NULL);
 	if (!stream) {
 		if (options & REPORT_ERRORS) {
-			php_error_docref(NULL, E_WARNING, "Unable to connect to %s", url);
+			php_stream_wrapper_warn(wrapper, context, options, AuthFailed,
+				"Unable to connect to %s", url);
 		}
 		goto rmdir_errexit;
 	}
 
 	if (resource->path == NULL) {
 		if (options & REPORT_ERRORS) {
-			php_error_docref(NULL, E_WARNING, "Invalid path provided in %s", url);
+			php_stream_wrapper_warn(wrapper, context, options, InvalidPath,
+				"Invalid path provided in %s", url);
 		}
 		goto rmdir_errexit;
 	}
@@ -1155,7 +1178,8 @@ static int php_stream_ftp_rmdir(php_stream_wrapper *wrapper, const char *url, in
 
 	if (result < 200 || result > 299) {
 		if (options & REPORT_ERRORS) {
-			php_error_docref(NULL, E_WARNING, "%s", tmp_line);
+			php_stream_wrapper_warn(wrapper, context, options, RmdirFailed,
+				"%s", tmp_line);
 		}
 		goto rmdir_errexit;
 	}
diff --git a/ext/standard/head.c b/ext/standard/head.c
index 797d8d66c56a..773b6919b780 100644
--- a/ext/standard/head.c
+++ b/ext/standard/head.c
@@ -1,14 +1,12 @@
 /*
    +----------------------------------------------------------------------+
-   | Copyright (c) The PHP Group                                          |
+   | Copyright © The PHP Group and Contributors.                          |
    +----------------------------------------------------------------------+
-   | This source file is subject to version 3.01 of the PHP license,      |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | https://www.php.net/license/3_01.txt                                 |
-   | If you did not receive a copy of the PHP license and are unable to   |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@php.net so we can mail you a copy immediately.               |
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Author: Rasmus Lerdorf                         |
    +----------------------------------------------------------------------+
@@ -76,6 +74,13 @@ PHPAPI bool php_header(void)
 	}
 }
 
+PHPAPI bool php_is_valid_samesite_value(zend_string *value)
+{
+	return zend_string_equals_literal_ci(value, "Strict")
+		|| zend_string_equals_literal_ci(value, "Lax")
+		|| zend_string_equals_literal_ci(value, "None");
+}
+
 #define ILLEGAL_COOKIE_CHARACTER "\",\", \";\", \" \", \"\\t\", \"\\r\", \"\\n\", \"\\013\", or \"\\014\""
 PHPAPI zend_result php_setcookie(zend_string *name, zend_string *value, time_t expires,
 	zend_string *path, zend_string *domain, bool secure, bool httponly,
@@ -123,7 +128,11 @@ PHPAPI zend_result php_setcookie(zend_string *name, zend_string *value, time_t e
 		return FAILURE;
 	}
 
-	/* Should check value of SameSite? */
+	if (samesite && ZSTR_LEN(samesite) > 0 && !php_is_valid_samesite_value(samesite)) {
+		zend_value_error("%s(): \"samesite\" option must be \"Strict\", \"Lax\", \"None\", or \"\"",
+			get_active_function_name());
+		return FAILURE;
+	}
 
 	if (value == NULL || ZSTR_LEN(value) == 0) {
 		/*
@@ -209,14 +218,23 @@ static zend_result php_head_parse_cookie_options_array(HashTable *options, zend_
 		if (zend_string_equals_literal_ci(key, "expires")) {
 			*expires = zval_get_long(value);
 		} else if (zend_string_equals_literal_ci(key, "path")) {
+			if (*path) {
+				zend_string_release(*path);
+			}
 			*path = zval_get_string(value);
 		} else if (zend_string_equals_literal_ci(key, "domain")) {
+			if (*domain) {
+				zend_string_release(*domain);
+			}
 			*domain = zval_get_string(value);
 		} else if (zend_string_equals_literal_ci(key, "secure")) {
 			*secure = zend_is_true(value);
 		} else if (zend_string_equals_literal_ci(key, "httponly")) {
 			*httponly = zend_is_true(value);
 		} else if (zend_string_equals_literal_ci(key, "samesite")) {
+			if (*samesite) {
+				zend_string_release(*samesite);
+			}
 			*samesite = zval_get_string(value);
 		} else if (zend_string_equals_literal_ci(key, "partitioned")) {
 			*partitioned = zend_is_true(value);
diff --git a/ext/standard/head.h b/ext/standard/head.h
index 0272fec2dc21..8b91371a46e2 100644
--- a/ext/standard/head.h
+++ b/ext/standard/head.h
@@ -1,14 +1,12 @@
 /*
    +----------------------------------------------------------------------+
-   | Copyright (c) The PHP Group                                          |
+   | Copyright © The PHP Group and Contributors.                          |
    +----------------------------------------------------------------------+
-   | This source file is subject to version 3.01 of the PHP license,      |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | https://www.php.net/license/3_01.txt                                 |
-   | If you did not receive a copy of the PHP license and are unable to   |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@php.net so we can mail you a copy immediately.               |
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Author: Rasmus Lerdorf                         |
    +----------------------------------------------------------------------+
@@ -26,6 +24,8 @@
 #define COOKIE_SAMESITE    "; SameSite="
 #define COOKIE_PARTITIONED "; Partitioned"
 
+PHPAPI bool php_is_valid_samesite_value(zend_string *value);
+
 extern PHP_RINIT_FUNCTION(head);
 
 PHPAPI bool php_header(void);
diff --git a/ext/standard/hrtime.c b/ext/standard/hrtime.c
index 652531bd3ed4..216810b7df1b 100644
--- a/ext/standard/hrtime.c
+++ b/ext/standard/hrtime.c
@@ -1,14 +1,12 @@
 /*
    +----------------------------------------------------------------------+
-   | Copyright (c) The PHP Group                                          |
+   | Copyright © The PHP Group and Contributors.                          |
    +----------------------------------------------------------------------+
-   | This source file is subject to version 3.01 of the PHP license,      |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | https://www.php.net/license/3_01.txt                                 |
-   | If you did not receive a copy of the PHP license and are unable to   |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@php.net so we can mail you a copy immediately.               |
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Author: Niklas Keller                               |
    | Author: Anatol Belski                                    |
diff --git a/ext/standard/html.c b/ext/standard/html.c
index eaba9ddffc1d..1e761c971eda 100644
--- a/ext/standard/html.c
+++ b/ext/standard/html.c
@@ -1,14 +1,12 @@
 /*
    +----------------------------------------------------------------------+
-   | Copyright (c) The PHP Group                                          |
+   | Copyright © The PHP Group and Contributors.                          |
    +----------------------------------------------------------------------+
-   | This source file is subject to version 3.01 of the PHP license,      |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | https://www.php.net/license/3_01.txt                                 |
-   | If you did not receive a copy of the PHP license and are unable to   |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@php.net so we can mail you a copy immediately.               |
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Authors: Rasmus Lerdorf                              |
    |          Jaakko Hyvätti                       |
@@ -678,8 +676,8 @@ static inline zend_result process_numeric_entity(const char **buf, unsigned *cod
 
 	/* strtol allows whitespace and other stuff in the beginning
 		* we're not interested */
-	if ((hexadecimal && !isxdigit(**buf)) ||
-			(!hexadecimal && !isdigit(**buf))) {
+	if ((hexadecimal && !isxdigit((unsigned char)**buf)) ||
+			(!hexadecimal && !isdigit((unsigned char)**buf))) {
 		return FAILURE;
 	}
 
diff --git a/ext/standard/html.h b/ext/standard/html.h
index 40c595ba5d89..8576a5c8b9ce 100644
--- a/ext/standard/html.h
+++ b/ext/standard/html.h
@@ -1,14 +1,12 @@
 /*
    +----------------------------------------------------------------------+
-   | Copyright (c) The PHP Group                                          |
+   | Copyright © The PHP Group and Contributors.                          |
    +----------------------------------------------------------------------+
-   | This source file is subject to version 3.01 of the PHP license,      |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | https://www.php.net/license/3_01.txt                                 |
-   | If you did not receive a copy of the PHP license and are unable to   |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@php.net so we can mail you a copy immediately.               |
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Author: Rasmus Lerdorf                         |
    +----------------------------------------------------------------------+
diff --git a/ext/standard/html_tables.h b/ext/standard/html_tables.h
index 2d17d3fa44be..16f30283fdd4 100644
--- a/ext/standard/html_tables.h
+++ b/ext/standard/html_tables.h
@@ -1,14 +1,12 @@
 /*
    +----------------------------------------------------------------------+
-   | Copyright (c) The PHP Group                                          |
+   | Copyright © The PHP Group and Contributors.                          |
    +----------------------------------------------------------------------+
-   | This source file is subject to version 3.01 of the PHP license,      |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | https://www.php.net/license/3_01.txt                                 |
-   | If you did not receive a copy of the PHP license and are unable to   |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@php.net so we can mail you a copy immediately.               |
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
 */
 
diff --git a/ext/standard/html_tables/html_table_gen.php b/ext/standard/html_tables/html_table_gen.php
index bc76f6f7e945..a3b2d8807d70 100755
--- a/ext/standard/html_tables/html_table_gen.php
+++ b/ext/standard/html_tables/html_table_gen.php
@@ -2,15 +2,13 @@
 .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Authors: Gustavo Lopes                           |
    +----------------------------------------------------------------------+
@@ -22,15 +20,13 @@
 $t = <<.        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
 */
 
diff --git a/ext/standard/http.c b/ext/standard/http.c
index 9ce8d5e559a7..99509e7ceb04 100644
--- a/ext/standard/http.c
+++ b/ext/standard/http.c
@@ -1,14 +1,12 @@
 /*
    +----------------------------------------------------------------------+
-   | Copyright (c) The PHP Group                                          |
+   | Copyright © The PHP Group and Contributors.                          |
    +----------------------------------------------------------------------+
-   | This source file is subject to version 3.01 of the PHP license,      |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | https://www.php.net/license/3_01.txt                                 |
-   | If you did not receive a copy of the PHP license and are unable to   |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@php.net so we can mail you a copy immediately.               |
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Authors: Sara Golemon                               |
    +----------------------------------------------------------------------+
@@ -79,7 +77,7 @@ static void php_url_encode_scalar(zval *scalar, smart_str *form_str,
 			scalar = zend_enum_fetch_case_value(Z_OBJ_P(scalar));
 			goto try_again;
 		/* All possible types are either handled here or previously */
-		EMPTY_SWITCH_DEFAULT_CASE();
+		default: ZEND_UNREACHABLE();
 	}
 }
 
diff --git a/ext/standard/http_fopen_wrapper.c b/ext/standard/http_fopen_wrapper.c
index b5c06b84a6aa..9e3db6716048 100644
--- a/ext/standard/http_fopen_wrapper.c
+++ b/ext/standard/http_fopen_wrapper.c
@@ -1,14 +1,12 @@
 /*
    +----------------------------------------------------------------------+
-   | Copyright (c) The PHP Group                                          |
+   | Copyright © The PHP Group and Contributors.                          |
    +----------------------------------------------------------------------+
-   | This source file is subject to version 3.01 of the PHP license,      |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | https://www.php.net/license/3_01.txt                                 |
-   | If you did not receive a copy of the PHP license and are unable to   |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@php.net so we can mail you a copy immediately.               |
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Authors: Rasmus Lerdorf                              |
    |          Jim Winstead                                  |
@@ -245,7 +243,7 @@ static zend_string *php_stream_http_response_headers_parse(php_stream_wrapper *w
 		while (last_header_name < last_header_value) {
 			if (*last_header_name == ' ' || *last_header_name == '\t') {
 				header_info->error = true;
-				php_stream_wrapper_log_error(wrapper, options,
+				php_stream_wrapper_log_warn(wrapper, context, options, InvalidResponse,
 					"HTTP invalid response format (space in header name)!");
 				zend_string_efree(last_header_line_str);
 				return NULL;
@@ -263,7 +261,7 @@ static zend_string *php_stream_http_response_headers_parse(php_stream_wrapper *w
 	} else {
 		/* There is no colon which means invalid response so error. */
 		header_info->error = true;
-		php_stream_wrapper_log_error(wrapper, options,
+		php_stream_wrapper_log_warn(wrapper, context, options, InvalidResponse,
 				"HTTP invalid response format (no colon in header line)!");
 		zend_string_efree(last_header_line_str);
 		return NULL;
@@ -287,7 +285,7 @@ static zend_string *php_stream_http_response_headers_parse(php_stream_wrapper *w
 		size_t last_header_value_len = strlen(last_header_value);
 		if (last_header_value_len > HTTP_HEADER_MAX_LOCATION_SIZE) {
 			header_info->error = true;
-			php_stream_wrapper_log_error(wrapper, options,
+			php_stream_wrapper_log_warn(wrapper, context, options, InvalidResponse,
 					"HTTP Location header size is over the limit of %d bytes",
 					HTTP_HEADER_MAX_LOCATION_SIZE);
 			zend_string_efree(last_header_line_str);
@@ -388,7 +386,8 @@ static php_stream *php_stream_url_wrap_http_ex(php_stream_wrapper *wrapper,
 	tmp_line[0] = '\0';
 
 	if (redirect_max < 1) {
-		php_stream_wrapper_log_error(wrapper, options, "Redirection limit reached, aborting");
+		php_stream_wrapper_log_warn(wrapper, context, options, RedirectLimit,
+			"Redirection limit reached, aborting");
 		return NULL;
 	}
 
@@ -421,7 +420,8 @@ static php_stream *php_stream_url_wrap_http_ex(php_stream_wrapper *wrapper,
 		/* Normal http request (possibly with proxy) */
 
 		if (strpbrk(mode, "awx+")) {
-			php_stream_wrapper_log_error(wrapper, options, "HTTP wrapper does not support writeable connections");
+			php_stream_wrapper_log_warn(wrapper, context, options, ModeNotSupported,
+				"HTTP wrapper does not support writeable connections");
 			php_uri_struct_free(resource);
 			return NULL;
 		}
@@ -450,7 +450,8 @@ static php_stream *php_stream_url_wrap_http_ex(php_stream_wrapper *wrapper,
 	}
 
 	if (request_fulluri && (strchr(path, '\n') != NULL || strchr(path, '\r') != NULL)) {
-		php_stream_wrapper_log_error(wrapper, options, "HTTP wrapper full URI path does not allow CR or LF characters");
+		php_stream_wrapper_log_warn(wrapper, context, options, InvalidUrl,
+			"HTTP wrapper full URI path does not allow CR or LF characters");
 		php_uri_struct_free(resource);
 		zend_string_release(transport_string);
 		return NULL;
@@ -465,7 +466,8 @@ static php_stream *php_stream_url_wrap_http_ex(php_stream_wrapper *wrapper,
 #endif
 
 		if (d > timeoutmax) {
-			php_stream_wrapper_log_error(wrapper, options, "timeout must be lower than " ZEND_ULONG_FMT, (zend_ulong)timeoutmax);
+			php_stream_wrapper_log_warn(wrapper, context, options, InvalidParam,
+				"timeout must be lower than " ZEND_ULONG_FMT, (zend_ulong)timeoutmax);
 			zend_string_release(transport_string);
 			php_uri_struct_free(resource);
 			return NULL;
@@ -495,7 +497,8 @@ static php_stream *php_stream_url_wrap_http_ex(php_stream_wrapper *wrapper,
 	}
 
 	if (errstr) {
-		php_stream_wrapper_log_error(wrapper, options, "%s", ZSTR_VAL(errstr));
+		php_stream_wrapper_log_warn(wrapper, context, options, ProtocolError,
+			"%s", ZSTR_VAL(errstr));
 		zend_string_release_ex(errstr, 0);
 		errstr = NULL;
 	}
@@ -515,7 +518,7 @@ static php_stream *php_stream_url_wrap_http_ex(php_stream_wrapper *wrapper,
 		}
 
 		smart_str_appendl(&header, "CONNECT ", sizeof("CONNECT ")-1);
-		smart_str_appends(&header, ZSTR_VAL(resource->host));
+		smart_str_append(&header, resource->host);
 		smart_str_appendc(&header, ':');
 		smart_str_append_unsigned(&header, resource->port);
 		smart_str_appendl(&header, " HTTP/1.0\r\n", sizeof(" HTTP/1.0\r\n")-1);
@@ -546,7 +549,11 @@ static php_stream *php_stream_url_wrap_http_ex(php_stream_wrapper *wrapper,
 		smart_str_appendl(&header, "\r\n", sizeof("\r\n")-1);
 
 		if (php_stream_write(stream, ZSTR_VAL(header.s), ZSTR_LEN(header.s)) != ZSTR_LEN(header.s)) {
-			php_stream_wrapper_log_error(wrapper, options, "Cannot connect to HTTPS server through proxy");
+			if (reset_ssl_peer_name) {
+				php_stream_context_unset_option(PHP_STREAM_CONTEXT(stream), "ssl", "peer_name");
+			}
+			php_stream_wrapper_log_warn(wrapper, context, options, ProtocolError,
+				"Cannot connect to HTTPS server through proxy");
 			php_stream_close(stream);
 			stream = NULL;
 		}
@@ -567,16 +574,19 @@ static php_stream *php_stream_url_wrap_http_ex(php_stream_wrapper *wrapper,
 
 		/* enable SSL transport layer */
 		if (stream) {
+			php_stream_context *old_context = PHP_STREAM_CONTEXT(stream);
+
 			if (php_stream_xport_crypto_setup(stream, STREAM_CRYPTO_METHOD_SSLv23_CLIENT, NULL) < 0 ||
 			    php_stream_xport_crypto_enable(stream, 1) < 0) {
-				php_stream_wrapper_log_error(wrapper, options, "Cannot connect to HTTPS server through proxy");
+				php_stream_wrapper_log_warn(wrapper, context, options, SslNotSupported,
+					"Cannot connect to HTTPS server through proxy");
 				php_stream_close(stream);
 				stream = NULL;
 			}
-		}
 
-		if (reset_ssl_peer_name) {
-			php_stream_context_unset_option(PHP_STREAM_CONTEXT(stream), "ssl", "peer_name");
+			if (reset_ssl_peer_name) {
+				php_stream_context_unset_option(old_context, "ssl", "peer_name");
+			}
 		}
 	}
 
@@ -630,7 +640,7 @@ static php_stream *php_stream_url_wrap_http_ex(php_stream_wrapper *wrapper,
 
 		/* file */
 		if (resource->path && ZSTR_LEN(resource->path)) {
-			smart_str_appends(&req_buf, ZSTR_VAL(resource->path));
+			smart_str_append(&req_buf, resource->path);
 		} else {
 			smart_str_appendc(&req_buf, '/');
 		}
@@ -638,7 +648,7 @@ static php_stream *php_stream_url_wrap_http_ex(php_stream_wrapper *wrapper,
 		/* query string */
 		if (resource->query) {
 			smart_str_appendc(&req_buf, '?');
-			smart_str_appends(&req_buf, ZSTR_VAL(resource->query));
+			smart_str_append(&req_buf, resource->query);
 		}
 	}
 
@@ -751,14 +761,14 @@ static php_stream *php_stream_url_wrap_http_ex(php_stream_wrapper *wrapper,
 		smart_str scratch = {0};
 
 		/* decode the strings first */
-		php_url_decode(ZSTR_VAL(resource->user), ZSTR_LEN(resource->user));
+		ZSTR_LEN(resource->user) = php_url_decode(ZSTR_VAL(resource->user), ZSTR_LEN(resource->user));
 
 		smart_str_append(&scratch, resource->user);
 		smart_str_appendc(&scratch, ':');
 
 		/* Note: password is optional! */
 		if (resource->password) {
-			php_url_decode(ZSTR_VAL(resource->password), ZSTR_LEN(resource->password));
+			ZSTR_LEN(resource->password) = php_url_decode(ZSTR_VAL(resource->password), ZSTR_LEN(resource->password));
 			smart_str_append(&scratch, resource->password);
 		}
 
@@ -785,7 +795,7 @@ static php_stream *php_stream_url_wrap_http_ex(php_stream_wrapper *wrapper,
 	/* Send Host: header so name-based virtual hosts work */
 	if ((have_header & HTTP_HEADER_HOST) == 0) {
 		smart_str_appends(&req_buf, "Host: ");
-		smart_str_appends(&req_buf, ZSTR_VAL(resource->host));
+		smart_str_append(&req_buf, resource->host);
 		if ((use_ssl && resource->port != 443 && resource->port != 0) ||
 			(!use_ssl && resource->port != 80 && resource->port != 0)) {
 			smart_str_appendc(&req_buf, ':');
@@ -826,7 +836,8 @@ static php_stream *php_stream_url_wrap_http_ex(php_stream_wrapper *wrapper,
 				ua[ua_len] = 0;
 				smart_str_appendl(&req_buf, ua, ua_len);
 			} else {
-				php_error_docref(NULL, E_WARNING, "Cannot construct User-agent header");
+				php_stream_wrapper_warn_nt(wrapper, context, options, InvalidHeader,
+					"Cannot construct User-agent header");
 			}
 			efree(ua);
 		}
@@ -865,10 +876,11 @@ static php_stream *php_stream_url_wrap_http_ex(php_stream_wrapper *wrapper,
 		}
 		if (!(have_header & HTTP_HEADER_TYPE)) {
 			smart_str_appends(&req_buf, "Content-Type: application/x-www-form-urlencoded\r\n");
-			php_error_docref(NULL, E_NOTICE, "Content-type not specified assuming application/x-www-form-urlencoded");
+			php_stream_wrapper_notice(wrapper, context, options, InvalidHeader,
+				"Content-type not specified assuming application/x-www-form-urlencoded");
 		}
 		smart_str_appends(&req_buf, "\r\n");
-		smart_str_appendl(&req_buf, Z_STRVAL_P(tmpzval), Z_STRLEN_P(tmpzval));
+		smart_str_append(&req_buf, Z_STR_P(tmpzval));
 	} else {
 		smart_str_appends(&req_buf, "\r\n");
 	}
@@ -952,7 +964,8 @@ static php_stream *php_stream_url_wrap_http_ex(php_stream_wrapper *wrapper,
 		} else {
 			php_stream_close(stream);
 			stream = NULL;
-			php_stream_wrapper_log_error(wrapper, options, "HTTP request failed!");
+			php_stream_wrapper_log_warn(wrapper, context, options, ProtocolError,
+				"HTTP request failed!");
 			goto out;
 		}
 	}
@@ -970,7 +983,7 @@ static php_stream *php_stream_url_wrap_http_ex(php_stream_wrapper *wrapper,
 				if (http_header_line[1] != '\n') {
 					php_stream_close(stream);
 					stream = NULL;
-					php_stream_wrapper_log_error(wrapper, options,
+					php_stream_wrapper_log_warn(wrapper, context, options, InvalidResponse,
 							"HTTP invalid header name (cannot start with CR character)!");
 					goto out;
 				}
@@ -1001,7 +1014,7 @@ static php_stream *php_stream_url_wrap_http_ex(php_stream_wrapper *wrapper,
 				if (*http_header_line == ' ' || *http_header_line == '\t') {
 					php_stream_close(stream);
 					stream = NULL;
-					php_stream_wrapper_log_error(wrapper, options,
+					php_stream_wrapper_log_warn(wrapper, context, options, InvalidResponse,
 							"HTTP invalid response format (folding header at the start)!");
 					goto out;
 				}
@@ -1097,7 +1110,8 @@ static php_stream *php_stream_url_wrap_http_ex(php_stream_wrapper *wrapper,
 			php_uri_struct_free(resource);
 			/* check for invalid redirection URLs */
 			if ((resource = php_uri_parse_to_struct(uri_parser, new_path, strlen(new_path), PHP_URI_COMPONENT_READ_MODE_RAW, true)) == NULL) {
-				php_stream_wrapper_log_error(wrapper, options, "Invalid redirect URL! %s", new_path);
+				php_stream_wrapper_log_warn(wrapper, context, options, InvalidUrl,
+					"Invalid redirect URL! %s", new_path);
 				efree(new_path);
 				goto out;
 			}
@@ -1109,7 +1123,8 @@ static php_stream *php_stream_url_wrap_http_ex(php_stream_wrapper *wrapper,
 		s = (unsigned char*)ZSTR_VAL(val); e = s + ZSTR_LEN(val); \
 		while (s < e) { \
 			if (iscntrl(*s)) { \
-				php_stream_wrapper_log_error(wrapper, options, "Invalid redirect URL! %s", new_path); \
+				php_stream_wrapper_log_warn(wrapper, context, options, InvalidUrl, \
+					"Invalid redirect URL! %s", new_path); \
 				efree(new_path); \
 				goto out; \
 			} \
@@ -1135,7 +1150,8 @@ static php_stream *php_stream_url_wrap_http_ex(php_stream_wrapper *wrapper,
 				--redirect_max, new_flags, response_header STREAMS_CC);
 			efree(new_path);
 		} else {
-			php_stream_wrapper_log_error(wrapper, options, "HTTP request failed! %s", tmp_line);
+			php_stream_wrapper_log_warn(wrapper, context, options, ProtocolError,
+				"HTTP request failed! %s", tmp_line);
 		}
 	}
 out:
diff --git a/ext/standard/image.c b/ext/standard/image.c
index 08cf8983d029..869371842006 100644
--- a/ext/standard/image.c
+++ b/ext/standard/image.c
@@ -1,14 +1,12 @@
 /*
    +----------------------------------------------------------------------+
-   | Copyright (c) The PHP Group                                          |
+   | Copyright © The PHP Group and Contributors.                          |
    +----------------------------------------------------------------------+
-   | This source file is subject to version 3.01 of the PHP license,      |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | https://www.php.net/license/3_01.txt                                 |
-   | If you did not receive a copy of the PHP license and are unable to   |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@php.net so we can mail you a copy immediately.               |
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Authors: Rasmus Lerdorf                              |
    |          Marcus Boerger                               |
diff --git a/ext/standard/incomplete_class.c b/ext/standard/incomplete_class.c
index 228e03fbe863..d794612f429d 100644
--- a/ext/standard/incomplete_class.c
+++ b/ext/standard/incomplete_class.c
@@ -1,14 +1,12 @@
 /*
    +----------------------------------------------------------------------+
-   | Copyright (c) The PHP Group                                          |
+   | Copyright © The PHP Group and Contributors.                          |
    +----------------------------------------------------------------------+
-   | This source file is subject to version 3.01 of the PHP license,      |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | https://www.php.net/license/3_01.txt                                 |
-   | If you did not receive a copy of the PHP license and are unable to   |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@php.net so we can mail you a copy immediately.               |
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Author:  Sascha Schumann                         |
    +----------------------------------------------------------------------+
diff --git a/ext/standard/info.c b/ext/standard/info.c
index 952f0f92fe6e..dcb01bc08220 100644
--- a/ext/standard/info.c
+++ b/ext/standard/info.c
@@ -1,14 +1,12 @@
 /*
    +----------------------------------------------------------------------+
-   | Copyright (c) The PHP Group                                          |
+   | Copyright © The PHP Group and Contributors.                          |
    +----------------------------------------------------------------------+
-   | This source file is subject to version 3.01 of the PHP license,      |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | https://www.php.net/license/3_01.txt                                 |
-   | If you did not receive a copy of the PHP license and are unable to   |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@php.net so we can mail you a copy immediately.               |
+   | This source file is subject to the Modified BSD License that is      |
+   | bundled with this package in the file LICENSE, and is available      |
+   | through the World Wide Web at .        |
+   |                                                                      |
+   | SPDX-License-Identifier: BSD-3-Clause                                |
    +----------------------------------------------------------------------+
    | Authors: Rasmus Lerdorf                              |
    |          Zeev Suraski                                  |
@@ -1021,35 +1019,78 @@ PHPAPI ZEND_COLD void php_print_info(int flag)
 
 	if (flag & PHP_INFO_LICENSE) {
 		if (!sapi_module.phpinfo_as_text) {
-			SECTION("PHP License");
+			SECTION("License");
 			php_info_print_box_start(0);
 			php_info_print("

\n"); - php_info_print("This program is free software; you can redistribute it and/or modify "); - php_info_print("it under the terms of the PHP License as published by the PHP Group "); - php_info_print("and included in the distribution in the file: LICENSE\n"); + php_info_print("PHP is free software. You may redistribute it and/or modify it under the "); + php_info_print("terms of the Modified BSD License (SPDX-License-Identifier: BSD-3-Clause).\n"); php_info_print("

\n"); - php_info_print("

"); - php_info_print("This program is distributed in the hope that it will be useful, "); - php_info_print("but WITHOUT ANY WARRANTY; without even the implied warranty of "); - php_info_print("MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n"); + php_info_print("

\n"); + php_info_print("Copyright © The PHP Group and Contributors.
\n"); + php_info_print("Copyright © Zend Technologies Ltd., a subsidiary company of Perforce Software, Inc.\n"); php_info_print("

\n"); - php_info_print("

"); - php_info_print("If you did not receive a copy of the PHP license, or have any questions about "); - php_info_print("PHP licensing, please contact license@php.net.\n"); + php_info_print("

\n"); + php_info_print("Redistribution and use in source and binary forms, with or without "); + php_info_print("modification, are permitted provided that the following conditions are met:\n"); + php_info_print("

\n"); + php_info_print("
    \n"); + php_info_print("
  1. Redistributions of source code must retain the above copyright notice, this "); + php_info_print("list of conditions and the following disclaimer.
  2. \n"); + php_info_print("
  3. Redistributions in binary form must reproduce the above copyright notice, "); + php_info_print("this list of conditions and the following disclaimer in the documentation "); + php_info_print("and/or other materials provided with the distribution.
  4. \n"); + php_info_print("
  5. Neither the name of the copyright holder nor the names of its "); + php_info_print("contributors may be used to endorse or promote products derived from "); + php_info_print("this software without specific prior written permission.
  6. \n"); + php_info_print("
\n"); + php_info_print("

\n"); + php_info_print("THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" "); + php_info_print("AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE "); + php_info_print("IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE "); + php_info_print("DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE "); + php_info_print("FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL "); + php_info_print("DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR "); + php_info_print("SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER "); + php_info_print("CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, "); + php_info_print("OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE "); + php_info_print("OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n"); php_info_print("

\n"); php_info_print_box_end(); } else { - php_info_print("\nPHP License\n"); - php_info_print("This program is free software; you can redistribute it and/or modify\n"); - php_info_print("it under the terms of the PHP License as published by the PHP Group\n"); - php_info_print("and included in the distribution in the file: LICENSE\n"); php_info_print("\n"); - php_info_print("This program is distributed in the hope that it will be useful,\n"); - php_info_print("but WITHOUT ANY WARRANTY; without even the implied warranty of\n"); - php_info_print("MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n"); + php_info_print("License\n"); + php_info_print("\n"); + php_info_print("PHP is free software. You may redistribute it and/or modify it under the\n"); + php_info_print("terms of the Modified BSD License (SPDX-License-Identifier: BSD-3-Clause).\n"); + php_info_print("\n"); + php_info_print("Copyright © The PHP Group and Contributors.\n"); + php_info_print("Copyright © Zend Technologies Ltd., a subsidiary company of\n"); + php_info_print(" Perforce Software, Inc.\n"); + php_info_print("\n"); + php_info_print("Redistribution and use in source and binary forms, with or without\n"); + php_info_print("modification, are permitted provided that the following conditions are met:\n"); + php_info_print("\n"); + php_info_print("1. Redistributions of source code must retain the above copyright notice, this\n"); + php_info_print(" list of conditions and the following disclaimer.\n"); + php_info_print("\n"); + php_info_print("2. Redistributions in binary form must reproduce the above copyright notice,\n"); + php_info_print(" this list of conditions and the following disclaimer in the documentation\n"); + php_info_print(" and/or other materials provided with the distribution.\n"); + php_info_print("\n"); + php_info_print("3. Neither the name of the copyright holder nor the names of its\n"); + php_info_print(" contributors may be used to endorse or promote products derived from\n"); + php_info_print(" this software without specific prior written permission.\n"); php_info_print("\n"); - php_info_print("If you did not receive a copy of the PHP license, or have any\n"); - php_info_print("questions about PHP licensing, please contact license@php.net.\n"); + php_info_print("THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\n"); + php_info_print("AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n"); + php_info_print("IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n"); + php_info_print("DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE\n"); + php_info_print("FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\n"); + php_info_print("DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\n"); + php_info_print("SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\n"); + php_info_print("CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,\n"); + php_info_print("OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n"); + php_info_print("OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n"); } } diff --git a/ext/standard/info.h b/ext/standard/info.h index 380d2b6e042a..6d1603dd8346 100644 --- a/ext/standard/info.h +++ b/ext/standard/info.h @@ -1,14 +1,12 @@ /* +----------------------------------------------------------------------+ - | Copyright (c) The PHP Group | + | Copyright © The PHP Group and Contributors. | +----------------------------------------------------------------------+ - | This source file is subject to version 3.01 of the PHP license, | - | that is bundled with this package in the file LICENSE, and is | - | available through the world-wide-web at the following url: | - | https://www.php.net/license/3_01.txt | - | If you did not receive a copy of the PHP license and are unable to | - | obtain it through the world-wide-web, please send a note to | - | license@php.net so we can mail you a copy immediately. | + | This source file is subject to the Modified BSD License that is | + | bundled with this package in the file LICENSE, and is available | + | through the World Wide Web at . | + | | + | SPDX-License-Identifier: BSD-3-Clause | +----------------------------------------------------------------------+ | Authors: Rasmus Lerdorf | | Zeev Suraski | diff --git a/ext/standard/io_poll.c b/ext/standard/io_poll.c new file mode 100644 index 000000000000..b1eb7513f1cb --- /dev/null +++ b/ext/standard/io_poll.c @@ -0,0 +1,943 @@ +/* + +----------------------------------------------------------------------+ + | Copyright (c) The PHP Group | + +----------------------------------------------------------------------+ + | This source file is subject to the Modified BSD License that is | + | bundled with this package in the file LICENSE, and is available | + | through the World Wide Web at . | + | | + | SPDX-License-Identifier: BSD-3-Clause | + +----------------------------------------------------------------------+ + | Author: Jakub Zelenka | + +----------------------------------------------------------------------+ +*/ + +#include "php.h" +#include "zend_enum.h" +#include "zend_exceptions.h" +#include "php_network.h" +#include "php_poll.h" +#include "io_poll_arginfo.h" + +/* Class entries */ +static zend_class_entry *php_io_poll_backend_class_entry; +static zend_class_entry *php_io_poll_event_class_entry; +static zend_class_entry *php_io_poll_context_class_entry; +static zend_class_entry *php_io_poll_watcher_class_entry; +static zend_class_entry *php_io_poll_handle_class_entry; +static zend_class_entry *php_io_exception_class_entry; +static zend_class_entry *php_io_poll_exception_class_entry; +static zend_class_entry *php_io_poll_failed_backend_unavailable_class_entry; +static zend_class_entry *php_io_poll_failed_operation_class_entry; +static zend_class_entry *php_io_poll_failed_context_init_class_entry; +static zend_class_entry *php_io_poll_failed_handle_add_class_entry; +static zend_class_entry *php_io_poll_failed_watcher_mod_class_entry; +static zend_class_entry *php_io_poll_failed_wait_class_entry; +static zend_class_entry *php_io_poll_inactive_watcher_class_entry; +static zend_class_entry *php_io_poll_handle_already_watched_class_entry; +static zend_class_entry *php_io_poll_invalid_handle_class_entry; +static zend_class_entry *php_stream_poll_handle_class_entry; + +/* Object handlers */ +static zend_object_handlers php_io_poll_context_object_handlers; +static zend_object_handlers php_io_poll_watcher_object_handlers; +static zend_object_handlers php_io_poll_handle_object_handlers; + +/* Watcher object structure */ +typedef struct php_io_poll_watcher_object { + php_poll_handle_object *handle; + uint32_t watched_events; + uint32_t triggered_events; + zval data; + bool active; + php_poll_ctx *poll_ctx; /* Back reference to poll context */ + zend_object std; +} php_io_poll_watcher_object; + +/* Context object structure */ +typedef struct php_io_poll_context_object { + php_poll_ctx *ctx; + HashTable *watchers; /* Maps handle pointer -> watcher object */ + zend_object std; +} php_io_poll_context_object; + +/* Stream poll handle specific data */ +typedef struct php_stream_poll_handle_data { + php_stream *stream; + zend_resource *res; +} php_stream_poll_handle_data; + +/* Accessor macros */ +#define PHP_POLL_CONTEXT_OBJ_FROM_ZOBJ(_obj) ZEND_CONTAINER_OF(_obj, php_io_poll_context_object, std) + +#define PHP_POLL_WATCHER_OBJ_FROM_ZOBJ(_obj) ZEND_CONTAINER_OF(_obj, php_io_poll_watcher_object, std) + +#define PHP_POLL_WATCHER_OBJ_FROM_ZV(_zv) PHP_POLL_WATCHER_OBJ_FROM_ZOBJ(Z_OBJ_P(_zv)) +#define PHP_POLL_CONTEXT_OBJ_FROM_ZV(_zv) PHP_POLL_CONTEXT_OBJ_FROM_ZOBJ(Z_OBJ_P(_zv)) + +/* Helper to throw failed operation exceptions with error code */ +static inline void php_io_poll_throw_failed_operation( + zend_class_entry *ce, const char *message, php_poll_error error) +{ + zend_throw_exception(ce, message, (zend_long) error); +} + +/* Event enum to bit mask mapping */ +static uint32_t php_io_poll_event_enum_to_bit(zend_object *event_enum) +{ + return 1 << (zend_enum_fetch_case_id(event_enum) - 1); +} + +static uint32_t php_io_poll_event_enums_to_events(zval *event_enums) +{ + HashTable *ht; + uint32_t events = 0; + + if (Z_TYPE_P(event_enums) != IS_ARRAY) { + return 0; + } + + ht = Z_ARRVAL_P(event_enums); + + ZEND_HASH_FOREACH_VAL(ht, zval *entry) { + if (Z_TYPE_P(entry) != IS_OBJECT + || !instanceof_function(Z_OBJCE_P(entry), php_io_poll_event_class_entry)) { + return 0; + } + events |= php_io_poll_event_enum_to_bit(Z_OBJ_P(entry)); + } + ZEND_HASH_FOREACH_END(); + + return events; +} + +static zend_result php_io_poll_events_to_event_enums(uint32_t events, zval *event_enums) +{ + zval enum_case; + + array_init(event_enums); + + if (events & PHP_POLL_READ) { + ZVAL_OBJ(&enum_case, zend_enum_get_case_cstr(php_io_poll_event_class_entry, "Read")); + GC_ADDREF(Z_OBJ(enum_case)); + add_next_index_zval(event_enums, &enum_case); + } + if (events & PHP_POLL_WRITE) { + ZVAL_OBJ(&enum_case, zend_enum_get_case_cstr(php_io_poll_event_class_entry, "Write")); + GC_ADDREF(Z_OBJ(enum_case)); + add_next_index_zval(event_enums, &enum_case); + } + if (events & PHP_POLL_ERROR) { + ZVAL_OBJ(&enum_case, zend_enum_get_case_cstr(php_io_poll_event_class_entry, "Error")); + GC_ADDREF(Z_OBJ(enum_case)); + add_next_index_zval(event_enums, &enum_case); + } + if (events & PHP_POLL_HUP) { + ZVAL_OBJ(&enum_case, zend_enum_get_case_cstr(php_io_poll_event_class_entry, "HangUp")); + GC_ADDREF(Z_OBJ(enum_case)); + add_next_index_zval(event_enums, &enum_case); + } + if (events & PHP_POLL_RDHUP) { + ZVAL_OBJ(&enum_case, zend_enum_get_case_cstr(php_io_poll_event_class_entry, "ReadHangUp")); + GC_ADDREF(Z_OBJ(enum_case)); + add_next_index_zval(event_enums, &enum_case); + } + if (events & PHP_POLL_ONESHOT) { + ZVAL_OBJ(&enum_case, zend_enum_get_case_cstr(php_io_poll_event_class_entry, "OneShot")); + GC_ADDREF(Z_OBJ(enum_case)); + add_next_index_zval(event_enums, &enum_case); + } + if (events & PHP_POLL_ET) { + ZVAL_OBJ(&enum_case, zend_enum_get_case_cstr(php_io_poll_event_class_entry, "EdgeTriggered")); + GC_ADDREF(Z_OBJ(enum_case)); + add_next_index_zval(event_enums, &enum_case); + } + + return SUCCESS; +} + +/* Backend enum name to backend type mapping */ +static php_poll_backend_type php_io_poll_backend_enum_to_type(zend_object *backend_enum) +{ + return zend_enum_fetch_case_id(backend_enum) - 2; +} + +static const char *php_io_poll_backend_type_to_name(php_poll_backend_type type) +{ + switch (type) { + case PHP_POLL_BACKEND_POLL: + return "Poll"; + case PHP_POLL_BACKEND_EPOLL: + return "Epoll"; + case PHP_POLL_BACKEND_KQUEUE: + return "Kqueue"; + case PHP_POLL_BACKEND_EVENTPORT: + return "EventPorts"; + case PHP_POLL_BACKEND_WSAPOLL: + return "WSAPoll"; + case PHP_POLL_BACKEND_AUTO: + default: + return "Auto"; + } +} + +/* Stream Poll Handle Implementation */ + +static php_socket_t php_stream_poll_handle_get_fd(php_poll_handle_object *handle) +{ + php_stream_poll_handle_data *data = handle->handle_data; + php_socket_t fd; + + if (!data || !data->stream) { + return SOCK_ERR; + } + + if (php_stream_cast(data->stream, PHP_STREAM_AS_FD_FOR_SELECT | PHP_STREAM_CAST_INTERNAL, + (void *) &fd, 1) + != SUCCESS + || fd == -1) { + return SOCK_ERR; + } + + return fd; +} + +static int php_stream_poll_handle_is_valid(php_poll_handle_object *handle) +{ + php_stream_poll_handle_data *data = handle->handle_data; + return data && data->stream && !php_stream_eof(data->stream); +} + +static void php_stream_poll_handle_cleanup(php_poll_handle_object *handle) +{ + php_stream_poll_handle_data *data = handle->handle_data; + if (data) { + if (data->res) { + zend_list_delete(data->res); + } + efree(data); + handle->handle_data = NULL; + } +} + +static php_poll_handle_ops php_stream_poll_handle_ops = { + .get_fd = php_stream_poll_handle_get_fd, + .is_valid = php_stream_poll_handle_is_valid, + .cleanup = php_stream_poll_handle_cleanup +}; + +/* Handle interface internal only */ +static int php_stream_poll_handle_implement_interface(zend_class_entry *interface, zend_class_entry *implementor) +{ + if (implementor->type == ZEND_USER_CLASS) { + zend_error_noreturn(E_ERROR, "Io\\Poll\\Handle cannot be implemented by user classes"); + return FAILURE; + } + + return SUCCESS; +} + +/* Object Creation Functions */ + +static zend_object *php_stream_poll_handle_create_object(zend_class_entry *ce) +{ + php_poll_handle_object *intern = php_poll_handle_object_create( + sizeof(php_poll_handle_object), ce, &php_stream_poll_handle_ops); + return &intern->std; +} + +static zend_object *php_io_poll_watcher_create_object(zend_class_entry *ce) +{ + php_io_poll_watcher_object *intern = zend_object_alloc(sizeof(php_io_poll_watcher_object), ce); + + zend_object_std_init(&intern->std, ce); + object_properties_init(&intern->std, ce); + + intern->handle = NULL; + intern->watched_events = 0; + intern->triggered_events = 0; + intern->active = false; + intern->poll_ctx = NULL; + ZVAL_NULL(&intern->data); + + return &intern->std; +} + +static zend_object *php_io_poll_context_create_object(zend_class_entry *ce) +{ + php_io_poll_context_object *intern = zend_object_alloc(sizeof(php_io_poll_context_object), ce); + + zend_object_std_init(&intern->std, ce); + object_properties_init(&intern->std, ce); + + intern->ctx = NULL; + intern->watchers = NULL; + + return &intern->std; +} + +/* Object Destruction Functions */ + +static void php_io_poll_watcher_free_object(zend_object *obj) +{ + php_io_poll_watcher_object *intern = PHP_POLL_WATCHER_OBJ_FROM_ZOBJ(obj); + + zval_ptr_dtor(&intern->data); + + if (intern->handle) { + OBJ_RELEASE(&intern->handle->std); + } + + zend_object_std_dtor(&intern->std); +} + +static void php_io_poll_context_free_object(zend_object *obj) +{ + php_io_poll_context_object *intern = PHP_POLL_CONTEXT_OBJ_FROM_ZOBJ(obj); + + if (intern->watchers) { + ZEND_HASH_FOREACH_VAL(intern->watchers, zval *zv) { + php_io_poll_watcher_object *watcher = PHP_POLL_WATCHER_OBJ_FROM_ZOBJ(Z_OBJ_P(zv)); + watcher->active = false; + watcher->poll_ctx = NULL; + } ZEND_HASH_FOREACH_END(); + } + + if (intern->ctx) { + php_poll_destroy(intern->ctx); + } + + if (intern->watchers) { + zend_hash_destroy(intern->watchers); + efree(intern->watchers); + } + + zend_object_std_dtor(&intern->std); +} + +static HashTable *php_io_poll_watcher_get_gc(zend_object *obj, zval **table, int *n) +{ + php_io_poll_watcher_object *intern = PHP_POLL_WATCHER_OBJ_FROM_ZOBJ(obj); + zend_get_gc_buffer *gc_buffer = zend_get_gc_buffer_create(); + + zend_get_gc_buffer_add_zval(gc_buffer, &intern->data); + if (intern->handle) { + zend_get_gc_buffer_add_obj(gc_buffer, &intern->handle->std); + } + + zend_get_gc_buffer_use(gc_buffer, table, n); + return NULL; +} + +static HashTable *php_io_poll_context_get_gc(zend_object *obj, zval **table, int *n) +{ + php_io_poll_context_object *intern = PHP_POLL_CONTEXT_OBJ_FROM_ZOBJ(obj); + zend_get_gc_buffer *gc_buffer = zend_get_gc_buffer_create(); + + if (intern->watchers) { + ZEND_HASH_FOREACH_VAL(intern->watchers, zval *zv) { + zend_get_gc_buffer_add_zval(gc_buffer, zv); + } ZEND_HASH_FOREACH_END(); + } + + zend_get_gc_buffer_use(gc_buffer, table, n); + return NULL; +} + +/* Utility functions */ + +static zend_always_inline zend_ulong php_io_poll_compute_ptr_key(void *ptr) +{ + zend_ulong key = (zend_ulong) (uintptr_t) ptr; + return (key >> 3) | (key << ((sizeof(key) * 8) - 3)); +} + +static zend_result php_io_poll_watcher_modify_events( + php_io_poll_watcher_object *watcher, uint32_t events) +{ + if (!watcher->active || !watcher->poll_ctx) { + zend_throw_exception( + php_io_poll_inactive_watcher_class_entry, "Cannot modify inactive watcher", 0); + return FAILURE; + } + + php_socket_t fd = php_poll_handle_get_fd(watcher->handle); + if (fd == SOCK_ERR) { + zend_throw_exception( + php_io_poll_invalid_handle_class_entry, "Invalid handle for polling", 0); + return FAILURE; + } + + /* Modify in poll context */ + if (php_poll_modify(watcher->poll_ctx, (int) fd, events, watcher) != SUCCESS) { + php_poll_error err = php_poll_get_error(watcher->poll_ctx); + php_io_poll_throw_failed_operation(php_io_poll_failed_watcher_mod_class_entry, + "Failed to modify watcher in polling system", err); + return FAILURE; + } + + /* Update watcher state */ + watcher->watched_events = events; + + return SUCCESS; +} + +static zend_result php_io_poll_watcher_modify_data(php_io_poll_watcher_object *watcher, zval *data) +{ + if (!watcher->active) { + zend_throw_exception( + php_io_poll_inactive_watcher_class_entry, "Cannot modify inactive watcher", 0); + return FAILURE; + } + + /* Update user data */ + zval_ptr_dtor(&watcher->data); + ZVAL_COPY(&watcher->data, data); + + return SUCCESS; +} + +/* PHP Method Implementations */ + +PHP_METHOD(Io_Poll_Backend, getAvailableBackends) +{ + ZEND_PARSE_PARAMETERS_NONE(); + + array_init(return_value); + + /* Check each backend type for availability */ + php_poll_backend_type backends[] = {PHP_POLL_BACKEND_POLL, PHP_POLL_BACKEND_EPOLL, + PHP_POLL_BACKEND_KQUEUE, PHP_POLL_BACKEND_EVENTPORT, PHP_POLL_BACKEND_WSAPOLL}; + + for (size_t i = 0; i < sizeof(backends) / sizeof(backends[0]); i++) { + if (php_poll_is_backend_available(backends[i])) { + const char *name = php_io_poll_backend_type_to_name(backends[i]); + zval enum_case; + ZVAL_OBJ_COPY(&enum_case, zend_enum_get_case_cstr(php_io_poll_backend_class_entry, name)); + add_next_index_zval(return_value, &enum_case); + } + } +} + +PHP_METHOD(Io_Poll_Backend, isAvailable) +{ + ZEND_PARSE_PARAMETERS_NONE(); + + zend_object *enum_obj = Z_OBJ_P(ZEND_THIS); + php_poll_backend_type type = php_io_poll_backend_enum_to_type(enum_obj); + + RETURN_BOOL(php_poll_is_backend_available(type)); +} + +PHP_METHOD(Io_Poll_Backend, supportsEdgeTriggering) +{ + ZEND_PARSE_PARAMETERS_NONE(); + + zend_object *enum_obj = Z_OBJ_P(ZEND_THIS); + php_poll_backend_type type = php_io_poll_backend_enum_to_type(enum_obj); + + RETURN_BOOL(php_poll_backend_supports_edge_triggering(type)); +} + +PHP_METHOD(StreamPollHandle, __construct) +{ + php_stream *stream; + + ZEND_PARSE_PARAMETERS_START(1, 1) + PHP_Z_PARAM_STREAM(stream) + ZEND_PARSE_PARAMETERS_END(); + + php_poll_handle_object *intern = PHP_POLL_HANDLE_OBJ_FROM_ZV(getThis()); + + if (intern->handle_data) { + zend_throw_error(NULL, "StreamPollHandle object is already constructed"); + RETURN_THROWS(); + } + + /* Set up stream-specific data */ + php_stream_poll_handle_data *data = emalloc(sizeof(php_stream_poll_handle_data)); + data->stream = stream; + data->res = stream->res; + intern->handle_data = data; + + /* Add reference to stream */ + GC_ADDREF(data->res); +} + +PHP_METHOD(StreamPollHandle, getStream) +{ + ZEND_PARSE_PARAMETERS_NONE(); + + php_poll_handle_object *intern = PHP_POLL_HANDLE_OBJ_FROM_ZV(getThis()); + php_stream_poll_handle_data *data = intern->handle_data; + + if (!data || !data->stream) { + RETURN_NULL(); + } + + GC_ADDREF(data->stream->res); + php_stream_to_zval(data->stream, return_value); +} + +PHP_METHOD(StreamPollHandle, isValid) +{ + ZEND_PARSE_PARAMETERS_NONE(); + + php_poll_handle_object *intern = PHP_POLL_HANDLE_OBJ_FROM_ZV(getThis()); + RETURN_BOOL(intern->ops->is_valid(intern)); +} + +PHP_METHOD(StreamPollHandle, getFileDescriptor) +{ + ZEND_PARSE_PARAMETERS_NONE(); + + php_poll_handle_object *intern = PHP_POLL_HANDLE_OBJ_FROM_ZV(getThis()); + php_socket_t fd = php_poll_handle_get_fd(intern); + + if (fd == SOCK_ERR) { + RETURN_LONG(0); + } + + RETURN_LONG((zend_long) fd); +} + +PHP_METHOD(Io_Poll_Watcher, __construct) +{ + zend_throw_error(NULL, "Cannot directly construct Watcher, use Context::add"); +} + +PHP_METHOD(Io_Poll_Watcher, getHandle) +{ + ZEND_PARSE_PARAMETERS_NONE(); + + php_io_poll_watcher_object *intern = PHP_POLL_WATCHER_OBJ_FROM_ZV(getThis()); + if (!intern->handle) { + RETURN_NULL(); + } + + RETURN_OBJ_COPY(&intern->handle->std); +} + +PHP_METHOD(Io_Poll_Watcher, getWatchedEvents) +{ + ZEND_PARSE_PARAMETERS_NONE(); + + php_io_poll_watcher_object *intern = PHP_POLL_WATCHER_OBJ_FROM_ZV(getThis()); + php_io_poll_events_to_event_enums(intern->watched_events, return_value); +} + +PHP_METHOD(Io_Poll_Watcher, getTriggeredEvents) +{ + ZEND_PARSE_PARAMETERS_NONE(); + + php_io_poll_watcher_object *intern = PHP_POLL_WATCHER_OBJ_FROM_ZV(getThis()); + php_io_poll_events_to_event_enums(intern->triggered_events, return_value); +} + +PHP_METHOD(Io_Poll_Watcher, getData) +{ + ZEND_PARSE_PARAMETERS_NONE(); + + php_io_poll_watcher_object *intern = PHP_POLL_WATCHER_OBJ_FROM_ZV(getThis()); + ZVAL_COPY(return_value, &intern->data); +} + +PHP_METHOD(Io_Poll_Watcher, hasTriggered) +{ + zval *event_enum; + + ZEND_PARSE_PARAMETERS_START(1, 1) + Z_PARAM_OBJECT_OF_CLASS(event_enum, php_io_poll_event_class_entry) + ZEND_PARSE_PARAMETERS_END(); + + uint32_t event_bit = php_io_poll_event_enum_to_bit(Z_OBJ_P(event_enum)); + + php_io_poll_watcher_object *intern = PHP_POLL_WATCHER_OBJ_FROM_ZV(getThis()); + RETURN_BOOL((intern->triggered_events & event_bit) != 0); +} + +PHP_METHOD(Io_Poll_Watcher, isActive) +{ + ZEND_PARSE_PARAMETERS_NONE(); + + php_io_poll_watcher_object *intern = PHP_POLL_WATCHER_OBJ_FROM_ZV(getThis()); + RETURN_BOOL(intern->active); +} + +PHP_METHOD(Io_Poll_Watcher, modify) +{ + zval *event_enums; + zval *data = NULL; + + ZEND_PARSE_PARAMETERS_START(1, 2) + Z_PARAM_ARRAY(event_enums) + Z_PARAM_OPTIONAL + Z_PARAM_ZVAL(data) + ZEND_PARSE_PARAMETERS_END(); + + uint32_t events = php_io_poll_event_enums_to_events(event_enums); + if (!events) { + zend_argument_type_error(1, "must be array of Event enums"); + RETURN_THROWS(); + } + + php_io_poll_watcher_object *intern = PHP_POLL_WATCHER_OBJ_FROM_ZV(getThis()); + + /* Modify events first */ + if (php_io_poll_watcher_modify_events(intern, events) != SUCCESS) { + RETURN_THROWS(); + } + + /* Then modify data if provided */ + if (data) { + if (php_io_poll_watcher_modify_data(intern, data) != SUCCESS) { + RETURN_THROWS(); + } + } +} + +PHP_METHOD(Io_Poll_Watcher, modifyEvents) +{ + zval *event_enums; + + ZEND_PARSE_PARAMETERS_START(1, 1) + Z_PARAM_ARRAY(event_enums) + ZEND_PARSE_PARAMETERS_END(); + + uint32_t events = php_io_poll_event_enums_to_events(event_enums); + if (!events) { + zend_argument_type_error(1, "must be array of Event enums"); + RETURN_THROWS(); + } + + php_io_poll_watcher_object *intern = PHP_POLL_WATCHER_OBJ_FROM_ZV(getThis()); + + if (php_io_poll_watcher_modify_events(intern, events) != SUCCESS) { + RETURN_THROWS(); + } +} + +PHP_METHOD(Io_Poll_Watcher, modifyData) +{ + zval *data; + + ZEND_PARSE_PARAMETERS_START(1, 1) + Z_PARAM_ZVAL(data) + ZEND_PARSE_PARAMETERS_END(); + + php_io_poll_watcher_object *intern = PHP_POLL_WATCHER_OBJ_FROM_ZV(getThis()); + + if (php_io_poll_watcher_modify_data(intern, data) != SUCCESS) { + RETURN_THROWS(); + } +} + +PHP_METHOD(Io_Poll_Watcher, remove) +{ + ZEND_PARSE_PARAMETERS_NONE(); + + php_io_poll_watcher_object *intern = PHP_POLL_WATCHER_OBJ_FROM_ZV(getThis()); + + if (!intern->active || !intern->poll_ctx) { + zend_throw_exception( + php_io_poll_inactive_watcher_class_entry, "Cannot remove inactive watcher", 0); + RETURN_THROWS(); + } + + php_socket_t fd = php_poll_handle_get_fd(intern->handle); + if (fd != SOCK_ERR) { + php_poll_remove(intern->poll_ctx, (int) fd); + } + + intern->active = false; + intern->poll_ctx = NULL; +} + +PHP_METHOD(Io_Poll_Context, __construct) +{ + zval *backend_obj = NULL; + + ZEND_PARSE_PARAMETERS_START(0, 1) + Z_PARAM_OPTIONAL + Z_PARAM_OBJECT_OF_CLASS(backend_obj, php_io_poll_backend_class_entry) + ZEND_PARSE_PARAMETERS_END(); + + php_io_poll_context_object *intern = PHP_POLL_CONTEXT_OBJ_FROM_ZV(getThis()); + + if (intern->ctx) { + zend_throw_error(NULL, "Io\\Poll\\Context object is already constructed"); + RETURN_THROWS(); + } + + php_poll_backend_type backend_type = PHP_POLL_BACKEND_AUTO; + if (backend_obj != NULL) { + backend_type = php_io_poll_backend_enum_to_type(Z_OBJ_P(backend_obj)); + } + + intern->ctx = php_poll_create(backend_type, 0); + + if (!intern->ctx) { + zend_throw_exception_ex( + php_io_poll_failed_backend_unavailable_class_entry, 0, "Backend %s not available", + php_io_poll_backend_type_to_name(backend_type)); + RETURN_THROWS(); + } + + if (php_poll_init(intern->ctx) != SUCCESS) { + php_poll_error err = php_poll_get_error(intern->ctx); + php_poll_destroy(intern->ctx); + intern->ctx = NULL; + php_io_poll_throw_failed_operation(php_io_poll_failed_context_init_class_entry, + "Failed to initialize polling context", err); + RETURN_THROWS(); + } + + intern->watchers = emalloc(sizeof(HashTable)); + zend_hash_init(intern->watchers, 8, NULL, ZVAL_PTR_DTOR, 0); +} + +PHP_METHOD(Io_Poll_Context, add) +{ + zval *handle_obj, *event_enums; + uint32_t events; + zval *data = NULL; + + ZEND_PARSE_PARAMETERS_START(2, 3) + Z_PARAM_OBJECT_OF_CLASS(handle_obj, php_io_poll_handle_class_entry) + Z_PARAM_ARRAY(event_enums) + Z_PARAM_OPTIONAL + Z_PARAM_ZVAL(data) + ZEND_PARSE_PARAMETERS_END(); + + php_io_poll_context_object *intern = PHP_POLL_CONTEXT_OBJ_FROM_ZV(getThis()); + php_poll_handle_object *handle = PHP_POLL_HANDLE_OBJ_FROM_ZV(handle_obj); + + /* Get file descriptor */ + php_socket_t fd = php_poll_handle_get_fd(handle); + if (fd == SOCK_ERR) { + zend_throw_exception( + php_io_poll_invalid_handle_class_entry, "Invalid handle for polling", 0); + RETURN_THROWS(); + } + + /* Create watcher object */ + object_init_ex(return_value, php_io_poll_watcher_class_entry); + php_io_poll_watcher_object *watcher = PHP_POLL_WATCHER_OBJ_FROM_ZV(return_value); + + events = php_io_poll_event_enums_to_events(event_enums); + if (!events) { + zend_argument_type_error(2, "must be array of Event enums"); + RETURN_THROWS(); + } + + watcher->handle = handle; + watcher->watched_events = events; + watcher->triggered_events = 0; + watcher->active = true; + watcher->poll_ctx = intern->ctx; + + GC_ADDREF(&handle->std); + + if (data) { + ZVAL_COPY(&watcher->data, data); + } else { + ZVAL_NULL(&watcher->data); + } + + /* Add to poll context */ + if (php_poll_add(intern->ctx, (int) fd, events, watcher) != SUCCESS) { + php_poll_error err = php_poll_get_error(intern->ctx); + if (err == PHP_POLL_ERR_EXISTS) { + zend_throw_exception( + php_io_poll_handle_already_watched_class_entry, "Handle already added", 0); + } else { + php_io_poll_throw_failed_operation( + php_io_poll_failed_handle_add_class_entry, "Failed to add handle", err); + } + RETURN_THROWS(); + } + + /* Store in our watchers map using shifted pointer as key */ + zval watcher_zv; + ZVAL_OBJ(&watcher_zv, &watcher->std); + GC_ADDREF(&watcher->std); + + zend_ulong hash_key = php_io_poll_compute_ptr_key(handle); + zend_hash_index_add(intern->watchers, hash_key, &watcher_zv); +} + +PHP_METHOD(Io_Poll_Context, wait) +{ + zend_long timeout_seconds = -1; + bool timeout_seconds_is_null = true; + zend_long timeout_microseconds = 0; + zend_long max_events = 0; + bool max_events_is_null = true; + + ZEND_PARSE_PARAMETERS_START(0, 3) + Z_PARAM_OPTIONAL + Z_PARAM_LONG_OR_NULL(timeout_seconds, timeout_seconds_is_null) + Z_PARAM_LONG(timeout_microseconds) + Z_PARAM_LONG_OR_NULL(max_events, max_events_is_null) + ZEND_PARSE_PARAMETERS_END(); + + php_io_poll_context_object *intern = PHP_POLL_CONTEXT_OBJ_FROM_ZV(getThis()); + + /* Build timespec from seconds + microseconds, or NULL for indefinite */ + struct timespec ts; + const struct timespec *timeout = NULL; + if (timeout_seconds >= 0) { + if (timeout_microseconds < 0) { + zend_argument_value_error(2, "must be greater than or equal to 0"); + RETURN_THROWS(); + } + + /* Allow microseconds >= 1000000, carry overflow into seconds + * (same behavior as stream_select) */ + ts.tv_sec = (time_t) (timeout_seconds + (timeout_microseconds / 1000000)); + ts.tv_nsec = (long) ((timeout_microseconds % 1000000) * 1000); + timeout = &ts; + } else if (!timeout_seconds_is_null) { + zend_argument_value_error(1, "must be greater than or equal to 0"); + RETURN_THROWS(); + } + + if (max_events_is_null) { + max_events = php_poll_get_suitable_max_events(intern->ctx); + if (max_events <= 0) { + max_events = 64; + } + } else if (max_events <= 0) { + zend_argument_value_error(3, "must be greater than 0"); + RETURN_THROWS(); + } + + php_poll_event *events = safe_emalloc(max_events, sizeof(*events), 0); + int num_events = php_poll_wait(intern->ctx, events, (int) max_events, timeout); + + if (num_events < 0) { + php_poll_error err = php_poll_get_error(intern->ctx); + efree(events); + php_io_poll_throw_failed_operation( + php_io_poll_failed_wait_class_entry, "Poll wait failed", err); + RETURN_THROWS(); + } + + array_init(return_value); + + for (int i = 0; i < num_events; i++) { + php_io_poll_watcher_object *watcher = (php_io_poll_watcher_object *) events[i].data; + if (watcher) { + watcher->triggered_events = events[i].revents; + + zval watcher_zv; + ZVAL_OBJ(&watcher_zv, &watcher->std); + GC_ADDREF(&watcher->std); + + add_next_index_zval(return_value, &watcher_zv); + } + } + + efree(events); +} + +PHP_METHOD(Io_Poll_Context, getBackend) +{ + ZEND_PARSE_PARAMETERS_NONE(); + + php_io_poll_context_object *intern = PHP_POLL_CONTEXT_OBJ_FROM_ZV(getThis()); + php_poll_backend_type backend_type = php_poll_get_backend_type(intern->ctx); + const char *backend_name = php_io_poll_backend_type_to_name(backend_type); + + RETURN_OBJ_COPY(zend_enum_get_case_cstr(php_io_poll_backend_class_entry, backend_name)); +} + +/* Initialize the stream poll classes - add to PHP_MINIT_FUNCTION */ +PHP_MINIT_FUNCTION(poll) +{ + /* Register backend enum */ + php_io_poll_backend_class_entry = register_class_Io_Poll_Backend(); + + /* Register event enum */ + php_io_poll_event_class_entry = register_class_Io_Poll_Event(); + + /* Register Handle interface */ + php_io_poll_handle_class_entry = register_class_Io_Poll_Handle(); + php_io_poll_handle_class_entry->interface_gets_implemented = php_stream_poll_handle_implement_interface; + + /* Register StreamPollHandle class */ + php_stream_poll_handle_class_entry + = register_class_StreamPollHandle(php_io_poll_handle_class_entry); + php_stream_poll_handle_class_entry->create_object = php_stream_poll_handle_create_object; + + memcpy(&php_io_poll_handle_object_handlers, &std_object_handlers, sizeof(zend_object_handlers)); + php_io_poll_handle_object_handlers.offset = offsetof(php_poll_handle_object, std); + php_io_poll_handle_object_handlers.free_obj = php_poll_handle_object_free; + php_io_poll_handle_object_handlers.clone_obj = NULL; + php_stream_poll_handle_class_entry->default_object_handlers = &php_io_poll_handle_object_handlers; + + /* Register Watcher class */ + php_io_poll_watcher_class_entry = register_class_Io_Poll_Watcher(); + php_io_poll_watcher_class_entry->create_object = php_io_poll_watcher_create_object; + + memcpy(&php_io_poll_watcher_object_handlers, &std_object_handlers, + sizeof(zend_object_handlers)); + php_io_poll_watcher_object_handlers.offset = offsetof(php_io_poll_watcher_object, std); + php_io_poll_watcher_object_handlers.free_obj = php_io_poll_watcher_free_object; + php_io_poll_watcher_object_handlers.get_gc = php_io_poll_watcher_get_gc; + php_io_poll_watcher_object_handlers.clone_obj = NULL; + php_io_poll_watcher_class_entry->default_object_handlers = &php_io_poll_watcher_object_handlers; + + /* Register Context class */ + php_io_poll_context_class_entry = register_class_Io_Poll_Context(); + php_io_poll_context_class_entry->create_object = php_io_poll_context_create_object; + + memcpy(&php_io_poll_context_object_handlers, &std_object_handlers, + sizeof(zend_object_handlers)); + php_io_poll_context_object_handlers.offset = offsetof(php_io_poll_context_object, std); + php_io_poll_context_object_handlers.free_obj = php_io_poll_context_free_object; + php_io_poll_context_object_handlers.get_gc = php_io_poll_context_get_gc; + php_io_poll_context_object_handlers.clone_obj = NULL; + php_io_poll_context_class_entry->default_object_handlers = &php_io_poll_context_object_handlers; + + /* Register exception hierarchy */ + php_io_exception_class_entry = register_class_Io_IoException(zend_ce_exception); + + php_io_poll_exception_class_entry + = register_class_Io_Poll_PollException(php_io_exception_class_entry); + + php_io_poll_failed_operation_class_entry = register_class_Io_Poll_FailedPollOperationException( + php_io_poll_exception_class_entry); + + php_io_poll_failed_context_init_class_entry + = register_class_Io_Poll_FailedContextInitializationException( + php_io_poll_failed_operation_class_entry); + + php_io_poll_failed_handle_add_class_entry = register_class_Io_Poll_FailedHandleAddException( + php_io_poll_failed_operation_class_entry); + + php_io_poll_failed_watcher_mod_class_entry + = register_class_Io_Poll_FailedWatcherModificationException( + php_io_poll_failed_operation_class_entry); + + php_io_poll_failed_wait_class_entry = register_class_Io_Poll_FailedPollWaitException( + php_io_poll_failed_operation_class_entry); + + php_io_poll_failed_backend_unavailable_class_entry = register_class_Io_Poll_BackendUnavailableException( + php_io_poll_exception_class_entry); + + php_io_poll_inactive_watcher_class_entry = register_class_Io_Poll_InactiveWatcherException( + php_io_poll_exception_class_entry); + + php_io_poll_handle_already_watched_class_entry + = register_class_Io_Poll_HandleAlreadyWatchedException( + php_io_poll_exception_class_entry); + + php_io_poll_invalid_handle_class_entry + = register_class_Io_Poll_InvalidHandleException(php_io_poll_exception_class_entry); + + /* Initialize polling backends */ + php_poll_register_backends(); + + return SUCCESS; +} diff --git a/ext/standard/io_poll.stub.php b/ext/standard/io_poll.stub.php new file mode 100644 index 000000000000..83c1ba5cbe2e --- /dev/null +++ b/ext/standard/io_poll.stub.php @@ -0,0 +1,167 @@ + */ + static public function getAvailableBackends(): array {} + + public function isAvailable(): bool {} + + public function supportsEdgeTriggering(): bool {} + } + + // Keep in sync with main/php_poll.h! + enum Event { + case Read; + case Write; + case Error; + case HangUp; + case ReadHangUp; + case OneShot; + case EdgeTriggered; + } + + interface Handle + { + } + + /** + * @strict-properties + * @not-serializable + */ + final class Watcher + { + private final function __construct() {} + + public function getHandle(): Handle {} + + /** @return list */ + public function getWatchedEvents(): array {} + + /** @return list */ + public function getTriggeredEvents(): array {} + + public function getData(): mixed {} + + public function hasTriggered(Event $event): bool {} + + public function isActive(): bool {} + + public function modify(array $events, mixed $data = null): void {} + + public function modifyEvents(array $events): void {} + + public function modifyData(mixed $data): void {} + + public function remove(): void {} + } + + /** + * @strict-properties + * @not-serializable + */ + final class Context + { + public function __construct(Backend $backend = Backend::Auto) {} + + public function add(Handle $handle, array $events, mixed $data = null): Watcher {} + + /** @return list */ + public function wait(?int $timeoutSeconds = null, int $timeoutMicroseconds = 0, ?int $maxEvents = null): array {} + + public function getBackend(): Backend {} + } + + class PollException extends \Io\IoException {} + + abstract class FailedPollOperationException extends PollException + { + /** @cvalue PHP_POLL_ERROR_CODE_NONE */ + public const int ERROR_NONE = UNKNOWN; + + /** @cvalue PHP_POLL_ERROR_CODE_SYSTEM */ + public const int ERROR_SYSTEM = UNKNOWN; + + /** @cvalue PHP_POLL_ERROR_CODE_NOMEM */ + public const int ERROR_NOMEM = UNKNOWN; + + /** @cvalue PHP_POLL_ERROR_CODE_INVALID */ + public const int ERROR_INVALID = UNKNOWN; + + /** @cvalue PHP_POLL_ERROR_CODE_EXISTS */ + public const int ERROR_EXISTS = UNKNOWN; + + /** @cvalue PHP_POLL_ERROR_CODE_NOTFOUND */ + public const int ERROR_NOTFOUND = UNKNOWN; + + /** @cvalue PHP_POLL_ERROR_CODE_TIMEOUT */ + public const int ERROR_TIMEOUT = UNKNOWN; + + /** @cvalue PHP_POLL_ERROR_CODE_INTERRUPTED */ + public const int ERROR_INTERRUPTED = UNKNOWN; + + /** @cvalue PHP_POLL_ERROR_CODE_PERMISSION */ + public const int ERROR_PERMISSION = UNKNOWN; + + /** @cvalue PHP_POLL_ERROR_CODE_TOOBIG */ + public const int ERROR_TOOBIG = UNKNOWN; + + /** @cvalue PHP_POLL_ERROR_CODE_AGAIN */ + public const int ERROR_AGAIN = UNKNOWN; + + /** @cvalue PHP_POLL_ERROR_CODE_NOSUPPORT */ + public const int ERROR_NOSUPPORT = UNKNOWN; + } + + class FailedContextInitializationException extends FailedPollOperationException {} + + class FailedHandleAddException extends FailedPollOperationException {} + + class FailedWatcherModificationException extends FailedPollOperationException {} + + class FailedPollWaitException extends FailedPollOperationException {} + + class BackendUnavailableException extends PollException {} + + class InactiveWatcherException extends PollException {} + + class HandleAlreadyWatchedException extends PollException {} + + class InvalidHandleException extends PollException {} +} + +namespace { + /** + * @strict-properties + * @not-serializable + */ + final class StreamPollHandle implements Io\Poll\Handle + { + /** @param resource $stream */ + public function __construct($stream) {} + + /** @return resource */ + public function getStream() {} + + public function isValid(): bool {} + } +} diff --git a/ext/standard/io_poll_arginfo.h b/ext/standard/io_poll_arginfo.h new file mode 100644 index 000000000000..5fc62f629564 --- /dev/null +++ b/ext/standard/io_poll_arginfo.h @@ -0,0 +1,395 @@ +/* This is a generated file, edit io_poll.stub.php instead. + * Stub hash: a7450146c5b3b3f3486611c83a55cf0cc932b27a + * Has decl header: yes */ + +ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_class_Io_Poll_Backend_getAvailableBackends, 0, 0, IS_ARRAY, 0) +ZEND_END_ARG_INFO() + +ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_class_Io_Poll_Backend_isAvailable, 0, 0, _IS_BOOL, 0) +ZEND_END_ARG_INFO() + +#define arginfo_class_Io_Poll_Backend_supportsEdgeTriggering arginfo_class_Io_Poll_Backend_isAvailable + +ZEND_BEGIN_ARG_INFO_EX(arginfo_class_Io_Poll_Watcher___construct, 0, 0, 0) +ZEND_END_ARG_INFO() + +ZEND_BEGIN_ARG_WITH_RETURN_OBJ_INFO_EX(arginfo_class_Io_Poll_Watcher_getHandle, 0, 0, Io\\Poll\\Handle, 0) +ZEND_END_ARG_INFO() + +#define arginfo_class_Io_Poll_Watcher_getWatchedEvents arginfo_class_Io_Poll_Backend_getAvailableBackends + +#define arginfo_class_Io_Poll_Watcher_getTriggeredEvents arginfo_class_Io_Poll_Backend_getAvailableBackends + +ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_class_Io_Poll_Watcher_getData, 0, 0, IS_MIXED, 0) +ZEND_END_ARG_INFO() + +ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_class_Io_Poll_Watcher_hasTriggered, 0, 1, _IS_BOOL, 0) + ZEND_ARG_OBJ_INFO(0, event, Io\\Poll\\Event, 0) +ZEND_END_ARG_INFO() + +#define arginfo_class_Io_Poll_Watcher_isActive arginfo_class_Io_Poll_Backend_isAvailable + +ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_class_Io_Poll_Watcher_modify, 0, 1, IS_VOID, 0) + ZEND_ARG_TYPE_INFO(0, events, IS_ARRAY, 0) + ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, data, IS_MIXED, 0, "null") +ZEND_END_ARG_INFO() + +ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_class_Io_Poll_Watcher_modifyEvents, 0, 1, IS_VOID, 0) + ZEND_ARG_TYPE_INFO(0, events, IS_ARRAY, 0) +ZEND_END_ARG_INFO() + +ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_class_Io_Poll_Watcher_modifyData, 0, 1, IS_VOID, 0) + ZEND_ARG_TYPE_INFO(0, data, IS_MIXED, 0) +ZEND_END_ARG_INFO() + +ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_class_Io_Poll_Watcher_remove, 0, 0, IS_VOID, 0) +ZEND_END_ARG_INFO() + +ZEND_BEGIN_ARG_INFO_EX(arginfo_class_Io_Poll_Context___construct, 0, 0, 0) + ZEND_ARG_OBJ_INFO_WITH_DEFAULT_VALUE(0, backend, Io\\Poll\\Backend, 0, "Io\\Poll\\Backend::Auto") +ZEND_END_ARG_INFO() + +ZEND_BEGIN_ARG_WITH_RETURN_OBJ_INFO_EX(arginfo_class_Io_Poll_Context_add, 0, 2, Io\\Poll\\Watcher, 0) + ZEND_ARG_OBJ_INFO(0, handle, Io\\Poll\\Handle, 0) + ZEND_ARG_TYPE_INFO(0, events, IS_ARRAY, 0) + ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, data, IS_MIXED, 0, "null") +ZEND_END_ARG_INFO() + +ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_class_Io_Poll_Context_wait, 0, 0, IS_ARRAY, 0) + ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, timeoutSeconds, IS_LONG, 1, "null") + ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, timeoutMicroseconds, IS_LONG, 0, "0") + ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, maxEvents, IS_LONG, 1, "null") +ZEND_END_ARG_INFO() + +ZEND_BEGIN_ARG_WITH_RETURN_OBJ_INFO_EX(arginfo_class_Io_Poll_Context_getBackend, 0, 0, Io\\Poll\\Backend, 0) +ZEND_END_ARG_INFO() + +ZEND_BEGIN_ARG_INFO_EX(arginfo_class_StreamPollHandle___construct, 0, 0, 1) + ZEND_ARG_INFO(0, stream) +ZEND_END_ARG_INFO() + +#define arginfo_class_StreamPollHandle_getStream arginfo_class_Io_Poll_Watcher___construct + +#define arginfo_class_StreamPollHandle_isValid arginfo_class_Io_Poll_Backend_isAvailable + +ZEND_METHOD(Io_Poll_Backend, getAvailableBackends); +ZEND_METHOD(Io_Poll_Backend, isAvailable); +ZEND_METHOD(Io_Poll_Backend, supportsEdgeTriggering); +ZEND_METHOD(Io_Poll_Watcher, __construct); +ZEND_METHOD(Io_Poll_Watcher, getHandle); +ZEND_METHOD(Io_Poll_Watcher, getWatchedEvents); +ZEND_METHOD(Io_Poll_Watcher, getTriggeredEvents); +ZEND_METHOD(Io_Poll_Watcher, getData); +ZEND_METHOD(Io_Poll_Watcher, hasTriggered); +ZEND_METHOD(Io_Poll_Watcher, isActive); +ZEND_METHOD(Io_Poll_Watcher, modify); +ZEND_METHOD(Io_Poll_Watcher, modifyEvents); +ZEND_METHOD(Io_Poll_Watcher, modifyData); +ZEND_METHOD(Io_Poll_Watcher, remove); +ZEND_METHOD(Io_Poll_Context, __construct); +ZEND_METHOD(Io_Poll_Context, add); +ZEND_METHOD(Io_Poll_Context, wait); +ZEND_METHOD(Io_Poll_Context, getBackend); +ZEND_METHOD(StreamPollHandle, __construct); +ZEND_METHOD(StreamPollHandle, getStream); +ZEND_METHOD(StreamPollHandle, isValid); + +static const zend_function_entry class_Io_Poll_Backend_methods[] = { + ZEND_ME(Io_Poll_Backend, getAvailableBackends, arginfo_class_Io_Poll_Backend_getAvailableBackends, ZEND_ACC_PUBLIC|ZEND_ACC_STATIC) + ZEND_ME(Io_Poll_Backend, isAvailable, arginfo_class_Io_Poll_Backend_isAvailable, ZEND_ACC_PUBLIC) + ZEND_ME(Io_Poll_Backend, supportsEdgeTriggering, arginfo_class_Io_Poll_Backend_supportsEdgeTriggering, ZEND_ACC_PUBLIC) + ZEND_FE_END +}; + +static const zend_function_entry class_Io_Poll_Watcher_methods[] = { + ZEND_ME(Io_Poll_Watcher, __construct, arginfo_class_Io_Poll_Watcher___construct, ZEND_ACC_PRIVATE|ZEND_ACC_FINAL) + ZEND_ME(Io_Poll_Watcher, getHandle, arginfo_class_Io_Poll_Watcher_getHandle, ZEND_ACC_PUBLIC) + ZEND_ME(Io_Poll_Watcher, getWatchedEvents, arginfo_class_Io_Poll_Watcher_getWatchedEvents, ZEND_ACC_PUBLIC) + ZEND_ME(Io_Poll_Watcher, getTriggeredEvents, arginfo_class_Io_Poll_Watcher_getTriggeredEvents, ZEND_ACC_PUBLIC) + ZEND_ME(Io_Poll_Watcher, getData, arginfo_class_Io_Poll_Watcher_getData, ZEND_ACC_PUBLIC) + ZEND_ME(Io_Poll_Watcher, hasTriggered, arginfo_class_Io_Poll_Watcher_hasTriggered, ZEND_ACC_PUBLIC) + ZEND_ME(Io_Poll_Watcher, isActive, arginfo_class_Io_Poll_Watcher_isActive, ZEND_ACC_PUBLIC) + ZEND_ME(Io_Poll_Watcher, modify, arginfo_class_Io_Poll_Watcher_modify, ZEND_ACC_PUBLIC) + ZEND_ME(Io_Poll_Watcher, modifyEvents, arginfo_class_Io_Poll_Watcher_modifyEvents, ZEND_ACC_PUBLIC) + ZEND_ME(Io_Poll_Watcher, modifyData, arginfo_class_Io_Poll_Watcher_modifyData, ZEND_ACC_PUBLIC) + ZEND_ME(Io_Poll_Watcher, remove, arginfo_class_Io_Poll_Watcher_remove, ZEND_ACC_PUBLIC) + ZEND_FE_END +}; + +static const zend_function_entry class_Io_Poll_Context_methods[] = { + ZEND_ME(Io_Poll_Context, __construct, arginfo_class_Io_Poll_Context___construct, ZEND_ACC_PUBLIC) + ZEND_ME(Io_Poll_Context, add, arginfo_class_Io_Poll_Context_add, ZEND_ACC_PUBLIC) + ZEND_ME(Io_Poll_Context, wait, arginfo_class_Io_Poll_Context_wait, ZEND_ACC_PUBLIC) + ZEND_ME(Io_Poll_Context, getBackend, arginfo_class_Io_Poll_Context_getBackend, ZEND_ACC_PUBLIC) + ZEND_FE_END +}; + +static const zend_function_entry class_StreamPollHandle_methods[] = { + ZEND_ME(StreamPollHandle, __construct, arginfo_class_StreamPollHandle___construct, ZEND_ACC_PUBLIC) + ZEND_ME(StreamPollHandle, getStream, arginfo_class_StreamPollHandle_getStream, ZEND_ACC_PUBLIC) + ZEND_ME(StreamPollHandle, isValid, arginfo_class_StreamPollHandle_isValid, ZEND_ACC_PUBLIC) + ZEND_FE_END +}; + +static zend_class_entry *register_class_Io_IoException(zend_class_entry *class_entry_Exception) +{ + zend_class_entry ce, *class_entry; + + INIT_NS_CLASS_ENTRY(ce, "Io", "IoException", NULL); + class_entry = zend_register_internal_class_with_flags(&ce, class_entry_Exception, 0); + + return class_entry; +} + +static zend_class_entry *register_class_Io_Poll_Backend(void) +{ + zend_class_entry *class_entry = zend_register_internal_enum("Io\\Poll\\Backend", IS_UNDEF, class_Io_Poll_Backend_methods); + + zend_enum_add_case_cstr(class_entry, "Auto", NULL); + + zend_enum_add_case_cstr(class_entry, "Poll", NULL); + + zend_enum_add_case_cstr(class_entry, "Epoll", NULL); + + zend_enum_add_case_cstr(class_entry, "Kqueue", NULL); + + zend_enum_add_case_cstr(class_entry, "EventPorts", NULL); + + zend_enum_add_case_cstr(class_entry, "WSAPoll", NULL); + + return class_entry; +} + +static zend_class_entry *register_class_Io_Poll_Event(void) +{ + zend_class_entry *class_entry = zend_register_internal_enum("Io\\Poll\\Event", IS_UNDEF, NULL); + + zend_enum_add_case_cstr(class_entry, "Read", NULL); + + zend_enum_add_case_cstr(class_entry, "Write", NULL); + + zend_enum_add_case_cstr(class_entry, "Error", NULL); + + zend_enum_add_case_cstr(class_entry, "HangUp", NULL); + + zend_enum_add_case_cstr(class_entry, "ReadHangUp", NULL); + + zend_enum_add_case_cstr(class_entry, "OneShot", NULL); + + zend_enum_add_case_cstr(class_entry, "EdgeTriggered", NULL); + + return class_entry; +} + +static zend_class_entry *register_class_Io_Poll_Handle(void) +{ + zend_class_entry ce, *class_entry; + + INIT_NS_CLASS_ENTRY(ce, "Io\\Poll", "Handle", NULL); + class_entry = zend_register_internal_interface(&ce); + + return class_entry; +} + +static zend_class_entry *register_class_Io_Poll_Watcher(void) +{ + zend_class_entry ce, *class_entry; + + INIT_NS_CLASS_ENTRY(ce, "Io\\Poll", "Watcher", class_Io_Poll_Watcher_methods); + class_entry = zend_register_internal_class_with_flags(&ce, NULL, ZEND_ACC_FINAL|ZEND_ACC_NO_DYNAMIC_PROPERTIES|ZEND_ACC_NOT_SERIALIZABLE); + + return class_entry; +} + +static zend_class_entry *register_class_Io_Poll_Context(void) +{ + zend_class_entry ce, *class_entry; + + INIT_NS_CLASS_ENTRY(ce, "Io\\Poll", "Context", class_Io_Poll_Context_methods); + class_entry = zend_register_internal_class_with_flags(&ce, NULL, ZEND_ACC_FINAL|ZEND_ACC_NO_DYNAMIC_PROPERTIES|ZEND_ACC_NOT_SERIALIZABLE); + + return class_entry; +} + +static zend_class_entry *register_class_Io_Poll_PollException(zend_class_entry *class_entry_Io_IoException) +{ + zend_class_entry ce, *class_entry; + + INIT_NS_CLASS_ENTRY(ce, "Io\\Poll", "PollException", NULL); + class_entry = zend_register_internal_class_with_flags(&ce, class_entry_Io_IoException, 0); + + return class_entry; +} + +static zend_class_entry *register_class_Io_Poll_FailedPollOperationException(zend_class_entry *class_entry_Io_Poll_PollException) +{ + zend_class_entry ce, *class_entry; + + INIT_NS_CLASS_ENTRY(ce, "Io\\Poll", "FailedPollOperationException", NULL); + class_entry = zend_register_internal_class_with_flags(&ce, class_entry_Io_Poll_PollException, ZEND_ACC_ABSTRACT); + + zval const_ERROR_NONE_value; + ZVAL_LONG(&const_ERROR_NONE_value, PHP_POLL_ERROR_CODE_NONE); + zend_string *const_ERROR_NONE_name = zend_string_init_interned("ERROR_NONE", sizeof("ERROR_NONE") - 1, true); + zend_declare_typed_class_constant(class_entry, const_ERROR_NONE_name, &const_ERROR_NONE_value, ZEND_ACC_PUBLIC, NULL, (zend_type) ZEND_TYPE_INIT_MASK(MAY_BE_LONG)); + zend_string_release_ex(const_ERROR_NONE_name, true); + + zval const_ERROR_SYSTEM_value; + ZVAL_LONG(&const_ERROR_SYSTEM_value, PHP_POLL_ERROR_CODE_SYSTEM); + zend_string *const_ERROR_SYSTEM_name = zend_string_init_interned("ERROR_SYSTEM", sizeof("ERROR_SYSTEM") - 1, true); + zend_declare_typed_class_constant(class_entry, const_ERROR_SYSTEM_name, &const_ERROR_SYSTEM_value, ZEND_ACC_PUBLIC, NULL, (zend_type) ZEND_TYPE_INIT_MASK(MAY_BE_LONG)); + zend_string_release_ex(const_ERROR_SYSTEM_name, true); + + zval const_ERROR_NOMEM_value; + ZVAL_LONG(&const_ERROR_NOMEM_value, PHP_POLL_ERROR_CODE_NOMEM); + zend_string *const_ERROR_NOMEM_name = zend_string_init_interned("ERROR_NOMEM", sizeof("ERROR_NOMEM") - 1, true); + zend_declare_typed_class_constant(class_entry, const_ERROR_NOMEM_name, &const_ERROR_NOMEM_value, ZEND_ACC_PUBLIC, NULL, (zend_type) ZEND_TYPE_INIT_MASK(MAY_BE_LONG)); + zend_string_release_ex(const_ERROR_NOMEM_name, true); + + zval const_ERROR_INVALID_value; + ZVAL_LONG(&const_ERROR_INVALID_value, PHP_POLL_ERROR_CODE_INVALID); + zend_string *const_ERROR_INVALID_name = zend_string_init_interned("ERROR_INVALID", sizeof("ERROR_INVALID") - 1, true); + zend_declare_typed_class_constant(class_entry, const_ERROR_INVALID_name, &const_ERROR_INVALID_value, ZEND_ACC_PUBLIC, NULL, (zend_type) ZEND_TYPE_INIT_MASK(MAY_BE_LONG)); + zend_string_release_ex(const_ERROR_INVALID_name, true); + + zval const_ERROR_EXISTS_value; + ZVAL_LONG(&const_ERROR_EXISTS_value, PHP_POLL_ERROR_CODE_EXISTS); + zend_string *const_ERROR_EXISTS_name = zend_string_init_interned("ERROR_EXISTS", sizeof("ERROR_EXISTS") - 1, true); + zend_declare_typed_class_constant(class_entry, const_ERROR_EXISTS_name, &const_ERROR_EXISTS_value, ZEND_ACC_PUBLIC, NULL, (zend_type) ZEND_TYPE_INIT_MASK(MAY_BE_LONG)); + zend_string_release_ex(const_ERROR_EXISTS_name, true); + + zval const_ERROR_NOTFOUND_value; + ZVAL_LONG(&const_ERROR_NOTFOUND_value, PHP_POLL_ERROR_CODE_NOTFOUND); + zend_string *const_ERROR_NOTFOUND_name = zend_string_init_interned("ERROR_NOTFOUND", sizeof("ERROR_NOTFOUND") - 1, true); + zend_declare_typed_class_constant(class_entry, const_ERROR_NOTFOUND_name, &const_ERROR_NOTFOUND_value, ZEND_ACC_PUBLIC, NULL, (zend_type) ZEND_TYPE_INIT_MASK(MAY_BE_LONG)); + zend_string_release_ex(const_ERROR_NOTFOUND_name, true); + + zval const_ERROR_TIMEOUT_value; + ZVAL_LONG(&const_ERROR_TIMEOUT_value, PHP_POLL_ERROR_CODE_TIMEOUT); + zend_string *const_ERROR_TIMEOUT_name = zend_string_init_interned("ERROR_TIMEOUT", sizeof("ERROR_TIMEOUT") - 1, true); + zend_declare_typed_class_constant(class_entry, const_ERROR_TIMEOUT_name, &const_ERROR_TIMEOUT_value, ZEND_ACC_PUBLIC, NULL, (zend_type) ZEND_TYPE_INIT_MASK(MAY_BE_LONG)); + zend_string_release_ex(const_ERROR_TIMEOUT_name, true); + + zval const_ERROR_INTERRUPTED_value; + ZVAL_LONG(&const_ERROR_INTERRUPTED_value, PHP_POLL_ERROR_CODE_INTERRUPTED); + zend_string *const_ERROR_INTERRUPTED_name = zend_string_init_interned("ERROR_INTERRUPTED", sizeof("ERROR_INTERRUPTED") - 1, true); + zend_declare_typed_class_constant(class_entry, const_ERROR_INTERRUPTED_name, &const_ERROR_INTERRUPTED_value, ZEND_ACC_PUBLIC, NULL, (zend_type) ZEND_TYPE_INIT_MASK(MAY_BE_LONG)); + zend_string_release_ex(const_ERROR_INTERRUPTED_name, true); + + zval const_ERROR_PERMISSION_value; + ZVAL_LONG(&const_ERROR_PERMISSION_value, PHP_POLL_ERROR_CODE_PERMISSION); + zend_string *const_ERROR_PERMISSION_name = zend_string_init_interned("ERROR_PERMISSION", sizeof("ERROR_PERMISSION") - 1, true); + zend_declare_typed_class_constant(class_entry, const_ERROR_PERMISSION_name, &const_ERROR_PERMISSION_value, ZEND_ACC_PUBLIC, NULL, (zend_type) ZEND_TYPE_INIT_MASK(MAY_BE_LONG)); + zend_string_release_ex(const_ERROR_PERMISSION_name, true); + + zval const_ERROR_TOOBIG_value; + ZVAL_LONG(&const_ERROR_TOOBIG_value, PHP_POLL_ERROR_CODE_TOOBIG); + zend_string *const_ERROR_TOOBIG_name = zend_string_init_interned("ERROR_TOOBIG", sizeof("ERROR_TOOBIG") - 1, true); + zend_declare_typed_class_constant(class_entry, const_ERROR_TOOBIG_name, &const_ERROR_TOOBIG_value, ZEND_ACC_PUBLIC, NULL, (zend_type) ZEND_TYPE_INIT_MASK(MAY_BE_LONG)); + zend_string_release_ex(const_ERROR_TOOBIG_name, true); + + zval const_ERROR_AGAIN_value; + ZVAL_LONG(&const_ERROR_AGAIN_value, PHP_POLL_ERROR_CODE_AGAIN); + zend_string *const_ERROR_AGAIN_name = zend_string_init_interned("ERROR_AGAIN", sizeof("ERROR_AGAIN") - 1, true); + zend_declare_typed_class_constant(class_entry, const_ERROR_AGAIN_name, &const_ERROR_AGAIN_value, ZEND_ACC_PUBLIC, NULL, (zend_type) ZEND_TYPE_INIT_MASK(MAY_BE_LONG)); + zend_string_release_ex(const_ERROR_AGAIN_name, true); + + zval const_ERROR_NOSUPPORT_value; + ZVAL_LONG(&const_ERROR_NOSUPPORT_value, PHP_POLL_ERROR_CODE_NOSUPPORT); + zend_string *const_ERROR_NOSUPPORT_name = zend_string_init_interned("ERROR_NOSUPPORT", sizeof("ERROR_NOSUPPORT") - 1, true); + zend_declare_typed_class_constant(class_entry, const_ERROR_NOSUPPORT_name, &const_ERROR_NOSUPPORT_value, ZEND_ACC_PUBLIC, NULL, (zend_type) ZEND_TYPE_INIT_MASK(MAY_BE_LONG)); + zend_string_release_ex(const_ERROR_NOSUPPORT_name, true); + + return class_entry; +} + +static zend_class_entry *register_class_Io_Poll_FailedContextInitializationException(zend_class_entry *class_entry_Io_Poll_FailedPollOperationException) +{ + zend_class_entry ce, *class_entry; + + INIT_NS_CLASS_ENTRY(ce, "Io\\Poll", "FailedContextInitializationException", NULL); + class_entry = zend_register_internal_class_with_flags(&ce, class_entry_Io_Poll_FailedPollOperationException, 0); + + return class_entry; +} + +static zend_class_entry *register_class_Io_Poll_FailedHandleAddException(zend_class_entry *class_entry_Io_Poll_FailedPollOperationException) +{ + zend_class_entry ce, *class_entry; + + INIT_NS_CLASS_ENTRY(ce, "Io\\Poll", "FailedHandleAddException", NULL); + class_entry = zend_register_internal_class_with_flags(&ce, class_entry_Io_Poll_FailedPollOperationException, 0); + + return class_entry; +} + +static zend_class_entry *register_class_Io_Poll_FailedWatcherModificationException(zend_class_entry *class_entry_Io_Poll_FailedPollOperationException) +{ + zend_class_entry ce, *class_entry; + + INIT_NS_CLASS_ENTRY(ce, "Io\\Poll", "FailedWatcherModificationException", NULL); + class_entry = zend_register_internal_class_with_flags(&ce, class_entry_Io_Poll_FailedPollOperationException, 0); + + return class_entry; +} + +static zend_class_entry *register_class_Io_Poll_FailedPollWaitException(zend_class_entry *class_entry_Io_Poll_FailedPollOperationException) +{ + zend_class_entry ce, *class_entry; + + INIT_NS_CLASS_ENTRY(ce, "Io\\Poll", "FailedPollWaitException", NULL); + class_entry = zend_register_internal_class_with_flags(&ce, class_entry_Io_Poll_FailedPollOperationException, 0); + + return class_entry; +} + +static zend_class_entry *register_class_Io_Poll_BackendUnavailableException(zend_class_entry *class_entry_Io_Poll_PollException) +{ + zend_class_entry ce, *class_entry; + + INIT_NS_CLASS_ENTRY(ce, "Io\\Poll", "BackendUnavailableException", NULL); + class_entry = zend_register_internal_class_with_flags(&ce, class_entry_Io_Poll_PollException, 0); + + return class_entry; +} + +static zend_class_entry *register_class_Io_Poll_InactiveWatcherException(zend_class_entry *class_entry_Io_Poll_PollException) +{ + zend_class_entry ce, *class_entry; + + INIT_NS_CLASS_ENTRY(ce, "Io\\Poll", "InactiveWatcherException", NULL); + class_entry = zend_register_internal_class_with_flags(&ce, class_entry_Io_Poll_PollException, 0); + + return class_entry; +} + +static zend_class_entry *register_class_Io_Poll_HandleAlreadyWatchedException(zend_class_entry *class_entry_Io_Poll_PollException) +{ + zend_class_entry ce, *class_entry; + + INIT_NS_CLASS_ENTRY(ce, "Io\\Poll", "HandleAlreadyWatchedException", NULL); + class_entry = zend_register_internal_class_with_flags(&ce, class_entry_Io_Poll_PollException, 0); + + return class_entry; +} + +static zend_class_entry *register_class_Io_Poll_InvalidHandleException(zend_class_entry *class_entry_Io_Poll_PollException) +{ + zend_class_entry ce, *class_entry; + + INIT_NS_CLASS_ENTRY(ce, "Io\\Poll", "InvalidHandleException", NULL); + class_entry = zend_register_internal_class_with_flags(&ce, class_entry_Io_Poll_PollException, 0); + + return class_entry; +} + +static zend_class_entry *register_class_StreamPollHandle(zend_class_entry *class_entry_Io_Poll_Handle) +{ + zend_class_entry ce, *class_entry; + + INIT_CLASS_ENTRY(ce, "StreamPollHandle", class_StreamPollHandle_methods); + class_entry = zend_register_internal_class_with_flags(&ce, NULL, ZEND_ACC_FINAL|ZEND_ACC_NO_DYNAMIC_PROPERTIES|ZEND_ACC_NOT_SERIALIZABLE); + zend_class_implements(class_entry, 1, class_entry_Io_Poll_Handle); + + return class_entry; +} diff --git a/ext/standard/io_poll_decl.h b/ext/standard/io_poll_decl.h new file mode 100644 index 000000000000..2b09e3665f58 --- /dev/null +++ b/ext/standard/io_poll_decl.h @@ -0,0 +1,26 @@ +/* This is a generated file, edit io_poll.stub.php instead. + * Stub hash: a7450146c5b3b3f3486611c83a55cf0cc932b27a */ + +#ifndef ZEND_IO_POLL_DECL_a7450146c5b3b3f3486611c83a55cf0cc932b27a_H +#define ZEND_IO_POLL_DECL_a7450146c5b3b3f3486611c83a55cf0cc932b27a_H + +typedef enum zend_enum_Io_Poll_Backend { + ZEND_ENUM_Io_Poll_Backend_Auto = 1, + ZEND_ENUM_Io_Poll_Backend_Poll = 2, + ZEND_ENUM_Io_Poll_Backend_Epoll = 3, + ZEND_ENUM_Io_Poll_Backend_Kqueue = 4, + ZEND_ENUM_Io_Poll_Backend_EventPorts = 5, + ZEND_ENUM_Io_Poll_Backend_WSAPoll = 6, +} zend_enum_Io_Poll_Backend; + +typedef enum zend_enum_Io_Poll_Event { + ZEND_ENUM_Io_Poll_Event_Read = 1, + ZEND_ENUM_Io_Poll_Event_Write = 2, + ZEND_ENUM_Io_Poll_Event_Error = 3, + ZEND_ENUM_Io_Poll_Event_HangUp = 4, + ZEND_ENUM_Io_Poll_Event_ReadHangUp = 5, + ZEND_ENUM_Io_Poll_Event_OneShot = 6, + ZEND_ENUM_Io_Poll_Event_EdgeTriggered = 7, +} zend_enum_Io_Poll_Event; + +#endif /* ZEND_IO_POLL_DECL_a7450146c5b3b3f3486611c83a55cf0cc932b27a_H */ diff --git a/ext/standard/iptc.c b/ext/standard/iptc.c index 5482a3c6ff15..59db612a7337 100644 --- a/ext/standard/iptc.c +++ b/ext/standard/iptc.c @@ -1,14 +1,12 @@ /* +----------------------------------------------------------------------+ - | Copyright (c) The PHP Group | + | Copyright © The PHP Group and Contributors. | +----------------------------------------------------------------------+ - | This source file is subject to version 3.01 of the PHP license, | - | that is bundled with this package in the file LICENSE, and is | - | available through the world-wide-web at the following url: | - | https://www.php.net/license/3_01.txt | - | If you did not receive a copy of the PHP license and are unable to | - | obtain it through the world-wide-web, please send a note to | - | license@php.net so we can mail you a copy immediately. | + | This source file is subject to the Modified BSD License that is | + | bundled with this package in the file LICENSE, and is available | + | through the World Wide Web at . | + | | + | SPDX-License-Identifier: BSD-3-Clause | +----------------------------------------------------------------------+ | Author: Thies C. Arntzen | +----------------------------------------------------------------------+ diff --git a/ext/standard/levenshtein.c b/ext/standard/levenshtein.c index d4688dcb9c13..efc71d2a2828 100644 --- a/ext/standard/levenshtein.c +++ b/ext/standard/levenshtein.c @@ -1,14 +1,12 @@ /* +----------------------------------------------------------------------+ - | Copyright (c) The PHP Group | + | Copyright © The PHP Group and Contributors. | +----------------------------------------------------------------------+ - | This source file is subject to version 3.01 of the PHP license, | - | that is bundled with this package in the file LICENSE, and is | - | available through the world-wide-web at the following url: | - | https://www.php.net/license/3_01.txt | - | If you did not receive a copy of the PHP license and are unable to | - | obtain it through the world-wide-web, please send a note to | - | license@php.net so we can mail you a copy immediately. | + | This source file is subject to the Modified BSD License that is | + | bundled with this package in the file LICENSE, and is available | + | through the World Wide Web at . | + | | + | SPDX-License-Identifier: BSD-3-Clause | +----------------------------------------------------------------------+ | Author: Hartmut Holzgraefe | +----------------------------------------------------------------------+ diff --git a/ext/standard/link.c b/ext/standard/link.c index 24e3b515dc80..dfd92a0a8709 100644 --- a/ext/standard/link.c +++ b/ext/standard/link.c @@ -1,16 +1,12 @@ /* +----------------------------------------------------------------------+ - | Copyright (c) The PHP Group | + | Copyright © The PHP Group and Contributors. | +----------------------------------------------------------------------+ - | This source file is subject to version 3.01 of the PHP license, | - | that is bundled with this package in the file LICENSE, and is | - | available through the world-wide-web at the following url: | - | https://www.php.net/license/3_01.txt | - | If you did not receive a copy of the PHP license and are unable to | - | obtain it through the world-wide-web, please send a note to | - | license@php.net so we can mail you a copy immediately. | - +----------------------------------------------------------------------+ - | Author: | + | This source file is subject to the Modified BSD License that is | + | bundled with this package in the file LICENSE, and is available | + | through the World Wide Web at . | + | | + | SPDX-License-Identifier: BSD-3-Clause | +----------------------------------------------------------------------+ */ @@ -88,7 +84,11 @@ PHP_FUNCTION(linkinfo) Z_PARAM_PATH(link, link_len) ZEND_PARSE_PARAMETERS_END(); - // TODO Check for empty string + if (UNEXPECTED(link_len == 0)) { + zend_argument_must_not_be_empty_error(1); + RETURN_THROWS(); + } + dirname = estrndup(link, link_len); zend_dirname(dirname, link_len); diff --git a/ext/standard/mail.c b/ext/standard/mail.c index 395c7bb81d4f..6aac0d364cf0 100644 --- a/ext/standard/mail.c +++ b/ext/standard/mail.c @@ -1,14 +1,12 @@ /* +----------------------------------------------------------------------+ - | Copyright (c) The PHP Group | + | Copyright © The PHP Group and Contributors. | +----------------------------------------------------------------------+ - | This source file is subject to version 3.01 of the PHP license, | - | that is bundled with this package in the file LICENSE, and is | - | available through the world-wide-web at the following url: | - | https://www.php.net/license/3_01.txt | - | If you did not receive a copy of the PHP license and are unable to | - | obtain it through the world-wide-web, please send a note to | - | license@php.net so we can mail you a copy immediately. | + | This source file is subject to the Modified BSD License that is | + | bundled with this package in the file LICENSE, and is available | + | through the World Wide Web at . | + | | + | SPDX-License-Identifier: BSD-3-Clause | +----------------------------------------------------------------------+ | Author: Rasmus Lerdorf | +----------------------------------------------------------------------+ @@ -336,8 +334,8 @@ PHP_FUNCTION(mail) subject_r = subject; } - zend_string *force_extra_parameters = zend_ini_str_ex("mail.force_extra_parameters", strlen("mail.force_extra_parameters"), false, NULL); - if (force_extra_parameters) { + zend_string *force_extra_parameters = zend_ini_str_literal("mail.force_extra_parameters"); + if (force_extra_parameters && ZSTR_LEN(force_extra_parameters) > 0) { extra_cmd = php_escape_shell_cmd(force_extra_parameters); } else if (extra_cmd) { extra_cmd = php_escape_shell_cmd(extra_cmd); @@ -437,9 +435,9 @@ static int php_mail_detect_multiple_crlf(const char *hdr) { PHPAPI bool php_mail(const char *to, const char *subject, const char *message, const char *headers, const zend_string *extra_cmd) { FILE *sendmail; - char *sendmail_path = INI_STR("sendmail_path"); + const char *sendmail_path = zend_ini_string_literal("sendmail_path"); char *sendmail_cmd = NULL; - const zend_string *mail_log = zend_ini_str(ZEND_STRL("mail.log"), false); + const zend_string *mail_log = zend_ini_str_literal("mail.log"); const char *hdr = headers; char *ahdr = NULL; #if PHP_SIGCHILD @@ -536,7 +534,7 @@ PHPAPI bool php_mail(const char *to, const char *subject, const char *message, c char *tsm_errmsg = NULL; /* handle old style win smtp sending */ - if (TSendMail(INI_STR("SMTP"), &tsm_err, &tsm_errmsg, hdr, subject, to, message) == FAILURE) { + if (TSendMail(zend_ini_string_literal("SMTP"), &tsm_err, &tsm_errmsg, hdr, subject, to, message) == FAILURE) { if (tsm_errmsg) { php_error_docref(NULL, E_WARNING, "%s", tsm_errmsg); efree(tsm_errmsg); @@ -553,7 +551,7 @@ PHPAPI bool php_mail(const char *to, const char *subject, const char *message, c if (extra_cmd != NULL) { spprintf(&sendmail_cmd, 0, "%s %s", sendmail_path, ZSTR_VAL(extra_cmd)); } else { - sendmail_cmd = sendmail_path; + sendmail_cmd = (char*)sendmail_path; } #if PHP_SIGCHILD @@ -576,7 +574,7 @@ PHPAPI bool php_mail(const char *to, const char *subject, const char *message, c sendmail = popen(sendmail_cmd, "w"); #endif if (extra_cmd != NULL) { - efree (sendmail_cmd); + efree(sendmail_cmd); } if (sendmail) { @@ -701,7 +699,7 @@ PHPAPI bool php_mail(const char *to, const char *subject, const char *message, c /* {{{ PHP_MINFO_FUNCTION */ PHP_MINFO_FUNCTION(mail) { - char *sendmail_path = INI_STR("sendmail_path"); + const char *sendmail_path = zend_ini_string_literal("sendmail_path"); #ifdef PHP_WIN32 if (!sendmail_path) { diff --git a/ext/standard/math.c b/ext/standard/math.c index 6418a020f4fa..1898d210ce65 100644 --- a/ext/standard/math.c +++ b/ext/standard/math.c @@ -1,14 +1,12 @@ /* +----------------------------------------------------------------------+ - | Copyright (c) The PHP Group | + | Copyright © The PHP Group and Contributors. | +----------------------------------------------------------------------+ - | This source file is subject to version 3.01 of the PHP license, | - | that is bundled with this package in the file LICENSE, and is | - | available through the world-wide-web at the following url: | - | https://www.php.net/license/3_01.txt | - | If you did not receive a copy of the PHP license and are unable to | - | obtain it through the world-wide-web, please send a note to | - | license@php.net so we can mail you a copy immediately. | + | This source file is subject to the Modified BSD License that is | + | bundled with this package in the file LICENSE, and is available | + | through the World Wide Web at . | + | | + | SPDX-License-Identifier: BSD-3-Clause | +----------------------------------------------------------------------+ | Authors: Jim Winstead | | Stig Sæther Bakken | @@ -152,7 +150,7 @@ static inline double php_round_helper(double integral, double value, double expo return integral; - EMPTY_SWITCH_DEFAULT_CASE(); + default: ZEND_UNREACHABLE(); } // FIXME: GCC bug, branch is considered reachable. ZEND_UNREACHABLE(); @@ -261,7 +259,7 @@ PHP_FUNCTION(abs) } case IS_DOUBLE: RETURN_DOUBLE(fabs(Z_DVAL_P(value))); - EMPTY_SWITCH_DEFAULT_CASE(); + default: ZEND_UNREACHABLE(); } } /* }}} */ @@ -280,7 +278,7 @@ PHP_FUNCTION(ceil) RETURN_DOUBLE(zval_get_double(value)); case IS_DOUBLE: RETURN_DOUBLE(ceil(Z_DVAL_P(value))); - EMPTY_SWITCH_DEFAULT_CASE(); + default: ZEND_UNREACHABLE(); } } /* }}} */ @@ -299,7 +297,7 @@ PHP_FUNCTION(floor) RETURN_DOUBLE(zval_get_double(value)); case IS_DOUBLE: RETURN_DOUBLE(floor(Z_DVAL_P(value))); - EMPTY_SWITCH_DEFAULT_CASE(); + default: ZEND_UNREACHABLE(); } } /* }}} */ @@ -382,7 +380,7 @@ PHP_FUNCTION(round) case IS_DOUBLE: RETURN_DOUBLE(_php_math_round(zval_get_double(value), (int)places, (int)mode)); - EMPTY_SWITCH_DEFAULT_CASE(); + default: ZEND_UNREACHABLE(); } } /* }}} */ @@ -861,9 +859,9 @@ PHPAPI void _php_math_basetozval(zend_string *str, int base, zval *ret) e = s + ZSTR_LEN(str); /* Skip leading whitespace */ - while (s < e && isspace(*s)) s++; + while (s < e && isspace((unsigned char)*s)) s++; /* Skip trailing whitespace */ - while (s < e && isspace(*(e-1))) e--; + while (s < e && isspace((unsigned char)e[-1])) e--; if (e - s >= 2) { if (base == 16 && s[0] == '0' && (s[1] == 'x' || s[1] == 'X')) s += 2; @@ -1176,7 +1174,7 @@ PHPAPI zend_string *_php_math_number_format_ex(double d, int dec, const char *de tmpbuf = strpprintf(0, "%.*F", dec, d); if (tmpbuf == NULL) { return NULL; - } else if (!isdigit((int)ZSTR_VAL(tmpbuf)[0])) { + } else if (!isdigit((unsigned char)ZSTR_VAL(tmpbuf)[0])) { return tmpbuf; } @@ -1419,7 +1417,6 @@ PHP_FUNCTION(number_format) switch (Z_TYPE_P(num)) { case IS_LONG: RETURN_STR(_php_math_number_format_long(Z_LVAL_P(num), dec, dec_point, dec_point_len, thousand_sep, thousand_sep_len)); - break; case IS_DOUBLE: // double values of >= 2^52 can not have fractional digits anymore @@ -1429,7 +1426,6 @@ PHP_FUNCTION(number_format) && ZEND_DOUBLE_FITS_LONG(Z_DVAL_P(num)) )) { RETURN_STR(_php_math_number_format_long((zend_long)Z_DVAL_P(num), dec, dec_point, dec_point_len, thousand_sep, thousand_sep_len)); - break; } if (dec >= 0) { @@ -1438,9 +1434,8 @@ PHP_FUNCTION(number_format) dec_int = ZEND_LONG_INT_UDFL(dec) ? INT_MIN : (int)dec; } RETURN_STR(_php_math_number_format_ex(Z_DVAL_P(num), dec_int, dec_point, dec_point_len, thousand_sep, thousand_sep_len)); - break; - EMPTY_SWITCH_DEFAULT_CASE() + default: ZEND_UNREACHABLE(); } } /* }}} */ diff --git a/ext/standard/md5.c b/ext/standard/md5.c index 9d0f5f886a6b..204514053cf0 100644 --- a/ext/standard/md5.c +++ b/ext/standard/md5.c @@ -1,14 +1,12 @@ /* +----------------------------------------------------------------------+ - | Copyright (c) The PHP Group | + | Copyright © The PHP Group and Contributors. | +----------------------------------------------------------------------+ - | This source file is subject to version 3.01 of the PHP license, | - | that is bundled with this package in the file LICENSE, and is | - | available through the world-wide-web at the following url: | - | https://www.php.net/license/3_01.txt | - | If you did not receive a copy of the PHP license and are unable to | - | obtain it through the world-wide-web, please send a note to | - | license@php.net so we can mail you a copy immediately. | + | This source file is subject to the Modified BSD License that is | + | bundled with this package in the file LICENSE, and is available | + | through the World Wide Web at . | + | | + | SPDX-License-Identifier: BSD-3-Clause | +----------------------------------------------------------------------+ | Author: Alexander Peslyak (Solar Designer) | | Lachlan Roche | diff --git a/ext/standard/md5.h b/ext/standard/md5.h index 5444abf46aec..30faa0ac258a 100644 --- a/ext/standard/md5.h +++ b/ext/standard/md5.h @@ -1,14 +1,12 @@ /* +----------------------------------------------------------------------+ - | Copyright (c) The PHP Group | + | Copyright © The PHP Group and Contributors. | +----------------------------------------------------------------------+ - | This source file is subject to version 3.01 of the PHP license, | - | that is bundled with this package in the file LICENSE, and is | - | available through the world-wide-web at the following url: | - | https://www.php.net/license/3_01.txt | - | If you did not receive a copy of the PHP license and are unable to | - | obtain it through the world-wide-web, please send a note to | - | license@php.net so we can mail you a copy immediately. | + | This source file is subject to the Modified BSD License that is | + | bundled with this package in the file LICENSE, and is available | + | through the World Wide Web at . | + | | + | SPDX-License-Identifier: BSD-3-Clause | +----------------------------------------------------------------------+ | Author: Alexander Peslyak (Solar Designer) | | Rasmus Lerdorf | diff --git a/ext/standard/metaphone.c b/ext/standard/metaphone.c index 149f95c127c6..8f33057de5ac 100644 --- a/ext/standard/metaphone.c +++ b/ext/standard/metaphone.c @@ -1,14 +1,12 @@ /* +----------------------------------------------------------------------+ - | Copyright (c) The PHP Group | + | Copyright © The PHP Group and Contributors. | +----------------------------------------------------------------------+ - | This source file is subject to version 3.01 of the PHP license, | - | that is bundled with this package in the file LICENSE, and is | - | available through the world-wide-web at the following url: | - | https://www.php.net/license/3_01.txt | - | If you did not receive a copy of the PHP license and are unable to | - | obtain it through the world-wide-web, please send a note to | - | license@php.net so we can mail you a copy immediately. | + | This source file is subject to the Modified BSD License that is | + | bundled with this package in the file LICENSE, and is available | + | through the World Wide Web at . | + | | + | SPDX-License-Identifier: BSD-3-Clause | +----------------------------------------------------------------------+ | Author: Thies C. Arntzen | +----------------------------------------------------------------------+ @@ -80,7 +78,7 @@ static const char _codes[26] = /* Note: these functions require an uppercase letter input! */ static zend_always_inline char encode(char c) { - if (isalpha(c)) { + if (isalpha((unsigned char)c)) { ZEND_ASSERT(c >= 'A' && c <= 'Z'); return _codes[(c - 'A')]; } else { @@ -107,9 +105,9 @@ static zend_always_inline char encode(char c) { /*----------------------------- */ /* I suppose I could have been using a character pointer instead of - * accesssing the array directly... */ + * accessing the array directly... */ -#define Convert_Raw(c) toupper(c) +#define Convert_Raw(c) toupper((unsigned char)c) /* Look at the next letter in the word */ #define Read_Raw_Next_Letter (word[w_idx+1]) #define Read_Next_Letter (Convert_Raw(Read_Raw_Next_Letter)) @@ -123,14 +121,14 @@ static zend_always_inline char encode(char c) { /* Look two letters down. It makes sure you don't walk off the string. */ #define Read_After_Next_Letter (Read_Raw_Next_Letter != '\0' ? Convert_Raw(word[w_idx+2]) \ : '\0') -#define Look_Ahead_Letter(n) (toupper(Lookahead((char *) word+w_idx, n))) +#define Look_Ahead_Letter(n) (toupper((unsigned char)Lookahead((char *) word+w_idx, n))) /* Allows us to safely look ahead an arbitrary # of letters */ /* I probably could have just used strlen... */ -static char Lookahead(char *word, int how_far) +static char Lookahead(char *word, size_t how_far) { - int idx; + size_t idx; for (idx = 0; word[idx] != '\0' && idx < how_far; idx++); /* Edge forward in the string... */ @@ -165,12 +163,12 @@ static char Lookahead(char *word, int how_far) #define Phone_Len (p_idx) /* Note is a letter is a 'break' in the word */ -#define Isbreak(c) (!isalpha(c)) +#define Isbreak(c) (!isalpha((unsigned char)(c))) /* {{{ metaphone */ static void metaphone(unsigned char *word, size_t word_len, zend_long max_phonemes, zend_string **phoned_word, int traditional) { - int w_idx = 0; /* point in the phonization we're at. */ + size_t w_idx = 0; /* point in the phonization we're at. */ size_t p_idx = 0; /* end of the phoned phrase */ size_t max_buffer_len = 0; /* maximum length of the destination buffer */ char curr_letter; @@ -189,7 +187,7 @@ static void metaphone(unsigned char *word, size_t word_len, zend_long max_phonem /*-- The first phoneme has to be processed specially. --*/ /* Find our first letter */ - for (; !isalpha(curr_letter = Read_Raw_Curr_Letter); w_idx++) { + for (; !isalpha((unsigned char)(curr_letter = Read_Raw_Curr_Letter)); w_idx++) { /* On the off chance we were given nothing but crap... */ if (curr_letter == '\0') { End_Phoned_Word(); @@ -264,7 +262,7 @@ static void metaphone(unsigned char *word, size_t word_len, zend_long max_phonem for (; (curr_letter = Read_Raw_Curr_Letter) != '\0' && (max_phonemes == 0 || Phone_Len < (size_t)max_phonemes); w_idx++) { - /* How many letters to skip because an eariler encoding handled + /* How many letters to skip because an earlier encoding handled * multiple letters */ unsigned short int skip_letter = 0; @@ -277,7 +275,7 @@ static void metaphone(unsigned char *word, size_t word_len, zend_long max_phonem */ /* Ignore non-alphas */ - if (!isalpha(curr_letter)) + if (!isalpha((unsigned char)curr_letter)) continue; curr_letter = Convert_Raw(curr_letter); diff --git a/ext/standard/microtime.c b/ext/standard/microtime.c index ca8643eb5196..46e770dec3ee 100644 --- a/ext/standard/microtime.c +++ b/ext/standard/microtime.c @@ -1,14 +1,12 @@ /* +----------------------------------------------------------------------+ - | Copyright (c) The PHP Group | + | Copyright © The PHP Group and Contributors. | +----------------------------------------------------------------------+ - | This source file is subject to version 3.01 of the PHP license, | - | that is bundled with this package in the file LICENSE, and is | - | available through the world-wide-web at the following url: | - | https://www.php.net/license/3_01.txt | - | If you did not receive a copy of the PHP license and are unable to | - | obtain it through the world-wide-web, please send a note to | - | license@php.net so we can mail you a copy immediately. | + | This source file is subject to the Modified BSD License that is | + | bundled with this package in the file LICENSE, and is available | + | through the World Wide Web at . | + | | + | SPDX-License-Identifier: BSD-3-Clause | +----------------------------------------------------------------------+ | Author: Paul Panotzki - Bunyip Information Systems | +----------------------------------------------------------------------+ diff --git a/ext/standard/net.c b/ext/standard/net.c index 942d804d42a4..199db6e80943 100644 --- a/ext/standard/net.c +++ b/ext/standard/net.c @@ -1,14 +1,12 @@ /* +----------------------------------------------------------------------+ - | Copyright (c) The PHP Group | + | Copyright © The PHP Group and Contributors. | +----------------------------------------------------------------------+ - | This source file is subject to version 3.01 of the PHP license, | - | that is bundled with this package in the file LICENSE, and is | - | available through the world-wide-web at the following url: | - | https://www.php.net/license/3_01.txt | - | If you did not receive a copy of the PHP license and are unable to | - | obtain it through the world-wide-web, please send a note to | - | license@php.net so we can mail you a copy immediately. | + | This source file is subject to the Modified BSD License that is | + | bundled with this package in the file LICENSE, and is available | + | through the World Wide Web at . | + | | + | SPDX-License-Identifier: BSD-3-Clause | +----------------------------------------------------------------------+ | Authors: Sara Golemon | +----------------------------------------------------------------------+ diff --git a/ext/standard/pack.c b/ext/standard/pack.c index 55da64897a2e..1ab5d4858cbe 100644 --- a/ext/standard/pack.c +++ b/ext/standard/pack.c @@ -1,14 +1,12 @@ /* +----------------------------------------------------------------------+ - | Copyright (c) The PHP Group | + | Copyright © The PHP Group and Contributors. | +----------------------------------------------------------------------+ - | This source file is subject to version 3.01 of the PHP license, | - | that is bundled with this package in the file LICENSE, and is | - | available through the world-wide-web at the following url: | - | https://www.php.net/license/3_01.txt | - | If you did not receive a copy of the PHP license and are unable to | - | obtain it through the world-wide-web, please send a note to | - | license@php.net so we can mail you a copy immediately. | + | This source file is subject to the Modified BSD License that is | + | bundled with this package in the file LICENSE, and is available | + | through the World Wide Web at . | + | | + | SPDX-License-Identifier: BSD-3-Clause | +----------------------------------------------------------------------+ | Author: Chris Schneider | +----------------------------------------------------------------------+ diff --git a/ext/standard/pageinfo.c b/ext/standard/pageinfo.c index c1cbc59bfaa1..3ddda25ef0b7 100644 --- a/ext/standard/pageinfo.c +++ b/ext/standard/pageinfo.c @@ -1,14 +1,12 @@ /* +----------------------------------------------------------------------+ - | Copyright (c) The PHP Group | + | Copyright © The PHP Group and Contributors. | +----------------------------------------------------------------------+ - | This source file is subject to version 3.01 of the PHP license, | - | that is bundled with this package in the file LICENSE, and is | - | available through the world-wide-web at the following url: | - | https://www.php.net/license/3_01.txt | - | If you did not receive a copy of the PHP license and are unable to | - | obtain it through the world-wide-web, please send a note to | - | license@php.net so we can mail you a copy immediately. | + | This source file is subject to the Modified BSD License that is | + | bundled with this package in the file LICENSE, and is available | + | through the World Wide Web at . | + | | + | SPDX-License-Identifier: BSD-3-Clause | +----------------------------------------------------------------------+ | Author: Jim Winstead | +----------------------------------------------------------------------+ diff --git a/ext/standard/pageinfo.h b/ext/standard/pageinfo.h index 029ce8b97981..5ce81685f9ec 100644 --- a/ext/standard/pageinfo.h +++ b/ext/standard/pageinfo.h @@ -1,14 +1,12 @@ /* +----------------------------------------------------------------------+ - | Copyright (c) The PHP Group | + | Copyright © The PHP Group and Contributors. | +----------------------------------------------------------------------+ - | This source file is subject to version 3.01 of the PHP license, | - | that is bundled with this package in the file LICENSE, and is | - | available through the world-wide-web at the following url: | - | https://www.php.net/license/3_01.txt | - | If you did not receive a copy of the PHP license and are unable to | - | obtain it through the world-wide-web, please send a note to | - | license@php.net so we can mail you a copy immediately. | + | This source file is subject to the Modified BSD License that is | + | bundled with this package in the file LICENSE, and is available | + | through the World Wide Web at . | + | | + | SPDX-License-Identifier: BSD-3-Clause | +----------------------------------------------------------------------+ | Author: Jim Winstead | +----------------------------------------------------------------------+ diff --git a/ext/standard/password.c b/ext/standard/password.c index a8aab315657c..a28ceb7e0ced 100644 --- a/ext/standard/password.c +++ b/ext/standard/password.c @@ -1,14 +1,12 @@ /* +----------------------------------------------------------------------+ - | Copyright (c) The PHP Group | + | Copyright © The PHP Group and Contributors. | +----------------------------------------------------------------------+ - | This source file is subject to version 3.01 of the PHP license, | - | that is bundled with this package in the file LICENSE, and is | - | available through the world-wide-web at the following url: | - | https://www.php.net/license/3_01.txt | - | If you did not receive a copy of the PHP license and are unable to | - | obtain it through the world-wide-web, please send a note to | - | license@php.net so we can mail you a copy immediately. | + | This source file is subject to the Modified BSD License that is | + | bundled with this package in the file LICENSE, and is available | + | through the World Wide Web at . | + | | + | SPDX-License-Identifier: BSD-3-Clause | +----------------------------------------------------------------------+ | Authors: Anthony Ferrara | | Charles R. Portwood II | diff --git a/ext/standard/php_array.h b/ext/standard/php_array.h index 2205082e91df..ab6c8494dd4e 100644 --- a/ext/standard/php_array.h +++ b/ext/standard/php_array.h @@ -1,14 +1,12 @@ /* +----------------------------------------------------------------------+ - | Copyright (c) The PHP Group | + | Copyright © The PHP Group and Contributors. | +----------------------------------------------------------------------+ - | This source file is subject to version 3.01 of the PHP license, | - | that is bundled with this package in the file LICENSE, and is | - | available through the world-wide-web at the following url: | - | https://www.php.net/license/3_01.txt | - | If you did not receive a copy of the PHP license and are unable to | - | obtain it through the world-wide-web, please send a note to | - | license@php.net so we can mail you a copy immediately. | + | This source file is subject to the Modified BSD License that is | + | bundled with this package in the file LICENSE, and is available | + | through the World Wide Web at . | + | | + | SPDX-License-Identifier: BSD-3-Clause | +----------------------------------------------------------------------+ | Authors: Andi Gutmans | | Zeev Suraski | @@ -63,6 +61,8 @@ PHPAPI bool php_array_pick_keys(php_random_algo_with_state engine, zval *input, #define ARRAY_FILTER_USE_BOTH 1 #define ARRAY_FILTER_USE_KEY 2 +extern PHPAPI zend_class_entry *sort_direction_ce; + ZEND_BEGIN_MODULE_GLOBALS(array) bucket_compare_func_t *multisort_func; bool compare_deprecation_thrown; diff --git a/ext/standard/php_assert.h b/ext/standard/php_assert.h index 103a770e7601..c26e1f11681c 100644 --- a/ext/standard/php_assert.h +++ b/ext/standard/php_assert.h @@ -1,14 +1,12 @@ /* +----------------------------------------------------------------------+ - | Copyright (c) The PHP Group | + | Copyright © The PHP Group and Contributors. | +----------------------------------------------------------------------+ - | This source file is subject to version 3.01 of the PHP license, | - | that is bundled with this package in the file LICENSE, and is | - | available through the world-wide-web at the following url: | - | https://www.php.net/license/3_01.txt | - | If you did not receive a copy of the PHP license and are unable to | - | obtain it through the world-wide-web, please send a note to | - | license@php.net so we can mail you a copy immediately. | + | This source file is subject to the Modified BSD License that is | + | bundled with this package in the file LICENSE, and is available | + | through the World Wide Web at . | + | | + | SPDX-License-Identifier: BSD-3-Clause | +----------------------------------------------------------------------+ | Author: Thies C. Arntzen | +----------------------------------------------------------------------+ diff --git a/ext/standard/php_browscap.h b/ext/standard/php_browscap.h index 4fc4f66a9233..85225bca0244 100644 --- a/ext/standard/php_browscap.h +++ b/ext/standard/php_browscap.h @@ -1,14 +1,12 @@ /* +----------------------------------------------------------------------+ - | Copyright (c) The PHP Group | + | Copyright © The PHP Group and Contributors. | +----------------------------------------------------------------------+ - | This source file is subject to version 3.01 of the PHP license, | - | that is bundled with this package in the file LICENSE, and is | - | available through the world-wide-web at the following url: | - | https://www.php.net/license/3_01.txt | - | If you did not receive a copy of the PHP license and are unable to | - | obtain it through the world-wide-web, please send a note to | - | license@php.net so we can mail you a copy immediately. | + | This source file is subject to the Modified BSD License that is | + | bundled with this package in the file LICENSE, and is available | + | through the World Wide Web at . | + | | + | SPDX-License-Identifier: BSD-3-Clause | +----------------------------------------------------------------------+ | Author: Zeev Suraski | +----------------------------------------------------------------------+ diff --git a/ext/standard/php_crypt.h b/ext/standard/php_crypt.h index b7111dfd21b1..19c20c4a6c16 100644 --- a/ext/standard/php_crypt.h +++ b/ext/standard/php_crypt.h @@ -1,14 +1,12 @@ /* +----------------------------------------------------------------------+ - | Copyright (c) The PHP Group | + | Copyright © The PHP Group and Contributors. | +----------------------------------------------------------------------+ - | This source file is subject to version 3.01 of the PHP license, | - | that is bundled with this package in the file LICENSE, and is | - | available through the world-wide-web at the following url: | - | https://www.php.net/license/3_01.txt | - | If you did not receive a copy of the PHP license and are unable to | - | obtain it through the world-wide-web, please send a note to | - | license@php.net so we can mail you a copy immediately. | + | This source file is subject to the Modified BSD License that is | + | bundled with this package in the file LICENSE, and is available | + | through the World Wide Web at . | + | | + | SPDX-License-Identifier: BSD-3-Clause | +----------------------------------------------------------------------+ | Authors: Stig Bakken | | Zeev Suraski | diff --git a/ext/standard/php_crypt_r.c b/ext/standard/php_crypt_r.c index bd30ce9ce8cb..15a1508be1cb 100644 --- a/ext/standard/php_crypt_r.c +++ b/ext/standard/php_crypt_r.c @@ -1,14 +1,12 @@ /* +----------------------------------------------------------------------+ - | Copyright (c) The PHP Group | + | Copyright © The PHP Group and Contributors. | +----------------------------------------------------------------------+ - | This source file is subject to version 3.01 of the PHP license, | - | that is bundled with this package in the file LICENSE, and is | - | available through the world-wide-web at the following url: | - | https://www.php.net/license/3_01.txt | - | If you did not receive a copy of the PHP license and are unable to | - | obtain it through the world-wide-web, please send a note to | - | license@php.net so we can mail you a copy immediately. | + | This source file is subject to the Modified BSD License that is | + | bundled with this package in the file LICENSE, and is available | + | through the World Wide Web at . | + | | + | SPDX-License-Identifier: BSD-3-Clause | +----------------------------------------------------------------------+ | Authors: Pierre Alain Joye . | + | | + | SPDX-License-Identifier: BSD-3-Clause | +----------------------------------------------------------------------+ | Authors: Pierre Alain Joye . | + | | + | SPDX-License-Identifier: BSD-3-Clause | +----------------------------------------------------------------------+ | Author: Thies C. Arntzen | +----------------------------------------------------------------------+ diff --git a/ext/standard/php_dir_int.h b/ext/standard/php_dir_int.h index 06faf4e678f4..17fcbab7e1cb 100644 --- a/ext/standard/php_dir_int.h +++ b/ext/standard/php_dir_int.h @@ -1,14 +1,12 @@ /* +----------------------------------------------------------------------+ - | Copyright (c) The PHP Group | + | Copyright © The PHP Group and Contributors. | +----------------------------------------------------------------------+ - | This source file is subject to version 3.01 of the PHP license, | - | that is bundled with this package in the file LICENSE, and is | - | available through the world-wide-web at the following url: | - | https://www.php.net/license/3_01.txt | - | If you did not receive a copy of the PHP license and are unable to | - | obtain it through the world-wide-web, please send a note to | - | license@php.net so we can mail you a copy immediately. | + | This source file is subject to the Modified BSD License that is | + | bundled with this package in the file LICENSE, and is available | + | through the World Wide Web at . | + | | + | SPDX-License-Identifier: BSD-3-Clause | +----------------------------------------------------------------------+ */ diff --git a/ext/standard/php_dns.h b/ext/standard/php_dns.h index 4e04799cdb8a..5b0a29f32bd1 100644 --- a/ext/standard/php_dns.h +++ b/ext/standard/php_dns.h @@ -1,14 +1,12 @@ /* +----------------------------------------------------------------------+ - | Copyright (c) The PHP Group | + | Copyright © The PHP Group and Contributors. | +----------------------------------------------------------------------+ - | This source file is subject to version 3.01 of the PHP license, | - | that is bundled with this package in the file LICENSE, and is | - | available through the world-wide-web at the following url: | - | https://www.php.net/license/3_01.txt | - | If you did not receive a copy of the PHP license and are unable to | - | obtain it through the world-wide-web, please send a note to | - | license@php.net so we can mail you a copy immediately. | + | This source file is subject to the Modified BSD License that is | + | bundled with this package in the file LICENSE, and is available | + | through the World Wide Web at . | + | | + | SPDX-License-Identifier: BSD-3-Clause | +----------------------------------------------------------------------+ | Authors: The typical suspects | | Marcus Boerger | diff --git a/ext/standard/php_ext_syslog.h b/ext/standard/php_ext_syslog.h index fd7958fad292..44c5ad1c02f4 100644 --- a/ext/standard/php_ext_syslog.h +++ b/ext/standard/php_ext_syslog.h @@ -1,14 +1,12 @@ /* +----------------------------------------------------------------------+ - | Copyright (c) The PHP Group | + | Copyright © The PHP Group and Contributors. | +----------------------------------------------------------------------+ - | This source file is subject to version 3.01 of the PHP license, | - | that is bundled with this package in the file LICENSE, and is | - | available through the world-wide-web at the following url: | - | https://www.php.net/license/3_01.txt | - | If you did not receive a copy of the PHP license and are unable to | - | obtain it through the world-wide-web, please send a note to | - | license@php.net so we can mail you a copy immediately. | + | This source file is subject to the Modified BSD License that is | + | bundled with this package in the file LICENSE, and is available | + | through the World Wide Web at . | + | | + | SPDX-License-Identifier: BSD-3-Clause | +----------------------------------------------------------------------+ | Author: Stig Sæther Bakken | +----------------------------------------------------------------------+ diff --git a/ext/standard/php_filestat.h b/ext/standard/php_filestat.h index ef3c1cd60c72..c2ea6eed66e2 100644 --- a/ext/standard/php_filestat.h +++ b/ext/standard/php_filestat.h @@ -1,14 +1,12 @@ /* +----------------------------------------------------------------------+ - | Copyright (c) The PHP Group | + | Copyright © The PHP Group and Contributors. | +----------------------------------------------------------------------+ - | This source file is subject to version 3.01 of the PHP license, | - | that is bundled with this package in the file LICENSE, and is | - | available through the world-wide-web at the following url: | - | https://www.php.net/license/3_01.txt | - | If you did not receive a copy of the PHP license and are unable to | - | obtain it through the world-wide-web, please send a note to | - | license@php.net so we can mail you a copy immediately. | + | This source file is subject to the Modified BSD License that is | + | bundled with this package in the file LICENSE, and is available | + | through the World Wide Web at . | + | | + | SPDX-License-Identifier: BSD-3-Clause | +----------------------------------------------------------------------+ | Author: Jim Winstead | +----------------------------------------------------------------------+ diff --git a/ext/standard/php_fopen_wrapper.c b/ext/standard/php_fopen_wrapper.c index ea33ba490434..3f062bf2ea1e 100644 --- a/ext/standard/php_fopen_wrapper.c +++ b/ext/standard/php_fopen_wrapper.c @@ -1,14 +1,12 @@ /* +----------------------------------------------------------------------+ - | Copyright (c) The PHP Group | + | Copyright © The PHP Group and Contributors. | +----------------------------------------------------------------------+ - | This source file is subject to version 3.01 of the PHP license, | - | that is bundled with this package in the file LICENSE, and is | - | available through the world-wide-web at the following url: | - | https://www.php.net/license/3_01.txt | - | If you did not receive a copy of the PHP license and are unable to | - | obtain it through the world-wide-web, please send a note to | - | license@php.net so we can mail you a copy immediately. | + | This source file is subject to the Modified BSD License that is | + | bundled with this package in the file LICENSE, and is available | + | through the World Wide Web at . | + | | + | SPDX-License-Identifier: BSD-3-Clause | +----------------------------------------------------------------------+ | Authors: Rasmus Lerdorf | | Jim Winstead | @@ -158,14 +156,18 @@ static void php_stream_apply_filter_list(php_stream *stream, char *filterlist, i if ((temp_filter = php_stream_filter_create(p, NULL, php_stream_is_persistent(stream)))) { php_stream_filter_append(&stream->readfilters, temp_filter); } else { - php_error_docref(NULL, E_WARNING, "Unable to create filter (%s)", p); + php_stream_wrapper_warn_nt(NULL, PHP_STREAM_CONTEXT(stream), REPORT_ERRORS, + CreateFailed, + "Unable to create filter (%s)", p); } } if (write_chain) { if ((temp_filter = php_stream_filter_create(p, NULL, php_stream_is_persistent(stream)))) { php_stream_filter_append(&stream->writefilters, temp_filter); } else { - php_error_docref(NULL, E_WARNING, "Unable to create filter (%s)", p); + php_stream_wrapper_warn_nt(NULL, PHP_STREAM_CONTEXT(stream), REPORT_ERRORS, + CreateFailed, + "Unable to create filter (%s)", p); } } p = php_strtok_r(NULL, "|", &token); @@ -219,7 +221,9 @@ static php_stream * php_stream_url_wrap_php(php_stream_wrapper *wrapper, const c if ((options & STREAM_OPEN_FOR_INCLUDE) && !PG(allow_url_include) ) { if (options & REPORT_ERRORS) { - php_error_docref(NULL, E_WARNING, "URL file-access is disabled in the server configuration"); + php_stream_wrapper_warn(wrapper, context, options, + Disabled, + "URL file-access is disabled in the server configuration"); } return NULL; } @@ -238,7 +242,9 @@ static php_stream * php_stream_url_wrap_php(php_stream_wrapper *wrapper, const c if (!strcasecmp(path, "stdin")) { if ((options & STREAM_OPEN_FOR_INCLUDE) && !PG(allow_url_include) ) { if (options & REPORT_ERRORS) { - php_error_docref(NULL, E_WARNING, "URL file-access is disabled in the server configuration"); + php_stream_wrapper_warn(wrapper, context, options, + Disabled, + "URL file-access is disabled in the server configuration"); } return NULL; } @@ -297,14 +303,18 @@ static php_stream * php_stream_url_wrap_php(php_stream_wrapper *wrapper, const c if (strcmp(sapi_module.name, "cli")) { if (options & REPORT_ERRORS) { - php_error_docref(NULL, E_WARNING, "Direct access to file descriptors is only available from command-line PHP"); + php_stream_wrapper_warn(wrapper, context, options, + Disabled, + "Direct access to file descriptors is only available from command-line PHP"); } return NULL; } if ((options & STREAM_OPEN_FOR_INCLUDE) && !PG(allow_url_include) ) { if (options & REPORT_ERRORS) { - php_error_docref(NULL, E_WARNING, "URL file-access is disabled in the server configuration"); + php_stream_wrapper_warn(wrapper, context, options, + Disabled, + "URL file-access is disabled in the server configuration"); } return NULL; } @@ -312,7 +322,8 @@ static php_stream * php_stream_url_wrap_php(php_stream_wrapper *wrapper, const c start = &path[3]; fildes_ori = ZEND_STRTOL(start, &end, 10); if (end == start || *end != '\0') { - php_stream_wrapper_log_error(wrapper, options, + php_stream_wrapper_log_warn(wrapper, context, options, + InvalidUrl, "php://fd/ stream must be specified in the form php://fd/"); return NULL; } @@ -324,14 +335,16 @@ static php_stream * php_stream_url_wrap_php(php_stream_wrapper *wrapper, const c #endif if (fildes_ori < 0 || fildes_ori >= dtablesize) { - php_stream_wrapper_log_error(wrapper, options, + php_stream_wrapper_log_warn(wrapper, context, options, + InvalidParam, "The file descriptors must be non-negative numbers smaller than %d", dtablesize); return NULL; } fd = dup((int)fildes_ori); if (fd == -1) { - php_stream_wrapper_log_error(wrapper, options, + php_stream_wrapper_log_warn(wrapper, context, options, + DupFailed, "Error duping file descriptor " ZEND_LONG_FMT "; possibly it doesn't exist: " "[%d]: %s", fildes_ori, errno, strerror(errno)); return NULL; @@ -380,7 +393,8 @@ static php_stream * php_stream_url_wrap_php(php_stream_wrapper *wrapper, const c return stream; } else { /* invalid php://thingy */ - php_error_docref(NULL, E_WARNING, "Invalid php:// URL specified"); + php_stream_wrapper_warn(wrapper, context, options, + InvalidUrl, "Invalid php:// URL specified"); return NULL; } diff --git a/ext/standard/php_fopen_wrappers.h b/ext/standard/php_fopen_wrappers.h index 885e31ffa730..a7e027dcf89f 100644 --- a/ext/standard/php_fopen_wrappers.h +++ b/ext/standard/php_fopen_wrappers.h @@ -1,14 +1,12 @@ /* +----------------------------------------------------------------------+ - | Copyright (c) The PHP Group | + | Copyright © The PHP Group and Contributors. | +----------------------------------------------------------------------+ - | This source file is subject to version 3.01 of the PHP license, | - | that is bundled with this package in the file LICENSE, and is | - | available through the world-wide-web at the following url: | - | https://www.php.net/license/3_01.txt | - | If you did not receive a copy of the PHP license and are unable to | - | obtain it through the world-wide-web, please send a note to | - | license@php.net so we can mail you a copy immediately. | + | This source file is subject to the Modified BSD License that is | + | bundled with this package in the file LICENSE, and is available | + | through the World Wide Web at . | + | | + | SPDX-License-Identifier: BSD-3-Clause | +----------------------------------------------------------------------+ | Authors: Rasmus Lerdorf | | Jim Winstead | diff --git a/ext/standard/php_http.h b/ext/standard/php_http.h index 9350be597ea1..6192d0e63cee 100644 --- a/ext/standard/php_http.h +++ b/ext/standard/php_http.h @@ -1,14 +1,12 @@ /* +----------------------------------------------------------------------+ - | Copyright (c) The PHP Group | + | Copyright © The PHP Group and Contributors. | +----------------------------------------------------------------------+ - | This source file is subject to version 3.01 of the PHP license, | - | that is bundled with this package in the file LICENSE, and is | - | available through the world-wide-web at the following url: | - | https://www.php.net/license/3_01.txt | - | If you did not receive a copy of the PHP license and are unable to | - | obtain it through the world-wide-web, please send a note to | - | license@php.net so we can mail you a copy immediately. | + | This source file is subject to the Modified BSD License that is | + | bundled with this package in the file LICENSE, and is available | + | through the World Wide Web at . | + | | + | SPDX-License-Identifier: BSD-3-Clause | +----------------------------------------------------------------------+ | Authors: Sara Golemon | +----------------------------------------------------------------------+ diff --git a/ext/standard/php_image.h b/ext/standard/php_image.h index 6a4e0987d13d..ea57214bda0b 100644 --- a/ext/standard/php_image.h +++ b/ext/standard/php_image.h @@ -1,14 +1,12 @@ /* +----------------------------------------------------------------------+ - | Copyright (c) The PHP Group | + | Copyright © The PHP Group and Contributors. | +----------------------------------------------------------------------+ - | This source file is subject to version 3.01 of the PHP license, | - | that is bundled with this package in the file LICENSE, and is | - | available through the world-wide-web at the following url: | - | https://www.php.net/license/3_01.txt | - | If you did not receive a copy of the PHP license and are unable to | - | obtain it through the world-wide-web, please send a note to | - | license@php.net so we can mail you a copy immediately. | + | This source file is subject to the Modified BSD License that is | + | bundled with this package in the file LICENSE, and is available | + | through the World Wide Web at . | + | | + | SPDX-License-Identifier: BSD-3-Clause | +----------------------------------------------------------------------+ | Authors: Rasmus Lerdorf | | Marcus Boerger | diff --git a/ext/standard/php_incomplete_class.h b/ext/standard/php_incomplete_class.h index 07eabf60d5dc..fb49eaf1b693 100644 --- a/ext/standard/php_incomplete_class.h +++ b/ext/standard/php_incomplete_class.h @@ -1,14 +1,12 @@ /* +----------------------------------------------------------------------+ - | Copyright (c) The PHP Group | + | Copyright © The PHP Group and Contributors. | +----------------------------------------------------------------------+ - | This source file is subject to version 3.01 of the PHP license, | - | that is bundled with this package in the file LICENSE, and is | - | available through the world-wide-web at the following url: | - | https://www.php.net/license/3_01.txt | - | If you did not receive a copy of the PHP license and are unable to | - | obtain it through the world-wide-web, please send a note to | - | license@php.net so we can mail you a copy immediately. | + | This source file is subject to the Modified BSD License that is | + | bundled with this package in the file LICENSE, and is available | + | through the World Wide Web at . | + | | + | SPDX-License-Identifier: BSD-3-Clause | +----------------------------------------------------------------------+ | Author: Sascha Schumann | +----------------------------------------------------------------------+ diff --git a/ext/standard/php_mail.h b/ext/standard/php_mail.h index bebb526699d0..f7320f1d0700 100644 --- a/ext/standard/php_mail.h +++ b/ext/standard/php_mail.h @@ -1,14 +1,12 @@ /* +----------------------------------------------------------------------+ - | Copyright (c) The PHP Group | + | Copyright © The PHP Group and Contributors. | +----------------------------------------------------------------------+ - | This source file is subject to version 3.01 of the PHP license, | - | that is bundled with this package in the file LICENSE, and is | - | available through the world-wide-web at the following url: | - | https://www.php.net/license/3_01.txt | - | If you did not receive a copy of the PHP license and are unable to | - | obtain it through the world-wide-web, please send a note to | - | license@php.net so we can mail you a copy immediately. | + | This source file is subject to the Modified BSD License that is | + | bundled with this package in the file LICENSE, and is available | + | through the World Wide Web at . | + | | + | SPDX-License-Identifier: BSD-3-Clause | +----------------------------------------------------------------------+ | Author: Rasmus Lerdorf | +----------------------------------------------------------------------+ diff --git a/ext/standard/php_math.h b/ext/standard/php_math.h index 9ebd600537fd..cb0b9db21599 100644 --- a/ext/standard/php_math.h +++ b/ext/standard/php_math.h @@ -1,14 +1,12 @@ /* +----------------------------------------------------------------------+ - | Copyright (c) The PHP Group | + | Copyright © The PHP Group and Contributors. | +----------------------------------------------------------------------+ - | This source file is subject to version 3.01 of the PHP license, | - | that is bundled with this package in the file LICENSE, and is | - | available through the world-wide-web at the following url: | - | https://www.php.net/license/3_01.txt | - | If you did not receive a copy of the PHP license and are unable to | - | obtain it through the world-wide-web, please send a note to | - | license@php.net so we can mail you a copy immediately. | + | This source file is subject to the Modified BSD License that is | + | bundled with this package in the file LICENSE, and is available | + | through the World Wide Web at . | + | | + | SPDX-License-Identifier: BSD-3-Clause | +----------------------------------------------------------------------+ | Authors: Jim Winstead | | Stig Sæther Bakken | diff --git a/ext/standard/php_math_round_mode.h b/ext/standard/php_math_round_mode.h index 9ab02de2c361..abc3c7e284a5 100644 --- a/ext/standard/php_math_round_mode.h +++ b/ext/standard/php_math_round_mode.h @@ -1,14 +1,12 @@ /* +----------------------------------------------------------------------+ - | Copyright (c) The PHP Group | + | Copyright © The PHP Group and Contributors. | +----------------------------------------------------------------------+ - | This source file is subject to version 3.01 of the PHP license, | - | that is bundled with this package in the file LICENSE, and is | - | available through the world-wide-web at the following url: | - | https://www.php.net/license/3_01.txt | - | If you did not receive a copy of the PHP license and are unable to | - | obtain it through the world-wide-web, please send a note to | - | license@php.net so we can mail you a copy immediately. | + | This source file is subject to the Modified BSD License that is | + | bundled with this package in the file LICENSE, and is available | + | through the World Wide Web at . | + | | + | SPDX-License-Identifier: BSD-3-Clause | +----------------------------------------------------------------------+ | Authors: Jim Winstead | | Stig Sæther Bakken | diff --git a/ext/standard/php_net.h b/ext/standard/php_net.h index 58739131232d..beabb12caac9 100644 --- a/ext/standard/php_net.h +++ b/ext/standard/php_net.h @@ -1,14 +1,12 @@ /* +----------------------------------------------------------------------+ - | Copyright (c) The PHP Group | + | Copyright © The PHP Group and Contributors. | +----------------------------------------------------------------------+ - | This source file is subject to version 3.01 of the PHP license, | - | that is bundled with this package in the file LICENSE, and is | - | available through the world-wide-web at the following url: | - | https://www.php.net/license/3_01.txt | - | If you did not receive a copy of the PHP license and are unable to | - | obtain it through the world-wide-web, please send a note to | - | license@php.net so we can mail you a copy immediately. | + | This source file is subject to the Modified BSD License that is | + | bundled with this package in the file LICENSE, and is available | + | through the World Wide Web at . | + | | + | SPDX-License-Identifier: BSD-3-Clause | +----------------------------------------------------------------------+ | Authors: Sara Golemon | +----------------------------------------------------------------------+ diff --git a/ext/standard/php_password.h b/ext/standard/php_password.h index 5a6f3b2af5c9..6442b782c256 100644 --- a/ext/standard/php_password.h +++ b/ext/standard/php_password.h @@ -1,14 +1,12 @@ /* +----------------------------------------------------------------------+ - | Copyright (c) The PHP Group | + | Copyright © The PHP Group and Contributors. | +----------------------------------------------------------------------+ - | This source file is subject to version 3.01 of the PHP license, | - | that is bundled with this package in the file LICENSE, and is | - | available through the world-wide-web at the following url: | - | https://www.php.net/license/3_01.txt | - | If you did not receive a copy of the PHP license and are unable to | - | obtain it through the world-wide-web, please send a note to | - | license@php.net so we can mail you a copy immediately. | + | This source file is subject to the Modified BSD License that is | + | bundled with this package in the file LICENSE, and is available | + | through the World Wide Web at . | + | | + | SPDX-License-Identifier: BSD-3-Clause | +----------------------------------------------------------------------+ | Authors: Anthony Ferrara | | Charles R. Portwood II | diff --git a/ext/standard/php_standard.h b/ext/standard/php_standard.h index 5bc792362bbd..34715e966683 100644 --- a/ext/standard/php_standard.h +++ b/ext/standard/php_standard.h @@ -1,16 +1,12 @@ /* +----------------------------------------------------------------------+ - | Copyright (c) The PHP Group | + | Copyright © The PHP Group and Contributors. | +----------------------------------------------------------------------+ - | This source file is subject to version 3.01 of the PHP license, | - | that is bundled with this package in the file LICENSE, and is | - | available through the world-wide-web at the following url: | - | https://www.php.net/license/3_01.txt | - | If you did not receive a copy of the PHP license and are unable to | - | obtain it through the world-wide-web, please send a note to | - | license@php.net so we can mail you a copy immediately. | - +----------------------------------------------------------------------+ - | Author: | + | This source file is subject to the Modified BSD License that is | + | bundled with this package in the file LICENSE, and is available | + | through the World Wide Web at . | + | | + | SPDX-License-Identifier: BSD-3-Clause | +----------------------------------------------------------------------+ */ diff --git a/ext/standard/php_string.h b/ext/standard/php_string.h index ef62329ba8ed..86c331f8a7c5 100644 --- a/ext/standard/php_string.h +++ b/ext/standard/php_string.h @@ -1,14 +1,12 @@ /* +----------------------------------------------------------------------+ - | Copyright (c) The PHP Group | + | Copyright © The PHP Group and Contributors. | +----------------------------------------------------------------------+ - | This source file is subject to version 3.01 of the PHP license, | - | that is bundled with this package in the file LICENSE, and is | - | available through the world-wide-web at the following url: | - | https://www.php.net/license/3_01.txt | - | If you did not receive a copy of the PHP license and are unable to | - | obtain it through the world-wide-web, please send a note to | - | license@php.net so we can mail you a copy immediately. | + | This source file is subject to the Modified BSD License that is | + | bundled with this package in the file LICENSE, and is available | + | through the World Wide Web at . | + | | + | SPDX-License-Identifier: BSD-3-Clause | +----------------------------------------------------------------------+ | Authors: Rasmus Lerdorf | | Stig Sæther Bakken | diff --git a/ext/standard/php_uuencode.h b/ext/standard/php_uuencode.h index da3d601851d9..e3d810f1c95f 100644 --- a/ext/standard/php_uuencode.h +++ b/ext/standard/php_uuencode.h @@ -1,14 +1,12 @@ /* +----------------------------------------------------------------------+ - | Copyright (c) The PHP Group | + | Copyright © The PHP Group and Contributors. | +----------------------------------------------------------------------+ - | This source file is subject to version 3.01 of the PHP license, | - | that is bundled with this package in the file LICENSE, and is | - | available through the world-wide-web at the following url: | - | https://www.php.net/license/3_01.txt | - | If you did not receive a copy of the PHP license and are unable to | - | obtain it through the world-wide-web, please send a note to | - | license@php.net so we can mail you a copy immediately. | + | This source file is subject to the Modified BSD License that is | + | bundled with this package in the file LICENSE, and is available | + | through the World Wide Web at . | + | | + | SPDX-License-Identifier: BSD-3-Clause | +----------------------------------------------------------------------+ | Author: Ilia Alshanetsky | +----------------------------------------------------------------------+ diff --git a/ext/standard/php_var.h b/ext/standard/php_var.h index d70bbfed814a..8839a2f3df73 100644 --- a/ext/standard/php_var.h +++ b/ext/standard/php_var.h @@ -1,14 +1,12 @@ /* +----------------------------------------------------------------------+ - | Copyright (c) The PHP Group | + | Copyright © The PHP Group and Contributors. | +----------------------------------------------------------------------+ - | This source file is subject to version 3.01 of the PHP license, | - | that is bundled with this package in the file LICENSE, and is | - | available through the world-wide-web at the following url: | - | https://www.php.net/license/3_01.txt | - | If you did not receive a copy of the PHP license and are unable to | - | obtain it through the world-wide-web, please send a note to | - | license@php.net so we can mail you a copy immediately. | + | This source file is subject to the Modified BSD License that is | + | bundled with this package in the file LICENSE, and is available | + | through the World Wide Web at . | + | | + | SPDX-License-Identifier: BSD-3-Clause | +----------------------------------------------------------------------+ | Author: Jani Lehtimäki | +----------------------------------------------------------------------+ diff --git a/ext/standard/php_versioning.h b/ext/standard/php_versioning.h index 307ac1234a8c..da3748079aa3 100644 --- a/ext/standard/php_versioning.h +++ b/ext/standard/php_versioning.h @@ -1,14 +1,12 @@ /* +----------------------------------------------------------------------+ - | Copyright (c) The PHP Group | + | Copyright © The PHP Group and Contributors. | +----------------------------------------------------------------------+ - | This source file is subject to version 3.01 of the PHP license, | - | that is bundled with this package in the file LICENSE, and is | - | available through the world-wide-web at the following url: | - | https://www.php.net/license/3_01.txt | - | If you did not receive a copy of the PHP license and are unable to | - | obtain it through the world-wide-web, please send a note to | - | license@php.net so we can mail you a copy immediately. | + | This source file is subject to the Modified BSD License that is | + | bundled with this package in the file LICENSE, and is available | + | through the World Wide Web at . | + | | + | SPDX-License-Identifier: BSD-3-Clause | +----------------------------------------------------------------------+ | Author: Stig Sæther Bakken | +----------------------------------------------------------------------+ diff --git a/ext/standard/proc_open.c b/ext/standard/proc_open.c index 55f4dd484958..bd7a2e58854f 100644 --- a/ext/standard/proc_open.c +++ b/ext/standard/proc_open.c @@ -1,14 +1,12 @@ /* +----------------------------------------------------------------------+ - | Copyright (c) The PHP Group | + | Copyright © The PHP Group and Contributors. | +----------------------------------------------------------------------+ - | This source file is subject to version 3.01 of the PHP license, | - | that is bundled with this package in the file LICENSE, and is | - | available through the world-wide-web at the following url: | - | https://www.php.net/license/3_01.txt | - | If you did not receive a copy of the PHP license and are unable to | - | obtain it through the world-wide-web, please send a note to | - | license@php.net so we can mail you a copy immediately. | + | This source file is subject to the Modified BSD License that is | + | bundled with this package in the file LICENSE, and is available | + | through the World Wide Web at . | + | | + | SPDX-License-Identifier: BSD-3-Clause | +----------------------------------------------------------------------+ | Author: Wez Furlong | +----------------------------------------------------------------------+ @@ -35,7 +33,7 @@ #include #endif -#ifdef HAVE_POSIX_SPAWN_FILE_ACTIONS_ADDCHDIR_NP +#if defined(HAVE_POSIX_SPAWN_FILE_ACTIONS_ADDCHDIR_NP) || defined(HAVE_POSIX_SPAWN_FILE_ACTIONS_ADDCHDIR) /* Only defined on glibc >= 2.29, FreeBSD CURRENT, musl >= 1.1.24, * MacOS Catalina or later.. * It should be possible to modify this so it is also @@ -45,6 +43,13 @@ */ #include #define USE_POSIX_SPAWN + +/* The non-_np variant is in macOS 26 (and _np deprecated) */ +#ifdef HAVE_POSIX_SPAWN_FILE_ACTIONS_ADDCHDIR +#define POSIX_SPAWN_FILE_ACTIONS_ADDCHDIR posix_spawn_file_actions_addchdir +#else +#define POSIX_SPAWN_FILE_ACTIONS_ADDCHDIR posix_spawn_file_actions_addchdir_np +#endif #endif /* This symbol is defined in ext/standard/config.m4. @@ -1017,7 +1022,7 @@ static zend_result redirect_proc_descriptor(descriptorspec_item *desc, int targe case 0: redirect_to = GetStdHandle(STD_INPUT_HANDLE); break; case 1: redirect_to = GetStdHandle(STD_OUTPUT_HANDLE); break; case 2: redirect_to = GetStdHandle(STD_ERROR_HANDLE); break; - EMPTY_SWITCH_DEFAULT_CASE() + default: ZEND_UNREACHABLE(); } #endif } @@ -1235,7 +1240,7 @@ PHP_FUNCTION(proc_open) Z_PARAM_ARRAY_HT(descriptorspec) Z_PARAM_ZVAL(pipes) Z_PARAM_OPTIONAL - Z_PARAM_STRING_OR_NULL(cwd, cwd_len) + Z_PARAM_PATH_OR_NULL(cwd, cwd_len) Z_PARAM_ARRAY_HT_OR_NULL(environment) Z_PARAM_ARRAY_OR_NULL(other_options) ZEND_PARSE_PARAMETERS_END(); @@ -1372,7 +1377,6 @@ PHP_FUNCTION(proc_open) if (newprocok == FALSE) { DWORD dw = GetLastError(); - close_all_descriptors(descriptors, ndesc); char *msg = php_win32_error_to_msg(dw); php_error_docref(NULL, E_WARNING, "CreateProcess failed: %s", msg); php_win32_error_msg_free(msg); @@ -1389,14 +1393,13 @@ PHP_FUNCTION(proc_open) if (close_parentends_of_pipes(&factions, descriptors, ndesc) == FAILURE) { posix_spawn_file_actions_destroy(&factions); - close_all_descriptors(descriptors, ndesc); goto exit_fail; } if (cwd) { - r = posix_spawn_file_actions_addchdir_np(&factions, cwd); + r = POSIX_SPAWN_FILE_ACTIONS_ADDCHDIR(&factions, cwd); if (r != 0) { - php_error_docref(NULL, E_WARNING, "posix_spawn_file_actions_addchdir_np() failed: %s", strerror(r)); + php_error_docref(NULL, E_WARNING, ZEND_TOSTR(POSIX_SPAWN_FILE_ACTIONS_ADDCHDIR) "() failed: %s", strerror(r)); } } @@ -1409,7 +1412,6 @@ PHP_FUNCTION(proc_open) } posix_spawn_file_actions_destroy(&factions); if (r != 0) { - close_all_descriptors(descriptors, ndesc); php_error_docref(NULL, E_WARNING, "posix_spawn() failed: %s", strerror(r)); goto exit_fail; } @@ -1451,7 +1453,6 @@ PHP_FUNCTION(proc_open) _exit(127); } else if (child < 0) { /* Failed to fork() */ - close_all_descriptors(descriptors, ndesc); php_error_docref(NULL, E_WARNING, "Fork failed: %s", strerror(errno)); goto exit_fail; } @@ -1541,6 +1542,9 @@ PHP_FUNCTION(proc_open) } else { exit_fail: _php_free_envp(env); + if (descriptors) { + close_all_descriptors(descriptors, ndesc); + } RETVAL_FALSE; } diff --git a/ext/standard/proc_open.h b/ext/standard/proc_open.h index 2dba712f995f..6a9e0533bfd2 100644 --- a/ext/standard/proc_open.h +++ b/ext/standard/proc_open.h @@ -1,14 +1,12 @@ /* +----------------------------------------------------------------------+ - | Copyright (c) The PHP Group | + | Copyright © The PHP Group and Contributors. | +----------------------------------------------------------------------+ - | This source file is subject to version 3.01 of the PHP license, | - | that is bundled with this package in the file LICENSE, and is | - | available through the world-wide-web at the following url: | - | https://www.php.net/license/3_01.txt | - | If you did not receive a copy of the PHP license and are unable to | - | obtain it through the world-wide-web, please send a note to | - | license@php.net so we can mail you a copy immediately. | + | This source file is subject to the Modified BSD License that is | + | bundled with this package in the file LICENSE, and is available | + | through the World Wide Web at . | + | | + | SPDX-License-Identifier: BSD-3-Clause | +----------------------------------------------------------------------+ | Author: Wez Furlong | +----------------------------------------------------------------------+ diff --git a/ext/standard/quot_print.c b/ext/standard/quot_print.c index a7132df2f7fd..e9d8fafb9987 100644 --- a/ext/standard/quot_print.c +++ b/ext/standard/quot_print.c @@ -1,14 +1,12 @@ /* +----------------------------------------------------------------------+ - | Copyright (c) The PHP Group | + | Copyright © The PHP Group and Contributors. | +----------------------------------------------------------------------+ - | This source file is subject to version 3.01 of the PHP license, | - | that is bundled with this package in the file LICENSE, and is | - | available through the world-wide-web at the following url: | - | https://www.php.net/license/3_01.txt | - | If you did not receive a copy of the PHP license and are unable to | - | obtain it through the world-wide-web, please send a note to | - | license@php.net so we can mail you a copy immediately. | + | This source file is subject to the Modified BSD License that is | + | bundled with this package in the file LICENSE, and is available | + | through the World Wide Web at . | + | | + | SPDX-License-Identifier: BSD-3-Clause | +----------------------------------------------------------------------+ | Author: Kirill Maximov | +----------------------------------------------------------------------+ @@ -212,11 +210,11 @@ PHP_FUNCTION(quoted_printable_decode) switch (str_in[i]) { case '=': if (str_in[i + 1] && str_in[i + 2] && - isxdigit((int) str_in[i + 1]) && - isxdigit((int) str_in[i + 2])) + isxdigit((unsigned char)str_in[i + 1]) && + isxdigit((unsigned char)str_in[i + 2])) { - ZSTR_VAL(str_out)[j++] = (php_hex2int((int) str_in[i + 1]) << 4) - + php_hex2int((int) str_in[i + 2]); + ZSTR_VAL(str_out)[j++] = (php_hex2int((unsigned char)str_in[i + 1]) << 4) + + php_hex2int((unsigned char)str_in[i + 2]); i += 3; } else /* check for soft line break according to RFC 2045*/ { k = 1; diff --git a/ext/standard/quot_print.h b/ext/standard/quot_print.h index 11b829d974b8..faf515210695 100644 --- a/ext/standard/quot_print.h +++ b/ext/standard/quot_print.h @@ -1,14 +1,12 @@ /* +----------------------------------------------------------------------+ - | Copyright (c) The PHP Group | + | Copyright © The PHP Group and Contributors. | +----------------------------------------------------------------------+ - | This source file is subject to version 3.01 of the PHP license, | - | that is bundled with this package in the file LICENSE, and is | - | available through the world-wide-web at the following url: | - | https://www.php.net/license/3_01.txt | - | If you did not receive a copy of the PHP license and are unable to | - | obtain it through the world-wide-web, please send a note to | - | license@php.net so we can mail you a copy immediately. | + | This source file is subject to the Modified BSD License that is | + | bundled with this package in the file LICENSE, and is available | + | through the World Wide Web at . | + | | + | SPDX-License-Identifier: BSD-3-Clause | +----------------------------------------------------------------------+ | Author: Kirill Maximov (kir@rus.net) | +----------------------------------------------------------------------+ diff --git a/ext/standard/scanf.c b/ext/standard/scanf.c index 408e5ede8881..5aeb585fea23 100644 --- a/ext/standard/scanf.c +++ b/ext/standard/scanf.c @@ -1,14 +1,12 @@ /* +----------------------------------------------------------------------+ - | Copyright (c) The PHP Group | + | Copyright © The PHP Group and Contributors. | +----------------------------------------------------------------------+ - | This source file is subject to version 3.01 of the PHP license, | - | that is bundled with this package in the file LICENSE, and is | - | available through the world-wide-web at the following url: | - | https://www.php.net/license/3_01.txt | - | If you did not receive a copy of the PHP license and are unable to | - | obtain it through the world-wide-web, please send a note to | - | license@php.net so we can mail you a copy immediately. | + | This source file is subject to the Modified BSD License that is | + | bundled with this package in the file LICENSE, and is available | + | through the World Wide Web at . | + | | + | SPDX-License-Identifier: BSD-3-Clause | +----------------------------------------------------------------------+ | Author: Clayton Collie | +----------------------------------------------------------------------+ @@ -345,7 +343,7 @@ PHPAPI int ValidateFormat(char *format, int numVars, int *totalSubs) goto xpgCheckDone; } - if ( isdigit( (int)*ch ) ) { + if ( isdigit( (unsigned char)*ch ) ) { /* * Check for an XPG3-style %n$ specification. Note: there * must not be a mixture of XPG3 specs and non-XPG3 specs @@ -656,9 +654,9 @@ PHPAPI int php_sscanf_internal( char *string, char *format, /* * If we see whitespace in the format, skip whitespace in the string. */ - if ( isspace( (int)*ch ) ) { + if ( isspace( (unsigned char)*ch ) ) { sch = *string; - while ( isspace( (int)sch ) ) { + while ( isspace( (unsigned char)sch ) ) { if (*string == '\0') { goto done; } @@ -809,7 +807,7 @@ PHPAPI int php_sscanf_internal( char *string, char *format, if (!(flags & SCAN_NOSKIP)) { while (*string != '\0') { sch = *string; - if (! isspace((int)sch) ) { + if (! isspace((unsigned char)sch) ) { break; } string++; @@ -835,7 +833,7 @@ PHPAPI int php_sscanf_internal( char *string, char *format, end = string; while (*end != '\0') { sch = *end; - if ( isspace( (int)sch ) ) { + if ( isspace( (unsigned char)sch ) ) { break; } end++; diff --git a/ext/standard/scanf.h b/ext/standard/scanf.h index d2ef2fc0f2e8..c60a2b664ad4 100644 --- a/ext/standard/scanf.h +++ b/ext/standard/scanf.h @@ -1,14 +1,12 @@ /* +----------------------------------------------------------------------+ - | Copyright (c) The PHP Group | + | Copyright © The PHP Group and Contributors. | +----------------------------------------------------------------------+ - | This source file is subject to version 3.01 of the PHP license, | - | that is bundled with this package in the file LICENSE, and is | - | available through the world-wide-web at the following url: | - | https://www.php.net/license/3_01.txt | - | If you did not receive a copy of the PHP license and are unable to | - | obtain it through the world-wide-web, please send a note to | - | license@php.net so we can mail you a copy immediately. | + | This source file is subject to the Modified BSD License that is | + | bundled with this package in the file LICENSE, and is available | + | through the World Wide Web at . | + | | + | SPDX-License-Identifier: BSD-3-Clause | +----------------------------------------------------------------------+ | Author: Clayton Collie | +----------------------------------------------------------------------+ diff --git a/ext/standard/sha1.c b/ext/standard/sha1.c index 95f2b54d0fd0..4832756f577a 100644 --- a/ext/standard/sha1.c +++ b/ext/standard/sha1.c @@ -1,14 +1,12 @@ /* +----------------------------------------------------------------------+ - | Copyright (c) The PHP Group | + | Copyright © The PHP Group and Contributors. | +----------------------------------------------------------------------+ - | This source file is subject to version 3.01 of the PHP license, | - | that is bundled with this package in the file LICENSE, and is | - | available through the world-wide-web at the following url: | - | https://www.php.net/license/3_01.txt | - | If you did not receive a copy of the PHP license and are unable to | - | obtain it through the world-wide-web, please send a note to | - | license@php.net so we can mail you a copy immediately. | + | This source file is subject to the Modified BSD License that is | + | bundled with this package in the file LICENSE, and is available | + | through the World Wide Web at . | + | | + | SPDX-License-Identifier: BSD-3-Clause | +----------------------------------------------------------------------+ | Author: Stefan Esser | +----------------------------------------------------------------------+ diff --git a/ext/standard/sha1.h b/ext/standard/sha1.h index 046d6db2cc47..a1f4801736b1 100644 --- a/ext/standard/sha1.h +++ b/ext/standard/sha1.h @@ -1,14 +1,12 @@ /* +----------------------------------------------------------------------+ - | Copyright (c) The PHP Group | + | Copyright © The PHP Group and Contributors. | +----------------------------------------------------------------------+ - | This source file is subject to version 3.01 of the PHP license, | - | that is bundled with this package in the file LICENSE, and is | - | available through the world-wide-web at the following url: | - | https://www.php.net/license/3_01.txt | - | If you did not receive a copy of the PHP license and are unable to | - | obtain it through the world-wide-web, please send a note to | - | license@php.net so we can mail you a copy immediately. | + | This source file is subject to the Modified BSD License that is | + | bundled with this package in the file LICENSE, and is available | + | through the World Wide Web at . | + | | + | SPDX-License-Identifier: BSD-3-Clause | +----------------------------------------------------------------------+ | Author: Stefan Esser | +----------------------------------------------------------------------+ diff --git a/ext/standard/soundex.c b/ext/standard/soundex.c index 5c45f4d3ef67..f06c3ac98572 100644 --- a/ext/standard/soundex.c +++ b/ext/standard/soundex.c @@ -1,14 +1,12 @@ /* +----------------------------------------------------------------------+ - | Copyright (c) The PHP Group | + | Copyright © The PHP Group and Contributors. | +----------------------------------------------------------------------+ - | This source file is subject to version 3.01 of the PHP license, | - | that is bundled with this package in the file LICENSE, and is | - | available through the world-wide-web at the following url: | - | https://www.php.net/license/3_01.txt | - | If you did not receive a copy of the PHP license and are unable to | - | obtain it through the world-wide-web, please send a note to | - | license@php.net so we can mail you a copy immediately. | + | This source file is subject to the Modified BSD License that is | + | bundled with this package in the file LICENSE, and is available | + | through the World Wide Web at . | + | | + | SPDX-License-Identifier: BSD-3-Clause | +----------------------------------------------------------------------+ | Author: Bjørn Borud - Guardian Networks AS | +----------------------------------------------------------------------+ @@ -65,7 +63,7 @@ PHP_FUNCTION(soundex) /* BUG: should also map here accented letters used in non */ /* English words or names (also found in English text!): */ /* esstsett, thorn, n-tilde, c-cedilla, s-caron, ... */ - code = toupper((int)(unsigned char)str[i]); + code = toupper((unsigned char)str[i]); if (code >= 'A' && code <= 'Z') { if (_small == 0) { /* remember first valid char */ diff --git a/ext/standard/streamsfuncs.c b/ext/standard/streamsfuncs.c index 506ce0dafed8..bad645f8668a 100644 --- a/ext/standard/streamsfuncs.c +++ b/ext/standard/streamsfuncs.c @@ -1,14 +1,12 @@ /* +----------------------------------------------------------------------+ - | Copyright (c) The PHP Group | + | Copyright © The PHP Group and Contributors. | +----------------------------------------------------------------------+ - | This source file is subject to version 3.01 of the PHP license, | - | that is bundled with this package in the file LICENSE, and is | - | available through the world-wide-web at the following url: | - | https://www.php.net/license/3_01.txt | - | If you did not receive a copy of the PHP license and are unable to | - | obtain it through the world-wide-web, please send a note to | - | license@php.net so we can mail you a copy immediately. | + | This source file is subject to the Modified BSD License that is | + | bundled with this package in the file LICENSE, and is available | + | through the World Wide Web at . | + | | + | SPDX-License-Identifier: BSD-3-Clause | +----------------------------------------------------------------------+ | Authors: Wez Furlong | | Sara Golemon | @@ -50,11 +48,15 @@ PHP_FUNCTION(stream_socket_pair) zend_long domain, type, protocol; php_stream *s1, *s2; php_socket_t pair[2]; + zval *zcontext = NULL; + php_stream_context *context = NULL; - ZEND_PARSE_PARAMETERS_START(3, 3) + ZEND_PARSE_PARAMETERS_START(3, 4) Z_PARAM_LONG(domain) Z_PARAM_LONG(type) Z_PARAM_LONG(protocol) + Z_PARAM_OPTIONAL + Z_PARAM_RESOURCE_OR_NULL(zcontext) ZEND_PARSE_PARAMETERS_END(); if (0 != socketpair((int)domain, (int)type, (int)protocol, pair)) { @@ -64,10 +66,14 @@ PHP_FUNCTION(stream_socket_pair) RETURN_FALSE; } + php_stream_error_operation_begin(); + context = php_stream_context_from_zval(zcontext, 0); + s1 = php_stream_sock_open_from_socket(pair[0], 0); if (s1 == NULL) { close(pair[0]); close(pair[1]); + php_stream_error_operation_end(context); php_error_docref(NULL, E_WARNING, "Failed to open stream from socketpair"); RETURN_FALSE; } @@ -75,6 +81,7 @@ PHP_FUNCTION(stream_socket_pair) if (s2 == NULL) { php_stream_free(s1, PHP_STREAM_FREE_CLOSE); close(pair[1]); + php_stream_error_operation_end(context); php_error_docref(NULL, E_WARNING, "Failed to open stream from socketpair"); RETURN_FALSE; } @@ -88,6 +95,8 @@ PHP_FUNCTION(stream_socket_pair) add_next_index_resource(return_value, s1->res); add_next_index_resource(return_value, s2->res); + + php_stream_error_operation_end(context); } /* }}} */ #endif @@ -126,6 +135,7 @@ PHP_FUNCTION(stream_socket_client) RETURN_THROWS(); } + php_stream_error_operation_begin(); context = php_stream_context_from_zval(zcontext, flags & PHP_FILE_NO_DEFAULT_CONTEXT); if (flags & PHP_STREAM_CLIENT_PERSISTENT) { @@ -160,6 +170,7 @@ PHP_FUNCTION(stream_socket_client) (flags & PHP_STREAM_CLIENT_ASYNC_CONNECT ? STREAM_XPORT_CONNECT_ASYNC : 0), hashkey, tv_pointer, context, &errstr, &err); + php_stream_error_operation_end(context); if (stream == NULL) { /* host might contain binary characters */ @@ -217,6 +228,7 @@ PHP_FUNCTION(stream_socket_server) Z_PARAM_RESOURCE_OR_NULL(zcontext) ZEND_PARSE_PARAMETERS_END(); + php_stream_error_operation_begin(); context = php_stream_context_from_zval(zcontext, flags & PHP_FILE_NO_DEFAULT_CONTEXT); if (zerrno) { @@ -230,6 +242,8 @@ PHP_FUNCTION(stream_socket_server) STREAM_XPORT_SERVER | (int)flags, NULL, NULL, context, &errstr, &err); + php_stream_error_operation_end(context); + if (stream == NULL) { php_error_docref(NULL, E_WARNING, "Unable to connect to %s (%s)", host, errstr == NULL ? "Unknown error" : ZSTR_VAL(errstr)); } @@ -295,6 +309,8 @@ PHP_FUNCTION(stream_socket_accept) tv_pointer = &tv; } + php_stream_error_operation_begin(); + if (0 == php_stream_xport_accept(stream, &clistream, zpeername ? &peername : NULL, NULL, NULL, @@ -313,6 +329,8 @@ PHP_FUNCTION(stream_socket_accept) RETVAL_FALSE; } + php_stream_error_operation_end_for_stream(stream); + if (errstr) { zend_string_release_ex(errstr, 0); } @@ -331,10 +349,11 @@ PHP_FUNCTION(stream_socket_get_name) Z_PARAM_BOOL(want_peer) ZEND_PARSE_PARAMETERS_END(); - if (0 != php_stream_xport_get_name(stream, want_peer, - &name, - NULL, NULL - ) || !name) { + php_stream_error_operation_begin(); + int ret = php_stream_xport_get_name(stream, want_peer, &name, NULL, NULL); + php_stream_error_operation_end_for_stream(stream); + + if (0 != ret || !name) { RETURN_FALSE; } @@ -365,15 +384,18 @@ PHP_FUNCTION(stream_socket_sendto) Z_PARAM_STRING(target_addr, target_addr_len) ZEND_PARSE_PARAMETERS_END(); + php_stream_error_operation_begin(); if (target_addr_len) { /* parse the address */ if (FAILURE == php_network_parse_network_address_with_port(target_addr, target_addr_len, (struct sockaddr*)&sa, &sl)) { + php_stream_error_operation_end_for_stream(stream); php_error_docref(NULL, E_WARNING, "Failed to parse `%s' into a valid network address", target_addr); RETURN_FALSE; } } - RETURN_LONG(php_stream_xport_sendto(stream, data, datalen, (int)flags, target_addr_len ? &sa : NULL, sl)); + RETVAL_LONG(php_stream_xport_sendto(stream, data, datalen, (int)flags, target_addr_len ? &sa : NULL, sl)); + php_stream_error_operation_end_for_stream(stream); } /* }}} */ @@ -407,9 +429,10 @@ PHP_FUNCTION(stream_socket_recvfrom) read_buf = zend_string_alloc(to_read, 0); + php_stream_error_operation_begin(); recvd = php_stream_xport_recvfrom(stream, ZSTR_VAL(read_buf), to_read, (int)flags, NULL, NULL, - zremote ? &remote_addr : NULL - ); + zremote ? &remote_addr : NULL); + php_stream_error_operation_end_for_stream(stream); if (recvd >= 0) { if (zremote && remote_addr) { @@ -447,6 +470,8 @@ PHP_FUNCTION(stream_get_contents) RETURN_THROWS(); } + php_stream_error_operation_begin(); + if (desiredpos >= 0) { int seek_res = 0; zend_off_t position; @@ -461,6 +486,7 @@ PHP_FUNCTION(stream_get_contents) } if (seek_res != 0) { + php_stream_error_operation_end_for_stream(stream); php_error_docref(NULL, E_WARNING, "Failed to seek to position " ZEND_LONG_FMT " in the stream", desiredpos); RETURN_FALSE; @@ -468,10 +494,11 @@ PHP_FUNCTION(stream_get_contents) } if ((contents = php_stream_copy_to_mem(stream, maxlen, 0))) { - RETURN_STR(contents); + RETVAL_STR(contents); } else { - RETURN_EMPTY_STRING(); + RETVAL_EMPTY_STRING(); } + php_stream_error_operation_end_for_stream(stream); } /* }}} */ @@ -482,28 +509,37 @@ PHP_FUNCTION(stream_copy_to_stream) zend_long maxlen, pos = 0; bool maxlen_is_null = 1; size_t len; + zval *zcontext = NULL; + php_stream_context *context = NULL; - ZEND_PARSE_PARAMETERS_START(2, 4) + ZEND_PARSE_PARAMETERS_START(2, 5) PHP_Z_PARAM_STREAM(src) PHP_Z_PARAM_STREAM(dest) Z_PARAM_OPTIONAL Z_PARAM_LONG_OR_NULL(maxlen, maxlen_is_null) Z_PARAM_LONG(pos) + Z_PARAM_RESOURCE_OR_NULL(zcontext) ZEND_PARSE_PARAMETERS_END(); if (maxlen_is_null) { maxlen = PHP_STREAM_COPY_ALL; } + php_stream_error_operation_begin(); + context = php_stream_context_from_zval(zcontext, 0); + if (pos > 0 && php_stream_seek(src, pos, SEEK_SET) < 0) { + php_stream_error_operation_end(context); php_error_docref(NULL, E_WARNING, "Failed to seek to position " ZEND_LONG_FMT " in the stream", pos); RETURN_FALSE; } if (php_stream_copy_to_stream_ex(src, dest, maxlen, &len) != SUCCESS) { - RETURN_FALSE; + RETVAL_FALSE; + } else { + RETVAL_LONG(len); } - RETURN_LONG(len); + php_stream_error_operation_end(context); } /* }}} */ @@ -518,11 +554,13 @@ PHP_FUNCTION(stream_get_meta_data) array_init(return_value); + php_stream_error_operation_begin(); if (!php_stream_populate_meta_data(stream, return_value)) { add_assoc_bool(return_value, "timed_out", 0); add_assoc_bool(return_value, "blocked", 1); add_assoc_bool(return_value, "eof", php_stream_eof(stream)); } + php_stream_error_operation_end_for_stream(stream); if (!Z_ISUNDEF(stream->wrapperdata)) { Z_ADDREF_P(&stream->wrapperdata); @@ -594,6 +632,18 @@ PHP_FUNCTION(stream_get_wrappers) } /* }}} */ +PHP_FUNCTION(stream_last_errors) +{ + ZEND_PARSE_PARAMETERS_NONE(); + php_stream_error_get_last(return_value); +} + +PHP_FUNCTION(stream_clear_errors) +{ + ZEND_PARSE_PARAMETERS_NONE(); + php_stream_error_clear_stored(); +} + /* {{{ stream_select related functions */ static int stream_array_to_fd_set(const HashTable *stream_array, fd_set *fds, php_socket_t *max_fd) { @@ -726,7 +776,7 @@ static int stream_array_emulate_read_fd_set(zval *stream_array) /* {{{ Runs the select() system call on the sets of streams with a timeout specified by tv_sec and tv_usec */ PHP_FUNCTION(stream_select) { - zval *r_array, *w_array, *e_array; + zval *r_array, *w_array, *e_array, *zcontext = NULL; struct timeval tv, *tv_p = NULL; fd_set rfds, wfds, efds; php_socket_t max_fd = 0; @@ -735,20 +785,25 @@ PHP_FUNCTION(stream_select) bool secnull; bool usecnull = 1; int set_count, max_set_count = 0; + php_stream_context *context = NULL; - ZEND_PARSE_PARAMETERS_START(4, 5) + ZEND_PARSE_PARAMETERS_START(4, 6) Z_PARAM_ARRAY_EX2(r_array, 1, 1, 0) Z_PARAM_ARRAY_EX2(w_array, 1, 1, 0) Z_PARAM_ARRAY_EX2(e_array, 1, 1, 0) Z_PARAM_LONG_OR_NULL(sec, secnull) Z_PARAM_OPTIONAL Z_PARAM_LONG_OR_NULL(usec, usecnull) + Z_PARAM_RESOURCE_OR_NULL(zcontext) ZEND_PARSE_PARAMETERS_END(); FD_ZERO(&rfds); FD_ZERO(&wfds); FD_ZERO(&efds); + php_stream_error_operation_begin(); + context = php_stream_context_from_zval(zcontext, 0); + if (r_array != NULL) { set_count = stream_array_to_fd_set(Z_ARR_P(r_array), &rfds, &max_fd); if (set_count > max_set_count) @@ -771,6 +826,7 @@ PHP_FUNCTION(stream_select) } if (!sets) { + php_stream_error_operation_end(context); zend_value_error("No stream arrays were passed"); RETURN_THROWS(); } @@ -781,6 +837,7 @@ PHP_FUNCTION(stream_select) if (secnull && !usecnull) { if (usec != 0) { + php_stream_error_operation_end(context); zend_argument_value_error(5, "must be null when argument #4 ($seconds) is null"); RETURN_THROWS(); } @@ -789,9 +846,11 @@ PHP_FUNCTION(stream_select) /* If seconds is not set to null, build the timeval, else we wait indefinitely */ if (!secnull) { if (sec < 0) { + php_stream_error_operation_end(context); zend_argument_value_error(4, "must be greater than or equal to 0"); RETURN_THROWS(); } else if (usec < 0) { + php_stream_error_operation_end(context); zend_argument_value_error(5, "must be greater than or equal to 0"); RETURN_THROWS(); } @@ -808,6 +867,7 @@ PHP_FUNCTION(stream_select) if (r_array != NULL) { retval = stream_array_emulate_read_fd_set(r_array); if (retval > 0) { + php_stream_error_operation_end(context); if (w_array != NULL) { zval_ptr_dtor(w_array); ZVAL_EMPTY_ARRAY(w_array); @@ -821,6 +881,7 @@ PHP_FUNCTION(stream_select) } retval = php_select(max_fd+1, &rfds, &wfds, &efds, tv_p); + php_stream_error_operation_end(context); if (retval == -1) { php_error_docref(NULL, E_WARNING, "Unable to select [%d]: %s (max_fd=" PHP_SOCKET_FMT ")", @@ -1147,6 +1208,24 @@ PHP_FUNCTION(stream_context_get_default) } /* }}} */ +/* Check if options contain stream error handling settings */ +static bool php_stream_context_options_has_error_settings(const HashTable *options) +{ + zval *stream_options = zend_hash_str_find(options, ZEND_STRL("stream")); + if (!stream_options) { + return false; + } + + ZVAL_DEREF(stream_options); + if (Z_TYPE_P(stream_options) != IS_ARRAY) { + return false; + } + + return zend_hash_str_exists(Z_ARRVAL_P(stream_options), ZEND_STRL("error_mode")) + || zend_hash_str_exists(Z_ARRVAL_P(stream_options), ZEND_STRL("error_store")) + || zend_hash_str_exists(Z_ARRVAL_P(stream_options), ZEND_STRL("error_handler")); +} + /* {{{ Set default file/stream context, returns the context as a resource */ PHP_FUNCTION(stream_context_set_default) { @@ -1162,6 +1241,11 @@ PHP_FUNCTION(stream_context_set_default) } context = FG(default_context); + if (php_stream_context_options_has_error_settings(options)) { + zend_value_error("Stream error handling options cannot be set on the default context"); + RETURN_THROWS(); + } + if (parse_context_options(context, options) == FAILURE) { RETURN_THROWS(); } @@ -1341,11 +1425,13 @@ PHP_FUNCTION(stream_get_line) max_length = PHP_SOCK_CHUNK_SIZE; } + php_stream_error_operation_begin(); if ((buf = php_stream_get_record(stream, max_length, str, str_len))) { - RETURN_STR(buf); + RETVAL_STR(buf); } else { - RETURN_FALSE; + RETVAL_FALSE; } + php_stream_error_operation_end_for_stream(stream); } /* }}} */ @@ -1361,7 +1447,9 @@ PHP_FUNCTION(stream_set_blocking) Z_PARAM_BOOL(block) ZEND_PARSE_PARAMETERS_END(); - RETURN_BOOL(-1 != php_stream_set_option(stream, PHP_STREAM_OPTION_BLOCKING, block, NULL)); + php_stream_error_operation_begin(); + RETVAL_BOOL(-1 != php_stream_set_option(stream, PHP_STREAM_OPTION_BLOCKING, block, NULL)); + php_stream_error_operation_end_for_stream(stream); } /* }}} */ @@ -1402,7 +1490,9 @@ PHP_FUNCTION(stream_set_timeout) } #endif - RETURN_BOOL(PHP_STREAM_OPTION_RETURN_OK == php_stream_set_option(stream, PHP_STREAM_OPTION_READ_TIMEOUT, 0, &t)); + php_stream_error_operation_begin(); + RETVAL_BOOL(PHP_STREAM_OPTION_RETURN_OK == php_stream_set_option(stream, PHP_STREAM_OPTION_READ_TIMEOUT, 0, &t)); + php_stream_error_operation_end_for_stream(stream); } #endif /* HAVE_SYS_TIME_H || defined(PHP_WIN32) */ /* }}} */ @@ -1422,12 +1512,14 @@ PHP_FUNCTION(stream_set_write_buffer) buff = arg2; + php_stream_error_operation_begin(); /* if buff is 0 then set to non-buffered */ if (buff == 0) { ret = php_stream_set_option(stream, PHP_STREAM_OPTION_WRITE_BUFFER, PHP_STREAM_BUFFER_NONE, NULL); } else { ret = php_stream_set_option(stream, PHP_STREAM_OPTION_WRITE_BUFFER, PHP_STREAM_BUFFER_FULL, &buff); } + php_stream_error_operation_end_for_stream(stream); RETURN_LONG(ret == 0 ? 0 : EOF); } @@ -1458,7 +1550,9 @@ PHP_FUNCTION(stream_set_chunk_size) RETURN_THROWS(); } + php_stream_error_operation_begin(); ret = php_stream_set_option(stream, PHP_STREAM_OPTION_SET_CHUNK_SIZE, (int)csize, NULL); + php_stream_error_operation_end_for_stream(stream); RETURN_LONG(ret > 0 ? (zend_long)ret : (zend_long)EOF); } @@ -1479,12 +1573,14 @@ PHP_FUNCTION(stream_set_read_buffer) buff = arg2; + php_stream_error_operation_begin(); /* if buff is 0 then set to non-buffered */ if (buff == 0) { ret = php_stream_set_option(stream, PHP_STREAM_OPTION_READ_BUFFER, PHP_STREAM_BUFFER_NONE, NULL); } else { ret = php_stream_set_option(stream, PHP_STREAM_OPTION_READ_BUFFER, PHP_STREAM_BUFFER_FULL, &buff); } + php_stream_error_operation_end_for_stream(stream); RETURN_LONG(ret == 0 ? 0 : EOF); } @@ -1506,11 +1602,14 @@ PHP_FUNCTION(stream_socket_enable_crypto) PHP_Z_PARAM_STREAM_OR_NULL(sessstream) ZEND_PARSE_PARAMETERS_END(); + php_stream_error_operation_begin(); + if (enable) { if (cryptokindnull) { zval *val; if (!GET_CTX_OPT(stream, "ssl", "crypto_method", val)) { + php_stream_error_operation_end_for_stream(stream); zend_argument_value_error(3, "must be specified when enabling encryption"); RETURN_THROWS(); } @@ -1519,11 +1618,13 @@ PHP_FUNCTION(stream_socket_enable_crypto) } if (php_stream_xport_crypto_setup(stream, cryptokind, sessstream) < 0) { + php_stream_error_operation_end_for_stream(stream); RETURN_FALSE; } } ret = php_stream_xport_crypto_enable(stream, enable); + php_stream_error_operation_end_for_stream(stream); switch (ret) { case -1: RETURN_FALSE; @@ -1537,6 +1638,18 @@ PHP_FUNCTION(stream_socket_enable_crypto) } /* }}} */ +/* Get crypto status */ +PHP_FUNCTION(stream_socket_get_crypto_status) +{ + php_stream *stream; + + ZEND_PARSE_PARAMETERS_START(1, 1) + PHP_Z_PARAM_STREAM(stream) + ZEND_PARSE_PARAMETERS_END(); + + RETURN_LONG(php_stream_xport_crypto_get_status(stream)); +} + /* {{{ Determine what file will be opened by calls to fopen() with a relative path */ PHP_FUNCTION(stream_resolve_include_path) { @@ -1559,12 +1672,15 @@ PHP_FUNCTION(stream_resolve_include_path) /* {{{ */ PHP_FUNCTION(stream_is_local) { - zval *zstream; + zval *zstream, *zcontext = NULL; php_stream *stream = NULL; php_stream_wrapper *wrapper = NULL; + php_stream_context *context = NULL; - ZEND_PARSE_PARAMETERS_START(1, 1) + ZEND_PARSE_PARAMETERS_START(1, 2) Z_PARAM_ZVAL(zstream) + Z_PARAM_OPTIONAL + Z_PARAM_RESOURCE_OR_NULL(zcontext) ZEND_PARSE_PARAMETERS_END(); if (Z_TYPE_P(zstream) == IS_RESOURCE) { @@ -1575,7 +1691,10 @@ PHP_FUNCTION(stream_is_local) RETURN_THROWS(); } + php_stream_error_operation_begin(); + context = php_stream_context_from_zval(zcontext, 0); wrapper = php_stream_locate_url_wrapper(Z_STRVAL_P(zstream), NULL, 0); + php_stream_error_operation_end(context); } RETURN_BOOL(wrapper && wrapper->is_url == 0); @@ -1591,7 +1710,9 @@ PHP_FUNCTION(stream_supports_lock) PHP_Z_PARAM_STREAM(stream) ZEND_PARSE_PARAMETERS_END(); - RETURN_BOOL(php_stream_supports_lock(stream)); + php_stream_error_operation_begin(); + RETVAL_BOOL(php_stream_supports_lock(stream)); + php_stream_error_operation_end_for_stream(stream); } /* {{{ Check if a stream is a TTY. */ @@ -1604,6 +1725,8 @@ PHP_FUNCTION(stream_isatty) PHP_Z_PARAM_STREAM(stream) ZEND_PARSE_PARAMETERS_END(); + php_stream_error_operation_begin(); + /* get the fd. * NB: Most other code will NOT use the PHP_STREAM_CAST_INTERNAL flag when casting. * It is only used here so that the buffered data warning is not displayed. @@ -1613,8 +1736,10 @@ PHP_FUNCTION(stream_isatty) } else if (php_stream_can_cast(stream, PHP_STREAM_AS_FD | PHP_STREAM_CAST_INTERNAL) == SUCCESS) { php_stream_cast(stream, PHP_STREAM_AS_FD | PHP_STREAM_CAST_INTERNAL, (void*)&fileno, 0); } else { + php_stream_error_operation_end_for_stream(stream); RETURN_FALSE; } + php_stream_error_operation_end_for_stream(stream); #ifdef PHP_WIN32 /* Check if the Windows standard handle is redirected to file */ @@ -1644,6 +1769,8 @@ PHP_FUNCTION(sapi_windows_vt100_support) Z_PARAM_BOOL_OR_NULL(enable, enable_is_null) ZEND_PARSE_PARAMETERS_END(); + php_stream_error_operation_begin(); + /* get the fd. * NB: Most other code will NOT use the PHP_STREAM_CAST_INTERNAL flag when casting. * It is only used here so that the buffered data warning is not displayed. @@ -1653,6 +1780,7 @@ PHP_FUNCTION(sapi_windows_vt100_support) } else if (php_stream_can_cast(stream, PHP_STREAM_AS_FD | PHP_STREAM_CAST_INTERNAL) == SUCCESS) { php_stream_cast(stream, PHP_STREAM_AS_FD | PHP_STREAM_CAST_INTERNAL, (void*)&fileno, 0); } else { + php_stream_error_operation_end_for_stream(stream); if (!enable_is_null) { php_error_docref( NULL, @@ -1662,6 +1790,7 @@ PHP_FUNCTION(sapi_windows_vt100_support) } RETURN_FALSE; } + php_stream_error_operation_end_for_stream(stream); /* Check if the file descriptor is a console */ if (!php_win32_console_fileno_is_console(fileno)) { @@ -1701,7 +1830,9 @@ PHP_FUNCTION(stream_socket_shutdown) RETURN_THROWS(); } - RETURN_BOOL(php_stream_xport_shutdown(stream, (stream_shutdown_t)how) == 0); + php_stream_error_operation_begin(); + RETVAL_BOOL(php_stream_xport_shutdown(stream, (stream_shutdown_t)how) == 0); + php_stream_error_operation_end_for_stream(stream); } /* }}} */ #endif diff --git a/ext/standard/streamsfuncs.h b/ext/standard/streamsfuncs.h index 41058472473d..7d6f523bfcd0 100644 --- a/ext/standard/streamsfuncs.h +++ b/ext/standard/streamsfuncs.h @@ -1,14 +1,12 @@ /* +----------------------------------------------------------------------+ - | Copyright (c) The PHP Group | + | Copyright © The PHP Group and Contributors. | +----------------------------------------------------------------------+ - | This source file is subject to version 3.01 of the PHP license, | - | that is bundled with this package in the file LICENSE, and is | - | available through the world-wide-web at the following url: | - | https://www.php.net/license/3_01.txt | - | If you did not receive a copy of the PHP license and are unable to | - | obtain it through the world-wide-web, please send a note to | - | license@php.net so we can mail you a copy immediately. | + | This source file is subject to the Modified BSD License that is | + | bundled with this package in the file LICENSE, and is available | + | through the World Wide Web at . | + | | + | SPDX-License-Identifier: BSD-3-Clause | +----------------------------------------------------------------------+ | Authors: Wez Furlong | +----------------------------------------------------------------------+ diff --git a/ext/standard/string.c b/ext/standard/string.c index 7d609a032dd1..006adc4467d3 100644 --- a/ext/standard/string.c +++ b/ext/standard/string.c @@ -1,14 +1,12 @@ /* +----------------------------------------------------------------------+ - | Copyright (c) The PHP Group | + | Copyright © The PHP Group and Contributors. | +----------------------------------------------------------------------+ - | This source file is subject to version 3.01 of the PHP license, | - | that is bundled with this package in the file LICENSE, and is | - | available through the world-wide-web at the following url: | - | https://www.php.net/license/3_01.txt | - | If you did not receive a copy of the PHP license and are unable to | - | obtain it through the world-wide-web, please send a note to | - | license@php.net so we can mail you a copy immediately. | + | This source file is subject to the Modified BSD License that is | + | bundled with this package in the file LICENSE, and is available | + | through the World Wide Web at . | + | | + | SPDX-License-Identifier: BSD-3-Clause | +----------------------------------------------------------------------+ | Authors: Rasmus Lerdorf | | Stig Sæther Bakken | @@ -916,7 +914,7 @@ PHP_FUNCTION(explode) ZEND_PARSE_PARAMETERS_END(); if (ZSTR_LEN(delim) == 0) { - zend_argument_must_not_be_empty_error(1); + zend_argument_value_error(1, "must not be empty, use str_split() to split a string into characters"); RETURN_THROWS(); } @@ -1591,6 +1589,16 @@ PHP_FUNCTION(pathinfo) Z_PARAM_LONG(opt) ZEND_PARSE_PARAMETERS_END(); + if (opt < PHP_PATHINFO_DIRNAME || opt > PHP_PATHINFO_ALL) { + zend_argument_value_error(2, "must be one of the PATHINFO_* constants"); + RETURN_THROWS(); + } + + if (opt < PHP_PATHINFO_ALL && (opt & (opt - 1))) { + zend_argument_value_error(2, "must be only one of the PATHINFO_* constants"); + RETURN_THROWS(); + } + have_basename = (opt & PHP_PATHINFO_BASENAME); array_init(&tmp); @@ -2203,10 +2211,10 @@ PHP_FUNCTION(chunk_split) if ((size_t)chunklen > ZSTR_LEN(str)) { /* to maintain BC, we must return original string + ending */ - result = zend_string_safe_alloc(ZSTR_LEN(str), 1, endlen, 0); - memcpy(ZSTR_VAL(result), ZSTR_VAL(str), ZSTR_LEN(str)); - memcpy(ZSTR_VAL(result) + ZSTR_LEN(str), end, endlen); - ZSTR_VAL(result)[ZSTR_LEN(result)] = '\0'; + result = zend_string_concat2( + ZSTR_VAL(str), ZSTR_LEN(str), + end, endlen + ); RETURN_NEW_STR(result); } @@ -3752,9 +3760,9 @@ PHPAPI void php_stripcslashes(zend_string *str) case 'f': *target++='\f'; nlen--; break; case '\\': *target++='\\'; nlen--; break; case 'x': - if (source+1 < end && isxdigit((int)(*(source+1)))) { + if (source+1 < end && isxdigit((unsigned char)source[1])) { numtmp[0] = *++source; - if (source+1 < end && isxdigit((int)(*(source+1)))) { + if (source+1 < end && isxdigit((unsigned char)source[1])) { numtmp[1] = *++source; numtmp[2] = '\0'; nlen-=3; @@ -4609,7 +4617,7 @@ PHP_FUNCTION(hebrev) do { if (block_type == _HEB_BLOCK_TYPE_HEB) { - while ((isheb((int)*(tmp+1)) || _isblank((int)*(tmp+1)) || ispunct((int)*(tmp+1)) || (int)*(tmp+1)=='\n' ) && block_end block_start) { + while ((_isblank((int)*tmp) || ispunct((unsigned char)*tmp)) && *tmp!='/' && *tmp!='-' && block_end > block_start) { tmp--; block_end--; } @@ -5004,7 +5012,7 @@ PHP_FUNCTION(parse_str) size_t arglen; ZEND_PARSE_PARAMETERS_START(2, 2) - Z_PARAM_STRING(arg, arglen) + Z_PARAM_PATH(arg, arglen) Z_PARAM_ZVAL(arrayArg) ZEND_PARSE_PARAMETERS_END(); @@ -5059,7 +5067,7 @@ static bool php_tag_find(char *tag, size_t len, const char *set) { done = true; break; default: - if (!isspace((int)c)) { + if (!isspace((unsigned char)c)) { if (state == 0) { state=1; } @@ -5149,7 +5157,7 @@ PHPAPI size_t php_strip_tags_ex(char *rbuf, size_t len, const char *allow, size_ if (in_q) { break; } - if (isspace(*(p + 1)) && !allow_tag_spaces) { + if (isspace((unsigned char)p[1]) && !allow_tag_spaces) { *(rp++) = c; break; } @@ -5196,7 +5204,7 @@ PHPAPI size_t php_strip_tags_ex(char *rbuf, size_t len, const char *allow, size_ if (in_q) { break; } - if (isspace(*(p + 1)) && !allow_tag_spaces) { + if (isspace((unsigned char)p[1]) && !allow_tag_spaces) { goto reg_char_1; } depth++; diff --git a/ext/standard/strnatcmp.c b/ext/standard/strnatcmp.c index 3c3f5a99232f..583cbb5dc47a 100644 --- a/ext/standard/strnatcmp.c +++ b/ext/standard/strnatcmp.c @@ -40,12 +40,12 @@ compare_right(char const **a, char const *aend, char const **b, char const *bend both numbers to know that they have the same magnitude, so we remember it in BIAS. */ for(;; (*a)++, (*b)++) { - if ((*a == aend || !isdigit((int)(unsigned char)**a)) && - (*b == bend || !isdigit((int)(unsigned char)**b))) + if ((*a == aend || !isdigit((unsigned char)**a)) && + (*b == bend || !isdigit((unsigned char)**b))) return bias; - else if (*a == aend || !isdigit((int)(unsigned char)**a)) + else if (*a == aend || !isdigit((unsigned char)**a)) return -1; - else if (*b == bend || !isdigit((int)(unsigned char)**b)) + else if (*b == bend || !isdigit((unsigned char)**b)) return +1; else if (**a < **b) { if (!bias) @@ -67,12 +67,12 @@ compare_left(char const **a, char const *aend, char const **b, char const *bend) /* Compare two left-aligned numbers: the first to have a different value wins. */ for(;; (*a)++, (*b)++) { - if ((*a == aend || !isdigit((int)(unsigned char)**a)) && - (*b == bend || !isdigit((int)(unsigned char)**b))) + if ((*a == aend || !isdigit((unsigned char)**a)) && + (*b == bend || !isdigit((unsigned char)**b))) return 0; - else if (*a == aend || !isdigit((int)(unsigned char)**a)) + else if (*a == aend || !isdigit((unsigned char)**a)) return -1; - else if (*b == bend || !isdigit((int)(unsigned char)**b)) + else if (*b == bend || !isdigit((unsigned char)**b)) return +1; else if (**a < **b) return -1; @@ -103,27 +103,27 @@ PHPAPI int strnatcmp_ex(char const *a, size_t a_len, char const *b, size_t b_len ca = *ap; cb = *bp; /* skip over leading zeros */ - while (ca == '0' && (ap+1 < aend) && isdigit((int)(unsigned char)*(ap+1))) { + while (ca == '0' && (ap+1 < aend) && isdigit((unsigned char)ap[1])) { ca = *++ap; } - while (cb == '0' && (bp+1 < bend) && isdigit((int)(unsigned char)*(bp+1))) { + while (cb == '0' && (bp+1 < bend) && isdigit((unsigned char)bp[1])) { cb = *++bp; } while (1) { /* Skip consecutive whitespace */ - while (isspace((int)(unsigned char)ca)) { + while (isspace(ca)) { ca = *++ap; } - while (isspace((int)(unsigned char)cb)) { + while (isspace(cb)) { cb = *++bp; } /* process run of digits */ - if (isdigit((int)(unsigned char)ca) && isdigit((int)(unsigned char)cb)) { + if (isdigit(ca) && isdigit(cb)) { fractional = (ca == '0' || cb == '0'); if (fractional) @@ -147,8 +147,8 @@ PHPAPI int strnatcmp_ex(char const *a, size_t a_len, char const *b, size_t b_len } if (is_case_insensitive) { - ca = toupper((int)(unsigned char)ca); - cb = toupper((int)(unsigned char)cb); + ca = toupper(ca); + cb = toupper(cb); } if (ca < cb) diff --git a/ext/standard/syslog.c b/ext/standard/syslog.c index c5d73eb008ec..78dfb2297fdc 100644 --- a/ext/standard/syslog.c +++ b/ext/standard/syslog.c @@ -1,14 +1,12 @@ /* +----------------------------------------------------------------------+ - | Copyright (c) The PHP Group | + | Copyright © The PHP Group and Contributors. | +----------------------------------------------------------------------+ - | This source file is subject to version 3.01 of the PHP license, | - | that is bundled with this package in the file LICENSE, and is | - | available through the world-wide-web at the following url: | - | https://www.php.net/license/3_01.txt | - | If you did not receive a copy of the PHP license and are unable to | - | obtain it through the world-wide-web, please send a note to | - | license@php.net so we can mail you a copy immediately. | + | This source file is subject to the Modified BSD License that is | + | bundled with this package in the file LICENSE, and is available | + | through the World Wide Web at . | + | | + | SPDX-License-Identifier: BSD-3-Clause | +----------------------------------------------------------------------+ | Author: Stig Sæther Bakken | +----------------------------------------------------------------------+ @@ -63,7 +61,7 @@ PHP_FUNCTION(openlog) size_t ident_len; ZEND_PARSE_PARAMETERS_START(3, 3) - Z_PARAM_STRING(ident, ident_len) + Z_PARAM_PATH(ident, ident_len) Z_PARAM_LONG(option) Z_PARAM_LONG(facility) ZEND_PARSE_PARAMETERS_END(); diff --git a/ext/standard/tests/GHSA-96wq-48vp-hh57.phpt b/ext/standard/tests/GHSA-96wq-48vp-hh57.phpt new file mode 100644 index 000000000000..f8a01f48a115 --- /dev/null +++ b/ext/standard/tests/GHSA-96wq-48vp-hh57.phpt @@ -0,0 +1,22 @@ +--TEST-- +GHSA-96wq-48vp-hh57: signed integer overflow of char array offset +--CREDITS-- +Aleksey Solovev (Positive Technologies) +--INI-- +memory_limit=3G +--SKIPIF-- + +--FILE-- + +===DONE=== +--EXPECT-- +===DONE=== diff --git a/ext/standard/tests/array/array_change_key_case_flag_error.phpt b/ext/standard/tests/array/array_change_key_case_flag_error.phpt new file mode 100644 index 000000000000..e83a21815c99 --- /dev/null +++ b/ext/standard/tests/array/array_change_key_case_flag_error.phpt @@ -0,0 +1,14 @@ +--TEST-- +array_change_key_case(): invalid $case argument +--FILE-- +getMessage(), PHP_EOL; +} + +?> +--EXPECT-- +ValueError: array_change_key_case(): Argument #2 ($case) must be either CASE_LOWER or CASE_UPPER diff --git a/ext/standard/tests/array/array_change_key_case_variation.phpt b/ext/standard/tests/array/array_change_key_case_variation.phpt deleted file mode 100644 index c221a3f34101..000000000000 --- a/ext/standard/tests/array/array_change_key_case_variation.phpt +++ /dev/null @@ -1,50 +0,0 @@ ---TEST-- -Test array_change_key_case() function - 2 ---FILE-- - 1, "two" => 2, "THREE" => 3, "FOUR" => "four"); - -/* use 'case' argument other than CASE_LOWER & CASE_UPPER */ -try { - var_dump(array_change_key_case($item, "CASE_UPPER")); -} catch (TypeError $e) { - echo $e->getMessage(), "\n"; -} -var_dump(array_change_key_case($item, 5)); - -/* when keys are different in terms of only case */ -/* should return one value key pair with key being in lowercase */ -var_dump( array_change_key_case( array("ONE" => 1, "one" => 3, "One" => 4) ) ); - -/* should return one value key pair with key being in uppercase */ -var_dump( array_change_key_case( array("ONE" => 1, "one" => 2, "One" => 3), CASE_UPPER ) ); -var_dump( array_change_key_case( array("ONE" => 1, "one" => 1, "One" => 2), 5 ) ); - -echo "end\n"; -?> ---EXPECT-- -array_change_key_case(): Argument #2 ($case) must be of type int, string given -array(4) { - ["ONE"]=> - int(1) - ["TWO"]=> - int(2) - ["THREE"]=> - int(3) - ["FOUR"]=> - string(4) "four" -} -array(1) { - ["one"]=> - int(4) -} -array(1) { - ["ONE"]=> - int(3) -} -array(1) { - ["ONE"]=> - int(2) -} -end diff --git a/ext/standard/tests/array/array_change_key_case_variation4.phpt b/ext/standard/tests/array/array_change_key_case_variation4.phpt deleted file mode 100644 index 82d211451638..000000000000 --- a/ext/standard/tests/array/array_change_key_case_variation4.phpt +++ /dev/null @@ -1,132 +0,0 @@ ---TEST-- -Test array_change_key_case() function : usage variations - different int values for $case ---FILE-- - 'un', 'TWO' => 'deux', 'three' => 'trois'); -for ($i = -5; $i <=5; $i += 1){ - echo "\n-- \$sort argument is $i --\n"; - $temp = $input; - var_dump(array_change_key_case($temp, $i)); -} - -echo "Done"; -?> ---EXPECT-- -*** Testing array_change_key_case() : usage variations *** - --- $sort argument is -5 -- -array(3) { - ["ONE"]=> - string(2) "un" - ["TWO"]=> - string(4) "deux" - ["THREE"]=> - string(5) "trois" -} - --- $sort argument is -4 -- -array(3) { - ["ONE"]=> - string(2) "un" - ["TWO"]=> - string(4) "deux" - ["THREE"]=> - string(5) "trois" -} - --- $sort argument is -3 -- -array(3) { - ["ONE"]=> - string(2) "un" - ["TWO"]=> - string(4) "deux" - ["THREE"]=> - string(5) "trois" -} - --- $sort argument is -2 -- -array(3) { - ["ONE"]=> - string(2) "un" - ["TWO"]=> - string(4) "deux" - ["THREE"]=> - string(5) "trois" -} - --- $sort argument is -1 -- -array(3) { - ["ONE"]=> - string(2) "un" - ["TWO"]=> - string(4) "deux" - ["THREE"]=> - string(5) "trois" -} - --- $sort argument is 0 -- -array(3) { - ["one"]=> - string(2) "un" - ["two"]=> - string(4) "deux" - ["three"]=> - string(5) "trois" -} - --- $sort argument is 1 -- -array(3) { - ["ONE"]=> - string(2) "un" - ["TWO"]=> - string(4) "deux" - ["THREE"]=> - string(5) "trois" -} - --- $sort argument is 2 -- -array(3) { - ["ONE"]=> - string(2) "un" - ["TWO"]=> - string(4) "deux" - ["THREE"]=> - string(5) "trois" -} - --- $sort argument is 3 -- -array(3) { - ["ONE"]=> - string(2) "un" - ["TWO"]=> - string(4) "deux" - ["THREE"]=> - string(5) "trois" -} - --- $sort argument is 4 -- -array(3) { - ["ONE"]=> - string(2) "un" - ["TWO"]=> - string(4) "deux" - ["THREE"]=> - string(5) "trois" -} - --- $sort argument is 5 -- -array(3) { - ["ONE"]=> - string(2) "un" - ["TWO"]=> - string(4) "deux" - ["THREE"]=> - string(5) "trois" -} -Done diff --git a/ext/standard/tests/array/array_diff_max_elements.phpt b/ext/standard/tests/array/array_diff_max_elements.phpt new file mode 100644 index 000000000000..4c65cd049b33 --- /dev/null +++ b/ext/standard/tests/array/array_diff_max_elements.phpt @@ -0,0 +1,16 @@ +--TEST-- +array_diff(): Max elements +--FILE-- +getMessage(), "\n"; +} + +?> +--EXPECTF-- +The total number of elements must be lower than %d diff --git a/ext/standard/tests/array/array_product_packed_long_overflow.phpt b/ext/standard/tests/array/array_product_packed_long_overflow.phpt new file mode 100644 index 000000000000..7c1d8a0adebd --- /dev/null +++ b/ext/standard/tests/array/array_product_packed_long_overflow.phpt @@ -0,0 +1,22 @@ +--TEST-- +array_product() packed long overflow continues in double mode +--FILE-- + +--EXPECT-- +bool(true) +bool(true) +bool(true) +bool(true) diff --git a/ext/standard/tests/array/array_reduce_accumulator_refcount.phpt b/ext/standard/tests/array/array_reduce_accumulator_refcount.phpt new file mode 100644 index 000000000000..f2a0639b3456 --- /dev/null +++ b/ext/standard/tests/array/array_reduce_accumulator_refcount.phpt @@ -0,0 +1,35 @@ +--TEST-- +array_reduce(): accumulator refcount stays low during callback +--FILE-- + +--EXPECT-- +array(0) interned { +} +array(1) packed refcount(2){ + [0]=> + int(1) +} +array(2) packed refcount(2){ + [0]=> + int(1) + [1]=> + int(2) +} +array(3) packed refcount(2){ + [0]=> + int(1) + [1]=> + int(2) + [2]=> + int(3) +} diff --git a/ext/standard/tests/array/array_sum_packed_long_overflow.phpt b/ext/standard/tests/array/array_sum_packed_long_overflow.phpt new file mode 100644 index 000000000000..22e4f3be52aa --- /dev/null +++ b/ext/standard/tests/array/array_sum_packed_long_overflow.phpt @@ -0,0 +1,22 @@ +--TEST-- +array_sum() packed long overflow continues in double mode +--FILE-- + +--EXPECT-- +bool(true) +bool(true) +bool(true) +bool(true) diff --git a/ext/standard/tests/array/array_sum_product_integration.phpt b/ext/standard/tests/array/array_sum_product_integration.phpt new file mode 100644 index 000000000000..4b83042a3b45 --- /dev/null +++ b/ext/standard/tests/array/array_sum_product_integration.phpt @@ -0,0 +1,32 @@ +--TEST-- +array_sum()/array_product(): PHP 8.3 nested-array warning and array_column() integration +--FILE-- + 'Pen', 'price' => 3], + ['name' => 'Paper', 'price' => 5], +]; +$prices = array_column($products, 'price'); +var_dump($prices === [3, 5]); +var_dump(array_sum($prices) === 8); +var_dump(array_product($prices) === 15); + +echo "-- PHP 8.3: nested array emits warning and is skipped --\n"; +var_dump(array_sum([1, [2], 3])); +var_dump(array_product([2, [3], 4])); + +?> +--EXPECTF-- +-- array_column() + array_sum()/array_product() integration -- +bool(true) +bool(true) +bool(true) +-- PHP 8.3: nested array emits warning and is skipped -- + +Warning: array_sum(): Addition is not supported on type array in %s on line %d +int(4) + +Warning: array_product(): Multiplication is not supported on type array in %s on line %d +int(8) diff --git a/ext/standard/tests/assert/gh22290.phpt b/ext/standard/tests/assert/gh22290.phpt new file mode 100644 index 000000000000..e519a60f5572 --- /dev/null +++ b/ext/standard/tests/assert/gh22290.phpt @@ -0,0 +1,39 @@ +--TEST-- +GH-22290: AST pretty printing does not correctly handle strings containing NUL +--INI-- +zend.assertions=1 +assert.exception=1 +--FILE-- +getMessage(), PHP_EOL; +} + +try { + assert(["a\x00b" => 1] === []); +} catch (AssertionError $e) { + echo $e->getMessage(), PHP_EOL; +} + +try { + assert("tab\there" === ""); +} catch (AssertionError $e) { + echo $e->getMessage(), PHP_EOL; +} + +try { + assert(str_contains("plain", "zzz")); +} catch (AssertionError $e) { + echo $e->getMessage(), PHP_EOL; +} + +?> +--EXPECT-- +assert(!str_contains($string, "\000")) +assert(["a\000b" => 1] === []) +assert("tab\there" === '') +assert(str_contains('plain', 'zzz')) diff --git a/ext/standard/tests/assert/gh22291.phpt b/ext/standard/tests/assert/gh22291.phpt new file mode 100644 index 000000000000..a50bd5861f05 --- /dev/null +++ b/ext/standard/tests/assert/gh22291.phpt @@ -0,0 +1,19 @@ +--TEST-- +GH-22291: AST pretty printing does not correctly handle braces in string interpolation +--FILE-- +getMessage(), PHP_EOL; +} + +?> +--EXPECT-- +string(5) "{abc}" +string(3) "abc" +assert(!"{{$foo}}") diff --git a/ext/standard/tests/assert/gh22292.phpt b/ext/standard/tests/assert/gh22292.phpt new file mode 100644 index 000000000000..e3aa72bf231a --- /dev/null +++ b/ext/standard/tests/assert/gh22292.phpt @@ -0,0 +1,31 @@ +--TEST-- +GH-22292: AST pretty printing does not correctly handle invalid variable names +--FILE-- +getMessage(), PHP_EOL; +} + +try { + $f = new Foo(); + var_dump($f->{'---'}); + assert(!$f->{'---'}); +} catch (Error $e) { + echo $e->getMessage(), PHP_EOL; +} + +?> +--EXPECT-- +string(3) "abc" +assert(!${'---'}) +string(3) "---" +assert(!$f->{'---'}) diff --git a/ext/standard/tests/assert/gh22373.phpt b/ext/standard/tests/assert/gh22373.phpt new file mode 100644 index 000000000000..8c26f77f490b --- /dev/null +++ b/ext/standard/tests/assert/gh22373.phpt @@ -0,0 +1,36 @@ +--TEST-- +GH-22373: AST pretty-printing drops meaningful parentheses surrounding property access +--FILE-- +f)('abc') !== 'cba'); + } catch (Error $e) { + echo $e->getMessage(), PHP_EOL; + } + try { + assert(($this?->f)('abc') !== 'cba'); + } catch (Error $e) { + echo $e->getMessage(), PHP_EOL; + } + try { + assert((self::$sf)('abc') !== 'cba'); + } catch (Error $e) { + echo $e->getMessage(), PHP_EOL; + } + } +} + +new Foo(); + +?> +--EXPECT-- +assert(($this->f)('abc') !== 'cba') +assert(($this?->f)('abc') !== 'cba') +assert((self::$sf)('abc') !== 'cba') diff --git a/ext/standard/tests/dir/scandir_invalid_flag.phpt b/ext/standard/tests/dir/scandir_invalid_flag.phpt new file mode 100644 index 000000000000..76838dc869b8 --- /dev/null +++ b/ext/standard/tests/dir/scandir_invalid_flag.phpt @@ -0,0 +1,12 @@ +--TEST-- +Provide wrong flags to scandir() +--FILE-- +getMessage() . "\n"; +} +?> +--EXPECT-- +scandir(): Argument #2 ($sorting_order) must be one of the SCANDIR_SORT_ASCENDING, SCANDIR_SORT_DESCENDING, or SCANDIR_SORT_NONE constants diff --git a/ext/standard/tests/dir/scandir_variation9-win32-mb.phpt b/ext/standard/tests/dir/scandir_variation9-win32-mb.phpt deleted file mode 100644 index 44d8b6daa5f9..000000000000 --- a/ext/standard/tests/dir/scandir_variation9-win32-mb.phpt +++ /dev/null @@ -1,71 +0,0 @@ ---TEST-- -Test scandir() function : usage variations - different ints as $sorting_order arg ---SKIPIF-- - ---FILE-- - ---CLEAN-- - ---EXPECT-- -*** Testing scandir() : usage variations *** -array(4) { - [0]=> - string(45) "私はガラスを食べられますfile2.tmp" - [1]=> - string(45) "私はガラスを食べられますfile1.tmp" - [2]=> - string(2) ".." - [3]=> - string(1) "." -} -array(4) { - [0]=> - string(45) "私はガラスを食べられますfile2.tmp" - [1]=> - string(45) "私はガラスを食べられますfile1.tmp" - [2]=> - string(2) ".." - [3]=> - string(1) "." -} -array(4) { - [0]=> - string(1) "." - [1]=> - string(2) ".." - [2]=> - string(45) "私はガラスを食べられますfile1.tmp" - [3]=> - string(45) "私はガラスを食べられますfile2.tmp" -} diff --git a/ext/standard/tests/dir/scandir_variation9.phpt b/ext/standard/tests/dir/scandir_variation9.phpt deleted file mode 100644 index 56e5575e5590..000000000000 --- a/ext/standard/tests/dir/scandir_variation9.phpt +++ /dev/null @@ -1,65 +0,0 @@ ---TEST-- -Test scandir() function : usage variations - different ints as $sorting_order arg ---FILE-- - ---CLEAN-- - ---EXPECT-- -*** Testing scandir() : usage variations *** -array(4) { - [0]=> - string(9) "file2.tmp" - [1]=> - string(9) "file1.tmp" - [2]=> - string(2) ".." - [3]=> - string(1) "." -} -array(4) { - [0]=> - string(9) "file2.tmp" - [1]=> - string(9) "file1.tmp" - [2]=> - string(2) ".." - [3]=> - string(1) "." -} -array(4) { - [0]=> - string(1) "." - [1]=> - string(2) ".." - [2]=> - string(9) "file1.tmp" - [3]=> - string(9) "file2.tmp" -} diff --git a/ext/standard/tests/file/pathinfo_variation3.phpt b/ext/standard/tests/file/pathinfo_variation3.phpt index aa1494b57997..86f88677d813 100644 --- a/ext/standard/tests/file/pathinfo_variation3.phpt +++ b/ext/standard/tests/file/pathinfo_variation3.phpt @@ -15,15 +15,37 @@ var_dump(pathinfo($testfile, PATHINFO_BASENAME)); var_dump(pathinfo($testfile, PATHINFO_FILENAME)); var_dump(pathinfo($testfile, PATHINFO_EXTENSION)); var_dump(pathinfo($testfile, PATHINFO_DIRNAME)); -var_dump(pathinfo($testfile, PATHINFO_EXTENSION|PATHINFO_FILENAME|PATHINFO_DIRNAME)); -var_dump(pathinfo($testfile, PATHINFO_EXTENSION|PATHINFO_FILENAME|PATHINFO_BASENAME)); -var_dump(pathinfo($testfile, PATHINFO_EXTENSION|PATHINFO_FILENAME)); -var_dump(pathinfo($testfile, PATHINFO_EXTENSION|PATHINFO_BASENAME)); -var_dump(pathinfo($testfile, PATHINFO_FILENAME|PATHINFO_DIRNAME)); -var_dump(pathinfo($testfile, PATHINFO_FILENAME|PATHINFO_BASENAME)); -var_dump(pathinfo($testfile, PATHINFO_DIRNAME|PATHINFO_EXTENSION)); -var_dump(pathinfo($testfile, PATHINFO_DIRNAME|PATHINFO_BASENAME)); +try { + pathinfo($testfile, PATHINFO_EXTENSION|PATHINFO_FILENAME|PATHINFO_DIRNAME); +} catch (\ValueError $e) { + echo $e->getMessage(), PHP_EOL; +} +try { + pathinfo($testfile, PATHINFO_EXTENSION|PATHINFO_FILENAME); +} catch (\ValueError $e) { + echo $e->getMessage(), PHP_EOL; +} +try { + pathinfo($testfile, PATHINFO_EXTENSION|PATHINFO_DIRNAME); +} catch (\ValueError $e) { + echo $e->getMessage(), PHP_EOL; +} +try { + pathinfo($testfile, PATHINFO_FILENAME|PATHINFO_BASENAME); +} catch (\ValueError $e) { + echo $e->getMessage(), PHP_EOL; +} +try { + pathinfo($testfile, PATHINFO_DIRNAME|PATHINFO_EXTENSION); +} catch (\ValueError $e) { + echo $e->getMessage(), PHP_EOL; +} +try { + pathinfo($testfile, PATHINFO_DIRNAME|PATHINFO_BASENAME); +} catch (\ValueError $e) { + echo $e->getMessage(), PHP_EOL; +} ?> --EXPECTF-- @@ -62,11 +84,9 @@ string(6) "inet.h" string(4) "inet" string(1) "h" string(17) "/usr/include/arpa" -string(17) "/usr/include/arpa" -string(6) "inet.h" -string(1) "h" -string(6) "inet.h" -string(17) "/usr/include/arpa" -string(6) "inet.h" -string(17) "/usr/include/arpa" -string(17) "/usr/include/arpa" +pathinfo(): Argument #2 ($flags) must be only one of the PATHINFO_* constants +pathinfo(): Argument #2 ($flags) must be only one of the PATHINFO_* constants +pathinfo(): Argument #2 ($flags) must be only one of the PATHINFO_* constants +pathinfo(): Argument #2 ($flags) must be only one of the PATHINFO_* constants +pathinfo(): Argument #2 ($flags) must be only one of the PATHINFO_* constants +pathinfo(): Argument #2 ($flags) must be only one of the PATHINFO_* constants diff --git a/ext/standard/tests/file/php_fd_wrapper_03.phpt b/ext/standard/tests/file/php_fd_wrapper_03.phpt index 991c497f5e19..a19d1f5acd94 100644 --- a/ext/standard/tests/file/php_fd_wrapper_03.phpt +++ b/ext/standard/tests/file/php_fd_wrapper_03.phpt @@ -10,7 +10,6 @@ fopen("php://fd/1/", "w"); echo "\nDone.\n"; ?> --EXPECTF-- -Warning: fopen(): Invalid php:// URL specified in %s on line %d Warning: fopen(php://fd): Failed to open stream: operation failed in %s on line 2 diff --git a/ext/standard/tests/file/symlink_link_linkinfo_is_link_error1.phpt b/ext/standard/tests/file/symlink_link_linkinfo_is_link_error1.phpt index f4035f8f40a2..c8420ea86fb2 100644 --- a/ext/standard/tests/file/symlink_link_linkinfo_is_link_error1.phpt +++ b/ext/standard/tests/file/symlink_link_linkinfo_is_link_error1.phpt @@ -27,8 +27,11 @@ var_dump( symlink($filename, false) ); // false as linkname echo "\n*** Testing linkinfo() for error conditions ***\n"; //invalid arguments -var_dump( linkinfo('') ); // empty string as linkname -var_dump( linkinfo(false) ); // boolean false as linkname +try { + var_dump(linkinfo('')); // empty string as linkname +} catch (ValueError $e) { + echo $e->getMessage() . "\n"; +} echo "Done\n"; ?> @@ -53,10 +56,5 @@ Warning: symlink(): %s in %s on line %d bool(false) *** Testing linkinfo() for error conditions *** - -Warning: linkinfo(): %s in %s on line %d -int(-1) - -Warning: linkinfo(): %s in %s on line %d -int(-1) +linkinfo(): Argument #1 ($path) must not be empty Done diff --git a/ext/standard/tests/filters/chunked_002.phpt b/ext/standard/tests/filters/chunked_002.phpt new file mode 100644 index 000000000000..7114e278e3bd --- /dev/null +++ b/ext/standard/tests/filters/chunked_002.phpt @@ -0,0 +1,58 @@ +--TEST-- +Dechunk write filter state must survive stream seek +--FILE-- + +--EXPECT-- +string(5) "Hello" +string(12) "Hello, World" +string(12) "Hello, World" +string(5) "Hello" +int(5) diff --git a/ext/standard/tests/filters/convert_filter_seek.phpt b/ext/standard/tests/filters/convert_filter_seek.phpt new file mode 100644 index 000000000000..6cbcd7b843f3 --- /dev/null +++ b/ext/standard/tests/filters/convert_filter_seek.phpt @@ -0,0 +1,75 @@ +--TEST-- +convert filters (base64, quoted-printable) with seek to start only +--FILE-- + +--CLEAN-- + +--EXPECTF-- +Testing convert.base64-encode/decode +First read (20 bytes): Hello World! This is +Seek to start: SUCCESS +Content matches: YES + +Warning: fseek(): Stream filter convert.* is seekable only to start position in %s on line %d +Seek to middle: FAILURE + +Testing convert.quoted-printable-encode/decode +First read (10 bytes): 4c696e65310d0a4c696e +Seek to start: SUCCESS +Content matches: YES + +Warning: fseek(): Stream filter convert.* is seekable only to start position in %s on line %d +Seek to middle: FAILURE diff --git a/ext/standard/tests/filters/convert_filter_write_seek_modes.phpt b/ext/standard/tests/filters/convert_filter_write_seek_modes.phpt new file mode 100644 index 000000000000..0a2d4114bf3c --- /dev/null +++ b/ext/standard/tests/filters/convert_filter_write_seek_modes.phpt @@ -0,0 +1,61 @@ +--TEST-- +convert.* write filter: write_seek_mode parameter +--FILE-- + 'preserve']); + fwrite($fp, 'Hello'); + var_dump(fseek($fp, 0, SEEK_SET) === 0); + var_dump(fseek($fp, 100, SEEK_SET) === 0); + fclose($fp); + + /* reset: seeks succeed, callback dispatched */ + $fp = fopen('php://memory', 'w+'); + stream_filter_append($fp, $name, STREAM_FILTER_WRITE, + ['write_seek_mode' => 'reset']); + fwrite($fp, 'Hello'); + var_dump(fseek($fp, 0, SEEK_SET) === 0); + fclose($fp); + + /* strict: seek fails */ + $fp = fopen('php://memory', 'w+'); + stream_filter_append($fp, $name, STREAM_FILTER_WRITE, + ['write_seek_mode' => 'strict']); + fwrite($fp, 'Hello'); + var_dump(@fseek($fp, 0, SEEK_SET) === -1); + fclose($fp); + + /* invalid: ValueError */ + $fp = fopen('php://memory', 'w+'); + stream_filter_append($fp, $name, STREAM_FILTER_WRITE, + ['write_seek_mode' => 42]); + if ($fp) { + fclose($fp); + } +} +?> +--EXPECTF-- +bool(true) +bool(true) +bool(true) +bool(true) + +Warning: stream_filter_append(): "write_seek_mode" filter parameter must be one of "preserve", "reset", or "strict" in %s + +Warning: stream_filter_append(): Unable to create or locate filter "convert.base64-encode" in %s +bool(true) +bool(true) +bool(true) +bool(true) + +Warning: stream_filter_append(): "write_seek_mode" filter parameter must be one of "preserve", "reset", or "strict" in %s + +Warning: stream_filter_append(): Unable to create or locate filter "convert.quoted-printable-encode" in %s diff --git a/ext/standard/tests/filters/gh22360.phpt b/ext/standard/tests/filters/gh22360.phpt new file mode 100644 index 000000000000..b23483b22b92 --- /dev/null +++ b/ext/standard/tests/filters/gh22360.phpt @@ -0,0 +1,24 @@ +--TEST-- +GH-22360 (convert.base64-encode emits padding on incremental flush) +--FILE-- + +--CLEAN-- + +--EXPECT-- +string(4) "YWJj" +YWJj diff --git a/ext/standard/tests/filters/php_user_filter_04.phpt b/ext/standard/tests/filters/php_user_filter_04.phpt new file mode 100644 index 000000000000..6dc62779aa90 --- /dev/null +++ b/ext/standard/tests/filters/php_user_filter_04.phpt @@ -0,0 +1,28 @@ +--TEST-- +php_user_filter with invalid seek signature +--FILE-- + +--EXPECTF-- +Fatal error: Declaration of InvalidSeekFilter::seek($offset): bool must be compatible with php_user_filter::seek(int $offset, int $whence, int $chain): bool in %s on line %d diff --git a/ext/standard/tests/filters/string_filters_seek.phpt b/ext/standard/tests/filters/string_filters_seek.phpt new file mode 100644 index 000000000000..60eab2ccb84a --- /dev/null +++ b/ext/standard/tests/filters/string_filters_seek.phpt @@ -0,0 +1,68 @@ +--TEST-- +string filters (rot13, toupper, tolower) with seek - fully seekable +--FILE-- + 'Uryyb Jbeyq! Guvf vf n grfg sbe fgevat svygre frrxvat.', + 'string.toupper' => 'HELLO WORLD! THIS IS A TEST FOR STRING FILTER SEEKING.', + 'string.tolower' => 'hello world! this is a test for string filter seeking.' +]; + +foreach ($filters as $filter) { + echo "Testing filter: $filter\n"; + + file_put_contents($file, $text); + + $fp = fopen($file, 'r'); + stream_filter_append($fp, $filter, STREAM_FILTER_READ); + + $partial = fread($fp, 20); + echo "First read (20 bytes): $partial\n"; + + $result = fseek($fp, 0, SEEK_SET); + echo "Seek to start: " . ($result === 0 ? "SUCCESS" : "FAILURE") . "\n"; + + $full = fread($fp, strlen($text)); + echo "Content matches: " . ($full === $expected[$filter] ? "YES" : "NO") . "\n"; + + $result = fseek($fp, 13, SEEK_SET); + echo "Seek to middle: " . ($result === 0 ? "SUCCESS" : "FAILURE") . "\n"; + + $from_middle = fread($fp, 10); + $expected_middle = substr($expected[$filter], 13, 10); + echo "Read from middle matches: " . ($from_middle === $expected_middle ? "YES" : "NO") . "\n"; + + fclose($fp); + echo "\n"; +} +?> +--CLEAN-- + +--EXPECT-- +Testing filter: string.rot13 +First read (20 bytes): Uryyb Jbeyq! Guvf vf +Seek to start: SUCCESS +Content matches: YES +Seek to middle: SUCCESS +Read from middle matches: YES + +Testing filter: string.toupper +First read (20 bytes): HELLO WORLD! THIS IS +Seek to start: SUCCESS +Content matches: YES +Seek to middle: SUCCESS +Read from middle matches: YES + +Testing filter: string.tolower +First read (20 bytes): hello world! this is +Seek to start: SUCCESS +Content matches: YES +Seek to middle: SUCCESS +Read from middle matches: YES diff --git a/ext/standard/tests/filters/user_filter_seek_01.phpt b/ext/standard/tests/filters/user_filter_seek_01.phpt new file mode 100644 index 000000000000..6023ced1d0ee --- /dev/null +++ b/ext/standard/tests/filters/user_filter_seek_01.phpt @@ -0,0 +1,83 @@ +--TEST-- +php_user_filter with seek method - always seekable (stateless filter) +--EXTENSIONS-- +ctype +--FILE-- +data); $i++) { + $char = $bucket->data[$i]; + if (ctype_alpha($char)) { + $base = ctype_upper($char) ? ord('A') : ord('a'); + $rotated .= chr($base + (ord($char) - $base + $this->rotation) % 26); + } else { + $rotated .= $char; + } + } + $bucket->data = $rotated; + $consumed += $bucket->datalen; + stream_bucket_append($out, $bucket); + } + return PSFS_PASS_ON; + } + + public function onCreate(): bool + { + if (isset($this->params['rotation'])) { + $this->rotation = (int)$this->params['rotation']; + } + return true; + } + + public function onClose(): void {} + + public function seek(int $offset, int $whence, int $chain): bool + { + // Stateless filter - always seekable to any position + return true; + } +} + +stream_filter_register('test.rotate', 'RotateFilter'); + +$file = __DIR__ . '/user_filter_seek_001.txt'; +$text = 'Hello World'; + +file_put_contents($file, $text); + +$fp = fopen($file, 'r'); +stream_filter_append($fp, 'test.rotate', STREAM_FILTER_READ, ['rotation' => 13]); + +$partial = fread($fp, 5); +echo "First read: $partial\n"; + +$result = fseek($fp, 0, SEEK_SET); +echo "Seek to start: " . ($result === 0 ? "SUCCESS" : "FAILURE") . "\n"; + +$full = fread($fp, strlen($text)); +echo "Full content: $full\n"; + +$result = fseek($fp, 6, SEEK_SET); +echo "Seek to middle: " . ($result === 0 ? "SUCCESS" : "FAILURE") . "\n"; + +$from_middle = fread($fp, 5); +echo "Read from middle: $from_middle\n"; + +fclose($fp); +unlink($file); + +?> +--EXPECT-- +First read: Uryyb +Seek to start: SUCCESS +Full content: Uryyb Jbeyq +Seek to middle: SUCCESS +Read from middle: Jbeyq diff --git a/ext/standard/tests/filters/user_filter_seek_02.phpt b/ext/standard/tests/filters/user_filter_seek_02.phpt new file mode 100644 index 000000000000..f728e75cdca9 --- /dev/null +++ b/ext/standard/tests/filters/user_filter_seek_02.phpt @@ -0,0 +1,75 @@ +--TEST-- +php_user_filter with seek method - stateful filter +--FILE-- +data); $i++) { + $modified .= $bucket->data[$i] . $this->count++; + } + $bucket->data = $modified; + $consumed += $bucket->datalen; + stream_bucket_append($out, $bucket); + } + return PSFS_PASS_ON; + } + + public function onCreate(): bool + { + return true; + } + + public function onClose(): void {} + + public function seek(int $offset, int $whence, int $chain): bool + { + if ($offset === 0 && $whence === SEEK_SET) { + $this->count = 0; + return true; + } + return false; + } +} + +stream_filter_register('test.counting', 'CountingFilter'); + +$file = __DIR__ . '/user_filter_seek_002.txt'; +$text = 'ABC'; + +file_put_contents($file, $text); + +$fp = fopen($file, 'r'); +stream_filter_append($fp, 'test.counting', STREAM_FILTER_READ); + +$first = fread($fp, 10); +echo "First read: $first\n"; + +$result = fseek($fp, 0, SEEK_SET); +echo "Seek to start: " . ($result === 0 ? "SUCCESS" : "FAILURE") . "\n"; + +$second = fread($fp, 10); +echo "Second read after seek: $second\n"; +echo "Counts reset: " . ($first === $second ? "YES" : "NO") . "\n"; + +$result = fseek($fp, 1, SEEK_SET); +echo "Seek to middle: " . ($result === 0 ? "SUCCESS" : "FAILURE") . "\n"; + +fclose($fp); +unlink($file); + +?> +--EXPECTF-- +First read: A0B1C2 +Seek to start: SUCCESS +Second read after seek: A0B1C2 +Counts reset: YES + +Warning: fseek(): Stream filter seeking for user-filter failed in %s on line %d +Seek to middle: FAILURE diff --git a/ext/standard/tests/filters/user_filter_seek_03.phpt b/ext/standard/tests/filters/user_filter_seek_03.phpt new file mode 100644 index 000000000000..bc814e8ed160 --- /dev/null +++ b/ext/standard/tests/filters/user_filter_seek_03.phpt @@ -0,0 +1,67 @@ +--TEST-- +php_user_filter::seek receives chain identifier (read vs write) +--FILE-- +datalen; + stream_bucket_append($out, $bucket); + } + return PSFS_PASS_ON; + } + + public function onCreate(): bool + { + return true; + } + + public function onClose(): void {} + + public function seek(int $offset, int $whence, int $chain): bool + { + $name = match ($chain) { + STREAM_FILTER_READ => 'read', + STREAM_FILTER_WRITE => 'write', + default => 'other', + }; + self::$log[] = "$name:$offset:$whence"; + return true; + } +} + +stream_filter_register('test.tracking', 'TrackingFilter'); + +$file = __DIR__ . '/user_filter_seek_03.txt'; +file_put_contents($file, "abcdefghij"); + +/* Read chain: seek-to-start should dispatch with STREAM_FILTER_READ */ +TrackingFilter::$log = []; +$fp = fopen($file, 'r'); +stream_filter_append($fp, 'test.tracking', STREAM_FILTER_READ); +fread($fp, 4); +fseek($fp, 0, SEEK_SET); +fclose($fp); +echo "Read chain log: " . implode(',', TrackingFilter::$log) . "\n"; + +/* Write chain: any seek should dispatch with STREAM_FILTER_WRITE */ +TrackingFilter::$log = []; +$fp = fopen($file, 'w+'); +stream_filter_append($fp, 'test.tracking', STREAM_FILTER_WRITE); +fwrite($fp, "xyz"); +fseek($fp, 0, SEEK_SET); +fseek($fp, 5, SEEK_SET); +fclose($fp); +echo "Write chain log: " . implode(',', TrackingFilter::$log) . "\n"; + +unlink($file); + +?> +--EXPECT-- +Read chain log: read:0:0 +Write chain log: write:0:0,write:5:0 diff --git a/ext/standard/tests/general_functions/dl_null_bytes.phpt b/ext/standard/tests/general_functions/dl_null_bytes.phpt new file mode 100644 index 000000000000..7f251393ba3b --- /dev/null +++ b/ext/standard/tests/general_functions/dl_null_bytes.phpt @@ -0,0 +1,14 @@ +--TEST-- +dl() rejects null bytes in extension filename +--FILE-- +getMessage(), "\n"; +} + +?> +--EXPECT-- +dl(): Argument #1 ($extension_filename) must not contain any null bytes diff --git a/ext/standard/tests/general_functions/gh22118.phpt b/ext/standard/tests/general_functions/gh22118.phpt new file mode 100644 index 000000000000..32c1a0fa1dec --- /dev/null +++ b/ext/standard/tests/general_functions/gh22118.phpt @@ -0,0 +1,75 @@ +--TEST-- +GH-22118: unregister_tick_function() unregisters equivalent first-class method callables +--FILE-- +direct++; + } + + public function arrayCallable(): void + { + $this->array++; + } + + public function __invoke(): void + { + $this->invoke++; + } + + public function __call(string $name, array $arguments): void + { + $this->trampoline++; + } + + public function run(): void + { + register_tick_function($this->kick(...)); + unregister_tick_function($this->kick(...)); + echo "direct: {$this->direct}\n"; + + register_tick_function($this->missing(...)); + unregister_tick_function($this->missing(...)); + echo "trampoline: {$this->trampoline}\n"; + + register_tick_function($this->arrayCallable(...)); + unregister_tick_function([$this, 'arrayCallable']); + echo "array: {$this->array}\n"; + + register_tick_function($this(...)); + unregister_tick_function($this); + echo "invoke: {$this->invoke}\n"; + } +} + +register_tick_function(tick_string(...)); +unregister_tick_function('tick_string'); +echo "string: {$string}\n"; + +(new TickTest())->run(); +echo "done\n"; +?> +--EXPECT-- +string: 1 +direct: 1 +trampoline: 1 +array: 1 +invoke: 1 +done diff --git a/ext/standard/tests/general_functions/ini_get_all.phpt b/ext/standard/tests/general_functions/ini_get_all.phpt index 2b71b474a013..c54b39ac3325 100644 --- a/ext/standard/tests/general_functions/ini_get_all.phpt +++ b/ext/standard/tests/general_functions/ini_get_all.phpt @@ -33,29 +33,35 @@ array(0) { } array(3) { ["pcre.backtrack_limit"]=> - array(3) { + array(4) { ["global_value"]=> string(7) "1000000" ["local_value"]=> string(7) "1000000" + ["builtin_default_value"]=> + string(7) "1000000" ["access"]=> int(7) } ["pcre.jit"]=> - array(3) { + array(4) { ["global_value"]=> string(1) "1" ["local_value"]=> string(1) "1" + ["builtin_default_value"]=> + string(1) "1" ["access"]=> int(7) } ["pcre.recursion_limit"]=> - array(3) { + array(4) { ["global_value"]=> string(6) "100000" ["local_value"]=> string(6) "100000" + ["builtin_default_value"]=> + string(6) "100000" ["access"]=> int(7) } diff --git a/ext/standard/tests/general_functions/ini_get_all_builtin_default_value.phpt b/ext/standard/tests/general_functions/ini_get_all_builtin_default_value.phpt new file mode 100644 index 000000000000..82de8781caa7 --- /dev/null +++ b/ext/standard/tests/general_functions/ini_get_all_builtin_default_value.phpt @@ -0,0 +1,33 @@ +--TEST-- +ini_get_all() exposes the built-in default value independent of configuration and runtime changes +--INI-- +precision=8 +--FILE-- + +--EXPECT-- +string(1) "8" +string(1) "8" +string(2) "14" +string(1) "8" +string(1) "3" +string(2) "14" +Done diff --git a/ext/standard/tests/general_functions/ini_get_all_builtin_default_value_null.phpt b/ext/standard/tests/general_functions/ini_get_all_builtin_default_value_null.phpt new file mode 100644 index 000000000000..efd86eb947e4 --- /dev/null +++ b/ext/standard/tests/general_functions/ini_get_all_builtin_default_value_null.phpt @@ -0,0 +1,33 @@ +--TEST-- +ini_get_all() reports a null built-in default value for a directive that has no compiled-in default +--INI-- +error_append_string=FOO +--FILE-- + +--EXPECT-- +string(3) "FOO" +string(3) "FOO" +NULL +string(3) "FOO" +string(3) "BAR" +NULL +Done diff --git a/ext/standard/tests/general_functions/phpinfo.phpt b/ext/standard/tests/general_functions/phpinfo.phpt index ac7cabd340d8..a7503ec0bc41 100644 --- a/ext/standard/tests/general_functions/phpinfo.phpt +++ b/ext/standard/tests/general_functions/phpinfo.phpt @@ -57,7 +57,7 @@ Environment %r(.*?)%r PHP Variables %r(.*?)%r -PHP License +License %r(.*?)%r bool(true) -- @@ -66,6 +66,6 @@ bool(true) -- phpinfo() -PHP License +License %r(.+?)%r bool(true) diff --git a/ext/standard/tests/general_functions/proc_open_cwd_null_bytes.phpt b/ext/standard/tests/general_functions/proc_open_cwd_null_bytes.phpt new file mode 100644 index 000000000000..faa86c824177 --- /dev/null +++ b/ext/standard/tests/general_functions/proc_open_cwd_null_bytes.phpt @@ -0,0 +1,18 @@ +--TEST-- +proc_open() rejects null bytes in cwd +--SKIPIF-- + +--FILE-- +getMessage(), "\n"; +} + +?> +--EXPECT-- +proc_open(): Argument #4 ($cwd) must not contain any null bytes diff --git a/ext/standard/tests/general_functions/proc_open_fd_leak_on_setup_failure.phpt b/ext/standard/tests/general_functions/proc_open_fd_leak_on_setup_failure.phpt new file mode 100644 index 000000000000..e072f75a82d2 --- /dev/null +++ b/ext/standard/tests/general_functions/proc_open_fd_leak_on_setup_failure.phpt @@ -0,0 +1,20 @@ +--TEST-- +proc_open() does not leak file descriptors when descriptor setup fails mid-spec +--SKIPIF-- + +--FILE-- + ["pipe", "r"], 1 => ["bogus_type"]], $pipes); +} +$after = count(scandir("/proc/self/fd")); +var_dump($after <= $before + 2); +?> +--EXPECT-- +bool(true) diff --git a/ext/standard/tests/general_functions/putenv_and_getenv_reject_null_bytes.phpt b/ext/standard/tests/general_functions/putenv_and_getenv_reject_null_bytes.phpt new file mode 100644 index 000000000000..28a346237338 --- /dev/null +++ b/ext/standard/tests/general_functions/putenv_and_getenv_reject_null_bytes.phpt @@ -0,0 +1,35 @@ +--TEST-- +getenv() and putenv() reject null bytes +--FILE-- +getMessage() . "\n"; + } +} + +$var_name = 'PHP_PUTENV_NUL_TEST'; + +foreach ([ + $var_name . "\0SUFFIX=value", + $var_name . "=va\0lue", +] as $assignment) { + try { + putenv($assignment); + } catch (ValueError $exception) { + echo $exception->getMessage() . "\n"; + } +} + +var_dump(getenv($var_name)); + +?> +--EXPECT-- +getenv(): Argument #1 ($name) must not contain any null bytes +getenv(): Argument #1 ($name) must not contain any null bytes +putenv(): Argument #1 ($assignment) must not contain any null bytes +putenv(): Argument #1 ($assignment) must not contain any null bytes +bool(false) diff --git a/ext/standard/tests/http/gh22171.phpt b/ext/standard/tests/http/gh22171.phpt new file mode 100644 index 000000000000..0c1aa150f60f --- /dev/null +++ b/ext/standard/tests/http/gh22171.phpt @@ -0,0 +1,47 @@ +--TEST-- +GH-22171 (http(s) stream wrapper sends a corrupted Authorization header for percent-encoded userinfo) +--SKIPIF-- + +--INI-- +allow_url_fopen=1 +--FILE-- + $pid, 'uri' => $uri] = http_server($responses, $output); + + $url = preg_replace('(^http://)', 'http://' . $userinfo . '@', $uri); + file_get_contents($url); + + fseek($output, 0, SEEK_SET); + $output = stream_get_contents($output); + + http_server_kill($pid); + + if (preg_match('(^Authorization:\s*Basic\s+(\S+))mi', $output, $m)) { + $decoded = base64_decode($m[1]); + } else { + $decoded = ''; + } + + echo "=== {$label} ===", PHP_EOL; + echo " decoded : ", addcslashes($decoded, "\0..\37"), PHP_EOL; + echo " result : ", ($decoded === $expected ? "OK" : "CORRUPT"), PHP_EOL; +} + +probe('user only', '%76%6f%72%74%66%75', 'vortfu:'); +probe('user + password', '%76%6f%72%74%66%75:%70%61%73%73%77%6f%72%64', 'vortfu:password'); +?> +--EXPECT-- +=== user only === + decoded : vortfu: + result : OK +=== user + password === + decoded : vortfu:password + result : OK diff --git a/ext/standard/tests/http/http_response_header_deprecated_dynamic_fetch.phpt b/ext/standard/tests/http/http_response_header_deprecated_dynamic_fetch.phpt new file mode 100644 index 000000000000..e6b90355a4c3 --- /dev/null +++ b/ext/standard/tests/http/http_response_header_deprecated_dynamic_fetch.phpt @@ -0,0 +1,16 @@ +--TEST-- +$http_response_header dynamic fetch should warn +--FILE-- + +--EXPECTF-- +Deprecated: The predefined locally scoped $http_response_header variable is deprecated, call http_get_last_response_headers() instead in %s on line %d +string(2) "OK" diff --git a/ext/standard/tests/mail/mail_basic2.phpt b/ext/standard/tests/mail/mail_basic2.phpt index 44d8d86310b0..96a5a4a10a11 100644 --- a/ext/standard/tests/mail/mail_basic2.phpt +++ b/ext/standard/tests/mail/mail_basic2.phpt @@ -20,14 +20,17 @@ $message = 'A Message'; $additional_headers = 'KHeaders'; $additional_parameters = "-n"; $outFile = "/tmp/php_test_mailBasic2.out"; -@unlink($outFile); echo "-- extra parameters --\n"; // Calling mail() with all possible arguments var_dump( mail($to, $subject, $message, $additional_headers, $additional_parameters) ); echo file_get_contents($outFile); -unlink($outFile); + +?> +--CLEAN-- + --EXPECTF-- *** Testing mail() : basic functionality *** diff --git a/ext/standard/tests/math/pi_basic.phpt b/ext/standard/tests/math/pi_basic.phpt index 10814ae8e819..acb95ceb62e7 100644 --- a/ext/standard/tests/math/pi_basic.phpt +++ b/ext/standard/tests/math/pi_basic.phpt @@ -7,7 +7,7 @@ precision=14 echo pi(), "\n"; echo M_PI, "\n"; // N.B pi() ignores all specified arguments no error -// messages are produced if arguments are spcified. +// messages are produced if arguments are specified. ?> --EXPECT-- 3.1415926535898 diff --git a/ext/standard/tests/network/openlog_null_bytes.phpt b/ext/standard/tests/network/openlog_null_bytes.phpt new file mode 100644 index 000000000000..6d3274227815 --- /dev/null +++ b/ext/standard/tests/network/openlog_null_bytes.phpt @@ -0,0 +1,16 @@ +--TEST-- +openlog() rejects null bytes in prefix +--SKIPIF-- + +--FILE-- +getMessage(), "\n"; +} +?> +--EXPECT-- +openlog(): Argument #1 ($prefix) must not contain any null bytes diff --git a/ext/standard/tests/network/setcookie_option_case_variant_leak.phpt b/ext/standard/tests/network/setcookie_option_case_variant_leak.phpt new file mode 100644 index 000000000000..4797d2f259c9 --- /dev/null +++ b/ext/standard/tests/network/setcookie_option_case_variant_leak.phpt @@ -0,0 +1,15 @@ +--TEST-- +setcookie() does not leak when an option array has case-variant duplicate keys +--FILE-- + '/aaaaaaaaaaaaaaaa' . $i, 'Path' => '/bbbbbbbbbbbbbbbb' . $i]); + header_remove(); +} +// Each duplicate-key call leaked the first path string before the fix, +// growing usage by tens of bytes per iteration (hundreds of KB here). +var_dump(memory_get_usage() - $base < 50000); +?> +--EXPECT-- +bool(true) diff --git a/ext/standard/tests/poll/poll.inc b/ext/standard/tests/poll/poll.inc new file mode 100644 index 000000000000..a1ca01fc7d4a --- /dev/null +++ b/ext/standard/tests/poll/poll.inc @@ -0,0 +1,321 @@ + Io\Poll\Backend::Auto, + 'poll' => Io\Poll\Backend::Poll, + 'epoll' => Io\Poll\Backend::Epoll, + 'kqueue' => Io\Poll\Backend::Kqueue, + 'eventports' => Io\Poll\Backend::EventPorts, + 'wsapoll' => Io\Poll\Backend::WSAPoll, + default => throw new ValueError("Unknown backend: $backend"), + }; + + return new Io\Poll\Context($backend_enum); +} + +function pt_stream_poll_add($poll_ctx, $stream, $events, $data = null): Io\Poll\Watcher { + return $poll_ctx->add(new StreamPollHandle($stream), $events, $data); +} + +function pt_skip_for_backend($backend, $msg): void { + $backends_to_skip = is_array($backend) ? $backend : array($backend); + $current_backend = pt_new_stream_poll()->getBackend(); + if (in_array($current_backend->name, $backends_to_skip)) { + die("skip backend {$current_backend->name} $msg\n"); + } +} + +function pt_new_socket_pair(): array { + $domain = (strtoupper(substr(PHP_OS, 0, 3) == 'WIN') ? STREAM_PF_INET : STREAM_PF_UNIX); + $sockets = stream_socket_pair($domain, STREAM_SOCK_STREAM, 0); + if ($sockets === false) { + die("Cannot create socket pair\n"); + } + return $sockets; +} + +function pt_new_tcp_socket_pair(): array { + $server = stream_socket_server("tcp://127.0.0.1:0", $errno, $errstr); + if (!$server) { + die("Cannot create TCP server: $errstr\n"); + } + $address = stream_socket_get_name($server, false); + + $client = stream_socket_client("tcp://$address", $errno, $errstr); + if (!$client) { + fclose($server); + die("Cannot connect to TCP server: $errstr\n"); + } + + $server_conn = stream_socket_accept($server); + if (!$server_conn) { + fclose($server); + fclose($client); + die("Cannot accept connection\n"); + } + + // Close the listening socket (no longer needed) + fclose($server); + + return [$client, $server_conn]; +} + +function pt_new_tcp_socket_connections(int $num_conns): array { + $server = stream_socket_server("tcp://127.0.0.1:0", $errno, $errstr); + if (!$server) { + die("Cannot create TCP server: $errstr\n"); + } + $address = stream_socket_get_name($server, false); + + $clients = []; + $server_conns = []; + for ($i = 0; $i < $num_conns; ++$i) { + $clients[$i] = stream_socket_client("tcp://$address", $errno, $errstr); + if (!$clients[$i]) { + fclose($server); + die("Cannot connect to TCP server: $errstr\n"); + } + + $server_conns[$i] = stream_socket_accept($server); + if (!$server_conns[$i]) { + fclose($server); + die("Cannot accept connection\n"); + } + } + + // Close the listening socket (no longer needed) + fclose($server); + + return [$clients, $server_conns]; +} + +function pt_write_sleep($stream, $data, $delay = 10000): int|false { + $result = fwrite($stream, $data); + usleep($delay); + return $result; +} + +function pt_event_array_to_string(array $events): string { + $names = []; + foreach ($events as $event) { + $names[] = $event->name; + } + return empty($names) ? 'NONE' : implode('|', $names); +} + +function pt_print_events($watchers, $read_data = false): void { + if (!is_array($watchers)) { + die("Events must be an array\n"); + } + echo "Events count: " . count($watchers) . "\n"; + foreach ($watchers as $i => $watcher) { + if (!$watcher instanceof Io\Poll\Watcher) { + die('Invalid event type'); + } + echo "Event[$i]: " . pt_event_array_to_string($watcher->getTriggeredEvents()) . ", user data: " . $watcher->getData(); + if ($read_data && $watcher->hasTriggered(Io\Poll\Event::Read)) { + $data = fread($watcher->getHandle()->getStream(), 1024); + echo ", read data: '$data'"; + } + echo "\n"; + } +} + +function pt_expect_events($watchers, $expected, ?Io\Poll\Context $poll_ctx = null): void { + if (!is_array($watchers)) { + die("Events must be an array\n"); + } + + if (!is_array($expected)) { + die("Expected events must be an array\n"); + } + + $event_count = count($watchers); + $expected_count = count($expected); + + // Get the current backend for backend-specific expectations + $backend = $poll_ctx ? $poll_ctx->getBackend()->name : 'unknown'; + + if ($event_count !== $expected_count) { + echo "Event count mismatch: got $event_count, expected $expected_count\n"; + pt_print_mismatched_events($watchers, $expected, [], $backend); + return; + } + + // Convert events to comparable format for matching + $actual_events = []; + foreach ($watchers as $watcher) { + if (!$watcher instanceof Io\Poll\Watcher) { + die('Invalid event type'); + } + + $event_data = [ + 'events' => $watcher->getTriggeredEvents(), + 'data' => $watcher->getData(), + ]; + + $actual_events[] = $event_data; + } + + // Resolve backend-specific expectations + $resolved_expected = []; + foreach ($expected as $exp_event) { + $resolved_event = $exp_event; + + // Check if events field is a backend-specific map (associative array with string keys) + if (isset($exp_event['events']) && is_array($exp_event['events'])) { + // Check if it's a backend map (has string keys like 'default', 'Kqueue', etc.) + $keys = array_keys($exp_event['events']); + $is_backend_map = false; + foreach ($keys as $key) { + if (is_string($key)) { + $is_backend_map = true; + break; + } + } + + if ($is_backend_map) { + // It's a backend-specific map, resolve it + $resolved_event['events'] = pt_resolve_backend_specific_value($exp_event['events'], $backend); + } + // Otherwise it's already an array of Event enums, leave it as-is + } + + $resolved_expected[] = $resolved_event; + } + + // Try to match each expected event with an actual event + $matched = []; + $unmatched_expected = []; + + foreach ($resolved_expected as $exp_idx => $exp_event) { + $found_match = false; + + foreach ($actual_events as $act_idx => $act_event) { + if (isset($matched[$act_idx])) { + continue; // Already matched + } + + // Check if events and data match + if (pt_events_equal($act_event['events'], $exp_event['events']) && + $act_event['data'] === $exp_event['data']) { + + // If read data is expected, check it + if (isset($exp_event['read'])) { + $read_data = fread($watchers[$act_idx]->getHandle()->getStream(), 1024); + if ($read_data !== $exp_event['read']) { + continue; // Read data doesn't match + } + } + + $matched[$act_idx] = $exp_idx; + $found_match = true; + break; + } + } + + if (!$found_match) { + $unmatched_expected[] = $exp_event; + } + } + + // Check if all events matched + if (count($matched) === $event_count && empty($unmatched_expected)) { + echo "Events matched - count: $event_count\n"; + } else { + echo "Events did not match:\n"; + pt_print_mismatched_events($watchers, $expected, $matched, $backend); + } +} + +function pt_events_equal($actual, $expected): bool { + // Both should be arrays of Event enums + if (!is_array($actual) || !is_array($expected)) { + return false; + } + + if (count($actual) !== count($expected)) { + return false; + } + + // Sort both arrays by event name for comparison + $actual_names = array_map(fn($e) => $e->name, $actual); + $expected_names = array_map(fn($e) => $e->name, $expected); + sort($actual_names); + sort($expected_names); + + return $actual_names === $expected_names; +} + +function pt_resolve_backend_specific_value($backend_map, $current_backend) { + // Direct backend match + if (isset($backend_map[$current_backend])) { + return $backend_map[$current_backend]; + } + + // Check for multi-backend keys (e.g., "Kqueue|EventPorts") + foreach ($backend_map as $key => $value) { + if (strpos($key, '|') !== false) { + $backends = array_map('trim', explode('|', $key)); + if (in_array($current_backend, $backends)) { + return $value; + } + } + } + + // Fall back to default + if (isset($backend_map['default'])) { + return $backend_map['default']; + } + + // If no match found, this is an error + die("No backend-specific value found for '$current_backend' and no default specified\n"); +} + +function pt_print_mismatched_events($actual_watchers, $expected_watchers, $matched = [], $backend_name = null): void { + echo "Actual events:\n"; + foreach ($actual_watchers as $i => $watcher) { + $match_status = isset($matched[$i]) ? " [MATCHED]" : " [UNMATCHED]"; + $watcher_names = pt_event_array_to_string($watcher->getTriggeredEvents()); + echo " Event[$i]: $watcher_names, user data: " . $watcher->getData() . $match_status . "\n"; + } + + echo "Expected events:\n"; + foreach ($expected_watchers as $i => $exp_event) { + $was_matched = in_array($i, $matched); + $match_status = $was_matched ? " [MATCHED]" : " [UNMATCHED]"; + + $events_value = $exp_event['events']; + + // Check if it's a backend-specific map + if (is_array($events_value) && $backend_name !== null) { + $keys = array_keys($events_value); + $is_backend_map = false; + foreach ($keys as $key) { + if (is_string($key)) { + $is_backend_map = true; + break; + } + } + + if ($is_backend_map) { + $events_value = pt_resolve_backend_specific_value($events_value, $backend_name); + } + } + + $watcher_names = is_array($events_value) ? pt_event_array_to_string($events_value) : 'INVALID'; + echo " Event[$i]: $watcher_names, user data: " . $exp_event['data']; + if (isset($exp_event['read'])) { + echo ", read data: '" . $exp_event['read'] . "'"; + } + echo $match_status . "\n"; + } +} diff --git a/ext/standard/tests/poll/poll_backend_getAvailableBackends.phpt b/ext/standard/tests/poll/poll_backend_getAvailableBackends.phpt new file mode 100644 index 000000000000..9ea78d87d1d0 --- /dev/null +++ b/ext/standard/tests/poll/poll_backend_getAvailableBackends.phpt @@ -0,0 +1,12 @@ +--TEST-- +\Io\Poll\Backend::getAvailableBackends() - loop +--FILE-- + +--EXPECT-- +Okay diff --git a/ext/standard/tests/poll/poll_clone_not_allowed.phpt b/ext/standard/tests/poll/poll_clone_not_allowed.phpt new file mode 100644 index 000000000000..f31c4c2ecd7f --- /dev/null +++ b/ext/standard/tests/poll/poll_clone_not_allowed.phpt @@ -0,0 +1,26 @@ +--TEST-- +Io\Poll: Context, Watcher and StreamPollHandle are not cloneable +--FILE-- +add($handle, [Io\Poll\Event::Read]); + +foreach ([$ctx, $handle, $watcher] as $obj) { + try { + clone $obj; + } catch (Error $e) { + echo $e->getMessage(), "\n"; + } +} + +echo "done\n"; +?> +--EXPECT-- +Trying to clone an uncloneable object of class Io\Poll\Context +Trying to clone an uncloneable object of class StreamPollHandle +Trying to clone an uncloneable object of class Io\Poll\Watcher +done diff --git a/ext/standard/tests/poll/poll_ctx_backend_unix.phpt b/ext/standard/tests/poll/poll_ctx_backend_unix.phpt new file mode 100644 index 000000000000..89f4f3eea10a --- /dev/null +++ b/ext/standard/tests/poll/poll_ctx_backend_unix.phpt @@ -0,0 +1,28 @@ +--TEST-- +Poll context - backend on Unix +--SKIPIF-- + +--FILE-- +getBackend()); +// test with poll that is always available on Unix systems +$poll_ctx = new Io\Poll\Context(Io\Poll\Backend::Poll); +$backend = $poll_ctx->getBackend(); +var_dump($backend->name); +try { + new Io\Poll\Context(Io\Poll\Backend::WSAPoll); +} catch (\Io\Poll\BackendUnavailableException $e) { + var_dump($e->getMessage()); +} +?> +--EXPECTF-- +enum(Io\Poll\Backend::%s) +string(4) "Poll" +string(29) "Backend WSAPoll not available" diff --git a/ext/standard/tests/poll/poll_ctx_backend_windows.phpt b/ext/standard/tests/poll/poll_ctx_backend_windows.phpt new file mode 100644 index 000000000000..a8f8498800cc --- /dev/null +++ b/ext/standard/tests/poll/poll_ctx_backend_windows.phpt @@ -0,0 +1,28 @@ +--TEST-- +Poll context - backend on Windows +--SKIPIF-- + +--FILE-- +getBackend()); +// test with WSAPoll +$poll_ctx = new Io\Poll\Context(Io\Poll\Backend::WSAPoll); +$backend = $poll_ctx->getBackend(); +var_dump($backend->name); +try { + new Io\Poll\Context(Io\Poll\Backend::Epoll); +} catch (\Io\Poll\BackendUnavailableException $e) { + var_dump($e->getMessage()); +} +?> +--EXPECTF-- +enum(Io\Poll\Backend::%s) +string(7) "WSAPoll" +string(27) "Backend Epoll not available" diff --git a/ext/standard/tests/poll/poll_double_construct.phpt b/ext/standard/tests/poll/poll_double_construct.phpt new file mode 100644 index 000000000000..1fa5b65db38d --- /dev/null +++ b/ext/standard/tests/poll/poll_double_construct.phpt @@ -0,0 +1,28 @@ +--TEST-- +Io\Poll: calling __construct() twice throws instead of leaking +--FILE-- +__construct($r); +} catch (Error $e) { + echo $e->getMessage(), "\n"; +} + +$ctx = pt_new_stream_poll(); +try { + $ctx->__construct(); +} catch (Error $e) { + echo $e->getMessage(), "\n"; +} + +echo "done\n"; +?> +--EXPECT-- +StreamPollHandle object is already constructed +Io\Poll\Context object is already constructed +done diff --git a/ext/standard/tests/poll/poll_stream_add_error_duplicate.phpt b/ext/standard/tests/poll/poll_stream_add_error_duplicate.phpt new file mode 100644 index 000000000000..8753cad7eb8e --- /dev/null +++ b/ext/standard/tests/poll/poll_stream_add_error_duplicate.phpt @@ -0,0 +1,19 @@ +--TEST-- +Poll stream - add duplicite error +--FILE-- +getMessage() . "\n"; +} +?> +--EXPECT-- +ERROR: Handle already added diff --git a/ext/standard/tests/poll/poll_stream_handle_close_then_free.phpt b/ext/standard/tests/poll/poll_stream_handle_close_then_free.phpt new file mode 100644 index 000000000000..9a97fad8dd1c --- /dev/null +++ b/ext/standard/tests/poll/poll_stream_handle_close_then_free.phpt @@ -0,0 +1,20 @@ +--TEST-- +Io\Poll: StreamPollHandle cleanup is safe when the stream is closed first +--FILE-- +add(new StreamPollHandle($r), [Io\Poll\Event::Read]); + +// Close the underlying streams before the watcher and handle are freed. +fclose($r); +fclose($w); + +unset($watcher, $ctx); +gc_collect_cycles(); +echo "ok\n"; +?> +--EXPECT-- +ok diff --git a/ext/standard/tests/poll/poll_stream_handle_fd_release.phpt b/ext/standard/tests/poll/poll_stream_handle_fd_release.phpt new file mode 100644 index 000000000000..66d042c17138 --- /dev/null +++ b/ext/standard/tests/poll/poll_stream_handle_fd_release.phpt @@ -0,0 +1,28 @@ +--TEST-- +Io\Poll: StreamPollHandle releases its stream resource (no fd leak) +--SKIPIF-- + +--FILE-- + +--EXPECT-- +bool(true) diff --git a/ext/standard/tests/poll/poll_stream_sock_add_only.phpt b/ext/standard/tests/poll/poll_stream_sock_add_only.phpt new file mode 100644 index 000000000000..b282ae846324 --- /dev/null +++ b/ext/standard/tests/poll/poll_stream_sock_add_only.phpt @@ -0,0 +1,17 @@ +--TEST-- +Poll stream - only add +--FILE-- + +--EXPECT-- +object(Io\Poll\Context)#1 (0) { +} diff --git a/ext/standard/tests/poll/poll_stream_sock_modify_write.phpt b/ext/standard/tests/poll/poll_stream_sock_modify_write.phpt new file mode 100644 index 000000000000..4f32ec28c88d --- /dev/null +++ b/ext/standard/tests/poll/poll_stream_sock_modify_write.phpt @@ -0,0 +1,18 @@ +--TEST-- +Poll stream - socket modify write +--FILE-- +modify([Io\Poll\Event::Write], "modified_data"); + +pt_expect_events($poll_ctx->wait(0), [ + ['events' => [Io\Poll\Event::Write], 'data' => 'modified_data'] +]); +?> +--EXPECT-- +Events matched - count: 1 diff --git a/ext/standard/tests/poll/poll_stream_sock_read.phpt b/ext/standard/tests/poll/poll_stream_sock_read.phpt new file mode 100644 index 000000000000..70aebc9cd926 --- /dev/null +++ b/ext/standard/tests/poll/poll_stream_sock_read.phpt @@ -0,0 +1,19 @@ +--TEST-- +Poll stream - socket read +--FILE-- +wait(0, 100000), [ + ['events' => [Io\Poll\Event::Read], 'data' => 'socket_data', 'read' => 'test data'] +]); + +?> +--EXPECT-- +Events matched - count: 1 diff --git a/ext/standard/tests/poll/poll_stream_sock_remove_write.phpt b/ext/standard/tests/poll/poll_stream_sock_remove_write.phpt new file mode 100644 index 000000000000..c5fec5391652 --- /dev/null +++ b/ext/standard/tests/poll/poll_stream_sock_remove_write.phpt @@ -0,0 +1,38 @@ +--TEST-- +Poll stream - socket remove write +--FILE-- +wait(0), [ + ['events' => [Io\Poll\Event::Write], 'data' => 'socket_data_1'], + ['events' => [Io\Poll\Event::Write], 'data' => 'socket_data_2'] +]); + +$watcher1w->remove(); + +pt_expect_events($poll_ctx->wait(0), [ + ['events' => [Io\Poll\Event::Write], 'data' => 'socket_data_2'] +]); + +// check that both streams are still usable +var_dump(fwrite($socket1w, "test 1")); +var_dump(fwrite($socket2w, "test 2")); +var_dump(fread($socket1r, 100)); +var_dump(fread($socket2r, 100)); + +?> +--EXPECT-- +Events matched - count: 2 +Events matched - count: 1 +int(6) +int(6) +string(6) "test 1" +string(6) "test 2" diff --git a/ext/standard/tests/poll/poll_stream_sock_rw_close.phpt b/ext/standard/tests/poll/poll_stream_sock_rw_close.phpt new file mode 100644 index 000000000000..4edd1619d309 --- /dev/null +++ b/ext/standard/tests/poll/poll_stream_sock_rw_close.phpt @@ -0,0 +1,32 @@ +--TEST-- +Poll stream - socket write / read close +--FILE-- +wait(0, 100000), [ + [ + 'events' => [ + 'default' => [Io\Poll\Event::Write, Io\Poll\Event::Error, Io\Poll\Event::HangUp], + 'Kqueue|EventPorts' => [Io\Poll\Event::Write, Io\Poll\Event::HangUp], + ], + 'data' => 'socket2_data' + ] +], $poll_ctx); + +fclose($socket1w); +pt_expect_events($poll_ctx->wait(0, 100000), []); + +?> +--EXPECT-- +Events matched - count: 1 +Events matched - count: 0 diff --git a/ext/standard/tests/poll/poll_stream_sock_rw_multi_edge.phpt b/ext/standard/tests/poll/poll_stream_sock_rw_multi_edge.phpt new file mode 100644 index 000000000000..f25cb973ddce --- /dev/null +++ b/ext/standard/tests/poll/poll_stream_sock_rw_multi_edge.phpt @@ -0,0 +1,62 @@ +--TEST-- +Poll stream - socket write / read multiple times with edge triggering +--SKIPIF-- + +--FILE-- +wait(0), [ + ['events' => [Io\Poll\Event::Write], 'data' => 'socket2_data'] +]); + +pt_expect_events($poll_ctx->wait(0), []); + +fwrite($socket1w, "test data"); +pt_expect_events($poll_ctx->wait(0, 100000), [ + ['events' => [Io\Poll\Event::Read], 'data' => 'socket1_data', 'read' => 'test data'] +]); + +fwrite($socket1w, "more data"); +pt_expect_events($poll_ctx->wait(0, 100000), [ + ['events' => [Io\Poll\Event::Write], 'data' => 'socket2_data'], + ['events' => [Io\Poll\Event::Read], 'data' => 'socket1_data'] +]); + +pt_expect_events($poll_ctx->wait(0, 100000), []); + +fwrite($socket1w, " and even more data"); +pt_expect_events($poll_ctx->wait(0, 100000), [ + ['events' => [Io\Poll\Event::Read], 'data' => 'socket1_data', 'read' => 'more data and even more data'] +]); + +fclose($socket1r); +pt_expect_events($poll_ctx->wait(0, 100000), [ + [ + 'events' => ['default' => [Io\Poll\Event::Write, Io\Poll\Event::HangUp]], + 'data' => 'socket2_data' + ] +], $poll_ctx); + +fclose($socket1w); +pt_expect_events($poll_ctx->wait(0, 100000), []); + +?> +--EXPECT-- +Events matched - count: 1 +Events matched - count: 0 +Events matched - count: 1 +Events matched - count: 2 +Events matched - count: 0 +Events matched - count: 1 +Events matched - count: 1 +Events matched - count: 0 diff --git a/ext/standard/tests/poll/poll_stream_sock_rw_multi_level.phpt b/ext/standard/tests/poll/poll_stream_sock_rw_multi_level.phpt new file mode 100644 index 000000000000..57fc335c26c4 --- /dev/null +++ b/ext/standard/tests/poll/poll_stream_sock_rw_multi_level.phpt @@ -0,0 +1,61 @@ +--TEST-- +Poll stream - socket write / read multiple times with level triggering +--FILE-- +wait(0), [ + ['events' => [Io\Poll\Event::Write], 'data' => 'socket2_data'] +]); + +pt_expect_events($poll_ctx->wait(0), [ + ['events' => [Io\Poll\Event::Write], 'data' => 'socket2_data'] +]); + +fwrite($socket1w, "test data"); +pt_expect_events($poll_ctx->wait(0, 100000), [ + ['events' => [Io\Poll\Event::Write], 'data' => 'socket2_data'], + ['events' => [Io\Poll\Event::Read], 'data' => 'socket1_data', 'read' => 'test data'] +]); + +fwrite($socket1w, "more data"); +pt_expect_events($poll_ctx->wait(0, 100000), [ + ['events' => [Io\Poll\Event::Write], 'data' => 'socket2_data'], + ['events' => [Io\Poll\Event::Read], 'data' => 'socket1_data'] +]); + +pt_expect_events($poll_ctx->wait(0, 100000), [ + ['events' => [Io\Poll\Event::Write], 'data' => 'socket2_data'], + ['events' => [Io\Poll\Event::Read], 'data' => 'socket1_data'] +]); + +fwrite($socket1w, " and even more data"); +pt_expect_events($poll_ctx->wait(0, 100000), [ + ['events' => [Io\Poll\Event::Write], 'data' => 'socket2_data'], + ['events' => [Io\Poll\Event::Read], 'data' => 'socket1_data', 'read' => 'more data and even more data'] +]); + +fclose($socket1r); +pt_expect_events($poll_ctx->wait(0, 100000), [ + ['events' => [Io\Poll\Event::Write, Io\Poll\Event::HangUp], 'data' => 'socket2_data'] +], $poll_ctx); + +fclose($socket1w); +pt_expect_events($poll_ctx->wait(0, 100000), []); + +?> +--EXPECT-- +Events matched - count: 1 +Events matched - count: 1 +Events matched - count: 2 +Events matched - count: 2 +Events matched - count: 2 +Events matched - count: 2 +Events matched - count: 1 +Events matched - count: 0 diff --git a/ext/standard/tests/poll/poll_stream_sock_rw_single_edge.phpt b/ext/standard/tests/poll/poll_stream_sock_rw_single_edge.phpt new file mode 100644 index 000000000000..4a7b67b8243f --- /dev/null +++ b/ext/standard/tests/poll/poll_stream_sock_rw_single_edge.phpt @@ -0,0 +1,29 @@ +--TEST-- +Poll stream - socket write / read few time only +--SKIPIF-- + +--FILE-- +wait(0), [ + ['events' => [Io\Poll\Event::Write], 'data' => 'socket2_data'] +]); +fwrite($socket1w, "test data"); +pt_expect_events($poll_ctx->wait(0, 100000), [ + ['events' => [Io\Poll\Event::Read], 'data' => 'socket1_data', 'read' => 'test data'] +]); + +?> +--EXPECT-- +Events matched - count: 1 +Events matched - count: 1 diff --git a/ext/standard/tests/poll/poll_stream_sock_rw_single_level.phpt b/ext/standard/tests/poll/poll_stream_sock_rw_single_level.phpt new file mode 100644 index 000000000000..a807e573c5fe --- /dev/null +++ b/ext/standard/tests/poll/poll_stream_sock_rw_single_level.phpt @@ -0,0 +1,25 @@ +--TEST-- +Poll stream - socket write / read few time only +--FILE-- +wait(0), [ + ['events' => [Io\Poll\Event::Write], 'data' => 'socket2_data'] +]); +fwrite($socket1w, "test data"); +pt_expect_events($poll_ctx->wait(0, 100000), [ + ['events' => [Io\Poll\Event::Write], 'data' => 'socket2_data'], + ['events' => [Io\Poll\Event::Read], 'data' => 'socket1_data', 'read' => 'test data'] +]); + +?> +--EXPECT-- +Events matched - count: 1 +Events matched - count: 2 diff --git a/ext/standard/tests/poll/poll_stream_sock_write.phpt b/ext/standard/tests/poll/poll_stream_sock_write.phpt new file mode 100644 index 000000000000..2d937d7e9a3b --- /dev/null +++ b/ext/standard/tests/poll/poll_stream_sock_write.phpt @@ -0,0 +1,18 @@ +--TEST-- +Poll stream - socket write +--FILE-- +wait(0, 100000), [ + ['events' => [Io\Poll\Event::Write], 'data' => 'socket_data'] +]); + +?> +--EXPECT-- +Events matched - count: 1 diff --git a/ext/standard/tests/poll/poll_stream_sock_write_close.phpt b/ext/standard/tests/poll/poll_stream_sock_write_close.phpt new file mode 100644 index 000000000000..8927e017b05d --- /dev/null +++ b/ext/standard/tests/poll/poll_stream_sock_write_close.phpt @@ -0,0 +1,20 @@ +--TEST-- +Poll stream - socket write close +--FILE-- +wait(0, 100000), []); + +?> +--EXPECT-- +Events matched - count: 0 diff --git a/ext/standard/tests/poll/poll_stream_tcp_read.phpt b/ext/standard/tests/poll/poll_stream_tcp_read.phpt new file mode 100644 index 000000000000..71c7af0ca734 --- /dev/null +++ b/ext/standard/tests/poll/poll_stream_tcp_read.phpt @@ -0,0 +1,19 @@ +--TEST-- +Poll stream - socket read +--FILE-- +wait(0, 100000), [ + ['events' => [Io\Poll\Event::Read], 'data' => 'socket_data', 'read' => 'test data'] +]); + +?> +--EXPECT-- +Events matched - count: 1 diff --git a/ext/standard/tests/poll/poll_stream_tcp_read_multiple_level.phpt b/ext/standard/tests/poll/poll_stream_tcp_read_multiple_level.phpt new file mode 100644 index 000000000000..db2ff71fb7c8 --- /dev/null +++ b/ext/standard/tests/poll/poll_stream_tcp_read_multiple_level.phpt @@ -0,0 +1,41 @@ +--TEST-- +Poll stream - TCP read write level +--FILE-- +wait(0), []); + +for ($i = 0; $i < count($clients); $i++) { + pt_write_sleep($clients[$i], "test $i data"); +} + +// Build expected events for all 20 connections +$expected_events = []; +for ($i = 0; $i < 20; $i++) { + $expected_events[] = ['events' => [Io\Poll\Event::Read], 'data' => "server{$i}_data", 'read' => "test $i data"]; +} +pt_expect_events($poll_ctx->wait(0, 100000), $expected_events); + +pt_write_sleep($clients[1], "more data"); +pt_write_sleep($clients[2], "more data"); +pt_expect_events($poll_ctx->wait(0, 100000), [ + ['events' => [Io\Poll\Event::Read], 'data' => 'server1_data', 'read' => 'more data'], + ['events' => [Io\Poll\Event::Read], 'data' => 'server2_data', 'read' => 'more data'] +]); + +pt_expect_events($poll_ctx->wait(0, 100000), []); + +?> +--EXPECT-- +Events matched - count: 0 +Events matched - count: 20 +Events matched - count: 2 +Events matched - count: 0 diff --git a/ext/standard/tests/poll/poll_stream_tcp_read_one_shot.phpt b/ext/standard/tests/poll/poll_stream_tcp_read_one_shot.phpt new file mode 100644 index 000000000000..02db6355ca1a --- /dev/null +++ b/ext/standard/tests/poll/poll_stream_tcp_read_one_shot.phpt @@ -0,0 +1,33 @@ +--TEST-- +Poll stream - TCP read write oneshot +--FILE-- +wait(0), []); + +pt_write_sleep($client1, "test data"); +pt_write_sleep($client2, "test data"); +pt_expect_events($poll_ctx->wait(0, 100000), [ + ['events' => [Io\Poll\Event::Read], 'data' => 'server1_data', 'read' => 'test data'], + ['events' => [Io\Poll\Event::Read], 'data' => 'server2_data', 'read' => 'test data'] +]); + +pt_write_sleep($client1, "more data"); +pt_write_sleep($client2, "more data"); +pt_expect_events($poll_ctx->wait(0, 100000), []); + +?> +--EXPECT-- +Events matched - count: 0 +Events matched - count: 2 +Events matched - count: 0 diff --git a/ext/standard/tests/poll/poll_stream_tcp_rw_one_shot.phpt b/ext/standard/tests/poll/poll_stream_tcp_rw_one_shot.phpt new file mode 100644 index 000000000000..6132975e1b50 --- /dev/null +++ b/ext/standard/tests/poll/poll_stream_tcp_rw_one_shot.phpt @@ -0,0 +1,28 @@ +--TEST-- +Poll stream - TCP read write oneshot combined +--FILE-- +wait(0), [ + ['events' => [Io\Poll\Event::Write], 'data' => 'client_data'], + ['events' => [Io\Poll\Event::Write], 'data' => 'server_data'] +]); + +pt_write_sleep($client, "test data"); +pt_expect_events($poll_ctx->wait(0, 100000), []); + +pt_write_sleep($client, "test data"); +pt_expect_events($poll_ctx->wait(0, 100000), []); + +?> +--EXPECT-- +Events matched - count: 2 +Events matched - count: 0 +Events matched - count: 0 diff --git a/ext/standard/tests/poll/poll_stream_tcp_rw_one_shot_mixed.phpt b/ext/standard/tests/poll/poll_stream_tcp_rw_one_shot_mixed.phpt new file mode 100644 index 000000000000..c480caf1b73d --- /dev/null +++ b/ext/standard/tests/poll/poll_stream_tcp_rw_one_shot_mixed.phpt @@ -0,0 +1,25 @@ +--TEST-- +Poll stream - TCP read write oneshot combined and mixed +--FILE-- +wait(0), [ + ['events' => [Io\Poll\Event::Write], 'data' => 'client_data'], + ['events' => [Io\Poll\Event::Read, Io\Poll\Event::Write], 'data' => 'server_data'] +]); + +pt_write_sleep($client, "test data"); +pt_expect_events($poll_ctx->wait(0, 100000), []); + +?> +--EXPECT-- +Events matched - count: 2 +Events matched - count: 0 diff --git a/ext/standard/tests/poll/poll_stream_tcp_rw_single_level.phpt b/ext/standard/tests/poll/poll_stream_tcp_rw_single_level.phpt new file mode 100644 index 000000000000..f29a74f19edd --- /dev/null +++ b/ext/standard/tests/poll/poll_stream_tcp_rw_single_level.phpt @@ -0,0 +1,28 @@ +--TEST-- +Poll stream - TCP read write level combined +--FILE-- +wait(0), [ + ['events' => [Io\Poll\Event::Write], 'data' => 'client_data'], + ['events' => [Io\Poll\Event::Write], 'data' => 'server_data'] +]); + +fwrite($client, "test data"); +usleep(10000); +pt_expect_events($poll_ctx->wait(0, 100000), [ + ['events' => [Io\Poll\Event::Write], 'data' => 'client_data'], + ['events' => [Io\Poll\Event::Read, Io\Poll\Event::Write], 'data' => 'server_data', 'read' => 'test data'] +]); + +?> +--EXPECT-- +Events matched - count: 2 +Events matched - count: 2 diff --git a/ext/standard/tests/poll/poll_stream_wait_no_add.phpt b/ext/standard/tests/poll/poll_stream_wait_no_add.phpt new file mode 100644 index 000000000000..a297fa5e1162 --- /dev/null +++ b/ext/standard/tests/poll/poll_stream_wait_no_add.phpt @@ -0,0 +1,12 @@ +--TEST-- +Poll stream - only wait +--FILE-- +wait(0, 100000); +pt_print_events($events); + +?> +--EXPECT-- +Events count: 0 diff --git a/ext/standard/tests/poll/poll_watcher_gc_cycle.phpt b/ext/standard/tests/poll/poll_watcher_gc_cycle.phpt new file mode 100644 index 000000000000..590649acef8f --- /dev/null +++ b/ext/standard/tests/poll/poll_watcher_gc_cycle.phpt @@ -0,0 +1,31 @@ +--TEST-- +Io\Poll: cycle collector reclaims a Watcher referenced through its own data +--FILE-- +add(new StreamPollHandle($r), [Io\Poll\Event::Read]); + +$c = new Canary(); +$c->ref = $watcher; // Canary -> Watcher +$watcher->modifyData($c); // Watcher->data -> Canary (cycle) + +unset($ctx, $watcher, $c, $r, $w); + +echo "before gc\n"; +gc_collect_cycles(); +echo "after gc\n"; +?> +--EXPECT-- +before gc +Canary freed +after gc diff --git a/ext/standard/tests/poll/poll_watcher_outlives_context.phpt b/ext/standard/tests/poll/poll_watcher_outlives_context.phpt new file mode 100644 index 000000000000..2c058d5b8966 --- /dev/null +++ b/ext/standard/tests/poll/poll_watcher_outlives_context.phpt @@ -0,0 +1,35 @@ +--TEST-- +Io\Poll: Watcher operations are safe after its Context is destroyed +--FILE-- +add(new StreamPollHandle($r), [Io\Poll\Event::Read], "data"); + +// Drop the Context while still holding the Watcher it returned. +unset($ctx); +gc_collect_cycles(); + +var_dump($watcher->isActive()); + +try { + $watcher->remove(); +} catch (Io\Poll\InactiveWatcherException $e) { + echo $e->getMessage(), "\n"; +} + +try { + $watcher->modifyEvents([Io\Poll\Event::Write]); +} catch (Io\Poll\InactiveWatcherException $e) { + echo $e->getMessage(), "\n"; +} + +echo "done\n"; +?> +--EXPECT-- +bool(false) +Cannot remove inactive watcher +Cannot modify inactive watcher +done diff --git a/ext/standard/tests/serialize/serialization_objects_009.phpt b/ext/standard/tests/serialize/serialization_objects_009.phpt index 9485f3ef8068..95b85ccd80f7 100644 --- a/ext/standard/tests/serialize/serialization_objects_009.phpt +++ b/ext/standard/tests/serialize/serialization_objects_009.phpt @@ -8,17 +8,16 @@ eval('class C {}'); $b = unserialize($ser); var_dump($a, $b); - echo "Done"; ?> --EXPECTF-- -Warning: Class __PHP_Incomplete_Class has no unserializer in %sserialization_objects_009.php on line %d +Warning: Class __PHP_Incomplete_Class has no unserializer in %s on line %d + +Warning: unserialize(): Error at offset 11 of 18 bytes in %s on line %d + +Warning: Class C has no unserializer in %s on line %d -Warning: Class C has no unserializer in %sserialization_objects_009.php on line %d -object(__PHP_Incomplete_Class)#%d (1) { - ["__PHP_Incomplete_Class_Name"]=> - string(1) "C" -} -object(C)#%d (0) { -} +Warning: unserialize(): Error at offset 11 of 18 bytes in %s on line %d +bool(false) +bool(false) Done diff --git a/ext/standard/tests/setcookie_samesite_validation.phpt b/ext/standard/tests/setcookie_samesite_validation.phpt new file mode 100644 index 000000000000..3827f04fe8d4 --- /dev/null +++ b/ext/standard/tests/setcookie_samesite_validation.phpt @@ -0,0 +1,52 @@ +--TEST-- +setcookie() and setrawcookie() validate samesite option +--FILE-- + 'Strict'])); +var_dump(setcookie('test', 'value', ['samesite' => 'Lax'])); +var_dump(setcookie('test', 'value', ['samesite' => 'None'])); +var_dump(setcookie('test', 'value', ['samesite' => ''])); + +// Case-insensitive +var_dump(setcookie('test', 'value', ['samesite' => 'strict'])); +var_dump(setcookie('test', 'value', ['samesite' => 'LAX'])); +var_dump(setcookie('test', 'value', ['samesite' => 'NONE'])); + +// setrawcookie uses the same validation +var_dump(setrawcookie('test', 'value', ['samesite' => 'Lax'])); + +// Invalid values +try { + setcookie('test', 'value', ['samesite' => 'Invalid']); +} catch (ValueError $e) { + echo $e->getMessage() . "\n"; +} + +try { + setcookie('test', 'value', ['samesite' => "Strict\r\nX-Injected: evil"]); +} catch (ValueError $e) { + echo $e->getMessage() . "\n"; +} + +try { + setrawcookie('test', 'value', ['samesite' => 'Invalid']); +} catch (ValueError $e) { + echo $e->getMessage() . "\n"; +} + +?> +--EXPECTF-- +bool(true) +bool(true) +bool(true) +bool(true) +bool(true) +bool(true) +bool(true) +bool(true) +setcookie(): "samesite" option must be "Strict", "Lax", "None", or "" +setcookie(): "samesite" option must be "Strict", "Lax", "None", or "" +setrawcookie(): "samesite" option must be "Strict", "Lax", "None", or "" diff --git a/ext/standard/tests/streams/gh14506.phpt b/ext/standard/tests/streams/gh14506.phpt index f83eba4f1ff3..3d82350221d5 100644 --- a/ext/standard/tests/streams/gh14506.phpt +++ b/ext/standard/tests/streams/gh14506.phpt @@ -86,10 +86,10 @@ Warning: fclose(): cannot close the provided stream, as it must not be manually Warning: fclose(): cannot close the provided stream, as it must not be manually closed in %s on line %d -Warning: stream_select(): Cannot represent a stream of type user-space as a select()able descriptor in %s on line %d - Warning: fclose(): cannot close the provided stream, as it must not be manually closed in %s on line %d +Warning: stream_select(): Cannot represent a stream of type user-space as a select()able descriptor in %s on line %d + Warning: stream_select(): Cannot represent a stream of type user-space as a select()able descriptor in %s on line %d No stream arrays were passed fclose(): Argument #1 ($stream) must be an open stream resource diff --git a/ext/standard/tests/streams/gh22200.phpt b/ext/standard/tests/streams/gh22200.phpt new file mode 100644 index 000000000000..01a58bbf8cf2 --- /dev/null +++ b/ext/standard/tests/streams/gh22200.phpt @@ -0,0 +1,22 @@ +--TEST-- +GH-22200 (Memory leaks in the stream errors code on reentrant error handler) +--FILE-- + +--EXPECT-- +done diff --git a/ext/standard/tests/streams/stream_context_set_option_no_default_leak.phpt b/ext/standard/tests/streams/stream_context_set_option_no_default_leak.phpt new file mode 100644 index 000000000000..788b6d8a4676 --- /dev/null +++ b/ext/standard/tests/streams/stream_context_set_option_no_default_leak.phpt @@ -0,0 +1,29 @@ +--TEST-- +stream_context_set_option() on a context-less stream must not leak into the default context +--FILE-- + +--EXPECT-- +array(0) { +} +array(0) { +} +array(1) { + ["http"]=> + array(1) { + ["filename"]=> + string(8) "test.txt" + } +} diff --git a/ext/standard/tests/streams/stream_errors_error_has_code.phpt b/ext/standard/tests/streams/stream_errors_error_has_code.phpt new file mode 100644 index 000000000000..6cd6b70411a6 --- /dev/null +++ b/ext/standard/tests/streams/stream_errors_error_has_code.phpt @@ -0,0 +1,30 @@ +--TEST-- +Stream errors - multiple operations stored +--FILE-- + [ + 'error_mode' => StreamErrorMode::Silent, + 'error_store' => StreamErrorStore::All, + ] +]); + +// First operation +$stream1 = fopen('php://nonexistent1', 'r', false, $context); +$error1 = stream_last_errors()[0]; + +// Second operation +$stream2 = fopen('php://nonexistent2', 'r', false, $context); +$error2 = stream_last_errors()[0]; + +// Should get the most recent error (second operation) +if ($error2) { + echo "Got most recent error\n"; + echo "Param contains 'nonexistent2': " . (strpos($error2->param ?? '', 'nonexistent2') !== false ? 'yes' : 'no') . "\n"; +} + +?> +--EXPECT-- +Got most recent error +Param contains 'nonexistent2': yes diff --git a/ext/standard/tests/streams/stream_errors_exception_mode_terminal.phpt b/ext/standard/tests/streams/stream_errors_exception_mode_terminal.phpt new file mode 100644 index 000000000000..37f5d39bfa75 --- /dev/null +++ b/ext/standard/tests/streams/stream_errors_exception_mode_terminal.phpt @@ -0,0 +1,31 @@ +--TEST-- +Stream errors - exception mode for terminal errors +--FILE-- + [ + 'error_mode' => StreamErrorMode::Exception, + ] +]); + +try { + $stream = fopen('php://nonexistent', 'r', false, $context); +} catch (StreamException $e) { + echo "Caught: " . $e->getMessage() . "\n"; + echo "Code: " . $e->getCode() . "\n"; + + $errors = $e->getErrors(); + if (!empty($errors)) { + $error = $errors[0]; + echo "Wrapper: " . $error->wrapperName . "\n"; + echo "Error code name: " . $error->code->name . "\n"; + } +} + +?> +--EXPECTF-- +Caught: Failed to open stream: operation failed +Code: 20 +Wrapper: PHP +Error code name: OpenFailed diff --git a/ext/standard/tests/streams/stream_errors_invalid_types.phpt b/ext/standard/tests/streams/stream_errors_invalid_types.phpt new file mode 100644 index 000000000000..1b3ab5e8931e --- /dev/null +++ b/ext/standard/tests/streams/stream_errors_invalid_types.phpt @@ -0,0 +1,37 @@ +--TEST-- +Stream errors - invalid enum type throws TypeError +--FILE-- + [ + 'error_mode' => 'invalid', + ] + ]); + + fopen('php://nonexistent', 'r', false, $context); +} catch (TypeError $e) { + echo "Caught TypeError for error_mode\n"; +} + +try { + $context = stream_context_create([ + 'stream' => [ + 'error_store' => 123, + ] + ]); + + fopen('php://nonexistent', 'r', false, $context); +} catch (TypeError $e) { + echo "Caught TypeError for error_store\n"; +} + +?> +--EXPECTF-- + +Warning: fopen(php://nonexistent): Failed to open stream: operation failed in %s on line %d +Caught TypeError for error_mode + +Warning: fopen(php://nonexistent): Failed to open stream: operation failed in %s on line %d +Caught TypeError for error_store diff --git a/ext/standard/tests/streams/stream_errors_mix_modes_storage.phpt b/ext/standard/tests/streams/stream_errors_mix_modes_storage.phpt new file mode 100644 index 000000000000..49c18616dad3 --- /dev/null +++ b/ext/standard/tests/streams/stream_errors_mix_modes_storage.phpt @@ -0,0 +1,149 @@ +--TEST-- +Stream errors - silent mode with mixed error stores +--FILE-- +position += $count; + return str_repeat('x', $count + 10); + } + + public function stream_eof() { + return $this->position >= 100; + } + + public function stream_stat() { + return []; + } +} + +stream_wrapper_register('test', 'TestStream'); + +function stream_test_errors($title, $contextOptions) { + stream_clear_errors(); + $context = stream_context_create($contextOptions); + $stream = fopen('test://foo', 'r', false, $context); + try { + echo $title . "\n"; + $readin = fopen('php://stdin', 'r', false, $context); + $data = fread($stream, 10); + + $read = [$readin, $stream]; + $write = NULL; + $except = NULL; + stream_select($read, $write, $except, 0, 0, $context); + } catch (StreamException $e) { + echo 'EXCEPTION: ' . $e->getMessage() . "\n"; + } + + $errors = stream_last_errors(); + if ($errors) { + $first = $errors[0]; + echo "Error details:\n"; + echo "- Message: $first->message\n"; + echo "- Code: " . $first->code->name . "\n"; + echo "- Wrapper: $first->wrapperName\n"; + echo "- Terminating: " . ($first->terminating ? 'yes' : 'no') . "\n"; + echo "- Count: " . count($errors) . "\n"; + + foreach ($errors as $idx => $error) { + echo " [$idx] " . $error->code->name . ": " . $error->message . "\n"; + } + } else { + echo "No errors stored\n"; + } + echo "\n"; +} + +stream_test_errors('ALL', [ + 'stream' => [ + 'error_mode' => StreamErrorMode::Silent, + 'error_store' => StreamErrorStore::All, + ] +]); + +stream_test_errors('NON TERMINATING', [ + 'stream' => [ + 'error_mode' => StreamErrorMode::Silent, + 'error_store' => StreamErrorStore::NonTerminating, + ] +]); + +stream_test_errors('TERMINATING', [ + 'stream' => [ + 'error_mode' => StreamErrorMode::Silent, + 'error_store' => StreamErrorStore::Terminating, + ] +]); + +stream_test_errors('AUTO EXCEPTION', [ + 'stream' => [ + 'error_mode' => StreamErrorMode::Exception, + 'error_store' => StreamErrorStore::Auto, + ] +]); + +stream_test_errors('AUTO ERROR', [ + 'stream' => [ + 'error_mode' => StreamErrorMode::Error, + 'error_store' => StreamErrorStore::Auto, + ] +]); + +?> +--EXPECTF-- +ALL +Error details: +- Message: TestStream::stream_cast is not implemented! +- Code: NotImplemented +- Wrapper: user-space +- Terminating: yes +- Count: 2 + [0] NotImplemented: TestStream::stream_cast is not implemented! + [1] CastNotSupported: Cannot represent a stream of type user-space as a select()able descriptor + +NON TERMINATING +Error details: +- Message: TestStream::stream_read - read 10 bytes more data than requested (8202 read, 8192 max) - excess data will be lost +- Code: UserspaceInvalidReturn +- Wrapper: user-space +- Terminating: no +- Count: 1 + [0] UserspaceInvalidReturn: TestStream::stream_read - read 10 bytes more data than requested (8202 read, 8192 max) - excess data will be lost + +TERMINATING +Error details: +- Message: TestStream::stream_cast is not implemented! +- Code: NotImplemented +- Wrapper: user-space +- Terminating: yes +- Count: 2 + [0] NotImplemented: TestStream::stream_cast is not implemented! + [1] CastNotSupported: Cannot represent a stream of type user-space as a select()able descriptor + +AUTO EXCEPTION +EXCEPTION: TestStream::stream_cast is not implemented! +Error details: +- Message: TestStream::stream_read - read 10 bytes more data than requested (8202 read, 8192 max) - excess data will be lost +- Code: UserspaceInvalidReturn +- Wrapper: user-space +- Terminating: no +- Count: 1 + [0] UserspaceInvalidReturn: TestStream::stream_read - read 10 bytes more data than requested (8202 read, 8192 max) - excess data will be lost + +AUTO ERROR + +Warning: fread(): TestStream::stream_read - read 10 bytes more data than requested (8202 read, 8192 max) - excess data will be lost in %s on line %d + +Warning: stream_select(): TestStream::stream_cast is not implemented! in %s on line %d + +Warning: stream_select(): Cannot represent a stream of type user-space as a select()able descriptor in %s on line %d +No errors stored diff --git a/ext/standard/tests/streams/stream_errors_modes_with_auto_store.phpt b/ext/standard/tests/streams/stream_errors_modes_with_auto_store.phpt new file mode 100644 index 000000000000..2575a8a795f9 --- /dev/null +++ b/ext/standard/tests/streams/stream_errors_modes_with_auto_store.phpt @@ -0,0 +1,49 @@ +--TEST-- +Stream errors - error_store AUTO mode behavior +--FILE-- + [ + 'error_mode' => StreamErrorMode::Error, + 'error_store' => StreamErrorStore::Auto, + ] +]); + +@fopen('php://nonexistent', 'r', false, $context1); +$errors1 = stream_last_errors(); +echo "ERROR mode AUTO: " . (!empty($errors1) ? "has error" : "no error") . "\n"; + +// AUTO with EXCEPTION mode should store NON_TERM +$context2 = stream_context_create([ + 'stream' => [ + 'error_mode' => StreamErrorMode::Exception, + 'error_store' => StreamErrorStore::Auto, + ] +]); + +try { + fopen('php://nonexistent2', 'r', false, $context2); +} catch (StreamException $e) {} + +$errors2 = stream_last_errors(); +echo "EXCEPTION mode AUTO: " . (!empty($errors2) ? "has error" : "no error") . "\n"; + +// AUTO with SILENT mode should store ALL +$context3 = stream_context_create([ + 'stream' => [ + 'error_mode' => StreamErrorMode::Silent, + 'error_store' => StreamErrorStore::Auto, + ] +]); + +fopen('php://nonexistent3', 'r', false, $context3); +$errors3 = stream_last_errors(); +echo "SILENT mode AUTO: " . (!empty($errors3) ? "has error" : "no error") . "\n"; + +?> +--EXPECTF-- +ERROR mode AUTO: no error +EXCEPTION mode AUTO: %s +SILENT mode AUTO: has error diff --git a/ext/standard/tests/streams/stream_errors_set_default_context_error.phpt b/ext/standard/tests/streams/stream_errors_set_default_context_error.phpt new file mode 100644 index 000000000000..46fc0f7fd34b --- /dev/null +++ b/ext/standard/tests/streams/stream_errors_set_default_context_error.phpt @@ -0,0 +1,18 @@ +--TEST-- +Stream errors - prohibit setting error mode in default context +--FILE-- + [ + 'error_mode' => StreamErrorMode::Exception, + ] + ]); +} catch (\ValueError $e) { + echo $e->getMessage() . "\n"; +} + +?> +--EXPECT-- +Stream error handling options cannot be set on the default context diff --git a/ext/standard/tests/streams/stream_errors_silent_with_handler.phpt b/ext/standard/tests/streams/stream_errors_silent_with_handler.phpt new file mode 100644 index 000000000000..456575affc3a --- /dev/null +++ b/ext/standard/tests/streams/stream_errors_silent_with_handler.phpt @@ -0,0 +1,37 @@ +--TEST-- +Stream errors - custom error handler +--FILE-- + [ + 'error_mode' => StreamErrorMode::Silent, + 'error_handler' => function(array $errors) use (&$handler_called) { + $handler_called = true; + echo "Handler called\n"; + foreach ($errors as $error) { + echo "Wrapper: " . $error->wrapperName . "\n"; + echo "Code: " . $error->code->name . "\n"; + echo "Message: " . $error->message . "\n"; + echo "Param: " . ($error->param ?? 'null') . "\n"; + echo "Terminating: " . ($error->terminating ? 'yes' : 'no') . "\n"; + } + } + ] +]); + +$stream = fopen('php://nonexistent', 'r', false, $context); + +var_dump($handler_called); + +?> +--EXPECT-- +Handler called +Wrapper: PHP +Code: OpenFailed +Message: Failed to open stream: operation failed +Param: php://nonexistent +Terminating: yes +bool(true) diff --git a/ext/standard/tests/streams/stream_errors_silent_with_storage.phpt b/ext/standard/tests/streams/stream_errors_silent_with_storage.phpt new file mode 100644 index 000000000000..9e356216b0dd --- /dev/null +++ b/ext/standard/tests/streams/stream_errors_silent_with_storage.phpt @@ -0,0 +1,29 @@ +--TEST-- +Stream errors - silent mode with error storage +--FILE-- + [ + 'error_mode' => StreamErrorMode::Silent, + ] +]); + +$stream = fopen('php://nonexistent', 'r', false, $context); +var_dump($stream); + +$errors = stream_last_errors(); +foreach ($errors as $error) { + echo "Has error: yes\n"; + echo "Error code: " . $error->code->name . "\n"; + echo "Error wrapper: " . $error->wrapperName . "\n"; + echo "Error message: " . $error->message . "\n"; +} + +?> +--EXPECT-- +bool(false) +Has error: yes +Error code: OpenFailed +Error wrapper: PHP +Error message: Failed to open stream: operation failed diff --git a/ext/standard/tests/streams/stream_errors_silent_without_storage.phpt b/ext/standard/tests/streams/stream_errors_silent_without_storage.phpt new file mode 100644 index 000000000000..8155ce60bfee --- /dev/null +++ b/ext/standard/tests/streams/stream_errors_silent_without_storage.phpt @@ -0,0 +1,20 @@ +--TEST-- +Stream errors - error_store NONE option +--FILE-- + [ + 'error_mode' => StreamErrorMode::Silent, + 'error_store' => StreamErrorStore::None, + ] +]); + +$stream = fopen('php://nonexistent', 'r', false, $context); + +$errors = stream_last_errors(); +echo "Has error: " . (!empty($error) ? "yes" : "no") . "\n"; + +?> +--EXPECT-- +Has error: no diff --git a/ext/standard/tests/streams/stream_errors_standard_error.phpt b/ext/standard/tests/streams/stream_errors_standard_error.phpt new file mode 100644 index 000000000000..42de8cc3b17d --- /dev/null +++ b/ext/standard/tests/streams/stream_errors_standard_error.phpt @@ -0,0 +1,20 @@ +--TEST-- +Stream errors - error mode with standard error reporting +--FILE-- + [ + 'error_mode' => StreamErrorMode::Error, + ] +]); + +// This will trigger a warning +$stream = fopen('php://nonexistent', 'r', false, $context); + +var_dump($stream); + +?> +--EXPECTF-- +Warning: fopen(php://nonexistent): Failed to open stream: %s in %s on line %d +bool(false) diff --git a/ext/standard/tests/strings/explode.phpt b/ext/standard/tests/strings/explode.phpt index ea467a2d5504..248fade7605c 100644 --- a/ext/standard/tests/strings/explode.phpt +++ b/ext/standard/tests/strings/explode.phpt @@ -62,9 +62,9 @@ array ( 4 => 'd', ) d6bee42a771449205344c0938ad4f035 -explode(): Argument #1 ($separator) must not be empty -explode(): Argument #1 ($separator) must not be empty -explode(): Argument #1 ($separator) must not be empty +explode(): Argument #1 ($separator) must not be empty, use str_split() to split a string into characters +explode(): Argument #1 ($separator) must not be empty, use str_split() to split a string into characters +explode(): Argument #1 ($separator) must not be empty, use str_split() to split a string into characters array(1) { [0]=> string(0) "" @@ -79,7 +79,7 @@ array(1) { [0]=> string(0) "" } -explode(): Argument #1 ($separator) must not be empty +explode(): Argument #1 ($separator) must not be empty, use str_split() to split a string into characters array(1) { [0]=> string(3) "acb" diff --git a/ext/standard/tests/strings/explode1.phpt b/ext/standard/tests/strings/explode1.phpt index 876b159821cd..022654a57643 100644 --- a/ext/standard/tests/strings/explode1.phpt +++ b/ext/standard/tests/strings/explode1.phpt @@ -91,15 +91,15 @@ var_dump( explode("b", $obj) ); --EXPECT-- *** Testing explode() for basic operations *** -- Iteration 1 -- -explode(): Argument #1 ($separator) must not be empty -explode(): Argument #1 ($separator) must not be empty -explode(): Argument #1 ($separator) must not be empty -explode(): Argument #1 ($separator) must not be empty +explode(): Argument #1 ($separator) must not be empty, use str_split() to split a string into characters +explode(): Argument #1 ($separator) must not be empty, use str_split() to split a string into characters +explode(): Argument #1 ($separator) must not be empty, use str_split() to split a string into characters +explode(): Argument #1 ($separator) must not be empty, use str_split() to split a string into characters -- Iteration 2 -- -explode(): Argument #1 ($separator) must not be empty -explode(): Argument #1 ($separator) must not be empty -explode(): Argument #1 ($separator) must not be empty -explode(): Argument #1 ($separator) must not be empty +explode(): Argument #1 ($separator) must not be empty, use str_split() to split a string into characters +explode(): Argument #1 ($separator) must not be empty, use str_split() to split a string into characters +explode(): Argument #1 ($separator) must not be empty, use str_split() to split a string into characters +explode(): Argument #1 ($separator) must not be empty, use str_split() to split a string into characters -- Iteration 3 -- array(1) { [0]=> @@ -201,10 +201,10 @@ array(2) { string(56) "234NULL23abcd00000TRUEFALSE-11.234444true-11.24%PHP%ZEND" } -- Iteration 7 -- -explode(): Argument #1 ($separator) must not be empty -explode(): Argument #1 ($separator) must not be empty -explode(): Argument #1 ($separator) must not be empty -explode(): Argument #1 ($separator) must not be empty +explode(): Argument #1 ($separator) must not be empty, use str_split() to split a string into characters +explode(): Argument #1 ($separator) must not be empty, use str_split() to split a string into characters +explode(): Argument #1 ($separator) must not be empty, use str_split() to split a string into characters +explode(): Argument #1 ($separator) must not be empty, use str_split() to split a string into characters -- Iteration 8 -- array(2) { [0]=> diff --git a/ext/standard/tests/strings/parse_str_null_bytes.phpt b/ext/standard/tests/strings/parse_str_null_bytes.phpt new file mode 100644 index 000000000000..fd0d94bb0fc8 --- /dev/null +++ b/ext/standard/tests/strings/parse_str_null_bytes.phpt @@ -0,0 +1,14 @@ +--TEST-- +parse_str() rejects null bytes +--FILE-- +getMessage(), "\n"; +} + +?> +--EXPECT-- +parse_str(): Argument #1 ($string) must not contain any null bytes diff --git a/ext/standard/tests/strings/pathinfo.phpt b/ext/standard/tests/strings/pathinfo.phpt index 2bbea73588cb..1ff42a66121c 100644 --- a/ext/standard/tests/strings/pathinfo.phpt +++ b/ext/standard/tests/strings/pathinfo.phpt @@ -14,14 +14,48 @@ var_dump(pathinfo(__FILE__, PATHINFO_BASENAME)); var_dump(pathinfo(__FILE__, PATHINFO_FILENAME)); var_dump(pathinfo(__FILE__, PATHINFO_EXTENSION)); var_dump(pathinfo(__FILE__, PATHINFO_DIRNAME)); -var_dump(pathinfo(__FILE__, PATHINFO_EXTENSION|PATHINFO_FILENAME|PATHINFO_DIRNAME)); -var_dump(pathinfo(__FILE__, PATHINFO_EXTENSION|PATHINFO_FILENAME|PATHINFO_BASENAME)); -var_dump(pathinfo(__FILE__, PATHINFO_EXTENSION|PATHINFO_FILENAME)); -var_dump(pathinfo(__FILE__, PATHINFO_EXTENSION|PATHINFO_BASENAME)); -var_dump(pathinfo(__FILE__, PATHINFO_FILENAME|PATHINFO_DIRNAME)); -var_dump(pathinfo(__FILE__, PATHINFO_FILENAME|PATHINFO_BASENAME)); -var_dump(pathinfo(__FILE__, PATHINFO_DIRNAME|PATHINFO_EXTENSION)); -var_dump(pathinfo(__FILE__, PATHINFO_DIRNAME|PATHINFO_BASENAME)); + +try { + pathinfo(__FILE__, PATHINFO_EXTENSION|PATHINFO_FILENAME|PATHINFO_DIRNAME); +} catch (\ValueError $e) { + echo $e->getMessage(), PHP_EOL; +} +try { + pathinfo(__FILE__, PATHINFO_EXTENSION|PATHINFO_FILENAME); +} catch (\ValueError $e) { + echo $e->getMessage(), PHP_EOL; +} +try { + pathinfo(__FILE__, PATHINFO_EXTENSION|PATHINFO_DIRNAME); +} catch (\ValueError $e) { + echo $e->getMessage(), PHP_EOL; +} +try { + pathinfo(__FILE__, PATHINFO_FILENAME|PATHINFO_BASENAME); +} catch (\ValueError $e) { + echo $e->getMessage(), PHP_EOL; +} +try { + pathinfo(__FILE__, PATHINFO_DIRNAME|PATHINFO_EXTENSION); +} catch (\ValueError $e) { + echo $e->getMessage(), PHP_EOL; +} +try { + pathinfo(__FILE__, PATHINFO_DIRNAME|PATHINFO_BASENAME); +} catch (\ValueError $e) { + echo $e->getMessage(), PHP_EOL; +} + +try { + pathinfo(__FILE__, PATHINFO_DIRNAME-1); +} catch (\ValueError $e) { + echo $e->getMessage(), PHP_EOL; +} +try { + pathinfo(__FILE__, PATHINFO_ALL+1); +} catch (\ValueError $e) { + echo $e->getMessage(), PHP_EOL; +} echo "Done\n"; ?> @@ -94,12 +128,12 @@ string(12) "pathinfo.php" string(8) "pathinfo" string(3) "php" string(%d) "%s%estrings" -string(%d) "%s%estrings" -string(12) "pathinfo.php" -string(3) "php" -string(12) "pathinfo.php" -string(%d) "%s%estrings" -string(12) "pathinfo.php" -string(%d) "%s%estrings" -string(%d) "%s%estrings" +pathinfo(): Argument #2 ($flags) must be only one of the PATHINFO_* constants +pathinfo(): Argument #2 ($flags) must be only one of the PATHINFO_* constants +pathinfo(): Argument #2 ($flags) must be only one of the PATHINFO_* constants +pathinfo(): Argument #2 ($flags) must be only one of the PATHINFO_* constants +pathinfo(): Argument #2 ($flags) must be only one of the PATHINFO_* constants +pathinfo(): Argument #2 ($flags) must be only one of the PATHINFO_* constants +pathinfo(): Argument #2 ($flags) must be one of the PATHINFO_* constants +pathinfo(): Argument #2 ($flags) must be one of the PATHINFO_* constants Done diff --git a/ext/standard/tests/versioning/version_compare.phpt b/ext/standard/tests/versioning/version_compare.phpt index 07550dd410f4..e22ddabfa56b 100644 --- a/ext/standard/tests/versioning/version_compare.phpt +++ b/ext/standard/tests/versioning/version_compare.phpt @@ -22,6 +22,9 @@ foreach ($special_forms as $f1) { test("1.0$f1", "1.0$f2"); } } +test("1.2.", "1.2."); +test("1.2..", "1.2.."); + print "TESTING OPERATORS\n"; foreach ($special_forms as $f1) { foreach ($special_forms as $f2) { @@ -106,6 +109,8 @@ TESTING COMPARE 1.0pl1 > 1.0rc1 1.0pl1 > 1.0 1.0pl1 = 1.0pl1 +1.2. = 1.2. +1.2.. = 1.2.. TESTING OPERATORS 1.0-dev lt 1.0-dev : false 1.0-dev < 1.0-dev : false diff --git a/ext/standard/type.c b/ext/standard/type.c index 5bb7b3b803ee..fc681a3c50a7 100644 --- a/ext/standard/type.c +++ b/ext/standard/type.c @@ -1,14 +1,12 @@ /* +----------------------------------------------------------------------+ - | Copyright (c) The PHP Group | + | Copyright © The PHP Group and Contributors. | +----------------------------------------------------------------------+ - | This source file is subject to version 3.01 of the PHP license, | - | that is bundled with this package in the file LICENSE, and is | - | available through the world-wide-web at the following url: | - | https://www.php.net/license/3_01.txt | - | If you did not receive a copy of the PHP license and are unable to | - | obtain it through the world-wide-web, please send a note to | - | license@php.net so we can mail you a copy immediately. | + | This source file is subject to the Modified BSD License that is | + | bundled with this package in the file LICENSE, and is available | + | through the World Wide Web at . | + | | + | SPDX-License-Identifier: BSD-3-Clause | +----------------------------------------------------------------------+ | Author: Rasmus Lerdorf | +----------------------------------------------------------------------+ @@ -105,7 +103,7 @@ PHP_FUNCTION(settype) convert_to_long(ptr); } else if (zend_string_equals_ci(type, ZSTR_KNOWN(ZEND_STR_FLOAT))) { convert_to_double(ptr); - } else if (zend_string_equals_ci(type, ZSTR_KNOWN(ZEND_STR_DOUBLE))) { /* deprecated */ + } else if (zend_string_equals_ci(type, ZSTR_KNOWN(ZEND_STR_DOUBLE))) { convert_to_double(ptr); } else if (zend_string_equals_ci(type, ZSTR_KNOWN(ZEND_STR_STRING))) { convert_to_string(ptr); @@ -151,8 +149,7 @@ PHP_FUNCTION(intval) ZEND_PARSE_PARAMETERS_END(); if (Z_TYPE_P(num) != IS_STRING || base == 10) { - RETVAL_LONG(zval_get_long(num)); - return; + RETURN_LONG(zval_get_long(num)); } @@ -160,7 +157,7 @@ PHP_FUNCTION(intval) char *strval = Z_STRVAL_P(num); size_t strlen = Z_STRLEN_P(num); - while (isspace(*strval) && strlen) { + while (isspace((unsigned char)*strval) && strlen) { strval++; strlen--; } @@ -350,7 +347,6 @@ static zend_always_inline void _zend_is_numeric(zval *return_value, zval *arg) case IS_LONG: case IS_DOUBLE: RETURN_TRUE; - break; case IS_STRING: if (is_numeric_string(Z_STRVAL_P(arg), Z_STRLEN_P(arg), NULL, NULL, 0)) { @@ -362,7 +358,6 @@ static zend_always_inline void _zend_is_numeric(zval *return_value, zval *arg) default: RETURN_FALSE; - break; } } @@ -404,11 +399,9 @@ PHP_FUNCTION(is_scalar) case IS_LONG: case IS_STRING: RETURN_TRUE; - break; default: RETURN_FALSE; - break; } } /* }}} */ diff --git a/ext/standard/uniqid.c b/ext/standard/uniqid.c index c0b9555ccefd..267851cd73ac 100644 --- a/ext/standard/uniqid.c +++ b/ext/standard/uniqid.c @@ -1,14 +1,12 @@ /* +----------------------------------------------------------------------+ - | Copyright (c) The PHP Group | + | Copyright © The PHP Group and Contributors. | +----------------------------------------------------------------------+ - | This source file is subject to version 3.01 of the PHP license, | - | that is bundled with this package in the file LICENSE, and is | - | available through the world-wide-web at the following url: | - | https://www.php.net/license/3_01.txt | - | If you did not receive a copy of the PHP license and are unable to | - | obtain it through the world-wide-web, please send a note to | - | license@php.net so we can mail you a copy immediately. | + | This source file is subject to the Modified BSD License that is | + | bundled with this package in the file LICENSE, and is available | + | through the World Wide Web at . | + | | + | SPDX-License-Identifier: BSD-3-Clause | +----------------------------------------------------------------------+ | Author: Stig Sæther Bakken | +----------------------------------------------------------------------+ diff --git a/ext/standard/url.c b/ext/standard/url.c index 4ddf7f80c64f..ac303027a722 100644 --- a/ext/standard/url.c +++ b/ext/standard/url.c @@ -1,14 +1,12 @@ /* +----------------------------------------------------------------------+ - | Copyright (c) The PHP Group | + | Copyright © The PHP Group and Contributors. | +----------------------------------------------------------------------+ - | This source file is subject to version 3.01 of the PHP license, | - | that is bundled with this package in the file LICENSE, and is | - | available through the world-wide-web at the following url: | - | https://www.php.net/license/3_01.txt | - | If you did not receive a copy of the PHP license and are unable to | - | obtain it through the world-wide-web, please send a note to | - | license@php.net so we can mail you a copy immediately. | + | This source file is subject to the Modified BSD License that is | + | bundled with this package in the file LICENSE, and is available | + | through the World Wide Web at . | + | | + | SPDX-License-Identifier: BSD-3-Clause | +----------------------------------------------------------------------+ | Author: Jim Winstead | +----------------------------------------------------------------------+ @@ -103,7 +101,7 @@ PHPAPI php_url *php_url_parse_ex2(char const *str, size_t length, bool *has_port p = s; while (p < e) { /* scheme = 1*[ lowalpha | digit | "+" | "-" | "." ] */ - if (!isalpha(*p) && !isdigit(*p) && *p != '+' && *p != '.' && *p != '-') { + if (!isalpha((unsigned char)*p) && !isdigit((unsigned char)*p) && *p != '+' && *p != '.' && *p != '-') { if (e + 1 < ue && e < binary_strcspn(s, ue, "?#")) { goto parse_port; } else if (s + 1 < ue && *s == '/' && *(s + 1) == '/') { /* relative-scheme URL */ @@ -132,7 +130,7 @@ PHPAPI php_url *php_url_parse_ex2(char const *str, size_t length, bool *has_port * correctly parse things like a.com:80 */ p = e + 1; - while (p < ue && isdigit(*p)) { + while (p < ue && isdigit((unsigned char)*p)) { p++; } @@ -172,7 +170,7 @@ PHPAPI php_url *php_url_parse_ex2(char const *str, size_t length, bool *has_port p = e + 1; pp = p; - while (pp < ue && pp - p < 6 && isdigit(*pp)) { + while (pp < ue && pp - p < 6 && isdigit((unsigned char)*pp)) { pp++; } @@ -591,8 +589,8 @@ PHPAPI size_t php_url_decode_ex(char *dest, const char *src, size_t src_len) if (*data == '+') { *dest = ' '; } - else if (*data == '%' && src_len >= 2 && isxdigit((int) *(data + 1)) - && isxdigit((int) *(data + 2))) { + else if (*data == '%' && src_len >= 2 && isxdigit((unsigned char)data[1]) + && isxdigit((unsigned char)data[2])) { *dest = (char) php_htoi(data + 1); data += 2; src_len -= 2; @@ -664,8 +662,8 @@ PHPAPI size_t php_raw_url_decode_ex(char *dest, const char *src, size_t src_len) const char *data = src; while (src_len--) { - if (*data == '%' && src_len >= 2 && isxdigit((int) *(data + 1)) - && isxdigit((int) *(data + 2))) { + if (*data == '%' && src_len >= 2 && isxdigit((unsigned char)data[1]) + && isxdigit((unsigned char)data[2])) { *dest = (char) php_htoi(data + 1); data += 2; src_len -= 2; @@ -732,7 +730,7 @@ PHP_FUNCTION(get_headers) c = *p; *p = '\0'; s = p + 1; - while (isspace((int)*(unsigned char *)s)) { + while (isspace((unsigned char)*s)) { s++; } diff --git a/ext/standard/url.h b/ext/standard/url.h index 3885ecece578..f807ed67cf9b 100644 --- a/ext/standard/url.h +++ b/ext/standard/url.h @@ -1,14 +1,12 @@ /* +----------------------------------------------------------------------+ - | Copyright (c) The PHP Group | + | Copyright © The PHP Group and Contributors. | +----------------------------------------------------------------------+ - | This source file is subject to version 3.01 of the PHP license, | - | that is bundled with this package in the file LICENSE, and is | - | available through the world-wide-web at the following url: | - | https://www.php.net/license/3_01.txt | - | If you did not receive a copy of the PHP license and are unable to | - | obtain it through the world-wide-web, please send a note to | - | license@php.net so we can mail you a copy immediately. | + | This source file is subject to the Modified BSD License that is | + | bundled with this package in the file LICENSE, and is available | + | through the World Wide Web at . | + | | + | SPDX-License-Identifier: BSD-3-Clause | +----------------------------------------------------------------------+ | Author: Jim Winstead | +----------------------------------------------------------------------+ diff --git a/ext/standard/url_scanner_ex.h b/ext/standard/url_scanner_ex.h index e6b296324298..c39b71eebf8c 100644 --- a/ext/standard/url_scanner_ex.h +++ b/ext/standard/url_scanner_ex.h @@ -1,14 +1,12 @@ /* +----------------------------------------------------------------------+ - | Copyright (c) The PHP Group | + | Copyright © The PHP Group and Contributors. | +----------------------------------------------------------------------+ - | This source file is subject to version 3.01 of the PHP license, | - | that is bundled with this package in the file LICENSE, and is | - | available through the world-wide-web at the following url: | - | https://www.php.net/license/3_01.txt | - | If you did not receive a copy of the PHP license and are unable to | - | obtain it through the world-wide-web, please send a note to | - | license@php.net so we can mail you a copy immediately. | + | This source file is subject to the Modified BSD License that is | + | bundled with this package in the file LICENSE, and is available | + | through the World Wide Web at . | + | | + | SPDX-License-Identifier: BSD-3-Clause | +----------------------------------------------------------------------+ | Author: Sascha Schumann | +----------------------------------------------------------------------+ diff --git a/ext/standard/url_scanner_ex.re b/ext/standard/url_scanner_ex.re index 46254bf38085..506f2d08378e 100644 --- a/ext/standard/url_scanner_ex.re +++ b/ext/standard/url_scanner_ex.re @@ -1,14 +1,12 @@ /* +----------------------------------------------------------------------+ - | Copyright (c) The PHP Group | + | Copyright © The PHP Group and Contributors. | +----------------------------------------------------------------------+ - | This source file is subject to version 3.01 of the PHP license, | - | that is bundled with this package in the file LICENSE, and is | - | available through the world-wide-web at the following url: | - | https://www.php.net/license/3_01.txt | - | If you did not receive a copy of the PHP license and are unable to | - | obtain it through the world-wide-web, please send a note to | - | license@php.net so we can mail you a copy immediately. | + | This source file is subject to the Modified BSD License that is | + | bundled with this package in the file LICENSE, and is available | + | through the World Wide Web at . | + | | + | SPDX-License-Identifier: BSD-3-Clause | +----------------------------------------------------------------------+ | Author: Sascha Schumann | | Yasuo Ohgaki | @@ -85,7 +83,7 @@ static zend_result php_ini_on_update_tags(zend_ini_entry *entry, zend_string *ne *val++ = '\0'; for (q = key; *q; q++) { - *q = tolower(*q); + *q = tolower((unsigned char)*q); } keylen = q - key; str = zend_string_init(key, keylen, 1); @@ -137,7 +135,7 @@ static zend_result php_ini_on_update_hosts(zend_ini_entry *entry, zend_string *n char *q; for (q = key; *q; q++) { - *q = tolower(*q); + *q = tolower((unsigned char)*q); } keylen = q - key; if (keylen > 0) { @@ -245,32 +243,32 @@ static inline void append_modified_url(smart_str *url, smart_str *dest, smart_st } if (url_parts->scheme) { - smart_str_appends(dest, ZSTR_VAL(url_parts->scheme)); + smart_str_append(dest, url_parts->scheme); smart_str_appends(dest, "://"); } else if (*(ZSTR_VAL(url->s)) == '/' && *(ZSTR_VAL(url->s)+1) == '/') { smart_str_appends(dest, "//"); } if (url_parts->user) { - smart_str_appends(dest, ZSTR_VAL(url_parts->user)); + smart_str_append(dest, url_parts->user); if (url_parts->pass) { - smart_str_appends(dest, ZSTR_VAL(url_parts->pass)); + smart_str_append(dest, url_parts->pass); smart_str_appendc(dest, ':'); } smart_str_appendc(dest, '@'); } if (url_parts->host) { - smart_str_appends(dest, ZSTR_VAL(url_parts->host)); + smart_str_append(dest, url_parts->host); } if (url_parts->port) { smart_str_appendc(dest, ':'); smart_str_append_unsigned(dest, (long)url_parts->port); } if (url_parts->path) { - smart_str_appends(dest, ZSTR_VAL(url_parts->path)); + smart_str_append(dest, url_parts->path); } smart_str_appendc(dest, '?'); if (url_parts->query) { - smart_str_appends(dest, ZSTR_VAL(url_parts->query)); + smart_str_append(dest, url_parts->query); smart_str_append(dest, separator); smart_str_append_smart_str(dest, url_app); } else { @@ -278,7 +276,7 @@ static inline void append_modified_url(smart_str *url, smart_str *dest, smart_st } if (url_parts->fragment) { smart_str_appendc(dest, '#'); - smart_str_appends(dest, ZSTR_VAL(url_parts->fragment)); + smart_str_append(dest, url_parts->fragment); } php_url_free(url_parts); } @@ -463,7 +461,7 @@ static inline void handle_tag(STD_PARA) } smart_str_appendl(&ctx->tag, start, YYCURSOR - start); for (i = 0; i < ZSTR_LEN(ctx->tag.s); i++) - ZSTR_VAL(ctx->tag.s)[i] = tolower((int)(unsigned char)ZSTR_VAL(ctx->tag.s)[i]); + ZSTR_VAL(ctx->tag.s)[i] = tolower((unsigned char)ZSTR_VAL(ctx->tag.s)[i]); /* intentionally using str_find here, in case the hash value is set, but the string val is changed later */ if ((ctx->lookup_data = zend_hash_str_find_ptr(ctx->tags, ZSTR_VAL(ctx->tag.s), ZSTR_LEN(ctx->tag.s))) != NULL) { ok = 1; @@ -601,7 +599,7 @@ PHPAPI char *php_url_scanner_adapt_single_url(const char *url, size_t urllen, co if (encode) { encoded = php_raw_url_encode(name, strlen(name)); - smart_str_appendl(&url_app, ZSTR_VAL(encoded), ZSTR_LEN(encoded)); + smart_str_append(&url_app, encoded); zend_string_free(encoded); } else { smart_str_appends(&url_app, name); @@ -609,7 +607,7 @@ PHPAPI char *php_url_scanner_adapt_single_url(const char *url, size_t urllen, co smart_str_appendc(&url_app, '='); if (encode) { encoded = php_raw_url_encode(value, strlen(value)); - smart_str_appendl(&url_app, ZSTR_VAL(encoded), ZSTR_LEN(encoded)); + smart_str_append(&url_app, encoded); zend_string_free(encoded); } else { smart_str_appends(&url_app, value); @@ -663,7 +661,7 @@ static void php_url_scanner_ex_activate(bool is_session) ctx = &BG(url_adapt_output_ex); } - memset(ctx, 0, XtOffsetOf(url_adapt_state_ex_t, tags)); + memset(ctx, 0, offsetof(url_adapt_state_ex_t, tags)); } static void php_url_scanner_ex_deactivate(bool is_session) @@ -760,13 +758,13 @@ static inline void php_url_scanner_add_var_impl(const char *name, size_t name_le if (encode) { encoded = php_raw_url_encode(name, name_len); - smart_str_appendl(&sname, ZSTR_VAL(encoded), ZSTR_LEN(encoded)); zend_string_free(encoded); + smart_str_append(&sname, encoded); zend_string_free(encoded); encoded = php_raw_url_encode(value, value_len); - smart_str_appendl(&svalue, ZSTR_VAL(encoded), ZSTR_LEN(encoded)); zend_string_free(encoded); + smart_str_append(&svalue, encoded); zend_string_free(encoded); encoded = php_escape_html_entities_ex((const unsigned char *) name, name_len, 0, ENT_QUOTES|ENT_SUBSTITUTE, NULL, /* double_encode */ 0, /* quiet */ 1); - smart_str_appendl(&hname, ZSTR_VAL(encoded), ZSTR_LEN(encoded)); zend_string_free(encoded); + smart_str_append(&hname, encoded); zend_string_free(encoded); encoded = php_escape_html_entities_ex((const unsigned char *) value, value_len, 0, ENT_QUOTES|ENT_SUBSTITUTE, NULL, /* double_encode */ 0, /* quiet */ 1); - smart_str_appendl(&hvalue, ZSTR_VAL(encoded), ZSTR_LEN(encoded)); zend_string_free(encoded); + smart_str_append(&hvalue, encoded); zend_string_free(encoded); } else { smart_str_appendl(&sname, name, name_len); smart_str_appendl(&svalue, value, value_len); @@ -867,14 +865,14 @@ static inline zend_result php_url_scanner_reset_var_impl(zend_string *name, int if (encode) { encoded = php_raw_url_encode(ZSTR_VAL(name), ZSTR_LEN(name)); - smart_str_appendl(&sname, ZSTR_VAL(encoded), ZSTR_LEN(encoded)); + smart_str_append(&sname, encoded); zend_string_free(encoded); encoded = php_escape_html_entities_ex((const unsigned char *) ZSTR_VAL(name), ZSTR_LEN(name), 0, ENT_QUOTES|ENT_SUBSTITUTE, SG(default_charset), /* double_encode */ 0, /* quiet */ 1); - smart_str_appendl(&hname, ZSTR_VAL(encoded), ZSTR_LEN(encoded)); + smart_str_append(&hname, encoded); zend_string_free(encoded); } else { - smart_str_appendl(&sname, ZSTR_VAL(name), ZSTR_LEN(name)); - smart_str_appendl(&hname, ZSTR_VAL(name), ZSTR_LEN(name)); + smart_str_append(&sname, name); + smart_str_append(&hname, name); } smart_str_0(&sname); smart_str_0(&hname); diff --git a/ext/standard/user_filters.c b/ext/standard/user_filters.c index 610784e547e4..ae4132733bec 100644 --- a/ext/standard/user_filters.c +++ b/ext/standard/user_filters.c @@ -1,14 +1,12 @@ /* +----------------------------------------------------------------------+ - | Copyright (c) The PHP Group | + | Copyright © The PHP Group and Contributors. | +----------------------------------------------------------------------+ - | This source file is subject to version 3.01 of the PHP license, | - | that is bundled with this package in the file LICENSE, and is | - | available through the world-wide-web at the following url: | - | https://www.php.net/license/3_01.txt | - | If you did not receive a copy of the PHP license and are unable to | - | obtain it through the world-wide-web, please send a note to | - | license@php.net so we can mail you a copy immediately. | + | This source file is subject to the Modified BSD License that is | + | bundled with this package in the file LICENSE, and is available | + | through the World Wide Web at . | + | | + | SPDX-License-Identifier: BSD-3-Clause | +----------------------------------------------------------------------+ | Authors: | | Wez Furlong (wez@thebrainroom.com) | @@ -48,6 +46,17 @@ PHP_METHOD(php_user_filter, filter) RETURN_LONG(PSFS_ERR_FATAL); } +PHP_METHOD(php_user_filter, seek) +{ + zend_long offset, whence, chain; + + if (zend_parse_parameters(ZEND_NUM_ARGS(), "lll", &offset, &whence, &chain) == FAILURE) { + RETURN_THROWS(); + } + + RETURN_TRUE; +} + PHP_METHOD(php_user_filter, onCreate) { ZEND_PARSE_PARAMETERS_NONE(); @@ -123,6 +132,36 @@ static void userfilter_dtor(php_stream_filter *thisfilter) zval_ptr_dtor(obj); } +static zend_result userfilter_assign_stream(php_stream *stream, zval *obj, + zend_string **stream_name_p, uint32_t orig_no_fclose) +{ + /* Give the userfilter class a hook back to the stream */ + const zend_class_entry *old_scope = EG(fake_scope); + EG(fake_scope) = Z_OBJCE_P(obj); + + zend_string *stream_name = ZSTR_INIT_LITERAL("stream", false); + bool stream_property_exists = Z_OBJ_HT_P(obj)->has_property(Z_OBJ_P(obj), stream_name, ZEND_PROPERTY_EXISTS, NULL); + if (stream_property_exists) { + zval stream_zval; + php_stream_to_zval(stream, &stream_zval); + zend_update_property_ex(Z_OBJCE_P(obj), Z_OBJ_P(obj), stream_name, &stream_zval); + /* If property update threw an exception, skip filter execution */ + if (EG(exception)) { + EG(fake_scope) = old_scope; + zend_string_release(stream_name); + stream->flags &= ~PHP_STREAM_FLAG_NO_FCLOSE; + stream->flags |= orig_no_fclose; + return FAILURE; + } + *stream_name_p = stream_name; + } else { + zend_string_release(stream_name); + } + EG(fake_scope) = old_scope; + + return SUCCESS; +} + static php_stream_filter_status_t userfilter_filter( php_stream *stream, php_stream_filter *thisfilter, @@ -148,31 +187,14 @@ static php_stream_filter_status_t userfilter_filter( uint32_t orig_no_fclose = stream->flags & PHP_STREAM_FLAG_NO_FCLOSE; stream->flags |= PHP_STREAM_FLAG_NO_FCLOSE; - /* Give the userfilter class a hook back to the stream */ - const zend_class_entry *old_scope = EG(fake_scope); - EG(fake_scope) = Z_OBJCE_P(obj); - - zend_string *stream_name = ZSTR_INIT_LITERAL("stream", 0); - bool stream_property_exists = Z_OBJ_HT_P(obj)->has_property(Z_OBJ_P(obj), stream_name, ZEND_PROPERTY_EXISTS, NULL); - if (stream_property_exists) { - zval stream_zval; - php_stream_to_zval(stream, &stream_zval); - zend_update_property_ex(Z_OBJCE_P(obj), Z_OBJ_P(obj), stream_name, &stream_zval); - /* If property update threw an exception, skip filter execution */ - if (EG(exception)) { - EG(fake_scope) = old_scope; - if (buckets_in->head) { - php_error_docref(NULL, E_WARNING, "Unprocessed filter buckets remaining on input brigade"); - } - zend_string_release(stream_name); - stream->flags &= ~PHP_STREAM_FLAG_NO_FCLOSE; - stream->flags |= orig_no_fclose; - return PSFS_ERR_FATAL; + zend_string *stream_name = NULL; + if (userfilter_assign_stream(stream, obj, &stream_name, orig_no_fclose) == FAILURE) { + if (buckets_in->head) { + php_error_docref(NULL, E_WARNING, "Unprocessed filter buckets remaining on input brigade"); } + return PSFS_ERR_FATAL; } - EG(fake_scope) = old_scope; - ZVAL_STRINGL(&func_name, "filter", sizeof("filter")-1); /* Setup calling arguments */ @@ -217,12 +239,11 @@ static php_stream_filter_status_t userfilter_filter( * Since the property accepted a resource assignment above, it must have * no type hint or be typed as mixed, so we can safely assign null. */ - if (stream_property_exists) { + if (stream_name != NULL) { zend_update_property_null(Z_OBJCE_P(obj), Z_OBJ_P(obj), ZSTR_VAL(stream_name), ZSTR_LEN(stream_name)); + zend_string_release(stream_name); } - zend_string_release(stream_name); - zval_ptr_dtor(&args[3]); zval_ptr_dtor(&args[2]); zval_ptr_dtor(&args[1]); @@ -234,14 +255,74 @@ static php_stream_filter_status_t userfilter_filter( return ret; } +static zend_result userfilter_seek( + php_stream *stream, + php_stream_filter *thisfilter, + zend_off_t offset, + int whence + ) +{ + zval *obj = &thisfilter->abstract; + zval retval; + zval args[3]; + + /* the userfilter object probably doesn't exist anymore */ + if (CG(unclean_shutdown)) { + return FAILURE; + } + + /* Check if the seek method exists */ + zend_function *seek_method = zend_hash_str_find_ptr(&Z_OBJCE_P(obj)->function_table, ZEND_STRL("seek")); + if (seek_method == NULL) { + /* Method doesn't exist - consider this a successful seek for BC */ + return SUCCESS; + } + + /* Make sure the stream is not closed while the filter callback executes. */ + uint32_t orig_no_fclose = stream->flags & PHP_STREAM_FLAG_NO_FCLOSE; + stream->flags |= PHP_STREAM_FLAG_NO_FCLOSE; + + zend_string *stream_name = NULL; + if (userfilter_assign_stream(stream, obj, &stream_name, orig_no_fclose) == FAILURE) { + return FAILURE; + } + + /* Setup calling arguments */ + ZVAL_LONG(&args[0], offset); + ZVAL_LONG(&args[1], whence); + ZVAL_LONG(&args[2], php_stream_filter_get_chain_type(stream, thisfilter)); + + zend_call_known_function(seek_method, Z_OBJ_P(obj), Z_OBJCE_P(obj), &retval, 3, args, NULL); + + zend_result ret = FAILURE; + if (Z_TYPE(retval) != IS_UNDEF) { + ret = zend_is_true(&retval) ? SUCCESS : FAILURE; + zval_ptr_dtor(&retval); + } + + /* filter resources are cleaned up by the stream destructor, + * keeping a reference to the stream resource here would prevent it + * from being destroyed properly */ + if (stream_name != NULL) { + zend_update_property_null(Z_OBJCE_P(obj), Z_OBJ_P(obj), ZSTR_VAL(stream_name), ZSTR_LEN(stream_name)); + zend_string_release(stream_name); + } + + stream->flags &= ~PHP_STREAM_FLAG_NO_FCLOSE; + stream->flags |= orig_no_fclose; + + return ret; +} + static const php_stream_filter_ops userfilter_ops = { userfilter_filter, + userfilter_seek, userfilter_dtor, "user-filter" }; static php_stream_filter *user_filter_factory_create(const char *filtername, - zval *filterparams, uint8_t persistent) + zval *filterparams, bool persistent) { struct php_user_filter_data *fdat = NULL; php_stream_filter *filter; @@ -304,7 +385,8 @@ static php_stream_filter *user_filter_factory_create(const char *filtername, return NULL; } - filter = php_stream_filter_alloc(&userfilter_ops, NULL, 0); + filter = php_stream_filter_alloc(&userfilter_ops, NULL, false, + PSFS_SEEKABLE_CHECK, PSFS_SEEKABLE_CHECK); /* filtername */ add_property_string(&obj, "filtername", filtername); diff --git a/ext/standard/user_filters.stub.php b/ext/standard/user_filters.stub.php index acaa42bb33c8..8696845b78c8 100644 --- a/ext/standard/user_filters.stub.php +++ b/ext/standard/user_filters.stub.php @@ -49,6 +49,9 @@ class php_user_filter */ public function filter($in, $out, &$consumed, bool $closing): int {} + /** @tentative-return-type */ + public function seek(int $offset, int $whence, int $chain): bool {} + /** @tentative-return-type */ public function onCreate(): bool {} diff --git a/ext/standard/user_filters_arginfo.h b/ext/standard/user_filters_arginfo.h index 1d3c7bb53586..f5b8a7dfa472 100644 --- a/ext/standard/user_filters_arginfo.h +++ b/ext/standard/user_filters_arginfo.h @@ -1,5 +1,5 @@ /* This is a generated file, edit user_filters.stub.php instead. - * Stub hash: 33264435fe01a2cc9aa21a4a087dbbf3c4007206 */ + * Stub hash: 01be6d52377ecd1940c14e3d508df28a70456c58 */ ZEND_BEGIN_ARG_WITH_TENTATIVE_RETURN_TYPE_INFO_EX(arginfo_class_php_user_filter_filter, 0, 4, IS_LONG, 0) ZEND_ARG_INFO(0, in) @@ -8,6 +8,12 @@ ZEND_BEGIN_ARG_WITH_TENTATIVE_RETURN_TYPE_INFO_EX(arginfo_class_php_user_filter_ ZEND_ARG_TYPE_INFO(0, closing, _IS_BOOL, 0) ZEND_END_ARG_INFO() +ZEND_BEGIN_ARG_WITH_TENTATIVE_RETURN_TYPE_INFO_EX(arginfo_class_php_user_filter_seek, 0, 3, _IS_BOOL, 0) + ZEND_ARG_TYPE_INFO(0, offset, IS_LONG, 0) + ZEND_ARG_TYPE_INFO(0, whence, IS_LONG, 0) + ZEND_ARG_TYPE_INFO(0, chain, IS_LONG, 0) +ZEND_END_ARG_INFO() + ZEND_BEGIN_ARG_WITH_TENTATIVE_RETURN_TYPE_INFO_EX(arginfo_class_php_user_filter_onCreate, 0, 0, _IS_BOOL, 0) ZEND_END_ARG_INFO() @@ -15,11 +21,13 @@ ZEND_BEGIN_ARG_WITH_TENTATIVE_RETURN_TYPE_INFO_EX(arginfo_class_php_user_filter_ ZEND_END_ARG_INFO() ZEND_METHOD(php_user_filter, filter); +ZEND_METHOD(php_user_filter, seek); ZEND_METHOD(php_user_filter, onCreate); ZEND_METHOD(php_user_filter, onClose); static const zend_function_entry class_php_user_filter_methods[] = { ZEND_ME(php_user_filter, filter, arginfo_class_php_user_filter_filter, ZEND_ACC_PUBLIC) + ZEND_ME(php_user_filter, seek, arginfo_class_php_user_filter_seek, ZEND_ACC_PUBLIC) ZEND_ME(php_user_filter, onCreate, arginfo_class_php_user_filter_onCreate, ZEND_ACC_PUBLIC) ZEND_ME(php_user_filter, onClose, arginfo_class_php_user_filter_onClose, ZEND_ACC_PUBLIC) ZEND_FE_END diff --git a/ext/standard/uuencode.c b/ext/standard/uuencode.c index 0389fdd9f979..af70e3a2aa2c 100644 --- a/ext/standard/uuencode.c +++ b/ext/standard/uuencode.c @@ -1,14 +1,12 @@ /* +----------------------------------------------------------------------+ - | Copyright (c) The PHP Group | + | Copyright © The PHP Group and Contributors. | +----------------------------------------------------------------------+ - | This source file is subject to version 3.01 of the PHP license, | - | that is bundled with this package in the file LICENSE, and is | - | available through the world-wide-web at the following url: | - | https://www.php.net/license/3_01.txt | - | If you did not receive a copy of the PHP license and are unable to | - | obtain it through the world-wide-web, please send a note to | - | license@php.net so we can mail you a copy immediately. | + | This source file is subject to the Modified BSD License that is | + | bundled with this package in the file LICENSE, and is available | + | through the World Wide Web at . | + | | + | SPDX-License-Identifier: BSD-3-Clause | +----------------------------------------------------------------------+ | Author: Ilia Alshanetsky | +----------------------------------------------------------------------+ diff --git a/ext/standard/var.c b/ext/standard/var.c index 8d4c59263725..3137a270f661 100644 --- a/ext/standard/var.c +++ b/ext/standard/var.c @@ -1,14 +1,12 @@ /* +----------------------------------------------------------------------+ - | Copyright (c) The PHP Group | + | Copyright © The PHP Group and Contributors. | +----------------------------------------------------------------------+ - | This source file is subject to version 3.01 of the PHP license, | - | that is bundled with this package in the file LICENSE, and is | - | available through the world-wide-web at the following url: | - | https://www.php.net/license/3_01.txt | - | If you did not receive a copy of the PHP license and are unable to | - | obtain it through the world-wide-web, please send a note to | - | license@php.net so we can mail you a copy immediately. | + | This source file is subject to the Modified BSD License that is | + | bundled with this package in the file LICENSE, and is available | + | through the World Wide Web at . | + | | + | SPDX-License-Identifier: BSD-3-Clause | +----------------------------------------------------------------------+ | Authors: Jani Lehtimäki | | Thies C. Arntzen | @@ -168,7 +166,7 @@ PHPAPI void php_var_dump(zval *struc, int level) /* {{{ */ break; case IS_OBJECT: { zend_class_entry *ce = Z_OBJCE_P(struc); - if (ce->ce_flags & ZEND_ACC_ENUM) { + if ((ce->ce_flags & ZEND_ACC_ENUM) && ce->__debugInfo == NULL) { zval *case_name_zval = zend_enum_fetch_case_name(Z_OBJ_P(struc)); php_printf("%senum(%s::%s)\n", COMMON, ZSTR_VAL(ce->name), Z_STRVAL_P(case_name_zval)); return; @@ -182,11 +180,16 @@ PHPAPI void php_var_dump(zval *struc, int level) /* {{{ */ ZEND_GUARD_OR_GC_PROTECT_RECURSION(guard, DEBUG, zobj); myht = zend_get_properties_for(struc, ZEND_PROP_PURPOSE_DEBUG); - class_name = Z_OBJ_HANDLER_P(struc, get_class_name)(Z_OBJ_P(struc)); - const char *prefix = php_var_dump_object_prefix(Z_OBJ_P(struc)); + if (ce->ce_flags & ZEND_ACC_ENUM) { + zval *case_name_zval = zend_enum_fetch_case_name(Z_OBJ_P(struc)); + php_printf("%senum(%s::%s) (%d) {\n", COMMON, ZSTR_VAL(ce->name), Z_STRVAL_P(case_name_zval), myht ? zend_array_count(myht) : 0); + } else { + class_name = Z_OBJ_HANDLER_P(struc, get_class_name)(Z_OBJ_P(struc)); + const char *prefix = php_var_dump_object_prefix(Z_OBJ_P(struc)); - php_printf("%s%sobject(%s)#%d (%d) {\n", COMMON, prefix, ZSTR_VAL(class_name), Z_OBJ_HANDLE_P(struc), myht ? zend_array_count(myht) : 0); - zend_string_release_ex(class_name, 0); + php_printf("%s%sobject(%s)#%d (%d) {\n", COMMON, prefix, ZSTR_VAL(class_name), Z_OBJ_HANDLE_P(struc), myht ? zend_array_count(myht) : 0); + zend_string_release_ex(class_name, 0); + } if (myht) { zend_ulong num; @@ -228,7 +231,6 @@ PHPAPI void php_var_dump(zval *struc, int level) /* {{{ */ } struc = Z_REFVAL_P(struc); goto again; - break; default: php_printf("%sUNKNOWN:0\n", COMMON); break; @@ -674,7 +676,6 @@ PHPAPI zend_result php_var_export_ex(zval *struc, int level, smart_str *buf) /* case IS_REFERENCE: struc = Z_REFVAL_P(struc); goto again; - break; default: smart_str_appendl(buf, "NULL", 4); break; @@ -1244,7 +1245,7 @@ static void php_var_serialize_intern(smart_str *buf, zval *struc, php_serialize_ && Z_OBJ_HT_P(struc)->get_properties_for == NULL && Z_OBJ_HT_P(struc)->get_properties == zend_std_get_properties && !zend_object_is_lazy(Z_OBJ_P(struc))) { - /* Optimized version without rebulding properties HashTable */ + /* Optimized version without rebuilding properties HashTable */ zend_object *obj = Z_OBJ_P(struc); zend_class_entry *ce = obj->ce; zend_property_info *prop_info; diff --git a/ext/standard/var_unserializer.re b/ext/standard/var_unserializer.re index 353c7086d430..484cb5aa8fc9 100644 --- a/ext/standard/var_unserializer.re +++ b/ext/standard/var_unserializer.re @@ -1,14 +1,12 @@ /* +----------------------------------------------------------------------+ - | Copyright (c) The PHP Group | + | Copyright © The PHP Group and Contributors. | +----------------------------------------------------------------------+ - | This source file is subject to version 3.01 of the PHP license, | - | that is bundled with this package in the file LICENSE, and is | - | available through the world-wide-web at the following url: | - | https://www.php.net/license/3_01.txt | - | If you did not receive a copy of the PHP license and are unable to | - | obtain it through the world-wide-web, please send a note to | - | license@php.net so we can mail you a copy immediately. | + | This source file is subject to the Modified BSD License that is | + | bundled with this package in the file LICENSE, and is available | + | through the World Wide Web at . | + | | + | SPDX-License-Identifier: BSD-3-Clause | +----------------------------------------------------------------------+ | Author: Sascha Schumann | +----------------------------------------------------------------------+ @@ -772,7 +770,7 @@ static inline int object_custom(UNSERIALIZE_PARAMETER, zend_class_entry *ce) if (ce->unserialize == NULL) { zend_error(E_WARNING, "Class %s has no unserializer", ZSTR_VAL(ce->name)); - object_init_ex(rval, ce); + return 0; } else if (ce->unserialize(rval, ce, (const unsigned char*)*p, datalen, (zend_unserialize_data *)var_hash) != SUCCESS) { return 0; } diff --git a/ext/standard/versioning.c b/ext/standard/versioning.c index 6995569fbf87..dc7ca71af469 100644 --- a/ext/standard/versioning.c +++ b/ext/standard/versioning.c @@ -1,14 +1,12 @@ /* +----------------------------------------------------------------------+ - | Copyright (c) The PHP Group | + | Copyright © The PHP Group and Contributors. | +----------------------------------------------------------------------+ - | This source file is subject to version 3.01 of the PHP license, | - | that is bundled with this package in the file LICENSE, and is | - | available through the world-wide-web at the following url: | - | https://www.php.net/license/3_01.txt | - | If you did not receive a copy of the PHP license and are unable to | - | obtain it through the world-wide-web, please send a note to | - | license@php.net so we can mail you a copy immediately. | + | This source file is subject to the Modified BSD License that is | + | bundled with this package in the file LICENSE, and is available | + | through the World Wide Web at . | + | | + | SPDX-License-Identifier: BSD-3-Clause | +----------------------------------------------------------------------+ | Author: Stig Sæther Bakken | +----------------------------------------------------------------------+ @@ -45,8 +43,8 @@ php_canonicalize_version(const char *version) * s/([^\d\.])([^\D\.])/$1.$2/g; * s/([^\D\.])([^\d\.])/$1.$2/g; */ -#define isdig(x) (isdigit(x)&&(x)!='.') -#define isndig(x) (!isdigit(x)&&(x)!='.') +#define isdig(x) (isdigit((unsigned char)(x))&&(x)!='.') +#define isndig(x) (!isdigit((unsigned char)(x))&&(x)!='.') #define isspecialver(x) ((x)=='-'||(x)=='_'||(x)=='+') lq = *(q - 1); @@ -59,7 +57,7 @@ php_canonicalize_version(const char *version) *q++ = '.'; } *q++ = *p; - } else if (!isalnum(*p)) { + } else if (!isalnum((unsigned char)*p)) { if (lq != '.') { *q++ = '.'; } @@ -68,7 +66,15 @@ php_canonicalize_version(const char *version) } lp = *p++; } - *q++ = '\0'; + + /* Check if the last component is empty (i.e. the last character is a dot) + * and remove it if it is. */ + if (*(q - 1) == '.') { + *(q - 1) = '\0'; + } else { + *q = '\0'; + } + return buf; } @@ -152,17 +158,17 @@ php_version_compare(const char *orig_ver1, const char *orig_ver2) if ((n2 = strchr(p2, '.')) != NULL) { *n2 = '\0'; } - if (isdigit(*p1) && isdigit(*p2)) { + if (isdigit((unsigned char)*p1) && isdigit((unsigned char)*p2)) { /* compare element numerically */ l1 = strtol(p1, NULL, 10); l2 = strtol(p2, NULL, 10); compare = ZEND_NORMALIZE_BOOL(l1 - l2); - } else if (!isdigit(*p1) && !isdigit(*p2)) { + } else if (!isdigit((unsigned char)*p1) && !isdigit((unsigned char)*p2)) { /* compare element names */ compare = compare_special_version_forms(p1, p2); } else { /* mix of names and numbers */ - if (isdigit(*p1)) { + if (isdigit((unsigned char)*p1)) { compare = compare_special_version_forms("#N#", p2); } else { compare = compare_special_version_forms(p1, "#N#"); @@ -180,13 +186,13 @@ php_version_compare(const char *orig_ver1, const char *orig_ver2) } if (compare == 0) { if (n1 != NULL) { - if (isdigit(*p1)) { + if (isdigit((unsigned char)*p1)) { compare = 1; } else { compare = php_version_compare(p1, "#N#"); } } else if (n2 != NULL) { - if (isdigit(*p2)) { + if (isdigit((unsigned char)*p2)) { compare = -1; } else { compare = php_version_compare("#N#", p2); diff --git a/ext/sysvmsg/php_sysvmsg.h b/ext/sysvmsg/php_sysvmsg.h index e3be3ed32e31..c82cb09934da 100644 --- a/ext/sysvmsg/php_sysvmsg.h +++ b/ext/sysvmsg/php_sysvmsg.h @@ -1,14 +1,12 @@ /* +----------------------------------------------------------------------+ - | Copyright (c) The PHP Group | + | Copyright © The PHP Group and Contributors. | +----------------------------------------------------------------------+ - | This source file is subject to version 3.01 of the PHP license, | - | that is bundled with this package in the file LICENSE, and is | - | available through the world-wide-web at the following url: | - | https://www.php.net/license/3_01.txt | - | If you did not receive a copy of the PHP license and are unable to | - | obtain it through the world-wide-web, please send a note to | - | license@php.net so we can mail you a copy immediately. | + | This source file is subject to the Modified BSD License that is | + | bundled with this package in the file LICENSE, and is available | + | through the World Wide Web at . | + | | + | SPDX-License-Identifier: BSD-3-Clause | +----------------------------------------------------------------------+ | Author: Wez Furlong | +----------------------------------------------------------------------+ diff --git a/ext/sysvmsg/sysvmsg.c b/ext/sysvmsg/sysvmsg.c index 65d29d12c0f9..0c2b3dcf183b 100644 --- a/ext/sysvmsg/sysvmsg.c +++ b/ext/sysvmsg/sysvmsg.c @@ -1,14 +1,12 @@ /* +----------------------------------------------------------------------+ - | Copyright (c) The PHP Group | + | Copyright © The PHP Group and Contributors. | +----------------------------------------------------------------------+ - | This source file is subject to version 3.01 of the PHP license, | - | that is bundled with this package in the file LICENSE, and is | - | available through the world-wide-web at the following url: | - | https://www.php.net/license/3_01.txt | - | If you did not receive a copy of the PHP license and are unable to | - | obtain it through the world-wide-web, please send a note to | - | license@php.net so we can mail you a copy immediately. | + | This source file is subject to the Modified BSD License that is | + | bundled with this package in the file LICENSE, and is available | + | through the World Wide Web at . | + | | + | SPDX-License-Identifier: BSD-3-Clause | +----------------------------------------------------------------------+ | Author: Wez Furlong | +----------------------------------------------------------------------+ @@ -67,9 +65,7 @@ ZEND_GET_MODULE(sysvmsg) zend_class_entry *sysvmsg_queue_ce; static zend_object_handlers sysvmsg_queue_object_handlers; -static inline sysvmsg_queue_t *sysvmsg_queue_from_obj(zend_object *obj) { - return (sysvmsg_queue_t *)((char *)(obj) - XtOffsetOf(sysvmsg_queue_t, std)); -} +#define sysvmsg_queue_from_obj(obj) ZEND_CONTAINER_OF(obj, sysvmsg_queue_t, std) #define Z_SYSVMSG_QUEUE_P(zv) sysvmsg_queue_from_obj(Z_OBJ_P(zv)) @@ -103,7 +99,7 @@ PHP_MINIT_FUNCTION(sysvmsg) sysvmsg_queue_ce->default_object_handlers = &sysvmsg_queue_object_handlers; memcpy(&sysvmsg_queue_object_handlers, &std_object_handlers, sizeof(zend_object_handlers)); - sysvmsg_queue_object_handlers.offset = XtOffsetOf(sysvmsg_queue_t, std); + sysvmsg_queue_object_handlers.offset = offsetof(sysvmsg_queue_t, std); sysvmsg_queue_object_handlers.free_obj = sysvmsg_queue_free_obj; sysvmsg_queue_object_handlers.get_constructor = sysvmsg_queue_get_constructor; sysvmsg_queue_object_handlers.clone_obj = NULL; diff --git a/ext/sysvsem/php_sysvsem.h b/ext/sysvsem/php_sysvsem.h index 05d420bf42a4..c40d6dde5f1c 100644 --- a/ext/sysvsem/php_sysvsem.h +++ b/ext/sysvsem/php_sysvsem.h @@ -1,14 +1,12 @@ /* +----------------------------------------------------------------------+ - | Copyright (c) The PHP Group | + | Copyright © The PHP Group and Contributors. | +----------------------------------------------------------------------+ - | This source file is subject to version 3.01 of the PHP license, | - | that is bundled with this package in the file LICENSE, and is | - | available through the world-wide-web at the following url: | - | https://www.php.net/license/3_01.txt | - | If you did not receive a copy of the PHP license and are unable to | - | obtain it through the world-wide-web, please send a note to | - | license@php.net so we can mail you a copy immediately. | + | This source file is subject to the Modified BSD License that is | + | bundled with this package in the file LICENSE, and is available | + | through the World Wide Web at . | + | | + | SPDX-License-Identifier: BSD-3-Clause | +----------------------------------------------------------------------+ | Author: Tom May | +----------------------------------------------------------------------+ diff --git a/ext/sysvsem/sysvsem.c b/ext/sysvsem/sysvsem.c index ce624ab4b237..e506bd5bb37c 100644 --- a/ext/sysvsem/sysvsem.c +++ b/ext/sysvsem/sysvsem.c @@ -1,14 +1,12 @@ /* +----------------------------------------------------------------------+ - | Copyright (c) The PHP Group | + | Copyright © The PHP Group and Contributors. | +----------------------------------------------------------------------+ - | This source file is subject to version 3.01 of the PHP license, | - | that is bundled with this package in the file LICENSE, and is | - | available through the world-wide-web at the following url: | - | https://www.php.net/license/3_01.txt | - | If you did not receive a copy of the PHP license and are unable to | - | obtain it through the world-wide-web, please send a note to | - | license@php.net so we can mail you a copy immediately. | + | This source file is subject to the Modified BSD License that is | + | bundled with this package in the file LICENSE, and is available | + | through the World Wide Web at . | + | | + | SPDX-License-Identifier: BSD-3-Clause | +----------------------------------------------------------------------+ | Authors: Tom May | | Gavin Sherry | @@ -84,9 +82,7 @@ ZEND_GET_MODULE(sysvsem) zend_class_entry *sysvsem_ce; static zend_object_handlers sysvsem_object_handlers; -static inline sysvsem_sem *sysvsem_from_obj(zend_object *obj) { - return (sysvsem_sem *)((char *)(obj) - XtOffsetOf(sysvsem_sem, std)); -} +#define sysvsem_from_obj(obj) ZEND_CONTAINER_OF(obj, sysvsem_sem, std) #define Z_SYSVSEM_P(zv) sysvsem_from_obj(Z_OBJ_P(zv)) @@ -149,7 +145,7 @@ PHP_MINIT_FUNCTION(sysvsem) sysvsem_ce->default_object_handlers = &sysvsem_object_handlers; memcpy(&sysvsem_object_handlers, &std_object_handlers, sizeof(zend_object_handlers)); - sysvsem_object_handlers.offset = XtOffsetOf(sysvsem_sem, std); + sysvsem_object_handlers.offset = offsetof(sysvsem_sem, std); sysvsem_object_handlers.free_obj = sysvsem_free_obj; sysvsem_object_handlers.get_constructor = sysvsem_get_constructor; sysvsem_object_handlers.clone_obj = NULL; diff --git a/ext/sysvshm/php_sysvshm.h b/ext/sysvshm/php_sysvshm.h index 9576349e06d8..b47a70c4e5e1 100644 --- a/ext/sysvshm/php_sysvshm.h +++ b/ext/sysvshm/php_sysvshm.h @@ -1,14 +1,12 @@ /* +----------------------------------------------------------------------+ - | Copyright (c) The PHP Group | + | Copyright © The PHP Group and Contributors. | +----------------------------------------------------------------------+ - | This source file is subject to version 3.01 of the PHP license, | - | that is bundled with this package in the file LICENSE, and is | - | available through the world-wide-web at the following url: | - | https://www.php.net/license/3_01.txt | - | If you did not receive a copy of the PHP license and are unable to | - | obtain it through the world-wide-web, please send a note to | - | license@php.net so we can mail you a copy immediately. | + | This source file is subject to the Modified BSD License that is | + | bundled with this package in the file LICENSE, and is available | + | through the World Wide Web at . | + | | + | SPDX-License-Identifier: BSD-3-Clause | +----------------------------------------------------------------------+ | Author: Christian Cartus | +----------------------------------------------------------------------+ diff --git a/ext/sysvshm/sysvshm.c b/ext/sysvshm/sysvshm.c index 7f064c50a294..59ca49a974e6 100644 --- a/ext/sysvshm/sysvshm.c +++ b/ext/sysvshm/sysvshm.c @@ -1,14 +1,12 @@ /* +----------------------------------------------------------------------+ - | Copyright (c) The PHP Group | + | Copyright © The PHP Group and Contributors. | +----------------------------------------------------------------------+ - | This source file is subject to version 3.01 of the PHP license, | - | that is bundled with this package in the file LICENSE, and is | - | available through the world-wide-web at the following url: | - | https://www.php.net/license/3_01.txt | - | If you did not receive a copy of the PHP license and are unable to | - | obtain it through the world-wide-web, please send a note to | - | license@php.net so we can mail you a copy immediately. | + | This source file is subject to the Modified BSD License that is | + | bundled with this package in the file LICENSE, and is available | + | through the World Wide Web at . | + | | + | SPDX-License-Identifier: BSD-3-Clause | +----------------------------------------------------------------------+ | Author: Christian Cartus | +----------------------------------------------------------------------+ @@ -35,9 +33,7 @@ zend_class_entry *sysvshm_ce; static zend_object_handlers sysvshm_object_handlers; -static inline sysvshm_shm *sysvshm_from_obj(zend_object *obj) { - return (sysvshm_shm *)((char *)(obj) - XtOffsetOf(sysvshm_shm, std)); -} +#define sysvshm_from_obj(obj) ZEND_CONTAINER_OF(obj, sysvshm_shm, std) #define Z_SYSVSHM_P(zv) sysvshm_from_obj(Z_OBJ_P(zv)) @@ -102,7 +98,7 @@ PHP_MINIT_FUNCTION(sysvshm) sysvshm_ce->default_object_handlers = &sysvshm_object_handlers; memcpy(&sysvshm_object_handlers, &std_object_handlers, sizeof(zend_object_handlers)); - sysvshm_object_handlers.offset = XtOffsetOf(sysvshm_shm, std); + sysvshm_object_handlers.offset = offsetof(sysvshm_shm, std); sysvshm_object_handlers.free_obj = sysvshm_free_obj; sysvshm_object_handlers.get_constructor = sysvshm_get_constructor; sysvshm_object_handlers.clone_obj = NULL; diff --git a/ext/tidy/php_tidy.h b/ext/tidy/php_tidy.h index 2c31a92a8370..9449580a7ace 100644 --- a/ext/tidy/php_tidy.h +++ b/ext/tidy/php_tidy.h @@ -1,14 +1,12 @@ /* +----------------------------------------------------------------------+ - | Copyright (c) The PHP Group | + | Copyright © The PHP Group and Contributors. | +----------------------------------------------------------------------+ - | This source file is subject to version 3.01 of the PHP license, | - | that is bundled with this package in the file LICENSE, and is | - | available through the world-wide-web at the following url: | - | https://www.php.net/license/3_01.txt | - | If you did not receive a copy of the PHP license and are unable to | - | obtain it through the world-wide-web, please send a note to | - | license@php.net so we can mail you a copy immediately. | + | This source file is subject to the Modified BSD License that is | + | bundled with this package in the file LICENSE, and is available | + | through the World Wide Web at . | + | | + | SPDX-License-Identifier: BSD-3-Clause | +----------------------------------------------------------------------+ | Author: John Coggeshall | +----------------------------------------------------------------------+ diff --git a/ext/tidy/tidy.c b/ext/tidy/tidy.c index 9dcfb733a591..98e1c05a720f 100644 --- a/ext/tidy/tidy.c +++ b/ext/tidy/tidy.c @@ -1,14 +1,12 @@ /* +----------------------------------------------------------------------+ - | Copyright (c) The PHP Group | + | Copyright © The PHP Group and Contributors. | +----------------------------------------------------------------------+ - | This source file is subject to version 3.01 of the PHP license, | - | that is bundled with this package in the file LICENSE, and is | - | available through the world-wide-web at the following url: | - | https://www.php.net/license/3_01.txt | - | If you did not receive a copy of the PHP license and are unable to | - | obtain it through the world-wide-web, please send a note to | - | license@php.net so we can mail you a copy immediately. | + | This source file is subject to the Modified BSD License that is | + | bundled with this package in the file LICENSE, and is available | + | through the World Wide Web at . | + | | + | SPDX-License-Identifier: BSD-3-Clause | +----------------------------------------------------------------------+ | Author: John Coggeshall | +----------------------------------------------------------------------+ @@ -106,9 +104,7 @@ struct _PHPTidyObj { zend_object std; }; -static inline PHPTidyObj *php_tidy_fetch_object(zend_object *obj) { - return (PHPTidyObj *)((char*)(obj) - XtOffsetOf(PHPTidyObj, std)); -} +#define php_tidy_fetch_object(obj) ZEND_CONTAINER_OF(obj, PHPTidyObj, std) #define Z_TIDY_P(zv) php_tidy_fetch_object(Z_OBJ_P((zv))) /* }}} */ @@ -705,7 +701,7 @@ static void php_tidy_create_node(INTERNAL_FUNCTION_PARAMETERS, tidy_base_nodetyp node = tidyGetBody(obj->ptdoc->doc); break; - EMPTY_SWITCH_DEFAULT_CASE() + default: ZEND_UNREACHABLE(); } if (!node) { @@ -850,7 +846,7 @@ static PHP_MINIT_FUNCTION(tidy) tidy_object_handlers_doc.cast_object = tidy_doc_cast_handler; tidy_object_handlers_node.cast_object = tidy_node_cast_handler; - tidy_object_handlers_node.offset = tidy_object_handlers_doc.offset = XtOffsetOf(PHPTidyObj, std); + tidy_object_handlers_node.offset = tidy_object_handlers_doc.offset = offsetof(PHPTidyObj, std); tidy_object_handlers_node.free_obj = tidy_object_handlers_doc.free_obj = tidy_object_free_storage; register_tidy_symbols(module_number); @@ -873,7 +869,7 @@ static PHP_RINIT_FUNCTION(tidy) static PHP_RSHUTDOWN_FUNCTION(tidy) { - TG(clean_output) = INI_ORIG_BOOL("tidy.clean_output"); + TG(clean_output) = zend_ini_parse_bool(zend_ini_str(ZEND_STRL("tidy.clean_output"), /* orig */ true)); return SUCCESS; } diff --git a/ext/tokenizer/php_tokenizer.h b/ext/tokenizer/php_tokenizer.h index edc715de8d71..3acdebc4ac66 100644 --- a/ext/tokenizer/php_tokenizer.h +++ b/ext/tokenizer/php_tokenizer.h @@ -1,14 +1,12 @@ /* +----------------------------------------------------------------------+ - | Copyright (c) The PHP Group | + | Copyright © The PHP Group and Contributors. | +----------------------------------------------------------------------+ - | This source file is subject to version 3.01 of the PHP license, | - | that is bundled with this package in the file LICENSE, and is | - | available through the world-wide-web at the following url: | - | https://www.php.net/license/3_01.txt | - | If you did not receive a copy of the PHP license and are unable to | - | obtain it through the world-wide-web, please send a note to | - | license@php.net so we can mail you a copy immediately. | + | This source file is subject to the Modified BSD License that is | + | bundled with this package in the file LICENSE, and is available | + | through the World Wide Web at . | + | | + | SPDX-License-Identifier: BSD-3-Clause | +----------------------------------------------------------------------+ | Author: Andrei Zmievski | +----------------------------------------------------------------------+ diff --git a/ext/tokenizer/tokenizer.c b/ext/tokenizer/tokenizer.c index e594bc62ab38..fdbdd5ddfb61 100644 --- a/ext/tokenizer/tokenizer.c +++ b/ext/tokenizer/tokenizer.c @@ -1,14 +1,12 @@ /* +----------------------------------------------------------------------+ - | Copyright (c) The PHP Group | + | Copyright © The PHP Group and Contributors. | +----------------------------------------------------------------------+ - | This source file is subject to version 3.01 of the PHP license, | - | that is bundled with this package in the file LICENSE, and is | - | available through the world-wide-web at the following url: | - | https://www.php.net/license/3_01.txt | - | If you did not receive a copy of the PHP license and are unable to | - | obtain it through the world-wide-web, please send a note to | - | license@php.net so we can mail you a copy immediately. | + | This source file is subject to the Modified BSD License that is | + | bundled with this package in the file LICENSE, and is available | + | through the World Wide Web at . | + | | + | SPDX-License-Identifier: BSD-3-Clause | +----------------------------------------------------------------------+ | Author: Andrei Zmievski | +----------------------------------------------------------------------+ diff --git a/ext/tokenizer/tokenizer_data.c b/ext/tokenizer/tokenizer_data.c index 0900c51d3d95..87b15b8bb345 100644 --- a/ext/tokenizer/tokenizer_data.c +++ b/ext/tokenizer/tokenizer_data.c @@ -1,14 +1,12 @@ /* +----------------------------------------------------------------------+ - | Copyright (c) The PHP Group | + | Copyright © The PHP Group and Contributors. | +----------------------------------------------------------------------+ - | This source file is subject to version 3.01 of the PHP license, | - | that is bundled with this package in the file LICENSE, and is | - | available through the world-wide-web at the following url: | - | https://www.php.net/license/3_01.txt | - | If you did not receive a copy of the PHP license and are unable to | - | obtain it through the world-wide-web, please send a note to | - | license@php.net so we can mail you a copy immediately. | + | This source file is subject to the Modified BSD License that is | + | bundled with this package in the file LICENSE, and is available | + | through the World Wide Web at . | + | | + | SPDX-License-Identifier: BSD-3-Clause | +----------------------------------------------------------------------+ | Author: Johannes Schlueter | +----------------------------------------------------------------------+ diff --git a/ext/tokenizer/tokenizer_data_gen.php b/ext/tokenizer/tokenizer_data_gen.php index 79753b6e81a5..0119b0cc0237 100755 --- a/ext/tokenizer/tokenizer_data_gen.php +++ b/ext/tokenizer/tokenizer_data_gen.php @@ -39,15 +39,13 @@ $result = <<. | + | | + | SPDX-License-Identifier: BSD-3-Clause | +----------------------------------------------------------------------+ | Author: Johannes Schlueter | +----------------------------------------------------------------------+ diff --git a/ext/uri/CREDITS b/ext/uri/CREDITS index fc6ce83fec88..0bbea2af21d2 100644 --- a/ext/uri/CREDITS +++ b/ext/uri/CREDITS @@ -1,2 +1,2 @@ uri -Máté Kocsis, Tim Düsterhus, Ignace Nyamagana Butera, Arnaud Le Blanc, Dennis Snell, Niels Dossche, Nicolas Grekas +Máté Kocsis, Tim Düsterhus, Ignace Nyamagana Butera, Arnaud Le Blanc, Dennis Snell, Nora Dossche, Nicolas Grekas diff --git a/ext/uri/config.w32 b/ext/uri/config.w32 index b7c4bfbd2246..2bed937a7377 100644 --- a/ext/uri/config.w32 +++ b/ext/uri/config.w32 @@ -2,7 +2,7 @@ EXTENSION("uri", "php_uri.c php_uri_common.c uri_parser_rfc3986.c uri_parser_wha AC_DEFINE("URI_ENABLE_ANSI", 1, "Define to 1 for enabling ANSI support of uriparser.") AC_DEFINE("URI_NO_UNICODE", 1, "Define to 1 for disabling unicode support of uriparser.") -ADD_FLAG("CFLAGS_URI", "/D URI_STATIC_BUILD"); +ADD_FLAG("CFLAGS_URI", "/D URI_STATIC_BUILD /D LEXBOR_STATIC"); ADD_EXTENSION_DEP('uri', 'lexbor'); ADD_SOURCES("ext/uri/uriparser/src", "UriCommon.c UriCompare.c UriCopy.c UriEscape.c UriFile.c UriIp4.c UriIp4Base.c \ diff --git a/ext/uri/php_uri.c b/ext/uri/php_uri.c index 2adece125530..58f34a370151 100644 --- a/ext/uri/php_uri.c +++ b/ext/uri/php_uri.c @@ -1,14 +1,12 @@ /* +----------------------------------------------------------------------+ - | Copyright (c) The PHP Group | + | Copyright © The PHP Group and Contributors. | +----------------------------------------------------------------------+ - | This source file is subject to version 3.01 of the PHP license, | - | that is bundled with this package in the file LICENSE, and is | - | available through the world-wide-web at the following url: | - | https://www.php.net/license/3_01.txt | - | If you did not receive a copy of the PHP license and are unable to | - | obtain it through the world-wide-web, please send a note to | - | license@php.net so we can mail you a copy immediately. | + | This source file is subject to the Modified BSD License that is | + | bundled with this package in the file LICENSE, and is available | + | through the World Wide Web at . | + | | + | SPDX-License-Identifier: BSD-3-Clause | +----------------------------------------------------------------------+ | Authors: Máté Kocsis | +----------------------------------------------------------------------+ @@ -33,11 +31,14 @@ #include "uriparser/Uri.h" zend_class_entry *php_uri_ce_rfc3986_uri; +zend_class_entry *php_uri_ce_rfc3986_uri_type; +zend_class_entry *php_uri_ce_rfc3986_uri_host_type; zend_class_entry *php_uri_ce_whatwg_url; zend_class_entry *php_uri_ce_comparison_mode; zend_class_entry *php_uri_ce_exception; zend_class_entry *php_uri_ce_error; zend_class_entry *php_uri_ce_invalid_uri_exception; +zend_class_entry *php_uri_ce_whatwg_url_host_type; zend_class_entry *php_uri_ce_whatwg_invalid_url_exception; zend_class_entry *php_uri_ce_whatwg_url_validation_error_type; zend_class_entry *php_uri_ce_whatwg_url_validation_error; @@ -510,6 +511,16 @@ PHP_METHOD(Uri_WhatWg_Url, __construct) create_whatwg_uri(INTERNAL_FUNCTION_PARAM_PASSTHRU, true); } +PHP_METHOD(Uri_Rfc3986_Uri, getUriType) +{ + ZEND_PARSE_PARAMETERS_NONE(); + + php_uri_object *uri_object = Z_URI_OBJECT_P(ZEND_THIS); + ZEND_ASSERT(uri_object->uri != NULL); + + php_uri_parser_rfc3986_uri_type_read(uri_object->uri, return_value); +} + PHP_METHOD(Uri_Rfc3986_Uri, getScheme) { php_uri_property_read_helper(INTERNAL_FUNCTION_PARAM_PASSTHRU, PHP_URI_PROPERTY_NAME_SCHEME, PHP_URI_COMPONENT_READ_MODE_NORMALIZED_ASCII); @@ -613,6 +624,16 @@ PHP_METHOD(Uri_Rfc3986_Uri, getRawHost) php_uri_property_read_helper(INTERNAL_FUNCTION_PARAM_PASSTHRU, PHP_URI_PROPERTY_NAME_HOST, PHP_URI_COMPONENT_READ_MODE_RAW); } +PHP_METHOD(Uri_Rfc3986_Uri, getHostType) +{ + ZEND_PARSE_PARAMETERS_NONE(); + + php_uri_object *uri_object = Z_URI_OBJECT_P(ZEND_THIS); + ZEND_ASSERT(uri_object->uri != NULL); + + php_uri_parser_rfc3986_host_type_read(uri_object->uri, return_value); +} + PHP_METHOD(Uri_Rfc3986_Uri, withHost) { php_uri_property_write_str_or_null_helper(INTERNAL_FUNCTION_PARAM_PASSTHRU, PHP_URI_PROPERTY_NAME_HOST); @@ -885,6 +906,16 @@ PHP_METHOD(Uri_WhatWg_Url, withScheme) php_uri_property_write_str_helper(INTERNAL_FUNCTION_PARAM_PASSTHRU, PHP_URI_PROPERTY_NAME_SCHEME); } +PHP_METHOD(Uri_WhatWg_Url, isSpecialScheme) +{ + ZEND_PARSE_PARAMETERS_NONE(); + + php_uri_object *uri_object = Z_URI_OBJECT_P(ZEND_THIS); + ZEND_ASSERT(uri_object->uri != NULL); + + RETVAL_BOOL(php_uri_parser_whatwg_is_special(uri_object->uri)); +} + PHP_METHOD(Uri_WhatWg_Url, withUsername) { php_uri_property_write_str_or_null_helper(INTERNAL_FUNCTION_PARAM_PASSTHRU, PHP_URI_PROPERTY_NAME_USERNAME); @@ -905,6 +936,16 @@ PHP_METHOD(Uri_WhatWg_Url, getUnicodeHost) php_uri_property_read_helper(INTERNAL_FUNCTION_PARAM_PASSTHRU, PHP_URI_PROPERTY_NAME_HOST, PHP_URI_COMPONENT_READ_MODE_NORMALIZED_UNICODE); } +PHP_METHOD(Uri_WhatWg_Url, getHostType) +{ + ZEND_PARSE_PARAMETERS_NONE(); + + php_uri_object *uri_object = Z_URI_OBJECT_P(ZEND_THIS); + ZEND_ASSERT(uri_object->uri != NULL); + + php_uri_parser_whatwg_host_type_read(uri_object->uri, return_value); +} + PHP_METHOD(Uri_WhatWg_Url, getFragment) { php_uri_property_read_helper(INTERNAL_FUNCTION_PARAM_PASSTHRU, PHP_URI_PROPERTY_NAME_FRAGMENT, PHP_URI_COMPONENT_READ_MODE_NORMALIZED_UNICODE); @@ -1036,7 +1077,7 @@ PHPAPI void php_uri_object_handler_free(zend_object *object) PHPAPI zend_object *php_uri_object_handler_clone(zend_object *object) { - php_uri_object *uri_object = php_uri_object_from_obj(object); + const php_uri_object *uri_object = php_uri_object_from_obj(object); ZEND_ASSERT(uri_object->uri != NULL); @@ -1076,15 +1117,18 @@ static PHP_MINIT_FUNCTION(uri) php_uri_ce_rfc3986_uri->create_object = php_uri_object_create_rfc3986; php_uri_ce_rfc3986_uri->default_object_handlers = &object_handlers_rfc3986_uri; memcpy(&object_handlers_rfc3986_uri, zend_get_std_object_handlers(), sizeof(zend_object_handlers)); - object_handlers_rfc3986_uri.offset = XtOffsetOf(php_uri_object, std); + object_handlers_rfc3986_uri.offset = offsetof(php_uri_object, std); object_handlers_rfc3986_uri.free_obj = php_uri_object_handler_free; object_handlers_rfc3986_uri.clone_obj = php_uri_object_handler_clone; + php_uri_ce_rfc3986_uri_type = register_class_Uri_Rfc3986_UriType(); + php_uri_ce_rfc3986_uri_host_type = register_class_Uri_Rfc3986_UriHostType(); + php_uri_ce_whatwg_url = register_class_Uri_WhatWg_Url(); php_uri_ce_whatwg_url->create_object = php_uri_object_create_whatwg; php_uri_ce_whatwg_url->default_object_handlers = &object_handlers_whatwg_uri; memcpy(&object_handlers_whatwg_uri, zend_get_std_object_handlers(), sizeof(zend_object_handlers)); - object_handlers_whatwg_uri.offset = XtOffsetOf(php_uri_object, std); + object_handlers_whatwg_uri.offset = offsetof(php_uri_object, std); object_handlers_whatwg_uri.free_obj = php_uri_object_handler_free; object_handlers_whatwg_uri.clone_obj = php_uri_object_handler_clone; @@ -1093,6 +1137,7 @@ static PHP_MINIT_FUNCTION(uri) php_uri_ce_error = register_class_Uri_UriError(zend_ce_error); php_uri_ce_invalid_uri_exception = register_class_Uri_InvalidUriException(php_uri_ce_exception); php_uri_ce_whatwg_invalid_url_exception = register_class_Uri_WhatWg_InvalidUrlException(php_uri_ce_invalid_uri_exception); + php_uri_ce_whatwg_url_host_type = register_class_Uri_WhatWg_UrlHostType(); php_uri_ce_whatwg_url_validation_error = register_class_Uri_WhatWg_UrlValidationError(); php_uri_ce_whatwg_url_validation_error_type = register_class_Uri_WhatWg_UrlValidationErrorType(); diff --git a/ext/uri/php_uri.h b/ext/uri/php_uri.h index 1ec3617b096c..2c8516585c0f 100644 --- a/ext/uri/php_uri.h +++ b/ext/uri/php_uri.h @@ -1,14 +1,12 @@ /* +----------------------------------------------------------------------+ - | Copyright (c) The PHP Group | + | Copyright © The PHP Group and Contributors. | +----------------------------------------------------------------------+ - | This source file is subject to version 3.01 of the PHP license, | - | that is bundled with this package in the file LICENSE, and is | - | available through the world-wide-web at the following url: | - | https://www.php.net/license/3_01.txt | - | If you did not receive a copy of the PHP license and are unable to | - | obtain it through the world-wide-web, please send a note to | - | license@php.net so we can mail you a copy immediately. | + | This source file is subject to the Modified BSD License that is | + | bundled with this package in the file LICENSE, and is available | + | through the World Wide Web at . | + | | + | SPDX-License-Identifier: BSD-3-Clause | +----------------------------------------------------------------------+ | Authors: Máté Kocsis | +----------------------------------------------------------------------+ diff --git a/ext/uri/php_uri.stub.php b/ext/uri/php_uri.stub.php index 6d4b2c3517a5..b0b83fcf83ec 100644 --- a/ext/uri/php_uri.stub.php +++ b/ext/uri/php_uri.stub.php @@ -29,6 +29,22 @@ enum UriComparisonMode } namespace Uri\Rfc3986 { + enum UriType + { + case AbsolutePathReference; + case RelativePathReference; + case NetworkPathReference; + case Uri; + } + + enum UriHostType + { + case IPv4; + case IPv6; + case IPvFuture; + case RegisteredName; + } + /** @strict-properties */ final readonly class Uri { @@ -36,6 +52,8 @@ public static function parse(string $uri, ?\Uri\Rfc3986\Uri $baseUrl = null): ?s public function __construct(string $uri, ?\Uri\Rfc3986\Uri $baseUrl = null) {} + public function getUriType(): ?\Uri\Rfc3986\UriType {} + public function getScheme(): ?string {} public function getRawScheme(): ?string {} @@ -60,6 +78,8 @@ public function getHost(): ?string {} public function getRawHost(): ?string {} + public function getHostType(): ?\Uri\Rfc3986\UriHostType {} + public function withHost(?string $host): static {} public function getPort(): ?int {} @@ -152,6 +172,15 @@ enum UrlValidationErrorType public function __construct(string $context, \Uri\WhatWg\UrlValidationErrorType $type, bool $failure) {} } + enum UrlHostType + { + case IPv4; + case IPv6; + case Domain; + case Opaque; + case Empty; + } + /** @strict-properties */ final readonly class Url { @@ -165,6 +194,8 @@ public function getScheme(): string {} public function withScheme(string $scheme): static {} + public function isSpecialScheme(): bool {} + /** @implementation-alias Uri\Rfc3986\Uri::getUsername */ public function getUsername(): ?string {} @@ -179,6 +210,8 @@ public function getAsciiHost(): ?string {} public function getUnicodeHost(): ?string {} + public function getHostType(): ?\Uri\WhatWg\UrlHostType {} + /** @implementation-alias Uri\Rfc3986\Uri::withHost */ public function withHost(?string $host): static {} diff --git a/ext/uri/php_uri_arginfo.h b/ext/uri/php_uri_arginfo.h index 18d7f4adf783..0fb464ee74aa 100644 --- a/ext/uri/php_uri_arginfo.h +++ b/ext/uri/php_uri_arginfo.h @@ -1,5 +1,5 @@ /* This is a generated file, edit php_uri.stub.php instead. - * Stub hash: 3c228f4227e7543be5c12c99074789d92c27ab99 + * Stub hash: a3b4696ac001d537cc34b818715c7eb382c17c5b * Has decl header: yes */ ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_class_Uri_Rfc3986_Uri_parse, 0, 1, IS_STATIC, 1) @@ -12,6 +12,9 @@ ZEND_BEGIN_ARG_INFO_EX(arginfo_class_Uri_Rfc3986_Uri___construct, 0, 0, 1) ZEND_ARG_OBJ_INFO_WITH_DEFAULT_VALUE(0, baseUrl, Uri\\Rfc3986\\\125ri, 1, "null") ZEND_END_ARG_INFO() +ZEND_BEGIN_ARG_WITH_RETURN_OBJ_INFO_EX(arginfo_class_Uri_Rfc3986_Uri_getUriType, 0, 0, Uri\\Rfc3986\\\125riType, 1) +ZEND_END_ARG_INFO() + ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_class_Uri_Rfc3986_Uri_getScheme, 0, 0, IS_STRING, 1) ZEND_END_ARG_INFO() @@ -41,6 +44,9 @@ ZEND_END_ARG_INFO() #define arginfo_class_Uri_Rfc3986_Uri_getRawHost arginfo_class_Uri_Rfc3986_Uri_getScheme +ZEND_BEGIN_ARG_WITH_RETURN_OBJ_INFO_EX(arginfo_class_Uri_Rfc3986_Uri_getHostType, 0, 0, Uri\\Rfc3986\\\125riHostType, 1) +ZEND_END_ARG_INFO() + ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_class_Uri_Rfc3986_Uri_withHost, 0, 1, IS_STATIC, 0) ZEND_ARG_TYPE_INFO(0, host, IS_STRING, 1) ZEND_END_ARG_INFO() @@ -130,6 +136,9 @@ ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_class_Uri_WhatWg_Url_withScheme, ZEND_ARG_TYPE_INFO(0, scheme, IS_STRING, 0) ZEND_END_ARG_INFO() +ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_class_Uri_WhatWg_Url_isSpecialScheme, 0, 0, _IS_BOOL, 0) +ZEND_END_ARG_INFO() + #define arginfo_class_Uri_WhatWg_Url_getUsername arginfo_class_Uri_Rfc3986_Uri_getScheme ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_class_Uri_WhatWg_Url_withUsername, 0, 1, IS_STATIC, 0) @@ -146,6 +155,9 @@ ZEND_END_ARG_INFO() #define arginfo_class_Uri_WhatWg_Url_getUnicodeHost arginfo_class_Uri_Rfc3986_Uri_getScheme +ZEND_BEGIN_ARG_WITH_RETURN_OBJ_INFO_EX(arginfo_class_Uri_WhatWg_Url_getHostType, 0, 0, Uri\\WhatWg\\\125rlHostType, 1) +ZEND_END_ARG_INFO() + #define arginfo_class_Uri_WhatWg_Url_withHost arginfo_class_Uri_Rfc3986_Uri_withHost #define arginfo_class_Uri_WhatWg_Url_getPort arginfo_class_Uri_Rfc3986_Uri_getPort @@ -186,6 +198,7 @@ ZEND_END_ARG_INFO() ZEND_METHOD(Uri_Rfc3986_Uri, parse); ZEND_METHOD(Uri_Rfc3986_Uri, __construct); +ZEND_METHOD(Uri_Rfc3986_Uri, getUriType); ZEND_METHOD(Uri_Rfc3986_Uri, getScheme); ZEND_METHOD(Uri_Rfc3986_Uri, getRawScheme); ZEND_METHOD(Uri_Rfc3986_Uri, withScheme); @@ -198,6 +211,7 @@ ZEND_METHOD(Uri_Rfc3986_Uri, getPassword); ZEND_METHOD(Uri_Rfc3986_Uri, getRawPassword); ZEND_METHOD(Uri_Rfc3986_Uri, getHost); ZEND_METHOD(Uri_Rfc3986_Uri, getRawHost); +ZEND_METHOD(Uri_Rfc3986_Uri, getHostType); ZEND_METHOD(Uri_Rfc3986_Uri, withHost); ZEND_METHOD(Uri_Rfc3986_Uri, getPort); ZEND_METHOD(Uri_Rfc3986_Uri, withPort); @@ -223,10 +237,12 @@ ZEND_METHOD(Uri_WhatWg_Url, parse); ZEND_METHOD(Uri_WhatWg_Url, __construct); ZEND_METHOD(Uri_WhatWg_Url, getScheme); ZEND_METHOD(Uri_WhatWg_Url, withScheme); +ZEND_METHOD(Uri_WhatWg_Url, isSpecialScheme); ZEND_METHOD(Uri_WhatWg_Url, withUsername); ZEND_METHOD(Uri_WhatWg_Url, withPassword); ZEND_METHOD(Uri_WhatWg_Url, getAsciiHost); ZEND_METHOD(Uri_WhatWg_Url, getUnicodeHost); +ZEND_METHOD(Uri_WhatWg_Url, getHostType); ZEND_METHOD(Uri_WhatWg_Url, equals); ZEND_METHOD(Uri_WhatWg_Url, toAsciiString); ZEND_METHOD(Uri_WhatWg_Url, toUnicodeString); @@ -238,6 +254,7 @@ ZEND_METHOD(Uri_WhatWg_Url, __debugInfo); static const zend_function_entry class_Uri_Rfc3986_Uri_methods[] = { ZEND_ME(Uri_Rfc3986_Uri, parse, arginfo_class_Uri_Rfc3986_Uri_parse, ZEND_ACC_PUBLIC|ZEND_ACC_STATIC) ZEND_ME(Uri_Rfc3986_Uri, __construct, arginfo_class_Uri_Rfc3986_Uri___construct, ZEND_ACC_PUBLIC) + ZEND_ME(Uri_Rfc3986_Uri, getUriType, arginfo_class_Uri_Rfc3986_Uri_getUriType, ZEND_ACC_PUBLIC) ZEND_ME(Uri_Rfc3986_Uri, getScheme, arginfo_class_Uri_Rfc3986_Uri_getScheme, ZEND_ACC_PUBLIC) ZEND_ME(Uri_Rfc3986_Uri, getRawScheme, arginfo_class_Uri_Rfc3986_Uri_getRawScheme, ZEND_ACC_PUBLIC) ZEND_ME(Uri_Rfc3986_Uri, withScheme, arginfo_class_Uri_Rfc3986_Uri_withScheme, ZEND_ACC_PUBLIC) @@ -250,6 +267,7 @@ static const zend_function_entry class_Uri_Rfc3986_Uri_methods[] = { ZEND_ME(Uri_Rfc3986_Uri, getRawPassword, arginfo_class_Uri_Rfc3986_Uri_getRawPassword, ZEND_ACC_PUBLIC) ZEND_ME(Uri_Rfc3986_Uri, getHost, arginfo_class_Uri_Rfc3986_Uri_getHost, ZEND_ACC_PUBLIC) ZEND_ME(Uri_Rfc3986_Uri, getRawHost, arginfo_class_Uri_Rfc3986_Uri_getRawHost, ZEND_ACC_PUBLIC) + ZEND_ME(Uri_Rfc3986_Uri, getHostType, arginfo_class_Uri_Rfc3986_Uri_getHostType, ZEND_ACC_PUBLIC) ZEND_ME(Uri_Rfc3986_Uri, withHost, arginfo_class_Uri_Rfc3986_Uri_withHost, ZEND_ACC_PUBLIC) ZEND_ME(Uri_Rfc3986_Uri, getPort, arginfo_class_Uri_Rfc3986_Uri_getPort, ZEND_ACC_PUBLIC) ZEND_ME(Uri_Rfc3986_Uri, withPort, arginfo_class_Uri_Rfc3986_Uri_withPort, ZEND_ACC_PUBLIC) @@ -287,12 +305,14 @@ static const zend_function_entry class_Uri_WhatWg_Url_methods[] = { ZEND_ME(Uri_WhatWg_Url, __construct, arginfo_class_Uri_WhatWg_Url___construct, ZEND_ACC_PUBLIC) ZEND_ME(Uri_WhatWg_Url, getScheme, arginfo_class_Uri_WhatWg_Url_getScheme, ZEND_ACC_PUBLIC) ZEND_ME(Uri_WhatWg_Url, withScheme, arginfo_class_Uri_WhatWg_Url_withScheme, ZEND_ACC_PUBLIC) + ZEND_ME(Uri_WhatWg_Url, isSpecialScheme, arginfo_class_Uri_WhatWg_Url_isSpecialScheme, ZEND_ACC_PUBLIC) ZEND_RAW_FENTRY("getUsername", zim_Uri_Rfc3986_Uri_getUsername, arginfo_class_Uri_WhatWg_Url_getUsername, ZEND_ACC_PUBLIC, NULL, NULL) ZEND_ME(Uri_WhatWg_Url, withUsername, arginfo_class_Uri_WhatWg_Url_withUsername, ZEND_ACC_PUBLIC) ZEND_RAW_FENTRY("getPassword", zim_Uri_Rfc3986_Uri_getPassword, arginfo_class_Uri_WhatWg_Url_getPassword, ZEND_ACC_PUBLIC, NULL, NULL) ZEND_ME(Uri_WhatWg_Url, withPassword, arginfo_class_Uri_WhatWg_Url_withPassword, ZEND_ACC_PUBLIC) ZEND_ME(Uri_WhatWg_Url, getAsciiHost, arginfo_class_Uri_WhatWg_Url_getAsciiHost, ZEND_ACC_PUBLIC) ZEND_ME(Uri_WhatWg_Url, getUnicodeHost, arginfo_class_Uri_WhatWg_Url_getUnicodeHost, ZEND_ACC_PUBLIC) + ZEND_ME(Uri_WhatWg_Url, getHostType, arginfo_class_Uri_WhatWg_Url_getHostType, ZEND_ACC_PUBLIC) ZEND_RAW_FENTRY("withHost", zim_Uri_Rfc3986_Uri_withHost, arginfo_class_Uri_WhatWg_Url_withHost, ZEND_ACC_PUBLIC, NULL, NULL) ZEND_RAW_FENTRY("getPort", zim_Uri_Rfc3986_Uri_getPort, arginfo_class_Uri_WhatWg_Url_getPort, ZEND_ACC_PUBLIC, NULL, NULL) ZEND_RAW_FENTRY("withPort", zim_Uri_Rfc3986_Uri_withPort, arginfo_class_Uri_WhatWg_Url_withPort, ZEND_ACC_PUBLIC, NULL, NULL) @@ -353,6 +373,36 @@ static zend_class_entry *register_class_Uri_UriComparisonMode(void) return class_entry; } +static zend_class_entry *register_class_Uri_Rfc3986_UriType(void) +{ + zend_class_entry *class_entry = zend_register_internal_enum("Uri\\Rfc3986\\UriType", IS_UNDEF, NULL); + + zend_enum_add_case_cstr(class_entry, "AbsolutePathReference", NULL); + + zend_enum_add_case_cstr(class_entry, "RelativePathReference", NULL); + + zend_enum_add_case_cstr(class_entry, "NetworkPathReference", NULL); + + zend_enum_add_case_cstr(class_entry, "Uri", NULL); + + return class_entry; +} + +static zend_class_entry *register_class_Uri_Rfc3986_UriHostType(void) +{ + zend_class_entry *class_entry = zend_register_internal_enum("Uri\\Rfc3986\\UriHostType", IS_UNDEF, NULL); + + zend_enum_add_case_cstr(class_entry, "IPv4", NULL); + + zend_enum_add_case_cstr(class_entry, "IPv6", NULL); + + zend_enum_add_case_cstr(class_entry, "IPvFuture", NULL); + + zend_enum_add_case_cstr(class_entry, "RegisteredName", NULL); + + return class_entry; +} + static zend_class_entry *register_class_Uri_Rfc3986_Uri(void) { zend_class_entry ce, *class_entry; @@ -474,6 +524,23 @@ static zend_class_entry *register_class_Uri_WhatWg_UrlValidationError(void) return class_entry; } +static zend_class_entry *register_class_Uri_WhatWg_UrlHostType(void) +{ + zend_class_entry *class_entry = zend_register_internal_enum("Uri\\WhatWg\\UrlHostType", IS_UNDEF, NULL); + + zend_enum_add_case_cstr(class_entry, "IPv4", NULL); + + zend_enum_add_case_cstr(class_entry, "IPv6", NULL); + + zend_enum_add_case_cstr(class_entry, "Domain", NULL); + + zend_enum_add_case_cstr(class_entry, "Opaque", NULL); + + zend_enum_add_case_cstr(class_entry, "Empty", NULL); + + return class_entry; +} + static zend_class_entry *register_class_Uri_WhatWg_Url(void) { zend_class_entry ce, *class_entry; diff --git a/ext/uri/php_uri_common.c b/ext/uri/php_uri_common.c index da73bc59bf9c..0644afda3105 100644 --- a/ext/uri/php_uri_common.c +++ b/ext/uri/php_uri_common.c @@ -1,14 +1,12 @@ /* +----------------------------------------------------------------------+ - | Copyright (c) The PHP Group | + | Copyright © The PHP Group and Contributors. | +----------------------------------------------------------------------+ - | This source file is subject to version 3.01 of the PHP license, | - | that is bundled with this package in the file LICENSE, and is | - | available through the world-wide-web at the following url: | - | https://www.php.net/license/3_01.txt | - | If you did not receive a copy of the PHP license and are unable to | - | obtain it through the world-wide-web, please send a note to | - | license@php.net so we can mail you a copy immediately. | + | This source file is subject to the Modified BSD License that is | + | bundled with this package in the file LICENSE, and is available | + | through the World Wide Web at . | + | | + | SPDX-License-Identifier: BSD-3-Clause | +----------------------------------------------------------------------+ | Authors: Máté Kocsis | +----------------------------------------------------------------------+ @@ -38,7 +36,7 @@ static zend_string *get_known_string_by_property_name(php_uri_property_name prop return ZSTR_KNOWN(ZEND_STR_QUERY); case PHP_URI_PROPERTY_NAME_FRAGMENT: return ZSTR_KNOWN(ZEND_STR_FRAGMENT); - EMPTY_SWITCH_DEFAULT_CASE() + default: ZEND_UNREACHABLE(); } } @@ -57,7 +55,7 @@ void php_uri_property_read_helper(INTERNAL_FUNCTION_PARAMETERS, php_uri_property } } -static void php_uri_property_write_helper(INTERNAL_FUNCTION_PARAMETERS, php_uri_property_name property_name, zval *property_zv) +static void php_uri_property_write_helper(INTERNAL_FUNCTION_PARAMETERS, php_uri_property_name property_name, const zval *property_zv) { php_uri_object *old_uri_object = Z_URI_OBJECT_P(ZEND_THIS); ZEND_ASSERT(old_uri_object->uri != NULL); diff --git a/ext/uri/php_uri_common.h b/ext/uri/php_uri_common.h index 2ae76cb2ee4d..b79d092ae726 100644 --- a/ext/uri/php_uri_common.h +++ b/ext/uri/php_uri_common.h @@ -1,14 +1,12 @@ /* +----------------------------------------------------------------------+ - | Copyright (c) The PHP Group | + | Copyright © The PHP Group and Contributors. | +----------------------------------------------------------------------+ - | This source file is subject to version 3.01 of the PHP license, | - | that is bundled with this package in the file LICENSE, and is | - | available through the world-wide-web at the following url: | - | https://www.php.net/license/3_01.txt | - | If you did not receive a copy of the PHP license and are unable to | - | obtain it through the world-wide-web, please send a note to | - | license@php.net so we can mail you a copy immediately. | + | This source file is subject to the Modified BSD License that is | + | bundled with this package in the file LICENSE, and is available | + | through the World Wide Web at . | + | | + | SPDX-License-Identifier: BSD-3-Clause | +----------------------------------------------------------------------+ | Authors: Máté Kocsis | +----------------------------------------------------------------------+ @@ -20,6 +18,8 @@ #include "php_uri_decl.h" extern zend_class_entry *php_uri_ce_rfc3986_uri; +extern zend_class_entry *php_uri_ce_rfc3986_uri_type; +extern zend_class_entry *php_uri_ce_rfc3986_uri_host_type; extern zend_class_entry *php_uri_ce_whatwg_url; extern zend_class_entry *php_uri_ce_comparison_mode; extern zend_class_entry *php_uri_ce_exception; @@ -28,6 +28,7 @@ extern zend_class_entry *php_uri_ce_invalid_uri_exception; extern zend_class_entry *php_uri_ce_whatwg_invalid_url_exception; extern zend_class_entry *php_uri_ce_whatwg_url_validation_error_type; extern zend_class_entry *php_uri_ce_whatwg_url_validation_error; +extern zend_class_entry *php_uri_ce_whatwg_url_host_type; typedef enum php_uri_recomposition_mode { PHP_URI_RECOMPOSITION_MODE_RAW_ASCII, @@ -44,7 +45,7 @@ typedef enum php_uri_component_read_mode { typedef zend_result (*php_uri_property_handler_read)(void *uri, php_uri_component_read_mode read_mode, zval *retval); -typedef zend_result (*php_uri_property_handler_write)(void *uri, zval *value, zval *errors); +typedef zend_result (*php_uri_property_handler_write)(void *uri, const zval *value, zval *errors); typedef enum php_uri_property_name { PHP_URI_PROPERTY_NAME_SCHEME, @@ -148,9 +149,7 @@ typedef struct php_uri_object { zend_object std; } php_uri_object; -static inline php_uri_object *php_uri_object_from_obj(zend_object *object) { - return (php_uri_object*)((char*)(object) - XtOffsetOf(php_uri_object, std)); -} +#define php_uri_object_from_obj(object) ZEND_CONTAINER_OF(object, php_uri_object, std) #define Z_URI_OBJECT_P(zv) php_uri_object_from_obj(Z_OBJ_P((zv))) @@ -182,7 +181,7 @@ static inline const php_uri_property_handler *php_uri_parser_property_handler_by return &parser->property_handler.query; case PHP_URI_PROPERTY_NAME_FRAGMENT: return &parser->property_handler.fragment; - EMPTY_SWITCH_DEFAULT_CASE() + default: ZEND_UNREACHABLE(); } } diff --git a/ext/uri/php_uri_decl.h b/ext/uri/php_uri_decl.h index 3c069f3abe6d..d1fd58d04b2c 100644 --- a/ext/uri/php_uri_decl.h +++ b/ext/uri/php_uri_decl.h @@ -1,14 +1,28 @@ /* This is a generated file, edit php_uri.stub.php instead. - * Stub hash: 3c228f4227e7543be5c12c99074789d92c27ab99 */ + * Stub hash: a3b4696ac001d537cc34b818715c7eb382c17c5b */ -#ifndef ZEND_PHP_URI_DECL_3c228f4227e7543be5c12c99074789d92c27ab99_H -#define ZEND_PHP_URI_DECL_3c228f4227e7543be5c12c99074789d92c27ab99_H +#ifndef ZEND_PHP_URI_DECL_a3b4696ac001d537cc34b818715c7eb382c17c5b_H +#define ZEND_PHP_URI_DECL_a3b4696ac001d537cc34b818715c7eb382c17c5b_H typedef enum zend_enum_Uri_UriComparisonMode { ZEND_ENUM_Uri_UriComparisonMode_IncludeFragment = 1, ZEND_ENUM_Uri_UriComparisonMode_ExcludeFragment = 2, } zend_enum_Uri_UriComparisonMode; +typedef enum zend_enum_Uri_Rfc3986_UriType { + ZEND_ENUM_Uri_Rfc3986_UriType_AbsolutePathReference = 1, + ZEND_ENUM_Uri_Rfc3986_UriType_RelativePathReference = 2, + ZEND_ENUM_Uri_Rfc3986_UriType_NetworkPathReference = 3, + ZEND_ENUM_Uri_Rfc3986_UriType_Uri = 4, +} zend_enum_Uri_Rfc3986_UriType; + +typedef enum zend_enum_Uri_Rfc3986_UriHostType { + ZEND_ENUM_Uri_Rfc3986_UriHostType_IPv4 = 1, + ZEND_ENUM_Uri_Rfc3986_UriHostType_IPv6 = 2, + ZEND_ENUM_Uri_Rfc3986_UriHostType_IPvFuture = 3, + ZEND_ENUM_Uri_Rfc3986_UriHostType_RegisteredName = 4, +} zend_enum_Uri_Rfc3986_UriHostType; + typedef enum zend_enum_Uri_WhatWg_UrlValidationErrorType { ZEND_ENUM_Uri_WhatWg_UrlValidationErrorType_DomainToAscii = 1, ZEND_ENUM_Uri_WhatWg_UrlValidationErrorType_DomainToUnicode = 2, @@ -41,4 +55,12 @@ typedef enum zend_enum_Uri_WhatWg_UrlValidationErrorType { ZEND_ENUM_Uri_WhatWg_UrlValidationErrorType_FileInvalidWindowsDriveLetterHost = 29, } zend_enum_Uri_WhatWg_UrlValidationErrorType; -#endif /* ZEND_PHP_URI_DECL_3c228f4227e7543be5c12c99074789d92c27ab99_H */ +typedef enum zend_enum_Uri_WhatWg_UrlHostType { + ZEND_ENUM_Uri_WhatWg_UrlHostType_IPv4 = 1, + ZEND_ENUM_Uri_WhatWg_UrlHostType_IPv6 = 2, + ZEND_ENUM_Uri_WhatWg_UrlHostType_Domain = 3, + ZEND_ENUM_Uri_WhatWg_UrlHostType_Opaque = 4, + ZEND_ENUM_Uri_WhatWg_UrlHostType_Empty = 5, +} zend_enum_Uri_WhatWg_UrlHostType; + +#endif /* ZEND_PHP_URI_DECL_a3b4696ac001d537cc34b818715c7eb382c17c5b_H */ diff --git a/ext/uri/tests/003.phpt b/ext/uri/tests/003.phpt index a1918f7a838b..38d62b0ec8e6 100644 --- a/ext/uri/tests/003.phpt +++ b/ext/uri/tests/003.phpt @@ -1,7 +1,5 @@ --TEST-- Parse special URIs ---EXTENSIONS-- -uri --FILE-- getFragment()); } -$uri = Uri\Rfc3986\Uri::parse("https://username:password@www.google.com:8080/pathname1/pathname2/pathname3?query=true#hash-exists"); +$uri = Uri\Rfc3986\Uri::parse("https://username:password@www.example.com:8080/pathname1/pathname2/pathname3?query=true#hash-exists"); callRfc3986Getters($uri); echo "\n"; -$url = Uri\WhatWg\Url::parse("https://username:password@www.google.com:8080/pathname1/pathname2/pathname3?query=true#hash-exists"); +$url = Uri\WhatWg\Url::parse("https://username:password@www.example.com:8080/pathname1/pathname2/pathname3?query=true#hash-exists"); callWhatWgGetters($url); ?> @@ -57,8 +55,8 @@ string(8) "password" string(8) "password" string(17) "username:password" string(17) "username:password" -string(14) "www.google.com" -string(14) "www.google.com" +string(15) "www.example.com" +string(15) "www.example.com" int(8080) string(30) "/pathname1/pathname2/pathname3" string(30) "/pathname1/pathname2/pathname3" @@ -70,8 +68,8 @@ string(11) "hash-exists" string(5) "https" string(8) "username" string(8) "password" -string(14) "www.google.com" -string(14) "www.google.com" +string(15) "www.example.com" +string(15) "www.example.com" int(8080) string(30) "/pathname1/pathname2/pathname3" string(10) "query=true" diff --git a/ext/uri/tests/009.phpt b/ext/uri/tests/009.phpt index 05f2820bb3fc..9c896d0153b2 100644 --- a/ext/uri/tests/009.phpt +++ b/ext/uri/tests/009.phpt @@ -1,7 +1,5 @@ --TEST-- Test parsing with IANA schemes ---EXTENSIONS-- -uri --FILE-- getMessage() . "\n"; } -$url1 = new Uri\WhatWg\Url("https://username:password@www.google.com:8080/pathname1/pathname2/pathname3?query=true#hash-exists"); +$url1 = new Uri\WhatWg\Url("https://username:password@www.example.com:8080/pathname1/pathname2/pathname3?query=true#hash-exists"); $serializedUrl1 = serialize($url1); $url2 = unserialize($serializedUrl1); @@ -123,7 +121,7 @@ try { ?> --EXPECTF-- -string(163) "O:15:"Uri\Rfc3986\Uri":2:{i:0;a:1:{s:3:"uri";s:98:"https://username:password@www.google.com:8080/pathname1/pathname2/pathname3?query=true#hash-exists";}i:1;a:0:{}}" +string(164) "O:15:"Uri\Rfc3986\Uri":2:{i:0;a:1:{s:3:"uri";s:99:"https://username:password@www.example.com:8080/pathname1/pathname2/pathname3?query=true#hash-exists";}i:1;a:0:{}}" object(Uri\Rfc3986\Uri)#%d (%d) { ["scheme"]=> string(5) "https" @@ -132,7 +130,7 @@ object(Uri\Rfc3986\Uri)#%d (%d) { ["password"]=> string(8) "password" ["host"]=> - string(14) "www.google.com" + string(15) "www.example.com" ["port"]=> int(8080) ["path"]=> @@ -150,7 +148,7 @@ Invalid serialization data for Uri\Rfc3986\Uri object Invalid serialization data for Uri\Rfc3986\Uri object Invalid serialization data for Uri\Rfc3986\Uri object Invalid serialization data for Uri\Rfc3986\Uri object -string(162) "O:14:"Uri\WhatWg\Url":2:{i:0;a:1:{s:3:"uri";s:98:"https://username:password@www.google.com:8080/pathname1/pathname2/pathname3?query=true#hash-exists";}i:1;a:0:{}}" +string(163) "O:14:"Uri\WhatWg\Url":2:{i:0;a:1:{s:3:"uri";s:99:"https://username:password@www.example.com:8080/pathname1/pathname2/pathname3?query=true#hash-exists";}i:1;a:0:{}}" object(Uri\WhatWg\Url)#%d (%d) { ["scheme"]=> string(5) "https" @@ -159,7 +157,7 @@ object(Uri\WhatWg\Url)#%d (%d) { ["password"]=> string(8) "password" ["host"]=> - string(14) "www.google.com" + string(15) "www.example.com" ["port"]=> int(8080) ["path"]=> diff --git a/ext/uri/tests/032.phpt b/ext/uri/tests/032.phpt index b3e670223883..b17765240c7b 100644 --- a/ext/uri/tests/032.phpt +++ b/ext/uri/tests/032.phpt @@ -1,14 +1,12 @@ --TEST-- Test JSON encoding ---EXTENSIONS-- -uri --FILE-- diff --git a/ext/uri/tests/033.phpt b/ext/uri/tests/033.phpt index 65e8ab26a2dd..e88baadeba0d 100644 --- a/ext/uri/tests/033.phpt +++ b/ext/uri/tests/033.phpt @@ -1,15 +1,13 @@ --TEST-- Test var_export ---EXTENSIONS-- -uri --FILE-- diff --git a/ext/uri/tests/038.phpt b/ext/uri/tests/038.phpt index 64a6289fada2..175a6762894b 100644 --- a/ext/uri/tests/038.phpt +++ b/ext/uri/tests/038.phpt @@ -1,7 +1,5 @@ --TEST-- Test toString() ---EXTENSIONS-- -uri --FILE-- +--EXPECTF-- +Warning: Class Uri\WhatWg\Url has no unserializer in %s on line %d + +Warning: unserialize(): Error at offset 25 of 26 bytes in %s on line %d + +Warning: Class Uri\Rfc3986\Uri has no unserializer in %s on line %d + +Warning: unserialize(): Error at offset 26 of 27 bytes in %s on line %d diff --git a/ext/uri/tests/rfc3986/getters/host_type_success_ip_future.phpt b/ext/uri/tests/rfc3986/getters/host_type_success_ip_future.phpt new file mode 100644 index 000000000000..0ac7ea3f7efd --- /dev/null +++ b/ext/uri/tests/rfc3986/getters/host_type_success_ip_future.phpt @@ -0,0 +1,12 @@ +--TEST-- +Test Uri\Rfc3986\Uri component retrieval - host type - IP future +--FILE-- +getHostType()); + +?> +--EXPECT-- +enum(Uri\Rfc3986\UriHostType::IPvFuture) diff --git a/ext/uri/tests/rfc3986/getters/host_type_success_ipv4.phpt b/ext/uri/tests/rfc3986/getters/host_type_success_ipv4.phpt new file mode 100644 index 000000000000..1c0c4448b953 --- /dev/null +++ b/ext/uri/tests/rfc3986/getters/host_type_success_ipv4.phpt @@ -0,0 +1,12 @@ +--TEST-- +Test Uri\Rfc3986\Uri component retrieval - host type - IPv4 +--FILE-- +getHostType()); + +?> +--EXPECT-- +enum(Uri\Rfc3986\UriHostType::IPv4) diff --git a/ext/uri/tests/rfc3986/getters/host_type_success_ipv6.phpt b/ext/uri/tests/rfc3986/getters/host_type_success_ipv6.phpt new file mode 100644 index 000000000000..5f3d826b412a --- /dev/null +++ b/ext/uri/tests/rfc3986/getters/host_type_success_ipv6.phpt @@ -0,0 +1,12 @@ +--TEST-- +Test Uri\Rfc3986\Uri component retrieval - host type - IPv6 +--FILE-- +getHostType()); + +?> +--EXPECT-- +enum(Uri\Rfc3986\UriHostType::IPv6) diff --git a/ext/uri/tests/rfc3986/getters/host_type_success_none.phpt b/ext/uri/tests/rfc3986/getters/host_type_success_none.phpt new file mode 100644 index 000000000000..3a0e0205befe --- /dev/null +++ b/ext/uri/tests/rfc3986/getters/host_type_success_none.phpt @@ -0,0 +1,12 @@ +--TEST-- +Test Uri\Rfc3986\Uri component retrieval - host type - none +--FILE-- +getHostType()); + +?> +--EXPECT-- +NULL diff --git a/ext/uri/tests/rfc3986/getters/host_type_success_registered_name.phpt b/ext/uri/tests/rfc3986/getters/host_type_success_registered_name.phpt new file mode 100644 index 000000000000..31d4aca36c82 --- /dev/null +++ b/ext/uri/tests/rfc3986/getters/host_type_success_registered_name.phpt @@ -0,0 +1,12 @@ +--TEST-- +Test Uri\Rfc3986\Uri component retrieval - host type - registered name +--FILE-- +getHostType()); + +?> +--EXPECT-- +enum(Uri\Rfc3986\UriHostType::RegisteredName) diff --git a/ext/uri/tests/rfc3986/getters/uri_type_success_absolute_path_reference.phpt b/ext/uri/tests/rfc3986/getters/uri_type_success_absolute_path_reference.phpt new file mode 100644 index 000000000000..1cddc15fa33c --- /dev/null +++ b/ext/uri/tests/rfc3986/getters/uri_type_success_absolute_path_reference.phpt @@ -0,0 +1,12 @@ +--TEST-- +Test Uri\Rfc3986\Uri getter - uri type - Absolute path reference +--FILE-- +getUriType()); + +?> +--EXPECT-- +enum(Uri\Rfc3986\UriType::AbsolutePathReference) diff --git a/ext/uri/tests/rfc3986/getters/uri_type_success_network_path_reference.phpt b/ext/uri/tests/rfc3986/getters/uri_type_success_network_path_reference.phpt new file mode 100644 index 000000000000..d7debc5ba66c --- /dev/null +++ b/ext/uri/tests/rfc3986/getters/uri_type_success_network_path_reference.phpt @@ -0,0 +1,12 @@ +--TEST-- +Test Uri\Rfc3986\Uri getter - uri type - Network path reference +--FILE-- +getUriType()); + +?> +--EXPECT-- +enum(Uri\Rfc3986\UriType::NetworkPathReference) diff --git a/ext/uri/tests/rfc3986/getters/uri_type_success_relative_path_reference.phpt b/ext/uri/tests/rfc3986/getters/uri_type_success_relative_path_reference.phpt new file mode 100644 index 000000000000..6cb51405f925 --- /dev/null +++ b/ext/uri/tests/rfc3986/getters/uri_type_success_relative_path_reference.phpt @@ -0,0 +1,12 @@ +--TEST-- +Test Uri\Rfc3986\Uri getter - uri type - Relative path reference +--FILE-- +getUriType()); + +?> +--EXPECT-- +enum(Uri\Rfc3986\UriType::RelativePathReference) diff --git a/ext/uri/tests/rfc3986/getters/uri_type_success_uri_basic.phpt b/ext/uri/tests/rfc3986/getters/uri_type_success_uri_basic.phpt new file mode 100644 index 000000000000..262300103f9c --- /dev/null +++ b/ext/uri/tests/rfc3986/getters/uri_type_success_uri_basic.phpt @@ -0,0 +1,12 @@ +--TEST-- +Test Uri\Rfc3986\Uri getter - uri type - URI +--FILE-- +getUriType()); + +?> +--EXPECT-- +enum(Uri\Rfc3986\UriType::Uri) diff --git a/ext/uri/tests/rfc3986/getters/uri_type_success_uri_empty_authority.phpt b/ext/uri/tests/rfc3986/getters/uri_type_success_uri_empty_authority.phpt new file mode 100644 index 000000000000..ad8f2f27a8c6 --- /dev/null +++ b/ext/uri/tests/rfc3986/getters/uri_type_success_uri_empty_authority.phpt @@ -0,0 +1,12 @@ +--TEST-- +Test Uri\Rfc3986\Uri getter - uri type - URI with empty authority +--FILE-- +getUriType()); + +?> +--EXPECT-- +enum(Uri\Rfc3986\UriType::Uri) diff --git a/ext/uri/tests/rfc3986/getters/uri_type_success_uri_no_authority.phpt b/ext/uri/tests/rfc3986/getters/uri_type_success_uri_no_authority.phpt new file mode 100644 index 000000000000..e266502ce90e --- /dev/null +++ b/ext/uri/tests/rfc3986/getters/uri_type_success_uri_no_authority.phpt @@ -0,0 +1,12 @@ +--TEST-- +Test Uri\Rfc3986\Uri getter - uri type - URI without authority +--FILE-- +getUriType()); + +?> +--EXPECT-- +enum(Uri\Rfc3986\UriType::Uri) diff --git a/ext/uri/tests/rfc3986/modification/fragment_error_reserved.phpt b/ext/uri/tests/rfc3986/modification/fragment_error_reserved.phpt index 1afde4151ac6..2296a797e662 100644 --- a/ext/uri/tests/rfc3986/modification/fragment_error_reserved.phpt +++ b/ext/uri/tests/rfc3986/modification/fragment_error_reserved.phpt @@ -1,7 +1,5 @@ --TEST-- Test Uri\Rfc3986\Uri component modification - fragment - reserved characters ---EXTENSIONS-- -uri --FILE-- getHostType()); + +?> +--EXPECT-- +enum(Uri\WhatWg\UrlHostType::Domain) diff --git a/ext/uri/tests/whatwg/getters/host_type_success_empty.phpt b/ext/uri/tests/whatwg/getters/host_type_success_empty.phpt new file mode 100644 index 000000000000..41351350fb61 --- /dev/null +++ b/ext/uri/tests/whatwg/getters/host_type_success_empty.phpt @@ -0,0 +1,12 @@ +--TEST-- +Test Uri\WhatWg\Url component retrieval - host type - empty +--FILE-- +getHostType()); + +?> +--EXPECT-- +enum(Uri\WhatWg\UrlHostType::Empty) diff --git a/ext/uri/tests/whatwg/getters/host_type_success_ipv4.phpt b/ext/uri/tests/whatwg/getters/host_type_success_ipv4.phpt new file mode 100644 index 000000000000..f2f63caabb5e --- /dev/null +++ b/ext/uri/tests/whatwg/getters/host_type_success_ipv4.phpt @@ -0,0 +1,12 @@ +--TEST-- +Test Uri\WhatWg\Url component retrieval - host type - IPv4 +--FILE-- +getHostType()); + +?> +--EXPECT-- +enum(Uri\WhatWg\UrlHostType::IPv4) diff --git a/ext/uri/tests/whatwg/getters/host_type_success_ipv6.phpt b/ext/uri/tests/whatwg/getters/host_type_success_ipv6.phpt new file mode 100644 index 000000000000..ce5bb00b93d5 --- /dev/null +++ b/ext/uri/tests/whatwg/getters/host_type_success_ipv6.phpt @@ -0,0 +1,12 @@ +--TEST-- +Test Uri\WhatWg\Url component retrieval - host type - IPv6 +--FILE-- +getHostType()); + +?> +--EXPECT-- +enum(Uri\WhatWg\UrlHostType::IPv6) diff --git a/ext/uri/tests/whatwg/getters/host_type_success_none.phpt b/ext/uri/tests/whatwg/getters/host_type_success_none.phpt new file mode 100644 index 000000000000..07d54412a23c --- /dev/null +++ b/ext/uri/tests/whatwg/getters/host_type_success_none.phpt @@ -0,0 +1,12 @@ +--TEST-- +Test Uri\WhatWg\Url component retrieval - host type - none +--FILE-- +getHostType()); + +?> +--EXPECT-- +NULL diff --git a/ext/uri/tests/whatwg/getters/host_type_success_opaque.phpt b/ext/uri/tests/whatwg/getters/host_type_success_opaque.phpt new file mode 100644 index 000000000000..844cba82d512 --- /dev/null +++ b/ext/uri/tests/whatwg/getters/host_type_success_opaque.phpt @@ -0,0 +1,12 @@ +--TEST-- +Test Uri\WhatWg\Url component retrieval - host type - opaque +--FILE-- +getHostType()); + +?> +--EXPECT-- +enum(Uri\WhatWg\UrlHostType::Opaque) diff --git a/ext/uri/tests/whatwg/getters/is_special_scheme_success_false.phpt b/ext/uri/tests/whatwg/getters/is_special_scheme_success_false.phpt new file mode 100644 index 000000000000..9bbb85755843 --- /dev/null +++ b/ext/uri/tests/whatwg/getters/is_special_scheme_success_false.phpt @@ -0,0 +1,12 @@ +--TEST-- +Test Uri\WhatWg\Url::isSpecialScheme() - success - not special +--FILE-- +isSpecialScheme()); + +?> +--EXPECT-- +bool(false) diff --git a/ext/uri/tests/whatwg/getters/is_special_scheme_success_true.phpt b/ext/uri/tests/whatwg/getters/is_special_scheme_success_true.phpt new file mode 100644 index 000000000000..1e19641b5600 --- /dev/null +++ b/ext/uri/tests/whatwg/getters/is_special_scheme_success_true.phpt @@ -0,0 +1,31 @@ +--TEST-- +Test Uri\WhatWg\Url::isSpecialScheme() - success - special +--FILE-- +isSpecialScheme()); + +$url = Uri\WhatWg\Url::parse("https://example.com"); +var_dump($url->isSpecialScheme()); + +$url = Uri\WhatWg\Url::parse("ws://example.com"); +var_dump($url->isSpecialScheme()); + +$url = Uri\WhatWg\Url::parse("wss://example.com"); +var_dump($url->isSpecialScheme()); + +$url = Uri\WhatWg\Url::parse("ftp://example.com"); +var_dump($url->isSpecialScheme()); + +$url = Uri\WhatWg\Url::parse("file://example.com"); +var_dump($url->isSpecialScheme()); + +?> +--EXPECT-- +bool(true) +bool(true) +bool(true) +bool(true) +bool(true) +bool(true) diff --git a/ext/uri/tests/whatwg/modification/fragment_success_auto_encode.phpt b/ext/uri/tests/whatwg/modification/fragment_success_auto_encode.phpt index ac74b8668cd2..7d178691fc01 100644 --- a/ext/uri/tests/whatwg/modification/fragment_success_auto_encode.phpt +++ b/ext/uri/tests/whatwg/modification/fragment_success_auto_encode.phpt @@ -1,7 +1,5 @@ --TEST-- Test Uri\WhatWg\Url component modification - fragment - characters from the percent encode set ---EXTENSIONS-- -uri --FILE-- withScheme("\tscheme") + ->withHost("\tex.com") + ->withQuery("\refoo=bar") + ->withFragment("\nfoo"); + +try { + $url->withScheme("0"); +} catch (Throwable $e) { + echo $e::class, ": ", $e->getMessage(), PHP_EOL; + var_dump($e->errors); +} + +?> +--EXPECT-- +Uri\WhatWg\InvalidUrlException: The specified scheme is malformed +array(0) { +} diff --git a/ext/uri/tests/whatwg/modification/password_success_auto_encoded.phpt b/ext/uri/tests/whatwg/modification/password_success_auto_encoded.phpt index 5db68cb90a62..242c17430101 100644 --- a/ext/uri/tests/whatwg/modification/password_success_auto_encoded.phpt +++ b/ext/uri/tests/whatwg/modification/password_success_auto_encoded.phpt @@ -1,7 +1,5 @@ --TEST-- Test Uri\WhatWg\Url component modification - password - characters from the percent encode set ---EXTENSIONS-- -uri --FILE-- . | + | | + | SPDX-License-Identifier: BSD-3-Clause | +----------------------------------------------------------------------+ | Authors: Máté Kocsis | | Tim Düsterhus | @@ -34,7 +32,7 @@ static zend_string *decode_component(zend_string *in, php_uri_component_read_mod return out; } - EMPTY_SWITCH_DEFAULT_CASE(); + default: ZEND_UNREACHABLE(); } } diff --git a/ext/uri/uri_parser_php_parse_url.h b/ext/uri/uri_parser_php_parse_url.h index 6cf532db8352..2dd2660fe153 100644 --- a/ext/uri/uri_parser_php_parse_url.h +++ b/ext/uri/uri_parser_php_parse_url.h @@ -1,14 +1,12 @@ /* +----------------------------------------------------------------------+ - | Copyright (c) The PHP Group | + | Copyright © The PHP Group and Contributors. | +----------------------------------------------------------------------+ - | This source file is subject to version 3.01 of the PHP license, | - | that is bundled with this package in the file LICENSE, and is | - | available through the world-wide-web at the following url: | - | https://www.php.net/license/3_01.txt | - | If you did not receive a copy of the PHP license and are unable to | - | obtain it through the world-wide-web, please send a note to | - | license@php.net so we can mail you a copy immediately. | + | This source file is subject to the Modified BSD License that is | + | bundled with this package in the file LICENSE, and is available | + | through the World Wide Web at . | + | | + | SPDX-License-Identifier: BSD-3-Clause | +----------------------------------------------------------------------+ | Authors: Máté Kocsis | | Tim Düsterhus | diff --git a/ext/uri/uri_parser_rfc3986.c b/ext/uri/uri_parser_rfc3986.c index a047c63a708d..123f244a51d7 100644 --- a/ext/uri/uri_parser_rfc3986.c +++ b/ext/uri/uri_parser_rfc3986.c @@ -1,14 +1,12 @@ /* +----------------------------------------------------------------------+ - | Copyright (c) The PHP Group | + | Copyright © The PHP Group and Contributors. | +----------------------------------------------------------------------+ - | This source file is subject to version 3.01 of the PHP license, | - | that is bundled with this package in the file LICENSE, and is | - | available through the world-wide-web at the following url: | - | https://www.php.net/license/3_01.txt | - | If you did not receive a copy of the PHP license and are unable to | - | obtain it through the world-wide-web, please send a note to | - | license@php.net so we can mail you a copy immediately. | + | This source file is subject to the Modified BSD License that is | + | bundled with this package in the file LICENSE, and is available | + | through the World Wide Web at . | + | | + | SPDX-License-Identifier: BSD-3-Clause | +----------------------------------------------------------------------+ | Authors: Máté Kocsis | +----------------------------------------------------------------------+ @@ -17,6 +15,7 @@ #include "php.h" #include "uri_parser_rfc3986.h" #include "php_uri_common.h" +#include "Zend/zend_enum.h" #include "Zend/zend_smart_str.h" #include "Zend/zend_exceptions.h" @@ -25,6 +24,7 @@ struct php_uri_parser_rfc3986_uris { UriUriA uri; UriUriA normalized_uri; + unsigned int normalization_mask; bool normalized_uri_initialized; }; @@ -85,16 +85,25 @@ ZEND_ATTRIBUTE_NONNULL static void copy_uri(UriUriA *new_uriparser_uri, const Ur ZEND_ATTRIBUTE_NONNULL static UriUriA *get_normalized_uri(php_uri_parser_rfc3986_uris *uriparser_uris) { if (!uriparser_uris->normalized_uri_initialized) { - copy_uri(&uriparser_uris->normalized_uri, &uriparser_uris->uri); - int result = uriNormalizeSyntaxExMmA(&uriparser_uris->normalized_uri, (unsigned int)-1, mm); - ZEND_ASSERT(result == URI_SUCCESS); + int mask_result = uriNormalizeSyntaxMaskRequiredExA(&uriparser_uris->uri, &uriparser_uris->normalization_mask); + ZEND_ASSERT(mask_result == URI_SUCCESS); + + if (uriparser_uris->normalization_mask != URI_NORMALIZED) { + copy_uri(&uriparser_uris->normalized_uri, &uriparser_uris->uri); + int result = uriNormalizeSyntaxExMmA(&uriparser_uris->normalized_uri, uriparser_uris->normalization_mask, mm); + ZEND_ASSERT(result == URI_SUCCESS); + } uriparser_uris->normalized_uri_initialized = true; } + if (uriparser_uris->normalization_mask == URI_NORMALIZED) { + return &uriparser_uris->uri; + } + return &uriparser_uris->normalized_uri; } -ZEND_ATTRIBUTE_NONNULL static UriUriA *get_uri_for_reading(php_uri_parser_rfc3986_uris *uriparser_uris, php_uri_component_read_mode read_mode) +ZEND_ATTRIBUTE_NONNULL static UriUriA *get_uri_for_reading(php_uri_parser_rfc3986_uris *uriparser_uris, const php_uri_component_read_mode read_mode) { switch (read_mode) { case PHP_URI_COMPONENT_READ_MODE_RAW: @@ -103,7 +112,7 @@ ZEND_ATTRIBUTE_NONNULL static UriUriA *get_uri_for_reading(php_uri_parser_rfc398 ZEND_FALLTHROUGH; case PHP_URI_COMPONENT_READ_MODE_NORMALIZED_UNICODE: return get_normalized_uri(uriparser_uris); - EMPTY_SWITCH_DEFAULT_CASE() + default: ZEND_UNREACHABLE(); } } @@ -112,7 +121,26 @@ ZEND_ATTRIBUTE_NONNULL static UriUriA *get_uri_for_writing(php_uri_parser_rfc398 return &uriparser_uris->uri; } -ZEND_ATTRIBUTE_NONNULL static zend_result php_uri_parser_rfc3986_scheme_read(void *uri, php_uri_component_read_mode read_mode, zval *retval) +ZEND_ATTRIBUTE_NONNULL void php_uri_parser_rfc3986_uri_type_read(php_uri_parser_rfc3986_uris *uri, zval *retval) +{ + const UriUriA *uriparser_uri = get_uri_for_reading(uri, PHP_URI_COMPONENT_READ_MODE_RAW); + + const char *type; + + if (has_text_range(&uriparser_uri->scheme)) { + type = "Uri"; + } else if (has_text_range(&uriparser_uri->hostText)) { + type = "NetworkPathReference"; + } else if (uriparser_uri->absolutePath) { + type = "AbsolutePathReference"; + } else { + type = "RelativePathReference"; + } + + ZVAL_OBJ_COPY(retval, zend_enum_get_case_cstr(php_uri_ce_rfc3986_uri_type, type)); +} + +ZEND_ATTRIBUTE_NONNULL static zend_result php_uri_parser_rfc3986_scheme_read(void *uri, const php_uri_component_read_mode read_mode, zval *retval) { const UriUriA *uriparser_uri = get_uri_for_reading(uri, read_mode); @@ -125,7 +153,7 @@ ZEND_ATTRIBUTE_NONNULL static zend_result php_uri_parser_rfc3986_scheme_read(voi return SUCCESS; } -static zend_result php_uri_parser_rfc3986_scheme_write(void *uri, zval *value, zval *errors) +static zend_result php_uri_parser_rfc3986_scheme_write(void *uri, const zval *value, zval *errors) { UriUriA *uriparser_uri = get_uri_for_writing(uri); int result; @@ -149,7 +177,7 @@ static zend_result php_uri_parser_rfc3986_scheme_write(void *uri, zval *value, z } } -ZEND_ATTRIBUTE_NONNULL zend_result php_uri_parser_rfc3986_userinfo_read(php_uri_parser_rfc3986_uris *uri, php_uri_component_read_mode read_mode, zval *retval) +ZEND_ATTRIBUTE_NONNULL zend_result php_uri_parser_rfc3986_userinfo_read(php_uri_parser_rfc3986_uris *uri, const php_uri_component_read_mode read_mode, zval *retval) { const UriUriA *uriparser_uri = get_uri_for_reading(uri, read_mode); @@ -162,7 +190,7 @@ ZEND_ATTRIBUTE_NONNULL zend_result php_uri_parser_rfc3986_userinfo_read(php_uri_ return SUCCESS; } -zend_result php_uri_parser_rfc3986_userinfo_write(php_uri_parser_rfc3986_uris *uri, zval *value, zval *errors) +zend_result php_uri_parser_rfc3986_userinfo_write(php_uri_parser_rfc3986_uris *uri, const zval *value, zval *errors) { UriUriA *uriparser_uri = get_uri_for_writing(uri); int result; @@ -189,7 +217,7 @@ zend_result php_uri_parser_rfc3986_userinfo_write(php_uri_parser_rfc3986_uris *u } } -ZEND_ATTRIBUTE_NONNULL static zend_result php_uri_parser_rfc3986_username_read(void *uri, php_uri_component_read_mode read_mode, zval *retval) +ZEND_ATTRIBUTE_NONNULL static zend_result php_uri_parser_rfc3986_username_read(void *uri, const php_uri_component_read_mode read_mode, zval *retval) { const UriUriA *uriparser_uri = get_uri_for_reading(uri, read_mode); @@ -211,7 +239,7 @@ ZEND_ATTRIBUTE_NONNULL static zend_result php_uri_parser_rfc3986_username_read(v return SUCCESS; } -ZEND_ATTRIBUTE_NONNULL static zend_result php_uri_parser_rfc3986_password_read(void *uri, php_uri_component_read_mode read_mode, zval *retval) +ZEND_ATTRIBUTE_NONNULL static zend_result php_uri_parser_rfc3986_password_read(void *uri, const php_uri_component_read_mode read_mode, zval *retval) { const UriUriA *uriparser_uri = get_uri_for_reading(uri, read_mode); @@ -230,20 +258,19 @@ ZEND_ATTRIBUTE_NONNULL static zend_result php_uri_parser_rfc3986_password_read(v return SUCCESS; } -ZEND_ATTRIBUTE_NONNULL static zend_result php_uri_parser_rfc3986_host_read(void *uri, php_uri_component_read_mode read_mode, zval *retval) +ZEND_ATTRIBUTE_NONNULL static zend_result php_uri_parser_rfc3986_host_read(void *uri, const php_uri_component_read_mode read_mode, zval *retval) { const UriUriA *uriparser_uri = get_uri_for_reading(uri, read_mode); if (has_text_range(&uriparser_uri->hostText)) { if (uriparser_uri->hostData.ip6 != NULL || uriparser_uri->hostData.ipFuture.first != NULL) { /* the textual representation of the host is always accessible in the .hostText field no matter what the host is */ - smart_str host_str = {0}; - - smart_str_appendc(&host_str, '['); - smart_str_appendl(&host_str, uriparser_uri->hostText.first, get_text_range_length(&uriparser_uri->hostText)); - smart_str_appendc(&host_str, ']'); - - ZVAL_NEW_STR(retval, smart_str_extract(&host_str)); + zend_string *host_str = zend_string_concat3( + "[", 1, + uriparser_uri->hostText.first, get_text_range_length(&uriparser_uri->hostText), + "]", 1 + ); + ZVAL_NEW_STR(retval, host_str); } else { ZVAL_STRINGL(retval, uriparser_uri->hostText.first, get_text_range_length(&uriparser_uri->hostText)); } @@ -254,7 +281,31 @@ ZEND_ATTRIBUTE_NONNULL static zend_result php_uri_parser_rfc3986_host_read(void return SUCCESS; } -static zend_result php_uri_parser_rfc3986_host_write(void *uri, zval *value, zval *errors) +ZEND_ATTRIBUTE_NONNULL void php_uri_parser_rfc3986_host_type_read(php_uri_parser_rfc3986_uris *uri, zval *retval) +{ + const UriUriA *uriparser_uri = get_uri_for_reading(uri, PHP_URI_COMPONENT_READ_MODE_RAW); + + if (!has_text_range(&uriparser_uri->hostText)) { + ZVAL_NULL(retval); + return; + } + + const char *type; + + if (uriparser_uri->hostData.ip4 != NULL) { + type = "IPv4"; + } else if (uriparser_uri->hostData.ip6 != NULL) { + type = "IPv6"; + } else if (has_text_range(&uriparser_uri->hostData.ipFuture)) { + type = "IPvFuture"; + } else { + type = "RegisteredName"; + } + + ZVAL_OBJ_COPY(retval, zend_enum_get_case_cstr(php_uri_ce_rfc3986_uri_host_type, type)); +} + +static zend_result php_uri_parser_rfc3986_host_write(void *uri, const zval *value, zval *errors) { UriUriA *uriparser_uri = get_uri_for_writing(uri); int result; @@ -284,7 +335,7 @@ static zend_result php_uri_parser_rfc3986_host_write(void *uri, zval *value, zva } } -ZEND_ATTRIBUTE_NONNULL static zend_long port_str_to_zend_long_checked(const char *str, size_t len) +ZEND_ATTRIBUTE_NONNULL static zend_long port_str_to_zend_long_checked(const char *str, const size_t len) { if (len > MAX_LENGTH_OF_LONG) { return -1; @@ -302,7 +353,7 @@ ZEND_ATTRIBUTE_NONNULL static zend_long port_str_to_zend_long_checked(const char return (zend_long)result; } -ZEND_ATTRIBUTE_NONNULL static zend_result php_uri_parser_rfc3986_port_read(void *uri, php_uri_component_read_mode read_mode, zval *retval) +ZEND_ATTRIBUTE_NONNULL static zend_result php_uri_parser_rfc3986_port_read(void *uri, const php_uri_component_read_mode read_mode, zval *retval) { const UriUriA *uriparser_uri = get_uri_for_reading(uri, read_mode); @@ -315,7 +366,7 @@ ZEND_ATTRIBUTE_NONNULL static zend_result php_uri_parser_rfc3986_port_read(void return SUCCESS; } -static zend_result php_uri_parser_rfc3986_port_write(void *uri, zval *value, zval *errors) +static zend_result php_uri_parser_rfc3986_port_write(void *uri, const zval *value, zval *errors) { UriUriA *uriparser_uri = get_uri_for_writing(uri); int result; @@ -344,25 +395,41 @@ static zend_result php_uri_parser_rfc3986_port_write(void *uri, zval *value, zva } } -ZEND_ATTRIBUTE_NONNULL static zend_result php_uri_parser_rfc3986_path_read(void *uri, php_uri_component_read_mode read_mode, zval *retval) +ZEND_ATTRIBUTE_NONNULL static zend_result php_uri_parser_rfc3986_path_read(void *uri, const php_uri_component_read_mode read_mode, zval *retval) { const UriUriA *uriparser_uri = get_uri_for_reading(uri, read_mode); if (uriparser_uri->pathHead != NULL) { - smart_str str = {0}; + size_t total_len = 0; + const bool need_leading_slash = uriparser_uri->absolutePath || uriHasHostA(uriparser_uri); + + if (need_leading_slash) { + total_len++; + } + + for (const UriPathSegmentA *p = uriparser_uri->pathHead; p; p = p->next) { + total_len += get_text_range_length(&p->text); + if (p->next) { + total_len++; + } + } + + zend_string *str = zend_string_alloc(total_len, false); + char *out = ZSTR_VAL(str); - if (uriparser_uri->absolutePath || uriHasHostA(uriparser_uri)) { - smart_str_appendc(&str, '/'); + if (need_leading_slash) { + *(out++) = '/'; } for (const UriPathSegmentA *p = uriparser_uri->pathHead; p; p = p->next) { - smart_str_appendl(&str, p->text.first, get_text_range_length(&p->text)); + out = zend_mempcpy(out, p->text.first, get_text_range_length(&p->text)); if (p->next) { - smart_str_appendc(&str, '/'); + *(out++) = '/'; } } - ZVAL_NEW_STR(retval, smart_str_extract(&str)); + *out = '\0'; + ZVAL_NEW_STR(retval, str); } else if (uriparser_uri->absolutePath) { ZVAL_CHAR(retval, '/'); } else { @@ -372,7 +439,7 @@ ZEND_ATTRIBUTE_NONNULL static zend_result php_uri_parser_rfc3986_path_read(void return SUCCESS; } -static zend_result php_uri_parser_rfc3986_path_write(void *uri, zval *value, zval *errors) +static zend_result php_uri_parser_rfc3986_path_write(void *uri, const zval *value, zval *errors) { UriUriA *uriparser_uri = get_uri_for_writing(uri); int result; @@ -396,7 +463,7 @@ static zend_result php_uri_parser_rfc3986_path_write(void *uri, zval *value, zva } } -ZEND_ATTRIBUTE_NONNULL static zend_result php_uri_parser_rfc3986_query_read(void *uri, php_uri_component_read_mode read_mode, zval *retval) +ZEND_ATTRIBUTE_NONNULL static zend_result php_uri_parser_rfc3986_query_read(void *uri, const php_uri_component_read_mode read_mode, zval *retval) { const UriUriA *uriparser_uri = get_uri_for_reading(uri, read_mode); @@ -409,7 +476,7 @@ ZEND_ATTRIBUTE_NONNULL static zend_result php_uri_parser_rfc3986_query_read(void return SUCCESS; } -static zend_result php_uri_parser_rfc3986_query_write(void *uri, zval *value, zval *errors) +static zend_result php_uri_parser_rfc3986_query_write(void *uri, const zval *value, zval *errors) { UriUriA *uriparser_uri = get_uri_for_writing(uri); int result; @@ -433,7 +500,7 @@ static zend_result php_uri_parser_rfc3986_query_write(void *uri, zval *value, zv } } -ZEND_ATTRIBUTE_NONNULL static zend_result php_uri_parser_rfc3986_fragment_read(void *uri, php_uri_component_read_mode read_mode, zval *retval) +ZEND_ATTRIBUTE_NONNULL static zend_result php_uri_parser_rfc3986_fragment_read(void *uri, const php_uri_component_read_mode read_mode, zval *retval) { const UriUriA *uriparser_uri = get_uri_for_reading(uri, read_mode); @@ -446,7 +513,7 @@ ZEND_ATTRIBUTE_NONNULL static zend_result php_uri_parser_rfc3986_fragment_read(v return SUCCESS; } -static zend_result php_uri_parser_rfc3986_fragment_write(void *uri, zval *value, zval *errors) +static zend_result php_uri_parser_rfc3986_fragment_write(void *uri, const zval *value, zval *errors) { UriUriA *uriparser_uri = get_uri_for_writing(uri); int result; @@ -552,7 +619,7 @@ php_uri_parser_rfc3986_uris *php_uri_parser_rfc3986_parse_ex(const char *uri_str return NULL; } -void *php_uri_parser_rfc3986_parse(const char *uri_str, size_t uri_str_len, const void *base_url, zval *errors, bool silent) +static void *php_uri_parser_rfc3986_parse(const char *uri_str, const size_t uri_str_len, const void *base_url, zval *errors, bool silent) { return php_uri_parser_rfc3986_parse_ex(uri_str, uri_str_len, base_url, silent); } @@ -570,7 +637,7 @@ ZEND_ATTRIBUTE_NONNULL static void *php_uri_parser_rfc3986_clone(void *uri) return new_uriparser_uris; } -ZEND_ATTRIBUTE_NONNULL static zend_string *php_uri_parser_rfc3986_to_string(void *uri, php_uri_recomposition_mode recomposition_mode, bool exclude_fragment) +ZEND_ATTRIBUTE_NONNULL static zend_string *php_uri_parser_rfc3986_to_string(void *uri, const php_uri_recomposition_mode recomposition_mode, const bool exclude_fragment) { php_uri_parser_rfc3986_uris *uriparser_uris = uri; const UriUriA *uriparser_uri; diff --git a/ext/uri/uri_parser_rfc3986.h b/ext/uri/uri_parser_rfc3986.h index 4d88478b6063..a5fde7074323 100644 --- a/ext/uri/uri_parser_rfc3986.h +++ b/ext/uri/uri_parser_rfc3986.h @@ -1,14 +1,12 @@ /* +----------------------------------------------------------------------+ - | Copyright (c) The PHP Group | + | Copyright © The PHP Group and Contributors. | +----------------------------------------------------------------------+ - | This source file is subject to version 3.01 of the PHP license, | - | that is bundled with this package in the file LICENSE, and is | - | available through the world-wide-web at the following url: | - | https://www.php.net/license/3_01.txt | - | If you did not receive a copy of the PHP license and are unable to | - | obtain it through the world-wide-web, please send a note to | - | license@php.net so we can mail you a copy immediately. | + | This source file is subject to the Modified BSD License that is | + | bundled with this package in the file LICENSE, and is available | + | through the World Wide Web at . | + | | + | SPDX-License-Identifier: BSD-3-Clause | +----------------------------------------------------------------------+ | Authors: Máté Kocsis | +----------------------------------------------------------------------+ @@ -23,8 +21,11 @@ PHPAPI extern const php_uri_parser php_uri_parser_rfc3986; typedef struct php_uri_parser_rfc3986_uris php_uri_parser_rfc3986_uris; +ZEND_ATTRIBUTE_NONNULL void php_uri_parser_rfc3986_uri_type_read(php_uri_parser_rfc3986_uris *uri, zval *retval); +ZEND_ATTRIBUTE_NONNULL void php_uri_parser_rfc3986_host_type_read(php_uri_parser_rfc3986_uris *uri, zval *retval); + zend_result php_uri_parser_rfc3986_userinfo_read(php_uri_parser_rfc3986_uris *uri, php_uri_component_read_mode read_mode, zval *retval); -zend_result php_uri_parser_rfc3986_userinfo_write(php_uri_parser_rfc3986_uris *uri, zval *value, zval *errors); +zend_result php_uri_parser_rfc3986_userinfo_write(php_uri_parser_rfc3986_uris *uri, const zval *value, zval *errors); php_uri_parser_rfc3986_uris *php_uri_parser_rfc3986_parse_ex(const char *uri_str, size_t uri_str_len, const php_uri_parser_rfc3986_uris *uriparser_base_url, bool silent); diff --git a/ext/uri/uri_parser_whatwg.c b/ext/uri/uri_parser_whatwg.c index 055f130af7c6..6d46feb51aae 100644 --- a/ext/uri/uri_parser_whatwg.c +++ b/ext/uri/uri_parser_whatwg.c @@ -1,14 +1,12 @@ /* +----------------------------------------------------------------------+ - | Copyright (c) The PHP Group | + | Copyright © The PHP Group and Contributors. | +----------------------------------------------------------------------+ - | This source file is subject to version 3.01 of the PHP license, | - | that is bundled with this package in the file LICENSE, and is | - | available through the world-wide-web at the following url: | - | https://www.php.net/license/3_01.txt | - | If you did not receive a copy of the PHP license and are unable to | - | obtain it through the world-wide-web, please send a note to | - | license@php.net so we can mail you a copy immediately. | + | This source file is subject to the Modified BSD License that is | + | bundled with this package in the file LICENSE, and is available | + | through the World Wide Web at . | + | | + | SPDX-License-Identifier: BSD-3-Clause | +----------------------------------------------------------------------+ | Authors: Máté Kocsis | +----------------------------------------------------------------------+ @@ -30,7 +28,7 @@ ZEND_TLS lxb_unicode_idna_t lexbor_idna = {0}; static const size_t lexbor_mraw_byte_size = 8192; -static zend_always_inline void zval_string_or_null_to_lexbor_str(zval *value, lexbor_str_t *lexbor_str) +static zend_always_inline void zval_string_or_null_to_lexbor_str(const zval *value, lexbor_str_t *lexbor_str) { if (Z_TYPE_P(value) == IS_STRING && Z_STRLEN_P(value) > 0) { lexbor_str->data = (lxb_char_t *) Z_STRVAL_P(value); @@ -42,12 +40,12 @@ static zend_always_inline void zval_string_or_null_to_lexbor_str(zval *value, le } } -static zend_always_inline void zval_long_or_null_to_lexbor_str(zval *value, lexbor_str_t *lexbor_str) +static zend_always_inline void zval_long_or_null_to_lexbor_str(const zval *value, lexbor_str_t *lexbor_str) { if (Z_TYPE_P(value) == IS_LONG) { - ZVAL_STR(value, zend_long_to_str(Z_LVAL_P(value))); - lexbor_str_init_append(lexbor_str, lexbor_parser.mraw, (const lxb_char_t *) Z_STRVAL_P(value), Z_STRLEN_P(value)); - zval_ptr_dtor_str(value); + char buf[MAX_LENGTH_OF_LONG + 1]; + const char *res = zend_print_long_to_buf(buf + sizeof(buf) - 1, Z_LVAL_P(value)); + lexbor_str_init_append(lexbor_str, lexbor_parser.mraw, (const lxb_char_t *) res, strlen(res)); } else { ZEND_ASSERT(Z_ISNULL_P(value)); lexbor_str->data = (lxb_char_t *) ""; @@ -62,12 +60,13 @@ static zend_always_inline void zval_long_or_null_to_lexbor_str(zval *value, lexb */ static const char *fill_errors(zval *errors) { - if (lexbor_parser.log == NULL || lexbor_plog_length(lexbor_parser.log) == 0) { + size_t log_len; + if (lexbor_parser.log == NULL || (log_len = lexbor_plog_length(lexbor_parser.log)) == 0) { ZVAL_EMPTY_ARRAY(errors); return NULL; } - array_init(errors); + array_init_size(errors, log_len); const char *result = NULL; lexbor_plog_entry_t *lxb_error; @@ -195,7 +194,7 @@ static const char *fill_errors(zval *errors) error_str = "FileInvalidWindowsDriveLetterHost"; ZVAL_FALSE(&failure); break; - EMPTY_SWITCH_DEFAULT_CASE() + default: ZEND_UNREACHABLE(); } zval error_type; @@ -236,7 +235,7 @@ static void throw_invalid_url_exception_during_write(zval *errors, const char *c } } -static lxb_status_t serialize_to_smart_str_callback(const lxb_char_t *data, size_t length, void *ctx) +static lxb_status_t serialize_to_smart_str_callback(const lxb_char_t *data, const size_t length, void *ctx) { smart_str *uri_str = ctx; @@ -247,7 +246,7 @@ static lxb_status_t serialize_to_smart_str_callback(const lxb_char_t *data, size return LXB_STATUS_OK; } -static zend_result php_uri_parser_whatwg_scheme_read(void *uri, php_uri_component_read_mode read_mode, zval *retval) +static zend_result php_uri_parser_whatwg_scheme_read(void *uri, const php_uri_component_read_mode read_mode, zval *retval) { const lxb_url_t *lexbor_uri = uri; @@ -258,13 +257,15 @@ static zend_result php_uri_parser_whatwg_scheme_read(void *uri, php_uri_componen return SUCCESS; } -static zend_result php_uri_parser_whatwg_scheme_write(void *uri, zval *value, zval *errors) +static zend_result php_uri_parser_whatwg_scheme_write(void *uri, const zval *value, zval *errors) { lxb_url_t *lexbor_uri = uri; lexbor_str_t str = {0}; zval_string_or_null_to_lexbor_str(value, &str); + lxb_url_parser_clean(&lexbor_parser); + if (lxb_url_api_protocol_set(lexbor_uri, &lexbor_parser, str.data, str.length) != LXB_STATUS_OK) { throw_invalid_url_exception_during_write(errors, "scheme"); @@ -274,6 +275,11 @@ static zend_result php_uri_parser_whatwg_scheme_write(void *uri, zval *value, zv return SUCCESS; } +ZEND_ATTRIBUTE_NONNULL bool php_uri_parser_whatwg_is_special(const lxb_url_t *lexbor_uri) +{ + return lxb_url_is_special(lexbor_uri); +} + /* 4.2. URL miscellaneous: A URL includes credentials if its username or password is not the empty string. */ static bool includes_credentials(const lxb_url_t *lexbor_uri) { @@ -293,13 +299,15 @@ static zend_result php_uri_parser_whatwg_username_read(void *uri, php_uri_compon return SUCCESS; } -static zend_result php_uri_parser_whatwg_username_write(void *uri, zval *value, zval *errors) +static zend_result php_uri_parser_whatwg_username_write(void *uri, const zval *value, zval *errors) { lxb_url_t *lexbor_uri = uri; lexbor_str_t str = {0}; zval_string_or_null_to_lexbor_str(value, &str); + lxb_url_parser_clean(&lexbor_parser); + if (lxb_url_api_username_set(lexbor_uri, str.data, str.length) != LXB_STATUS_OK) { throw_invalid_url_exception_during_write(errors, "username"); @@ -322,13 +330,15 @@ static zend_result php_uri_parser_whatwg_password_read(void *uri, php_uri_compon return SUCCESS; } -static zend_result php_uri_parser_whatwg_password_write(void *uri, zval *value, zval *errors) +static zend_result php_uri_parser_whatwg_password_write(void *uri, const zval *value, zval *errors) { lxb_url_t *lexbor_uri = uri; lexbor_str_t str = {0}; zval_string_or_null_to_lexbor_str(value, &str); + lxb_url_parser_clean(&lexbor_parser); + if (lxb_url_api_password_set(lexbor_uri, str.data, str.length) != LXB_STATUS_OK) { throw_invalid_url_exception_during_write(errors, "password"); @@ -338,7 +348,7 @@ static zend_result php_uri_parser_whatwg_password_write(void *uri, zval *value, return SUCCESS; } -static zend_result php_uri_parser_whatwg_host_read(void *uri, php_uri_component_read_mode read_mode, zval *retval) +static zend_result php_uri_parser_whatwg_host_read(void *uri, const php_uri_component_read_mode read_mode, zval *retval) { const lxb_url_t *lexbor_uri = uri; @@ -373,7 +383,7 @@ static zend_result php_uri_parser_whatwg_host_read(void *uri, php_uri_component_ case PHP_URI_COMPONENT_READ_MODE_RAW: ZVAL_STRINGL(retval, (const char *) lexbor_uri->host.u.domain.data, lexbor_uri->host.u.domain.length); break; - EMPTY_SWITCH_DEFAULT_CASE() + default: ZEND_UNREACHABLE(); } } else { ZVAL_NULL(retval); @@ -382,13 +392,40 @@ static zend_result php_uri_parser_whatwg_host_read(void *uri, php_uri_component_ return SUCCESS; } -static zend_result php_uri_parser_whatwg_host_write(void *uri, zval *value, zval *errors) +ZEND_ATTRIBUTE_NONNULL void php_uri_parser_whatwg_host_type_read(const lxb_url_t *lexbor_uri, zval *retval) +{ + switch (lexbor_uri->host.type) { + case LXB_URL_HOST_TYPE_IPV4: + ZVAL_OBJ_COPY(retval, zend_enum_get_case_cstr(php_uri_ce_whatwg_url_host_type, "IPv4")); + return; + case LXB_URL_HOST_TYPE_IPV6: + ZVAL_OBJ_COPY(retval, zend_enum_get_case_cstr(php_uri_ce_whatwg_url_host_type, "IPv6")); + return; + case LXB_URL_HOST_TYPE_DOMAIN: + ZVAL_OBJ_COPY(retval, zend_enum_get_case_cstr(php_uri_ce_whatwg_url_host_type, "Domain")); + return; + case LXB_URL_HOST_TYPE_EMPTY: + ZVAL_OBJ_COPY(retval, zend_enum_get_case_cstr(php_uri_ce_whatwg_url_host_type, "Empty")); + return; + case LXB_URL_HOST_TYPE_OPAQUE: + ZVAL_OBJ_COPY(retval, zend_enum_get_case_cstr(php_uri_ce_whatwg_url_host_type, "Opaque")); + return; + case LXB_URL_HOST_TYPE__UNDEF: + ZVAL_NULL(retval); + return; + default: ZEND_UNREACHABLE(); + } +} + +static zend_result php_uri_parser_whatwg_host_write(void *uri, const zval *value, zval *errors) { lxb_url_t *lexbor_uri = uri; lexbor_str_t str = {0}; zval_string_or_null_to_lexbor_str(value, &str); + lxb_url_parser_clean(&lexbor_parser); + if (lxb_url_api_hostname_set(lexbor_uri, &lexbor_parser, str.data, str.length) != LXB_STATUS_OK) { throw_invalid_url_exception_during_write(errors, "host"); @@ -398,7 +435,7 @@ static zend_result php_uri_parser_whatwg_host_write(void *uri, zval *value, zval return SUCCESS; } -static zend_result php_uri_parser_whatwg_port_read(void *uri, php_uri_component_read_mode read_mode, zval *retval) +static zend_result php_uri_parser_whatwg_port_read(void *uri, const php_uri_component_read_mode read_mode, zval *retval) { const lxb_url_t *lexbor_uri = uri; @@ -411,13 +448,15 @@ static zend_result php_uri_parser_whatwg_port_read(void *uri, php_uri_component_ return SUCCESS; } -static zend_result php_uri_parser_whatwg_port_write(void *uri, zval *value, zval *errors) +static zend_result php_uri_parser_whatwg_port_write(void *uri, const zval *value, zval *errors) { lxb_url_t *lexbor_uri = uri; lexbor_str_t str = {0}; zval_long_or_null_to_lexbor_str(value, &str); + lxb_url_parser_clean(&lexbor_parser); + if (lxb_url_api_port_set(lexbor_uri, &lexbor_parser, str.data, str.length) != LXB_STATUS_OK) { throw_invalid_url_exception_during_write(errors, "port"); @@ -427,7 +466,7 @@ static zend_result php_uri_parser_whatwg_port_write(void *uri, zval *value, zval return SUCCESS; } -static zend_result php_uri_parser_whatwg_path_read(void *uri, php_uri_component_read_mode read_mode, zval *retval) +static zend_result php_uri_parser_whatwg_path_read(void *uri, const php_uri_component_read_mode read_mode, zval *retval) { const lxb_url_t *lexbor_uri = uri; @@ -440,13 +479,15 @@ static zend_result php_uri_parser_whatwg_path_read(void *uri, php_uri_component_ return SUCCESS; } -static zend_result php_uri_parser_whatwg_path_write(void *uri, zval *value, zval *errors) +static zend_result php_uri_parser_whatwg_path_write(void *uri, const zval *value, zval *errors) { lxb_url_t *lexbor_uri = uri; lexbor_str_t str = {0}; zval_string_or_null_to_lexbor_str(value, &str); + lxb_url_parser_clean(&lexbor_parser); + if (lxb_url_api_pathname_set(lexbor_uri, &lexbor_parser, str.data, str.length) != LXB_STATUS_OK) { throw_invalid_url_exception_during_write(errors, "path"); @@ -456,7 +497,7 @@ static zend_result php_uri_parser_whatwg_path_write(void *uri, zval *value, zval return SUCCESS; } -static zend_result php_uri_parser_whatwg_query_read(void *uri, php_uri_component_read_mode read_mode, zval *retval) +static zend_result php_uri_parser_whatwg_query_read(void *uri, const php_uri_component_read_mode read_mode, zval *retval) { const lxb_url_t *lexbor_uri = uri; @@ -469,13 +510,15 @@ static zend_result php_uri_parser_whatwg_query_read(void *uri, php_uri_component return SUCCESS; } -static zend_result php_uri_parser_whatwg_query_write(void *uri, zval *value, zval *errors) +static zend_result php_uri_parser_whatwg_query_write(void *uri, const zval *value, zval *errors) { lxb_url_t *lexbor_uri = uri; lexbor_str_t str = {0}; zval_string_or_null_to_lexbor_str(value, &str); + lxb_url_parser_clean(&lexbor_parser); + if (lxb_url_api_search_set(lexbor_uri, &lexbor_parser, str.data, str.length) != LXB_STATUS_OK) { throw_invalid_url_exception_during_write(errors, "query string"); @@ -485,7 +528,7 @@ static zend_result php_uri_parser_whatwg_query_write(void *uri, zval *value, zva return SUCCESS; } -static zend_result php_uri_parser_whatwg_fragment_read(void *uri, php_uri_component_read_mode read_mode, zval *retval) +static zend_result php_uri_parser_whatwg_fragment_read(void *uri, const php_uri_component_read_mode read_mode, zval *retval) { const lxb_url_t *lexbor_uri = uri; @@ -498,13 +541,15 @@ static zend_result php_uri_parser_whatwg_fragment_read(void *uri, php_uri_compon return SUCCESS; } -static zend_result php_uri_parser_whatwg_fragment_write(void *uri, zval *value, zval *errors) +static zend_result php_uri_parser_whatwg_fragment_write(void *uri, const zval *value, zval *errors) { lxb_url_t *lexbor_uri = uri; lexbor_str_t str = {0}; zval_string_or_null_to_lexbor_str(value, &str); + lxb_url_parser_clean(&lexbor_parser); + if (lxb_url_api_hash_set(lexbor_uri, &lexbor_parser, str.data, str.length) != LXB_STATUS_OK) { throw_invalid_url_exception_during_write(errors, "fragment"); @@ -561,7 +606,7 @@ ZEND_MODULE_POST_ZEND_DEACTIVATE_D(uri_parser_whatwg) return SUCCESS; } -lxb_url_t *php_uri_parser_whatwg_parse_ex(const char *uri_str, size_t uri_str_len, const lxb_url_t *lexbor_base_url, zval *errors, bool silent) +lxb_url_t *php_uri_parser_whatwg_parse_ex(const char *uri_str, const size_t uri_str_len, const lxb_url_t *lexbor_base_url, zval *errors, const bool silent) { lxb_url_parser_clean(&lexbor_parser); @@ -585,7 +630,7 @@ lxb_url_t *php_uri_parser_whatwg_parse_ex(const char *uri_str, size_t uri_str_le return url; } -static void *php_uri_parser_whatwg_parse(const char *uri_str, size_t uri_str_len, const void *base_url, zval *errors, bool silent) +static void *php_uri_parser_whatwg_parse(const char *uri_str, const size_t uri_str_len, const void *base_url, zval *errors, const bool silent) { return php_uri_parser_whatwg_parse_ex(uri_str, uri_str_len, base_url, errors, silent); } @@ -597,7 +642,7 @@ static void *php_uri_parser_whatwg_clone(void *uri) return lxb_url_clone(lexbor_parser.mraw, lexbor_uri); } -static zend_string *php_uri_parser_whatwg_to_string(void *uri, php_uri_recomposition_mode recomposition_mode, bool exclude_fragment) +static zend_string *php_uri_parser_whatwg_to_string(void *uri, const php_uri_recomposition_mode recomposition_mode, const bool exclude_fragment) { const lxb_url_t *lexbor_uri = uri; smart_str uri_str = {0}; @@ -614,7 +659,7 @@ static zend_string *php_uri_parser_whatwg_to_string(void *uri, php_uri_recomposi case PHP_URI_RECOMPOSITION_MODE_NORMALIZED_ASCII: lxb_url_serialize(lexbor_uri, serialize_to_smart_str_callback, &uri_str, exclude_fragment); break; - EMPTY_SWITCH_DEFAULT_CASE() + default: ZEND_UNREACHABLE(); } return smart_str_extract(&uri_str); diff --git a/ext/uri/uri_parser_whatwg.h b/ext/uri/uri_parser_whatwg.h index e8bbb585fd66..f714ee483680 100644 --- a/ext/uri/uri_parser_whatwg.h +++ b/ext/uri/uri_parser_whatwg.h @@ -1,14 +1,12 @@ /* +----------------------------------------------------------------------+ - | Copyright (c) The PHP Group | + | Copyright © The PHP Group and Contributors. | +----------------------------------------------------------------------+ - | This source file is subject to version 3.01 of the PHP license, | - | that is bundled with this package in the file LICENSE, and is | - | available through the world-wide-web at the following url: | - | https://www.php.net/license/3_01.txt | - | If you did not receive a copy of the PHP license and are unable to | - | obtain it through the world-wide-web, please send a note to | - | license@php.net so we can mail you a copy immediately. | + | This source file is subject to the Modified BSD License that is | + | bundled with this package in the file LICENSE, and is available | + | through the World Wide Web at . | + | | + | SPDX-License-Identifier: BSD-3-Clause | +----------------------------------------------------------------------+ | Authors: Máté Kocsis | +----------------------------------------------------------------------+ @@ -22,6 +20,9 @@ PHPAPI extern const php_uri_parser php_uri_parser_whatwg; +ZEND_ATTRIBUTE_NONNULL bool php_uri_parser_whatwg_is_special(const lxb_url_t *lexbor_uri); +ZEND_ATTRIBUTE_NONNULL void php_uri_parser_whatwg_host_type_read(const lxb_url_t *lexbor_uri, zval *retval); + lxb_url_t *php_uri_parser_whatwg_parse_ex(const char *uri_str, size_t uri_str_len, const lxb_url_t *lexbor_base_url, zval *errors, bool silent); PHP_RINIT_FUNCTION(uri_parser_whatwg); diff --git a/ext/uri/uriparser/include/uriparser/Uri.h b/ext/uri/uriparser/include/uriparser/Uri.h index 88976a484627..ddbbd26f9e44 100644 --- a/ext/uri/uriparser/include/uriparser/Uri.h +++ b/ext/uri/uriparser/include/uriparser/Uri.h @@ -1,4 +1,4 @@ -/* 5abed1007be99942f49ffe603a894d277066b79b9cb824547af0f3b9481cb9ca (1.0.0+) +/* c9d94656d067288e474df19a062d487c736b0fa8517d2ef7bbeb8dcd5a70c05b (1.0.2+) * * uriparser - RFC 3986 URI parsing library * diff --git a/ext/uri/uriparser/include/uriparser/UriBase.h b/ext/uri/uriparser/include/uriparser/UriBase.h index 3a9a868e3bb1..1cc91ceab772 100644 --- a/ext/uri/uriparser/include/uriparser/UriBase.h +++ b/ext/uri/uriparser/include/uriparser/UriBase.h @@ -52,7 +52,7 @@ /* Version */ # define URI_VER_MAJOR 1 # define URI_VER_MINOR 0 -# define URI_VER_RELEASE 0 +# define URI_VER_RELEASE 2 # define URI_VER_SUFFIX_ANSI "" # define URI_VER_SUFFIX_UNICODE URI_ANSI_TO_UNICODE(URI_VER_SUFFIX_ANSI) diff --git a/ext/uri/uriparser/src/UriCommon.c b/ext/uri/uriparser/src/UriCommon.c index 3644e8828f35..e9a6992b01c2 100644 --- a/ext/uri/uriparser/src/UriCommon.c +++ b/ext/uri/uriparser/src/UriCommon.c @@ -66,6 +66,8 @@ # endif # include +# include +# include // SIZE_MAX /*extern*/ const URI_CHAR * const URI_FUNC(SafeToPointTo) = _UT("X"); /*extern*/ const URI_CHAR * const URI_FUNC(ConstPwd) = _UT("."); @@ -104,42 +106,35 @@ int URI_FUNC(FreeUriPath)(URI_TYPE(Uri) * uri, UriMemoryManager * memory) { } /* Compares two text ranges for equal text content */ -int URI_FUNC(CompareRange)(const URI_TYPE(TextRange) * a, const URI_TYPE(TextRange) * b) { - int diff; - +bool URI_FUNC(RangeEquals)(const URI_TYPE(TextRange) * a, const URI_TYPE(TextRange) * b) { /* NOTE: Both NULL means equal! */ if ((a == NULL) || (b == NULL)) { - return ((a == NULL) ? 0 : 1) - ((b == NULL) ? 0 : 1); + return a == b; } /* NOTE: Both NULL means equal! */ if ((a->first == NULL) || (b->first == NULL)) { - return ((a->first == NULL) ? 0 : 1) - ((b->first == NULL) ? 0 : 1); - } - - diff = ((int)(a->afterLast - a->first) - (int)(b->afterLast - b->first)); - if (diff > 0) { - return 1; - } else if (diff < 0) { - return -1; + return a->first == b->first; } - diff = URI_STRNCMP(a->first, b->first, (a->afterLast - a->first)); + const size_t lenA = a->afterLast - a->first; + const size_t lenB = b->afterLast - b->first; - if (diff > 0) { - return 1; - } else if (diff < 0) { - return -1; + if (lenA != lenB) { + return false; } - return diff; + return URI_STRNCMP(a->first, b->first, lenA) == 0; } UriBool URI_FUNC(CopyRange)(URI_TYPE(TextRange) * destRange, const URI_TYPE(TextRange) * sourceRange, UriMemoryManager * memory) { - const int lenInChars = (int)(sourceRange->afterLast - sourceRange->first); - const int lenInBytes = lenInChars * sizeof(URI_CHAR); + const size_t lenInChars = sourceRange->afterLast - sourceRange->first; + if (lenInChars > SIZE_MAX / sizeof(URI_CHAR)) { // detect integer overflow + return URI_FALSE; + } + const size_t lenInBytes = lenInChars * sizeof(URI_CHAR); URI_CHAR * dup = memory->malloc(memory, lenInBytes); if (dup == NULL) { return URI_FALSE; @@ -178,7 +173,7 @@ UriBool URI_FUNC(RemoveDotSegmentsEx)(URI_TYPE(Uri) * uri, UriBool relative, walker->reserved = NULL; /* Prev pointer */ do { UriBool removeSegment = URI_FALSE; - int len = (int)(walker->text.afterLast - walker->text.first); + const size_t len = walker->text.afterLast - walker->text.first; switch (len) { case 1: if ((walker->text.first)[0] == _UT('.')) { @@ -727,7 +722,7 @@ UriBool URI_FUNC(FixPathNoScheme)(URI_TYPE(Uri) * uri, UriMemoryManager * memory } /* When dropping a host from a URI without a scheme, an absolute path - * and and empty first path segment, a consecutive reparse would rightfully + * and empty first path segment, a consecutive reparse would rightfully * mis-classify the first path segment as a host marker due to the "//". * To protect against this case, we prepend an artificial "." segment * to the path in here; the function is called after the host has diff --git a/ext/uri/uriparser/src/UriCommon.h b/ext/uri/uriparser/src/UriCommon.h index d141935f19e5..12c691a73386 100644 --- a/ext/uri/uriparser/src/UriCommon.h +++ b/ext/uri/uriparser/src/UriCommon.h @@ -67,6 +67,8 @@ # include # endif +# include + /* Used to point to from empty path segments. * X.first and X.afterLast must be the same non-NULL value then. */ extern const URI_CHAR * const URI_FUNC(SafeToPointTo); @@ -77,7 +79,7 @@ void URI_FUNC(ResetUri)(URI_TYPE(Uri) * uri); int URI_FUNC(FreeUriPath)(URI_TYPE(Uri) * uri, UriMemoryManager * memory); -int URI_FUNC(CompareRange)(const URI_TYPE(TextRange) * a, const URI_TYPE(TextRange) * b); +bool URI_FUNC(RangeEquals)(const URI_TYPE(TextRange) * a, const URI_TYPE(TextRange) * b); UriBool URI_FUNC(CopyRange)(URI_TYPE(TextRange) * destRange, const URI_TYPE(TextRange) * sourceRange, diff --git a/ext/uri/uriparser/src/UriCompare.c b/ext/uri/uriparser/src/UriCompare.c index 781100e7e6f4..f9def86f6669 100644 --- a/ext/uri/uriparser/src/UriCompare.c +++ b/ext/uri/uriparser/src/UriCompare.c @@ -72,17 +72,17 @@ UriBool URI_FUNC(EqualsUri)(const URI_TYPE(Uri) * a, const URI_TYPE(Uri) * b) { } /* scheme */ - if (URI_FUNC(CompareRange)(&(a->scheme), &(b->scheme))) { + if (!URI_FUNC(RangeEquals)(&(a->scheme), &(b->scheme))) { return URI_FALSE; } - /* absolutePath */ - if ((a->scheme.first == NULL) && (a->absolutePath != b->absolutePath)) { + /* absolutePath -- not meaningful for URIs with a host set! */ + if (!URI_FUNC(HasHost)(a) && (a->absolutePath != b->absolutePath)) { return URI_FALSE; } /* userInfo */ - if (URI_FUNC(CompareRange)(&(a->userInfo), &(b->userInfo))) { + if (!URI_FUNC(RangeEquals)(&(a->userInfo), &(b->userInfo))) { return URI_FALSE; } @@ -107,20 +107,20 @@ UriBool URI_FUNC(EqualsUri)(const URI_TYPE(Uri) * a, const URI_TYPE(Uri) * b) { } if (a->hostData.ipFuture.first != NULL) { - if (URI_FUNC(CompareRange)(&(a->hostData.ipFuture), &(b->hostData.ipFuture))) { + if (!URI_FUNC(RangeEquals)(&(a->hostData.ipFuture), &(b->hostData.ipFuture))) { return URI_FALSE; } } if ((a->hostData.ip4 == NULL) && (a->hostData.ip6 == NULL) && (a->hostData.ipFuture.first == NULL)) { - if (URI_FUNC(CompareRange)(&(a->hostText), &(b->hostText))) { + if (!URI_FUNC(RangeEquals)(&(a->hostText), &(b->hostText))) { return URI_FALSE; } } /* portText */ - if (URI_FUNC(CompareRange)(&(a->portText), &(b->portText))) { + if (!URI_FUNC(RangeEquals)(&(a->portText), &(b->portText))) { return URI_FALSE; } @@ -133,7 +133,7 @@ UriBool URI_FUNC(EqualsUri)(const URI_TYPE(Uri) * a, const URI_TYPE(Uri) * b) { URI_TYPE(PathSegment) * walkA = a->pathHead; URI_TYPE(PathSegment) * walkB = b->pathHead; do { - if (URI_FUNC(CompareRange)(&(walkA->text), &(walkB->text))) { + if (!URI_FUNC(RangeEquals)(&(walkA->text), &(walkB->text))) { return URI_FALSE; } if ((walkA->next == NULL) != (walkB->next == NULL)) { @@ -145,12 +145,12 @@ UriBool URI_FUNC(EqualsUri)(const URI_TYPE(Uri) * a, const URI_TYPE(Uri) * b) { } /* query */ - if (URI_FUNC(CompareRange)(&(a->query), &(b->query))) { + if (!URI_FUNC(RangeEquals)(&(a->query), &(b->query))) { return URI_FALSE; } /* fragment */ - if (URI_FUNC(CompareRange)(&(a->fragment), &(b->fragment))) { + if (!URI_FUNC(RangeEquals)(&(a->fragment), &(b->fragment))) { return URI_FALSE; } diff --git a/ext/uri/uriparser/src/UriCopy.c b/ext/uri/uriparser/src/UriCopy.c index 3bc6b0dbe3f4..fbe6340faa42 100644 --- a/ext/uri/uriparser/src/UriCopy.c +++ b/ext/uri/uriparser/src/UriCopy.c @@ -199,6 +199,12 @@ int URI_FUNC(CopyUriMm)(URI_TYPE(Uri) * destUri, const URI_TYPE(Uri) * sourceUri if (URI_FUNC(CopyRangeAsNeeded)(&destWalker->text, &sourceWalker->text, memory) == URI_FALSE) { + // Unless wired to `destUri` above, `destWalker` may be hanging + // in the air now + if (destUri->pathHead != destWalker) { + memory->free(memory, destWalker); + } + URI_FUNC(PreventLeakageAfterCopy)(destUri, revertMask, memory); return URI_ERROR_MALLOC; } diff --git a/ext/uri/uriparser/src/UriFile.c b/ext/uri/uriparser/src/UriFile.c index 7510e701c9f5..0af88480b0ad 100644 --- a/ext/uri/uriparser/src/UriFile.c +++ b/ext/uri/uriparser/src/UriFile.c @@ -63,7 +63,8 @@ # include # endif -# include /* for size_t, avoiding stddef.h for older MSVCs */ +# include // size_t +# include // SIZE_MAX static URI_INLINE int URI_FUNC(FilenameToUriString)(const URI_CHAR * filename, URI_CHAR * uriString, @@ -90,6 +91,11 @@ static URI_INLINE int URI_FUNC(FilenameToUriString)(const URI_CHAR * filename, : _UT("file:///"); const size_t prefixLen = URI_STRLEN(prefix); + // Detect and avoid integer overflow + if (prefixLen > SIZE_MAX / sizeof(URI_CHAR)) { + return URI_ERROR_OUTPUT_TOO_LARGE; + } + /* Copy prefix */ memcpy(uriString, prefix, prefixLen * sizeof(URI_CHAR)); output += prefixLen; @@ -103,7 +109,13 @@ static URI_INLINE int URI_FUNC(FilenameToUriString)(const URI_CHAR * filename, if (lastSep + 1 < input) { if (!fromUnix && absolute && (firstSegment == URI_TRUE)) { /* Quick hack to not convert "C:" to "C%3A" */ - const int charsToCopy = (int)(input - (lastSep + 1)); + const size_t charsToCopy = input - (lastSep + 1); + + // Detect and avoid integer overflow + if (charsToCopy > SIZE_MAX / sizeof(URI_CHAR)) { + return URI_ERROR_OUTPUT_TOO_LARGE; + } + memcpy(output, lastSep + 1, charsToCopy * sizeof(URI_CHAR)); output += charsToCopy; } else { diff --git a/ext/uri/uriparser/src/UriMemory.c b/ext/uri/uriparser/src/UriMemory.c index 3caf8199dc45..669f48dd6827 100644 --- a/ext/uri/uriparser/src/UriMemory.c +++ b/ext/uri/uriparser/src/UriMemory.c @@ -45,12 +45,25 @@ #include "UriConfig.h" /* for HAVE_REALLOCARRAY */ #ifdef HAVE_REALLOCARRAY -# ifndef _GNU_SOURCE -# define _GNU_SOURCE 1 +// For glibc >=2.29 of 2019-02-01 +# if !defined(_DEFAULT_SOURCE) +# define _DEFAULT_SOURCE 1 # endif -# ifdef __NetBSD__ + +// For NetBSD (stdlib.h revision 1.122 of 2020-05-26) +# if defined(__NetBSD__) && !defined(_OPENBSD_SOURCE) # define _OPENBSD_SOURCE 1 # endif + +// POSIX 2024 (XPG8) for e.g. Illumos/SmartOS +# if !defined(_XOPEN_SOURCE) || (_XOPEN_SOURCE - 0 < 800) +# undef _XOPEN_SOURCE +# define _XOPEN_SOURCE 800 +# endif +# if !defined(_POSIX_C_SOURCE) || (_POSIX_C_SOURCE - 0 < 202405L) +# undef _POSIX_C_SOURCE +# define _POSIX_C_SOURCE 202405L +# endif #endif #include diff --git a/ext/uri/uriparser/src/UriNormalize.c b/ext/uri/uriparser/src/UriNormalize.c index 8c812d37a0a7..c73e22b28879 100644 --- a/ext/uri/uriparser/src/UriNormalize.c +++ b/ext/uri/uriparser/src/UriNormalize.c @@ -73,6 +73,7 @@ # endif # include +# include // SIZE_MAX static int URI_FUNC(NormalizeSyntaxEngine)(URI_TYPE(Uri) * uri, unsigned int inMask, unsigned int * outMask, @@ -254,20 +255,22 @@ URI_FUNC(LowercaseInplaceExceptPercentEncoding)(const URI_CHAR * first, static URI_INLINE UriBool URI_FUNC(LowercaseMalloc)(const URI_CHAR ** first, const URI_CHAR ** afterLast, UriMemoryManager * memory) { - int lenInChars; const int lowerUpperDiff = (_UT('a') - _UT('A')); URI_CHAR * buffer; - int i = 0; + size_t i = 0; if ((first == NULL) || (afterLast == NULL) || (*first == NULL) || (*afterLast == NULL)) { return URI_FALSE; } - lenInChars = (int)(*afterLast - *first); + const size_t lenInChars = *afterLast - *first; if (lenInChars == 0) { return URI_TRUE; - } else if (lenInChars < 0) { + } + + // Detect and avoid integer overflow + if (lenInChars > SIZE_MAX / sizeof(URI_CHAR)) { return URI_FALSE; } @@ -295,8 +298,8 @@ URI_FUNC(FixPercentEncodingEngine)(const URI_CHAR * inFirst, const URI_CHAR * in const URI_CHAR * outFirst, const URI_CHAR ** outAfterLast) { URI_CHAR * write = (URI_CHAR *)outFirst; - const int lenInChars = (int)(inAfterLast - inFirst); - int i = 0; + const size_t lenInChars = inAfterLast - inFirst; + size_t i = 0; /* All but last two */ for (; i + 2 < lenInChars; i++) { @@ -350,7 +353,6 @@ static URI_INLINE void URI_FUNC(FixPercentEncodingInplace)(const URI_CHAR * firs static URI_INLINE UriBool URI_FUNC(FixPercentEncodingMalloc)(const URI_CHAR ** first, const URI_CHAR ** afterLast, UriMemoryManager * memory) { - int lenInChars; URI_CHAR * buffer; /* Death checks */ @@ -360,10 +362,13 @@ static URI_INLINE UriBool URI_FUNC(FixPercentEncodingMalloc)(const URI_CHAR ** f } /* Old text length */ - lenInChars = (int)(*afterLast - *first); + const size_t lenInChars = *afterLast - *first; if (lenInChars == 0) { return URI_TRUE; - } else if (lenInChars < 0) { + } + + // Detect and avoid integer overflow + if (lenInChars > SIZE_MAX / sizeof(URI_CHAR)) { return URI_FALSE; } diff --git a/ext/uri/uriparser/src/UriQuery.c b/ext/uri/uriparser/src/UriQuery.c index 801a237a3a1b..de3a040de042 100644 --- a/ext/uri/uriparser/src/UriQuery.c +++ b/ext/uri/uriparser/src/UriQuery.c @@ -67,6 +67,7 @@ # include # include /* size_t */ +# include // SIZE_MAX static int URI_FUNC(ComposeQueryEngine)(URI_CHAR * dest, const URI_TYPE(QueryList) * queryList, @@ -254,7 +255,14 @@ int URI_FUNC(ComposeQueryEngine)(URI_CHAR * dest, const URI_TYPE(QueryList) * qu if (dest != NULL) { write[0] = _UT('\0'); if (charsWritten != NULL) { - *charsWritten = (int)(write - dest) + 1; /* .. for terminator */ + const size_t lenInChars = write - dest; + + // Detect and avoid integer overflow + if (lenInChars > INT_MAX - 1) { + return URI_ERROR_OUTPUT_TOO_LARGE; + } + + *charsWritten = (int)(lenInChars + 1); /* .. for terminator */ } } @@ -267,8 +275,8 @@ UriBool URI_FUNC(AppendQueryItem)(URI_TYPE(QueryList) * *prevNext, int * itemCou const URI_CHAR * valueAfter, UriBool plusToSpace, UriBreakConversion breakConversion, UriMemoryManager * memory) { - const int keyLen = (int)(keyAfter - keyFirst); - const int valueLen = (int)(valueAfter - valueFirst); + const size_t keyLen = keyAfter - keyFirst; + const size_t valueLen = valueAfter - valueFirst; URI_CHAR * key; URI_CHAR * value; @@ -285,6 +293,13 @@ UriBool URI_FUNC(AppendQueryItem)(URI_TYPE(QueryList) * *prevNext, int * itemCou } (*prevNext)->next = NULL; + // Detect integer overflow + if ((keyLen > SIZE_MAX - 1) || (keyLen + 1 > SIZE_MAX / sizeof(URI_CHAR))) { + memory->free(memory, *prevNext); + *prevNext = NULL; + return URI_FALSE; // Raises malloc error + } + /* Fill key */ key = memory->malloc(memory, (keyLen + 1) * sizeof(URI_CHAR)); if (key == NULL) { @@ -305,6 +320,14 @@ UriBool URI_FUNC(AppendQueryItem)(URI_TYPE(QueryList) * *prevNext, int * itemCou /* Fill value */ if (valueFirst != NULL) { + // Detect integer overflow + if ((valueLen > SIZE_MAX - 1) || (valueLen + 1 > SIZE_MAX / sizeof(URI_CHAR))) { + memory->free(memory, key); + memory->free(memory, *prevNext); + *prevNext = NULL; + return URI_FALSE; // Raises malloc error + } + value = memory->malloc(memory, (valueLen + 1) * sizeof(URI_CHAR)); if (value == NULL) { memory->free(memory, key); diff --git a/ext/uri/uriparser/src/UriRecompose.c b/ext/uri/uriparser/src/UriRecompose.c index 61ffee77248f..055e0483d3f2 100644 --- a/ext/uri/uriparser/src/UriRecompose.c +++ b/ext/uri/uriparser/src/UriRecompose.c @@ -64,6 +64,9 @@ # include "UriCommon.h" # endif +# include // INT_MAX +# include // SIZE_MAX + static int URI_FUNC(ToStringEngine)(URI_CHAR * dest, const URI_TYPE(Uri) * uri, int maxChars, int * charsWritten, int * charsRequired); @@ -116,10 +119,19 @@ static URI_INLINE int URI_FUNC(ToStringEngine)(URI_CHAR * dest, const URI_TYPE(U /* clang-format off */ /* [03/19] append scheme to result; */ /* clang-format on */ - const int charsToWrite = - (int)(uri->scheme.afterLast - uri->scheme.first); + const size_t charsToWrite = uri->scheme.afterLast - uri->scheme.first; if (dest != NULL) { - if (written + charsToWrite <= maxChars) { + // Detect and avoid integer overflow + if (charsToWrite > (size_t)INT_MAX - written) { + return URI_ERROR_TOSTRING_TOO_LONG; + } + + if (written + charsToWrite <= (size_t)maxChars) { + // Detect and avoid integer overflow + if (charsToWrite > SIZE_MAX / sizeof(URI_CHAR)) { + return URI_ERROR_TOSTRING_TOO_LONG; + } + memcpy(dest + written, uri->scheme.first, charsToWrite * sizeof(URI_CHAR)); written += charsToWrite; @@ -131,6 +143,11 @@ static URI_INLINE int URI_FUNC(ToStringEngine)(URI_CHAR * dest, const URI_TYPE(U return URI_ERROR_TOSTRING_TOO_LONG; } } else { + // Detect and avoid integer overflow + if (charsToWrite > (size_t)INT_MAX - *charsRequired) { + return URI_ERROR_TOSTRING_TOO_LONG; + } + (*charsRequired) += charsToWrite; } /* clang-format off */ @@ -180,10 +197,20 @@ static URI_INLINE int URI_FUNC(ToStringEngine)(URI_CHAR * dest, const URI_TYPE(U /* clang-format on */ /* UserInfo */ if (uri->userInfo.first != NULL) { - const int charsToWrite = - (int)(uri->userInfo.afterLast - uri->userInfo.first); + const size_t charsToWrite = + uri->userInfo.afterLast - uri->userInfo.first; if (dest != NULL) { - if (written + charsToWrite <= maxChars) { + // Detect and avoid integer overflow + if (charsToWrite > (size_t)INT_MAX - written) { + return URI_ERROR_TOSTRING_TOO_LONG; + } + + if (written + charsToWrite <= (size_t)maxChars) { + // Detect and avoid integer overflow + if (charsToWrite > SIZE_MAX / sizeof(URI_CHAR)) { + return URI_ERROR_TOSTRING_TOO_LONG; + } + memcpy(dest + written, uri->userInfo.first, charsToWrite * sizeof(URI_CHAR)); written += charsToWrite; @@ -206,6 +233,13 @@ static URI_INLINE int URI_FUNC(ToStringEngine)(URI_CHAR * dest, const URI_TYPE(U return URI_ERROR_TOSTRING_TOO_LONG; } } else { + // Detect and avoid integer overflow + if ((charsToWrite > (size_t)INT_MAX - 1) + || (charsToWrite + 1 + > (size_t)INT_MAX - *charsRequired)) { + return URI_ERROR_TOSTRING_TOO_LONG; + } + (*charsRequired) += charsToWrite + 1; } } @@ -334,8 +368,8 @@ static URI_INLINE int URI_FUNC(ToStringEngine)(URI_CHAR * dest, const URI_TYPE(U } } else if (uri->hostData.ipFuture.first != NULL) { /* IPvFuture */ - const int charsToWrite = (int)(uri->hostData.ipFuture.afterLast - - uri->hostData.ipFuture.first); + const size_t charsToWrite = uri->hostData.ipFuture.afterLast + - uri->hostData.ipFuture.first; if (dest != NULL) { if (written + 1 <= maxChars) { memcpy(dest + written, _UT("["), 1 * sizeof(URI_CHAR)); @@ -348,7 +382,17 @@ static URI_INLINE int URI_FUNC(ToStringEngine)(URI_CHAR * dest, const URI_TYPE(U return URI_ERROR_TOSTRING_TOO_LONG; } - if (written + charsToWrite <= maxChars) { + // Detect and avoid integer overflow + if (charsToWrite > (size_t)INT_MAX - written) { + return URI_ERROR_TOSTRING_TOO_LONG; + } + + if (written + charsToWrite <= (size_t)maxChars) { + // Detect and avoid integer overflow + if (charsToWrite > SIZE_MAX / sizeof(URI_CHAR)) { + return URI_ERROR_TOSTRING_TOO_LONG; + } + memcpy(dest + written, uri->hostData.ipFuture.first, charsToWrite * sizeof(URI_CHAR)); written += charsToWrite; @@ -371,14 +415,31 @@ static URI_INLINE int URI_FUNC(ToStringEngine)(URI_CHAR * dest, const URI_TYPE(U return URI_ERROR_TOSTRING_TOO_LONG; } } else { + // Detect and avoid integer overflow + if ((charsToWrite > (size_t)INT_MAX - 1 - 1) + || (1 + charsToWrite + 1 + > (size_t)INT_MAX - *charsRequired)) { + return URI_ERROR_TOSTRING_TOO_LONG; + } + (*charsRequired) += 1 + charsToWrite + 1; } } else if (uri->hostText.first != NULL) { /* Regname */ - const int charsToWrite = - (int)(uri->hostText.afterLast - uri->hostText.first); + const size_t charsToWrite = + uri->hostText.afterLast - uri->hostText.first; if (dest != NULL) { - if (written + charsToWrite <= maxChars) { + // Detect and avoid integer overflow + if (charsToWrite > (size_t)INT_MAX - written) { + return URI_ERROR_TOSTRING_TOO_LONG; + } + + if (written + charsToWrite <= (size_t)maxChars) { + // Detect and avoid integer overflow + if (charsToWrite > SIZE_MAX / sizeof(URI_CHAR)) { + return URI_ERROR_TOSTRING_TOO_LONG; + } + memcpy(dest + written, uri->hostText.first, charsToWrite * sizeof(URI_CHAR)); written += charsToWrite; @@ -390,14 +451,19 @@ static URI_INLINE int URI_FUNC(ToStringEngine)(URI_CHAR * dest, const URI_TYPE(U return URI_ERROR_TOSTRING_TOO_LONG; } } else { + // Detect and avoid integer overflow + if (charsToWrite > (size_t)INT_MAX - *charsRequired) { + return URI_ERROR_TOSTRING_TOO_LONG; + } + (*charsRequired) += charsToWrite; } } /* Port */ if (uri->portText.first != NULL) { - const int charsToWrite = - (int)(uri->portText.afterLast - uri->portText.first); + const size_t charsToWrite = + uri->portText.afterLast - uri->portText.first; if (dest != NULL) { /* Leading ':' */ if (written + 1 <= maxChars) { @@ -411,8 +477,18 @@ static URI_INLINE int URI_FUNC(ToStringEngine)(URI_CHAR * dest, const URI_TYPE(U return URI_ERROR_TOSTRING_TOO_LONG; } + // Detect and avoid integer overflow + if (charsToWrite > (size_t)INT_MAX - written) { + return URI_ERROR_TOSTRING_TOO_LONG; + } + /* Port number */ - if (written + charsToWrite <= maxChars) { + if (written + charsToWrite <= (size_t)maxChars) { + // Detect and avoid integer overflow + if (charsToWrite > SIZE_MAX / sizeof(URI_CHAR)) { + return URI_ERROR_TOSTRING_TOO_LONG; + } + memcpy(dest + written, uri->portText.first, charsToWrite * sizeof(URI_CHAR)); written += charsToWrite; @@ -424,6 +500,13 @@ static URI_INLINE int URI_FUNC(ToStringEngine)(URI_CHAR * dest, const URI_TYPE(U return URI_ERROR_TOSTRING_TOO_LONG; } } else { + // Detect and avoid integer overflow + if ((charsToWrite > (size_t)INT_MAX - 1) + || (1 + charsToWrite + > (size_t)INT_MAX - *charsRequired)) { + return URI_ERROR_TOSTRING_TOO_LONG; + } + (*charsRequired) += 1 + charsToWrite; } } @@ -456,10 +539,20 @@ static URI_INLINE int URI_FUNC(ToStringEngine)(URI_CHAR * dest, const URI_TYPE(U if (uri->pathHead != NULL) { URI_TYPE(PathSegment) * walker = uri->pathHead; do { - const int charsToWrite = - (int)(walker->text.afterLast - walker->text.first); + const size_t charsToWrite = + walker->text.afterLast - walker->text.first; if (dest != NULL) { - if (written + charsToWrite <= maxChars) { + // Detect and avoid integer overflow + if (charsToWrite > (size_t)INT_MAX - written) { + return URI_ERROR_TOSTRING_TOO_LONG; + } + + if (written + charsToWrite <= (size_t)maxChars) { + // Detect and avoid integer overflow + if (charsToWrite > SIZE_MAX / sizeof(URI_CHAR)) { + return URI_ERROR_TOSTRING_TOO_LONG; + } + memcpy(dest + written, walker->text.first, charsToWrite * sizeof(URI_CHAR)); written += charsToWrite; @@ -471,6 +564,11 @@ static URI_INLINE int URI_FUNC(ToStringEngine)(URI_CHAR * dest, const URI_TYPE(U return URI_ERROR_TOSTRING_TOO_LONG; } } else { + // Detect and avoid integer overflow + if (charsToWrite > (size_t)INT_MAX - *charsRequired) { + return URI_ERROR_TOSTRING_TOO_LONG; + } + (*charsRequired) += charsToWrite; } @@ -520,10 +618,19 @@ static URI_INLINE int URI_FUNC(ToStringEngine)(URI_CHAR * dest, const URI_TYPE(U /* clang-format off */ /* [13/19] append query to result; */ /* clang-format on */ - const int charsToWrite = - (int)(uri->query.afterLast - uri->query.first); + const size_t charsToWrite = uri->query.afterLast - uri->query.first; if (dest != NULL) { - if (written + charsToWrite <= maxChars) { + // Detect and avoid integer overflow + if (charsToWrite > (size_t)INT_MAX - written) { + return URI_ERROR_TOSTRING_TOO_LONG; + } + + if (written + charsToWrite <= (size_t)maxChars) { + // Detect and avoid integer overflow + if (charsToWrite > SIZE_MAX / sizeof(URI_CHAR)) { + return URI_ERROR_TOSTRING_TOO_LONG; + } + memcpy(dest + written, uri->query.first, charsToWrite * sizeof(URI_CHAR)); written += charsToWrite; @@ -535,6 +642,11 @@ static URI_INLINE int URI_FUNC(ToStringEngine)(URI_CHAR * dest, const URI_TYPE(U return URI_ERROR_TOSTRING_TOO_LONG; } } else { + // Detect and avoid integer overflow + if (charsToWrite > (size_t)INT_MAX - *charsRequired) { + return URI_ERROR_TOSTRING_TOO_LONG; + } + (*charsRequired) += charsToWrite; } /* clang-format off */ @@ -565,10 +677,20 @@ static URI_INLINE int URI_FUNC(ToStringEngine)(URI_CHAR * dest, const URI_TYPE(U /* clang-format off */ /* [17/19] append fragment to result; */ /* clang-format on */ - const int charsToWrite = - (int)(uri->fragment.afterLast - uri->fragment.first); + const size_t charsToWrite = + uri->fragment.afterLast - uri->fragment.first; if (dest != NULL) { - if (written + charsToWrite <= maxChars) { + // Detect and avoid integer overflow + if (charsToWrite > (size_t)INT_MAX - written) { + return URI_ERROR_TOSTRING_TOO_LONG; + } + + if (written + charsToWrite <= (size_t)maxChars) { + // Detect and avoid integer overflow + if (charsToWrite > SIZE_MAX / sizeof(URI_CHAR)) { + return URI_ERROR_TOSTRING_TOO_LONG; + } + memcpy(dest + written, uri->fragment.first, charsToWrite * sizeof(URI_CHAR)); written += charsToWrite; @@ -580,6 +702,11 @@ static URI_INLINE int URI_FUNC(ToStringEngine)(URI_CHAR * dest, const URI_TYPE(U return URI_ERROR_TOSTRING_TOO_LONG; } } else { + // Detect and avoid integer overflow + if (charsToWrite > (size_t)INT_MAX - *charsRequired) { + return URI_ERROR_TOSTRING_TOO_LONG; + } + (*charsRequired) += charsToWrite; } /* clang-format off */ diff --git a/ext/uri/uriparser/src/UriResolve.c b/ext/uri/uriparser/src/UriResolve.c index 302665d21cd6..90c8bfd778dc 100644 --- a/ext/uri/uriparser/src/UriResolve.c +++ b/ext/uri/uriparser/src/UriResolve.c @@ -183,9 +183,8 @@ static int URI_FUNC(AddBaseUriImpl)(URI_TYPE(Uri) * absDest, if ((options & URI_RESOLVE_IDENTICAL_SCHEME_COMPAT) && (absBase->scheme.first != NULL) && (relSource->scheme.first != NULL) - && (0 - == URI_FUNC(CompareRange)(&(absBase->scheme), - &(relSource->scheme)))) { + && (URI_FUNC(RangeEquals)(&(absBase->scheme), + &(relSource->scheme)))) { /* clang-format off */ /* [00/32] undefine(R.scheme); */ /* clang-format on */ diff --git a/ext/uri/uriparser/src/UriShorten.c b/ext/uri/uriparser/src/UriShorten.c index 548b0b4157dd..001bd7db9990 100644 --- a/ext/uri/uriparser/src/UriShorten.c +++ b/ext/uri/uriparser/src/UriShorten.c @@ -111,14 +111,14 @@ static URI_INLINE UriBool URI_FUNC(EqualsAuthority)(const URI_TYPE(Uri) * first, /* IPvFuture */ if (first->hostData.ipFuture.first != NULL) { return ((second->hostData.ipFuture.first != NULL) - && !URI_FUNC(CompareRange)(&first->hostData.ipFuture, - &second->hostData.ipFuture)) + && URI_FUNC(RangeEquals)(&first->hostData.ipFuture, + &second->hostData.ipFuture)) ? URI_TRUE : URI_FALSE; } - return !URI_FUNC(CompareRange)(&first->hostText, &second->hostText) ? URI_TRUE - : URI_FALSE; + return URI_FUNC(RangeEquals)(&first->hostText, &second->hostText) ? URI_TRUE + : URI_FALSE; } static int URI_FUNC(RemoveBaseUriImpl)(URI_TYPE(Uri) * dest, @@ -152,7 +152,7 @@ static int URI_FUNC(RemoveBaseUriImpl)(URI_TYPE(Uri) * dest, /* clang-format off */ /* [01/50] if (A.scheme != Base.scheme) then */ /* clang-format on */ - if (URI_FUNC(CompareRange)(&absSource->scheme, &absBase->scheme)) { + if (!URI_FUNC(RangeEquals)(&absSource->scheme, &absBase->scheme)) { /* clang-format off */ /* [02/50] T.scheme = A.scheme; */ /* clang-format on */ @@ -255,8 +255,7 @@ static int URI_FUNC(RemoveBaseUriImpl)(URI_TYPE(Uri) * dest, /* clang-format on */ while ( (sourceSeg != NULL) && (baseSeg != NULL) - && !URI_FUNC(CompareRange)(&sourceSeg->text, - &baseSeg->text) + && URI_FUNC(RangeEquals)(&sourceSeg->text, &baseSeg->text) && !((sourceSeg->text.first == sourceSeg->text.afterLast) && ((sourceSeg->next == NULL) != (baseSeg->next == NULL)))) { diff --git a/ext/xml/compat.c b/ext/xml/compat.c index 7e37bf1e412c..10bfa19af7af 100644 --- a/ext/xml/compat.c +++ b/ext/xml/compat.c @@ -1,14 +1,12 @@ /* +----------------------------------------------------------------------+ - | Copyright (c) The PHP Group | + | Copyright © The PHP Group and Contributors. | +----------------------------------------------------------------------+ - | This source file is subject to version 3.01 of the PHP license, | - | that is bundled with this package in the file LICENSE, and is | - | available through the world-wide-web at the following url: | - | https://www.php.net/license/3_01.txt | - | If you did not receive a copy of the PHP license and are unable to | - | obtain it through the world-wide-web, please send a note to | - | license@php.net so we can mail you a copy immediately. | + | This source file is subject to the Modified BSD License that is | + | bundled with this package in the file LICENSE, and is available | + | through the World Wide Web at . | + | | + | SPDX-License-Identifier: BSD-3-Clause | +----------------------------------------------------------------------+ | Authors: Sterling Hughes | +----------------------------------------------------------------------+ diff --git a/ext/xml/expat_compat.h b/ext/xml/expat_compat.h index a7faffbac504..721bad71080b 100644 --- a/ext/xml/expat_compat.h +++ b/ext/xml/expat_compat.h @@ -1,14 +1,12 @@ /* +----------------------------------------------------------------------+ - | Copyright (c) The PHP Group | + | Copyright © The PHP Group and Contributors. | +----------------------------------------------------------------------+ - | This source file is subject to version 3.01 of the PHP license, | - | that is bundled with this package in the file LICENSE, and is | - | available through the world-wide-web at the following url: | - | https://www.php.net/license/3_01.txt | - | If you did not receive a copy of the PHP license and are unable to | - | obtain it through the world-wide-web, please send a note to | - | license@php.net so we can mail you a copy immediately. | + | This source file is subject to the Modified BSD License that is | + | bundled with this package in the file LICENSE, and is available | + | through the World Wide Web at . | + | | + | SPDX-License-Identifier: BSD-3-Clause | +----------------------------------------------------------------------+ | Authors: Sterling Hughes | +----------------------------------------------------------------------+ diff --git a/ext/xml/php_xml.h b/ext/xml/php_xml.h index 8be95fa7aa8f..982f39933d17 100644 --- a/ext/xml/php_xml.h +++ b/ext/xml/php_xml.h @@ -1,14 +1,12 @@ /* +----------------------------------------------------------------------+ - | Copyright (c) The PHP Group | + | Copyright © The PHP Group and Contributors. | +----------------------------------------------------------------------+ - | This source file is subject to version 3.01 of the PHP license, | - | that is bundled with this package in the file LICENSE, and is | - | available through the world-wide-web at the following url: | - | https://www.php.net/license/3_01.txt | - | If you did not receive a copy of the PHP license and are unable to | - | obtain it through the world-wide-web, please send a note to | - | license@php.net so we can mail you a copy immediately. | + | This source file is subject to the Modified BSD License that is | + | bundled with this package in the file LICENSE, and is available | + | through the World Wide Web at . | + | | + | SPDX-License-Identifier: BSD-3-Clause | +----------------------------------------------------------------------+ | Authors: Stig Sæther Bakken | | Thies C. Arntzen | diff --git a/ext/xml/xml.c b/ext/xml/xml.c index 7a9329bcc804..d1bb4bbda23f 100644 --- a/ext/xml/xml.c +++ b/ext/xml/xml.c @@ -1,14 +1,12 @@ /* +----------------------------------------------------------------------+ - | Copyright (c) The PHP Group | + | Copyright © The PHP Group and Contributors. | +----------------------------------------------------------------------+ - | This source file is subject to version 3.01 of the PHP license, | - | that is bundled with this package in the file LICENSE, and is | - | available through the world-wide-web at the following url: | - | https://www.php.net/license/3_01.txt | - | If you did not receive a copy of the PHP license and are unable to | - | obtain it through the world-wide-web, please send a note to | - | license@php.net so we can mail you a copy immediately. | + | This source file is subject to the Modified BSD License that is | + | bundled with this package in the file LICENSE, and is available | + | through the World Wide Web at . | + | | + | SPDX-License-Identifier: BSD-3-Clause | +----------------------------------------------------------------------+ | Authors: Stig Sæther Bakken | | Thies C. Arntzen | @@ -224,7 +222,7 @@ PHP_MINIT_FUNCTION(xml) xml_parser_ce->default_object_handlers = &xml_parser_object_handlers; memcpy(&xml_parser_object_handlers, &std_object_handlers, sizeof(zend_object_handlers)); - xml_parser_object_handlers.offset = XtOffsetOf(xml_parser, std); + xml_parser_object_handlers.offset = offsetof(xml_parser, std); xml_parser_object_handlers.free_obj = xml_parser_free_obj; xml_parser_object_handlers.get_gc = xml_parser_get_gc; xml_parser_object_handlers.get_constructor = xml_parser_get_constructor; @@ -297,9 +295,7 @@ static void xml_xmlchar_zval(const XML_Char *s, int len, const XML_Char *encodin } /* }}} */ -static inline xml_parser *xml_parser_from_obj(zend_object *obj) { - return (xml_parser *)((char *)(obj) - XtOffsetOf(xml_parser, std)); -} +#define xml_parser_from_obj(obj) ZEND_CONTAINER_OF(obj, xml_parser, std) #define Z_XMLPARSER_P(zv) xml_parser_from_obj(Z_OBJ_P(zv)) @@ -554,10 +550,10 @@ static void xml_add_to_info(xml_parser *parser, zend_string *name) SEPARATE_ARRAY(Z_REFVAL(parser->info)); zend_array *arr = Z_ARRVAL_P(Z_REFVAL(parser->info)); - if ((element = zend_hash_find(arr, name)) == NULL) { - zval values; - array_init(&values); - element = zend_hash_update(arr, name, &values); + element = zend_hash_lookup(arr, name); + + if (Z_TYPE_P(element) == IS_NULL) { + array_init(element); } add_next_index_long(element, parser->curtag); @@ -831,16 +827,15 @@ void xml_characterDataHandler(void *userData, const XML_Char *s, int len) zval *myval; /* check if the current tag already has a value - if yes append to that! */ if ((myval = zend_hash_find(Z_ARRVAL_P(ctag), ZSTR_KNOWN(ZEND_STR_VALUE))) && Z_TYPE_P(myval) == IS_STRING) { - size_t newlen = Z_STRLEN_P(myval) + ZSTR_LEN(decoded_value); - Z_STR_P(myval) = zend_string_extend(Z_STR_P(myval), newlen, 0); + Z_STR_P(myval) = zend_string_safe_realloc(Z_STR_P(myval), 1, Z_STRLEN_P(myval), ZSTR_LEN(decoded_value), false); strncpy(Z_STRVAL_P(myval) + Z_STRLEN_P(myval) - ZSTR_LEN(decoded_value), ZSTR_VAL(decoded_value), ZSTR_LEN(decoded_value) + 1); - zend_string_release_ex(decoded_value, 0); + zend_string_release_ex(decoded_value, false); } else { if (doprint || (! parser->skipwhite)) { add_assoc_str(ctag, "value", decoded_value); } else { - zend_string_release_ex(decoded_value, 0); + zend_string_release_ex(decoded_value, false); } } } else { @@ -858,11 +853,10 @@ void xml_characterDataHandler(void *userData, const XML_Char *s, int len) if (EXPECTED(Z_TYPE_P(mytype) == IS_STRING) && zend_string_equals_literal(Z_STR_P(mytype), "cdata")) { SEPARATE_ARRAY(curtag); if ((myval = zend_hash_find(Z_ARRVAL_P(curtag), ZSTR_KNOWN(ZEND_STR_VALUE)))) { - size_t newlen = Z_STRLEN_P(myval) + ZSTR_LEN(decoded_value); - Z_STR_P(myval) = zend_string_extend(Z_STR_P(myval), newlen, 0); + Z_STR_P(myval) = zend_string_safe_realloc(Z_STR_P(myval), 1, Z_STRLEN_P(myval), ZSTR_LEN(decoded_value), false); strncpy(Z_STRVAL_P(myval) + Z_STRLEN_P(myval) - ZSTR_LEN(decoded_value), ZSTR_VAL(decoded_value), ZSTR_LEN(decoded_value) + 1); - zend_string_release_ex(decoded_value, 0); + zend_string_release_ex(decoded_value, false); return; } } @@ -881,7 +875,7 @@ void xml_characterDataHandler(void *userData, const XML_Char *s, int len) } else if (parser->level == (XML_MAXLEVEL + 1)) { php_error_docref(NULL, E_WARNING, "Maximum depth exceeded - Results truncated"); } else { - zend_string_release_ex(decoded_value, 0); + zend_string_release_ex(decoded_value, false); } } } @@ -1620,7 +1614,6 @@ PHP_FUNCTION(xml_parser_set_option) default: zend_argument_value_error(2, "must be a XML_OPTION_* constant"); RETURN_THROWS(); - break; } RETURN_TRUE; @@ -1642,19 +1635,14 @@ PHP_FUNCTION(xml_parser_get_option) switch (opt) { case PHP_XML_OPTION_CASE_FOLDING: RETURN_BOOL(parser->case_folding); - break; case PHP_XML_OPTION_SKIP_TAGSTART: RETURN_LONG(parser->toffset); - break; case PHP_XML_OPTION_SKIP_WHITE: RETURN_BOOL(parser->skipwhite); - break; case PHP_XML_OPTION_PARSE_HUGE: RETURN_BOOL(parser->parsehuge); - break; case PHP_XML_OPTION_TARGET_ENCODING: RETURN_STRING((char *)parser->target_encoding); - break; default: zend_argument_value_error(2, "must be a XML_OPTION_* constant"); RETURN_THROWS(); diff --git a/ext/xmlreader/php_xmlreader.c b/ext/xmlreader/php_xmlreader.c index 8e35ad9d6b0d..6a7fb65e2af0 100644 --- a/ext/xmlreader/php_xmlreader.c +++ b/ext/xmlreader/php_xmlreader.c @@ -1,14 +1,12 @@ /* +----------------------------------------------------------------------+ - | Copyright (c) The PHP Group | + | Copyright © The PHP Group and Contributors. | +----------------------------------------------------------------------+ - | This source file is subject to version 3.01 of the PHP license, | - | that is bundled with this package in the file LICENSE, and is | - | available through the world-wide-web at the following url: | - | https://www.php.net/license/3_01.txt | - | If you did not receive a copy of the PHP license and are unable to | - | obtain it through the world-wide-web, please send a note to | - | license@php.net so we can mail you a copy immediately. | + | This source file is subject to the Modified BSD License that is | + | bundled with this package in the file LICENSE, and is available | + | through the World Wide Web at . | + | | + | SPDX-License-Identifier: BSD-3-Clause | +----------------------------------------------------------------------+ | Author: Rob Richards | +----------------------------------------------------------------------+ @@ -102,7 +100,7 @@ static int xmlreader_property_reader(xmlreader_object *obj, xmlreader_prop_handl case IS_LONG: ZVAL_LONG(rv, retint); break; - EMPTY_SWITCH_DEFAULT_CASE() + default: ZEND_UNREACHABLE(); } return SUCCESS; @@ -755,7 +753,7 @@ PHP_METHOD(XMLReader, moveToAttributeNo) } /* }}} */ -/* {{{ Positions reader at attribute spcified by name and namespaceURI. +/* {{{ Positions reader at attribute specified by name and namespaceURI. Returns TRUE on success and FALSE on failure */ PHP_METHOD(XMLReader, moveToAttributeNs) { @@ -1345,7 +1343,7 @@ PHP_MINIT_FUNCTION(xmlreader) { memcpy(&xmlreader_object_handlers, &std_object_handlers, sizeof(zend_object_handlers)); - xmlreader_object_handlers.offset = XtOffsetOf(xmlreader_object, std); + xmlreader_object_handlers.offset = offsetof(xmlreader_object, std); xmlreader_object_handlers.free_obj = xmlreader_objects_free_storage; xmlreader_object_handlers.has_property = xmlreader_has_property; xmlreader_object_handlers.read_property = xmlreader_read_property; diff --git a/ext/xmlreader/php_xmlreader.h b/ext/xmlreader/php_xmlreader.h index b14b033a0eea..d33938f40506 100644 --- a/ext/xmlreader/php_xmlreader.h +++ b/ext/xmlreader/php_xmlreader.h @@ -1,14 +1,12 @@ /* +----------------------------------------------------------------------+ - | Copyright (c) The PHP Group | + | Copyright © The PHP Group and Contributors. | +----------------------------------------------------------------------+ - | This source file is subject to version 3.01 of the PHP license, | - | that is bundled with this package in the file LICENSE, and is | - | available through the world-wide-web at the following url: | - | https://www.php.net/license/3_01.txt | - | If you did not receive a copy of the PHP license and are unable to | - | obtain it through the world-wide-web, please send a note to | - | license@php.net so we can mail you a copy immediately. | + | This source file is subject to the Modified BSD License that is | + | bundled with this package in the file LICENSE, and is available | + | through the World Wide Web at . | + | | + | SPDX-License-Identifier: BSD-3-Clause | +----------------------------------------------------------------------+ | Author: Rob Richards | +----------------------------------------------------------------------+ @@ -46,9 +44,7 @@ typedef struct _xmlreader_object { zend_object std; } xmlreader_object; -static inline xmlreader_object *php_xmlreader_fetch_object(zend_object *obj) { - return (xmlreader_object *)((char*)(obj) - XtOffsetOf(xmlreader_object, std)); -} +#define php_xmlreader_fetch_object(obj) ZEND_CONTAINER_OF(obj, xmlreader_object, std) #define Z_XMLREADER_P(zv) php_xmlreader_fetch_object(Z_OBJ_P((zv))) diff --git a/ext/xmlreader/tests/012.phpt b/ext/xmlreader/tests/012.phpt index b10421d2624a..e00f37b82667 100644 --- a/ext/xmlreader/tests/012.phpt +++ b/ext/xmlreader/tests/012.phpt @@ -2,6 +2,10 @@ XMLReader: accessing empty and non existing attributes --EXTENSIONS-- xmlreader +--SKIPIF-- + --FILE-- . | + | | + | SPDX-License-Identifier: BSD-3-Clause | +----------------------------------------------------------------------+ | Author: Rob Richards | | Pierre-A. Joye | @@ -432,7 +430,7 @@ PHP_FUNCTION(xmlwriter_write_element) } /* }}} */ -/* {{{ Write full namesapced element tag - returns FALSE on error */ +/* {{{ Write full namespaced element tag - returns FALSE on error */ PHP_FUNCTION(xmlwriter_write_element_ns) { xmlTextWriterPtr ptr; @@ -1050,7 +1048,7 @@ PHP_FUNCTION(xmlwriter_flush) static PHP_MINIT_FUNCTION(xmlwriter) { memcpy(&xmlwriter_object_handlers, &std_object_handlers, sizeof(zend_object_handlers)); - xmlwriter_object_handlers.offset = XtOffsetOf(ze_xmlwriter_object, std); + xmlwriter_object_handlers.offset = offsetof(ze_xmlwriter_object, std); xmlwriter_object_handlers.dtor_obj = xmlwriter_object_dtor; xmlwriter_object_handlers.clone_obj = NULL; xmlwriter_class_entry_ce = register_class_XMLWriter(); diff --git a/ext/xmlwriter/php_xmlwriter.h b/ext/xmlwriter/php_xmlwriter.h index e9a4dcb2aa49..542c6e838c5e 100644 --- a/ext/xmlwriter/php_xmlwriter.h +++ b/ext/xmlwriter/php_xmlwriter.h @@ -1,14 +1,12 @@ /* +----------------------------------------------------------------------+ - | Copyright (c) The PHP Group | + | Copyright © The PHP Group and Contributors. | +----------------------------------------------------------------------+ - | This source file is subject to version 3.01 of the PHP license, | - | that is bundled with this package in the file LICENSE, and is | - | available through the world-wide-web at the following url: | - | https://www.php.net/license/3_01.txt | - | If you did not receive a copy of the PHP license and are unable to | - | obtain it through the world-wide-web, please send a note to | - | license@php.net so we can mail you a copy immediately. | + | This source file is subject to the Modified BSD License that is | + | bundled with this package in the file LICENSE, and is available | + | through the World Wide Web at . | + | | + | SPDX-License-Identifier: BSD-3-Clause | +----------------------------------------------------------------------+ | Author: Rob Richards | | Pierre-A. Joye | @@ -39,9 +37,7 @@ typedef struct _ze_xmlwriter_object { zend_object std; } ze_xmlwriter_object; -static inline ze_xmlwriter_object *php_xmlwriter_fetch_object(zend_object *obj) { - return (ze_xmlwriter_object *)((char*)(obj) - XtOffsetOf(ze_xmlwriter_object, std)); -} +#define php_xmlwriter_fetch_object(obj) ZEND_CONTAINER_OF(obj, ze_xmlwriter_object, std) #define Z_XMLWRITER_P(zv) php_xmlwriter_fetch_object(Z_OBJ_P((zv))) diff --git a/ext/xmlwriter/tests/bug39504.phpt b/ext/xmlwriter/tests/bug39504.phpt index 0cb509d37dd5..eafcd375da93 100644 --- a/ext/xmlwriter/tests/bug39504.phpt +++ b/ext/xmlwriter/tests/bug39504.phpt @@ -1,5 +1,5 @@ --TEST-- -Bug #39504 (xmlwriter_write_dtd_entity() creates Attlist tag, not enity) +Bug #39504 (xmlwriter_write_dtd_entity() creates Attlist tag, not entity) --EXTENSIONS-- xmlwriter --FILE-- diff --git a/ext/xsl/php_xsl.c b/ext/xsl/php_xsl.c index dec7eb501eb2..b87f9578b215 100644 --- a/ext/xsl/php_xsl.c +++ b/ext/xsl/php_xsl.c @@ -1,14 +1,12 @@ /* +----------------------------------------------------------------------+ - | Copyright (c) The PHP Group | + | Copyright © The PHP Group and Contributors. | +----------------------------------------------------------------------+ - | This source file is subject to version 3.01 of the PHP license, | - | that is bundled with this package in the file LICENSE, and is | - | available through the world-wide-web at the following url: | - | https://www.php.net/license/3_01.txt | - | If you did not receive a copy of the PHP license and are unable to | - | obtain it through the world-wide-web, please send a note to | - | license@php.net so we can mail you a copy immediately. | + | This source file is subject to the Modified BSD License that is | + | bundled with this package in the file LICENSE, and is available | + | through the World Wide Web at . | + | | + | SPDX-License-Identifier: BSD-3-Clause | +----------------------------------------------------------------------+ | Author: Christian Stocker | +----------------------------------------------------------------------+ @@ -144,6 +142,8 @@ zend_object *xsl_objects_new(zend_class_entry *class_type) } #endif +XSL_DEFINE_PROP_ACCESSOR(do_xinclude, "doXInclude", 0) +XSL_DEFINE_PROP_ACCESSOR(clone_document, "cloneDocument", 1) XSL_DEFINE_PROP_ACCESSOR(max_template_depth, "maxTemplateDepth", 2) XSL_DEFINE_PROP_ACCESSOR(max_template_vars, "maxTemplateVars", 3) @@ -266,7 +266,7 @@ static void xsl_libxslt_error_handler(void *ctx, const char *msg, ...) PHP_MINIT_FUNCTION(xsl) { memcpy(&xsl_object_handlers, &std_object_handlers, sizeof(zend_object_handlers)); - xsl_object_handlers.offset = XtOffsetOf(xsl_object, std); + xsl_object_handlers.offset = offsetof(xsl_object, std); xsl_object_handlers.clone_obj = NULL; xsl_object_handlers.free_obj = xsl_objects_free_storage; xsl_object_handlers.get_gc = xsl_objects_get_gc; @@ -323,7 +323,6 @@ PHP_MSHUTDOWN_FUNCTION(xsl) xsltUnregisterExtModuleFunction ((const xmlChar *) "function", (const xmlChar *) "http://php.net/xsl"); xsltSetGenericErrorFunc(NULL, NULL); - xsltCleanupGlobals(); return SUCCESS; } diff --git a/ext/xsl/php_xsl.h b/ext/xsl/php_xsl.h index 36bd9cc72844..9f75fbb86fee 100644 --- a/ext/xsl/php_xsl.h +++ b/ext/xsl/php_xsl.h @@ -1,16 +1,12 @@ /* +----------------------------------------------------------------------+ - | Copyright (c) The PHP Group | + | Copyright © The PHP Group and Contributors. | +----------------------------------------------------------------------+ - | This source file is subject to version 3.01 of the PHP license, | - | that is bundled with this package in the file LICENSE, and is | - | available through the world-wide-web at the following url: | - | https://www.php.net/license/3_01.txt | - | If you did not receive a copy of the PHP license and are unable to | - | obtain it through the world-wide-web, please send a note to | - | license@php.net so we can mail you a copy immediately. | - +----------------------------------------------------------------------+ - | Author: | + | This source file is subject to the Modified BSD License that is | + | bundled with this package in the file LICENSE, and is available | + | through the World Wide Web at . | + | | + | SPDX-License-Identifier: BSD-3-Clause | +----------------------------------------------------------------------+ */ @@ -64,9 +60,7 @@ typedef struct xsl_object { zend_object std; } xsl_object; -static inline xsl_object *php_xsl_fetch_object(zend_object *obj) { - return (xsl_object *)((char*)(obj) - XtOffsetOf(xsl_object, std)); -} +#define php_xsl_fetch_object(obj) ZEND_CONTAINER_OF(obj, xsl_object, std) #define Z_XSL_P(zv) php_xsl_fetch_object(Z_OBJ_P((zv))) @@ -79,6 +73,8 @@ void xsl_ext_function_object_php(xmlXPathParserContextPtr ctxt, int nargs); zval *xsl_prop_max_template_depth(zend_object *object); zval *xsl_prop_max_template_vars(zend_object *object); +zval *xsl_prop_do_xinclude(zend_object *object); +zval *xsl_prop_clone_document(zend_object *object); PHP_MINIT_FUNCTION(xsl); PHP_MSHUTDOWN_FUNCTION(xsl); diff --git a/ext/xsl/tests/gh21496.phpt b/ext/xsl/tests/gh21496.phpt new file mode 100644 index 000000000000..12ff202aed17 --- /dev/null +++ b/ext/xsl/tests/gh21496.phpt @@ -0,0 +1,33 @@ +--TEST-- +GH-21496 (UAF in dom_objects_free_storage when importing non-document node as stylesheet) +--EXTENSIONS-- +dom +xsl +simplexml +--CREDITS-- +YuanchengJiang +--FILE-- +loadXML(<< +XML); +$doc->documentElement->appendChild($comment); +unset($doc); +$proc = new XSLTProcessor(); +var_dump($proc->importStylesheet($comment)); +$sxe = simplexml_load_string(''); +$proc = new XSLTProcessor(); +$proc->importStylesheet($sxe); +?> +--EXPECTF-- +Warning: XSLTProcessor::importStylesheet(): compilation error: file %s line 1 element container in %s on line %d + +Warning: XSLTProcessor::importStylesheet(): xsltParseStylesheetProcess : document is not a stylesheet in %s on line %d +bool(false) + +Warning: XSLTProcessor::importStylesheet(): compilation error: element container in %s on line %d + +Warning: XSLTProcessor::importStylesheet(): xsltParseStylesheetProcess : document is not a stylesheet in %s on line %d + diff --git a/ext/xsl/tests/special_operations_with_properties.phpt b/ext/xsl/tests/special_operations_with_properties.phpt index b7904fad8d86..efd6765c34f7 100644 --- a/ext/xsl/tests/special_operations_with_properties.phpt +++ b/ext/xsl/tests/special_operations_with_properties.phpt @@ -29,11 +29,8 @@ echo "--- Unset cloneDocument ---\n"; $xslt = new XSLTProcessor; $xslt->registerPHPFunctions(); unset($xslt->cloneDocument); -try { - $xslt->importStylesheet($xsl); -} catch (Error $e) { - echo $e->getMessage(), "\n"; -} +$xslt->importStylesheet($xsl); +echo $xslt->transformToXml($xml); echo "--- Unset doXInclude ---\n"; @@ -41,11 +38,7 @@ $xslt = new XSLTProcessor; $xslt->registerPHPFunctions(); unset($xslt->doXInclude); $xslt->importStylesheet($xsl); -try { - echo $xslt->transformToXml($xml); -} catch (Error $e) { - echo $e->getMessage(), "\n"; -} +echo $xslt->transformToXml($xml); echo "--- Make properties references ---\n"; @@ -59,9 +52,13 @@ echo $xslt->transformToXml($xml); ?> --EXPECT-- --- Unset cloneDocument --- -Typed property XSLTProcessor::$cloneDocument must not be accessed before initialization +Called test + +hello --- Unset doXInclude --- -Typed property XSLTProcessor::$doXInclude must not be accessed before initialization +Called test + +hello --- Make properties references --- Called test diff --git a/ext/xsl/xsltprocessor.c b/ext/xsl/xsltprocessor.c index 1d073822b462..230c7bd39cc2 100644 --- a/ext/xsl/xsltprocessor.c +++ b/ext/xsl/xsltprocessor.c @@ -1,14 +1,12 @@ /* +----------------------------------------------------------------------+ - | Copyright (c) The PHP Group | + | Copyright © The PHP Group and Contributors. | +----------------------------------------------------------------------+ - | This source file is subject to version 3.01 of the PHP license, | - | that is bundled with this package in the file LICENSE, and is | - | available through the world-wide-web at the following url: | - | https://www.php.net/license/3_01.txt | - | If you did not receive a copy of the PHP license and are unable to | - | obtain it through the world-wide-web, please send a note to | - | license@php.net so we can mail you a copy immediately. | + | This source file is subject to the Modified BSD License that is | + | bundled with this package in the file LICENSE, and is available | + | through the World Wide Web at . | + | | + | SPDX-License-Identifier: BSD-3-Clause | +----------------------------------------------------------------------+ | Authors: Christian Stocker | | Rob Richards | @@ -167,18 +165,47 @@ PHP_METHOD(XSLTProcessor, importStylesheet) xsltStylesheetPtr sheetp; bool clone_docu = false; xmlNode *nodep = NULL; - zval *cloneDocu, rv, clone_zv; - zend_string *member; + zval *cloneDocu, clone_zv, owner_zv; id = ZEND_THIS; if (zend_parse_parameters(ZEND_NUM_ARGS(), "o", &docp) == FAILURE) { RETURN_THROWS(); } + nodep = php_libxml_import_node(docp); + if (nodep == NULL) { + zend_argument_type_error(1, "must be a valid XML node"); + RETURN_THROWS(); + } + + if (Z_OBJ_HANDLER_P(docp, clone_obj) == NULL) { + zend_argument_type_error(1, "must be a cloneable node"); + RETURN_THROWS(); + } + + ZVAL_UNDEF(&owner_zv); + + /* For non-document nodes, resolve the ownerDocument and clone that + * instead as xsltParseStylesheetProcess may free nodes in the document. */ + if (nodep->type != XML_DOCUMENT_NODE && nodep->type != XML_HTML_DOCUMENT_NODE) { + if (nodep->doc == NULL) { + zend_argument_value_error(1, "must be part of a document"); + RETURN_THROWS(); + } + + /* See dom_import_simplexml_common */ + + dom_object *nodeobj = (dom_object *) ((char *) Z_OBJ_P(docp) - Z_OBJ_HT_P(docp)->offset); + + php_dom_create_object((xmlNodePtr) nodep->doc, &owner_zv, nodeobj); + docp = &owner_zv; + } + /* libxslt uses _private, so we must copy the imported * stylesheet document otherwise the node proxies will be a mess. * We will clone the object and detach the libxml internals later. */ zend_object *clone = Z_OBJ_HANDLER_P(docp, clone_obj)(Z_OBJ_P(docp)); + zval_ptr_dtor(&owner_zv); if (!clone) { RETURN_THROWS(); } @@ -186,15 +213,7 @@ PHP_METHOD(XSLTProcessor, importStylesheet) ZVAL_OBJ(&clone_zv, clone); nodep = php_libxml_import_node(&clone_zv); - if (nodep) { - newdoc = nodep->doc; - } - if (newdoc == NULL) { - OBJ_RELEASE(clone); - zend_argument_type_error(1, "must be a valid XML node"); - RETURN_THROWS(); - } - + newdoc = nodep->doc; php_libxml_node_object *clone_lxml_obj = Z_LIBXML_NODE_P(&clone_zv); PHP_LIBXML_SANITIZE_GLOBALS(parse); @@ -229,10 +248,8 @@ PHP_METHOD(XSLTProcessor, importStylesheet) intern->sheet_ref_obj->refcount++; OBJ_RELEASE(clone); - member = ZSTR_INIT_LITERAL("cloneDocument", 0); - cloneDocu = zend_std_read_property(Z_OBJ_P(id), member, BP_VAR_R, NULL, &rv); + cloneDocu = xsl_prop_clone_document(Z_OBJ_P(id)); clone_docu = zend_is_true(cloneDocu); - zend_string_release_ex(member, 0); if (!clone_docu) { /* Check if the stylesheet is using xsl:key, if yes, we have to clone the document _always_ before a transformation. * xsl:key elements may only occur at the top level. Furthermore, all elements at the top level must be in a @@ -272,8 +289,7 @@ static xmlDocPtr php_xsl_apply_stylesheet(zval *id, xsl_object *intern, xsltStyl xmlNodePtr node = NULL; xsltTransformContextPtr ctxt; php_libxml_node_object *object; - zval *doXInclude, rv; - zend_string *member; + zval *doXInclude; FILE *f; int secPrefsError = 0; xsltSecurityPrefsPtr secPrefs = NULL; @@ -329,10 +345,8 @@ static xmlDocPtr php_xsl_apply_stylesheet(zval *id, xsl_object *intern, xsltStyl } } - member = ZSTR_INIT_LITERAL("doXInclude", 0); - doXInclude = zend_std_read_property(Z_OBJ_P(id), member, BP_VAR_R, NULL, &rv); + doXInclude = xsl_prop_do_xinclude(Z_OBJ_P(id)); ctxt->xinclude = zend_is_true(doXInclude); - zend_string_release_ex(member, 0); zval *max_template_depth = xsl_prop_max_template_depth(Z_OBJ_P(id)); ZEND_ASSERT(Z_TYPE_P(max_template_depth) == IS_LONG); @@ -430,20 +444,18 @@ PHP_METHOD(XSLTProcessor, transformToDoc) if (newdocp) { if (ret_class) { - zend_string *curclass_name; - zend_class_entry *curce; php_libxml_node_object *interndoc; - curce = Z_OBJCE_P(docp); - curclass_name = curce->name; - while (curce->parent != NULL) { - curce = curce->parent; + const zend_class_entry *current_ce = Z_OBJCE_P(docp); + const zend_string *current_class_name = current_ce->name; + while (current_ce->parent != NULL) { + current_ce = current_ce->parent; } - if (!instanceof_function(ret_class, curce)) { + if (!instanceof_function(ret_class, current_ce)) { xmlFreeDoc(newdocp); zend_argument_type_error(2, "must be a class name compatible with %s, %s given", - ZSTR_VAL(curclass_name), ZSTR_VAL(ret_class->name) + ZSTR_VAL(current_class_name), ZSTR_VAL(ret_class->name) ); RETURN_THROWS(); } diff --git a/ext/zend_test/fiber.c b/ext/zend_test/fiber.c index 199d1b28b8cd..da6f4c962d85 100644 --- a/ext/zend_test/fiber.c +++ b/ext/zend_test/fiber.c @@ -1,14 +1,12 @@ /* +----------------------------------------------------------------------+ - | Copyright (c) The PHP Group | + | Copyright © The PHP Group and Contributors. | +----------------------------------------------------------------------+ - | This source file is subject to version 3.01 of the PHP license, | - | that is bundled with this package in the file LICENSE, and is | - | available through the world-wide-web at the following url: | - | https://www.php.net/license/3_01.txt | - | If you did not receive a copy of the PHP license and are unable to | - | obtain it through the world-wide-web, please send a note to | - | license@php.net so we can mail you a copy immediately. | + | This source file is subject to the Modified BSD License that is | + | bundled with this package in the file LICENSE, and is available | + | through the World Wide Web at . | + | | + | SPDX-License-Identifier: BSD-3-Clause | +----------------------------------------------------------------------+ | Authors: Aaron Piotrowski | +----------------------------------------------------------------------+ diff --git a/ext/zend_test/fiber.h b/ext/zend_test/fiber.h index ad5a4c7b3342..801d0a78af16 100644 --- a/ext/zend_test/fiber.h +++ b/ext/zend_test/fiber.h @@ -1,14 +1,12 @@ /* +----------------------------------------------------------------------+ - | Copyright (c) The PHP Group | + | Copyright © The PHP Group and Contributors. | +----------------------------------------------------------------------+ - | This source file is subject to version 3.01 of the PHP license, | - | that is bundled with this package in the file LICENSE, and is | - | available through the world-wide-web at the following url: | - | https://www.php.net/license/3_01.txt | - | If you did not receive a copy of the PHP license and are unable to | - | obtain it through the world-wide-web, please send a note to | - | license@php.net so we can mail you a copy immediately. | + | This source file is subject to the Modified BSD License that is | + | bundled with this package in the file LICENSE, and is available | + | through the World Wide Web at . | + | | + | SPDX-License-Identifier: BSD-3-Clause | +----------------------------------------------------------------------+ | Authors: Aaron Piotrowski | +----------------------------------------------------------------------+ diff --git a/ext/zend_test/iterators.c b/ext/zend_test/iterators.c index 47ea017d892a..0171a91708e9 100644 --- a/ext/zend_test/iterators.c +++ b/ext/zend_test/iterators.c @@ -1,14 +1,12 @@ /* +----------------------------------------------------------------------+ - | Copyright (c) The PHP Group | + | Copyright © The PHP Group and Contributors. | +----------------------------------------------------------------------+ - | This source file is subject to version 3.01 of the PHP license, | - | that is bundled with this package in the file LICENSE, and is | - | available through the world-wide-web at the following url: | - | https://www.php.net/license/3_01.txt | - | If you did not receive a copy of the PHP license and are unable to | - | obtain it through the world-wide-web, please send a note to | - | license@php.net so we can mail you a copy immediately. | + | This source file is subject to the Modified BSD License that is | + | bundled with this package in the file LICENSE, and is available | + | through the World Wide Web at . | + | | + | SPDX-License-Identifier: BSD-3-Clause | +----------------------------------------------------------------------+ */ diff --git a/ext/zend_test/iterators.h b/ext/zend_test/iterators.h index cef09109e239..070259094da8 100644 --- a/ext/zend_test/iterators.h +++ b/ext/zend_test/iterators.h @@ -1,14 +1,12 @@ /* +----------------------------------------------------------------------+ - | Copyright (c) The PHP Group | + | Copyright © The PHP Group and Contributors. | +----------------------------------------------------------------------+ - | This source file is subject to version 3.01 of the PHP license, | - | that is bundled with this package in the file LICENSE, and is | - | available through the world-wide-web at the following url: | - | https://www.php.net/license/3_01.txt | - | If you did not receive a copy of the PHP license and are unable to | - | obtain it through the world-wide-web, please send a note to | - | license@php.net so we can mail you a copy immediately. | + | This source file is subject to the Modified BSD License that is | + | bundled with this package in the file LICENSE, and is available | + | through the World Wide Web at . | + | | + | SPDX-License-Identifier: BSD-3-Clause | +----------------------------------------------------------------------+ */ diff --git a/ext/zend_test/object_handlers.c b/ext/zend_test/object_handlers.c index 15e362605f8e..6b8bf4ab9912 100644 --- a/ext/zend_test/object_handlers.c +++ b/ext/zend_test/object_handlers.c @@ -1,14 +1,12 @@ /* +----------------------------------------------------------------------+ - | Copyright (c) The PHP Group | + | Copyright © The PHP Group and Contributors. | +----------------------------------------------------------------------+ - | This source file is subject to version 3.01 of the PHP license, | - | that is bundled with this package in the file LICENSE, and is | - | available through the world-wide-web at the following url: | - | https://www.php.net/license/3_01.txt | - | If you did not receive a copy of the PHP license and are unable to | - | obtain it through the world-wide-web, please send a note to | - | license@php.net so we can mail you a copy immediately. | + | This source file is subject to the Modified BSD License that is | + | bundled with this package in the file LICENSE, and is available | + | through the World Wide Web at . | + | | + | SPDX-License-Identifier: BSD-3-Clause | +----------------------------------------------------------------------+ | Authors: George Peter Banyard | +----------------------------------------------------------------------+ @@ -232,6 +230,44 @@ ZEND_METHOD(NumericCastableNoOperations, __construct) ZVAL_COPY(OBJ_PROP_NUM(Z_OBJ_P(ZEND_THIS), 0), n); } +static zend_class_entry *vm_interrupt_comparable_ce; +static zend_object_handlers vm_interrupt_comparable_object_handlers; + +static zend_object* vm_interrupt_comparable_object_create_ex(zend_class_entry* ce, zend_long l) { + zend_object *obj = zend_objects_new(ce); + object_properties_init(obj, ce); + obj->handlers = &vm_interrupt_comparable_object_handlers; + ZVAL_LONG(OBJ_PROP_NUM(obj, 0), l); + return obj; +} + +static zend_object *vm_interrupt_comparable_object_create(zend_class_entry *ce) +{ + return vm_interrupt_comparable_object_create_ex(ce, 0); +} + +static int vm_interrupt_comparable_compare(zval *op1, zval *op2) +{ + ZEND_COMPARE_OBJECTS_FALLBACK(op1, op2); + + zend_atomic_bool_store_ex(&EG(vm_interrupt), true); + + return ZEND_THREEWAY_COMPARE( + Z_LVAL_P(OBJ_PROP_NUM(Z_OBJ_P(op1), 0)), + Z_LVAL_P(OBJ_PROP_NUM(Z_OBJ_P(op2), 0))); +} + +ZEND_METHOD(VmInterruptComparable, __construct) +{ + zend_long l; + + ZEND_PARSE_PARAMETERS_START(1, 1) + Z_PARAM_LONG(l) + ZEND_PARSE_PARAMETERS_END(); + + ZVAL_LONG(OBJ_PROP_NUM(Z_OBJ_P(ZEND_THIS), 0), l); +} + static zend_class_entry *dimension_handlers_no_ArrayAccess_ce; static zend_object_handlers dimension_handlers_no_ArrayAccess_object_handlers; @@ -302,6 +338,11 @@ void zend_test_object_handlers_init(void) memcpy(&numeric_castable_no_operation_object_handlers, &std_object_handlers, sizeof(zend_object_handlers)); numeric_castable_no_operation_object_handlers.cast_object = numeric_castable_no_operation_cast_object; + vm_interrupt_comparable_ce = register_class_VmInterruptComparable(); + vm_interrupt_comparable_ce->create_object = vm_interrupt_comparable_object_create; + memcpy(&vm_interrupt_comparable_object_handlers, &std_object_handlers, sizeof(zend_object_handlers)); + vm_interrupt_comparable_object_handlers.compare = vm_interrupt_comparable_compare; + dimension_handlers_no_ArrayAccess_ce = register_class_DimensionHandlersNoArrayAccess(); dimension_handlers_no_ArrayAccess_ce->create_object = dimension_handlers_no_ArrayAccess_object_create; memcpy(&dimension_handlers_no_ArrayAccess_object_handlers, &std_object_handlers, sizeof(zend_object_handlers)); diff --git a/ext/zend_test/object_handlers.h b/ext/zend_test/object_handlers.h index 528e047360f9..fa188d923667 100644 --- a/ext/zend_test/object_handlers.h +++ b/ext/zend_test/object_handlers.h @@ -1,14 +1,12 @@ /* +----------------------------------------------------------------------+ - | Copyright (c) The PHP Group | + | Copyright © The PHP Group and Contributors. | +----------------------------------------------------------------------+ - | This source file is subject to version 3.01 of the PHP license, | - | that is bundled with this package in the file LICENSE, and is | - | available through the world-wide-web at the following url: | - | https://www.php.net/license/3_01.txt | - | If you did not receive a copy of the PHP license and are unable to | - | obtain it through the world-wide-web, please send a note to | - | license@php.net so we can mail you a copy immediately. | + | This source file is subject to the Modified BSD License that is | + | bundled with this package in the file LICENSE, and is available | + | through the World Wide Web at . | + | | + | SPDX-License-Identifier: BSD-3-Clause | +----------------------------------------------------------------------+ | Authors: George Peter Banyard | +----------------------------------------------------------------------+ diff --git a/ext/zend_test/object_handlers.stub.php b/ext/zend_test/object_handlers.stub.php index a474908b1095..8c8e7f9bfe9b 100644 --- a/ext/zend_test/object_handlers.stub.php +++ b/ext/zend_test/object_handlers.stub.php @@ -23,6 +23,11 @@ final class NumericCastableNoOperations { public function __construct(int|float $val) {} } +final class VmInterruptComparable { + private int $val; + public function __construct(int $val) {} +} + class DimensionHandlersNoArrayAccess { public bool $read = false; public bool $write = false; diff --git a/ext/zend_test/object_handlers_arginfo.h b/ext/zend_test/object_handlers_arginfo.h index 34008c33bc0c..995bd62dc478 100644 --- a/ext/zend_test/object_handlers_arginfo.h +++ b/ext/zend_test/object_handlers_arginfo.h @@ -1,5 +1,5 @@ /* This is a generated file, edit object_handlers.stub.php instead. - * Stub hash: 81be60f2c465ffe5c036739d072ab80d9c388907 */ + * Stub hash: 1a70ed60c5af38539b1222a979f97fddf7d1826e */ ZEND_BEGIN_ARG_INFO_EX(arginfo_class_DoOperationNoCast___construct, 0, 0, 1) ZEND_ARG_TYPE_INFO(0, val, IS_LONG, 0) @@ -15,10 +15,13 @@ ZEND_BEGIN_ARG_INFO_EX(arginfo_class_NumericCastableNoOperations___construct, 0, ZEND_ARG_TYPE_MASK(0, val, MAY_BE_LONG|MAY_BE_DOUBLE, NULL) ZEND_END_ARG_INFO() +#define arginfo_class_VmInterruptComparable___construct arginfo_class_DoOperationNoCast___construct + static ZEND_METHOD(DoOperationNoCast, __construct); static ZEND_METHOD(LongCastableNoOperations, __construct); static ZEND_METHOD(FloatCastableNoOperations, __construct); static ZEND_METHOD(NumericCastableNoOperations, __construct); +static ZEND_METHOD(VmInterruptComparable, __construct); static const zend_function_entry class_DoOperationNoCast_methods[] = { ZEND_ME(DoOperationNoCast, __construct, arginfo_class_DoOperationNoCast___construct, ZEND_ACC_PUBLIC) @@ -40,6 +43,11 @@ static const zend_function_entry class_NumericCastableNoOperations_methods[] = { ZEND_FE_END }; +static const zend_function_entry class_VmInterruptComparable_methods[] = { + ZEND_ME(VmInterruptComparable, __construct, arginfo_class_VmInterruptComparable___construct, ZEND_ACC_PUBLIC) + ZEND_FE_END +}; + static zend_class_entry *register_class_DoOperationNoCast(void) { zend_class_entry ce, *class_entry; @@ -104,6 +112,22 @@ static zend_class_entry *register_class_NumericCastableNoOperations(void) return class_entry; } +static zend_class_entry *register_class_VmInterruptComparable(void) +{ + zend_class_entry ce, *class_entry; + + INIT_CLASS_ENTRY(ce, "VmInterruptComparable", class_VmInterruptComparable_methods); + class_entry = zend_register_internal_class_with_flags(&ce, NULL, ZEND_ACC_FINAL); + + zval property_val_default_value; + ZVAL_UNDEF(&property_val_default_value); + zend_string *property_val_name = zend_string_init("val", sizeof("val") - 1, true); + zend_declare_typed_property(class_entry, property_val_name, &property_val_default_value, ZEND_ACC_PRIVATE, NULL, (zend_type) ZEND_TYPE_INIT_MASK(MAY_BE_LONG)); + zend_string_release_ex(property_val_name, true); + + return class_entry; +} + static zend_class_entry *register_class_DimensionHandlersNoArrayAccess(void) { zend_class_entry ce, *class_entry; diff --git a/ext/zend_test/observer.c b/ext/zend_test/observer.c index 85c7d82da0e8..2fd4073b4af0 100644 --- a/ext/zend_test/observer.c +++ b/ext/zend_test/observer.c @@ -1,16 +1,12 @@ /* +----------------------------------------------------------------------+ - | Copyright (c) The PHP Group | + | Copyright © The PHP Group and Contributors. | +----------------------------------------------------------------------+ - | This source file is subject to version 3.01 of the PHP license, | - | that is bundled with this package in the file LICENSE, and is | - | available through the world-wide-web at the following url: | - | https://www.php.net/license/3_01.txt | - | If you did not receive a copy of the PHP license and are unable to | - | obtain it through the world-wide-web, please send a note to | - | license@php.net so we can mail you a copy immediately. | - +----------------------------------------------------------------------+ - | Author: | + | This source file is subject to the Modified BSD License that is | + | bundled with this package in the file LICENSE, and is available | + | through the World Wide Web at . | + | | + | SPDX-License-Identifier: BSD-3-Clause | +----------------------------------------------------------------------+ */ @@ -18,6 +14,7 @@ #include "php_test.h" #include "observer.h" #include "zend_observer.h" +#include "zend_extensions.h" #include "zend_smart_str.h" #include "ext/standard/php_var.h" #include "zend_generators.h" @@ -78,6 +75,10 @@ static void observer_begin(zend_execute_data *execute_data) { assert_observer_opline(execute_data); + if (ZT_G(observer_set_vm_interrupt_on_begin)) { + zend_atomic_bool_store_ex(&EG(vm_interrupt), true); + } + if (!ZT_G(observer_show_output)) { return; } @@ -146,6 +147,14 @@ static void observer_end(zend_execute_data *execute_data, zval *retval) } } +static void (*zend_test_prev_interrupt_function)(zend_execute_data *execute_data); +static void zend_test_interrupt_function(zend_execute_data *execute_data) +{ + if (zend_test_prev_interrupt_function) { + zend_test_prev_interrupt_function(execute_data); + } +} + static void observer_show_init(zend_function *fbc) { if (fbc->common.function_name) { @@ -334,7 +343,8 @@ static ZEND_INI_MH(zend_test_observer_OnUpdateCommaList) } if (stage != PHP_INI_STAGE_STARTUP && stage != PHP_INI_STAGE_ACTIVATE && stage != PHP_INI_STAGE_DEACTIVATE && stage != PHP_INI_STAGE_SHUTDOWN) { ZEND_HASH_FOREACH_STR_KEY(*p, funcname) { - if ((func = zend_hash_find_ptr(EG(function_table), funcname))) { + if ((func = zend_hash_find_ptr(EG(function_table), funcname)) + && RUN_TIME_CACHE(&func->common)) { void *old_handler; zend_observer_remove_begin_handler(func, observer_begin, (zend_observer_fcall_begin_handler *)&old_handler); zend_observer_remove_end_handler(func, observer_end, (zend_observer_fcall_end_handler *)&old_handler); @@ -357,7 +367,11 @@ static ZEND_INI_MH(zend_test_observer_OnUpdateCommaList) zend_string_release(str); if (stage != PHP_INI_STAGE_STARTUP && stage != PHP_INI_STAGE_ACTIVATE && stage != PHP_INI_STAGE_DEACTIVATE && stage != PHP_INI_STAGE_SHUTDOWN) { ZEND_HASH_FOREACH_STR_KEY(*p, funcname) { - if ((func = zend_hash_find_ptr(EG(function_table), funcname))) { + if ((func = zend_hash_find_ptr(EG(function_table), funcname)) + && RUN_TIME_CACHE(&func->common) && *ZEND_OBSERVER_DATA(func)) { + void *old_handler; + zend_observer_remove_begin_handler(func, observer_begin, (zend_observer_fcall_begin_handler *)&old_handler); + zend_observer_remove_end_handler(func, observer_end, (zend_observer_fcall_end_handler *)&old_handler); zend_observer_add_begin_handler(func, observer_begin); zend_observer_add_end_handler(func, observer_end); } @@ -380,10 +394,12 @@ PHP_INI_BEGIN() STD_PHP_INI_BOOLEAN("zend_test.observer.show_init_backtrace", "0", PHP_INI_SYSTEM, OnUpdateBool, observer_show_init_backtrace, zend_zend_test_globals, zend_test_globals) STD_PHP_INI_BOOLEAN("zend_test.observer.show_opcode", "0", PHP_INI_SYSTEM, OnUpdateBool, observer_show_opcode, zend_zend_test_globals, zend_test_globals) STD_PHP_INI_ENTRY("zend_test.observer.show_opcode_in_user_handler", "", PHP_INI_SYSTEM, OnUpdateString, observer_show_opcode_in_user_handler, zend_zend_test_globals, zend_test_globals) + STD_PHP_INI_BOOLEAN("zend_test.observer.set_vm_interrupt_on_begin", "0", PHP_INI_SYSTEM, OnUpdateBool, observer_set_vm_interrupt_on_begin, zend_zend_test_globals, zend_test_globals) STD_PHP_INI_BOOLEAN("zend_test.observer.fiber_init", "0", PHP_INI_SYSTEM, OnUpdateBool, observer_fiber_init, zend_zend_test_globals, zend_test_globals) STD_PHP_INI_BOOLEAN("zend_test.observer.fiber_switch", "0", PHP_INI_SYSTEM, OnUpdateBool, observer_fiber_switch, zend_zend_test_globals, zend_test_globals) STD_PHP_INI_BOOLEAN("zend_test.observer.fiber_destroy", "0", PHP_INI_SYSTEM, OnUpdateBool, observer_fiber_destroy, zend_zend_test_globals, zend_test_globals) STD_PHP_INI_BOOLEAN("zend_test.observer.execute_internal", "0", PHP_INI_SYSTEM, OnUpdateBool, observer_execute_internal, zend_zend_test_globals, zend_test_globals) + STD_PHP_INI_BOOLEAN("zend_test.observer.reserve_op_array_handle", "0", PHP_INI_SYSTEM, OnUpdateBool, observer_reserve_op_array_handle, zend_zend_test_globals, zend_test_globals) PHP_INI_END() void zend_test_observer_init(INIT_FUNC_ARGS) @@ -392,6 +408,9 @@ void zend_test_observer_init(INIT_FUNC_ARGS) if (type != MODULE_TEMPORARY) { REGISTER_INI_ENTRIES(); if (ZT_G(observer_enabled)) { + if (ZT_G(observer_reserve_op_array_handle)) { + zend_get_op_array_extension_handle("zend_test"); + } zend_observer_fcall_register(observer_fcall_init); } } else { @@ -417,10 +436,20 @@ void zend_test_observer_init(INIT_FUNC_ARGS) zend_test_prev_execute_internal = zend_execute_internal; zend_execute_internal = zend_test_execute_internal; } + + if (ZT_G(observer_set_vm_interrupt_on_begin)) { + zend_test_prev_interrupt_function = zend_interrupt_function; + zend_interrupt_function = zend_test_interrupt_function; + } } void zend_test_observer_shutdown(SHUTDOWN_FUNC_ARGS) { + if (zend_interrupt_function == zend_test_interrupt_function) { + zend_interrupt_function = zend_test_prev_interrupt_function; + zend_test_prev_interrupt_function = NULL; + } + if (type != MODULE_TEMPORARY) { UNREGISTER_INI_ENTRIES(); } diff --git a/ext/zend_test/observer.h b/ext/zend_test/observer.h index dd19fae2c527..28809a095cbe 100644 --- a/ext/zend_test/observer.h +++ b/ext/zend_test/observer.h @@ -1,16 +1,12 @@ /* +----------------------------------------------------------------------+ - | Copyright (c) The PHP Group | + | Copyright © The PHP Group and Contributors. | +----------------------------------------------------------------------+ - | This source file is subject to version 3.01 of the PHP license, | - | that is bundled with this package in the file LICENSE, and is | - | available through the world-wide-web at the following url: | - | https://www.php.net/license/3_01.txt | - | If you did not receive a copy of the PHP license and are unable to | - | obtain it through the world-wide-web, please send a note to | - | license@php.net so we can mail you a copy immediately. | - +----------------------------------------------------------------------+ - | Author: | + | This source file is subject to the Modified BSD License that is | + | bundled with this package in the file LICENSE, and is available | + | through the World Wide Web at . | + | | + | SPDX-License-Identifier: BSD-3-Clause | +----------------------------------------------------------------------+ */ diff --git a/ext/zend_test/php_test.h b/ext/zend_test/php_test.h index 7ec6f5431234..eb6ef6181c48 100644 --- a/ext/zend_test/php_test.h +++ b/ext/zend_test/php_test.h @@ -1,16 +1,12 @@ /* +----------------------------------------------------------------------+ - | Copyright (c) The PHP Group | + | Copyright © The PHP Group and Contributors. | +----------------------------------------------------------------------+ - | This source file is subject to version 3.01 of the PHP license, | - | that is bundled with this package in the file LICENSE, and is | - | available through the world-wide-web at the following url: | - | https://www.php.net/license/3_01.txt | - | If you did not receive a copy of the PHP license and are unable to | - | obtain it through the world-wide-web, please send a note to | - | license@php.net so we can mail you a copy immediately. | - +----------------------------------------------------------------------+ - | Author: | + | This source file is subject to the Modified BSD License that is | + | bundled with this package in the file LICENSE, and is available | + | through the World Wide Web at . | + | | + | SPDX-License-Identifier: BSD-3-Clause | +----------------------------------------------------------------------+ */ @@ -45,11 +41,13 @@ ZEND_BEGIN_MODULE_GLOBALS(zend_test) int observer_show_init_backtrace; int observer_show_opcode; char *observer_show_opcode_in_user_handler; + int observer_set_vm_interrupt_on_begin; int observer_nesting_depth; int observer_fiber_init; int observer_fiber_switch; int observer_fiber_destroy; int observer_execute_internal; + int observer_reserve_op_array_handle; HashTable *global_weakmap; int replace_zend_execute_ex; int register_passes; diff --git a/ext/zend_test/test.c b/ext/zend_test/test.c index 0faf65f36437..8cb3fe6cba01 100644 --- a/ext/zend_test/test.c +++ b/ext/zend_test/test.c @@ -1,16 +1,12 @@ /* +----------------------------------------------------------------------+ - | Copyright (c) The PHP Group | + | Copyright © The PHP Group and Contributors. | +----------------------------------------------------------------------+ - | This source file is subject to version 3.01 of the PHP license, | - | that is bundled with this package in the file LICENSE, and is | - | available through the world-wide-web at the following url: | - | https://www.php.net/license/3_01.txt | - | If you did not receive a copy of the PHP license and are unable to | - | obtain it through the world-wide-web, please send a note to | - | license@php.net so we can mail you a copy immediately. | - +----------------------------------------------------------------------+ - | Author: | + | This source file is subject to the Modified BSD License that is | + | bundled with this package in the file LICENSE, and is available | + | through the World Wide Web at . | + | | + | SPDX-License-Identifier: BSD-3-Clause | +----------------------------------------------------------------------+ */ @@ -69,6 +65,7 @@ static zend_class_entry *zend_test_forbid_dynamic_call; static zend_class_entry *zend_test_ns_foo_class; static zend_class_entry *zend_test_ns_unlikely_compile_error_class; static zend_class_entry *zend_test_ns_not_unlikely_compile_error_class; +static zend_class_entry *zend_test_ns_bar_class; static zend_class_entry *zend_test_ns2_foo_class; static zend_class_entry *zend_test_ns2_ns_foo_class; static zend_class_entry *zend_test_unit_enum; @@ -347,7 +344,7 @@ static ZEND_FUNCTION(zend_number_or_string) RETURN_DOUBLE(Z_DVAL_P(input)); case IS_STRING: RETURN_STR_COPY(Z_STR_P(input)); - EMPTY_SWITCH_DEFAULT_CASE(); + default: ZEND_UNREACHABLE(); } } @@ -371,7 +368,7 @@ static ZEND_FUNCTION(zend_number_or_string_or_null) RETURN_DOUBLE(Z_DVAL_P(input)); case IS_STRING: RETURN_STR_COPY(Z_STR_P(input)); - EMPTY_SWITCH_DEFAULT_CASE(); + default: ZEND_UNREACHABLE(); } } @@ -546,6 +543,79 @@ static ZEND_FUNCTION(zend_call_method_if_exists) } RETURN_NULL(); } + if (Z_TYPE_P(return_value) == IS_REFERENCE) { + zend_unwrap_reference(return_value); + } +} + +static ZEND_FUNCTION(zend_test_call_with_consumed_args) +{ + zend_fcall_info fci = empty_fcall_info; + zend_fcall_info_cache fcc = empty_fcall_info_cache; + zval *args; + zend_long consumed_args; + zval retval; + uint32_t actual_consumed_args = 0; + uint32_t i; + zend_result call_result; + + ZEND_PARSE_PARAMETERS_START(3, 3) + Z_PARAM_FUNC(fci, fcc) + Z_PARAM_ARRAY(args) + Z_PARAM_LONG(consumed_args) + ZEND_PARSE_PARAMETERS_END(); + + if (UNEXPECTED(consumed_args < 0 || consumed_args > UINT32_MAX)) { + zend_argument_value_error(3, "must be between 0 and 4294967295"); + RETURN_THROWS(); + } + + zend_fcall_info_args(&fci, args); + + ZVAL_UNDEF(&retval); + fci.retval = &retval; + fci.consumed_args = (uint32_t) consumed_args; + + call_result = zend_call_function(&fci, &fcc); + + for (i = 0; i < fci.param_count && i < 32; i++) { + if (Z_ISUNDEF(fci.params[i])) { + actual_consumed_args |= (1u << i); + } + } + + zend_fcall_info_args_clear(&fci, true); + + if (call_result == FAILURE || EG(exception)) { + if (!Z_ISUNDEF(retval)) { + zval_ptr_dtor(&retval); + } + RETURN_THROWS(); + } + + array_init(return_value); + add_assoc_long(return_value, "consumed_args", actual_consumed_args); + + if (Z_ISUNDEF(retval)) { + add_assoc_null(return_value, "retval"); + } else { + add_assoc_zval(return_value, "retval", &retval); + } +} + +static ZEND_FUNCTION(zend_test_refcount) +{ + zval *value; + + ZEND_PARSE_PARAMETERS_START(1, 1) + Z_PARAM_ZVAL(value) + ZEND_PARSE_PARAMETERS_END(); + + if (!Z_REFCOUNTED_P(value)) { + RETURN_LONG(-1); + } + + RETURN_LONG(Z_REFCOUNT_P(value)); } static ZEND_FUNCTION(zend_get_unit_enum) @@ -1047,7 +1117,7 @@ static zend_object *zend_test_class_new(zend_class_entry *class_type) static void zend_test_class_free_obj(zend_object *object) { - zend_test_object *intern = (zend_test_object*)((char*)object - XtOffsetOf(zend_test_object, std)); + zend_test_object *intern = ZEND_CONTAINER_OF(object, zend_test_object, std); if (intern->tmp_method) { zend_internal_function *func = intern->tmp_method; @@ -1062,7 +1132,7 @@ static void zend_test_class_free_obj(zend_object *object) static zend_function *zend_test_class_method_get(zend_object **object, zend_string *name, const zval *key) { - zend_test_object *intern = (zend_test_object*)((char*)(*object) - XtOffsetOf(zend_test_object, std)); + zend_test_object *intern = ZEND_CONTAINER_OF(*object, zend_test_object, std); if (zend_string_equals_literal_ci(name, "test")) { zend_internal_function *fptr; @@ -1529,7 +1599,7 @@ PHP_MINIT_FUNCTION(zend_test) zend_test_class_handlers.get_method = zend_test_class_method_get; zend_test_class_handlers.clone_obj = NULL; zend_test_class_handlers.free_obj = zend_test_class_free_obj; - zend_test_class_handlers.offset = XtOffsetOf(zend_test_object, std); + zend_test_class_handlers.offset = offsetof(zend_test_object, std); zend_test_gen_stub_flag_compatibility_test = register_class_ZendTestGenStubFlagCompatibilityTest(); @@ -1571,6 +1641,7 @@ PHP_MINIT_FUNCTION(zend_test) zend_test_ns_foo_class = register_class_ZendTestNS_Foo(); zend_test_ns_unlikely_compile_error_class = register_class_ZendTestNS_UnlikelyCompileError(); zend_test_ns_not_unlikely_compile_error_class = register_class_ZendTestNS_NotUnlikelyCompileError(); + zend_test_ns_bar_class = register_class_ZendTestNS_Bar(); zend_test_ns2_foo_class = register_class_ZendTestNS2_Foo(); zend_test_ns2_ns_foo_class = register_class_ZendTestNS2_ZendSubNS_Foo(); diff --git a/ext/zend_test/test.stub.php b/ext/zend_test/test.stub.php index 63f9650f7ef6..a4562368735e 100644 --- a/ext/zend_test/test.stub.php +++ b/ext/zend_test/test.stub.php @@ -3,7 +3,7 @@ /** * @generate-class-entries static * @generate-c-enums - * @generate-legacy-arginfo 80000 + * @generate-legacy-arginfo 70000 * @undocumentable */ namespace { @@ -57,6 +57,12 @@ class _ZendTestClass implements _ZendTestInterface { public static $_StaticProp; public static int $staticIntProp = 123; + /* If there's a problem with escapes in quotes in generated headers, + * the generated header won't compile. (tests/gh22169.phpt) */ + public static string $doubleQuoteEscaped = "BEGIN \n\r\t\v\e\f\\\$\"\101\x41\u{41} END"; + public static string $singleQuoteEscaped = 'BEGIN \n\r\t\v\e\f\\\$\"\101\x41\u{41} END'; + public static string $escapeInterpolated = "begin \$ \\$ end"; + public int $intProp = 123; public ?stdClass $classProp = null; public stdClass|Iterator|null $classUnionProp = null; @@ -187,7 +193,9 @@ class ZendTestClassWithPropertyAttribute { } final class ZendTestForbidDynamicCall { + /** @forbid-dynamic-calls */ public function call(): void {} + /** @forbid-dynamic-calls */ public static function callStatic(): void {} } @@ -303,6 +311,10 @@ function zend_object_init_with_constructor(string $class, mixed ...$args): mixed function zend_call_method_if_exists(object $obj, string $method, mixed ...$args): mixed {} + function zend_test_call_with_consumed_args(callable $cb, array $args, int $consumed_args): array {} + + function zend_test_refcount(mixed $value): int {} + function zend_test_zend_ini_parse_quantity(string $str): int {} function zend_test_zend_ini_parse_uquantity(string $str): int {} @@ -363,6 +375,8 @@ class Foo { public function method(): int {} } + interface Bar {} + class UnlikelyCompileError { /* This method signature would create a compile error due to the string * "ZendTestNS\UnlikelyCompileError" in the generated macro call */ @@ -378,11 +392,20 @@ public function method(): ?NotUnlikelyCompileError {} namespace ZendTestNS2 { + use ZendTestNS\Foo as FooAlias; + use ZendTestNS\UnlikelyCompileError; + use ZendTestNS\{NotUnlikelyCompileError}; + /** @var string */ const ZEND_CONSTANT_A = "namespaced"; class Foo { public ZendSubNS\Foo $foo; + public ZendSubNS\Foo&\ZendTestNS\Bar $intersectionProp; + public ZendSubNS\Foo|\ZendTestNS\Bar $unionProp; + public FooAlias $fooAlias; + public UnlikelyCompileError $unlProp; + public NotUnlikelyCompileError $notUnlProp; public function method(): void {} } diff --git a/ext/zend_test/test_arginfo.h b/ext/zend_test/test_arginfo.h index 6b5dfe9c2567..bd6548e7bffa 100644 --- a/ext/zend_test/test_arginfo.h +++ b/ext/zend_test/test_arginfo.h @@ -1,5 +1,5 @@ /* This is a generated file, edit test.stub.php instead. - * Stub hash: 0dc403dd439157aa09ae0692b295092bdc59c1d0 + * Stub hash: 8ca2fc33013d5a1c325bf5f0090cc6416a242297 * Has decl header: yes */ ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_zend_trigger_bailout, 0, 0, IS_NEVER, 0) @@ -123,6 +123,16 @@ ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_zend_call_method_if_exists, 0, 2 ZEND_ARG_VARIADIC_TYPE_INFO(0, args, IS_MIXED, 0) ZEND_END_ARG_INFO() +ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_zend_test_call_with_consumed_args, 0, 3, IS_ARRAY, 0) + ZEND_ARG_TYPE_INFO(0, cb, IS_CALLABLE, 0) + ZEND_ARG_TYPE_INFO(0, args, IS_ARRAY, 0) + ZEND_ARG_TYPE_INFO(0, consumed_args, IS_LONG, 0) +ZEND_END_ARG_INFO() + +ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_zend_test_refcount, 0, 1, IS_LONG, 0) + ZEND_ARG_TYPE_INFO(0, value, IS_MIXED, 0) +ZEND_END_ARG_INFO() + ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_zend_test_zend_ini_parse_quantity, 0, 1, IS_LONG, 0) ZEND_ARG_TYPE_INFO(0, str, IS_STRING, 0) ZEND_END_ARG_INFO() @@ -316,6 +326,8 @@ static ZEND_FUNCTION(zend_get_current_func_name); static ZEND_FUNCTION(zend_call_method); static ZEND_FUNCTION(zend_object_init_with_constructor); static ZEND_FUNCTION(zend_call_method_if_exists); +static ZEND_FUNCTION(zend_test_call_with_consumed_args); +static ZEND_FUNCTION(zend_test_refcount); static ZEND_FUNCTION(zend_test_zend_ini_parse_quantity); static ZEND_FUNCTION(zend_test_zend_ini_parse_uquantity); static ZEND_FUNCTION(zend_test_zend_ini_str); @@ -448,6 +460,8 @@ static const zend_function_entry ext_functions[] = { ZEND_FE(zend_call_method, arginfo_zend_call_method) ZEND_FE(zend_object_init_with_constructor, arginfo_zend_object_init_with_constructor) ZEND_FE(zend_call_method_if_exists, arginfo_zend_call_method_if_exists) + ZEND_FE(zend_test_call_with_consumed_args, arginfo_zend_test_call_with_consumed_args) + ZEND_FE(zend_test_refcount, arginfo_zend_test_refcount) ZEND_FE(zend_test_zend_ini_parse_quantity, arginfo_zend_test_zend_ini_parse_quantity) ZEND_FE(zend_test_zend_ini_parse_uquantity, arginfo_zend_test_zend_ini_parse_uquantity) ZEND_FE(zend_test_zend_ini_str, arginfo_zend_test_zend_ini_str) @@ -590,8 +604,16 @@ static const zend_function_entry class_ZendTestChildClassWithMethodWithParameter }; static const zend_function_entry class_ZendTestForbidDynamicCall_methods[] = { +#if (PHP_VERSION_ID >= 80600) + ZEND_ME(ZendTestForbidDynamicCall, call, arginfo_class_ZendTestForbidDynamicCall_call, ZEND_FENTRY_FLAGS(ZEND_ACC_PUBLIC, ZEND_ACC2_FORBID_DYN_CALLS)) +#elif (PHP_VERSION_ID >= 80000) ZEND_ME(ZendTestForbidDynamicCall, call, arginfo_class_ZendTestForbidDynamicCall_call, ZEND_ACC_PUBLIC) +#endif +#if (PHP_VERSION_ID >= 80600) + ZEND_ME(ZendTestForbidDynamicCall, callStatic, arginfo_class_ZendTestForbidDynamicCall_callStatic, ZEND_FENTRY_FLAGS(ZEND_ACC_PUBLIC|ZEND_ACC_STATIC, ZEND_ACC2_FORBID_DYN_CALLS)) +#elif (PHP_VERSION_ID >= 80000) ZEND_ME(ZendTestForbidDynamicCall, callStatic, arginfo_class_ZendTestForbidDynamicCall_callStatic, ZEND_ACC_PUBLIC|ZEND_ACC_STATIC) +#endif ZEND_FE_END }; @@ -773,6 +795,27 @@ static zend_class_entry *register_class__ZendTestClass(zend_class_entry *class_e zend_declare_typed_property(class_entry, property_staticIntProp_name, &property_staticIntProp_default_value, ZEND_ACC_PUBLIC|ZEND_ACC_STATIC, NULL, (zend_type) ZEND_TYPE_INIT_MASK(MAY_BE_LONG)); zend_string_release_ex(property_staticIntProp_name, true); + zval property_doubleQuoteEscaped_default_value; + zend_string *property_doubleQuoteEscaped_default_value_str = zend_string_init("BEGIN \n\r\t\v\x1b\f\\$\"AAA END", strlen("BEGIN \n\r\t\v\x1b\f\\$\"AAA END"), 1); + ZVAL_STR(&property_doubleQuoteEscaped_default_value, property_doubleQuoteEscaped_default_value_str); + zend_string *property_doubleQuoteEscaped_name = zend_string_init("doubleQuoteEscaped", sizeof("doubleQuoteEscaped") - 1, true); + zend_declare_typed_property(class_entry, property_doubleQuoteEscaped_name, &property_doubleQuoteEscaped_default_value, ZEND_ACC_PUBLIC|ZEND_ACC_STATIC, NULL, (zend_type) ZEND_TYPE_INIT_MASK(MAY_BE_STRING)); + zend_string_release_ex(property_doubleQuoteEscaped_name, true); + + zval property_singleQuoteEscaped_default_value; + zend_string *property_singleQuoteEscaped_default_value_str = zend_string_init("BEGIN \\n\\r\\t\\v\\e\\f\\\\\\\\$\\\"\\101\\x41\\u{41} END", strlen("BEGIN \\n\\r\\t\\v\\e\\f\\\\\\\\$\\\"\\101\\x41\\u{41} END"), 1); + ZVAL_STR(&property_singleQuoteEscaped_default_value, property_singleQuoteEscaped_default_value_str); + zend_string *property_singleQuoteEscaped_name = zend_string_init("singleQuoteEscaped", sizeof("singleQuoteEscaped") - 1, true); + zend_declare_typed_property(class_entry, property_singleQuoteEscaped_name, &property_singleQuoteEscaped_default_value, ZEND_ACC_PUBLIC|ZEND_ACC_STATIC, NULL, (zend_type) ZEND_TYPE_INIT_MASK(MAY_BE_STRING)); + zend_string_release_ex(property_singleQuoteEscaped_name, true); + + zval property_escapeInterpolated_default_value; + zend_string *property_escapeInterpolated_default_value_str = zend_string_init("begin $ \\$ end", strlen("begin $ \\$ end"), 1); + ZVAL_STR(&property_escapeInterpolated_default_value, property_escapeInterpolated_default_value_str); + zend_string *property_escapeInterpolated_name = zend_string_init("escapeInterpolated", sizeof("escapeInterpolated") - 1, true); + zend_declare_typed_property(class_entry, property_escapeInterpolated_name, &property_escapeInterpolated_default_value, ZEND_ACC_PUBLIC|ZEND_ACC_STATIC, NULL, (zend_type) ZEND_TYPE_INIT_MASK(MAY_BE_STRING)); + zend_string_release_ex(property_escapeInterpolated_name, true); + zval property_intProp_default_value; ZVAL_LONG(&property_intProp_default_value, 123); zend_string *property_intProp_name = zend_string_init("intProp", sizeof("intProp") - 1, true); @@ -1294,6 +1337,16 @@ static zend_class_entry *register_class_ZendTestNS_Foo(void) return class_entry; } +static zend_class_entry *register_class_ZendTestNS_Bar(void) +{ + zend_class_entry ce, *class_entry; + + INIT_NS_CLASS_ENTRY(ce, "ZendTestNS", "Bar", NULL); + class_entry = zend_register_internal_interface(&ce); + + return class_entry; +} + static zend_class_entry *register_class_ZendTestNS_UnlikelyCompileError(void) { zend_class_entry ce, *class_entry; @@ -1340,6 +1393,53 @@ static zend_class_entry *register_class_ZendTestNS2_Foo(void) zend_declare_typed_property(class_entry, property_foo_name, &property_foo_default_value, ZEND_ACC_PUBLIC, NULL, (zend_type) ZEND_TYPE_INIT_CLASS(property_foo_class_ZendTestNS2_ZendSubNS_Foo, 0, 0)); zend_string_release_ex(property_foo_name, true); + zval property_intersectionProp_default_value; + ZVAL_UNDEF(&property_intersectionProp_default_value); + zend_string *property_intersectionProp_name = zend_string_init("intersectionProp", sizeof("intersectionProp") - 1, true); + zend_string *property_intersectionProp_class_ZendTestNS2_ZendSubNS_Foo = zend_string_init("ZendTestNS2\\ZendSubNS\\Foo", sizeof("ZendTestNS2\\ZendSubNS\\Foo") - 1, 1); + zend_string *property_intersectionProp_class_ZendTestNS_Bar = zend_string_init("ZendTestNS\\Bar", sizeof("ZendTestNS\\Bar") - 1, 1); + zend_type_list *property_intersectionProp_type_list = malloc(ZEND_TYPE_LIST_SIZE(2)); + property_intersectionProp_type_list->num_types = 2; + property_intersectionProp_type_list->types[0] = (zend_type) ZEND_TYPE_INIT_CLASS(property_intersectionProp_class_ZendTestNS2_ZendSubNS_Foo, 0, 0); + property_intersectionProp_type_list->types[1] = (zend_type) ZEND_TYPE_INIT_CLASS(property_intersectionProp_class_ZendTestNS_Bar, 0, 0); + zend_type property_intersectionProp_type = ZEND_TYPE_INIT_INTERSECTION(property_intersectionProp_type_list, 0); + zend_declare_typed_property(class_entry, property_intersectionProp_name, &property_intersectionProp_default_value, ZEND_ACC_PUBLIC, NULL, property_intersectionProp_type); + zend_string_release_ex(property_intersectionProp_name, true); + + zval property_unionProp_default_value; + ZVAL_UNDEF(&property_unionProp_default_value); + zend_string *property_unionProp_name = zend_string_init("unionProp", sizeof("unionProp") - 1, true); + zend_string *property_unionProp_class_ZendTestNS2_ZendSubNS_Foo = zend_string_init("ZendTestNS2\\ZendSubNS\\Foo", sizeof("ZendTestNS2\\ZendSubNS\\Foo") - 1, 1); + zend_string *property_unionProp_class_ZendTestNS_Bar = zend_string_init("ZendTestNS\\Bar", sizeof("ZendTestNS\\Bar") - 1, 1); + zend_type_list *property_unionProp_type_list = malloc(ZEND_TYPE_LIST_SIZE(2)); + property_unionProp_type_list->num_types = 2; + property_unionProp_type_list->types[0] = (zend_type) ZEND_TYPE_INIT_CLASS(property_unionProp_class_ZendTestNS2_ZendSubNS_Foo, 0, 0); + property_unionProp_type_list->types[1] = (zend_type) ZEND_TYPE_INIT_CLASS(property_unionProp_class_ZendTestNS_Bar, 0, 0); + zend_type property_unionProp_type = ZEND_TYPE_INIT_UNION(property_unionProp_type_list, 0); + zend_declare_typed_property(class_entry, property_unionProp_name, &property_unionProp_default_value, ZEND_ACC_PUBLIC, NULL, property_unionProp_type); + zend_string_release_ex(property_unionProp_name, true); + + zval property_fooAlias_default_value; + ZVAL_UNDEF(&property_fooAlias_default_value); + zend_string *property_fooAlias_name = zend_string_init("fooAlias", sizeof("fooAlias") - 1, true); + zend_string *property_fooAlias_class_ZendTestNS_Foo = zend_string_init("ZendTestNS\\Foo", sizeof("ZendTestNS\\Foo")-1, 1); + zend_declare_typed_property(class_entry, property_fooAlias_name, &property_fooAlias_default_value, ZEND_ACC_PUBLIC, NULL, (zend_type) ZEND_TYPE_INIT_CLASS(property_fooAlias_class_ZendTestNS_Foo, 0, 0)); + zend_string_release_ex(property_fooAlias_name, true); + + zval property_unlProp_default_value; + ZVAL_UNDEF(&property_unlProp_default_value); + zend_string *property_unlProp_name = zend_string_init("unlProp", sizeof("unlProp") - 1, true); + zend_string *property_unlProp_class_ZendTestNS_UnlikelyCompileError = zend_string_init("ZendTestNS\\\125nlikelyCompileError", sizeof("ZendTestNS\\\125nlikelyCompileError")-1, 1); + zend_declare_typed_property(class_entry, property_unlProp_name, &property_unlProp_default_value, ZEND_ACC_PUBLIC, NULL, (zend_type) ZEND_TYPE_INIT_CLASS(property_unlProp_class_ZendTestNS_UnlikelyCompileError, 0, 0)); + zend_string_release_ex(property_unlProp_name, true); + + zval property_notUnlProp_default_value; + ZVAL_UNDEF(&property_notUnlProp_default_value); + zend_string *property_notUnlProp_name = zend_string_init("notUnlProp", sizeof("notUnlProp") - 1, true); + zend_string *property_notUnlProp_class_ZendTestNS_NotUnlikelyCompileError = zend_string_init("ZendTestNS\\\116otUnlikelyCompileError", sizeof("ZendTestNS\\\116otUnlikelyCompileError")-1, 1); + zend_declare_typed_property(class_entry, property_notUnlProp_name, &property_notUnlProp_default_value, ZEND_ACC_PUBLIC, NULL, (zend_type) ZEND_TYPE_INIT_CLASS(property_notUnlProp_class_ZendTestNS_NotUnlikelyCompileError, 0, 0)); + zend_string_release_ex(property_notUnlProp_name, true); + return class_entry; } diff --git a/ext/zend_test/test_decl.h b/ext/zend_test/test_decl.h index a6254865a87a..2561000f4b60 100644 --- a/ext/zend_test/test_decl.h +++ b/ext/zend_test/test_decl.h @@ -1,8 +1,8 @@ /* This is a generated file, edit test.stub.php instead. - * Stub hash: 0dc403dd439157aa09ae0692b295092bdc59c1d0 */ + * Stub hash: 8ca2fc33013d5a1c325bf5f0090cc6416a242297 */ -#ifndef ZEND_TEST_DECL_0dc403dd439157aa09ae0692b295092bdc59c1d0_H -#define ZEND_TEST_DECL_0dc403dd439157aa09ae0692b295092bdc59c1d0_H +#ifndef ZEND_TEST_DECL_8ca2fc33013d5a1c325bf5f0090cc6416a242297_H +#define ZEND_TEST_DECL_8ca2fc33013d5a1c325bf5f0090cc6416a242297_H typedef enum zend_enum_ZendTestUnitEnum { ZEND_ENUM_ZendTestUnitEnum_Foo = 1, @@ -27,4 +27,4 @@ typedef enum zend_enum_ZendTestEnumWithInterface { ZEND_ENUM_ZendTestEnumWithInterface_Bar = 2, } zend_enum_ZendTestEnumWithInterface; -#endif /* ZEND_TEST_DECL_0dc403dd439157aa09ae0692b295092bdc59c1d0_H */ +#endif /* ZEND_TEST_DECL_8ca2fc33013d5a1c325bf5f0090cc6416a242297_H */ diff --git a/ext/zend_test/test_legacy_arginfo.h b/ext/zend_test/test_legacy_arginfo.h new file mode 100644 index 000000000000..a254a637e07d --- /dev/null +++ b/ext/zend_test/test_legacy_arginfo.h @@ -0,0 +1,1175 @@ +/* This is a generated file, edit test.stub.php instead. + * Stub hash: 8ca2fc33013d5a1c325bf5f0090cc6416a242297 + * Has decl header: yes */ + +ZEND_BEGIN_ARG_INFO_EX(arginfo_zend_trigger_bailout, 0, 0, 0) +ZEND_END_ARG_INFO() + +#define arginfo_zend_test_array_return arginfo_zend_trigger_bailout + +#define arginfo_zend_test_nullable_array_return arginfo_zend_trigger_bailout + +#define arginfo_zend_test_void_return arginfo_zend_trigger_bailout + +ZEND_BEGIN_ARG_INFO_EX(arginfo_zend_test_compile_string, 0, 0, 3) + ZEND_ARG_INFO(0, source_string) + ZEND_ARG_INFO(0, filename) + ZEND_ARG_INFO(0, position) +ZEND_END_ARG_INFO() + +ZEND_BEGIN_ARG_INFO_EX(arginfo_zend_test_deprecated, 0, 0, 0) + ZEND_ARG_INFO(0, arg) +ZEND_END_ARG_INFO() + +#define arginfo_zend_test_deprecated_attr arginfo_zend_trigger_bailout + +#define arginfo_zend_test_nodiscard arginfo_zend_trigger_bailout + +#define arginfo_zend_test_deprecated_nodiscard arginfo_zend_trigger_bailout + +#define arginfo_zend_test_aliased arginfo_zend_trigger_bailout + +#define arginfo_zend_test_deprecated_aliased arginfo_zend_trigger_bailout + +ZEND_BEGIN_ARG_INFO_EX(arginfo_zend_create_unterminated_string, 0, 0, 1) + ZEND_ARG_INFO(0, str) +ZEND_END_ARG_INFO() + +ZEND_BEGIN_ARG_INFO_EX(arginfo_zend_terminate_string, 0, 0, 1) + ZEND_ARG_INFO(1, str) +ZEND_END_ARG_INFO() + +ZEND_BEGIN_ARG_INFO_EX(arginfo_zend_leak_variable, 0, 0, 1) + ZEND_ARG_INFO(0, variable) +ZEND_END_ARG_INFO() + +ZEND_BEGIN_ARG_INFO_EX(arginfo_zend_leak_bytes, 0, 0, 0) + ZEND_ARG_INFO(0, bytes) +ZEND_END_ARG_INFO() + +#define arginfo_zend_delref arginfo_zend_leak_variable + +ZEND_BEGIN_ARG_INFO_EX(arginfo_zend_string_or_object, 0, 0, 1) + ZEND_ARG_INFO(0, param) +ZEND_END_ARG_INFO() + +#define arginfo_zend_string_or_object_or_null arginfo_zend_string_or_object + +#define arginfo_zend_string_or_stdclass arginfo_zend_string_or_object + +#define arginfo_zend_string_or_stdclass_or_null arginfo_zend_string_or_object + +#define arginfo_zend_number_or_string arginfo_zend_string_or_object + +#define arginfo_zend_number_or_string_or_null arginfo_zend_string_or_object + +ZEND_BEGIN_ARG_INFO_EX(arginfo_zend_iterable, 0, 0, 1) + ZEND_ARG_INFO(0, arg1) + ZEND_ARG_INFO(0, arg2) +ZEND_END_ARG_INFO() + +ZEND_BEGIN_ARG_INFO_EX(arginfo_zend_weakmap_attach, 0, 0, 2) + ZEND_ARG_INFO(0, object) + ZEND_ARG_INFO(0, value) +ZEND_END_ARG_INFO() + +ZEND_BEGIN_ARG_INFO_EX(arginfo_zend_weakmap_remove, 0, 0, 1) + ZEND_ARG_INFO(0, object) +ZEND_END_ARG_INFO() + +#define arginfo_zend_weakmap_dump arginfo_zend_trigger_bailout + +#define arginfo_zend_get_unit_enum arginfo_zend_trigger_bailout + +ZEND_BEGIN_ARG_INFO_EX(arginfo_zend_test_parameter_with_attribute, 0, 0, 1) + ZEND_ARG_INFO(0, parameter) +ZEND_END_ARG_INFO() + +#define arginfo_zend_test_attribute_with_named_argument arginfo_zend_trigger_bailout + +#define arginfo_zend_get_current_func_name arginfo_zend_trigger_bailout + +ZEND_BEGIN_ARG_INFO_EX(arginfo_zend_call_method, 0, 0, 2) + ZEND_ARG_INFO(0, obj_or_class) + ZEND_ARG_INFO(0, method) + ZEND_ARG_INFO(0, arg1) + ZEND_ARG_INFO(0, arg2) +ZEND_END_ARG_INFO() + +ZEND_BEGIN_ARG_INFO_EX(arginfo_zend_object_init_with_constructor, 0, 0, 1) + ZEND_ARG_INFO(0, class) + ZEND_ARG_VARIADIC_INFO(0, args) +ZEND_END_ARG_INFO() + +ZEND_BEGIN_ARG_INFO_EX(arginfo_zend_call_method_if_exists, 0, 0, 2) + ZEND_ARG_INFO(0, obj) + ZEND_ARG_INFO(0, method) + ZEND_ARG_VARIADIC_INFO(0, args) +ZEND_END_ARG_INFO() + +ZEND_BEGIN_ARG_INFO_EX(arginfo_zend_test_call_with_consumed_args, 0, 0, 3) + ZEND_ARG_INFO(0, cb) + ZEND_ARG_INFO(0, args) + ZEND_ARG_INFO(0, consumed_args) +ZEND_END_ARG_INFO() + +ZEND_BEGIN_ARG_INFO_EX(arginfo_zend_test_refcount, 0, 0, 1) + ZEND_ARG_INFO(0, value) +ZEND_END_ARG_INFO() + +#define arginfo_zend_test_zend_ini_parse_quantity arginfo_zend_create_unterminated_string + +#define arginfo_zend_test_zend_ini_parse_uquantity arginfo_zend_create_unterminated_string + +#define arginfo_zend_test_zend_ini_str arginfo_zend_trigger_bailout + +#define arginfo_zend_test_zstr_init_literal arginfo_zend_trigger_bailout + +#if defined(ZEND_CHECK_STACK_LIMIT) +ZEND_BEGIN_ARG_INFO_EX(arginfo_zend_test_zend_call_stack_get, 0, 0, 0) +ZEND_END_ARG_INFO() + +#define arginfo_zend_test_zend_call_stack_use_all arginfo_zend_test_zend_call_stack_get +#endif + +ZEND_BEGIN_ARG_INFO_EX(arginfo_zend_test_is_string_marked_as_valid_utf8, 0, 0, 1) + ZEND_ARG_INFO(0, string) +ZEND_END_ARG_INFO() + +#define arginfo_zend_get_map_ptr_last arginfo_zend_trigger_bailout + +ZEND_BEGIN_ARG_INFO_EX(arginfo_zend_test_crash, 0, 0, 0) + ZEND_ARG_INFO(0, message) +ZEND_END_ARG_INFO() + +ZEND_BEGIN_ARG_INFO_EX(arginfo_zend_test_fill_packed_array, 0, 0, 1) + ZEND_ARG_INFO(1, array) +ZEND_END_ARG_INFO() + +#define arginfo_zend_test_create_throwing_resource arginfo_zend_trigger_bailout + +#define arginfo_get_open_basedir arginfo_zend_trigger_bailout + +#if defined(HAVE_LIBXML) && !defined(PHP_WIN32) +ZEND_BEGIN_ARG_INFO_EX(arginfo_zend_test_override_libxml_global_state, 0, 0, 0) +ZEND_END_ARG_INFO() +#endif + +#define arginfo_zend_test_is_pcre_bundled arginfo_zend_trigger_bailout + +#if defined(PHP_WIN32) +ZEND_BEGIN_ARG_INFO_EX(arginfo_zend_test_set_fmode, 0, 0, 1) + ZEND_ARG_INFO(0, binary) +ZEND_END_ARG_INFO() +#endif + +ZEND_BEGIN_ARG_INFO_EX(arginfo_zend_test_cast_fread, 0, 0, 1) + ZEND_ARG_INFO(0, stream) +ZEND_END_ARG_INFO() + +ZEND_BEGIN_ARG_INFO_EX(arginfo_zend_test_is_zend_ptr, 0, 0, 1) + ZEND_ARG_INFO(0, addr) +ZEND_END_ARG_INFO() + +#define arginfo_zend_test_log_err_debug arginfo_zend_create_unterminated_string + +#define arginfo_zend_test_compile_to_ast arginfo_zend_create_unterminated_string + +#define arginfo_zend_test_gh18756 arginfo_zend_trigger_bailout + +#define arginfo_zend_test_opcache_preloading arginfo_zend_trigger_bailout + +ZEND_BEGIN_ARG_INFO_EX(arginfo_zend_test_uri_parser, 0, 0, 2) + ZEND_ARG_INFO(0, uri) + ZEND_ARG_INFO(0, parser) +ZEND_END_ARG_INFO() + +#define arginfo_zend_test_gh19792 arginfo_zend_trigger_bailout + +#define arginfo_ZendTestNS2_namespaced_func arginfo_zend_trigger_bailout + +#define arginfo_ZendTestNS2_namespaced_deprecated_func arginfo_zend_trigger_bailout + +#define arginfo_ZendTestNS2_namespaced_aliased_func arginfo_zend_trigger_bailout + +#define arginfo_ZendTestNS2_namespaced_deprecated_aliased_func arginfo_zend_trigger_bailout + +#define arginfo_ZendTestNS2_ZendSubNS_namespaced_func arginfo_zend_trigger_bailout + +#define arginfo_ZendTestNS2_ZendSubNS_namespaced_deprecated_func arginfo_zend_trigger_bailout + +#define arginfo_ZendTestNS2_ZendSubNS_namespaced_aliased_func arginfo_zend_trigger_bailout + +#define arginfo_ZendTestNS2_ZendSubNS_namespaced_deprecated_aliased_func arginfo_zend_trigger_bailout + +#define arginfo_class__ZendTestClass_is_object arginfo_zend_trigger_bailout + +#define arginfo_class__ZendTestClass___toString arginfo_zend_trigger_bailout + +#define arginfo_class__ZendTestClass_returnsStatic arginfo_zend_trigger_bailout + +#define arginfo_class__ZendTestClass_returnsThrowable arginfo_zend_trigger_bailout + +ZEND_BEGIN_ARG_INFO_EX(arginfo_class__ZendTestClass_variadicTest, 0, 0, 0) + ZEND_ARG_VARIADIC_INFO(0, elements) +ZEND_END_ARG_INFO() + +ZEND_BEGIN_ARG_INFO_EX(arginfo_class__ZendTestClass_takesUnionType, 0, 0, 1) + ZEND_ARG_INFO(0, arg) +ZEND_END_ARG_INFO() + +ZEND_BEGIN_ARG_INFO_EX(arginfo_class__ZendTestMagicCall___call, 0, 0, 2) + ZEND_ARG_INFO(0, name) + ZEND_ARG_INFO(0, args) +ZEND_END_ARG_INFO() + +#define arginfo_class__ZendTestMagicCallForward___call arginfo_class__ZendTestMagicCall___call + +#define arginfo_class__ZendTestChildClass_returnsThrowable arginfo_zend_trigger_bailout + +#define arginfo_class_ZendAttributeTest_testMethod arginfo_zend_trigger_bailout + +#define arginfo_class__ZendTestTrait_testMethod arginfo_zend_trigger_bailout + +#define arginfo_class_ZendTestAttributeWithArguments___construct arginfo_class__ZendTestClass_takesUnionType + +#define arginfo_class_ZendTestParameterAttribute___construct arginfo_zend_test_parameter_with_attribute + +#define arginfo_class_ZendTestPropertyAttribute___construct arginfo_zend_test_parameter_with_attribute + +#define arginfo_class_ZendTestClassWithMethodWithParameterAttribute_no_override arginfo_zend_test_parameter_with_attribute + +#define arginfo_class_ZendTestClassWithMethodWithParameterAttribute_override arginfo_zend_test_parameter_with_attribute + +#define arginfo_class_ZendTestChildClassWithMethodWithParameterAttribute_override arginfo_zend_test_parameter_with_attribute + +#define arginfo_class_ZendTestForbidDynamicCall_call arginfo_zend_trigger_bailout + +#define arginfo_class_ZendTestForbidDynamicCall_callStatic arginfo_zend_trigger_bailout + +ZEND_BEGIN_ARG_INFO_EX(arginfo_class_ZendTestNS_Foo_method, 0, 0, 0) +ZEND_END_ARG_INFO() + +#define arginfo_class_ZendTestNS_UnlikelyCompileError_method arginfo_zend_trigger_bailout + +#define arginfo_class_ZendTestNS_NotUnlikelyCompileError_method arginfo_zend_trigger_bailout + +#define arginfo_class_ZendTestNS2_Foo_method arginfo_zend_trigger_bailout + +#define arginfo_class_ZendTestNS2_ZendSubNS_Foo_method arginfo_zend_trigger_bailout + +static ZEND_FUNCTION(zend_trigger_bailout); +static ZEND_FUNCTION(zend_test_array_return); +static ZEND_FUNCTION(zend_test_nullable_array_return); +static ZEND_FUNCTION(zend_test_void_return); +static ZEND_FUNCTION(zend_test_compile_string); +static ZEND_FUNCTION(zend_test_deprecated); +static ZEND_FUNCTION(zend_test_deprecated_attr); +static ZEND_FUNCTION(zend_test_nodiscard); +static ZEND_FUNCTION(zend_test_deprecated_nodiscard); +static ZEND_FUNCTION(zend_create_unterminated_string); +static ZEND_FUNCTION(zend_terminate_string); +static ZEND_FUNCTION(zend_leak_variable); +static ZEND_FUNCTION(zend_leak_bytes); +static ZEND_FUNCTION(zend_delref); +static ZEND_FUNCTION(zend_string_or_object); +static ZEND_FUNCTION(zend_string_or_object_or_null); +static ZEND_FUNCTION(zend_string_or_stdclass); +static ZEND_FUNCTION(zend_string_or_stdclass_or_null); +static ZEND_FUNCTION(zend_number_or_string); +static ZEND_FUNCTION(zend_number_or_string_or_null); +static ZEND_FUNCTION(zend_iterable); +static ZEND_FUNCTION(zend_weakmap_attach); +static ZEND_FUNCTION(zend_weakmap_remove); +static ZEND_FUNCTION(zend_weakmap_dump); +static ZEND_FUNCTION(zend_get_unit_enum); +static ZEND_FUNCTION(zend_test_parameter_with_attribute); +static ZEND_FUNCTION(zend_test_attribute_with_named_argument); +static ZEND_FUNCTION(zend_get_current_func_name); +static ZEND_FUNCTION(zend_call_method); +static ZEND_FUNCTION(zend_object_init_with_constructor); +static ZEND_FUNCTION(zend_call_method_if_exists); +static ZEND_FUNCTION(zend_test_call_with_consumed_args); +static ZEND_FUNCTION(zend_test_refcount); +static ZEND_FUNCTION(zend_test_zend_ini_parse_quantity); +static ZEND_FUNCTION(zend_test_zend_ini_parse_uquantity); +static ZEND_FUNCTION(zend_test_zend_ini_str); +static ZEND_FUNCTION(zend_test_zstr_init_literal); +#if defined(ZEND_CHECK_STACK_LIMIT) +static ZEND_FUNCTION(zend_test_zend_call_stack_get); +static ZEND_FUNCTION(zend_test_zend_call_stack_use_all); +#endif +static ZEND_FUNCTION(zend_test_is_string_marked_as_valid_utf8); +static ZEND_FUNCTION(zend_get_map_ptr_last); +static ZEND_FUNCTION(zend_test_crash); +static ZEND_FUNCTION(zend_test_fill_packed_array); +static ZEND_FUNCTION(zend_test_create_throwing_resource); +static ZEND_FUNCTION(get_open_basedir); +#if defined(HAVE_LIBXML) && !defined(PHP_WIN32) +static ZEND_FUNCTION(zend_test_override_libxml_global_state); +#endif +static ZEND_FUNCTION(zend_test_is_pcre_bundled); +#if defined(PHP_WIN32) +static ZEND_FUNCTION(zend_test_set_fmode); +#endif +static ZEND_FUNCTION(zend_test_cast_fread); +static ZEND_FUNCTION(zend_test_is_zend_ptr); +static ZEND_FUNCTION(zend_test_log_err_debug); +static ZEND_FUNCTION(zend_test_compile_to_ast); +static ZEND_FUNCTION(zend_test_gh18756); +static ZEND_FUNCTION(zend_test_opcache_preloading); +static ZEND_FUNCTION(zend_test_uri_parser); +static ZEND_FUNCTION(zend_test_gh19792); +static ZEND_FUNCTION(ZendTestNS2_namespaced_func); +static ZEND_FUNCTION(ZendTestNS2_namespaced_deprecated_func); +static ZEND_FUNCTION(ZendTestNS2_ZendSubNS_namespaced_func); +static ZEND_FUNCTION(ZendTestNS2_ZendSubNS_namespaced_deprecated_func); +static ZEND_METHOD(_ZendTestClass, is_object); +static ZEND_METHOD(_ZendTestClass, __toString); +static ZEND_METHOD(_ZendTestClass, returnsStatic); +static ZEND_METHOD(_ZendTestClass, returnsThrowable); +static ZEND_METHOD(_ZendTestClass, variadicTest); +static ZEND_METHOD(_ZendTestClass, takesUnionType); +static ZEND_METHOD(_ZendTestMagicCall, __call); +static ZEND_METHOD(_ZendTestMagicCallForward, __call); +static ZEND_METHOD(_ZendTestChildClass, returnsThrowable); +static ZEND_METHOD(ZendAttributeTest, testMethod); +static ZEND_METHOD(_ZendTestTrait, testMethod); +static ZEND_METHOD(ZendTestAttributeWithArguments, __construct); +static ZEND_METHOD(ZendTestParameterAttribute, __construct); +static ZEND_METHOD(ZendTestPropertyAttribute, __construct); +static ZEND_METHOD(ZendTestClassWithMethodWithParameterAttribute, no_override); +static ZEND_METHOD(ZendTestClassWithMethodWithParameterAttribute, override); +static ZEND_METHOD(ZendTestChildClassWithMethodWithParameterAttribute, override); +static ZEND_METHOD(ZendTestForbidDynamicCall, call); +static ZEND_METHOD(ZendTestForbidDynamicCall, callStatic); +static ZEND_METHOD(ZendTestNS_Foo, method); +static ZEND_METHOD(ZendTestNS_UnlikelyCompileError, method); +static ZEND_METHOD(ZendTestNS_NotUnlikelyCompileError, method); +static ZEND_METHOD(ZendTestNS2_Foo, method); +static ZEND_METHOD(ZendTestNS2_ZendSubNS_Foo, method); + +static const zend_function_entry ext_functions[] = { + ZEND_FE(zend_trigger_bailout, arginfo_zend_trigger_bailout) + ZEND_FE(zend_test_array_return, arginfo_zend_test_array_return) + ZEND_FE(zend_test_nullable_array_return, arginfo_zend_test_nullable_array_return) + ZEND_FE(zend_test_void_return, arginfo_zend_test_void_return) + ZEND_FE(zend_test_compile_string, arginfo_zend_test_compile_string) +#if (PHP_VERSION_ID >= 80400) + ZEND_RAW_FENTRY("zend_test_deprecated", zif_zend_test_deprecated, arginfo_zend_test_deprecated, ZEND_ACC_DEPRECATED, NULL, NULL) +#else + ZEND_RAW_FENTRY("zend_test_deprecated", zif_zend_test_deprecated, arginfo_zend_test_deprecated, ZEND_ACC_DEPRECATED) +#endif + ZEND_FE(zend_test_deprecated_attr, arginfo_zend_test_deprecated_attr) + ZEND_FE(zend_test_nodiscard, arginfo_zend_test_nodiscard) + ZEND_FE(zend_test_deprecated_nodiscard, arginfo_zend_test_deprecated_nodiscard) +#if (PHP_VERSION_ID >= 80400) + ZEND_RAW_FENTRY("zend_test_aliased", zif_zend_test_void_return, arginfo_zend_test_aliased, 0, NULL, NULL) +#else + ZEND_RAW_FENTRY("zend_test_aliased", zif_zend_test_void_return, arginfo_zend_test_aliased, 0) +#endif +#if (PHP_VERSION_ID >= 80400) + ZEND_RAW_FENTRY("zend_test_deprecated_aliased", zif_zend_test_void_return, arginfo_zend_test_deprecated_aliased, ZEND_ACC_DEPRECATED, NULL, NULL) +#else + ZEND_RAW_FENTRY("zend_test_deprecated_aliased", zif_zend_test_void_return, arginfo_zend_test_deprecated_aliased, ZEND_ACC_DEPRECATED) +#endif + ZEND_FE(zend_create_unterminated_string, arginfo_zend_create_unterminated_string) + ZEND_FE(zend_terminate_string, arginfo_zend_terminate_string) + ZEND_FE(zend_leak_variable, arginfo_zend_leak_variable) + ZEND_FE(zend_leak_bytes, arginfo_zend_leak_bytes) + ZEND_FE(zend_delref, arginfo_zend_delref) + ZEND_FE(zend_string_or_object, arginfo_zend_string_or_object) + ZEND_FE(zend_string_or_object_or_null, arginfo_zend_string_or_object_or_null) + ZEND_FE(zend_string_or_stdclass, arginfo_zend_string_or_stdclass) + ZEND_FE(zend_string_or_stdclass_or_null, arginfo_zend_string_or_stdclass_or_null) + ZEND_FE(zend_number_or_string, arginfo_zend_number_or_string) + ZEND_FE(zend_number_or_string_or_null, arginfo_zend_number_or_string_or_null) + ZEND_FE(zend_iterable, arginfo_zend_iterable) + ZEND_FE(zend_weakmap_attach, arginfo_zend_weakmap_attach) + ZEND_FE(zend_weakmap_remove, arginfo_zend_weakmap_remove) + ZEND_FE(zend_weakmap_dump, arginfo_zend_weakmap_dump) + ZEND_FE(zend_get_unit_enum, arginfo_zend_get_unit_enum) + ZEND_FE(zend_test_parameter_with_attribute, arginfo_zend_test_parameter_with_attribute) + ZEND_FE(zend_test_attribute_with_named_argument, arginfo_zend_test_attribute_with_named_argument) + ZEND_FE(zend_get_current_func_name, arginfo_zend_get_current_func_name) + ZEND_FE(zend_call_method, arginfo_zend_call_method) + ZEND_FE(zend_object_init_with_constructor, arginfo_zend_object_init_with_constructor) + ZEND_FE(zend_call_method_if_exists, arginfo_zend_call_method_if_exists) + ZEND_FE(zend_test_call_with_consumed_args, arginfo_zend_test_call_with_consumed_args) + ZEND_FE(zend_test_refcount, arginfo_zend_test_refcount) + ZEND_FE(zend_test_zend_ini_parse_quantity, arginfo_zend_test_zend_ini_parse_quantity) + ZEND_FE(zend_test_zend_ini_parse_uquantity, arginfo_zend_test_zend_ini_parse_uquantity) + ZEND_FE(zend_test_zend_ini_str, arginfo_zend_test_zend_ini_str) + ZEND_FE(zend_test_zstr_init_literal, arginfo_zend_test_zstr_init_literal) +#if defined(ZEND_CHECK_STACK_LIMIT) + ZEND_FE(zend_test_zend_call_stack_get, arginfo_zend_test_zend_call_stack_get) + ZEND_FE(zend_test_zend_call_stack_use_all, arginfo_zend_test_zend_call_stack_use_all) +#endif + ZEND_FE(zend_test_is_string_marked_as_valid_utf8, arginfo_zend_test_is_string_marked_as_valid_utf8) + ZEND_FE(zend_get_map_ptr_last, arginfo_zend_get_map_ptr_last) + ZEND_FE(zend_test_crash, arginfo_zend_test_crash) + ZEND_FE(zend_test_fill_packed_array, arginfo_zend_test_fill_packed_array) + ZEND_FE(zend_test_create_throwing_resource, arginfo_zend_test_create_throwing_resource) + ZEND_FE(get_open_basedir, arginfo_get_open_basedir) +#if defined(HAVE_LIBXML) && !defined(PHP_WIN32) + ZEND_FE(zend_test_override_libxml_global_state, arginfo_zend_test_override_libxml_global_state) +#endif + ZEND_FE(zend_test_is_pcre_bundled, arginfo_zend_test_is_pcre_bundled) +#if defined(PHP_WIN32) + ZEND_FE(zend_test_set_fmode, arginfo_zend_test_set_fmode) +#endif + ZEND_FE(zend_test_cast_fread, arginfo_zend_test_cast_fread) + ZEND_FE(zend_test_is_zend_ptr, arginfo_zend_test_is_zend_ptr) + ZEND_FE(zend_test_log_err_debug, arginfo_zend_test_log_err_debug) + ZEND_FE(zend_test_compile_to_ast, arginfo_zend_test_compile_to_ast) + ZEND_FE(zend_test_gh18756, arginfo_zend_test_gh18756) + ZEND_FE(zend_test_opcache_preloading, arginfo_zend_test_opcache_preloading) + ZEND_FE(zend_test_uri_parser, arginfo_zend_test_uri_parser) + ZEND_FE(zend_test_gh19792, arginfo_zend_test_gh19792) +#if (PHP_VERSION_ID >= 80400) + ZEND_RAW_FENTRY(ZEND_NS_NAME("ZendTestNS2", "namespaced_func"), zif_ZendTestNS2_namespaced_func, arginfo_ZendTestNS2_namespaced_func, 0, NULL, NULL) +#else + ZEND_RAW_FENTRY(ZEND_NS_NAME("ZendTestNS2", "namespaced_func"), zif_ZendTestNS2_namespaced_func, arginfo_ZendTestNS2_namespaced_func, 0) +#endif +#if (PHP_VERSION_ID >= 80400) + ZEND_RAW_FENTRY(ZEND_NS_NAME("ZendTestNS2", "namespaced_deprecated_func"), zif_ZendTestNS2_namespaced_deprecated_func, arginfo_ZendTestNS2_namespaced_deprecated_func, ZEND_ACC_DEPRECATED, NULL, NULL) +#else + ZEND_RAW_FENTRY(ZEND_NS_NAME("ZendTestNS2", "namespaced_deprecated_func"), zif_ZendTestNS2_namespaced_deprecated_func, arginfo_ZendTestNS2_namespaced_deprecated_func, ZEND_ACC_DEPRECATED) +#endif +#if (PHP_VERSION_ID >= 80400) + ZEND_RAW_FENTRY(ZEND_NS_NAME("ZendTestNS2", "namespaced_aliased_func"), zif_zend_test_void_return, arginfo_ZendTestNS2_namespaced_aliased_func, 0, NULL, NULL) +#else + ZEND_RAW_FENTRY(ZEND_NS_NAME("ZendTestNS2", "namespaced_aliased_func"), zif_zend_test_void_return, arginfo_ZendTestNS2_namespaced_aliased_func, 0) +#endif +#if (PHP_VERSION_ID >= 80400) + ZEND_RAW_FENTRY(ZEND_NS_NAME("ZendTestNS2", "namespaced_deprecated_aliased_func"), zif_zend_test_void_return, arginfo_ZendTestNS2_namespaced_deprecated_aliased_func, ZEND_ACC_DEPRECATED, NULL, NULL) +#else + ZEND_RAW_FENTRY(ZEND_NS_NAME("ZendTestNS2", "namespaced_deprecated_aliased_func"), zif_zend_test_void_return, arginfo_ZendTestNS2_namespaced_deprecated_aliased_func, ZEND_ACC_DEPRECATED) +#endif +#if (PHP_VERSION_ID >= 80400) + ZEND_RAW_FENTRY(ZEND_NS_NAME("ZendTestNS2\\ZendSubNS", "namespaced_func"), zif_ZendTestNS2_ZendSubNS_namespaced_func, arginfo_ZendTestNS2_ZendSubNS_namespaced_func, 0, NULL, NULL) +#else + ZEND_RAW_FENTRY(ZEND_NS_NAME("ZendTestNS2\\ZendSubNS", "namespaced_func"), zif_ZendTestNS2_ZendSubNS_namespaced_func, arginfo_ZendTestNS2_ZendSubNS_namespaced_func, 0) +#endif +#if (PHP_VERSION_ID >= 80400) + ZEND_RAW_FENTRY(ZEND_NS_NAME("ZendTestNS2\\ZendSubNS", "namespaced_deprecated_func"), zif_ZendTestNS2_ZendSubNS_namespaced_deprecated_func, arginfo_ZendTestNS2_ZendSubNS_namespaced_deprecated_func, ZEND_ACC_DEPRECATED, NULL, NULL) +#else + ZEND_RAW_FENTRY(ZEND_NS_NAME("ZendTestNS2\\ZendSubNS", "namespaced_deprecated_func"), zif_ZendTestNS2_ZendSubNS_namespaced_deprecated_func, arginfo_ZendTestNS2_ZendSubNS_namespaced_deprecated_func, ZEND_ACC_DEPRECATED) +#endif +#if (PHP_VERSION_ID >= 80400) + ZEND_RAW_FENTRY(ZEND_NS_NAME("ZendTestNS2\\ZendSubNS", "namespaced_aliased_func"), zif_zend_test_void_return, arginfo_ZendTestNS2_ZendSubNS_namespaced_aliased_func, 0, NULL, NULL) +#else + ZEND_RAW_FENTRY(ZEND_NS_NAME("ZendTestNS2\\ZendSubNS", "namespaced_aliased_func"), zif_zend_test_void_return, arginfo_ZendTestNS2_ZendSubNS_namespaced_aliased_func, 0) +#endif +#if (PHP_VERSION_ID >= 80400) + ZEND_RAW_FENTRY(ZEND_NS_NAME("ZendTestNS2\\ZendSubNS", "namespaced_deprecated_aliased_func"), zif_zend_test_void_return, arginfo_ZendTestNS2_ZendSubNS_namespaced_deprecated_aliased_func, ZEND_ACC_DEPRECATED, NULL, NULL) +#else + ZEND_RAW_FENTRY(ZEND_NS_NAME("ZendTestNS2\\ZendSubNS", "namespaced_deprecated_aliased_func"), zif_zend_test_void_return, arginfo_ZendTestNS2_ZendSubNS_namespaced_deprecated_aliased_func, ZEND_ACC_DEPRECATED) +#endif + ZEND_FE_END +}; + +static const zend_function_entry class__ZendTestClass_methods[] = { + ZEND_ME(_ZendTestClass, is_object, arginfo_class__ZendTestClass_is_object, ZEND_ACC_PUBLIC|ZEND_ACC_STATIC) + ZEND_ME(_ZendTestClass, __toString, arginfo_class__ZendTestClass___toString, ZEND_ACC_PUBLIC|ZEND_ACC_DEPRECATED) + ZEND_ME(_ZendTestClass, returnsStatic, arginfo_class__ZendTestClass_returnsStatic, ZEND_ACC_PUBLIC) + ZEND_ME(_ZendTestClass, returnsThrowable, arginfo_class__ZendTestClass_returnsThrowable, ZEND_ACC_PUBLIC) + ZEND_ME(_ZendTestClass, variadicTest, arginfo_class__ZendTestClass_variadicTest, ZEND_ACC_PUBLIC|ZEND_ACC_STATIC) + ZEND_ME(_ZendTestClass, takesUnionType, arginfo_class__ZendTestClass_takesUnionType, ZEND_ACC_PUBLIC) + ZEND_FE_END +}; + +static const zend_function_entry class__ZendTestMagicCall_methods[] = { + ZEND_ME(_ZendTestMagicCall, __call, arginfo_class__ZendTestMagicCall___call, ZEND_ACC_PUBLIC) + ZEND_FE_END +}; + +static const zend_function_entry class__ZendTestMagicCallForward_methods[] = { + ZEND_ME(_ZendTestMagicCallForward, __call, arginfo_class__ZendTestMagicCallForward___call, ZEND_ACC_PUBLIC) + ZEND_FE_END +}; + +static const zend_function_entry class__ZendTestChildClass_methods[] = { + ZEND_ME(_ZendTestChildClass, returnsThrowable, arginfo_class__ZendTestChildClass_returnsThrowable, ZEND_ACC_PUBLIC) + ZEND_FE_END +}; + +static const zend_function_entry class_ZendAttributeTest_methods[] = { + ZEND_ME(ZendAttributeTest, testMethod, arginfo_class_ZendAttributeTest_testMethod, ZEND_ACC_PUBLIC) + ZEND_FE_END +}; + +static const zend_function_entry class__ZendTestTrait_methods[] = { + ZEND_ME(_ZendTestTrait, testMethod, arginfo_class__ZendTestTrait_testMethod, ZEND_ACC_PUBLIC) + ZEND_FE_END +}; + +static const zend_function_entry class_ZendTestAttributeWithArguments_methods[] = { + ZEND_ME(ZendTestAttributeWithArguments, __construct, arginfo_class_ZendTestAttributeWithArguments___construct, ZEND_ACC_PUBLIC) + ZEND_FE_END +}; + +static const zend_function_entry class_ZendTestParameterAttribute_methods[] = { + ZEND_ME(ZendTestParameterAttribute, __construct, arginfo_class_ZendTestParameterAttribute___construct, ZEND_ACC_PUBLIC) + ZEND_FE_END +}; + +static const zend_function_entry class_ZendTestPropertyAttribute_methods[] = { + ZEND_ME(ZendTestPropertyAttribute, __construct, arginfo_class_ZendTestPropertyAttribute___construct, ZEND_ACC_PUBLIC) + ZEND_FE_END +}; + +static const zend_function_entry class_ZendTestClassWithMethodWithParameterAttribute_methods[] = { + ZEND_ME(ZendTestClassWithMethodWithParameterAttribute, no_override, arginfo_class_ZendTestClassWithMethodWithParameterAttribute_no_override, ZEND_ACC_PUBLIC|ZEND_ACC_FINAL) + ZEND_ME(ZendTestClassWithMethodWithParameterAttribute, override, arginfo_class_ZendTestClassWithMethodWithParameterAttribute_override, ZEND_ACC_PUBLIC) + ZEND_FE_END +}; + +static const zend_function_entry class_ZendTestChildClassWithMethodWithParameterAttribute_methods[] = { + ZEND_ME(ZendTestChildClassWithMethodWithParameterAttribute, override, arginfo_class_ZendTestChildClassWithMethodWithParameterAttribute_override, ZEND_ACC_PUBLIC) + ZEND_FE_END +}; + +static const zend_function_entry class_ZendTestForbidDynamicCall_methods[] = { +#if (PHP_VERSION_ID >= 80600) + ZEND_ME(ZendTestForbidDynamicCall, call, arginfo_class_ZendTestForbidDynamicCall_call, ZEND_FENTRY_FLAGS(ZEND_ACC_PUBLIC, ZEND_ACC2_FORBID_DYN_CALLS)) +#elif (PHP_VERSION_ID >= 70000) + ZEND_ME(ZendTestForbidDynamicCall, call, arginfo_class_ZendTestForbidDynamicCall_call, ZEND_ACC_PUBLIC) +#endif +#if (PHP_VERSION_ID >= 80600) + ZEND_ME(ZendTestForbidDynamicCall, callStatic, arginfo_class_ZendTestForbidDynamicCall_callStatic, ZEND_FENTRY_FLAGS(ZEND_ACC_PUBLIC|ZEND_ACC_STATIC, ZEND_ACC2_FORBID_DYN_CALLS)) +#elif (PHP_VERSION_ID >= 70000) + ZEND_ME(ZendTestForbidDynamicCall, callStatic, arginfo_class_ZendTestForbidDynamicCall_callStatic, ZEND_ACC_PUBLIC|ZEND_ACC_STATIC) +#endif + ZEND_FE_END +}; + +static const zend_function_entry class_ZendTestNS_Foo_methods[] = { + ZEND_ME(ZendTestNS_Foo, method, arginfo_class_ZendTestNS_Foo_method, ZEND_ACC_PUBLIC) + ZEND_FE_END +}; + +static const zend_function_entry class_ZendTestNS_UnlikelyCompileError_methods[] = { + ZEND_ME(ZendTestNS_UnlikelyCompileError, method, arginfo_class_ZendTestNS_UnlikelyCompileError_method, ZEND_ACC_PUBLIC) + ZEND_FE_END +}; + +static const zend_function_entry class_ZendTestNS_NotUnlikelyCompileError_methods[] = { + ZEND_ME(ZendTestNS_NotUnlikelyCompileError, method, arginfo_class_ZendTestNS_NotUnlikelyCompileError_method, ZEND_ACC_PUBLIC) + ZEND_FE_END +}; + +static const zend_function_entry class_ZendTestNS2_Foo_methods[] = { + ZEND_ME(ZendTestNS2_Foo, method, arginfo_class_ZendTestNS2_Foo_method, ZEND_ACC_PUBLIC) + ZEND_FE_END +}; + +static const zend_function_entry class_ZendTestNS2_ZendSubNS_Foo_methods[] = { + ZEND_ME(ZendTestNS2_ZendSubNS_Foo, method, arginfo_class_ZendTestNS2_ZendSubNS_Foo_method, ZEND_ACC_PUBLIC) + ZEND_FE_END +}; + +static void register_test_symbols(int module_number) +{ + REGISTER_LONG_CONSTANT("ZEND_TEST_DEPRECATED", 42, CONST_PERSISTENT | CONST_CS); + REGISTER_STRING_CONSTANT("ZEND_CONSTANT_A", "global", CONST_PERSISTENT | CONST_CS); + REGISTER_LONG_CONSTANT("ZEND_TEST_ATTRIBUTED_CONSTANT", 42, CONST_PERSISTENT | CONST_CS); + REGISTER_STRING_CONSTANT("ZendTestNS2\\ZEND_CONSTANT_A", "namespaced", CONST_PERSISTENT | CONST_CS); + REGISTER_STRING_CONSTANT("ZendTestNS2\\ZendSubNS\\ZEND_CONSTANT_A", "namespaced", CONST_PERSISTENT | CONST_CS); +} + +static zend_class_entry *register_class__ZendTestInterface(void) +{ + zend_class_entry ce, *class_entry; + + INIT_CLASS_ENTRY(ce, "_ZendTestInterface", NULL); + class_entry = zend_register_internal_interface(&ce); + + zval const_DUMMY_value; + ZVAL_LONG(&const_DUMMY_value, 0); + zend_string *const_DUMMY_name = zend_string_init_interned("DUMMY", sizeof("DUMMY") - 1, true); + zend_string *const_DUMMY_comment = zend_string_init_interned("/**\n * \"Lorem ipsum\"\n * @see https://www.php.net\n * @since 8.2\n */", 98, 1); + zend_declare_class_constant_ex(class_entry, const_DUMMY_name, &const_DUMMY_value, ZEND_ACC_PUBLIC, const_DUMMY_comment); + zend_string_release_ex(const_DUMMY_name, true); + + return class_entry; +} + +static zend_class_entry *register_class__ZendTestClass(zend_class_entry *class_entry__ZendTestInterface) +{ + zend_class_entry ce, *class_entry; + + INIT_CLASS_ENTRY(ce, "_ZendTestClass", class__ZendTestClass_methods); +#if (PHP_VERSION_ID >= 80400) + class_entry = zend_register_internal_class_with_flags(&ce, NULL, 0); +#else + class_entry = zend_register_internal_class_ex(&ce, NULL); +#endif + zend_class_implements(class_entry, 1, class_entry__ZendTestInterface); + zend_register_class_alias("_ZendTestClassAlias", class_entry); + + zval const_TYPED_CLASS_CONST1_value; + ZVAL_EMPTY_ARRAY(&const_TYPED_CLASS_CONST1_value); + zend_string *const_TYPED_CLASS_CONST1_name = zend_string_init_interned("TYPED_CLASS_CONST1", sizeof("TYPED_CLASS_CONST1") - 1, true); + zend_declare_class_constant_ex(class_entry, const_TYPED_CLASS_CONST1_name, &const_TYPED_CLASS_CONST1_value, ZEND_ACC_PUBLIC, NULL); + zend_string_release_ex(const_TYPED_CLASS_CONST1_name, true); + + zval const_TYPED_CLASS_CONST2_value; + ZVAL_LONG(&const_TYPED_CLASS_CONST2_value, 42); + zend_string *const_TYPED_CLASS_CONST2_name = zend_string_init_interned("TYPED_CLASS_CONST2", sizeof("TYPED_CLASS_CONST2") - 1, true); + zend_declare_class_constant_ex(class_entry, const_TYPED_CLASS_CONST2_name, &const_TYPED_CLASS_CONST2_value, ZEND_ACC_PUBLIC, NULL); + zend_string_release_ex(const_TYPED_CLASS_CONST2_name, true); + + zval const_TYPED_CLASS_CONST3_value; + ZVAL_LONG(&const_TYPED_CLASS_CONST3_value, 1); + zend_string *const_TYPED_CLASS_CONST3_name = zend_string_init_interned("TYPED_CLASS_CONST3", sizeof("TYPED_CLASS_CONST3") - 1, true); + zend_declare_class_constant_ex(class_entry, const_TYPED_CLASS_CONST3_name, &const_TYPED_CLASS_CONST3_value, ZEND_ACC_PUBLIC, NULL); + zend_string_release_ex(const_TYPED_CLASS_CONST3_name, true); + + zval const_ZEND_TEST_DEPRECATED_value; + ZVAL_LONG(&const_ZEND_TEST_DEPRECATED_value, 42); + zend_string *const_ZEND_TEST_DEPRECATED_name = zend_string_init_interned("ZEND_TEST_DEPRECATED", sizeof("ZEND_TEST_DEPRECATED") - 1, true); + zend_declare_class_constant_ex(class_entry, const_ZEND_TEST_DEPRECATED_name, &const_ZEND_TEST_DEPRECATED_value, ZEND_ACC_PUBLIC, NULL); + zend_string_release_ex(const_ZEND_TEST_DEPRECATED_name, true); + + zval const_ZEND_TEST_DEPRECATED_ATTR_value; + ZVAL_LONG(&const_ZEND_TEST_DEPRECATED_ATTR_value, 42); + zend_string *const_ZEND_TEST_DEPRECATED_ATTR_name = zend_string_init_interned("ZEND_TEST_DEPRECATED_ATTR", sizeof("ZEND_TEST_DEPRECATED_ATTR") - 1, true); + zend_declare_class_constant_ex(class_entry, const_ZEND_TEST_DEPRECATED_ATTR_name, &const_ZEND_TEST_DEPRECATED_ATTR_value, ZEND_ACC_PUBLIC, NULL); + zend_string_release_ex(const_ZEND_TEST_DEPRECATED_ATTR_name, true); + + zval property__StaticProp_default_value; + ZVAL_NULL(&property__StaticProp_default_value); + zend_string *property__StaticProp_name = zend_string_init("_StaticProp", sizeof("_StaticProp") - 1, true); + zend_declare_property_ex(class_entry, property__StaticProp_name, &property__StaticProp_default_value, ZEND_ACC_PUBLIC|ZEND_ACC_STATIC, NULL); + zend_string_release_ex(property__StaticProp_name, true); + + zval property_staticIntProp_default_value; + ZVAL_LONG(&property_staticIntProp_default_value, 123); + zend_string *property_staticIntProp_name = zend_string_init("staticIntProp", sizeof("staticIntProp") - 1, true); + zend_declare_property_ex(class_entry, property_staticIntProp_name, &property_staticIntProp_default_value, ZEND_ACC_PUBLIC|ZEND_ACC_STATIC, NULL); + zend_string_release_ex(property_staticIntProp_name, true); + + zval property_doubleQuoteEscaped_default_value; + zend_string *property_doubleQuoteEscaped_default_value_str = zend_string_init("BEGIN \n\r\t\v\x1b\f\\$\"AAA END", strlen("BEGIN \n\r\t\v\x1b\f\\$\"AAA END"), 1); + ZVAL_STR(&property_doubleQuoteEscaped_default_value, property_doubleQuoteEscaped_default_value_str); + zend_string *property_doubleQuoteEscaped_name = zend_string_init("doubleQuoteEscaped", sizeof("doubleQuoteEscaped") - 1, true); + zend_declare_property_ex(class_entry, property_doubleQuoteEscaped_name, &property_doubleQuoteEscaped_default_value, ZEND_ACC_PUBLIC|ZEND_ACC_STATIC, NULL); + zend_string_release_ex(property_doubleQuoteEscaped_name, true); + + zval property_singleQuoteEscaped_default_value; + zend_string *property_singleQuoteEscaped_default_value_str = zend_string_init("BEGIN \\n\\r\\t\\v\\e\\f\\\\\\\\$\\\"\\101\\x41\\u{41} END", strlen("BEGIN \\n\\r\\t\\v\\e\\f\\\\\\\\$\\\"\\101\\x41\\u{41} END"), 1); + ZVAL_STR(&property_singleQuoteEscaped_default_value, property_singleQuoteEscaped_default_value_str); + zend_string *property_singleQuoteEscaped_name = zend_string_init("singleQuoteEscaped", sizeof("singleQuoteEscaped") - 1, true); + zend_declare_property_ex(class_entry, property_singleQuoteEscaped_name, &property_singleQuoteEscaped_default_value, ZEND_ACC_PUBLIC|ZEND_ACC_STATIC, NULL); + zend_string_release_ex(property_singleQuoteEscaped_name, true); + + zval property_escapeInterpolated_default_value; + zend_string *property_escapeInterpolated_default_value_str = zend_string_init("begin $ \\$ end", strlen("begin $ \\$ end"), 1); + ZVAL_STR(&property_escapeInterpolated_default_value, property_escapeInterpolated_default_value_str); + zend_string *property_escapeInterpolated_name = zend_string_init("escapeInterpolated", sizeof("escapeInterpolated") - 1, true); + zend_declare_property_ex(class_entry, property_escapeInterpolated_name, &property_escapeInterpolated_default_value, ZEND_ACC_PUBLIC|ZEND_ACC_STATIC, NULL); + zend_string_release_ex(property_escapeInterpolated_name, true); + + zval property_intProp_default_value; + ZVAL_LONG(&property_intProp_default_value, 123); + zend_string *property_intProp_name = zend_string_init("intProp", sizeof("intProp") - 1, true); + zend_declare_property_ex(class_entry, property_intProp_name, &property_intProp_default_value, ZEND_ACC_PUBLIC, NULL); + zend_string_release_ex(property_intProp_name, true); + + zval property_classProp_default_value; + ZVAL_NULL(&property_classProp_default_value); + zend_string *property_classProp_name = zend_string_init("classProp", sizeof("classProp") - 1, true); + zend_declare_property_ex(class_entry, property_classProp_name, &property_classProp_default_value, ZEND_ACC_PUBLIC, NULL); + zend_string_release_ex(property_classProp_name, true); + + zval property_classUnionProp_default_value; + ZVAL_NULL(&property_classUnionProp_default_value); + zend_string *property_classUnionProp_name = zend_string_init("classUnionProp", sizeof("classUnionProp") - 1, true); + zend_declare_property_ex(class_entry, property_classUnionProp_name, &property_classUnionProp_default_value, ZEND_ACC_PUBLIC, NULL); + zend_string_release_ex(property_classUnionProp_name, true); + + zval property_classIntersectionProp_default_value; + ZVAL_NULL(&property_classIntersectionProp_default_value); + zend_string *property_classIntersectionProp_name = zend_string_init("classIntersectionProp", sizeof("classIntersectionProp") - 1, true); + zend_declare_property_ex(class_entry, property_classIntersectionProp_name, &property_classIntersectionProp_default_value, ZEND_ACC_PUBLIC, NULL); + zend_string_release_ex(property_classIntersectionProp_name, true); + + zval property_readonlyProp_default_value; + ZVAL_NULL(&property_readonlyProp_default_value); + zend_string *property_readonlyProp_name = zend_string_init("readonlyProp", sizeof("readonlyProp") - 1, true); + zend_declare_property_ex(class_entry, property_readonlyProp_name, &property_readonlyProp_default_value, ZEND_ACC_PUBLIC, NULL); + zend_string_release_ex(property_readonlyProp_name, true); + + zval property_finalProp_default_value; + ZVAL_NULL(&property_finalProp_default_value); + zend_string *property_finalProp_name = zend_string_init("finalProp", sizeof("finalProp") - 1, true); +#if (PHP_VERSION_ID >= 80400) + zend_declare_property_ex(class_entry, property_finalProp_name, &property_finalProp_default_value, ZEND_ACC_PUBLIC|ZEND_ACC_FINAL, NULL); +#elif (PHP_VERSION_ID >= 70000) + zend_declare_property_ex(class_entry, property_finalProp_name, &property_finalProp_default_value, ZEND_ACC_PUBLIC, NULL); +#endif + zend_string_release_ex(property_finalProp_name, true); + + return class_entry; +} + +static zend_class_entry *register_class__ZendTestMagicCall(void) +{ + zend_class_entry ce, *class_entry; + + INIT_CLASS_ENTRY(ce, "_ZendTestMagicCall", class__ZendTestMagicCall_methods); +#if (PHP_VERSION_ID >= 80400) + class_entry = zend_register_internal_class_with_flags(&ce, NULL, 0); +#else + class_entry = zend_register_internal_class_ex(&ce, NULL); +#endif + + return class_entry; +} + +static zend_class_entry *register_class__ZendTestMagicCallForward(void) +{ + zend_class_entry ce, *class_entry; + + INIT_CLASS_ENTRY(ce, "_ZendTestMagicCallForward", class__ZendTestMagicCallForward_methods); +#if (PHP_VERSION_ID >= 80400) + class_entry = zend_register_internal_class_with_flags(&ce, NULL, 0); +#else + class_entry = zend_register_internal_class_ex(&ce, NULL); +#endif + + return class_entry; +} + +static zend_class_entry *register_class__ZendTestChildClass(zend_class_entry *class_entry__ZendTestClass) +{ + zend_class_entry ce, *class_entry; + + INIT_CLASS_ENTRY(ce, "_ZendTestChildClass", class__ZendTestChildClass_methods); +#if (PHP_VERSION_ID >= 80400) + class_entry = zend_register_internal_class_with_flags(&ce, class_entry__ZendTestClass, 0); +#else + class_entry = zend_register_internal_class_ex(&ce, class_entry__ZendTestClass); +#endif + + return class_entry; +} + +static zend_class_entry *register_class_ZendTestGenStubFlagCompatibilityTest(void) +{ + zend_class_entry ce, *class_entry; + + INIT_CLASS_ENTRY(ce, "ZendTestGenStubFlagCompatibilityTest", NULL); +#if (PHP_VERSION_ID >= 80400) + class_entry = zend_register_internal_class_with_flags(&ce, NULL, ZEND_ACC_FINAL); +#else + class_entry = zend_register_internal_class_ex(&ce, NULL); + class_entry->ce_flags |= ZEND_ACC_FINAL; +#endif + + return class_entry; +} + +static zend_class_entry *register_class_ZendAttributeTest(void) +{ + zend_class_entry ce, *class_entry; + + INIT_CLASS_ENTRY(ce, "ZendAttributeTest", class_ZendAttributeTest_methods); +#if (PHP_VERSION_ID >= 80400) + class_entry = zend_register_internal_class_with_flags(&ce, NULL, 0); +#else + class_entry = zend_register_internal_class_ex(&ce, NULL); +#endif + + zval const_TEST_CONST_value; + ZVAL_LONG(&const_TEST_CONST_value, 1); + zend_string *const_TEST_CONST_name = zend_string_init_interned("TEST_CONST", sizeof("TEST_CONST") - 1, true); + zend_declare_class_constant_ex(class_entry, const_TEST_CONST_name, &const_TEST_CONST_value, ZEND_ACC_PUBLIC, NULL); + zend_string_release_ex(const_TEST_CONST_name, true); + + zval property_testProp_default_value; + ZVAL_NULL(&property_testProp_default_value); + zend_string *property_testProp_name = zend_string_init("testProp", sizeof("testProp") - 1, true); + zend_declare_property_ex(class_entry, property_testProp_name, &property_testProp_default_value, ZEND_ACC_PUBLIC, NULL); + zend_string_release_ex(property_testProp_name, true); + + return class_entry; +} + +static zend_class_entry *register_class__ZendTestTrait(void) +{ + zend_class_entry ce, *class_entry; + + INIT_CLASS_ENTRY(ce, "_ZendTestTrait", class__ZendTestTrait_methods); +#if (PHP_VERSION_ID >= 80400) + class_entry = zend_register_internal_class_with_flags(&ce, NULL, ZEND_ACC_TRAIT); +#else + class_entry = zend_register_internal_class_ex(&ce, NULL); + class_entry->ce_flags |= ZEND_ACC_TRAIT; +#endif + + zval property_testProp_default_value; + ZVAL_NULL(&property_testProp_default_value); + zend_string *property_testProp_name = zend_string_init("testProp", sizeof("testProp") - 1, true); + zend_declare_property_ex(class_entry, property_testProp_name, &property_testProp_default_value, ZEND_ACC_PUBLIC, NULL); + zend_string_release_ex(property_testProp_name, true); + + zval property_classUnionProp_default_value; + ZVAL_NULL(&property_classUnionProp_default_value); + zend_string *property_classUnionProp_name = zend_string_init("classUnionProp", sizeof("classUnionProp") - 1, true); + zend_declare_property_ex(class_entry, property_classUnionProp_name, &property_classUnionProp_default_value, ZEND_ACC_PUBLIC, NULL); + zend_string_release_ex(property_classUnionProp_name, true); + + return class_entry; +} + +static zend_class_entry *register_class_ZendTestAttribute(void) +{ + zend_class_entry ce, *class_entry; + + INIT_CLASS_ENTRY(ce, "ZendTestAttribute", NULL); +#if (PHP_VERSION_ID >= 80400) + class_entry = zend_register_internal_class_with_flags(&ce, NULL, ZEND_ACC_FINAL); +#else + class_entry = zend_register_internal_class_ex(&ce, NULL); + class_entry->ce_flags |= ZEND_ACC_FINAL; +#endif + + return class_entry; +} + +static zend_class_entry *register_class_ZendTestAttributeWithArguments(void) +{ + zend_class_entry ce, *class_entry; + + INIT_CLASS_ENTRY(ce, "ZendTestAttributeWithArguments", class_ZendTestAttributeWithArguments_methods); +#if (PHP_VERSION_ID >= 80400) + class_entry = zend_register_internal_class_with_flags(&ce, NULL, ZEND_ACC_FINAL); +#else + class_entry = zend_register_internal_class_ex(&ce, NULL); + class_entry->ce_flags |= ZEND_ACC_FINAL; +#endif + + zval property_arg_default_value; + ZVAL_NULL(&property_arg_default_value); + zend_string *property_arg_name = zend_string_init("arg", sizeof("arg") - 1, true); + zend_declare_property_ex(class_entry, property_arg_name, &property_arg_default_value, ZEND_ACC_PUBLIC, NULL); + zend_string_release_ex(property_arg_name, true); + + return class_entry; +} + +static zend_class_entry *register_class_ZendTestRepeatableAttribute(void) +{ + zend_class_entry ce, *class_entry; + + INIT_CLASS_ENTRY(ce, "ZendTestRepeatableAttribute", NULL); +#if (PHP_VERSION_ID >= 80400) + class_entry = zend_register_internal_class_with_flags(&ce, NULL, ZEND_ACC_FINAL); +#else + class_entry = zend_register_internal_class_ex(&ce, NULL); + class_entry->ce_flags |= ZEND_ACC_FINAL; +#endif + + return class_entry; +} + +static zend_class_entry *register_class_ZendTestParameterAttribute(void) +{ + zend_class_entry ce, *class_entry; + + INIT_CLASS_ENTRY(ce, "ZendTestParameterAttribute", class_ZendTestParameterAttribute_methods); +#if (PHP_VERSION_ID >= 80400) + class_entry = zend_register_internal_class_with_flags(&ce, NULL, ZEND_ACC_FINAL); +#else + class_entry = zend_register_internal_class_ex(&ce, NULL); + class_entry->ce_flags |= ZEND_ACC_FINAL; +#endif + + zval property_parameter_default_value; + ZVAL_NULL(&property_parameter_default_value); + zend_string *property_parameter_name = zend_string_init("parameter", sizeof("parameter") - 1, true); + zend_declare_property_ex(class_entry, property_parameter_name, &property_parameter_default_value, ZEND_ACC_PUBLIC, NULL); + zend_string_release_ex(property_parameter_name, true); + + return class_entry; +} + +static zend_class_entry *register_class_ZendTestPropertyAttribute(void) +{ + zend_class_entry ce, *class_entry; + + INIT_CLASS_ENTRY(ce, "ZendTestPropertyAttribute", class_ZendTestPropertyAttribute_methods); +#if (PHP_VERSION_ID >= 80400) + class_entry = zend_register_internal_class_with_flags(&ce, NULL, ZEND_ACC_FINAL); +#else + class_entry = zend_register_internal_class_ex(&ce, NULL); + class_entry->ce_flags |= ZEND_ACC_FINAL; +#endif + + zval property_parameter_default_value; + ZVAL_NULL(&property_parameter_default_value); + zend_string *property_parameter_name = zend_string_init("parameter", sizeof("parameter") - 1, true); + zend_string *property_parameter_comment = zend_string_init_interned("/**\n * \"Lorem ipsum\"\n * @see https://www.php.net\n * @since 8.4\n */", 98, 1); + zend_declare_property_ex(class_entry, property_parameter_name, &property_parameter_default_value, ZEND_ACC_PUBLIC, property_parameter_comment); + zend_string_release_ex(property_parameter_name, true); + + return class_entry; +} + +static zend_class_entry *register_class_ZendTestClassWithMethodWithParameterAttribute(void) +{ + zend_class_entry ce, *class_entry; + + INIT_CLASS_ENTRY(ce, "ZendTestClassWithMethodWithParameterAttribute", class_ZendTestClassWithMethodWithParameterAttribute_methods); +#if (PHP_VERSION_ID >= 80400) + class_entry = zend_register_internal_class_with_flags(&ce, NULL, 0); +#else + class_entry = zend_register_internal_class_ex(&ce, NULL); +#endif + + return class_entry; +} + +static zend_class_entry *register_class_ZendTestChildClassWithMethodWithParameterAttribute(zend_class_entry *class_entry_ZendTestClassWithMethodWithParameterAttribute) +{ + zend_class_entry ce, *class_entry; + + INIT_CLASS_ENTRY(ce, "ZendTestChildClassWithMethodWithParameterAttribute", class_ZendTestChildClassWithMethodWithParameterAttribute_methods); +#if (PHP_VERSION_ID >= 80400) + class_entry = zend_register_internal_class_with_flags(&ce, class_entry_ZendTestClassWithMethodWithParameterAttribute, 0); +#else + class_entry = zend_register_internal_class_ex(&ce, class_entry_ZendTestClassWithMethodWithParameterAttribute); +#endif + + return class_entry; +} + +static zend_class_entry *register_class_ZendTestClassWithPropertyAttribute(void) +{ + zend_class_entry ce, *class_entry; + + INIT_CLASS_ENTRY(ce, "ZendTestClassWithPropertyAttribute", NULL); +#if (PHP_VERSION_ID >= 80400) + class_entry = zend_register_internal_class_with_flags(&ce, NULL, 0); +#else + class_entry = zend_register_internal_class_ex(&ce, NULL); +#endif + + zval property_attributed_default_value; + ZVAL_NULL(&property_attributed_default_value); + zend_string *property_attributed_name = zend_string_init("attributed", sizeof("attributed") - 1, true); + zend_declare_property_ex(class_entry, property_attributed_name, &property_attributed_default_value, ZEND_ACC_PUBLIC, NULL); + zend_string_release_ex(property_attributed_name, true); + + return class_entry; +} + +static zend_class_entry *register_class_ZendTestForbidDynamicCall(void) +{ + zend_class_entry ce, *class_entry; + + INIT_CLASS_ENTRY(ce, "ZendTestForbidDynamicCall", class_ZendTestForbidDynamicCall_methods); +#if (PHP_VERSION_ID >= 80400) + class_entry = zend_register_internal_class_with_flags(&ce, NULL, ZEND_ACC_FINAL); +#else + class_entry = zend_register_internal_class_ex(&ce, NULL); + class_entry->ce_flags |= ZEND_ACC_FINAL; +#endif + + return class_entry; +} + +#if (PHP_VERSION_ID >= 80100) +static zend_class_entry *register_class_ZendTestUnitEnum(void) +{ + zend_class_entry *class_entry = zend_register_internal_enum("ZendTestUnitEnum", IS_UNDEF, NULL); + + zend_enum_add_case_cstr(class_entry, "Foo", NULL); + + zend_enum_add_case_cstr(class_entry, "Bar", NULL); + + return class_entry; +} +#endif + +#if (PHP_VERSION_ID >= 80100) +static zend_class_entry *register_class_ZendTestStringEnum(void) +{ + zend_class_entry *class_entry = zend_register_internal_enum("ZendTestStringEnum", IS_STRING, NULL); + + zval enum_case_Foo_value; + zend_string *enum_case_Foo_value_str = zend_string_init("Test1", strlen("Test1"), 1); + ZVAL_STR(&enum_case_Foo_value, enum_case_Foo_value_str); + zend_enum_add_case_cstr(class_entry, "Foo", &enum_case_Foo_value); + + zval enum_case_Bar_value; + zend_string *enum_case_Bar_value_str = zend_string_init("Test2", strlen("Test2"), 1); + ZVAL_STR(&enum_case_Bar_value, enum_case_Bar_value_str); + zend_enum_add_case_cstr(class_entry, "Bar", &enum_case_Bar_value); + + zval enum_case_Baz_value; + zend_string *enum_case_Baz_value_str = zend_string_init("Test2\\a", strlen("Test2\\a"), 1); + ZVAL_STR(&enum_case_Baz_value, enum_case_Baz_value_str); + zend_enum_add_case_cstr(class_entry, "Baz", &enum_case_Baz_value); + + zval enum_case_FortyTwo_value; + zend_string *enum_case_FortyTwo_value_str = zend_string_init("42", strlen("42"), 1); + ZVAL_STR(&enum_case_FortyTwo_value, enum_case_FortyTwo_value_str); + zend_enum_add_case_cstr(class_entry, "FortyTwo", &enum_case_FortyTwo_value); + + return class_entry; +} +#endif + +#if (PHP_VERSION_ID >= 80100) +static zend_class_entry *register_class_ZendTestIntEnum(void) +{ + zend_class_entry *class_entry = zend_register_internal_enum("ZendTestIntEnum", IS_LONG, NULL); + + zval enum_case_Foo_value; + ZVAL_LONG(&enum_case_Foo_value, 1); + zend_enum_add_case_cstr(class_entry, "Foo", &enum_case_Foo_value); + + zval enum_case_Bar_value; + ZVAL_LONG(&enum_case_Bar_value, 3); + zend_enum_add_case_cstr(class_entry, "Bar", &enum_case_Bar_value); + + zval enum_case_Baz_value; + ZVAL_LONG(&enum_case_Baz_value, -1); + zend_enum_add_case_cstr(class_entry, "Baz", &enum_case_Baz_value); + + return class_entry; +} +#endif + +#if (PHP_VERSION_ID >= 80100) +static zend_class_entry *register_class_ZendTestEnumWithInterface(zend_class_entry *class_entry__ZendTestInterface) +{ + zend_class_entry *class_entry = zend_register_internal_enum("ZendTestEnumWithInterface", IS_UNDEF, NULL); + zend_class_implements(class_entry, 1, class_entry__ZendTestInterface); + + zend_enum_add_case_cstr(class_entry, "Foo", NULL); + + zend_enum_add_case_cstr(class_entry, "Bar", NULL); + + return class_entry; +} +#endif + +static zend_class_entry *register_class_ZendTestNS_Foo(void) +{ + zend_class_entry ce, *class_entry; + + INIT_NS_CLASS_ENTRY(ce, "ZendTestNS", "Foo", class_ZendTestNS_Foo_methods); +#if (PHP_VERSION_ID >= 80400) + class_entry = zend_register_internal_class_with_flags(&ce, NULL, 0); +#else + class_entry = zend_register_internal_class_ex(&ce, NULL); +#endif + + return class_entry; +} + +static zend_class_entry *register_class_ZendTestNS_Bar(void) +{ + zend_class_entry ce, *class_entry; + + INIT_NS_CLASS_ENTRY(ce, "ZendTestNS", "Bar", NULL); + class_entry = zend_register_internal_interface(&ce); + + return class_entry; +} + +static zend_class_entry *register_class_ZendTestNS_UnlikelyCompileError(void) +{ + zend_class_entry ce, *class_entry; + + INIT_NS_CLASS_ENTRY(ce, "ZendTestNS", "UnlikelyCompileError", class_ZendTestNS_UnlikelyCompileError_methods); +#if (PHP_VERSION_ID >= 80400) + class_entry = zend_register_internal_class_with_flags(&ce, NULL, 0); +#else + class_entry = zend_register_internal_class_ex(&ce, NULL); +#endif + + return class_entry; +} + +static zend_class_entry *register_class_ZendTestNS_NotUnlikelyCompileError(void) +{ + zend_class_entry ce, *class_entry; + + INIT_NS_CLASS_ENTRY(ce, "ZendTestNS", "NotUnlikelyCompileError", class_ZendTestNS_NotUnlikelyCompileError_methods); +#if (PHP_VERSION_ID >= 80400) + class_entry = zend_register_internal_class_with_flags(&ce, NULL, 0); +#else + class_entry = zend_register_internal_class_ex(&ce, NULL); +#endif + + return class_entry; +} + +static zend_class_entry *register_class_ZendTestNS2_Foo(void) +{ + zend_class_entry ce, *class_entry; + + INIT_NS_CLASS_ENTRY(ce, "ZendTestNS2", "Foo", class_ZendTestNS2_Foo_methods); +#if (PHP_VERSION_ID >= 80400) + class_entry = zend_register_internal_class_with_flags(&ce, NULL, 0); +#else + class_entry = zend_register_internal_class_ex(&ce, NULL); +#endif + + zval property_foo_default_value; + ZVAL_NULL(&property_foo_default_value); + zend_string *property_foo_name = zend_string_init("foo", sizeof("foo") - 1, true); + zend_declare_property_ex(class_entry, property_foo_name, &property_foo_default_value, ZEND_ACC_PUBLIC, NULL); + zend_string_release_ex(property_foo_name, true); + + zval property_intersectionProp_default_value; + ZVAL_NULL(&property_intersectionProp_default_value); + zend_string *property_intersectionProp_name = zend_string_init("intersectionProp", sizeof("intersectionProp") - 1, true); + zend_declare_property_ex(class_entry, property_intersectionProp_name, &property_intersectionProp_default_value, ZEND_ACC_PUBLIC, NULL); + zend_string_release_ex(property_intersectionProp_name, true); + + zval property_unionProp_default_value; + ZVAL_NULL(&property_unionProp_default_value); + zend_string *property_unionProp_name = zend_string_init("unionProp", sizeof("unionProp") - 1, true); + zend_declare_property_ex(class_entry, property_unionProp_name, &property_unionProp_default_value, ZEND_ACC_PUBLIC, NULL); + zend_string_release_ex(property_unionProp_name, true); + + zval property_fooAlias_default_value; + ZVAL_NULL(&property_fooAlias_default_value); + zend_string *property_fooAlias_name = zend_string_init("fooAlias", sizeof("fooAlias") - 1, true); + zend_declare_property_ex(class_entry, property_fooAlias_name, &property_fooAlias_default_value, ZEND_ACC_PUBLIC, NULL); + zend_string_release_ex(property_fooAlias_name, true); + + zval property_unlProp_default_value; + ZVAL_NULL(&property_unlProp_default_value); + zend_string *property_unlProp_name = zend_string_init("unlProp", sizeof("unlProp") - 1, true); + zend_declare_property_ex(class_entry, property_unlProp_name, &property_unlProp_default_value, ZEND_ACC_PUBLIC, NULL); + zend_string_release_ex(property_unlProp_name, true); + + zval property_notUnlProp_default_value; + ZVAL_NULL(&property_notUnlProp_default_value); + zend_string *property_notUnlProp_name = zend_string_init("notUnlProp", sizeof("notUnlProp") - 1, true); + zend_declare_property_ex(class_entry, property_notUnlProp_name, &property_notUnlProp_default_value, ZEND_ACC_PUBLIC, NULL); + zend_string_release_ex(property_notUnlProp_name, true); + + return class_entry; +} + +static zend_class_entry *register_class_ZendTestNS2_ZendSubNS_Foo(void) +{ + zend_class_entry ce, *class_entry; + + INIT_NS_CLASS_ENTRY(ce, "ZendTestNS2\\ZendSubNS", "Foo", class_ZendTestNS2_ZendSubNS_Foo_methods); +#if (PHP_VERSION_ID >= 80400) + class_entry = zend_register_internal_class_with_flags(&ce, NULL, 0); +#else + class_entry = zend_register_internal_class_ex(&ce, NULL); +#endif + + return class_entry; +} diff --git a/ext/zend_test/tests/consumed_args_basic.phpt b/ext/zend_test/tests/consumed_args_basic.phpt new file mode 100644 index 000000000000..711ac8124579 --- /dev/null +++ b/ext/zend_test/tests/consumed_args_basic.phpt @@ -0,0 +1,43 @@ +--TEST-- +zend_test_call_with_consumed_args(): consume a non-reference arg +--EXTENSIONS-- +zend_test +--FILE-- + +--EXPECTF-- +array(3) %srefcount(3){ + [0]=> + int(1) + [1]=> + int(2) + [2]=> + int(3) +} +int(1) +array(2) { + [0]=> + array(3) { + [0]=> + int(1) + [1]=> + int(2) + [2]=> + int(3) + } + [1]=> + string(1) "x" +} diff --git a/ext/zend_test/tests/consumed_args_ob_start_refcount.phpt b/ext/zend_test/tests/consumed_args_ob_start_refcount.phpt new file mode 100644 index 000000000000..3d5088d284d9 --- /dev/null +++ b/ext/zend_test/tests/consumed_args_ob_start_refcount.phpt @@ -0,0 +1,23 @@ +--TEST-- +ob_start(): consumed callback arg has low refcount +--EXTENSIONS-- +zend_test +--FILE-- + +--EXPECT-- +array(1) { + [0]=> + int(2) +} diff --git a/ext/zend_test/tests/consumed_args_ref_arg.phpt b/ext/zend_test/tests/consumed_args_ref_arg.phpt new file mode 100644 index 000000000000..a528860006b0 --- /dev/null +++ b/ext/zend_test/tests/consumed_args_ref_arg.phpt @@ -0,0 +1,35 @@ +--TEST-- +zend_test_call_with_consumed_args(): do not consume reference args +--EXTENSIONS-- +zend_test +--FILE-- + +--EXPECT-- +int(0) +array(2) { + [0]=> + int(10) + [1]=> + int(20) +} +array(1) { + [0]=> + int(10) +} diff --git a/ext/zend_test/tests/consumed_args_ref_param_and_ref_arg.phpt b/ext/zend_test/tests/consumed_args_ref_param_and_ref_arg.phpt new file mode 100644 index 000000000000..01d4025842a4 --- /dev/null +++ b/ext/zend_test/tests/consumed_args_ref_param_and_ref_arg.phpt @@ -0,0 +1,37 @@ +--TEST-- +zend_test_call_with_consumed_args(): ref-required params with reference args are not consumed +--EXTENSIONS-- +zend_test +--FILE-- + +--EXPECT-- +int(0) +array(2) { + [0]=> + int(10) + [1]=> + int(20) +} +array(2) { + [0]=> + int(10) + [1]=> + int(20) +} diff --git a/ext/zend_test/tests/consumed_args_ref_required.phpt b/ext/zend_test/tests/consumed_args_ref_required.phpt new file mode 100644 index 000000000000..f261131a686a --- /dev/null +++ b/ext/zend_test/tests/consumed_args_ref_required.phpt @@ -0,0 +1,24 @@ +--TEST-- +zend_test_call_with_consumed_args(): ref-required params are not consumed +--EXTENSIONS-- +zend_test +--FILE-- + +--EXPECTF-- +Warning: {closure:%s:%d}(): Argument #1 ($a) must be passed by reference, value given in %s on line %d +int(0) +int(42) diff --git a/ext/zend_test/tests/gen_stub_test_01.phpt b/ext/zend_test/tests/gen_stub_test_01.phpt index 0f5d525322d6..0cda0651bee3 100644 --- a/ext/zend_test/tests/gen_stub_test_01.phpt +++ b/ext/zend_test/tests/gen_stub_test_01.phpt @@ -18,11 +18,31 @@ var_dump($foo); object(ZendTestNS2\Foo)#%d (%d) { ["foo"]=> uninitialized(ZendTestNS2\ZendSubNS\Foo) + ["intersectionProp"]=> + uninitialized(ZendTestNS2\ZendSubNS\Foo&ZendTestNS\Bar) + ["unionProp"]=> + uninitialized(ZendTestNS2\ZendSubNS\Foo|ZendTestNS\Bar) + ["fooAlias"]=> + uninitialized(ZendTestNS\Foo) + ["unlProp"]=> + uninitialized(ZendTestNS\UnlikelyCompileError) + ["notUnlProp"]=> + uninitialized(ZendTestNS\NotUnlikelyCompileError) } object(ZendTestNS2\Foo)#%d (%d) { ["foo"]=> object(ZendTestNS2\ZendSubNS\Foo)#%d (%d) { } + ["intersectionProp"]=> + uninitialized(ZendTestNS2\ZendSubNS\Foo&ZendTestNS\Bar) + ["unionProp"]=> + uninitialized(ZendTestNS2\ZendSubNS\Foo|ZendTestNS\Bar) + ["fooAlias"]=> + uninitialized(ZendTestNS\Foo) + ["unlProp"]=> + uninitialized(ZendTestNS\UnlikelyCompileError) + ["notUnlProp"]=> + uninitialized(ZendTestNS\NotUnlikelyCompileError) } object(ZendTestNS\UnlikelyCompileError)#%d (%d) { } diff --git a/ext/zend_test/tests/gh16811.phpt b/ext/zend_test/tests/gh16811.phpt new file mode 100644 index 000000000000..1b2b8ece9aa1 --- /dev/null +++ b/ext/zend_test/tests/gh16811.phpt @@ -0,0 +1,18 @@ +--TEST-- +GH-16811 (Segmentation fault in zend observer) +--EXTENSIONS-- +zend_test +--INI-- +zend_test.observer.enabled=1 +zend_test.observer.show_output=1 +zend_test.observer.observe_function_names=a,d +--FILE-- + +--EXPECTF-- + + + +string(3) "a,d" diff --git a/ext/zend_test/tests/gh16811_observe_all.phpt b/ext/zend_test/tests/gh16811_observe_all.phpt new file mode 100644 index 000000000000..466aa0c6d4a4 --- /dev/null +++ b/ext/zend_test/tests/gh16811_observe_all.phpt @@ -0,0 +1,17 @@ +--TEST-- +GH-16811 (Assertion failure adding duplicate observer handler) +--EXTENSIONS-- +zend_test +--INI-- +zend_test.observer.enabled=1 +zend_test.observer.observe_all=1 +zend_test.observer.show_output=0 +--FILE-- + +--EXPECT-- +Done diff --git a/ext/zend_test/tests/gh22169.phpt b/ext/zend_test/tests/gh22169.phpt new file mode 100644 index 000000000000..5ed2ab22fa21 --- /dev/null +++ b/ext/zend_test/tests/gh22169.phpt @@ -0,0 +1,22 @@ +--TEST-- +GH-22169: Ensure escaped strings in stubs are valid +--EXTENSIONS-- +zend_test +--FILE-- + +--EXPECT-- +string(44) "424547494e200a0d090b1b0c5c242241414120454e44" +string(43) "BEGIN \n\r\t\v\e\f\\\\$\"\101\x41\u{41} END" +string(14) "begin $ \$ end" + diff --git a/ext/zend_test/tests/gh22175.phpt b/ext/zend_test/tests/gh22175.phpt new file mode 100644 index 000000000000..c2db3c9c4e0c --- /dev/null +++ b/ext/zend_test/tests/gh22175.phpt @@ -0,0 +1,18 @@ +--TEST-- +GH-22175: zend_call_method_if_exists() must unref return value +--CREDITS-- +YuanchengJiang +--EXTENSIONS-- +zend_test +--FILE-- + +--EXPECTF-- +Notice: Only variable references should be returned by reference in %s on line %d diff --git a/ext/zend_test/tests/observer_jit_vm_interrupt.inc b/ext/zend_test/tests/observer_jit_vm_interrupt.inc new file mode 100644 index 000000000000..426d9fdc2cb2 --- /dev/null +++ b/ext/zend_test/tests/observer_jit_vm_interrupt.inc @@ -0,0 +1,8 @@ + +--FILE-- + +--EXPECT-- +total=2438400 diff --git a/ext/zend_test/tests/observer_vm_interrupt_tailcall_helper.phpt b/ext/zend_test/tests/observer_vm_interrupt_tailcall_helper.phpt new file mode 100644 index 000000000000..d0178bdbf614 --- /dev/null +++ b/ext/zend_test/tests/observer_vm_interrupt_tailcall_helper.phpt @@ -0,0 +1,26 @@ +--TEST-- +Observer: VM interrupt during tailcall helper dispatch +--DESCRIPTION-- +This exercises a VM interrupt raised while an opcode handler dispatches to an +extra-argument helper. On the tailcall VM, the helper may return an opline +tagged with ZEND_VM_ENTER_BIT; treating that tagged value as a zend_op * before +tailcalling the next handler can crash. +--EXTENSIONS-- +zend_test +--INI-- +opcache.jit=0 +zend_test.observer.set_vm_interrupt_on_begin=1 +--FILE-- + +--EXPECT-- +stdClass diff --git a/ext/zend_test/tests/observer_vm_interrupt_tailcall_return.phpt b/ext/zend_test/tests/observer_vm_interrupt_tailcall_return.phpt new file mode 100644 index 000000000000..95af2681c253 --- /dev/null +++ b/ext/zend_test/tests/observer_vm_interrupt_tailcall_return.phpt @@ -0,0 +1,29 @@ +--TEST-- +Observer: VM interrupt during tailcall return to caller +--DESCRIPTION-- +This exercises a VM interrupt raised immediately before a user function returns +to a caller that invoked it through DO_FCALL. On the tailcall VM, the caller's +saved opline must point to the opcode after DO_FCALL before a pending interrupt +is handled. +--EXTENSIONS-- +zend_test +--INI-- +opcache.jit=0 +zend_test.observer.set_vm_interrupt_on_begin=1 +--FILE-- + +--EXPECT-- +ok diff --git a/ext/zend_test/zend_mm_custom_handlers.c b/ext/zend_test/zend_mm_custom_handlers.c index 2130065109ef..76628f8881b5 100644 --- a/ext/zend_test/zend_mm_custom_handlers.c +++ b/ext/zend_test/zend_mm_custom_handlers.c @@ -1,14 +1,12 @@ /* +----------------------------------------------------------------------+ - | Copyright (c) The PHP Group | + | Copyright © The PHP Group and Contributors. | +----------------------------------------------------------------------+ - | This source file is subject to version 3.01 of the PHP license, | - | that is bundled with this package in the file LICENSE, and is | - | available through the world-wide-web at the following url: | - | https://www.php.net/license/3_01.txt | - | If you did not receive a copy of the PHP license and are unable to | - | obtain it through the world-wide-web, please send a note to | - | license@php.net so we can mail you a copy immediately. | + | This source file is subject to the Modified BSD License that is | + | bundled with this package in the file LICENSE, and is available | + | through the World Wide Web at . | + | | + | SPDX-License-Identifier: BSD-3-Clause | +----------------------------------------------------------------------+ | Author: Florian Engelhardt | +----------------------------------------------------------------------+ diff --git a/ext/zend_test/zend_mm_custom_handlers.h b/ext/zend_test/zend_mm_custom_handlers.h index 7e0c8021e7e2..1db32562320b 100644 --- a/ext/zend_test/zend_mm_custom_handlers.h +++ b/ext/zend_test/zend_mm_custom_handlers.h @@ -1,14 +1,12 @@ /* +----------------------------------------------------------------------+ - | Copyright (c) The PHP Group | + | Copyright © The PHP Group and Contributors. | +----------------------------------------------------------------------+ - | This source file is subject to version 3.01 of the PHP license, | - | that is bundled with this package in the file LICENSE, and is | - | available through the world-wide-web at the following url: | - | https://www.php.net/license/3_01.txt | - | If you did not receive a copy of the PHP license and are unable to | - | obtain it through the world-wide-web, please send a note to | - | license@php.net so we can mail you a copy immediately. | + | This source file is subject to the Modified BSD License that is | + | bundled with this package in the file LICENSE, and is available | + | through the World Wide Web at . | + | | + | SPDX-License-Identifier: BSD-3-Clause | +----------------------------------------------------------------------+ | Author: Florian Engelhardt | +----------------------------------------------------------------------+ diff --git a/ext/zip/config.m4 b/ext/zip/config.m4 index 29ae030d37b6..590be44f6501 100644 --- a/ext/zip/config.m4 +++ b/ext/zip/config.m4 @@ -49,7 +49,7 @@ if test "$PHP_ZIP" != "no"; then AC_DEFINE([HAVE_ZIP], [1], [Define to 1 if the PHP extension 'zip' is available.]) - PHP_NEW_EXTENSION([zip], [php_zip.c zip_stream.c], [$ext_shared]) + PHP_NEW_EXTENSION([zip], [php_zip.c zip_source.c zip_stream.c], [$ext_shared]) PHP_ADD_EXTENSION_DEP(zip, pcre) PHP_SUBST([ZIP_SHARED_LIBADD]) diff --git a/ext/zip/config.w32 b/ext/zip/config.w32 index 3f05d8454c1e..8dd22c7761cf 100644 --- a/ext/zip/config.w32 +++ b/ext/zip/config.w32 @@ -8,7 +8,7 @@ if (PHP_ZIP != "no") { (PHP_ZIP_SHARED && CHECK_LIB("libzip.lib", "zip", PHP_ZIP) || CHECK_LIB("libzip_a.lib", "zip", PHP_ZIP) && CHECK_LIB("libbz2_a.lib", "zip", PHP_ZIP) && CHECK_LIB("zlib_a.lib", "zip", PHP_ZIP) && CHECK_LIB("liblzma_a.lib", "zip", PHP_ZIP)) ) { - EXTENSION('zip', 'php_zip.c zip_stream.c'); + EXTENSION('zip', 'php_zip.c zip_source.c zip_stream.c'); ADD_EXTENSION_DEP('zip', 'pcre'); if (get_define("LIBS_ZIP").match("libzip_a(?:_debug)?\.lib")) { diff --git a/ext/zip/php_zip.c b/ext/zip/php_zip.c index 77d5dacbff94..12344450678b 100644 --- a/ext/zip/php_zip.c +++ b/ext/zip/php_zip.c @@ -1,14 +1,12 @@ /* +----------------------------------------------------------------------+ - | Copyright (c) The PHP Group | + | Copyright © The PHP Group and Contributors. | +----------------------------------------------------------------------+ - | This source file is subject to version 3.01 of the PHP license, | - | that is bundled with this package in the file LICENSE, and is | - | available through the world-wide-web at the following url: | - | https://www.php.net/license/3_01.txt | - | If you did not receive a copy of the PHP license and are unable to | - | obtain it through the world-wide-web, please send a note to | - | license@php.net so we can mail you a copy immediately. | + | This source file is subject to the Modified BSD License that is | + | bundled with this package in the file LICENSE, and is available | + | through the World Wide Web at . | + | | + | SPDX-License-Identifier: BSD-3-Clause | +----------------------------------------------------------------------+ | Author: Piere-Alain Joye | +----------------------------------------------------------------------+ @@ -151,7 +149,7 @@ static bool php_zip_extract_file(struct zip * za, char *dest, const char *file, new_state.cwd[0] = '\0'; new_state.cwd_length = 0; - /* Clean/normlize the path and then transform any path (absolute or relative) + /* Clean/normalize the path and then transform any path (absolute or relative) to a path relative to cwd (../../mydir/foo.txt > mydir/foo.txt) */ virtual_file_ex(&new_state, file, NULL, CWD_EXPAND); @@ -311,11 +309,15 @@ static zend_result php_zip_add_file(ze_zip_object *obj, const char *filename, si } flags ^= ZIP_FL_OPEN_FILE_NOW; zs = zip_source_filep(obj->za, fd, offset_start, offset_len); + if (!zs) { + fclose(fd); + return FAILURE; + } } else { zs = zip_source_file(obj->za, resolved_path, offset_start, offset_len); - } - if (!zs) { - return FAILURE; + if (!zs) { + return FAILURE; + } } /* Replace */ if (replace >= 0) { @@ -575,30 +577,12 @@ static char * php_zipobj_get_zip_comment(ze_zip_object *obj, int *len) /* {{{ */ } /* }}} */ -/* Add a string to the list of buffers to be released when the object is destroyed.*/ -static void php_zipobj_add_buffer(ze_zip_object *obj, zend_string *str) /* {{{ */ -{ - size_t pos = obj->buffers_cnt++; - obj->buffers = safe_erealloc(obj->buffers, sizeof(*obj->buffers), obj->buffers_cnt, 0); - obj->buffers[pos] = zend_string_copy(str); -} -/* }}} */ - -static void php_zipobj_release_buffers(ze_zip_object *obj) /* {{{ */ -{ - if (obj->buffers_cnt > 0) { - for (size_t i = 0; i < obj->buffers_cnt; i++) { - zend_string_release(obj->buffers[i]); - } - efree(obj->buffers); - obj->buffers = NULL; - } - obj->buffers_cnt = 0; -} -/* }}} */ - -/* Close and free the zip_t */ -static bool php_zipobj_close(ze_zip_object *obj) /* {{{ */ +/* Close and free the zip_t. If the archive was opened as a string, the + * final contents of the archive will be assigned to *out_str and that + * string will afterwards be owned by the caller. + * + * If out_str is NULL, the final string contents, if any, will be discarded. */ +static bool php_zipobj_close(ze_zip_object *obj, zend_string **out_str) /* {{{ */ { struct zip *intern = obj->za; bool success = false; @@ -630,9 +614,19 @@ static bool php_zipobj_close(ze_zip_object *obj) /* {{{ */ obj->filename_len = 0; } - php_zipobj_release_buffers(obj); + if (obj->out_str) { + if (out_str) { + *out_str = obj->out_str; + } else { + zend_string_release(obj->out_str); + } + obj->out_str = NULL; + } else { + ZEND_ASSERT(!out_str); + } obj->za = NULL; + obj->from_string = false; return success; } /* }}} */ @@ -700,16 +694,18 @@ int php_zip_glob(zend_string *spattern, zend_long flags, zval *return_value) /* /* now catch the FreeBSD style of "no matches" */ if (!globbuf.gl_pathc || !globbuf.gl_pathv) { + php_globfree(&globbuf); return 0; } /* we assume that any glob pattern will match files from one directory only so checking the dirname of the first match should be sufficient */ if (ZIP_OPENBASEDIR_CHECKPATH(globbuf.gl_pathv[0])) { + php_globfree(&globbuf); return -1; } - array_init(return_value); + array_init_size(return_value, (uint32_t)globbuf.gl_pathc); for (size_t n = 0; n < globbuf.gl_pathc; n++) { /* we need to do this every time since PHP_GLOB_ONLYDIR does not guarantee that * all directories will be filtered. GNU libc documentation states the @@ -788,7 +784,7 @@ int php_zip_pcre(zend_string *regexp, char *path, int path_len, zval *return_val return -1; } - array_init(return_value); + array_init_size(return_value, (uint32_t)files_cnt); /* only the files, directories are ignored */ for (i = 0; i < files_cnt; i++) { @@ -805,7 +801,10 @@ int php_zip_pcre(zend_string *regexp, char *path, int path_len, zval *return_val if ((path_len + namelist_len + 1) >= MAXPATHLEN) { php_error_docref(NULL, E_WARNING, "add_path string too long (max: %u, %zu given)", MAXPATHLEN - 1, (path_len + namelist_len + 1)); - zend_string_release_ex(namelist[i], false); + /* The loop isn't continued, so all remaining file names must get freed. */ + for (; i < files_cnt; i++) { + zend_string_release_ex(namelist[i], false); + } break; } @@ -1084,7 +1083,7 @@ static void php_zip_object_free_storage(zend_object *object) /* {{{ */ { ze_zip_object * intern = php_zip_fetch_object(object); - php_zipobj_close(intern); + php_zipobj_close(intern, NULL); #ifdef HAVE_PROGRESS_CALLBACK /* if not properly called by libzip */ @@ -1491,7 +1490,7 @@ PHP_METHOD(ZipArchive, open) } /* If we already have an opened zip, free it */ - php_zipobj_close(ze_obj); + php_zipobj_close(ze_obj, NULL); /* open for write without option to empty the archive */ if ((flags & (ZIP_TRUNCATE | ZIP_RDONLY)) == 0) { @@ -1515,26 +1514,34 @@ PHP_METHOD(ZipArchive, open) ze_obj->filename = resolved_path; ze_obj->filename_len = strlen(resolved_path); ze_obj->za = intern; + ze_obj->from_string = false; RETURN_TRUE; } /* }}} */ -/* {{{ Create new read-only zip using given string */ +/* {{{ Create new zip from a string, or a create an empty zip to be saved to a string */ PHP_METHOD(ZipArchive, openString) { - zend_string *buffer; + zend_string *buffer = NULL; + zend_long flags = 0; zval *self = ZEND_THIS; - if (zend_parse_parameters(ZEND_NUM_ARGS(), "S", &buffer) == FAILURE) { + if (zend_parse_parameters(ZEND_NUM_ARGS(), "|Sl", &buffer, &flags) == FAILURE) { RETURN_THROWS(); } + if (!buffer) { + buffer = ZSTR_EMPTY_ALLOC(); + } + ze_zip_object *ze_obj = Z_ZIP_P(self); + php_zipobj_close(ze_obj, NULL); + zip_error_t err; zip_error_init(&err); - zip_source_t * zip_source = zip_source_buffer_create(ZSTR_VAL(buffer), ZSTR_LEN(buffer), 0, &err); + zip_source_t * zip_source = php_zip_create_string_source(buffer, &ze_obj->out_str, &err); if (!zip_source) { ze_obj->err_zip = zip_error_code_zip(&err); @@ -1543,9 +1550,7 @@ PHP_METHOD(ZipArchive, openString) RETURN_LONG(ze_obj->err_zip); } - php_zipobj_close(ze_obj); - - struct zip *intern = zip_open_from_source(zip_source, ZIP_RDONLY, &err); + struct zip *intern = zip_open_from_source(zip_source, flags, &err); if (!intern) { ze_obj->err_zip = zip_error_code_zip(&err); ze_obj->err_sys = zip_error_code_system(&err); @@ -1554,7 +1559,7 @@ PHP_METHOD(ZipArchive, openString) RETURN_LONG(ze_obj->err_zip); } - php_zipobj_add_buffer(ze_obj, buffer); + ze_obj->from_string = true; ze_obj->za = intern; zip_error_fini(&err); RETURN_TRUE; @@ -1593,11 +1598,38 @@ PHP_METHOD(ZipArchive, close) ZIP_FROM_OBJECT(intern, self); - RETURN_BOOL(php_zipobj_close(Z_ZIP_P(self))); + RETURN_BOOL(php_zipobj_close(Z_ZIP_P(self), NULL)); } /* }}} */ -/* {{{ close the zip archive */ +/* {{{ close the zip archive and get the result as a string */ +PHP_METHOD(ZipArchive, closeString) +{ + struct zip *intern; + zval *self = ZEND_THIS; + + ZEND_PARSE_PARAMETERS_NONE(); + + ZIP_FROM_OBJECT(intern, self); + + if (!Z_ZIP_P(self)->from_string) { + zend_throw_error(NULL, "ZipArchive::closeString can only be called on " + "an archive opened with ZipArchive::openString"); + RETURN_THROWS(); + } + + zend_string *ret = NULL; + bool success = php_zipobj_close(Z_ZIP_P(self), &ret); + ZEND_ASSERT(ret); + if (success) { + RETURN_STR(ret); + } + zend_string_release(ret); + RETURN_FALSE; +} +/* }}} */ + +/* {{{ get the number of entries */ PHP_METHOD(ZipArchive, count) { struct zip *intern; @@ -1911,9 +1943,7 @@ PHP_METHOD(ZipArchive, addFromString) ZIP_FROM_OBJECT(intern, self); ze_obj = Z_ZIP_P(self); - php_zipobj_add_buffer(ze_obj, buffer); - - zs = zip_source_buffer(intern, ZSTR_VAL(buffer), ZSTR_LEN(buffer), 0); + zs = php_zip_create_string_source(buffer, NULL, NULL); if (zs == NULL) { RETURN_FALSE; @@ -2838,6 +2868,7 @@ static void php_zip_get_from(INTERNAL_FUNCTION_PARAMETERS, int type) /* {{{ */ buffer = zend_string_safe_alloc(1, len, 0, false); zip_int64_t n = zip_fread(zf, ZSTR_VAL(buffer), ZSTR_LEN(buffer)); if (n < 1) { + zip_fclose(zf); zend_string_efree(buffer); RETURN_EMPTY_STRING(); } @@ -3078,7 +3109,7 @@ static void php_zip_free_prop_handler(zval *el) /* {{{ */ { static PHP_MINIT_FUNCTION(zip) { memcpy(&zip_object_handlers, &std_object_handlers, sizeof(zend_object_handlers)); - zip_object_handlers.offset = XtOffsetOf(ze_zip_object, zo); + zip_object_handlers.offset = offsetof(ze_zip_object, zo); zip_object_handlers.free_obj = php_zip_object_free_storage; zip_object_handlers.dtor_obj = php_zip_object_dtor; zip_object_handlers.clone_obj = NULL; diff --git a/ext/zip/php_zip.h b/ext/zip/php_zip.h index 0b96d6ec3eaa..9e57a54de1cc 100644 --- a/ext/zip/php_zip.h +++ b/ext/zip/php_zip.h @@ -1,14 +1,12 @@ /* +----------------------------------------------------------------------+ - | Copyright (c) The PHP Group | + | Copyright © The PHP Group and Contributors. | +----------------------------------------------------------------------+ - | This source file is subject to version 3.01 of the PHP license, | - | that is bundled with this package in the file LICENSE, and is | - | available through the world-wide-web at the following url: | - | https://www.php.net/license/3_01.txt | - | If you did not receive a copy of the PHP license and are unable to | - | obtain it through the world-wide-web, please send a note to | - | license@php.net so we can mail you a copy immediately. | + | This source file is subject to the Modified BSD License that is | + | bundled with this package in the file LICENSE, and is available | + | through the World Wide Web at . | + | | + | SPDX-License-Identifier: BSD-3-Clause | +----------------------------------------------------------------------+ | Author: Pierre-Alain Joye | +----------------------------------------------------------------------+ @@ -36,7 +34,7 @@ extern zend_module_entry zip_module_entry; #define ZIP_LENGTH_TO_END 0 #endif -/* Additionnal flags not from libzip */ +/* Additional flags not from libzip */ #define ZIP_FL_OPEN_FILE_NOW (1u<<30) #define PHP_ZIP_VERSION "1.22.8" @@ -68,11 +66,11 @@ typedef struct _ze_zip_read_rsrc { /* Extends zend object */ typedef struct _ze_zip_object { struct zip *za; - zend_string **buffers; HashTable *prop_handler; char *filename; size_t filename_len; - size_t buffers_cnt; + zend_string *out_str; + bool from_string; zip_int64_t last_id; int err_zip; int err_sys; @@ -85,9 +83,7 @@ typedef struct _ze_zip_object { zend_object zo; } ze_zip_object; -static inline ze_zip_object *php_zip_fetch_object(zend_object *obj) { - return (ze_zip_object *)((char*)(obj) - XtOffsetOf(ze_zip_object, zo)); -} +#define php_zip_fetch_object(obj) ZEND_CONTAINER_OF(obj, ze_zip_object, zo) #define Z_ZIP_P(zv) php_zip_fetch_object(Z_OBJ_P((zv))) @@ -96,6 +92,8 @@ php_stream *php_stream_zip_open(struct zip *arch, struct zip_stat *sb, const cha extern const php_stream_wrapper php_stream_zip_wrapper; +zip_source_t * php_zip_create_string_source(zend_string *str, zend_string **dest, zip_error_t *err); + #define LIBZIP_ATLEAST(m,n,p) (((m<<16) + (n<<8) + p) <= ((LIBZIP_VERSION_MAJOR<<16) + (LIBZIP_VERSION_MINOR<<8) + LIBZIP_VERSION_MICRO)) #endif /* PHP_ZIP_H */ diff --git a/ext/zip/php_zip.stub.php b/ext/zip/php_zip.stub.php index 42dfb006fc61..49dd19e53553 100644 --- a/ext/zip/php_zip.stub.php +++ b/ext/zip/php_zip.stub.php @@ -152,7 +152,7 @@ class ZipArchive implements Countable public const int FL_ENC_CP437 = UNKNOWN; /** - * Additionnal flags not from libzip + * Additional flags not from libzip * @cvalue ZIP_FL_OPEN_FILE_NOW */ public const int FL_OPEN_FILE_NOW = UNKNOWN; @@ -646,7 +646,7 @@ class ZipArchive implements Countable /** @tentative-return-type */ public function open(string $filename, int $flags = 0): bool|int {} - public function openString(string $data): bool|int {} + public function openString(string $data = '', int $flags = 0): bool|int {} /** * @tentative-return-type @@ -656,6 +656,8 @@ public function setPassword(#[\SensitiveParameter] string $password): bool {} /** @tentative-return-type */ public function close(): bool {} + public function closeString(): string|false {} + /** @tentative-return-type */ public function count(): int {} diff --git a/ext/zip/php_zip_arginfo.h b/ext/zip/php_zip_arginfo.h index 89dd33b6f1a0..faa6feb1cb1e 100644 --- a/ext/zip/php_zip_arginfo.h +++ b/ext/zip/php_zip_arginfo.h @@ -1,5 +1,5 @@ /* This is a generated file, edit php_zip.stub.php instead. - * Stub hash: e04b3e90c42074ac364ea25a0e794815bd4271e5 */ + * Stub hash: d623efdfe5ac46f07aebf8fb120050c818f3d793 */ ZEND_BEGIN_ARG_INFO_EX(arginfo_zip_open, 0, 0, 1) ZEND_ARG_TYPE_INFO(0, filename, IS_STRING, 0) @@ -45,8 +45,9 @@ ZEND_BEGIN_ARG_WITH_TENTATIVE_RETURN_TYPE_MASK_EX(arginfo_class_ZipArchive_open, ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, flags, IS_LONG, 0, "0") ZEND_END_ARG_INFO() -ZEND_BEGIN_ARG_WITH_RETURN_TYPE_MASK_EX(arginfo_class_ZipArchive_openString, 0, 1, MAY_BE_BOOL|MAY_BE_LONG) - ZEND_ARG_TYPE_INFO(0, data, IS_STRING, 0) +ZEND_BEGIN_ARG_WITH_RETURN_TYPE_MASK_EX(arginfo_class_ZipArchive_openString, 0, 0, MAY_BE_BOOL|MAY_BE_LONG) + ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, data, IS_STRING, 0, "\'\'") + ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, flags, IS_LONG, 0, "0") ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_WITH_TENTATIVE_RETURN_TYPE_INFO_EX(arginfo_class_ZipArchive_setPassword, 0, 1, _IS_BOOL, 0) @@ -56,6 +57,9 @@ ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_WITH_TENTATIVE_RETURN_TYPE_INFO_EX(arginfo_class_ZipArchive_close, 0, 0, _IS_BOOL, 0) ZEND_END_ARG_INFO() +ZEND_BEGIN_ARG_WITH_RETURN_TYPE_MASK_EX(arginfo_class_ZipArchive_closeString, 0, 0, MAY_BE_STRING|MAY_BE_FALSE) +ZEND_END_ARG_INFO() + ZEND_BEGIN_ARG_WITH_TENTATIVE_RETURN_TYPE_INFO_EX(arginfo_class_ZipArchive_count, 0, 0, IS_LONG, 0) ZEND_END_ARG_INFO() @@ -320,6 +324,7 @@ ZEND_METHOD(ZipArchive, open); ZEND_METHOD(ZipArchive, openString); ZEND_METHOD(ZipArchive, setPassword); ZEND_METHOD(ZipArchive, close); +ZEND_METHOD(ZipArchive, closeString); ZEND_METHOD(ZipArchive, count); ZEND_METHOD(ZipArchive, getStatusString); ZEND_METHOD(ZipArchive, clearError); @@ -399,6 +404,7 @@ static const zend_function_entry class_ZipArchive_methods[] = { ZEND_ME(ZipArchive, openString, arginfo_class_ZipArchive_openString, ZEND_ACC_PUBLIC) ZEND_ME(ZipArchive, setPassword, arginfo_class_ZipArchive_setPassword, ZEND_ACC_PUBLIC) ZEND_ME(ZipArchive, close, arginfo_class_ZipArchive_close, ZEND_ACC_PUBLIC) + ZEND_ME(ZipArchive, closeString, arginfo_class_ZipArchive_closeString, ZEND_ACC_PUBLIC) ZEND_ME(ZipArchive, count, arginfo_class_ZipArchive_count, ZEND_ACC_PUBLIC) ZEND_ME(ZipArchive, getStatusString, arginfo_class_ZipArchive_getStatusString, ZEND_ACC_PUBLIC) ZEND_ME(ZipArchive, clearError, arginfo_class_ZipArchive_clearError, ZEND_ACC_PUBLIC) diff --git a/ext/zip/tests/ZipArchive_closeString_basic.phpt b/ext/zip/tests/ZipArchive_closeString_basic.phpt new file mode 100644 index 000000000000..852a7ebf53f3 --- /dev/null +++ b/ext/zip/tests/ZipArchive_closeString_basic.phpt @@ -0,0 +1,25 @@ +--TEST-- +ZipArchive::closeString() basic +--EXTENSIONS-- +zip +--FILE-- +openString(); +$zip->addFromString('test1', '1'); +$zip->addFromString('test2', '2'); +$contents = $zip->closeString(); +echo $contents ? "OK\n" : "FAILED\n"; + +$zip = new ZipArchive(); +$zip->openString($contents); +var_dump($zip->getFromName('test1')); +var_dump($zip->getFromName('test2')); +var_dump($zip->getFromName('nonexistent')); + +?> +--EXPECT-- +OK +string(1) "1" +string(1) "2" +bool(false) diff --git a/ext/zip/tests/ZipArchive_closeString_error.phpt b/ext/zip/tests/ZipArchive_closeString_error.phpt new file mode 100644 index 000000000000..d5dca14a97fc --- /dev/null +++ b/ext/zip/tests/ZipArchive_closeString_error.phpt @@ -0,0 +1,47 @@ +--TEST-- +ZipArchive::closeString() error cases +--EXTENSIONS-- +zip +--FILE-- +openString(); +var_dump($zip->open(__DIR__ . '/test.zip')); +try { + $zip->closeString(); +} catch (Error $e) { + echo $e->getMessage() . "\n"; +} + +echo "2.\n"; +$zip = new ZipArchive(); +$zip->openString('...'); +echo $zip->getStatusString() . "\n"; +try { + $zip->closeString(); +} catch (Error $e) { + echo $e->getMessage() . "\n"; +} + +echo "3.\n"; +$zip = new ZipArchive(); +$zip->openString(file_get_contents(__DIR__ . '/test.zip')); +echo gettype($zip->closeString()) . "\n"; +try { + $zip->closeString(); +} catch (Error $e) { + echo $e->getMessage() . "\n"; +} + +?> +--EXPECT-- +1. +bool(true) +ZipArchive::closeString can only be called on an archive opened with ZipArchive::openString +2. +Not a zip archive +Invalid or uninitialized Zip object +3. +string +Invalid or uninitialized Zip object diff --git a/ext/zip/tests/ZipArchive_closeString_false.phpt b/ext/zip/tests/ZipArchive_closeString_false.phpt new file mode 100644 index 000000000000..af5241f5c3b6 --- /dev/null +++ b/ext/zip/tests/ZipArchive_closeString_false.phpt @@ -0,0 +1,22 @@ +--TEST-- +ZipArchive::closeString() false return +--EXTENSIONS-- +zip +--FILE-- +openString($input)); +$zip->setCompressionIndex(0, ZipArchive::CM_DEFLATE); +var_dump($zip->closeString()); +echo $zip->getStatusString() . "\n"; +?> +--EXPECTREGEX-- +bool\(true\) + +Warning: ZipArchive::closeString\(\): (Zip archive inconsistent|Unexpected length of data).* +bool\(false\) +(Zip archive inconsistent|Unexpected length of data).* diff --git a/ext/zip/tests/ZipArchive_closeString_variation.phpt b/ext/zip/tests/ZipArchive_closeString_variation.phpt new file mode 100644 index 000000000000..a1922ebd8f1f --- /dev/null +++ b/ext/zip/tests/ZipArchive_closeString_variation.phpt @@ -0,0 +1,39 @@ +--TEST-- +ZipArchive::closeString() variations +--EXTENSIONS-- +zip +--FILE-- +openString(); +var_dump($zip->closeString()); +echo $zip->getStatusString() . "\n"; + +echo "2. Update existing archive\n"; +$input = file_get_contents(__DIR__ . '/test.zip'); +$zip = new ZipArchive(); +$zip->openString($input); +$zip->addFromString('entry1.txt', ''); +$result = $zip->closeString(); +echo gettype($result) . "\n"; +var_dump($input !== $result); + +echo "3. Unchanged existing archive\n"; +$zip = new ZipArchive(); +$zip->openString($input); +$result = $zip->closeString(); +echo gettype($result) . "\n"; +var_dump($input === $result); + +?> +--EXPECT-- +1. Empty archive creation +string(0) "" +No error +2. Update existing archive +string +bool(true) +3. Unchanged existing archive +string +bool(true) diff --git a/ext/zip/tests/ZipArchive_openString.phpt b/ext/zip/tests/ZipArchive_openString.phpt index f787b4a84933..2a11505fcf69 100644 --- a/ext/zip/tests/ZipArchive_openString.phpt +++ b/ext/zip/tests/ZipArchive_openString.phpt @@ -4,8 +4,10 @@ ZipArchive::openString() method zip --FILE-- openString(file_get_contents(__DIR__."/test_procedural.zip")); +$zip->openString($input, ZipArchive::RDONLY); for ($i = 0; $i < $zip->numFiles; $i++) { $stat = $zip->statIndex($i); @@ -17,8 +19,22 @@ var_dump($zip->addFromString("foobar/baz", "baz")); var_dump($zip->addEmptyDir("blub")); var_dump($zip->close()); + +echo "2. CREATE and EXCL flags\n"; +$zip = new ZipArchive(); +var_dump($zip->openString($input, ZipArchive::CREATE)); +var_dump($zip->openString($input, ZipArchive::EXCL)); +echo $zip->getStatusString() . "\n"; + +echo "3. CHECKCONS flag\n"; +$inconsistent = file_get_contents(__DIR__ . '/checkcons.zip'); +$zip = new ZipArchive(); +var_dump($zip->openString($inconsistent)); +var_dump($zip->openString($inconsistent, ZipArchive::CHECKCONS)); + ?> --EXPECTF-- +1. Open read-only and read directory foo bar foobar/ @@ -26,3 +42,10 @@ foobar/baz bool(false) bool(false) bool(true) +2. CREATE and EXCL flags +bool(true) +int(10) +File already exists +3. CHECKCONS flag +bool(true) +int(%d) diff --git a/ext/zip/tests/checkcons.zip b/ext/zip/tests/checkcons.zip new file mode 100644 index 000000000000..50bcea128a46 Binary files /dev/null and b/ext/zip/tests/checkcons.zip differ diff --git a/ext/zip/tests/gh21698.phpt b/ext/zip/tests/gh21698.phpt new file mode 100644 index 000000000000..d77b2152e72f --- /dev/null +++ b/ext/zip/tests/gh21698.phpt @@ -0,0 +1,21 @@ +--TEST-- +GH-21698 (ZipArchive::addGlob memory leak when open_basedir rejects the match) +--EXTENSIONS-- +zip +--FILE-- +open($zipfile, ZipArchive::CREATE | ZipArchive::OVERWRITE); + +ini_set('open_basedir', '/nonexistent_dir_for_gh21698'); +var_dump($zip->addGlob(__FILE__, 0, [])); +$zip->close(); +?> +--CLEAN-- + +--EXPECTF-- +Warning: ZipArchive::addGlob(): open_basedir restriction in effect. File(%s) is not within the allowed path(s): (%s) in %s on line %d +bool(false) diff --git a/ext/zip/tests/wrong-file-size.zip b/ext/zip/tests/wrong-file-size.zip new file mode 100644 index 000000000000..fc9fa1a434c7 Binary files /dev/null and b/ext/zip/tests/wrong-file-size.zip differ diff --git a/ext/zip/zip_source.c b/ext/zip/zip_source.c new file mode 100644 index 000000000000..03fa50867d56 --- /dev/null +++ b/ext/zip/zip_source.c @@ -0,0 +1,210 @@ +/* + +----------------------------------------------------------------------+ + | Copyright © The PHP Group and Contributors. | + +----------------------------------------------------------------------+ + | This source file is subject to the Modified BSD License that is | + | bundled with this package in the file LICENSE, and is available | + | through the World Wide Web at . | + | | + | SPDX-License-Identifier: BSD-3-Clause | + +----------------------------------------------------------------------+ + | Author: Tim Starling | + +----------------------------------------------------------------------+ +*/ + +#ifdef HAVE_CONFIG_H +# include "config.h" +#endif +#include "php.h" +#include "php_zip.h" + +typedef struct _php_zip_string_source { + /* The current string being read from */ + zend_string *in_str; + /* The offset into in_str of the current read position */ + size_t in_offset; + /* The modification time returned in stat calls */ + time_t mtime; + /* The current string being written to */ + zend_string *out_str; + /* The offset into out_str of the current write position */ + size_t out_offset; + /* A place to copy the result to when the archive is closed, or NULL */ + zend_string **dest; + /* The error to be returned when libzip asks for the last error code */ + zip_error_t error; +} php_zip_string_source; + +/* The source callback function, see https://libzip.org/documentation/zip_source_function.html + * This is similar to read_data() in libzip's zip_source_buffer.c */ +static zip_int64_t php_zip_string_cb(void *userdata, void *data, zip_uint64_t len, zip_source_cmd_t cmd) +{ + php_zip_string_source *ctx = userdata; + switch (cmd) { + case ZIP_SOURCE_SUPPORTS: + return zip_source_make_command_bitmap( + ZIP_SOURCE_FREE, +#if LIBZIP_VERSION_MAJOR > 1 || LIBZIP_VERSION_MINOR >= 10 + ZIP_SOURCE_SUPPORTS_REOPEN, +#endif + ZIP_SOURCE_OPEN, + ZIP_SOURCE_READ, + ZIP_SOURCE_CLOSE, + ZIP_SOURCE_STAT, + ZIP_SOURCE_ERROR, + ZIP_SOURCE_SEEK, + ZIP_SOURCE_TELL, + ZIP_SOURCE_BEGIN_WRITE, + ZIP_SOURCE_WRITE, + ZIP_SOURCE_COMMIT_WRITE, + ZIP_SOURCE_ROLLBACK_WRITE, + ZIP_SOURCE_SEEK_WRITE, + ZIP_SOURCE_TELL_WRITE, + ZIP_SOURCE_REMOVE, + -1 + ); + + case ZIP_SOURCE_FREE: + zend_string_release(ctx->out_str); + zend_string_release(ctx->in_str); + efree(ctx); + return 0; + + /* Read ops */ + + case ZIP_SOURCE_OPEN: + ctx->in_offset = 0; + return 0; + + case ZIP_SOURCE_READ: { + size_t remaining = ZSTR_LEN(ctx->in_str) - ctx->in_offset; + len = MIN(len, remaining); + if (len) { + memcpy(data, ZSTR_VAL(ctx->in_str) + ctx->in_offset, len); + ctx->in_offset += len; + } + return len; + } + + case ZIP_SOURCE_CLOSE: + return 0; + + case ZIP_SOURCE_STAT: { + zip_stat_t *st; + if (len < sizeof(*st)) { + zip_error_set(&ctx->error, ZIP_ER_INVAL, 0); + return -1; + } + + st = (zip_stat_t *)data; + zip_stat_init(st); + st->mtime = ctx->mtime; + st->size = ZSTR_LEN(ctx->in_str); + st->comp_size = st->size; + st->comp_method = ZIP_CM_STORE; + st->encryption_method = ZIP_EM_NONE; + st->valid = ZIP_STAT_MTIME | ZIP_STAT_SIZE | ZIP_STAT_COMP_SIZE | ZIP_STAT_COMP_METHOD | ZIP_STAT_ENCRYPTION_METHOD; + + return sizeof(*st); + } + + case ZIP_SOURCE_ERROR: + return zip_error_to_data(&ctx->error, data, len); + + /* Seekable read ops */ + + case ZIP_SOURCE_SEEK: { + zip_int64_t new_offset = zip_source_seek_compute_offset( + ctx->in_offset, ZSTR_LEN(ctx->in_str), data, len, &ctx->error); + if (new_offset < 0) { + return -1; + } + ctx->in_offset = (size_t)new_offset; + return 0; + } + + case ZIP_SOURCE_TELL: + if (ctx->in_offset > ZIP_INT64_MAX) { + zip_error_set(&ctx->error, ZIP_ER_TELL, EOVERFLOW); + return -1; + } + return (zip_int64_t)ctx->in_offset; + + /* Write ops */ + + case ZIP_SOURCE_BEGIN_WRITE: + zend_string_release(ctx->out_str); + ctx->out_str = ZSTR_EMPTY_ALLOC(); + return 0; + + case ZIP_SOURCE_WRITE: + if (ctx->out_offset > SIZE_MAX - len) { + zip_error_set(&ctx->error, ZIP_ER_MEMORY, 0); + return -1; + } + if (ctx->out_offset + len > ZSTR_LEN(ctx->out_str)) { + ctx->out_str = zend_string_realloc(ctx->out_str, ctx->out_offset + len, false); + } + memcpy(ZSTR_VAL(ctx->out_str) + ctx->out_offset, data, len); + ctx->out_offset += len; + return len; + + case ZIP_SOURCE_COMMIT_WRITE: + ZSTR_VAL(ctx->out_str)[ZSTR_LEN(ctx->out_str)] = '\0'; + zend_string_release(ctx->in_str); + ctx->in_str = ctx->out_str; + ctx->out_str = ZSTR_EMPTY_ALLOC(); + if (ctx->dest) { + zend_string_release(*(ctx->dest)); + *(ctx->dest) = zend_string_copy(ctx->in_str); + } + return 0; + + case ZIP_SOURCE_ROLLBACK_WRITE: + zend_string_release(ctx->out_str); + ctx->out_str = ZSTR_EMPTY_ALLOC(); + return 0; + + case ZIP_SOURCE_SEEK_WRITE: { + zip_int64_t new_offset = zip_source_seek_compute_offset( + ctx->out_offset, ZSTR_LEN(ctx->out_str), data, len, &ctx->error); + if (new_offset < 0) { + return -1; + } + ctx->out_offset = new_offset; + return 0; + } + + case ZIP_SOURCE_TELL_WRITE: + if (ctx->out_offset > ZIP_INT64_MAX) { + zip_error_set(&ctx->error, ZIP_ER_TELL, EOVERFLOW); + return -1; + } + return (zip_int64_t)ctx->out_offset; + + case ZIP_SOURCE_REMOVE: + zend_string_release(ctx->in_str); + ctx->in_str = ZSTR_EMPTY_ALLOC(); + ctx->in_offset = 0; + return 0; + + default: + zip_error_set(&ctx->error, ZIP_ER_OPNOTSUPP, 0); + return -1; + } +} + +zip_source_t * php_zip_create_string_source(zend_string *str, zend_string **dest, zip_error_t *err) +{ + php_zip_string_source *ctx = ecalloc(1, sizeof(php_zip_string_source)); + ctx->in_str = zend_string_copy(str); + ctx->out_str = ZSTR_EMPTY_ALLOC(); + ctx->dest = dest; + ctx->mtime = time(NULL); + + if (dest) { + *dest = zend_string_copy(str); + } + + return zip_source_function_create(php_zip_string_cb, (void*)ctx, err); +} diff --git a/ext/zip/zip_stream.c b/ext/zip/zip_stream.c index 9d6fb733575b..d4c24bd24e13 100644 --- a/ext/zip/zip_stream.c +++ b/ext/zip/zip_stream.c @@ -1,14 +1,12 @@ /* +----------------------------------------------------------------------+ - | Copyright (c) The PHP Group | + | Copyright © The PHP Group and Contributors. | +----------------------------------------------------------------------+ - | This source file is subject to version 3.01 of the PHP license, | - | that is bundled with this package in the file LICENSE, and is | - | available through the world-wide-web at the following url: | - | https://www.php.net/license/3_01.txt | - | If you did not receive a copy of the PHP license and are unable to | - | obtain it through the world-wide-web, please send a note to | - | license@php.net so we can mail you a copy immediately. | + | This source file is subject to the Modified BSD License that is | + | bundled with this package in the file LICENSE, and is available | + | through the World Wide Web at . | + | | + | SPDX-License-Identifier: BSD-3-Clause | +----------------------------------------------------------------------+ | Author: Piere-Alain Joye | +----------------------------------------------------------------------+ diff --git a/ext/zlib/php_zlib.h b/ext/zlib/php_zlib.h index b7a9484cd28f..c7286d5c858a 100644 --- a/ext/zlib/php_zlib.h +++ b/ext/zlib/php_zlib.h @@ -1,17 +1,15 @@ /* +----------------------------------------------------------------------+ - | Copyright (c) The PHP Group | + | Copyright © The PHP Group and Contributors. | +----------------------------------------------------------------------+ - | This source file is subject to version 3.01 of the PHP license, | - | that is bundled with this package in the file LICENSE, and is | - | available through the world-wide-web at the following url: | - | https://www.php.net/license/3_01.txt | - | If you did not receive a copy of the PHP license and are unable to | - | obtain it through the world-wide-web, please send a note to | - | license@php.net so we can mail you a copy immediately. | + | This source file is subject to the Modified BSD License that is | + | bundled with this package in the file LICENSE, and is available | + | through the World Wide Web at . | + | | + | SPDX-License-Identifier: BSD-3-Clause | +----------------------------------------------------------------------+ | Authors: Rasmus Lerdorf | - | Stefan R�hrich | + | Stefan Röhrich | | Michael Wallner | +----------------------------------------------------------------------+ */ diff --git a/ext/zlib/tests/bug55544-win.phpt b/ext/zlib/tests/bug55544-win.phpt index 11116da28b6d..02a1ac837000 100644 Binary files a/ext/zlib/tests/bug55544-win.phpt and b/ext/zlib/tests/bug55544-win.phpt differ diff --git a/ext/zlib/tests/data/func.inc b/ext/zlib/tests/data/func.inc deleted file mode 100644 index 73cfc4e06ffc..000000000000 --- a/ext/zlib/tests/data/func.inc +++ /dev/null @@ -1,18 +0,0 @@ - (\d+\.\d+\.\d+),s', $info, $match)) { - // $version = $match[1]; - if (preg_match(',zlib(?!.*libXML).*Compiled Version (=> | 'foo']); +} catch (TypeError $e) { + echo $e->getMessage(), PHP_EOL; +} + +try { + deflate_init(ZLIB_ENCODING_DEFLATE, ['memory' => []]); +} catch (TypeError $e) { + echo $e->getMessage(), PHP_EOL; +} + +try { + deflate_init(ZLIB_ENCODING_DEFLATE, ['window' => new A()]); +} catch (TypeError $e) { + echo $e->getMessage(), PHP_EOL; +} + +try { + deflate_init(ZLIB_ENCODING_DEFLATE, ['strategy' => $fp]); +} catch (TypeError $e) { + echo $e->getMessage(), PHP_EOL; +} + +fclose($fp); + +?> +--EXPECT-- +deflate_init(): Argument #2 ($options) the value for option "level" must be of type int, string given +deflate_init(): Argument #2 ($options) the value for option "memory" must be of type int, array given +deflate_init(): Argument #2 ($options) the value for option "window" must be of type int, A given +deflate_init(): Argument #2 ($options) the value for option "strategy" must be of type int, resource given diff --git a/ext/zlib/tests/gh22142.phpt b/ext/zlib/tests/gh22142.phpt new file mode 100644 index 000000000000..84397a4e85a9 --- /dev/null +++ b/ext/zlib/tests/gh22142.phpt @@ -0,0 +1,20 @@ +--TEST-- +GH-22142 (Assertion failure in zendi_try_get_long() on IS_UNDEF) +--EXTENSIONS-- +zlib +--FILE-- +getMessage(), PHP_EOL; +} + +?> +--EXPECT-- +deflate_init(): Argument #2 ($options) the value for option "level" must be of type int, null given diff --git a/ext/zlib/tests/gzencode_variation2-win32.phpt b/ext/zlib/tests/gzencode_variation2-win32.phpt index 2cc1f982089d..183d67f359b8 100644 --- a/ext/zlib/tests/gzencode_variation2-win32.phpt +++ b/ext/zlib/tests/gzencode_variation2-win32.phpt @@ -7,9 +7,8 @@ zlib if( substr(PHP_OS, 0, 3) != "WIN" ) { die("skip.. only for Windows"); } -include 'data/func.inc'; -if (version_compare(get_zlib_version(), "1.2.11") < 0) { - die("skip - at least zlib 1.2.11 required, got " . get_zlib_version()); +if (version_compare(ZLIB_VERSION, "1.2.11") < 0) { + die("skip - at least zlib 1.2.11 required, got " . ZLIB_VERSION); } ?> --FILE-- diff --git a/ext/zlib/tests/gzgetc_basic.phpt b/ext/zlib/tests/gzgetc_basic.phpt index ce366e4b6b31..3540332a740e 100644 --- a/ext/zlib/tests/gzgetc_basic.phpt +++ b/ext/zlib/tests/gzgetc_basic.phpt @@ -4,8 +4,7 @@ Test function gzgetc() by calling it with its expected arguments zlib 1.2.5 zlib --SKIPIF-- 0) { +if (version_compare(ZLIB_VERSION, '1.2.5') > 0) { die('skip - only for zlib <= 1.2.5'); } ?> diff --git a/ext/zlib/tests/gzgetc_basic_1.phpt b/ext/zlib/tests/gzgetc_basic_1.phpt index cf6da96e5612..82d7c1941327 100644 --- a/ext/zlib/tests/gzgetc_basic_1.phpt +++ b/ext/zlib/tests/gzgetc_basic_1.phpt @@ -4,9 +4,7 @@ Test function gzgetc() by calling it with its expected arguments zlib 1.2.7 zlib --SKIPIF-- = 1.2.7'); } ?> diff --git a/ext/zlib/tests/inflate_add_no_dict.phpt b/ext/zlib/tests/inflate_add_no_dict.phpt new file mode 100644 index 000000000000..da805e567022 --- /dev/null +++ b/ext/zlib/tests/inflate_add_no_dict.phpt @@ -0,0 +1,22 @@ +--TEST-- +inflate_add(): Z_NEED_DICT returned when no dictionary provided to inflate_init() +--EXTENSIONS-- +zlib +--FILE-- + $dict]); +$compressed = deflate_add($dc, $data, ZLIB_FINISH); + +// Inflate without supplying the dictionary +$ic = inflate_init(ZLIB_ENCODING_DEFLATE); +$result = inflate_add($ic, $compressed, ZLIB_SYNC_FLUSH); +var_dump($result); + +?> +--EXPECTF-- +Warning: inflate_add(): Inflating this data requires a preset dictionary, please specify it in the options array of inflate_init() in %s on line %d +bool(false) diff --git a/ext/zlib/tests/inflate_init_window_type_error.phpt b/ext/zlib/tests/inflate_init_window_type_error.phpt new file mode 100644 index 000000000000..fbca3129681e --- /dev/null +++ b/ext/zlib/tests/inflate_init_window_type_error.phpt @@ -0,0 +1,16 @@ +--TEST-- +inflate_init(): window option type validation +--EXTENSIONS-- +zlib +--FILE-- + []]); +} catch (TypeError $e) { + echo $e->getMessage(), PHP_EOL; +} + +?> +--EXPECT-- +inflate_init(): Argument #2 ($options) the value for option "window" must be of type int, array given diff --git a/ext/zlib/tests/zlib_filter_seek_deflate.phpt b/ext/zlib/tests/zlib_filter_seek_deflate.phpt new file mode 100644 index 000000000000..743f1be566fd --- /dev/null +++ b/ext/zlib/tests/zlib_filter_seek_deflate.phpt @@ -0,0 +1,52 @@ +--TEST-- +zlib.deflate write filter is not reset on seek +--EXTENSIONS-- +zlib +--FILE-- + +--CLEAN-- + +--EXPECTF-- +Size after write: %d +Seek to start: SUCCESS +Seek to middle: SUCCESS +Decompressed content matches: YES diff --git a/ext/zlib/tests/zlib_filter_seek_inflate.phpt b/ext/zlib/tests/zlib_filter_seek_inflate.phpt new file mode 100644 index 000000000000..2ca7508941cc --- /dev/null +++ b/ext/zlib/tests/zlib_filter_seek_inflate.phpt @@ -0,0 +1,45 @@ +--TEST-- +zlib.inflate filter with seek to start +--EXTENSIONS-- +zlib +--FILE-- + +--CLEAN-- + +--EXPECTF-- +First read (20 bytes): I am the very model +Seek to start: SUCCESS +Position after seek: 0 +Content after seek matches: YES + +Warning: fseek(): Stream filter zlib.inflate is seekable only to start position in %s on line %d +Seek to middle: FAILURE diff --git a/ext/zlib/tests/zlib_filter_write_seek_modes.phpt b/ext/zlib/tests/zlib_filter_write_seek_modes.phpt new file mode 100644 index 000000000000..39824a7283cf --- /dev/null +++ b/ext/zlib/tests/zlib_filter_write_seek_modes.phpt @@ -0,0 +1,78 @@ +--TEST-- +zlib.deflate write filter: write_seek_mode parameter +--EXTENSIONS-- +zlib +--FILE-- + 'reset']); +fwrite($fp, $text1); +ftruncate($fp, 0); +var_dump(fseek($fp, 0, SEEK_SET) === 0); +fwrite($fp, $text2); +fclose($fp); + +$fp = fopen($file, 'r'); +stream_filter_append($fp, 'zlib.inflate', STREAM_FILTER_READ); +$decoded = stream_get_contents($fp); +fclose($fp); +var_dump($decoded === $text2); + +/* "reset": only seekable to start */ +$fp = fopen($file, 'w+'); +stream_filter_append($fp, 'zlib.deflate', STREAM_FILTER_WRITE, + ['write_seek_mode' => 'reset']); +fwrite($fp, $text1); +var_dump(fseek($fp, 5, SEEK_SET) === 0); +fclose($fp); + +/* "preserve": same as default; seeks accepted, state preserved */ +$fp = fopen($file, 'w+'); +stream_filter_append($fp, 'zlib.deflate', STREAM_FILTER_WRITE, + ['write_seek_mode' => 'preserve']); +fwrite($fp, $text1); +var_dump(fseek($fp, 0, SEEK_SET) === 0); +var_dump(fseek($fp, 50, SEEK_SET) === 0); +fclose($fp); + +/* "strict": every write-chain seek fails */ +$fp = fopen($file, 'w+'); +stream_filter_append($fp, 'zlib.deflate', STREAM_FILTER_WRITE, + ['write_seek_mode' => 'strict']); +fwrite($fp, $text1); +var_dump(@fseek($fp, 0, SEEK_SET) === -1); +var_dump(@fseek($fp, 50, SEEK_SET) === -1); +fclose($fp); + +/* Invalid mode: ValueError */ +$fp = fopen($file, 'w+'); +stream_filter_append($fp, 'zlib.deflate', STREAM_FILTER_WRITE, + ['write_seek_mode' => 'rewind']); +fclose($fp); + +?> +--CLEAN-- + +--EXPECTF-- +bool(true) +bool(true) + +Warning: fseek(): Stream filter zlib.deflate is seekable only to start position in %s +bool(false) +bool(true) +bool(true) +bool(true) +bool(true) + +Warning: stream_filter_append(): "write_seek_mode" filter parameter must be one of "preserve", "reset", or "strict" in %s + +Warning: stream_filter_append(): Unable to create or locate filter "zlib.deflate" in %s diff --git a/ext/zlib/zlib.c b/ext/zlib/zlib.c index d5a89768ff62..5b630d74c889 100644 --- a/ext/zlib/zlib.c +++ b/ext/zlib/zlib.c @@ -1,14 +1,12 @@ /* +----------------------------------------------------------------------+ - | Copyright (c) The PHP Group | + | Copyright © The PHP Group and Contributors. | +----------------------------------------------------------------------+ - | This source file is subject to version 3.01 of the PHP license, | - | that is bundled with this package in the file LICENSE, and is | - | available through the world-wide-web at the following url: | - | https://www.php.net/license/3_01.txt | - | If you did not receive a copy of the PHP license and are unable to | - | obtain it through the world-wide-web, please send a note to | - | license@php.net so we can mail you a copy immediately. | + | This source file is subject to the Modified BSD License that is | + | bundled with this package in the file LICENSE, and is available | + | through the World Wide Web at . | + | | + | SPDX-License-Identifier: BSD-3-Clause | +----------------------------------------------------------------------+ | Authors: Rasmus Lerdorf | | Stefan Röhrich | @@ -49,9 +47,7 @@ ZEND_DECLARE_MODULE_GLOBALS(zlib) zend_class_entry *inflate_context_ce; static zend_object_handlers inflate_context_object_handlers; -static inline php_zlib_context *inflate_context_from_obj(zend_object *obj) { - return (php_zlib_context *)((char *)(obj) - XtOffsetOf(php_zlib_context, std)); -} +#define inflate_context_from_obj(obj) ZEND_CONTAINER_OF(obj, php_zlib_context, std) #define Z_INFLATE_CONTEXT_P(zv) inflate_context_from_obj(Z_OBJ_P(zv)) @@ -87,9 +83,7 @@ static void inflate_context_free_obj(zend_object *object) zend_class_entry *deflate_context_ce; static zend_object_handlers deflate_context_object_handlers; -static inline php_zlib_context *deflate_context_from_obj(zend_object *obj) { - return (php_zlib_context *)((char *)(obj) - XtOffsetOf(php_zlib_context, std)); -} +#define deflate_context_from_obj(obj) ZEND_CONTAINER_OF(obj, php_zlib_context, std) #define Z_DEFLATE_CONTEXT_P(zv) deflate_context_from_obj(Z_OBJ_P(zv)) @@ -856,6 +850,30 @@ static bool zlib_create_dictionary_string(HashTable *options, char **dict, size_ return true; } +ZEND_ATTRIBUTE_NONNULL static bool zlib_get_long_option(HashTable *options, const char *option_name, size_t option_name_len, zend_long *value) +{ + bool failed = false; + zval *option_buffer = zend_hash_str_find(options, option_name, option_name_len); + + if (!option_buffer) { + return true; + } + + /* The |H ZPP specifier may leave HashTable entries wrapped in IS_INDIRECT. */ + ZVAL_DEINDIRECT(option_buffer); + *value = zval_try_get_long(option_buffer, &failed); + if (UNEXPECTED(failed)) { + zend_argument_type_error( + 2, + "the value for option \"%.*s\" must be of type int, %s given", + (int) option_name_len, option_name, zend_zval_value_name(option_buffer) + ); + return false; + } + + return true; +} + /* {{{ Initialize an incremental inflate context with the specified encoding */ PHP_FUNCTION(inflate_init) { @@ -863,16 +881,14 @@ PHP_FUNCTION(inflate_init) zend_long encoding, window = 15; char *dict = NULL; size_t dictlen = 0; - HashTable *options = NULL; - zval *option_buffer; + HashTable *options = (HashTable *) &zend_empty_array; if (SUCCESS != zend_parse_parameters(ZEND_NUM_ARGS(), "l|H", &encoding, &options)) { RETURN_THROWS(); } - if (options && (option_buffer = zend_hash_str_find(options, ZEND_STRL("window"))) != NULL) { - ZVAL_DEINDIRECT(option_buffer); - window = zval_get_long(option_buffer); + if (!zlib_get_long_option(options, ZEND_STRL("window"), &window)) { + RETURN_THROWS(); } if (window < 8 || window > 15) { zend_value_error("zlib window size (logarithm) (" ZEND_LONG_FMT ") must be within 8..15", window); @@ -909,6 +925,7 @@ PHP_FUNCTION(inflate_init) } if (inflateInit2(&ctx->Z, encoding) != Z_OK) { + /* dict is stored in the ctx in the object and will thus be freed by zval_ptr_dtor(). */ zval_ptr_dtor(return_value); php_error_docref(NULL, E_WARNING, "Failed allocating zlib.inflate context"); RETURN_FALSE; @@ -925,7 +942,7 @@ PHP_FUNCTION(inflate_init) efree(ctx->inflateDict); ctx->inflateDict = NULL; break; - EMPTY_SWITCH_DEFAULT_CASE() + default: ZEND_UNREACHABLE(); } } } @@ -1022,10 +1039,11 @@ PHP_FUNCTION(inflate_add) zend_string_release_ex(out, 0); php_error_docref(NULL, E_WARNING, "Dictionary does not match expected dictionary (incorrect adler32 hash)"); RETURN_FALSE; - EMPTY_SWITCH_DEFAULT_CASE() + default: ZEND_UNREACHABLE(); } break; } else { + zend_string_release_ex(out, false); php_error_docref(NULL, E_WARNING, "Inflating this data requires a preset dictionary, please specify it in the options array of inflate_init()"); RETURN_FALSE; } @@ -1082,43 +1100,38 @@ PHP_FUNCTION(deflate_init) zend_long encoding, level = -1, memory = 8, window = 15, strategy = Z_DEFAULT_STRATEGY; char *dict = NULL; size_t dictlen = 0; - HashTable *options = NULL; - zval *option_buffer; + HashTable *options = (HashTable*)&zend_empty_array; if (SUCCESS != zend_parse_parameters(ZEND_NUM_ARGS(), "l|H", &encoding, &options)) { RETURN_THROWS(); } - if (options && (option_buffer = zend_hash_str_find(options, ZEND_STRL("level"))) != NULL) { - ZVAL_DEINDIRECT(option_buffer); - level = zval_get_long(option_buffer); + if (!zlib_get_long_option(options, ZEND_STRL("level"), &level)) { + RETURN_THROWS(); } if (level < -1 || level > 9) { zend_value_error("deflate_init(): \"level\" option must be between -1 and 9"); RETURN_THROWS(); } - if (options && (option_buffer = zend_hash_str_find(options, ZEND_STRL("memory"))) != NULL) { - ZVAL_DEINDIRECT(option_buffer); - memory = zval_get_long(option_buffer); + if (!zlib_get_long_option(options, ZEND_STRL("memory"), &memory)) { + RETURN_THROWS(); } if (memory < 1 || memory > 9) { zend_value_error("deflate_init(): \"memory\" option must be between 1 and 9"); RETURN_THROWS(); } - if (options && (option_buffer = zend_hash_str_find(options, ZEND_STRL("window"))) != NULL) { - ZVAL_DEINDIRECT(option_buffer); - window = zval_get_long(option_buffer); + if (!zlib_get_long_option(options, ZEND_STRL("window"), &window)) { + RETURN_THROWS(); } if (window < 8 || window > 15) { zend_value_error("deflate_init(): \"window\" option must be between 8 and 15"); RETURN_THROWS(); } - if (options && (option_buffer = zend_hash_str_find(options, ZEND_STRL("strategy"))) != NULL) { - ZVAL_DEINDIRECT(option_buffer); - strategy = zval_get_long(option_buffer); + if (!zlib_get_long_option(options, ZEND_STRL("strategy"), &strategy)) { + RETURN_THROWS(); } switch (strategy) { case Z_FILTERED: @@ -1159,6 +1172,7 @@ PHP_FUNCTION(deflate_init) } if (deflateInit2(&ctx->Z, level, Z_DEFLATED, encoding, memory, strategy) != Z_OK) { + efree(dict); zval_ptr_dtor(return_value); php_error_docref(NULL, E_WARNING, "Failed allocating zlib.deflate context"); RETURN_FALSE; @@ -1239,13 +1253,11 @@ PHP_FUNCTION(deflate_add) ZSTR_LEN(out) = (char *) ctx->Z.next_out - ZSTR_VAL(out); ZSTR_VAL(out)[ZSTR_LEN(out)] = 0; RETURN_STR(out); - break; case Z_STREAM_END: ZSTR_LEN(out) = (char *) ctx->Z.next_out - ZSTR_VAL(out); ZSTR_VAL(out)[ZSTR_LEN(out)] = 0; deflateReset(&ctx->Z); RETURN_STR(out); - break; default: zend_string_release_ex(out, 0); php_error_docref(NULL, E_WARNING, "zlib error (%s)", zError(status)); @@ -1265,7 +1277,6 @@ ZEND_GET_MODULE(php_zlib) static PHP_INI_MH(OnUpdate_zlib_output_compression) { int int_value; - char *ini_value; if (new_value == NULL) { return FAILURE; } @@ -1277,9 +1288,9 @@ static PHP_INI_MH(OnUpdate_zlib_output_compression) } else { int_value = (int) zend_ini_parse_quantity_warn(new_value, entry->name); } - ini_value = zend_ini_string("output_handler", sizeof("output_handler") - 1, 0); + const zend_string *ini_value = zend_ini_str_literal("output_handler"); - if (ini_value && *ini_value && int_value) { + if (ini_value && ZSTR_LEN(ini_value) > 0 && int_value) { php_error_docref("ref.outcontrol", E_CORE_ERROR, "Cannot use both zlib.output_compression and output_handler together!!"); return FAILURE; } @@ -1341,7 +1352,7 @@ static PHP_MINIT_FUNCTION(zlib) inflate_context_ce->default_object_handlers = &inflate_context_object_handlers; memcpy(&inflate_context_object_handlers, &std_object_handlers, sizeof(zend_object_handlers)); - inflate_context_object_handlers.offset = XtOffsetOf(php_zlib_context, std); + inflate_context_object_handlers.offset = offsetof(php_zlib_context, std); inflate_context_object_handlers.free_obj = inflate_context_free_obj; inflate_context_object_handlers.get_constructor = inflate_context_get_constructor; inflate_context_object_handlers.clone_obj = NULL; @@ -1352,7 +1363,7 @@ static PHP_MINIT_FUNCTION(zlib) deflate_context_ce->default_object_handlers = &deflate_context_object_handlers; memcpy(&deflate_context_object_handlers, &std_object_handlers, sizeof(zend_object_handlers)); - deflate_context_object_handlers.offset = XtOffsetOf(php_zlib_context, std); + deflate_context_object_handlers.offset = offsetof(php_zlib_context, std); deflate_context_object_handlers.free_obj = deflate_context_free_obj; deflate_context_object_handlers.get_constructor = deflate_context_get_constructor; deflate_context_object_handlers.clone_obj = NULL; diff --git a/ext/zlib/zlib_filter.c b/ext/zlib/zlib_filter.c index e42132fd0008..2d0e4fbb7fa4 100644 --- a/ext/zlib/zlib_filter.c +++ b/ext/zlib/zlib_filter.c @@ -1,14 +1,12 @@ /* +----------------------------------------------------------------------+ - | Copyright (c) The PHP Group | + | Copyright © The PHP Group and Contributors. | +----------------------------------------------------------------------+ - | This source file is subject to version 3.01 of the PHP license, | - | that is bundled with this package in the file LICENSE, and is | - | available through the world-wide-web at the following url: | - | https://www.php.net/license/3_01.txt | - | If you did not receive a copy of the PHP license and are unable to | - | obtain it through the world-wide-web, please send a note to | - | license@php.net so we can mail you a copy immediately. | + | This source file is subject to the Modified BSD License that is | + | bundled with this package in the file LICENSE, and is available | + | through the World Wide Web at . | + | | + | SPDX-License-Identifier: BSD-3-Clause | +----------------------------------------------------------------------+ | Authors: Sara Golemon (pollita@php.net) | +----------------------------------------------------------------------+ @@ -28,6 +26,7 @@ typedef struct _php_zlib_filter_data { size_t outbuf_len; int persistent; bool finished; /* for zlib.deflate: signals that no flush is pending */ + int windowBits; } php_zlib_filter_data; /* }}} */ @@ -143,6 +142,47 @@ static php_stream_filter_status_t php_zlib_inflate_filter( return exit_status; } +static zend_result php_zlib_inflate_seek( + php_stream *stream, + php_stream_filter *thisfilter, + zend_off_t offset, + int whence + ) +{ + int status; + + if (!thisfilter || !Z_PTR(thisfilter->abstract)) { + return FAILURE; + } + + php_zlib_filter_data *data = Z_PTR(thisfilter->abstract); + + if (data->finished) { + /* Stream was ended, need to reinitialize */ + status = inflateInit2(&(data->strm), data->windowBits); + if (status != Z_OK) { + php_error_docref(NULL, E_WARNING, "zlib.inflate: failed to reinitialize inflation state"); + return FAILURE; + } + } else { + /* Stream is active, just reset it */ + status = inflateReset(&(data->strm)); + if (status != Z_OK) { + php_error_docref(NULL, E_WARNING, "zlib.inflate: failed to reset inflation state"); + return FAILURE; + } + } + + /* Reset our own state */ + data->strm.next_in = data->inbuf; + data->strm.avail_in = 0; + data->strm.next_out = data->outbuf; + data->strm.avail_out = data->outbuf_len; + data->finished = false; + + return SUCCESS; +} + static void php_zlib_inflate_dtor(php_stream_filter *thisfilter) { if (thisfilter && Z_PTR(thisfilter->abstract)) { @@ -158,6 +198,7 @@ static void php_zlib_inflate_dtor(php_stream_filter *thisfilter) static const php_stream_filter_ops php_zlib_inflate_ops = { php_zlib_inflate_filter, + php_zlib_inflate_seek, php_zlib_inflate_dtor, "zlib.inflate" }; @@ -259,6 +300,38 @@ static php_stream_filter_status_t php_zlib_deflate_filter( return exit_status; } +static zend_result php_zlib_deflate_seek( + php_stream *stream, + php_stream_filter *thisfilter, + zend_off_t offset, + int whence + ) +{ + int status; + + if (!thisfilter || !Z_PTR(thisfilter->abstract)) { + return FAILURE; + } + + php_zlib_filter_data *data = Z_PTR(thisfilter->abstract); + + /* Reset zlib deflation state */ + status = deflateReset(&(data->strm)); + if (status != Z_OK) { + php_error_docref(NULL, E_WARNING, "zlib.deflate: failed to reset deflation state"); + return FAILURE; + } + + /* Reset our own state */ + data->strm.next_in = data->inbuf; + data->strm.avail_in = 0; + data->strm.next_out = data->outbuf; + data->strm.avail_out = data->outbuf_len; + data->finished = true; + + return SUCCESS; +} + static void php_zlib_deflate_dtor(php_stream_filter *thisfilter) { if (thisfilter && Z_PTR(thisfilter->abstract)) { @@ -272,6 +345,7 @@ static void php_zlib_deflate_dtor(php_stream_filter *thisfilter) static const php_stream_filter_ops php_zlib_deflate_ops = { php_zlib_deflate_filter, + php_zlib_deflate_seek, php_zlib_deflate_dtor, "zlib.deflate" }; @@ -280,12 +354,17 @@ static const php_stream_filter_ops php_zlib_deflate_ops = { /* {{{ zlib.* common factory */ -static php_stream_filter *php_zlib_filter_create(const char *filtername, zval *filterparams, uint8_t persistent) +static php_stream_filter *php_zlib_filter_create(const char *filtername, zval *filterparams, bool persistent) { const php_stream_filter_ops *fops = NULL; + php_stream_filter_seekable_t write_seekable; php_zlib_filter_data *data; int status; + if (php_stream_filter_parse_write_seek_mode(filterparams, &write_seekable) == FAILURE) { + return NULL; + } + /* Create this filter */ data = pecalloc(1, sizeof(php_zlib_filter_data), persistent); if (!data) { @@ -315,6 +394,7 @@ static php_stream_filter *php_zlib_filter_create(const char *filtername, zval *f } data->strm.data_type = Z_ASCII; + data->persistent = persistent; if (strcasecmp(filtername, "zlib.inflate") == 0) { int windowBits = -MAX_WBITS; @@ -334,6 +414,9 @@ static php_stream_filter *php_zlib_filter_create(const char *filtername, zval *f } } + /* Save configuration for reset */ + data->windowBits = windowBits; + /* RFC 1951 Inflate */ data->finished = false; status = inflateInit2(&(data->strm), windowBits); @@ -401,6 +484,10 @@ static php_stream_filter *php_zlib_filter_create(const char *filtername, zval *f php_error_docref(NULL, E_WARNING, "Invalid filter parameter, ignored"); } } + + /* Save configuration for reset */ + data->windowBits = windowBits; + status = deflateInit2(&(data->strm), level, Z_DEFLATED, windowBits, memLevel, 0); data->finished = true; fops = &php_zlib_deflate_ops; @@ -416,7 +503,7 @@ static php_stream_filter *php_zlib_filter_create(const char *filtername, zval *f return NULL; } - return php_stream_filter_alloc(fops, data, persistent); + return php_stream_filter_alloc(fops, data, persistent, PSFS_SEEKABLE_START, write_seekable); } const php_stream_filter_factory php_zlib_filter_factory = { diff --git a/ext/zlib/zlib_fopen_wrapper.c b/ext/zlib/zlib_fopen_wrapper.c index 7420c0cc6ff2..aebf368a16ed 100644 --- a/ext/zlib/zlib_fopen_wrapper.c +++ b/ext/zlib/zlib_fopen_wrapper.c @@ -1,14 +1,12 @@ /* +----------------------------------------------------------------------+ - | Copyright (c) The PHP Group | + | Copyright © The PHP Group and Contributors. | +----------------------------------------------------------------------+ - | This source file is subject to version 3.01 of the PHP license, | - | that is bundled with this package in the file LICENSE, and is | - | available through the world-wide-web at the following url: | - | https://www.php.net/license/3_01.txt | - | If you did not receive a copy of the PHP license and are unable to | - | obtain it through the world-wide-web, please send a note to | - | license@php.net so we can mail you a copy immediately. | + | This source file is subject to the Modified BSD License that is | + | bundled with this package in the file LICENSE, and is available | + | through the World Wide Web at . | + | | + | SPDX-License-Identifier: BSD-3-Clause | +----------------------------------------------------------------------+ | Author: Wez Furlong , based on work by: | | Hartmut Holzgraefe | diff --git a/gcovr.cfg b/gcovr.cfg new file mode 100644 index 000000000000..7ee4cff356e8 --- /dev/null +++ b/gcovr.cfg @@ -0,0 +1,23 @@ +print-summary = yes + +exclude-throw-branches = yes +exclude-unreachable-branches = yes + +exclude = ext/bcmath/libbcmath/.* +exclude = ext/date/lib/.* +exclude = ext/fileinfo/libmagic/.* +exclude = ext/gd/libgd/.* +exclude = ext/hash/sha3/.* +exclude = ext/lexbor/lexbor/.* +exclude = ext/mbstring/libmbfl/.* +exclude = ext/opcache/jit/ir/.* +exclude = ext/pcre/pcre2lib/.* +exclude = ext/uri/uriparser/.* +exclude = Zend/Optimizer/ssa_integrity\.c +exclude = Zend/Optimizer/zend_dump\.c + +# These patterns have implicit ^/$ anchors. +exclude-lines-by-pattern = .*\b(ZEND_PARSE_PARAMETERS_(START|END|NONE)|Z_PARAM_).* +exclude-lines-by-pattern = \s*(default:\s*)?ZEND_UNREACHABLE\(\);\s* +exclude-lines-by-pattern = \s*if \(ctx->debug_level & ZEND_DUMP_\w+\) \{\s* +exclude-lines-by-pattern = \s*zend_dump_op_array\(.*\);\s* diff --git a/main/SAPI.c b/main/SAPI.c index 2fd7e18adcea..62e1c89e4bb9 100644 --- a/main/SAPI.c +++ b/main/SAPI.c @@ -1,14 +1,12 @@ /* +----------------------------------------------------------------------+ - | Copyright (c) The PHP Group | + | Copyright © The PHP Group and Contributors. | +----------------------------------------------------------------------+ - | This source file is subject to version 3.01 of the PHP license, | - | that is bundled with this package in the file LICENSE, and is | - | available through the world-wide-web at the following url: | - | https://www.php.net/license/3_01.txt | - | If you did not receive a copy of the PHP license and are unable to | - | obtain it through the world-wide-web, please send a note to | - | license@php.net so we can mail you a copy immediately. | + | This source file is subject to the Modified BSD License that is | + | bundled with this package in the file LICENSE, and is available | + | through the World Wide Web at . | + | | + | SPDX-License-Identifier: BSD-3-Clause | +----------------------------------------------------------------------+ | Original design: Shane Caraveo | | Authors: Andi Gutmans | @@ -191,7 +189,7 @@ SAPI_API void sapi_read_post_data(void) *p = 0; break; default: - *p = tolower(*p); + *p = tolower((unsigned char)*p); break; } } @@ -733,10 +731,10 @@ SAPI_API int sapi_header_op(sapi_header_op_enum op, void *arg) } /* cut off trailing spaces, linefeeds and carriage-returns */ - if (header_line_len && isspace(header_line[header_line_len-1])) { + if (header_line_len && isspace((unsigned char)header_line[header_line_len - 1])) { do { header_line_len--; - } while(header_line_len && isspace(header_line[header_line_len-1])); + } while(header_line_len && isspace((unsigned char)header_line[header_line_len - 1])); header_line[header_line_len]='\0'; } diff --git a/main/SAPI.h b/main/SAPI.h index 9196982f5495..e62f686603c4 100644 --- a/main/SAPI.h +++ b/main/SAPI.h @@ -1,14 +1,12 @@ /* +----------------------------------------------------------------------+ - | Copyright (c) The PHP Group | + | Copyright © The PHP Group and Contributors. | +----------------------------------------------------------------------+ - | This source file is subject to version 3.01 of the PHP license, | - | that is bundled with this package in the file LICENSE, and is | - | available through the world-wide-web at the following url: | - | https://www.php.net/license/3_01.txt | - | If you did not receive a copy of the PHP license and are unable to | - | obtain it through the world-wide-web, please send a note to | - | license@php.net so we can mail you a copy immediately. | + | This source file is subject to the Modified BSD License that is | + | bundled with this package in the file LICENSE, and is available | + | through the World Wide Web at . | + | | + | SPDX-License-Identifier: BSD-3-Clause | +----------------------------------------------------------------------+ | Author: Zeev Suraski | +----------------------------------------------------------------------+ diff --git a/main/build-defs.h.in b/main/build-defs.h.in index 72cd9c30fb74..2c62998fc586 100644 --- a/main/build-defs.h.in +++ b/main/build-defs.h.in @@ -1,14 +1,12 @@ /* +----------------------------------------------------------------------+ - | Copyright (c) The PHP Group | + | Copyright © The PHP Group and Contributors. | +----------------------------------------------------------------------+ - | This source file is subject to version 3.01 of the PHP license, | - | that is bundled with this package in the file LICENSE, and is | - | available through the world-wide-web at the following url: | - | https://www.php.net/license/3_01.txt | - | If you did not receive a copy of the PHP license and are unable to | - | obtain it through the world-wide-web, please send a note to | - | license@php.net so we can mail you a copy immediately. | + | This source file is subject to the Modified BSD License that is | + | bundled with this package in the file LICENSE, and is available | + | through the World Wide Web at . | + | | + | SPDX-License-Identifier: BSD-3-Clause | +----------------------------------------------------------------------+ | Author: Stig Sæther Bakken | +----------------------------------------------------------------------+ diff --git a/main/explicit_bzero.c b/main/explicit_bzero.c index c49bdede6624..541c9f408e9a 100644 --- a/main/explicit_bzero.c +++ b/main/explicit_bzero.c @@ -1,16 +1,12 @@ /* +----------------------------------------------------------------------+ - | Copyright (c) The PHP Group | + | Copyright © The PHP Group and Contributors. | +----------------------------------------------------------------------+ - | This source file is subject to version 3.01 of the PHP license, | - | that is bundled with this package in the file LICENSE, and is | - | available through the world-wide-web at the following url: | - | https://www.php.net/license/3_01.txt | - | If you did not receive a copy of the PHP license and are unable to | - | obtain it through the world-wide-web, please send a note to | - | license@php.net so we can mail you a copy immediately. | - +----------------------------------------------------------------------+ - | Author: | + | This source file is subject to the Modified BSD License that is | + | bundled with this package in the file LICENSE, and is available | + | through the World Wide Web at . | + | | + | SPDX-License-Identifier: BSD-3-Clause | +----------------------------------------------------------------------+ */ diff --git a/main/fastcgi.c b/main/fastcgi.c index 3488d6e21eae..02ef614f4639 100644 --- a/main/fastcgi.c +++ b/main/fastcgi.c @@ -1,14 +1,12 @@ /* +----------------------------------------------------------------------+ - | Copyright (c) The PHP Group | + | Copyright © The PHP Group and Contributors. | +----------------------------------------------------------------------+ - | This source file is subject to version 3.01 of the PHP license, | - | that is bundled with this package in the file LICENSE, and is | - | available through the world-wide-web at the following url: | - | https://www.php.net/license/3_01.txt | - | If you did not receive a copy of the PHP license and are unable to | - | obtain it through the world-wide-web, please send a note to | - | license@php.net so we can mail you a copy immediately. | + | This source file is subject to the Modified BSD License that is | + | bundled with this package in the file LICENSE, and is available | + | through the World Wide Web at . | + | | + | SPDX-License-Identifier: BSD-3-Clause | +----------------------------------------------------------------------+ | Authors: Dmitry Stogov | +----------------------------------------------------------------------+ @@ -737,7 +735,7 @@ int fcgi_listen(const char *path, int backlog) memset(&sa.sa_unix, 0, sizeof(sa.sa_unix)); sa.sa_unix.sun_family = AF_UNIX; memcpy(sa.sa_unix.sun_path, path, path_len + 1); - sock_len = XtOffsetOf(struct sockaddr_un, sun_path) + path_len; + sock_len = offsetof(struct sockaddr_un, sun_path) + path_len; #ifdef HAVE_STRUCT_SOCKADDR_UN_SUN_LEN sa.sa_unix.sun_len = sock_len; #endif diff --git a/main/fastcgi.h b/main/fastcgi.h index 8a1c0516a9c7..c1e7deb181f6 100644 --- a/main/fastcgi.h +++ b/main/fastcgi.h @@ -1,14 +1,12 @@ /* +----------------------------------------------------------------------+ - | Copyright (c) The PHP Group | + | Copyright © The PHP Group and Contributors. | +----------------------------------------------------------------------+ - | This source file is subject to version 3.01 of the PHP license, | - | that is bundled with this package in the file LICENSE, and is | - | available through the world-wide-web at the following url: | - | https://www.php.net/license/3_01.txt | - | If you did not receive a copy of the PHP license and are unable to | - | obtain it through the world-wide-web, please send a note to | - | license@php.net so we can mail you a copy immediately. | + | This source file is subject to the Modified BSD License that is | + | bundled with this package in the file LICENSE, and is available | + | through the World Wide Web at . | + | | + | SPDX-License-Identifier: BSD-3-Clause | +----------------------------------------------------------------------+ | Authors: Dmitry Stogov | +----------------------------------------------------------------------+ diff --git a/main/fopen_wrappers.c b/main/fopen_wrappers.c index b6f32ce309dc..c0f88ad3b5ba 100644 --- a/main/fopen_wrappers.c +++ b/main/fopen_wrappers.c @@ -1,14 +1,12 @@ /* +----------------------------------------------------------------------+ - | Copyright (c) The PHP Group | + | Copyright © The PHP Group and Contributors. | +----------------------------------------------------------------------+ - | This source file is subject to version 3.01 of the PHP license, | - | that is bundled with this package in the file LICENSE, and is | - | available through the world-wide-web at the following url: | - | https://www.php.net/license/3_01.txt | - | If you did not receive a copy of the PHP license and are unable to | - | obtain it through the world-wide-web, please send a note to | - | license@php.net so we can mail you a copy immediately. | + | This source file is subject to the Modified BSD License that is | + | bundled with this package in the file LICENSE, and is available | + | through the World Wide Web at . | + | | + | SPDX-License-Identifier: BSD-3-Clause | +----------------------------------------------------------------------+ | Authors: Rasmus Lerdorf | | Jim Winstead | @@ -510,7 +508,7 @@ PHPAPI zend_string *php_resolve_path(const char *filename, size_t filename_lengt } /* Don't resolve paths which contain protocol (except of file://) */ - for (p = filename; isalnum((int)*p) || *p == '+' || *p == '-' || *p == '.'; p++); + for (p = filename; isalnum((unsigned char)*p) || *p == '+' || *p == '-' || *p == '.'; p++); if ((*p == ':') && (p - filename > 1) && (p[1] == '/') && (p[2] == '/')) { wrapper = php_stream_locate_url_wrapper(filename, &actual_path, STREAM_OPEN_FOR_INCLUDE); if (wrapper == &php_plain_files_wrapper) { @@ -542,7 +540,7 @@ PHPAPI zend_string *php_resolve_path(const char *filename, size_t filename_lengt /* Check for stream wrapper */ int is_stream_wrapper = 0; - for (p = ptr; isalnum((int)*p) || *p == '+' || *p == '-' || *p == '.'; p++); + for (p = ptr; isalnum((unsigned char)*p) || *p == '+' || *p == '-' || *p == '.'; p++); if ((*p == ':') && (p - ptr > 1) && (p[1] == '/') && (p[2] == '/')) { /* .:// or ..:// is not a stream wrapper */ if (p[-1] != '.' || p[-2] != '.' || p - 2 != ptr) { @@ -617,7 +615,7 @@ PHPAPI zend_string *php_resolve_path(const char *filename, size_t filename_lengt actual_path = trypath; /* Check for stream wrapper */ - for (p = trypath; isalnum((int)*p) || *p == '+' || *p == '-' || *p == '.'; p++); + for (p = trypath; isalnum((unsigned char)*p) || *p == '+' || *p == '-' || *p == '.'; p++); if ((*p == ':') && (p - trypath > 1) && (p[1] == '/') && (p[2] == '/')) { wrapper = php_stream_locate_url_wrapper(trypath, &actual_path, STREAM_OPEN_FOR_INCLUDE); if (!wrapper) { diff --git a/main/fopen_wrappers.h b/main/fopen_wrappers.h index 1a1289836ba3..62bebca9b715 100644 --- a/main/fopen_wrappers.h +++ b/main/fopen_wrappers.h @@ -1,14 +1,12 @@ /* +----------------------------------------------------------------------+ - | Copyright (c) The PHP Group | + | Copyright © The PHP Group and Contributors. | +----------------------------------------------------------------------+ - | This source file is subject to version 3.01 of the PHP license, | - | that is bundled with this package in the file LICENSE, and is | - | available through the world-wide-web at the following url: | - | https://www.php.net/license/3_01.txt | - | If you did not receive a copy of the PHP license and are unable to | - | obtain it through the world-wide-web, please send a note to | - | license@php.net so we can mail you a copy immediately. | + | This source file is subject to the Modified BSD License that is | + | bundled with this package in the file LICENSE, and is available | + | through the World Wide Web at . | + | | + | SPDX-License-Identifier: BSD-3-Clause | +----------------------------------------------------------------------+ | Author: Jim Winstead | +----------------------------------------------------------------------+ @@ -30,9 +28,6 @@ PHPAPI int php_check_open_basedir(const char *path); PHPAPI int php_check_open_basedir_ex(const char *path, int warn); PHPAPI int php_check_specific_open_basedir(const char *basedir, const char *path); -/* OPENBASEDIR_CHECKPATH(filename) to ease merge between 6.x and 5.x */ -#define OPENBASEDIR_CHECKPATH(filename) php_check_open_basedir(filename) - PHPAPI zend_string *php_resolve_path(const char *filename, size_t filename_len, const char *path); PHPAPI FILE *php_fopen_with_path(const char *filename, const char *mode, const char *path, zend_string **opened_path); diff --git a/main/getopt.c b/main/getopt.c index 65ce94ae9bb0..210c32152415 100644 --- a/main/getopt.c +++ b/main/getopt.c @@ -1,14 +1,12 @@ /* +----------------------------------------------------------------------+ - | Copyright (c) The PHP Group | + | Copyright © The PHP Group and Contributors. | +----------------------------------------------------------------------+ - | This source file is subject to version 3.01 of the PHP license, | - | that is bundled with this package in the file LICENSE, and is | - | available through the world-wide-web at the following url: | - | https://www.php.net/license/3_01.txt | - | If you did not receive a copy of the PHP license and are unable to | - | obtain it through the world-wide-web, please send a note to | - | license@php.net so we can mail you a copy immediately. | + | This source file is subject to the Modified BSD License that is | + | bundled with this package in the file LICENSE, and is available | + | through the World Wide Web at . | + | | + | SPDX-License-Identifier: BSD-3-Clause | +----------------------------------------------------------------------+ | Author: Marcus Boerger | +----------------------------------------------------------------------+ @@ -20,15 +18,14 @@ #include #include "php_getopt.h" -#define OPTERRCOLON (1) -#define OPTERRNF (2) -#define OPTERRARG (3) +#define OPTERRCOLON 1 +#define OPTERRNF 2 +#define OPTERRARG 3 // Print error message to stderr and return -2 to distinguish it from '?' command line option. static int php_opt_error(int argc, char * const *argv, int optint, int optchr, int err, int show_err) /* {{{ */ { - if (show_err) - { + if (show_err) { fprintf(stderr, "Error in argument %d, char %d: ", optint, optchr+1); switch(err) { @@ -59,8 +56,11 @@ PHPAPI int php_getopt(int argc, char* const *argv, const opt_struct opts[], char static char **prev_optarg = NULL; php_optidx = -1; + if (optarg) { + *optarg = NULL; + } - if(prev_optarg && prev_optarg != optarg) { + if (prev_optarg && prev_optarg != optarg) { /* reset the state */ optchr = 0; dash = 0; @@ -68,20 +68,18 @@ PHPAPI int php_getopt(int argc, char* const *argv, const opt_struct opts[], char prev_optarg = optarg; if (*optind >= argc) { - return(EOF); + return EOF; } if (!dash) { - if ((argv[*optind][0] != '-')) { - return(EOF); - } else { - if (!argv[*optind][1]) - { - /* - * use to specify stdin. Need to let pgm process this and - * the following args - */ - return(EOF); - } + if (argv[*optind][0] != '-') { + return EOF; + } + if (!argv[*optind][1]) { + /* + * use to specify stdin. Need to let pgm process this and + * the following args + */ + return EOF; } } if ((argv[*optind][0] == '-') && (argv[*optind][1] == '-')) { @@ -91,7 +89,7 @@ PHPAPI int php_getopt(int argc, char* const *argv, const opt_struct opts[], char /* '--' indicates end of args if not followed by a known long option name */ if (argv[*optind][2] == '\0') { (*optind)++; - return(EOF); + return EOF; } arg_start = 2; @@ -108,7 +106,7 @@ PHPAPI int php_getopt(int argc, char* const *argv, const opt_struct opts[], char php_optidx++; if (opts[php_optidx].opt_char == '-') { (*optind)++; - return(php_opt_error(argc, argv, *optind-1, optchr, OPTERRARG, show_err)); + return php_opt_error(argc, argv, *optind-1, optchr, OPTERRARG, show_err); } else if (opts[php_optidx].opt_name && !strncmp(&argv[*optind][2], opts[php_optidx].opt_name, arg_end) && arg_end == strlen(opts[php_optidx].opt_name)) { break; } @@ -126,7 +124,7 @@ PHPAPI int php_getopt(int argc, char* const *argv, const opt_struct opts[], char if (argv[*optind][optchr] == ':') { dash = 0; (*optind)++; - return (php_opt_error(argc, argv, *optind-1, optchr, OPTERRCOLON, show_err)); + return php_opt_error(argc, argv, *optind-1, optchr, OPTERRCOLON, show_err); } arg_start = 1 + optchr; } @@ -144,7 +142,7 @@ PHPAPI int php_getopt(int argc, char* const *argv, const opt_struct opts[], char optchr++; arg_start++; } - return(php_opt_error(argc, argv, errind, errchr, OPTERRNF, show_err)); + return php_opt_error(argc, argv, errind, errchr, OPTERRNF, show_err); } else if (argv[*optind][optchr] == opts[php_optidx].opt_char) { break; } @@ -159,7 +157,7 @@ PHPAPI int php_getopt(int argc, char* const *argv, const opt_struct opts[], char if (*optind == argc) { /* Was the value required or is it optional? */ if (opts[php_optidx].need_param == 1) { - return(php_opt_error(argc, argv, *optind-1, optchr, OPTERRARG, show_err)); + return php_opt_error(argc, argv, *optind-1, optchr, OPTERRARG, show_err); } /* Optional value is not supported with - style */ } else if (opts[php_optidx].need_param == 1) { @@ -177,8 +175,7 @@ PHPAPI int php_getopt(int argc, char* const *argv, const opt_struct opts[], char } else { /* multiple options specified as one (exclude long opts) */ if (arg_start >= 2 && !((argv[*optind][0] == '-') && (argv[*optind][1] == '-'))) { - if (!argv[*optind][optchr+1]) - { + if (!argv[*optind][optchr+1]) { dash = 0; (*optind)++; } else { @@ -190,6 +187,6 @@ PHPAPI int php_getopt(int argc, char* const *argv, const opt_struct opts[], char return opts[php_optidx].opt_char; } assert(0); - return(0); /* never reached */ + return 0; /* never reached */ } /* }}} */ diff --git a/main/http_status_codes.h b/main/http_status_codes.h index f29921122d57..e39ba21daf15 100644 --- a/main/http_status_codes.h +++ b/main/http_status_codes.h @@ -1,14 +1,12 @@ /* +----------------------------------------------------------------------+ - | Copyright (c) The PHP Group | + | Copyright © The PHP Group and Contributors. | +----------------------------------------------------------------------+ - | This source file is subject to version 3.01 of the PHP license, | - | that is bundled with this package in the file LICENSE, and is | - | available through the world-wide-web at the following url: | - | https://www.php.net/license/3_01.txt | - | If you did not receive a copy of the PHP license and are unable to | - | obtain it through the world-wide-web, please send a note to | - | license@php.net so we can mail you a copy immediately. | + | This source file is subject to the Modified BSD License that is | + | bundled with this package in the file LICENSE, and is available | + | through the World Wide Web at . | + | | + | SPDX-License-Identifier: BSD-3-Clause | +----------------------------------------------------------------------+ | Author: Andrea Faulds | +----------------------------------------------------------------------+ diff --git a/main/internal_functions.c.in b/main/internal_functions.c.in index cef0a438c682..de22e2237dbe 100644 --- a/main/internal_functions.c.in +++ b/main/internal_functions.c.in @@ -1,14 +1,12 @@ /* +----------------------------------------------------------------------+ - | Copyright (c) The PHP Group | + | Copyright © The PHP Group and Contributors. | +----------------------------------------------------------------------+ - | This source file is subject to version 3.01 of the PHP license, | - | that is bundled with this package in the file LICENSE, and is | - | available through the world-wide-web at the following url: | - | https://www.php.net/license/3_01.txt | - | If you did not receive a copy of the PHP license and are unable to | - | obtain it through the world-wide-web, please send a note to | - | license@php.net so we can mail you a copy immediately. | + | This source file is subject to the Modified BSD License that is | + | bundled with this package in the file LICENSE, and is available | + | through the World Wide Web at . | + | | + | SPDX-License-Identifier: BSD-3-Clause | +----------------------------------------------------------------------+ | Authors: Andi Gutmans | | Zeev Suraski | diff --git a/main/main.c b/main/main.c index bbd2d18ba187..6bda55ac8746 100644 --- a/main/main.c +++ b/main/main.c @@ -1,14 +1,12 @@ /* +----------------------------------------------------------------------+ - | Copyright (c) The PHP Group | + | Copyright © The PHP Group and Contributors. | +----------------------------------------------------------------------+ - | This source file is subject to version 3.01 of the PHP license, | - | that is bundled with this package in the file LICENSE, and is | - | available through the world-wide-web at the following url: | - | https://www.php.net/license/3_01.txt | - | If you did not receive a copy of the PHP license and are unable to | - | obtain it through the world-wide-web, please send a note to | - | license@php.net so we can mail you a copy immediately. | + | This source file is subject to the Modified BSD License that is | + | bundled with this package in the file LICENSE, and is available | + | through the World Wide Web at . | + | | + | SPDX-License-Identifier: BSD-3-Clause | +----------------------------------------------------------------------+ | Authors: Andi Gutmans | | Rasmus Lerdorf | @@ -64,6 +62,7 @@ #include "win32/php_registry.h" #include "ext/standard/flock_compat.h" #endif +#include "Zend/zend_builtin_functions.h" #include "Zend/zend_exceptions.h" #if PHP_SIGCHILD @@ -147,7 +146,7 @@ PHPAPI char *php_get_version(sapi_module_struct *sapi_module) " GCOV" #endif ); - smart_string_appends(&version_info, "Copyright (c) The PHP Group\n"); + smart_string_appends(&version_info, "Copyright © The PHP Group and Contributors\n"); const char *build_provider = php_build_provider(); if (build_provider) { @@ -803,6 +802,7 @@ PHP_INI_BEGIN() STD_PHP_INI_ENTRY_EX("display_errors", "1", PHP_INI_ALL, OnUpdateDisplayErrors, display_errors, php_core_globals, core_globals, display_errors_mode) STD_PHP_INI_BOOLEAN("display_startup_errors", "1", PHP_INI_ALL, OnUpdateBool, display_startup_errors, php_core_globals, core_globals) STD_PHP_INI_BOOLEAN("enable_dl", "1", PHP_INI_SYSTEM, OnUpdateBool, enable_dl, php_core_globals, core_globals) + STD_PHP_INI_BOOLEAN("error_include_args", "0", PHP_INI_ALL, OnUpdateBool, error_include_args, php_core_globals, core_globals) STD_PHP_INI_BOOLEAN("expose_php", "1", PHP_INI_SYSTEM, OnUpdateBool, expose_php, php_core_globals, core_globals) STD_PHP_INI_ENTRY("docref_root", "", PHP_INI_ALL, OnUpdateString, docref_root, php_core_globals, core_globals) STD_PHP_INI_ENTRY("docref_ext", "", PHP_INI_ALL, OnUpdateString, docref_ext, php_core_globals, core_globals) @@ -1134,7 +1134,14 @@ PHPAPI ZEND_COLD void php_verror(const char *docref, const char *params, int typ /* if we still have memory then format the origin */ if (is_function) { - origin_len = spprintf(&origin, 0, "%s%s%s(%s)", class_name, space, function, params); + zend_string *dynamic_params = NULL; + if (PG(error_include_args)) { + dynamic_params = zend_trace_current_function_args_string(); + } + origin_len = spprintf(&origin, 0, "%s%s%s(%s)", class_name, space, function, dynamic_params ? ZSTR_VAL(dynamic_params) : params); + if (dynamic_params) { + zend_string_release(dynamic_params); + } } else { origin_len = strlen(function); origin = estrndup(function, origin_len); @@ -1471,8 +1478,8 @@ static ZEND_COLD void php_error_cb(int orig_type, zend_string *error_filename, c if (PG(xmlrpc_errors)) { php_printf("faultCode" ZEND_LONG_FMT "faultString%s:%s in %s on line %" PRIu32 "%s%s", PG(xmlrpc_error_number), error_type_str, ZSTR_VAL(message), ZSTR_VAL(error_filename), error_lineno, ZSTR_LEN(backtrace) ? "\nStack trace:\n" : "", ZSTR_VAL(backtrace)); } else { - char *prepend_string = INI_STR("error_prepend_string"); - char *append_string = INI_STR("error_append_string"); + const char *prepend_string = zend_ini_string_literal("error_prepend_string"); + const char *append_string = zend_ini_string_literal("error_append_string"); if (PG(html_errors)) { if (type == E_ERROR || type == E_PARSE) { @@ -2374,7 +2381,7 @@ zend_result php_module_startup(sapi_module_struct *sf, zend_module_entry *additi } /* disable certain functions as requested by php.ini */ - zend_disable_functions(INI_STR("disable_functions")); + zend_disable_functions(zend_ini_string_literal("disable_functions")); /* make core report what it should */ if ((module = zend_hash_str_find_ptr(&module_registry, "core", sizeof("core")-1)) != NULL) { @@ -2638,7 +2645,7 @@ PHPAPI bool php_execute_script_ex(zend_file_handle *primary_file, zval *retval) #ifdef PHP_WIN32 zend_unset_timeout(); #endif - zend_set_timeout(INI_INT("max_execution_time"), 0); + zend_set_timeout(zend_ini_long_literal("max_execution_time"), false); } if (prepend_file_p && result) { diff --git a/main/network.c b/main/network.c index 54dbf2b8e580..90d1716b5582 100644 --- a/main/network.c +++ b/main/network.c @@ -1,14 +1,12 @@ /* +----------------------------------------------------------------------+ - | Copyright (c) The PHP Group | + | Copyright © The PHP Group and Contributors. | +----------------------------------------------------------------------+ - | This source file is subject to version 3.01 of the PHP license, | - | that is bundled with this package in the file LICENSE, and is | - | available through the world-wide-web at the following url: | - | https://www.php.net/license/3_01.txt | - | If you did not receive a copy of the PHP license and are unable to | - | obtain it through the world-wide-web, please send a note to | - | license@php.net so we can mail you a copy immediately. | + | This source file is subject to the Modified BSD License that is | + | bundled with this package in the file LICENSE, and is available | + | through the World Wide Web at . | + | | + | SPDX-License-Identifier: BSD-3-Clause | +----------------------------------------------------------------------+ | Author: Stig Venaas | | Streams work by Wez Furlong | @@ -1461,7 +1459,7 @@ static struct hostent * gethostname_re (const char *host,struct hostent *hostbuf if (*hstbuflen == 0) { *hstbuflen = 1024; - *tmphstbuf = (char *)malloc (*hstbuflen); + *tmphstbuf = (char *)pemalloc(*hstbuflen, true); } while (( res = @@ -1469,7 +1467,7 @@ static struct hostent * gethostname_re (const char *host,struct hostent *hostbuf && (errno == ERANGE)) { /* Enlarge the buffer. */ *hstbuflen *= 2; - *tmphstbuf = (char *)realloc (*tmphstbuf,*hstbuflen); + *tmphstbuf = (char *)perealloc(*tmphstbuf, *hstbuflen, true); } if (res != 0) { @@ -1487,7 +1485,7 @@ static struct hostent * gethostname_re (const char *host,struct hostent *hostbuf if (*hstbuflen == 0) { *hstbuflen = 1024; - *tmphstbuf = (char *)malloc (*hstbuflen); + *tmphstbuf = (char *)pemalloc(*hstbuflen, true); } while ((NULL == ( hp = @@ -1495,7 +1493,7 @@ static struct hostent * gethostname_re (const char *host,struct hostent *hostbuf && (errno == ERANGE)) { /* Enlarge the buffer. */ *hstbuflen *= 2; - *tmphstbuf = (char *)realloc (*tmphstbuf,*hstbuflen); + *tmphstbuf = (char *)perealloc(*tmphstbuf, *hstbuflen, true); } return hp; } @@ -1505,11 +1503,11 @@ static struct hostent * gethostname_re (const char *host,struct hostent *hostbuf { if (*hstbuflen == 0) { *hstbuflen = sizeof(struct hostent_data); - *tmphstbuf = (char *)malloc (*hstbuflen); + *tmphstbuf = (char *)pemalloc(*hstbuflen, true); } else { if (*hstbuflen < sizeof(struct hostent_data)) { *hstbuflen = sizeof(struct hostent_data); - *tmphstbuf = (char *)realloc(*tmphstbuf, *hstbuflen); + *tmphstbuf = (char *)perealloc(*tmphstbuf, *hstbuflen, true); } } memset((void *)(*tmphstbuf),0,*hstbuflen); diff --git a/main/output.c b/main/output.c index 98684955e394..664adf7f1688 100644 --- a/main/output.c +++ b/main/output.c @@ -1,14 +1,12 @@ /* +----------------------------------------------------------------------+ - | Copyright (c) The PHP Group | + | Copyright © The PHP Group and Contributors. | +----------------------------------------------------------------------+ - | This source file is subject to version 3.01 of the PHP license, | - | that is bundled with this package in the file LICENSE, and is | - | available through the world-wide-web at the following url: | - | https://www.php.net/license/3_01.txt | - | If you did not receive a copy of the PHP license and are unable to | - | obtain it through the world-wide-web, please send a note to | - | license@php.net so we can mail you a copy immediately. | + | This source file is subject to the Modified BSD License that is | + | bundled with this package in the file LICENSE, and is available | + | through the World Wide Web at . | + | | + | SPDX-License-Identifier: BSD-3-Clause | +----------------------------------------------------------------------+ | Authors: Zeev Suraski | | Thies C. Arntzen | @@ -972,6 +970,7 @@ static inline php_output_handler_status_t php_output_handler_op(php_output_handl handler->func.user->fci.param_count = 2; handler->func.user->fci.params = ob_args; handler->func.user->fci.retval = &retval; + handler->func.user->fci.consumed_args = zend_fci_consumed_arg(0); if (SUCCESS == zend_call_function(&handler->func.user->fci, &handler->func.user->fcc) && Z_TYPE(retval) != IS_UNDEF) { if (handler->flags & PHP_OUTPUT_HANDLER_PRODUCED_OUTPUT) { diff --git a/main/php.h b/main/php.h index 32222cfca94e..44076b2c294d 100644 --- a/main/php.h +++ b/main/php.h @@ -1,14 +1,12 @@ /* +----------------------------------------------------------------------+ - | Copyright (c) The PHP Group | + | Copyright © The PHP Group and Contributors. | +----------------------------------------------------------------------+ - | This source file is subject to version 3.01 of the PHP license, | - | that is bundled with this package in the file LICENSE, and is | - | available through the world-wide-web at the following url: | - | https://www.php.net/license/3_01.txt | - | If you did not receive a copy of the PHP license and are unable to | - | obtain it through the world-wide-web, please send a note to | - | license@php.net so we can mail you a copy immediately. | + | This source file is subject to the Modified BSD License that is | + | bundled with this package in the file LICENSE, and is available | + | through the World Wide Web at . | + | | + | SPDX-License-Identifier: BSD-3-Clause | +----------------------------------------------------------------------+ | Authors: Andi Gutmans | | Zeev Suraski | diff --git a/main/php_compat.h b/main/php_compat.h index 2f9f4c1c89e6..68bc4e7550f8 100644 --- a/main/php_compat.h +++ b/main/php_compat.h @@ -1,16 +1,12 @@ /* +----------------------------------------------------------------------+ - | Copyright (c) The PHP Group | + | Copyright © The PHP Group and Contributors. | +----------------------------------------------------------------------+ - | This source file is subject to version 3.01 of the PHP license, | - | that is bundled with this package in the file LICENSE, and is | - | available through the world-wide-web at the following url: | - | https://www.php.net/license/3_01.txt | - | If you did not receive a copy of the PHP license and are unable to | - | obtain it through the world-wide-web, please send a note to | - | license@php.net so we can mail you a copy immediately. | - +----------------------------------------------------------------------+ - | Author: | + | This source file is subject to the Modified BSD License that is | + | bundled with this package in the file LICENSE, and is available | + | through the World Wide Web at . | + | | + | SPDX-License-Identifier: BSD-3-Clause | +----------------------------------------------------------------------+ */ diff --git a/main/php_content_types.c b/main/php_content_types.c index f01841986728..c727d0ed3314 100644 --- a/main/php_content_types.c +++ b/main/php_content_types.c @@ -1,16 +1,12 @@ /* +----------------------------------------------------------------------+ - | Copyright (c) The PHP Group | + | Copyright © The PHP Group and Contributors. | +----------------------------------------------------------------------+ - | This source file is subject to version 3.01 of the PHP license, | - | that is bundled with this package in the file LICENSE, and is | - | available through the world-wide-web at the following url: | - | https://www.php.net/license/3_01.txt | - | If you did not receive a copy of the PHP license and are unable to | - | obtain it through the world-wide-web, please send a note to | - | license@php.net so we can mail you a copy immediately. | - +----------------------------------------------------------------------+ - | Author: | + | This source file is subject to the Modified BSD License that is | + | bundled with this package in the file LICENSE, and is available | + | through the World Wide Web at . | + | | + | SPDX-License-Identifier: BSD-3-Clause | +----------------------------------------------------------------------+ */ diff --git a/main/php_content_types.h b/main/php_content_types.h index 6aab33e29421..e734bb1963cd 100644 --- a/main/php_content_types.h +++ b/main/php_content_types.h @@ -1,16 +1,12 @@ /* +----------------------------------------------------------------------+ - | Copyright (c) The PHP Group | + | Copyright © The PHP Group and Contributors. | +----------------------------------------------------------------------+ - | This source file is subject to version 3.01 of the PHP license, | - | that is bundled with this package in the file LICENSE, and is | - | available through the world-wide-web at the following url: | - | https://www.php.net/license/3_01.txt | - | If you did not receive a copy of the PHP license and are unable to | - | obtain it through the world-wide-web, please send a note to | - | license@php.net so we can mail you a copy immediately. | - +----------------------------------------------------------------------+ - | Author: | + | This source file is subject to the Modified BSD License that is | + | bundled with this package in the file LICENSE, and is available | + | through the World Wide Web at . | + | | + | SPDX-License-Identifier: BSD-3-Clause | +----------------------------------------------------------------------+ */ diff --git a/main/php_getopt.h b/main/php_getopt.h index 0238881113a7..6f457f3a58da 100644 --- a/main/php_getopt.h +++ b/main/php_getopt.h @@ -1,14 +1,12 @@ /* +----------------------------------------------------------------------+ - | Copyright (c) The PHP Group | + | Copyright © The PHP Group and Contributors. | +----------------------------------------------------------------------+ - | This source file is subject to version 3.01 of the PHP license, | - | that is bundled with this package in the file LICENSE, and is | - | available through the world-wide-web at the following url: | - | https://www.php.net/license/3_01.txt | - | If you did not receive a copy of the PHP license and are unable to | - | obtain it through the world-wide-web, please send a note to | - | license@php.net so we can mail you a copy immediately. | + | This source file is subject to the Modified BSD License that is | + | bundled with this package in the file LICENSE, and is available | + | through the World Wide Web at . | + | | + | SPDX-License-Identifier: BSD-3-Clause | +----------------------------------------------------------------------+ | Author: Marcus Boerger | +----------------------------------------------------------------------+ diff --git a/main/php_globals.h b/main/php_globals.h index 893bf25d26cb..8a032e9edb13 100644 --- a/main/php_globals.h +++ b/main/php_globals.h @@ -1,14 +1,12 @@ /* +----------------------------------------------------------------------+ - | Copyright (c) The PHP Group | + | Copyright © The PHP Group and Contributors. | +----------------------------------------------------------------------+ - | This source file is subject to version 3.01 of the PHP license, | - | that is bundled with this package in the file LICENSE, and is | - | available through the world-wide-web at the following url: | - | https://www.php.net/license/3_01.txt | - | If you did not receive a copy of the PHP license and are unable to | - | obtain it through the world-wide-web, please send a note to | - | license@php.net so we can mail you a copy immediately. | + | This source file is subject to the Modified BSD License that is | + | bundled with this package in the file LICENSE, and is available | + | through the World Wide Web at . | + | | + | SPDX-License-Identifier: BSD-3-Clause | +----------------------------------------------------------------------+ | Author: Zeev Suraski | +----------------------------------------------------------------------+ @@ -61,6 +59,7 @@ struct _php_core_globals { uint8_t display_errors; bool display_startup_errors; + bool error_include_args; bool log_errors; bool ignore_repeated_errors; bool ignore_repeated_source; diff --git a/main/php_ini.c b/main/php_ini.c index e464c05d1fcc..a3b33da65bab 100644 --- a/main/php_ini.c +++ b/main/php_ini.c @@ -1,14 +1,12 @@ /* +----------------------------------------------------------------------+ - | Copyright (c) The PHP Group | + | Copyright © The PHP Group and Contributors. | +----------------------------------------------------------------------+ - | This source file is subject to version 3.01 of the PHP license, | - | that is bundled with this package in the file LICENSE, and is | - | available through the world-wide-web at the following url: | - | https://www.php.net/license/3_01.txt | - | If you did not receive a copy of the PHP license and are unable to | - | obtain it through the world-wide-web, please send a note to | - | license@php.net so we can mail you a copy immediately. | + | This source file is subject to the Modified BSD License that is | + | bundled with this package in the file LICENSE, and is available | + | through the World Wide Web at . | + | | + | SPDX-License-Identifier: BSD-3-Clause | +----------------------------------------------------------------------+ | Author: Zeev Suraski | +----------------------------------------------------------------------+ @@ -39,7 +37,7 @@ char *tmp = path; \ while (*tmp) { \ if (*tmp == '\\') *tmp = '/'; \ - else *tmp = tolower(*tmp); \ + else *tmp = tolower((unsigned char)*tmp); \ tmp++; \ } \ } @@ -334,7 +332,7 @@ static void php_load_zend_extension_cb(void *arg) } else { DL_HANDLE handle; char *libpath; - char *extension_dir = INI_STR("extension_dir"); + const char *extension_dir = zend_ini_string_literal("extension_dir"); int slash_suffix = 0; char *err1, *err2; @@ -696,7 +694,7 @@ void php_init_config(void) if (total_l) { size_t php_ini_scanned_files_len = (php_ini_scanned_files) ? strlen(php_ini_scanned_files) + 1 : 0; - php_ini_scanned_files = (char *) realloc(php_ini_scanned_files, php_ini_scanned_files_len + total_l + 1); + php_ini_scanned_files = (char *) perealloc(php_ini_scanned_files, php_ini_scanned_files_len + total_l + 1, true); if (!php_ini_scanned_files_len) { *php_ini_scanned_files = '\0'; } diff --git a/main/php_ini.h b/main/php_ini.h index 4253ce43fbe1..ffc2c36186c9 100644 --- a/main/php_ini.h +++ b/main/php_ini.h @@ -1,14 +1,12 @@ /* +----------------------------------------------------------------------+ - | Copyright (c) The PHP Group | + | Copyright © The PHP Group and Contributors. | +----------------------------------------------------------------------+ - | This source file is subject to version 3.01 of the PHP license, | - | that is bundled with this package in the file LICENSE, and is | - | available through the world-wide-web at the following url: | - | https://www.php.net/license/3_01.txt | - | If you did not receive a copy of the PHP license and are unable to | - | obtain it through the world-wide-web, please send a note to | - | license@php.net so we can mail you a copy immediately. | + | This source file is subject to the Modified BSD License that is | + | bundled with this package in the file LICENSE, and is available | + | through the World Wide Web at . | + | | + | SPDX-License-Identifier: BSD-3-Clause | +----------------------------------------------------------------------+ | Author: Zeev Suraski | +----------------------------------------------------------------------+ diff --git a/main/php_ini_builder.c b/main/php_ini_builder.c index d214a340343f..cdc10f0b5e25 100644 --- a/main/php_ini_builder.c +++ b/main/php_ini_builder.c @@ -1,14 +1,12 @@ /* +----------------------------------------------------------------------+ - | Copyright (c) The PHP Group | + | Copyright © The PHP Group and Contributors. | +----------------------------------------------------------------------+ - | This source file is subject to version 3.01 of the PHP license, | - | that is bundled with this package in the file LICENSE, and is | - | available through the world-wide-web at the following url: | - | https://www.php.net/license/3_01.txt | - | If you did not receive a copy of the PHP license and are unable to | - | obtain it through the world-wide-web, please send a note to | - | license@php.net so we can mail you a copy immediately. | + | This source file is subject to the Modified BSD License that is | + | bundled with this package in the file LICENSE, and is available | + | through the World Wide Web at . | + | | + | SPDX-License-Identifier: BSD-3-Clause | +----------------------------------------------------------------------+ | Authors: Max Kellermann | +----------------------------------------------------------------------+ @@ -67,7 +65,7 @@ PHPAPI void php_ini_builder_define(struct php_ini_builder *b, const char *arg) if (val != NULL) { val++; - if (!isalnum(*val) && *val != '"' && *val != '\'' && *val != '\0') { + if (!isalnum((unsigned char)*val) && *val != '"' && *val != '\'' && *val != '\0') { php_ini_builder_quoted(b, arg, val - arg - 1, val, arg + len - val); } else { php_ini_builder_realloc(b, len + strlen("\n")); diff --git a/main/php_ini_builder.h b/main/php_ini_builder.h index 7f5be81c10ac..9f73cba13cb7 100644 --- a/main/php_ini_builder.h +++ b/main/php_ini_builder.h @@ -1,14 +1,12 @@ /* +----------------------------------------------------------------------+ - | Copyright (c) The PHP Group | + | Copyright © The PHP Group and Contributors. | +----------------------------------------------------------------------+ - | This source file is subject to version 3.01 of the PHP license, | - | that is bundled with this package in the file LICENSE, and is | - | available through the world-wide-web at the following url: | - | https://www.php.net/license/3_01.txt | - | If you did not receive a copy of the PHP license and are unable to | - | obtain it through the world-wide-web, please send a note to | - | license@php.net so we can mail you a copy immediately. | + | This source file is subject to the Modified BSD License that is | + | bundled with this package in the file LICENSE, and is available | + | through the World Wide Web at . | + | | + | SPDX-License-Identifier: BSD-3-Clause | +----------------------------------------------------------------------+ | Authors: Max Kellermann | +----------------------------------------------------------------------+ @@ -62,7 +60,7 @@ static inline char *php_ini_builder_finish(struct php_ini_builder *b) static inline void php_ini_builder_realloc(struct php_ini_builder *b, size_t delta) { /* reserve enough space for the null terminator */ - b->value = realloc(b->value, b->length + delta + 1); + b->value = perealloc(b->value, b->length + delta + 1, true); } /** diff --git a/main/php_main.h b/main/php_main.h index bd28a0dee1d7..de2ace1c25ed 100644 --- a/main/php_main.h +++ b/main/php_main.h @@ -1,14 +1,12 @@ /* +----------------------------------------------------------------------+ - | Copyright (c) The PHP Group | + | Copyright © The PHP Group and Contributors. | +----------------------------------------------------------------------+ - | This source file is subject to version 3.01 of the PHP license, | - | that is bundled with this package in the file LICENSE, and is | - | available through the world-wide-web at the following url: | - | https://www.php.net/license/3_01.txt | - | If you did not receive a copy of the PHP license and are unable to | - | obtain it through the world-wide-web, please send a note to | - | license@php.net so we can mail you a copy immediately. | + | This source file is subject to the Modified BSD License that is | + | bundled with this package in the file LICENSE, and is available | + | through the World Wide Web at . | + | | + | SPDX-License-Identifier: BSD-3-Clause | +----------------------------------------------------------------------+ | Authors: Andi Gutmans | | Zeev Suraski | diff --git a/main/php_memory_streams.h b/main/php_memory_streams.h index 0b7f51ee6d90..cf83ba8e084e 100644 --- a/main/php_memory_streams.h +++ b/main/php_memory_streams.h @@ -1,14 +1,12 @@ /* +----------------------------------------------------------------------+ - | Copyright (c) The PHP Group | + | Copyright © The PHP Group and Contributors. | +----------------------------------------------------------------------+ - | This source file is subject to version 3.01 of the PHP license, | - | that is bundled with this package in the file LICENSE, and is | - | available through the world-wide-web at the following url: | - | https://www.php.net/license/3_01.txt | - | If you did not receive a copy of the PHP license and are unable to | - | obtain it through the world-wide-web, please send a note to | - | license@php.net so we can mail you a copy immediately. | + | This source file is subject to the Modified BSD License that is | + | bundled with this package in the file LICENSE, and is available | + | through the World Wide Web at . | + | | + | SPDX-License-Identifier: BSD-3-Clause | +----------------------------------------------------------------------+ | Author: Marcus Boerger | +----------------------------------------------------------------------+ diff --git a/main/php_network.h b/main/php_network.h index 6700ab42dd3f..e6d3009a6c82 100644 --- a/main/php_network.h +++ b/main/php_network.h @@ -1,14 +1,12 @@ /* +----------------------------------------------------------------------+ - | Copyright (c) The PHP Group | + | Copyright © The PHP Group and Contributors. | +----------------------------------------------------------------------+ - | This source file is subject to version 3.01 of the PHP license, | - | that is bundled with this package in the file LICENSE, and is | - | available through the world-wide-web at the following url: | - | https://www.php.net/license/3_01.txt | - | If you did not receive a copy of the PHP license and are unable to | - | obtain it through the world-wide-web, please send a note to | - | license@php.net so we can mail you a copy immediately. | + | This source file is subject to the Modified BSD License that is | + | bundled with this package in the file LICENSE, and is available | + | through the World Wide Web at . | + | | + | SPDX-License-Identifier: BSD-3-Clause | +----------------------------------------------------------------------+ | Author: Stig Venaas | +----------------------------------------------------------------------+ diff --git a/main/php_odbc_utils.c b/main/php_odbc_utils.c index 5cba835f81e3..797a4ac04be1 100644 --- a/main/php_odbc_utils.c +++ b/main/php_odbc_utils.c @@ -1,14 +1,12 @@ /* +----------------------------------------------------------------------+ - | Copyright (c) The PHP Group | + | Copyright © The PHP Group and Contributors. | +----------------------------------------------------------------------+ - | This source file is subject to version 3.01 of the PHP license, | - | that is bundled with this package in the file LICENSE, and is | - | available through the world-wide-web at the following url: | - | https://www.php.net/license/3_01.txt | - | If you did not receive a copy of the PHP license and are unable to | - | obtain it through the world-wide-web, please send a note to | - | license@php.net so we can mail you a copy immediately. | + | This source file is subject to the Modified BSD License that is | + | bundled with this package in the file LICENSE, and is available | + | through the World Wide Web at . | + | | + | SPDX-License-Identifier: BSD-3-Clause | +----------------------------------------------------------------------+ | Authors: Calvin Buckley | +----------------------------------------------------------------------+ @@ -73,12 +71,20 @@ PHPAPI bool php_odbc_connstr_should_quote(const char *str) } /** - * Estimates the worst-case scenario for a quoted version of a string's size. + * Gets the length of a string after it has been quoted. */ -PHPAPI size_t php_odbc_connstr_estimate_quote_length(const char *in_str) +PHPAPI size_t php_odbc_connstr_get_quoted_length(const char *in_str) { - /* Assume all '}'. Include '{,' '}', and the null terminator too */ - return (strlen(in_str) * 2) + 3; + /* Start with including the quotes ({}) and the null terminator */ + size_t size = 3; + /* Scan the string like strlen, doubling each } character. */ + while (*in_str) { + size++; + if (*in_str++ == '}') { + size++; + } + } + return size; } /** diff --git a/main/php_odbc_utils.h b/main/php_odbc_utils.h index 183957d6dd12..f2bc46ebc5ba 100644 --- a/main/php_odbc_utils.h +++ b/main/php_odbc_utils.h @@ -1,14 +1,12 @@ /* +----------------------------------------------------------------------+ - | Copyright (c) The PHP Group | + | Copyright © The PHP Group and Contributors. | +----------------------------------------------------------------------+ - | This source file is subject to version 3.01 of the PHP license, | - | that is bundled with this package in the file LICENSE, and is | - | available through the world-wide-web at the following url: | - | https://www.php.net/license/3_01.txt | - | If you did not receive a copy of the PHP license and are unable to | - | obtain it through the world-wide-web, please send a note to | - | license@php.net so we can mail you a copy immediately. | + | This source file is subject to the Modified BSD License that is | + | bundled with this package in the file LICENSE, and is available | + | through the World Wide Web at . | + | | + | SPDX-License-Identifier: BSD-3-Clause | +----------------------------------------------------------------------+ | Authors: Calvin Buckley | +----------------------------------------------------------------------+ @@ -18,5 +16,5 @@ PHPAPI bool php_odbc_connstr_is_quoted(const char *str); PHPAPI bool php_odbc_connstr_should_quote(const char *str); -PHPAPI size_t php_odbc_connstr_estimate_quote_length(const char *in_str); +PHPAPI size_t php_odbc_connstr_get_quoted_length(const char *in_str); PHPAPI size_t php_odbc_connstr_quote(char *out_str, const char *in_str, size_t out_str_size); diff --git a/main/php_open_temporary_file.c b/main/php_open_temporary_file.c index 3a410eb7fa2d..ffc1c754d9e6 100644 --- a/main/php_open_temporary_file.c +++ b/main/php_open_temporary_file.c @@ -1,14 +1,12 @@ /* +----------------------------------------------------------------------+ - | Copyright (c) The PHP Group | + | Copyright © The PHP Group and Contributors. | +----------------------------------------------------------------------+ - | This source file is subject to version 3.01 of the PHP license, | - | that is bundled with this package in the file LICENSE, and is | - | available through the world-wide-web at the following url: | - | https://www.php.net/license/3_01.txt | - | If you did not receive a copy of the PHP license and are unable to | - | obtain it through the world-wide-web, please send a note to | - | license@php.net so we can mail you a copy immediately. | + | This source file is subject to the Modified BSD License that is | + | bundled with this package in the file LICENSE, and is available | + | through the World Wide Web at . | + | | + | SPDX-License-Identifier: BSD-3-Clause | +----------------------------------------------------------------------+ | Author: Zeev Suraski | +----------------------------------------------------------------------+ diff --git a/main/php_open_temporary_file.h b/main/php_open_temporary_file.h index 1d8764a7487e..d9d8d8069190 100644 --- a/main/php_open_temporary_file.h +++ b/main/php_open_temporary_file.h @@ -1,14 +1,12 @@ /* +----------------------------------------------------------------------+ - | Copyright (c) The PHP Group | + | Copyright © The PHP Group and Contributors. | +----------------------------------------------------------------------+ - | This source file is subject to version 3.01 of the PHP license, | - | that is bundled with this package in the file LICENSE, and is | - | available through the world-wide-web at the following url: | - | https://www.php.net/license/3_01.txt | - | If you did not receive a copy of the PHP license and are unable to | - | obtain it through the world-wide-web, please send a note to | - | license@php.net so we can mail you a copy immediately. | + | This source file is subject to the Modified BSD License that is | + | bundled with this package in the file LICENSE, and is available | + | through the World Wide Web at . | + | | + | SPDX-License-Identifier: BSD-3-Clause | +----------------------------------------------------------------------+ | Author: Zeev Suraski | +----------------------------------------------------------------------+ diff --git a/main/php_output.h b/main/php_output.h index 896f1e0a8fea..f0a26824936a 100644 --- a/main/php_output.h +++ b/main/php_output.h @@ -1,14 +1,12 @@ /* +----------------------------------------------------------------------+ - | Copyright (c) The PHP Group | + | Copyright © The PHP Group and Contributors. | +----------------------------------------------------------------------+ - | This source file is subject to version 3.01 of the PHP license, | - | that is bundled with this package in the file LICENSE, and is | - | available through the world-wide-web at the following url: | - | https://www.php.net/license/3_01.txt | - | If you did not receive a copy of the PHP license and are unable to | - | obtain it through the world-wide-web, please send a note to | - | license@php.net so we can mail you a copy immediately. | + | This source file is subject to the Modified BSD License that is | + | bundled with this package in the file LICENSE, and is available | + | through the World Wide Web at . | + | | + | SPDX-License-Identifier: BSD-3-Clause | +----------------------------------------------------------------------+ | Author: Michael Wallner | +----------------------------------------------------------------------+ diff --git a/main/php_poll.h b/main/php_poll.h new file mode 100644 index 000000000000..9b878d44bd20 --- /dev/null +++ b/main/php_poll.h @@ -0,0 +1,176 @@ +/* + +----------------------------------------------------------------------+ + | Copyright © The PHP Group and Contributors. | + +----------------------------------------------------------------------+ + | This source file is subject to the Modified BSD License that is | + | bundled with this package in the file LICENSE, and is available | + | through the World Wide Web at . | + | | + | SPDX-License-Identifier: BSD-3-Clause | + +----------------------------------------------------------------------+ + | Authors: Jakub Zelenka | + +----------------------------------------------------------------------+ +*/ + +#ifndef PHP_POLL_H +#define PHP_POLL_H + +#include "php.h" +#include "php_network.h" + +#include + +/* ----- Public generic API ----- */ + +/* clang-format off */ + +/* Event types. Keep in sync with io_poll.stub.php! */ +#define PHP_POLL_READ 0x01 +#define PHP_POLL_WRITE 0x02 +#define PHP_POLL_ERROR 0x04 +#define PHP_POLL_HUP 0x08 +#define PHP_POLL_RDHUP 0x10 +#define PHP_POLL_ONESHOT 0x20 +#define PHP_POLL_ET 0x40 /* Edge-triggered */ + +/* Poll flags */ +#define PHP_POLL_FLAG_PERSISTENT 0x01 +#define PHP_POLL_FLAG_RAW_EVENTS 0x02 + +/* Poll backend types. Keep in sync with io_poll.stub.php! */ +typedef enum php_poll_backend_type { + PHP_POLL_BACKEND_AUTO = -1, + PHP_POLL_BACKEND_POLL = 0, + PHP_POLL_BACKEND_EPOLL, + PHP_POLL_BACKEND_KQUEUE, + PHP_POLL_BACKEND_EVENTPORT, + PHP_POLL_BACKEND_WSAPOLL +} php_poll_backend_type; + +/* Error code constants for exception codes */ +#define PHP_POLL_ERROR_CODE_NONE 0 +#define PHP_POLL_ERROR_CODE_SYSTEM 1 +#define PHP_POLL_ERROR_CODE_NOMEM 2 +#define PHP_POLL_ERROR_CODE_INVALID 3 +#define PHP_POLL_ERROR_CODE_EXISTS 4 +#define PHP_POLL_ERROR_CODE_NOTFOUND 5 +#define PHP_POLL_ERROR_CODE_TIMEOUT 6 +#define PHP_POLL_ERROR_CODE_INTERRUPTED 7 +#define PHP_POLL_ERROR_CODE_PERMISSION 8 +#define PHP_POLL_ERROR_CODE_TOOBIG 9 +#define PHP_POLL_ERROR_CODE_AGAIN 10 +#define PHP_POLL_ERROR_CODE_NOSUPPORT 11 + +/* Error codes */ +typedef enum php_poll_error { + PHP_POLL_ERR_NONE = PHP_POLL_ERROR_CODE_NONE, /* No error */ + PHP_POLL_ERR_SYSTEM = PHP_POLL_ERROR_CODE_SYSTEM, /* Generic system error */ + PHP_POLL_ERR_NOMEM = PHP_POLL_ERROR_CODE_NOMEM, /* Out of memory (ENOMEM) */ + PHP_POLL_ERR_INVALID = PHP_POLL_ERROR_CODE_INVALID, /* Invalid argument (EINVAL, EBADF) */ + PHP_POLL_ERR_EXISTS = PHP_POLL_ERROR_CODE_EXISTS, /* Already exists (EEXIST) */ + PHP_POLL_ERR_NOTFOUND = PHP_POLL_ERROR_CODE_NOTFOUND, /* Not found (ENOENT) */ + PHP_POLL_ERR_TIMEOUT = PHP_POLL_ERROR_CODE_TIMEOUT, /* Operation timed out (ETIME, ETIMEDOUT) */ + PHP_POLL_ERR_INTERRUPTED = PHP_POLL_ERROR_CODE_INTERRUPTED, /* Interrupted by signal (EINTR) */ + PHP_POLL_ERR_PERMISSION = PHP_POLL_ERROR_CODE_PERMISSION, /* Permission denied (EACCES, EPERM) */ + PHP_POLL_ERR_TOOBIG = PHP_POLL_ERROR_CODE_TOOBIG, /* Too many resources (EMFILE, ENFILE) */ + PHP_POLL_ERR_AGAIN = PHP_POLL_ERROR_CODE_AGAIN, /* Try again (EAGAIN, EWOULDBLOCK) */ + PHP_POLL_ERR_NOSUPPORT = PHP_POLL_ERROR_CODE_NOSUPPORT, /* Not supported (ENOSYS, EOPNOTSUPP) */ +} php_poll_error; + +/* clang-format on */ + +/* Poll event structure */ +struct php_poll_event { + int fd; /* File descriptor */ + uint32_t events; /* Requested events */ + uint32_t revents; /* Returned events */ + void *data; /* User data pointer */ +}; + +/* Forward declarations */ +typedef struct php_poll_ctx php_poll_ctx; +typedef struct php_poll_backend_ops php_poll_backend_ops; +typedef struct php_poll_event php_poll_event; + +PHPAPI bool php_poll_is_backend_available(php_poll_backend_type backend); +PHPAPI bool php_poll_backend_supports_edge_triggering(php_poll_backend_type backend); + +PHPAPI php_poll_ctx *php_poll_create(php_poll_backend_type preferred_backend, uint32_t flags); +PHPAPI php_poll_ctx *php_poll_create_by_name(const char *preferred_backend, uint32_t flags); + +PHPAPI zend_result php_poll_set_max_events_hint(php_poll_ctx *ctx, int max_events); +PHPAPI zend_result php_poll_init(php_poll_ctx *ctx); +PHPAPI void php_poll_destroy(php_poll_ctx *ctx); + +PHPAPI zend_result php_poll_add(php_poll_ctx *ctx, int fd, uint32_t events, void *data); +PHPAPI zend_result php_poll_modify(php_poll_ctx *ctx, int fd, uint32_t events, void *data); +PHPAPI zend_result php_poll_remove(php_poll_ctx *ctx, int fd); + +PHPAPI int php_poll_wait(php_poll_ctx *ctx, php_poll_event *events, int max_events, + const struct timespec *timeout); + +PHPAPI const char *php_poll_backend_name(php_poll_ctx *ctx); +PHPAPI php_poll_backend_type php_poll_get_backend_type(php_poll_ctx *ctx); +PHPAPI bool php_poll_supports_et(php_poll_ctx *ctx); +PHPAPI php_poll_error php_poll_get_error(php_poll_ctx *ctx); + +/* Get suitable max_events for backend */ +PHPAPI int php_poll_get_suitable_max_events(php_poll_ctx *ctx); + +/* Backend registration */ +PHPAPI void php_poll_register_backends(void); + +/* Error string for the error */ +PHPAPI const char *php_poll_error_string(php_poll_error error); + +/* ----- Public extension API ----- */ + +typedef struct php_poll_handle_ops php_poll_handle_ops; +typedef struct php_poll_handle_object php_poll_handle_object; + +/* Handle operations structure - extensions can provide their own */ +struct php_poll_handle_ops { + /** + * Get file descriptor for this handle + * @param handle The handle object + * @return File descriptor or SOCK_ERR if invalid/not applicable + */ + php_socket_t (*get_fd)(php_poll_handle_object *handle); + + /** + * Check if handle is still valid + * @param handle The handle object + * @return true if valid, false if invalid + */ + int (*is_valid)(php_poll_handle_object *handle); + + /** + * Cleanup handle-specific data + * @param handle The handle object + */ + void (*cleanup)(php_poll_handle_object *handle); +}; + +/* Base poll handle object structure */ +struct php_poll_handle_object { + php_poll_handle_ops *ops; + void *handle_data; + zend_object std; +}; + +#define PHP_POLL_HANDLE_OBJ_FROM_ZOBJ(obj) ZEND_CONTAINER_OF(obj, php_poll_handle_object, std) + +#define PHP_POLL_HANDLE_OBJ_FROM_ZV(zv) PHP_POLL_HANDLE_OBJ_FROM_ZOBJ(Z_OBJ_P(zv)) + +/* Default operations */ +extern php_poll_handle_ops php_poll_handle_default_ops; + +/* Utility functions for extensions */ +PHPAPI php_poll_handle_object *php_poll_handle_object_create( + size_t obj_size, zend_class_entry *ce, php_poll_handle_ops *ops); +PHPAPI void php_poll_handle_object_free(zend_object *obj); + +/* Get file descriptor from any poll handle */ +PHPAPI php_socket_t php_poll_handle_get_fd(php_poll_handle_object *handle); + +#endif /* PHP_POLL_H */ diff --git a/main/php_reentrancy.h b/main/php_reentrancy.h index 5a78df078698..f11ef17acb71 100644 --- a/main/php_reentrancy.h +++ b/main/php_reentrancy.h @@ -1,14 +1,12 @@ /* +----------------------------------------------------------------------+ - | Copyright (c) The PHP Group | + | Copyright © The PHP Group and Contributors. | +----------------------------------------------------------------------+ - | This source file is subject to version 3.01 of the PHP license, | - | that is bundled with this package in the file LICENSE, and is | - | available through the world-wide-web at the following url: | - | https://www.php.net/license/3_01.txt | - | If you did not receive a copy of the PHP license and are unable to | - | obtain it through the world-wide-web, please send a note to | - | license@php.net so we can mail you a copy immediately. | + | This source file is subject to the Modified BSD License that is | + | bundled with this package in the file LICENSE, and is available | + | through the World Wide Web at . | + | | + | SPDX-License-Identifier: BSD-3-Clause | +----------------------------------------------------------------------+ | Author: Sascha Schumann | +----------------------------------------------------------------------+ diff --git a/main/php_scandir.c b/main/php_scandir.c index 7bf91bdf7f33..848a0cf96168 100644 --- a/main/php_scandir.c +++ b/main/php_scandir.c @@ -1,14 +1,12 @@ /* +----------------------------------------------------------------------+ - | Copyright (c) The PHP Group | + | Copyright © The PHP Group and Contributors. | +----------------------------------------------------------------------+ - | This source file is subject to version 3.01 of the PHP license, | - | that is bundled with this package in the file LICENSE, and is | - | available through the world-wide-web at the following url: | - | https://www.php.net/license/3_01.txt | - | If you did not receive a copy of the PHP license and are unable to | - | obtain it through the world-wide-web, please send a note to | - | license@php.net so we can mail you a copy immediately. | + | This source file is subject to the Modified BSD License that is | + | bundled with this package in the file LICENSE, and is available | + | through the World Wide Web at . | + | | + | SPDX-License-Identifier: BSD-3-Clause | +----------------------------------------------------------------------+ | Author: Shane Caraveo | | Ilia Alshanetsky | diff --git a/main/php_scandir.h b/main/php_scandir.h index ec5565914247..76d27feb15ca 100644 --- a/main/php_scandir.h +++ b/main/php_scandir.h @@ -1,14 +1,12 @@ /* +----------------------------------------------------------------------+ - | Copyright (c) The PHP Group | + | Copyright © The PHP Group and Contributors. | +----------------------------------------------------------------------+ - | This source file is subject to version 3.01 of the PHP license, | - | that is bundled with this package in the file LICENSE, and is | - | available through the world-wide-web at the following url: | - | https://www.php.net/license/3_01.txt | - | If you did not receive a copy of the PHP license and are unable to | - | obtain it through the world-wide-web, please send a note to | - | license@php.net so we can mail you a copy immediately. | + | This source file is subject to the Modified BSD License that is | + | bundled with this package in the file LICENSE, and is available | + | through the World Wide Web at . | + | | + | SPDX-License-Identifier: BSD-3-Clause | +----------------------------------------------------------------------+ | Authors: Shane Caraveo | | Ilia Alshanetsky | diff --git a/main/php_streams.h b/main/php_streams.h index 1c52539cfcae..7622a7295af3 100644 --- a/main/php_streams.h +++ b/main/php_streams.h @@ -1,14 +1,12 @@ /* +----------------------------------------------------------------------+ - | Copyright (c) The PHP Group | + | Copyright © The PHP Group and Contributors. | +----------------------------------------------------------------------+ - | This source file is subject to version 3.01 of the PHP license, | - | that is bundled with this package in the file LICENSE, and is | - | available through the world-wide-web at the following url: | - | https://www.php.net/license/3_01.txt | - | If you did not receive a copy of the PHP license and are unable to | - | obtain it through the world-wide-web, please send a note to | - | license@php.net so we can mail you a copy immediately. | + | This source file is subject to the Modified BSD License that is | + | bundled with this package in the file LICENSE, and is available | + | through the World Wide Web at . | + | | + | SPDX-License-Identifier: BSD-3-Clause | +----------------------------------------------------------------------+ | Author: Wez Furlong (wez@thebrainroom.com) | +----------------------------------------------------------------------+ @@ -248,6 +246,8 @@ struct _php_stream { #endif struct _php_stream *enclosing_stream; /* this is a private stream owned by enclosing_stream */ + + zend_llist *error_list; }; /* php_stream */ #define PHP_STREAM_CONTEXT(stream) \ @@ -539,6 +539,7 @@ PHPAPI ssize_t _php_stream_passthru(php_stream * src STREAMS_DC); #define php_stream_passthru(stream) _php_stream_passthru((stream) STREAMS_CC) END_EXTERN_C() +#include "streams/php_stream_errors.h" #include "streams/php_stream_transport.h" #include "streams/php_stream_plain_wrapper.h" #include "streams/php_stream_glob_wrapper.h" @@ -642,10 +643,6 @@ PHPAPI const char *php_stream_locate_eol(php_stream *stream, zend_string *buf); #define php_stream_open_wrapper(path, mode, options, opened) _php_stream_open_wrapper_ex((path), (mode), (options), (opened), NULL STREAMS_CC) #define php_stream_open_wrapper_ex(path, mode, options, opened, context) _php_stream_open_wrapper_ex((path), (mode), (options), (opened), (context) STREAMS_CC) - -/* pushes an error message onto the stack for a wrapper instance */ -PHPAPI void php_stream_wrapper_log_error(const php_stream_wrapper *wrapper, int options, const char *fmt, ...) PHP_ATTRIBUTE_FORMAT(printf, 3, 4); - typedef enum { PHP_STREAM_UNCHANGED = 0, /* orig stream was seekable anyway */ PHP_STREAM_RELEASED = 1, /* newstream should be used; origstream is no longer valid */ diff --git a/main/php_syslog.c b/main/php_syslog.c index 975a0423df17..a92b2518caab 100644 --- a/main/php_syslog.c +++ b/main/php_syslog.c @@ -1,14 +1,12 @@ /* +----------------------------------------------------------------------+ - | Copyright (c) The PHP Group | + | Copyright © The PHP Group and Contributors. | +----------------------------------------------------------------------+ - | This source file is subject to version 3.01 of the PHP license, | - | that is bundled with this package in the file LICENSE, and is | - | available through the world-wide-web at the following url: | - | https://www.php.net/license/3_01.txt | - | If you did not receive a copy of the PHP license and are unable to | - | obtain it through the world-wide-web, please send a note to | - | license@php.net so we can mail you a copy immediately. | + | This source file is subject to the Modified BSD License that is | + | bundled with this package in the file LICENSE, and is available | + | through the World Wide Web at . | + | | + | SPDX-License-Identifier: BSD-3-Clause | +----------------------------------------------------------------------+ | Author: Philip Prindeville | +----------------------------------------------------------------------+ diff --git a/main/php_syslog.h b/main/php_syslog.h index f2682d74f238..d3ff747311ac 100644 --- a/main/php_syslog.h +++ b/main/php_syslog.h @@ -1,16 +1,12 @@ /* +----------------------------------------------------------------------+ - | Copyright (c) The PHP Group | + | Copyright © The PHP Group and Contributors. | +----------------------------------------------------------------------+ - | This source file is subject to version 3.01 of the PHP license, | - | that is bundled with this package in the file LICENSE, and is | - | available through the world-wide-web at the following url: | - | https://www.php.net/license/3_01.txt | - | If you did not receive a copy of the PHP license and are unable to | - | obtain it through the world-wide-web, please send a note to | - | license@php.net so we can mail you a copy immediately. | - +----------------------------------------------------------------------+ - | Author: | + | This source file is subject to the Modified BSD License that is | + | bundled with this package in the file LICENSE, and is available | + | through the World Wide Web at . | + | | + | SPDX-License-Identifier: BSD-3-Clause | +----------------------------------------------------------------------+ */ diff --git a/main/php_ticks.c b/main/php_ticks.c index 4c1e5113e965..c71082dfa2d1 100644 --- a/main/php_ticks.c +++ b/main/php_ticks.c @@ -1,14 +1,12 @@ /* +----------------------------------------------------------------------+ - | Copyright (c) The PHP Group | + | Copyright © The PHP Group and Contributors. | +----------------------------------------------------------------------+ - | This source file is subject to version 3.01 of the PHP license, | - | that is bundled with this package in the file LICENSE, and is | - | available through the world-wide-web at the following url: | - | https://www.php.net/license/3_01.txt | - | If you did not receive a copy of the PHP license and are unable to | - | obtain it through the world-wide-web, please send a note to | - | license@php.net so we can mail you a copy immediately. | + | This source file is subject to the Modified BSD License that is | + | bundled with this package in the file LICENSE, and is available | + | through the World Wide Web at . | + | | + | SPDX-License-Identifier: BSD-3-Clause | +----------------------------------------------------------------------+ | Author: Stig Bakken | +----------------------------------------------------------------------+ diff --git a/main/php_ticks.h b/main/php_ticks.h index 998f4364e5e9..43801a74e89d 100644 --- a/main/php_ticks.h +++ b/main/php_ticks.h @@ -1,14 +1,12 @@ /* +----------------------------------------------------------------------+ - | Copyright (c) The PHP Group | + | Copyright © The PHP Group and Contributors. | +----------------------------------------------------------------------+ - | This source file is subject to version 3.01 of the PHP license, | - | that is bundled with this package in the file LICENSE, and is | - | available through the world-wide-web at the following url: | - | https://www.php.net/license/3_01.txt | - | If you did not receive a copy of the PHP license and are unable to | - | obtain it through the world-wide-web, please send a note to | - | license@php.net so we can mail you a copy immediately. | + | This source file is subject to the Modified BSD License that is | + | bundled with this package in the file LICENSE, and is available | + | through the World Wide Web at . | + | | + | SPDX-License-Identifier: BSD-3-Clause | +----------------------------------------------------------------------+ | Author: Stig Bakken | +----------------------------------------------------------------------+ diff --git a/main/php_variables.c b/main/php_variables.c index 971e1c77ea9f..2121bfd8b35b 100644 --- a/main/php_variables.c +++ b/main/php_variables.c @@ -1,14 +1,12 @@ /* +----------------------------------------------------------------------+ - | Copyright (c) The PHP Group | + | Copyright © The PHP Group and Contributors. | +----------------------------------------------------------------------+ - | This source file is subject to version 3.01 of the PHP license, | - | that is bundled with this package in the file LICENSE, and is | - | available through the world-wide-web at the following url: | - | https://www.php.net/license/3_01.txt | - | If you did not receive a copy of the PHP license and are unable to | - | obtain it through the world-wide-web, please send a note to | - | license@php.net so we can mail you a copy immediately. | + | This source file is subject to the Modified BSD License that is | + | bundled with this package in the file LICENSE, and is available | + | through the World Wide Web at . | + | | + | SPDX-License-Identifier: BSD-3-Clause | +----------------------------------------------------------------------+ | Authors: Rasmus Lerdorf | | Zeev Suraski | @@ -221,7 +219,7 @@ PHPAPI void php_register_variable_ex(const char *var_name, zval *val, zval *trac ip++; index_s = ip; - if (isspace(*ip)) { + if (isspace((unsigned char)*ip)) { ip++; } if (*ip==']') { @@ -544,7 +542,7 @@ SAPI_API SAPI_TREAT_DATA_FUNC(php_default_treat_data) if (arg == PARSE_COOKIE) { /* Remove leading spaces from cookie names, needed for multi-cookie header where ; can be followed by a space */ - while (isspace(*var)) { + while (isspace((unsigned char)*var)) { var++; } if (var == val || *var == '\0') { diff --git a/main/php_variables.h b/main/php_variables.h index 5cb43890bd75..27a45e8daa3c 100644 --- a/main/php_variables.h +++ b/main/php_variables.h @@ -1,14 +1,12 @@ /* +----------------------------------------------------------------------+ - | Copyright (c) The PHP Group | + | Copyright © The PHP Group and Contributors. | +----------------------------------------------------------------------+ - | This source file is subject to version 3.01 of the PHP license, | - | that is bundled with this package in the file LICENSE, and is | - | available through the world-wide-web at the following url: | - | https://www.php.net/license/3_01.txt | - | If you did not receive a copy of the PHP license and are unable to | - | obtain it through the world-wide-web, please send a note to | - | license@php.net so we can mail you a copy immediately. | + | This source file is subject to the Modified BSD License that is | + | bundled with this package in the file LICENSE, and is available | + | through the World Wide Web at . | + | | + | SPDX-License-Identifier: BSD-3-Clause | +----------------------------------------------------------------------+ | Authors: Rasmus Lerdorf | | Zeev Suraski | diff --git a/main/poll/php_poll_internal.h b/main/poll/php_poll_internal.h new file mode 100644 index 000000000000..951521314393 --- /dev/null +++ b/main/poll/php_poll_internal.h @@ -0,0 +1,176 @@ +/* + +----------------------------------------------------------------------+ + | Copyright © The PHP Group and Contributors. | + +----------------------------------------------------------------------+ + | This source file is subject to the Modified BSD License that is | + | bundled with this package in the file LICENSE, and is available | + | through the World Wide Web at . | + | | + | SPDX-License-Identifier: BSD-3-Clause | + +----------------------------------------------------------------------+ + | Authors: Jakub Zelenka | + +----------------------------------------------------------------------+ +*/ + +#ifndef PHP_POLL_INTERNAL_H +#define PHP_POLL_INTERNAL_H + +#include "php_poll.h" +#include "php_network.h" + +/* Allocation macros */ +#define php_poll_calloc(nmemb, size, persistent) \ + ((persistent) ? calloc((nmemb), (size)) : ecalloc((nmemb), (size))) +#define php_poll_malloc(size, persistent) ((persistent) ? malloc((size)) : emalloc((size))) +#define php_poll_realloc(ptr, size, persistent) \ + ((persistent) ? realloc((ptr), (size)) : erealloc((ptr), (size))) + +/* Backend interface */ +typedef struct php_poll_backend_ops { + php_poll_backend_type type; + const char *name; + + /* Initialize backend */ + zend_result (*init)(php_poll_ctx *ctx); + + /* Cleanup backend */ + void (*cleanup)(php_poll_ctx *ctx); + + /* Add file descriptor */ + zend_result (*add)(php_poll_ctx *ctx, int fd, uint32_t events, void *data); + + /* Modify file descriptor */ + zend_result (*modify)(php_poll_ctx *ctx, int fd, uint32_t events, void *data); + + /* Remove file descriptor */ + zend_result (*remove)(php_poll_ctx *ctx, int fd); + + /* Wait for events */ + int (*wait)(php_poll_ctx *ctx, php_poll_event *events, int max_events, + const struct timespec *timeout); + + /* Check if backend is available */ + bool (*is_available)(void); + + /* Get suitable max_events for this backend */ + int (*get_suitable_max_events)(php_poll_ctx *ctx); + + /* Backend supports edge triggering natively */ + bool supports_et; +} php_poll_backend_ops; + +/* Main poll context */ +struct php_poll_ctx { + const php_poll_backend_ops *backend_ops; + php_poll_backend_type backend_type; + php_poll_error last_error; + + /* Optional capacity hint for backends */ + int max_events_hint; + + /* Flags */ + uint32_t initialized : 1; + uint32_t persistent : 1; + uint32_t raw_events : 1; + + /* Backend-specific data */ + void *backend_data; +}; + +/* Generic FD entry structure */ +typedef struct php_poll_fd_entry { + int fd; + uint32_t events; + void *data; + bool active; + uint32_t last_revents; +} php_poll_fd_entry; + +/* FD tracking table */ +typedef struct php_poll_fd_table { + HashTable entries_ht; + bool persistent; +} php_poll_fd_table; + +/* Iterator callback function type */ +typedef bool (*php_poll_fd_iterator_func_t)(int fd, php_poll_fd_entry *entry, void *user_data); + +/* Poll FD helpers - clean API with accessor functions */ +php_poll_fd_table *php_poll_fd_table_init(int initial_capacity, bool persistent); +void php_poll_fd_table_cleanup(php_poll_fd_table *table); +php_poll_fd_entry *php_poll_fd_table_find(php_poll_fd_table *table, int fd); +php_poll_fd_entry *php_poll_fd_table_get(php_poll_fd_table *table, int fd); +php_poll_fd_entry *php_poll_fd_table_get_new(php_poll_fd_table *table, int fd); +bool php_poll_fd_table_remove(php_poll_fd_table *table, int fd); + +/* Accessor functions for table properties */ +static inline int php_poll_fd_table_count(php_poll_fd_table *table) +{ + return zend_hash_num_elements(&table->entries_ht); +} + +static inline bool php_poll_fd_table_is_empty(php_poll_fd_table *table) +{ + return zend_hash_num_elements(&table->entries_ht) == 0; +} + +/* New helper functions for improved backend integration */ +void php_poll_fd_table_foreach( + php_poll_fd_table *table, php_poll_fd_iterator_func_t callback, void *user_data); +php_socket_t php_poll_fd_table_get_max_fd(php_poll_fd_table *table); +int php_poll_fd_table_collect_events( + php_poll_fd_table *table, php_poll_event *events, int max_events); + +/* Error helper functions */ +php_poll_error php_poll_errno_to_error(int err); + +static inline void php_poll_set_errno_error(php_poll_ctx *ctx, int err) +{ + ctx->last_error = php_poll_errno_to_error(err); +} + +static inline void php_poll_set_current_errno_error(php_poll_ctx *ctx) +{ + php_poll_set_errno_error(ctx, errno); +} + +static inline bool php_poll_is_not_found_error(void) +{ + return errno == ENOENT; +} + +static inline bool php_poll_is_timeout_error(void) +{ +#if defined(ETIME) && defined(ETIMEDOUT) + return errno == ETIME || errno == ETIMEDOUT; +#elif defined(ETIME) + return errno == ETIME; +#elif defined(ETIMEDOUT) + return errno == ETIMEDOUT; +#else + return false; +#endif +} + + +static inline void php_poll_set_error(php_poll_ctx *ctx, php_poll_error error) +{ + ctx->last_error = error; +} + +static inline int php_poll_timespec_to_ms(const struct timespec *timeout) +{ + if (timeout == NULL) { + return -1; + } + + int ms = (int) (timeout->tv_sec * 1000); + /* Round nanoseconds up to the next millisecond to avoid premature return */ + if (timeout->tv_nsec > 0) { + ms += (int) ((timeout->tv_nsec + 999999) / 1000000); + } + + return ms; +} + +#endif /* PHP_POLL_INTERNAL_H */ diff --git a/main/poll/poll_backend_epoll.c b/main/poll/poll_backend_epoll.c new file mode 100644 index 000000000000..685339da77d2 --- /dev/null +++ b/main/poll/poll_backend_epoll.c @@ -0,0 +1,247 @@ +/* + +----------------------------------------------------------------------+ + | Copyright © The PHP Group and Contributors. | + +----------------------------------------------------------------------+ + | This source file is subject to the Modified BSD License that is | + | bundled with this package in the file LICENSE, and is available | + | through the World Wide Web at . | + | | + | SPDX-License-Identifier: BSD-3-Clause | + +----------------------------------------------------------------------+ + | Authors: Jakub Zelenka | + +----------------------------------------------------------------------+ +*/ + +#include "php_poll_internal.h" + +#ifdef HAVE_EPOLL + +#include + +typedef struct epoll_backend_data { + int epoll_fd; + struct epoll_event *events; + int events_capacity; + int fd_count; +} epoll_backend_data_t; + +static uint32_t epoll_events_to_native(uint32_t events) +{ + uint32_t native = 0; + if (events & PHP_POLL_READ) { + native |= EPOLLIN; + } + if (events & PHP_POLL_WRITE) { + native |= EPOLLOUT; + } + if (events & PHP_POLL_ERROR) { + native |= EPOLLERR; + } + if (events & PHP_POLL_HUP) { + native |= EPOLLHUP; + } + if (events & PHP_POLL_RDHUP) { + native |= EPOLLRDHUP; + } + if (events & PHP_POLL_ONESHOT) { + native |= EPOLLONESHOT; + } + if (events & PHP_POLL_ET) { + native |= EPOLLET; + } + return native; +} + +static uint32_t epoll_events_from_native(uint32_t native) +{ + uint32_t events = 0; + if (native & EPOLLIN) { + events |= PHP_POLL_READ; + } + if (native & EPOLLOUT) { + events |= PHP_POLL_WRITE; + } + if (native & EPOLLERR) { + events |= PHP_POLL_ERROR; + } + if (native & EPOLLHUP) { + events |= PHP_POLL_HUP; + } + if (native & EPOLLRDHUP) { + events |= PHP_POLL_RDHUP; + } + return events; +} + +static zend_result epoll_backend_init(php_poll_ctx *ctx) +{ + epoll_backend_data_t *data = php_poll_calloc(1, sizeof(epoll_backend_data_t), ctx->persistent); + if (!data) { + php_poll_set_error(ctx, PHP_POLL_ERR_NOMEM); + return FAILURE; + } + + data->epoll_fd = epoll_create1(EPOLL_CLOEXEC); + if (data->epoll_fd == -1) { + pefree(data, ctx->persistent); + php_poll_set_error(ctx, PHP_POLL_ERR_SYSTEM); + return FAILURE; + } + + /* Use hint for initial allocation if provided, otherwise start with reasonable default */ + int initial_capacity = ctx->max_events_hint > 0 ? ctx->max_events_hint : 64; + data->events = php_poll_calloc(initial_capacity, sizeof(struct epoll_event), ctx->persistent); + if (!data->events) { + close(data->epoll_fd); + pefree(data, ctx->persistent); + php_poll_set_error(ctx, PHP_POLL_ERR_NOMEM); + return FAILURE; + } + data->events_capacity = initial_capacity; + + ctx->backend_data = data; + return SUCCESS; +} + +static void epoll_backend_cleanup(php_poll_ctx *ctx) +{ + epoll_backend_data_t *data = (epoll_backend_data_t *) ctx->backend_data; + if (data) { + if (data->epoll_fd >= 0) { + close(data->epoll_fd); + } + pefree(data->events, ctx->persistent); + pefree(data, ctx->persistent); + ctx->backend_data = NULL; + } +} + +static zend_result epoll_backend_add(php_poll_ctx *ctx, int fd, uint32_t events, void *data) +{ + epoll_backend_data_t *backend_data = (epoll_backend_data_t *) ctx->backend_data; + + struct epoll_event ev = { 0 }; + ev.events = epoll_events_to_native(events); + ev.data.ptr = data; + + if (epoll_ctl(backend_data->epoll_fd, EPOLL_CTL_ADD, fd, &ev) == -1) { + php_poll_set_error(ctx, (errno == EEXIST) ? PHP_POLL_ERR_EXISTS : PHP_POLL_ERR_SYSTEM); + return FAILURE; + } + backend_data->fd_count++; + + return SUCCESS; +} + +static zend_result epoll_backend_modify(php_poll_ctx *ctx, int fd, uint32_t events, void *data) +{ + epoll_backend_data_t *backend_data = (epoll_backend_data_t *) ctx->backend_data; + + struct epoll_event ev = { 0 }; + ev.events = epoll_events_to_native(events); + ev.data.ptr = data; + + if (epoll_ctl(backend_data->epoll_fd, EPOLL_CTL_MOD, fd, &ev) == -1) { + php_poll_set_error(ctx, (errno == ENOENT) ? PHP_POLL_ERR_NOTFOUND : PHP_POLL_ERR_SYSTEM); + return FAILURE; + } + + return SUCCESS; +} + +static zend_result epoll_backend_remove(php_poll_ctx *ctx, int fd) +{ + epoll_backend_data_t *backend_data = (epoll_backend_data_t *) ctx->backend_data; + + if (epoll_ctl(backend_data->epoll_fd, EPOLL_CTL_DEL, fd, NULL) == -1) { + php_poll_set_error(ctx, (errno == ENOENT) ? PHP_POLL_ERR_NOTFOUND : PHP_POLL_ERR_SYSTEM); + return FAILURE; + } + backend_data->fd_count--; + + return SUCCESS; +} + +static int epoll_backend_wait( + php_poll_ctx *ctx, php_poll_event *events, int max_events, + const struct timespec *timeout) +{ + epoll_backend_data_t *backend_data = (epoll_backend_data_t *) ctx->backend_data; + + /* Ensure we have enough space for the requested events */ + if (max_events > backend_data->events_capacity) { + struct epoll_event *new_events = php_poll_realloc( + backend_data->events, max_events * sizeof(struct epoll_event), ctx->persistent); + if (!new_events) { + php_poll_set_error(ctx, PHP_POLL_ERR_NOMEM); + return -1; + } + backend_data->events = new_events; + backend_data->events_capacity = max_events; + } + + int nfds; +#ifdef HAVE_EPOLL_PWAIT2 + nfds = epoll_pwait2(backend_data->epoll_fd, backend_data->events, max_events, timeout, NULL); +#else + int timeout_ms = php_poll_timespec_to_ms(timeout); + nfds = epoll_wait(backend_data->epoll_fd, backend_data->events, max_events, timeout_ms); +#endif + + if (nfds > 0) { + for (int i = 0; i < nfds; i++) { + events[i].fd = backend_data->events[i].data.fd; + events[i].events = 0; /* Not used in results */ + events[i].revents = epoll_events_from_native(backend_data->events[i].events); + events[i].data = backend_data->events[i].data.ptr; + } + } + + return nfds; +} + +static int epoll_backend_get_suitable_max_events(php_poll_ctx *ctx) +{ + epoll_backend_data_t *backend_data = (epoll_backend_data_t *) ctx->backend_data; + + if (!backend_data) { + return -1; + } + + /* For epoll, we now track exactly how many FDs are registered */ + int active_fds = backend_data->fd_count; + + if (active_fds == 0) { + return 1; + } + + /* Epoll can return exactly one event per registered FD, + * so the suitable max_events is exactly the number of registered FDs */ + return active_fds; +} + +static bool epoll_backend_is_available(void) +{ + int fd = epoll_create1(EPOLL_CLOEXEC); + if (fd >= 0) { + close(fd); + return true; + } + return false; +} + +const php_poll_backend_ops php_poll_backend_epoll_ops = { + .type = PHP_POLL_BACKEND_EPOLL, + .name = "epoll", + .init = epoll_backend_init, + .cleanup = epoll_backend_cleanup, + .add = epoll_backend_add, + .modify = epoll_backend_modify, + .remove = epoll_backend_remove, + .wait = epoll_backend_wait, + .is_available = epoll_backend_is_available, + .get_suitable_max_events = epoll_backend_get_suitable_max_events, + .supports_et = true, +}; + +#endif /* HAVE_EPOLL */ diff --git a/main/poll/poll_backend_eventport.c b/main/poll/poll_backend_eventport.c new file mode 100644 index 000000000000..35e7c61326f1 --- /dev/null +++ b/main/poll/poll_backend_eventport.c @@ -0,0 +1,403 @@ +/* + +----------------------------------------------------------------------+ + | Copyright © The PHP Group and Contributors. | + +----------------------------------------------------------------------+ + | This source file is subject to the Modified BSD License that is | + | bundled with this package in the file LICENSE, and is available | + | through the World Wide Web at . | + | | + | SPDX-License-Identifier: BSD-3-Clause | + +----------------------------------------------------------------------+ + | Authors: Jakub Zelenka | + +----------------------------------------------------------------------+ +*/ + +#include "php_poll_internal.h" + +#ifdef HAVE_EVENT_PORTS + +#include +#include +#include +#include +#include + +typedef struct eventport_backend_data { + int port_fd; + port_event_t *events; + int events_capacity; + php_poll_fd_table *fd_table; +} eventport_backend_data_t; + +/* We use last_revents field to track if fd needs (re)association */ +#define EVENTPORT_NEEDS_ASSOC 1 +#define EVENTPORT_IS_ASSOCIATED 0 + +/* Convert our event flags to event port flags */ +static int eventport_events_to_native(uint32_t events) +{ + int native = 0; + if (events & PHP_POLL_READ) { + native |= POLLIN; + } + if (events & PHP_POLL_WRITE) { + native |= POLLOUT; + } + if (events & PHP_POLL_ERROR) { + native |= POLLERR; + } + if (events & PHP_POLL_HUP) { + native |= POLLHUP; + } + if (events & PHP_POLL_RDHUP) { + native |= POLLHUP; /* Map RDHUP to HUP */ + } + return native; +} + +/* Convert event port flags back to our event flags */ +static uint32_t eventport_events_from_native(int native) +{ + uint32_t events = 0; + if (native & POLLIN) { + events |= PHP_POLL_READ; + } + if (native & POLLOUT) { + events |= PHP_POLL_WRITE; + } + if (native & POLLERR) { + events |= PHP_POLL_ERROR; + } + if (native & POLLHUP) { + events |= PHP_POLL_HUP; + } + if (native & POLLNVAL) { + events |= PHP_POLL_ERROR; + } + return events; +} + +/* Initialize event port backend */ +static zend_result eventport_backend_init(php_poll_ctx *ctx) +{ + eventport_backend_data_t *data + = php_poll_calloc(1, sizeof(eventport_backend_data_t), ctx->persistent); + if (!data) { + php_poll_set_error(ctx, PHP_POLL_ERR_NOMEM); + return FAILURE; + } + + /* Create event port */ + data->port_fd = port_create(); + if (data->port_fd == -1) { + pefree(data, ctx->persistent); + php_poll_set_error(ctx, PHP_POLL_ERR_SYSTEM); + return FAILURE; + } + + /* Use hint for initial allocation if provided, otherwise start with reasonable default */ + int initial_capacity = ctx->max_events_hint > 0 ? ctx->max_events_hint : 64; + data->events = php_poll_calloc(initial_capacity, sizeof(port_event_t), ctx->persistent); + if (!data->events) { + close(data->port_fd); + pefree(data, ctx->persistent); + php_poll_set_error(ctx, PHP_POLL_ERR_NOMEM); + return FAILURE; + } + data->events_capacity = initial_capacity; + + /* Initialize FD tracking using helper */ + data->fd_table = php_poll_fd_table_init(initial_capacity, ctx->persistent); + if (!data->fd_table) { + close(data->port_fd); + pefree(data->events, ctx->persistent); + pefree(data, ctx->persistent); + php_poll_set_error(ctx, PHP_POLL_ERR_NOMEM); + return FAILURE; + } + + ctx->backend_data = data; + return SUCCESS; +} + +/* Cleanup event port backend */ +static void eventport_backend_cleanup(php_poll_ctx *ctx) +{ + eventport_backend_data_t *data = (eventport_backend_data_t *) ctx->backend_data; + if (data) { + if (data->port_fd >= 0) { + close(data->port_fd); + } + pefree(data->events, ctx->persistent); + php_poll_fd_table_cleanup(data->fd_table); + pefree(data, ctx->persistent); + ctx->backend_data = NULL; + } +} + +/* Add file descriptor to event port - just store in table */ +static zend_result eventport_backend_add( + php_poll_ctx *ctx, int fd, uint32_t events, void *user_data) +{ + eventport_backend_data_t *backend_data = (eventport_backend_data_t *) ctx->backend_data; + + if (php_poll_fd_table_find(backend_data->fd_table, fd)) { + php_poll_set_error(ctx, PHP_POLL_ERR_EXISTS); + return FAILURE; + } + + php_poll_fd_entry *entry = php_poll_fd_table_get_new(backend_data->fd_table, fd); + if (!entry) { + php_poll_set_error(ctx, PHP_POLL_ERR_NOMEM); + return FAILURE; + } + + entry->events = events; + entry->data = user_data; + entry->last_revents = EVENTPORT_NEEDS_ASSOC; /* Mark as needing association */ + + return SUCCESS; +} + +/* Modify file descriptor in event port - just update table */ +static zend_result eventport_backend_modify( + php_poll_ctx *ctx, int fd, uint32_t events, void *user_data) +{ + eventport_backend_data_t *backend_data = (eventport_backend_data_t *) ctx->backend_data; + + php_poll_fd_entry *entry = php_poll_fd_table_find(backend_data->fd_table, fd); + if (!entry) { + php_poll_set_error(ctx, PHP_POLL_ERR_NOTFOUND); + return FAILURE; + } + + /* Update entry */ + entry->events = events; + entry->data = user_data; + + /* If currently associated, dissociate so we can re-associate with new events */ + if (entry->last_revents == EVENTPORT_IS_ASSOCIATED) { + port_dissociate(backend_data->port_fd, PORT_SOURCE_FD, fd); + } + + entry->last_revents = EVENTPORT_NEEDS_ASSOC; /* Mark as needing re-association */ + + return SUCCESS; +} + +/* Remove file descriptor from event port */ +static zend_result eventport_backend_remove(php_poll_ctx *ctx, int fd) +{ + eventport_backend_data_t *backend_data = (eventport_backend_data_t *) ctx->backend_data; + + php_poll_fd_entry *entry = php_poll_fd_table_find(backend_data->fd_table, fd); + if (!entry) { + php_poll_set_error(ctx, PHP_POLL_ERR_NOTFOUND); + return FAILURE; + } + + /* Only dissociate if it was actually associated */ + if (entry->last_revents == EVENTPORT_IS_ASSOCIATED) { + if (port_dissociate(backend_data->port_fd, PORT_SOURCE_FD, fd) == -1) { + /* Only fail if it's not ENOENT (might already be auto-dissociated) */ + if (!php_poll_is_not_found_error()) { + php_poll_set_current_errno_error(ctx); + return FAILURE; + } + } + } + + php_poll_fd_table_remove(backend_data->fd_table, fd); + return SUCCESS; +} + +/* Callback context for associating fds */ +typedef struct eventport_associate_ctx { + eventport_backend_data_t *backend_data; + php_poll_ctx *ctx; + bool has_error; +} eventport_associate_ctx; + +/* Callback to associate fds that need association */ +static bool eventport_associate_callback(int fd, php_poll_fd_entry *entry, void *user_data) +{ + eventport_associate_ctx *assoc_ctx = (eventport_associate_ctx *) user_data; + + /* Only associate if marked as needing association */ + if (entry->last_revents == EVENTPORT_NEEDS_ASSOC) { + int native_events = eventport_events_to_native(entry->events); + + if (port_associate(assoc_ctx->backend_data->port_fd, PORT_SOURCE_FD, fd, native_events, + entry->data) + == -1) { + /* Association failed - could set error here if needed */ + switch (errno) { + case EBADFD: + /* fd got closed - remove it */ + php_poll_fd_table_remove(assoc_ctx->backend_data->fd_table, fd); + return true; + case ENOMEM: + php_poll_set_error(assoc_ctx->ctx, PHP_POLL_ERR_NOMEM); + break; + case EINVAL: + php_poll_set_error(assoc_ctx->ctx, PHP_POLL_ERR_INVALID); + break; + default: + php_poll_set_error(assoc_ctx->ctx, PHP_POLL_ERR_SYSTEM); + break; + } + assoc_ctx->has_error = true; + return false; /* Stop iteration */ + } + + /* Mark as associated */ + entry->last_revents = EVENTPORT_IS_ASSOCIATED; + } + + return true; /* Continue iteration */ +} + +/* Wait for events using event port */ +static int eventport_backend_wait( + php_poll_ctx *ctx, php_poll_event *events, int max_events, + const struct timespec *timeout) +{ + eventport_backend_data_t *backend_data = (eventport_backend_data_t *) ctx->backend_data; + + int fd_count = php_poll_fd_table_count(backend_data->fd_table); + if (fd_count == 0) { + /* No fds to monitor, but we still need to respect timeout */ + if (timeout != NULL && (timeout->tv_sec > 0 || timeout->tv_nsec > 0)) { + nanosleep(timeout, NULL); + } + return 0; + } + + /* First: associate all fds that need association */ + eventport_associate_ctx assoc_ctx + = { .backend_data = backend_data, .ctx = ctx, .has_error = false }; + + php_poll_fd_table_foreach(backend_data->fd_table, eventport_associate_callback, &assoc_ctx); + + if (assoc_ctx.has_error) { + return -1; + } + + /* Ensure we have enough space for the requested events */ + if (max_events > backend_data->events_capacity) { + port_event_t *new_events = php_poll_realloc( + backend_data->events, max_events * sizeof(port_event_t), ctx->persistent); + if (!new_events) { + php_poll_set_error(ctx, PHP_POLL_ERR_NOMEM); + return -1; + } + backend_data->events = new_events; + backend_data->events_capacity = max_events; + } + + /* port_getn accepts NULL timeout for indefinite wait, or a timespec pointer - + * this maps directly to our new API. We need a mutable copy since port_getn + * may modify the timeout. */ + struct timespec ts_copy; + struct timespec *tsp = NULL; + if (timeout != NULL) { + ts_copy = *timeout; + tsp = &ts_copy; + } + + /* Retrieve events from port */ + uint_t nget = 1; /* We want to get multiple events if available */ + int result = port_getn(backend_data->port_fd, backend_data->events, max_events, &nget, tsp); + + if (result == -1) { + if (php_poll_is_timeout_error()) { + return 0; + } + php_poll_set_current_errno_error(ctx); + return -1; + } + + int nfds = (int) nget; + + /* Process events */ + for (int i = 0; i < nfds; i++) { + port_event_t *port_event = &backend_data->events[i]; + + /* Only handle PORT_SOURCE_FD events */ + if (port_event->portev_source == PORT_SOURCE_FD) { + int fd = (int) port_event->portev_object; + + events[i].fd = fd; + events[i].events = 0; + events[i].revents = eventport_events_from_native(port_event->portev_events); + events[i].data = port_event->portev_user; + + /* After event fires, the association is automatically removed by event ports */ + php_poll_fd_entry *entry = php_poll_fd_table_find(backend_data->fd_table, fd); + if (entry) { + if (entry->events & PHP_POLL_ONESHOT) { + /* Oneshot: remove from tracking completely */ + php_poll_fd_table_remove(backend_data->fd_table, fd); + } else { + /* Mark for re-association on next wait() call */ + entry->last_revents = EVENTPORT_NEEDS_ASSOC; + } + } + } else { + /* Handle other event sources if needed (timers, user events, etc.) */ + events[i].fd = -1; + events[i].events = 0; + events[i].revents = 0; + events[i].data = port_event->portev_user; + } + } + + return nfds; +} + +/* Check if event port backend is available */ +static bool eventport_backend_is_available(void) +{ + int fd = port_create(); + if (fd >= 0) { + close(fd); + return true; + } + return false; +} + +static int eventport_backend_get_suitable_max_events(php_poll_ctx *ctx) +{ + eventport_backend_data_t *backend_data = (eventport_backend_data_t *) ctx->backend_data; + + if (!backend_data || !backend_data->fd_table) { + return -1; + } + + int fd_count = php_poll_fd_table_count(backend_data->fd_table); + + if (fd_count == 0) { + return 1; + } + + /* Event ports can return exactly one event per association, + * so the suitable max_events is exactly the number of tracked fds */ + return fd_count; +} + +/* Event port backend operations structure */ +const php_poll_backend_ops php_poll_backend_eventport_ops = { + .type = PHP_POLL_BACKEND_EVENTPORT, + .name = "eventport", + .init = eventport_backend_init, + .cleanup = eventport_backend_cleanup, + .add = eventport_backend_add, + .modify = eventport_backend_modify, + .remove = eventport_backend_remove, + .wait = eventport_backend_wait, + .is_available = eventport_backend_is_available, + .get_suitable_max_events = eventport_backend_get_suitable_max_events, + .supports_et = false /* Event ports are level-triggered only */ +}; + +#endif /* HAVE_EVENT_PORTS */ diff --git a/main/poll/poll_backend_kqueue.c b/main/poll/poll_backend_kqueue.c new file mode 100644 index 000000000000..59b5efa9cacb --- /dev/null +++ b/main/poll/poll_backend_kqueue.c @@ -0,0 +1,490 @@ +/* + +----------------------------------------------------------------------+ + | Copyright © The PHP Group and Contributors. | + +----------------------------------------------------------------------+ + | This source file is subject to the Modified BSD License that is | + | bundled with this package in the file LICENSE, and is available | + | through the World Wide Web at . | + | | + | SPDX-License-Identifier: BSD-3-Clause | + +----------------------------------------------------------------------+ + | Authors: Jakub Zelenka | + +----------------------------------------------------------------------+ +*/ + +#include "php_poll_internal.h" + +#ifdef HAVE_KQUEUE + +#include +#include +#include + +/* Flags for tracking FD state in single hash table */ +#define KQUEUE_FD_PRESENT (1 << 0) /* FD is registered */ +#define KQUEUE_FD_ONESHOT_COMPLETE (1 << 1) /* Has both read+write oneshot */ +#define KQUEUE_FD_GARBAGE_READ (1 << 2) /* Read filter fired, needs write cleanup */ +#define KQUEUE_FD_GARBAGE_WRITE (1 << 3) /* Write filter fired, needs read cleanup */ +#define KQUEUE_FD_HAS_GARBAGE (KQUEUE_FD_GARBAGE_READ | KQUEUE_FD_GARBAGE_WRITE) + +typedef struct kqueue_backend_data { + int kqueue_fd; + struct kevent *events; + int events_capacity; + int fd_count; /* Track number of unique FDs (not individual filters) */ + int filter_count; /* Track total number of filters for raw events */ + HashTable *fd_tracking; /* Single hash table for all FD state tracking */ +} kqueue_backend_data_t; + +static zend_result kqueue_backend_init(php_poll_ctx *ctx) +{ + kqueue_backend_data_t *data + = php_poll_calloc(1, sizeof(kqueue_backend_data_t), ctx->persistent); + if (!data) { + php_poll_set_error(ctx, PHP_POLL_ERR_NOMEM); + return FAILURE; + } + + data->kqueue_fd = kqueue(); + if (data->kqueue_fd == -1) { + pefree(data, ctx->persistent); + php_poll_set_error(ctx, PHP_POLL_ERR_SYSTEM); + return FAILURE; + } + + /* Use hint for initial allocation if provided, otherwise start with reasonable default */ + int initial_capacity = ctx->max_events_hint > 0 ? ctx->max_events_hint : 64; + data->events = php_poll_calloc(initial_capacity, sizeof(struct kevent), ctx->persistent); + if (!data->events) { + close(data->kqueue_fd); + pefree(data, ctx->persistent); + php_poll_set_error(ctx, PHP_POLL_ERR_NOMEM); + return FAILURE; + } + data->events_capacity = initial_capacity; + data->fd_count = 0; + data->filter_count = 0; + + /* Initialize single tracking hash table (only if not using raw events) */ + if (!ctx->raw_events) { + data->fd_tracking = php_poll_malloc(sizeof(HashTable), ctx->persistent); + zend_hash_init(data->fd_tracking, 8, NULL, NULL, ctx->persistent); + } else { + data->fd_tracking = NULL; + } + + ctx->backend_data = data; + return SUCCESS; +} + +static void kqueue_backend_cleanup(php_poll_ctx *ctx) +{ + kqueue_backend_data_t *data = (kqueue_backend_data_t *) ctx->backend_data; + if (data) { + if (data->kqueue_fd >= 0) { + close(data->kqueue_fd); + } + pefree(data->events, ctx->persistent); + + /* Cleanup tracking hash table if initialized */ + if (data->fd_tracking) { + zend_hash_destroy(data->fd_tracking); + pefree(data->fd_tracking, ctx->persistent); + } + + pefree(data, ctx->persistent); + ctx->backend_data = NULL; + } +} + +static zend_result kqueue_backend_add(php_poll_ctx *ctx, int fd, uint32_t events, void *data) +{ + kqueue_backend_data_t *backend_data = (kqueue_backend_data_t *) ctx->backend_data; + + /* Check for duplicate in non-raw mode */ + if (!ctx->raw_events) { + zval *existing = zend_hash_index_find(backend_data->fd_tracking, fd); + if (existing && (Z_LVAL_P(existing) & KQUEUE_FD_PRESENT)) { + php_poll_set_error(ctx, PHP_POLL_ERR_EXISTS); + return FAILURE; + } + } + + struct kevent changes[2]; /* Max 2 changes: read + write */ + int change_count = 0; + + uint16_t flags = EV_ADD | EV_ENABLE; + if (events & PHP_POLL_ONESHOT) { + flags |= EV_ONESHOT; + } + if (events & PHP_POLL_ET) { + flags |= EV_CLEAR; + } + + if (events & PHP_POLL_READ) { + EV_SET(&changes[change_count], fd, EVFILT_READ, flags, 0, 0, data); + change_count++; + } + + if (events & PHP_POLL_WRITE) { + EV_SET(&changes[change_count], fd, EVFILT_WRITE, flags, 0, 0, data); + change_count++; + } + + if (change_count > 0) { + int result = kevent(backend_data->kqueue_fd, changes, change_count, NULL, 0, NULL); + if (result == -1) { + php_poll_set_current_errno_error(ctx); + return FAILURE; + } + + /* Increment counters */ + backend_data->fd_count++; + backend_data->filter_count += change_count; + + /* Track FD state in non-raw mode */ + if (!ctx->raw_events) { + zend_long tracking_flags = KQUEUE_FD_PRESENT; + + /* Mark as complete oneshot if both read+write with oneshot */ + if ((events & (PHP_POLL_READ | PHP_POLL_WRITE | PHP_POLL_ONESHOT)) + == (PHP_POLL_READ | PHP_POLL_WRITE | PHP_POLL_ONESHOT)) { + tracking_flags |= KQUEUE_FD_ONESHOT_COMPLETE; + } + + zval tracking_zval; + ZVAL_LONG(&tracking_zval, tracking_flags); + zend_hash_index_update(backend_data->fd_tracking, fd, &tracking_zval); + } + } + + return SUCCESS; +} + +static zend_result kqueue_backend_modify(php_poll_ctx *ctx, int fd, uint32_t events, void *data) +{ + kqueue_backend_data_t *backend_data = (kqueue_backend_data_t *) ctx->backend_data; + + struct kevent deletes[2]; + struct kevent adds[2]; + int delete_count = 0; + int add_count = 0; + int successful_deletes = 0; + + uint16_t add_flags = EV_ADD | EV_ENABLE; + if (events & PHP_POLL_ONESHOT) { + add_flags |= EV_ONESHOT; + } + if (events & PHP_POLL_ET) { + add_flags |= EV_CLEAR; + } + + /* Delete existing filters that are not in the new events */ + if (!(events & PHP_POLL_READ)) { + EV_SET(&deletes[delete_count], fd, EVFILT_READ, EV_DELETE, 0, 0, NULL); + delete_count++; + } + if (!(events & PHP_POLL_WRITE)) { + EV_SET(&deletes[delete_count], fd, EVFILT_WRITE, EV_DELETE, 0, 0, NULL); + delete_count++; + } + + /* Prepare add operations for requested events */ + if (events & PHP_POLL_READ) { + EV_SET(&adds[add_count], fd, EVFILT_READ, add_flags, 0, 0, data); + add_count++; + } + if (events & PHP_POLL_WRITE) { + EV_SET(&adds[add_count], fd, EVFILT_WRITE, add_flags, 0, 0, data); + add_count++; + } + + /* Delete existing filters individually to count successes */ + for (int i = 0; i < delete_count; i++) { + int result = kevent(backend_data->kqueue_fd, &deletes[i], 1, NULL, 0, NULL); + if (result == 0) { + successful_deletes++; + } else if (!php_poll_is_not_found_error()) { + php_poll_set_current_errno_error(ctx); + return FAILURE; + } + /* ENOENT is ignored - filter didn't exist */ + } + + /* Add new filters */ + if (add_count > 0) { + int result = kevent(backend_data->kqueue_fd, adds, add_count, NULL, 0, NULL); + if (result == -1) { + php_poll_set_current_errno_error(ctx); + return FAILURE; + } + } + + /* Update counters and tracking */ + if (successful_deletes > 0 && add_count == 0) { + /* Removed all filters - FD is gone */ + backend_data->fd_count--; + backend_data->filter_count -= successful_deletes; + if (!ctx->raw_events) { + zend_hash_index_del(backend_data->fd_tracking, fd); + } + } else if (add_count > 0) { + if (successful_deletes == 0) { + /* Added filters to previously empty FD */ + backend_data->fd_count++; + backend_data->filter_count += add_count; + } else { + /* Mixed operation when successful_deletes > 0 - update filter count */ + backend_data->filter_count = backend_data->filter_count - successful_deletes + add_count; + } + + if (!ctx->raw_events) { + zend_long tracking_flags = KQUEUE_FD_PRESENT; + if ((events & (PHP_POLL_READ | PHP_POLL_WRITE | PHP_POLL_ONESHOT)) + == (PHP_POLL_READ | PHP_POLL_WRITE | PHP_POLL_ONESHOT)) { + tracking_flags |= KQUEUE_FD_ONESHOT_COMPLETE; + } + zval tracking_zval; + ZVAL_LONG(&tracking_zval, tracking_flags); + zend_hash_index_update(backend_data->fd_tracking, fd, &tracking_zval); + } + } + + return SUCCESS; +} + +static zend_result kqueue_backend_remove(php_poll_ctx *ctx, int fd) +{ + kqueue_backend_data_t *backend_data = (kqueue_backend_data_t *) ctx->backend_data; + struct kevent change; + int successful_deletes = 0; + + /* Try to remove read filter */ + EV_SET(&change, fd, EVFILT_READ, EV_DELETE, 0, 0, NULL); + int result = kevent(backend_data->kqueue_fd, &change, 1, NULL, 0, NULL); + if (result == 0) { + successful_deletes++; + } else if (!php_poll_is_not_found_error()) { + php_poll_set_current_errno_error(ctx); + return FAILURE; + } + + /* Try to remove write filter */ + EV_SET(&change, fd, EVFILT_WRITE, EV_DELETE, 0, 0, NULL); + result = kevent(backend_data->kqueue_fd, &change, 1, NULL, 0, NULL); + if (result == 0) { + successful_deletes++; + } else if (!php_poll_is_not_found_error()) { + php_poll_set_current_errno_error(ctx); + return FAILURE; + } + + /* If no filters were successfully deleted, that's an error */ + if (successful_deletes == 0) { + php_poll_set_error(ctx, PHP_POLL_ERR_NOTFOUND); + return FAILURE; + } + + /* Update counters */ + backend_data->fd_count--; + backend_data->filter_count -= successful_deletes; + + /* Remove from tracking */ + if (!ctx->raw_events) { + zend_hash_index_del(backend_data->fd_tracking, fd); + } + + return SUCCESS; +} + +static int kqueue_backend_wait( + php_poll_ctx *ctx, php_poll_event *events, int max_events, + const struct timespec *timeout) +{ + kqueue_backend_data_t *backend_data = (kqueue_backend_data_t *) ctx->backend_data; + + /* For raw events, we need capacity for max_events. + * For grouped events, kqueue can return up to 2 events per FD, so we need 2x capacity. */ + int required_capacity = ctx->raw_events ? max_events : (max_events * 2); + if (required_capacity > backend_data->events_capacity) { + struct kevent *new_events = php_poll_realloc( + backend_data->events, required_capacity * sizeof(struct kevent), ctx->persistent); + if (!new_events) { + php_poll_set_error(ctx, PHP_POLL_ERR_NOMEM); + return -1; + } + backend_data->events = new_events; + backend_data->events_capacity = required_capacity; + } + + int nfds = kevent( + backend_data->kqueue_fd, NULL, 0, backend_data->events, required_capacity, timeout); + + if (nfds > 0) { + if (ctx->raw_events) { + /* Raw events mode - direct 1:1 mapping, no grouping */ + for (int i = 0; i < nfds && i < max_events; i++) { + events[i].fd = (int) backend_data->events[i].ident; + events[i].events = 0; + events[i].revents = 0; + events[i].data = backend_data->events[i].udata; + + /* Convert kqueue filter to poll event */ + if (backend_data->events[i].filter == EVFILT_READ) { + events[i].revents |= PHP_POLL_READ; + } else if (backend_data->events[i].filter == EVFILT_WRITE) { + events[i].revents |= PHP_POLL_WRITE; + } + + /* Convert kqueue flags to poll events */ + if (backend_data->events[i].flags & EV_EOF) { + events[i].revents |= PHP_POLL_HUP; + } + if (backend_data->events[i].flags & EV_ERROR) { + events[i].revents |= PHP_POLL_ERROR; + } + } + return nfds > max_events ? max_events : nfds; + } else { + /* Grouped events mode with improved oneshot tracking */ + int unique_events = 0, garbage_events = 0, fd; + + for (int i = 0; i < nfds; i++) { + fd = (int) backend_data->events[i].ident; + uint32_t revents = 0; + void *data = backend_data->events[i].udata; + bool is_oneshot = (backend_data->events[i].flags & EV_ONESHOT) != 0; + + /* Convert this event */ + if (backend_data->events[i].filter == EVFILT_READ) { + revents |= PHP_POLL_READ; + } else if (backend_data->events[i].filter == EVFILT_WRITE) { + revents |= PHP_POLL_WRITE; + } + + if (backend_data->events[i].flags & EV_EOF) { + revents |= PHP_POLL_HUP; + } + if (backend_data->events[i].flags & EV_ERROR) { + revents |= PHP_POLL_ERROR; + } + + /* Look for existing event for this FD */ + bool found = false; + for (int j = 0; j < unique_events; j++) { + if (events[j].fd == fd) { + /* Combine with existing event */ + events[j].revents |= revents; + found = true; + break; + } + } + + if (!found) { + /* New FD, create new event */ + ZEND_ASSERT(unique_events < max_events); + events[unique_events].fd = fd; + events[unique_events].events = 0; + events[unique_events].revents = revents; + events[unique_events].data = data; + unique_events++; + + /* Handle oneshot tracking */ + if (is_oneshot) { + zval *tracking = zend_hash_index_find(backend_data->fd_tracking, fd); + if (tracking && (Z_LVAL_P(tracking) & KQUEUE_FD_ONESHOT_COMPLETE)) { + /* Mark which filter fired for garbage collection */ + zend_long flags = Z_LVAL_P(tracking); + flags &= ~KQUEUE_FD_ONESHOT_COMPLETE; /* Clear complete flag */ + if (revents & PHP_POLL_READ) { + flags |= KQUEUE_FD_GARBAGE_READ; /* Need to clean write */ + } + if (revents & PHP_POLL_WRITE) { + flags |= KQUEUE_FD_GARBAGE_WRITE; /* Need to clean read */ + } + ZVAL_LONG(tracking, flags); + backend_data->fd_count--; + garbage_events++; + } + } + } else if (is_oneshot) { + /* Second filter for same FD fired - clear garbage flags */ + zval *tracking = zend_hash_index_find(backend_data->fd_tracking, fd); + if (tracking) { + /* Remove FD from tracking as it gets deleted from kqueue as well */ + zend_hash_index_del(backend_data->fd_tracking, fd); + garbage_events--; + } + } + } + + if (garbage_events > 0) { + /* Clean up orphaned filters from complete oneshot FDs */ + struct kevent cleanup_change; + ZEND_HASH_FOREACH_NUM_KEY_VAL(backend_data->fd_tracking, zend_ulong fd_key, zval *tracking) + { + zend_long flags = Z_LVAL_P(tracking); + if (flags & KQUEUE_FD_HAS_GARBAGE) { + int filter = (flags & KQUEUE_FD_GARBAGE_READ) ? EVFILT_WRITE : EVFILT_READ; + EV_SET(&cleanup_change, fd_key, filter, EV_DELETE, 0, 0, NULL); + kevent(backend_data->kqueue_fd, &cleanup_change, 1, NULL, 0, NULL); + + /* Remove FD from tracking after cleanup */ + zend_hash_index_del(backend_data->fd_tracking, fd_key); + } + } + ZEND_HASH_FOREACH_END(); + } + + return unique_events; + } + } + + return nfds; +} + +static bool kqueue_backend_is_available(void) +{ + int fd = kqueue(); + if (fd >= 0) { + close(fd); + return true; + } + return false; +} + +static int kqueue_backend_get_suitable_max_events(php_poll_ctx *ctx) +{ + kqueue_backend_data_t *backend_data = (kqueue_backend_data_t *) ctx->backend_data; + + if (!backend_data) { + return -1; + } + + if (ctx->raw_events) { + /* For raw events, return the total number of filters */ + int active_filters = backend_data->filter_count; + return active_filters == 0 ? 1 : active_filters; + } else { + /* For grouped events, return the number of unique FDs */ + int active_fds = backend_data->fd_count; + return active_fds == 0 ? 1 : active_fds; + } +} + +const php_poll_backend_ops php_poll_backend_kqueue_ops = { + .type = PHP_POLL_BACKEND_KQUEUE, + .name = "kqueue", + .init = kqueue_backend_init, + .cleanup = kqueue_backend_cleanup, + .add = kqueue_backend_add, + .modify = kqueue_backend_modify, + .remove = kqueue_backend_remove, + .wait = kqueue_backend_wait, + .is_available = kqueue_backend_is_available, + .get_suitable_max_events = kqueue_backend_get_suitable_max_events, + .supports_et = true +}; + + +#endif /* HAVE_KQUEUE */ diff --git a/main/poll/poll_backend_poll.c b/main/poll/poll_backend_poll.c new file mode 100644 index 000000000000..cca81b6fc4fb --- /dev/null +++ b/main/poll/poll_backend_poll.c @@ -0,0 +1,287 @@ +/* + +----------------------------------------------------------------------+ + | Copyright © The PHP Group and Contributors. | + +----------------------------------------------------------------------+ + | This source file is subject to the Modified BSD License that is | + | bundled with this package in the file LICENSE, and is available | + | through the World Wide Web at . | + | | + | SPDX-License-Identifier: BSD-3-Clause | + +----------------------------------------------------------------------+ + | Authors: Jakub Zelenka | + +----------------------------------------------------------------------+ +*/ + +#include "php_poll_internal.h" + +#ifndef PHP_WIN32 + +typedef struct poll_backend_data { + php_poll_fd_table *fd_table; + struct pollfd *temp_fds; + int temp_fds_capacity; +} poll_backend_data_t; + +static uint32_t poll_events_to_native(uint32_t events) +{ + uint32_t native = 0; + if (events & PHP_POLL_READ) { + native |= POLLIN; + } + if (events & PHP_POLL_WRITE) { + native |= POLLOUT; + } + if (events & PHP_POLL_ERROR) { + native |= POLLERR; + } + if (events & PHP_POLL_HUP) { + native |= POLLHUP; + } + return native; +} + +static uint32_t poll_events_from_native(uint32_t native) +{ + uint32_t events = 0; + if (native & POLLIN) { + events |= PHP_POLL_READ; + } + if (native & POLLOUT) { + events |= PHP_POLL_WRITE; + } + if (native & POLLERR) { + events |= PHP_POLL_ERROR; + } + if (native & POLLHUP) { + events |= PHP_POLL_HUP; + } + if (native & POLLNVAL) { + events |= PHP_POLL_ERROR; /* Map invalid FD to error */ + } + return events; +} + +static zend_result poll_backend_init(php_poll_ctx *ctx) +{ + poll_backend_data_t *data = php_poll_calloc(1, sizeof(poll_backend_data_t), ctx->persistent); + if (!data) { + php_poll_set_error(ctx, PHP_POLL_ERR_NOMEM); + return FAILURE; + } + + int initial_capacity = ctx->max_events_hint > 0 ? ctx->max_events_hint : 64; + + data->fd_table = php_poll_fd_table_init(initial_capacity, ctx->persistent); + if (!data->fd_table) { + pefree(data, ctx->persistent); + php_poll_set_error(ctx, PHP_POLL_ERR_NOMEM); + return FAILURE; + } + + data->temp_fds = php_poll_calloc(initial_capacity, sizeof(struct pollfd), ctx->persistent); + if (!data->temp_fds) { + php_poll_fd_table_cleanup(data->fd_table); + pefree(data, ctx->persistent); + php_poll_set_error(ctx, PHP_POLL_ERR_NOMEM); + return FAILURE; + } + data->temp_fds_capacity = initial_capacity; + + ctx->backend_data = data; + return SUCCESS; +} + +static void poll_backend_cleanup(php_poll_ctx *ctx) +{ + poll_backend_data_t *data = (poll_backend_data_t *) ctx->backend_data; + if (data) { + php_poll_fd_table_cleanup(data->fd_table); + pefree(data->temp_fds, ctx->persistent); + pefree(data, ctx->persistent); + ctx->backend_data = NULL; + } +} + +static zend_result poll_backend_add(php_poll_ctx *ctx, int fd, uint32_t events, void *user_data) +{ + poll_backend_data_t *backend_data = (poll_backend_data_t *) ctx->backend_data; + + if (events & PHP_POLL_ET) { + php_poll_set_error(ctx, PHP_POLL_ERR_NOSUPPORT); + return FAILURE; + } + + if (php_poll_fd_table_find(backend_data->fd_table, fd)) { + php_poll_set_error(ctx, PHP_POLL_ERR_EXISTS); + return FAILURE; + } + + php_poll_fd_entry *entry = php_poll_fd_table_get_new(backend_data->fd_table, fd); + if (!entry) { + php_poll_set_error(ctx, PHP_POLL_ERR_NOMEM); + return FAILURE; + } + + entry->events = events; + entry->data = user_data; + + return SUCCESS; +} + +static zend_result poll_backend_modify(php_poll_ctx *ctx, int fd, uint32_t events, void *user_data) +{ + poll_backend_data_t *backend_data = (poll_backend_data_t *) ctx->backend_data; + + if (events & PHP_POLL_ET) { + php_poll_set_error(ctx, PHP_POLL_ERR_NOSUPPORT); + return FAILURE; + } + + php_poll_fd_entry *entry = php_poll_fd_table_find(backend_data->fd_table, fd); + if (!entry) { + php_poll_set_error(ctx, PHP_POLL_ERR_NOTFOUND); + return FAILURE; + } + + entry->events = events; + entry->data = user_data; + + return SUCCESS; +} + +static zend_result poll_backend_remove(php_poll_ctx *ctx, int fd) +{ + poll_backend_data_t *backend_data = (poll_backend_data_t *) ctx->backend_data; + + if (!php_poll_fd_table_remove(backend_data->fd_table, fd)) { + php_poll_set_error(ctx, PHP_POLL_ERR_NOTFOUND); + return FAILURE; + } + + return SUCCESS; +} + +/* Context for building struct pollfd array */ +typedef struct poll_build_context { + struct pollfd *fds; + int index; +} poll_build_context; + +/* Callback to build struct pollfd array from fd_table */ +static bool poll_build_fds_callback(int fd, php_poll_fd_entry *entry, void *user_data) +{ + poll_build_context *ctx = (poll_build_context *) user_data; + + ctx->fds[ctx->index].fd = fd; + ctx->fds[ctx->index].events + = poll_events_to_native(entry->events & ~(PHP_POLL_ET | PHP_POLL_ONESHOT)); + ctx->fds[ctx->index].revents = 0; + ctx->index++; + + return true; +} + +static int poll_backend_wait( + php_poll_ctx *ctx, php_poll_event *events, int max_events, + const struct timespec *timeout) +{ + poll_backend_data_t *backend_data = (poll_backend_data_t *) ctx->backend_data; + + int fd_count = php_poll_fd_table_count(backend_data->fd_table); + if (fd_count == 0) { + if (timeout != NULL && (timeout->tv_sec > 0 || timeout->tv_nsec > 0)) { + nanosleep(timeout, NULL); + } + return 0; + } + + /* Ensure temp_fds array is large enough */ + if (fd_count > backend_data->temp_fds_capacity) { + struct pollfd *new_fds = php_poll_realloc( + backend_data->temp_fds, fd_count * sizeof(struct pollfd), ctx->persistent); + if (!new_fds) { + php_poll_set_error(ctx, PHP_POLL_ERR_NOMEM); + return -1; + } + backend_data->temp_fds = new_fds; + backend_data->temp_fds_capacity = fd_count; + } + + /* Build struct pollfd array from fd_table */ + poll_build_context build_ctx = { .fds = backend_data->temp_fds, .index = 0 }; + php_poll_fd_table_foreach(backend_data->fd_table, poll_build_fds_callback, &build_ctx); + + /* Convert timespec to milliseconds (poll() only supports ms resolution) */ + int timeout_ms = php_poll_timespec_to_ms(timeout); + int nfds = poll(backend_data->temp_fds, fd_count, timeout_ms); + + if (nfds <= 0) { + return nfds; /* Return 0 for timeout, -1 for error */ + } + + /* Process results - iterate through struct pollfd array directly */ + int event_count = 0; + for (int i = 0; i < fd_count && event_count < max_events; i++) { + struct pollfd *pfd = &backend_data->temp_fds[i]; + + if (pfd->revents != 0) { + php_poll_fd_entry *entry = php_poll_fd_table_find(backend_data->fd_table, pfd->fd); + if (entry) { + /* Handle POLLNVAL by automatically removing the invalid FD */ + if (pfd->revents & POLLNVAL) { + php_poll_fd_table_remove(backend_data->fd_table, pfd->fd); + continue; /* Don't report this event */ + } + + events[event_count].fd = pfd->fd; + events[event_count].events = entry->events; + events[event_count].revents = poll_events_from_native(pfd->revents); + events[event_count].data = entry->data; + event_count++; + } + } + } + + /* Handle oneshot removals */ + for (int i = 0; i < event_count; i++) { + php_poll_fd_entry *entry = php_poll_fd_table_find(backend_data->fd_table, events[i].fd); + if (entry && (entry->events & PHP_POLL_ONESHOT) && events[i].revents != 0) { + php_poll_fd_table_remove(backend_data->fd_table, events[i].fd); + } + } + + return event_count; +} + +static bool poll_backend_is_available(void) +{ + return true; +} + +static int poll_backend_get_suitable_max_events(php_poll_ctx *ctx) +{ + poll_backend_data_t *backend_data = (poll_backend_data_t *) ctx->backend_data; + + if (UNEXPECTED(!backend_data || !backend_data->fd_table)) { + return -1; + } + + int active_fds = php_poll_fd_table_count(backend_data->fd_table); + return active_fds == 0 ? 1 : active_fds; +} + +const php_poll_backend_ops php_poll_backend_poll_ops = { + .type = PHP_POLL_BACKEND_POLL, + .name = "poll", + .init = poll_backend_init, + .cleanup = poll_backend_cleanup, + .add = poll_backend_add, + .modify = poll_backend_modify, + .remove = poll_backend_remove, + .wait = poll_backend_wait, + .is_available = poll_backend_is_available, + .get_suitable_max_events = poll_backend_get_suitable_max_events, + .supports_et = false, +}; + +#endif diff --git a/main/poll/poll_backend_wsapoll.c b/main/poll/poll_backend_wsapoll.c new file mode 100644 index 000000000000..101a7cfe0e4b --- /dev/null +++ b/main/poll/poll_backend_wsapoll.c @@ -0,0 +1,335 @@ +/* ++----------------------------------------------------------------------+ +| Copyright © The PHP Group and Contributors. | ++----------------------------------------------------------------------+ +| This source file is subject to the Modified BSD License that is | +| bundled with this package in the file LICENSE, and is available | +| through the World Wide Web at . | +| | +| SPDX-License-Identifier: BSD-3-Clause | ++----------------------------------------------------------------------+ +| Authors: Jakub Zelenka | ++----------------------------------------------------------------------+ +*/ + +#include "php_poll_internal.h" + +#ifdef PHP_WIN32 + +#include +#include + +typedef struct wsapoll_backend_data { + php_poll_fd_table *fd_table; + WSAPOLLFD *temp_fds; + int temp_fds_capacity; +} wsapoll_backend_data_t; + +static uint32_t wsapoll_events_to_native(uint32_t events) +{ + uint32_t native = 0; + if (events & PHP_POLL_READ) { + native |= POLLRDNORM; + } + if (events & PHP_POLL_WRITE) { + native |= POLLWRNORM; + } + if (events & PHP_POLL_ERROR) { + native |= POLLERR; + } + if (events & PHP_POLL_HUP) { + native |= POLLHUP; + } + return native; +} + +static uint32_t wsapoll_events_from_native(uint32_t native) +{ + uint32_t events = 0; + if (native & POLLRDNORM) { + events |= PHP_POLL_READ; + } + if (native & POLLWRNORM) { + events |= PHP_POLL_WRITE; + } + if (native & POLLERR) { + events |= PHP_POLL_ERROR; + } + if (native & POLLHUP) { + events |= PHP_POLL_HUP; + } + if (native & POLLNVAL) { + events |= PHP_POLL_ERROR; /* Map invalid socket to error */ + } + return events; +} + +static zend_result wsapoll_backend_init(php_poll_ctx *ctx) +{ + wsapoll_backend_data_t *data + = php_poll_calloc(1, sizeof(wsapoll_backend_data_t), ctx->persistent); + if (!data) { + php_poll_set_error(ctx, PHP_POLL_ERR_NOMEM); + return FAILURE; + } + + int initial_capacity = ctx->max_events_hint > 0 ? ctx->max_events_hint : 64; + + data->fd_table = php_poll_fd_table_init(initial_capacity, ctx->persistent); + if (!data->fd_table) { + pefree(data, ctx->persistent); + php_poll_set_error(ctx, PHP_POLL_ERR_NOMEM); + return FAILURE; + } + + data->temp_fds = php_poll_calloc(initial_capacity, sizeof(WSAPOLLFD), ctx->persistent); + if (!data->temp_fds) { + php_poll_fd_table_cleanup(data->fd_table); + pefree(data, ctx->persistent); + php_poll_set_error(ctx, PHP_POLL_ERR_NOMEM); + return FAILURE; + } + data->temp_fds_capacity = initial_capacity; + + ctx->backend_data = data; + return SUCCESS; +} + +static void wsapoll_backend_cleanup(php_poll_ctx *ctx) +{ + wsapoll_backend_data_t *data = (wsapoll_backend_data_t *) ctx->backend_data; + if (data) { + php_poll_fd_table_cleanup(data->fd_table); + pefree(data->temp_fds, ctx->persistent); + pefree(data, ctx->persistent); + ctx->backend_data = NULL; + } +} + +static zend_result wsapoll_backend_add(php_poll_ctx *ctx, int fd, uint32_t events, void *user_data) +{ + wsapoll_backend_data_t *backend_data = (wsapoll_backend_data_t *) ctx->backend_data; + + if (events & PHP_POLL_ET) { + php_poll_set_error(ctx, PHP_POLL_ERR_NOSUPPORT); + return FAILURE; + } + + if (php_poll_fd_table_find(backend_data->fd_table, fd)) { + php_poll_set_error(ctx, PHP_POLL_ERR_EXISTS); + return FAILURE; + } + + php_poll_fd_entry *entry = php_poll_fd_table_get_new(backend_data->fd_table, fd); + if (!entry) { + php_poll_set_error(ctx, PHP_POLL_ERR_NOMEM); + return FAILURE; + } + + entry->events = events; + entry->data = user_data; + + return SUCCESS; +} + +static zend_result wsapoll_backend_modify( + php_poll_ctx *ctx, int fd, uint32_t events, void *user_data) +{ + wsapoll_backend_data_t *backend_data = (wsapoll_backend_data_t *) ctx->backend_data; + + if (events & PHP_POLL_ET) { + php_poll_set_error(ctx, PHP_POLL_ERR_NOSUPPORT); + return FAILURE; + } + + php_poll_fd_entry *entry = php_poll_fd_table_find(backend_data->fd_table, fd); + if (!entry) { + php_poll_set_error(ctx, PHP_POLL_ERR_NOTFOUND); + return FAILURE; + } + + entry->events = events; + entry->data = user_data; + + return SUCCESS; +} + +static zend_result wsapoll_backend_remove(php_poll_ctx *ctx, int fd) +{ + wsapoll_backend_data_t *backend_data = (wsapoll_backend_data_t *) ctx->backend_data; + + if (!php_poll_fd_table_remove(backend_data->fd_table, fd)) { + php_poll_set_error(ctx, PHP_POLL_ERR_NOTFOUND); + return FAILURE; + } + + return SUCCESS; +} + +/* Context for building WSAPOLLFD array */ +typedef struct wsapoll_build_context { + WSAPOLLFD *fds; + int index; +} wsapoll_build_context; + +/* Callback to build WSAPOLLFD array from fd_table */ +static bool wsapoll_build_fds_callback(int fd, php_poll_fd_entry *entry, void *user_data) +{ + wsapoll_build_context *ctx = (wsapoll_build_context *) user_data; + + ctx->fds[ctx->index].fd = (SOCKET) fd; + ctx->fds[ctx->index].events + = (SHORT) wsapoll_events_to_native(entry->events & ~(PHP_POLL_ET | PHP_POLL_ONESHOT)); + ctx->fds[ctx->index].revents = 0; + ctx->index++; + + return true; +} + +static int wsapoll_backend_wait( + php_poll_ctx *ctx, php_poll_event *events, int max_events, + const struct timespec *timeout) +{ + wsapoll_backend_data_t *backend_data = (wsapoll_backend_data_t *) ctx->backend_data; + + int fd_count = php_poll_fd_table_count(backend_data->fd_table); + if (fd_count == 0) { + if (timeout != NULL && (timeout->tv_sec > 0 || timeout->tv_nsec > 0)) { + /* Convert to milliseconds, rounding up */ + int sleep_ms = php_poll_timespec_to_ms(timeout); + if (sleep_ms > 0) { + Sleep(sleep_ms); + } + } + return 0; + } + + /* Ensure temp_fds array is large enough */ + if (fd_count > backend_data->temp_fds_capacity) { + WSAPOLLFD *new_fds = php_poll_realloc( + backend_data->temp_fds, fd_count * sizeof(WSAPOLLFD), ctx->persistent); + if (!new_fds) { + php_poll_set_error(ctx, PHP_POLL_ERR_NOMEM); + return -1; + } + backend_data->temp_fds = new_fds; + backend_data->temp_fds_capacity = fd_count; + } + + /* Build WSAPOLLFD array from fd_table */ + wsapoll_build_context build_ctx = { .fds = backend_data->temp_fds, .index = 0 }; + php_poll_fd_table_foreach(backend_data->fd_table, wsapoll_build_fds_callback, &build_ctx); + + /* Convert timespec to milliseconds (WSAPoll only supports ms resolution, round up) */ + int timeout_ms = php_poll_timespec_to_ms(timeout); + + /* Call WSAPoll */ + int nfds = WSAPoll(backend_data->temp_fds, fd_count, timeout_ms); + + if (nfds == SOCKET_ERROR) { + /* WSAPoll specific error handling */ + int wsa_error = WSAGetLastError(); + php_poll_error error_code; + + switch (wsa_error) { + case WSAENOTSOCK: + /* Special case: all sockets in array are invalid + * WSAPoll fails entirely, but we should clean up and return 0 + * This differs from Unix poll() which would report POLLNVAL per socket */ + + /* Remove all invalid sockets from fd_table */ + for (int i = 0; i < fd_count; i++) { + int fd = (int) backend_data->temp_fds[i].fd; + php_poll_fd_table_remove(backend_data->fd_table, fd); + } + return 0; + case WSAENOBUFS: + error_code = PHP_POLL_ERR_NOMEM; + break; + case WSAEINVAL: + case WSAEFAULT: + error_code = PHP_POLL_ERR_INVALID; + break; + default: + error_code = PHP_POLL_ERR_SYSTEM; + break; + } + + php_poll_set_error(ctx, error_code); + return -1; + } + + if (nfds == 0) { + return 0; /* Timeout */ + } + + int event_count = 0; + for (int i = 0; i < fd_count && event_count < max_events; i++) { + WSAPOLLFD *pfd = &backend_data->temp_fds[i]; + + if (pfd->revents != 0) { + int fd = (int) pfd->fd; + php_poll_fd_entry *entry = php_poll_fd_table_find(backend_data->fd_table, fd); + if (entry) { + /* WSAPoll-specific handling of POLLNVAL */ + if (pfd->revents & POLLNVAL) { + php_poll_fd_table_remove(backend_data->fd_table, fd); + continue; /* Do not report this event */ + } + + /* Convert WSAPoll events to PHP poll events */ + uint32_t converted_events = wsapoll_events_from_native(pfd->revents); + + events[event_count].fd = fd; + events[event_count].events = entry->events; + events[event_count].revents = converted_events; + events[event_count].data = entry->data; + event_count++; + } + } + } + + /* Handle oneshot removals */ + for (int i = 0; i < event_count; i++) { + php_poll_fd_entry *entry = php_poll_fd_table_find(backend_data->fd_table, events[i].fd); + if (entry && (entry->events & PHP_POLL_ONESHOT) && events[i].revents != 0) { + php_poll_fd_table_remove(backend_data->fd_table, events[i].fd); + } + } + + return event_count; +} + +static bool wsapoll_backend_is_available(void) +{ + /* Always available on the currently supported Windows versions. */ + return true; +} + +static int wsapoll_backend_get_suitable_max_events(php_poll_ctx *ctx) +{ + wsapoll_backend_data_t *backend_data = (wsapoll_backend_data_t *) ctx->backend_data; + + if (UNEXPECTED(!backend_data || !backend_data->fd_table)) { + return -1; + } + + int active_fds = php_poll_fd_table_count(backend_data->fd_table); + return active_fds == 0 ? 1 : active_fds; +} + +const php_poll_backend_ops php_poll_backend_wsapoll_ops = { + .type = PHP_POLL_BACKEND_WSAPOLL, + .name = "wsapoll", + .init = wsapoll_backend_init, + .cleanup = wsapoll_backend_cleanup, + .add = wsapoll_backend_add, + .modify = wsapoll_backend_modify, + .remove = wsapoll_backend_remove, + .wait = wsapoll_backend_wait, + .is_available = wsapoll_backend_is_available, + .get_suitable_max_events = wsapoll_backend_get_suitable_max_events, + .supports_et = false, +}; + +#endif /* PHP_WIN32 */ diff --git a/main/poll/poll_core.c b/main/poll/poll_core.c new file mode 100644 index 000000000000..f985dbcdd3eb --- /dev/null +++ b/main/poll/poll_core.c @@ -0,0 +1,443 @@ +/* + +----------------------------------------------------------------------+ + | Copyright © The PHP Group and Contributors. | + +----------------------------------------------------------------------+ + | This source file is subject to the Modified BSD License that is | + | bundled with this package in the file LICENSE, and is available | + | through the World Wide Web at . | + | | + | SPDX-License-Identifier: BSD-3-Clause | + +----------------------------------------------------------------------+ + | Authors: Jakub Zelenka | + +----------------------------------------------------------------------+ +*/ + +#include "php_poll_internal.h" + +/* Backend registry */ +static const php_poll_backend_ops *registered_backends[8]; +static int num_registered_backends = 0; + +/* Forward declarations for backend ops */ + +#ifdef HAVE_EPOLL +extern const php_poll_backend_ops php_poll_backend_epoll_ops; +#endif +#ifdef HAVE_KQUEUE +extern const php_poll_backend_ops php_poll_backend_kqueue_ops; +#endif +#ifdef HAVE_EVENT_PORTS +extern const php_poll_backend_ops php_poll_backend_eventport_ops; +#endif +#ifdef PHP_WIN32 +extern const php_poll_backend_ops php_poll_backend_wsapoll_ops; +#else +extern const php_poll_backend_ops php_poll_backend_poll_ops; +#endif + +/* Register all available backends */ +PHPAPI void php_poll_register_backends(void) +{ + num_registered_backends = 0; + +#ifdef HAVE_EVENT_PORTS + /* Event Ports are preferred on Solaris */ + if (php_poll_backend_eventport_ops.is_available()) { + registered_backends[num_registered_backends++] = &php_poll_backend_eventport_ops; + } +#endif + +#ifdef HAVE_KQUEUE + if (php_poll_backend_kqueue_ops.is_available()) { + registered_backends[num_registered_backends++] = &php_poll_backend_kqueue_ops; + } +#endif + +#ifdef HAVE_EPOLL + if (php_poll_backend_epoll_ops.is_available()) { + registered_backends[num_registered_backends++] = &php_poll_backend_epoll_ops; + } +#endif + +#ifdef PHP_WIN32 + registered_backends[num_registered_backends++] = &php_poll_backend_wsapoll_ops; +#else + registered_backends[num_registered_backends++] = &php_poll_backend_poll_ops; +#endif +} + +/* Get backend operations */ +static const php_poll_backend_ops *php_poll_get_backend_ops(php_poll_backend_type backend) +{ + if (backend == PHP_POLL_BACKEND_AUTO) { + /* Return the first (best) available backend */ + return num_registered_backends > 0 ? registered_backends[0] : NULL; + } + + for (int i = 0; i < num_registered_backends; i++) { + if (registered_backends[i] && registered_backends[i]->type == backend) { + return registered_backends[i]; + } + } + + return NULL; +} + +/* Get backend operations by backend name */ +static const php_poll_backend_ops *php_poll_get_backend_ops_by_name(const char *backend_name) +{ + if (!backend_name) { + return NULL; + } + + for (int i = 0; i < num_registered_backends; i++) { + if (registered_backends[i] && strcmp(registered_backends[i]->name, backend_name) == 0) { + return registered_backends[i]; + } + } + + return NULL; +} + +PHPAPI bool php_poll_is_backend_available(php_poll_backend_type backend) +{ + if (backend == PHP_POLL_BACKEND_AUTO) { + return true; /* Auto is always available */ + } + + for (int i = 0; i < num_registered_backends; i++) { + if (registered_backends[i] && registered_backends[i]->type == backend) { + return registered_backends[i]->is_available(); + } + } + + return false; +} + +PHPAPI bool php_poll_backend_supports_edge_triggering(php_poll_backend_type backend) +{ + if (backend == PHP_POLL_BACKEND_AUTO) { + /* Check the first (best) available backend */ + if (num_registered_backends > 0 && registered_backends[0]) { + return registered_backends[0]->supports_et; + } + return false; + } + + for (int i = 0; i < num_registered_backends; i++) { + if (registered_backends[i] && registered_backends[i]->type == backend) { + return registered_backends[i]->supports_et; + } + } + + return false; +} + +static php_poll_ctx *php_poll_create_context(uint32_t flags) +{ + bool persistent = flags & PHP_POLL_FLAG_PERSISTENT; + php_poll_ctx *ctx = php_poll_calloc(1, sizeof(php_poll_ctx), persistent); + if (!ctx) { + return NULL; + } + ctx->persistent = persistent; + ctx->raw_events = (flags & PHP_POLL_FLAG_RAW_EVENTS) != 0; + + return ctx; +} + +/* Create new poll context */ +PHPAPI php_poll_ctx *php_poll_create(php_poll_backend_type preferred_backend, uint32_t flags) +{ + php_poll_ctx *ctx = php_poll_create_context(flags); + if (ctx == NULL) { + return NULL; + } + + /* Get backend operations */ + ctx->backend_ops = php_poll_get_backend_ops(preferred_backend); + if (!ctx->backend_ops) { + pefree(ctx, ctx->persistent); + return NULL; + } + ctx->backend_type = preferred_backend; + + return ctx; +} + +/* Create new poll context */ +PHPAPI php_poll_ctx *php_poll_create_by_name(const char *preferred_backend, uint32_t flags) +{ + if (!strcmp(preferred_backend, "auto")) { + return php_poll_create(PHP_POLL_BACKEND_AUTO, flags); + } + + php_poll_ctx *ctx = php_poll_create_context(flags); + if (ctx == NULL) { + return NULL; + } + + /* Get backend operations */ + ctx->backend_ops = php_poll_get_backend_ops_by_name(preferred_backend); + if (!ctx->backend_ops) { + pefree(ctx, ctx->persistent); + return NULL; + } + ctx->backend_type = ctx->backend_ops->type; + + return ctx; +} + +/* Set event capacity hint (optional optimization) */ +PHPAPI zend_result php_poll_set_max_events_hint(php_poll_ctx *ctx, int max_events) +{ + ZEND_ASSERT(ctx); + if (UNEXPECTED(max_events <= 0)) { + php_poll_set_error(ctx, PHP_POLL_ERR_INVALID); + return FAILURE; + } + + if (UNEXPECTED(ctx->initialized)) { + php_poll_set_error(ctx, PHP_POLL_ERR_INVALID); + return FAILURE; /* Cannot change after init */ + } + + ctx->max_events_hint = max_events; + return SUCCESS; +} + +/* Initialize poll context */ +PHPAPI zend_result php_poll_init(php_poll_ctx *ctx) +{ + if (UNEXPECTED(!ctx)) { + return FAILURE; + } + + if (UNEXPECTED(ctx->initialized)) { + return SUCCESS; + } + + /* Initialize backend - can use ctx->max_events_hint if helpful */ + if (EXPECTED(ctx->backend_ops->init(ctx) == SUCCESS)) { + ctx->initialized = true; + return SUCCESS; + } + + php_poll_set_current_errno_error(ctx); + return FAILURE; +} + +/* Destroy poll context */ +PHPAPI void php_poll_destroy(php_poll_ctx *ctx) +{ + if (!ctx) { + return; + } + + if (ctx->backend_ops && ctx->backend_ops->cleanup) { + ctx->backend_ops->cleanup(ctx); + } + + pefree(ctx, ctx->persistent); +} + +/* Add file descriptor */ +PHPAPI zend_result php_poll_add(php_poll_ctx *ctx, int fd, uint32_t events, void *data) +{ + ZEND_ASSERT(ctx); + if (UNEXPECTED(!ctx->initialized || fd < 0)) { + php_poll_set_error(ctx, PHP_POLL_ERR_INVALID); + return FAILURE; + } + + /* Delegate to backend - it handles all validation and tracking */ + if (EXPECTED(ctx->backend_ops->add(ctx, fd, events, data) == SUCCESS)) { + return SUCCESS; + } + + return FAILURE; +} + +/* Modify file descriptor */ +PHPAPI zend_result php_poll_modify(php_poll_ctx *ctx, int fd, uint32_t events, void *data) +{ + ZEND_ASSERT(ctx); + if (UNEXPECTED(!ctx->initialized || fd < 0)) { + php_poll_set_error(ctx, PHP_POLL_ERR_INVALID); + return FAILURE; + } + + /* Delegate to backend - it handles validation */ + if (EXPECTED(ctx->backend_ops->modify(ctx, fd, events, data) == SUCCESS)) { + return SUCCESS; + } + + return FAILURE; +} + +/* Remove file descriptor */ +PHPAPI zend_result php_poll_remove(php_poll_ctx *ctx, int fd) +{ + ZEND_ASSERT(ctx); + if (UNEXPECTED(!ctx->initialized || fd < 0)) { + php_poll_set_error(ctx, PHP_POLL_ERR_INVALID); + return FAILURE; + } + + /* Delegate to backend - it handles validation */ + if (EXPECTED(ctx->backend_ops->remove(ctx, fd) == SUCCESS)) { + return SUCCESS; + } + + return FAILURE; +} + +/* Wait for events */ +PHPAPI int php_poll_wait(php_poll_ctx *ctx, php_poll_event *events, int max_events, + const struct timespec *timeout) +{ + ZEND_ASSERT(ctx); + if (UNEXPECTED(!ctx->initialized || !events || max_events <= 0)) { + php_poll_set_error(ctx, PHP_POLL_ERR_INVALID); + return -1; + } + + /* Delegate to backend - it handles everything including ET simulation if needed */ + int nfds = ctx->backend_ops->wait(ctx, events, max_events, timeout); + + return nfds; +} + +/* Get backend name */ +PHPAPI const char *php_poll_backend_name(php_poll_ctx *ctx) +{ + return ctx && ctx->backend_ops ? ctx->backend_ops->name : "unknown"; +} + +/* Get backend type */ +PHPAPI php_poll_backend_type php_poll_get_backend_type(php_poll_ctx *ctx) +{ + return ctx && ctx->backend_ops ? ctx->backend_ops->type : PHP_POLL_BACKEND_AUTO; +} + +/* Check edge-triggering support */ +PHPAPI bool php_poll_supports_et(php_poll_ctx *ctx) +{ + return ctx && ctx->backend_ops && ctx->backend_ops->supports_et; +} + +/* Get suitable max_events for backend */ +PHPAPI int php_poll_get_suitable_max_events(php_poll_ctx *ctx) +{ + if (UNEXPECTED(!ctx || !ctx->backend_ops)) { + return -1; + } + + return ctx->backend_ops->get_suitable_max_events(ctx); +} + +/* Error retrieval */ +PHPAPI php_poll_error php_poll_get_error(php_poll_ctx *ctx) +{ + return ctx ? ctx->last_error : PHP_POLL_ERR_INVALID; +} + +/* Errno to php_poll_error mapping helper */ +php_poll_error php_poll_errno_to_error(int err) +{ + switch (err) { + case 0: + return PHP_POLL_ERR_NONE; + + case ENOMEM: + return PHP_POLL_ERR_NOMEM; + + case EINVAL: + case EBADF: + return PHP_POLL_ERR_INVALID; + + case EEXIST: + return PHP_POLL_ERR_EXISTS; + + case ENOENT: + return PHP_POLL_ERR_NOTFOUND; + +#ifdef ETIME + case ETIME: +#endif +#ifdef ETIMEDOUT + case ETIMEDOUT: +#endif + return PHP_POLL_ERR_TIMEOUT; + + case EINTR: + return PHP_POLL_ERR_INTERRUPTED; + + case EACCES: +#ifdef EPERM + case EPERM: +#endif + return PHP_POLL_ERR_PERMISSION; + +#ifdef EMFILE + case EMFILE: +#endif +#ifdef ENFILE + case ENFILE: +#endif + return PHP_POLL_ERR_TOOBIG; + + case EAGAIN: +#if defined(EWOULDBLOCK) && EWOULDBLOCK != EAGAIN + case EWOULDBLOCK: +#endif + return PHP_POLL_ERR_AGAIN; + +#ifdef ENOSYS + case ENOSYS: +#endif +#if ENOTSUP + case ENOTSUP: +#endif +#if defined(EOPNOTSUPP) && EOPNOTSUPP != ENOTSUP + case EOPNOTSUPP: +#endif + return PHP_POLL_ERR_NOSUPPORT; + + default: + return PHP_POLL_ERR_SYSTEM; + } +} + +/* Get human-readable error description */ +PHPAPI const char *php_poll_error_string(php_poll_error error) +{ + switch (error) { + case PHP_POLL_ERR_NONE: + return "No error"; + case PHP_POLL_ERR_SYSTEM: + return "System error"; + case PHP_POLL_ERR_NOMEM: + return "Out of memory"; + case PHP_POLL_ERR_INVALID: + return "Invalid argument"; + case PHP_POLL_ERR_EXISTS: + return "File descriptor already exists"; + case PHP_POLL_ERR_NOTFOUND: + return "File descriptor not found"; + case PHP_POLL_ERR_TIMEOUT: + return "Operation timed out"; + case PHP_POLL_ERR_INTERRUPTED: + return "Operation interrupted"; + case PHP_POLL_ERR_PERMISSION: + return "Permission denied"; + case PHP_POLL_ERR_TOOBIG: + return "Too many open files"; + case PHP_POLL_ERR_AGAIN: + return "Resource temporarily unavailable"; + case PHP_POLL_ERR_NOSUPPORT: + return "Operation not supported"; + default: + return "Unknown error"; + } +} diff --git a/main/poll/poll_fd_table.c b/main/poll/poll_fd_table.c new file mode 100644 index 000000000000..1c76da79b7eb --- /dev/null +++ b/main/poll/poll_fd_table.c @@ -0,0 +1,114 @@ +/* + +----------------------------------------------------------------------+ + | Copyright © The PHP Group and Contributors. | + +----------------------------------------------------------------------+ + | This source file is subject to the Modified BSD License that is | + | bundled with this package in the file LICENSE, and is available | + | through the World Wide Web at . | + | | + | SPDX-License-Identifier: BSD-3-Clause | + +----------------------------------------------------------------------+ + | Authors: Jakub Zelenka | + +----------------------------------------------------------------------+ +*/ + +#include "php_poll_internal.h" + +php_poll_fd_table *php_poll_fd_table_init(int initial_capacity, bool persistent) +{ + php_poll_fd_table *table = php_poll_calloc(1, sizeof(php_poll_fd_table), persistent); + if (!table) { + return NULL; + } + + if (initial_capacity <= 0) { + initial_capacity = 64; + } + + _zend_hash_init(&table->entries_ht, initial_capacity, NULL, persistent); + table->persistent = persistent; + + return table; +} + +void php_poll_fd_table_cleanup(php_poll_fd_table *table) +{ + if (table) { + ZEND_HASH_FOREACH_VAL(&table->entries_ht, zval *zv) + { + php_poll_fd_entry *entry = Z_PTR_P(zv); + pefree(entry, table->persistent); + } + ZEND_HASH_FOREACH_END(); + + zend_hash_destroy(&table->entries_ht); + pefree(table, table->persistent); + } +} + +php_poll_fd_entry *php_poll_fd_table_find(php_poll_fd_table *table, int fd) +{ + zval *zv = zend_hash_index_find(&table->entries_ht, (zend_ulong) fd); + return zv ? Z_PTR_P(zv) : NULL; +} + +php_poll_fd_entry *php_poll_fd_table_get_new(php_poll_fd_table *table, int fd) +{ + php_poll_fd_entry *entry = php_poll_calloc(1, sizeof(php_poll_fd_entry), table->persistent); + if (!entry) { + return NULL; + } + + entry->fd = fd; + entry->active = true; + entry->events = 0; + entry->data = NULL; + entry->last_revents = 0; + + zval zv; + ZVAL_PTR(&zv, entry); + if (!zend_hash_index_add(&table->entries_ht, (zend_ulong) fd, &zv)) { + pefree(entry, table->persistent); + return NULL; + } + + return entry; +} + +php_poll_fd_entry *php_poll_fd_table_get(php_poll_fd_table *table, int fd) +{ + php_poll_fd_entry *entry = php_poll_fd_table_find(table, fd); + if (entry) { + return entry; + } + + return php_poll_fd_table_get_new(table, fd); +} + +bool php_poll_fd_table_remove(php_poll_fd_table *table, int fd) +{ + zval *zv = zend_hash_index_find(&table->entries_ht, (zend_ulong) fd); + if (zv == NULL) { + return false; + } + php_poll_fd_entry *entry = Z_PTR_P(zv); + pefree(entry, table->persistent); + return zend_hash_index_del(&table->entries_ht, (zend_ulong) fd) == SUCCESS; +} + +/* Helper function for backends that need to iterate over all entries */ +typedef bool (*php_poll_fd_iterator_func_t)(int fd, php_poll_fd_entry *entry, void *user_data); + +/* Iterate over all active FD entries */ +void php_poll_fd_table_foreach( + php_poll_fd_table *table, php_poll_fd_iterator_func_t callback, void *user_data) +{ + ZEND_HASH_FOREACH_NUM_KEY_VAL(&table->entries_ht, zend_ulong fd, zval *zv) + { + php_poll_fd_entry *entry = Z_PTR_P(zv); + if (entry->active && !callback((int) fd, entry, user_data)) { + break; /* Callback returned false, stop iteration */ + } + } + ZEND_HASH_FOREACH_END(); +} diff --git a/main/poll/poll_handle.c b/main/poll/poll_handle.c new file mode 100644 index 000000000000..0c0628ac49dc --- /dev/null +++ b/main/poll/poll_handle.c @@ -0,0 +1,97 @@ +/* + +----------------------------------------------------------------------+ + | Copyright © The PHP Group and Contributors. | + +----------------------------------------------------------------------+ + | This source file is subject to the Modified BSD License that is | + | bundled with this package in the file LICENSE, and is available | + | through the World Wide Web at . | + | | + | SPDX-License-Identifier: BSD-3-Clause | + +----------------------------------------------------------------------+ + | Authors: Jakub Zelenka | + +----------------------------------------------------------------------+ +*/ + +#include "php_poll.h" +#include "zend_exceptions.h" + +/* Default get_fd implementation - calls PHP method */ +static php_socket_t php_poll_handle_default_get_fd(php_poll_handle_object *handle) +{ + zval retval; + zval obj; + zval func_name; + + ZVAL_OBJ(&obj, &handle->std); + + /* Prepare function name as zval */ + ZVAL_STRING(&func_name, "getFileDescriptor"); + + /* Call getFileDescriptor() method */ + if (EXPECTED(call_user_function(NULL, &obj, &func_name, &retval, 0, NULL) == SUCCESS)) { + if (Z_TYPE(retval) == IS_LONG) { + php_socket_t fd = Z_LVAL(retval) < 0 ? SOCK_ERR : (php_socket_t) Z_LVAL(retval); + zval_ptr_dtor(&retval); + zval_ptr_dtor(&func_name); /* Clean up function name */ + return fd; + } + zval_ptr_dtor(&retval); + } + + zval_ptr_dtor(&func_name); /* Clean up function name */ + return SOCK_ERR; /* Invalid socket */ +} + +/* Default is_valid implementation - assume valid if we can get FD */ +static int php_poll_handle_default_is_valid(php_poll_handle_object *handle) +{ + return php_poll_handle_get_fd(handle) != SOCK_ERR; +} + +/* Default cleanup */ +static void php_poll_handle_default_cleanup(php_poll_handle_object *handle) +{ + /* Base implementation has no cleanup */ +} + +/* Default operations that call PHP userspace methods */ +php_poll_handle_ops php_poll_handle_default_ops = { .get_fd = php_poll_handle_default_get_fd, + .is_valid = php_poll_handle_default_is_valid, + .cleanup = php_poll_handle_default_cleanup }; + +/* Allocate a new poll handle object */ +PHPAPI php_poll_handle_object *php_poll_handle_object_create( + size_t obj_size, zend_class_entry *ce, php_poll_handle_ops *ops) +{ + php_poll_handle_object *intern = zend_object_alloc(obj_size, ce); + + zend_object_std_init(&intern->std, ce); + object_properties_init(&intern->std, ce); + + intern->ops = ops ? ops : &php_poll_handle_default_ops; + intern->handle_data = NULL; + + return intern; +} + +/* Free poll handle object */ +PHPAPI void php_poll_handle_object_free(zend_object *obj) +{ + php_poll_handle_object *intern = PHP_POLL_HANDLE_OBJ_FROM_ZOBJ(obj); + + if (intern->ops && intern->ops->cleanup) { + intern->ops->cleanup(intern); + } + + zend_object_std_dtor(&intern->std); +} + +/* Get file descriptor from handle using ops */ +PHPAPI php_socket_t php_poll_handle_get_fd(php_poll_handle_object *handle) +{ + if (!handle || !handle->ops || !handle->ops->get_fd) { + return SOCK_ERR; + } + + return handle->ops->get_fd(handle); +} diff --git a/main/reentrancy.c b/main/reentrancy.c index bd050ff9ac68..a611841a397a 100644 --- a/main/reentrancy.c +++ b/main/reentrancy.c @@ -1,14 +1,12 @@ /* +----------------------------------------------------------------------+ - | Copyright (c) The PHP Group | + | Copyright © The PHP Group and Contributors. | +----------------------------------------------------------------------+ - | This source file is subject to version 3.01 of the PHP license, | - | that is bundled with this package in the file LICENSE, and is | - | available through the world-wide-web at the following url: | - | https://www.php.net/license/3_01.txt | - | If you did not receive a copy of the PHP license and are unable to | - | obtain it through the world-wide-web, please send a note to | - | license@php.net so we can mail you a copy immediately. | + | This source file is subject to the Modified BSD License that is | + | bundled with this package in the file LICENSE, and is available | + | through the World Wide Web at . | + | | + | SPDX-License-Identifier: BSD-3-Clause | +----------------------------------------------------------------------+ | Author: Sascha Schumann | +----------------------------------------------------------------------+ diff --git a/main/rfc1867.c b/main/rfc1867.c index f6ffb6fabc7f..e40a1a9e3008 100644 --- a/main/rfc1867.c +++ b/main/rfc1867.c @@ -1,14 +1,12 @@ /* +----------------------------------------------------------------------+ - | Copyright (c) The PHP Group | + | Copyright © The PHP Group and Contributors. | +----------------------------------------------------------------------+ - | This source file is subject to version 3.01 of the PHP license, | - | that is bundled with this package in the file LICENSE, and is | - | available through the world-wide-web at the following url: | - | https://www.php.net/license/3_01.txt | - | If you did not receive a copy of the PHP license and are unable to | - | obtain it through the world-wide-web, please send a note to | - | license@php.net so we can mail you a copy immediately. | + | This source file is subject to the Modified BSD License that is | + | bundled with this package in the file LICENSE, and is available | + | through the World Wide Web at . | + | | + | SPDX-License-Identifier: BSD-3-Clause | +----------------------------------------------------------------------+ | Authors: Rasmus Lerdorf | | Jani Taskinen | @@ -392,7 +390,7 @@ static int multipart_buffer_headers(multipart_buffer *self, zend_llist *header) } /* space in the beginning means same header */ - if (!isspace(line[0])) { + if (!isspace((unsigned char)line[0])) { value = strchr(line, ':'); } @@ -408,7 +406,7 @@ static int multipart_buffer_headers(multipart_buffer *self, zend_llist *header) } *value = '\0'; - do { value++; } while (isspace(*value)); + do { value++; } while (isspace((unsigned char)*value)); key = estrdup(line); smart_string_appends(&buf_value, value); @@ -505,7 +503,7 @@ static char *substring_conf(char *start, int len, char quote) static char *php_ap_getword_conf(const zend_encoding *encoding, char *str) { - while (*str && isspace(*str)) { + while (*str && isspace((unsigned char)*str)) { ++str; } @@ -521,7 +519,7 @@ static char *php_ap_getword_conf(const zend_encoding *encoding, char *str) } else { char *strend = str; - while (*strend && !isspace(*strend)) { + while (*strend && !isspace((unsigned char)*strend)) { ++strend; } return substring_conf(str, strend - str, 0); @@ -665,8 +663,8 @@ SAPI_API SAPI_POST_HANDLER_FUNC(rfc1867_post_handler) zend_llist header; void *event_extra_data = NULL; unsigned int llen = 0; - zend_long upload_cnt = REQUEST_PARSE_BODY_OPTION_GET(max_file_uploads, INI_INT("max_file_uploads")); - zend_long body_parts_cnt = REQUEST_PARSE_BODY_OPTION_GET(max_multipart_body_parts, INI_INT("max_multipart_body_parts")); + zend_long upload_cnt = REQUEST_PARSE_BODY_OPTION_GET(max_file_uploads, zend_ini_long_literal("max_file_uploads")); + zend_long body_parts_cnt = REQUEST_PARSE_BODY_OPTION_GET(max_multipart_body_parts, zend_ini_long_literal("max_multipart_body_parts")); zend_long post_max_size = REQUEST_PARSE_BODY_OPTION_GET(post_max_size, SG(post_max_size)); zend_long max_input_vars = REQUEST_PARSE_BODY_OPTION_GET(max_input_vars, PG(max_input_vars)); zend_long upload_max_filesize = REQUEST_PARSE_BODY_OPTION_GET(upload_max_filesize, PG(upload_max_filesize)); @@ -797,7 +795,7 @@ SAPI_API SAPI_POST_HANDLER_FUNC(rfc1867_post_handler) goto fileupload_done; } - while (isspace(*cd)) { + while (isspace((unsigned char)*cd)) { ++cd; } @@ -805,7 +803,7 @@ SAPI_API SAPI_POST_HANDLER_FUNC(rfc1867_post_handler) { char *key = NULL, *word = pair; - while (isspace(*cd)) { + while (isspace((unsigned char)*cd)) { ++cd; } diff --git a/main/rfc1867.h b/main/rfc1867.h index bb690f15aa3e..cbe39c7b4f62 100644 --- a/main/rfc1867.h +++ b/main/rfc1867.h @@ -1,16 +1,12 @@ /* +----------------------------------------------------------------------+ - | Copyright (c) The PHP Group | + | Copyright © The PHP Group and Contributors. | +----------------------------------------------------------------------+ - | This source file is subject to version 3.01 of the PHP license, | - | that is bundled with this package in the file LICENSE, and is | - | available through the world-wide-web at the following url: | - | https://www.php.net/license/3_01.txt | - | If you did not receive a copy of the PHP license and are unable to | - | obtain it through the world-wide-web, please send a note to | - | license@php.net so we can mail you a copy immediately. | - +----------------------------------------------------------------------+ - | Author: | + | This source file is subject to the Modified BSD License that is | + | bundled with this package in the file LICENSE, and is available | + | through the World Wide Web at . | + | | + | SPDX-License-Identifier: BSD-3-Clause | +----------------------------------------------------------------------+ */ diff --git a/main/safe_bcmp.c b/main/safe_bcmp.c index f52dbee5bafe..2a7d3b55945b 100644 --- a/main/safe_bcmp.c +++ b/main/safe_bcmp.c @@ -1,14 +1,12 @@ /* +----------------------------------------------------------------------+ - | Copyright (c) The PHP Group | + | Copyright © The PHP Group and Contributors. | +----------------------------------------------------------------------+ - | This source file is subject to version 3.01 of the PHP license, | - | that is bundled with this package in the file LICENSE, and is | - | available through the world-wide-web at the following url: | - | https://www.php.net/license/3_01.txt | - | If you did not receive a copy of the PHP license and are unable to | - | obtain it through the world-wide-web, please send a note to | - | license@php.net so we can mail you a copy immediately. | + | This source file is subject to the Modified BSD License that is | + | bundled with this package in the file LICENSE, and is available | + | through the World Wide Web at . | + | | + | SPDX-License-Identifier: BSD-3-Clause | +----------------------------------------------------------------------+ | Author: David Carlier | +----------------------------------------------------------------------+ diff --git a/main/snprintf.c b/main/snprintf.c index e9938c79659f..73c981a1cee7 100644 --- a/main/snprintf.c +++ b/main/snprintf.c @@ -1,16 +1,12 @@ /* +----------------------------------------------------------------------+ - | Copyright (c) The PHP Group | + | Copyright © The PHP Group and Contributors. | +----------------------------------------------------------------------+ - | This source file is subject to version 3.01 of the PHP license, | - | that is bundled with this package in the file LICENSE, and is | - | available through the world-wide-web at the following url: | - | https://www.php.net/license/3_01.txt | - | If you did not receive a copy of the PHP license and are unable to | - | obtain it through the world-wide-web, please send a note to | - | license@php.net so we can mail you a copy immediately. | - +----------------------------------------------------------------------+ - | Author: | + | This source file is subject to the Modified BSD License that is | + | bundled with this package in the file LICENSE, and is available | + | through the World Wide Web at . | + | | + | SPDX-License-Identifier: BSD-3-Clause | +----------------------------------------------------------------------+ */ @@ -288,7 +284,7 @@ PHPAPI char * php_conv_fp(char format, double num, /* * Check for Infinity and NaN */ - if (isalpha((int)*p)) { + if (isalpha((unsigned char)*p)) { *len = strlen(p); memcpy(buf, p, *len + 1); *is_negative = false; @@ -435,11 +431,11 @@ typedef struct buf_area buffy; #define NUM( c ) ( c - '0' ) #define STR_TO_DEC( str, num ) \ - num = NUM( *str++ ) ; \ - while ( isdigit((int)*str ) ) \ + num = NUM( *(str)++ ) ; \ + while ( isdigit((unsigned char)*(str) ) ) \ { \ num *= 10 ; \ - num += NUM( *str++ ) ; \ + num += NUM( *(str)++ ) ; \ } /* @@ -533,7 +529,7 @@ static size_t format_converter(buffy * odp, const char *fmt, va_list ap) /* {{{ /* * Try to avoid checking for flags, width or precision */ - if (isascii((int)*fmt) && !islower((int)*fmt)) { + if (isascii((unsigned char)*fmt) && !islower((unsigned char)*fmt)) { /* * Recognize flags: -, #, BLANK, + */ @@ -555,7 +551,7 @@ static size_t format_converter(buffy * odp, const char *fmt, va_list ap) /* {{{ /* * Check if a width was specified */ - if (isdigit((int)*fmt)) { + if (isdigit((unsigned char)*fmt)) { STR_TO_DEC(fmt, min_width); adjust_width = true; } else if (*fmt == '*') { @@ -575,7 +571,7 @@ static size_t format_converter(buffy * odp, const char *fmt, va_list ap) /* {{{ if (*fmt == '.') { adjust_precision = true; fmt++; - if (isdigit((int)*fmt)) { + if (isdigit((unsigned char)*fmt)) { STR_TO_DEC(fmt, precision); } else if (*fmt == '*') { precision = va_arg(ap, int); diff --git a/main/snprintf.h b/main/snprintf.h index d61ee5e39a69..b123810a77c0 100644 --- a/main/snprintf.h +++ b/main/snprintf.h @@ -1,14 +1,12 @@ /* +----------------------------------------------------------------------+ - | Copyright (c) The PHP Group | + | Copyright © The PHP Group and Contributors. | +----------------------------------------------------------------------+ - | This source file is subject to version 3.01 of the PHP license, | - | that is bundled with this package in the file LICENSE, and is | - | available through the world-wide-web at the following url: | - | https://www.php.net/license/3_01.txt | - | If you did not receive a copy of the PHP license and are unable to | - | obtain it through the world-wide-web, please send a note to | - | license@php.net so we can mail you a copy immediately. | + | This source file is subject to the Modified BSD License that is | + | bundled with this package in the file LICENSE, and is available | + | through the World Wide Web at . | + | | + | SPDX-License-Identifier: BSD-3-Clause | +----------------------------------------------------------------------+ | Author: Stig Sæther Bakken | | Marcus Boerger | diff --git a/main/spprintf.c b/main/spprintf.c index 0dd7f1552e1c..6553853d8104 100644 --- a/main/spprintf.c +++ b/main/spprintf.c @@ -1,14 +1,12 @@ /* +----------------------------------------------------------------------+ - | Copyright (c) The PHP Group | + | Copyright © The PHP Group and Contributors. | +----------------------------------------------------------------------+ - | This source file is subject to version 3.01 of the PHP license, | - | that is bundled with this package in the file LICENSE, and is | - | available through the world-wide-web at the following url: | - | https://www.php.net/license/3_01.txt | - | If you did not receive a copy of the PHP license and are unable to | - | obtain it through the world-wide-web, please send a note to | - | license@php.net so we can mail you a copy immediately. | + | This source file is subject to the Modified BSD License that is | + | bundled with this package in the file LICENSE, and is available | + | through the World Wide Web at . | + | | + | SPDX-License-Identifier: BSD-3-Clause | +----------------------------------------------------------------------+ | Author: Marcus Boerger | +----------------------------------------------------------------------+ @@ -148,12 +146,12 @@ #define NUM(c) (c - '0') #define STR_TO_DEC(str, num) do { \ - num = NUM(*str++); \ - while (isdigit((int)*str)) { \ + num = NUM(*(str)++); \ + while (isdigit((unsigned char)*(str))) {\ num *= 10; \ - num += NUM(*str++); \ + num += NUM(*(str)++); \ if (num >= INT_MAX / 10) { \ - while (isdigit((int)*str++)); \ + while (isdigit((unsigned char)*(str)++)); \ break; \ } \ } \ @@ -233,7 +231,7 @@ static void xbuf_format_converter(void *xbuf, bool is_char, const char *fmt, va_ /* * Try to avoid checking for flags, width or precision */ - if (isascii((int)*fmt) && !islower((int)*fmt)) { + if (isascii((unsigned char)*fmt) && !islower((unsigned char)*fmt)) { /* * Recognize flags: -, #, BLANK, + */ @@ -255,7 +253,7 @@ static void xbuf_format_converter(void *xbuf, bool is_char, const char *fmt, va_ /* * Check if a width was specified */ - if (isdigit((int)*fmt)) { + if (isdigit((unsigned char)*fmt)) { STR_TO_DEC(fmt, min_width); adjust_width = true; } else if (*fmt == '*') { @@ -275,7 +273,7 @@ static void xbuf_format_converter(void *xbuf, bool is_char, const char *fmt, va_ if (*fmt == '.') { adjust_precision = true; fmt++; - if (isdigit((int)*fmt)) { + if (isdigit((unsigned char)*fmt)) { STR_TO_DEC(fmt, precision); } else if (*fmt == '*') { precision = va_arg(ap, int); diff --git a/main/spprintf.h b/main/spprintf.h index 4da224845b3b..c1d2377d25a5 100644 --- a/main/spprintf.h +++ b/main/spprintf.h @@ -1,14 +1,12 @@ /* +----------------------------------------------------------------------+ - | Copyright (c) The PHP Group | + | Copyright © The PHP Group and Contributors. | +----------------------------------------------------------------------+ - | This source file is subject to version 3.01 of the PHP license, | - | that is bundled with this package in the file LICENSE, and is | - | available through the world-wide-web at the following url: | - | https://www.php.net/license/3_01.txt | - | If you did not receive a copy of the PHP license and are unable to | - | obtain it through the world-wide-web, please send a note to | - | license@php.net so we can mail you a copy immediately. | + | This source file is subject to the Modified BSD License that is | + | bundled with this package in the file LICENSE, and is available | + | through the World Wide Web at . | + | | + | SPDX-License-Identifier: BSD-3-Clause | +----------------------------------------------------------------------+ | Author: Marcus Boerger | +----------------------------------------------------------------------+ diff --git a/main/streams/cast.c b/main/streams/cast.c index 4dc8ddb5f6a3..f480f3cd59a6 100644 --- a/main/streams/cast.c +++ b/main/streams/cast.c @@ -1,14 +1,12 @@ /* +----------------------------------------------------------------------+ - | Copyright (c) The PHP Group | + | Copyright © The PHP Group and Contributors. | +----------------------------------------------------------------------+ - | This source file is subject to version 3.01 of the PHP license, | - | that is bundled with this package in the file LICENSE, and is | - | available through the world-wide-web at the following url: | - | https://www.php.net/license/3_01.txt | - | If you did not receive a copy of the PHP license and are unable to | - | obtain it through the world-wide-web, please send a note to | - | license@php.net so we can mail you a copy immediately. | + | This source file is subject to the Modified BSD License that is | + | bundled with this package in the file LICENSE, and is available | + | through the World Wide Web at . | + | | + | SPDX-License-Identifier: BSD-3-Clause | +----------------------------------------------------------------------+ | Authors: Wez Furlong | +----------------------------------------------------------------------+ @@ -189,7 +187,6 @@ void php_stream_mode_sanitize_fdopen_fopencookie(php_stream *stream, char *resul result[res_curs] = '\0'; } /* }}} */ - /* {{{ php_stream_cast */ PHPAPI zend_result _php_stream_cast(php_stream *stream, int castas, void **ret, int show_err) { @@ -259,7 +256,7 @@ PHPAPI zend_result _php_stream_cast(php_stream *stream, int castas, void **ret, b) no memory -> lets bail */ - php_error_docref(NULL, E_ERROR, "fopencookie failed"); + php_stream_fatal(stream, CastFailed, "fopencookie failed"); return FAILURE; #endif @@ -299,7 +296,8 @@ PHPAPI zend_result _php_stream_cast(php_stream *stream, int castas, void **ret, if (php_stream_is_filtered(stream) && castas != PHP_STREAM_AS_FD_FOR_SELECT) { if (show_err) { - php_error_docref(NULL, E_WARNING, "Cannot cast a filtered stream on this system"); + php_stream_warn(stream, CastNotSupported, + "Cannot cast a filtered stream on this system"); } return FAILURE; } else if (stream->ops->cast && stream->ops->cast(stream, castas, ret) == SUCCESS) { @@ -315,7 +313,8 @@ PHPAPI zend_result _php_stream_cast(php_stream *stream, int castas, void **ret, "select()able descriptor" }; - php_error_docref(NULL, E_WARNING, "Cannot represent a stream of type %s as a %s", stream->ops->label, cast_names[castas]); + php_stream_warn(stream, CastNotSupported, + "Cannot represent a stream of type %s as a %s", stream->ops->label, cast_names[castas]); } return FAILURE; @@ -330,7 +329,9 @@ PHPAPI zend_result _php_stream_cast(php_stream *stream, int castas, void **ret, * will be accessing the stream. Emit a warning so that the end-user will * know that they should try something else */ - php_error_docref(NULL, E_WARNING, ZEND_LONG_FMT " bytes of buffered data lost during stream conversion!", (zend_long)(stream->writepos - stream->readpos)); + php_stream_warn_nt(stream, BufferedDataLost, + ZEND_LONG_FMT " bytes of buffered data lost during stream conversion!", + (zend_long)(stream->writepos - stream->readpos)); } if (castas == PHP_STREAM_AS_STDIO && ret) { diff --git a/main/streams/filter.c b/main/streams/filter.c index d0c1fdc8e788..e53c4fa14ba0 100644 --- a/main/streams/filter.c +++ b/main/streams/filter.c @@ -1,14 +1,12 @@ /* +----------------------------------------------------------------------+ - | Copyright (c) The PHP Group | + | Copyright © The PHP Group and Contributors. | +----------------------------------------------------------------------+ - | This source file is subject to version 3.01 of the PHP license, | - | that is bundled with this package in the file LICENSE, and is | - | available through the world-wide-web at the following url: | - | https://www.php.net/license/3_01.txt | - | If you did not receive a copy of the PHP license and are unable to | - | obtain it through the world-wide-web, please send a note to | - | license@php.net so we can mail you a copy immediately. | + | This source file is subject to the Modified BSD License that is | + | bundled with this package in the file LICENSE, and is available | + | through the World Wide Web at . | + | | + | SPDX-License-Identifier: BSD-3-Clause | +----------------------------------------------------------------------+ | Authors: Wez Furlong | +----------------------------------------------------------------------+ @@ -216,7 +214,7 @@ PHPAPI void php_stream_bucket_unlink(php_stream_bucket *bucket) * match. If that fails, we try "convert.charset.*", then "convert.*" * This means that we don't need to clog up the hashtable with a zillion * charsets (for example) but still be able to provide them all as filters */ -PHPAPI php_stream_filter *php_stream_filter_create(const char *filtername, zval *filterparams, uint8_t persistent) +PHPAPI php_stream_filter *php_stream_filter_create(const char *filtername, zval *filterparams, bool persistent) { HashTable *filter_hash = (FG(stream_filters) ? FG(stream_filters) : &stream_filters_hash); const php_stream_filter_factory *factory = NULL; @@ -260,7 +258,9 @@ PHPAPI php_stream_filter *php_stream_filter_create(const char *filtername, zval return filter; } -PHPAPI php_stream_filter *_php_stream_filter_alloc(const php_stream_filter_ops *fops, void *abstract, uint8_t persistent STREAMS_DC) +PHPAPI php_stream_filter *_php_stream_filter_alloc(const php_stream_filter_ops *fops, + void *abstract, bool persistent, php_stream_filter_seekable_t read_seekable, + php_stream_filter_seekable_t write_seekable STREAMS_DC) { php_stream_filter *filter; @@ -268,12 +268,59 @@ PHPAPI php_stream_filter *_php_stream_filter_alloc(const php_stream_filter_ops * memset(filter, 0, sizeof(php_stream_filter)); filter->fops = fops; + filter->read_seekable = read_seekable; + filter->write_seekable = write_seekable; Z_PTR(filter->abstract) = abstract; filter->is_persistent = persistent; return filter; } +PHPAPI zend_result php_stream_filter_parse_write_seek_mode( + const zval *filterparams, + php_stream_filter_seekable_t *write_seekable) +{ + *write_seekable = PSFS_SEEKABLE_ALWAYS; + + if (filterparams == NULL) { + return SUCCESS; + } + if (Z_TYPE_P(filterparams) != IS_ARRAY) { + return SUCCESS; + } + + const zval *write_seek_mode = zend_hash_str_find(Z_ARR_P(filterparams), ZEND_STRL("write_seek_mode")); + if (write_seek_mode == NULL) { + return SUCCESS; + } + + zend_string *tmp_str; + const zend_string *str = zval_get_tmp_string(write_seek_mode, &tmp_str); + zend_result result = SUCCESS; + + if (zend_string_equals_literal(str, "preserve")) { + *write_seekable = PSFS_SEEKABLE_ALWAYS; + } else if (zend_string_equals_literal(str, "reset")) { + *write_seekable = PSFS_SEEKABLE_START; + } else if (zend_string_equals_literal(str, "strict")) { + *write_seekable = PSFS_SEEKABLE_NEVER; + } else { + php_error_docref(NULL, E_WARNING, + "\"write_seek_mode\" filter parameter must be one of " + "\"preserve\", \"reset\", or \"strict\""); + result = FAILURE; + } + + zend_tmp_string_release(tmp_str); + return result; +} + +PHPAPI int php_stream_filter_get_chain_type(php_stream *stream, php_stream_filter *filter) +{ + return filter->chain == &stream->readfilters ? + PHP_STREAM_FILTER_READ : PHP_STREAM_FILTER_WRITE; +} + PHPAPI void php_stream_filter_free(php_stream_filter *filter) { if (filter->fops->dtor) @@ -343,7 +390,8 @@ PHPAPI zend_result php_stream_filter_append_ex(php_stream_filter_chain *chain, p php_stream_bucket_unlink(bucket); php_stream_bucket_delref(bucket); } - php_error_docref(NULL, E_WARNING, "Filter failed to process pre-buffered data"); + php_stream_warn(stream, FilterFailed, + "Filter failed to process pre-buffered data"); return FAILURE; case PSFS_FEED_ME: /* We don't actually need data yet, diff --git a/main/streams/glob_wrapper.c b/main/streams/glob_wrapper.c index fb056ce889fa..c7f1145de200 100644 --- a/main/streams/glob_wrapper.c +++ b/main/streams/glob_wrapper.c @@ -1,14 +1,12 @@ /* +----------------------------------------------------------------------+ - | Copyright (c) The PHP Group | + | Copyright © The PHP Group and Contributors. | +----------------------------------------------------------------------+ - | This source file is subject to version 3.01 of the PHP license, | - | that is bundled with this package in the file LICENSE, and is | - | available through the world-wide-web at the following url: | - | https://www.php.net/license/3_01.txt | - | If you did not receive a copy of the PHP license and are unable to | - | obtain it through the world-wide-web, please send a note to | - | license@php.net so we can mail you a copy immediately. | + | This source file is subject to the Modified BSD License that is | + | bundled with this package in the file LICENSE, and is available | + | through the World Wide Web at . | + | | + | SPDX-License-Identifier: BSD-3-Clause | +----------------------------------------------------------------------+ | Authors: Marcus Boerger | +----------------------------------------------------------------------+ diff --git a/main/streams/memory.c b/main/streams/memory.c index 9cb94542df6f..1cc1886e609d 100644 --- a/main/streams/memory.c +++ b/main/streams/memory.c @@ -1,14 +1,12 @@ /* +----------------------------------------------------------------------+ - | Copyright (c) The PHP Group | + | Copyright © The PHP Group and Contributors. | +----------------------------------------------------------------------+ - | This source file is subject to version 3.01 of the PHP license, | - | that is bundled with this package in the file LICENSE, and is | - | available through the world-wide-web at the following url: | - | https://www.php.net/license/3_01.txt | - | If you did not receive a copy of the PHP license and are unable to | - | obtain it through the world-wide-web, please send a note to | - | license@php.net so we can mail you a copy immediately. | + | This source file is subject to the Modified BSD License that is | + | bundled with this package in the file LICENSE, and is available | + | through the World Wide Web at . | + | | + | SPDX-License-Identifier: BSD-3-Clause | +----------------------------------------------------------------------+ | Author: Marcus Boerger | +----------------------------------------------------------------------+ @@ -128,7 +126,7 @@ static int php_stream_memory_seek(php_stream *stream, zend_off_t offset, int whe switch(whence) { case SEEK_CUR: if (offset < 0) { - if (ms->fpos < (size_t)(-offset)) { + if (ms->fpos < -(size_t)offset) { ms->fpos = 0; *newoffs = -1; return -1; @@ -165,7 +163,7 @@ static int php_stream_memory_seek(php_stream *stream, zend_off_t offset, int whe stream->eof = 0; stream->fatal_error = 0; return 0; - } else if (ZSTR_LEN(ms->data) < (size_t)(-offset)) { + } else if (ZSTR_LEN(ms->data) < -(size_t)offset) { ms->fpos = 0; *newoffs = -1; return -1; @@ -364,7 +362,9 @@ static ssize_t php_stream_temp_write(php_stream *stream, const char *buf, size_t zend_string *membuf = php_stream_memory_get_buffer(ts->innerstream); php_stream *file = php_stream_fopen_temporary_file(ts->tmpdir, "php", NULL); if (file == NULL) { - php_error_docref(NULL, E_WARNING, "Unable to create temporary file, Check permissions in temporary files directory."); + php_stream_wrapper_warn(NULL, PHP_STREAM_CONTEXT(stream), REPORT_ERRORS, + PermissionDenied, + "Unable to create temporary file, Check permissions in temporary files directory."); return 0; } php_stream_write(file, ZSTR_VAL(membuf), ZSTR_LEN(membuf)); @@ -491,7 +491,8 @@ static int php_stream_temp_cast(php_stream *stream, int castas, void **ret) file = php_stream_fopen_tmpfile(); if (file == NULL) { - php_error_docref(NULL, E_WARNING, "Unable to create temporary file."); + php_stream_wrapper_warn(NULL, PHP_STREAM_CONTEXT(stream), REPORT_ERRORS, + PermissionDenied, "Unable to create temporary file."); return FAILURE; } @@ -641,7 +642,8 @@ static php_stream * php_stream_url_wrap_rfc2397(php_stream_wrapper *wrapper, con } if ((comma = (char *) memchr(path, ',', dlen)) == NULL) { - php_stream_wrapper_log_error(wrapper, options, "rfc2397: no comma in URL"); + php_stream_wrapper_log_warn(wrapper, context, options, + InvalidUrl, "rfc2397: no comma in URL"); return NULL; } @@ -653,7 +655,8 @@ static php_stream * php_stream_url_wrap_rfc2397(php_stream_wrapper *wrapper, con sep = memchr(path, '/', mlen); if (!semi && !sep) { - php_stream_wrapper_log_error(wrapper, options, "rfc2397: illegal media type"); + php_stream_wrapper_log_warn(wrapper, context, options, + InvalidUrl, "rfc2397: illegal media type"); return NULL; } @@ -668,7 +671,8 @@ static php_stream * php_stream_url_wrap_rfc2397(php_stream_wrapper *wrapper, con path += plen; } else if (semi != path || mlen != sizeof(";base64")-1 || memcmp(path, ";base64", sizeof(";base64")-1)) { /* must be error since parameters are only allowed after mediatype */ zval_ptr_dtor(&meta); - php_stream_wrapper_log_error(wrapper, options, "rfc2397: illegal media type"); + php_stream_wrapper_log_warn(wrapper, context, options, + InvalidUrl, "rfc2397: illegal media type"); return NULL; } /* get parameters and potentially ';base64' */ @@ -681,7 +685,8 @@ static php_stream * php_stream_url_wrap_rfc2397(php_stream_wrapper *wrapper, con if (mlen != sizeof("base64")-1 || memcmp(path, "base64", sizeof("base64")-1)) { /* must be error since parameters are only allowed after mediatype and we have no '=' sign */ zval_ptr_dtor(&meta); - php_stream_wrapper_log_error(wrapper, options, "rfc2397: illegal parameter"); + php_stream_wrapper_log_warn(wrapper, context, options, + InvalidParam, "rfc2397: illegal parameter"); return NULL; } base64 = 1; @@ -701,7 +706,8 @@ static php_stream * php_stream_url_wrap_rfc2397(php_stream_wrapper *wrapper, con } if (mlen) { zval_ptr_dtor(&meta); - php_stream_wrapper_log_error(wrapper, options, "rfc2397: illegal URL"); + php_stream_wrapper_log_warn(wrapper, context, options, + InvalidUrl, "rfc2397: illegal URL"); return NULL; } } else { @@ -717,7 +723,8 @@ static php_stream * php_stream_url_wrap_rfc2397(php_stream_wrapper *wrapper, con base64_comma = php_base64_decode_ex((const unsigned char *)comma, dlen, 1); if (!base64_comma) { zval_ptr_dtor(&meta); - php_stream_wrapper_log_error(wrapper, options, "rfc2397: unable to decode"); + php_stream_wrapper_log_warn(wrapper, context, options, + DecodingFailed, "rfc2397: unable to decode"); return NULL; } comma = ZSTR_VAL(base64_comma); diff --git a/main/streams/mmap.c b/main/streams/mmap.c index 6ed9c057969b..e3831636bcd4 100644 --- a/main/streams/mmap.c +++ b/main/streams/mmap.c @@ -1,14 +1,12 @@ /* +----------------------------------------------------------------------+ - | Copyright (c) The PHP Group | + | Copyright © The PHP Group and Contributors. | +----------------------------------------------------------------------+ - | This source file is subject to version 3.01 of the PHP license, | - | that is bundled with this package in the file LICENSE, and is | - | available through the world-wide-web at the following url: | - | https://www.php.net/license/3_01.txt | - | If you did not receive a copy of the PHP license and are unable to | - | obtain it through the world-wide-web, please send a note to | - | license@php.net so we can mail you a copy immediately. | + | This source file is subject to the Modified BSD License that is | + | bundled with this package in the file LICENSE, and is available | + | through the World Wide Web at . | + | | + | SPDX-License-Identifier: BSD-3-Clause | +----------------------------------------------------------------------+ | Author: Wez Furlong | +----------------------------------------------------------------------+ diff --git a/main/streams/php_stream_context.h b/main/streams/php_stream_context.h index cc001cced154..9373182f7c2e 100644 --- a/main/streams/php_stream_context.h +++ b/main/streams/php_stream_context.h @@ -1,14 +1,12 @@ /* +----------------------------------------------------------------------+ - | Copyright (c) The PHP Group | + | Copyright © The PHP Group and Contributors. | +----------------------------------------------------------------------+ - | This source file is subject to version 3.01 of the PHP license, | - | that is bundled with this package in the file LICENSE, and is | - | available through the world-wide-web at the following url: | - | https://www.php.net/license/3_01.txt | - | If you did not receive a copy of the PHP license and are unable to | - | obtain it through the world-wide-web, please send a note to | - | license@php.net so we can mail you a copy immediately. | + | This source file is subject to the Modified BSD License that is | + | bundled with this package in the file LICENSE, and is available | + | through the World Wide Web at . | + | | + | SPDX-License-Identifier: BSD-3-Clause | +----------------------------------------------------------------------+ | Author: Wez Furlong | +----------------------------------------------------------------------+ diff --git a/main/streams/php_stream_errors.h b/main/streams/php_stream_errors.h new file mode 100644 index 000000000000..1642a6bdabd7 --- /dev/null +++ b/main/streams/php_stream_errors.h @@ -0,0 +1,237 @@ +/* + +----------------------------------------------------------------------+ + | Copyright (c) The PHP Group | + +----------------------------------------------------------------------+ + | This source file is subject to the Modified BSD License that is | + | bundled with this package in the file LICENSE, and is available | + | through the World Wide Web at . | + | | + | SPDX-License-Identifier: BSD-3-Clause | + +----------------------------------------------------------------------+ + | Authors: Jakub Zelenka | + +----------------------------------------------------------------------+ + */ + +#ifndef PHP_STREAM_ERRORS_H +#define PHP_STREAM_ERRORS_H + +#include "php.h" +#include "php_streams.h" +#include "stream_errors_decl.h" + +BEGIN_EXTERN_C() + +/* Error mode context options (internal C constants) */ +#define PHP_STREAM_ERROR_MODE_ERROR 0 +#define PHP_STREAM_ERROR_MODE_EXCEPTION 1 +#define PHP_STREAM_ERROR_MODE_SILENT 2 + +/* Error store context options (internal C constants) */ +#define PHP_STREAM_ERROR_STORE_AUTO 0 +#define PHP_STREAM_ERROR_STORE_NONE 1 +#define PHP_STREAM_ERROR_STORE_NON_TERM 2 +#define PHP_STREAM_ERROR_STORE_TERMINAL 3 +#define PHP_STREAM_ERROR_STORE_ALL 4 + +/* Maximum operation nesting depth */ +#define PHP_STREAM_ERROR_MAX_DEPTH 1000 +/* Operations pool size to prevent extra allocations */ +#define PHP_STREAM_ERROR_OPERATION_POOL_SIZE 8 + +/* Shorthand for error code enum values */ +#define PHP_STREAM_EC(name) ZEND_ENUM_StreamErrorCode_##name + +/* Error code range boundaries (case_id based, ranges are [start, end)) */ +#define STREAM_EC_IO_START PHP_STREAM_EC(ReadFailed) +#define STREAM_EC_IO_END PHP_STREAM_EC(Disabled) +#define STREAM_EC_FS_START PHP_STREAM_EC(Disabled) +#define STREAM_EC_FS_END PHP_STREAM_EC(NotImplemented) +#define STREAM_EC_WRAPPER_START PHP_STREAM_EC(NotImplemented) +#define STREAM_EC_WRAPPER_END PHP_STREAM_EC(FilterNotFound) +#define STREAM_EC_FILTER_START PHP_STREAM_EC(FilterNotFound) +#define STREAM_EC_FILTER_END PHP_STREAM_EC(CastFailed) +#define STREAM_EC_CAST_START PHP_STREAM_EC(CastFailed) +#define STREAM_EC_CAST_END PHP_STREAM_EC(NetworkSendFailed) +#define STREAM_EC_NETWORK_START PHP_STREAM_EC(NetworkSendFailed) +#define STREAM_EC_NETWORK_END PHP_STREAM_EC(ArchivingFailed) +#define STREAM_EC_ENCODING_START PHP_STREAM_EC(ArchivingFailed) +#define STREAM_EC_ENCODING_END PHP_STREAM_EC(AllocationFailed) +#define STREAM_EC_RESOURCE_START PHP_STREAM_EC(AllocationFailed) +#define STREAM_EC_RESOURCE_END PHP_STREAM_EC(LockFailed) +#define STREAM_EC_LOCK_START PHP_STREAM_EC(LockFailed) +#define STREAM_EC_LOCK_END PHP_STREAM_EC(UserspaceNotImplemented) +#define STREAM_EC_USERSPACE_START PHP_STREAM_EC(UserspaceNotImplemented) +#define STREAM_EC_USERSPACE_END (PHP_STREAM_EC(UserspaceCallFailed) + 1) + +/* Wrapper name for PHP errors */ +#define PHP_STREAM_ERROR_WRAPPER_DEFAULT_NAME ":na" +#define PHP_STREAM_ERROR_WRAPPER_NAME(_wrapper) \ + (_wrapper ? _wrapper->wops->label : PHP_STREAM_ERROR_WRAPPER_DEFAULT_NAME) + +/* Error entry in chain (internal linked list) */ +typedef struct _php_stream_error_entry { + zend_string *message; + zend_enum_StreamErrorCode code; + char *wrapper_name; + char *param; + char *docref; + int severity; + bool terminating; + struct _php_stream_error_entry *next; +} php_stream_error_entry; + +/* Active error operation */ +typedef struct _php_stream_error_operation { + php_stream_error_entry *first_error; + php_stream_error_entry *last_error; + uint32_t error_count; +} php_stream_error_operation; + +/* Stored completed operation */ +typedef struct _php_stream_stored_error { + php_stream_error_entry *first_error; + uint32_t error_count; + struct _php_stream_stored_error *next; +} php_stream_stored_error; + +typedef struct { + php_stream_error_operation *current_operation; + uint32_t operation_depth; + php_stream_stored_error *stored_errors; + uint32_t stored_count; + php_stream_error_operation operation_pool[PHP_STREAM_ERROR_OPERATION_POOL_SIZE]; + php_stream_error_operation *overflow_operations; + uint32_t overflow_capacity; +} php_stream_error_state; + +/* Error operation management */ +PHPAPI php_stream_error_operation *php_stream_error_operation_begin(void); +PHPAPI void php_stream_error_operation_end(php_stream_context *context); +PHPAPI void php_stream_error_operation_end_for_stream(php_stream *stream); +PHPAPI void php_stream_error_operation_abort(void); + +/* State cleanup function */ +PHPAPI void php_stream_error_state_cleanup(void); + +/* Retrieve last stored errors as array of StreamError objects */ +PHPAPI void php_stream_error_get_last(zval *return_value); + +/* Clear all stored errors */ +PHPAPI void php_stream_error_clear_stored(void); + +/* Wrapper error reporting functions */ +PHPAPI void php_stream_wrapper_error_with_name(const char *wrapper_name, + php_stream_context *context, const char *docref, int options, int severity, + bool terminating, zend_enum_StreamErrorCode code, const char *fmt, ...) + ZEND_ATTRIBUTE_FORMAT(printf, 8, 9); + +PHPAPI void php_stream_wrapper_error(php_stream_wrapper *wrapper, php_stream_context *context, + const char *docref, int options, int severity, bool terminating, + zend_enum_StreamErrorCode code, const char *fmt, ...) + ZEND_ATTRIBUTE_FORMAT(printf, 8, 9); + +PHPAPI void php_stream_wrapper_error_param(php_stream_wrapper *wrapper, php_stream_context *context, + const char *docref, int options, int severity, bool terminating, + zend_enum_StreamErrorCode code, const char *param, const char *fmt, ...) + ZEND_ATTRIBUTE_FORMAT(printf, 9, 10); + +PHPAPI void php_stream_wrapper_error_param2(php_stream_wrapper *wrapper, + php_stream_context *context, const char *docref, int options, int severity, + bool terminating, zend_enum_StreamErrorCode code, const char *param1, const char *param2, + const char *fmt, ...) ZEND_ATTRIBUTE_FORMAT(printf, 10, 11); + +PHPAPI void php_stream_error(php_stream *stream, const char *docref, int severity, + bool terminating, zend_enum_StreamErrorCode code, const char *fmt, ...) + ZEND_ATTRIBUTE_FORMAT(printf, 6, 7); + +/* Legacy wrapper error log functions */ +PHPAPI void php_stream_wrapper_log_error(const php_stream_wrapper *wrapper, + php_stream_context *context, int options, int severity, bool terminating, + zend_enum_StreamErrorCode code, const char *fmt, ...) + ZEND_ATTRIBUTE_FORMAT(printf, 7, 8); + +PHPAPI void php_stream_wrapper_log_error_param(const php_stream_wrapper *wrapper, + php_stream_context *context, int options, int severity, bool terminating, + zend_enum_StreamErrorCode code, const char *param, const char *fmt, ...) + ZEND_ATTRIBUTE_FORMAT(printf, 8, 9); + +PHPAPI void php_stream_display_wrapper_name_errors(const char *wrapper_name, + php_stream_context *context, zend_enum_StreamErrorCode code, const char *path, + const char *caption); + +PHPAPI void php_stream_display_wrapper_errors(php_stream_wrapper *wrapper, + php_stream_context *context, zend_enum_StreamErrorCode code, const char *path, + const char *caption); + +PHPAPI void php_stream_tidy_wrapper_name_error_log(const char *wrapper_name); +PHPAPI void php_stream_tidy_wrapper_error_log(php_stream_wrapper *wrapper); + +/* Convenience macros - code argument is the bare case name (e.g. RenameFailed) */ +#define php_stream_wrapper_warn(wrapper, context, options, code, ...) \ + php_stream_wrapper_error(wrapper, context, NULL, options, E_WARNING, true, \ + PHP_STREAM_EC(code), __VA_ARGS__) + +#define php_stream_wrapper_warn_name(wrapper_name, context, options, code, ...) \ + php_stream_wrapper_error_with_name( \ + wrapper_name, context, NULL, options, E_WARNING, true, \ + PHP_STREAM_EC(code), __VA_ARGS__) + +#define php_stream_wrapper_warn_nt(wrapper, context, options, code, ...) \ + php_stream_wrapper_error(wrapper, context, NULL, options, E_WARNING, false, \ + PHP_STREAM_EC(code), __VA_ARGS__) + +#define php_stream_wrapper_notice(wrapper, context, options, code, ...) \ + php_stream_wrapper_error(wrapper, context, NULL, options, E_NOTICE, false, \ + PHP_STREAM_EC(code), __VA_ARGS__) + +#define php_stream_wrapper_warn_param(wrapper, context, options, code, param, ...) \ + php_stream_wrapper_error_param( \ + wrapper, context, NULL, options, E_WARNING, true, \ + PHP_STREAM_EC(code), param, __VA_ARGS__) + +#define php_stream_wrapper_warn_param_nt(wrapper, context, options, code, param, ...) \ + php_stream_wrapper_error_param( \ + wrapper, context, NULL, options, E_WARNING, false, \ + PHP_STREAM_EC(code), param, __VA_ARGS__) + +#define php_stream_wrapper_warn_param2(wrapper, context, options, code, param1, param2, ...) \ + php_stream_wrapper_error_param2( \ + wrapper, context, NULL, options, E_WARNING, true, \ + PHP_STREAM_EC(code), param1, param2, __VA_ARGS__) + +#define php_stream_wrapper_warn_param2_nt(wrapper, context, options, code, param1, param2, ...) \ + php_stream_wrapper_error_param2( \ + wrapper, context, NULL, options, E_WARNING, false, \ + PHP_STREAM_EC(code), param1, param2, __VA_ARGS__) + +#define php_stream_warn(stream, code, ...) \ + php_stream_error(stream, NULL, E_WARNING, true, PHP_STREAM_EC(code), __VA_ARGS__) + +#define php_stream_warn_nt(stream, code, ...) \ + php_stream_error(stream, NULL, E_WARNING, false, PHP_STREAM_EC(code), __VA_ARGS__) + +#define php_stream_warn_docref(stream, docref, code, ...) \ + php_stream_error(stream, docref, E_WARNING, true, PHP_STREAM_EC(code), __VA_ARGS__) + +#define php_stream_notice(stream, code, ...) \ + php_stream_error(stream, NULL, E_NOTICE, false, PHP_STREAM_EC(code), __VA_ARGS__) + +#define php_stream_fatal(stream, code, ...) \ + php_stream_error(stream, NULL, E_ERROR, true, PHP_STREAM_EC(code), __VA_ARGS__) + +/* Legacy log variants */ +#define php_stream_wrapper_log_warn(wrapper, context, options, code, ...) \ + php_stream_wrapper_log_error(wrapper, context, options, E_WARNING, true, \ + PHP_STREAM_EC(code), __VA_ARGS__) + +#define php_stream_wrapper_log_warn_nt(wrapper, context, options, code, ...) \ + php_stream_wrapper_log_error(wrapper, context, options, E_WARNING, false, \ + PHP_STREAM_EC(code), __VA_ARGS__) + +#define php_stream_wrapper_log_notice(wrapper, context, options, code, ...) \ + php_stream_wrapper_log_error(wrapper, context, options, E_NOTICE, false, \ + PHP_STREAM_EC(code), __VA_ARGS__) + +END_EXTERN_C() + +#endif /* PHP_STREAM_ERRORS_H */ diff --git a/main/streams/php_stream_filter_api.h b/main/streams/php_stream_filter_api.h index e224b85b2d9a..20df33897799 100644 --- a/main/streams/php_stream_filter_api.h +++ b/main/streams/php_stream_filter_api.h @@ -1,14 +1,12 @@ /* +----------------------------------------------------------------------+ - | Copyright (c) The PHP Group | + | Copyright © The PHP Group and Contributors. | +----------------------------------------------------------------------+ - | This source file is subject to version 3.01 of the PHP license, | - | that is bundled with this package in the file LICENSE, and is | - | available through the world-wide-web at the following url: | - | https://www.php.net/license/3_01.txt | - | If you did not receive a copy of the PHP license and are unable to | - | obtain it through the world-wide-web, please send a note to | - | license@php.net so we can mail you a copy immediately. | + | This source file is subject to the Modified BSD License that is | + | bundled with this package in the file LICENSE, and is available | + | through the World Wide Web at . | + | | + | SPDX-License-Identifier: BSD-3-Clause | +----------------------------------------------------------------------+ | Author: Wez Furlong | | With suggestions from: | @@ -61,6 +59,13 @@ typedef enum { PSFS_PASS_ON /* filter generated output buckets; pass them on to next in chain */ } php_stream_filter_status_t; +typedef enum { + PSFS_SEEKABLE_NEVER, /* seeking filter never possible */ + PSFS_SEEKABLE_START, /* seeking possible only to start (position 0) */ + PSFS_SEEKABLE_CHECK, /* seeking possible but it is always checked if callback function set */ + PSFS_SEEKABLE_ALWAYS, /* seeking is always possible */ +} php_stream_filter_seekable_t; + /* Buckets API. */ BEGIN_EXTERN_C() PHPAPI php_stream_bucket *php_stream_bucket_new(const php_stream *stream, char *buf, size_t buflen, uint8_t own_buf, uint8_t buf_persistent); @@ -88,6 +93,13 @@ typedef struct _php_stream_filter_ops { int flags ); + zend_result (*seek)( + php_stream *stream, + php_stream_filter *thisfilter, + zend_off_t offset, + int whence + ); + void (*dtor)(php_stream_filter *thisfilter); const char *label; @@ -106,7 +118,9 @@ struct _php_stream_filter { zval abstract; /* for use by filter implementation */ php_stream_filter *next; php_stream_filter *prev; - int is_persistent; + php_stream_filter_seekable_t read_seekable; + php_stream_filter_seekable_t write_seekable; + bool is_persistent; /* link into stream and chain */ php_stream_filter_chain *chain; @@ -127,10 +141,18 @@ PHPAPI zend_result php_stream_filter_append_ex(php_stream_filter_chain *chain, p PHPAPI zend_result _php_stream_filter_flush(php_stream_filter *filter, bool finish); PHPAPI php_stream_filter *php_stream_filter_remove(php_stream_filter *filter, bool call_dtor); PHPAPI void php_stream_filter_free(php_stream_filter *filter); -PHPAPI php_stream_filter *_php_stream_filter_alloc(const php_stream_filter_ops *fops, void *abstract, uint8_t persistent STREAMS_DC); +PHPAPI php_stream_filter *_php_stream_filter_alloc(const php_stream_filter_ops *fops, + void *abstract, bool persistent, php_stream_filter_seekable_t read_seekable, + php_stream_filter_seekable_t write_seekable STREAMS_DC); +PHPAPI zend_result php_stream_filter_parse_write_seek_mode(const zval *filterparams, + php_stream_filter_seekable_t *write_seekable); +PHPAPI int php_stream_filter_get_chain_type(php_stream *stream, php_stream_filter *filter); + END_EXTERN_C() -#define php_stream_filter_alloc(fops, thisptr, persistent) _php_stream_filter_alloc((fops), (thisptr), (persistent) STREAMS_CC) -#define php_stream_filter_alloc_rel(fops, thisptr, persistent) _php_stream_filter_alloc((fops), (thisptr), (persistent) STREAMS_REL_CC) +#define php_stream_filter_alloc(fops, thisptr, persistent, rseek, wseek) \ + _php_stream_filter_alloc((fops), (thisptr), (persistent), (rseek), (wseek) STREAMS_CC) +#define php_stream_filter_alloc_rel(fops, thisptr, persistent, rseek, wseek) \ + _php_stream_filter_alloc((fops), (thisptr), (persistent), (rseek), (wseek) STREAMS_REL_CC) #define php_stream_filter_prepend(chain, filter) _php_stream_filter_prepend((chain), (filter)) #define php_stream_filter_append(chain, filter) _php_stream_filter_append((chain), (filter)) #define php_stream_filter_flush(filter, finish) _php_stream_filter_flush((filter), (finish)) @@ -138,12 +160,12 @@ END_EXTERN_C() #define php_stream_is_filtered(stream) ((stream)->readfilters.head || (stream)->writefilters.head) typedef struct _php_stream_filter_factory { - php_stream_filter *(*create_filter)(const char *filtername, zval *filterparams, uint8_t persistent); + php_stream_filter *(*create_filter)(const char *filtername, zval *filterparams, bool persistent); } php_stream_filter_factory; BEGIN_EXTERN_C() PHPAPI zend_result php_stream_filter_register_factory(const char *filterpattern, const php_stream_filter_factory *factory); PHPAPI zend_result php_stream_filter_unregister_factory(const char *filterpattern); PHPAPI zend_result php_stream_filter_register_factory_volatile(zend_string *filterpattern, const php_stream_filter_factory *factory); -PHPAPI php_stream_filter *php_stream_filter_create(const char *filtername, zval *filterparams, uint8_t persistent); +PHPAPI php_stream_filter *php_stream_filter_create(const char *filtername, zval *filterparams, bool persistent); END_EXTERN_C() diff --git a/main/streams/php_stream_glob_wrapper.h b/main/streams/php_stream_glob_wrapper.h index 04de00a593dd..c9c7fdcf2463 100644 --- a/main/streams/php_stream_glob_wrapper.h +++ b/main/streams/php_stream_glob_wrapper.h @@ -1,14 +1,12 @@ /* +----------------------------------------------------------------------+ - | Copyright (c) The PHP Group | + | Copyright © The PHP Group and Contributors. | +----------------------------------------------------------------------+ - | This source file is subject to version 3.01 of the PHP license, | - | that is bundled with this package in the file LICENSE, and is | - | available through the world-wide-web at the following url: | - | https://www.php.net/license/3_01.txt | - | If you did not receive a copy of the PHP license and are unable to | - | obtain it through the world-wide-web, please send a note to | - | license@php.net so we can mail you a copy immediately. | + | This source file is subject to the Modified BSD License that is | + | bundled with this package in the file LICENSE, and is available | + | through the World Wide Web at . | + | | + | SPDX-License-Identifier: BSD-3-Clause | +----------------------------------------------------------------------+ | Author: Marcus Boerger | +----------------------------------------------------------------------+ diff --git a/main/streams/php_stream_mmap.h b/main/streams/php_stream_mmap.h index d477aa79481e..0f85e0269f47 100644 --- a/main/streams/php_stream_mmap.h +++ b/main/streams/php_stream_mmap.h @@ -1,14 +1,12 @@ /* +----------------------------------------------------------------------+ - | Copyright (c) The PHP Group | + | Copyright © The PHP Group and Contributors. | +----------------------------------------------------------------------+ - | This source file is subject to version 3.01 of the PHP license, | - | that is bundled with this package in the file LICENSE, and is | - | available through the world-wide-web at the following url: | - | https://www.php.net/license/3_01.txt | - | If you did not receive a copy of the PHP license and are unable to | - | obtain it through the world-wide-web, please send a note to | - | license@php.net so we can mail you a copy immediately. | + | This source file is subject to the Modified BSD License that is | + | bundled with this package in the file LICENSE, and is available | + | through the World Wide Web at . | + | | + | SPDX-License-Identifier: BSD-3-Clause | +----------------------------------------------------------------------+ | Author: Wez Furlong | +----------------------------------------------------------------------+ diff --git a/main/streams/php_stream_plain_wrapper.h b/main/streams/php_stream_plain_wrapper.h index ce1a6e3876d1..f44edcb16a97 100644 --- a/main/streams/php_stream_plain_wrapper.h +++ b/main/streams/php_stream_plain_wrapper.h @@ -1,14 +1,12 @@ /* +----------------------------------------------------------------------+ - | Copyright (c) The PHP Group | + | Copyright © The PHP Group and Contributors. | +----------------------------------------------------------------------+ - | This source file is subject to version 3.01 of the PHP license, | - | that is bundled with this package in the file LICENSE, and is | - | available through the world-wide-web at the following url: | - | https://www.php.net/license/3_01.txt | - | If you did not receive a copy of the PHP license and are unable to | - | obtain it through the world-wide-web, please send a note to | - | license@php.net so we can mail you a copy immediately. | + | This source file is subject to the Modified BSD License that is | + | bundled with this package in the file LICENSE, and is available | + | through the World Wide Web at . | + | | + | SPDX-License-Identifier: BSD-3-Clause | +----------------------------------------------------------------------+ | Author: Wez Furlong | +----------------------------------------------------------------------+ diff --git a/main/streams/php_stream_transport.h b/main/streams/php_stream_transport.h index 96675af6daea..60bea8e9e1fc 100644 --- a/main/streams/php_stream_transport.h +++ b/main/streams/php_stream_transport.h @@ -1,14 +1,12 @@ /* +----------------------------------------------------------------------+ - | Copyright (c) The PHP Group | + | Copyright © The PHP Group and Contributors. | +----------------------------------------------------------------------+ - | This source file is subject to version 3.01 of the PHP license, | - | that is bundled with this package in the file LICENSE, and is | - | available through the world-wide-web at the following url: | - | https://www.php.net/license/3_01.txt | - | If you did not receive a copy of the PHP license and are unable to | - | obtain it through the world-wide-web, please send a note to | - | license@php.net so we can mail you a copy immediately. | + | This source file is subject to the Modified BSD License that is | + | bundled with this package in the file LICENSE, and is available | + | through the World Wide Web at . | + | | + | SPDX-License-Identifier: BSD-3-Clause | +----------------------------------------------------------------------+ | Author: Wez Furlong | +----------------------------------------------------------------------+ @@ -188,11 +186,17 @@ typedef enum { STREAM_CRYPTO_METHOD_ANY_SERVER = ((1 << 1) | (1 << 2) | (1 << 3) | (1 << 4) | (1 << 5) | (1 << 6)) } php_stream_xport_crypt_method_t; +/* Flags for crypto status */ +#define STREAM_CRYPTO_STATUS_NONE 0 +#define STREAM_CRYPTO_STATUS_WANT_READ 1 +#define STREAM_CRYPTO_STATUS_WANT_WRITE 2 + /* These functions provide crypto support on the underlying transport */ BEGIN_EXTERN_C() PHPAPI int php_stream_xport_crypto_setup(php_stream *stream, php_stream_xport_crypt_method_t crypto_method, php_stream *session_stream); PHPAPI int php_stream_xport_crypto_enable(php_stream *stream, int activate); +PHPAPI int php_stream_xport_crypto_get_status(php_stream *stream); END_EXTERN_C() typedef struct _php_stream_xport_crypto_param { @@ -206,7 +210,8 @@ typedef struct _php_stream_xport_crypto_param { } outputs; enum { STREAM_XPORT_CRYPTO_OP_SETUP, - STREAM_XPORT_CRYPTO_OP_ENABLE + STREAM_XPORT_CRYPTO_OP_ENABLE, + STREAM_XPORT_CRYPTO_OP_GET_STATUS } op; } php_stream_xport_crypto_param; diff --git a/main/streams/php_stream_userspace.h b/main/streams/php_stream_userspace.h index 18e0f4028f2c..5b82a88d41a6 100644 --- a/main/streams/php_stream_userspace.h +++ b/main/streams/php_stream_userspace.h @@ -1,14 +1,12 @@ /* +----------------------------------------------------------------------+ - | Copyright (c) The PHP Group | + | Copyright © The PHP Group and Contributors. | +----------------------------------------------------------------------+ - | This source file is subject to version 3.01 of the PHP license, | - | that is bundled with this package in the file LICENSE, and is | - | available through the world-wide-web at the following url: | - | https://www.php.net/license/3_01.txt | - | If you did not receive a copy of the PHP license and are unable to | - | obtain it through the world-wide-web, please send a note to | - | license@php.net so we can mail you a copy immediately. | + | This source file is subject to the Modified BSD License that is | + | bundled with this package in the file LICENSE, and is available | + | through the World Wide Web at . | + | | + | SPDX-License-Identifier: BSD-3-Clause | +----------------------------------------------------------------------+ | Author: Wez Furlong | +----------------------------------------------------------------------+ diff --git a/main/streams/php_streams_int.h b/main/streams/php_streams_int.h index 7580088fba31..abf68aeacb80 100644 --- a/main/streams/php_streams_int.h +++ b/main/streams/php_streams_int.h @@ -1,14 +1,12 @@ /* +----------------------------------------------------------------------+ - | Copyright (c) The PHP Group | + | Copyright © The PHP Group and Contributors. | +----------------------------------------------------------------------+ - | This source file is subject to version 3.01 of the PHP license, | - | that is bundled with this package in the file LICENSE, and is | - | available through the world-wide-web at the following url: | - | https://www.php.net/license/3_01.txt | - | If you did not receive a copy of the PHP license and are unable to | - | obtain it through the world-wide-web, please send a note to | - | license@php.net so we can mail you a copy immediately. | + | This source file is subject to the Modified BSD License that is | + | bundled with this package in the file LICENSE, and is available | + | through the World Wide Web at . | + | | + | SPDX-License-Identifier: BSD-3-Clause | +----------------------------------------------------------------------+ | Author: Wez Furlong | +----------------------------------------------------------------------+ diff --git a/main/streams/plain_wrapper.c b/main/streams/plain_wrapper.c index 74d8877a7f38..9335ab3fdb6c 100644 --- a/main/streams/plain_wrapper.c +++ b/main/streams/plain_wrapper.c @@ -1,14 +1,12 @@ /* +----------------------------------------------------------------------+ - | Copyright (c) The PHP Group | + | Copyright © The PHP Group and Contributors. | +----------------------------------------------------------------------+ - | This source file is subject to version 3.01 of the PHP license, | - | that is bundled with this package in the file LICENSE, and is | - | available through the world-wide-web at the following url: | - | https://www.php.net/license/3_01.txt | - | If you did not receive a copy of the PHP license and are unable to | - | obtain it through the world-wide-web, please send a note to | - | license@php.net so we can mail you a copy immediately. | + | This source file is subject to the Modified BSD License that is | + | bundled with this package in the file LICENSE, and is available | + | through the World Wide Web at . | + | | + | SPDX-License-Identifier: BSD-3-Clause | +----------------------------------------------------------------------+ | Authors: Wez Furlong | +----------------------------------------------------------------------+ @@ -394,7 +392,8 @@ static ssize_t php_stdiop_write(php_stream *stream, const char *buf, size_t coun } if (!(stream->flags & PHP_STREAM_FLAG_SUPPRESS_ERRORS)) { char errstr[256]; - php_error_docref(NULL, E_NOTICE, "Write of %zu bytes failed with errno=%d %s", + php_stream_notice(stream, WriteFailed, + "Write of %zu bytes failed with errno=%d %s", count, errno, php_socket_strerror_s(errno, errstr, sizeof(errstr))); } } @@ -472,7 +471,8 @@ static ssize_t php_stdiop_read(php_stream *stream, char *buf, size_t count) } else { if (!(stream->flags & PHP_STREAM_FLAG_SUPPRESS_ERRORS)) { char errstr[256]; - php_error_docref(NULL, E_NOTICE, "Read of %zu bytes failed with errno=%d %s", + php_stream_notice(stream, ReadFailed, + "Read of %zu bytes failed with errno=%d %s", count, errno, php_socket_strerror_s(errno, errstr, sizeof(errstr))); } @@ -621,7 +621,8 @@ static int php_stdiop_seek(php_stream *stream, zend_off_t offset, int whence, ze assert(data != NULL); if (!data->is_seekable) { - php_error_docref(NULL, E_WARNING, "Cannot seek on this stream"); + php_stream_wrapper_warn(NULL, PHP_STREAM_CONTEXT(stream), REPORT_ERRORS, + SeekNotSupported, "Cannot seek on this stream"); return -1; } @@ -1158,7 +1159,8 @@ PHPAPI php_stream *_php_stream_fopen(const char *filename, const char *mode, zen char *persistent_id = NULL; if (FAILURE == php_stream_parse_fopen_modes(mode, &open_flags)) { - php_stream_wrapper_log_error(&php_plain_files_wrapper, options, "`%s' is not a valid mode for fopen", mode); + php_stream_wrapper_log_warn(&php_plain_files_wrapper, NULL, options, + InvalidMode, "`%s' is not a valid mode for fopen", mode); return NULL; } @@ -1311,8 +1313,9 @@ static int php_plain_files_unlink(php_stream_wrapper *wrapper, const char *url, if (ret == -1) { if (options & REPORT_ERRORS) { char errstr[256]; - php_error_docref1(NULL, url, E_WARNING, "%s", - php_socket_strerror_s(errno, errstr, sizeof(errstr))); + php_stream_wrapper_warn_param(wrapper, context, options, + UnlinkFailed, url, + "%s", php_socket_strerror_s(errno, errstr, sizeof(errstr))); } return 0; } @@ -1379,20 +1382,22 @@ static int php_plain_files_rename(php_stream_wrapper *wrapper, const char *url_f * access to the file in the meantime. */ if (VCWD_CHOWN(url_to, sb.st_uid, sb.st_gid)) { - php_error_docref2(NULL, url_from, url_to, E_WARNING, "%s", - php_socket_strerror_s(errno, errstr, sizeof(errstr))); if (errno != EPERM) { success = 0; } + php_stream_wrapper_error_param2(wrapper, context, NULL, options, E_WARNING, + !success, PHP_STREAM_EC(ChownFailed), url_from, url_to, + "%s", php_socket_strerror_s(errno, errstr, sizeof(errstr))); } if (success) { if (VCWD_CHMOD(url_to, sb.st_mode)) { - php_error_docref2(NULL, url_from, url_to, E_WARNING, "%s", - php_socket_strerror_s(errno, errstr, sizeof(errstr))); if (errno != EPERM) { success = 0; } + php_stream_wrapper_error_param2(wrapper, context, NULL, options, E_WARNING, + !success, PHP_STREAM_EC(ChownFailed), url_from, url_to, + "%s", php_socket_strerror_s(errno, errstr, sizeof(errstr))); } } # endif @@ -1400,12 +1405,14 @@ static int php_plain_files_rename(php_stream_wrapper *wrapper, const char *url_f VCWD_UNLINK(url_from); } } else { - php_error_docref2(NULL, url_from, url_to, E_WARNING, "%s", - php_socket_strerror_s(errno, errstr, sizeof(errstr))); + php_stream_wrapper_warn_param2_nt(wrapper, context, options, StatFailed, + url_from, url_to, + "%s", php_socket_strerror_s(errno, errstr, sizeof(errstr))); } } else { - php_error_docref2(NULL, url_from, url_to, E_WARNING, "%s", - php_socket_strerror_s(errno, errstr, sizeof(errstr))); + php_stream_wrapper_warn_param2_nt(wrapper, context, options, CopyFailed, + url_from, url_to, + "%s", php_socket_strerror_s(errno, errstr, sizeof(errstr))); } # if !defined(ZTS) && !defined(TSRM_WIN32) umask(oldmask); @@ -1418,8 +1425,9 @@ static int php_plain_files_rename(php_stream_wrapper *wrapper, const char *url_f #ifdef PHP_WIN32 php_win32_docref2_from_error(GetLastError(), url_from, url_to); #else - php_error_docref2(NULL, url_from, url_to, E_WARNING, "%s", - php_socket_strerror_s(errno, errstr, sizeof(errstr))); + php_stream_wrapper_warn_param2(wrapper, context, options, + RenameFailed, url_from, url_to, + "%s", php_socket_strerror_s(errno, errstr, sizeof(errstr))); #endif return 0; } @@ -1443,7 +1451,8 @@ static int php_plain_files_mkdir(php_stream_wrapper *wrapper, const char *dir, i int ret = VCWD_MKDIR(dir, (mode_t)mode); if (ret < 0 && (options & REPORT_ERRORS)) { - php_error_docref(NULL, E_WARNING, "%s", strerror(errno)); + php_stream_wrapper_warn(wrapper, context, options, + MkdirFailed, "%s", strerror(errno)); return 0; } @@ -1452,7 +1461,8 @@ static int php_plain_files_mkdir(php_stream_wrapper *wrapper, const char *dir, i char buf[MAXPATHLEN]; if (!expand_filepath_with_mode(dir, buf, NULL, 0, CWD_EXPAND)) { - php_error_docref(NULL, E_WARNING, "Invalid path"); + php_stream_wrapper_warn(wrapper, context, options, + InvalidPath, "Invalid path"); return 0; } @@ -1504,7 +1514,9 @@ static int php_plain_files_mkdir(php_stream_wrapper *wrapper, const char *dir, i int ret = VCWD_MKDIR(buf, (mode_t) mode); if (ret < 0 && errno != EEXIST) { if (options & REPORT_ERRORS) { - php_error_docref(NULL, E_WARNING, "%s", php_socket_strerror_s(errno, errstr, sizeof(errstr))); + php_stream_wrapper_warn(wrapper, context, options, + MkdirFailed, + "%s", php_socket_strerror_s(errno, errstr, sizeof(errstr))); } return 0; } @@ -1524,7 +1536,9 @@ static int php_plain_files_mkdir(php_stream_wrapper *wrapper, const char *dir, i /* issue a warning to client when the last directory was created failed */ if (ret < 0) { if (options & REPORT_ERRORS) { - php_error_docref(NULL, E_WARNING, "%s", php_socket_strerror_s(errno, errstr, sizeof(errstr))); + php_stream_wrapper_warn(wrapper, context, options, + MkdirFailed, + "%s", php_socket_strerror_s(errno, errstr, sizeof(errstr))); } return 0; } @@ -1546,13 +1560,17 @@ static int php_plain_files_rmdir(php_stream_wrapper *wrapper, const char *url, i char errstr[256]; #ifdef PHP_WIN32 if (!php_win32_check_trailing_space(url, strlen(url))) { - php_error_docref1(NULL, url, E_WARNING, "%s", php_socket_strerror_s(ENOENT, errstr, sizeof(errstr))); + php_stream_wrapper_warn_param(wrapper, context, options, + NotFound, url, + "%s", php_socket_strerror_s(ENOENT, errstr, sizeof(errstr))); return 0; } #endif if (VCWD_RMDIR(url) < 0) { - php_error_docref1(NULL, url, E_WARNING, "%s", php_socket_strerror_s(errno, errstr, sizeof(errstr))); + php_stream_wrapper_warn_param(wrapper, context, options, + RmdirFailed, url, + "%s", php_socket_strerror_s(errno, errstr, sizeof(errstr))); return 0; } @@ -1575,7 +1593,9 @@ static int php_plain_files_metadata(php_stream_wrapper *wrapper, const char *url #ifdef PHP_WIN32 if (!php_win32_check_trailing_space(url, strlen(url))) { - php_error_docref1(NULL, url, E_WARNING, "%s", php_socket_strerror_s(ENOENT, errstr, sizeof(errstr))); + php_stream_wrapper_warn_param(wrapper, context, REPORT_ERRORS, + NotFound, url, + "%s", php_socket_strerror_s(ENOENT, errstr, sizeof(errstr))); return 0; } #endif @@ -1594,7 +1614,9 @@ static int php_plain_files_metadata(php_stream_wrapper *wrapper, const char *url if (VCWD_ACCESS(url, F_OK) != 0) { FILE *file = VCWD_FOPEN(url, "w"); if (file == NULL) { - php_error_docref1(NULL, url, E_WARNING, "Unable to create file %s because %s", url, + php_stream_wrapper_warn_param(wrapper, context, REPORT_ERRORS, + PermissionDenied, url, + "Unable to create file %s because %s", url, php_socket_strerror_s(errno, errstr, sizeof(errstr))); return 0; } @@ -1608,7 +1630,9 @@ static int php_plain_files_metadata(php_stream_wrapper *wrapper, const char *url case PHP_STREAM_META_OWNER: if(option == PHP_STREAM_META_OWNER_NAME) { if(php_get_uid_by_name((char *)value, &uid) != SUCCESS) { - php_error_docref1(NULL, url, E_WARNING, "Unable to find uid for %s", (char *)value); + php_stream_wrapper_warn_param(wrapper, context, REPORT_ERRORS, + MetaFailed, url, + "Unable to find uid for %s", (char *)value); return 0; } } else { @@ -1620,7 +1644,9 @@ static int php_plain_files_metadata(php_stream_wrapper *wrapper, const char *url case PHP_STREAM_META_GROUP_NAME: if(option == PHP_STREAM_META_GROUP_NAME) { if(php_get_gid_by_name((char *)value, &gid) != SUCCESS) { - php_error_docref1(NULL, url, E_WARNING, "Unable to find gid for %s", (char *)value); + php_stream_wrapper_warn_param(wrapper, context, REPORT_ERRORS, + MetaFailed, url, + "Unable to find gid for %s", (char *)value); return 0; } } else { @@ -1638,8 +1664,9 @@ static int php_plain_files_metadata(php_stream_wrapper *wrapper, const char *url return 0; } if (ret == -1) { - php_error_docref1(NULL, url, E_WARNING, "Operation failed: %s", - php_socket_strerror_s(errno, errstr, sizeof(errstr))); + php_stream_wrapper_warn_param(wrapper, context, REPORT_ERRORS, + MetaFailed, url, + "Operation failed: %s", php_socket_strerror_s(errno, errstr, sizeof(errstr))); return 0; } php_clear_stat_cache(0, NULL, 0); @@ -1732,7 +1759,9 @@ PHPAPI php_stream *_php_stream_fopen_with_path(const char *filename, const char *(cwd+3) = '\0'; if (snprintf(trypath, MAXPATHLEN, "%s%s", cwd, filename) >= MAXPATHLEN) { - php_error_docref(NULL, E_NOTICE, "%s/%s path was truncated to %d", cwd, filename, MAXPATHLEN); + php_stream_wrapper_notice(NULL, NULL, REPORT_ERRORS, + PathTooLong, + "%s/%s path was truncated to %d", cwd, filename, MAXPATHLEN); } efree(cwd); @@ -1787,7 +1816,9 @@ PHPAPI php_stream *_php_stream_fopen_with_path(const char *filename, const char goto stream_skip; } if (snprintf(trypath, MAXPATHLEN, "%s/%s", ptr, filename) >= MAXPATHLEN) { - php_error_docref(NULL, E_NOTICE, "%s/%s path was truncated to %d", ptr, filename, MAXPATHLEN); + php_stream_wrapper_notice(NULL, NULL, REPORT_ERRORS, + PathTooLong, + "%s/%s path was truncated to %d", ptr, filename, MAXPATHLEN); } if (((options & STREAM_DISABLE_OPEN_BASEDIR) == 0) && php_check_open_basedir_ex(trypath, 0)) { diff --git a/main/streams/stream_errors.c b/main/streams/stream_errors.c new file mode 100644 index 000000000000..72f7428594c3 --- /dev/null +++ b/main/streams/stream_errors.c @@ -0,0 +1,916 @@ +/* + +----------------------------------------------------------------------+ + | Copyright (c) The PHP Group | + +----------------------------------------------------------------------+ + | This source file is subject to the Modified BSD License that is | + | bundled with this package in the file LICENSE, and is available | + | through the World Wide Web at . | + | | + | SPDX-License-Identifier: BSD-3-Clause | + +----------------------------------------------------------------------+ + | Authors: Jakub Zelenka | + +----------------------------------------------------------------------+ + */ + +#define ZEND_ENUM_StreamErrorCode_USE_NAME_TABLE +#include "php.h" +#include "php_globals.h" +#include "php_streams.h" +#include "php_stream_errors.h" +#include "zend_enum.h" +#include "zend_exceptions.h" +#include "ext/standard/file.h" +#include "stream_errors_arginfo.h" + +/* Class entries */ +static zend_class_entry *php_ce_stream_error_code; +static zend_class_entry *php_ce_stream_error_mode; +static zend_class_entry *php_ce_stream_error_store; +static zend_class_entry *php_ce_stream_error; +static zend_class_entry *php_ce_stream_exception; + +/* Forward declarations */ +static void php_stream_error_entry_free(php_stream_error_entry *entry); + +/* Helper to create a single StreamError object from an entry */ +static void php_stream_error_create_object(zval *zv, php_stream_error_entry *entry) +{ + object_init_ex(zv, php_ce_stream_error); + + const char *case_name = NULL; + if (entry->code > 0 && entry->code <= ZEND_ENUM_StreamErrorCode_CASE_COUNT) { + case_name = zend_enum_StreamErrorCode_case_names[entry->code]; + } + if (!case_name) { + case_name = "Generic"; + } + + zend_object *enum_obj = zend_enum_get_case_cstr(php_ce_stream_error_code, case_name); + ZEND_ASSERT(enum_obj != NULL); + + zval code_enum; + ZVAL_OBJ_COPY(&code_enum, enum_obj); + + zend_update_property(php_ce_stream_error, Z_OBJ_P(zv), ZEND_STRL("code"), &code_enum); + zval_ptr_dtor(&code_enum); + + zend_update_property_str( + php_ce_stream_error, Z_OBJ_P(zv), ZEND_STRL("message"), entry->message); + + zend_update_property_string(php_ce_stream_error, Z_OBJ_P(zv), ZEND_STRL("wrapperName"), + entry->wrapper_name ? entry->wrapper_name : ""); + + zend_update_property_long( + php_ce_stream_error, Z_OBJ_P(zv), ZEND_STRL("severity"), entry->severity); + + zend_update_property_bool( + php_ce_stream_error, Z_OBJ_P(zv), ZEND_STRL("terminating"), entry->terminating); + + if (entry->param) { + zend_update_property_string( + php_ce_stream_error, Z_OBJ_P(zv), ZEND_STRL("param"), entry->param); + } else { + zend_update_property_null(php_ce_stream_error, Z_OBJ_P(zv), ZEND_STRL("param")); + } +} + +/* Create array of StreamError objects from error chain */ +PHPAPI void php_stream_error_create_array(zval *zv, php_stream_error_entry *first) +{ + array_init(zv); + + php_stream_error_entry *entry = first; + while (entry) { + zval error_obj; + php_stream_error_create_object(&error_obj, entry); + zend_hash_next_index_insert_new(Z_ARRVAL_P(zv), &error_obj); + entry = entry->next; + } +} + +/* Context option helpers */ + +static int php_stream_auto_decide_error_store_mode(int error_mode) +{ + switch (error_mode) { + case PHP_STREAM_ERROR_MODE_ERROR: + return PHP_STREAM_ERROR_STORE_NONE; + case PHP_STREAM_ERROR_MODE_EXCEPTION: + return PHP_STREAM_ERROR_STORE_NON_TERM; + case PHP_STREAM_ERROR_MODE_SILENT: + return PHP_STREAM_ERROR_STORE_ALL; + default: + return PHP_STREAM_ERROR_STORE_NONE; + } +} + +static int php_stream_get_error_mode(php_stream_context *context) +{ + if (!context) { + return PHP_STREAM_ERROR_MODE_ERROR; + } + + zval *option = php_stream_context_get_option(context, "stream", "error_mode"); + if (!option) { + return PHP_STREAM_ERROR_MODE_ERROR; + } + + if (Z_TYPE_P(option) != IS_OBJECT + || !instanceof_function(Z_OBJCE_P(option), php_ce_stream_error_mode)) { + zend_type_error("stream context option 'error_mode' must be of type StreamErrorMode"); + return PHP_STREAM_ERROR_MODE_ERROR; + } + + switch ((zend_enum_StreamErrorMode) zend_enum_fetch_case_id(Z_OBJ_P(option))) { + case ZEND_ENUM_StreamErrorMode_Error: + return PHP_STREAM_ERROR_MODE_ERROR; + case ZEND_ENUM_StreamErrorMode_Exception: + return PHP_STREAM_ERROR_MODE_EXCEPTION; + case ZEND_ENUM_StreamErrorMode_Silent: + return PHP_STREAM_ERROR_MODE_SILENT; + } + + return PHP_STREAM_ERROR_MODE_ERROR; +} + +static int php_stream_get_error_store_mode(php_stream_context *context, int error_mode) +{ + if (!context) { + return php_stream_auto_decide_error_store_mode(error_mode); + } + + zval *option = php_stream_context_get_option(context, "stream", "error_store"); + if (!option) { + return php_stream_auto_decide_error_store_mode(error_mode); + } + + if (Z_TYPE_P(option) != IS_OBJECT + || !instanceof_function(Z_OBJCE_P(option), php_ce_stream_error_store)) { + zend_type_error("stream context option 'error_store' must be of type StreamErrorStore"); + return php_stream_auto_decide_error_store_mode(error_mode); + } + + switch ((zend_enum_StreamErrorStore) zend_enum_fetch_case_id(Z_OBJ_P(option))) { + case ZEND_ENUM_StreamErrorStore_Auto: + return php_stream_auto_decide_error_store_mode(error_mode); + case ZEND_ENUM_StreamErrorStore_None: + return PHP_STREAM_ERROR_STORE_NONE; + case ZEND_ENUM_StreamErrorStore_NonTerminating: + return PHP_STREAM_ERROR_STORE_NON_TERM; + case ZEND_ENUM_StreamErrorStore_Terminating: + return PHP_STREAM_ERROR_STORE_TERMINAL; + case ZEND_ENUM_StreamErrorStore_All: + return PHP_STREAM_ERROR_STORE_ALL; + } + + return php_stream_auto_decide_error_store_mode(error_mode); +} + +/* Helper functions */ + +static bool php_stream_has_terminating_error(php_stream_error_operation *op) +{ + php_stream_error_entry *entry = op->first_error; + while (entry) { + if (entry->terminating) { + return true; + } + entry = entry->next; + } + return false; +} + +static inline php_stream_error_operation *php_stream_get_operation_at_depth(uint32_t depth) +{ + php_stream_error_state *state = &FG(stream_error_state); + + if (depth < PHP_STREAM_ERROR_OPERATION_POOL_SIZE) { + return &state->operation_pool[depth]; + } else { + uint32_t overflow_index = depth - PHP_STREAM_ERROR_OPERATION_POOL_SIZE; + ZEND_ASSERT(overflow_index < state->overflow_capacity); + return &state->overflow_operations[overflow_index]; + } +} + +static inline php_stream_error_operation *php_stream_get_parent_operation(void) +{ + php_stream_error_state *state = &FG(stream_error_state); + + if (state->operation_depth <= 1) { + return NULL; + } + + return php_stream_get_operation_at_depth(state->operation_depth - 2); +} + +/* Clean up functions */ + +static void php_stream_error_entry_free(php_stream_error_entry *entry) +{ + while (entry) { + php_stream_error_entry *next = entry->next; + zend_string_release(entry->message); + efree(entry->wrapper_name); + efree(entry->param); + efree(entry->docref); + efree(entry); + entry = next; + } +} + +PHPAPI void php_stream_error_state_cleanup(void) +{ + php_stream_error_state *state = &FG(stream_error_state); + + while (state->current_operation) { + php_stream_error_operation *op = state->current_operation; + state->operation_depth--; + state->current_operation = php_stream_get_parent_operation(); + + php_stream_error_entry_free(op->first_error); + + op->first_error = NULL; + op->last_error = NULL; + op->error_count = 0; + } + + php_stream_stored_error *stored = state->stored_errors; + while (stored) { + php_stream_stored_error *next = stored->next; + php_stream_error_entry_free(stored->first_error); + efree(stored); + stored = next; + } + + state->stored_errors = NULL; + state->stored_count = 0; + state->operation_depth = 0; + + if (state->overflow_operations) { + efree(state->overflow_operations); + state->overflow_operations = NULL; + state->overflow_capacity = 0; + } +} + +PHPAPI void php_stream_error_get_last(zval *return_value) +{ + php_stream_error_state *state = &FG(stream_error_state); + + if (!state->stored_errors) { + ZVAL_EMPTY_ARRAY(return_value); + return; + } + + php_stream_error_create_array(return_value, state->stored_errors->first_error); +} + +PHPAPI void php_stream_error_clear_stored(void) +{ + php_stream_error_state *state = &FG(stream_error_state); + + php_stream_stored_error *stored = state->stored_errors; + while (stored) { + php_stream_stored_error *next = stored->next; + php_stream_error_entry_free(stored->first_error); + efree(stored); + stored = next; + } + + state->stored_errors = NULL; + state->stored_count = 0; +} + +/* Error operation stack management */ + +PHPAPI php_stream_error_operation *php_stream_error_operation_begin(void) +{ + php_stream_error_state *state = &FG(stream_error_state); + + if (state->operation_depth >= PHP_STREAM_ERROR_MAX_DEPTH) { + php_error_docref(NULL, E_WARNING, + "Stream error operation depth exceeded (%u), possible infinite recursion", + state->operation_depth); + return NULL; + } + + php_stream_error_operation *op; + + if (state->operation_depth < PHP_STREAM_ERROR_OPERATION_POOL_SIZE) { + op = &state->operation_pool[state->operation_depth]; + } else { + uint32_t overflow_index = state->operation_depth - PHP_STREAM_ERROR_OPERATION_POOL_SIZE; + + if (overflow_index >= state->overflow_capacity) { + uint32_t new_capacity + = state->overflow_capacity == 0 ? 8 : state->overflow_capacity * 2; + php_stream_error_operation *new_overflow = erealloc( + state->overflow_operations, sizeof(php_stream_error_operation) * new_capacity); + state->overflow_operations = new_overflow; + state->overflow_capacity = new_capacity; + } + + op = &state->overflow_operations[overflow_index]; + } + + op->first_error = NULL; + op->last_error = NULL; + op->error_count = 0; + + state->current_operation = op; + state->operation_depth++; + + return op; +} + +static void php_stream_error_add(zend_enum_StreamErrorCode code, const char *wrapper_name, + zend_string *message, const char *docref, char *param, int severity, bool terminating) +{ + php_stream_error_operation *op = FG(stream_error_state).current_operation; + ZEND_ASSERT(op != NULL); + + php_stream_error_entry *entry = emalloc(sizeof(php_stream_error_entry)); + entry->message = message; + entry->code = code; + entry->wrapper_name = wrapper_name ? estrdup(wrapper_name) : NULL; + entry->param = param; + entry->docref = docref ? estrdup(docref) : NULL; + entry->severity = severity; + entry->terminating = terminating; + entry->next = NULL; + + if (op->last_error) { + op->last_error->next = entry; + } else { + op->first_error = entry; + } + op->last_error = entry; + op->error_count++; +} + +/* Error reporting */ + +static void php_stream_call_error_handler(zval *handler, zval *errors_array) +{ + zend_fcall_info_cache fcc; + char *is_callable_error = NULL; + + if (!zend_is_callable_ex(handler, NULL, 0, NULL, &fcc, &is_callable_error)) { + if (is_callable_error) { + zend_type_error("stream error handler must be a valid callback, %s", is_callable_error); + efree(is_callable_error); + } + return; + } + + zend_call_known_fcc(&fcc, NULL, 1, errors_array, NULL); +} + +static void php_stream_throw_exception_with_errors(php_stream_error_operation *op) +{ + if (!op->first_error) { + return; + } + + zval ex; + object_init_ex(&ex, php_ce_stream_exception); + + /* Set message from first error */ + zend_update_property_string(php_ce_stream_exception, Z_OBJ(ex), ZEND_STRL("message"), + ZSTR_VAL(op->first_error->message)); + + /* Set code from first error */ + zend_update_property_long(php_ce_stream_exception, Z_OBJ(ex), ZEND_STRL("code"), + (zend_long) op->first_error->code); + + /* Build errors array and set it */ + zval errors_array; + php_stream_error_create_array(&errors_array, op->first_error); + zend_update_property(php_ce_stream_exception, Z_OBJ(ex), ZEND_STRL("errors"), &errors_array); + zval_ptr_dtor(&errors_array); + + zend_throw_exception_object(&ex); +} + +static void php_stream_report_errors(php_stream_context *context, php_stream_error_operation *op, + int error_mode, bool is_terminating) +{ + switch (error_mode) { + case PHP_STREAM_ERROR_MODE_ERROR: { + php_stream_error_entry *entry = op->first_error; + while (entry) { + if (entry->param) { + php_error_docref1(entry->docref, entry->param, entry->severity, "%s", + ZSTR_VAL(entry->message)); + } else { + php_error_docref( + entry->docref, entry->severity, "%s", ZSTR_VAL(entry->message)); + } + entry = entry->next; + } + break; + } + + case PHP_STREAM_ERROR_MODE_EXCEPTION: { + if (is_terminating) { + php_stream_throw_exception_with_errors(op); + } + break; + } + + case PHP_STREAM_ERROR_MODE_SILENT: + break; + } + + /* Call user error handler if set */ + zval *handler + = context ? php_stream_context_get_option(context, "stream", "error_handler") : NULL; + + if (handler) { + zval errors_array; + php_stream_error_create_array(&errors_array, op->first_error); + + php_stream_call_error_handler(handler, &errors_array); + + zval_ptr_dtor(&errors_array); + } +} + +/* Error storage */ + +PHPAPI void php_stream_error_operation_end(php_stream_context *context) +{ + php_stream_error_state *state = &FG(stream_error_state); + php_stream_error_operation *op = state->current_operation; + + if (!op) { + return; + } + + if (op->error_count > 0) { + if (context == NULL) { + context = FG(default_context); + } + + int error_mode = php_stream_get_error_mode(context); + int store_mode = php_stream_get_error_store_mode(context, error_mode); + + bool is_terminating = php_stream_has_terminating_error(op); + + php_stream_report_errors(context, op, error_mode, is_terminating); + + if (store_mode == PHP_STREAM_ERROR_STORE_NONE) { + php_stream_error_entry_free(op->first_error); + op->first_error = NULL; + } else { + php_stream_error_entry *entry = op->first_error; + php_stream_error_entry *prev = NULL; + php_stream_error_entry *to_store_first = NULL; + php_stream_error_entry *to_store_last = NULL; + uint32_t to_store_count = 0; + php_stream_error_entry *remaining_first = NULL; + + while (entry) { + php_stream_error_entry *next = entry->next; + bool should_store = false; + + if (store_mode == PHP_STREAM_ERROR_STORE_ALL) { + should_store = true; + } else if (store_mode == PHP_STREAM_ERROR_STORE_NON_TERM && !entry->terminating) { + should_store = true; + } else if (store_mode == PHP_STREAM_ERROR_STORE_TERMINAL && entry->terminating) { + should_store = true; + } + + if (should_store) { + entry->next = NULL; + if (to_store_last) { + to_store_last->next = entry; + } else { + to_store_first = entry; + } + to_store_last = entry; + to_store_count++; + } else { + entry->next = NULL; + if (prev) { + prev->next = entry; + } else { + remaining_first = entry; + } + prev = entry; + } + + entry = next; + } + + if (to_store_first) { + php_stream_stored_error *stored = emalloc(sizeof(php_stream_stored_error)); + stored->first_error = to_store_first; + stored->error_count = to_store_count; + stored->next = state->stored_errors; + + state->stored_errors = stored; + state->stored_count++; + } + + if (remaining_first) { + php_stream_error_entry_free(remaining_first); + } + + op->first_error = NULL; + } + } + + state->operation_depth--; + state->current_operation = php_stream_get_parent_operation(); + + op->first_error = NULL; + op->last_error = NULL; + op->error_count = 0; +} + +PHPAPI void php_stream_error_operation_end_for_stream(php_stream *stream) +{ + php_stream_error_state *state = &FG(stream_error_state); + php_stream_error_operation *op = state->current_operation; + + if (!op) { + return; + } + + if (op->error_count == 0) { + state->operation_depth--; + state->current_operation = php_stream_get_parent_operation(); + + op->first_error = NULL; + op->last_error = NULL; + return; + } + + php_stream_context *context = PHP_STREAM_CONTEXT(stream); + php_stream_error_operation_end(context); +} + +PHPAPI void php_stream_error_operation_abort(void) +{ + php_stream_error_state *state = &FG(stream_error_state); + php_stream_error_operation *op = state->current_operation; + + if (!op) { + return; + } + + state->operation_depth--; + state->current_operation = php_stream_get_parent_operation(); + + php_stream_error_entry_free(op->first_error); + op->first_error = NULL; + op->last_error = NULL; + op->error_count = 0; +} + +/* Wrapper error reporting */ + +static void php_stream_wrapper_error_internal(const char *wrapper_name, php_stream_context *context, + const char *docref, int options, int severity, bool terminating, + zend_enum_StreamErrorCode code, char *param, zend_string *message) +{ + bool implicit_operation = (FG(stream_error_state).current_operation == NULL); + if (implicit_operation) { + php_stream_error_operation_begin(); + } + + php_stream_error_add(code, wrapper_name, message, docref, param, severity, terminating); + + if (implicit_operation) { + php_stream_error_operation_end(context); + } +} + +PHPAPI void php_stream_wrapper_error_with_name(const char *wrapper_name, + php_stream_context *context, const char *docref, int options, int severity, + bool terminating, zend_enum_StreamErrorCode code, const char *fmt, ...) +{ + if (!(options & REPORT_ERRORS)) { + return; + } + + va_list args; + va_start(args, fmt); + zend_string *message = vstrpprintf(0, fmt, args); + va_end(args); + + php_stream_wrapper_error_internal( + wrapper_name, context, docref, options, severity, terminating, code, NULL, message); +} + +PHPAPI void php_stream_wrapper_error(php_stream_wrapper *wrapper, php_stream_context *context, + const char *docref, int options, int severity, bool terminating, + zend_enum_StreamErrorCode code, const char *fmt, ...) +{ + if (!(options & REPORT_ERRORS)) { + return; + } + + va_list args; + va_start(args, fmt); + zend_string *message = vstrpprintf(0, fmt, args); + va_end(args); + + const char *wrapper_name = PHP_STREAM_ERROR_WRAPPER_NAME(wrapper); + + php_stream_wrapper_error_internal( + wrapper_name, context, docref, options, severity, terminating, code, NULL, message); +} + +PHPAPI void php_stream_wrapper_error_param(php_stream_wrapper *wrapper, php_stream_context *context, + const char *docref, int options, int severity, bool terminating, + zend_enum_StreamErrorCode code, const char *param, const char *fmt, ...) +{ + if (!(options & REPORT_ERRORS)) { + return; + } + + va_list args; + va_start(args, fmt); + zend_string *message = vstrpprintf(0, fmt, args); + va_end(args); + + const char *wrapper_name = PHP_STREAM_ERROR_WRAPPER_NAME(wrapper); + char *param_copy = param ? estrdup(param) : NULL; + + php_stream_wrapper_error_internal(wrapper_name, context, docref, options, severity, terminating, + code, param_copy, message); +} + +PHPAPI void php_stream_wrapper_error_param2(php_stream_wrapper *wrapper, + php_stream_context *context, const char *docref, int options, int severity, + bool terminating, zend_enum_StreamErrorCode code, const char *param1, const char *param2, + const char *fmt, ...) +{ + if (!(options & REPORT_ERRORS)) { + return; + } + + char *combined_param; + spprintf(&combined_param, 0, "%s,%s", param1, param2); + + va_list args; + va_start(args, fmt); + zend_string *message = vstrpprintf(0, fmt, args); + va_end(args); + + const char *wrapper_name = PHP_STREAM_ERROR_WRAPPER_NAME(wrapper); + + php_stream_wrapper_error_internal(wrapper_name, context, docref, options, severity, terminating, + code, combined_param, message); +} + +/* Stream error reporting */ + +PHPAPI void php_stream_error(php_stream *stream, const char *docref, int severity, + bool terminating, zend_enum_StreamErrorCode code, const char *fmt, ...) +{ + va_list args; + va_start(args, fmt); + + zend_string *message = vstrpprintf(0, fmt, args); + va_end(args); + + const char *wrapper_name = stream->wrapper ? stream->wrapper->wops->label : "stream"; + + php_stream_context *context = PHP_STREAM_CONTEXT(stream); + + php_stream_wrapper_error_internal(wrapper_name, context, docref, REPORT_ERRORS, severity, + terminating, code, NULL, message); +} + +/* Legacy wrapper error logging */ + +static void php_stream_error_entry_dtor_legacy(void *error) +{ + php_stream_error_entry *entry = *(php_stream_error_entry **) error; + zend_string_release(entry->message); + efree(entry->wrapper_name); + efree(entry->param); + efree(entry->docref); + efree(entry); +} + +static void php_stream_error_list_dtor(zval *item) +{ + zend_llist *list = (zend_llist *) Z_PTR_P(item); + zend_llist_destroy(list); + efree(list); +} + +static void php_stream_wrapper_log_store_error(zend_string *message, zend_enum_StreamErrorCode code, + const char *wrapper_name, const char *param, int severity, bool terminating) +{ + char *param_copy = param ? estrdup(param) : NULL; + + php_stream_error_entry *entry = ecalloc(1, sizeof(php_stream_error_entry)); + entry->message = message; + entry->code = code; + entry->wrapper_name = wrapper_name ? estrdup(wrapper_name) : NULL; + entry->param = param_copy; + entry->severity = severity; + entry->terminating = terminating; + + if (!FG(wrapper_logged_errors)) { + ALLOC_HASHTABLE(FG(wrapper_logged_errors)); + zend_hash_init(FG(wrapper_logged_errors), 8, NULL, php_stream_error_list_dtor, 0); + } + + zend_llist *list + = zend_hash_str_find_ptr(FG(wrapper_logged_errors), wrapper_name, strlen(wrapper_name)); + + if (!list) { + zend_llist new_list; + zend_llist_init( + &new_list, sizeof(php_stream_error_entry *), php_stream_error_entry_dtor_legacy, 0); + list = zend_hash_str_update_mem(FG(wrapper_logged_errors), wrapper_name, + strlen(wrapper_name), &new_list, sizeof(new_list)); + } + + zend_llist_add_element(list, &entry); +} + +static void php_stream_wrapper_log_error_internal(const php_stream_wrapper *wrapper, + php_stream_context *context, int options, int severity, bool terminating, + zend_enum_StreamErrorCode code, char *param, const char *fmt, va_list args) +{ + zend_string *message = vstrpprintf(0, fmt, args); + const char *wrapper_name = PHP_STREAM_ERROR_WRAPPER_NAME(wrapper); + + if (options & REPORT_ERRORS) { + php_stream_wrapper_error_internal( + wrapper_name, context, NULL, options, severity, terminating, code, param, message); + } else { + php_stream_wrapper_log_store_error( + message, code, wrapper_name, param, severity, terminating); + } +} + +PHPAPI void php_stream_wrapper_log_error(const php_stream_wrapper *wrapper, + php_stream_context *context, int options, int severity, bool terminating, + zend_enum_StreamErrorCode code, const char *fmt, ...) +{ + va_list args; + va_start(args, fmt); + php_stream_wrapper_log_error_internal( + wrapper, context, options, severity, terminating, code, NULL, fmt, args); + va_end(args); +} + +PHPAPI void php_stream_wrapper_log_error_param(const php_stream_wrapper *wrapper, + php_stream_context *context, int options, int severity, bool terminating, + zend_enum_StreamErrorCode code, const char *param, const char *fmt, ...) +{ + va_list args; + va_start(args, fmt); + char *param_copy = param ? estrdup(param) : NULL; + php_stream_wrapper_log_error_internal( + wrapper, context, options, severity, terminating, code, param_copy, fmt, args); + va_end(args); +} + +static zend_llist *php_stream_get_wrapper_errors_list(const char *wrapper_name) +{ + if (!FG(wrapper_logged_errors)) { + return NULL; + } + return (zend_llist *) zend_hash_str_find_ptr( + FG(wrapper_logged_errors), wrapper_name, strlen(wrapper_name)); +} + +PHPAPI void php_stream_display_wrapper_name_errors(const char *wrapper_name, + php_stream_context *context, zend_enum_StreamErrorCode code, const char *path, + const char *caption) +{ + char *msg; + char errstr[256]; + int free_msg = 0; + + if (EG(exception)) { + return; + } + + char *tmp = estrdup(path); + if (strcmp(wrapper_name, PHP_STREAM_ERROR_WRAPPER_DEFAULT_NAME)) { + zend_llist *err_list = php_stream_get_wrapper_errors_list(wrapper_name); + if (err_list) { + size_t l = 0; + int brlen; + int i; + int count = (int) zend_llist_count(err_list); + const char *br; + php_stream_error_entry **err_entry_p; + zend_llist_position pos; + + if (PG(html_errors)) { + brlen = 7; + br = "
\n"; + } else { + brlen = 1; + br = "\n"; + } + + for (err_entry_p = zend_llist_get_first_ex(err_list, &pos), i = 0; err_entry_p; + err_entry_p = zend_llist_get_next_ex(err_list, &pos), i++) { + l += ZSTR_LEN((*err_entry_p)->message); + if (i < count - 1) { + l += brlen; + } + } + msg = emalloc(l + 1); + msg[0] = '\0'; + for (err_entry_p = zend_llist_get_first_ex(err_list, &pos), i = 0; err_entry_p; + err_entry_p = zend_llist_get_next_ex(err_list, &pos), i++) { + strcat(msg, ZSTR_VAL((*err_entry_p)->message)); + if (i < count - 1) { + strcat(msg, br); + } + } + + free_msg = 1; + } else { + if (!strcmp(wrapper_name, php_plain_files_wrapper.wops->label)) { + msg = php_socket_strerror_s(errno, errstr, sizeof(errstr)); + } else { + msg = "operation failed"; + } + } + } else { + msg = "no suitable wrapper could be found"; + } + + php_strip_url_passwd(tmp); + + zend_string *message = strpprintf(0, "%s: %s", caption, msg); + + php_stream_wrapper_error_internal(wrapper_name, context, NULL, REPORT_ERRORS, E_WARNING, true, + code, tmp, message); + + if (free_msg) { + efree(msg); + } +} + +PHPAPI void php_stream_display_wrapper_errors(php_stream_wrapper *wrapper, + php_stream_context *context, zend_enum_StreamErrorCode code, const char *path, + const char *caption) +{ + if (wrapper) { + const char *wrapper_name = PHP_STREAM_ERROR_WRAPPER_NAME(wrapper); + php_stream_display_wrapper_name_errors(wrapper_name, context, code, path, caption); + } +} + +PHPAPI void php_stream_tidy_wrapper_name_error_log(const char *wrapper_name) +{ + if (FG(wrapper_logged_errors)) { + zend_hash_str_del(FG(wrapper_logged_errors), wrapper_name, strlen(wrapper_name)); + } +} + +PHPAPI void php_stream_tidy_wrapper_error_log(php_stream_wrapper *wrapper) +{ + if (wrapper) { + const char *wrapper_name = PHP_STREAM_ERROR_WRAPPER_NAME(wrapper); + php_stream_tidy_wrapper_name_error_log(wrapper_name); + } +} + +/* StreamException methods */ + +PHP_METHOD(StreamException, getErrors) +{ + ZEND_PARSE_PARAMETERS_NONE(); + + zval *errors = zend_read_property( + php_ce_stream_exception, Z_OBJ_P(ZEND_THIS), ZEND_STRL("errors"), 1, NULL); + + RETURN_COPY(errors); +} + +/* Module init */ + +PHP_MINIT_FUNCTION(stream_errors) +{ + php_ce_stream_error_code = register_class_StreamErrorCode(); + php_ce_stream_error_mode = register_class_StreamErrorMode(); + php_ce_stream_error_store = register_class_StreamErrorStore(); + + php_ce_stream_error = register_class_StreamError(); + php_ce_stream_exception = register_class_StreamException(zend_ce_exception); + + return SUCCESS; +} + +PHP_MSHUTDOWN_FUNCTION(stream_errors) +{ + return SUCCESS; +} diff --git a/main/streams/stream_errors.stub.php b/main/streams/stream_errors.stub.php new file mode 100644 index 000000000000..2c56932c4850 --- /dev/null +++ b/main/streams/stream_errors.stub.php @@ -0,0 +1,143 @@ + */ + private array $errors = []; + + /** @return array */ + public function getErrors(): array {} +} diff --git a/main/streams/stream_errors_arginfo.h b/main/streams/stream_errors_arginfo.h new file mode 100644 index 000000000000..3a10e9bc5a40 --- /dev/null +++ b/main/streams/stream_errors_arginfo.h @@ -0,0 +1,259 @@ +/* This is a generated file, edit stream_errors.stub.php instead. + * Stub hash: 3e9ee6f0fdd8ecf3ded82728487a9e774137036a + * Has decl header: yes */ + +ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_class_StreamException_getErrors, 0, 0, IS_ARRAY, 0) +ZEND_END_ARG_INFO() + +static ZEND_METHOD(StreamException, getErrors); + +static const zend_function_entry class_StreamException_methods[] = { + ZEND_ME(StreamException, getErrors, arginfo_class_StreamException_getErrors, ZEND_ACC_PUBLIC) + ZEND_FE_END +}; + +static zend_class_entry *register_class_StreamErrorCode(void) +{ + zend_class_entry *class_entry = zend_register_internal_enum("StreamErrorCode", IS_UNDEF, NULL); + + zend_enum_add_case_cstr(class_entry, "None", NULL); + + zend_enum_add_case_cstr(class_entry, "Generic", NULL); + + zend_enum_add_case_cstr(class_entry, "ReadFailed", NULL); + + zend_enum_add_case_cstr(class_entry, "WriteFailed", NULL); + + zend_enum_add_case_cstr(class_entry, "SeekFailed", NULL); + + zend_enum_add_case_cstr(class_entry, "SeekNotSupported", NULL); + + zend_enum_add_case_cstr(class_entry, "FlushFailed", NULL); + + zend_enum_add_case_cstr(class_entry, "TruncateFailed", NULL); + + zend_enum_add_case_cstr(class_entry, "ConnectFailed", NULL); + + zend_enum_add_case_cstr(class_entry, "BindFailed", NULL); + + zend_enum_add_case_cstr(class_entry, "ListenFailed", NULL); + + zend_enum_add_case_cstr(class_entry, "NotWritable", NULL); + + zend_enum_add_case_cstr(class_entry, "NotReadable", NULL); + + zend_enum_add_case_cstr(class_entry, "Disabled", NULL); + + zend_enum_add_case_cstr(class_entry, "NotFound", NULL); + + zend_enum_add_case_cstr(class_entry, "PermissionDenied", NULL); + + zend_enum_add_case_cstr(class_entry, "AlreadyExists", NULL); + + zend_enum_add_case_cstr(class_entry, "InvalidPath", NULL); + + zend_enum_add_case_cstr(class_entry, "PathTooLong", NULL); + + zend_enum_add_case_cstr(class_entry, "OpenFailed", NULL); + + zend_enum_add_case_cstr(class_entry, "CreateFailed", NULL); + + zend_enum_add_case_cstr(class_entry, "DupFailed", NULL); + + zend_enum_add_case_cstr(class_entry, "UnlinkFailed", NULL); + + zend_enum_add_case_cstr(class_entry, "RenameFailed", NULL); + + zend_enum_add_case_cstr(class_entry, "MkdirFailed", NULL); + + zend_enum_add_case_cstr(class_entry, "RmdirFailed", NULL); + + zend_enum_add_case_cstr(class_entry, "StatFailed", NULL); + + zend_enum_add_case_cstr(class_entry, "MetaFailed", NULL); + + zend_enum_add_case_cstr(class_entry, "ChmodFailed", NULL); + + zend_enum_add_case_cstr(class_entry, "ChownFailed", NULL); + + zend_enum_add_case_cstr(class_entry, "CopyFailed", NULL); + + zend_enum_add_case_cstr(class_entry, "TouchFailed", NULL); + + zend_enum_add_case_cstr(class_entry, "InvalidMode", NULL); + + zend_enum_add_case_cstr(class_entry, "InvalidMeta", NULL); + + zend_enum_add_case_cstr(class_entry, "ModeNotSupported", NULL); + + zend_enum_add_case_cstr(class_entry, "Readonly", NULL); + + zend_enum_add_case_cstr(class_entry, "RecursionDetected", NULL); + + zend_enum_add_case_cstr(class_entry, "NotImplemented", NULL); + + zend_enum_add_case_cstr(class_entry, "NoOpener", NULL); + + zend_enum_add_case_cstr(class_entry, "PersistentNotSupported", NULL); + + zend_enum_add_case_cstr(class_entry, "WrapperNotFound", NULL); + + zend_enum_add_case_cstr(class_entry, "WrapperDisabled", NULL); + + zend_enum_add_case_cstr(class_entry, "ProtocolUnsupported", NULL); + + zend_enum_add_case_cstr(class_entry, "WrapperRegistrationFailed", NULL); + + zend_enum_add_case_cstr(class_entry, "WrapperUnregistrationFailed", NULL); + + zend_enum_add_case_cstr(class_entry, "WrapperRestorationFailed", NULL); + + zend_enum_add_case_cstr(class_entry, "FilterNotFound", NULL); + + zend_enum_add_case_cstr(class_entry, "FilterFailed", NULL); + + zend_enum_add_case_cstr(class_entry, "CastFailed", NULL); + + zend_enum_add_case_cstr(class_entry, "CastNotSupported", NULL); + + zend_enum_add_case_cstr(class_entry, "MakeSeekableFailed", NULL); + + zend_enum_add_case_cstr(class_entry, "BufferedDataLost", NULL); + + zend_enum_add_case_cstr(class_entry, "NetworkSendFailed", NULL); + + zend_enum_add_case_cstr(class_entry, "NetworkRecvFailed", NULL); + + zend_enum_add_case_cstr(class_entry, "SslNotSupported", NULL); + + zend_enum_add_case_cstr(class_entry, "ResumptionFailed", NULL); + + zend_enum_add_case_cstr(class_entry, "SocketPathTooLong", NULL); + + zend_enum_add_case_cstr(class_entry, "OobNotSupported", NULL); + + zend_enum_add_case_cstr(class_entry, "ProtocolError", NULL); + + zend_enum_add_case_cstr(class_entry, "InvalidUrl", NULL); + + zend_enum_add_case_cstr(class_entry, "InvalidResponse", NULL); + + zend_enum_add_case_cstr(class_entry, "InvalidHeader", NULL); + + zend_enum_add_case_cstr(class_entry, "InvalidParam", NULL); + + zend_enum_add_case_cstr(class_entry, "RedirectLimit", NULL); + + zend_enum_add_case_cstr(class_entry, "AuthFailed", NULL); + + zend_enum_add_case_cstr(class_entry, "ArchivingFailed", NULL); + + zend_enum_add_case_cstr(class_entry, "EncodingFailed", NULL); + + zend_enum_add_case_cstr(class_entry, "DecodingFailed", NULL); + + zend_enum_add_case_cstr(class_entry, "InvalidFormat", NULL); + + zend_enum_add_case_cstr(class_entry, "AllocationFailed", NULL); + + zend_enum_add_case_cstr(class_entry, "TemporaryFileFailed", NULL); + + zend_enum_add_case_cstr(class_entry, "LockFailed", NULL); + + zend_enum_add_case_cstr(class_entry, "LockNotSupported", NULL); + + zend_enum_add_case_cstr(class_entry, "UserspaceNotImplemented", NULL); + + zend_enum_add_case_cstr(class_entry, "UserspaceInvalidReturn", NULL); + + zend_enum_add_case_cstr(class_entry, "UserspaceCallFailed", NULL); + + return class_entry; +} + +static zend_class_entry *register_class_StreamErrorMode(void) +{ + zend_class_entry *class_entry = zend_register_internal_enum("StreamErrorMode", IS_UNDEF, NULL); + + zend_enum_add_case_cstr(class_entry, "Error", NULL); + + zend_enum_add_case_cstr(class_entry, "Exception", NULL); + + zend_enum_add_case_cstr(class_entry, "Silent", NULL); + + return class_entry; +} + +static zend_class_entry *register_class_StreamErrorStore(void) +{ + zend_class_entry *class_entry = zend_register_internal_enum("StreamErrorStore", IS_UNDEF, NULL); + + zend_enum_add_case_cstr(class_entry, "Auto", NULL); + + zend_enum_add_case_cstr(class_entry, "None", NULL); + + zend_enum_add_case_cstr(class_entry, "NonTerminating", NULL); + + zend_enum_add_case_cstr(class_entry, "Terminating", NULL); + + zend_enum_add_case_cstr(class_entry, "All", NULL); + + return class_entry; +} + +static zend_class_entry *register_class_StreamError(void) +{ + zend_class_entry ce, *class_entry; + + INIT_CLASS_ENTRY(ce, "StreamError", NULL); + class_entry = zend_register_internal_class_with_flags(&ce, NULL, ZEND_ACC_FINAL|ZEND_ACC_READONLY_CLASS); + + zval property_code_default_value; + ZVAL_UNDEF(&property_code_default_value); + zend_string *property_code_class_StreamErrorCode = zend_string_init("StreamErrorCode", sizeof("StreamErrorCode")-1, 1); + zend_declare_typed_property(class_entry, ZSTR_KNOWN(ZEND_STR_CODE), &property_code_default_value, ZEND_ACC_PUBLIC|ZEND_ACC_READONLY, NULL, (zend_type) ZEND_TYPE_INIT_CLASS(property_code_class_StreamErrorCode, 0, 0)); + + zval property_message_default_value; + ZVAL_UNDEF(&property_message_default_value); + zend_declare_typed_property(class_entry, ZSTR_KNOWN(ZEND_STR_MESSAGE), &property_message_default_value, ZEND_ACC_PUBLIC|ZEND_ACC_READONLY, NULL, (zend_type) ZEND_TYPE_INIT_MASK(MAY_BE_STRING)); + + zval property_wrapperName_default_value; + ZVAL_UNDEF(&property_wrapperName_default_value); + zend_string *property_wrapperName_name = zend_string_init("wrapperName", sizeof("wrapperName") - 1, true); + zend_declare_typed_property(class_entry, property_wrapperName_name, &property_wrapperName_default_value, ZEND_ACC_PUBLIC|ZEND_ACC_READONLY, NULL, (zend_type) ZEND_TYPE_INIT_MASK(MAY_BE_STRING)); + zend_string_release_ex(property_wrapperName_name, true); + + zval property_severity_default_value; + ZVAL_UNDEF(&property_severity_default_value); + zend_declare_typed_property(class_entry, ZSTR_KNOWN(ZEND_STR_SEVERITY), &property_severity_default_value, ZEND_ACC_PUBLIC|ZEND_ACC_READONLY, NULL, (zend_type) ZEND_TYPE_INIT_MASK(MAY_BE_LONG)); + + zval property_terminating_default_value; + ZVAL_UNDEF(&property_terminating_default_value); + zend_string *property_terminating_name = zend_string_init("terminating", sizeof("terminating") - 1, true); + zend_declare_typed_property(class_entry, property_terminating_name, &property_terminating_default_value, ZEND_ACC_PUBLIC|ZEND_ACC_READONLY, NULL, (zend_type) ZEND_TYPE_INIT_MASK(MAY_BE_BOOL)); + zend_string_release_ex(property_terminating_name, true); + + zval property_param_default_value; + ZVAL_UNDEF(&property_param_default_value); + zend_string *property_param_name = zend_string_init("param", sizeof("param") - 1, true); + zend_declare_typed_property(class_entry, property_param_name, &property_param_default_value, ZEND_ACC_PUBLIC|ZEND_ACC_READONLY, NULL, (zend_type) ZEND_TYPE_INIT_MASK(MAY_BE_STRING|MAY_BE_NULL)); + zend_string_release_ex(property_param_name, true); + + return class_entry; +} + +static zend_class_entry *register_class_StreamException(zend_class_entry *class_entry_Exception) +{ + zend_class_entry ce, *class_entry; + + INIT_CLASS_ENTRY(ce, "StreamException", class_StreamException_methods); + class_entry = zend_register_internal_class_with_flags(&ce, class_entry_Exception, 0); + + zval property_errors_default_value; + ZVAL_EMPTY_ARRAY(&property_errors_default_value); + zend_string *property_errors_name = zend_string_init("errors", sizeof("errors") - 1, true); + zend_declare_typed_property(class_entry, property_errors_name, &property_errors_default_value, ZEND_ACC_PRIVATE, NULL, (zend_type) ZEND_TYPE_INIT_MASK(MAY_BE_ARRAY)); + zend_string_release_ex(property_errors_name, true); + + return class_entry; +} diff --git a/main/streams/stream_errors_decl.h b/main/streams/stream_errors_decl.h new file mode 100644 index 000000000000..4748768195f1 --- /dev/null +++ b/main/streams/stream_errors_decl.h @@ -0,0 +1,183 @@ +/* This is a generated file, edit stream_errors.stub.php instead. + * Stub hash: 3e9ee6f0fdd8ecf3ded82728487a9e774137036a */ + +#ifndef ZEND_STREAM_ERRORS_DECL_3e9ee6f0fdd8ecf3ded82728487a9e774137036a_H +#define ZEND_STREAM_ERRORS_DECL_3e9ee6f0fdd8ecf3ded82728487a9e774137036a_H + +typedef enum zend_enum_StreamErrorCode { + ZEND_ENUM_StreamErrorCode_None = 1, + ZEND_ENUM_StreamErrorCode_Generic = 2, + ZEND_ENUM_StreamErrorCode_ReadFailed = 3, + ZEND_ENUM_StreamErrorCode_WriteFailed = 4, + ZEND_ENUM_StreamErrorCode_SeekFailed = 5, + ZEND_ENUM_StreamErrorCode_SeekNotSupported = 6, + ZEND_ENUM_StreamErrorCode_FlushFailed = 7, + ZEND_ENUM_StreamErrorCode_TruncateFailed = 8, + ZEND_ENUM_StreamErrorCode_ConnectFailed = 9, + ZEND_ENUM_StreamErrorCode_BindFailed = 10, + ZEND_ENUM_StreamErrorCode_ListenFailed = 11, + ZEND_ENUM_StreamErrorCode_NotWritable = 12, + ZEND_ENUM_StreamErrorCode_NotReadable = 13, + ZEND_ENUM_StreamErrorCode_Disabled = 14, + ZEND_ENUM_StreamErrorCode_NotFound = 15, + ZEND_ENUM_StreamErrorCode_PermissionDenied = 16, + ZEND_ENUM_StreamErrorCode_AlreadyExists = 17, + ZEND_ENUM_StreamErrorCode_InvalidPath = 18, + ZEND_ENUM_StreamErrorCode_PathTooLong = 19, + ZEND_ENUM_StreamErrorCode_OpenFailed = 20, + ZEND_ENUM_StreamErrorCode_CreateFailed = 21, + ZEND_ENUM_StreamErrorCode_DupFailed = 22, + ZEND_ENUM_StreamErrorCode_UnlinkFailed = 23, + ZEND_ENUM_StreamErrorCode_RenameFailed = 24, + ZEND_ENUM_StreamErrorCode_MkdirFailed = 25, + ZEND_ENUM_StreamErrorCode_RmdirFailed = 26, + ZEND_ENUM_StreamErrorCode_StatFailed = 27, + ZEND_ENUM_StreamErrorCode_MetaFailed = 28, + ZEND_ENUM_StreamErrorCode_ChmodFailed = 29, + ZEND_ENUM_StreamErrorCode_ChownFailed = 30, + ZEND_ENUM_StreamErrorCode_CopyFailed = 31, + ZEND_ENUM_StreamErrorCode_TouchFailed = 32, + ZEND_ENUM_StreamErrorCode_InvalidMode = 33, + ZEND_ENUM_StreamErrorCode_InvalidMeta = 34, + ZEND_ENUM_StreamErrorCode_ModeNotSupported = 35, + ZEND_ENUM_StreamErrorCode_Readonly = 36, + ZEND_ENUM_StreamErrorCode_RecursionDetected = 37, + ZEND_ENUM_StreamErrorCode_NotImplemented = 38, + ZEND_ENUM_StreamErrorCode_NoOpener = 39, + ZEND_ENUM_StreamErrorCode_PersistentNotSupported = 40, + ZEND_ENUM_StreamErrorCode_WrapperNotFound = 41, + ZEND_ENUM_StreamErrorCode_WrapperDisabled = 42, + ZEND_ENUM_StreamErrorCode_ProtocolUnsupported = 43, + ZEND_ENUM_StreamErrorCode_WrapperRegistrationFailed = 44, + ZEND_ENUM_StreamErrorCode_WrapperUnregistrationFailed = 45, + ZEND_ENUM_StreamErrorCode_WrapperRestorationFailed = 46, + ZEND_ENUM_StreamErrorCode_FilterNotFound = 47, + ZEND_ENUM_StreamErrorCode_FilterFailed = 48, + ZEND_ENUM_StreamErrorCode_CastFailed = 49, + ZEND_ENUM_StreamErrorCode_CastNotSupported = 50, + ZEND_ENUM_StreamErrorCode_MakeSeekableFailed = 51, + ZEND_ENUM_StreamErrorCode_BufferedDataLost = 52, + ZEND_ENUM_StreamErrorCode_NetworkSendFailed = 53, + ZEND_ENUM_StreamErrorCode_NetworkRecvFailed = 54, + ZEND_ENUM_StreamErrorCode_SslNotSupported = 55, + ZEND_ENUM_StreamErrorCode_ResumptionFailed = 56, + ZEND_ENUM_StreamErrorCode_SocketPathTooLong = 57, + ZEND_ENUM_StreamErrorCode_OobNotSupported = 58, + ZEND_ENUM_StreamErrorCode_ProtocolError = 59, + ZEND_ENUM_StreamErrorCode_InvalidUrl = 60, + ZEND_ENUM_StreamErrorCode_InvalidResponse = 61, + ZEND_ENUM_StreamErrorCode_InvalidHeader = 62, + ZEND_ENUM_StreamErrorCode_InvalidParam = 63, + ZEND_ENUM_StreamErrorCode_RedirectLimit = 64, + ZEND_ENUM_StreamErrorCode_AuthFailed = 65, + ZEND_ENUM_StreamErrorCode_ArchivingFailed = 66, + ZEND_ENUM_StreamErrorCode_EncodingFailed = 67, + ZEND_ENUM_StreamErrorCode_DecodingFailed = 68, + ZEND_ENUM_StreamErrorCode_InvalidFormat = 69, + ZEND_ENUM_StreamErrorCode_AllocationFailed = 70, + ZEND_ENUM_StreamErrorCode_TemporaryFileFailed = 71, + ZEND_ENUM_StreamErrorCode_LockFailed = 72, + ZEND_ENUM_StreamErrorCode_LockNotSupported = 73, + ZEND_ENUM_StreamErrorCode_UserspaceNotImplemented = 74, + ZEND_ENUM_StreamErrorCode_UserspaceInvalidReturn = 75, + ZEND_ENUM_StreamErrorCode_UserspaceCallFailed = 76, +} zend_enum_StreamErrorCode; + +#define ZEND_ENUM_StreamErrorCode_CASE_COUNT 76 + +#ifdef ZEND_ENUM_StreamErrorCode_USE_NAME_TABLE +static const char *zend_enum_StreamErrorCode_case_names[ZEND_ENUM_StreamErrorCode_CASE_COUNT + 1] = { + [ZEND_ENUM_StreamErrorCode_None] = "None", + [ZEND_ENUM_StreamErrorCode_Generic] = "Generic", + [ZEND_ENUM_StreamErrorCode_ReadFailed] = "ReadFailed", + [ZEND_ENUM_StreamErrorCode_WriteFailed] = "WriteFailed", + [ZEND_ENUM_StreamErrorCode_SeekFailed] = "SeekFailed", + [ZEND_ENUM_StreamErrorCode_SeekNotSupported] = "SeekNotSupported", + [ZEND_ENUM_StreamErrorCode_FlushFailed] = "FlushFailed", + [ZEND_ENUM_StreamErrorCode_TruncateFailed] = "TruncateFailed", + [ZEND_ENUM_StreamErrorCode_ConnectFailed] = "ConnectFailed", + [ZEND_ENUM_StreamErrorCode_BindFailed] = "BindFailed", + [ZEND_ENUM_StreamErrorCode_ListenFailed] = "ListenFailed", + [ZEND_ENUM_StreamErrorCode_NotWritable] = "NotWritable", + [ZEND_ENUM_StreamErrorCode_NotReadable] = "NotReadable", + [ZEND_ENUM_StreamErrorCode_Disabled] = "Disabled", + [ZEND_ENUM_StreamErrorCode_NotFound] = "NotFound", + [ZEND_ENUM_StreamErrorCode_PermissionDenied] = "PermissionDenied", + [ZEND_ENUM_StreamErrorCode_AlreadyExists] = "AlreadyExists", + [ZEND_ENUM_StreamErrorCode_InvalidPath] = "InvalidPath", + [ZEND_ENUM_StreamErrorCode_PathTooLong] = "PathTooLong", + [ZEND_ENUM_StreamErrorCode_OpenFailed] = "OpenFailed", + [ZEND_ENUM_StreamErrorCode_CreateFailed] = "CreateFailed", + [ZEND_ENUM_StreamErrorCode_DupFailed] = "DupFailed", + [ZEND_ENUM_StreamErrorCode_UnlinkFailed] = "UnlinkFailed", + [ZEND_ENUM_StreamErrorCode_RenameFailed] = "RenameFailed", + [ZEND_ENUM_StreamErrorCode_MkdirFailed] = "MkdirFailed", + [ZEND_ENUM_StreamErrorCode_RmdirFailed] = "RmdirFailed", + [ZEND_ENUM_StreamErrorCode_StatFailed] = "StatFailed", + [ZEND_ENUM_StreamErrorCode_MetaFailed] = "MetaFailed", + [ZEND_ENUM_StreamErrorCode_ChmodFailed] = "ChmodFailed", + [ZEND_ENUM_StreamErrorCode_ChownFailed] = "ChownFailed", + [ZEND_ENUM_StreamErrorCode_CopyFailed] = "CopyFailed", + [ZEND_ENUM_StreamErrorCode_TouchFailed] = "TouchFailed", + [ZEND_ENUM_StreamErrorCode_InvalidMode] = "InvalidMode", + [ZEND_ENUM_StreamErrorCode_InvalidMeta] = "InvalidMeta", + [ZEND_ENUM_StreamErrorCode_ModeNotSupported] = "ModeNotSupported", + [ZEND_ENUM_StreamErrorCode_Readonly] = "Readonly", + [ZEND_ENUM_StreamErrorCode_RecursionDetected] = "RecursionDetected", + [ZEND_ENUM_StreamErrorCode_NotImplemented] = "NotImplemented", + [ZEND_ENUM_StreamErrorCode_NoOpener] = "NoOpener", + [ZEND_ENUM_StreamErrorCode_PersistentNotSupported] = "PersistentNotSupported", + [ZEND_ENUM_StreamErrorCode_WrapperNotFound] = "WrapperNotFound", + [ZEND_ENUM_StreamErrorCode_WrapperDisabled] = "WrapperDisabled", + [ZEND_ENUM_StreamErrorCode_ProtocolUnsupported] = "ProtocolUnsupported", + [ZEND_ENUM_StreamErrorCode_WrapperRegistrationFailed] = "WrapperRegistrationFailed", + [ZEND_ENUM_StreamErrorCode_WrapperUnregistrationFailed] = "WrapperUnregistrationFailed", + [ZEND_ENUM_StreamErrorCode_WrapperRestorationFailed] = "WrapperRestorationFailed", + [ZEND_ENUM_StreamErrorCode_FilterNotFound] = "FilterNotFound", + [ZEND_ENUM_StreamErrorCode_FilterFailed] = "FilterFailed", + [ZEND_ENUM_StreamErrorCode_CastFailed] = "CastFailed", + [ZEND_ENUM_StreamErrorCode_CastNotSupported] = "CastNotSupported", + [ZEND_ENUM_StreamErrorCode_MakeSeekableFailed] = "MakeSeekableFailed", + [ZEND_ENUM_StreamErrorCode_BufferedDataLost] = "BufferedDataLost", + [ZEND_ENUM_StreamErrorCode_NetworkSendFailed] = "NetworkSendFailed", + [ZEND_ENUM_StreamErrorCode_NetworkRecvFailed] = "NetworkRecvFailed", + [ZEND_ENUM_StreamErrorCode_SslNotSupported] = "SslNotSupported", + [ZEND_ENUM_StreamErrorCode_ResumptionFailed] = "ResumptionFailed", + [ZEND_ENUM_StreamErrorCode_SocketPathTooLong] = "SocketPathTooLong", + [ZEND_ENUM_StreamErrorCode_OobNotSupported] = "OobNotSupported", + [ZEND_ENUM_StreamErrorCode_ProtocolError] = "ProtocolError", + [ZEND_ENUM_StreamErrorCode_InvalidUrl] = "InvalidUrl", + [ZEND_ENUM_StreamErrorCode_InvalidResponse] = "InvalidResponse", + [ZEND_ENUM_StreamErrorCode_InvalidHeader] = "InvalidHeader", + [ZEND_ENUM_StreamErrorCode_InvalidParam] = "InvalidParam", + [ZEND_ENUM_StreamErrorCode_RedirectLimit] = "RedirectLimit", + [ZEND_ENUM_StreamErrorCode_AuthFailed] = "AuthFailed", + [ZEND_ENUM_StreamErrorCode_ArchivingFailed] = "ArchivingFailed", + [ZEND_ENUM_StreamErrorCode_EncodingFailed] = "EncodingFailed", + [ZEND_ENUM_StreamErrorCode_DecodingFailed] = "DecodingFailed", + [ZEND_ENUM_StreamErrorCode_InvalidFormat] = "InvalidFormat", + [ZEND_ENUM_StreamErrorCode_AllocationFailed] = "AllocationFailed", + [ZEND_ENUM_StreamErrorCode_TemporaryFileFailed] = "TemporaryFileFailed", + [ZEND_ENUM_StreamErrorCode_LockFailed] = "LockFailed", + [ZEND_ENUM_StreamErrorCode_LockNotSupported] = "LockNotSupported", + [ZEND_ENUM_StreamErrorCode_UserspaceNotImplemented] = "UserspaceNotImplemented", + [ZEND_ENUM_StreamErrorCode_UserspaceInvalidReturn] = "UserspaceInvalidReturn", + [ZEND_ENUM_StreamErrorCode_UserspaceCallFailed] = "UserspaceCallFailed", +}; +#endif + +typedef enum zend_enum_StreamErrorMode { + ZEND_ENUM_StreamErrorMode_Error = 1, + ZEND_ENUM_StreamErrorMode_Exception = 2, + ZEND_ENUM_StreamErrorMode_Silent = 3, +} zend_enum_StreamErrorMode; + +typedef enum zend_enum_StreamErrorStore { + ZEND_ENUM_StreamErrorStore_Auto = 1, + ZEND_ENUM_StreamErrorStore_None = 2, + ZEND_ENUM_StreamErrorStore_NonTerminating = 3, + ZEND_ENUM_StreamErrorStore_Terminating = 4, + ZEND_ENUM_StreamErrorStore_All = 5, +} zend_enum_StreamErrorStore; + +#endif /* ZEND_STREAM_ERRORS_DECL_3e9ee6f0fdd8ecf3ded82728487a9e774137036a_H */ diff --git a/main/streams/streams.c b/main/streams/streams.c index 32c7ba99f58c..171748e6a08a 100644 --- a/main/streams/streams.c +++ b/main/streams/streams.c @@ -1,14 +1,12 @@ /* +----------------------------------------------------------------------+ - | Copyright (c) The PHP Group | + | Copyright © The PHP Group and Contributors. | +----------------------------------------------------------------------+ - | This source file is subject to version 3.01 of the PHP license, | - | that is bundled with this package in the file LICENSE, and is | - | available through the world-wide-web at the following url: | - | https://www.php.net/license/3_01.txt | - | If you did not receive a copy of the PHP license and are unable to | - | obtain it through the world-wide-web, please send a note to | - | license@php.net so we can mail you a copy immediately. | + | This source file is subject to the Modified BSD License that is | + | bundled with this package in the file LICENSE, and is available | + | through the World Wide Web at . | + | | + | SPDX-License-Identifier: BSD-3-Clause | +----------------------------------------------------------------------+ | Authors: Wez Furlong | | Borrowed code from: | @@ -140,141 +138,6 @@ PHPAPI int php_stream_from_persistent_id(const char *persistent_id, php_stream * return PHP_STREAM_PERSISTENT_NOT_EXIST; } -/* }}} */ - -static zend_llist *php_get_wrapper_errors_list(php_stream_wrapper *wrapper) -{ - if (!FG(wrapper_errors)) { - return NULL; - } else { - return (zend_llist*) zend_hash_str_find_ptr(FG(wrapper_errors), (const char*)&wrapper, sizeof(wrapper)); - } -} - -/* {{{ wrapper error reporting */ -static void php_stream_display_wrapper_errors(php_stream_wrapper *wrapper, const char *path, const char *caption) -{ - char *tmp; - char *msg; - char errstr[256]; - int free_msg = 0; - - if (EG(exception)) { - /* Don't emit additional warnings if an exception has already been thrown. */ - return; - } - - tmp = estrdup(path); - if (wrapper) { - zend_llist *err_list = php_get_wrapper_errors_list(wrapper); - if (err_list) { - size_t l = 0; - int brlen; - int i; - int count = (int)zend_llist_count(err_list); - const char *br; - const char **err_buf_p; - zend_llist_position pos; - - if (PG(html_errors)) { - brlen = 7; - br = "
\n"; - } else { - brlen = 1; - br = "\n"; - } - - for (err_buf_p = zend_llist_get_first_ex(err_list, &pos), i = 0; - err_buf_p; - err_buf_p = zend_llist_get_next_ex(err_list, &pos), i++) { - l += strlen(*err_buf_p); - if (i < count - 1) { - l += brlen; - } - } - msg = emalloc(l + 1); - msg[0] = '\0'; - for (err_buf_p = zend_llist_get_first_ex(err_list, &pos), i = 0; - err_buf_p; - err_buf_p = zend_llist_get_next_ex(err_list, &pos), i++) { - strcat(msg, *err_buf_p); - if (i < count - 1) { - strcat(msg, br); - } - } - - free_msg = 1; - } else { - if (wrapper == &php_plain_files_wrapper) { - msg = php_socket_strerror_s(errno, errstr, sizeof(errstr)); - } else { - msg = "operation failed"; - } - } - } else { - msg = "no suitable wrapper could be found"; - } - - php_strip_url_passwd(tmp); - php_error_docref1(NULL, tmp, E_WARNING, "%s: %s", caption, msg); - efree(tmp); - if (free_msg) { - efree(msg); - } -} - -static void php_stream_tidy_wrapper_error_log(php_stream_wrapper *wrapper) -{ - if (wrapper && FG(wrapper_errors)) { - zend_hash_str_del(FG(wrapper_errors), (const char*)&wrapper, sizeof(wrapper)); - } -} - -static void wrapper_error_dtor(void *error) -{ - efree(*(char**)error); -} - -static void wrapper_list_dtor(zval *item) { - zend_llist *list = (zend_llist*)Z_PTR_P(item); - zend_llist_destroy(list); - efree(list); -} - -PHPAPI void php_stream_wrapper_log_error(const php_stream_wrapper *wrapper, int options, const char *fmt, ...) -{ - va_list args; - char *buffer = NULL; - - va_start(args, fmt); - vspprintf(&buffer, 0, fmt, args); - va_end(args); - - if ((options & REPORT_ERRORS) || wrapper == NULL) { - php_error_docref(NULL, E_WARNING, "%s", buffer); - efree(buffer); - } else { - zend_llist *list = NULL; - if (!FG(wrapper_errors)) { - ALLOC_HASHTABLE(FG(wrapper_errors)); - zend_hash_init(FG(wrapper_errors), 8, NULL, wrapper_list_dtor, 0); - } else { - list = zend_hash_str_find_ptr(FG(wrapper_errors), (const char*)&wrapper, sizeof(wrapper)); - } - - if (!list) { - zend_llist new_list; - zend_llist_init(&new_list, sizeof(buffer), wrapper_error_dtor, 0); - list = zend_hash_str_update_mem(FG(wrapper_errors), (const char*)&wrapper, - sizeof(wrapper), &new_list, sizeof(new_list)); - } - - /* append to linked list */ - zend_llist_add_element(list, &buffer); - } -} - - /* }}} */ /* allocate a new stream for a particular ops */ @@ -513,6 +376,11 @@ fprintf(stderr, "stream_free: %s:%p[%s] preserve_handle=%d release_cast=%d remov ZVAL_UNDEF(&stream->wrapperdata); } + if (stream->error_list) { + zend_llist_destroy(stream->error_list); + pefree(stream->error_list, stream->is_persistent); + } + if (stream->readbuf) { pefree(stream->readbuf, stream->is_persistent); stream->readbuf = NULL; @@ -1320,7 +1188,7 @@ PHPAPI ssize_t _php_stream_write(php_stream *stream, const char *buf, size_t cou ZEND_ASSERT(buf != NULL); if (stream->ops->write == NULL) { - php_error_docref(NULL, E_NOTICE, "Stream is not writable"); + php_stream_notice(stream, NotWritable, "Stream is not writable"); return (ssize_t) -1; } @@ -1362,6 +1230,58 @@ PHPAPI zend_off_t _php_stream_tell(const php_stream *stream) return stream->position; } +static bool php_stream_are_filters_seekable(php_stream_filter *filter, bool is_start_seeking, int chain_type) +{ + while (filter) { + php_stream_filter_seekable_t seekable = (chain_type == PHP_STREAM_FILTER_READ) ? + filter->read_seekable : filter->write_seekable; + if (seekable == PSFS_SEEKABLE_NEVER) { + php_error_docref(NULL, E_WARNING, "Stream filter %s is never seekable", filter->fops->label); + return false; + } + if (!is_start_seeking && seekable == PSFS_SEEKABLE_START) { + php_error_docref(NULL, E_WARNING, "Stream filter %s is seekable only to start position", filter->fops->label); + return false; + } + filter = filter->next; + } + return true; +} + +static zend_result php_stream_filters_seek(php_stream *stream, php_stream_filter *filter, + bool is_start_seeking, zend_off_t offset, int whence, int chain_type) +{ + while (filter) { + php_stream_filter_seekable_t seekable = (chain_type == PHP_STREAM_FILTER_READ) ? + filter->read_seekable : filter->write_seekable; + if (((seekable == PSFS_SEEKABLE_START && is_start_seeking) || + seekable == PSFS_SEEKABLE_CHECK) && + filter->fops->seek(stream, filter, offset, whence) == FAILURE) { + php_error_docref(NULL, E_WARNING, "Stream filter seeking for %s failed", filter->fops->label); + return FAILURE; + } + filter = filter->next; + } + return SUCCESS; +} + +static zend_result php_stream_filters_seek_all(php_stream *stream, bool is_start_seeking, + zend_off_t offset, int whence) +{ + if (php_stream_filters_seek(stream, stream->writefilters.head, is_start_seeking, + offset, whence, PHP_STREAM_FILTER_WRITE) == FAILURE) { + return FAILURE; + } + if (php_stream_filters_seek(stream, stream->readfilters.head, is_start_seeking, + offset, whence, PHP_STREAM_FILTER_READ) == FAILURE) { + return FAILURE; + } + + return SUCCESS; +} + + + PHPAPI int _php_stream_seek(php_stream *stream, zend_off_t offset, int whence) { if (stream->fclose_stdiocast == PHP_STREAM_FCLOSE_FOPENCOOKIE) { @@ -1374,6 +1294,20 @@ PHPAPI int _php_stream_seek(php_stream *stream, zend_off_t offset, int whence) } } + bool is_start_seeking = whence == SEEK_SET && offset == 0; + + if (stream->writefilters.head) { + _php_stream_flush(stream, 0); + if (!php_stream_are_filters_seekable(stream->writefilters.head, is_start_seeking, + PHP_STREAM_FILTER_WRITE)) { + return -1; + } + } + if (stream->readfilters.head && !php_stream_are_filters_seekable( + stream->readfilters.head, is_start_seeking, PHP_STREAM_FILTER_READ)) { + return -1; + } + /* handle the case where we are in the buffer */ if ((stream->flags & PHP_STREAM_FLAG_NO_BUFFER) == 0) { switch(whence) { @@ -1383,7 +1317,7 @@ PHPAPI int _php_stream_seek(php_stream *stream, zend_off_t offset, int whence) stream->position += offset; stream->eof = 0; stream->fatal_error = 0; - return 0; + return php_stream_filters_seek_all(stream, is_start_seeking, offset, whence) == SUCCESS ? 0 : -1; } break; case SEEK_SET: @@ -1393,7 +1327,7 @@ PHPAPI int _php_stream_seek(php_stream *stream, zend_off_t offset, int whence) stream->position = offset; stream->eof = 0; stream->fatal_error = 0; - return 0; + return php_stream_filters_seek_all(stream, is_start_seeking, offset, whence) == SUCCESS ? 0 : -1; } break; } @@ -1402,11 +1336,6 @@ PHPAPI int _php_stream_seek(php_stream *stream, zend_off_t offset, int whence) if (stream->ops->seek && (stream->flags & PHP_STREAM_FLAG_NO_SEEK) == 0) { int ret; - - if (stream->writefilters.head) { - _php_stream_flush(stream, 0); - } - switch(whence) { case SEEK_CUR: ZEND_ASSERT(stream->position >= 0); @@ -1433,7 +1362,7 @@ PHPAPI int _php_stream_seek(php_stream *stream, zend_off_t offset, int whence) /* invalidate the buffer contents */ stream->readpos = stream->writepos = 0; - return ret; + return php_stream_filters_seek_all(stream, is_start_seeking, offset, whence) == SUCCESS ? ret : -1; } /* else the stream has decided that it can't support seeking after all; * fall through to attempt emulation */ @@ -1454,7 +1383,8 @@ PHPAPI int _php_stream_seek(php_stream *stream, zend_off_t offset, int whence) return 0; } - php_error_docref(NULL, E_WARNING, "Stream does not support seeking"); + php_stream_warn(stream, SeekNotSupported, + "Stream does not support seeking"); return -1; } @@ -1878,11 +1808,13 @@ void php_shutdown_stream_hashes(void) FG(stream_filters) = NULL; } - if (FG(wrapper_errors)) { - zend_hash_destroy(FG(wrapper_errors)); - efree(FG(wrapper_errors)); - FG(wrapper_errors) = NULL; + if (FG(wrapper_logged_errors)) { + zend_hash_destroy(FG(wrapper_logged_errors)); + efree(FG(wrapper_logged_errors)); + FG(wrapper_logged_errors) = NULL; } + + php_stream_error_state_cleanup(); } zend_result php_init_stream_wrappers(int module_number) @@ -1922,7 +1854,7 @@ void php_shutdown_stream_wrappers(int module_number) static inline zend_result php_stream_wrapper_scheme_validate(const char *protocol, size_t protocol_len) { for (size_t i = 0; i < protocol_len; i++) { - if (!isalnum((int)protocol[i]) && + if (!isalnum((unsigned char)protocol[i]) && protocol[i] != '+' && protocol[i] != '-' && protocol[i] != '.') { @@ -2002,7 +1934,7 @@ PHPAPI php_stream_wrapper *php_stream_locate_url_wrapper(const char *path, const return (php_stream_wrapper*)((options & STREAM_LOCATE_WRAPPERS_ONLY) ? NULL : &php_plain_files_wrapper); } - for (p = path; isalnum((int)*p) || *p == '+' || *p == '-' || *p == '.'; p++) { + for (p = path; isalnum((unsigned char)*p) || *p == '+' || *p == '-' || *p == '.'; p++) { n++; } @@ -2049,7 +1981,9 @@ PHPAPI php_stream_wrapper *php_stream_locate_url_wrapper(const char *path, const if (!localhost && path[n+3] != '\0' && path[n+3] != '/') { #endif if (options & REPORT_ERRORS) { - php_error_docref(NULL, E_WARNING, "Remote host file access not supported, %s", path); + php_stream_wrapper_warn(plain_files_wrapper, NULL, options, + ProtocolUnsupported, + "Remote host file access not supported, %s", path); } return NULL; } @@ -2088,7 +2022,9 @@ PHPAPI php_stream_wrapper *php_stream_locate_url_wrapper(const char *path, const } if (options & REPORT_ERRORS) { - php_error_docref(NULL, E_WARNING, "file:// wrapper is disabled in the server configuration"); + php_stream_wrapper_warn(plain_files_wrapper, NULL, options, + Disabled, + "file:// wrapper is disabled in the server configuration"); } return NULL; } @@ -2186,10 +2122,12 @@ PHPAPI php_stream *_php_stream_opendir(const char *path, int options, stream->flags |= PHP_STREAM_FLAG_NO_BUFFER | PHP_STREAM_FLAG_IS_DIR; } } else if (wrapper) { - php_stream_wrapper_log_error(wrapper, options & ~REPORT_ERRORS, "not implemented"); + php_stream_wrapper_log_warn(wrapper, context, options & ~REPORT_ERRORS, + NoOpener, "not implemented"); } if (stream == NULL && (options & REPORT_ERRORS)) { - php_stream_display_wrapper_errors(wrapper, path, "Failed to open directory"); + php_stream_display_wrapper_errors(wrapper, context, PHP_STREAM_EC(OpenFailed), + path, "Failed to open directory"); } php_stream_tidy_wrapper_error_log(wrapper); @@ -2256,16 +2194,25 @@ PHPAPI php_stream *_php_stream_open_wrapper_ex(const char *path, const char *mod wrapper = php_stream_locate_url_wrapper(path, &path_to_open, options); if ((options & STREAM_USE_URL) && (!wrapper || !wrapper->is_url)) { - php_error_docref(NULL, E_WARNING, "This function may only be used against URLs"); + if (wrapper) { + php_stream_wrapper_warn(wrapper, context, options, + ProtocolUnsupported, + "This function may only be used against URLs"); + } else { + php_error_docref(NULL, E_WARNING, "This function may only be used against URLs"); + } if (resolved_path) { zend_string_release_ex(resolved_path, 0); } return NULL; } + /* wrapper name needs to be stored as wrapper can be removed in opener (user stream) */ + char *wrapper_name = pestrdup(PHP_STREAM_ERROR_WRAPPER_NAME(wrapper), persistent); if (wrapper) { if (!wrapper->wops->stream_opener) { - php_stream_wrapper_log_error(wrapper, options & ~REPORT_ERRORS, + php_stream_wrapper_log_warn(wrapper, context, options & ~REPORT_ERRORS, + NoOpener, "wrapper does not support stream open"); } else { stream = wrapper->wops->stream_opener(wrapper, @@ -2276,7 +2223,8 @@ PHPAPI php_stream *_php_stream_open_wrapper_ex(const char *path, const char *mod /* if the caller asked for a persistent stream but the wrapper did not * return one, force an error here */ if (stream && persistent && !stream->is_persistent) { - php_stream_wrapper_log_error(wrapper, options & ~REPORT_ERRORS, + php_stream_wrapper_log_warn(wrapper, context, options & ~REPORT_ERRORS, + PersistentNotSupported, "wrapper does not support persistent streams"); php_stream_close(stream); stream = NULL; @@ -2300,6 +2248,14 @@ PHPAPI php_stream *_php_stream_open_wrapper_ex(const char *path, const char *mod stream->open_filename = __zend_orig_filename ? __zend_orig_filename : __zend_filename; stream->open_lineno = __zend_orig_lineno ? __zend_orig_lineno : __zend_lineno; #endif + /* Attach an explicitly provided context to the stream, but never the + * default context: sharing it by reference would let a later + * stream_context_set_option() on the stream mutate the global default + * context, leaking options into every other stream. Stream errors fall + * back to the default context on their own when the stream has none. */ + if (stream->ctx == NULL && context != NULL && context != FG(default_context) && !persistent) { + php_stream_context_set(stream, context); + } } if (stream != NULL && (options & STREAM_MUST_SEEK)) { @@ -2312,6 +2268,7 @@ PHPAPI php_stream *_php_stream_open_wrapper_ex(const char *path, const char *mod if (resolved_path) { zend_string_release_ex(resolved_path, 0); } + pefree(wrapper_name, persistent); return stream; case PHP_STREAM_RELEASED: if (newstream->orig_path) { @@ -2321,6 +2278,7 @@ PHPAPI php_stream *_php_stream_open_wrapper_ex(const char *path, const char *mod if (resolved_path) { zend_string_release_ex(resolved_path, 0); } + pefree(wrapper_name, persistent); return newstream; default: php_stream_close(stream); @@ -2328,8 +2286,9 @@ PHPAPI php_stream *_php_stream_open_wrapper_ex(const char *path, const char *mod if (options & REPORT_ERRORS) { char *tmp = estrdup(path); php_strip_url_passwd(tmp); - php_error_docref1(NULL, tmp, E_WARNING, "could not make seekable - %s", - tmp); + php_stream_wrapper_warn_param(wrapper, context, options, + SeekNotSupported, tmp, + "could not make seekable - %s", tmp); efree(tmp); options &= ~REPORT_ERRORS; @@ -2347,13 +2306,15 @@ PHPAPI php_stream *_php_stream_open_wrapper_ex(const char *path, const char *mod } if (stream == NULL && (options & REPORT_ERRORS)) { - php_stream_display_wrapper_errors(wrapper, path, "Failed to open stream"); + php_stream_display_wrapper_name_errors(wrapper_name, context, PHP_STREAM_EC(OpenFailed), + path, "Failed to open stream"); if (opened_path && *opened_path) { zend_string_release_ex(*opened_path, 0); *opened_path = NULL; } } - php_stream_tidy_wrapper_error_log(wrapper); + php_stream_tidy_wrapper_name_error_log(wrapper_name); + pefree(wrapper_name, persistent); if (resolved_path) { zend_string_release_ex(resolved_path, 0); } diff --git a/main/streams/transports.c b/main/streams/transports.c index 83297d9a06ce..e171b545b11b 100644 --- a/main/streams/transports.c +++ b/main/streams/transports.c @@ -1,14 +1,12 @@ /* +----------------------------------------------------------------------+ - | Copyright (c) The PHP Group | + | Copyright © The PHP Group and Contributors. | +----------------------------------------------------------------------+ - | This source file is subject to version 3.01 of the PHP license, | - | that is bundled with this package in the file LICENSE, and is | - | available through the world-wide-web at the following url: | - | https://www.php.net/license/3_01.txt | - | If you did not receive a copy of the PHP license and are unable to | - | obtain it through the world-wide-web, please send a note to | - | license@php.net so we can mail you a copy immediately. | + | This source file is subject to the Modified BSD License that is | + | bundled with this package in the file LICENSE, and is available | + | through the World Wide Web at . | + | | + | SPDX-License-Identifier: BSD-3-Clause | +----------------------------------------------------------------------+ | Author: Wez Furlong | +----------------------------------------------------------------------+ @@ -39,13 +37,13 @@ PHPAPI int php_stream_xport_unregister(const char *protocol) return zend_hash_str_del(&xport_hash, protocol, strlen(protocol)); } -#define ERR_REPORT(out_err, fmt, arg) \ +#define ERR_REPORT(code, out_err, fmt, arg) \ if (out_err) { *out_err = strpprintf(0, fmt, arg); } \ - else { php_error_docref(NULL, E_WARNING, fmt, arg); } + else { php_stream_wrapper_warn(NULL, NULL, REPORT_ERRORS, code, fmt, arg); } -#define ERR_RETURN(out_err, local_err, fmt) \ +#define ERR_RETURN(code, out_err, local_err, fmt) \ if (out_err) { *out_err = local_err; } \ - else { php_error_docref(NULL, E_WARNING, fmt, local_err ? ZSTR_VAL(local_err) : "Unspecified error"); \ + else { php_stream_wrapper_warn(NULL, NULL, REPORT_ERRORS, code, fmt, local_err ? ZSTR_VAL(local_err) : "Unspecified error"); \ if (local_err) { zend_string_release_ex(local_err, 0); local_err = NULL; } \ } @@ -95,7 +93,7 @@ PHPAPI php_stream *_php_stream_xport_create(const char *name, size_t namelen, in } orig_path = name; - for (p = name; isalnum((int)*p) || *p == '+' || *p == '-' || *p == '.'; p++) { + for (p = name; isalnum((unsigned char)*p) || *p == '+' || *p == '-' || *p == '.'; p++) { n++; } @@ -116,7 +114,8 @@ PHPAPI php_stream *_php_stream_xport_create(const char *name, size_t namelen, in n = sizeof(wrapper_name) - 1; PHP_STRLCPY(wrapper_name, protocol, sizeof(wrapper_name), n); - ERR_REPORT(error_string, "Unable to find the socket transport \"%s\" - did you forget to enable it when you configured PHP?", + ERR_REPORT(WrapperNotFound, error_string, + "Unable to find the socket transport \"%s\" - did you forget to enable it when you configured PHP?", wrapper_name); return NULL; @@ -125,7 +124,8 @@ PHPAPI php_stream *_php_stream_xport_create(const char *name, size_t namelen, in if (factory == NULL) { /* should never happen */ - php_error_docref(NULL, E_WARNING, "Could not find a factory !?"); + php_stream_wrapper_warn(NULL, context, REPORT_ERRORS, + WrapperNotFound, "Could not find a factory !?"); return NULL; } @@ -146,7 +146,7 @@ PHPAPI php_stream *_php_stream_xport_create(const char *name, size_t namelen, in flags & STREAM_XPORT_CONNECT_ASYNC ? 1 : 0, timeout, &error_text, error_code)) { - ERR_RETURN(error_string, error_text, "connect() failed: %s"); + ERR_RETURN(ConnectFailed, error_string, error_text, "connect() failed: %s"); failed = true; } @@ -156,7 +156,7 @@ PHPAPI php_stream *_php_stream_xport_create(const char *name, size_t namelen, in /* server */ if (flags & STREAM_XPORT_BIND) { if (0 != php_stream_xport_bind(stream, name, namelen, &error_text)) { - ERR_RETURN(error_string, error_text, "bind() failed: %s"); + ERR_RETURN(BindFailed, error_string, error_text, "bind() failed: %s"); failed = true; } else if (flags & STREAM_XPORT_LISTEN) { zval *zbacklog = NULL; @@ -167,7 +167,7 @@ PHPAPI php_stream *_php_stream_xport_create(const char *name, size_t namelen, in } if (0 != php_stream_xport_listen(stream, backlog, &error_text)) { - ERR_RETURN(error_string, error_text, "listen() failed: %s"); + ERR_RETURN(ListenFailed, error_string, error_text, "listen() failed: %s"); failed = true; } } @@ -370,7 +370,8 @@ PHPAPI int php_stream_xport_crypto_setup(php_stream *stream, php_stream_xport_cr return param.outputs.returncode; } - php_error_docref("streams.crypto", E_WARNING, "This stream does not support SSL/crypto"); + php_stream_warn_docref(stream, "streams.crypto", SslNotSupported, + "This stream does not support SSL/crypto"); return ret; } @@ -390,11 +391,32 @@ PHPAPI int php_stream_xport_crypto_enable(php_stream *stream, int activate) return param.outputs.returncode; } - php_error_docref("streams.crypto", E_WARNING, "This stream does not support SSL/crypto"); + php_stream_warn_docref(stream, "streams.crypto", SslNotSupported, + "This stream does not support SSL/crypto"); return ret; } +PHPAPI int php_stream_xport_crypto_get_status(php_stream *stream) +{ + php_stream_xport_crypto_param param; + int ret; + + memset(¶m, 0, sizeof(param)); + param.op = STREAM_XPORT_CRYPTO_OP_GET_STATUS; + + ret = php_stream_set_option(stream, PHP_STREAM_OPTION_CRYPTO_API, 0, ¶m); + + if (ret == PHP_STREAM_OPTION_RETURN_OK) { + return param.outputs.returncode; + } + + php_stream_warn_docref(stream, "streams.crypto", SslNotSupported, + "This stream does not support SSL/crypto"); + + return STREAM_CRYPTO_STATUS_NONE; +} + /* Similar to recv() system call; read data from the stream, optionally * peeking, optionally retrieving OOB data */ PHPAPI int php_stream_xport_recvfrom(php_stream *stream, char *buf, size_t buflen, @@ -412,7 +434,8 @@ PHPAPI int php_stream_xport_recvfrom(php_stream *stream, char *buf, size_t bufle } if (stream->readfilters.head) { - php_error_docref(NULL, E_WARNING, "Cannot peek or fetch OOB data from a filtered stream"); + php_stream_warn(stream, FilterFailed, + "Cannot peek or fetch OOB data from a filtered stream"); return -1; } @@ -482,7 +505,8 @@ PHPAPI int php_stream_xport_sendto(php_stream *stream, const char *buf, size_t b oob = (flags & STREAM_OOB) == STREAM_OOB; if ((oob || addr) && stream->writefilters.head) { - php_error_docref(NULL, E_WARNING, "Cannot write OOB data, or data to a targeted address on a filtered stream"); + php_stream_warn(stream, FilterFailed, + "Cannot write OOB data, or data to a targeted address on a filtered stream"); return -1; } diff --git a/main/streams/userspace.c b/main/streams/userspace.c index f5e25aa96c77..bf6ffa500963 100644 --- a/main/streams/userspace.c +++ b/main/streams/userspace.c @@ -1,14 +1,12 @@ /* +----------------------------------------------------------------------+ - | Copyright (c) The PHP Group | + | Copyright © The PHP Group and Contributors. | +----------------------------------------------------------------------+ - | This source file is subject to version 3.01 of the PHP license, | - | that is bundled with this package in the file LICENSE, and is | - | available through the world-wide-web at the following url: | - | https://www.php.net/license/3_01.txt | - | If you did not receive a copy of the PHP license and are unable to | - | obtain it through the world-wide-web, please send a note to | - | license@php.net so we can mail you a copy immediately. | + | This source file is subject to the Modified BSD License that is | + | bundled with this package in the file LICENSE, and is available | + | through the World Wide Web at . | + | | + | SPDX-License-Identifier: BSD-3-Clause | +----------------------------------------------------------------------+ | Authors: Wez Furlong | | Sara Golemon | @@ -293,7 +291,8 @@ static php_stream *user_wrapper_opener(php_stream_wrapper *wrapper, const char * /* Try to catch bad usage without preventing flexibility */ if (FG(user_stream_current_filename) != NULL && strcmp(filename, FG(user_stream_current_filename)) == 0) { - php_stream_wrapper_log_error(wrapper, options, "infinite recursion prevented"); + php_stream_wrapper_log_warn(wrapper, context, options, + RecursionDetected, "infinite recursion prevented"); return NULL; } FG(user_stream_current_filename) = filename; @@ -334,8 +333,8 @@ static php_stream *user_wrapper_opener(php_stream_wrapper *wrapper, const char * zval_ptr_dtor(&args[0]); if (UNEXPECTED(call_result == FAILURE)) { - php_stream_wrapper_log_error(wrapper, options, "\"%s::" USERSTREAM_OPEN "\" is not implemented", - ZSTR_VAL(us->wrapper->ce->name)); + php_stream_wrapper_log_warn(wrapper, context, options,NotImplemented, + "\"%s::" USERSTREAM_OPEN "\" is not implemented", ZSTR_VAL(us->wrapper->ce->name)); zval_ptr_dtor(&args[3]); goto end; } @@ -357,8 +356,9 @@ static php_stream *user_wrapper_opener(php_stream_wrapper *wrapper, const char * /* set wrapper data to be a reference to our object */ ZVAL_COPY(&stream->wrapperdata, &us->object); } else { - php_stream_wrapper_log_error(wrapper, options, "\"%s::" USERSTREAM_OPEN "\" call failed", - ZSTR_VAL(us->wrapper->ce->name)); + php_stream_wrapper_log_warn(wrapper, context, options, + UserspaceCallFailed, + "\"%s::" USERSTREAM_OPEN "\" call failed", ZSTR_VAL(us->wrapper->ce->name)); } zval_ptr_dtor(&zretval); @@ -394,7 +394,8 @@ static php_stream *user_wrapper_opendir(php_stream_wrapper *wrapper, const char /* Try to catch bad usage without preventing flexibility */ if (FG(user_stream_current_filename) != NULL && strcmp(filename, FG(user_stream_current_filename)) == 0) { - php_stream_wrapper_log_error(wrapper, options, "infinite recursion prevented"); + php_stream_wrapper_log_warn(wrapper, context, options, + RecursionDetected, "infinite recursion prevented"); return NULL; } FG(user_stream_current_filename) = filename; @@ -419,8 +420,9 @@ static php_stream *user_wrapper_opendir(php_stream_wrapper *wrapper, const char zval_ptr_dtor(&args[0]); if (UNEXPECTED(call_result == FAILURE)) { - php_stream_wrapper_log_error(wrapper, options, "\"%s::" USERSTREAM_DIR_OPEN "\" is not implemented", - ZSTR_VAL(us->wrapper->ce->name)); + php_stream_wrapper_log_warn(wrapper, context, options, NotImplemented, + "\"%s::" USERSTREAM_DIR_OPEN "\" is not implemented", + ZSTR_VAL(us->wrapper->ce->name)); goto end; } /* Exception occurred in call */ @@ -435,8 +437,9 @@ static php_stream *user_wrapper_opendir(php_stream_wrapper *wrapper, const char /* set wrapper data to be a reference to our object */ ZVAL_COPY(&stream->wrapperdata, &us->object); } else { - php_stream_wrapper_log_error(wrapper, options, "\"%s::" USERSTREAM_DIR_OPEN "\" call failed", - ZSTR_VAL(us->wrapper->ce->name)); + php_stream_wrapper_log_warn(wrapper, context, options, + UserspaceCallFailed, + "\"%s::" USERSTREAM_DIR_OPEN "\" call failed", ZSTR_VAL(us->wrapper->ce->name)); } zval_ptr_dtor(&zretval); @@ -479,10 +482,15 @@ PHP_FUNCTION(stream_wrapper_register) /* We failed. But why? */ if (zend_hash_exists(php_stream_get_url_stream_wrappers_hash(), protocol)) { - php_error_docref(NULL, E_WARNING, "Protocol %s:// is already defined.", ZSTR_VAL(protocol)); + php_stream_wrapper_warn(&uwrap->wrapper, NULL, REPORT_ERRORS, + WrapperRegistrationFailed, + "Protocol %s:// is already defined.", ZSTR_VAL(protocol)); } else { /* Hash doesn't exist so it must have been an invalid protocol scheme */ - php_error_docref(NULL, E_WARNING, "Invalid protocol scheme specified. Unable to register wrapper class %s to %s://", ZSTR_VAL(uwrap->ce->name), ZSTR_VAL(protocol)); + php_stream_wrapper_warn(&uwrap->wrapper, NULL, REPORT_ERRORS, + WrapperRegistrationFailed, + "Invalid protocol scheme specified. Unable to register wrapper class %s to %s://", + ZSTR_VAL(uwrap->ce->name), ZSTR_VAL(protocol)); } zend_list_delete(rsrc); @@ -502,7 +510,9 @@ PHP_FUNCTION(stream_wrapper_unregister) php_stream_wrapper *wrapper = zend_hash_find_ptr(php_stream_get_url_stream_wrappers_hash(), protocol); if (php_unregister_url_stream_wrapper_volatile(protocol) == FAILURE) { /* We failed */ - php_error_docref(NULL, E_WARNING, "Unable to unregister protocol %s://", ZSTR_VAL(protocol)); + php_stream_wrapper_warn(wrapper, NULL, REPORT_ERRORS, + WrapperUnregistrationFailed, + "Unable to unregister protocol %s://", ZSTR_VAL(protocol)); RETURN_FALSE; } @@ -530,13 +540,17 @@ PHP_FUNCTION(stream_wrapper_restore) global_wrapper_hash = php_stream_get_url_stream_wrappers_hash_global(); if ((wrapper = zend_hash_find_ptr(global_wrapper_hash, protocol)) == NULL) { - php_error_docref(NULL, E_WARNING, "%s:// never existed, nothing to restore", ZSTR_VAL(protocol)); + php_stream_wrapper_warn_name(user_stream_wops.label, NULL, REPORT_ERRORS, + WrapperNotFound, + "%s:// never existed, nothing to restore", ZSTR_VAL(protocol)); RETURN_FALSE; } wrapper_hash = php_stream_get_url_stream_wrappers_hash(); if (wrapper_hash == global_wrapper_hash || zend_hash_find_ptr(wrapper_hash, protocol) == wrapper) { - php_error_docref(NULL, E_NOTICE, "%s:// was never changed, nothing to restore", ZSTR_VAL(protocol)); + php_stream_wrapper_notice(wrapper, NULL, REPORT_ERRORS, + WrapperRestorationFailed, + "%s:// was never changed, nothing to restore", ZSTR_VAL(protocol)); RETURN_TRUE; } @@ -544,7 +558,9 @@ PHP_FUNCTION(stream_wrapper_restore) php_unregister_url_stream_wrapper_volatile(protocol); if (php_register_url_stream_wrapper_volatile(protocol, wrapper) == FAILURE) { - php_error_docref(NULL, E_WARNING, "Unable to restore original %s:// wrapper", ZSTR_VAL(protocol)); + php_stream_wrapper_warn(wrapper, NULL, REPORT_ERRORS, + WrapperRestorationFailed, + "Unable to restore original %s:// wrapper", ZSTR_VAL(protocol)); RETURN_FALSE; } @@ -572,8 +588,8 @@ static ssize_t php_userstreamop_write(php_stream *stream, const char *buf, size_ zval_ptr_dtor(&args[0]); if (UNEXPECTED(call_result == FAILURE)) { - php_error_docref(NULL, E_WARNING, "%s::" USERSTREAM_WRITE " is not implemented!", - ZSTR_VAL(us->wrapper->ce->name)); + php_stream_warn(stream, NotImplemented, + "%s::" USERSTREAM_WRITE " is not implemented!", ZSTR_VAL(us->wrapper->ce->name)); } stream->flags &= ~PHP_STREAM_FLAG_NO_FCLOSE; @@ -593,7 +609,9 @@ static ssize_t php_userstreamop_write(php_stream *stream, const char *buf, size_ /* don't allow strange buffer overruns due to bogus return */ if (didwrite > 0 && didwrite > count) { - php_error_docref(NULL, E_WARNING, "%s::" USERSTREAM_WRITE " wrote " ZEND_LONG_FMT " bytes more data than requested (" ZEND_LONG_FMT " written, " ZEND_LONG_FMT " max)", + php_stream_warn_nt(stream, UserspaceInvalidReturn, + "%s::" USERSTREAM_WRITE " wrote " ZEND_LONG_FMT " bytes more data than requested (" + ZEND_LONG_FMT " written, " ZEND_LONG_FMT " max)", ZSTR_VAL(us->wrapper->ce->name), (zend_long)(didwrite - count), (zend_long)didwrite, (zend_long)count); didwrite = count; @@ -624,8 +642,8 @@ static ssize_t php_userstreamop_read(php_stream *stream, char *buf, size_t count } if (UNEXPECTED(call_result == FAILURE)) { - php_error_docref(NULL, E_WARNING, "%s::" USERSTREAM_READ " is not implemented!", - ZSTR_VAL(us->wrapper->ce->name)); + php_stream_warn(stream, NotImplemented, + "%s::" USERSTREAM_READ " is not implemented!", ZSTR_VAL(us->wrapper->ce->name)); goto err; } @@ -641,8 +659,12 @@ static ssize_t php_userstreamop_read(php_stream *stream, char *buf, size_t count didread = Z_STRLEN(retval); if (didread > 0) { if (didread > count) { - php_error_docref(NULL, E_WARNING, "%s::" USERSTREAM_READ " - read " ZEND_LONG_FMT " bytes more data than requested (" ZEND_LONG_FMT " read, " ZEND_LONG_FMT " max) - excess data will be lost", - ZSTR_VAL(us->wrapper->ce->name), (zend_long)(didread - count), (zend_long)didread, (zend_long)count); + php_stream_warn_nt(stream, UserspaceInvalidReturn, + "%s::" USERSTREAM_READ " - read " ZEND_LONG_FMT + " bytes more data than requested (" ZEND_LONG_FMT " read, " + ZEND_LONG_FMT " max) - excess data will be lost", + ZSTR_VAL(us->wrapper->ce->name), (zend_long)(didread - count), + (zend_long)didread, (zend_long)count); didread = count; } memcpy(buf, Z_STRVAL(retval), didread); @@ -658,7 +680,7 @@ static ssize_t php_userstreamop_read(php_stream *stream, char *buf, size_t count zend_string_release_ex(func_name, false); if (UNEXPECTED(call_result == FAILURE)) { - php_error_docref(NULL, E_WARNING, + php_stream_warn(stream, NotImplemented, "%s::" USERSTREAM_EOF " is not implemented! Assuming EOF", ZSTR_VAL(us->wrapper->ce->name)); stream->eof = 1; @@ -774,7 +796,8 @@ static int php_userstreamop_seek(php_stream *stream, zend_off_t offset, int when *newoffs = Z_LVAL(retval); ret = 0; } else if (UNEXPECTED(call_result == FAILURE)) { - php_error_docref(NULL, E_WARNING, "%s::" USERSTREAM_TELL " is not implemented!", ZSTR_VAL(us->wrapper->ce->name)); + php_stream_warn(stream, NotImplemented, + "%s::" USERSTREAM_TELL " is not implemented!", ZSTR_VAL(us->wrapper->ce->name)); ret = -1; } else { ret = -1; @@ -838,8 +861,8 @@ static int php_userstreamop_stat(php_stream *stream, php_stream_statbuf *ssb) zend_string_release_ex(func_name, false); if (UNEXPECTED(call_result == FAILURE)) { - php_error_docref(NULL, E_WARNING, "%s::" USERSTREAM_STAT " is not implemented!", - ZSTR_VAL(us->wrapper->ce->name)); + php_stream_warn(stream, NotImplemented, + "%s::" USERSTREAM_STAT " is not implemented!", ZSTR_VAL(us->wrapper->ce->name)); return -1; } if (UNEXPECTED(Z_ISUNDEF(retval))) { @@ -857,7 +880,7 @@ static int php_userstreamop_stat(php_stream *stream, php_stream_statbuf *ssb) return ret; } -static int user_stream_set_check_liveliness(const php_userstream_data_t *us) +static int user_stream_set_check_liveliness(php_stream *stream, const php_userstream_data_t *us) { zval retval; @@ -866,7 +889,7 @@ static int user_stream_set_check_liveliness(const php_userstream_data_t *us) zend_string_release_ex(func_name, false); if (UNEXPECTED(call_result == FAILURE)) { - php_error_docref(NULL, E_WARNING, + php_stream_warn(stream, NotImplemented, "%s::" USERSTREAM_EOF " is not implemented! Assuming EOF", ZSTR_VAL(us->wrapper->ce->name)); return PHP_STREAM_OPTION_RETURN_ERR; @@ -877,15 +900,15 @@ static int user_stream_set_check_liveliness(const php_userstream_data_t *us) if (EXPECTED(Z_TYPE(retval) == IS_FALSE || Z_TYPE(retval) == IS_TRUE)) { return Z_TYPE(retval) == IS_TRUE ? PHP_STREAM_OPTION_RETURN_ERR : PHP_STREAM_OPTION_RETURN_OK; } else { - php_error_docref(NULL, E_WARNING, - "%s::" USERSTREAM_EOF " value must be of type bool, %s given", + php_stream_warn(stream, UserspaceInvalidReturn, + "%s::" USERSTREAM_EOF " value must be of type bool, %s given", ZSTR_VAL(us->wrapper->ce->name), zend_zval_value_name(&retval)); zval_ptr_dtor(&retval); return PHP_STREAM_OPTION_RETURN_ERR; } } -static int user_stream_set_locking(const php_userstream_data_t *us, int value) +static int user_stream_set_locking(php_stream *stream, const php_userstream_data_t *us, int value) { zval retval; zval zlock; @@ -920,9 +943,8 @@ static int user_stream_set_locking(const php_userstream_data_t *us, int value) /* lock support test (TODO: more check) */ return PHP_STREAM_OPTION_RETURN_OK; } - php_error_docref(NULL, E_WARNING, - "%s::" USERSTREAM_LOCK " is not implemented!", - ZSTR_VAL(us->wrapper->ce->name)); + php_stream_warn(stream, NotImplemented, + "%s::" USERSTREAM_LOCK " is not implemented!", ZSTR_VAL(us->wrapper->ce->name)); return PHP_STREAM_OPTION_RETURN_ERR; } if (UNEXPECTED(Z_ISUNDEF(retval))) { @@ -934,14 +956,15 @@ static int user_stream_set_locking(const php_userstream_data_t *us, int value) } // TODO: ext/standard/tests/file/userstreams_004.phpt returns null implicitly for function // Should this warn or not? And should this be considered an error? - //php_error_docref(NULL, E_WARNING, - // "%s::" USERSTREAM_LOCK " value must be of type bool, %s given", + //php_stream_warn(stream, UserspaceInvalidReturn, + // "%s::" USERSTREAM_LOCK " value must be of type bool, %s given", // ZSTR_VAL(us->wrapper->ce->name), zend_zval_value_name(&retval)); zval_ptr_dtor(&retval); return PHP_STREAM_OPTION_RETURN_NOTIMPL; } -static int user_stream_set_truncation(const php_userstream_data_t *us, int value, void *ptrparam) { +static int user_stream_set_truncation(php_stream *stream, const php_userstream_data_t *us, + int value, void *ptrparam) { zend_string *func_name = ZSTR_INIT_LITERAL(USERSTREAM_TRUNCATE, false); if (value == PHP_STREAM_TRUNCATE_SUPPORTED) { @@ -969,9 +992,8 @@ static int user_stream_set_truncation(const php_userstream_data_t *us, int value zend_string_release_ex(func_name, false); if (UNEXPECTED(call_result == FAILURE)) { - php_error_docref(NULL, E_WARNING, - "%s::" USERSTREAM_TRUNCATE " is not implemented!", - ZSTR_VAL(us->wrapper->ce->name)); + php_stream_warn(stream, NotImplemented, + "%s::" USERSTREAM_TRUNCATE " is not implemented!", ZSTR_VAL(us->wrapper->ce->name)); return PHP_STREAM_OPTION_RETURN_ERR; } if (UNEXPECTED(Z_ISUNDEF(retval))) { @@ -980,15 +1002,16 @@ static int user_stream_set_truncation(const php_userstream_data_t *us, int value if (EXPECTED(Z_TYPE(retval) == IS_FALSE || Z_TYPE(retval) == IS_TRUE)) { return Z_TYPE(retval) == IS_TRUE ? PHP_STREAM_OPTION_RETURN_OK : PHP_STREAM_OPTION_RETURN_ERR; } else { - php_error_docref(NULL, E_WARNING, - "%s::" USERSTREAM_TRUNCATE " value must be of type bool, %s given", + php_stream_warn(stream, UserspaceInvalidReturn, + "%s::" USERSTREAM_TRUNCATE " value must be of type bool, %s given", ZSTR_VAL(us->wrapper->ce->name), zend_zval_value_name(&retval)); zval_ptr_dtor(&retval); return PHP_STREAM_OPTION_RETURN_ERR; } } -static int user_stream_set_option(const php_userstream_data_t *us, int option, int value, void *ptrparam) +static int user_stream_set_option(php_stream *stream, const php_userstream_data_t *us, int option, + int value, void *ptrparam) { zval args[3]; ZVAL_LONG(&args[0], option); @@ -1013,7 +1036,7 @@ static int user_stream_set_option(const php_userstream_data_t *us, int option, i zend_string_release_ex(func_name, false); if (UNEXPECTED(call_result == FAILURE)) { - php_error_docref(NULL, E_WARNING, + php_stream_warn(stream, NotImplemented, "%s::" USERSTREAM_SET_OPTION " is not implemented!", ZSTR_VAL(us->wrapper->ce->name)); return PHP_STREAM_OPTION_RETURN_ERR; @@ -1038,19 +1061,19 @@ static int php_userstreamop_set_option(php_stream *stream, int option, int value switch (option) { case PHP_STREAM_OPTION_CHECK_LIVENESS: - return user_stream_set_check_liveliness(us); + return user_stream_set_check_liveliness(stream, us); case PHP_STREAM_OPTION_LOCKING: - return user_stream_set_locking(us, value); + return user_stream_set_locking(stream, us, value); case PHP_STREAM_OPTION_TRUNCATE_API: - return user_stream_set_truncation(us, value, ptrparam); + return user_stream_set_truncation(stream, us, value, ptrparam); case PHP_STREAM_OPTION_READ_BUFFER: case PHP_STREAM_OPTION_WRITE_BUFFER: case PHP_STREAM_OPTION_READ_TIMEOUT: case PHP_STREAM_OPTION_BLOCKING: - return user_stream_set_option(us, option, value, ptrparam); + return user_stream_set_option(stream, us, option, value, ptrparam); default: return PHP_STREAM_OPTION_RETURN_NOTIMPL; @@ -1083,7 +1106,8 @@ static int user_wrapper_unlink(php_stream_wrapper *wrapper, const char *url, int zval_ptr_dtor(&object); if (UNEXPECTED(call_result == FAILURE)) { - php_error_docref(NULL, E_WARNING, "%s::" USERSTREAM_UNLINK " is not implemented!", ZSTR_VAL(uwrap->ce->name)); + php_stream_wrapper_warn(wrapper, context, REPORT_ERRORS, NotImplemented, + "%s::" USERSTREAM_UNLINK " is not implemented!", ZSTR_VAL(uwrap->ce->name)); } else if (Z_TYPE(zretval) == IS_FALSE || Z_TYPE(zretval) == IS_TRUE) { ret = Z_TYPE(zretval) == IS_TRUE; } @@ -1121,7 +1145,8 @@ static int user_wrapper_rename(php_stream_wrapper *wrapper, const char *url_from zval_ptr_dtor(&object); if (UNEXPECTED(call_result == FAILURE)) { - php_error_docref(NULL, E_WARNING, "%s::" USERSTREAM_RENAME " is not implemented!", ZSTR_VAL(uwrap->ce->name)); + php_stream_wrapper_warn(wrapper, context, REPORT_ERRORS, NotImplemented, + "%s::" USERSTREAM_RENAME " is not implemented!", ZSTR_VAL(uwrap->ce->name)); } else if (Z_TYPE(zretval) == IS_FALSE || Z_TYPE(zretval) == IS_TRUE) { ret = Z_TYPE(zretval) == IS_TRUE; } @@ -1159,7 +1184,8 @@ static int user_wrapper_mkdir(php_stream_wrapper *wrapper, const char *url, int zval_ptr_dtor(&object); if (UNEXPECTED(call_result == FAILURE)) { - php_error_docref(NULL, E_WARNING, "%s::" USERSTREAM_MKDIR " is not implemented!", ZSTR_VAL(uwrap->ce->name)); + php_stream_wrapper_warn(wrapper, context, REPORT_ERRORS, NotImplemented, + "%s::" USERSTREAM_MKDIR " is not implemented!", ZSTR_VAL(uwrap->ce->name)); } else if (Z_TYPE(zretval) == IS_FALSE || Z_TYPE(zretval) == IS_TRUE) { ret = Z_TYPE(zretval) == IS_TRUE; } @@ -1196,7 +1222,8 @@ static int user_wrapper_rmdir(php_stream_wrapper *wrapper, const char *url, zval_ptr_dtor(&object); if (UNEXPECTED(call_result == FAILURE)) { - php_error_docref(NULL, E_WARNING, "%s::" USERSTREAM_RMDIR " is not implemented!", ZSTR_VAL(uwrap->ce->name)); + php_stream_wrapper_warn(wrapper, context, REPORT_ERRORS, NotImplemented, + "%s::" USERSTREAM_RMDIR " is not implemented!", ZSTR_VAL(uwrap->ce->name)); } else if (Z_TYPE(zretval) == IS_FALSE || Z_TYPE(zretval) == IS_TRUE) { ret = Z_TYPE(zretval) == IS_TRUE; } @@ -1235,7 +1262,9 @@ static int user_wrapper_metadata(php_stream_wrapper *wrapper, const char *url, i ZVAL_STRING(&args[2], value); break; default: - php_error_docref(NULL, E_WARNING, "Unknown option %d for " USERSTREAM_METADATA, option); + php_stream_wrapper_warn(wrapper, context, REPORT_ERRORS, + InvalidMeta, + "Unknown option %d for " USERSTREAM_METADATA, option); return ret; } @@ -1258,7 +1287,8 @@ static int user_wrapper_metadata(php_stream_wrapper *wrapper, const char *url, i zval_ptr_dtor(&object); if (UNEXPECTED(call_result == FAILURE)) { - php_error_docref(NULL, E_WARNING, "%s::" USERSTREAM_METADATA " is not implemented!", ZSTR_VAL(uwrap->ce->name)); + php_stream_wrapper_warn(wrapper, context, REPORT_ERRORS, NotImplemented, + "%s::" USERSTREAM_METADATA " is not implemented!", ZSTR_VAL(uwrap->ce->name)); } else if (Z_TYPE(zretval) == IS_FALSE || Z_TYPE(zretval) == IS_TRUE) { ret = Z_TYPE(zretval) == IS_TRUE; } @@ -1296,8 +1326,8 @@ static int user_wrapper_stat_url(php_stream_wrapper *wrapper, const char *url, i zval_ptr_dtor(&object); if (UNEXPECTED(call_result == FAILURE)) { - php_error_docref(NULL, E_WARNING, "%s::" USERSTREAM_STATURL " is not implemented!", - ZSTR_VAL(uwrap->ce->name)); + php_stream_wrapper_warn(wrapper, context, REPORT_ERRORS, NotImplemented, + "%s::" USERSTREAM_STATURL " is not implemented!", ZSTR_VAL(uwrap->ce->name)); return -1; } if (UNEXPECTED(Z_ISUNDEF(zretval))) { @@ -1332,8 +1362,9 @@ static ssize_t php_userstreamop_readdir(php_stream *stream, char *buf, size_t co zend_string_release_ex(func_name, false); if (UNEXPECTED(call_result == FAILURE)) { - php_error_docref(NULL, E_WARNING, "%s::" USERSTREAM_DIR_READ " is not implemented!", - ZSTR_VAL(us->wrapper->ce->name)); + php_stream_warn(stream, NotImplemented, + "%s::" USERSTREAM_DIR_READ " is not implemented!", + ZSTR_VAL(us->wrapper->ce->name)); return -1; } if (UNEXPECTED(Z_ISUNDEF(retval))) { @@ -1418,7 +1449,8 @@ static int php_userstreamop_cast(php_stream *stream, int castas, void **retptr) if (UNEXPECTED(call_result == FAILURE)) { if (report_errors) { - php_error_docref(NULL, E_WARNING, "%s::" USERSTREAM_CAST " is not implemented!", + php_stream_warn(stream, NotImplemented, + "%s::" USERSTREAM_CAST " is not implemented!", ZSTR_VAL(us->wrapper->ce->name)); } goto out; @@ -1432,14 +1464,16 @@ static int php_userstreamop_cast(php_stream *stream, int castas, void **retptr) php_stream_from_zval_no_verify(intstream, &retval); if (!intstream) { if (report_errors) { - php_error_docref(NULL, E_WARNING, "%s::" USERSTREAM_CAST " must return a stream resource", + php_stream_warn(stream, UserspaceInvalidReturn, + "%s::" USERSTREAM_CAST " must return a stream resource", ZSTR_VAL(us->wrapper->ce->name)); } break; } if (intstream == stream) { if (report_errors) { - php_error_docref(NULL, E_WARNING, "%s::" USERSTREAM_CAST " must not return itself", + php_stream_warn(stream, UserspaceInvalidReturn, + "%s::" USERSTREAM_CAST " must not return itself", ZSTR_VAL(us->wrapper->ce->name)); } intstream = NULL; diff --git a/main/streams/xp_socket.c b/main/streams/xp_socket.c index f21944313d32..d18b0e901957 100644 --- a/main/streams/xp_socket.c +++ b/main/streams/xp_socket.c @@ -1,14 +1,12 @@ /* +----------------------------------------------------------------------+ - | Copyright (c) The PHP Group | + | Copyright © The PHP Group and Contributors. | +----------------------------------------------------------------------+ - | This source file is subject to version 3.01 of the PHP license, | - | that is bundled with this package in the file LICENSE, and is | - | available through the world-wide-web at the following url: | - | https://www.php.net/license/3_01.txt | - | If you did not receive a copy of the PHP license and are unable to | - | obtain it through the world-wide-web, please send a note to | - | license@php.net so we can mail you a copy immediately. | + | This source file is subject to the Modified BSD License that is | + | bundled with this package in the file LICENSE, and is available | + | through the World Wide Web at . | + | | + | SPDX-License-Identifier: BSD-3-Clause | +----------------------------------------------------------------------+ | Author: Wez Furlong | +----------------------------------------------------------------------+ @@ -116,9 +114,8 @@ static ssize_t php_sockop_write(php_stream *stream, const char *buf, size_t coun if (!(stream->flags & PHP_STREAM_FLAG_SUPPRESS_ERRORS)) { estr = php_socket_strerror(err, NULL, 0); - php_error_docref(NULL, E_NOTICE, - "Send of %zu bytes failed with errno=%d %s", - count, err, estr); + php_stream_warn(stream, NetworkSendFailed, + "Send of %zu bytes failed with errno=%d %s", count, err, estr); efree(estr); } } @@ -454,8 +451,7 @@ static int php_sockop_set_option(php_stream *stream, int option, int value, void xparam->inputs.addrlen); if (xparam->outputs.returncode == -1) { char *err = php_socket_strerror(php_socket_errno(), NULL, 0); - php_error_docref(NULL, E_WARNING, - "%s\n", err); + php_stream_warn(stream, NetworkSendFailed, "%s", err); efree(err); } return PHP_STREAM_OPTION_RETURN_OK; @@ -595,7 +591,8 @@ static const php_stream_ops php_stream_unixdg_socket_ops = { /* network socket operations */ #ifdef AF_UNIX -static inline int parse_unix_address(php_stream_xport_param *xparam, struct sockaddr_un *unix_addr) +static inline int parse_unix_address(php_stream *stream, php_stream_xport_param *xparam, + struct sockaddr_un *unix_addr) { memset(unix_addr, 0, sizeof(*unix_addr)); unix_addr->sun_family = AF_UNIX; @@ -614,9 +611,9 @@ static inline int parse_unix_address(php_stream_xport_param *xparam, struct sock * BUT, to get into this branch of code, the name is too long, * so we don't care. */ xparam->inputs.namelen = max_length; - php_error_docref(NULL, E_NOTICE, - "socket path exceeded the maximum allowed length of %lu bytes " - "and was truncated", max_length); + php_stream_notice(stream, InvalidPath, + "socket path exceeded the maximum allowed length of %lu bytes and was truncated", + max_length); } memcpy(unix_addr->sun_path, xparam->inputs.name, xparam->inputs.namelen); @@ -697,10 +694,10 @@ static inline int php_tcp_sockop_bind(php_stream *stream, php_netstream_data_t * return -1; } - parse_unix_address(xparam, &unix_addr); + parse_unix_address(stream, xparam, &unix_addr); int result = bind(sock->socket, (const struct sockaddr *)&unix_addr, - (socklen_t) XtOffsetOf(struct sockaddr_un, sun_path) + xparam->inputs.namelen); + (socklen_t) offsetof(struct sockaddr_un, sun_path) + xparam->inputs.namelen); if (result == -1 && xparam->want_errortext) { char errstr[256]; xparam->outputs.error_text = strpprintf(0, "%s", php_socket_strerror_s(errno, errstr, sizeof(errstr))); @@ -833,10 +830,10 @@ static inline int php_tcp_sockop_connect(php_stream *stream, php_netstream_data_ return -1; } - parse_unix_address(xparam, &unix_addr); + parse_unix_address(stream, xparam, &unix_addr); ret = php_network_connect_socket(sock->socket, - (const struct sockaddr *)&unix_addr, (socklen_t) XtOffsetOf(struct sockaddr_un, sun_path) + xparam->inputs.namelen, + (const struct sockaddr *)&unix_addr, (socklen_t) offsetof(struct sockaddr_un, sun_path) + xparam->inputs.namelen, xparam->op == STREAM_XPORT_OP_CONNECT_ASYNC, xparam->inputs.timeout, xparam->want_errortext ? &xparam->outputs.error_text : NULL, &err); diff --git a/main/strlcat.c b/main/strlcat.c index b514a7e0d5d5..9590fd19229c 100644 --- a/main/strlcat.c +++ b/main/strlcat.c @@ -1,16 +1,12 @@ /* +----------------------------------------------------------------------+ - | Copyright (c) The PHP Group | + | Copyright © The PHP Group and Contributors. | +----------------------------------------------------------------------+ - | This source file is subject to version 3.01 of the PHP license, | - | that is bundled with this package in the file LICENSE, and is | - | available through the world-wide-web at the following url: | - | https://www.php.net/license/3_01.txt | - | If you did not receive a copy of the PHP license and are unable to | - | obtain it through the world-wide-web, please send a note to | - | license@php.net so we can mail you a copy immediately. | - +----------------------------------------------------------------------+ - | Author: | + | This source file is subject to the Modified BSD License that is | + | bundled with this package in the file LICENSE, and is available | + | through the World Wide Web at . | + | | + | SPDX-License-Identifier: BSD-3-Clause | +----------------------------------------------------------------------+ */ diff --git a/main/strlcpy.c b/main/strlcpy.c index 9ca99311aa42..f7e563967377 100644 --- a/main/strlcpy.c +++ b/main/strlcpy.c @@ -1,16 +1,12 @@ /* +----------------------------------------------------------------------+ - | Copyright (c) The PHP Group | + | Copyright © The PHP Group and Contributors. | +----------------------------------------------------------------------+ - | This source file is subject to version 3.01 of the PHP license, | - | that is bundled with this package in the file LICENSE, and is | - | available through the world-wide-web at the following url: | - | https://www.php.net/license/3_01.txt | - | If you did not receive a copy of the PHP license and are unable to | - | obtain it through the world-wide-web, please send a note to | - | license@php.net so we can mail you a copy immediately. | - +----------------------------------------------------------------------+ - | Author: | + | This source file is subject to the Modified BSD License that is | + | bundled with this package in the file LICENSE, and is available | + | through the World Wide Web at . | + | | + | SPDX-License-Identifier: BSD-3-Clause | +----------------------------------------------------------------------+ */ diff --git a/php.ini-development b/php.ini-development index 6f93f440112e..afabe74ba0e4 100644 --- a/php.ini-development +++ b/php.ini-development @@ -611,6 +611,12 @@ ignore_repeated_source = Off ; Production Value: On ;fatal_error_backtraces = On +; This directive controls whether PHP will print the actual arguments of a +; function upon an error. If this is off (or there was an error fetching the +; arguments), the function providing the error may optionally provide some +; additional information after the problem function's name. +;error_include_args = Off + ;;;;;;;;;;;;;;;;; ; Data Handling ; ;;;;;;;;;;;;;;;;; @@ -1305,10 +1311,9 @@ session.save_handler = files ; Strict session mode does not accept an uninitialized session ID, and ; regenerates the session ID if the browser sends an uninitialized session ID. ; Strict mode protects applications from session fixation via a session adoption -; vulnerability. It is disabled by default for maximum compatibility, but -; enabling it is encouraged. +; vulnerability. ; https://wiki.php.net/rfc/strict_sessions -session.use_strict_mode = 0 +session.use_strict_mode = 1 ; Whether to use cookies. ; https://php.net/session.use-cookies @@ -1350,13 +1355,13 @@ session.cookie_domain = ; Whether or not to add the httpOnly flag to the cookie, which makes it ; inaccessible to browser scripting languages such as JavaScript. ; https://php.net/session.cookie-httponly -session.cookie_httponly = +session.cookie_httponly = 1 ; Add SameSite attribute to cookie to help mitigate Cross-Site Request Forgery (CSRF/XSRF) ; Current valid values are "Strict", "Lax" or "None". When using "None", ; make sure to include the quotes, as `none` is interpreted like `false` in ini files. ; https://tools.ietf.org/html/draft-west-first-party-cookies-07 -session.cookie_samesite = +session.cookie_samesite = "Lax" ; Handler used to serialize data. php is the standard serializer of PHP. ; https://php.net/session.serialize-handler @@ -1386,13 +1391,6 @@ session.gc_divisor = 1000 ; https://php.net/session.gc-maxlifetime session.gc_maxlifetime = 1440 -; NOTE: If you are using the subdirectory option for storing session files -; (see session.save_path above), then garbage collection does *not* -; happen automatically. You will need to do your own garbage -; collection through a shell script, cron entry, or some other method. -; For example, the following script is the equivalent of setting -; session.gc_maxlifetime to 1440 (1440 seconds = 24 minutes): -; find /path/to/sessions -cmin +24 -type f | xargs rm ; Check HTTP Referer to invalidate externally stored URLs containing ids. ; HTTP_REFERER has to contain this substring for the session to be diff --git a/php.ini-production b/php.ini-production index 9aafad21e9c7..04a7b699dadd 100644 --- a/php.ini-production +++ b/php.ini-production @@ -613,6 +613,12 @@ ignore_repeated_source = Off ; Production Value: On ;fatal_error_backtraces = On +; This directive controls whether PHP will print the actual arguments of a +; function upon an error. If this is off (or there was an error fetching the +; arguments), the function providing the error may optionally provide some +; additional information after the problem function's name. +;error_include_args = Off + ;;;;;;;;;;;;;;;;; ; Data Handling ; ;;;;;;;;;;;;;;;;; @@ -1307,10 +1313,9 @@ session.save_handler = files ; Strict session mode does not accept an uninitialized session ID, and ; regenerates the session ID if the browser sends an uninitialized session ID. ; Strict mode protects applications from session fixation via a session adoption -; vulnerability. It is disabled by default for maximum compatibility, but -; enabling it is encouraged. +; vulnerability. ; https://wiki.php.net/rfc/strict_sessions -session.use_strict_mode = 0 +session.use_strict_mode = 1 ; Whether to use cookies. ; https://php.net/session.use-cookies @@ -1352,13 +1357,13 @@ session.cookie_domain = ; Whether or not to add the httpOnly flag to the cookie, which makes it ; inaccessible to browser scripting languages such as JavaScript. ; https://php.net/session.cookie-httponly -session.cookie_httponly = +session.cookie_httponly = 1 ; Add SameSite attribute to cookie to help mitigate Cross-Site Request Forgery (CSRF/XSRF) ; Current valid values are "Strict", "Lax" or "None". When using "None", ; make sure to include the quotes, as `none` is interpreted like `false` in ini files. ; https://tools.ietf.org/html/draft-west-first-party-cookies-07 -session.cookie_samesite = +session.cookie_samesite = "Lax" ; Handler used to serialize data. php is the standard serializer of PHP. ; https://php.net/session.serialize-handler @@ -1388,13 +1393,6 @@ session.gc_divisor = 1000 ; https://php.net/session.gc-maxlifetime session.gc_maxlifetime = 1440 -; NOTE: If you are using the subdirectory option for storing session files -; (see session.save_path above), then garbage collection does *not* -; happen automatically. You will need to do your own garbage -; collection through a shell script, cron entry, or some other method. -; For example, the following script is the equivalent of setting -; session.gc_maxlifetime to 1440 (1440 seconds = 24 minutes): -; find /path/to/sessions -cmin +24 -type f | xargs rm ; Check HTTP Referer to invalidate externally stored URLs containing ids. ; HTTP_REFERER has to contain this substring for the session to be diff --git a/run-extra-tests.php b/run-extra-tests.php index 725f2b58c373..16dfac69d13a 100755 --- a/run-extra-tests.php +++ b/run-extra-tests.php @@ -2,15 +2,13 @@ . | + | | + | SPDX-License-Identifier: BSD-3-Clause | +----------------------------------------------------------------------+ */ diff --git a/run-tests.php b/run-tests.php index 68d2cb69256d..f5c7be8b4f45 100755 --- a/run-tests.php +++ b/run-tests.php @@ -2,15 +2,13 @@ . | + | | + | SPDX-License-Identifier: BSD-3-Clause | +----------------------------------------------------------------------+ | Authors: Ilia Alshanetsky | | Preston L. Bannister | @@ -275,6 +273,7 @@ function main(): void 'fatal_error_backtraces=Off', 'display_errors=1', 'display_startup_errors=1', + 'error_include_args=0', 'log_errors=0', 'html_errors=0', 'track_errors=0', @@ -304,6 +303,7 @@ function main(): void 'zend.exception_ignore_args=0', 'zend.exception_string_param_max_len=15', 'short_open_tag=0', + 'date.timezone=UTC', ]; $no_file_cache = '-d opcache.file_cache= -d opcache.file_cache_only=0'; diff --git a/sapi/apache2handler/apache_config.c b/sapi/apache2handler/apache_config.c index a31ba68f9281..1f9447e62938 100644 --- a/sapi/apache2handler/apache_config.c +++ b/sapi/apache2handler/apache_config.c @@ -1,14 +1,12 @@ /* +----------------------------------------------------------------------+ - | Copyright (c) The PHP Group | + | Copyright © The PHP Group and Contributors. | +----------------------------------------------------------------------+ - | This source file is subject to version 3.01 of the PHP license, | - | that is bundled with this package in the file LICENSE, and is | - | available through the world-wide-web at the following url: | - | https://www.php.net/license/3_01.txt | - | If you did not receive a copy of the PHP license and are unable to | - | obtain it through the world-wide-web, please send a note to | - | license@php.net so we can mail you a copy immediately. | + | This source file is subject to the Modified BSD License that is | + | bundled with this package in the file LICENSE, and is available | + | through the World Wide Web at . | + | | + | SPDX-License-Identifier: BSD-3-Clause | +----------------------------------------------------------------------+ | Author: Sascha Schumann | +----------------------------------------------------------------------+ diff --git a/sapi/apache2handler/config.m4 b/sapi/apache2handler/config.m4 index e335721f19e9..3001a4d61d9a 100644 --- a/sapi/apache2handler/config.m4 +++ b/sapi/apache2handler/config.m4 @@ -6,6 +6,15 @@ PHP_ARG_WITH([apxs2], [no], [no]) +PHP_ARG_ENABLE([apache2-conf], + [whether to activate the PHP module in Apache httpd.conf via apxs], + [AS_HELP_STRING([--disable-apache2-conf], + [Do not activate the PHP module in the Apache httpd.conf during installation + via apxs. Useful when installing into a staging directory or when Apache + configuration is managed separately (e.g., via a2enmod).])], + [yes], + [no]) + if test "$PHP_APXS2" != "no"; then AS_VAR_IF([PHP_APXS2], [yes], [ APXS=apxs @@ -69,7 +78,7 @@ if test "$PHP_APXS2" != "no"; then [AC_MSG_ERROR([Please note that Apache version >= 2.4 is required])]) APXS_LIBEXECDIR='$(INSTALL_ROOT)'$($APXS -q LIBEXECDIR) - if test -z $($APXS -q SYSCONFDIR); then + if test -z $($APXS -q SYSCONFDIR) || test "$PHP_APACHE2_CONF" = "no"; then INSTALL_IT="\$(mkinstalldirs) '$APXS_LIBEXECDIR' && \ $APXS -S LIBEXECDIR='$APXS_LIBEXECDIR' \ -i -n php" diff --git a/sapi/apache2handler/mod_php.c b/sapi/apache2handler/mod_php.c index c7308fe2df60..9228b3ec049c 100644 --- a/sapi/apache2handler/mod_php.c +++ b/sapi/apache2handler/mod_php.c @@ -1,14 +1,12 @@ /* +----------------------------------------------------------------------+ - | Copyright (c) The PHP Group | + | Copyright © The PHP Group and Contributors. | +----------------------------------------------------------------------+ - | This source file is subject to version 3.01 of the PHP license, | - | that is bundled with this package in the file LICENSE, and is | - | available through the world-wide-web at the following url: | - | https://www.php.net/license/3_01.txt | - | If you did not receive a copy of the PHP license and are unable to | - | obtain it through the world-wide-web, please send a note to | - | license@php.net so we can mail you a copy immediately. | + | This source file is subject to the Modified BSD License that is | + | bundled with this package in the file LICENSE, and is available | + | through the World Wide Web at . | + | | + | SPDX-License-Identifier: BSD-3-Clause | +----------------------------------------------------------------------+ | Authors: Sascha Schumann | | Parts based on Apache 1.3 SAPI module by | diff --git a/sapi/apache2handler/php_apache.h b/sapi/apache2handler/php_apache.h index c49dd2970880..18b4e5a75910 100644 --- a/sapi/apache2handler/php_apache.h +++ b/sapi/apache2handler/php_apache.h @@ -1,14 +1,12 @@ /* +----------------------------------------------------------------------+ - | Copyright (c) The PHP Group | + | Copyright © The PHP Group and Contributors. | +----------------------------------------------------------------------+ - | This source file is subject to version 3.01 of the PHP license, | - | that is bundled with this package in the file LICENSE, and is | - | available through the world-wide-web at the following url: | - | https://www.php.net/license/3_01.txt | - | If you did not receive a copy of the PHP license and are unable to | - | obtain it through the world-wide-web, please send a note to | - | license@php.net so we can mail you a copy immediately. | + | This source file is subject to the Modified BSD License that is | + | bundled with this package in the file LICENSE, and is available | + | through the World Wide Web at . | + | | + | SPDX-License-Identifier: BSD-3-Clause | +----------------------------------------------------------------------+ | Author: Sascha Schumann | +----------------------------------------------------------------------+ diff --git a/sapi/apache2handler/php_functions.c b/sapi/apache2handler/php_functions.c index c2b15af86a60..1baa1f5225e0 100644 --- a/sapi/apache2handler/php_functions.c +++ b/sapi/apache2handler/php_functions.c @@ -1,14 +1,12 @@ /* +----------------------------------------------------------------------+ - | Copyright (c) The PHP Group | + | Copyright © The PHP Group and Contributors. | +----------------------------------------------------------------------+ - | This source file is subject to version 3.01 of the PHP license, | - | that is bundled with this package in the file LICENSE, and is | - | available through the world-wide-web at the following url: | - | https://www.php.net/license/3_01.txt | - | If you did not receive a copy of the PHP license and are unable to | - | obtain it through the world-wide-web, please send a note to | - | license@php.net so we can mail you a copy immediately. | + | This source file is subject to the Modified BSD License that is | + | bundled with this package in the file LICENSE, and is available | + | through the World Wide Web at . | + | | + | SPDX-License-Identifier: BSD-3-Clause | +----------------------------------------------------------------------+ | Author: Sascha Schumann | +----------------------------------------------------------------------+ @@ -179,10 +177,10 @@ PHP_FUNCTION(apache_request_headers) ctx = SG(server_context); arr = apr_table_elts(ctx->r->headers_in); - APR_ARRAY_FOREACH_OPEN(arr, key, val) + APR_ARRAY_FOREACH_OPEN(arr, key, val) { if (!val) val = ""; add_assoc_string(return_value, key, val); - APR_ARRAY_FOREACH_CLOSE() + } APR_ARRAY_FOREACH_CLOSE(); } /* }}} */ @@ -200,10 +198,10 @@ PHP_FUNCTION(apache_response_headers) ctx = SG(server_context); arr = apr_table_elts(ctx->r->headers_out); - APR_ARRAY_FOREACH_OPEN(arr, key, val) + APR_ARRAY_FOREACH_OPEN(arr, key, val) { if (!val) val = ""; add_assoc_string(return_value, key, val); - APR_ARRAY_FOREACH_CLOSE() + } APR_ARRAY_FOREACH_CLOSE(); } /* }}} */ @@ -411,12 +409,12 @@ PHP_MINFO_FUNCTION(apache) SECTION("Apache Environment"); php_info_print_table_start(); php_info_print_table_header(2, "Variable", "Value"); - APR_ARRAY_FOREACH_OPEN(arr, key, val) + APR_ARRAY_FOREACH_OPEN(arr, key, val) { if (!val) { val = ""; } php_info_print_table_row(2, key, val); - APR_ARRAY_FOREACH_CLOSE() + } APR_ARRAY_FOREACH_CLOSE(); php_info_print_table_end(); @@ -426,21 +424,21 @@ PHP_MINFO_FUNCTION(apache) php_info_print_table_row(2, "HTTP Request", ((php_struct *) SG(server_context))->r->the_request); arr = apr_table_elts(((php_struct *) SG(server_context))->r->headers_in); - APR_ARRAY_FOREACH_OPEN(arr, key, val) + APR_ARRAY_FOREACH_OPEN(arr, key, val) { if (!val) { val = ""; } php_info_print_table_row(2, key, val); - APR_ARRAY_FOREACH_CLOSE() + } APR_ARRAY_FOREACH_CLOSE(); php_info_print_table_colspan_header(2, "HTTP Response Headers"); arr = apr_table_elts(((php_struct *) SG(server_context))->r->headers_out); - APR_ARRAY_FOREACH_OPEN(arr, key, val) + APR_ARRAY_FOREACH_OPEN(arr, key, val) { if (!val) { val = ""; } php_info_print_table_row(2, key, val); - APR_ARRAY_FOREACH_CLOSE() + } APR_ARRAY_FOREACH_CLOSE(); php_info_print_table_end(); } diff --git a/sapi/apache2handler/sapi_apache2.c b/sapi/apache2handler/sapi_apache2.c index 2387d24741a4..83b3f02fb743 100644 --- a/sapi/apache2handler/sapi_apache2.c +++ b/sapi/apache2handler/sapi_apache2.c @@ -1,14 +1,12 @@ /* +----------------------------------------------------------------------+ - | Copyright (c) The PHP Group | + | Copyright © The PHP Group and Contributors. | +----------------------------------------------------------------------+ - | This source file is subject to version 3.01 of the PHP license, | - | that is bundled with this package in the file LICENSE, and is | - | available through the world-wide-web at the following url: | - | https://www.php.net/license/3_01.txt | - | If you did not receive a copy of the PHP license and are unable to | - | obtain it through the world-wide-web, please send a note to | - | license@php.net so we can mail you a copy immediately. | + | This source file is subject to the Modified BSD License that is | + | bundled with this package in the file LICENSE, and is available | + | through the World Wide Web at . | + | | + | SPDX-License-Identifier: BSD-3-Clause | +----------------------------------------------------------------------+ | Authors: Sascha Schumann | | Parts based on Apache 1.3 SAPI module by | @@ -269,14 +267,14 @@ php_apache_sapi_register_variables(zval *track_vars_array) char *key, *val; size_t new_val_len; - APR_ARRAY_FOREACH_OPEN(arr, key, val) + APR_ARRAY_FOREACH_OPEN(arr, key, val) { if (!val) { val = ""; } if (sapi_module.input_filter(PARSE_SERVER, key, &val, strlen(val), &new_val_len)) { php_register_variable_safe(key, val, new_val_len, track_vars_array); } - APR_ARRAY_FOREACH_CLOSE() + } APR_ARRAY_FOREACH_CLOSE(); if (sapi_module.input_filter(PARSE_SERVER, "PHP_SELF", &ctx->r->uri, strlen(ctx->r->uri), &new_val_len)) { php_register_variable_safe("PHP_SELF", ctx->r->uri, new_val_len, track_vars_array); diff --git a/sapi/cgi/cgi_main.c b/sapi/cgi/cgi_main.c index 213870db54f1..f49507827e2d 100644 --- a/sapi/cgi/cgi_main.c +++ b/sapi/cgi/cgi_main.c @@ -1,14 +1,12 @@ /* +----------------------------------------------------------------------+ - | Copyright (c) The PHP Group | + | Copyright © The PHP Group and Contributors. | +----------------------------------------------------------------------+ - | This source file is subject to version 3.01 of the PHP license, | - | that is bundled with this package in the file LICENSE, and is | - | available through the world-wide-web at the following url: | - | https://www.php.net/license/3_01.txt | - | If you did not receive a copy of the PHP license and are unable to | - | obtain it through the world-wide-web, please send a note to | - | license@php.net so we can mail you a copy immediately. | + | This source file is subject to the Modified BSD License that is | + | bundled with this package in the file LICENSE, and is available | + | through the World Wide Web at . | + | | + | SPDX-License-Identifier: BSD-3-Clause | +----------------------------------------------------------------------+ | Authors: Rasmus Lerdorf | | Stig Bakken | diff --git a/sapi/cgi/tests/001.phpt b/sapi/cgi/tests/001.phpt index c990a77efaee..00fc656f75bc 100644 --- a/sapi/cgi/tests/001.phpt +++ b/sapi/cgi/tests/001.phpt @@ -16,6 +16,6 @@ echo "Done\n"; ?> --EXPECTF-- string(%d) "PHP %s (cgi%s (built: %s -Copyright (c) The PHP Group -%AZend Engine v%s, Copyright (c) Zend Technologies%A" +Copyright © The PHP Group and Contributors +%AZend Engine v%s, Copyright © Zend by Perforce%A" Done diff --git a/sapi/cli/cli.h b/sapi/cli/cli.h index 85b55af3845d..2f6ef95052ce 100644 --- a/sapi/cli/cli.h +++ b/sapi/cli/cli.h @@ -1,14 +1,12 @@ /* +----------------------------------------------------------------------+ - | Copyright (c) The PHP Group | + | Copyright © The PHP Group and Contributors. | +----------------------------------------------------------------------+ - | This source file is subject to version 3.01 of the PHP license, | - | that is bundled with this package in the file LICENSE, and is | - | available through the world-wide-web at the following url: | - | https://www.php.net/license/3_01.txt | - | If you did not receive a copy of the PHP license and are unable to | - | obtain it through the world-wide-web, please send a note to | - | license@php.net so we can mail you a copy immediately. | + | This source file is subject to the Modified BSD License that is | + | bundled with this package in the file LICENSE, and is available | + | through the World Wide Web at . | + | | + | SPDX-License-Identifier: BSD-3-Clause | +----------------------------------------------------------------------+ | Author: Johannes Schlueter | +----------------------------------------------------------------------+ diff --git a/sapi/cli/generate_mime_type_map.php b/sapi/cli/generate_mime_type_map.php index c48766b0a3e5..d1a841268a97 100755 --- a/sapi/cli/generate_mime_type_map.php +++ b/sapi/cli/generate_mime_type_map.php @@ -57,15 +57,13 @@ echo <<
. | + | | + | SPDX-License-Identifier: BSD-3-Clause | +----------------------------------------------------------------------+ | Author: Moriyoshi Koizumi | +----------------------------------------------------------------------+ diff --git a/sapi/cli/mime_type_map.h b/sapi/cli/mime_type_map.h index 505ae862d054..689e522dbaea 100644 --- a/sapi/cli/mime_type_map.h +++ b/sapi/cli/mime_type_map.h @@ -1,14 +1,12 @@ /* +----------------------------------------------------------------------+ - | Copyright (c) The PHP Group | + | Copyright © The PHP Group and Contributors. | +----------------------------------------------------------------------+ - | This source file is subject to version 3.01 of the PHP license, | - | that is bundled with this package in the file LICENSE, and is | - | available through the world-wide-web at the following url: | - | https://www.php.net/license/3_01.txt | - | If you did not receive a copy of the PHP license and are unable to | - | obtain it through the world-wide-web, please send a note to | - | license@php.net so we can mail you a copy immediately. | + | This source file is subject to the Modified BSD License that is | + | bundled with this package in the file LICENSE, and is available | + | through the World Wide Web at . | + | | + | SPDX-License-Identifier: BSD-3-Clause | +----------------------------------------------------------------------+ | Author: Moriyoshi Koizumi | +----------------------------------------------------------------------+ diff --git a/sapi/cli/php.1.in b/sapi/cli/php.1.in index 797ef3242b6a..30626015ce77 100644 --- a/sapi/cli/php.1.in +++ b/sapi/cli/php.1.in @@ -456,17 +456,9 @@ contributors all around the world. .SH VERSION INFORMATION This manpage describes \fBphp\fP, version @PHP_VERSION@. .SH COPYRIGHT -Copyright \(co The PHP Group +Copyright \(co The PHP Group and Contributors .LP -This source file is subject to version 3.01 of the PHP license, -that is bundled with this package in the file LICENSE, and is -available through the world-wide-web at the following url: -.PD 0 -.P -.B https://www.php.net/license/3_01.txt -.PD 1 -.P -If you did not receive a copy of the PHP license and are unable to -obtain it through the world-wide-web, please send a note to -.B license@php.net -so we can mail you a copy immediately. +This source file is subject to the Modified BSD License that is +bundled with this package in the file LICENSE, and is available +through the World Wide Web at +.B https://www.php.net/license/ diff --git a/sapi/cli/php_cli.c b/sapi/cli/php_cli.c index d1781eab671c..9a05f8e68547 100644 --- a/sapi/cli/php_cli.c +++ b/sapi/cli/php_cli.c @@ -1,14 +1,12 @@ /* +----------------------------------------------------------------------+ - | Copyright (c) The PHP Group | + | Copyright © The PHP Group and Contributors. | +----------------------------------------------------------------------+ - | This source file is subject to version 3.01 of the PHP license, | - | that is bundled with this package in the file LICENSE, and is | - | available through the world-wide-web at the following url: | - | https://www.php.net/license/3_01.txt | - | If you did not receive a copy of the PHP license and are unable to | - | obtain it through the world-wide-web, please send a note to | - | license@php.net so we can mail you a copy immediately. | + | This source file is subject to the Modified BSD License that is | + | bundled with this package in the file LICENSE, and is available | + | through the World Wide Web at . | + | | + | SPDX-License-Identifier: BSD-3-Clause | +----------------------------------------------------------------------+ | Author: Edin Kadribasic | | Marcus Boerger | @@ -1056,13 +1054,25 @@ static int do_cli(int argc, char **argv) /* {{{ */ } ZVAL_STRING(&arg, reflection_what); - object_init_ex(&ref, pce); memset(&execute_data, 0, sizeof(zend_execute_data)); execute_data.func = (zend_function *) &zend_pass_function; EG(current_execute_data) = &execute_data; - zend_call_known_instance_method_with_1_params( - pce->constructor, Z_OBJ(ref), NULL, &arg); + // Avoid deprecation warnings from ReflectionMethod::__construct() + // with one argument + if (pce == reflection_method_ptr) { + zend_function *create_from_method = zend_hash_str_find_ptr( + &(pce->function_table), + "createfrommethodname", + strlen( "createFromMethodName" ) + ); + zend_call_known_function( + create_from_method, NULL, pce, &ref, 1, &arg, NULL); + } else { + object_init_ex(&ref, pce); + zend_call_known_instance_method_with_1_params( + pce->constructor, Z_OBJ(ref), NULL, &arg); + } if (EG(exception)) { zval rv; diff --git a/sapi/cli/php_cli_process_title.c b/sapi/cli/php_cli_process_title.c index e6740576f6aa..5f682cb4cc93 100644 --- a/sapi/cli/php_cli_process_title.c +++ b/sapi/cli/php_cli_process_title.c @@ -1,14 +1,12 @@ /* +----------------------------------------------------------------------+ - | Copyright (c) The PHP Group | + | Copyright © The PHP Group and Contributors. | +----------------------------------------------------------------------+ - | This source file is subject to version 3.01 of the PHP license, | - | that is bundled with this package in the file LICENSE, and is | - | available through the world-wide-web at the following url: | - | https://www.php.net/license/3_01.txt | - | If you did not receive a copy of the PHP license and are unable to | - | obtain it through the world-wide-web, please send a note to | - | license@php.net so we can mail you a copy immediately. | + | This source file is subject to the Modified BSD License that is | + | bundled with this package in the file LICENSE, and is available | + | through the World Wide Web at . | + | | + | SPDX-License-Identifier: BSD-3-Clause | +----------------------------------------------------------------------+ | Author: Keyur Govande (kgovande@gmail.com) | +----------------------------------------------------------------------+ diff --git a/sapi/cli/php_cli_process_title.h b/sapi/cli/php_cli_process_title.h index 9527b4b4b6d4..3cb8c8b46162 100644 --- a/sapi/cli/php_cli_process_title.h +++ b/sapi/cli/php_cli_process_title.h @@ -1,14 +1,12 @@ /* +----------------------------------------------------------------------+ - | Copyright (c) The PHP Group | + | Copyright © The PHP Group and Contributors. | +----------------------------------------------------------------------+ - | This source file is subject to version 3.01 of the PHP license, | - | that is bundled with this package in the file LICENSE, and is | - | available through the world-wide-web at the following url: | - | https://www.php.net/license/3_01.txt | - | If you did not receive a copy of the PHP license and are unable to | - | obtain it through the world-wide-web, please send a note to | - | license@php.net so we can mail you a copy immediately. | + | This source file is subject to the Modified BSD License that is | + | bundled with this package in the file LICENSE, and is available | + | through the World Wide Web at . | + | | + | SPDX-License-Identifier: BSD-3-Clause | +----------------------------------------------------------------------+ | Author: Keyur Govande (kgovande@gmail.com) | +----------------------------------------------------------------------+ diff --git a/sapi/cli/php_cli_server.c b/sapi/cli/php_cli_server.c index 65d6d5a898de..797979b67305 100644 --- a/sapi/cli/php_cli_server.c +++ b/sapi/cli/php_cli_server.c @@ -1,14 +1,12 @@ /* +----------------------------------------------------------------------+ - | Copyright (c) The PHP Group | + | Copyright © The PHP Group and Contributors. | +----------------------------------------------------------------------+ - | This source file is subject to version 3.01 of the PHP license, | - | that is bundled with this package in the file LICENSE, and is | - | available through the world-wide-web at the following url: | - | https://www.php.net/license/3_01.txt | - | If you did not receive a copy of the PHP license and are unable to | - | obtain it through the world-wide-web, please send a note to | - | license@php.net so we can mail you a copy immediately. | + | This source file is subject to the Modified BSD License that is | + | bundled with this package in the file LICENSE, and is available | + | through the World Wide Web at . | + | | + | SPDX-License-Identifier: BSD-3-Clause | +----------------------------------------------------------------------+ | Author: Moriyoshi Koizumi | | Xinchen Hui | @@ -653,7 +651,7 @@ static int sapi_cli_server_register_entry_cb(zval *entry, int num_args, va_list if (key[i] == '-') { key[i] = '_'; } else { - key[i] = toupper(key[i]); + key[i] = toupper((unsigned char)key[i]); } } spprintf(&real_key, 0, "%s_%s", "HTTP", key); @@ -2648,7 +2646,7 @@ static zend_result php_cli_server_recv_event_read_request(php_cli_server *server case 0: php_cli_server_poller_add(&server->poller, POLLIN, client->sock); return SUCCESS; - EMPTY_SWITCH_DEFAULT_CASE(); + default: ZEND_UNREACHABLE(); } /* Under ASAN the compiler somehow doesn't realise that the switch block always returns */ return FAILURE; diff --git a/sapi/cli/php_cli_server.h b/sapi/cli/php_cli_server.h index 2440a5b59996..6477ab180fb2 100644 --- a/sapi/cli/php_cli_server.h +++ b/sapi/cli/php_cli_server.h @@ -1,14 +1,12 @@ /* +----------------------------------------------------------------------+ - | Copyright (c) The PHP Group | + | Copyright © The PHP Group and Contributors. | +----------------------------------------------------------------------+ - | This source file is subject to version 3.01 of the PHP license, | - | that is bundled with this package in the file LICENSE, and is | - | available through the world-wide-web at the following url: | - | https://www.php.net/license/3_01.txt | - | If you did not receive a copy of the PHP license and are unable to | - | obtain it through the world-wide-web, please send a note to | - | license@php.net so we can mail you a copy immediately. | + | This source file is subject to the Modified BSD License that is | + | bundled with this package in the file LICENSE, and is available | + | through the World Wide Web at . | + | | + | SPDX-License-Identifier: BSD-3-Clause | +----------------------------------------------------------------------+ | Author: Moriyoshi Koizumi | +----------------------------------------------------------------------+ diff --git a/sapi/cli/ps_title.h b/sapi/cli/ps_title.h index 7436c2b25a94..99c9a290ee54 100644 --- a/sapi/cli/ps_title.h +++ b/sapi/cli/ps_title.h @@ -1,14 +1,12 @@ /* +----------------------------------------------------------------------+ - | Copyright (c) The PHP Group | + | Copyright © The PHP Group and Contributors. | +----------------------------------------------------------------------+ - | This source file is subject to version 3.01 of the PHP license, | - | that is bundled with this package in the file LICENSE, and is | - | available through the world-wide-web at the following url: | - | https://www.php.net/license/3_01.txt | - | If you did not receive a copy of the PHP license and are unable to | - | obtain it through the world-wide-web, please send a note to | - | license@php.net so we can mail you a copy immediately. | + | This source file is subject to the Modified BSD License that is | + | bundled with this package in the file LICENSE, and is available | + | through the World Wide Web at . | + | | + | SPDX-License-Identifier: BSD-3-Clause | +----------------------------------------------------------------------+ | Authors: Keyur Govande | +----------------------------------------------------------------------+ diff --git a/sapi/cli/tests/001.phpt b/sapi/cli/tests/001.phpt index bb85ad434357..8038c3e78b76 100644 --- a/sapi/cli/tests/001.phpt +++ b/sapi/cli/tests/001.phpt @@ -13,6 +13,6 @@ echo "Done\n"; ?> --EXPECTF-- string(%d) "PHP %s (cli) (built: %s)%s -Copyright (c) The PHP Group -%AZend Engine v%s, Copyright (c) Zend Technologies%A" +Copyright © The PHP Group and Contributors +%AZend Engine v%s, Copyright © Zend by Perforce%A" Done diff --git a/sapi/cli/tests/004.phpt b/sapi/cli/tests/004.phpt index c88b85480bdb..b6e0e74fa6ff 100644 --- a/sapi/cli/tests/004.phpt +++ b/sapi/cli/tests/004.phpt @@ -12,6 +12,9 @@ $php = getenv('TEST_PHP_EXECUTABLE_ESCAPED'); var_dump(shell_exec("$php -n --rf unknown")); var_dump(shell_exec("$php -n --rf echo")); var_dump(shell_exec("$php -n --rf phpinfo")); +// Regression tests for https://github.com/php/php-src/issues/21754 +var_dump(shell_exec("$php -n --rf ReflectionMethod::__construct")); +var_dump(shell_exec("$php -n --rf ReflectionMethod::missing")); echo "Done\n"; ?> @@ -28,5 +31,16 @@ string(155) "Function [ function phpinfo ] { - Return [ true ] } +" +string(213) "Method [ public method __construct ] { + + - Parameters [2] { + Parameter #0 [ object|string $objectOrMethod ] + Parameter #1 [ ?string $method = null ] + } +} + +" +string(61) "Exception: Method ReflectionMethod::missing() does not exist " Done diff --git a/sapi/cli/tests/019.phpt b/sapi/cli/tests/019.phpt index 481ea2228b34..4045c648ab0a 100644 --- a/sapi/cli/tests/019.phpt +++ b/sapi/cli/tests/019.phpt @@ -21,16 +21,38 @@ echo "\nDone\n"; phpinfo() PHP Version => %s %a -PHP License -This program is free software; you can redistribute it and/or modify -it under the terms of the PHP License as published by the PHP Group -and included in the distribution in the file: LICENSE +License -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +PHP is free software. You may redistribute it and/or modify it under the +terms of the Modified BSD License (SPDX-License-Identifier: BSD-3-Clause). -If you did not receive a copy of the PHP license, or have any -questions about PHP licensing, please contact license@php.net. +Copyright © The PHP Group and Contributors. +Copyright © Zend Technologies Ltd., a subsidiary company of + Perforce Software, Inc. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + +1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + +3. Neither the name of the copyright holder nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE +FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. Done diff --git a/sapi/cli/tests/bug80092.phpt b/sapi/cli/tests/bug80092.phpt index eac60e7e3778..a05620f1975d 100644 --- a/sapi/cli/tests/bug80092.phpt +++ b/sapi/cli/tests/bug80092.phpt @@ -41,6 +41,6 @@ foreach (explode("\n", $output) as $line) { --EXPECTF-- preloaded PHP %s -Copyright (c) The PHP Group +Copyright © The PHP Group and Contributors %AZend Engine %s %A with Zend OPcache %a diff --git a/sapi/cli/tests/gh21901.phpt b/sapi/cli/tests/gh21901.phpt new file mode 100644 index 000000000000..39c76913d1f8 --- /dev/null +++ b/sapi/cli/tests/gh21901.phpt @@ -0,0 +1,13 @@ +--TEST-- +Stale getopt() optional value in CLI +--FILE-- + +--EXPECTF-- +Configuration File (php.ini) Path: %s +Loaded Configuration File: %s +Scan for additional .ini files in: %s +Additional .ini files parsed: %s diff --git a/sapi/cli/tests/php_cli_server.inc b/sapi/cli/tests/php_cli_server.inc index 3022022f894e..3ad6ced5cb44 100644 --- a/sapi/cli/tests/php_cli_server.inc +++ b/sapi/cli/tests/php_cli_server.inc @@ -24,7 +24,8 @@ function php_cli_server_start( file_put_contents($doc_root . '/' . ($router ?: 'index.php'), ''); } - $cmd = [$php_executable, '-t', $doc_root, '-n', ...$cmd_args, '-S', 'localhost:0']; + // XXX: This should ideally use the same INI overrides as run-tests + $cmd = [$php_executable, '-d', 'error_include_args=0', '-t', $doc_root, '-n', ...$cmd_args, '-S', 'localhost:0']; if (!is_null($router)) { $cmd[] = $router; } diff --git a/sapi/cli/tests/sapi_windows_set_ctrl_trampoline.phpt b/sapi/cli/tests/sapi_windows_set_ctrl_trampoline.phpt new file mode 100644 index 000000000000..4699387b2c39 --- /dev/null +++ b/sapi/cli/tests/sapi_windows_set_ctrl_trampoline.phpt @@ -0,0 +1,31 @@ +--TEST-- +sapi_windows_set_ctrl_handler() trampoline test +--SKIPIF-- + +--FILE-- + +--EXPECT-- +Done diff --git a/sapi/embed/php_embed.c b/sapi/embed/php_embed.c index 06cd1fb0763b..75249f97fc87 100644 --- a/sapi/embed/php_embed.c +++ b/sapi/embed/php_embed.c @@ -1,14 +1,12 @@ /* +----------------------------------------------------------------------+ - | Copyright (c) The PHP Group | + | Copyright © The PHP Group and Contributors. | +----------------------------------------------------------------------+ - | This source file is subject to version 3.01 of the PHP license, | - | that is bundled with this package in the file LICENSE, and is | - | available through the world-wide-web at the following url: | - | https://www.php.net/license/3_01.txt | - | If you did not receive a copy of the PHP license and are unable to | - | obtain it through the world-wide-web, please send a note to | - | license@php.net so we can mail you a copy immediately. | + | This source file is subject to the Modified BSD License that is | + | bundled with this package in the file LICENSE, and is available | + | through the World Wide Web at . | + | | + | SPDX-License-Identifier: BSD-3-Clause | +----------------------------------------------------------------------+ | Author: Edin Kadribasic | +----------------------------------------------------------------------+ diff --git a/sapi/embed/php_embed.h b/sapi/embed/php_embed.h index 3a4844629dea..9cd582a939a5 100644 --- a/sapi/embed/php_embed.h +++ b/sapi/embed/php_embed.h @@ -1,14 +1,12 @@ /* +----------------------------------------------------------------------+ - | Copyright (c) The PHP Group | + | Copyright © The PHP Group and Contributors. | +----------------------------------------------------------------------+ - | This source file is subject to version 3.01 of the PHP license, | - | that is bundled with this package in the file LICENSE, and is | - | available through the world-wide-web at the following url: | - | https://www.php.net/license/3_01.txt | - | If you did not receive a copy of the PHP license and are unable to | - | obtain it through the world-wide-web, please send a note to | - | license@php.net so we can mail you a copy immediately. | + | This source file is subject to the Modified BSD License that is | + | bundled with this package in the file LICENSE, and is available | + | through the World Wide Web at . | + | | + | SPDX-License-Identifier: BSD-3-Clause | +----------------------------------------------------------------------+ | Author: Edin Kadribasic | +----------------------------------------------------------------------+ diff --git a/sapi/fpm/config.m4 b/sapi/fpm/config.m4 index 4d4952eee86e..89c53a0c4d28 100644 --- a/sapi/fpm/config.m4 +++ b/sapi/fpm/config.m4 @@ -262,100 +262,16 @@ AS_VAR_IF([php_cv_have_SO_LISTENQLEN], [yes], [Define to 1 if you have 'SO_LISTENQ*'.])]) ]) -AC_DEFUN([PHP_FPM_KQUEUE], -[AC_CACHE_CHECK([for kqueue], - [php_cv_have_kqueue], - [AC_COMPILE_IFELSE([AC_LANG_PROGRAM([dnl - #include - #include - #include - ], [dnl - int kfd; - struct kevent k; - kfd = kqueue(); - /* 0 -> STDIN_FILENO */ - EV_SET(&k, 0, EVFILT_READ , EV_ADD | EV_CLEAR, 0, 0, NULL); - (void)kfd; - ])], - [php_cv_have_kqueue=yes], - [php_cv_have_kqueue=no])]) -AS_VAR_IF([php_cv_have_kqueue], [yes], - [AC_DEFINE([HAVE_KQUEUE], [1], - [Define to 1 if system has a working 'kqueue' function.])]) -]) - -AC_DEFUN([PHP_FPM_EPOLL], -[AC_CACHE_CHECK([for epoll], - [php_cv_have_epoll], - [AC_COMPILE_IFELSE([AC_LANG_PROGRAM([#include ], [dnl - int epollfd; - struct epoll_event e; - - epollfd = epoll_create(1); - if (epollfd < 0) { - return 1; - } - - e.events = EPOLLIN | EPOLLET; - e.data.fd = 0; - - if (epoll_ctl(epollfd, EPOLL_CTL_ADD, 0, &e) == -1) { - return 1; - } - - e.events = 0; - if (epoll_wait(epollfd, &e, 1, 1) < 0) { - return 1; - } - ])], - [php_cv_have_epoll=yes], - [php_cv_have_epoll=no])]) -AS_VAR_IF([php_cv_have_epoll], [yes], - [AC_DEFINE([HAVE_EPOLL], [1], [Define to 1 if system has a working epoll.])]) -]) - -AC_DEFUN([PHP_FPM_SELECT], -[AC_CACHE_CHECK([for select], - [php_cv_have_select], - [AC_COMPILE_IFELSE([AC_LANG_PROGRAM([dnl - /* According to POSIX.1-2001 */ - #include - - /* According to earlier standards */ - #include - #include - #include - ], [dnl - fd_set fds; - struct timeval t; - t.tv_sec = 0; - t.tv_usec = 42; - FD_ZERO(&fds); - /* 0 -> STDIN_FILENO */ - FD_SET(0, &fds); - select(FD_SETSIZE, &fds, NULL, NULL, &t); - ])], - [php_cv_have_select=yes], - [php_cv_have_select=no])]) -AS_VAR_IF([php_cv_have_select], [yes], - [AC_DEFINE([HAVE_SELECT], [1], - [Define to 1 if system has a working 'select' function.])]) -]) - if test "$PHP_FPM" != "no"; then PHP_FPM_CLOCK PHP_FPM_TRACE PHP_FPM_BUILTIN_ATOMIC PHP_FPM_LQ - PHP_FPM_KQUEUE - PHP_FPM_EPOLL - PHP_FPM_SELECT AC_CHECK_FUNCS([clearenv setproctitle setproctitle_fast]) AC_CHECK_HEADER([priv.h], [AC_CHECK_FUNCS([setpflags])]) AC_CHECK_HEADER([sys/times.h], [AC_CHECK_FUNCS([times])]) - AC_CHECK_HEADER([port.h], [AC_CHECK_FUNCS([port_create])]) PHP_ARG_WITH([fpm-user],, [AS_HELP_STRING([[--with-fpm-user[=USER]]], diff --git a/sapi/fpm/fpm/events/epoll.c b/sapi/fpm/fpm/events/epoll.c index 0a6eadb6aebe..2de3b463ae59 100644 --- a/sapi/fpm/fpm/events/epoll.c +++ b/sapi/fpm/fpm/events/epoll.c @@ -1,14 +1,12 @@ /* +----------------------------------------------------------------------+ - | Copyright (c) The PHP Group | + | Copyright © The PHP Group and Contributors. | +----------------------------------------------------------------------+ - | This source file is subject to version 3.01 of the PHP license, | - | that is bundled with this package in the file LICENSE, and is | - | available through the world-wide-web at the following url: | - | https://www.php.net/license/3_01.txt | - | If you did not receive a copy of the PHP license and are unable to | - | obtain it through the world-wide-web, please send a note to | - | license@php.net so we can mail you a copy immediately. | + | This source file is subject to the Modified BSD License that is | + | bundled with this package in the file LICENSE, and is available | + | through the World Wide Web at . | + | | + | SPDX-License-Identifier: BSD-3-Clause | +----------------------------------------------------------------------+ | Authors: Jerome Loyet | +----------------------------------------------------------------------+ diff --git a/sapi/fpm/fpm/events/epoll.h b/sapi/fpm/fpm/events/epoll.h index f20480c687c2..8b3d1867c0b1 100644 --- a/sapi/fpm/fpm/events/epoll.h +++ b/sapi/fpm/fpm/events/epoll.h @@ -1,14 +1,12 @@ /* +----------------------------------------------------------------------+ - | Copyright (c) The PHP Group | + | Copyright © The PHP Group and Contributors. | +----------------------------------------------------------------------+ - | This source file is subject to version 3.01 of the PHP license, | - | that is bundled with this package in the file LICENSE, and is | - | available through the world-wide-web at the following url: | - | https://www.php.net/license/3_01.txt | - | If you did not receive a copy of the PHP license and are unable to | - | obtain it through the world-wide-web, please send a note to | - | license@php.net so we can mail you a copy immediately. | + | This source file is subject to the Modified BSD License that is | + | bundled with this package in the file LICENSE, and is available | + | through the World Wide Web at . | + | | + | SPDX-License-Identifier: BSD-3-Clause | +----------------------------------------------------------------------+ | Authors: Jerome Loyet | +----------------------------------------------------------------------+ diff --git a/sapi/fpm/fpm/events/kqueue.c b/sapi/fpm/fpm/events/kqueue.c index 21939d341418..22b9d1a8d3ab 100644 --- a/sapi/fpm/fpm/events/kqueue.c +++ b/sapi/fpm/fpm/events/kqueue.c @@ -1,14 +1,12 @@ /* +----------------------------------------------------------------------+ - | Copyright (c) The PHP Group | + | Copyright © The PHP Group and Contributors. | +----------------------------------------------------------------------+ - | This source file is subject to version 3.01 of the PHP license, | - | that is bundled with this package in the file LICENSE, and is | - | available through the world-wide-web at the following url: | - | https://www.php.net/license/3_01.txt | - | If you did not receive a copy of the PHP license and are unable to | - | obtain it through the world-wide-web, please send a note to | - | license@php.net so we can mail you a copy immediately. | + | This source file is subject to the Modified BSD License that is | + | bundled with this package in the file LICENSE, and is available | + | through the World Wide Web at . | + | | + | SPDX-License-Identifier: BSD-3-Clause | +----------------------------------------------------------------------+ | Authors: Jerome Loyet | +----------------------------------------------------------------------+ diff --git a/sapi/fpm/fpm/events/kqueue.h b/sapi/fpm/fpm/events/kqueue.h index 1f68d44369ba..4690b065dfce 100644 --- a/sapi/fpm/fpm/events/kqueue.h +++ b/sapi/fpm/fpm/events/kqueue.h @@ -1,14 +1,12 @@ /* +----------------------------------------------------------------------+ - | Copyright (c) The PHP Group | + | Copyright © The PHP Group and Contributors. | +----------------------------------------------------------------------+ - | This source file is subject to version 3.01 of the PHP license, | - | that is bundled with this package in the file LICENSE, and is | - | available through the world-wide-web at the following url: | - | https://www.php.net/license/3_01.txt | - | If you did not receive a copy of the PHP license and are unable to | - | obtain it through the world-wide-web, please send a note to | - | license@php.net so we can mail you a copy immediately. | + | This source file is subject to the Modified BSD License that is | + | bundled with this package in the file LICENSE, and is available | + | through the World Wide Web at . | + | | + | SPDX-License-Identifier: BSD-3-Clause | +----------------------------------------------------------------------+ | Authors: Jerome Loyet | +----------------------------------------------------------------------+ diff --git a/sapi/fpm/fpm/events/poll.c b/sapi/fpm/fpm/events/poll.c index 30ebbc785d94..10085e83faa8 100644 --- a/sapi/fpm/fpm/events/poll.c +++ b/sapi/fpm/fpm/events/poll.c @@ -1,14 +1,12 @@ /* +----------------------------------------------------------------------+ - | Copyright (c) The PHP Group | + | Copyright © The PHP Group and Contributors. | +----------------------------------------------------------------------+ - | This source file is subject to version 3.01 of the PHP license, | - | that is bundled with this package in the file LICENSE, and is | - | available through the world-wide-web at the following url: | - | https://www.php.net/license/3_01.txt | - | If you did not receive a copy of the PHP license and are unable to | - | obtain it through the world-wide-web, please send a note to | - | license@php.net so we can mail you a copy immediately. | + | This source file is subject to the Modified BSD License that is | + | bundled with this package in the file LICENSE, and is available | + | through the World Wide Web at . | + | | + | SPDX-License-Identifier: BSD-3-Clause | +----------------------------------------------------------------------+ | Authors: Jerome Loyet | +----------------------------------------------------------------------+ diff --git a/sapi/fpm/fpm/events/poll.h b/sapi/fpm/fpm/events/poll.h index d9859160985c..24fa512eda9e 100644 --- a/sapi/fpm/fpm/events/poll.h +++ b/sapi/fpm/fpm/events/poll.h @@ -1,14 +1,12 @@ /* +----------------------------------------------------------------------+ - | Copyright (c) The PHP Group | + | Copyright © The PHP Group and Contributors. | +----------------------------------------------------------------------+ - | This source file is subject to version 3.01 of the PHP license, | - | that is bundled with this package in the file LICENSE, and is | - | available through the world-wide-web at the following url: | - | https://www.php.net/license/3_01.txt | - | If you did not receive a copy of the PHP license and are unable to | - | obtain it through the world-wide-web, please send a note to | - | license@php.net so we can mail you a copy immediately. | + | This source file is subject to the Modified BSD License that is | + | bundled with this package in the file LICENSE, and is available | + | through the World Wide Web at . | + | | + | SPDX-License-Identifier: BSD-3-Clause | +----------------------------------------------------------------------+ | Authors: Jerome Loyet | +----------------------------------------------------------------------+ diff --git a/sapi/fpm/fpm/events/port.c b/sapi/fpm/fpm/events/port.c index 73cf24c82c2c..b7f5715abad4 100644 --- a/sapi/fpm/fpm/events/port.c +++ b/sapi/fpm/fpm/events/port.c @@ -1,14 +1,12 @@ /* +----------------------------------------------------------------------+ - | Copyright (c) The PHP Group | + | Copyright © The PHP Group and Contributors. | +----------------------------------------------------------------------+ - | This source file is subject to version 3.01 of the PHP license, | - | that is bundled with this package in the file LICENSE, and is | - | available through the world-wide-web at the following url: | - | https://www.php.net/license/3_01.txt | - | If you did not receive a copy of the PHP license and are unable to | - | obtain it through the world-wide-web, please send a note to | - | license@php.net so we can mail you a copy immediately. | + | This source file is subject to the Modified BSD License that is | + | bundled with this package in the file LICENSE, and is available | + | through the World Wide Web at . | + | | + | SPDX-License-Identifier: BSD-3-Clause | +----------------------------------------------------------------------+ | Authors: Jerome Loyet | +----------------------------------------------------------------------+ @@ -19,7 +17,7 @@ #include "../fpm.h" #include "../zlog.h" -#ifdef HAVE_PORT_CREATE +#ifdef HAVE_EVENT_PORTS #include #include @@ -45,19 +43,19 @@ port_event_t *events = NULL; int nevents = 0; static int pfd = -1; -#endif /* HAVE_PORT_CREATE */ +#endif /* HAVE_EVENT_PORTS */ struct fpm_event_module_s *fpm_event_port_module(void) /* {{{ */ { -#ifdef HAVE_PORT_CREATE +#ifdef HAVE_EVENT_PORTS return &port_module; #else return NULL; -#endif /* HAVE_PORT_CREATE */ +#endif /* HAVE_EVENT_PORTS */ } /* }}} */ -#ifdef HAVE_PORT_CREATE +#ifdef HAVE_EVENT_PORTS /* * Init the module @@ -196,4 +194,4 @@ static int fpm_event_port_remove(struct fpm_event_s *ev) /* {{{ */ } /* }}} */ -#endif /* HAVE_PORT_CREATE */ +#endif /* HAVE_EVENT_PORTS */ diff --git a/sapi/fpm/fpm/events/port.h b/sapi/fpm/fpm/events/port.h index 65a29e8eac14..5768c891bdac 100644 --- a/sapi/fpm/fpm/events/port.h +++ b/sapi/fpm/fpm/events/port.h @@ -1,14 +1,12 @@ /* +----------------------------------------------------------------------+ - | Copyright (c) The PHP Group | + | Copyright © The PHP Group and Contributors. | +----------------------------------------------------------------------+ - | This source file is subject to version 3.01 of the PHP license, | - | that is bundled with this package in the file LICENSE, and is | - | available through the world-wide-web at the following url: | - | https://www.php.net/license/3_01.txt | - | If you did not receive a copy of the PHP license and are unable to | - | obtain it through the world-wide-web, please send a note to | - | license@php.net so we can mail you a copy immediately. | + | This source file is subject to the Modified BSD License that is | + | bundled with this package in the file LICENSE, and is available | + | through the World Wide Web at . | + | | + | SPDX-License-Identifier: BSD-3-Clause | +----------------------------------------------------------------------+ | Authors: Jerome Loyet | +----------------------------------------------------------------------+ diff --git a/sapi/fpm/fpm/events/select.c b/sapi/fpm/fpm/events/select.c index 66e8107f07c6..f6132b025747 100644 --- a/sapi/fpm/fpm/events/select.c +++ b/sapi/fpm/fpm/events/select.c @@ -1,14 +1,12 @@ /* +----------------------------------------------------------------------+ - | Copyright (c) The PHP Group | + | Copyright © The PHP Group and Contributors. | +----------------------------------------------------------------------+ - | This source file is subject to version 3.01 of the PHP license, | - | that is bundled with this package in the file LICENSE, and is | - | available through the world-wide-web at the following url: | - | https://www.php.net/license/3_01.txt | - | If you did not receive a copy of the PHP license and are unable to | - | obtain it through the world-wide-web, please send a note to | - | license@php.net so we can mail you a copy immediately. | + | This source file is subject to the Modified BSD License that is | + | bundled with this package in the file LICENSE, and is available | + | through the World Wide Web at . | + | | + | SPDX-License-Identifier: BSD-3-Clause | +----------------------------------------------------------------------+ | Authors: Jerome Loyet | +----------------------------------------------------------------------+ diff --git a/sapi/fpm/fpm/events/select.h b/sapi/fpm/fpm/events/select.h index 12f10220f5fb..e4cafde1ed9b 100644 --- a/sapi/fpm/fpm/events/select.h +++ b/sapi/fpm/fpm/events/select.h @@ -1,14 +1,12 @@ /* +----------------------------------------------------------------------+ - | Copyright (c) The PHP Group | + | Copyright © The PHP Group and Contributors. | +----------------------------------------------------------------------+ - | This source file is subject to version 3.01 of the PHP license, | - | that is bundled with this package in the file LICENSE, and is | - | available through the world-wide-web at the following url: | - | https://www.php.net/license/3_01.txt | - | If you did not receive a copy of the PHP license and are unable to | - | obtain it through the world-wide-web, please send a note to | - | license@php.net so we can mail you a copy immediately. | + | This source file is subject to the Modified BSD License that is | + | bundled with this package in the file LICENSE, and is available | + | through the World Wide Web at . | + | | + | SPDX-License-Identifier: BSD-3-Clause | +----------------------------------------------------------------------+ | Authors: Jerome Loyet | +----------------------------------------------------------------------+ diff --git a/sapi/fpm/fpm/fpm_conf.c b/sapi/fpm/fpm/fpm_conf.c index 3979d875a18e..a77f7776bdbe 100644 --- a/sapi/fpm/fpm/fpm_conf.c +++ b/sapi/fpm/fpm/fpm_conf.c @@ -973,7 +973,7 @@ static int fpm_conf_process_all_pools(void) } for (i = 0; i < strlen(status); i++) { - if (!isalnum(status[i]) && status[i] != '/' && status[i] != '-' && status[i] != '_' && status[i] != '.' && status[i] != '~') { + if (!isalnum((unsigned char)status[i]) && status[i] != '/' && status[i] != '-' && status[i] != '_' && status[i] != '.' && status[i] != '~') { zlog(ZLOG_ERROR, "[pool %s] the status path '%s' must contain only the following characters '[alphanum]/_-.~'", wp->config->name, status); return -1; } @@ -996,7 +996,7 @@ static int fpm_conf_process_all_pools(void) } for (i = 0; i < strlen(ping); i++) { - if (!isalnum(ping[i]) && ping[i] != '/' && ping[i] != '-' && ping[i] != '_' && ping[i] != '.' && ping[i] != '~') { + if (!isalnum((unsigned char)ping[i]) && ping[i] != '/' && ping[i] != '-' && ping[i] != '_' && ping[i] != '.' && ping[i] != '~') { zlog(ZLOG_ERROR, "[pool %s] the ping path '%s' must contain only the following characters '[alphanum]/_-.~'", wp->config->name, ping); return -1; } diff --git a/sapi/fpm/fpm/fpm_main.c b/sapi/fpm/fpm/fpm_main.c index 83b00eb4c4d3..3a8435f9e6cc 100644 --- a/sapi/fpm/fpm/fpm_main.c +++ b/sapi/fpm/fpm/fpm_main.c @@ -1,14 +1,12 @@ /* +----------------------------------------------------------------------+ - | Copyright (c) The PHP Group | + | Copyright © The PHP Group and Contributors. | +----------------------------------------------------------------------+ - | This source file is subject to version 3.01 of the PHP license, | - | that is bundled with this package in the file LICENSE, and is | - | available through the world-wide-web at the following url: | - | https://www.php.net/license/3_01.txt | - | If you did not receive a copy of the PHP license and are unable to | - | obtain it through the world-wide-web, please send a note to | - | license@php.net so we can mail you a copy immediately. | + | This source file is subject to the Modified BSD License that is | + | bundled with this package in the file LICENSE, and is available | + | through the World Wide Web at . | + | | + | SPDX-License-Identifier: BSD-3-Clause | +----------------------------------------------------------------------+ | Authors: Rasmus Lerdorf | | Stig Bakken | diff --git a/sapi/fpm/fpm/fpm_status.c b/sapi/fpm/fpm/fpm_status.c index 9cb8731363fa..ff6ef68f3949 100644 --- a/sapi/fpm/fpm/fpm_status.c +++ b/sapi/fpm/fpm/fpm_status.c @@ -522,8 +522,8 @@ int fpm_status_handle_request(void) /* {{{ */ if (full_syntax) { unsigned int i; int first; - zend_string *tmp_query_string; - char *query_string; + zend_string *tmp_query_string, *tmp_request_uri_string; + char *query_string, *request_uri_string; struct timeval duration, now; float cpu; @@ -548,13 +548,36 @@ int fpm_status_handle_request(void) /* {{{ */ } } + request_uri_string = NULL; + tmp_request_uri_string = NULL; + if (proc->request_uri[0] != '\0') { + if (encode_html) { + tmp_request_uri_string = php_escape_html_entities_ex( + (const unsigned char *) proc->request_uri, + strlen(proc->request_uri), 1, ENT_DISALLOWED | ENT_HTML_DOC_XML1 | ENT_COMPAT, + NULL, /* double_encode */ 1, /* quiet */ 0); + request_uri_string = ZSTR_VAL(tmp_request_uri_string); + } else if (encode_json) { + tmp_request_uri_string = php_json_encode_string(proc->request_uri, + strlen(proc->request_uri), PHP_JSON_INVALID_UTF8_IGNORE); + request_uri_string = ZSTR_VAL(tmp_request_uri_string); + /* remove quotes around the string */ + if (ZSTR_LEN(tmp_request_uri_string) >= 2) { + request_uri_string[ZSTR_LEN(tmp_request_uri_string) - 1] = '\0'; + ++request_uri_string; + } + } else { + request_uri_string = proc->request_uri; + } + } + query_string = NULL; tmp_query_string = NULL; if (proc->query_string[0] != '\0') { if (encode_html) { tmp_query_string = php_escape_html_entities_ex( (const unsigned char *) proc->query_string, - strlen(proc->query_string), 1, ENT_HTML_IGNORE_ERRORS & ENT_COMPAT, + strlen(proc->query_string), 1, ENT_DISALLOWED | ENT_HTML_DOC_XML1 | ENT_COMPAT, NULL, /* double_encode */ 1, /* quiet */ 0); } else if (encode_json) { tmp_query_string = php_json_encode_string(proc->query_string, @@ -593,7 +616,7 @@ int fpm_status_handle_request(void) /* {{{ */ proc->requests, (unsigned long) (duration.tv_sec * 1000000UL + duration.tv_usec), proc->request_method[0] != '\0' ? proc->request_method : "-", - proc->request_uri[0] != '\0' ? proc->request_uri : "-", + request_uri_string ? request_uri_string : "-", query_string ? "?" : "", query_string ? query_string : "", proc->content_length, @@ -604,6 +627,9 @@ int fpm_status_handle_request(void) /* {{{ */ PUTS(buffer); efree(buffer); + if (tmp_request_uri_string) { + zend_string_free(tmp_request_uri_string); + } if (tmp_query_string) { zend_string_free(tmp_query_string); } diff --git a/sapi/fpm/php-fpm.8.in b/sapi/fpm/php-fpm.8.in index 941b911ed08f..6a46c9419e67 100644 --- a/sapi/fpm/php-fpm.8.in +++ b/sapi/fpm/php-fpm.8.in @@ -203,21 +203,13 @@ contributors all around the world. .SH VERSION INFORMATION This manpage describes \fBphp-fpm\fP, version @PHP_VERSION@. .SH COPYRIGHT -Copyright \(co The PHP Group +Copyright \(co The PHP Group and Contributors .PD 0 .P -Copyright (c) 2007-2009, Andrei Nigmatulin +Copyright \(co 2007-2009, Andrei Nigmatulin .PD 1 .LP -This source file is subject to version 3.01 of the PHP license, -that is bundled with this package in the file LICENSE, and is -available through the world-wide-web at the following url: -.PD 0 -.P -.B https://www.php.net/license/3_01.txt -.PD 1 -.P -If you did not receive a copy of the PHP license and are unable to -obtain it through the world-wide-web, please send a note to -.B license@php.net -so we can mail you a copy immediately. +This source file is subject to the Modified BSD License that is +bundled with this package in the file LICENSE, and is available +through the World Wide Web at +.B https://www.php.net/license/ diff --git a/sapi/fpm/status.html.in b/sapi/fpm/status.html.in index 31824234a3e8..aee7e5530597 100644 --- a/sapi/fpm/status.html.in +++ b/sapi/fpm/status.html.in @@ -2,7 +2,7 @@ diff --git a/sapi/fpm/tests/ghsa-7qg2-v9fj-4mwv-status-xss.phpt b/sapi/fpm/tests/ghsa-7qg2-v9fj-4mwv-status-xss.phpt new file mode 100644 index 000000000000..475bc130a42b --- /dev/null +++ b/sapi/fpm/tests/ghsa-7qg2-v9fj-4mwv-status-xss.phpt @@ -0,0 +1,48 @@ +--TEST-- +FPM: GHSA-7qg2-v9fj-4mwv - status xss +--SKIPIF-- + +--FILE-- +start(); +$tester->expectLogStartNotices(); +$responses = $tester + ->multiRequest([ + ['uri' => '/', 'query' => ''], + ['uri' => '/status', 'query' => 'full&html', 'delay' => 100000], + ]); +var_dump(strpos($responses[1]->getBody(), '